Emotions
Lio has nine named emotions, each tied to a product moment. An emotion is a layer on the live rig, not a redraw: the idle behaviors keep running underneath, and each emotion overrides only the channels it owns (lids, pupil, beak, breathing, one symbol). In code it is one prop: emotion="sad" on any bird.
The catalog, live
All nine, autonomous. Notice what persists: sad still blinks, celebrating still wanders, sleeping does nothing at all. Surprised is momentary by design and re-fires after a pause.
When to use which
Emotions are contextual, never decorative. Each exists for a specific kind of product moment; if a screen doesn't match a row below, the bird stays happy.
| Emotion | Read | Use it for |
|---|---|---|
| happy | The neutral rest: wide curious eye, warm blush, everything idle. | Default state everywhere: dashboards, resting marks. |
| celebrating | Full cheer: eye wide, beak open, sparkles bursting around the cap. | Essay submitted, streak milestone, task complete. |
| proud | Warm half-lidded satisfaction with a single sparkle. | Praise on strong feedback, teacher approval. |
| thinking | Eye up to the corner, slight squint, a trail of floating dots. | Loading: the AI is reading a draft or generating feedback. |
| focused | Narrowed lid, hard little pupil, beak shut. Effort, not anger. | The learner is actively drafting; keep-going progress states. |
| sad | Drooped body, heavy lid, gaze down, one welling tear. | Gentle correction, a failed submission, a let's-revise moment. |
| sleeping | Lids nearly closed, slow breathing, Zzz drifting up. Nothing stirs. | Idle and empty states: no drafts yet, nothing to show. |
| nervous | Wide eye, shrunken pupil, a sweat bead at the temple. | Errors delivered with compassion; looming deadlines. |
| surprised | Everything pops: pupil tiny, beak a small o, a bold ! | Reveals, unexpected achievements, level-ups. |
| angry | Narrowed glare, hard little pupil, anger cross, a jittering shout. | Rare and playful only: hard errors, a broken streak. Never blames the learner. |
Readability rules
- Angry and focused both narrow the eye. Only angry gets the red cross, the open beak, and the jitter; focused keeps a shut beak and no props. Without the cross, users read "focused" as "mildly annoyed."
- Sad gets the tear, sleeping gets the Zzz, never both. Both droop the lids; the symbol is what separates them.
- There is no wink. Lio has one eye; a wink is a closed face and reads as a blink or sleep. Playfulness comes from sparkles and the beak, not the lid.
- Intensity is particle count, not new poses. One sweat bead is mild worry; scaling distress means more or bigger symbols, not a redrawn face.
- Angry is rare and playful. It aims at broken things, never at the learner. If in doubt, use nervous.
Frozen reads
Every emotion has a static peak read: the pose it holds in print, exports, and under reduced motion. Meaning survives; motion doesn't. The eye is never fully closed in a frozen frame (sleeping holds heavy lids, not shut ones).
| Emotion | Reduced-motion / static read |
|---|---|
| happy | The standard open-eyed rest pose. |
| celebrating | Wide eye, open beak, static sparkles held around the head. |
| proud | Half-lidded warm gaze, slightly open beak, one static sparkle. |
| thinking | Pupil parked up in the corner, static dot trail. |
| focused | Narrowed eye, closed beak. |
| sad | Drooped pose, one static tear at the lower lid. |
| sleeping | Heavy lids (not fully shut), static Zzz. The eye is never fully closed in a frozen frame. |
| nervous | Wide eye with a small pupil and a static sweat bead. |
| surprised | Held wide-eyed stare with a static exclamation mark. |
| angry | Narrowed glare and anger cross held static, no jitter. |
How it works
- One spec table (
bird-emotions.ts) drives the live rig, the frozen renderer, and this page. An emotion declares its lid, pupil, beak floor, symbol, breathing rate, and timing; nothing is animated ad hoc. - Layered, not replaced. Idle keeps running; the emotion overrides only its own channels. Blink continues while sad; gaze tracking switches off while sleeping; the toe fidget stops for the calm states.
- Heavy is slow, light is fast. Sad enters over 800ms with no overshoot; surprised pops in 100ms with one. The spec carries the timing so every surface agrees.
- Works on the whole cast. The prop lives on the shared rig, so any trial bird can emote in campaign art. Product surfaces still use Lio only.
Ambient motion (blink cadence, gaze, beak pulse) is specified in Character → Motion; the character rules live on the Lio page.