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
Contrast ratios are stated because this is a trade site read on a phone in a driveway, not on a calibrated screen. Every text pair here clears WCAG AA; most clear AAA.
Ground
-
--color-bgPage ground -
--color-bg-altAlternating band -
--color-surfaceCards and panels -
--color-borderHairlines
Ink
-
--color-textBody and headings 17.9:1 AAA -
--color-text-faintLabels and eyebrows 9.84:1 AAA -
--color-text-mutedSecondary prose 7.24:1 AAA
Accent
-
--color-accentButtons and rules 7.36:1 AAA -
--color-accent-hoverPressed state 9.5:1 AAA -
--color-accent-textAccent-coloured text 7.36:1 AAA -
--color-emergencyStorm bar only 5.9:1 AA
Dark sections
-
--color-dark-bgHero and dark bands -
--color-dark-textText on dark 16.4:1 AAA -
--color-dark-mutedSecondary on dark 6.71:1 AA -
--color-dark-accentAccent on dark 7.9:1 AAA
Type
Roboto Slab for display, Asap for body. A slab serif because roofing sells on solidity; both faces are unused anywhere else in the 365.
-
Hail hit.
-
Recent work
-
Standing seam over a 12/12 pitch
-
Water rarely enters where it appears inside, so we trace it from the stain up before quoting.
-
Free, and yours to keep either way.
-
RECENT WORK
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.
Spacing and radii
Sections are separated by --section-gap. Cards use a 0.75rem radius,
pills use 999px. Nothing else invents a value.
0.5remtight stacks1reminside cards1.5rembetween cards--section-gapbetween sections