← Back to the Vital Signs demo Index

Build guide · site 355 · Wave 39, Industry Demos XXVIII

How the Vital Signs First Aid Training demo was built

A fictional registered training organisation in Belmont — first aid, CPR, childcare first aid, low-voltage rescue and mental health first aid, public sessions in a Belmont training room and on-site courses at Perth workplaces. The page has one job: a booking request with the course, the format and the participants already priced.

Concept

The audience is the office manager who needs eight staff certified before the audit, the childcare director whose team's HLTAID012 lapses in March, the electrical apprentice who needs LVR/CPR for the licence, and the parent who just wants to know what to do. Training is priced per person, so the page lets the buyer count heads and pick a format before ringing — and it makes the two commercial facts of the trade visible: on-site costs the same per person but bills eight seats, and there is no travel fee inside Perth metro. This is the wave's B2B site — light, exact, calm — and the collection's first registered-training-organisation demo.

The direction is the training room with the blinds up: clinical-white ground, navy ink, first-aid-green CTAs, AED-red linework. The signature is the Course Roster — a drawn training room seen from the back. Rows of chairs with CPR manikins on mats follow the participants stepper (drawn cap twelve; the roster tag prints the true count), a trainer kneels at the front doing compressions on a demonstration manikin, a projector screen shows the selected course's unit code in the display face, and the price sits on the sign-in sheet clipboard on the front counter. Course chips change what is on the mats and the screen; format chips swap the Belmont room (whiteboard, runway beyond the window) for a client lunchroom (noticeboard, fridge, kettle); the regional zone puts a wheatbelt horizon in the window; the weekend toggle circles SAT on the calendar; the kits toggle puts a green first-aid kit on every chair.

Palette — measured, not assumed

Every ratio below was computed by WCAG relative-luminance arithmetic from the shipped hex tokens in Pass 1 (the spec's figures were hypotheses; they landed within 0.1 of the measured values). First-aid green #1F7A4D measured 4.91:1 on the ground and 5.32:1 under white labels — clear of the 4.5 floor, so primary buttons keep the argued green and darken to the pre-minted fill #186340 (7.25:1) on hover and for selected chips; every green-coloured word uses the text-ink #155A3A (7.59:1). AED red #D6453A is 4.06:1 on the ground and is used only for lines and marks; red-coloured copy (eyebrows, notes, the badge label) uses #A32A20 (6.66:1).

#F4F6F8
Clinical whitePage ground — a well-lit training room.ground for every ratio below
#1E2A38
NavyBody ink, headings, the trainer's polo, trust strip, demo band.13.43:1 on the ground · white on it 14.55:1
#4B586A
Soft inkSecondary copy, ledger, form fine print, badge subtitle.6.68:1 on the ground · 7.23:1 on white · 6.20:1 on the booking ground
#1F7A4D
First-aid greenPrimary buttons, switch knobs, map dots, the kits on the chairs.white on it 5.32:1 · on the ground 4.91:1
#186340
Green fillButton hover, selected chips.white on it 7.25:1
#155A3A
Green inkLinks, the display line's course, declaration lines, badge declaration.7.59:1 on the ground · 8.22:1 on white · 7.05:1 on the green tint
#D6453A
AED redCompression point, chip outlines, rules, the roster tag's leader, Belmont star.4.06:1 on the ground — lines and marks only
#A32A20
Red inkEyebrows, note lines, the badge label, SAT, roster tag text.6.66:1 on the ground · 7.22:1 on white · 6.11:1 on the red tint

Type

Ten staff, Provide First Aid, in your lunchroom

Outfit 700 for the wordmark, headings, the display line, the badge price and the unit code on the drawn screen — a clean geometric that reads at a distance, the way a unit code on a projector should. The display moment re-words itself with the controls: One person, CPR, in our Belmont room · Twenty staff, low-voltage rescue + CPR, in your lunchroom.

Atkinson Hyperlegible 400 / 700

Atkinson Hyperlegible for everything read — argued because a safety trainer should ship the legibility-first face: body at 17px on mobile and 18px from 760px, chips, ledger, form. Its distinct zero and one keep unit codes like HLTAID011 unambiguous. Weight carries hierarchy; tracking only on the uppercase eyebrows and badge label.

Techniques

Signature implementation

State is one object — course, format, zone, participants, two toggles — and compute() is a pure function over it: billed seats = max(8, n) in on-site mode, else n; course line = billed × rate; +$350 when on-site regional; +$150 weekend only when on-site and the remembered toggle is on; kits = $45 × the ACTUAL count; three note flags (on-site under eight, public at eight or more, exactly twenty). render() writes the result to every surface in one pass: the display line, the badge (price, subtitle, declaration, notes with full and short forms), the ledger, the plain-text mirror list under the scene, the control states (zone fieldset hidden in public mode, weekend disabled with the on-card reason, stepper limits) and the scene (screen code, board, window view, marks, seat cells rebuilt, roster tag). Restore-vs-reset is by memory: state.zone and state.weekend are never overwritten by the format chip, so public → on-site restores both exactly. Every handler bumps a scene token before touching state; the settle timer publishes window.__firstaid.settled only for the latest token, so a rapid-fire run of clicks ends on one definite, settled state. Dual-speed redraw: 40 ms per cell (1.2 s cap) on first draw, 12 ms (480 ms cap) after.

Pricing model (pinned anchors)

CourseUnitPer personLength
CPRHLTAID009$65half a day
Provide First AidHLTAID011$135one day + online pre-work
Childcare first aidHLTAID012$150one day + online pre-work
Low-voltage rescue + CPRUETDRRF004 + HLTAID009$110most of a day
Mental Health First AidMHFA (accredited)$290two days
Rule / add-onAmountApplies
Same rate public or on-sitedeclared on-card; on-site inside Perth metro adds no travel fee (declaration on badge, ledger and mirror)
On-site minimum8 seats billedcourse line only, in on-site mode when participants < 8; NOTE "on-site we come out for eight — under eight we bill eight seats (bring the neighbours)" (short: "billed at eight seats — the on-site minimum"); at 8 exactly no note; kits multiply the ACTUAL count
Public suggestionnote onlypublic × participants ≥ 8: "eight or more — an on-site course costs the same and saves everyone the drive" (short: "eight or more — on-site costs the same"); absent at 7 and in on-site mode
Regional WA travel+$350 flaton-site zone chip; declaration "travel and a night's stay — beyond the Wheatbelt and Peel we quote it" (short: "+$350 travel & a night's stay"); zone chips hidden in public mode and RESTORED on return to on-site
Weekend / after-hours+$150 flatlive on-site; DISABLED in public mode with reason "public courses run on our published calendar — book on-site for a Saturday"; unlock RESTORES the prior choice
Workplace first-aid kit each+$45 × actual participantslive at every combination
Twenty participantsnote only"over twenty we bring a second trainer — ask us to quote the group" (short: "over twenty — second trainer, ask us to quote"); the badge still prints the 20-seat figure
Custom, advanced resuscitation, remote-area, refresher remindersno number"quoted" / "included" — grid, FAQ and fee note

Totals are integer by construction and display to the whole dollar. The estimator's cheapest outputs equal the grid floors: CPR $65, Provide First Aid $135, Childcare $150, LVR + CPR $110, MHFA $290, on-site from $520 (eight seats × CPR).

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

Scenario (full control vector set explicitly)SpecMeasuredAlso asserted
Rest: on-site · Perth metro · Provide First Aid · 10 · kits OFF · weekend OFF$1,350$1,350display "TEN STAFF, PROVIDE FIRST AID, IN YOUR LUNCHROOM"; no notes on any surface; "no travel fee inside Perth metro" on badge, ledger, mirror; screen HLTAID011
Public · CPR · 1$65$65weekend disabled with reason; zone fieldset hidden; grid floor
Public · Provide First Aid · 8 / 7$1,080 / $945$1,080 / $945suggestion note present at 8 on three surfaces, absent at 7
On-site metro · CPR · 5 / 8$520 / $520$520 / $520eight-seat note at 5 (billed 8), absent at 8; roster tag "5 seats · all drawn · 8 billed"
On-site metro · CPR · 5 · kits ON$745$745kits line $225 (5 × $45, never 8 × $45)
On-site regional · Childcare · 12 · kits ON$2,690$2,690regional declaration on three surfaces; wheatbelt window; infants drawn per row
On-site metro · LVR + CPR · 10 · weekend ON$1,250$1,250SAT circled on the calendar; crook and insulated mat drawn
Public · MHFA · 4$1,160$1,160four chairs in a circle, no manikins, standing trainer
Rest + kits$1,800$1,800a kit drawn on every chair
Rest, weekend ON → public → on-site$1,500 → $1,350 → $1,500samepublic: suggestion note present, weekend disabled, memory kept; on-site: weekend RESTORED ON. Zone restore also asserted (regional → public → on-site = $1,700 again)
Rest, participants 20 / 19$2,700 / $2,565$2,700 / $2,565second-trainer note at 20 only; 12 cells drawn, tag "20 seats · 12 drawn"
Floors: on-site CPR 1 / public Childcare 1 / LVR 1 / MHFA 1 / PFA 1$520 / $150 / $110 / $290 / $135sameeach equals its grid floor

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 Vital Signs we would ship an EducationalOrganization entity (an RTO is an educational organisation; schema.org has no LocalBusiness training-centre subtype, so the organisation type carries the NAP, hours and reviews) plus Course items for each unit as a second block:

{
  "@context": "https://schema.org",
  "@type": "EducationalOrganization",
  "@id": "https://vitalsignsfirstaid.example/#rto",
  "name": "Vital Signs First Aid Training",
  "image": "https://vitalsignsfirstaid.example/training-room.jpg",
  "url": "https://vitalsignsfirstaid.example/",
  "telephone": "+61 8 9000 0355",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Belmont",
    "addressRegion": "WA",
    "postalCode": "6104",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -31.955, "longitude": 115.925 },
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "08:00", "closes": "17:00" }
  ],
  "areaServed": ["Perth","Belmont","Cannington","Welshpool","Midland","Joondalup","Fremantle","Rockingham"],
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "212" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "P. — childcare director, Cannington" },
      "reviewRating": { "@type": "Rating", "ratingValue": "5" },
      "reviewBody": "Fourteen educators, one Saturday, our own kindy room — every certificate in my inbox by Monday."
    }
  ]
}

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Provide First Aid (HLTAID011)",
  "description": "One-day nationally recognised first aid course with online pre-work.",
  "provider": { "@id": "https://vitalsignsfirstaid.example/#rto" },
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "Blended",
    "location": { "@type": "Place", "name": "Belmont training room" }
  },
  "offers": { "@type": "Offer", "price": "135", "priceCurrency": "AUD" }
}

Alongside the markup: a Google Business Profile with the same NAP and hours, per-course landing sections with the unit codes in the headings (buyers search the code), a reviews feed synced from Google, and location copy that names the metro suburbs the on-site work actually goes to.

What would change for the real client

Iteration log

Pass 1 — Craft

  • Measured every palette pair (table above). Green cleared 4.5 both ways so buttons keep the base hue with the pre-minted fill on hover/selected; green-ink and red-ink used everywhere the accents become text; AED red demoted to lines and marks.
  • Screenshot review at 1200 found the sign-in sheet badge wrapping to five lines and covering the whole front desk; restructured the badge (label "Sign-in sheet", the course moved into the subtitle), tightened type, widened the badge to 30% and rebuilt the desk as a sign-in counter (x 600–895) so its edges show either side of the clipboard.
  • The screen sub-caption "UNIT OF COMPETENCY · NATIONALLY RECOGNISED" overran the drawn screen; shortened to "NATIONALLY RECOGNISED UNIT" and moved to a fixed line above the red bar. The LVR code now sets on two lines (UETDRRF004 / + HLTAID009) instead of a shrunken single line.
  • Map: the reach ring excluded Joondalup, Fremantle and Rockingham while the copy promised the whole metro — replaced the ring with a caption; the airport block covered Bayswater and its label struck Morley; the river label struck the Belmont label. All moved.
  • Nav "Course Roster" wrapped at 1000px — renamed "Roster"; masthead Book button set nowrap. Copy read across grid, FAQ and fee note so every price and rule appears identically in copy and estimator.

Pass 2 — Depth

  • Enriched the scene per course: the AED trainer moved from the counter to beside the demo manikin with pad leads drawn; the rescue crook stands beside the insulated mat rather than leaning on the counter (where the badge covered it at mid widths); the MHFA trainer now stands (legs, shoes, sway) rather than kneeling at nothing.
  • Second-read details: the runway lights chase and a plane taxis across the Belmont window; the kettle steams on the lunchroom fridge; the compression ring fades outward on each release; the whiteboard carries the DRSABCD sequence.
  • Roster tag rebuilt as a pill; in wide it moved from the bottom-right (where the max-state badge — regional declaration plus the twenty note — hid it) to the top-left of the roster.
  • Micro-interaction: seat cells stagger in on every stepper tap at the snappy speed; the whiteboard/noticeboard, window view and marks swap in the same pass so all surfaces agree instantly.

Pass 3 — Hardening

  • 375px: masthead measured (wordmark right 266 vs call left 318), scrollWidth 375, zero overflow offenders, sticky bar present, tall layout selected. Native-res 375 screenshots at rest, at childcare/regional/20/weekend/kits and at MHFA showed the badge covering the right column of rows 0–1; rebuilt the tall layout — window and board moved to the left wall, screen narrowed, badge parked top-right (150px, short forms), rows lowered — measured badge/seat-cell intersection now 0 px² at 375, 1000 and 1200 including the worst-case badge.
  • 1000px mid-width check: badge right-anchored at 31% on the counter, 0 px² intersection with the cells, badge bottom clear of the stage edge in the max state.
  • Label-collision sweep at native resolution (rest, public CPR 1, public childcare 8, LVR regional 20 weekend kits, MHFA 12, CPR 5, PFA 7): roster tag, screen code, SAT mark, AED label, infant labels and badge all clear.
  • Reduced motion: settled frame, layers shown without stagger, probe settles in 20 ms. Visibility pause and resize re-layout (wide ↔ tall) verified. Zero console errors across load, every drive and two rapid-fire runs (eleven dispatched clicks in one evaluate → settled on CPR/on-site/regional/18/weekend = $1,670; a second run of thirty-eight clicks back to rest = $1,350).
  • Form: hard reload → empty submit raises four field errors and the panel stays hidden; filled submit shows the panel. Keyboard arrows move the course chips. Badge bounding box top measured 414px at 1200 (inside the first 750px), stage top 266px.
  • Removed one ornament: the map's dashed metro ring. Final copy read; harness 736/736 across index and guide (the guide probed for one h1, 375 overflow, table-scroll wrappers, colophon, live JSON-LD allowlist and the would-ship panel).

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

Vital Signs First Aid Training is a fictional business — a first aid training industry demonstration designed & built by Sapience Analytics, part of the Generative Assets collection. Back to the site · Index.