Design system
The tokens and components all 16 products are built from, rendered by the code that ships, in both themes and both languages.
Paper and ink
The neutral ramp, twelve steps, authored in OKLCH so one step is the same perceptual distance everywhere. Warmth sits at hue 85° with chroma between 0.004 and 0.011: enough that a full screen reads as a printed page rather than a browser default, never enough to read as beige.
Light
- 0ground
#fefdfc - 1raised
#f9f8f5 - 2sunken
#eeedea - 3fill
#e3e2de - 4hairline
#d7d5d0 - 5border
#bcbab6 - 6borderStrong
#898783 - 7muted
#6d6b66 - 8secondary
#5a5853 - 9strong
#3f3d38 - 10heading
#262421 - 11ink
#12100e
Dark
- 0ground
#100f0c - 1raised
#191815 - 2sunken
#262421 - 3fill
#302d2a - 4hairline
#3c3a36 - 5border
#514e4a - 6borderStrong
#716e6a - 7muted
#8e8b86 - 8secondary
#a4a19d - 9strong
#c3c0bd - 10heading
#e0deda - 11ink
#f5f3f0
The institutional accent
The flag's green sits at step 5 at its published value. It is the identity anchor and is not adjusted. But against paper it reaches only 2.64:1, which fails AA for text at any size. The ramp holds the same hue, 145.09°, and walks lightness down until step 8 reaches 8.90:1 and clears AAA. That step is what carries interface emphasis.
- 1
#edf8ec1.07:1 · fail - 2
#d6eed51.21:1 · fail - 3
#b1dfb11.48:1 · fail - 4
#7cc87f1.98:1 · fail - 5
#1eb53a2.68:1 · failFlag - 6
#12942c3.93:1 · AA-large - 7
#1271226.06:1 · AA - 8
#0f54199.03:1 · AAAWorking - 9
#07380e13.04:1 · AAA
Clinical semantics
Colour in the clinical application means clinical state and nothing else. Every state carries its non-colour differentiator, a glyph, a weight, a rule treatment and a name in both languages, as part of the token, so a component cannot paint the colour without also having the glyph and the label to hand.
| State | Glyph | Name | Weight | Rule | Light | Dark |
|---|---|---|---|---|---|---|
critical | ‡ | Critical | 700 | double | 7.14:1 | 7.21:1 |
abnormal-high | ↑ | High | 600 | solid | 7.14:1 | 7.11:1 |
abnormal-low | ↓ | Low | 600 | solid | 7.09:1 | 7.19:1 |
normal | none | Normal | 400 | none | 18.70:1 | 17.33:1 |
pending | · | Pending | 400 | dashed | 6.69:1 | 6.91:1 |
corrected | ∆ | Corrected | 600 | double | 7.16:1 | 7.09:1 |
expired | ⁄ | Expired | 400 | hatched | 5.27:1 | 5.66:1 |
controlled | ◊ | Controlled | 600 | solid | 7.12:1 | 7.18:1 |
allergy | † | Allergy | 700 | solid | 7.15:1 | 7.19:1 |
stat | !! | STAT | 700 | double | 7.11:1 | 7.19:1 |
"Normal" is deliberately colourless. A colour that means "nothing is wrong" spends the reader's attention to say nothing: and that decision is what leaves the flag green free for institutional use. "Pending" and "expired" are held to AA rather than AAA: neither carries a live clinical value, and making absent data shout as loudly as a live abnormal result is a patient-safety regression in the opposite direction.
Typography
IBM Plex Sans, self-hosted, subset to 255 codepoints. Tabular figures are the global default. The serif is reserved for long-form policy and legal text and appears nowhere else.
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
- The patient has arrived 0123456789
Space and structure
- Space
- 8 · 16 · 24 · 32 · 40 · 48 · 64 · 80 · 96 · 128 · 4 · 12 px
- Radius
- none 0px · sm 4px · md 8px · lg 12px
- Border width
- 1px
- Elevation
- 3
- Motion
- 120ms · 160ms · 200ms
- Measure
- 62–72ch
Components
Every component here runs on the same tokens and the same shipped typeface as production. Change the theme or the language at the top of the page and all of it changes with them.
DataTable
| TZ-04-118293 | Neema Juma Mwakalinga | Kinondoni | NHIF | 6.8mmol/LCritical | 2026-08-21 |
| TZ-04-118294 | Hamisi Salum Mohamed | Ubungo | CHF | 4.1mmol/L | 2026-08-19 |
| TZ-04-118295 | Asha Ramadhani Kileo | Ilala | NHIF | 2.9mmol/LLow | 2026-08-24 |
| TZ-04-118296 | Baraka Elias Mchome | Temeke | Private | Not recordedmmol/LPending | 2026-08-25 |
| TZ-16-004871 | Zainabu Athumani Kimaro | Nyamagana | iCHF | 5.1mmol/L | 2026-08-18 |
Ledger & ClinicalValue
- Legal name
- Neema Juma Mwakalinga
- MRN
- TZ-04-118293
- Insurance
- NHIF · 7391-4402-11
- Allergies
- PenicillinAllergy
- Potassium
- 6.8mmol/LCritical
- Occupation
- Not recorded
- Next of kin
- Not yet asked
Clinical states, inline
6.8mmol/LCritical5.4mmol/LHigh4.1mmol/L2.9mmol/LLow—Pending11.2g/dLCorrectedMorphine 10mg/mLControlledFBCSTAT
StatBlock
FHIR resource types published
18
CapabilityStatement
Connected facilities
Onboarding begins Q4 2026 with 12 pilot facilities in Dar es Salaam and Mwanza.
Facility registry
The first was measured: the mediator declares these types and the count is checkable. The second was never measured, so it says so in words instead of printing a zero. §4.6 leaves no middle path: where a figure is zero, print the roadmap state rather than the number.
Diagram
Fields
NEMLIT formulary. Level-of-care restrictions apply.
Appointment reminders are sent to this number.
Day before month.
Floating layers
Skeleton
Row heights match DataTable exactly, so the swap does not move the layout under a click already in flight.
Why there is no Card
There is no Card component in @thos/ui, deliberately. Cards flatten everything to the same weight: a grid of identical cards hides which item matters and destroys any order that carried meaning. Structure is chosen from the content rather than imposed on it, and the vocabulary is this:
- 01
Comparable entities → DataTable
- 02
Sequence or process → Rail
- 03
One important object → Plate
- 04
Attributes of one thing → Ledger
- 05
Relationships → Diagram
- 06
Reference material → Measure