Brand · living styleguide

Design system

One page for the whole platform. Edit the tokens behind it (or a shared @orgdevkit/ui component) and the change flows to every app on its next build.

Zone A

Unified elements

Shared across every app via @orgdevkit/design tokens and @orgdevkit/ui components. These are the defaults to reuse.

Neutrals

Page and surface backgrounds, hairlines, nested panels.

--page-bg
#faf9f5
dark · #14171a
App background (warm paper).
--canvas
#ffffff
dark · #1f242a
Cards, panels, inputs.
--hairline
#e7e4db
dark · rgba(255,255,255,.11)
Default 1px borders.
--hairline-soft
#efece4
dark · rgba(255,255,255,.06)
Lighter internal dividers.
--hairline-ink
#d8d3c6
dark · rgba(255,255,255,.16)
Registry rules (the portal app, additive).
--nested-bg
#f5f2ea
dark · #262d34
Nested / inset panels.
--nested-border
#e6e1d4
dark · rgba(255,255,255,.09)
Border of nested panels.
--snippet-bg
#f4f2ec
dark · #262d34
Quoted / snippet surfaces.

Ink

Text colours, strongest first.

--ink
#1d211e
dark · #f3f5f4
Primary body + headings.
--ink-2
#45483f
dark · #cdd2cd
Secondary text.
--ink-soft
#5a5f5c
Soft body ink between --ink-2 and --muted (pf reader).
--muted
#7c7d74
dark · #99a39c
Captions, labels, eyebrows.
--muted-2
#9a9b91
dark · #7c857e
Faintest text / placeholders.
--label-quiet
#777
Quiet form/control labels (pf).

Accent — teal

The brand action colour and its tints.

--accent
#1a6b62
dark · #3fb3a8
Primary actions, links, focus.
--accent-hover
#13514a
dark · #5ec7bc
Hover/active of the accent.
--accent-tint
color-mix(--accent 10%)
dark · color-mix(--accent 14%)
Subtle accent wash (tracks --accent).
--accent-tint-2
color-mix(--accent 16%)
dark · color-mix(--accent 22%)
Focus ring, selection (tracks --accent).
--accent-wash
#eef3f1
dark · color-mix(--accent 8%, --canvas)
Opaque accent-washed surface (the portal app portal panels).
--accent-deep
#0f3f39
dark · #7ad0c6
Deep accent ink on washed surfaces (the portal app).
--accent-disabled
#b8cdc9
dark · #335f5a
Disabled primary button.
--on-accent-quiet
#b0e6e1
dark · #0a3a35
The quieter of two voices ON a solid accent fill (the rail’s active count). Opaque by construction; measures 4.59:1 light / 4.93:1 dark.

Stance — load-bearing

Agree / question / disagree / resting. Kept exact across the platform.

--colour-agree
#2e7d32
dark · #5cba63
Agree stance ink.
--colour-agree-bg
color-mix(--colour-agree 18%)
dark · color-mix(--colour-agree 16%)
Agree stance fill (tracks the ink).
--colour-question
#b8860b
dark · #e0b13a
Question/doubt stance ink.
--colour-question-bg
color-mix(--colour-question 18%)
dark · color-mix(--colour-question 16%)
Question stance fill (tracks the ink).
--colour-disagree
#b3261e
dark · #f0837b
Disagree stance ink.
--colour-disagree-bg
color-mix(--colour-disagree 18%)
dark · color-mix(--colour-disagree 16%)
Disagree stance fill (tracks the ink).
--colour-resting
#7c7d74
dark · #8a948f
Quiet-on-purpose state: waiting, nothing yet, a budget spent for today. A status, not a warning. Filled with --nested-bg — no -bg term of its own.

Stance ink — on-tint text

Slightly deepened stance inks for TEXT sitting on the stance-bg tints (pf workshop chips). The first three have no dark override — a minting gap for R-next; --colour-resting-ink was minted with one.

--colour-agree-ink
#2c6e30
Agree text on --colour-agree-bg.
--colour-question-ink
#8a6d1f
Question text on --colour-question-bg.
--colour-disagree-ink
#a4231b
Disagree text on --colour-disagree-bg.
--colour-resting-ink
#3c4a47
dark · #c2ccc8
Resting text on --nested-bg.

Notice / caution

Info banners + demo strips. Minted in R3.2 (was the orphan .demo-banner palette).

--notice-bg
#fbf4d6
dark · rgba(224,200,130,.12)
Notice / banner surface.
--notice-border
#e6cf86
dark · rgba(224,200,130,.30)
Notice border.
--notice-ink
#6b5a16
dark · #e6cf86
Notice text.

Danger

Destructive-action surfaces (pf admin). Light-only so far.

--danger-soft-bg
#fff0f0
Soft danger wash behind destructive zones.
--danger-border
#ef4444
Danger border / destructive outline.

Utility borders & control greys

The cool-grey control vocabulary minted from the reference app. Light-only so far (no dark overrides) — a designer-visible gap.

--border-subtle
#e2e2e2
Subtle panel border (quieter than --hairline).
--border-input
#d4d4d4
Resting input border.
--border-hover
#c0c0c0
Hovered control border.
--border-quiet
#cfcfcf
Quiet mid-grey border (chips, secondary controls).
--swatch-fallback
#c4c4c4
Fallback fill when a swatch/avatar has no colour.
--control-disabled-bg
#cdd6d4
Disabled control fill (non-accent).

Companion / chat surfaces

The the reference app companion vocabulary (chat dock, callouts). Light-only so far.

--bubble-user-bg
#f5f5f5
The user's chat-bubble fill.
--callout-info-bg
#eef3fb
Informational companion callout.
--callout-approve-bg
#eef6ee
Approval/confirmation callout fill.
--callout-approve-ink
#2c5e30
Text on the approve callout.

Steer — guided revision

The pf "steer" prompt panel (the facilitator nudge). Light-only so far.

--steer-bg
#f4f1e8
Steer panel surface.
--steer-border
#d9d2bd
Steer panel border.
--steer-eyebrow
#8a7a3f
Steer panel eyebrow/kicker ink.

Warm panels & dark CTA

Warm parchment panel pair + the hover of a dark (ink-filled) CTA. Light-only so far.

--panel-warm-bg
#faf8f2
Warm resting panel (pf reading rail).
--panel-warm-hover
#f3efe4
Hover of the warm panel.
--cta-dark-hover
#2c322d
Hover fill of a dark ink-coloured CTA.

Library categories

Per-category ink for library/reading-list sources (pf companion). Light-only so far.

--lib-science
#2c6e63
Science / research sources.
--lib-transcript
#6b4f8a
Transcript / testimony sources.

Document status (portal app · additive)

Lifecycle of a registry template. current/draft now alias the platform palette.

--status-current
var(--accent)
Canonical / in force (= accent).
--status-draft
var(--colour-question)
Being worked (= question stance).
--status-historical
#6b7d77
dark · #93a39d
Superseded but kept.
--status-obsolete
#a8584a
dark · #d08877
Retired.

Document tier (portal app · additive)

Derived from the platform palette (no foreign colours).

--tier-canonical
var(--accent)
The circle's authoritative copy.
--tier-country
var(--ink-2)
A country's adopted version.
--tier-raw
var(--muted-2)
Un-promoted raw material.

Diff paint (governance ceremony)

The one diff card — additions and deletions.

--diff-add-bg
color-mix(--colour-agree 14%)
dark · color-mix(--colour-agree 18%)
Added-text fill (one green).
--diff-add-ink
#1f5a23
dark · #8fd494
Added-text ink.
--diff-del-bg
color-mix(--colour-disagree 12%)
dark · color-mix(--colour-disagree 16%)
Deleted-text fill (one red).
--diff-del-ink
#8f2019
dark · #f0a59f
Deleted-text ink.

Type scale

Headings + reading set in the serif; UI in the sans. Sizes are the --t-* tokens.

Headings + reading (Source Serif 4).--serif
UI, labels, buttons (Hanken Grotesk).--sans
Masthead wordmark.--t-display-xl · 4rem
Section openers.--t-display-l · 2.5rem
Sub-section titles.--t-display-m · 1.9rem
Card / panel titles.--t-title · 1.35rem
Reading column.--t-body-l · 1.1875rem
Default body.--t-body · 1.0625rem
Secondary / dense UI.--t-small · 0.95rem
Uppercase eyebrows.--t-eyebrow · 0.72rem
Catalogue reference codes.--t-ref · 0.78rem

Spacing & layout

Today only layout/measure tokens exist — there is no --space-* ramp yet (R1.1 flag; R3 adds the two-tier scale).

--space-1
0.5rem
--space-2
1rem
--space-3
1.5rem
--space-4
2rem
--gap-section
6.5rem
--measure
70ch
--shell
1180px
--shell-read
880px

Radii

--radius-pill
999px
--radius-cta
6px
--radius-card
8px
--radius-modal
12px

Shadows

--shadow-card
0 1px 2px rgba(0,0,0,.03)
--shadow-soft
0 4px 14px rgba(15,23,42,.06)
--shadow-pane
-2px 0 12px rgba(0,0,0,.05)
--shadow-lift
0 6px 22px rgba(28,40,36,.09)

Base atoms & focus

The global class atoms from the @orgdevkit/design base layer — .eyebrow, .ref, .rule, .glyph — and the shared focus treatment. These need no import: any element in any app can wear them.

§LIA·2026·014Safe-storage guidance.glyph + .ref (the archive signature)

Country console · intake.eyebrow (uppercase sans kicker)

the hairline above/below is .rule — the registry divider on --hairline-ink

Keyboard focus everywhere gets the same treatment: a 2px canvas gap + the teal --accent-tint-2 ring, applied globally via :focus-visible in the base layer (mouse clicks don’t paint it).

System gap: no motion/easing tokens are minted yet — transition durations and curves are hardcoded per component (and the website keeps its own --ease). A designer restyling motion currently has no single dial.

Primitives

The live @orgdevkit/ui components, in the reference look. Labelled with their export name.

Textvariant (the --t-* scale, pf look)

Eyebrow · kicker

Display XL

Display — section opener

Display M — sub-section title

Title — a card or pane heading

Lede — the serif standfirst that introduces a passage, set a touch larger and in the secondary ink.

Body L — the wide reading column, one step up from the default body.

Body — the reading set. Members read document passages and reflections in this serif face at a comfortable measure.

Small — muted meta, captions, and footnotes.

REF · CATALOGUE-0042
Buttonvariant · size · disabled
Badgetone · variant · dot
accentneutralagreequestiondisagree
currentdrafthistoricalobsoletecanonicalcountryraw
approveddraftappliednone
approvedappliedoutline
currentdrafthistoricalobsoletecanonical
StatusPill7 tones · md / sm / xs / 2xs · glyph + word + colour
pendingpositiveaccentneutralcautionnegativeresting
pendingpositiveaccentneutralcautionnegativeresting
pendingpositiveaccentneutralcautionnegativeresting
pendingpositiveaccentneutralcautionnegativeresting
moderateread
glyph overridecount · 14
GradeBadge4 tiers · not assigned · sm / xs / 2xs
highmoderatelowvery lownot assigned
highmoderatelowvery lownot assigned
highmoderatelowvery lownot assigned
CitationChipsource / personal · inline / row

Shorter sleep tracks with slower recovery312. The reader’s own diary shows a comparable patterne2.

TransparencyBannerframed / quiet · counts + withheld
Reviewer · invited as a general practitioner
You see 51 points in 8 chapters. 12 of them are addressed to you.
What you do not see: this person's private notes, their conversations, and what other participants write. Counts are counted from what is readable to you. Nothing is estimated.
Full access on
You see 97 points in 8 chapters: the whole plan.
Lab values and document names are here only if this person turned that on, by their own click.
Nothing addressed to you yet
You see 39 points in 8 chapters.
The honest empty: reading and remarking are always allowed, with or without a question aimed at you.
ReactionBarrest / three entrances / thread / closed
AI-concept, nog niet gecontroleerd

Begeleide krachttraining, twee keer per week, laat in drie RCT’s een klein maar consistent effect op vermoeidheid zien.

The state pill above and the reaction below are two axes. Neither ever tints the other. Nothing here is marked unread.

QuotedNoteother / own / dismissed · the quote is required
de opbouw en begeleiding zijn bepalend voor het effect
Bij deze patiënt zou ik met de helft van dat volume beginnen en na drie weken opnieuw kijken.
Huisarts · 4 augustus 2026
slaapkwaliteit hangt samen met het beloop van klachten
Dit sluit aan op wat ik zelf merkte in juni, meenemen.
Voor iedereen · gaat mee met ronde 3
extra vitamine D boven de dagelijkse aanbeveling
Speelt bij mij niet.
Blijft zichtbaar in het punt. Niets wordt verwijderd.
ClaimCheckCardsupported / diverges / absent / testing / unavailable
Wat het onderzoek hierover zegt
Twee van de drie RCT’s beschrijven precies de opbouw die je noemt, met hetzelfde effect op vermoeidheid.
Het onderzoek wijst een andere kant op
In de grootste van de drie studies verdween het effect bij deelnemers die met half volume begonnen.

Dit komt uit het onderzoeksmateriaal van deze persoon en is geen oordeel over wat jij zegt. Ben je het er niet mee eens, schrijf dat gerust op.

Hierover staat niets in het onderzoeksmateriaal
Geen enkele bron in deze bibliotheek gaat over de wachttijd tussen twee behandelrondes.
De assistent legt dit naast het onderzoek…
De assistent is nu niet beschikbaar. Je opmerking is wél opgeslagen.
HarvestChecklistpartly gathered / empty / complete · read-only
Jouw onderzoeksprofiel5 van 9
  • Kernvraag van het onderzoek
  • Situatie en verloop tot nu
  • Wat het meest in de weg zit
  • Wat al geprobeerd is
  • Beslisstijl (samen met arts)
  • Wat een goede uitkomst zou zijn
  • Grenzen aan het onderzoek
  • Wie je erbij wilt betrekken
  • Hoe vaak je wilt afstemmen

Vult zichzelf tijdens het gesprek. Dit is geen formulier: je kunt hier zelf niets aanvinken.

Nog niets opgehaald0 van 0

    Een leeg profiel staat aan het begin, niet aan het eind.

    Compleet9 van 9
    • Kernvraag van het onderzoek
    • Situatie en verloop tot nu
    • Wat het meest in de weg zit
    • Wat al geprobeerd is
    • Beslisstijl (samen met arts)
    • Wat een goede uitkomst zou zijn
    • Grenzen aan het onderzoek
    • Wie je erbij wilt betrekken
    • Hoe vaak je wilt afstemmen
    ChapterRailexpanded / collapsed strip / reviewer variant

    Counts are “looked at / total”, never a score. Every mark in the collapsed strip carries its chapter’s full name, so the strip is a shortcut and not a riddle. The reviewer rail is the same component with two entries and no figures.

    SectionRailhover peeks / click navigates / SOON is not a control

    The panel opens over this column. Nothing here moves when it does — the chrome keeps its 72px footprint either way.

    Hover Doing or Areas: the panel opens over the page after a short grace, and that section takes a grey bar while the one you are actually on keeps the ink one. Clicking always lands somewhere — Updates has no second level, so it navigates and closes whatever was open. Unpinning asks first, and the × has no path to the answer.

    CountPill1 · 42 · 99 · 99+ · and nothing at 0
    1 unseen update42 unseen updates99 unseen updates4321 unseen updates

    The fifth slot holds a pill with a count of zero, and it is empty: a mark reading 0 would say “there is nothing here”, which is the one thing a mark on a nav entry must never mean.

    AreaMenuthe second level / SOON is not a control / collapses to 44px

    The area’s own pages sit beside them, not in the chrome. The rail can name Wealth and — because a shell nav resolves one fixed set of destinations — it cannot name anything inside it.

    Archive is drawn and is not a control — no link, no href, nothing to focus — and it does not count towards whether there is a menu at all: an area with one live page and eight not-yet ones has nowhere to go, so nothing is drawn. The figure on a row is a figure (meta), never the rail’s open-count pill: there are no counts down here worth interrupting for.

    AreaMarkfour areas · and nothing at all without a word
    NESTRHEALTHWEALTHPERSONAL

    The fifth slot holds a mark with no word, and it is empty — swatch included. A coloured square on its own says “this belongs somewhere” and names nowhere, and a person who cannot see colour gets nothing from it at all. There is no title on any of them: the detail behind a pin belongs in a popover, which is what the mock’s native tooltip was replaced by.

    PageHeaderCapture is required, last, and the only ink button

    Doing

    Updates

    Receive-only. Everything you watch, newest first. You never write anything back from here.

    Read 2 minutes ago

    Transactions

    42 payments in range

    PoolCOMING SOON

    Ideas, notes, resources, people and lists \u2014 capture first, decide later.

    Nothing pressed yet.

    Four pages, one header. The black button is in the same corner on all four and says the same word, because it is the only ink the header can draw — Import a file is the page’s own verb and takes the area’s accent instead. A subtitle turns the one-line shape into the two-line one and the cluster tops out with the title rather than falling into the gap under it. The C chip is drawn because this host says the key is bound; a host that has not bound it leaves it out rather than advertising a shortcut that does nothing.

    ReflectSurfaceevery block optional · nothing drawn where nothing is known

    Doing

    Reflect

    Step back from the list — close the day, look across the week, and think out loud when something is stuck.

    CADENCES

    • Daily closeClean up the left-overs and set the day.
      5-10 minutes
    • WeeklyEmpty the inbox, look across the projects, tidy what is left.
      30 minutesstep 3 of 6
    • QuarterlyStep back across the whole quarter.Not available yet

    VISION

    A calm life where the systems carry the load — present for the people, building things that outlast the builder.

    Last revised in June · revisit quarterly

    LAST REFLECTION

    Week 32 — “Calmer week. Said no twice and it held.”

    BRAINSTORM ROOMS

    Reflect

    Step back from the list — close the day, look across the week, and think out loud when something is stuck.

    CADENCES

    • Daily closeClean up the left-overs and set the day.

    Nothing pressed yet.

    Three stages: the menu that gets here from Doing, the page with everything, and the same page on an account that has none of it. The design draws four blocks and three of them read from stores the ODK does not have — so the page draws what it is handed and nothing where it is handed nothing, rather than a Resume nobody can resume and an archive link into nowhere. The third cadence is drawn here and cannot be chosen, and the owner’s rule (2026-08-19) is that nothing in this product is drawn as absent — so it wears the same SOON badge the rail’s not-yet entries wear, in both lists, with no verb and no menu item behind it. ⚠ The reason is the ELEMENT rather than the cadence, and the two used to be the same reason: quarterly has six step ids and no runner was true until U.7b built the screen, and U.7e2 gave the last two steps their panels. This fixture keeps it soon because it is the only drawing of that state anywhere in the tree — flip it and the badge, the note, the missing verb and the missing menu row are on no screen a screenshot pass can open, and five sabotage rows lose the fixture they read.

    OrbitLoaderfour beats · two orbits below 32px · pure CSS

    Not one of these passes an orbit count. The 24px and 18px marks drop to two paths on their own, because a third one at that size crosses the type beside it — the design’s minimum-size rule as a default rather than as a prop somebody has to remember. The fourth plays once and stops; the fifth is the same mark with its paths off. On the ink band the dots are the surface colour rather than white, which is why they are still right after the theme flips. Under prefers-reduced-motion every one of them rests on one dot with its paths drawn.

    LogoLockupthe dot grows as the type shrinks · nothing shifts
    Northwind.ioNorthwind.ioNorthwind.ioNorthwind.ioNorthwind.io
    Northwind.ioNorthwind.ioNorthwind.io

    Top row, 44 down to 12px: below 15px the dot grows and the gap opens, so the mark never reads as a full stop before the word. Second row, the same lockup twice — once with its dot, once with a 40px loader in the same slot. The slot is the dot’s box whatever is in it, so the word is in exactly the same place in both. Underneath, the mark alone: the app icon and the avatar, drawn from the geometry a composition generates its real icon files from.

    QuickMenuhover opens · a click pins · nothing in it draws nothing
    three — the shipped fan
    five — the ring pushes out
    none — nothing is drawn

    Nothing chosen yet — the fan hands an id back and the host runs its own surface.

    Hover a corner mark: after a short grace the circles fly out from under it, outside first, each filling with its glyph only once it has landed — and the dot on the trigger shrinks, which is the loader’s launch beat borrowed as an interaction. Leaving closes it again; a click keeps it. The middle fan holds five, so its ring stands 15px further out — the arc grows to fit, and the limit of five is the store’s rule, not the geometry’s. The third has nothing in it and therefore draws nothing: no trigger, no scrim, because a control that opens an empty ring is a dead control.

    QuickCaptureone implementation · three doors · the sentence is read

    Doing

    6 today

    Shut. Press C anywhere outside a field, or use either door above.

    typedcall the notary back tomorrow, 10m
    the sentencecall the notary back
    read out of ittomorrow → due · 10m → estimate

    Nothing captured yet — the surface hands a parsed result back and the host files it.

    The assistant renders no answer here — it hands the question to the host’s chat seam.

    The header’s Capture, the fan’s Capture and the C key are one state — the line above says which door was used, and it is the only difference between them. Inside, one line is read for a day and an estimate: the table shows what the parser makes of the placeholder’s own example, which the harvested parser could read neither half of. Picking a chip moves where it lands; picking it again puts it back. And the Esc chip is not decoration — this panel is a Modal, so Escape closes it and Tab stays inside, which the surface this was harvested from does neither of.

    SeriesChartevenly spaced · hover names the nearest · hidden table
    Wat er op de rekeningen stond
    MaandStandVerschil
    jan 2026€118.900
    feb 2026€120.400+€1.500
    mar 2026€121.100+€700
    apr 2026€119.800−€1.300
    may 2026€122.600+€2.800
    jun 2026€123.900+€1.300
    jul 2026€124.200+€300
    aug 2026€122.100−€2.100
    sep 2026€125.400+€3.300
    oct 2026€126.800+€1.400
    nov 2026€127.100+€300
    dec 2026€128.437+€1.337
    HomeFiguresPanelone open at a time · a line or the reason there is none · no remove, no add
    Our numbersOne set of figures for the household, all worked out — click one to see how it moved.
    Cash on hand
    Across three payment accounts
    House valueyours to set
    Your own estimate, January 2026
    Total debt
    Study loan at 0,46% — the only debt left
    ForecastChartmeasured solid · projections dashed · a rate that never ends
    leeg op 19 augustus

    De doorgetrokken lijn is wat er gemeten is; de gestippelde lijnen zijn rekenwerk.

    • Laatste 7 dagen · €6,10 per dag · nog 12 dagen
    • Elke dag vol · €10,00 per dag · nog 8 dagen
    • Alles op pauze · €0,00 per dag · zo raakt het niet op
    BurnChart4 bands · allowance today + from tomorrow · empty day · ghost
    vanaf morgen
    dagbudget
    • 25-7 · €3.80 · jij en de assistent €3.80
    • 26-7 · €5.20 · jij en de assistent €4.40 · het team ’s nachts €0.80
    • 27-7 · €4.10 · jij en de assistent €4.10
    • 28-7 · niets gebruikt
    • 29-7 · €6.70 · jij en de assistent €5.90 · je Support team €0.40 · het team ’s nachts €0.40
    • 30-7 · €5.10 · jij en de assistent €5.10
    • 31-7 · €4.40 · jij en de assistent €3.70 · je Support team €0.70
    • 1-8 · €7.10 · jij en de assistent €6.10 · het team ’s nachts €1.00
    • 2-8 · €3.20 · jij en de assistent €3.20
    • 3-8 · €5.60 · jij en de assistent €4.90 · je Support team €0.70
    • 4-8 · €8.40 · jij en de assistent €7.20 · het team ’s nachts €1.20
    • 5-8 · €2.90 · jij en de assistent €2.90
    • 6-8 · €6.10 · jij en de assistent €5.20 · je Support team €0.90
    • vandaag · €6.20 · jij en de assistent €5.00 · je Support team €1.20
    • Jij en de assistent
    • Je Support team
    • Het team · ’s nachts
    • Eenmalige inrichting

    Een lege dag is een dag zonder verbruik, geen storing. De gestippelde kolom bij vandaag is wat er nog over is \u2014 en die verschijnt niet op een dag die er al overheen is.

    LabChartone analyte · band + per-reading verdict · table always there
    Hbhemoglobine, de zuurstofdrager in het bloed · in mmol/L4 metingen · 3 mei 2024 tot 14 mei 2026 · uit [e2]

    In je documenten staat dit als “Hb”, “hemoglobine” en één keer als “haemoglobin”. Één stof, één grafiek.

    De band is het bereik uit het laatste rapport. Die band is een hulplijn bij het kijken. Of een waarde erbuiten valt, staat per meting: elke meting wordt vergeleken met het bereik van het rapport waar zij zelf uit komt.

    11 november 2024 · 7,6 mmol/L · onder het bereik van het rapport waar deze meting uit komt (7,8 tot 10,5 mmol/L)

    DatumWaardeStatusUit
    3 mei 20248,1 mmol/L binnen het bereik[e2]
    11 november 20247,6 mmol/L onder het bereik[e2]
    4 april 20258,0 mmol/L binnen het bereik[e2]
    14 mei 20268,3 mmol/L binnen het bereik[e2]
    LabValueStripwithin / below / above / not compared — never a chart
    6 mg/L12 maart 2026bereik van dat rapport: onder 10 mg/L binnen het bereik
    7,6 mmol/L11 november 2024bereik van dat rapport: 7,8 tot 10,5 mmol/L onder het bereik
    14 mg/L2 mei 2026bereik van dat rapport: onder 10 mg/L boven het bereik
    26 µg/L14 mei 2026

    One measurement never becomes a chart: a line through a single point draws a course nobody measured. Each reading is compared with the range of the report it came from — so the last row, which came without one, carries no verdict at all.

    EmailButtona link that reads as a button · inline literals · light only

    One state, on purpose: no hover, no disabled, no size. The href is the caller’s URL byte for byte — there is no redirect to count a click through, so there is nothing to render differently. A relative href has no fifth specimen because it has no appearance: it throws at compose time rather than mail a dead button.

    EmailShellone 600px column · no image · no pixel · disclaimer always
    Eén vraag: klopt de richting nog? Laat je het liggen, dan gebeurt er niets.
    Gezondheidsonderzoek

    Hoi Anne,

    Elke zes weken staat er één gesprek voor je klaar over de richting van je onderzoek. Het gaat niet over de inhoud van je plan; het gaat over de vraag of het team nog het goede voor je uitzoekt.

    Open het gesprek

    Het team

    BelangrijkDit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.
    Je krijgt dit bericht omdat je zelf een onderzoek hebt lopen. In je eigen omgeving zet je deze uitnodiging uit; dat stopt de mail en niet het onderzoek.

    The strip at the foot is not a state and cannot be switched off: a blank disclaimer throws at compose time rather than render, so there is no specimen of a mail without one. The preheader is here too and is deliberately invisible — it is the line a client shows beside the subject, and the only hidden text in the output. What this specimen proves is that it renders in a browser; no mail client is represented here, and Outlook least of all.

    CheckinEmailto the person · every six weeks · no reminder ever follows
    Eén vraag: klopt de richting nog? Laat je het liggen, dan gebeurt er niets.
    Gezondheidsonderzoek
    Hoi Anne,
    Elke zes weken staat er één gesprek voor je klaar over de richting van je onderzoek. Het gaat niet over de inhoud van je plan; het gaat over de vraag of het team nog het goede voor je uitzoekt.
    Het duurt ongeveer een kwartier. Het is een gesprek en geen formulier, dus je kunt gewoon opschrijven wat er sinds de vorige keer veranderd is.
    Open het gesprek
    De link brengt je naar het gesprek in je eigen omgeving. Je hoeft niets voor te bereiden.
    Laat je deze mail liggen, dan gebeurt er niets. Er volgt geen herinnering en er verandert niets aan je onderzoek. Het gesprek blijft staan tot je het opent.
    Het team
    BelangrijkDit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.
    Je krijgt dit bericht omdat je zelf een onderzoek hebt lopen. In je eigen omgeving zet je deze uitnodiging uit; dat stopt de mail en niet het onderzoek.
    Hoi Anne,
    
    Elke zes weken staat er één gesprek voor je klaar over de richting van je onderzoek. Het gaat niet over de inhoud van je plan; het gaat over de vraag of het team nog het goede voor je uitzoekt.
    
    Het duurt ongeveer een kwartier. Het is een gesprek en geen formulier, dus je kunt gewoon opschrijven wat er sinds de vorige keer veranderd is.
    
    Open het gesprek:
    https://example.test/gesprek/9f2c
    
    De link brengt je naar het gesprek in je eigen omgeving. Je hoeft niets voor te bereiden.
    
    Laat je deze mail liggen, dan gebeurt er niets. Er volgt geen herinnering en er verandert niets aan je onderzoek. Het gesprek blijft staan tot je het opent.
    
    Het team
    
    Je krijgt dit bericht omdat je zelf een onderzoek hebt lopen. In je eigen omgeving zet je deze uitnodiging uit; dat stopt de mail en niet het onderzoek.
    
    BELANGRIJK
    Dit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.

    The greeting takes the first name from the intake. There is no specimen without one because there is nothing to see: no name means no greeting line at all — not Hoi , and not an invented name.

    OutreachEmailto an author · once · both lists quoted from the donate page
    Geen account, geen nieuwsbrief. Één link, drie weken geldig.
    Gezondheidsonderzoek
    Beste auteur,
    Wij werken als team aan het persoonlijke onderzoek van iemand met een chronische aandoening. Wie die persoon is, staat hier niet, en dat blijft ook zo.
    Wij vragen de volledige tekst van “Sleep duration and inflammatory markers in a prospective cohort” (2025). De samenvatting hebben we; die is niet genoeg om vast te leggen hoe zeker het bewijs is.
    Wat er met je artikel gebeurt
    Het komt in de privé-bibliotheek van één persoon, en van de mensen die zij zelf laat meelezen.
    Het team leest het en legt de bewijskracht vast in GRADE, de maat voor de zekerheid van bewijs. Dat gebeurt woordelijk zoals de publicatie het zelf beschrijft, niet in onze eigen woorden.
    Wordt het gebruikt, dan staat het als genummerde bron onder een punt in haar plan, met titel en jaar.
    Het wordt niet gepubliceerd, niet doorgestuurd naar anderen en niet in een openbare database gezet.
    Deze vier regels staan woordelijk zo op de pagina achter de link. Het zijn dezelfde sleutels; er bestaat geen tweede formulering.
    Deel de publicatie
    De link is drie weken geldig en werkt één keer. Er wordt geen account voor je gemaakt en er is geen wachtwoord.
    Wat je hier niet voor terugkrijgt
    Geen account en geen inlog. Deze pagina is alles wat je van ons ziet.
    Geen bericht of het artikel gebruikt is. Wij versturen aan niemand notificaties, ook niet aan jou.
    Geen inzage in het plan, in de gegevens of in wie de persoon is.
    Geen vergoeding, en geen vermelding buiten de bronnenlijst van dit ene onderzoek.
    Ook deze vier regels zijn de sleutels van de doneerpagina, woordelijk. Één formulering, twee plekken.
    Zeg je nee, dan horen wij niets terug en dat is prima. Er volgt geen tweede verzoek.
    Het team
    BelangrijkDit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.
    Je krijgt dit bericht eenmalig, omdat je publicatie in het onderzoek van deze persoon opdook. Je adres staat bij ons in de bronvragenlijst en gaat nergens anders heen.
    Beste auteur,
    
    Wij werken als team aan het persoonlijke onderzoek van iemand met een chronische aandoening. Wie die persoon is, staat hier niet, en dat blijft ook zo.
    
    Wij vragen de volledige tekst van “Sleep duration and inflammatory markers in a prospective cohort” (2025). De samenvatting hebben we; die is niet genoeg om vast te leggen hoe zeker het bewijs is.
    
    Wat er met je artikel gebeurt:
    - Het komt in de privé-bibliotheek van één persoon, en van de mensen die zij zelf laat meelezen.
    - Het team leest het en legt de bewijskracht vast in GRADE, de maat voor de zekerheid van bewijs. Dat gebeurt woordelijk zoals de publicatie het zelf beschrijft, niet in onze eigen woorden.
    - Wordt het gebruikt, dan staat het als genummerde bron onder een punt in haar plan, met titel en jaar.
    - Het wordt niet gepubliceerd, niet doorgestuurd naar anderen en niet in een openbare database gezet.
    
    Deze vier regels staan woordelijk zo op de pagina achter de link. Het zijn dezelfde sleutels; er bestaat geen tweede formulering.
    
    Deel de publicatie:
    https://example.test/doneren/7b41
    
    De link is drie weken geldig en werkt één keer. Er wordt geen account voor je gemaakt en er is geen wachtwoord.
    
    Wat je hier niet voor terugkrijgt:
    - Geen account en geen inlog. Deze pagina is alles wat je van ons ziet.
    - Geen bericht of het artikel gebruikt is. Wij versturen aan niemand notificaties, ook niet aan jou.
    - Geen inzage in het plan, in de gegevens of in wie de persoon is.
    - Geen vergoeding, en geen vermelding buiten de bronnenlijst van dit ene onderzoek.
    
    Ook deze vier regels zijn de sleutels van de doneerpagina, woordelijk. Één formulering, twee plekken.
    
    Zeg je nee, dan horen wij niets terug en dat is prima. Er volgt geen tweede verzoek.
    
    Het team
    
    Je krijgt dit bericht eenmalig, omdat je publicatie in het onderzoek van deze persoon opdook. Je adres staat bij ons in de bronvragenlijst en gaat nergens anders heen.
    
    BELANGRIJK
    Dit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.

    The two panels are the donate page’s own keys rendered a second time, never a second wording — which is why they arrive as data. The mail names no person, carries one link, and that link works once.

    AdminDigestto the administrator · daily · sentences and rows, never arithmetic
    Vier mensen, één ronde in verwerking, en één traject dat stilstaat.
    Gezondheidsonderzoek
    Goedemorgen,
    Vier dingen weken gisteren af van de verwachting. 6 van de 6 onderzoeken liepen.
    circle-02 liep gisteren en leverde niets op, en de engine gaf niet aan waarom.
    circle-02 liep gisteren en gaf niets uit. Of er is niet gewerkt, of het werk bereikte geen model.
    circle-04 heeft 160 bronnen die op indexeren wachten en daar bewoog er gisteren geen van.
    circle-06 stopte bij een grens: er is geen tegoed meer.
    Elk onderzoek, en wat het gisteren deed
    OnderzoekLidStaatBronnenGeïndexeerdBevindingenRondes
    circle-01member-01Loopt121161
    circle-02member-02Loopt0000
    circle-03member-03Loopt0000
    circle-04member-04Loopt12061
    circle-05member-05Loopt12061
    circle-06member-06Loopt12061
    Gisteren is $9,20 van de $24,00 aan dagbudgetten gebruikt, verdeeld over 6 onderzoeken.
    Open het beheer
    Alles in dit bericht staat ook op Kosten en op Trajecten, met dezelfde cijfers. Dit bericht rekent niets uit wat daar niet staat.
    Leek een probleem en was het niet
    circle-03 · leverde niets op — de engine gaf aan dat hij pas op de plaats maakte
    circle-06 · gaf niets uit — er is geen tegoed meer, en dat is een staat en geen stilte
    Kon niet gemeten worden
    circle-05 · een achterstand die niet bewoog — er kon niets bij die naad bewegen, dus er is geen gezonde meting om mee te vergelijken
    Je krijgt dit bericht omdat je de enige beheerder bent. Het gaat naar niemand anders, en het gaat over het platform en niet over wat mensen lezen of doen.
    Het platform
    BelangrijkDit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.
    Wil je dit bericht niet meer, dan zet je het uit op Kosten. De cijfers blijven daar staan.
    Goedemorgen,
    
    Vier dingen weken gisteren af van de verwachting. 6 van de 6 onderzoeken liepen.
    
    circle-02 liep gisteren en leverde niets op, en de engine gaf niet aan waarom.
    
    circle-02 liep gisteren en gaf niets uit. Of er is niet gewerkt, of het werk bereikte geen model.
    
    circle-04 heeft 160 bronnen die op indexeren wachten en daar bewoog er gisteren geen van.
    
    circle-06 stopte bij een grens: er is geen tegoed meer.
    
    Elk onderzoek, en wat het gisteren deed:
    Onderzoek · Lid · Staat · Bronnen · Geïndexeerd · Bevindingen · Rondes
    circle-01 · member-01 · Loopt · 12 · 11 · 6 · 1
    circle-02 · member-02 · Loopt · 0 · 0 · 0 · 0
    circle-03 · member-03 · Loopt · 0 · 0 · 0 · 0
    circle-04 · member-04 · Loopt · 12 · 0 · 6 · 1
    circle-05 · member-05 · Loopt · 12 · 0 · 6 · 1
    circle-06 · member-06 · Loopt · 12 · 0 · 6 · 1
    
    Gisteren is $9,20 van de $24,00 aan dagbudgetten gebruikt, verdeeld over 6 onderzoeken.
    
    Open het beheer:
    https://example.test/beheer
    
    Alles in dit bericht staat ook op Kosten en op Trajecten, met dezelfde cijfers. Dit bericht rekent niets uit wat daar niet staat.
    
    Leek een probleem en was het niet:
    - circle-03 · leverde niets op — de engine gaf aan dat hij pas op de plaats maakte
    - circle-06 · gaf niets uit — er is geen tegoed meer, en dat is een staat en geen stilte
    
    Kon niet gemeten worden:
    - circle-05 · een achterstand die niet bewoog — er kon niets bij die naad bewegen, dus er is geen gezonde meting om mee te vergelijken
    
    Je krijgt dit bericht omdat je de enige beheerder bent. Het gaat naar niemand anders, en het gaat over het platform en niet over wat mensen lezen of doen.
    
    Het platform
    
    Wil je dit bericht niet meer, dan zet je het uit op Kosten. De cijfers blijven daar staan.
    
    BELANGRIJK
    Dit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.

    Every figure here arrived as a string. The mail computes nothing, so it cannot disagree with the screens it reports on — and it carries no chart and no percentage without its denominator. The progress table is the one exception to no table, added by the owner on 2026-08-15; it names circles and members by id, never by initial.

    AdminDigest · a quiet daynothing to report · and it goes out anyway
    Er week gisteren niets af van de verwachting.
    Gezondheidsonderzoek
    Goedemorgen,
    Er week gisteren niets af van de verwachting. 2 van de 2 onderzoeken liepen.
    Elk onderzoek, en wat het gisteren deed
    OnderzoekLidStaatBronnenGeïndexeerdBevindingenRondes
    circle-01member-01Loopt121161
    circle-03member-03Loopt9940
    Gisteren is $3,68 van de $8,00 aan dagbudgetten gebruikt, verdeeld over 2 onderzoeken.
    Open het beheer
    Alles in dit bericht staat ook op Kosten en op Trajecten, met dezelfde cijfers. Dit bericht rekent niets uit wat daar niet staat.
    Je krijgt dit bericht omdat je de enige beheerder bent. Het gaat naar niemand anders, en het gaat over het platform en niet over wat mensen lezen of doen.
    Het platform
    BelangrijkDit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.
    Wil je dit bericht niet meer, dan zet je het uit op Kosten. De cijfers blijven daar staan.
    Goedemorgen,
    
    Er week gisteren niets af van de verwachting. 2 van de 2 onderzoeken liepen.
    
    Elk onderzoek, en wat het gisteren deed:
    Onderzoek · Lid · Staat · Bronnen · Geïndexeerd · Bevindingen · Rondes
    circle-01 · member-01 · Loopt · 12 · 11 · 6 · 1
    circle-03 · member-03 · Loopt · 9 · 9 · 4 · 0
    
    Gisteren is $3,68 van de $8,00 aan dagbudgetten gebruikt, verdeeld over 2 onderzoeken.
    
    Open het beheer:
    https://example.test/beheer
    
    Alles in dit bericht staat ook op Kosten en op Trajecten, met dezelfde cijfers. Dit bericht rekent niets uit wat daar niet staat.
    
    Je krijgt dit bericht omdat je de enige beheerder bent. Het gaat naar niemand anders, en het gaat over het platform en niet over wat mensen lezen of doen.
    
    Het platform
    
    Wil je dit bericht niet meer, dan zet je het uit op Kosten. De cijfers blijven daar staan.
    
    BELANGRIJK
    Dit is je eigen onderzoek om samen met je arts te kijken wat voor jou het beste is. Het is geen medisch advies en geen diagnose. AI analyses kunnen fouten maken. Jij bepaalt samen met je arts welk onderzoek nodig is en hoe de uitkomsten uit dit platform te interpreteren voor jouw specifieke situatie.

    The state that is easiest to lose and hardest to win back. Nothing warned, so there are no warning paragraphs and no quiet blocks — and the mail still has a headline, the table and a way in, because an email that never arrives is indistinguishable from a cron that never ran.

    Cardpadded · interactive · accent · active
    Resting card

    Canvas + hairline + soft shadow.

    Interactive card

    Hover lift for clickable surfaces.

    Active card

    Open / selected: deeper shadow + accent border.

    Accent · agree
    Accent · question
    Accent · disagree
    Accent · neutral
    RegisterList · RegisterRownavigational register (title · meta · trailing cells · arrow)

    With refCode — the leading archive-signature cell (fixed-width accent tabular-nums) the Brand catalogue rows carry.

    Input · TextFieldlabel · hint · error · size · serif
    An optional hint sits here.
    This field is required.
    Textarea · TextareaFieldsans · serif · label
    Resizes vertically.
    Selectbox · sm · pill
    FloatText · FloatTextarea · FloatListbox · FloatListboxMultifloat-label · hint · error · single/multi

    The float-label input family the CRM record forms use (e.g. crm AddPersonForm). Controlled by the consumer; the label floats on focus/fill.

    We never share it.
    This field is required.
    Form control statesrest · error (invalid) · disabled

    The three states every control must render: resting, invalid (the disagree-red border + aria-invalid), and disabled.

    This field is required.
    RecordListsearchable record table · row select · empty

    The generic searchable record table (the CRM/people directory list). Columns, selection, search, and decrypt/empty states are all driven by props.

    NameCity
    Ada LovelaceLondon
    Grace HopperNew York
    Katherine JohnsonHampton

    The first-load decrypting state (loading + initialLoad) — rows are field-decrypted via @orgdevkit/crypto, so the initial fetch shows the DecryptSpinner instead of a generic loader.

    Decrypting records…
    InlineNotetone
    InfoA neutral contextual message.
    SuccessSomething went well.
    Modal · Drawer · ConfirmDialog · Toasttriggers
    BrandLoader · DecryptSpinnerasync states
    Loading
    Decrypting…
    Loading
    EditButton · DrawerEditBarview ⇄ edit toggle (crm record drawers)

    The two thin helpers around the crm drawer’s view⇄edit toggle: the quiet pencil that enters edit mode, and the sticky cancel/save bar shown while editing (the consumer owns the editing flag). Shown here inline; in-app the bar is the drawer’s sticky footer.

    AppChromebrand · role-nav · wordmark · navVariant · actions slot

    The shared top bar every app wears — brand + context tag, the role-aware three-circles nav, and a right-side actions slot. Pass role (+ currentPath) and the chrome derives that circle’s nav via circlesNav; each role lands on roleHome(role). Pass a linkComponent for client-side routing (here a plain anchor).

    Member — home /dashboard · nav Dashboard · Library · Ask · My feedback

    Country coordinator — home / · nav Home · Library · Ask · Console

    Federation admin — home /federation · nav Federation · Library · Ask

    Portal look — wordmark (serif brand after the logo) + navVariant="pills" (taller bar, centred pill nav, active = accent on accent-tint)

    SignInCardinvite-only · neutral outcome · refused link · no copy of its own

    The sign-in surface of a product nobody can join from the outside. The element holds no strings and no transport: the host resolves the copy through the locale runtime and calls requestMagicLink() from @orgdevkit/auth/magic-link, which is where the neutrality is decided. Switch between a member, not a member and rate-limited and the screen does not change — that is the point, and it is why the panel talks about the request rather than promising a mail. Refused link is the ?denied=1 state, which says one thing whether the link expired, was already used, or was never that person’s.

    ShellFramemember · reviewer · admin · no-chrome family · the strip on every one

    On an app surface this person is shown the member chrome.

    PINNEDPlan

    Their own research, their own six destinations.

    BrandA styleguide specimen
    This is your own research, to look at what suits you best together with the people who advise you. It is not advice and it is not a verdict. AI analyses can be wrong. You decide, together with them, what is worth doing and how to read what this platform produces for your own situation.© 2026

    The frame every surface sits in: chrome, content column, footer. Which chrome — or none — comes from resolveShellRoute() in shellAccess, which reads the session subject and nothing on the URL, so no route param can widen what a person is shown. The nav is empty while onboarding is unfinished and the gate is what moves them; a shell told to redirect paints nothing rather than a half-second of another room. The disclaimer strip is required by the footer’s own props — one string per chrome (§6), never interpolated, never shortened — which is how “on every surface” stays true without anyone remembering it.

    SettingsSurfaceaccount · preferences · quick links · the kit slot

    Settings

    Your account

    Account
    Email addresssam@example.test
    Sign out on this deviceYour work stays where it is; signing in again is another link by mail.
    Preferences
    LanguageThe language this platform speaks to you in.
    Appearance
    CurrencyThe currency you pay in. Money already held in another currency is shown in that one.
    NumbersThousands and decimals.
    DatesWhere a date is written as digits; in running text it stays written out.
    This is how you will read it: €1.000,21 · 18-03-1991
    Quickly to
    Your data
    A copy of your dataEverything you have written, as a readable package.
    Delete your accountPermanent, after one confirmation. Nothing is kept in reserve.

    Every row here is an app-shell capability — the address a magic link goes to, the session, the locale runtime, the theme store, chrome-level display preferences — and the mockup’s own evidence that the screen is the shell’s is that it has three kickers, one per chrome. The notation options are labelled BY the formatter each one selects (notation.ts), so a translation cannot promise a shape the code does not produce; the appearance row is the only place a person can hand the choice back to their device, because system is the absence of a stored value rather than a third one. A confirmation of a new address is a state of the ROW: the old address stays on screen, because nothing has changed until a link is opened. What the design draws that is not the shell’s — a copy of your data, deleting an account — arrives through panels.

    FootermarkLabel · glyph · caption · trailing slot

    The hairline-top page footer — serif brand mark (+ optional accent glyph) and a muted sans caption. Generalised from the portal app footer.

    Brand §The shared library
    RoleLensview-as switcher (member · coordinator · admin)
    LanguageSwitcherlocale pips
    Locale runtimecopy seam · per-key fallback · gap report
    OverzichtBibliotheek
    Wat er klaarstaat 7 items
    Untranslated, rendering the kit's own language: nav.overview, nav.library, panel.title, panel.counted

    A kit ships one language and no runtime; the host merges a catalogue over it per locale. A missing key falls back rather than showing machinery to a reader, so the gap is invisible by construction — which is why copyGaps() exists and is meant to run in a test, not in a render. Locale comes from the account, never from the browser.

    LangPipsin-sync · stale · unverified · off

    Per-locale translation state for a document/section. Four states: filled = in-sync; amber = stale (the source changed after this translation); dashed = unverified (machine-drafted, awaiting a human check); ghost = off (that language isn’t available yet — any locale absent from the map).

    ennlesall in sync
    ennlesnl stale · es machine-drafted
    ennleses not available yet (off)
    OrgPicker · EventPickershared · data-bound (best seen in-app)

    The two remaining shared @orgdevkit/ui composites — the CRM “link a member to organisations / events” pickers. They drive an async loader and a full set of localised labels, so they live on the real crm screens rather than a synthetic demo; listed here so the catalogue is complete. Both are built from the primitives above (Modal, FloatText, Button, Badge) on the shared tokens.

    Zone B

    Feature-specific

    Genuinely bespoke, app-local surfaces — the allowed exceptions to reuse-first (Decision 13), catalogued from the CSS the apps actually ship today (name + what it is + the CSS that styles it). Anything here that turns out to be almost shared gets promoted into @orgdevkit/ui rather than forked again.

    Specialised shared — the governance diff

    Shared in @orgdevkit/ui but specialised: the one diff card the revision ceremony uses. Rendered live.

    removedadded

    Members may submit and revise feedback within the consultation window.

    The same diff core in the stance tone — the reference app workshop palette (agree-green / disagree-red on the shared stance tokens), adopted by ProposedEditCard in R3.4.

    Members may submit and revise feedback within the consultation window.

    removedadded

    The composed DiffCard — caption bar + its own inline⇄split toggle + legend in one labelled card. This is the headline “one diff card” every change surface reuses.

    Safe-storage · §3
    Members may store up to twothree doses of the medication at home, kept in the original child-resistant packaging.

    removedadded

    PatchDiffCard — the same card fed a raw unified-diff hunk (GitHub compare’s FileChange.patch): reconstructed to before/after, then word-diffed. The bridge to real compare output.

    Emergency contact protocol
    Current
    Safe practice starts with a clear plan. Always carry a single emergency contact card. Keep the kit sealed until it is needed. Tell one trusted person where it is.
    Proposed
    Safe practice starts with a clear plan. Always carry two emergency contact cards at all times. Keep the kit sealed until it is needed. Tell one trusted person where it is.

    removedadded

    ReconcileSplit — the AI-reconcile view: a canonical change folded into a country’s copy. The country’s own wording that was kept is underlined; the folded-in change reads as additions (no struck deletions in the draft).

    Your current copy
    Coordinators review each intake within five working days before it reaches the queue.
    Reconciled draft
    Coordinators review each intake within three working days before it reaches the shared queue.

    App-local feature surfaces

    reference app
    Document reader + annotation surface
    The document reading column with gutter/TOC and inline highlight-and-annotate affordances — the reference editorial look.
    .law-* (chat/law-reader.css)
    reference app
    Companion chat surface
    The stakeholder companion dock: chat turns, reading list, passage reader, add-document flow — a bespoke conversational shell.
    .chat-* / .mcomments / .reading-list (chat/chat-surface.css)
    reference app
    Onboarding navigator
    The greeting/recommendation navigator that routes a stakeholder into their reading path.
    .navigator-* (onboarding/navigator.css)
    reference app
    Reading path
    The stop-by-stop guided reading journey (progress stops + resume affordance).
    .sf-stop / .sf-path (reading/reading-path.css)
    reference app
    Response review
    The stakeholder "my responses" review list with pending states.
    .sf-resp (response/response.css)
    reference app
    Finish / wrap-up ceremony
    The finalise screen: summary cards, consent checks, closing options.
    .sf-sumcard / .sf-check (finish/finish.css)
    reference app
    Suggest-a-source flow
    The member "suggest a source" conversational card flow (+ its admin check view).
    .sg-* (suggest/suggest-source.css)
    reference app
    Sign-in
    The magic-link sign-in card with the brand motif — each app keeps its own entry look.
    .signin-* (sign-in/sign-in.css)
    reference app
    Admin feedback-workshop suite
    The full facilitator console: inbox, matrix, spine, themes, org-voice, workbench, workshop layout, applied receipts, stakeholder overview — admin-gated and deeply feature-specific.
    .admin-* / .sov / feedback-* (admin.css, admin/stakeholder-overview.css, admin/feedback/*.css)
    portal app
    Eligibility screening flow
    The eligibility checker: stepper, risk gauge, verdict card, timing timeline, end report — a bespoke safety-screening surface.
    .screen-* (screening/screening.css)
    portal app
    Ask-the-library
    The Q&A surface: question box, streaming answer column, source suggestions.
    .ask-* (ask/ask.css)
    portal app
    Member dashboard
    The member home: hero, pinned-document tiles, ask callout.
    .mdash-* / .ask-callout (dashboard/dashboard.css)
    portal app
    Portal home hero
    The public landing hero + section frames + ask callout (rows are the shared RegisterList).
    .home-* / .portal-cta (home.css, src/styles/portal.css)
    portal app
    Browse filter chips + empty state
    Only the category filter chips and the empty state are local — the catalogue rows are the shared RegisterList/RegisterRow.
    .browse-* (browse/browse.css)
    portal app
    Document detail + stance dock
    The single-document reader: prose column, margin notes, stance pills, selection dock, compose box.
    .doc-* (document/[slug]/document.css, src/styles/portal.css)
    portal app
    Country-console rail + shell
    The coordinator console navigation rail (ref-coded nav items) and two-pane shell.
    .console-* (console/console.css)
    portal app
    Console work surfaces
    The per-tool coordinator surfaces: adopt, editor, escalate, feedback triage, intake, member roster, canonical updates/merge flow.
    .cadopt-/.ceditor-/.cescalate-/.cfeedback-/.cintake-/.roster-/.cupdates-* (console/*/*.css)
    portal app
    Federation admin console
    The federation-wide curation views: overview minis, escalation house cards, canonical ledger.
    .fedov / .fedesc-* / .fedcanon (federation/federation.css)
    portal app
    Experts directory + case review
    The expert-matching directory: expert rows, focus filters, match panel, case review.
    .mexp-* / .exp-* / .case-* (experts/experts.css)
    portal app
    My feedback
    The member feedback-status list (responses + pending dots).
    .mwf-* (my-feedback/my-feedback.css)
    portal app
    Sign-in
    The magic-link sign-in card with the § archive mark.
    .signin-* (sign-in/sign-in.css)
    crm
    Contacts surface + record drawer
    The contact list page frame and its drawer subpanels (relations, memberships) — the list/table itself is the shared RecordList.
    .crm-contacts / .crm-contact-drawer / .crm-subpanel (contacts/contacts.css)
    crm
    Companies surface + drawer
    The company list frame + wide company drawer layout.
    .crm-companies / .crm-company-drawer (companies/companies.css)
    crm
    Events surface + drawer
    The event list frame + event drawer layout.
    .crm-events / .crm-event-drawer (events/events.css)
    crm
    Add-a-person form layout (RA)
    The RA "add a person" screen — inputs/listboxes/buttons are shared @orgdevkit/ui primitives; only the page-head + fieldset sections are laid out locally.
    .crm-people-* (people/people.css)
    crm
    Sign-in + home scope shell
    The CRM entry card and the signed-in home/scope chooser.
    .crm-signin / .crm-home / .crm-scope (sign-in/sign-in.css, src/styles/crm.css)
    research-platform
    Researcher console kit
    The full researcher console (nav, badges, decision cards, flow-graph nodes/edges, check rows) — a parallel .pc-* kit that DUPLICATES shared primitives, pending migration onto @orgdevkit/ui.
    .pc-* (src/styles/console.css)
    research-platform
    Participant questionnaire theme
    The SurveyJS questionnaire re-skinned onto the platform tokens + the accessibility toggle.
    .odk-survey / .research-questionnaire / .odk-a11ytoggle (src/styles/survey-theme.css)
    research-platform
    Home shell
    The thin signed-out/landing frame around the two portals.
    .research-home (src/styles/research.css)
    website
    Shared-core tokens (aliased)
    The public site imports @orgdevkit/design/tokens.css and aliases its brand tokens onto the platform semantics (--teal→--accent, --bg→--canvas, …) so a platform token edit propagates to the website.
    apps/website/app/styles/tokens.css
    website
    Marketing palette + scale (local, inherits less)
    By owner ruling (Decision 12) the site keeps its marketing identity local: navy/gold/forest palette, dark-photo overlay chrome, marketing type scale, editorial layout frame, refined radii/shadows, motion --ease.
    apps/website/app/styles/*.css
    website
    Marketing components + layout
    The ported marketing pages keep their own components/layout where the editorial look is genuinely better (site header/footer, hero, donation tiers, editorial grid).
    apps/website/app/components/** + styles/{layout,components,editorial}.css