01 / Thesis
Paper and
one signal.
A white page, black ink, and exactly one blue — spent only where the reader is allowed to act.
At a glance
- Ground
- Paper #FFFFFF
- Ink
- Black #000000 · 21.0:1
- Signal
- #005BD2 · oklch(50% 0.2 258)
- Display
- URW Gothic Demi, 20 px and up
- Body
- Inter
- Data
- JetBrains Mono, tabular
- Depth
- 1 px rules. No shadow, no gradient.
Option 1 proves the identity can live in pure monochrome. This option asks the next question: does a single signal colour help the mark, or dilute it? The answer here is that it helps, because it is never decoration. Blue never fills a card, never tints a header, never sits behind a headline. It appears on links, on the primary button, on the focus ring, and under one word. That scarcity is the point: an ops manager scanning a page for “what do I press” finds it in one glance, and the wordmark stays the only black-and-white thing on screen.
For a company selling an approval gate to finance, restraint is the argument. Colour that means something everywhere means nothing anywhere. Here it means two things and two only: you can act on this, or this is a fact about a record.
The one rule
Colour is permission to act. Everything else is ink on paper.
The signal blue is allowed on links, the primary button, the focus ring, and the underline under “defend”. Nowhere else. Status colour (exception / warning / ok) is allowed only inside product surfaces, where it is a fact about a record, never a brand accent.
02 / Logo
Outlined URW Gothic Demi, black on paper.
Wordmark on this option’s ground
#000000 on #FFFFFF · 21.0:1The mark and its minimum sizes
Below 96 px use the mark, not the wordmarkMinimum — wordmark 96 px
Minimum — mark 16 px
Clear space
= the height of the d’s bowlApp icon and don’ts
Rendered, not described03 / Typography
One display face, one text face, one data face.
Faces and roles
Source in the right columnDeskrivet
Display — URW Gothic Demi 600
Headlines, stat numbers, section headings, buttons’ ancestors. Never below 20 px, never for running text. Tracking tightens as size grows.
/brand/fonts.css · self-hosted woff2
Deskrivet
Body — Inter 400 / 500 / 600
All running text, labels, form fields, table cells, captions and eyebrows. 400 for prose, 500 for cells that carry a name, 600 for anything clickable.
Google Fonts · Inter
8h 19m
Data — JetBrains Mono 400 / 500
Times, durations, distances, revision hashes, Acumatica IDs, tokens and code. Anything a reader may need to compare character by character.
Google Fonts · JetBrains Mono
Type scale
size / line-height / tracking| Token | Spec | Role | Live sample |
|---|---|---|---|
| display-xl | 76 / 72 / −.035 | Hero H1 | Time your payroll can defend. |
| display | 52 / 52 / −.030 | Page opener | Paper and one signal. |
| h2 | 34 / 36 / −.022 | Section head | Exception-first approval. |
| h3 | 22 / 28 / −.012 | Sub-head | The gate before export. |
| lead | 20 / 32 / −.011 | Hero lead | Field Time captures punches offline and surfaces the exceptions. |
| body | 16 / 26 / 0 | Prose | An unapproved session cannot become a Time Activity, technically. |
| small | 14 / 22 / 0 | UI, meta | Built for Acumatica 2026 R1. No middleware, no mapping screens. |
| caption | 11 / 12 / +.14 | Eyebrow, label | 03 / Typography · Exception |
| mono-data | 13 / 20 / 0 | Data cell | 8h 19m · Stop 15:32 · 412 m · 381e…c4e2 · EP00012 |
At ≤1024 px display-xl drops to 60/58 and display to 42/44. At ≤720 px they drop to 40/42 and 30/34. Nothing else in the scale changes.
Numerals
Tabular everywhere. Mono for anything a payroll clerk would read aloud.Right — tabular, columns align
| Tama Wiremu | 7h 58m |
| Ria Kōhere | 8h 04m |
| Ana Ropata | 8h 19m |
| Hemi Walker | 7h 46m |
Wrong — proportional body figures
| Tama Wiremu | 7h 58m |
| Ria Kōhere | 8h 04m |
| Ana Ropata | 8h 19m |
| Hemi Walker | 7h 46m |
Rule: every figure in a column, a stat, or a total is tabular. Times, durations, distances, revision hashes and Acumatica IDs are JetBrains Mono. A figure inside a sentence stays in Inter.
04 / Colour
Two neutrals, one signal, three facts.
Grounds and ink ramp
Contrast measured against the ground it sits onThe signal
Interactive only. Never a surface, never decoration.When colour is allowed
- Signal blue — four places. Text links. The primary button. The focus ring. The underline under “defend”. That is the closed list.
- Status colour — inside product surfaces. A chip, a row marker, a badge. It states a fact about a record, not a brand mood.
- Everywhere else — none. No tinted sections, no coloured headings, no coloured icons, no coloured rules. If it is not clickable and not a record, it is black, grey, or paper.
Status — product surfaces only
Ink on its own tint, measuredexception #B71824 / oklch(50% 0.19 25) · warning #8A5200 / oklch(49% 0.13 75) · ok #197037 / oklch(48% 0.12 150). Each also carries a shape — the chip dot, the left rule on an exception row — so the state survives a monochrome print-out and colour-blind readers.
05 / Spacing and layout
A 4 px unit and a 12-column field.
Spacing scale
base unit 4 pxRadii, rules, elevation
Depth is a rule, not a shadowElevation — none
A plate is paper with a 1 px hairline. This is the only card treatment.
Depth — ground change
A well is --sunk with the same hairline. No shadow exists in this system.
Container and grid
1200 px · 12 × 24 px gutter · 32 px page padContent maxes at 1200 px with 32 px page padding (24 at ≤1024, 20 at ≤720). Prose sets to a 68 ch measure. The grid collapses 12 → 6 → 1.
06 / Components
Every state rendered, side by side.
Buttons — kinds × states
Hover and focus shown as live states and as forced classesText link, inputs, select
Hover and focus states rendered in placeSessions are held in the console until a supervisor clears them. Read the approval gate spec before you configure export.
Hover state: Read the approval gate spec
Focus state: Read the approval gate spec
Nav bar
The one place brand chrome and the signal meetProduct plate
The console’s session detail. Status colour lives here and only here.- Duration
- 8h 19m
- Exception
- Stop 15:32 · 412 m outside the fence
- Crew note
- “Walked to the van for fittings.”
- Approved
- 15:51 · M. Ropata
- Revision
- 381e…c4e2
The gate is the product. An unapproved session cannot become a Time Activity, technically — not by policy, not by convention.
Crew table
Tabular numerals. Ana’s row carries the exception rule.| Crew | Status | Duration | Stop | Revision |
|---|---|---|---|---|
| Ana Ropata | Outside geofence | 8h 19m | 15:32 | 381e…c4e2 |
| Tama Wiremu | Approved | 7h 58m | 16:04 | a10f…9b73 |
| Ria Kōhere | Approved | 8h 04m | 16:11 | 7c22…01de |
| Hemi Walker | Approved | 7h 46m | 15:58 | e4b8…5a06 |
07 / Motion
Short, flat, and never on a number.
Durations
Bars drawn to scale.22,1,.36,1
.65,0,.35,1
.2,0,0,1
Signature loader
The rivet-d, spinning
96 px on black. The only piece of brand motion. It appears while the handset drains its offline queue — the one moment the user is genuinely waiting on the ingest path, never as a page-load flourish.
What moves
- Interactive state: colour and border, 120 ms, --ease-out.
- Panels and drawers: transform only, 280 ms, --ease-emph.
- A row entering a queue: 8 px rise and fade, 200 ms, staggered 30 ms.
- The loader, while real work is happening.
What never moves
- The wordmark and the mark. They never animate in chrome.
- Numbers. A duration or a total never counts up; it arrives settled.
- The approval gate’s confirmation. It states, it does not celebrate.
- Anything on scroll. No parallax, no reveal-on-scroll.
Reduced motion
Show the resolved state, paused, never removed. Transitions collapse to 1 ms; the loader above is replaced in place by the static mark on the same black tile, so the page never loses an element. This page implements it — set the OS preference and the tile stops without going blank.