Generative Assets / Fairholme Settlements / Build guide

The Settlement Rail: making conveyancing read calm

Fairholme Settlements is a fictional Victoria Park settlement agency — a conveyancing industry demonstration. The page has one job: turn a stressed buyer or seller mid-contract into a fixed-fee quote enquiry, by showing the whole process and the whole price before they've scrolled once.

Concept

WA settlements run on the Torrens register, and the register's own artefacts — ruled ledger lines, iron-gall ink, the stamped seal — are calmer than any stock photo of a handshake. So the whole page is set like a certificate of title: generous paper margins, survey-blue rules, and a crimson seal that behaves as a progress mark. The signature element, the Settlement Rail, is a five-milestone ledger line (OFFER · FINANCE · SEARCHES · DUTY · SETTLEMENT) stamped in sequence, wired to scenario chips and a contract-price stepper that drive an itemised fee ledger. Interaction and quote are the same surface — the demo is the pitch.

Palette — argued from the title deed

Register paper#FAF7F0 page ground — warm archival stock, not gallery white.
Iron-gall ink#26241E body text at 13.1:1 on the paper.
Seal crimson#93313A the stamp, CTAs, milestone marks — never small text.
Survey blue#3E5F8A ruled lines, plan strokes, links.

The accent split follows the collection's ink/line rule: crimson and blue carry marks, rules and buttons; small text always sits in the iron-gall ink or its muted derivative #6A6355.

Type

Fraunces (variable, optical axis high at display sizes) gives headings the gravity of a deed without costume; the milestone verbs along the rail are its display moment — letterspaced Fraunces caps reading as an engraver's small caps. Albert Sans carries body copy, forms and UI: geometric enough to feel current, warm enough not to fight the paper.

The fee model (all figures binding, verified against an oracle)

Every figure on the page is computed from four pinned anchors and re-verified in QA against an independently reimplemented model. Totals display to the whole dollar; the arithmetic is integer throughout.

ScenarioProfessional feeFixed searchesDisplayed quote
Buying, $650,000, two buyers (rest state)$1,090 (flat to $750,000 incl.)$350 ($65 + $45 + $142 + $49 × 2)$1,440 + duty & registration at cost
Buying, exactly $750,000$1,090 — the tier holds at the boundary$350$1,440 + at cost
Buying, $780,000$1,290 (over $750k)$350$1,640 + at cost
Selling, any price, one seller$990 flat$114 ($65 + $49)$1,104
Simultaneous buy ($650k) + sell$1,900 ($1,090 + $990 − $180 bundle)$464 ($350 + $114)$2,364 + at cost
The price-less line is designed, not missing. Transfer duty and Landgate registration are assessed by RevenueWA and Landgate on the contract — any number we printed would be the dishonest choice. The ledger line carries the at-cost declaration instead, and the same declaration appears beside the buying line in the services grid, wherever a total does.

Measured from the running page: rest state reads $1,440 + duty & registration at cost; the estimator's cheapest outputs equal the services grid floors ($1,090 buying / $990 selling).

Techniques

The rail is one procedural SVG, built in vanilla JS at load: a double-ruled ledger line, five milestone groups positioned by SVG transform attributes, and each seal's stamp animation on a separate nested group animated only by CSS (position and animation never share an element — a standing collection rule). A stamp is a CSS class flip: scale 1.5 → 1 with a slight rotation on a springy cubic-bezier, staggered down the rail. The current milestone's seal pulses between opacity 1 and 0.62 — a visibility floor, so the signature is alive at any thumbnail capture instant — and stamping SETTLEMENT draws a survey-blue key across the rail.

Dual-speed redraw: the first stamping run is entrance choreography (300 ms per seal); every subsequent scenario change or milestone preview restamps at 80 ms per seal under a 500 ms cap via a firstDraw flag. Race safety: every handler that restamps bumps a token before swapping state and clears the pending timers, so rapid-fire chip and milestone clicks can never leave a stale stamp callback writing over the new scenario — QA drives ten interleaved clicks in a single evaluate, twice, and asserts the settled state against the oracle.

Everything else is CSS and honest HTML: the ruled hero ground is a repeating gradient, the metro map is a hand-placed SVG survey plan (grid pattern, coastline, Swan River, Victoria Park star), and the enquiry form validates front-end only with v-flag-safe pattern attributes and a designed local confirmation. A window.__conveyancing probe exposes scenario, computed figures and a settled flag so QA gates on state, never on seconds.

Conversion decisions

Local SEO we'd implement for the real business

This demo deliberately ships only WebPage schema — fictional structured data in a real index is dishonest markup. For a real settlement agency we'd ship the schema below (shown here as a code sample, not live), wired to their real NAP, licence number and review feed:

{
  "@context": "https://schema.org",
  "@type": "LegalService",
  "name": "Fairholme Settlements",
  "description": "Licensed settlement agents (conveyancers) for WA property
    buyers and sellers. Fixed professional fees, searches at cost.",
  "telephone": "+61-8-9000-0291",
  "url": "https://fairholmesettlements.com.au",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Victoria Park",
    "addressRegion": "WA",
    "postalCode": "6100",
    "addressCountry": "AU"
  },
  "areaServed": "Perth metropolitan area",
  "openingHoursSpecification": [{
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
    "opens": "08:30", "closes": "17:00"
  }],
  "priceRange": "$$",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.9", "reviewCount": "127"
  },
  "review": [{
    "@type": "Review",
    "author": { "@type": "Person", "name": "…from the live review feed…" },
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "reviewBody": "…"
  }]
}

LegalService is the precise schema.org subtype search engines resolve for conveyancers and settlement agents; the review block would be fed from their verified Google Business Profile reviews, never authored.

What would change for the real client

Iteration log

Pass 1 — Craft

  • Screenshot review caught the rail's display moment breaking itself: DUTY and SETTLEMENT set at 15.5px with .16em tracking collided into "DUSETTLEMENT". Re-cut the labels to 14.5px/.09em, re-spaced the milestones (45/185/330/462/615) and end-anchored SETTLEMENT against the rail's end — every DOM assert had been green while the words overlapped.
  • At 375 the masthead CTA wrapped to two lines; added white-space:nowrap to the button primitive and re-checked the wordmark/CTA clearance explicitly (the masthead is always the first thing checked at 375).
  • Hero eyebrow wrapped to three lines on mobile — stepped it down to .72rem under 920px. Simplified a convoluted ledger-row expression found on re-read.

Pass 2 — Depth

  • Made the five milestones keyboard-focusable SVG buttons: click or Enter stamps the rail to that point and swaps the caption — and stamping SETTLEMENT reveals the survey-blue key crossing the rail, the page's second-read detail.
  • Extended the rapid-fire QA drive to interleave milestone previews with scenario swaps (ten dispatches in one evaluate, run twice): settled state matched the oracle, exactly three seals ON after the final chip, zero console errors — the token-invalidate-in-the-handler pattern held.
  • Verified the chip→form handoff both ways: rail chips sync the form radios and the estimate line restates the rail's figures ($2,364 for the simultaneous scenario) on the same render.

Pass 3 — Hardening

  • Chanel rule: removed the hero's crimson radial glow — the ruled-paper gradient carries the ground alone. Cleared the Rockingham label from the survey plan's frame caption.
  • Reduced-motion re-run: stamps render instantly, the pulse's animationName computes to none, page settles with all figures correct.
  • Full sweep at 375/1200/1280: scrollWidth 375 exactly, sticky call bar's tel link inside the bottom 140px, h1 + CTA + trust chip above the first fold, the rail card's bounding box inside the first 750px at 1200 wide, form pattern v-flag-validated, empty submit raises field errors on a fresh navigation, filled submit lands the designed confirmation. 81 asserts, zero console errors on either page.