Generative Assets · Wave 31 · Industry Demos XX
Stonewater Bathrooms is a fictional Joondalup renovation firm built as an industry demonstration: one conversion-focused landing page showing a WA bathroom renovator exactly what their site could be. The page has a single job — a renovation enquiry with package, size and price already chosen — and every design decision below serves it.
Owners of tired 90s bathrooms, pre-sale renovators, and downsizers wanting one good bathroom done properly. The direction is a stone showroom on paper: warm stone-white ground, procedural terrazzo flecks in the panels, brass tapware line-art, sea-glass tile lines — calm, magazine-spread spacing, so the page reads the way the finished room feels. The signature is the Reno Planner: an SVG bathroom elevation that redraws by package and size, with the computed price badged on the drawing itself.
The ink/line split is deliberate: brass and sea-glass carry lines, fills and marks; small text always sits in slate ink (#2B2A28) or muted ink (#5C564C, 6.3:1). Where sea-glass appears as link text it is deepened to #31635C to clear 4.5:1.
Cormorant Garamond 600/700 for display — the elegance of a stone showroom, and the face that sets the package price huge inside the drawn elevation ("$23,800 / fully finished" is the page's typographic moment). Mulish for everything workaday: labels, controls, body. Professional and legible beats expressive on a trade page; the serif carries all the personality the page needs.
The elevation is a single SVG rebuilt from state on every change: room shell, tile grid, fittings in brass line-art (vanity, mirror, shower), and the price badge — all generated as SVG nodes in JS, no raster anywhere. The refresh package keeps the layout: a half-height tile band at reduced opacity with a dashed brass "reseal" line, fittings swapped in brass. Full renovation retiles floor-to-ceiling: the tile columns run a perpetual sweep whose opacity floor is 0.55 — the hatching is visibly alive at any capture instant, never invisible. Premium adds the diagonal feature band, a terrazzo-pattern stone top on the vanity, and pulsing underfloor-heating glow lines beneath the slab. The freestanding bath is drawn with an adaptive width so it always fits between vanity and shower zone at any size from 4–10 m²; when it's off, a toilet takes the middle of the wall.
firstDraw flag — package taps feel snappy, not ceremonial.dt = min(max(now − last, 0)/1000, 0.05) — zero-clamped and capped — pauses under document.hidden, and never starts under reduced motion (the settled frame renders all columns at full opacity).window.__bathrooms exposes scenario, every computed line, note/disable flags and a settled flag; QA gates on state, never on seconds.| Scenario | Arithmetic | Displayed |
|---|---|---|
| Rest: full renovation, 8 m², bath ON, heating OFF | 19,500 + 2×950 + 2,400 | $23,800 |
| Refresh, 8 m² | 8,900 + 2×250 | $9,400 |
| Refresh, 5 m² | 8,900 flat — note shown | $8,900 |
| Premium, 10 m² (no bath) | 28,500 + 4×950 — heating locked ON, $0 itemised | $32,300 |
| Full, 6 m², no toggles | 19,500 — boundary point, no uplift, no note | $19,500 |
| Moving drainage / walls / windows | no number by design — "quoted on inspection" | at cost |
All figures are pure anchor arithmetic and integer-safe; every scenario above was measured from the running page and cross-checked against a reimplemented oracle in the harness. The planner's cheapest output ($8,900) equals the services grid floor. One builder-derived decision: the spec pins underfloor heating on full (+$1,600) and premium (locked ON, $0) but is silent for refresh — since heating lays under new floor tiles and a refresh keeps the floor, the toggle is disabled on refresh with the on-page reason "heating lays under new floor tiles, so it comes with a full or premium renovation" (the W18 disable-with-reason semantic, flagged for wave QA).
This demo page deliberately ships only WebPage/CreativeWork schema naming it a demonstration — fictional structured data in a real index is dishonest markup. For a real client we’d ship HomeAndConstructionBusiness (schema.org has no bathroom-renovation subtype; this is the correct organisation type for a renovation builder) with real NAP, geo, hours and genuine review markup:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HomeAndConstructionBusiness",
"name": "Stonewater Bathrooms",
"description": "Bathroom renovations across the Perth metro — refresh packages,
full renovations and premium renovations, one crew start to finish.",
"url": "https://www.stonewaterbathrooms.com.au",
"telephone": "+61 8 XXXX XXXX",
"address": {
"@type": "PostalAddress",
"addressLocality": "Joondalup",
"addressRegion": "WA",
"postalCode": "6027",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -31.7444, "longitude": 115.7683 },
"areaServed": "Perth metropolitan area",
"openingHours": "Mo-Fr 07:00-16:00",
"priceRange": "$8,900–$35,000",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Renovation packages",
"itemListElement": [
{ "@type": "Offer", "name": "Bathroom refresh", "price": "8900", "priceCurrency": "AUD" },
{ "@type": "Offer", "name": "Full renovation", "price": "19500", "priceCurrency": "AUD" },
{ "@type": "Offer", "name": "Premium renovation", "price": "28500", "priceCurrency": "AUD" }
]
},
"review": {
"@type": "Review",
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"author": { "@type": "Person", "name": "— real customer, real review feed —" },
"reviewBody": "— pulled from the client's Google Business Profile, never invented —"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "— measured —",
"reviewCount": "— measured —"
}
}
</script>
Plus: Google Business Profile optimisation for "bathroom renovations joondalup / perth northern suburbs", suburb-level landing sections fed by real job photos, and review harvesting wired to the client’s actual feed.
scroll-margin-top on all section anchors).