evOo-local/packages/ui-web/MOTION-EVOO-CHARACTER.md
cynarAI 5ae8f15931 feat(web): Ingo UX — Proaktivität, Oo-Gesicht, dezentes Audio (#76)
* 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>
2026-09-22 14:39:40 +02:00

80 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.