The rules behind this case study: the Birchway brand as it appears in the creatives, and the interface system the case study itself is built from. Every component on this page is the real one, working, and every contrast value is computed as the page loads.
Principles
Measure, don’t eyeball
Every ratio, size and weight on the site is computed from the thing itself. If a value can be checked, the page checks it.
The work sits on the proof
The interface is cool proof paper and spec ink. Colour and depth belong to the creatives, so they read as the subject.
Say it in words, then in colour
Status is always an icon and a word. Colour reinforces meaning; it never carries it alone.
Brand foundations
How Birchway appears in the creatives. These are the rules the QA checklist enforces.
Logo
A birch leaf in a Hearth Cream roundel beside a two-line Young Serif wordmark. The leaf mark’s height is the unit for every logo rule.
Birchway Market
Primary, on Spruce
Birchway Market
Reversed, on Hearth Cream
Birchway Market
Clearspace: half the mark height on every side
Birchway Market
Minimum: 20 px mark on screen; below that, the mark alone
Brand colour
Six colours. Two are illustration-only and never sit behind text; the QA checklist fails any CTA that uses them.
Every file gets the same checklist.--t-lg 21px. Ledes, card headings
Six segments, always in the same order, joined by underscores.--t-md 17px. Body text, line-height 1.55
Measured 300 × 250 px against a 300 × 250 px spec.--t-sm 15px. Secondary text, tables, controls
BWM-208 Due Nov 6--t-xs 13px. Captions, badges, meta
Layout and spacing
--gutter
clamp(16px, 4vw, 48px). Page side margin; 16 px on phones, 48 px on desktop
--measure
68ch. Maximum line length for reading text
--wide
1240px. Maximum width for galleries, boards and tables
--header-h
64px. Sticky header height; anchors and sticky toolbars offset by it
4–8 px
Inside a control: icon to label, badge padding
12–24 px
Inside a component: card padding, list rows, field groups
28–48 px
Between components in a section
72 px
Between sections on a page
88–96 px
Before the pager and footer
Breakpoints
Phoneup to 559 pxSingle column, stacked tables, compact board
Large phone560 to 759 pxTwo-up galleries begin, filters wrap
Tablet760 to 999 pxTwo-column footer and forms, side-by-side before and after
Laptop1000 to 1239 pxQA and reflection side columns, three-column board
Desktop1240 px and upFive-column board, seven-step horizontal process flow
Layouts change where the content needs them to, so a few components use their own break points between these tiers. Every page is checked for horizontal overflow from 320 to 1920 px.
Shape, depth and motion
Corner radius
--r-sm 4px Every control: buttons, filters, inputs, badges
--r-md 8px Cards, panels, tables
Depth
Hairline
1px solid var(--rule) Every UI surface: cards, tables, panels. No shadow.
Artwork lift
0 10px 30px -18px rgba(ink, .55) Creatives only, so the work sits above the proof paper.
Motion
Sheet
260 ms, cubic-bezier(.2, .7, .2, 1) Menu panel slide-in. Reduced motion: 150 ms fade.
Stagger
300 ms + 28 ms per item Menu links settling in. Reduced motion: none.
1.3 s, staged Header leaf mark on page load: roundel, outline draw, fill, veins, wordmark unmask. Sways on hover.
Draw
1.1 s, cubic-bezier(.16, 1, .3, 1) Home dimension lines drawing out, after the logo reveal.
Layering
--z-sticky 20, gallery toolbar--z-header 50, sticky header--z-overlay 80, menu scrim--z-modal 90, menu sheet--z-skip 100, skip link
Components
The working components from across the case study. Try them with a keyboard: every one is reachable with Tab and shows the focus ring.
Buttons
Use
Primary for the one main action on a view. Quiet for secondary actions. Labels name the action and never wrap. Corners are 4 px, like every control.
States
Hover darkens or fills; pressed nudges 1 px; disabled turns dashed and muted; focus shows the spec-ink ring.
Segmented filter and checkbox
Use
The segmented filter narrows a view to one option; a checkbox switches an overlay on or off.
States
aria-pressed carries the filter state; the active option inverts and shows a check mark, so it never relies on colour alone. The checkbox is a native input.
Status and priority
PassFailPlaceholderNeeds reviewMeasuringN/A
HighMediumLow
Use
Status badges report a check result; priority uses shape and word together.
States
Six statuses, three priorities. Each pairs an icon with a word.
Form fields
Use
Visible labels above every field; hints sit between label and input and are tied to it with aria-describedby.
States
Focus shows the ring and a spec-ink border; disabled checkboxes say why in their label.
Workload card
BWM-201High
Medium rectangle 300 × 250: fix CTA contrast, logo clearspace, headline size
DisplayDue tomorrow
Use
One request per card: ID, priority, title, platform, due date and a move control.
States
Urgent due dates add a warning icon and the danger colour; moving a card keeps keyboard focus on it.
Shows a creative at its true pixel size with spec-ink dimension lines, scaled to fit and never upscaled. Used for every creative on the site.
States
Safe zone overlay on demand; the scale note updates as the frame resizes.
Accessibility
WCAG 2.1 AA is the floor, checked by script rather than by eye.
PassContrast. Every text pair is at least 4.5:1 in both themes (lowest 5.63:1). npm run audit:contrast fails the build otherwise.
PassFocus. A 3 px spec-ink ring with a 3 px offset on light surfaces, Wheat on dark ones. Never removed.
PassTouch targets. Interactive controls are at least 44 px tall.
PassAppearance. The header button and Alt+Shift+L (⌥⇧L on Mac) cycle System, Light and Dark; System follows the device live. The tooltip shows on hover and keyboard focus, and each change is announced.
PassMeaning. Status, priority and urgency always pair an icon and a word with their colour.
PassMotion. With reduced motion on, slides become fades and the banner shows its end frame.
PassStructure. One h1 per page, a skip link, labelled landmarks, alt text on every creative, and focus moved to the new heading on navigation.
Tokens
The interface colour tokens as CSS custom properties, and the whole system as a JSON file.