Tier 1 · Contracts & states

Components with every state.

Real copy. No lorem. Companion fields cite presence.*.

Button

Variants

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 / attentionsetAttention
  • loading GPU — first frame; avoid layout jump (fixed size box)
  • empty caption — no cap or 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

Ship with this

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

StateCopy / behaviour
EmptyConfigurator before pick — defaults to free wisp / first free. Gallery “Free 8” filter ok.
LoadingDemo thinking — status may say local/live. No fake %
PartialCaption mid-typeout (presence talking)
Error“Couldn’t reach the model — using a local reply.”
OfflineStarter HTML works offline; site demo notes local personality
Unauthorisedn/a on site (no accounts). License is honour/legal for shipping bodies.
Not foundUnknown creature id → library falls back (orb/wisp path)
Success“Activation = a file on your machine.” Download note confirms.

Responsive & a11y

Surfaces → Events taxonomy