Generative Assets / tinting / guide
Duskglass Window Tinting is a fictional Osborne Park tint shop built as a conversion demo for the real trade: new-car owners who want ceramic before their first summer, families whose back seat cooks on the school run, and west-facing home offices unusable after 2pm. The page has one job — book a fitting — and one signature to earn it: the Tint Studio, a live side-on car whose glasshouse darkens to the VLT slider with WA's legal floors drawn on the scale, and a fitted price that refuses to exist below them. This is the dark site of Wave 21: cool-cabin dusk, lit by sky through glass, not by lamps or beacons — the relief of stepping out of Perth glare IS the product, so the page performs it.
The ground — the cabin behind 20% film. Cool, not black.
Body ink — daylight read through clear glass. All copy sits in this (≥4.5:1 on graphite).
Line/mark only — VLT marks, heat-meter fill, CTA. The cool the film sells. Never long body text.
Sparingly — the sun being kept out: the heat-side of the meter, the show-car warning. Always subordinate to cyan.
Deliberately distinct from every prior dark site in the collection: towing's beacon-amber bitumen, locksmith's navy porch-light, signage's plum dusk, earthmoving's iron dusk, concreter's wet-slab charcoal, manufacturer's graphite. This dark is cool and glassy. The heat meter is the palette's argument in one strip: cyan (rejected) beating amber (let in).
All SVG and vanilla JS — no libraries, nothing rasterised. Three hand-drawn side-on vehicles (sedan, SUV/wagon, ute with tray) share one scene under a breathing bay light. Each window is a layer stack: sky-gradient glass, a film overlay, an interior silhouette drawn above the film, and a reflection streak on top. The slider is detented at the four standard film stops (70 / 35 / 20 / 5) with WA's legal floors drawn on the scale — 35% front floor, 20% rear floor, and a hatched amber segment below 20 labelled show-car only.
film opacity = (100 − VLT)/100 × 0.88 · interior opacity = max(0.25, VLT/70 × 0.9)The interior floor is the honesty of the rendering: the cabin dims with the film but never fully disappears, so a 5% selection still reads as a car, not a void. In full-car mode the fronts clamp to max(VLT, 35) — the studio never draws an illegal front while the rears run to their own floor. Windscreens take a visor strip only, and the drawing honours that too: the strip is the only tinted part of the screen at any setting.
| Job | Carbon | Ceramic | Ceramic IR+ |
|---|---|---|---|
| Full car — sedan/hatch | $330 | $450 | $580 |
| Full car — SUV/wagon (+$60) | $390 | $510 | $640 |
| Full car — ute (−$40) | $290 | $410 | $540 |
| Front-two legal match (flat) | $160 | $160 | $200 |
Every interaction updates window.__tinting (vehicle, film, scope, VLT, price, disabled state, heat, form status) so QA gates on state, never on wall-clock. The studio's configured scenario pre-fills the booking form's vehicle-&-film field — the demo interaction becomes the warm lead.
This demo page ships only WebPage schema naming it a demonstration — fictional structured data in a real index is dishonest markup. A real Duskglass would ship LocalBusiness + Review schema fed by its actual details and live review feed:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "AutomotiveBusiness",
"name": "Duskglass Window Tinting",
"description": "Automotive and flat-glass window tinting, Osborne Park and Perth metro.",
"telephone": "+61-8-XXXX-XXXX",
"address": {
"@type": "PostalAddress",
"streetAddress": "Unit X / XX Real Street",
"addressLocality": "Osborne Park",
"addressRegion": "WA",
"postalCode": "6017",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -31.9OXX, "longitude": 115.8OXX },
"openingHoursSpecification": [
{ "@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:30", "closes": "17:00" },
{ "@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday", "opens": "08:00", "closes": "12:00" }
],
"priceRange": "$$",
"areaServed": "Perth metropolitan area",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9", "reviewCount": "187"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "Real Customer" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "Pulled from the live Google reviews feed, with consent."
}]
}
</script>Plus: Google Business Profile with the bay's real photos, service-page URLs per job type (ceramic, front-two match, home & office), and suburb-intent copy that already exists on this page (Osborne Park base, named service suburbs, the map).
Drove the full harness on a fresh load: rest state measured at sedan · ceramic · 35/20 · $450 · heat 60% against an independently reimplemented oracle (spec arithmetic in separate code, not the page's function). Reviewed the real 1200×750 screenshot: the signature shared the fold but the price card sat just under it — cropped the scene's viewBox (300→240 units tall, over two rounds), tightened the control-row rhythm and moved the legal small-print below the price card, then re-measured: the $450 numerals sit at y≈715 in the thumbnail. At 375px the section eyebrow wrapped mid-word ("PERTH / METRO") — stepped its size and tracking down at the mobile breakpoint. One harness bug fixed as a harness bug (not a site change): the filled-submit probe had cleared the studio pre-fill without reloading, then blamed the form.
Drove and screenshotted all five studio states: SUV+ceramic $510, ute+carbon $290 (the pinned floor), 5% disabled, 70% lightest, front-two $160. Two screenshot-only defects found and fixed: the "5% show-car only" slider tick wrapped and clipped at the rail's right edge (first/last ticks now pinned flush, nowrap), and the disabled price's strikethrough also struck the NOT FITTED caption (strike removed; the amber caption carries the refusal). Added the second-read details: the scene caption flips to amber SHOW-CAR ONLY below the legal floor, a subtle price tick pulse on every recompute (reduced-motion-guarded), and the bay-light cone breathing with an opacity floor of 0.55 — visibly alive at any capture instant, per the never-invisible rule.
Masthead-first at 375px: wordmark-only row, no overflow, scrollWidth 375. Sticky call bar fixed, tel target ≥44px, inside the bottom 140px. Empty submit on a fresh load raises validation on all five required fields (aria-invalid + :invalid + messages); filled submit (plain ISO date, min=today) renders the "thanks / received / we'd call" confirmation and the probe reports confirmed. Reduced-motion emulation: no entrance gate, hero at opacity 1, bay light static. Ten oracle scenarios green including both disable paths; FAQ driven by dispatched click and by keyboard; zero console errors. Chanel rule: removed the map's dashed freeway line — unlabelled, it read as noise next to the river and coast. Final copy read done; guide numbers re-checked against the shipped code.