Design system · v1.0.0

Everything downstream is measured from here.

The tokens, components, motion and rules the Aurevix site is built from — enough to build the remaining pages without guessing. Toggle the theme in the header: every swatch re-measures its contrast live, so a token that only fails in one mode has nowhere to hide.

02

Palette

Two complete palettes — "paper" and "model space" — not one palette with a dark override. Every token is defined in both. Ratios below are measured live against the surface the token sits on, and re-measure when you toggle the theme.

Grounds

--c-paperpage ground
--c-surfacecards, inputs
--c-surface-2tinted sections
--c-sunkenwells, code

Ink

--c-ink
--c-ink-2
--c-ink-3
--c-rulehairlines
--c-rule-strongborders

Mark — the setout colour

Survey marking paint. It is the one saturated colour in the system and it is rationed: the logo, reference crosses, focus rings, active states, checkpoint markers. --c-mark is for strokes and graphics; --c-mark-ink is the text-safe value and is the only one allowed to carry words.

--c-markstrokes only
--c-mark-ink
--c-mark-softtint fill

Semantic

--c-ok
--c-warn
--c-danger
--c-info

03

Discipline coding

Four disciplines, four hues, applied systematically rather than decoratively. The hues follow coordination-model convention so an engineer reads them without a legend. Each has a LINE value for strokes and graphics and an INK value for text, tuned per mode to clear 4.5:1.

Mechanical
AS 1668.2 Cyan. Ductwork, ventilation, plant. The convention hue for mechanical services on a federated model.
Electrical
AS/NZS 3000 Amber. Distribution, containment, lighting. Kept warm so it never reads as a warning state.
Hydraulic
AS/NZS 3500 Green. Water, sanitary, stormwater, gas. Distinct enough from mechanical cyan to survive a monochrome print.
Fire
AS 2118.1 Red. Sprinkler, hydrant, detection. The one hue whose real-world meaning is fixed, so it is never used for anything else.

Scope a container and every child inside it inherits the accent — no component needs to know which discipline it is showing:

<article class="card card--capped" data-discipline="hydraulic"> <!-- --c-accent, --c-accent-ink and --c-accent-soft now resolve to the hydraulic set for everything inside --> </article>

04

Type scale

Space Grotesk for headings — geometric, technical, and distinctive enough that the brand survives without a logo on screen. IBM Plex Sans for body, chosen for legibility at long measures. JetBrains Mono for annotation: sheet numbers, dimensions, labels, data. Every size is fluid between 360px and 1440px viewports, and all three faces are self-hosted — the site makes no third-party request.

--fs-3xl · display
42–72px

Set out first

--fs-2xl · display
34–52px

Sixty-five years

--fs-xl · h2
26–38px

From brief to issued set

--fs-lg · h3
21–26px

Hydraulic services

--fs-md · lede
17–20px

Documentation and modelling to Australian Standards, issued for your engineer of record.

--fs-base · body
16–17px

Sanitary drainage and venting to AS/NZS 3500.2, with fixture unit loading and pipe sizing carried through to the riser diagram.

--fs-sm · UI
14–15px

Card body, list items, form hints and secondary copy.

--fs-2xs · mono label
12px

Indicative fixed fee

--fs-3xs · annotation
11px

SE-M-2102 · REV C · FOR CONSTRUCTION

Measures are capped by token, not by guesswork: --ms-tight 46ch, --ms-body 64ch, --ms-wide 78ch. Body copy defaults to --ms-body; anything wider than 78ch is a bug, not a choice.

05

Space scale

Fixed steps up to --sp-6, then fluid. The two that matter most are --sp-section, the vertical rhythm every section uses, and --sp-gutter, the page inset — change either and the whole page rescales coherently.

--sp-1 · 4px
--sp-2 · 8px
--sp-3 · 12px
--sp-4 · 16px
--sp-5 · 24px
--sp-6 · 32px
--sp-7 · fluid
--sp-8 · fluid
--sp-9 · fluid
--sp-10 · fluid
--sp-section
--sp-gutter

Radii are deliberately small — --r-2 4px for controls, --r-3 8px for cards, --r-4 14px for the estimator panel. This is a drafting board; nothing is pill-shaped except the range thumb.

06

Components

Every card-like component sets container-type: inline-size, so it responds to its own width rather than the viewport. The same card works in a four-up grid and in a sidebar with no extra media query.

Primary Ghost

The primary button is an ink/paper inversion, not a coloured slab — it keeps the mark colour reserved for reference points. Minimum target 44px.

AS/NZS 3000 Same-day Hydraulic

Chips carry standards, SLAs and disciplines. Hard-edged at 2px radius — a chip is a small plate, not a pill.

A guess is fine.

Field labels are mono uppercase — they read as annotation on a drawing rather than as a web form.

Option tiles replace a blank message box. Checked state uses the discipline accent via :has(input:checked).

  • Native model — Revit with worksets intact
  • Clash report as a spreadsheet

The tick is absolutely positioned, not a grid column — a grid made every inline element its own item and broke on any markup.

Who certifies the work

A left mark rule instead of a tinted box. It reads as documentation, not as an alert.

Used for the honest-position statements. Never for marketing copy.

Indicative fixed fee $11,050 – $14,950 Fixed fee for 24 sheets at LOD 300.

Numbers are tabular-lined and set in the display face so they do not jitter as the estimator updates.

Loading state $11,050 – $14,950 Calculating…

Skeletons mark genuine pre-hydration only. Never insert an artificial delay to show one.

07

Component states

Hover and focus are shown here with forced classes, since a static page has neither a pointer nor keyboard focus. Focus is :focus-visible only — a 2px mark ring at 2px offset, which stays visible on both grounds without depending on the component's own background.

Focus visibleGet a fixed quote
Disabled

Button states.

Rest
Focus visible
Invalid That address does not look complete.

Field states. Errors are plain-language, not "invalid input".

Thanks — we have it. You will hear back from us today.
That did not go through. Email us and we will pick it up straight away.

Status messages. The error always names the fallback route — never a dead end.

What does a CC-stage set contain?
Native model, coordinated PDF sheet set, clash report, schedules, calculations and the completed QA checklist.
Do you certify the documentation?
No. Sets are issued for your engineer of record to review and certify.

Native <details>. Keyboard and screen-reader behaviour comes free; do not rebuild it in JavaScript.

08

Motion

Motion is physical, not decorative: lines snap to reference points and disciplines overlay into a coordinated model. The signature easing is --ease-snap — fast travel, hard settle. It never overshoots, because a setout line that bounces past its datum is the opposite of the idea.

--ease-snap

cubic-bezier(.16, 1, .3, 1) — the brand easing. Reveals, snap points, panels.

--ease-standard

cubic-bezier(.4, 0, .2, 1) — colour and border changes, hover.

--ease-draft

cubic-bezier(.65, 0, .35, 1) — even and mechanical. Skeleton sweep only.

--dur-1 · 120msState change: hover, focus, colour.
--dur-2 · 220msSmall transforms — chips, nav underline, card lift.
--dur-3 · 380msPanels, disclosure, view transitions.
--dur-4 · 600msScroll reveal, with a 70ms stagger between siblings capped at six.
--dur-5 · 900msSetout line draw-in (stroke-dashoffset).
--dur-6 · 1600msFull discipline overlay sequence in the hero.

Reduced motion is a hard requirement, not a nicety

Every animation must be expressible as its final state. Nothing may depend on an animation running in order to be legible — under prefers-reduced-motion the reveals, the count-ups, the line draws and the view transitions all resolve instantly, and the page is complete. This is also what makes the site verifiable: headless screenshots are taken with reduced motion forced.

09

Usage rules

Read these before adding a page. Each one exists because breaking it caused a real bug.

Prefixes are load-bearing

--c- colour, --sp- length, --fs- font size, --r- radius, --dur-/--ease- motion. A colour token never holds a length and a length token never holds a colour. A sister project aliased three length tokens onto colours and the layout collapsed silently.

Never patch a component for a band

A .band is handed the opposite palette wholesale, so everything inside it inverts on its own. Writing .band .my-thing { color: … } re-introduces exactly the bug the wholesale swap prevents — and the next component someone adds will not know to patch itself. There are deliberately zero per-component band overrides in this codebase.

Define every colour in both modes

tokens.css is generated from _build/build_tokens.py, which fails the build if the light and dark palettes do not have identical keys. Add a colour there, never by hand in the CSS.

Grid containers make every element child a grid item

A list item styled as a two-column grid put a <strong> in the text column and auto-placed the text after it into the next row's 18px icon column — one word per line. If a component's content might contain markup, indent with padding and position the decoration absolutely.

The mark colour is rationed

Logo, reference crosses, focus rings, checkpoint markers, one word in the hero headline. It is never a large fill and never a section background. If a page needs emphasis, use the ink/paper inversion — that is what .band and the primary button are for.

Discipline colour means a discipline

Cyan, amber, green and red identify mechanical, electrical, hydraulic and fire. They are never borrowed for decoration, and red in particular is never used for anything but fire services and error states.

Self-hosted fonts, no third-party requests

Three variable woff2 files, preloaded, with a weight range each. Do not add per-weight files and never link a font CDN — the site currently makes zero external requests and that is a data-handling claim on the homepage, not just a performance preference.

No thin pages

A page holding only a widget or a form reads as a doorway page. Every page gets real copy that exists nowhere else on the site.

Commercial numbers live in config.js

Fees, turnaround, SLA text, contact details and the domain are all in assets/js/config.js. Never hard-code a price, a date commitment or an email address into markup — and never publish a figure that has not been approved.