Build guide · Industry demonstration
A fictional AS 1851 fire equipment testing business in Bibra Lake, built as a single conversion-focused landing page — every visual procedural, every price arithmetic you can check, and one signature element doing the selling: the Compliance Dial.
Warden Fire Services tests and tags fire equipment for cafés, workshops, offices and strata blocks across Perth. Its customers' real pain isn't the wrench — it's remembering the six-monthly cadence AS 1851 demands, so the page's single job is a servicing-schedule enquiry, and the signature sells the memory: an annual dial that plans the year's two tagged visits and prices them live, itemised per asset.
It's the wave's B2B compliance site and the strongest Sapience Analytics story of the five — the deliverable a real client would buy is the reminder system as much as the servicing, which is why the ledger carries "logbook, register & reminders" as its own line at $0, deliberately.
The direction is compliance clinical — the page should feel like a well-kept logbook: ruled (the hero's 28px baseline ruling), dated, stamped. Red is spent only where a fire trade earns it; the ink/line token split keeps it off text entirely.
IBM Plex Sans Condensed carries the display — standards-document neutrality with placard-caps confidence; the AS 1851 service months (JAN · JUL) are set in it as tag stamps around the dial, which is the page's typographic moment. IBM Plex Sans does the body work: legible at 16px on a phone, tabular numerals for every ledger figure.
The dial is one runtime-built SVG. Month ticks and the JAN/JUL tag stamps are generated from day-of-year fractions (frac × 360° − 90°); the swept arc is a circle with pathLength="100" whose stroke-dasharray is plain percentage arithmetic — the year runs top-clockwise from January 1, and the rest state sweeps to mid-May (36.99 of 100), through the January service dot, with a red-pennant flag planted on the July dot and pulsing between opacity 0.58 and 1 — a never-invisible floor, so any thumbnail instant catches it alive.
Site-preset chips (café / workshop / office / strata) set the four asset steppers, which drive the dial's centre readout, the mini asset shelf, and the itemised ledger. Every handler bumps an animation token before swapping state, so a rapid-fire chip sequence can never leave a stale rAF closure painting a dead scene; the sweep runs 1.2s on first draw and 450ms on every subsequent change via a firstDraw flag. Reduced motion paints the settled frame immediately and kills the pulse. The chosen preset and counts pre-fill the enquiry form, so the demo interaction becomes a warmer lead.
The maths is deliberately checkable: window.__firesafety exposes the live state, and the QA harness re-implements the pricing model independently and asserts the rendered DOM figures against it for all four presets, the stepper floor, and two rapid-fire bursts.
| Service | Rate | Notes |
|---|---|---|
| Scheduled service visit — metro | $150 | Per visit, Joondalup–Rockingham |
| Extinguisher test & tag | $11 | Each, six-monthly |
| Fire blanket test & tag | $8 | Each, six-monthly |
| Fire hose reel flow test & tag | $25 | Each, six-monthly |
| Emergency & exit light discharge test | $9 | Per fitting, 90-minute test, six-monthly |
| Pressure test & refill | $66 | Per extinguisher, 5-yearly when due — excluded from the annual ledger, itemised as a when-due line |
| Replacement 4.5 kg ABE extinguisher | $135 | Supplied & installed |
| Logbook, asset register & reminders | $0 | Included — a deliberate designed line, not missing data |
| Fire indicator panel & pump servicing | — | Quoted on the system — a designed price-less state; panels and pumps sit under their own AS 1851 sections |
Annual = 2 × the visit total ("two tagged visits a year" — all four asset classes are six-monthly under AS 1851). Asset floor: minimum 1 extinguisher, with the reason shown on the disabled control. All figures are whole-dollar by construction.
| Preset | Assets | Per visit | Per year |
|---|---|---|---|
| Café (rest state) | 2 ext · 1 blanket · 4 fittings | $216 | $432 |
| Workshop | 6 ext · 2 hose reels · 8 fittings | $338 | $676 |
| Office | 4 ext · 6 fittings | $248 | $496 |
| Strata common area | 8 ext · 2 blankets · 4 hose reels · 12 fittings | $462 | $924 |
| Estimator floor | 1 extinguisher only | $161 | $322 |
Every figure above was measured from the running page and cross-checked against an independently re-implemented oracle in the QA harness. The services grid's "from $322 a year" equals the one-extinguisher floor — the estimator's cheapest output and the grid floor agree by construction.
The demo page carries only WebPage/WebSite structured data naming it a demonstration — fictional business schema in a real search index would be dishonest markup. For a real fire servicing client, this is the JSON-LD we'd ship, populated with their verified details and genuine review feed:
{
"@context": "https://schema.org",
"@type": "ProfessionalService",
"name": "Warden Fire Services",
"description": "Fire equipment testing, tagging and logbook servicing
to AS 1851 across the Perth metropolitan area.",
"url": "https://www.wardenfireservices.com.au",
"telephone": "+61-8-XXXX-XXXX",
"address": {
"@type": "PostalAddress",
"streetAddress": "Unit X, XX Example Way",
"addressLocality": "Bibra Lake",
"addressRegion": "WA",
"postalCode": "6163",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -32.096, "longitude": 115.815 },
"areaServed": "Perth metropolitan area",
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00", "closes": "16:00"
},
"priceRange": "$$",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "87"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "— from the live review feed —" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "— genuine customer reviews only —"
}]
}
Why ProfessionalService: a compliance servicing firm is a professional-services organisation, not a construction trade — schema.org has no fire-protection subtype, so the honest pick is the LocalBusiness-family parent that matches what the business is. Rating and review nodes ship only when fed by the client's real, verifiable review source.
none, no stuck opacity anywhere.