Generative Assets · site 250 · how it was made

Sandgroper Reticulation — build guide

A conversion-first landing page for a fictional Canning Vale reticulation contractor: retic repairs, new systems, Wi-Fi controllers and bore pumps for lawns grown on Perth sand. The audience is a homeowner whose lawn browns off every February; the page's single job is to book a repair or start an install estimate. Everything on the page is procedural — SVG, gradients and CSS; no raster images.

The concept

Perth is the only Australian capital where "reticulation" is the everyday word for a sprinkler system, and the trade lives by rules nobody else has: two watering days on mains, three on a bore, sprinklers off from June to August. The demo leans into that — the signature Zone Planner prices the job and quotes the real Water Corporation roster, because a retic firm that programs your legal days into the controller before leaving is selling exactly the trust this page needs to convert. Mood: a suburban front yard at 6am on a watering day — arcs catching low sun, nothing tropical about it.

Palette — argued from the 6am yard

#F3F1E7 · dawn lawnground — dry-season grass catching first light
#2F5D3A · reticulation greenstructure and primary ink — the healthy stripe where the arc lands
#4FA3C4 · spray blueLINE/MARK only — arcs, pipe runs, CTA fills. Never body text on dawn
#A65E33 · bore ironsecondary — the iron stain on every bore-watered fence: chips, focus rings
#2B3227 · body inkderived — spray blue and bore iron both fail 4.5:1 as small text, so copy gets its own dark ink
#8A4A22 · iron inkderived link ink — bore iron darkened until it clears contrast on dawn

The ink/line split from the collection's playbook: spray blue and bore iron are marks, never copy. Buttons in spray blue carry near-black blue text (#0E2B36) at ~5:1.

Type

The signature: the Zone Planner

A procedural SVG top-down yard — house, garage, driveway, front and back lawns, beds, verge, footpath and road — with four zone chips, a job selector (repair / new system / controller upgrade / bore pump), and a mains/bore source toggle. Selected zones light up: pop-up heads appear with a "wet stripe" beneath them and three concentric dashed spray arcs whose stroke-dashoffset animates continuously, so the water reads as flowing droplets. Dashed lateral pipe runs trace from the controller on the garage wall to each live zone. The plan card prices the scenario in mono and states the real watering roster for the chosen source — two days on mains, three on a bore, winter switch-off 1 June – 31 August, Water Corporation 13 13 75 — genuinely correct advice, stated plainly.

Two SVG rules from the collection's learnings shaped the implementation: position and orientation live on outer <g transform> attributes while CSS animates only inner elements (a stylesheet rule silently discards any presentation attribute it touches), and zone visibility toggles by class, never the .hidden IDL property SVG elements don't have. The arc loop is phased for the 7-second thumbnail settle: opacity oscillates between 0.55 and 1.0 and never reaches zero, so the arcs are visibly mid-spray at any capture instant — verified against a real t=7s screenshot. Reduced motion renders the arcs settled, complete and static.

The pricing model (source of truth)

Pinned anchors from the spec are binding; the model's shape is documented here so QA has one source of truth.

JobModelOutput
Repair visitflat callout — first half-hour + parts at costfrom $120
New systemzones × $480 + $340 Wi-Fi controllerfrom $820 (1 zone) – $2,260 (4 zones)
Controller upgradeflat, any zone countfrom $340
Bore pumpflat supply + fit, sized after draw-down testfrom $1,850

Conversion decisions

Local SEO we'd implement for the real business

This demo page deliberately carries no LocalBusiness/Review structured data — fictional data in a real index is dishonest markup, so the live page emits only WebPage schema naming it a demonstration. For a real client we would ship:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Sandgroper Reticulation",
  "telephone": "+61-8-XXXX-XXXX",
  "url": "https://sandgroperretic.com.au",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Canning Vale",
    "addressRegion": "WA",
    "postalCode": "6155",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -32.058, "longitude": 115.918 },
  "areaServed": ["Canning Vale","Willetton","Thornlie","Harrisdale",
                 "Piara Waters","Southern River","Gosnells","Leeming"],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "07:00", "closes": "16:00" },
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday", "opens": "08:00", "closes": "12: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 review feed, never hand-written."
  }]
}
</script>

What would change for the real client

Techniques

Iteration log

Pass 1 — Craft

Drove everything on a fresh load with a headless harness: empty submit (4 validation errors + aria-invalid, confirmation stays hidden), filled submit (lexicon confirmation renders), every zone chip, job chip and source segment asserted against an independently reimplemented oracle (rest $2,260; 2 zones $1,300; repair $120 = services floor; controller $340; bore $1,850 with auto-source switch), planner→form handoff, sticky bar geometry at 375px, FAQ — 46/46. The real screenshots then caught what the asserts couldn't: the header phone chip wrapped to two ugly lines at 375px (fixed with nowrap + a compact ≤600px size), the beds pipe run routed straight through the house footprint (rerouted along the front bed strip), and a dead CSS selector left over from an earlier pipe approach (deleted).

Pass 2 — Depth

Added the second-read detail: a soft "wet stripe" ellipse under each running head — the palette's own argument (the healthy stripe where the arc lands) drawn into the yard — plus a slow breathing pulse on the head rings. Re-ran the full suite (46/46) and re-screenshotted the t=7s thumbnail frame: arcs visibly mid-spray in all four zones, wet stripes and pipe runs reading clearly at 1200×750.

Pass 3 — Hardening

Chanel rule: removed the dawn-light gradient overlay — imperceptible in every screenshot, pure dead weight. Added keyboard drives to the harness: Enter/Space on zone and job chips update the model, Enter opens the FAQ, focus rings visible on chips — native buttons meant the keyboard path came free, and now it's asserted. Reduced-motion run shows zero animations with arcs settled and complete; full-page 375px read-through of copy; final suite 50/50 with zero console errors, and the guide's numbers re-checked against the shipped code before commit.

Designed & built by Sapience Analytics — part of the Generative Assets collection. Sandgroper Reticulation is a fictional business; watering rosters and suburbs are real, everything else is demonstration copy.