Hartley & Marsh — the demo
Generative Assets · Wave 16 · Industry Demos V

How the Hartley & Marsh Legal demo was made

A fictional suburban law firm in Mount Lawley, built as a conversion-focused landing page for one audience: households who want a will, a probate grant, or a first family-law conference — priced before they walk in. The page's single job is a booked initial appointment.

Concept

Counsel, not theatre


Most small-firm websites hide the price and hope the phone rings. This one argues the opposite: the process on one page, the price in the open, and a straight answer when you don't need a lawyer at all (JP certification is free at the library; Legal Aid WA on 1300 650 579 when money is tight). No scales of justice, no lion crests, no outcome promises anywhere — process and price only, which is both the honest register for legal marketing and the one that converts anxious first-time clients.

Palette

Parchment chambers daylight


Argued from the office, not a mood board: deed paper, the leather desk inlay, the brass door plaque, the bound law reports.

#F6F2E8 parchmentground — the deed paper
#233830 counsel greenstructure & primary ink — the desk inlay
#A8823C brassLINE/MARK only — plaque, timeline, markers
#7A5A20 brass-inkderived for small text on parchment (5.6:1)
#7E3B33 oxbloodsecondary — the law reports: links, focus

The spec's ink/line rule applied twice over: brass never sets body text on parchment (eyebrows and labels use the derived #7A5A20 brass-ink at 5.6:1), and on the counsel-green explorer panel the fee figures use a lightened #C9A45C brass-bright (5.3:1) while body copy runs in parchment tints.

Type

Bookish authority, costs-agreement figures


Signature

The Fixed-Fee Matter Explorer


Five matter chips (wills & estate planning, probate & estates, family-law first steps, employment advice, small-business agreements) drive a procedural SVG process timeline and a set of fee cards. The timeline is one dashed brass stroke over a muted track: selecting a matter re-draws it stage by stage via stroke-dashoffset, nodes lighting on a 180ms stagger; four HTML stage buttons (not SVG controls — cleaner keyboard access) jump the draw to any stage and swap the plain-language file note beneath. Per the W15 learning, the progress stroke uses butt caps and stays at opacity 0 until drawn length exceeds 1px, so no stray cap-dot ever renders at stage 1. When a matter reaches stage 4 of 4, a small brass wax-seal — "FIXED FEE · IN WRITING" — stamps onto the lead fee card, echoing the sealed deed in the hero illustration. The whole scene rests mid-demonstration: wills selected, timeline drawn to stage 2, the $440/$660/$850 cards showing, so the static thumbnail reads instantly. Every interaction updates window.__lawyer (matter, stage, displayed fees, seal, form status).

Conversion tie-in: choosing a matter (chip, "Book this matter", or any service-card link) pre-fills the appointment form's matter select — the demo interaction becomes a warmer lead. Deliberately, the form is not pre-filled at rest, so a fresh visitor's empty submit exercises all four required fields.

Honest numbers

The fee model and its shape


Every figure on the page comes from one table, plausible for the 2026 Perth suburban market, and the explorer, services grid and FAQ all read from it:

MatterFixed feeNote
Simple will$440single person
Couples' mirror wills$660deliberately 1.5× the single fee, not 2× — one conference, two matching documents
Estate package (will + EPA + EPG)$850 / $1,400single / couple — the couple rate again sub-2×, same shape
Probate (uncontested)from $3,300+ court filing fees — the Supreme Court sets filing fees; shown as disbursements, never marked up
Family-law first conference$390the page's price floor — explorer's cheapest output equals the services grid's floor
Employment advicefrom $420fixed quote before advice work
Business agreementsfrom $990fixed quote before drafting
Beyond fixed scopes$420/hr6-minute units, itemised on every invoice

Shape notes for QA: the couple pricing is deliberately sub-double (a real firm's shape — shared conference time), "from" prefixes mark scopes that legitimately vary, and court filing fees are hedged as an external authority's number rather than asserted — the Supreme Court of WA sets and revises them. No outcome language exists anywhere on the page; the only promises are process and price.

Conversion decisions

Why the page is shaped this way


Local SEO we'd implement for the real business

This demo ships only a WebPage schema naming itself a demonstration — fictional LocalBusiness/Review structured data in a real index is dishonest markup. A real firm would ship this (plus real reviews with consent, suburb landing content, and a Google Business Profile wired to the same NAP):

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LegalService",
  "name": "Hartley & Marsh Legal",
  "telephone": "+61 8 XXXX XXXX",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Suite X, XXX Beaufort Street",
    "addressLocality": "Mount Lawley",
    "addressRegion": "WA", "postalCode": "6050", "addressCountry": "AU"
  },
  "areaServed": ["Mount Lawley","Highgate","North Perth","Inglewood",
                 "Menora","Bedford","Maylands","Bayswater","Perth"],
  "openingHoursSpecification": [{
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
    "opens": "08:30", "closes": "17:00"
  }],
  "priceRange": "$390–$3,300+",
  "review": [{
    "@type": "Review",
    "author": {"@type": "Person", "name": "Real client, with consent"},
    "reviewRating": {"@type": "Rating", "ratingValue": "5"},
    "reviewBody": "Sourced from the firm's live review feed."
  }]
}
</script>
For the real client

What would change for a live firm


Techniques

Under the parchment


Iteration log

Three passes, driven headlessly


Every pass drove the page in headless Chrome (puppeteer) and asserted output — form submits on fresh loads, the explorer against an independently reimplemented fee oracle, screenshots reviewed by eye at 1280 and 375.

Pass 1 — Craft

  • Found: at 375×667 the hero's trust chips sat below the fold (block bottom 761px). Tightened the mobile hero (padding 64→40px, h1 to 30px, margin trims) — CTA bottom now 448px, first trust chip 574px, both comfortably above the fold.
  • Found (harness, not site): the page's scroll-behavior:smooth defeated the stepped scroll driver — smooth animation lagged the programmatic steps, so sections below ~5,300px never entered the viewport and their reveals stayed unfired in full-page screenshots. Driver switched to instant scrolling; real user scrolling was never affected.
  • Verified: rest state exactly per spec (wills, stage 2 of 4, $440/$660/$850 + $1,400 showing; dash draw at 213.3 of 640 units); zero console errors; one h1; screenshots reviewed end to end at both widths.

Pass 2 — Depth

  • Added: the stage-4 wax-seal stamp ("FIXED FEE · IN WRITING") on the lead fee card — the second-read reward for driving a matter to completion, timed 650ms after the draw lands; asserted absent at rest, present and fully opaque after driving.
  • Added: 70ms staggered entrance on fee-card swaps, replacing a flat fade.
  • Verified against the oracle: displayed fees for all five matters matched an independently reimplemented spec table (family $390; probate from $3,300; employment from $420; business from $990; wills $440/$660/$850 + $1,400 couple); cheapest explorer output across all matters ($390) equals the services grid's floor; chips, stage buttons and FAQ also driven by keyboard.

Pass 3 — Hardening

  • W15 dot guard asserted: at stage 1 the progress stroke computes to opacity 0 (butt caps, hidden until drawn length > 1px) — no stray cap-dot.
  • 375px: scrollWidth 375; wordmark (20–188px) and header tel link (229–355px) fully in viewport; sticky bar fixed with a ≥44px tel target in the bottom 140px, tapped without error.
  • Forms: empty submit on a fresh load flags all four required fields (name, phone, suburb, matter) with aria-invalid + visible errors; filled submit renders the local confirmation ("request received … we'd be in touch within one business day") echoing name and suburb.
  • Reduced motion: settled timeline visible, instant matter swap still renders oracle-correct fees, zero console errors. Honesty sweeps: every (08) 9xxx number on the page uses the reserved 9000 exchange; no LocalBusiness/Review/AggregateRating JSON-LD on the index.
  • Chanel rule: removed the Guildford Rd label from the service-area map (the road line stays) — one fewer competing mark around the Maylands dot.

← Back to the site · Generative Assets index