← Back to the Kindling Psychology demo Index

Build guide · site 345 · Wave 37, Industry Demos XXVI

How the Kindling Psychology demo was built

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.

Concept

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.

Palette — measured, not assumed

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.

#EEF2EA
Morning sagePage ground — a sage wall with the morning on it.ground for every ratio below
#22302B
Deep forestBody ink, headings, footer band.12.14:1 on sage · white on it 13.76:1
#4A5A53
Soft inkSecondary copy, ledger notes, form fine print.6.44:1 on sage · 7.30:1 on white · 5.89:1 on the booking ground
#3E7C63
EucalyptLit stones, switch knobs, marks, chip hover borders.white on it 4.92:1 · on sage 4.34:1 (marks only)
#2F6650
Eucalypt fillPrimary buttons, selected chips, trust strip, Subiaco star.white on it 6.69:1
#285743
Eucalypt inkLinks, italic display words, declaration lines, wordmark sub-line.7.31:1 on sage · 8.29:1 on white · 6.73:1 on the tint
#D9A066
PaperbarkPath linework, trunk peel, breathing ring, rules, sticky Call button ground.2.02:1 on sage — lines only · ink on it 6.01:1 · on the ink band 6.01:1
#7A5426
Paperbark inkEyebrows, badge nameplate line, note lines, tag text.5.93:1 on sage · 6.72:1 on white

Type

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.

Techniques

Signature implementation

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.

Pricing model (pinned anchors)

LineRateApplies
Registered psychologist, 50 min (in the room or telehealth)$230per session
Clinical psychologist, 50 min$270per session
Couples session, 80 min$320 registered · $360 clinicalreprices the session line — not an add-on
Telehealthno change"same fee, same rebate, your couch" — the drawing changes, the figure doesn't
Extended first session (80-min intake)+$60 one-offlive at every combination, on at rest
Letter or report+$180 one-offlive at every combination
After-hours sessions+$30 × sessionsmultiplies the session count only, never the one-offs
Funding chipsdeclaration onlyMedicare / NDIS / extras append a line to badge, ledger and mirror; private appends nothing
Groups, EAP, supervisionno 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.

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

Scenario (full control vector set explicitly)SpecMeasuredDeclarations / notes asserted
Rest: registered · room · 6 · intake ON · letter OFF · after OFF · private$1,440$1,440no declaration on badge, ledger or mirror; 6 stones lit; tag on stone one
Clinical · telehealth · 10 · intake ON · Medicare$2,760$2,760Medicare line on all three surfaces; eleven-plus note ABSENT; laptop drawn
…step to 11$3,030$3,030eleven-plus note on badge, ledger and mirror; rebate line still present
Couples · registered · 8 · intake OFF · private$2,560$2,560two figures drawn, no tag
…+ Medicare chip$2,560$2,560couples 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,620ledger "After-hours × 6 sessions +$180"
…+ letter$1,800$1,800
Rest + telehealth chip$1,440$1,440probe format tele, laptop on stone one
Rest + NDIS · Rest + extras$1,440$1,440each declaration on badge, ledger and mirror
Cheapest priced: registered · 1 · intake OFF · private$230$230equals the grid floor "from $230"; "ONE SESSION, ONE PATH"
Ceiling: clinical · room · 12 · all three on · Medicare$3,840$3,84012 × (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.

Declaration and note matrix

FundingBadge lineLedger lineMirrorCouples formatIndividual, ≥ 11 sessions
Privatenone"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 linesrebate 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 linesunchangedunchanged
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 linesunchangedunchanged

Conversion decisions

Above the fold at 375

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.

Path before form

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.

Form fields

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.

Sticky bar and safety line

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.

Accessibility decisions

Local SEO we'd implement for the real business

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".

What would change for the real client

Iteration log

Pass 1 — Craft

  • Measured every palette ratio: eucalypt on sage came in at 4.34:1 (spec ≈4.8), so links and eucalypt-coloured copy moved to the pre-minted eucalypt ink (7.31:1) and buttons to the deeper fill (white 6.69:1); paperbark stays lines-only at 2.02:1. Recorded above.
  • Wide-layout path re-curved from a steep first climb (stones 1–3 crowded) to a lazy S; last stone pulled back so it sits in front of the step instead of over the door frame.
  • Grass tufts were drawn after the door and striped across the jarrah — draw order fixed (grass, then door, then path and stones, then the front trunk).
  • Found the CSS-vs-attribute collision on the stone numbers (a stylesheet font-size beat the per-layout attribute) — removed the CSS size so the tall layout's larger stones get 16px numerals.
  • Perth map relabelled: the Subiaco label collided with the Northbridge dot and Wembley/Floreat overlapped; suburbs re-placed to a truer geography (CBD east, Nedlands south, river below), telehealth tag widened so "same fee, same rebate" fits.
  • GP-plan checkbox lost its flex gap to the .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.

Pass 2 — Depth

  • Second-read details: a paperbark review flag appears on stone six whenever six or more sessions are planned ("we review the plan at six" — the FAQ's promise drawn into the path), and warm light spills under the door in proportion to the stones lit (0.12 → 0.62 opacity). Both mirrored in the plain-text list.
  • Every stone carries an SVG <title> ("Session 3"; stone six adds the review note) so hovering or a screen-reader's rotor names it.
  • Breathing ring: caption alternates "breathe in · four" / "breathe out · four" in step with the eased radius; opacity floor confirmed ≥ 0.55 across a 2.4 s sample.
  • Wall behind the door given faint weatherboard lines so it reads as a room, not a grey rectangle; drove all worked examples plus the fourteen-scenario oracle sweep and the two-round rapid-fire drive — no drift.

Pass 3 — Hardening

  • 375: scrollWidth 375, no offenders outside the SVGs, body 17px, tap targets ≥ 44px, wordmark right edge 216px vs call chip left edge 318px (no masthead collision), sticky bar fixed with a tel: link inside the bottom 140px; scene switches to the tall layout with the tight badge (165px wide) clear of the stones.
  • Label-collision review at native resolution (2× clips at 375 and 1200): tag over stone one, review flag over stone six, ring caption clear of the badge (ring moved left in the tall layout), stone 12 clear of the door frame.
  • Keyboard pass: arrow keys move and select in every chip group, Enter/Space on stepper and switches, FAQ summaries open on Enter; focus ring visible on all of them. Reduced-motion page: settled flag true, ring static, six stones lit, zero errors.
  • Chanel rule: removed the "the Session Path" credit text from the corner of the scene — the eyebrow already names it.
  • Zero console errors on both pages; one h1 each; live JSON-LD limited to WebPage/WebSite/BreadcrumbList/ListItem; guide tables in .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.