Generative Assets · Industry demo guide
Setline Paving is a fictional Wangara brick paving operator — driveways, alfresco and pool surrounds for Perth's northern suburbs. The page has one job: turn "the builder left me a sand pad" into a quote request. Everything on it — the noon-worksite palette, the string-line motif, the Course Planner that lays itself — exists to make a real paving prospect think that could be my site.
Argued from the site, not from taste: screeded yellow builder's sand is Perth's actual base, the cut edge is bitumen-dark, the paver face is kiln oxide, and the chalked string line is blue. Deliberately not the banned cream+terracotta default: yellow sand, not cream; kiln oxide as a line/mark token, not body serif terracotta; a grotesque, not a serif. Per the ink/line split, the two bright accents each carry a derived darker ink for text duty.
Archivo 800 for display — a worksite grotesque with flat shoulders, set in caps for the masthead moment ("LAID TO THE LINE" carries a literal string-line underline strung between two pin marks). Public Sans does the body and UI work: professional and legible beats expressive on a trade page, body ≥16px on mobile. Red Hat Mono owns every number — m², rates, totals, the price meta line — so the arithmetic always reads as arithmetic.
The signature is a procedural SVG plan view that lays itself the way the job does. Every brick is generated, not drawn: pavers are true 230 × 115 format at the plan's scale, so the paver count on the card (38/m²) is the same arithmetic a real estimator runs.
Stretcher is rows of half-offset running bond; basketweave alternates paired horizontal/vertical 2×1 blocks; herringbone is a true 90° domino tiling — cell rule s = (gx+gy) mod 4, a horizontal brick anchored at s=0 and a vertical at s=2 — rotated 45° about the pad centre and clipped to the pad. The patterns are different geometry, not retints: a full-path census at 60 m² counts stretcher at 2,543 horizontal bricks and 0 vertical, basketweave at 1,243 / 1,254.
Bricks batch into 28 course groups by laying-direction progress, then into one <path> per group per shade (≤ ~140 nodes for ~4,500 bricks at 120 m²). The first render earns the entrance: 53 ms per course, capped at 1.5 s. Every subsequent chip or stepper tap redraws snappy — 11 ms per course, settling well under the ~600 ms cap — via a firstDraw flag, so the planner reads as response, not replay. A window.__paving probe carries the live state and a settled flag so QA gates on state, never wall-clock.
At rest the job holds two-thirds laid (19 of 28 courses down), the string line strung taut in blue at the frontier with a pin at each end, and the next brick outlined in clay, pulsing with a 0.55 opacity floor — never invisible at any capture instant. Reduced motion renders the job fully laid and settled, no frontier, no pulse.
Driveway gains the crossover splay and a vehicle outline; alfresco draws the house wall, door threshold and slab edge; pool surround wraps the courses around a blue coping line (an even-odd clip cuts the water out of the field); paths narrow to 1.2 m with edge restraints, planting marks, and honest break marks when the run is longer than the drawing ("16.0 m drawn of a 50.0 m run"). The card says why the price doesn't move: the meter is metres and material.
| Meter | Anchor | Notes |
|---|---|---|
| Concrete pavers | $85 /m² | supply & lay on a prepared sand base — the fixed dimension, stated on-card |
| Clay pavers | $110 /m² | |
| Limestone pavers | $135 /m² | |
| Granite pavers | $175 /m² | |
| Stretcher bond | +$0 /m² | included in the rate |
| Basketweave | +$6 /m² | paired blocks, fewer cuts than herringbone |
| Herringbone 45° | +$10 /m² | every edge is a cut |
| Job minimum | $1,900 flat | a DOLLAR clamp, one semantic, regardless of material |
| Pool coping | from $95 /lm | outside the planner — per-metre on top, measured on site |
The model is area × (rate + pattern), clamped to max(metered, $1,900). When the clamp binds, the card shows the metered arithmetic and a visible "minimum applies" badge — the page never hides that you're buying the crew's morning, not just the metres. The clamp is a dollar clamp: sub-minimum granite and sub-minimum concrete both read $1,900.
Measured from the running code (all verified against an independently reimplemented oracle across all 36 scenario combinations, plus the spec's pinned readings — zero corrections needed):
Deliberate flatness, stated rather than invented: area-type chips honestly no-op on price while genuinely re-rendering the scene — a control may stay live without moving the price only if it says so visibly and still changes the drawing, which is exactly what the on-card note does. The drawing's pad proportions (driveway width clamped 3.2–6 m, alfresco 4:3, an 8 × 4 m pool, 1.2 m paths) shape the picture only — the meter never reads them. Pool coping stays outside the m² model entirely.
This demo page ships only WebPage schema naming it a demonstration — fictional structured data in a real index is dishonest markup. For a real Setline, we'd ship the tightest schema.org type with live review data, like this:
{
"@context": "https://schema.org",
"@type": "HomeAndConstructionBusiness",
"name": "Setline Paving",
"description": "Brick paving, driveways, alfresco and pool surrounds
across Perth's northern suburbs.",
"telephone": "+61-8-XXXX-XXXX",
"url": "https://setlinepaving.com.au",
"address": {
"@type": "PostalAddress",
"addressLocality": "Wangara",
"addressRegion": "WA",
"postalCode": "6065",
"addressCountry": "AU"
},
"areaServed": ["Wangara","Landsdale","Madeley","Darch","Wanneroo",
"Joondalup","Kingsley","Hillarys","Ballajura","Ellenbrook"],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "06:30", "closes": "16:00"
}],
"priceRange": "$$",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "127"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "— real customer —" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "— pulled live from the Google Business Profile —"
}]
}Plus: suburb-level service pages fed from the areaServed list, a Google Business Profile review pipeline, and FAQ schema on the six questions the trade actually gets asked.
Their photos replace the procedural scenes (though the planner stays — it's the differentiator), their Google reviews feed the review strip, and the quote form posts to their actual workflow. The integrations we'd wire for a paving operator: Buildxact or Groundplan-style takeoff & estimating from site plans, ServiceM8 job cards with photo records of the base prep (the compactor-passes promise, made auditable), supplier pallet ordering through Midland Brick-style trade portals, the council crossover application workflow, Square progress payments, Xero for the books, and a Podium-style review flow at handover.
Every pass drove the real controls headlessly (chips, stepper, form, FAQ, sticky bar) with asserted outputs, and included at least one real screenshot review. Final harness: 54 assertions green, zero console errors.