Generative Assets · Industry Demos IV
A conversion-focused landing page for a fictional South Perth dental practice — dentistry sold by removing fear, priced out loud, with a procedural tooth map instead of a stock-photo smile.
Alabaster Dental Studio is the stone the enamel aspires to: a family & cosmetic practice for adults who have put the checkup off for two years, parents booking kids in, and professionals weighing whitening against a chipped front tooth. The page has one job — book a checkup — and it does it by killing the two things that stop people booking: fear of the chair and fear of the bill.
The direction is porcelain calm: the quiet confidence of a beautifully lit studio. No bleached stock grins, no urgency banners — the $199 gap-free hook and an estimator that answers "what will this cost me?" before asking for anything in return.
The spec names rinse aqua as the accent; the ink/line split (LEARNINGS W2/W5) means it stays a line-and-mark colour. Everywhere aqua needs to carry text or a button, a darker sibling was derived and contrast-checked rather than letting the mark colour fail at 3.3:1.
Bricolage Grotesque (display, optical size active, set tight at −.015em) carries the studio confidence — contemporary without being cold, and its slightly humanist forms keep "Dentistry without the dread." from reading like a bank. Inter does the clinical work: body, UI, forms — and every price is set with font-variant-numeric: tabular-nums so $199, $190–$380 and $1,700 align like an honest invoice.
The upper arch is generated at runtime as pure SVG — no raster, no library. Sixteen crowns are placed along a blended curve y = 58 + 188·(0.62u² + 0.38u⁴): the quartic term flattens the anterior curve and steepens the molar arms, which is what a real dental arch does. The curve is sampled 800 times to build an arc-length table; each tooth's centre is placed by cumulative crown width (molars 44 px wide down to lateral incisors at 27 px), then rotated to the local tangent. Crowns are rounded paths with per-type occlusal grooves — an H-pattern for molars, a single fissure for premolars, a ridge for canines — filled with a radial porcelain gradient and a specular gleam.
Every tooth is a keyboard-reachable control: role="button" tabindex="0" with a per-tooth aria-label ("Tooth 14 — upper left second molar…"), Enter/Space handlers, and a live region announcing each selection. Concern chips (checkup / chip / toothache / whitening / wisdom) light zones on the arch; tapping a tooth infers the concern from its anatomy — third molars route to wisdom, incisors to chip repair, load-bearing teeth to toothache. The aqua zone arc under the crowns is one path whose six-value stroke-dasharray is recomputed per zone (two dash segments cover the split wisdom zone), animated by a CSS transition. Selecting whitening literally brightens the smile-zone gradient a shade — the second-read detail.
Every card ends the same way: an honest price anchor, an honesty line ("root canal $950–$1,700 — quoted after x-rays, never off a webpage"), and a Book this button that pre-fills the enquiry form with the concern — the estimator warms the lead instead of decorating the page.
html.anim class that reduced-motion never receives.window.__dentist carries concern, tooth, displayed price, form status and FAQ state for headless QA.This demo page ships only WebPage schema naming itself a demonstration — fictional LocalBusiness or Review markup in a live index would be dishonest. For a real practice we would ship the block below, fed by their actual details and their live review stream:
<!-- would-ship markup for the real practice — NOT emitted on this demo -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Dentist",
"name": "Alabaster Dental Studio",
"url": "https://alabasterdental.com.au",
"telephone": "+61 8 XXXX XXXX",
"image": "https://alabasterdental.com.au/img/studio.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "Suite X, XX Mends St",
"addressLocality": "South Perth",
"addressRegion": "WA",
"postalCode": "6151",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -31.980, "longitude": 115.861 },
"openingHoursSpecification": [
{ "@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:00", "closes": "18:00" },
{ "@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday", "opens": "08:00", "closes": "13:00" }
],
"priceRange": "$$",
"sameAs": [
"https://g.page/alabaster-dental-studio",
"https://www.instagram.com/alabasterdental"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "187"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "Real Patient" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "Synced from the practice's live Google reviews feed."
}]
}
</script>Plus: Google Business Profile with service + suburb posts, suburb-intent copy (South Perth / Como / Vic Park), FAQ schema on the real FAQ, and item-number pages for the high-intent searches ("012 013 111 121 cost Perth").
html.anim, so reduced-motion users get a settled frame.stroke-dashoffset, which has no zero dashes to cap.html.anim never applied, hero/card/teeth all opacity 1 with the $199 rest card showing — settled and complete, not blank.scroll-behavior:smooth swallows rapid programmatic scroll steps — sweeps must scroll with behavior:'instant'.)