Generative Assets · Industry demo guide

How Redgate Plant Hire was built

Redgate Plant Hire is a fictional Kenwick dry-hire yard — excavators, skid steers, a mini loader with a trencher pack — built as a conversion demonstration: one landing page whose single job is a booking enquiry with the machine and dates already chosen. The audience is an owner-builder or landscaper on a phone; the design's audience is the yard owner who should think "that could be my site". View the site.

Palette — argued from the yard at 6:45 a.m.

Light industrial, steel and machine orange. The ground is yard concrete, the ink is gunmetal, and the orange is spent exactly where a hire yard spends it — on the machines and on the things you're meant to touch. Drafting blue does the annotating, the way a spec sheet would.

Yard concrete#F0F1F3 page ground
Gunmetal ink#25282C body text — 13.2:1
Machine orange#D96F1F livery, CTAs, marks — never small text
Drafting blue#4C6E8F dimension lines, links (as text, darkened to #3A576F)

The ink/line split rule applies: orange and blue draw lines and marks; body copy always sits in gunmetal (13.2:1 on the concrete), and the blue used for link text is the darker #3A576F variant at 6.0:1.

Type — the board at the yard gate

Anton carries the display: it's the block-caps face of rate boards and machine decals, so the day rate gets set huge in it — $290 / DAY — exactly like the sign you'd read from the ute. Work Sans does the working text: legible, plain-spoken, comfortable at 16.5px body size with tabular numerals wherever money lines up.

Signature — the Hire Ledger & Yard Row

Three machine chips select a procedurally drawn SVG side elevation — every machine is paths and primitives, no raster anywhere — annotated with drafting-blue dimension callouts (dig depth, overall width, operating weight) that draw themselves in like a pen on film: each line's getTotalLength() seeds a dash offset animated to zero, with labels and arrowheads fading in after their line lands. The draw is dual-speed — full entrance choreography on first paint, ~500 ms snappy on every subsequent machine swap — and each render captures a token that the animation frames check, bumped in the chip handler before the state swap, so a rapid string of chip taps can never leave a stale draw writing onto the wrong machine.

Beside it, the ledger prices the hire live: a 1–7 day stepper with the 3+ day tier applying from exactly day three, a $35-per-charged-day damage waiver toggled on by default (with the honest alternative — your insurer's certificate of currency — on the card), and delivery chips at the flat $95-each-way metro rate. A week is 7 days' possession charged as 5, stated on the board. The $500 bond is itemised as its own $0-impact line because it's a pre-authorisation, not a charge; fuel carries an at-cost declaration wherever the total appears; and attachments print no number at all — they're quoted with the machine, and pretending otherwise would be the dishonest choice. The excavator's boom cycles a slow dig arc via rAF (paused when the tab hides, absent under reduced motion, where the dims render pre-drawn and settled).

The chosen machine, duration and delivery pre-fill the booking form, so the demo interaction becomes a warmer enquiry — and the form's own machine and days fields drive the ledger right back.

The rates the ledger runs on

All dry hire, GST inclusive, argued from the Perth market. The estimator's cheapest output for each machine equals the services grid's "from" floor.

MachineDay rate3+ days (from day 3)Week (7 days, 5 charged)
1.7 t excavator$290$260$1,300
Skid steer$270$240$1,200
Mini loader + trencher pack$230$205$1,025
LineTreatment
Damage waiver$35 per charged day (a week = 5 × $35), or insurer's certificate
Metro delivery$95 each way, flat — both ways $190
Bond$500 pre-authorisation — excluded from the total, shown as a $0 line
FuelReturned full, or refuelled at cost — declaration beside every total
Augers & breakersNo number — quoted with the machine (availability varies by week)

Worked rest state, measured from the running page: excavator × 2 days ($580) + waiver 2 × $35 ($70) + delivery both ways ($190) = $840 + fuel at cost, bond shown and excluded. The tier boundary was driven on both sides: 2 days holds the day rate ($580 hire), 3 days books at $260 ($780 hire, $1,075 total with waiver and delivery); the week lands at $1,665; waiver off at the rest scenario reads $770.

Conversion decisions

Local SEO we'd implement for the real business

The demo page ships only WebPage schema naming it a demonstration — fictional structured data in a real index would be dishonest markup. For a real yard we'd ship LocalBusiness markup like this, populated from their actual details and live reviews feed:

{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Redgate Plant Hire",
  "description": "Dry-hire excavators, skid steers and attachments —
    Kenwick yard, Perth metro delivery.",
  "telephone": "+61-8-XXXX-XXXX",
  "url": "https://example-real-domain.com.au",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "(real street address)",
    "addressLocality": "Kenwick",
    "addressRegion": "WA",
    "postalCode": "6107",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -32.03, "longitude": 115.97 },
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "06:30", "closes": "16:30" },
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday", "opens": "07:00", "closes": "12:00" }
  ],
  "priceRange": "$230–$290 per day",
  "areaServed": { "@type": "City", "name": "Perth" },
  "makesOffer": [
    { "@type": "Offer",
      "itemOffered": { "@type": "Service", "name": "1.7 t excavator dry hire" },
      "priceSpecification": { "@type": "UnitPriceSpecification",
        "price": 290, "priceCurrency": "AUD", "unitText": "day" } }
  ],
  "aggregateRating": { "@type": "AggregateRating",
    "ratingValue": "4.9", "reviewCount": "87" }
}

Why the parent type: schema.org has no equipment-rental subtype of LocalBusiness — the Store branch's closest members don't describe dry hire — so the honest, correct pick is the top-level LocalBusiness itself rather than shoehorning a wrong subtype. Rating and offer values above are placeholders; on the real build they come from the client's review platform and rate card.

What changes for the real client

Their fleet photos can replace or sit beside the procedural elevations (though the drawings make a genuinely good spec-sheet aesthetic); the availability strip stops being demo copy and reads from their hire-management system — Point of Rental, MCS-rm, Baseplan or HireHop all expose the yard sheet — and the booking form posts into the same system's reservation API with an SMS confirmation. Reviews feed from Google Business Profile. Rates become their rate card, delivery pricing gets their float zones, and Xero picks up the invoicing. The ledger logic itself ships as-is: it's their pricing, just honest and on the page.

Iteration log

Pass 1 — Craft

  • The headless-Chrome screenshot (the thumbnail pipeline's ground truth) rendered the sticky header's backdrop-filter layer black — computed styles were correct, so this was the compositor, not the CSS. Dropped the blur for a near-opaque concrete background; the header no longer depends on an effect the capture path can't composite.
  • Weight and width callout labels collided with machine bodies on all three elevations (the skid steer's "operating weight" ran into the ROPS). Re-anchored every leader, split long labels into a short line plus a sub-line, and re-checked each at 2× zoom.
  • The rotated depth labels ran out of the viewBox: text-anchor="end" with rotate(-90) runs the glyph run downward, so "2.4 M DIG DEPTH" clipped to "EPTH". Re-anchored to start so vertical dims read upward, drafting-style.
  • Cropped the empty 128 units off the top of the figure viewBox and let it flex to the ledger column's height; trimmed the mobile hero rhythm after the 375×667 probe put the trust chips 12px below the fold.

Pass 2 — Depth

  • The total now ticks — a 380 ms scale-and-colour pulse whenever the figure changes — and the "out this weekend" availability dot breathes on a 2.8 s cycle with a 0.55 opacity floor, so the strip reads alive at any capture instant.
  • Second read: a magpie lands on the excavator's blade 2.4 s after the dimension lines settle. Every machine carries its own fleet decal and hour-meter reading.
  • Straightened the excavator's boom knuckle (the first curve read blobby at full size) and re-posed the dig-arc dashes to land on the depth dimension.

Pass 3 — Hardening

  • 168-assert headless harness, all green, zero console errors: an independently reimplemented pricing oracle swept 60 combinations (3 machines × 1/2/3/6/7 days × waiver on/off × pickup/delivery), asserting both the state probe and the rendered DOM total for each — 120 checks; every binding worked figure measured exact — $840 rest, $1,075 at the 3-day boundary (with the tier note asserted visible at 3 and hidden at 2), $1,665 week, $770 waiver-off, $610 skid weekend.
  • Rapid-fire drive, twice: a dozen control clicks dispatched in one evaluate with no settle between — the token-invalidated dimension draw survives both rounds and the ledger lands consistent.
  • Confirmation panel probed on the element itself: hidden on load, still hidden after an empty submit (which raises native validation), visible only after a valid filled submit. Reduced-motion path verified: boom static across 1.2 s, dimension lines pre-drawn, ledger settled immediately.
  • 375px probes: scrollWidth clean on both pages, masthead wordmark measured clear of the call pill, sticky bar's tel target in the bottom 140px at ≥48px tall, h1 + CTA + trust signal inside the first 667px. Reserved-phone sweep: every (08) 9xxx occurrence uses the 9000 exchange.
  • Composed the fold for the 1200×750 thumbnail: pinned the figure to the top of its flex box (preserveAspectRatio="xMidYMin") so the annotated excavator sits inside the capture, not below it. One ornament removed (Chanel rule): the soil hatch ticks along the ground line — noise at thumbnail scale.