Build guide · Generative Assets

How Tappet & Co. was made

Design and build notes for a fictional independent mechanic in Osborne Park, Perth — a single conversion-focused landing page whose one job is a booked service. Part of the Industry Demos series by Sapience Analytics.

Concept

Tappet & Co. Automotive is the honest workshop: a clean floor, a torque wrench back on the board, the labour rate written on the wall. The audience is commuters due for a logbook service who don't want dealership rates, families with a second-hand SUV making a noise, and ute owners who need it back by Friday. Every design decision is anti-dealership and pro-explanation — prices before the job, photos before the spanner.

The page's single job is a booked service, so the signature element is a price conversation, not an ornament: the Service Estimator on the Hoist shows the visitor their own car class in the air with honest ranges under it, then hands that scenario straight into the booking form.

Palette — argued from the floor

#EEEDE9 · shop-floor concreteGround. The sealed grey-white of a swept workshop floor — daylight through a roller door, not showroom gloss.
#23262B · engine blackStructure and primary ink — the block itself. Headings, the readout panel, the trust band, the footer.
#D4622A · safety orangeLINE/MARK only — shop-towel and inspection-tag orange. Hoist caps, lit inspection points, section ticks, the price rule. Never body text on concrete (it fails 4.5:1 there by design).
#B34A13 · deep tag orangeThe CTA fill, derived from the mark orange so white button labels clear 4.5:1 (≈5.0:1). The ink/line split, applied to buttons.
#31707A · gauge tealSecondary — the dial faces. Links, focus rings, map suburb dots, the confirmation tick.
#E9E7E2 · boneBody ink on engine black — derived light ink so dark panels keep ≥4.5:1 body contrast (the mark orange is reserved for large mono figures and lines there).

The spec named safety orange as the line/mark accent; per the collection's ink/line rule it never sets small text. On the dark readout the price is orange but only at display size (30px+ bold mono, ≈4.2:1 — above the 3:1 large-text threshold), with all explanatory copy in bone or the dimmed grey.

Type

Techniques

Fully self-contained single file: inline CSS/JS, Google Fonts only, every visual procedural (SVG + CSS) — no raster images, no libraries. Restrained by design: a tradie's customer on 4G gets a calm, fast page.

The Service Estimator on the Hoist

The bay is a hand-built SVG: two posts with orange safety caps, a floor line, and a #car-group that carries the carriages, lift arms, sill pads, the car and its inspection markers. Four car silhouettes (small hatch, family SUV, dual-cab ute, Euro sedan) are authored as path data in a shared local coordinate system (ground at y=140, facing left), so wheels, arms and inspection points are per-class data, not per-class artwork. Raised is the resting state — a CSS transform on the group; changing car class adds a .down class (car sinks to the floor), swaps the silhouette mid-lower, then lifts it again on the collection's crafted ease. Service chips relight the numbered inspection points (safety orange, pulsing halo) and the numbered plain-language checklist beside the scene mirrors them. Prices live in one matrix keyed by service × class; the readout, the services grid floor ("from $269") and the FAQ labour rate all resolve from the same numbers. "Book this service" pre-fills the form's class and service selects — the demo interaction becomes a warmer lead. Under prefers-reduced-motion everything renders settled and complete: car up, four points lit, range showing, no pulse, no lower-and-raise choreography.

Everything else

Conversion decisions

Local SEO we'd implement for the real business

This demo page deliberately ships only WebPage schema naming it a demonstration — fictional structured data in a real index would be dishonest markup. For a real workshop we'd ship AutoRepair (a LocalBusiness subtype) plus review markup fed by their actual Google reviews:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "AutoRepair",
  "name": "The Real Workshop Pty Ltd",
  "image": "https://example.com.au/workshop.jpg",
  "telephone": "+61 8 XXXX XXXX",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Unit X / XX Example Street",
    "addressLocality": "Osborne Park",
    "addressRegion": "WA",
    "postalCode": "6017",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -31.90, "longitude": 115.81 },
  "url": "https://therealworkshop.com.au",
  "openingHoursSpecification": [{
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
    "opens": "07:30", "closes": "17:00"
  }],
  "priceRange": "$$",
  "areaServed": ["Osborne Park","Balcatta","Stirling","Tuart Hill","Innaloo"],
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.9", "reviewCount": "187"
  },
  "review": [{
    "@type": "Review",
    "author": { "@type": "Person", "name": "A Real Customer" },
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "reviewBody": "Sourced live from the workshop's Google Business Profile."
  }]
}
</script>

Plus: Google Business Profile categories (Auto repair shop / Mechanic), service-suburb pages only where genuine work happens, and review capture wired to the invoice ("text the review link when the keys are handed back").

What would change for the real client

Iteration log

Pass 1 — Craft

Screenshot review caught what the green asserts sailed past. The rear wheels of the SUV, hatch and Euro poked past their tails — the body paths ended too early — so all four silhouettes were rebuilt with real rear overhangs (the SUV's tailgate now closes at 332 of 340 units). The ute's cab was 22 units of roof and read like a dragster; it became a true dual-cab (roof 128–204, two door rows, tray from 228). The lift arms drew as one horizontal bar skewering the wheels — re-angled from the carriages down to sill pads placed clear of the oil marker. Unlit inspection markers showed as mud dots on the glass; they're now hidden until lit. The viewBox was cropped from 760×470 to 648×438 (the car gained ~19% presence), anchor links stopped burying section headings under the sticky header (scroll-margin-top), the desktop h1 came down from 72px to 58px, and the trust row moved above the CTAs so value prop + CTA + trust all clear a 375×667 fold (measured: h1 at 141px, trust at 465px, CTA at 551px). Two map labels (Stirling, Herdsman) were pulled off the freeway stroke.

Pass 2 — Depth

Deepened the signature. A second-read detail went up on the bay wall: a small black board reading "LABOUR $135/HR — SAME RATE FOR EVERYONE", the page's flat-rate promise painted into the scene itself. Inspection points now light with a 70ms stagger (skipped under reduced motion), and hovering a checklist line highlights its matching marker on the car — the list and the diagram read as one instrument. The estimator→form handoff got a one-shot teal flash on the two pre-filled selects so the visitor sees what the button did. The harness drove all 20 class × service combinations against an independently re-implemented price oracle — every displayed range matched (SUV logbook $299–$359 at rest; Euro belts $1,050–$1,400 at the extreme) — and a new assert covers the hover-sync behaviour.

Pass 3 — Hardening

Chanel rule: removed the faint tool-locker outlines from the bay floor and a dead hero background hook — the scene is calmer without them. The sticky call/book bar gained env(safe-area-inset-bottom) padding for notched phones, and a driven assert that tapping "Book a service" lands on the form (#book, page scrolled). Verified at 375px: scrollWidth exactly 375, wordmark/h1/CTA fully inside the viewport, 56px tap targets. Reduced-motion renders settled and complete — car raised (translateY 122px), four points lit, range showing, no pulse, class swaps instant. Empty submit flags all six required fields; filled submit renders the local confirmation. The reserved-phone sweep found only (08) 9000 0233, structured data is WebPage-only, and the final copy read found no filler — every number on the page resolves from the one price matrix ($269 floor, $135/hr everywhere).