AMPLINE · GUIDE

Build guide · Industry demo

How the Ampline EV Charging demo was built

A fictional Joondalup electrical contractor installing home EV chargers, built as a conversion-first landing page. The audience is a new EV owner tired of public charging queues; the page's single job is a booked install with the charger, cable run and switchboard work already priced.

Concept

The wave's second dark site: the driveway at 11pm, charge light on. Everything on the page argues from that scene — night-graphite ground, headlight-white ink, a single charge-amber accent that always means energy, and circuit-silver linework for the house, cable and dimensions. The signature is the Charge Fit: a side-profile SVG night scene where the charger, cable route, switchboard and solar choices redraw the install — and price it — in real time.

Palette

#171D24night graphite — page ground; the driveway at 11pm
#EAEFF4headlight white — body ink; measured 14.7:1 on graphite
#E39A2Echarge amber — pulses, marks, CTA fill; 7.2:1 on graphite, and graphite labels on amber also 7.2:1
#8FA0AFcircuit silver — house/cable linework and dimension callouts; lines and marks only
#B7C3CEminted muted ink — secondary copy; measured 9.5:1 on graphite

The spec's contrast figures were hypotheses (W32/W33): measured by WCAG arithmetic during Pass 1, the amber came in at 7.2:1 on the night ground (spec guessed ≈7 — held) and 7.2:1 as a CTA fill under graphite labels (spec guessed ≈8 — still comfortably past 4.5:1, recorded honestly). Body white measured 14.7:1 (spec ≈14). No remedy tokens needed on the dark ground; the silver stays lines-and-marks per spec, with #B7C3CE minted for muted body copy.

Type

Chakra Petch 600–700 for display — a squared engineering face whose dash-cluster corners read like conduit fittings and switchboard labels; it carries the wordmark, prices, and the sky-set display moment "FORTY KILOMETRES OF RANGE, EVERY HOUR." IBM Plex Sans is the workhorse: legible at 16–17px on the dark ground, technical without being cold. Typographic bravery is spent once — the charge-rate line set huge across the night sky inside the SVG scene, swapping honestly when the 22 kW chip is picked ("UP TO 120 KM AN HOUR — IF YOUR CAR KEEPS UP.").

The Charge Fit — how it works

The scene is one hand-built SVG (780×470): house, pitched roof, lit window, garage, EV side-profile, moon and stars — every visual procedural, no raster. The cable route is a single <path> built from the state: switchboard → up the wall → along the eaves → down to the charger, with the charge lead running on to the car's port. Extra metres insert a switchback detour on the garage wall whose width grows per metre, with one amber tick per metre placed by getPointAtLength — so "+8 m" is literally eight ticks of extra conduit on the drawing. Amber energy pulses travel the full route on a rAF loop (five pulses, positions sampled from the live path each frame so a mid-animation chip swap can never index a stale path — the W25 token race designed out structurally). Pulse opacity floors at 0.55, so the signature is visibly alive at any thumbnail capture instant. The rAF delta is clamped at zero and capped (W29). The switchboard toggle swings the board door open and lights the RCBO bay; the solar toggle draws roof panels and runs lighter "day-glow" pulses down a dashed feed line. The price badge sits on the charger unit itself — the estimate is part of the scene, not a ledger below the fold — and drops its subtitle below 560px so it never covers the drawing at 375 (W34).

Redraws are dual-speed (W21): the first render dash-draws the cable route over 1.2s as the entrance; every later state change swaps the path instantly and re-settles within ~520ms, tracked by a settled flag on the window.__evcharging probe. Reduced motion skips the entrance, parks the pulses at a mid-run frame at fixed opacity, and never starts the loop. The header, sticky bar and cards are all solid fills — no backdrop-filter anywhere near conversion chrome (W28).

Honest pricing model

LineAnchorBehaviour
7 kW single-phase charger$1,890supplied + installed; the grid floor
22 kW three-phase charger$2,790NOTE with the chip: "three-phase homes only — we confirm at the site check" — a note, never a disable
Extra cable run$38/mstepper 0–20 m beyond the included 5 m; flat at either charger (stated on-card); max-run NOTE at 20 m
Switchboard upgrade$650flat at either charger (stated on-card)
Solar diversion module$390flat at either charger (stated on-card)
BYO charger installfrom $820services grid only — never an estimator output
Strata & apartment installsprice-less"quoted after the strata walk-through" — a designed state, not missing data (W25)

All five worked examples from the spec were driven through the running page and matched an independently reimplemented oracle exactly: rest $1,890 · 7 kW +8 m + switchboard $2,844 · 22 kW + solar $3,180 · 7 kW +20 m $2,650 (max-run note at 20, absent at 19) · 22 kW +12 m + both options $4,286. The cheapest estimator output ($1,890) equals the services grid floor. The 22 kW readout ships the honest hedge verbatim: many cars cap AC charging at 7–11 kW, and the page says so rather than selling speed the car can't take. Totals display to the whole dollar; every anchor is integer-safe by construction.

Conversion decisions

Local SEO we'd implement for the real business

This demo page deliberately ships only WebPage/CreativeWork/BreadcrumbList structured data — fictional business schema in a real index would be dishonest markup. For a real client, we'd ship Electrician — the exact schema.org organization subtype for the trade, not a generic LocalBusiness — with real NAP, service area, offers and a genuine review feed:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Electrician",
  "name": "Ampline EV Charging",
  "url": "https://www.example.com.au",
  "telephone": "+61-8-XXXX-XXXX",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Joondalup",
    "addressRegion": "WA",
    "postalCode": "6027",
    "addressCountry": "AU"
  },
  "areaServed": { "@type": "City", "name": "Perth" },
  "openingHoursSpecification": {
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
    "opens": "07:00", "closes": "17:00"
  },
  "makesOffer": [
    { "@type": "Offer", "name": "7 kW home EV charger — supplied and installed",
      "priceSpecification": { "@type": "PriceSpecification", "price": 1890, "priceCurrency": "AUD" } },
    { "@type": "Offer", "name": "22 kW three-phase EV charger — supplied and installed",
      "priceSpecification": { "@type": "PriceSpecification", "price": 2790, "priceCurrency": "AUD" } }
  ],
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "87" },
  "review": {
    "@type": "Review",
    "author": { "@type": "Person", "name": "Real Customer" },
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "reviewBody": "Pulled from the client's actual Google Business Profile feed."
  }
}
</script>

Alongside it: a Google Business Profile wired to the booking flow, suburb-level service pages for the northern corridor, and review schema fed from real jobs — never typed in by hand.

What would change for the real client

Iteration log

Pass 1 — Craft

Measured every contrast hypothesis from the shipped tokens: amber on graphite 7.24:1, graphite on amber 7.24:1, white 14.71:1, muted ink 9.49:1, silver callouts 6.3:1 on the sky — all clear of 4.5:1, figures recorded above (the spec's ≈8 for the CTA fill measured 7.2 and is reported as measured). Tightened the ledger's row rhythm, gave option rows their own reveal, aligned the stepper column, and rewrote the services blurbs to trade language ("so the charger and the oven never argue"). Consistent 12–14px radii across chips, toggles and cards.

Pass 2 — Depth

Enriched the scene: metre ticks placed along the actual switchback path rather than evenly spaced marks, the +N m callout tracking the detour's left edge, the switchboard door physically swinging (skew + translate) instead of vanishing, and the 22 kW chip swapping the sky headline as well as the readout. Second-read details: the cat on the garage ridge whose eyes blink every nine seconds, the AMP·334 plate, and the charge-port LED breathing in the same 2.4s rhythm as the charger's. Handoff button focuses the name field after the scroll lands.

Pass 3 — Hardening

Drove every control and all five worked examples against an independently reimplemented oracle (all exact, 72/72 harness asserts); empty submit raises validation with the panel hidden, filled submit reveals it; rapid-fire drive (chip→stepper→toggle→chip in one evaluate, twice over) survived with no console errors — pulses sample the live path each frame, so there is no stale-closure surface. The native-resolution screenshot review earned its keep with three real catches: the "RCBO bay" label collided with the swung-open board door at the max-options state (moved to the right of the board with its own leader line); a CSS ordering bug left the header's mobile "Call" label permanently hidden (the base display:none sat after the media query and won — reordered); and the scene callouts were sub-legible at 375, so they gain a font-size bump below 560px. Masthead checked first at 375: the wordmark's right edge clears the call link by 18px; the badge's subtitle drops below 560px so it never covers the drawing (W34). Reduced-motion parks the pulses at a visible mid-run frame; rAF pauses on hidden tabs. Chanel rule: flattened the dead-black lawn band under the house to a quieter two-tone ground instead of adding the planned fence detail.

Techniques

← Back to Ampline EV Charging · Generative Assets index