← Back to the site
Index

How the Wideroad page was made

Wideroad Caravan Services is a fictional Bibra Lake caravan servicing business — grey nomads staging for the big lap, families before school holidays, vans that sat under a carport all winter. The page has one job: a service booking with the level and add-ons already chosen, and the Service Planner exists to get the visitor there with a number they trust.

Palette · the limestone yard and the road north

Colour argued from the subject

The workshop at open-roller-door morning: a limestone ground, iron-red for the outback the van is headed toward (it carries every CTA and nothing else), and steel-blue for the van linework and dimension callouts — workshop-drawing blue, not decoration. Body text gets its own chassis-ink token; the accent never sets small type.

Limestone#F0EFE8

Page ground — the yard the van is parked on.

Chassis ink#25292E

Body text, 13.3:1 on the ground.

Iron red#9C4A2F

CTAs, the badge ring, marks. 6.0:1 — buttons only, never small text.

Steel blue#5E7A8C

Van linework, rules, leaders. Text uses the darker #41586A ink split.

Type · road-sign flavour without cosplay

Barlow Condensed + Barlow

Barlow Condensed 600–700 for display — it carries the road-sign flavour honestly (Barlow is drawn from Californian public signage) without becoming a highway-sign pastiche. The typographic moment is the service price set huge inside the road-sign-shaped estimate badge on the van. Barlow is the workhorse: same skeleton, comfortable at 16.5px body, so the page reads as one voice.

Signature · the Service Planner

A check-pass that travels the van

The van is a hand-plotted SVG side profile — drawbar, coupling, gas bottles, solar panel, 12V hatch, wheels, tail light — with eight system callouts on dotted dimension leaders, workshop-drawing style. The selected service defines which systems are covered; a check-pass sweep travels the covered set left-to-right, pulsing an iron-red halo on the active system (opacity floored at 0.55 so the scene is alive at any capture instant) and leaving a green tick behind it. Chips swap the covered set, the tandem toggle draws the second axle, and the price recomputes from the pinned anchors into the speed-sign badge on the van's flank — the number lives inside the artwork, not in a ledger below the fold.

Engineering: every control handler bumps an invalidation token before the state swap, so a mid-sweep animation can never index a stale covered set under rapid-fire clicking. The entrance (0.85s dash draw-in via pathLength="1", then the first ticking pass) runs once; subsequent changes redraw in under 450 ms. The rAF delta is clamped at zero and capped, the loop idles when the tab is hidden, and reduced-motion renders the settled frame: van drawn, all covered systems ticked, one static halo at 0.75. A no-JS visitor gets the fully drawn van — entrance classes are gated on a .js root class.

Honest numbers · pinned anchors

The pricing model

ItemSingle axleTandemStated on-card
Annual service$380+$160Four hubs instead of two
Pre-trip safety check$180 flat$180 holdsEyes and gauges, not hubs off — toggle stays live, draws the axle
Bearing & brake overhaul$560+$300Parts for four hubs
Gas compliance certificate+$140Licensed gasfitter, certificate issued
12V & solar health report+$90Battery load test, panel output, wiring
At-home service (metro)+$80We bring the workshop to the van
Insurance & accident repairsNo numberQuoted from the insurer's assessment — price-less by design

All worked figures are pure anchor arithmetic and every one was measured from the running page against an independently reimplemented oracle: rest state annual + tandem + gas certificate = $680; annual single = $380; overhaul + tandem + at-home = $940; pre-trip + tandem + solar = $270 with the flat statement visible. The grid floor "servicing from $180" equals the planner's cheapest output (a pre-trip alone). The pre-trip tandem toggle is the W20-style honest no-op: it never changes the price, but it draws the axle and the card says why the price holds.

Conversion · why the page is shaped like this

Decisions

Planner in the hero. Most caravan-service enquiries start with "roughly what will it cost?" — so the pricing tool shares the first viewport with the value proposition, and the computed total sits inside the drawing where a thumbnail or a skimming eye can't miss it. Planner → form handoff: "Book this service" writes the configured scenario into the booking message and syncs the service select, so the enquiry arrives pre-qualified. Form fields are only what a workshop actually needs to call back usefully: name, phone, suburb (travel for at-home jobs), van make/length (bearing kits differ), service, and a "heading off when?" date — urgency is the real scheduling axis before school holidays. Confirmation is a designed local panel that promises a call-back within one business day and plainly states no booking was sent — never a fake network round-trip. Click-to-call in the masthead, repeated beside both submit buttons, and in a sticky mobile bar — trade traffic is a phone in one hand.

Local SEO · what we'd implement for the real business

The would-ship schema

This demonstration page carries only WebPage/BreadcrumbList schema naming it a demo — fictional structured data in a real index is dishonest markup. For a real client we'd ship AutoRepair (the LocalBusiness subtype that covers trailer and caravan servicing) with their real NAP, hours, geo and review feed:

{
  "@context": "https://schema.org",
  "@type": "AutoRepair",
  "name": "Wideroad Caravan Services",
  "description": "Caravan servicing, repairs and pre-trip safety checks
    in Bibra Lake, serving the Perth metropolitan area.",
  "url": "https://wideroadcaravans.com.au",
  "telephone": "+61 8 XXXX XXXX",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "(real street address)",
    "addressLocality": "Bibra Lake",
    "addressRegion": "WA",
    "postalCode": "6163",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -32.09, "longitude": 115.82 },
  "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" }
  ],
  "areaServed": { "@type": "City", "name": "Perth" },
  "priceRange": "$180–$940",
  "aggregateRating": { "@type": "AggregateRating",
    "ratingValue": "4.9", "reviewCount": "(real count)" },
  "review": [{
    "@type": "Review",
    "author": { "@type": "Person", "name": "(real customer)" },
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "reviewBody": "(pulled from their Google Business Profile feed)"
  }]
}

Plus suburb-level service pages (caravan servicing Baldivis / Rockingham / Joondalup), a Google Business Profile tuned for "caravan service near me", and FAQ schema off the real questions their phone rings with.

For the real client · what would change

Swapping the demo parts for their business

The booking form would post into their workshop system — Workshop Software or ServiceM8 both handle caravan workshops well (job cards, digital checklists that become the "signed checklist — you see what we saw" promise, photo attachments from the hoist). Invoicing flows to MYOB or Xero. Automated SMS reminders via Podium (or ServiceM8's own messaging) close the loop the trade always drops: "your van's 12 months since its last service — school holidays start April 10, want a slot?" — annual servicing is a literally recurring revenue model that almost no caravan workshop actually schedules. Their real reviews replace the demo copy via a Google reviews feed, and the planner's anchors become their live rate card, maintained in one JSON block.

Process · build, then three passes

Iteration log

Pass 1 — Craft. Drive everything, then look.

  • Full harness drive: all four worked examples measured against an independently reimplemented oracle — rest $680, annual single $380, overhaul + tandem + at-home $940, pre-trip + tandem + solar $270 with the flat statement visible ("eyes and gauges, not hubs off"). Empty submit on a fresh load raised 4 :invalid signals with the confirmation panel still hidden; a filled submit (ISO date, today + 7) showed it. 44/44 green.
  • Screenshot review caught what the asserts couldn't: the SVG callout labels were set at 12px in a 760-unit viewBox, rendering ≈8px at the planner's ~520px column — bumped to 15px and dropped the all-caps, which was hurting legibility more at that size.
  • The h1's 17ch measure orphaned "there." on its own line at 1200 — widened to 20ch so the promise breaks at the hyphen instead.

Pass 2 — Depth. Second-read details and the rapid-fire race.

  • Added the WIDEROAD decal and side stripe to the van (the fictional brand painted on its own van — noticed on the second visit), and a 1.07-scale pop on the estimate badge whenever the total changes (220 ms, killed under reduced motion).
  • Timed the rest sweep so the 7-second thumbnail settle lands with the gas system mid-tick (sweep start 0.7s + 0.85s per system; measured halo opacity 0.68–0.69 at capture, above the 0.55 floor) — the pinned rest frame, achieved with a visibility floor rather than phase arithmetic alone.
  • Rapid-fire drives: 8 control clicks in one evaluate with no settle, then an 18-click chip/toggle loop — state stayed oracle-coherent ($610, then $410) with zero console errors, because every handler token-invalidates the in-flight sweep before the state swap.

Pass 3 — Hardening. 375px, reduced motion, one ornament removed.

  • Masthead first at 375 (the recurring offender): wordmark right edge 148px vs phone chip left edge 253.6px — no collision; page scrollWidth exactly 375; sticky call bar fixed in the bottom 140px with a 53.6px-tall tel link; h1 + 55px CTA + trust line all inside the first viewport.
  • Reduced-motion run: settled frame with the van fully drawn, all six covered systems ticked, one static halo at 0.75, $680 badge, zero console errors. Verified the no-JS path leaves nothing at opacity 0 (entrance styles gated on a .js root class).
  • Phone pattern checked against Chrome's v-flag regex compilation (every literal special escaped) — checkValidity() runs clean. Chanel rule: removed the awning-rail detail line from the van body — it added noise under the solar panel and said nothing.