Ledger

The design system for dgoodenough's data projects. Greyscale carries structure; color carries meaning. Built from four influences: Aligulac's dense tables, FiveThirtyEight's headline numerals, McMaster-Carr's speed, and a lifetime of Excel.

Principles

#RuleIn practice
1Greyscale carries structure; color carries meaning. green = have / happened  red = missing / never  yellow = pending / upcoming
2Tables are the first-class citizen. Black header bands, real gridlines, right-aligned tabular numerals.
3Numbers are the headline. Lead with the stat, big and bold; the sentence explains it.
4Speed is design. System fonts, no frameworks, minimal DOM, static hosting.
5Density over whitespace. Compact paddings; show the data, not the chrome.

Palette

Dark by default — the data glows against grey chrome. Greyscale for structure; each semantic accent has a solid form (text, lines) and a fill form (cell backgrounds — Excel conditional formatting). A "newsprint" light variant (.ledger-light) exists for print-adjacent projects and is forced when printing.

Type

System sans stack — zero webfont latency. All numerals tabular.

15,641 the 538-style headline stat (.stat)
Section heading — 1.05rem/700
Body — 14px/1.45. The quick brown fox jumps over 1,234,567 lazy dogs.
Secondary — 12px, --ink-2
Caption/hint — 11px, --ink-3

The ledger table

The canonical artifact (after the collection tracker that started it): band header, gridlines, zebra, conditional-formatting fills.

YEARHaveTotal%
20196610861.1%
20209113070.0%
20215810157.4%
202211912496.0%
20180720.0%
2023pending

Controls

chip

Data bar

Heatmap ramp

Single-hue grey→green: more green = more of the thing. Never/absent = paper; red fill = highlighted absence; yellow = upcoming.