Design System
Every token this template uses, and what it is for.
Re-skinning this template means changing the values in the :root block of
src/styles/global.css and nothing else. This page renders whatever is in
there right now, so it stays true after you have changed it.
Colour
Two constraints decided this palette and neither was stylistic. The warm band is taken —
four trades already own rust, amber and brick — and days 73 and 74 are both green, so a
teal or forest accent here would make three consecutive trade thumbnails read as one
template in three shades. That leaves indigo, and indigo is right for a second reason: this
is the only trade template in the sprint not sold to a homeowner. It is a document, read at
a desk by somebody comparing three bidders. Cool drafting grey, white sheets, graphite ink,
one blueline. Every ratio below was computed with tools/a11y/contrast.py, not
eyeballed.
Ground
-
--color-bgPage ground — drafting grey -
--color-bg-altAlternating band — deeper drafting grey -
--color-surfaceCards, ledgers and tables — sheet white -
--color-borderHairlines — decorative only, 1.46:1 -
--color-border-strongInteractive borders 3.20:1 AA
Ink
-
--color-textBody and headings — graphite 15.23:1 AAA -
--color-text-faintLabels and eyebrows 8.99:1 AAA -
--color-text-mutedSecondary prose — pencil 5.47:1 AA
Accent
-
--color-accentButtons, rules and text — blueline 7.87:1 AAA -
--color-accent-hoverPressed state 12.00:1 AAA -
--color-accent-textAccent-coloured text 7.24:1 AAA -
--color-capacityCapacity bar ground 9.00:1 AAA -
--color-requiredRequired-field mark only 8.11:1 AAA
Ledger flags
-
--color-flag-overLedger: late or over 8.11:1 AAA -
--color-flag-underLedger: early or under 7.92:1 AAA -
--color-flag-evenLedger: on the number 10.28:1 AAA
Dark sections
-
--color-dark-bgHero, schedule band, footer -
--color-dark-surfaceCards inside dark bands -
--color-dark-textText on dark 15.23:1 AAA -
--color-dark-faintMaker strip and callouts 10.79:1 AAA -
--color-dark-mutedSecondary on dark 7.97:1 AAA -
--color-dark-accentAccent on dark — blueline light 7.69:1 AAA
Two tokens carry the same idea on two grounds, which is the correct answer rather than a
duplication: no single value clears 4.5:1 against both drafting grey and graphite, so the
accent is --color-accent on light and --color-dark-accent on dark.
The maker strip and the download bar are written as literal hex rather than as
var() fallback chains, because a fallback chain that resolves to
currentColor is not a fix — it is a silent no-op that changes nothing and looks
like a repair in the diff.
The three ledger flags are deliberately not a traffic light. Two of the six projects on the home page are late and that is the point of the section, so "late" is set at the same weight and the same legibility as "early". A flag that shouts would turn a ledger back into an advert.
Type
Overpass for display, Libre Franklin for body, Overpass Mono for the figure columns. Overpass is drawn from the US Federal Highway Administration’s Highway Gothic — the lettering on interstate signage — which is the correct voice for a company whose product is permits, inspections, occupancy and dates. Libre Franklin is the American institutional workhorse, with a large x-height and a narrow set width, which is exactly what a five-line block of dates and dollar figures needs at 13px. Two grotesks from opposite traditions, signage and print, so they do not collapse into each other the way two neo-grotesks would. Overpass Mono is one weight, latin subset, loaded only for the ledger columns, because the hook of this template is a table of numbers that has to align down the column.
-
Your rent starts whether we finish or not.
-
How the number is built.
-
The one that ran twenty-six days late, and why
-
A photograph of a finished restaurant proves a restaurant was built. It does not tell you apart from the architect, the millworker, or the tenant’s own designer.
-
11 Apr to 27 Jun. 77 calendar days against a 73-day schedule.
-
CO-2 +$9,400 $412,000 → $431,600 +4.8%
-
PROJECT LEDGERS
Interaction states
Every interactive element carries a themed hover and a visible keyboard focus ring. Tab
through the row below rather than clicking it — the focus ring is the part most templates
leave as the browser default, and it is the one a keyboard user depends on. Nothing here is
muted with opacity: opacity composites text toward its background, which is
exactly what contrast measures.
Decorative marks
Every decorative mark in this template is an inline SVG, and none of them is a character. Day 74 shipped a Geometric Shapes glyph with a variation selector and it rendered as a tofu box on machines whose fonts did not cover it; five sibling templates were converted to inline SVG for the same reason. A glyph is a font-coverage bet, an SVG is not.
Spacing and radii
Sections are separated by --section-gap. Everything uses a 4px radius and
nothing uses a pill, because a drawing set has square corners and a page that is pretending
to be a document should not look like an app. Nothing else invents a value.
0.5remtight stacks1reminside cards1.5rembetween cards--section-gapbetween sections