Datum
The design language behind this site and the interfaces I build. Everything here is rendered live, in light and dark, from the same tokens the pages use.
The spec is one file, DESIGN.md. This page reads it and the site's CSS when it is built, so the counts and the colour check below are measured, not typed in.
Principles
Eleven rules that decide the small questions. The two that matter most: information is the ornament, and the same control always looks and sits the same way.
- 01Information is the ornament
- 02Show the grid
- 03Two voices
- 04Extreme scale contrast
- 05Monochrome first, one signal
- 06Hairlines over boxes
- 07Repetition is rhythm
- 08Objects, not pages
- 09Hands on the controls
- 10Material, lightly
- 11Quiet by default
Colour
About 90% concrete, up to 5% signal, up to 3% moss. State colours appear only on live data. Each swatch pair is Paper then Instrument.
Concrete ramp
Semantic tokens
| Token | Paper | Instrument |
|---|---|---|
on-warning | #F7F7F5 | #0A0A0A |
bg | #EDEDEA | #0A0A0A |
surface | #F7F7F5 | #141414 |
hover | #E2E2DE | #1C1C1B |
ink | #111111 | #E8E8E4 |
ink-2 | #55554F | #9A9A94 |
ink-3 | #686862 | #808079 |
rule | #CFCFCA | #2A2A28 |
rule-strong | #B4B4AE | #3A3A36 |
signal | #EA562A | #EB6137 |
signal-text | #B83A14 | #F0724C |
signal-weak | #F5DED6 | #33170F |
on-signal | #111111 | #0A0A0A |
moss | #55664A | #8FA27A |
moss-weak | #DDE1D3 | #1A2016 |
on-moss | #F7F7F5 | #0A0A0A |
State colours
Status, charts, telemetry. Never decoration, never a second accent. Warning is amber, not orange and not red, and always carries a word or the hollow marker.
Type
Three fonts, two voices: a tight grotesk that states, a small mono that annotates. Departure Mono is pixel-built, so it never goes below 20px.
Space and marks
A 4px base unit on a 12-column grid. Hairlines are 1px and corners are sharp. The decoration is information: small marks that carry something true.
| Mark | Looks like |
|---|---|
| Index | §0x03 · B · III · No. 019 · Fig. α · ii |
| Serial / ID | PLY-2026-014 |
| Version stamp | v0.6 · 2026.10.05 |
| Tick ruler | Short hairlines at regular intervals |
| Inverted label | Outputs, results, totals |
| Status pill | LIVE · PRE-RELEASE · NEEDED |
| Hairline table | Rows split by 1px rules, no fills |
| Redaction bar | Only for something truly withheld |
The smallest parts, one job each. Each is shown on Paper and Instrument; the controls work.
Text roles
- Named uses of the type scale, so a screen never picks sizes freehand.
- A count after a title is
metainink-3, never in a bubble.
Icon
- Outline only, 1.5px stroke. Sizes 12, 16 and 20.
ink-2, orink-3when it only decorates. A state colour only when the icon is that status.- Never the only label of an unfamiliar action.
Tag
- A fixed property of a thing. 20px tall, 1px
rule-strongbox, never coloured. - If it can change while you look at it, it is a status pill.
Status pill
- Same geometry as a tag. Box and text in the state colour; concrete states stay
ink-2. - Solid: only the one current state in signal, or warning where pills are solid.
- Always a word. Colour is the second cue.
Count
- Number in
ink, noun inink-2. No colour and no box. 16px between counts, in a fixed order per item type. - Hide a zero unless the zero is the news. Singular for 1.
Button
- Height 32, hit area 40, Grotesk 500 14px. One signal-filled primary per view.
- States are the same for all three weights. Focus is a 2px ink outline, never system blue.
- A menu button shows the current value, not the dimension.
Toggle
- 36×20, sharp. Off is an empty track with an
ink-3thumb; on is a filled ink track. - Never signal, never
live. 120ms linear. One toggle per setting that applies at once.
Text field
- Height 32, 1px
rule-strong,surfacefill. Label above, hint below, 4px gaps. - Focus turns the border ink. Error turns border and hint
alert. Warning colours the hint only. - Text area: min 96, grows to 240 then scrolls, vertical resize with a hairline handle.
- Secure field: value in Plex Mono 13px, reveal button inside, re-masks on blur and after 30 seconds.
Rule
rulebetween rows of a list, starting at the text column.rule-strongunder a group header and at the top of a section, full width.- Nothing thicker than 1px.
rule-strong
rule-strong
Disclosure chevron
- 12px,
ink-3, at the trailing edge of a row that opens a detail view. A menu uses the up/down chevron instead.
Row marker
- 8×8 hollow square, 1.5px stroke, in
warning, at the leading edge. Hollow means "needs attention"; a filled square stays free for alert.
Checkbox
- 16×16, 40px hit area. Checked is filled ink with a
bgtick; mixed is a dash. Never signal or green. - A toggle is one setting applied at once. A checkbox picks members of a set of five or more.
Slider
- The track is a tick ruler: one tick per step, ink up to the value. Thumb is an 8×20 ink block.
- Arrow keys move one step, Shift+arrow ten, Home and End jump to the ends.
- Six or fewer meaningful values are a menu or a segmented control instead.
Segmented control
- Two to four options, all visible. Selected is filled ink; one is always selected.
- Five or more options, or long labels, become a menu button.
Progress meter
- The tick meter: 1px ticks on a 4px pitch. Lit ticks are ink; signal only for the one primary meter in a view.
- Indeterminate is five lit ticks stepping across. With reduced motion it holds still and says
WORKING.
Chip
- A removable item the user chose. Tag geometry,
inktext, a 8px × with a 40px hit area. - One atom: not a tag next to a separate × button. Offer Undo where removing loses data.
Selected and editing row
- Selected is a
signal-weakground and nothing else; multi-select adds a checkbox, so it reads without colour. - Editing opens the row in place with a 1px ink outline. One row edits at a time, Esc cancels.
- A plain
Editbutton sits before the chevron on hover and focus.
Category mark
- Tells apart members of a category that has no state meaning: speakers, groups, kinds. One character in a 16px box.
- Assigned in order of first appearance and kept. Never coloured. Active inverts.
A few atoms put together. Starting points, not the only allowed layouts.
Section header and group header
- Section header: label and count left; plain and menu buttons right;
rule-strong8px below. - Group header:
title.groupand count, 24px above and 8px below,rule-strongunder it.
Settings row
- Icon,
title.row, optional tag, control at the trailing edge, hint under the label. Minimum 48 high. - The text column keeps at least 240px. When a long control would leave less, it drops below the hint and the pill stays on the label line.
List row
- Marker, 20px icon, then text:
title.row,meta,body.short, counts. Trailing: onemetavalue and the chevron. - 4px between lines, 16px top and bottom,
rulebetween rows.
Filter bar and checklist
- Filter bar: a text field taking the remaining width, then menu buttons in a fixed order: what, when, grouping, sort.
- Checklist: rows are 40px, with a count and Select all / Clear above.
Choosing and combining
Which control for which value, and the few rules that apply once atoms are put together (DESIGN.md 16.3).
| The value is | Use |
|---|---|
| On or off, effect at once | Toggle |
| Several of a set | Checkbox list |
| One of 2–4, all visible | Segmented control |
| One of 5+ named presets | Menu button showing the current value |
| A number on a range | Slider (more than six sensible values) |
| A number typed exactly | Text field with a meta unit after it |
Stacked bar
- Stepped ink opacity (100, 70, 45, 25, 12 %), largest first, at most five parts, a 1px gap between. Each part has a label and a value below.
- State colours are not used: a part is a category, not a status. The values here are specimen data.
On this site
The site is the first customer of its own spec. These numbers are read from the repository when the page is built.
- Atoms specified
- 18
- Atoms shown here
- 18
- Colour tokens in spec
- 20
- Same in the CSS
- 19
- Differ from the CSS
- 1
- Not in the CSS
- 0
Colour tokens against the CSS
A difference means the spec or src/styles/global.css is out of date. Tokens with no CSS variable are written in the spec only.
| Token | Spec Paper | CSS Paper | Spec Instrument | CSS Instrument | Status |
|---|---|---|---|---|---|
live | #0E7A41 | #0E7A41 | #3DDC84 | #3DDC84 | In sync |
alert | #D11A1A | #D11A1A | #FF4545 | #FF4545 | In sync |
cold | #2650D9 | #2650D9 | #6B93FF | #6B93FF | In sync |
warning | #6A4A00 | #6A4A00 | #F2C94C | #F2C94C | In sync |
on-warning | #F7F7F5 | #F7F7F5 | #0A0A0A | #0A0A0A | In sync |
bg | #EDEDEA | #EDEDEA | #0A0A0A | #0A0A0A | In sync |
surface | #F7F7F5 | #F7F7F5 | #141414 | #141414 | In sync |
hover | #E2E2DE | #E2E2DE | #1C1C1B | #1C1C1B | In sync |
ink | #111111 | #111111 | #E8E8E4 | #E8E8E4 | In sync |
ink-2 | #55554F | #55554F | #9A9A94 | #9A9A94 | In sync |
ink-3 | #686862 | #8A8A83 | #808079 | #66665F | Differs |
rule | #CFCFCA | #CFCFCA | #2A2A28 | #2A2A28 | In sync |
rule-strong | #B4B4AE | #B4B4AE | #3A3A36 | #3A3A36 | In sync |
signal | #EA562A | #EA562A | #EB6137 | #EB6137 | In sync |
signal-text | #B83A14 | #B83A14 | #F0724C | #F0724C | In sync |
signal-weak | #F5DED6 | #F5DED6 | #33170F | #33170F | In sync |
on-signal | #111111 | #111111 | #0A0A0A | #0A0A0A | In sync |
moss | #55664A | #55664A | #8FA27A | #8FA27A | In sync |
moss-weak | #DDE1D3 | #DDE1D3 | #1A2016 | #1A2016 | In sync |
on-moss | #F7F7F5 | #F7F7F5 | #0A0A0A | #0A0A0A | In sync |
Counting systems, from this site's data
Each kind of counter has its own system, the same on every page: hex for sections, roman for registries, three-digit decimal for posts, Greek for figures.
| Counts | System | Now |
|---|---|---|
| Site sections | Hex | 0x01 · 0x02 · 0x03 · 0x04 · 0x05 · 0x06 · 0x07 |
| Apps in the registry | Roman | I · II · III · IV · V · VI · VII |
| Releases | Roman | VII (7) |
| Posts | 3-digit decimal | No. 019 |
| Figures | Greek | Fig. α · Fig. β · Fig. γ |
See the system applied on real interfaces in the Showcase, or read the full spec in DESIGN.md.