← Back to the Steelyard demo Index

Build guide · site 356 · Wave 40, Industry Demos XXIX

How the Steelyard Training demo was built

A fictional forklift and high-risk work licence trainer in a Welshpool yard — LF counterbalance, LO order picker and WP boom EWP courses, new operators and experienced-operator assessment prep, on-site group training across the Perth industrial belt. The page has one job: a course booking request with the class, the experience level, the trainees and the venue already priced.

Concept

The audience is the warehouse casual who needs the LF ticket to go permanent, the operator whose licence lapsed while working east, and the ops manager standing up four crew on one course without losing a day of dispatch. Licence training is priced per person by class and experience, so the page lets the buyer set the whole booking before ringing — and it makes the trade's three commercial facts visible: the WorkSafe assessment happens on course day, the WorkSafe licence application fee is set by WorkSafe and paid direct (an at-cost declaration, never a number), and on-site training bills a four-seat minimum because the trainer, gear and paperwork travel the same for two as for four.

The direction is the training yard at 7am — gunmetal slab under sodium lights, chalk line-marking, powder-blue pallet racking, a safety-yellow machine. The signature is the Licence Yard — a drawn SVG yard where the course chip changes the machine AND the work: LF draws a counterbalance forklift lifting a pallet to the second rack beam and lowering it on a slow loop; LO draws an order picker riding its platform up the racking face, operator harnessed; WP swaps the racking for a light tower and articulates a knuckle boom up to it, with a ≥ 11 m dimension line drawn beside the tower. The experience chip redraws a schedule card clipped near the fence (three-day strip "learn / practise / assess" or a one-day "brush up + assess"); the trainees stepper (1–8, all eight drawable, so the drawn count is always honest) lines hi-vis figures along the chalk; the venue chip swaps the Steelyard gate and fence for a client warehouse wall with a "YOUR SITE" A-frame; eLearning leans a glowing tablet on a cone; a Saturday intake pins a SAT tag to the schedule card. The assessor stands watching with a clipboard — and the price badge IS his clipboard sheet.

Palette — computed, then measured

Every ratio below was computed with WCAG relative-luminance arithmetic from the shipped hex tokens (the spec computed the same figures at authoring time; they matched to the decimal). Safety yellow carries dark labels, never white — gunmetal on yellow is 9.93:1 and stays 7.70:1 on the pressed/hover fill. Racking blue measures 4.33:1 on the ground, so it draws lines and marks only; anything blue that is read uses the pre-minted blue-ink.

#1D2126
GunmetalPage ground — the swept slab. Also the label colour ON every yellow button.on yellow 9.93:1 · on hover yellow 7.70:1
#262B31
Card gunmetalCards, chips, form fields.chalk on it 11.53:1
#E9E7E1
ChalkBody ink, headings, the drawn chalk lanes.13.09:1 on the ground
#AEB6BF
Soft chalkSecondary copy, ledger, hints, footer.7.89:1 on the ground · 6.96:1 on cards
#F5C518
Safety yellowCTAs (dark labels), selected chips, the forklift, trust figures, ledger totals.as copy on the ground 9.93:1 · on cards 8.75:1
#DBAD0F
Worn yellowButton hover/pressed fill.dark labels 7.70:1 — computed, not guessed
#5E88B0
Racking blueRack beams, chip outlines, dimension lines, rules. Lines and marks only.4.33:1 on the ground — never small text
#8FB3D4
Blue inkEyebrows, links, unit-code small caps, the ≥ 11 m label.7.37:1 on the ground · 6.50:1 on cards
#F0A48A
Note orangeBilled-minimum and crew notes, disabled-toggle reasons.8.00:1 on the ground
#9CD3A8
Declaration greenIncluded lines and the WorkSafe at-cost declaration.9.48:1 on the ground · 8.35:1 on cards

Type

Two seats, three days, one ticket each

Archivo Black for the wordmark, headings, the display line, the badge price and the drawn STEELYARD gate sign — a slab-fisted grotesque that reads like stencilled plant signage. The display moment re-words itself with the controls: Eight seats, one day, one ticket each · One seat, three days, one ticket.

IBM Plex Sans 400 / 600 / 700

IBM Plex Sans for everything read — an engineering-bred workhorse whose tabular clarity keeps unit codes like TLILIC0003 and dollar figures unambiguous on a dark ground. Body 17px on mobile, 18px from 760px. Tracking only on the uppercase eyebrows and badge label.

Techniques

Signature implementation

State is one object — course, experience, trainees, venue, two toggles — and compute() is a pure function over it: rate = the course × experience cell; billed seats = max(4, n) on your site, else n; course line = billed × rate; +$350 flat venue & travel on your site; eLearning = $30 × the ACTUAL count everywhere; Saturday = $40 × the ACTUAL count, live at our yard only. render() writes the result to every surface in one pass: the display line, the badge, the ledger, the plain-text mirror list, the control states (weekend disabled on your site with the on-card reason "on your site we run to your roster — weekends at no extra") and the scene. Restore is by memory: state.weekend is never overwritten by the venue chip, so your-site → our-yard restores the prior Saturday choice exactly (the pinned W36 semantic). Every handler bumps a scene token before touching state and the machine layer is rebuilt synchronously in the same pass, so a rapid-fire run of clicks can never leave a stale animation closure alive; the settle timer publishes window.__forklift.settled only for the latest token. Dual-speed redraw: 60 ms per trainee (900 ms cap) on first draw, 16 ms (380 ms cap) after.

Pricing model (pinned anchors)

CourseUnit of competencyNew operator (3 days)Experienced (1 day)
LF — counterbalance forkliftTLILIC0003$560$380
LO — order-picking forkliftTLILIC0004$540$360
WP — boom EWP (≥ 11 m)TLILIC0005$620$420
Rule / add-onAmountApplies
Included in every coursetraining, the WorkSafe assessment on the day, logbook and PPE loan — declared on-card
WorkSafe licence application feeno numberset by WorkSafe, paid direct to them at cost; we help you lodge — the declaration prints on badge, ledger AND a11y mirror wherever the total prints (short badge form ≤ 640px: "WorkSafe licence fee — paid direct, at cost")
Our Welshpool yardincludedmachines, racking and loads included — declared on-card; no minimum (floor is 1)
Your site+$350 flatvenue & travel per booking, never multiplies — AND a four-seat minimum BILLED ON THE COURSE LINE ONLY: under 4 trainees the course line bills 4 × rate with the note "billed at the four-seat on-site minimum — the trainer, gear and paperwork travel the same for two as for four" (short: "billed at the four-seat on-site minimum"); at 4 exactly, no note
eLearning refresher pack+$30 pp× ACTUAL trainees — live at every combination
Saturday intake+$40 pp× ACTUAL trainees, our yard only; DISABLED on your site with reason "on your site we run to your roster — weekends at no extra"; venue chip back to our yard RESTORES the prior choice
Six or more traineesnote only"six or more — ask about a dedicated course rate for your crew" (short: "six or more — ask about a crew rate"); present at 6, absent at 5, both venues
VOC, refresher-only, dogging/rigging referralsno number"quoted" — designed price-less lines in the grid and FAQ

Which count each line multiplies (no ambiguous cell): course line — the BILLED count; eLearning — ACTUAL; Saturday — ACTUAL; venue fee — flat. Totals are integer by construction and display to the whole dollar. The estimator's cheapest outputs equal the grid floors: LO experienced $360 · LF $380 · WP $420 · new-operator courses from $540 · on-site group bookings from $1,790 (LO experienced billed minimum, 4 × 360 + 350).

The mid-width and short note forms above are derived, not spec-pinned: the wave preamble pins the width bands (full template ≥ 641px including the 900–1100 band, short ≤ 640px) but this concept pinned only the full templates, so the short forms were written here and are documented as the builder's derivation. The ledger and mirror always carry the full template.

Worked examples — measured from the running page against an independent oracle

The harness reimplements the whole model from the spec's anchors in separate code, sets the FULL control vector for every scenario, and asserts the page's probe, badge, ledger and mirror against it — 157 asserts, all green.

Scenario (full control vector set explicitly)SpecMeasuredAlso asserted
Rest: LF · new · 2 · our yard · both toggles off$1,120$1,120display "TWO SEATS, THREE DAYS, ONE TICKET EACH"; no notes on any surface; WorkSafe at-cost declaration on badge, ledger and mirror; badge and stage inside the first 750px at 1200
Rest + Saturday / rest + eLearning$1,200 / $1,180$1,200 / $1,180SAT tag drawn; tablet glows on the cone
Your site · LF new · 2$2,590$2,590course bills 4 × $560; billed-minimum note on three surfaces; tag "2 drawn · 4 billed"
… + eLearning$2,650$2,650eLearning multiplies the ACTUAL 2 — asserted ≠ $2,710
Your site · 3 / 4 trainees$2,590 / $2,590$2,590 / $2,590same figure, note flips: present at 3, ABSENT at 4 — both asserted
Saturday ON at yard → your site → back$1,200 → $1,120 → $1,200samedisabled with reason on your site, memory kept, RESTORED on return
LO exp 1 yard / LF exp 2 / LO new 2 / WP new 2$360 / $760 / $1,080 / $1,240same$360 is the grid floor
WP new 6 yard / 5 yard$3,720 / $3,100$3,720 / $3,100crew note present at 6 on three surfaces, absent at 5
WP exp 8 · your site · eLearning$3,950$3,9508 × 420 + 350 + 240; crew note present, billed-minimum note absent (8 ≥ 4)
Floors: LF exp 1 / WP exp 1 / LO new 1 / site LO exp 1$380 / $420 / $540 / $1,790sameeach equals its services-grid "from" figure

Conversion decisions

Local SEO we'd implement for the real business

The live page carries only WebPage + BreadcrumbList JSON-LD naming it a demonstration — fictional business data in a real search index would be dishonest markup. For the real Steelyard we would ship an EducationalOrganization entity — an RTO is an educational organisation, and schema.org has no trade-training-centre subtype, so the organisation type carries the NAP, hours, geo and reviews — plus a Course item per licence class:

{
  "@context": "https://schema.org",
  "@type": "EducationalOrganization",
  "@id": "https://steelyardtraining.example/#rto",
  "name": "Steelyard Training",
  "image": "https://steelyardtraining.example/yard.jpg",
  "url": "https://steelyardtraining.example/",
  "telephone": "+61 8 9000 0356",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Welshpool",
    "addressRegion": "WA",
    "postalCode": "6106",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -31.993, "longitude": 115.947 },
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "07:00", "closes": "16:00" }
  ],
  "areaServed": ["Perth","Welshpool","Kewdale","Forrestfield","Canning Vale","Bibra Lake","Malaga","Wangara"],
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "184" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "J. — warehouse hand, Cannington" },
      "reviewRating": { "@type": "Rating", "ratingValue": "5" },
      "reviewBody": "Three days at the yard, assessed Thursday, licence lodged Friday — permanent the week after."
    }
  ]
}

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "LF Forklift Licence (TLILIC0003)",
  "description": "Three-day new-operator forklift licence course with the WorkSafe assessment on the final day.",
  "provider": { "@id": "https://steelyardtraining.example/#rto" },
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "Onsite",
    "location": { "@type": "Place", "name": "Steelyard Training yard, Welshpool" }
  },
  "offers": { "@type": "Offer", "price": "560", "priceCurrency": "AUD" }
}

Alongside the markup: a Google Business Profile with the same NAP and hours, per-class landing sections with the unit codes in headings (buyers search "TLILIC0003 Perth"), a reviews feed synced from Google, and location copy naming the industrial estates the on-site work actually goes to.

What would change for the real client

Iteration log

Pass 1 — Craft

  • Measured every palette pair from the shipped tokens (table above) — all matched the spec's computed figures; the two minted secondary tokens (note orange 8.00:1, declaration green 9.48:1) both clear the floor with margin, and every yellow surface carries dark labels.
  • Screenshot review at 1200 found the assessor's sheet covering the trainees and the assessor himself — the whole crew was drawn under the badge. Recomposed the scene: trainees and assessor moved to the right half of the slab, the badge owns the left, and the tall layout mirrors the entire yard (racking left, machines flipped) so the mobile badge owns the top-right sky instead.
  • The worst-state badge (your-site + billed-minimum note) overflowed the stage bottom by 22px at 1200 and by more at 1000 — widened the badge to 29%, raised it to 23%, moved the schedule card up to clear it, and gave the 641–1099px band a bottom-left variant with the full templates the wave pins for that band.
  • The tall gate sign ran under the mobile badge ("WELSHPOOL" clipped) — moved left. Copy read across grid, FAQ, fee note and ledger so every price and rule appears identically everywhere.

Pass 2 — Depth

  • The LF's pallet was lowering NEXT to the racking, not into it — the fork reach ended at the first upright. Moved the machine into the bay line (and mirrored the same fix in the tall layout) so the pallet now lands visibly on the second beam, which is the whole point of the drawing.
  • The WP boom folded flat at its cycle's rest point, and its ≥ 11 m label sat where the elbow swept — gave the pose a 35% raised floor (the machine loop never stops and never folds) and pinned the label above the sweep.
  • Six trainees in front of the WP chassis merged into one yellow mass — deepened the chassis fill two steps so the hi-vis vests read against it, and widened the crew spacing.
  • Second-read details: the sodium lamp glows breathe (floor 0.55), the LO operator's harness lanyard is drawn to the rail, the your-site backdrop gets a DOCK 3 roller door, the eLearning tablet's screen glow pulses, and the schedule card's third day tag is the yellow ASSESS.

Pass 3 — Hardening

  • 375px: masthead measured (wordmark right 216 vs call button left 300, icon-only number), scrollWidth 375, zero unwrapped overflow offenders, sticky Call/Book bar present, h1 + CTA + trust chips inside the first viewport, tall layout selected and native-res screenshots reviewed per course.
  • Label-collision sweep at native resolution (LF/LO/WP at 375 and 1200, worst states at 1000 and 1200): the count tag collided with the drawn ASSESSOR caption at bottom-right — removed the caption (the clipboard and white hat carry it; the badge is named "Assessor's sheet"), shortened the billed tag form to "2 drawn · 4 billed", and moved the A-frame clear.
  • Reduced motion renders one settled mid-lift frame and the probe settles in 20 ms; the rAF loop pauses on document.hidden; resize re-layouts wide ↔ tall.
  • Form: hard reload → empty submit raises the banner and three field errors with the panel hidden; filled submit shows the panel; keyboard arrows drive the course chips. Rapid-fire drive (eleven dispatched clicks in one evaluate, no settle between) twice over — settled, consistent with the oracle, zero console errors.
  • Removed one ornament (Chanel rule): the second drawn cone in the wide yard — one cone and the tablet carry the lane. Final copy read; harness 157/157 across both pages including the JSON-LD allowlist, reserved-phone sweep and guide table-scroll checks.

This is a demonstration build by Sapience Analytics. Want one pointed at your customers?

Steelyard Training is a fictional business — a forklift and high-risk work licence training industry demonstration designed & built by Sapience Analytics, part of the Generative Assets collection. Back to the site · Index.