Button
States: default · hover (mood border) · focus-visible (mood ring) · active/press · disabled (waitlist — explain, don’t fake Buy) · loading (label → “Working…” — host) · error (use danger text nearby, not red fill button).
Chip / state control
Writes presence.setState. Labels are the API strings — never “Loading.”
Companion host
Props: type (creature id), size, theme, state, optional cap. Renders canvas/svg inside host; sets CSS --cmood from presence.mood.hex.
- default — mounted, idle
- hover / attention —
setAttention - loading GPU — first frame; avoid layout jump (fixed size box)
- empty caption — no
capor empty text - error — WebGL fail falls back to another body in library; host should not show a blank hole without note
- destroyed — node removed
Speech / caption
glim
hey — still with you.▍
Live region when wired. Typing from say(). Settle event when held line completes.
Pricing tier card
Pro
$69 / one-time
Leave an email — checkout when it’s live.
Intent dialog
Pro
Almost there.
Checkout isn’t live yet. Leave an email and I’ll send you a link the moment it is — plus early access if you want it.
States: closed · open · submitting · success (local/mailto) · validation error (“Need an email.”)
States library
| State | Copy / behaviour |
|---|---|
| Empty | Configurator before pick — defaults to free wisp / first free. Gallery “Free 8” filter ok. |
| Loading | Demo thinking — status may say local/live. No fake % |
| Partial | Caption mid-typeout (presence talking) |
| Error | “Couldn’t reach the model — using a local reply.” |
| Offline | Starter HTML works offline; site demo notes local personality |
| Unauthorised | n/a on site (no accounts). License is honour/legal for shipping bodies. |
| Not found | Unknown creature id → library falls back (orb/wisp path) |
| Success | “Activation = a file on your machine.” Download note confirms. |
Responsive & a11y
- Breakpoints ~540 / 700 / 980 — grids collapse; companion size scales via opts.
- Never changes: four state names, mood semantics, honest waitlist.
- Focus: 2px mood ring offset 3px. Skip link on product page.
- Touch: prefer ≥40px; dense chips still keyboard operable.