How it was made · site 348 · Industry Demos XXVII
Clearline Windscreens — the Glass Map
A landing page for a fictional Malaga mobile windscreen business, built to convert a stone-chipped commuter or a tradie with a smashed ute window into a booking request with the vehicle, the glass, the damage and the extras already priced — and the insurance-excess declaration in plain sight.
Concept
Clearline Windscreens is fictional: mobile chip repair, windscreen, side and rear glass replacement and ADAS camera recalibration, based in Malaga and working across Perth metro. The audience is the person whose windscreen went from a chip to a crack overnight, the parent with a running crack across the passenger side, the tradie with a side window smashed in the carpark, and the fleet manager. The page has one job — a booking request with the job already priced — and one signature: the Glass Map, a drawn car that reshapes to the vehicle class, lights the selected pane and shows the repair or the replacement happening, with the price stuck to the glass like a windscreen sticker.
Landing page only, every pixel procedural (SVG, CSS gradients — no raster loads), no libraries beyond Google Fonts. Category: industry demo; the trade is windscreen repair.
Palette — measured, not assumed
Argued from a clean pane, a slate dashboard, the green-teal edge of tempered glass and amber repair resin under UV. Every ratio below was computed from the shipped hex values with WCAG relative-luminance arithmetic in Pass 1 (the spec's figures were hypotheses).
Secondary tokens: soft ink #4B5B66 6.29:1 on the ground; on the slate ledger the copy inks measure 13.84:1 (#EAF1F4), 11.11:1 (#C7DCE1), 8.18:1 (#A9BEC6, detail lines) and 8.95:1 (#9CCBD2, labels); the note colour #F3D48A measures 10.99:1; slate on the amber Sapience button 7.03:1. The two-token remedy (W33/W36) was applied as pinned: teal stays the button and mark colour, teal-ink carries every teal-coloured word.
Type
Barlow Condensed 700 for display — the width of a workshop sign, set in caps with tight leading for the h1, the section heads, the run line above the scene and the price on the sticker. Nunito Sans for everything you read: 17px body, 16px inputs, 13.5–15px support copy, all measured against the grounds above. The typographic moment is the run line above the drawn car — ONE SUV WINDSCREEN, CAMERA RE-AIMED — which rewrites itself per class, glass, damage and extras (three stone chips, resin-filled · one van rear screen, heater lines live · one ute side window, swept out, refitted).
The signature — the Glass Map
A 640 × 400 SVG rebuilt from geometry tables on every state change. Five front-view outlines (hatch, sedan, SUV & 4WD, ute, van) are generated from a parameter table — overall width, roof width, roof height, shoulder line, bonnet depth, plus class marks: roof rails for the SUV, a bull bar and a light bar for the ute, a flat face and badge ring for the van. The windscreen chip keeps the front view; the side-window chip swaps to a three-quarter (side-profile) view from a second table of five body polygons with the front door glass as the lit pane; the rear-screen chip mirrors the front geometry into a tail view — tail lights, plate, wiper, heater lines drawn through the pane, a split line for the van's barn doors and a smaller cab window over a drawn tray for the ute.
Damage drives the loop. Chip repair draws one to three seven-point resin stars on the pane with a drawn injector over the first; over a 4.2-second cycle the plunger presses, the amber column in the barrel drops, a resin disc grows into each star and the star fades to a faint mark, then resets. Replacement draws a crack across the pane by dash-offset (hidden until drawn length is above zero, W15), then the old pane lifts 44 units and fades to a 0.55 floor while a new teal-edged pane lowers in from above and settles, then holds under a sheen sweep — a five-second cycle, so the seven-second thumbnail lands mid-lift with the calibration board in front, exactly the pinned rest scene. The maximum of old-pane and new-pane opacity never drops below 0.55 (asserted by sampling 26 frames). The rAF delta is clamped min(max(now − last, 0)/1000, 0.05) (W29); the loop pauses on visibilitychange and never starts under reduced motion, where a settled mid-lift frame is rendered once. There is no canvas, so the DPR cap has nothing to cap; resize re-ticks the settled frame and the badge is positioned in percentages of the SVG box so it tracks the pane at any width.
Toggles draw their marks: ADAS adds the calibration target board on a stand at the front-left, a camera housing behind the mirror and a dashed sight line between them that crawls; rain-sensor adds an amber gel pad and label at the top of the pane; insurance clips a small "insurer billed" claim card to the price sticker. The price badge is HTML positioned over the SVG at the pane's lower-right corner (bottom-right anchored on the front and tail views, bottom-left anchored beside the door glass on the side view so it never covers the cab), tilted −2°: total in Barlow, a short subtitle, and a second line — you pay your policy excess — we bill the rest to your insurer — present only when the insurance toggle is on. Below 600px it moves to a tight variant parked in the bumper corner above the class tag so it never covers the drawn pane at 375. Every control handler bumps a token before touching state; the scene rebuild is synchronous and the loop reads scene references refreshed by each render, so a rapid-fire click sequence never leaves a stale closure alive (W25). First draw staggers the drawn groups at 110 ms (1.2 s cap); later redraws run at 26 ms (420 ms cap) via a firstDraw flag (W21). window.__windscreens exposes the scenario, intent (remembered choices), lock and live flags with their reasons, ledger lines, total, note, insurance line, badge text, mirror text, run line, view, frame count and a live settled flag.
Pricing model — pinned anchors, measured outputs
GST-inclusive; mobile fitting across Perth metro included and stated on-card; outside metro quoted. All totals are whole dollars by construction.
| Replacement (glass, urethane, old glass taken away) | Hatch | Sedan | SUV & 4WD | Ute | Van |
|---|---|---|---|---|---|
| Windscreen | $380 | $420 | $520 | $460 | $540 |
| Side window | $260 | $280 | $320 | $300 | $340 |
| Rear screen (heated) | $420 | $460 | $560 | $480 | $580 |
| Control | Rule | Semantics |
|---|---|---|
| Chip repair | $110 first chip, +$40 each additional (stepper 1–3) | Live only on the windscreen; class-inert ("a chip is a chip — the same resin in any car" on-card). At 3 chips a NOTE only: "more than three chips and replacement is usually the better spend". At 2, no note. |
| Damage on side / rear glass | LOCKED to replacement | Reason on-card: "tempered side and rear glass shatters rather than chips — it's a replacement". Returning to the windscreen RESTORES the prior damage choice. |
| ADAS recalibration | +$250 flat | Live only on windscreen × replacement. Disabled on chip repair ("a repair doesn't disturb the camera — no recalibration needed") and on side/rear ("the camera sits behind the windscreen — side and rear glass don't touch it"). Unlock RESTORES the prior choice. |
| Rain-sensor re-fit | +$70 flat | Live only on windscreen × replacement; disabled elsewhere ("the sensor lives on the windscreen — nothing to re-fit"). Unlock RESTORES. |
| Insurance claim | declaration only — no number | Badge second line, ledger line and the plain-text mirror all carry "you pay your policy excess — we bill the rest to your insurer"; the total still prints the retail figure with "your insurer's excess is set by your policy, not by us" on-card. Absent on all three surfaces when off. |
| Fleet, sunroofs, classic glass | no number | "Quoted on the vehicle" — a designed price-less line in the ledger footer, the services grid and the FAQ. |
| Worked example (full control vector set explicitly) | Spec | Measured |
|---|---|---|
| Rest: SUV & 4WD, windscreen, replacement, ADAS on, rain off, insurance off — badge second line absent | $770 | $770 |
| Hatch, windscreen, chip repair, 1 chip — ADAS and rain disabled with reasons | $110 | $110 |
| … 3 chips + note present · 2 chips, note absent | $190 / $150 | $190 / $150 |
| … same 2 chips on a van (class-inert) | $150 | $150 |
| Sedan, side window — damage locked, ADAS/rain disabled; back to windscreen restores repair + intents | $280 | $280 |
| Sedan windscreen replacement + ADAS + rain → side → back (both restored) | $740 → $280 → $740 | $740 → $280 → $740 |
| Van, rear screen | $580 | $580 |
| Ute, windscreen, replacement, ADAS + rain | $780 | $780 |
| Rest + rain · rest + insurance (three surfaces present, total unchanged) | $840 / $770 | $840 / $770 |
| Rest → chip repair (ADAS locked off) → replacement (ADAS restored) | $110 → $770 | $110 → $770 |
| Full 15-cell replacement matrix, all extras off | table | 15/15 |
Cheapest outputs equal the grid floors: chip repair from $110, windscreens from $380, side glass from $260, rear screens from $420. Every figure above was read from the running page through the state probe and compared against an oracle reimplemented separately in the harness; zero spec corrections were needed.
Conversion decisions
- Above the fold at 375: eyebrow, the h1 naming the trade and the area, a shortened sub-line (the second sentence hides below 560px), two full-width CTAs (book / call) and two trust chips — all above the sticky bar. On desktop the same-day line ("Cracked today? Call before 2pm") sits under the trust chips; on mobile it moves into the sticky bar so it isn't shown twice.
- The signature shares the thumbnail with the hero: the run line and the scene card sit in the right column at 1200 wide; the scene box (top 144px) and the $770 sticker both intersect the first 750px, asserted in the harness.
- The estimator sits directly under the hero with the ledger sticky on desktop, so the number stays in view while you change class or glass. "Book this job" in the ledger jumps to the form with the job pre-filled.
- Form fields: name, phone, the suburb the car is parked in (the mobile business needs to know where, not who), rego or make and model (a glass lookup by rego is how the real business confirms the part before calling), and the job textarea pre-filled from the Glass Map — the W12 handoff — which stops overwriting once you edit it. Validation is front-end only, with visible errors and focus moved to the first invalid field; the confirmation panel is hidden on load and on an empty submit and appears only after a valid one, echoing what was received. No fake network round-trip.
- Insurance is a declaration, not a number. The excess is set by the policy, so the page prints the retail figure, says who pays what on three surfaces, and never guesses an excess.
- Sticky bar: the same-day line plus Call now and Book a fit, solid white ground, no backdrop-filter, shown below 900px.
Local SEO we'd implement for the real business
The demo page carries only WebPage / CreativeWork / BreadcrumbList schema declaring it a demonstration — fictional business data must not enter a real index. For the real Clearline we would ship the block below (an AutoRepair organisation with a service catalogue, areas served, opening hours and a reviews feed pulled from Google Business Profile), plus a suburb-level service page strategy (Malaga, Joondalup, Ellenbrook, Fremantle, Rockingham, Mandurah), an FAQ block matching the on-page questions, and Google Business Profile posts for the same-day fit.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "AutoRepair",
"name": "Clearline Windscreens",
"image": "https://clearlinewindscreens.example/og.jpg",
"url": "https://clearlinewindscreens.example/",
"telephone": "+61 8 9000 0348",
"priceRange": "$110–$850",
"address": { "@type": "PostalAddress", "addressLocality": "Malaga", "addressRegion": "WA", "postalCode": "6090", "addressCountry": "AU" },
"geo": { "@type": "GeoCoordinates", "latitude": -31.86, "longitude": 115.90 },
"areaServed": [ "Perth", "Joondalup", "Wanneroo", "Ellenbrook", "Midland", "Fremantle", "Cannington", "Armadale", "Rockingham", "Kwinana", "Mandurah" ],
"openingHoursSpecification": [
{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "07:00", "closes": "17:00" },
{ "@type": "OpeningHoursSpecification", "dayOfWeek": "Saturday", "opens": "08:00", "closes": "13:00" }
],
"hasOfferCatalog": {
"@type": "OfferCatalog", "name": "Mobile auto glass",
"itemListElement": [
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Windscreen chip repair" }, "price": "110", "priceCurrency": "AUD" },
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Windscreen replacement" }, "price": "380", "priceCurrency": "AUD" },
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "ADAS camera recalibration" }, "price": "250", "priceCurrency": "AUD" }
]
},
"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "212" },
"review": [
{ "@type": "Review", "author": { "@type": "Person", "name": "Priya" }, "datePublished": "2026-07-30",
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "Crack ran overnight, replaced in the driveway by lunch, camera recalibrated, cured by two." }
]
}
</script>
What would change for the real client
- ServiceM8 for the job — the booking form posts a job with the Glass Map payload (class, glass, damage, extras, rego) so the office sees the priced job, not a free-text enquiry; SMS confirmation and the two-hour arrival window come from its scheduling.
- Glass-parts catalogue lookup by rego (the supplier's part finder) so the rego field resolves to an exact glass part number, whether it carries a camera bracket, a rain-sensor pad, heating and acoustic laminate — the estimator's class chips become a fallback for cars the lookup doesn't resolve.
- Insurer claim portals — glass claims lodged direct with the major insurers' repairer portals, the excess collected on the day, the balance invoiced to the insurer.
- Xero for invoicing and the insurer receivables ledger; Google Business Profile reviews replacing the demo copy; the real photos of the vans and the ADAS rig replacing the drawn car where the client wants them (the SVG stays as the estimator).
- Real ABN, licence and association details, and a real address if the client wants a workshop bay published.
Iteration log
Pass 1 — Craft
- Measured every contrast pair (figures above). Teal on the ground landed at exactly 4.50:1 — borderline — so all teal-coloured copy uses the pre-minted teal-ink (7.02:1); teal keeps buttons (5.03:1 under white) and marks.
- First screenshot review at 1200: the class tag's dark plate was too short for its text (a per-character width estimate of 6.6px against Nunito 800 with 1.2px tracking) — "FRONT VIEW" overran the plate. Re-estimated at 7.7px per character; asserted by eye at three widths.
- The hatch front view was small enough that the price sticker covered nearly the whole pane, hiding the resin stars. Enlarged all five front outlines (widths 334–378, taller panes), shrank the sticker (27px total, max 196px), moved its anchor to hang off the pane's lower-right corner onto the bonnet, and repositioned the three chip stars to the left and centre of the pane so none sits under the sticker.
- Side view: the sticker anchored bottom-right at the door glass covered the entire cab. Added a per-view anchor mode — bottom-left beside the door glass on the side view — so the cab and the lit pane stay visible; the sticker sits over the rear door/tray top instead.
- The "RESIN" injector label collided with the interior mirror stem at the top-centre of the pane; moved it to the left of the barrel with
text-anchor="end". Shortened the injector so it stays under the roofline on the hatch. - Ute front view: the bull bar cut through the number plate; raised the bar 6 units so the plate reads under it. Calibration board moved left (x 74) so it clears the widened SUV/ute bodies.
- Map: the Morley dot and label sat under the Malaga star — moved Morley south-west with its label to the left; the service radius was a 150-unit circle that excluded Rockingham and Mandurah while the copy promised them — replaced with a metro ellipse that covers Yanchep to Mandurah, labelled "metro radius · same price inside".
Pass 2 — Depth
- Second-read detail: the ADAS sight line between the camera housing and the target board crawls its dashes; the light bar on the ute glows amber; the number plate reads 1CLR 348 (the site number); the rear-screen heater lines fade to 0.55 with the pane during the lift and come back on the new glass.
- Insurance draws a small "insurer billed" claim card clipped to the sticker (a drawn bulldog clip in CSS) so the declaration has a visual, not just a line. When the badge carries the second line and both extras, the subtitle abbreviates ("replace + ADAS + rain") so the sticker doesn't grow up over the rain-sensor label.
- Micro-interaction: stepper buttons compress 6% on press; the switch knob eases with a soft overshoot curve; the sticker's position transitions between views over 450 ms so it slides from the windscreen corner to the door glass rather than jumping.
- Reduced the pane lift from 70 to 44 units so the lifted glass never clips at the top of the SVG on the van (roof at y = 40).
- Rapid-fire drives (eleven clicks in one evaluate, then a 21-click loop) land on the rest $770 with the settled flag true and zero console errors — the token bump in every handler plus a synchronous rebuild is what makes that hold.
Pass 3 — Hardening
- 375 first screenshot: the trust chips fell under the sticky bar. Shortened the eyebrow, hid the sub-line's second sentence below 560px, put both CTAs on one row and hid the desktop same-day chip (the sticky bar carries it) — h1, CTA and trust chips now end above the sticky bar's top (asserted against the bar's measured top, not the viewport height). Masthead: wordmark right edge 248px vs call button left edge 305px, no collision; scrollWidth 375 on both pages, zero HTML overflow offenders.
- 375 badge: the tight variant collided with the class tag at the bottom of the scene — parked it 28px up in the bumper corner; it never overlaps the drawn pane (badge top 680px vs pane bottom 658px in the probe) and stays inside 375 with the insurance line on.
- 1200 × 750: scene stage top 144px (bottom 525px), sticker top 275px — both intersect the thumbnail. Native-resolution label-collision sweep at 375 / 1000 / 1200 across front, side, tail and repair views: class tag, calibration-target label, rain-sensor label, run line and sticker all clear after Pass 1's moves.
- Reduced motion: no rAF frames, a settled mid-lift frame rendered once, pane opacity 1; hero entrance disabled; smooth scroll off. Visibility pause and resize re-tick verified. Form: empty submit raises five visible errors and keeps the panel hidden; a filled submit via
button[type=submit]shows the panel with "thanks — request received / we'd call you back". Keyboard: chips activate on Enter; focus rings are the amber outline on every control. - Chanel rule: removed the hatched floor pattern under the car — the shadow ellipse grounds it on its own and the scene reads cleaner in the thumbnail. Final copy read: Australian spelling throughout, real suburbs, the reserved (08) 9000 0348 only, ABN pattern 00 000 000 348, no street address.
- Harness totals: 285 assertions green (oracle vectors, matrix, restore paths, three-surface insurance, note presence and absence, disable reasons, rapid-fire, form gates, 375 masthead/overflow/sticky bar, thumbnail intersection, JSON-LD allowlist, reduced motion, guide checks), zero console errors, no raster loads, no backdrop-filter on chrome.
This is a demonstration build by Sapience Analytics.
Want one pointed at your customers? sapienceanalytics.com.au · danny@sapienceanalytics.com.au