Build guide · site 345 · Wave 37, Industry Demos XXVI
A fictional Subiaco psychology practice — registered and clinical psychologists, in the room and by telehealth, individuals and couples, Medicare Better Access, NDIS and extras claiming. The page has one job: an initial-appointment request with the practitioner, format and session plan already priced.
The audience is an adult with a GP mental health treatment plan and no idea who to call, a parent booking for a teen, a couple having the same argument again, an NDIS participant's support coordinator, and the person who has been meaning to for a year. Mental-health copy stays calm, plain and unpatronising; the page names Lifeline 13 11 14 and 000 once, honestly ("we're not a crisis service") — real safety numbers stay real on a fictional page.
The direction is a consulting room with the morning in it: morning-sage ground, deep-forest ink, eucalypt CTAs, paperbark linework. The signature is the Session Path — a drawn path of stepping stones through grass and two paperbark trunks toward a consulting-room door. One stone lights per booked session, stone one wears an intake tag when the extended first session is on, the door's nameplate is the price badge, and the funding chips change the badge's declaration line but never the figure.
Every ratio below was computed by WCAG relative-luminance arithmetic from the shipped hex tokens during Pass 1 (the spec's figures were hypotheses). Eucalypt #3E7C63 on the sage ground measured 4.34:1 — under the 4.5 floor for text — so the pre-minted two-token pair carries the argued hue: buttons use the deeper fill #2F6650 under white labels, and every eucalypt-coloured word uses the text-ink #285743. Paperbark #D9A066 is 2.02:1 on the ground and is used only for lines and marks; paperbark-coloured copy uses #7A5426.
Six sessions, one path
Newsreader 500/600 for the wordmark, headings, the display line and the badge price — a calm reading serif whose italics do the emotional lifting ("talk it through with someone trained to listen"). The display moment sets the session count huge beside the drawn path and re-words itself as the stepper moves (One → Twelve).
Figtree 400–700
Figtree for everything read: body at 17px on mobile and 18px from 760px (the allied-health floor), chips, ledger, form. Weight carries hierarchy (700 legends, 600 chips, 500 fine print); tracking is used only on the uppercase eyebrows and the badge nameplate line.
getPointAtLength along a cubic path so both layouts space evenly; each is a <g class="stone"> whose lit class transitions fill via CSS with an inline transition-delay per stone. Dual-speed: first draw staggers 60 ms/stone (1.2 s cap), every later change 12 ms/stone (~520 ms cap) behind a firstDraw flag; a scene token bumped in every handler invalidates an in-flight settle so rapid-fire clicks can't race.document.hidden.<style>, Google Fonts the only external request.State is one object — practitioner, format, sessions, three toggles, funding — and compute() is a pure function over it: rate is the practitioner's individual or couples fee, the session line is sessions × rate, after-hours adds $30 × sessions, intake and letter add one-offs, and the funding chip contributes only declarations. render() then writes the same result to four surfaces in one pass: the scene (lit stones, tag, laptop, couples figures, review flag, door light, nameplate text), the badge (name, price, subtitle, declaration line, note line), the itemised ledger, and the plain-text mirror list under the scene. The two Medicare note cells live in compute(): couples + Medicare replaces the rebate line with the couples note on all surfaces; individual + Medicare at eleven or more sessions keeps the rebate line and adds the eleven-plus note. window.__psychology publishes the live state, the computed figures, which notes are active, whether the rebate line is present, and a settled flag set only when the latest token's settle timer fires.
| Line | Rate | Applies |
|---|---|---|
| Registered psychologist, 50 min (in the room or telehealth) | $230 | per session |
| Clinical psychologist, 50 min | $270 | per session |
| Couples session, 80 min | $320 registered · $360 clinical | reprices the session line — not an add-on |
| Telehealth | no change | "same fee, same rebate, your couch" — the drawing changes, the figure doesn't |
| Extended first session (80-min intake) | +$60 one-off | live at every combination, on at rest |
| Letter or report | +$180 one-off | live at every combination |
| After-hours sessions | +$30 × sessions | multiplies the session count only, never the one-offs |
| Funding chips | declaration only | Medicare / NDIS / extras append a line to badge, ledger and mirror; private appends nothing |
| Groups, EAP, supervision | no number | "priced per program — tell us the group and the goal" |
Fees are stated as full fees; every rebate is a declaration, never a subtracted number, because the MBS rate, the NDIS price limit and a fund's extras schedule are set elsewhere and change. Totals are integer by construction and display to the whole dollar.
| Scenario (full control vector set explicitly) | Spec | Measured | Declarations / notes asserted |
|---|---|---|---|
| Rest: registered · room · 6 · intake ON · letter OFF · after OFF · private | $1,440 | $1,440 | no declaration on badge, ledger or mirror; 6 stones lit; tag on stone one |
| Clinical · telehealth · 10 · intake ON · Medicare | $2,760 | $2,760 | Medicare line on all three surfaces; eleven-plus note ABSENT; laptop drawn |
| …step to 11 | $3,030 | $3,030 | eleven-plus note on badge, ledger and mirror; rebate line still present |
| Couples · registered · 8 · intake OFF · private | $2,560 | $2,560 | two figures drawn, no tag |
| …+ Medicare chip | $2,560 | $2,560 | couples note on all three surfaces; rebate line ABSENT on all three; probe rebateLine:false |
| Couples · clinical · 4 · intake ON · private | $1,500 | $1,500 | — |
| Rest + after-hours | $1,620 | $1,620 | ledger "After-hours × 6 sessions +$180" |
| …+ letter | $1,800 | $1,800 | — |
| Rest + telehealth chip | $1,440 | $1,440 | probe format tele, laptop on stone one |
| Rest + NDIS · Rest + extras | $1,440 | $1,440 | each declaration on badge, ledger and mirror |
| Cheapest priced: registered · 1 · intake OFF · private | $230 | $230 | equals the grid floor "from $230"; "ONE SESSION, ONE PATH" |
| Ceiling: clinical · room · 12 · all three on · Medicare | $3,840 | $3,840 | 12 × (270 + 30) + 60 + 180; eleven-plus note present |
A further fourteen mixed scenarios and a two-round rapid-fire drive (ten dispatched clicks per round, no settle between) matched the oracle with the badge, ledger total and probe in agreement.
| Funding | Badge line | Ledger line | Mirror | Couples format | Individual, ≥ 11 sessions |
|---|---|---|---|---|---|
| Private | none | "Private: full fee on the day — no referral needed" | none | — | — |
| Medicare Better Access | "less your Medicare rebate — up to ten sessions a calendar year with a GP mental health treatment plan" | "Medicare: rebate at the MBS rate per session, processed on the day — GP referral and treatment plan required" | both lines | rebate line REPLACED by "Better Access rebates individual sessions only — couples sessions are billed privately" | rebate line kept + "the rebate covers up to ten sessions a calendar year — sessions eleven and twelve are private" |
| NDIS | "claimable against your plan's Improved Daily Living budget" | "NDIS: billed under the price limit for each item — plan- and self-managed participants" | both lines | unchanged | unchanged |
| Private-health extras | "claim the extras portion through your fund" | "Extras: HICAPS on the day where your fund covers psychology — the rebate is your fund's to set" | both lines | unchanged | unchanged |
Wordmark and a phone chip in the masthead (icon-only under 390px, the number returns above); eyebrow, an h1 naming the trade and the area, "Request a first appointment" and "Call" buttons, and three trust dots all land inside 530px on a 375 screen. The paragraph is re-ordered below the CTAs on mobile so the promise beats the prose.
The Session Path shares the hero at desktop widths — scene and $1,440 nameplate inside the first 750px at 1200 wide — because a stated fee is the trust move in this trade. Controls follow immediately below; "Book this plan" hands practitioner, format, sessions, funding and total into the form's textarea, funding select and who-it's-for select.
Name, phone (validated in JS by digit count, no pattern attribute to trip the v-flag parser), suburb, who it's for (me / my teen / us as a couple / an NDIS participant — the receptionist triages by that first), funding select, preferred times, the pre-filled plan textarea and a GP-plan checkbox. Four fields are required. Confirmation is a designed panel hidden until a valid submit; the callback promise beside the form is static copy and not the confirmation.
Paperbark "Call now" + eucalypt "Book" fixed to the bottom under 760px, footer padded so nothing hides behind it. The single crisis line sits by the form where someone in distress will already be looking, with the real numbers.
role="radiogroup"s with roving tabindex, arrow-key movement that also selects, Space/Enter to select; switches are role="switch" buttons with aria-checked; stepper buttons carry aria-labels and disable at 1 and 12. Focus is a two-ring eucalypt halo on every focusable element, and the stepper's inset variant keeps it inside the rounded frame.<details open> list restates the drawing in words — practitioner and format, stones lit, the intake tag, the review flag, the breathing ring, the nameplate and price, and every declaration and note. The funding declarations are asserted on three surfaces (badge, ledger, mirror) so a screen-reader user hears exactly what a sighted user reads.role="alert", the confirmation role="status"; invalid fields carry aria-invalid and focus moves to the first one on an empty submit.The live page emits only WebPage / WebSite / BreadcrumbList schema naming it a demonstration — fictional business data in a real index is dishonest markup. For a real practice we would ship the block below. The top-level type is MedicalBusiness, an actual schema.org organization subtype (LocalBusiness → MedicalBusiness): schema.org does not define a Psychologist organization type, and Psychiatric-style tokens are MedicalSpecialty enumerations, which belong in medicalSpecialty, never in @type.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "MedicalBusiness",
"name": "Kindling Psychology",
"url": "https://www.example-practice.com.au/",
"telephone": "+61 8 9000 0345",
"image": "https://www.example-practice.com.au/rooms.jpg",
"priceRange": "$230–$360",
"medicalSpecialty": "Psychiatric",
"address": {
"@type": "PostalAddress",
"streetAddress": "[street address]",
"addressLocality": "Subiaco",
"addressRegion": "WA",
"postalCode": "6008",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -31.948, "longitude": 115.826 },
"areaServed": ["Subiaco", "West Leederville", "Shenton Park", "Nedlands", "Wembley", "Floreat", "Leederville", "Perth", "Claremont", "Mount Lawley", "Western Australia (telehealth)"],
"openingHoursSpecification": [
{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday"], "opens": "08:00", "closes": "20:00" },
{ "@type": "OpeningHoursSpecification", "dayOfWeek": "Friday", "opens": "08:00", "closes": "17:00" },
{ "@type": "OpeningHoursSpecification", "dayOfWeek": "Saturday", "opens": "08:30", "closes": "13:00" }
],
"availableService": [
{ "@type": "MedicalTherapy", "name": "Individual psychology sessions (registered and clinical psychologists)" },
{ "@type": "MedicalTherapy", "name": "Couples sessions" },
{ "@type": "MedicalTherapy", "name": "Telehealth psychology across Western Australia" }
],
"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "48" },
"review": [
{
"@type": "Review",
"author": { "@type": "Person", "name": "[consented, de-identified client]" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "[pulled from the practice's verified reviews feed]"
}
]
}
</script>
Plus: a Google Business Profile with the Subiaco pin and a statewide telehealth service area, the FAQ marked up as FAQPage, and separate landing pages for the queries people actually type — "psychologist Subiaco Medicare", "couples counselling Perth", "NDIS psychologist telehealth WA".
font-size beat the per-layout attribute) — removed the CSS size so the tall layout's larger stones get 16px numerals..field label rule — specificity fixed; hero eyebrow shortened so it holds one line at 375; h1 max size trimmed 2.9 → 2.7rem so the trust dots stay in the first viewport.<title> ("Session 3"; stone six adds the review note) so hovering or a screen-reader's rotor names it..table-scroll; harness scripts deleted before the commit so the folder holds only index.html and guide.html.This is a demonstration build by Sapience Analytics. Want one pointed at your customers?
Kindling Psychology is a fictional business — a psychology practice industry demonstration designed & built by Sapience Analytics, part of the Generative Assets collection. Back to the site · Index.