* 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>
80 lines
2.6 KiB
Markdown
80 lines
2.6 KiB
Markdown
# 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.
|