Generative Assets · Industry demo 261
Design and build notes for a fictional Perth scaffold hire & erection business — the palette, the type, the procedural scaffold planner, the honest pricing model, and the three iteration passes that shaped it. Visit the demo · collection index.
Spanright Scaffolding is a fictional Maddington scaffold hire & erection operator — the kind of outfit a renovator finds when their painter says “get me a scaffold and I’ll start Monday.” The page has one job: get the site measure booked. Its signature, the Scaffold Planner, is a procedural SVG elevation where the frame erects bay by bay against a limestone-render gable as you set length, height and hire weeks, with an honest price card doing the arithmetic in public. The mood is “the frame going up at 8am”: galvanised steel against a pale morning sky, safety-orange mesh, a spirit level riding a ledger.
Per the collection’s ink/line rule, both accents got a derived darker ink for text duty; the bright tokens are reserved for lines, fills and marks.
Archivo (700–800) carries the display voice — a wide engineering grotesque whose caps read like stencilled plant markings; the h1 and section heads are its moment. IBM Plex Sans does body and UI work without personality clashes, and IBM Plex Mono owns every number the page commits to — metres, m², weeks, dollars — so the pricing reads like a measured drawing, not marketing.
The planner is a single generated SVG (no libraries, no rasters). Three renderers share helpers: a face renderer that lays out standards on 2.4 m bays and ledgers on 2.0 m lifts (counts derived from the steppers via ceil(length/2.4) × ceil(height/2)), then planks, toe board, guardrails and hatch-patterned orange mesh on the working lift, a diagonal brace every third bay, and drilled wall ties marked on every second standard; an edge protection renderer that draws guardrail posts and rails along both rakes of a gable; and a tower renderer with castors, rungs and a platform. Every member is a <g class="m"> with a per-member animation-delay, so the frame visibly erects bay by bay — a 1.5 s choreography on first load, a ~0.5 s re-erect on interaction, and a settled complete frame under reduced motion. Second-read details: the spirit level riding the lift-one ledger with its green bubble centred, the orange scaftag on the first standard, and the faint morning shadows each standard casts on the render.
A state probe window.__scaffolding exposes job, dimensions, weeks, computed price and form status on every interaction, and the planner pre-fills the enquiry form live — the demo interaction becomes a warmer lead.
| Job | Meter | Minimum | Extension |
|---|---|---|---|
| Fixed scaffold (1–2 storey) | $75/m² face (L×H) | $1,200 | $8/m²/week after wk 4 |
| Roof edge protection | $48/lm roof edge | $900 | $5/lm/week after wk 4 |
| Aluminium tower | $260/week flat | $260 (1 week) | +$260/week, no inclusion |
Measured rest state: two-storey face, 12 m × 6 m = 72 m² × $75 = $5,400 (erect + dismantle + 4 weeks), extension line +$576/week = 72 × $8. Both figures were measured from the running page against an independently reimplemented oracle in the QA harness — they match the spec’s worked example exactly, no correction needed. The planner’s cheapest output (tower, 1 week, $260) equals the services grid’s tower floor.
Derivations this page adds to the spec, documented so QA has a source of truth:
Controls with no honest meaning are disabled with the reason on the page: the height stepper for edge protection (“prices by roof-edge metres, not wall height”), both size steppers for towers (“a set kit — pick the week count and we bring it”). Faces under 16 m² and edges under 18.75 lm clamp up to their minimums with the clamp stated on-card.
The live demo emits only WebPage schema declaring itself a demonstration — fictional structured data in a real index would be dishonest markup. For a real scaffolding client we would ship LocalBusiness + Review schema like this:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Spanright Scaffolding",
"description": "Scaffold hire & erection across the Perth metro — fixed scaffold, roof edge protection and aluminium tower hire, certified handover on every job.",
"telephone": "+61-8-9000-0261",
"address": {
"@type": "PostalAddress",
"addressLocality": "Maddington",
"addressRegion": "WA",
"postalCode": "6109",
"addressCountry": "AU"
},
"areaServed": ["Maddington","Gosnells","Thornlie","Canning Vale","Cannington","Perth"],
"openingHours": "Mo-Fr 06:30-16:30",
"priceRange": "$$",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "87"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "…" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "…"
}]
}
</script>
Plus suburb-level service pages, Google Business Profile with real job photos, and review markup fed by an actual review pipeline — never hand-typed.
Their photos would replace nothing — the procedural elevation stays, because it quotes; but their reviews, licence numbers and ABN would replace the placeholder-patterned ones.
Drove every control headlessly (50 asserts): all three job renderers, steppers to known inputs against an independently reimplemented pricing oracle, clamp states, empty submit on a fresh load (6 validation signals), filled submit (confirmation lexicon + spec + suburb), FAQ, keyboard chip activation, sticky bar geometry. Two real findings: job chips preserved the week count across job switches, which made preset scenarios ambiguous — chips now apply their full preset; and the 1200×750 screenshot review showed the $5,400 price card starting just below the thumbnail line — trimmed the elevation viewBox (470→432) and moved the price card directly under the drawing so chips, frame and price all share the thumbnail (asserted: price line top at ~635px).
The driven-state screenshot caught the erection choreography replaying its full 1.5 s stagger on every stepper click — kept the long build for first load, cut interactions to a ~0.5 s re-erect. Added the morning-sun shadows each standard casts on the render (the “8am” of the art direction), a subtle price-pop micro-interaction on recompute, and de-duplicated the “bent frame” line that appeared in both the wind trust card and the storm FAQ.
375px masthead screenshot check first (wordmark + icon-collapsed tel fit; scrollWidth 375 exactly); h1, ≥44px CTA and trust ticks above the mobile fold; fixed call bar with ≥48px targets in the bottom band; reduced-motion emulation renders the frame fully erected and settled; zero console errors across every run (no pattern attributes used — validation is JS + required, sidestepping the v-flag regex hazard); honesty sweeps — all five phone occurrences on the 9000 exchange, JSON-LD types WebPage/CreativeWork only, exactly one h1 per page, colophon line verbatim. Chanel rule: removed the demo band’s decorative circle ornament.