Skip to content
Style guide

Foundations

Internal page, not linked from navigation. The palette is settled; the long-form reading face is the open decision below.

Palette

Contrast is against the field, #111111.

  • #111111 field the page —
  • #1C1C1C field-raised cards, wells —
  • #2E2E2E rule hairlines —
  • #FFFFFF legend headings, labels 18.9:1
  • #E0E0E0 legend-prose long-form body 14.3:1
  • #B0B0B0 hardware captions, secondary 8.7:1
  • #FFCC00 yellow primary action, shipped 12.5:1
  • #6655FF indigo section bands — surface only 3.9:1
  • #8888FF indigo-text eyebrows, labels on dark 6.3:1
  • #00CCFF cyan code, SDK, technical 10:1

Why indigo is two tokens. At #6655FF it is 3.9:1 on the field — fine behind white text, but it fails as text itself, which is what the eyebrow label in the mockup was doing. #8888FF carries the same hue at 6.3:1.

White on indigo — 5.5:1, fine
Indigo-text on field — 6.3:1 Indigo on field — 3.9:1, do not use
Type — settled
Barlow Black — display

Maybe it is your first rodeo

IBM Plex Mono — technical, and short copy up to ~3 lines

24 additional 16-bit analog inputs, a family of control satellites, and an SDK to help you write the code.

J42 I2C1 SDA/SCL 0x30–0x33
U3 ADS114S08 AIN0–AIN11 16-bit

Type — pick one

Long-form reading, for build-log posts. Same paragraph, same size, same colour.

A Source Serif 4 Built for screen reading. Sturdiest of the three on a dark ground — the stems hold up where lighter serifs go thin.

The hub was corrupting its own register file, but only when the host read twice in a row. Single reads were perfect. Two back-to-back and slot 1 would occasionally report movement that never happened — sometimes a clean detent, sometimes a value that looked like a neighbouring slot’s. Firmware inspection got me nowhere, because the logic was correct. What was wrong was when it ran.

Smaller, for captions and asides: the STM32 I²C peripheral fetches the next byte before the host has acknowledged wanting it.

B Newsreader Warmer and more editorial. Most personality, slightly more delicate in reverse.

The hub was corrupting its own register file, but only when the host read twice in a row. Single reads were perfect. Two back-to-back and slot 1 would occasionally report movement that never happened — sometimes a clean detent, sometimes a value that looked like a neighbouring slot’s. Firmware inspection got me nowhere, because the logic was correct. What was wrong was when it ran.

Smaller, for captions and asides: the STM32 I²C peripheral fetches the next byte before the host has acknowledged wanting it.

C Literata Google’s reading face. Wide and even, a touch quirky; very legible at small sizes.

The hub was corrupting its own register file, but only when the host read twice in a row. Single reads were perfect. Two back-to-back and slot 1 would occasionally report movement that never happened — sometimes a clean detent, sometimes a value that looked like a neighbouring slot’s. Firmware inspection got me nowhere, because the logic was correct. What was wrong was when it ran.

Smaller, for captions and asides: the STM32 I²C peripheral fetches the next byte before the host has acknowledged wanting it.

Devices
I2C SPI Verified In bring-up Planned Retired
analog in
24 × 16-bit
address
0x30–0x33
slot link
JST-SH 4-pin
poll rate
~1 kHz
Outline group