ae43014cf2
Remove the old sleepy mouth behavior that morphed the current mouth path (smile → U-shape → smile via SMIL path animation). Replace with a dedicated sleepy mouth: a small filled ellipse with a subtle breathing animation (gentle expand/contract cycle, 3s period). What changed: mouth/generators.ts: - Added generateSleepyMouth(centerX, centerY): produces a canonical small round ellipse (rx=2.8, ry=3.2) with SMIL breathing animation - Added applySleepyMouth(svgText): detects current mouth position, generates the sleepy mouth, replaces whatever mouth is present - Removed applySleepyMouthAnimation (the old morph-based approach) mouth/detection.ts: - Added replaceCurrentMouth(svgText, newMouthSvg): finds any element with blobbi-mouth class (path or ellipse, self-closing or with children) and replaces it. Falls back to Q-curve path matching. This handles all mouth types: base smile, sad frown, round mouth, droopy mouth, and previously-animated mouths. mouth/types.ts: - Removed SleepyMouthAnimationConfig (no longer needed) emotions.ts: - applySleepyAnimation no longer takes a mouth parameter - Calls applySleepyMouth(svgText) instead of the old morph function - Sleepy eye behavior (clip-path SMIL, closed-eye lines, wake-glance CSS, Zzz text) is completely unchanged The sleepy mouth is now a proper canonical mouth shape in the mouth/ module, positioned at the detected mouth center, independent of whatever base emotion mouth was applied before it.