Fibreline

Build notes · Industry demo · Site 293

How Fibreline Asbestos Removal was built

Fibreline Asbestos Removal is a fictional Welshpool testing-and-removal outfit built as a conversion demonstration: one landing page whose single job is to turn "is that fence asbestos?" anxiety into a testing or removal enquiry. The audience is the owner of a pre-1990 Perth home — and the page's secondary, non-negotiable job is telling them honestly what not to touch.

Palette — argued from the containment

The controlled work area supplied every colour: taped poly sheeting, respirator rubber, the warning placard, and the calm teal of the all-clear. Placard red is rationed hard — hazard marks and era pins only, never text, never a fill — so when a red pin lands on the diagram it actually means something.

#F3F4F6 poly-sheet greypage ground — the taped containment sheet
#24272C respirator charcoalbody ink and the verdict placard — 13.9:1 on the ground
#1F6E73 clearance tealCTAs, links, the all-clear line — resolution, not alarm
#B3362E placard redera pins and hazard marks ONLY — never text, never fills

Support inks derived per the ink/line split: #555C64 muted body ink (≥5.5:1 on both grounds), #DCDFE4/#C9CDD4 line tokens, #E8F1F1 clearance tint for calm panels.

Type

Barlow Condensed (600–800) carries the display voice — tall, tight safety-placard capitals, exactly the letterforms stencilled on a warning sign. The typographic moment is the era verdict, set placard-style in condensed caps on charcoal: "BUILT 1968 — ASSUME IT'S IN THE EAVES". Barlow handles body copy: same skeleton, workhorse widths, ≥16px on mobile.

The signature — the Fibro Finder

A build-era picker (1955 / 1968 / 1978 / 1985 / 1995) lights an SVG house-and-yard elevation at the zones where asbestos-containing material is likely for that era: super-six roof, eaves linings, wet-area walls, vinyl floor backing, and the boundary fence. Zones carry two states — likely (filled placard-red pin, pulsing between opacity 1 and 0.55, so the thumbnail can never catch it invisible) and possible (outlined pin, no pulse). Post-1990 resolves to a designed low-likelihood state: a teal all-clear mark and the verdict recoloured from placard to clearance — an answer, not an absence.

Implementation notes: zone geometry is positioned with SVG transform attributes on outer groups while all animation (scale-in, pulse) runs on nested inner elements with transform-box:fill-box — CSS animation and SVG presentation attributes never touch the same element. Era swaps bump a draw token inside the click handler, before the state swap, so any in-flight stagger callbacks self-cancel; the first render earns entrance choreography (250ms base + 150ms/zone) and every later swap redraws snappy (60ms + 45ms/zone) via a firstDraw flag. A window.__asbestos probe exposes era, zone counts, computed figures and a settled flag for state-gated QA.

Beneath the diagram, the removal estimator: three material chips (fence per lineal metre, eaves and wet-area sheeting per m²) with a stepper driving an itemised estimate. Second-read detail: select the fence chip and the yard fence's dimension line quietly follows the stepper — 22 lm on the page, 22 lm on the drawing.

Honest numbers — anchors, clamps, and the price-less line

LineRateMinimumWorked example (measured from the page)
Sample testing$60 a sampleresults within 48 hours
Fence sheeting removal$48/lm, disposal included15 lm billedrest state 22 lm = $1,056; 12 lm bills 15 × $48 = $720 (note shown); exactly 15 lm = $720, no note
Eave & wall sheeting removal$42/m², disposal included20 m² billed18 m² bills 20 × $42 = $840 (note shown); exactly 20 m² = $840, no note; wet-area 26 m² = $1,092
Super-six roof removal$58/m²site-measureda typical 180 m² roof = $10,440 — the estimator leaves roofs to the site assessment ("site assessment confirms measure")
Air monitoring & clearance certificate$320 flatitemised separately on every removal quote
Friable (Class A) workno number by designquoted only after site assessment under a specific removal control plan — Class A is a different licence class, and any printed figure would be a guess

The clamp semantics are stated in the meter's own unit (a length/area minimum, billed at the selected rate), the clamp note appears only when it binds — at exactly 15 lm or 20 m² the raw arithmetic equals the floor and the note stays hidden — and the services grid floors ($720 fence, $840 sheet) equal the estimator's cheapest possible outputs, so the page never argues with itself. Every figure above was measured from the running page and cross-checked against an independently reimplemented oracle in the QA harness.

Era-to-zone mapping is deliberately honest for WA housing: AC building products left the Australian market in 1987, so 1985 renders everything as "possible — test before any works" and 1995 renders the designed low-likelihood verdict. The safety copy (never cut, drill, sand or waterblast; the WA 10 m² homeowner allowance; "sealed and undisturbed is low risk") is real guidance kept real — only the business is fictional.

Conversion decisions

Local SEO we'd implement for the real business

This demo page ships only WebPage/CreativeWork schema naming it a demonstration — fictional structured data in a real index would be dishonest markup. For a real Fibreline we'd ship the full local-business graph (as HomeAndConstructionBusiness, the precise schema.org fit for a licensed removalist) wired to their real NAP, licence number and review feed:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "HomeAndConstructionBusiness",
  "name": "Fibreline Asbestos Removal",
  "telephone": "+61-8-XXXX-XXXX",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Welshpool",
    "addressRegion": "WA",
    "postalCode": "6106",
    "addressCountry": "AU"
  },
  "areaServed": "Perth metropolitan area",
  "hasCredential": "WA Class B asbestos removal licence",
  "openingHours": "Mo-Fr 06:30-16:00",
  "priceRange": "$$",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.9",
    "reviewCount": "137"
  },
  "review": {
    "@type": "Review",
    "author": { "@type": "Person", "name": "Real Customer" },
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "reviewBody": "Pulled from the live Google Business Profile feed."
  }
}
</script>

Plus: Google Business Profile with service-area categories, suburb-level landing variants for the high-volume searches ("asbestos fence removal [suburb]"), and review schema fed from the real GBP stream — never hand-written.

What would change for the real client

Techniques

Iteration log

Pass 1 — Craft

  • Screenshot review caught the boundary-fence zone label clipped off the SVG's right edge (pin floating unlabelled at rest). Re-anchored it centred above the pin.
  • The 1995 all-clear caption rendered charcoal, not teal — the .sv-lab class rule was silently discarding the text's fill presentation attribute (the CSS-beats-attribute trap again). Minted a dedicated .sv-lab-teal class and moved the whole clear-mark out of the roof outline into open sky.
  • Verified every ink token against its ground: body 13.9:1, muted ink 5.5:1+, teal-on-white CTAs 6.1:1; red is never used as text.

Pass 2 — Depth

  • Added the verdict stamp: on era swap the placard diamond restamps with a 0.5s settle (round teal stamp for the 1995 all-clear). Reduced-motion path skips it.
  • Second-read detail confirmed working: the fence dimension line follows the estimator (22 lm at rest, "super six" when another material is selected).
  • Drove the multi-state path headlessly: all five eras (including the designed 1995 low-likelihood verdict, asserted as designed rather than missing), all three materials, clamp bind/release at 12→15 lm and 18→20 m², and two rapid-fire rounds (ten clicks per evaluate, no settle) — token invalidation held, totals matched the independent oracle throughout.

Pass 3 — Hardening

  • 375px masthead first: wordmark clears the call chip with room to spare; no horizontal overflow at top or bottom of page; h1, primary CTA and a trust chip all inside the first viewport; sticky call bar in the bottom 140px.
  • Reduced-motion: pulse and stamp killed, zones render settled and static, rest state still reads $1,056.
  • Focus-visible outlines on chips, steppers and fields; era chips drive by keyboard (Enter). Empty submit raises validation on a fresh reload; filled submit confirms in the demo lexicon; the phone pattern is v-flag-valid and rejects junk.
  • Chanel rule: removed one of the two roof corrugation detail lines — one reads as texture, two read as clutter.
  • Final sweep: 92/92 harness asserts green, zero console errors on both pages.

← Back to the site · Collection index