* feat(web): Ingo UX — proactivity signals, Oo face richness, soft audio Priority S: Heute Brief buckets (Needs you ≤3 / Doing / Done), roster doing-verbs and Braucht-dich chips, sidebar badge on Heute, need-you ping on waiting states. Priority A/B: Web Audio cues (app-start shimmer, interact tick, success-resolve, need-you ouh), reaction vocals with cooldown, optional eOo cold-open voice mark. Oo eyes gain iris/specular detail and asymmetric blink; hands reduced to rest except punctuation poses; speaking mouth animates. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): biome format and unused import in HeuteBrief Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): a11y and import order for Heute badge Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * docs+motion: Motion God craft — pose stagger, audio bus, ducking Add MOTION-EVOO-CHARACTER.md (Brand Soul brief): eyes lead, mouth ~80%, hands punctuation, 40–80 ms eye→mouth lag, 220–320 ms springs, SFX LUFS and duck-under-TTS/PTT, nod mh/Mhh, reduced-motion rules. Implement motion-tokens, staggered mouthPose in EvooMascot, shared oo-audio-bus with voice-lane ducking, mint→gold success, hm nod vocal. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): align conversation roster with bot-only sidebar groups after rebase Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2.6 KiB
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, voice encounter in ../../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.