# evOo Character Motion — Brand Soul & Motion God Product priority: **Proaktivität first** (Oos work or clearly wait on you). Motion and SFX serve that — never decorative idle. Cross-ref: geometry lock in [`CHARACTER.md`](./CHARACTER.md), voice encounter in [`../../VOICE.md`](../../VOICE.md). --- ## Expressor hierarchy | Layer | Role | Share of read | |-------|------|----------------| | **Eyes** | Asymmetric Kulleraugen lead every beat | ~lead | | **Mouth** | Primary expressor | ~80% | | **Hands** | Punctuation only — then rest | ~20% spikes | Never symmetrize eyes. Never let floating hands steal focus from face. --- ## Pose thesis (character only) | Rule | Value | |------|--------| | Eyes before mouth | **40–80 ms** lead on pose change | | Pose transition | **220–320 ms** | | Spring | Cute / soft / snap — `cubic-bezier(0.34, 1.25, 0.64, 1)` | | Scope | Character SVG + mascot only — not app chrome | Tokens: `evoo-character/motion-tokens.ts` (`EVOO_MOUTH_LAG_MS`, `EVOO_POSE_TRANSITION_MS`, `EVOO_CHARACTER_SPRING`). --- ## SFX & vocals (Web Audio) Toggle: Settings → Voice → Sound feedback. No vendor branding in UI. | Cue | Spec | |-----|------| | **eOo cold-open** | ≤450 ms, **max 1×/session** | | **App start** | 180–320 ms mint→violet shimmer (before optional eOo mark) | | **Interact** | 40–80 ms soft tick | | **Success** | Mint→gold resolve **or** soft `hm!` vocal — not both loud | | **Need-you** | Short `ouh?!` + UI chip together | | **Reactions** | `mhMhh` / `aaah` / `ouh?!` / `mm` — state-change only | | **Cooldown** | ≥8–12 s between reaction vocals | | **Level** | **−18…−12 LUFS** perceived (procedural peaks via shared bus gain) | | **Duck** | Under TTS playback and PTT/listening wash | Implementation: `apps/web/src/lib/oo-sound.ts`, `oo-vocals.ts`, `oo-voice-mark.ts`, `oo-audio-bus.ts`. ### Nod | Phase | Vocal | |-------|--------| | Down | `mh` (short, low) | | Up | `Mhh` (slightly longer, rising) | ### Dual-Mind bloom Reaction vocals may ride the voice-stage cyan/violet bloom — stay **under** the PTT/TTS wash; duck, never compete. --- ## Reduced motion When `prefers-reduced-motion: reduce`: - **No vocal loops** and no reaction stems - **Visual state only** — pose snaps without stagger; no mouth-speak pulse - Procedural UI ticks may still be omitted (same gate as SFX) --- ## Proactivity (Priority S) Motion never replaces working/waiting signals. Roster doing-verbs, Heute buckets, and need-you pings are authoritative; face/audio **amplify** them. See `apps/web/src/lib/agent-activity.ts` and Heute Brief buckets.