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.

happy
celebrating
proud
thinking
focused
sad
sleeping
nervous
surprised
angry

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.

EmotionReadUse it for
happyThe neutral rest: wide curious eye, warm blush, everything idle.Default state everywhere: dashboards, resting marks.
celebratingFull cheer: eye wide, beak open, sparkles bursting around the cap.Essay submitted, streak milestone, task complete.
proudWarm half-lidded satisfaction with a single sparkle.Praise on strong feedback, teacher approval.
thinkingEye up to the corner, slight squint, a trail of floating dots.Loading: the AI is reading a draft or generating feedback.
focusedNarrowed lid, hard little pupil, beak shut. Effort, not anger.The learner is actively drafting; keep-going progress states.
sadDrooped body, heavy lid, gaze down, one welling tear.Gentle correction, a failed submission, a let's-revise moment.
sleepingLids nearly closed, slow breathing, Zzz drifting up. Nothing stirs.Idle and empty states: no drafts yet, nothing to show.
nervousWide eye, shrunken pupil, a sweat bead at the temple.Errors delivered with compassion; looming deadlines.
surprisedEverything pops: pupil tiny, beak a small o, a bold !Reveals, unexpected achievements, level-ups.
angryNarrowed 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).

celebrating
proud
thinking
focused
sad
sleeping
nervous
surprised
angry
EmotionReduced-motion / static read
happyThe standard open-eyed rest pose.
celebratingWide eye, open beak, static sparkles held around the head.
proudHalf-lidded warm gaze, slightly open beak, one static sparkle.
thinkingPupil parked up in the corner, static dot trail.
focusedNarrowed eye, closed beak.
sadDrooped pose, one static tear at the lower lid.
sleepingHeavy lids (not fully shut), static Zzz. The eye is never fully closed in a frozen frame.
nervousWide eye with a small pupil and a static sweat bead.
surprisedHeld wide-eyed stare with a static exclamation mark.
angryNarrowed 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.