wissive 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/dist/index.d.ts +695 -0
- package/dist/react.cjs +2 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.ts +52 -0
- package/dist/react.js +17 -0
- package/dist/react.js.map +1 -0
- package/dist/vue.cjs +2 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.ts +78 -0
- package/dist/vue.js +22 -0
- package/dist/vue.js.map +1 -0
- package/dist/wissive.cjs +187 -0
- package/dist/wissive.cjs.map +1 -0
- package/dist/wissive.js +2687 -0
- package/dist/wissive.js.map +1 -0
- package/dist/wissive.umd.js +187 -0
- package/dist/wissive.umd.js.map +1 -0
- package/package.json +86 -0
- package/src/astro/Wissive.astro +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wissive.umd.js","sources":["../src/emojis/catalog.ts","../src/core/spring.ts","../src/core/state.ts","../src/core/raf.ts","../src/render/spiral.ts","../src/render/svg.ts","../src/events/listeners.ts","../src/core/sound.ts","../src/render/particles.ts","../src/core/drag.ts","../src/core/a11y.ts","../src/core/theme.ts","../src/core/motion.ts","../src/core/sequence.ts","../src/emojis/states.ts","../src/core/group.ts","../src/emojis/custom.ts","../src/index.ts"],"sourcesContent":["import type { EmojiDefinition, FaceParameters } from './types';\n\nfunction createDefaultParams(overrides: Partial<FaceParameters> = {}): FaceParameters {\n return {\n eyeOpen: 1.0,\n eyeScale: 1.0,\n eyeType: 0,\n eyeGap: 32,\n eyeY: 45,\n mouthY: 63,\n mouthCurve: 0.0,\n mouthWidth: 0.8,\n mouthOpen: 0.0,\n mouthType: 0,\n browY: 0,\n browTilt: 0,\n cheek: 0,\n bob: 0,\n shiftX: 0,\n tears: 0,\n gazeX: 0,\n gazeY: 0,\n turnAngle: 0,\n // En 0 por defecto pero SIEMPRE presentes: el resorte solo anima claves\n // que existían en el objeto inicial. Si faltaran aquí, un override\n // procedural (p.ej. \"sleeping\" poniendo zzz=1) se descartaría en\n // silencio para cualquier emoji que no las trajera ya de fábrica.\n zzz: 0,\n sweat: 0,\n storm: 0,\n scribble: 0,\n puff: 0,\n ...overrides,\n };\n}\n\n// 1. Mochi (happy) - Corazón rosa feliz kawaii >‿<\nexport const EMOJI_MOCHI: EmojiDefinition = {\n name: 'mochi',\n emotion: 'happy',\n baseColor: '#F2A9B8',\n silhouette: 'heart',\n motion: {\n stiffness: 220,\n damping: 14,\n idleSpeed: 3.2,\n idleAmplitude: 2.5,\n idleIntervalMin: 6000,\n idleIntervalMax: 12000,\n motionType: 'bouncy',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0 }), // >‿<\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0, bob: -1.5 }),\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0, bob: 1.0 }), // ^‿^\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0 }),\n ],\n near: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0, bob: -1.5 }),\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0, bob: -2.5 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0.3, bob: -4 }),\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0.3, bob: -4.5 }),\n ],\n click: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0.5, bob: -7 }),\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 28.33, eyeY: 43.33, mouthType: 0, mouthY: 53.33, mouthWidth: 0.39, mouthCurve: 0.43, cheek: 0.5, bob: -6 }),\n ],\n },\n};\n\n// 2. Zumi (flutter) - Amarillo vibrante > - <\nexport const EMOJI_ZUMI: EmojiDefinition = {\n name: 'zumi',\n emotion: 'flutter',\n baseColor: '#F2CB4E',\n silhouette: 'round-blob',\n motion: {\n stiffness: 300,\n damping: 10,\n idleSpeed: 4.5,\n idleAmplitude: 3.8,\n idleIntervalMin: 4000,\n idleIntervalMax: 9000,\n motionType: 'flutter',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 30, eyeY: 43.33, mouthType: 3, mouthY: 45.83, mouthWidth: 0.27, mouthCurve: 0, cheek: 0.3 }),\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 30, eyeY: 43.33, mouthType: 3, mouthY: 45.83, mouthWidth: 0.27, mouthCurve: 0, cheek: 0.4, bob: -1.5 }),\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 30, eyeY: 43.33, mouthType: 3, mouthY: 45.83, mouthWidth: 0.27, mouthCurve: 0, cheek: 0.35, bob: 1 }),\n ],\n near: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 30, eyeY: 43.33, mouthType: 3, mouthY: 45.83, mouthWidth: 0.27, mouthCurve: 0, cheek: 0.5, bob: -2 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 30, eyeY: 43.33, mouthType: 3, mouthY: 45.83, mouthWidth: 0.27, mouthCurve: 0, cheek: 0.7, bob: -4 }),\n ],\n click: [\n createDefaultParams({ eyeType: 2, eyeScale: 1, eyeGap: 30, eyeY: 43.33, mouthType: 3, mouthY: 45.83, mouthWidth: 0.27, mouthCurve: 0, cheek: 0.9, bob: -6 }),\n ],\n },\n};\n\n// 3. Suri (pleasure) - Rosa pastel ^ ^\nexport const EMOJI_SURI: EmojiDefinition = {\n name: 'suri',\n emotion: 'pleasure',\n baseColor: '#F28FC2',\n silhouette: 'elongated-oval',\n motion: {\n stiffness: 140,\n damping: 18,\n idleSpeed: 1.8,\n idleAmplitude: 1.8,\n idleIntervalMin: 7000,\n idleIntervalMax: 14000,\n motionType: 'serene',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 1, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 0, mouthY: 53.33, mouthWidth: 0.36, mouthCurve: 0.48, cheek: 0.4 }),\n createDefaultParams({ eyeType: 1, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 0, mouthY: 53.33, mouthWidth: 0.36, mouthCurve: 0.48, cheek: 0.5, bob: 1.0 }),\n ],\n near: [\n createDefaultParams({ eyeType: 1, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 0, mouthY: 53.33, mouthWidth: 0.36, mouthCurve: 0.48, cheek: 0.6, bob: 2.0 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 1, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 0, mouthY: 53.33, mouthWidth: 0.36, mouthCurve: 0.48, cheek: 0.75, bob: 3.5 }),\n ],\n click: [\n createDefaultParams({ eyeType: 1, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 0, mouthY: 53.33, mouthWidth: 0.36, mouthCurve: 0.48, cheek: 0.9, bob: 5.0 }),\n ],\n },\n};\n\n// 4. Nima (peaceful) - Fantasma verde salvia ^ ^\nexport const EMOJI_NIMA: EmojiDefinition = {\n name: 'nima',\n emotion: 'peaceful',\n baseColor: '#9AC9A0',\n silhouette: 'ghost-blob',\n motion: {\n stiffness: 110,\n damping: 22,\n idleSpeed: 1.2,\n idleAmplitude: 2.0,\n idleIntervalMin: 8000,\n idleIntervalMax: 15000,\n motionType: 'float',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 14, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 14, mouthY: 51.67, mouthWidth: 0, mouthCurve: 0 }),\n createDefaultParams({ eyeType: 14, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 14, mouthY: 51.67, mouthWidth: 0, mouthCurve: 0, bob: 1.5 }),\n ],\n near: [\n createDefaultParams({ eyeType: 14, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 14, mouthY: 51.67, mouthWidth: 0, mouthCurve: 0, bob: 2.0 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 14, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 14, mouthY: 51.67, mouthWidth: 0, mouthCurve: 0, cheek: 0.3, bob: 3.0 }),\n ],\n click: [\n createDefaultParams({ eyeType: 14, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 14, mouthY: 51.67, mouthWidth: 0, mouthCurve: 0, cheek: 0.5, bob: 4.5 }),\n ],\n },\n};\n\n// 5. Cota (normal) - Óvalo menta neutro • — •\nexport const EMOJI_COTA: EmojiDefinition = {\n name: 'cota',\n emotion: 'normal',\n baseColor: '#C9DCD3',\n silhouette: 'oval',\n motion: {\n stiffness: 160,\n damping: 18,\n idleSpeed: 1.5,\n idleAmplitude: 1.2,\n idleIntervalMin: 8000,\n idleIntervalMax: 16000,\n motionType: 'calm',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 0, eyeScale: 1, eyeGap: 23.33, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0 }),\n createDefaultParams({ eyeType: 0, eyeScale: 1, eyeGap: 23.33, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, bob: -0.8 }),\n ],\n near: [\n createDefaultParams({ eyeType: 0, eyeScale: 1, eyeGap: 23.33, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, bob: 1.2 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 0, eyeScale: 1, eyeGap: 23.33, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, cheek: 0.2, bob: 2.5 }),\n ],\n click: [\n createDefaultParams({ eyeType: 0, eyeScale: 1, eyeGap: 23.33, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, cheek: 0.4, bob: 4.0 }),\n ],\n },\n};\n\n// 6. Dozy (tired) - Óvalo gris cansado \\ — /\nexport const EMOJI_DOZY: EmojiDefinition = {\n name: 'dozy',\n emotion: 'tired',\n baseColor: '#D6DBCF',\n silhouette: 'wide-oval',\n motion: {\n stiffness: 90,\n damping: 24,\n idleSpeed: 0.9,\n idleAmplitude: 2.8,\n idleIntervalMin: 6000,\n idleIntervalMax: 12000,\n motionType: 'droop',\n },\n expressions: {\n // Cansado de verdad: párpados caídos + gotas de sudor + resoplido —\n // sin zzz, que es \"dormido\"; Dozy está agotado pero despierto.\n idle: [\n createDefaultParams({ eyeType: 15, eyeScale: 0.85, eyeGap: 26.67, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.24, mouthCurve: 0, sweat: 1, puff: 0.7, bob: 1.5 }),\n createDefaultParams({ eyeType: 15, eyeScale: 0.85, eyeGap: 26.67, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.24, mouthCurve: 0, sweat: 1, puff: 0.7, bob: 2.5 }),\n ],\n near: [\n createDefaultParams({ eyeType: 15, eyeScale: 0.85, eyeGap: 26.67, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.24, mouthCurve: 0, sweat: 1, puff: 0.7, bob: 3.5 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 15, eyeScale: 0.85, eyeGap: 26.67, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.24, mouthCurve: 0, sweat: 1, puff: 0.85, bob: 4.5 }),\n ],\n click: [\n createDefaultParams({ eyeType: 15, eyeScale: 0.85, eyeGap: 26.67, eyeY: 45.83, mouthType: 3, mouthY: 56.67, mouthWidth: 0.24, mouthCurve: 0, sweat: 1, puff: 1, bob: 6.5 }),\n ],\n },\n};\n\n// 7. Lumo (sad) - Gota azul triste con lágrimas\nexport const EMOJI_LUMO: EmojiDefinition = {\n name: 'lumo',\n emotion: 'sad',\n baseColor: '#7FA6D9',\n silhouette: 'teardrop-blob',\n motion: {\n stiffness: 100,\n damping: 20,\n idleSpeed: 1.1,\n idleAmplitude: 2.2,\n idleIntervalMin: 7000,\n idleIntervalMax: 13000,\n motionType: 'sob',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 16, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 3, mouthY: 55, mouthWidth: 0.3, mouthCurve: 0, tears: 1, bob: 1.8 }),\n createDefaultParams({ eyeType: 16, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 3, mouthY: 55, mouthWidth: 0.3, mouthCurve: 0, tears: 1, bob: 2.8 }),\n ],\n near: [\n createDefaultParams({ eyeType: 16, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 3, mouthY: 55, mouthWidth: 0.3, mouthCurve: 0, tears: 1, bob: 3.5 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 16, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 3, mouthY: 55, mouthWidth: 0.3, mouthCurve: 0, tears: 1, bob: 4.8 }),\n ],\n click: [\n createDefaultParams({ eyeType: 16, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 3, mouthY: 55, mouthWidth: 0.3, mouthCurve: 0, tears: 1, bob: 6.0 }),\n ],\n },\n};\n\n// 8. Fidge (anxiety) - Nube morada con ojos de anillo\nexport const EMOJI_FIDGE: EmojiDefinition = {\n name: 'fidge',\n emotion: 'anxiety',\n baseColor: '#A99BD9',\n silhouette: 'cloud-blob',\n motion: {\n stiffness: 350,\n damping: 8,\n idleSpeed: 5.5,\n idleAmplitude: 1.5,\n idleIntervalMin: 3000,\n idleIntervalMax: 7000,\n motionType: 'jitter',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 5, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 13, mouthY: 56.67, mouthWidth: 0.08, mouthCurve: 0 }),\n createDefaultParams({ eyeType: 5, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 13, mouthY: 56.67, mouthWidth: 0.08, mouthCurve: 0, shiftX: 1.5 }),\n ],\n near: [\n createDefaultParams({ eyeType: 5, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 13, mouthY: 56.67, mouthWidth: 0.08, mouthCurve: 0, shiftX: 2.5 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 5, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 13, mouthY: 56.67, mouthWidth: 0.08, mouthCurve: 0, shiftX: 4.0 }),\n ],\n click: [\n createDefaultParams({ eyeType: 5, eyeScale: 1, eyeGap: 25, eyeY: 43.33, mouthType: 13, mouthY: 56.67, mouthWidth: 0.08, mouthCurve: 0, shiftX: 6.0 }),\n ],\n },\n};\n\n// 9. Brix (anger) - Fuego rojo enojado / \\\nexport const EMOJI_BRIX: EmojiDefinition = {\n name: 'brix',\n emotion: 'anger',\n baseColor: '#D9566A',\n silhouette: 'flame-blob',\n motion: {\n stiffness: 280,\n damping: 12,\n idleSpeed: 3.8,\n idleAmplitude: 2.0,\n idleIntervalMin: 4000,\n idleIntervalMax: 8000,\n motionType: 'fiery',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 17, eyeScale: 1, eyeGap: 28.33, eyeY: 46.67, mouthType: 0, mouthY: 61.67, mouthWidth: 0.33, mouthCurve: -0.48 }),\n createDefaultParams({ eyeType: 17, eyeScale: 1, eyeGap: 28.33, eyeY: 46.67, mouthType: 0, mouthY: 61.67, mouthWidth: 0.33, mouthCurve: -0.48 }),\n ],\n near: [\n createDefaultParams({ eyeType: 17, eyeScale: 1, eyeGap: 28.33, eyeY: 46.67, mouthType: 0, mouthY: 61.67, mouthWidth: 0.33, mouthCurve: -0.48 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 17, eyeScale: 1, eyeGap: 28.33, eyeY: 46.67, mouthType: 0, mouthY: 61.67, mouthWidth: 0.33, mouthCurve: -0.48 }),\n ],\n click: [\n createDefaultParams({ eyeType: 17, eyeScale: 1, eyeGap: 28.33, eyeY: 46.67, mouthType: 0, mouthY: 61.67, mouthWidth: 0.33, mouthCurve: -0.48 }),\n ],\n },\n};\n\n// 10. Wilt (disappointed) - Peón amarillo desilusionado\nexport const EMOJI_WILT: EmojiDefinition = {\n name: 'wilt',\n emotion: 'disappointed',\n baseColor: '#EBD98A',\n silhouette: 'droopy-blob',\n motion: {\n stiffness: 100,\n damping: 22,\n idleSpeed: 1.0,\n idleAmplitude: 2.0,\n idleIntervalMin: 7000,\n idleIntervalMax: 14000,\n motionType: 'wilt',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 15, eyeScale: 1.15, eyeGap: 25, eyeY: 43.33, mouthType: 0, mouthY: 63.33, mouthWidth: 0.45, mouthCurve: -0.54, bob: 1.5 }),\n createDefaultParams({ eyeType: 15, eyeScale: 1.15, eyeGap: 25, eyeY: 43.33, mouthType: 0, mouthY: 63.33, mouthWidth: 0.45, mouthCurve: -0.54, bob: 2.5 }),\n ],\n near: [\n createDefaultParams({ eyeType: 15, eyeScale: 1.15, eyeGap: 25, eyeY: 43.33, mouthType: 0, mouthY: 63.33, mouthWidth: 0.45, mouthCurve: -0.54, bob: 3.5 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 15, eyeScale: 1.15, eyeGap: 25, eyeY: 43.33, mouthType: 0, mouthY: 63.33, mouthWidth: 0.45, mouthCurve: -0.54, bob: 4.5 }),\n ],\n click: [\n createDefaultParams({ eyeType: 15, eyeScale: 1.15, eyeGap: 25, eyeY: 43.33, mouthType: 0, mouthY: 63.33, mouthWidth: 0.45, mouthCurve: -0.54, bob: 6.0 }),\n ],\n },\n};\n\n// 11. Knot (stress) - Osito rosado estresado con espirales y zigzag\nexport const EMOJI_KNOT: EmojiDefinition = {\n name: 'knot',\n emotion: 'stress',\n baseColor: '#C97F76',\n silhouette: 'bear-blob',\n motion: {\n stiffness: 320,\n damping: 9,\n idleSpeed: 4.8,\n idleAmplitude: 2.2,\n idleIntervalMin: 3500,\n idleIntervalMax: 7500,\n motionType: 'dizzy',\n },\n expressions: {\n // Estresado de verdad: la espiral de mareo en los ojos ya lo insinuaba,\n // pero el sello de Knot es cargar con la nube de tormenta Y el garabato\n // de confusión encima a la vez — agobiado por todos lados, no solo mareado.\n idle: [\n createDefaultParams({ eyeType: 18, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 58.33, mouthWidth: 0.42, mouthCurve: 0, storm: 1, scribble: 1 }),\n createDefaultParams({ eyeType: 18, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 58.33, mouthWidth: 0.42, mouthCurve: 0, storm: 1, scribble: 1, shiftX: 1.5 }),\n ],\n near: [\n createDefaultParams({ eyeType: 18, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 58.33, mouthWidth: 0.42, mouthCurve: 0, storm: 1, scribble: 1, shiftX: 3.0 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 18, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 58.33, mouthWidth: 0.42, mouthCurve: 0, storm: 1, scribble: 1, shiftX: 4.5 }),\n ],\n click: [\n createDefaultParams({ eyeType: 18, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 58.33, mouthWidth: 0.42, mouthCurve: 0, storm: 1, scribble: 1, shiftX: 6.5 }),\n ],\n },\n};\n\n// 12. Snug (sleepy) - Celeste adormilado con ZZZ\nexport const EMOJI_SNUG: EmojiDefinition = {\n name: 'snug',\n emotion: 'sleepy',\n baseColor: '#AFCBE0',\n silhouette: 'soft-round',\n motion: {\n stiffness: 85,\n damping: 25,\n idleSpeed: 0.7,\n idleAmplitude: 2.2,\n idleIntervalMin: 6000,\n idleIntervalMax: 12000,\n motionType: 'snooze',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 19, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 56.67, mouthWidth: 0.27, mouthCurve: 0, zzz: 1, bob: 0.5 }),\n createDefaultParams({ eyeType: 19, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 56.67, mouthWidth: 0.27, mouthCurve: 0, zzz: 1, bob: 1.5 }),\n ],\n near: [\n createDefaultParams({ eyeType: 19, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 56.67, mouthWidth: 0.27, mouthCurve: 0, zzz: 1, bob: 2.5 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 19, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 56.67, mouthWidth: 0.27, mouthCurve: 0, zzz: 1, bob: 3.8 }),\n ],\n click: [\n createDefaultParams({ eyeType: 19, eyeScale: 1, eyeGap: 26.67, eyeY: 45, mouthType: 3, mouthY: 56.67, mouthWidth: 0.27, mouthCurve: 0, zzz: 1, bob: 5.5 }),\n ],\n },\n};\n\n// 13. Pip (surprised) - Durazno sorprendido • O •\nexport const EMOJI_PIP: EmojiDefinition = {\n name: 'pip',\n emotion: 'surprised',\n baseColor: '#F0B98A',\n silhouette: 'octopus-blob',\n motion: {\n stiffness: 250,\n damping: 12,\n idleSpeed: 2.8,\n idleAmplitude: 3.0,\n idleIntervalMin: 5000,\n idleIntervalMax: 10000,\n motionType: 'pop',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.8, eyeGap: 21.67, eyeY: 43.33, mouthType: 1, mouthY: 55, mouthWidth: 0.21, mouthCurve: 0 }),\n createDefaultParams({ eyeType: 20, eyeScale: 0.8, eyeGap: 21.67, eyeY: 43.33, mouthType: 1, mouthY: 55, mouthWidth: 0.21, mouthCurve: 0, bob: -2 }),\n ],\n near: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.8, eyeGap: 21.67, eyeY: 43.33, mouthType: 1, mouthY: 55, mouthWidth: 0.21, mouthCurve: 0, bob: -3 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.8, eyeGap: 21.67, eyeY: 43.33, mouthType: 1, mouthY: 55, mouthWidth: 0.21, mouthCurve: 0, bob: -5 }),\n ],\n click: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.8, eyeGap: 21.67, eyeY: 43.33, mouthType: 1, mouthY: 55, mouthWidth: 0.21, mouthCurve: 0, bob: -8 }),\n ],\n },\n};\n\n// 14. Void (numbness) - Lila entumecido O — O\nexport const EMOJI_VOID: EmojiDefinition = {\n name: 'void',\n emotion: 'numbness',\n baseColor: '#D9C6E0',\n silhouette: 'wave-blob',\n motion: {\n stiffness: 100,\n damping: 24,\n idleSpeed: 0.8,\n idleAmplitude: 1.5,\n idleIntervalMin: 9000,\n idleIntervalMax: 18000,\n motionType: 'drift',\n },\n expressions: {\n idle: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.75, eyeGap: 23.33, eyeY: 44.17, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0 }),\n createDefaultParams({ eyeType: 20, eyeScale: 0.75, eyeGap: 23.33, eyeY: 44.17, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, bob: 1.0 }),\n ],\n near: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.75, eyeGap: 23.33, eyeY: 44.17, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, bob: 2.0 }),\n ],\n hover: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.75, eyeGap: 23.33, eyeY: 44.17, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, bob: 3.0 }),\n ],\n click: [\n createDefaultParams({ eyeType: 20, eyeScale: 0.75, eyeGap: 23.33, eyeY: 44.17, mouthType: 3, mouthY: 56.67, mouthWidth: 0.33, mouthCurve: 0, bob: 4.5 }),\n ],\n },\n};\n\nexport const LIB: Record<string, EmojiDefinition> = {\n mochi: EMOJI_MOCHI,\n zumi: EMOJI_ZUMI,\n suri: EMOJI_SURI,\n nima: EMOJI_NIMA,\n cota: EMOJI_COTA,\n dozy: EMOJI_DOZY,\n lumo: EMOJI_LUMO,\n fidge: EMOJI_FIDGE,\n brix: EMOJI_BRIX,\n wilt: EMOJI_WILT,\n knot: EMOJI_KNOT,\n snug: EMOJI_SNUG,\n pip: EMOJI_PIP,\n void: EMOJI_VOID,\n};\n\nexport function getEmojiDefinition(nameOrEmotion: string): EmojiDefinition {\n const key = nameOrEmotion.toLowerCase();\n if (LIB[key]) return LIB[key];\n const found = Object.values(LIB).find((item) => item.emotion === key);\n return found || EMOJI_MOCHI;\n}\n","export interface SpringConfig {\n stiffness: number;\n damping: number;\n mass: number;\n}\n\nexport interface SpringState {\n current: number;\n target: number;\n velocity: number;\n}\n\nexport interface SpringInstance {\n state: SpringState;\n setTarget: (target: number) => void;\n setCurrent: (value: number) => void;\n update: (dt: number) => boolean;\n}\n\n/**\n * Motor de resorte amortiguado (damped spring physics).\n * Utiliza integrador numérico sub-stepped para máxima estabilidad.\n */\nexport function makeSpring(\n initialValue: number,\n config: Partial<SpringConfig> = {}\n): SpringInstance {\n const { stiffness = 180, damping = 18, mass = 1 } = config;\n const state: SpringState = {\n current: initialValue,\n target: initialValue,\n velocity: 0,\n };\n\n return {\n state,\n setTarget(target: number) {\n state.target = target;\n },\n setCurrent(value: number) {\n state.current = value;\n state.target = value;\n state.velocity = 0;\n },\n update(dt: number) {\n const maxSubSteps = 4;\n const subDt = dt / maxSubSteps;\n\n let isMoving = false;\n for (let i = 0; i < maxSubSteps; i++) {\n const displacement = state.current - state.target;\n const springForce = -stiffness * displacement;\n const dampingForce = -damping * state.velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n state.velocity += acceleration * subDt;\n state.current += state.velocity * subDt;\n\n if (\n Math.abs(state.velocity) > 0.0001 ||\n Math.abs(state.current - state.target) > 0.0001\n ) {\n isMoving = true;\n }\n }\n\n if (!isMoving) {\n state.current = state.target;\n state.velocity = 0;\n }\n\n return isMoving;\n },\n };\n}\n\nexport interface MultiSpring<T extends Record<string, number>> {\n getValues: () => T;\n setTargets: (targets: Partial<T>) => void;\n setValues: (values: Partial<T>) => void;\n update: (dt: number) => boolean;\n}\n\nexport function createMultiSpring<T extends Record<string, number>>(\n initialValues: T,\n config?: Partial<SpringConfig>\n): MultiSpring<T> {\n const keys = Object.keys(initialValues) as (keyof T)[];\n const springs = {} as Record<keyof T, SpringInstance>;\n\n for (const key of keys) {\n springs[key] = makeSpring(initialValues[key], config);\n }\n\n return {\n getValues() {\n const values = {} as T;\n for (const key of keys) {\n values[key] = springs[key].state.current as T[typeof key];\n }\n return values;\n },\n setTargets(targets: Partial<T>) {\n for (const key in targets) {\n if (key in springs) {\n springs[key].setTarget(targets[key]!);\n }\n }\n },\n setValues(values: Partial<T>) {\n for (const key in values) {\n if (key in springs) {\n springs[key].setCurrent(values[key]!);\n }\n }\n },\n update(dt: number) {\n let active = false;\n for (const key of keys) {\n const springActive = springs[key].update(dt);\n if (springActive) active = true;\n }\n return active;\n },\n };\n}\n","import type { InteractionState, FaceParameters } from '../emojis/types';\n\n/**\n * Procedural overrides per state to ensure ALL 39 states have unique facial geometry\n */\nfunction getProceduralStateParams(base: FaceParameters, state: InteractionState): FaceParameters {\n const p = { ...base };\n\n switch (state) {\n // 💤 Reposo & Sueño\n case 'sleeping':\n p.eyeOpen = 0.05;\n p.eyeType = 2; // ^‿^ closed happy arc\n p.mouthCurve = 0.2;\n p.browY = 3;\n p.browTilt = -0.1;\n p.cheek = 0.2;\n p.zzz = 1; // dormido de verdad = con sus zzz, no solo ojos cerrados\n break;\n\n case 'drowsy':\n case 'powering-down':\n p.eyeOpen = 0.35;\n p.mouthCurve = 0.0;\n p.browY = 4;\n p.browTilt = 0.1;\n p.zzz = 0.55; // entrando en sueño: zzz más tenue que dormido del todo\n p.sweat = 0.8; // gota de agotamiento en la frente\n p.puff = 0.7; // resoplido cansado\n break;\n\n case 'bored':\n p.eyeOpen = 0.45;\n p.mouthCurve = -0.2;\n p.browY = 2;\n p.gazeX = 6;\n p.puff = 0.4; // suspiro de aburrimiento, más tenue que el de agotamiento\n break;\n\n case 'waking':\n case 'spawning':\n p.eyeOpen = 0.75;\n p.eyeScale = 1.1;\n p.mouthCurve = 0.4;\n p.browY = -2;\n break;\n\n // 🔥 Ira, Alerta & Tensión\n case 'angry':\n p.eyeType = 3; // >‿< or sharp eyes\n p.browTilt = -0.75;\n p.mouthCurve = -0.65;\n p.mouthOpen = 0.2;\n p.eyeScale = 1.15;\n p.storm = 1; // nube de tormenta + rayo encima de la cabeza\n break;\n\n case 'alerting':\n case 'notifying':\n p.eyeScale = 1.3;\n p.browTilt = -0.4;\n p.mouthOpen = 0.45;\n p.mouthCurve = 0.1;\n break;\n\n case 'suspicious':\n p.browTilt = -0.5;\n p.eyeScale = 0.9;\n p.mouthCurve = -0.3;\n p.gazeX = -8;\n break;\n\n // 🎉 Alegría & Excitación\n case 'excited':\n case 'celebrate':\n p.eyeScale = 1.35;\n p.mouthCurve = 0.9;\n p.mouthOpen = 0.55;\n p.cheek = 0.85;\n p.browY = -4;\n break;\n\n case 'happy':\n case 'playful':\n p.eyeScale = 1.15;\n p.mouthCurve = 0.75;\n p.cheek = 0.6;\n p.browY = -2;\n break;\n\n case 'laughing':\n p.eyeType = 2;\n p.mouthCurve = 0.95;\n p.mouthOpen = 0.7;\n p.cheek = 0.9;\n p.bob = -3;\n break;\n\n case 'proud':\n p.eyeScale = 1.1;\n p.mouthCurve = 0.65;\n p.browY = -3;\n p.bob = -4;\n break;\n\n // 🤖 IA, Pensamiento & Proceso\n case 'thinking':\n case 'searching':\n p.browTilt = 0.5;\n p.eyeScale = 1.1;\n p.mouthWidth = 0.6;\n p.mouthCurve = 0.1;\n p.shiftX = -4;\n break;\n\n case 'dictating':\n case 'listening':\n case 'writing':\n case 'humming':\n p.mouthOpen = 0.45;\n p.mouthCurve = 0.4;\n p.eyeScale = 1.08;\n p.cheek = 0.4;\n break;\n\n case 'loading':\n case 'orbit':\n case 'radar':\n case 'progress':\n p.eyeScale = 1.15;\n p.mouthCurve = 0.3;\n p.browY = -2;\n break;\n\n // 😱 Sorpresa, Miedo & Duda\n case 'surprised':\n p.eyeScale = 1.45;\n p.mouthOpen = 0.75;\n p.mouthCurve = 0.0;\n p.browY = -7;\n break;\n\n case 'scared':\n p.eyeScale = 1.4;\n p.mouthOpen = 0.8;\n p.mouthCurve = -0.55;\n p.browTilt = 0.5;\n break;\n\n case 'confused':\n p.browTilt = 0.65;\n p.mouthCurve = -0.3;\n p.shiftX = -5;\n p.scribble = 1; // garabato de confusión encima de la cabeza\n break;\n\n case 'curious':\n p.browTilt = -0.3;\n p.eyeScale = 1.2;\n p.mouthCurve = 0.45;\n p.shiftX = 3;\n break;\n\n case 'shy':\n p.eyeScale = 0.85;\n p.gazeY = 6;\n p.cheek = 0.95;\n p.mouthCurve = 0.35;\n break;\n\n case 'sad':\n p.browTilt = 0.6;\n p.mouthCurve = -0.65;\n p.tears = 0.8;\n p.browY = 2;\n break;\n\n default:\n break;\n }\n\n return p;\n}\n\nexport class StateManager {\n private currentState: InteractionState = 'idle';\n private lastIndices: Record<string, number> = {};\n\n public getState(): InteractionState {\n return this.currentState;\n }\n\n public setState(newState: InteractionState): boolean {\n const changed = this.currentState !== newState;\n this.currentState = newState;\n return changed;\n }\n\n public resolvePool(\n expressions: Record<string, FaceParameters[]>,\n state: InteractionState = this.currentState\n ): FaceParameters[] {\n let pool: FaceParameters[] = [];\n\n if (expressions[state] && expressions[state].length > 0) {\n pool = expressions[state];\n } else {\n // Fallback base\n switch (state) {\n case 'happy':\n case 'excited':\n case 'playful':\n case 'celebrate':\n case 'laughing':\n case 'proud':\n pool = expressions.hover || expressions.idle;\n break;\n\n case 'surprised':\n case 'scared':\n case 'alerting':\n case 'notifying':\n case 'bouncing':\n pool = expressions.click || expressions.hover || expressions.idle;\n break;\n\n case 'suspicious':\n case 'angry':\n pool = expressions.click || expressions.idle;\n break;\n\n case 'curious':\n case 'thinking':\n case 'searching':\n case 'listening':\n case 'working':\n case 'confused':\n case 'shy':\n case 'sad':\n case 'dictating':\n case 'writing':\n case 'sending':\n case 'receiving':\n case 'uploading':\n case 'dragging':\n case 'humming':\n case 'loading':\n case 'orbit':\n case 'radar':\n case 'progress':\n pool = expressions.near || expressions.hover || expressions.idle;\n break;\n\n default:\n pool = expressions[state] || expressions.idle;\n break;\n }\n }\n\n // Aplicar proceduralmente los rasgos específicos del estado\n return pool.map(baseParams => getProceduralStateParams(baseParams, state));\n }\n\n public pickVariant(\n pool: FaceParameters[],\n state: InteractionState = this.currentState\n ): FaceParameters {\n if (!pool || pool.length === 0) {\n throw new Error(`Empty variant pool for state \"${state}\"`);\n }\n\n if (pool.length === 1) {\n this.lastIndices[state] = 0;\n return pool[0];\n }\n\n const lastIdx = this.lastIndices[state] ?? -1;\n let nextIdx = Math.floor(Math.random() * pool.length);\n\n while (nextIdx === lastIdx) {\n nextIdx = Math.floor(Math.random() * pool.length);\n }\n\n this.lastIndices[state] = nextIdx;\n return pool[nextIdx];\n }\n}\n","export type FrameCallback = (dt: number) => void;\n\nclass AnimationLoop {\n private callbacks: Set<FrameCallback> = new Set();\n private handle: number | null = null;\n private lastTime: number = 0;\n\n public add(cb: FrameCallback): void {\n this.callbacks.add(cb);\n if (!this.handle) {\n this.lastTime = performance.now();\n this.tick = this.tick.bind(this);\n this.handle = requestAnimationFrame(this.tick);\n }\n }\n\n public remove(cb: FrameCallback): void {\n this.callbacks.delete(cb);\n if (this.callbacks.size === 0 && this.handle !== null) {\n cancelAnimationFrame(this.handle);\n this.handle = null;\n }\n }\n\n public get size(): number {\n return this.callbacks.size;\n }\n\n private tick(now: number): void {\n const dt = Math.min((now - this.lastTime) / 1000, 0.1);\n this.lastTime = now;\n\n this.callbacks.forEach((cb) => cb(dt));\n\n if (this.callbacks.size > 0) {\n this.handle = requestAnimationFrame(this.tick);\n } else {\n this.handle = null;\n }\n }\n}\n\nexport const sharedLoop = new AnimationLoop();\n","/**\n * Puntos de una espiral de Arquímedes, en radio unitario (0 en el centro, 1\n * en el borde) — la misma figura que usa el burst de partículas de Knot\n * (`particles.ts`, shape 'spiral') y el ojo de garabato (`svg.ts`, eyeType 18).\n * Un solo lugar para la matemática: si cambia el giro, cambia en los dos sitios a la vez.\n */\nexport function spiralPoints(turns = 2.2, step = 0.25): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n const maxAngle = turns * Math.PI * 2;\n for (let a = 0; a <= maxAngle; a += step) {\n const r = a / maxAngle;\n points.push([Math.cos(a) * r, Math.sin(a) * r]);\n }\n return points;\n}\n","import type { FaceParameters, SilhouetteType } from '../emojis/types';\nimport { spiralPoints } from './spiral.ts';\n\nexport function getSilhouettePath(silhouette: SilhouetteType): string {\n switch (silhouette) {\n case 'circle':\n // Círculo perfecto — base neutra para emojis personalizados\n return 'M 50 13 A 37 37 0 1 0 50 87 A 37 37 0 1 0 50 13 Z';\n\n case 'heart':\n return 'M 50 21.67 C 54.17 17.5 65 12.5 74.17 16.67 C 85 21.67 89.17 35.83 85 48.33 C 80.83 61.67 66.67 74.17 50 74.17 C 33.33 74.17 19.17 61.67 15 48.33 C 10.83 35.83 15 21.67 25.83 16.67 C 35 12.5 45.83 17.5 50 21.67 Z';\n\n case 'capsule':\n // Silueta 1: Cápsula Horizontal\n return 'M 26 26 L 74 26 C 88 26 88 74 74 74 L 26 74 C 12 74 12 26 26 26 Z';\n\n case 'rounded-squircle':\n // Silueta 2: Cuadrado Hiper-Redondeado\n return 'M 32 18 L 68 18 C 84 18 84 32 84 50 C 84 68 84 82 68 82 L 32 82 C 16 82 16 68 16 50 C 16 32 16 18 32 18 Z';\n\n case 'pear-blob':\n // Silueta 3: Perita / Base Ancha\n return 'M 50 14 C 66 14 72 32 80 54 C 86 70 80 86 50 86 C 20 86 14 70 20 54 C 28 32 34 14 50 14 Z';\n\n case 'egg-oval':\n // Silueta 4: Huevo Invertido / Cúpula\n return 'M 18 54 C 18 26 32 14 50 14 C 68 14 82 26 82 54 C 82 74 70 84 50 84 C 30 84 18 74 18 54 Z';\n\n case 'starburst-puff':\n // Silueta 5: Bloque de 4 Abultamientos\n return 'M 34 18 C 50 24 50 24 66 18 C 78 18 84 30 80 46 C 84 62 78 82 66 82 C 50 76 50 76 34 82 C 22 82 16 62 20 46 C 16 30 22 18 34 18 Z';\n\n case 'pill-vertical':\n // Silueta 6: Cápsula Alta Vertical\n return 'M 26 28 C 26 12 74 12 74 28 L 74 72 C 74 88 26 88 26 72 Z';\n\n case 'round-blob':\n // Zumi / flutter\n return 'M 86.5 53.64 C 86.5 73.98 70.16 77.2 50 77.2 C 29.84 77.2 13.5 73.98 13.5 53.64 C 13.5 33.29 29.84 16.8 50 16.8 C 70.16 16.8 86.5 33.29 86.5 53.64 Z';\n\n case 'ghost-blob':\n return 'M 50 14.17 C 70 14.17 83.33 29.17 83.33 47.5 L 83.33 70 C 83.33 75 78.33 75.83 75.83 71.67 C 73.33 65.83 67.5 65.83 65 71.67 C 62.5 77.5 56.67 77.5 54.17 71.67 C 51.67 65.83 45.83 65.83 43.33 71.67 C 40.83 77.5 35 77.5 32.5 71.67 C 30 65.83 24.17 65.83 21.67 71.67 C 19.17 75.83 16.67 75 16.67 70 L 16.67 47.5 C 16.67 29.17 30 14.17 50 14.17 Z';\n\n case 'oval':\n return 'M 45.24 12.83 C 58.45 10.98 74.32 28.1 76.87 46.26 C 79.31 63.59 69.61 78.41 54.76 80.5 C 39.9 82.59 26.49 71.01 24.06 53.68 C 21.51 35.52 32.04 14.69 45.24 12.83 Z';\n\n case 'elongated-oval':\n // Suri / pleasure\n return 'M 86.38 54.82 C 87.03 78.56 86.38 75.48 49.94 76.67 C 13.52 77.86 13.5 75.67 13.5 54.82 C 13.5 33.97 29.81 17.07 49.94 17.07 C 70.06 17.07 86.38 33.97 86.38 54.82 Z';\n\n case 'teardrop-blob':\n return 'M 50 14.17 C 70 14.17 84.17 28.33 84.17 47.5 C 84.17 69.17 69.17 81.67 49.17 81.67 C 30 81.67 15.83 68.33 15.83 47.5 C 15.83 28.33 30 14.17 50 14.17 Z';\n\n case 'flame-blob':\n return 'M 20 43.33 L 25.83 18.33 L 36.67 35 L 47.5 13.33 L 58.33 33.33 L 70 20 L 75.83 43.33 C 82.5 51.67 80 65.83 70 74.17 C 58.33 83.33 38.33 81.67 27.5 72.5 C 18.33 65 14.17 51.67 20 43.33 Z';\n\n case 'droopy-blob':\n // Wilt / disappointed — cuerpo + dos brazos laterales\n return 'M 47.83 15.03 C 64.86 12.2 79.26 26.85 79.26 43.84 C 79.26 62.72 77.35 73.65 59.63 78.17 C 41.9 82.69 18.53 73.61 19.16 56.42 C 19.16 33.97 20.59 24.37 35.7 17.57 C 39.66 15.66 43.78 15.72 47.83 15.03 Z M 13.5 49.19 A 6.92 6.92 0 1 0 27.34 49.19 A 6.92 6.92 0 1 0 13.5 49.19 Z M 72.66 49.19 A 6.92 6.92 0 1 0 86.5 49.19 A 6.92 6.92 0 1 0 72.66 49.19 Z';\n\n case 'bear-blob':\n // Knot / stress — cuerpo + dos orejas\n return 'M 85.2 51.24 C 85.2 71.22 69.15 78.94 49.35 78.94 C 29.55 78.94 13.5 71.22 13.5 51.24 C 13.5 31.26 29.55 15.06 49.35 15.06 C 69.15 15.06 85.2 31.26 85.2 51.24 Z M 86.5 29.08 C 86.5 34.3 81.98 38.53 76.4 38.53 C 70.82 38.53 66.29 34.3 66.29 29.08 C 66.29 23.86 70.82 19.63 76.4 19.63 C 81.98 19.63 86.5 23.86 86.5 29.08 Z M 13.5 29.08 A 10.1 9.45 0 1 0 33.7 29.08 A 10.1 9.45 0 1 0 13.5 29.08 Z';\n\n case 'spiky-blob':\n return 'M 50 12 C 76 12 88 26 88 48 C 88 64 88 78 84 86 C 78 82 72 92 64 86 C 56 82 50 90 44 86 C 36 92 30 82 12 48 C 12 26 24 12 50 12 Z';\n\n case 'cloud-blob':\n return 'M 50 12.5 C 60 9.17 69.17 15.83 71.67 21.67 C 79.17 24.17 83.33 32.5 80.83 40 C 85.83 47.5 83.33 57.5 78.33 61.67 C 76.67 70.83 68.33 76.67 60 74.17 C 53.33 80 42.5 80 35.83 74.17 C 27.5 76.67 20 70 18.33 61.67 C 13.33 56.67 11.67 47.5 16.67 40 C 14.17 32.5 20 24.17 27.5 21.67 C 30.83 15 40 9.17 50 12.5 Z';\n\n case 'wide-oval':\n return 'M 50 20.83 C 73.33 20.83 87.5 31.67 87.5 47.5 C 87.5 64.17 73.33 75.83 50 75.83 C 26.67 75.83 12.5 64.17 12.5 47.5 C 12.5 31.67 26.67 20.83 50 20.83 Z';\n\n case 'soft-round':\n return 'M 50 15 C 73.33 15 85 26.67 85 48.33 C 85 70 73.33 80 50 80 C 26.67 80 15 70 15 48.33 C 15 26.67 26.67 15 50 15 Z';\n\n case 'octopus-blob':\n return 'M 50 12.5 C 70 12.5 83.33 27.5 83.33 47.5 L 83.33 65.83 C 83.33 73.33 77.5 75 74.17 69.17 C 71.67 65 66.67 65 64.17 69.17 C 61.67 73.33 56.67 73.33 54.17 69.17 C 51.67 65 46.67 65 44.17 69.17 C 41.67 73.33 36.67 73.33 34.17 69.17 C 31.67 65 26.67 65 24.17 69.17 C 20.83 75 16.67 73.33 16.67 65.83 L 16.67 47.5 C 16.67 27.5 30 12.5 50 12.5 Z';\n\n case 'wave-blob':\n return 'M 50 13.33 C 63.33 13.33 75 20 76.67 31.67 C 77.5 40 70 43.33 76.67 50 C 82.5 56.67 75 73.33 56.67 76.67 C 50 78.33 43.33 78.33 36.67 75.83 C 21.67 70.83 17.5 58.33 23.33 51.67 C 28.33 45.83 21.67 41.67 23.33 33.33 C 25.83 20.83 36.67 13.33 50 13.33 Z';\n\n default:\n return 'M 50 12 C 78 12 90 26 90 52 C 90 78 78 88 50 88 C 22 88 10 78 10 52 C 10 26 22 12 50 12 Z';\n }\n}\n\nexport interface RenderOptions {\n flipX?: boolean;\n emphasis?: boolean;\n}\n\n/**\n * Trazo de garabato en coordenadas locales (centrado en 0,0, radio ~10) — una\n * sola figura reutilizada tanto para el ojo de garabato como para la nubecita\n * de confusión sobre la cabeza, para que sean literalmente \"el mismo garabato\".\n */\nconst SCRIBBLE_LOCAL_PATH =\n 'M -4 2 C 2 2 5 -2 1 -5 C -3 -8 -10 -6 -10 -1 C -10 5 -2 8 4 4 C 9 1 7 -6 0 -7';\n\nfunction buildScribbleGroup(\n cx: number,\n cy: number,\n scale: number,\n color: string,\n strokeWidth: number,\n extraAttrs = ''\n): string {\n return `<g transform=\"translate(${cx.toFixed(2)}, ${cy.toFixed(2)}) scale(${scale.toFixed(3)})\" ${extraAttrs}>\n <path d=\"${SCRIBBLE_LOCAL_PATH}\" stroke=\"${color}\" stroke-width=\"${(strokeWidth / scale).toFixed(2)}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" />\n </g>`;\n}\n\nexport function buildFace(\n silhouette: SilhouetteType,\n baseColor: string,\n params: FaceParameters,\n size: number,\n renderOptions: RenderOptions = {},\n time: number = 0\n): string {\n const currentTime = time || (typeof performance !== 'undefined' ? performance.now() / 1000 : Date.now() / 1000);\n\n const strokeColor = '#2C2C2A';\n const cheekColor = '#F0997B';\n const STROKE_W = 3.5;\n const silhouettePath = getSilhouettePath(silhouette);\n // Una silueta puede tener varias subformas (cuerpo + orejas). Se dibuja cada una\n // como <path> propio: así el solapamiento une en vez de recortar agujeros.\n const silhouetteParts = silhouettePath\n .split(/(?=M )/)\n .map((d) => d.trim())\n .filter(Boolean)\n .map((d) => `<path d=\"${d}\" fill=\"${baseColor}\" />`)\n .join('');\n\n const { flipX = false, emphasis = false } = renderOptions;\n\n const gazeX = Math.max(-13.2, Math.min(13.2, params.gazeX ?? 0));\n const gazeY = Math.max(-8.4, Math.min(8.4, params.gazeY ?? 0));\n\n const eyeHalfGap = (params.eyeGap ?? 32) / 2;\n const baseEyeY = (params.eyeY ?? 45) + gazeY;\n const rawLeftEyeX = 50 - eyeHalfGap + gazeX;\n const rawRightEyeX = 50 + eyeHalfGap + gazeX;\n\n const headRadius = 40;\n const headCenterX = 50 + (params.shiftX ?? 0);\n const turn = params.turnAngle ?? 0;\n\n const computeSphericalProjection = (rawX: number) => {\n const offset = rawX - headCenterX;\n const clampedOffset = Math.max(-headRadius, Math.min(headRadius, offset));\n const long0 = Math.asin(clampedOffset / headRadius);\n const longNew = long0 + turn;\n const cosNew = Math.cos(longNew);\n\n const isVisible = cosNew > 0;\n const projX = headCenterX + headRadius * Math.sin(longNew);\n const scaleX = isVisible ? Math.max(0, cosNew / Math.cos(long0)) : 0;\n\n return { projX, scaleX, isVisible };\n };\n\n const leftProj = computeSphericalProjection(rawLeftEyeX);\n const rightProj = computeSphericalProjection(rawRightEyeX);\n\n const eyeScale = (params.eyeScale ?? 1.0) * (emphasis ? 1.15 : 1.0);\n const eyeType = Math.round(params.eyeType ?? 0);\n\n let leftEyeSvg = '';\n let rightEyeSvg = '';\n\n const renderSingleEye = (x: number, y: number, scaleX: number, isRight: boolean) => {\n if (scaleX <= 0.01) return '';\n\n const effectiveScale = eyeScale * scaleX;\n const eyeTransform = `transform=\"translate(${x}, ${y}) scale(${scaleX.toFixed(2)}, 1) translate(${-x}, ${-y})\"`;\n\n switch (eyeType) {\n case 1:\n // Arco hacia arriba ^ ^\n return `<g ${eyeTransform}><path d=\"M ${x - 5.83 * eyeScale} ${y + 1.67 * eyeScale} Q ${x} ${y - 5.83 * eyeScale} ${x + 5.83 * eyeScale} ${y + 1.67 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`;\n\n case 2:\n // Cuña > <\n return isRight\n ? `<g ${eyeTransform}><path d=\"M ${x + 3.33 * eyeScale} ${y - 5 * eyeScale} L ${x - 3.33 * eyeScale} ${y} L ${x + 3.33 * eyeScale} ${y + 5 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" /></g>`\n : `<g ${eyeTransform}><path d=\"M ${x - 3.33 * eyeScale} ${y - 5 * eyeScale} L ${x + 3.33 * eyeScale} ${y} L ${x - 3.33 * eyeScale} ${y + 5 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" /></g>`;\n\n case 3:\n return isRight\n ? `<g ${eyeTransform}><line x1=\"${x - 5 * eyeScale}\" y1=\"${y + 3 * eyeScale}\" x2=\"${x + 5 * eyeScale}\" y2=\"${y - 3 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"3.2\" stroke-linecap=\"round\" /></g>`\n : `<g ${eyeTransform}><line x1=\"${x - 5 * eyeScale}\" y1=\"${y - 3 * eyeScale}\" x2=\"${x + 5 * eyeScale}\" y2=\"${y + 3 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"3.2\" stroke-linecap=\"round\" /></g>`;\n\n case 4:\n return isRight\n ? `<g ${eyeTransform}><line x1=\"${x - 5 * eyeScale}\" y1=\"${y - 3 * eyeScale}\" x2=\"${x + 5 * eyeScale}\" y2=\"${y + 3 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"3.2\" stroke-linecap=\"round\" /></g>`\n : `<g ${eyeTransform}><line x1=\"${x - 5 * eyeScale}\" y1=\"${y + 3 * eyeScale}\" x2=\"${x + 5 * eyeScale}\" y2=\"${y - 3 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"3.2\" stroke-linecap=\"round\" /></g>`;\n\n case 5:\n // Ojo con pupila (blanco sin contorno + pupila baja)\n return `<g ${eyeTransform}>\n <ellipse cx=\"${x}\" cy=\"${y}\" rx=\"${5 * eyeScale}\" ry=\"${5.83 * eyeScale}\" fill=\"#ffffff\" />\n <circle cx=\"${x}\" cy=\"${y + 0.83 * eyeScale}\" r=\"${2.17 * eyeScale}\" fill=\"${strokeColor}\" />\n </g>`;\n\n case 6:\n return `<g ${eyeTransform} fill=\"#E3536C\"><path d=\"M ${x} ${y + 5 * eyeScale} C ${x - 8 * eyeScale} ${y - 2 * eyeScale} ${x - 5 * eyeScale} ${y - 7 * eyeScale} ${x} ${y - 3 * eyeScale} C ${x + 5 * eyeScale} ${y - 7 * eyeScale} ${x + 8 * eyeScale} ${y - 2 * eyeScale} ${x} ${y + 5 * eyeScale} Z\" /></g>`;\n\n case 7:\n return `<g ${eyeTransform} stroke=\"${strokeColor}\" stroke-width=\"3.2\">\n <line x1=\"${x - 4.5 * eyeScale}\" y1=\"${y - 4.5 * eyeScale}\" x2=\"${x + 4.5 * eyeScale}\" y2=\"${y + 4.5 * eyeScale}\" stroke-linecap=\"round\" />\n <line x1=\"${x - 4.5 * eyeScale}\" y1=\"${y + 4.5 * eyeScale}\" x2=\"${x + 4.5 * eyeScale}\" y2=\"${y - 4.5 * eyeScale}\" stroke-linecap=\"round\" />\n </g>`;\n\n case 8:\n return `<g ${eyeTransform} stroke=\"${strokeColor}\" stroke-width=\"2.8\" stroke-linecap=\"round\">\n <line x1=\"${x - 5 * eyeScale}\" y1=\"${y - 2}\" x2=\"${x + 5 * eyeScale}\" y2=\"${y - 2}\" />\n <line x1=\"${x - 5 * eyeScale}\" y1=\"${y + 2}\" x2=\"${x + 5 * eyeScale}\" y2=\"${y + 2}\" />\n </g>`;\n\n case 9:\n if (isRight) return '';\n return `<g transform=\"translate(0, 0)\">\n <path d=\"M ${leftProj.projX - 12} ${y - 2} L ${rightProj.projX + 12} ${y - 2}\" stroke=\"${strokeColor}\" stroke-width=\"2.8\" />\n <rect x=\"${leftProj.projX - 9}\" y=\"${y - 6}\" width=\"16\" height=\"12\" rx=\"3\" fill=\"${strokeColor}\" />\n <rect x=\"${rightProj.projX - 7}\" y=\"${y - 6}\" width=\"16\" height=\"12\" rx=\"3\" fill=\"${strokeColor}\" />\n </g>`;\n\n case 10:\n if (!isRight) {\n return `<g ${eyeTransform}><ellipse cx=\"${x}\" cy=\"${y}\" rx=\"${6 * eyeScale}\" ry=\"${8 * eyeScale}\" fill=\"${strokeColor}\" /></g>`;\n }\n return `<g ${eyeTransform}><circle cx=\"${x}\" cy=\"${y}\" r=\"${3.2 * eyeScale}\" fill=\"${strokeColor}\" /></g>`;\n\n case 11:\n if (!isRight) {\n return `<g ${eyeTransform}><line x1=\"${x - 5 * eyeScale}\" y1=\"${y}\" x2=\"${x + 5 * eyeScale}\" y2=\"${y}\" stroke=\"${strokeColor}\" stroke-width=\"3.2\" stroke-linecap=\"round\" /></g>`;\n }\n return `<g ${eyeTransform}><circle cx=\"${x}\" cy=\"${y}\" r=\"${4.2 * eyeScale}\" fill=\"${strokeColor}\" /></g>`;\n\n case 12:\n return `<g ${eyeTransform}>\n <ellipse cx=\"${x}\" cy=\"${y}\" rx=\"${3 * eyeScale}\" ry=\"${6 * eyeScale}\" fill=\"${strokeColor}\" />\n </g>`;\n\n case 13:\n return `<g ${eyeTransform}><circle cx=\"${x}\" cy=\"${y}\" r=\"${6.5 * eyeScale}\" fill=\"${strokeColor}\" /></g>`;\n\n case 14:\n // Arco hacia abajo — ojos cerrados serenos (Nima)\n return `<g ${eyeTransform}><path d=\"M ${x - 5.83 * eyeScale} ${y - 1.67 * eyeScale} Q ${x} ${y + 5.83 * eyeScale} ${x + 5.83 * eyeScale} ${y - 1.67 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`;\n\n case 15:\n // Párpado caído (Dozy, Wilt)\n return isRight\n ? `<g ${eyeTransform}><path d=\"M ${x + 6.67 * eyeScale} ${y + 2.5 * eyeScale} Q ${x} ${y - 5 * eyeScale} ${x - 6.67 * eyeScale} ${y - 0.83 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`\n : `<g ${eyeTransform}><path d=\"M ${x - 6.67 * eyeScale} ${y + 2.5 * eyeScale} Q ${x} ${y - 5 * eyeScale} ${x + 6.67 * eyeScale} ${y - 0.83 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`;\n\n case 16:\n // Raya vertical (Lumo) — la lágrima la aporta el sistema animado `tears`\n return `<g ${eyeTransform}><path d=\"M ${x} ${y - 4.17 * eyeScale} L ${x} ${y + 3.33 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`;\n\n case 17:\n // Ceja enojada en diagonal (Brix)\n return isRight\n ? `<g ${eyeTransform}><path d=\"M ${x + 5.83 * eyeScale} ${y - 6.67 * eyeScale} L ${x - 5 * eyeScale} ${y + 0.83 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`\n : `<g ${eyeTransform}><path d=\"M ${x - 5.83 * eyeScale} ${y - 6.67 * eyeScale} L ${x + 5 * eyeScale} ${y + 0.83 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`;\n\n case 18: {\n // Ojo de garabato (Knot) — la misma espiral que dibuja su propia\n // partícula 'spiral' (particles.ts), vía spiralPoints() compartido\n const spiralRadius = 4.6 * eyeScale;\n const d = spiralPoints()\n .map(([ux, uy], i) => {\n const px = (x + ux * spiralRadius).toFixed(2);\n const py = (y + uy * spiralRadius).toFixed(2);\n return `${i === 0 ? 'M' : 'L'} ${px} ${py}`;\n })\n .join(' ');\n // Trazo fino a propósito: con las vueltas tan juntas cerca del centro,\n // un stroke grueso las fusiona en una mancha en vez de leerse como espiral\n return `<g ${eyeTransform}><path d=\"${d}\" stroke=\"${strokeColor}\" stroke-width=\"1.3\" stroke-linecap=\"round\" fill=\"none\" /></g>`;\n }\n\n case 19:\n // Ojo somnoliento: aro con párpado curvo (Snug)\n return `<g ${eyeTransform}>\n <circle cx=\"${x}\" cy=\"${y}\" r=\"${4.5 * eyeScale}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.63\" />\n <path d=\"M ${x - 2.83 * eyeScale} ${y - 0.42 * eyeScale} Q ${x} ${y + 2.83 * eyeScale} ${x + 2.83 * eyeScale} ${y - 0.42 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"2.63\" stroke-linecap=\"round\" fill=\"none\" />\n </g>`;\n\n case 20:\n // Aro hueco (Pip, Void)\n return `<g ${eyeTransform}><circle cx=\"${x}\" cy=\"${y}\" r=\"${3.67 * eyeScale}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.8\" /></g>`;\n\n case 21: {\n // Estrella — asombro/excitación tipo starstruck\n const r = 6 * eyeScale;\n const k = r * 0.22; // qué tan \"pinchado\" queda el centro entre puntas\n const d = `M ${x} ${y - r} Q ${x + k} ${y - k} ${x + r} ${y} Q ${x + k} ${y + k} ${x} ${y + r} Q ${x - k} ${y + k} ${x - r} ${y} Q ${x - k} ${y - k} ${x} ${y - r} Z`;\n return `<g ${eyeTransform}><path d=\"${d}\" fill=\"${strokeColor}\" /></g>`;\n }\n\n case 22:\n // Reojo — pupila corrida al mismo lado en ambos ojos (desconfianza)\n return `<g ${eyeTransform}>\n <ellipse cx=\"${x}\" cy=\"${y}\" rx=\"${5.5 * eyeScale}\" ry=\"${3.3 * eyeScale}\" fill=\"#ffffff\" stroke=\"${strokeColor}\" stroke-width=\"1.4\" />\n <circle cx=\"${x - 2.2 * eyeScale}\" cy=\"${y}\" r=\"${1.8 * eyeScale}\" fill=\"${strokeColor}\" />\n </g>`;\n\n case 23:\n // Guiño de un solo ojo — a diferencia de 3/4 (que espejan la misma\n // diagonal en los dos ojos), acá uno se cierra y el otro queda normal\n return isRight\n ? `<g ${eyeTransform}><ellipse cx=\"${x}\" cy=\"${y}\" rx=\"${2.83 * eyeScale}\" ry=\"${Math.max(0.5, 2.83 * eyeScale * Math.max(0.05, params.eyeOpen))}\" fill=\"${strokeColor}\" /></g>`\n : `<g ${eyeTransform}><path d=\"M ${x - 5 * eyeScale} ${y} Q ${x} ${y + 4 * eyeScale} ${x + 5 * eyeScale} ${y}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" /></g>`;\n\n case 24: {\n // Ojo grande estilo anime, con brillo — óvalo relleno + punto blanco\n const rx = 4.2 * eyeScale, ry = 5.8 * eyeScale;\n return `<g ${eyeTransform}>\n <ellipse cx=\"${x}\" cy=\"${y}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"${strokeColor}\" />\n <circle cx=\"${x - rx * 0.35}\" cy=\"${y - ry * 0.4}\" r=\"${1.3 * eyeScale}\" fill=\"#ffffff\" />\n </g>`;\n }\n\n case 25:\n // Entrecerrado con pestaña — mirada relajada\n return isRight\n ? `<g ${eyeTransform}>\n <path d=\"M ${x - 5 * eyeScale} ${y} Q ${x} ${y + 2 * eyeScale} ${x + 5 * eyeScale} ${y}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" />\n <line x1=\"${x + 5 * eyeScale}\" y1=\"${y - 0.5 * eyeScale}\" x2=\"${x + 7 * eyeScale}\" y2=\"${y - 2.5 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </g>`\n : `<g ${eyeTransform}>\n <path d=\"M ${x - 5 * eyeScale} ${y} Q ${x} ${y + 2 * eyeScale} ${x + 5 * eyeScale} ${y}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" fill=\"none\" />\n <line x1=\"${x - 5 * eyeScale}\" y1=\"${y - 0.5 * eyeScale}\" x2=\"${x - 7 * eyeScale}\" y2=\"${y - 2.5 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </g>`;\n\n case 26:\n // Saltón — aro hueco con pupila corrida a una esquina (googly eyes)\n return `<g ${eyeTransform}>\n <circle cx=\"${x}\" cy=\"${y}\" r=\"${5 * eyeScale}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.2\" />\n <circle cx=\"${x + 1.6 * eyeScale}\" cy=\"${y + 1.6 * eyeScale}\" r=\"${1.7 * eyeScale}\" fill=\"${strokeColor}\" />\n </g>`;\n\n case 27: {\n // Cascada ⊓⊓ — ojos \"desbordado llorando\" de anime/manga\n const w = 4 * eyeScale, h = 8 * eyeScale;\n return `<g ${eyeTransform}><path d=\"M ${x - w} ${y + h} L ${x - w} ${y - h} L ${x + w} ${y - h} L ${x + w} ${y + h}\" stroke=\"${strokeColor}\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" /></g>`;\n }\n\n case 28:\n // Mirada plana — óvalo fijo, no reacciona a eyeOpen (a diferencia del\n // 0 default), \"no me importa nada\" permanente\n return `<g ${eyeTransform}><ellipse cx=\"${x}\" cy=\"${y}\" rx=\"${4.5 * eyeScale}\" ry=\"${3 * eyeScale}\" fill=\"${strokeColor}\" /></g>`;\n\n case 29:\n // Ceja preocupada — arco hacia arriba + pupila chica debajo\n return `<g ${eyeTransform}>\n <path d=\"M ${x - 4 * eyeScale} ${y - 3 * eyeScale} Q ${x} ${y - 6 * eyeScale} ${x + 4 * eyeScale} ${y - 2.5 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\" />\n <circle cx=\"${x}\" cy=\"${y + 1.5 * eyeScale}\" r=\"${1.6 * eyeScale}\" fill=\"${strokeColor}\" />\n </g>`;\n\n case 30:\n // Ceja enojada en zigzag — más dramática que la diagonal simple (17)\n return isRight\n ? `<g ${eyeTransform}><path d=\"M ${x + 6 * eyeScale} ${y - 6 * eyeScale} L ${x + 2 * eyeScale} ${y - 3 * eyeScale} L ${x + 5 * eyeScale} ${y - 1 * eyeScale} L ${x - 3 * eyeScale} ${y + 2 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" /></g>`\n : `<g ${eyeTransform}><path d=\"M ${x - 6 * eyeScale} ${y - 6 * eyeScale} L ${x - 2 * eyeScale} ${y - 3 * eyeScale} L ${x - 5 * eyeScale} ${y - 1 * eyeScale} L ${x + 3 * eyeScale} ${y + 2 * eyeScale}\" stroke=\"${strokeColor}\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" /></g>`;\n\n case 31:\n // Aro con pupila chica centrada — mirada contenta, distinto del 20\n // (aro sin nada adentro) y del 26 (pupila grande corrida a un lado)\n return `<g ${eyeTransform}>\n <circle cx=\"${x}\" cy=\"${y}\" r=\"${4 * eyeScale}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2\" />\n <circle cx=\"${x}\" cy=\"${y}\" r=\"${1.3 * eyeScale}\" fill=\"${strokeColor}\" />\n </g>`;\n\n case 0:\n default:\n const rx = 2.83 * effectiveScale;\n const ry = Math.max(0.5, rx * Math.max(0.05, params.eyeOpen));\n return `<ellipse cx=\"${x.toFixed(2)}\" cy=\"${y.toFixed(2)}\" rx=\"${rx.toFixed(2)}\" ry=\"${ry.toFixed(2)}\" fill=\"${strokeColor}\" />`;\n }\n };\n\n leftEyeSvg = leftProj.isVisible ? renderSingleEye(leftProj.projX, baseEyeY, leftProj.scaleX, false) : '';\n rightEyeSvg = rightProj.isVisible ? renderSingleEye(rightProj.projX, baseEyeY, rightProj.scaleX, true) : '';\n\n let tearsSvg = '';\n const tears = params.tears ?? 0;\n if (tears > 0.01) {\n const tearMaxOpacity = Math.min(1, tears);\n // Slow melancholic cycle (~2.8s per tear drop)\n const dripProgress = (currentTime * 0.36) % 1;\n\n let dripY = 0;\n let opacity = tearMaxOpacity;\n let scaleY = 1;\n\n if (dripProgress < 0.25) {\n // Swell under eye\n const p = dripProgress / 0.25;\n dripY = p * 1.2;\n scaleY = 0.75 + p * 0.35;\n opacity = tearMaxOpacity * (0.3 + p * 0.7);\n } else if (dripProgress < 0.82) {\n // Gentle slide down cheek\n const p = (dripProgress - 0.25) / 0.57;\n dripY = 1.2 + p * 10.5;\n scaleY = 1.1 - p * 0.2;\n opacity = tearMaxOpacity;\n } else {\n // Soft fade out at bottom\n const p = (dripProgress - 0.82) / 0.18;\n dripY = 11.7 + p * 2.5;\n scaleY = 0.9 - p * 0.4;\n opacity = tearMaxOpacity * (1 - p);\n }\n\n if (params.cascadeTears) {\n // Cascada de lágrimas cubriendo la cara\n tearsSvg = `\n <g opacity=\"${opacity.toFixed(2)}\">\n <path d=\"M ${leftProj.projX - 3} ${baseEyeY + 4} L ${leftProj.projX - 6} 88 L ${leftProj.projX + 2} 88 Z\" fill=\"#7FA6D9\" opacity=\"0.85\" />\n <path d=\"M ${rightProj.projX - 2} ${baseEyeY + 4} L ${rightProj.projX - 2} 88 L ${rightProj.projX + 6} 88 Z\" fill=\"#7FA6D9\" opacity=\"0.85\" />\n </g>\n `;\n } else {\n // Dos lágrimas pequeñas y redonditas cayendo animadas bajo los ojos (como Lumo)\n const ly = (baseEyeY + 7).toFixed(2);\n const lx = (leftProj.projX - 1.2).toFixed(2);\n const rx = (rightProj.projX + 1.2).toFixed(2);\n\n const lxNum = parseFloat(lx);\n const rxNum = parseFloat(rx);\n const lyNum = parseFloat(ly);\n\n tearsSvg = `\n <g opacity=\"${opacity.toFixed(2)}\">\n <g transform=\"translate(0, ${dripY.toFixed(2)}) scale(${scaleY.toFixed(2)})\">\n <!-- Lágrima redondita ojo izquierdo -->\n <path d=\"M ${lx} ${(lyNum - 2.5).toFixed(2)} C ${(lxNum + 2.2).toFixed(2)} ${(lyNum - 0.5).toFixed(2)} ${(lxNum + 2.2).toFixed(2)} ${(lyNum + 2.2).toFixed(2)} ${lx} ${(lyNum + 3.2).toFixed(2)} C ${(lxNum - 2.2).toFixed(2)} ${(lyNum + 2.2).toFixed(2)} ${(lxNum - 2.2).toFixed(2)} ${(lyNum - 0.5).toFixed(2)} ${lx} ${(lyNum - 2.5).toFixed(2)} Z\" fill=\"#ffffff\" />\n <!-- Lágrima redondita ojo derecho -->\n <path d=\"M ${rx} ${(lyNum - 2.5).toFixed(2)} C ${(rxNum + 2.2).toFixed(2)} ${(lyNum - 0.5).toFixed(2)} ${(rxNum + 2.2).toFixed(2)} ${(lyNum + 2.2).toFixed(2)} ${rx} ${(lyNum + 3.2).toFixed(2)} C ${(rxNum - 2.2).toFixed(2)} ${(lyNum + 2.2).toFixed(2)} ${(rxNum - 2.2).toFixed(2)} ${(lyNum - 0.5).toFixed(2)} ${rx} ${(lyNum - 2.5).toFixed(2)} Z\" fill=\"#ffffff\" />\n </g>\n </g>\n `;\n }\n }\n\n let accessoriesSvg = '';\n if (params.zzz) {\n const cycleTime = currentTime * 0.75;\n const zCount = 3;\n\n accessoriesSvg += `<g stroke=\"${strokeColor}\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">`;\n\n for (let i = 0; i < zCount; i++) {\n const progress = ((cycleTime + (i / zCount)) % 1);\n const x = 68 + progress * 20 + Math.sin(progress * Math.PI * 2) * 2;\n const y = 30 - progress * 26;\n const scale = 0.5 + Math.sin(progress * Math.PI) * 0.65;\n const opacity = Math.sin(progress * Math.PI) * 0.95;\n\n const strokeW = (1.8 + scale * 0.7).toFixed(2);\n const zScale = scale.toFixed(2);\n\n if (opacity > 0.01) {\n accessoriesSvg += `\n <g transform=\"translate(${x.toFixed(2)}, ${y.toFixed(2)}) scale(${zScale}) translate(-72, -31)\" opacity=\"${opacity.toFixed(2)}\">\n <path d=\"M 68 28 L 76 28 L 68 34 L 76 34\" stroke-width=\"${strokeW}\" />\n </g>\n `;\n }\n }\n accessoriesSvg += `</g>`;\n }\n\n if (params.sweat) {\n // Varias gotas, no una sola: cada una en su propia fase y en un lado\n // distinto de la frente, para que se lea como agotamiento de verdad\n const drops = [\n { x: 80, delay: 0, scale: 1 },\n { x: 20, delay: 0.4, scale: 0.85 },\n { x: 71, delay: 0.7, scale: 0.7 },\n ];\n const sweatOpacity = Math.min(1, params.sweat);\n\n accessoriesSvg += `<g fill=\"#7FA6D9\">`;\n for (const drop of drops) {\n const progress = (currentTime * 1.2 + drop.delay) % 1;\n const dropY = 25 + progress * 7; // 25 = centro Y del path base\n const opacity = sweatOpacity * Math.sin(progress * Math.PI);\n if (opacity > 0.01) {\n // Escala alrededor del propio centro de la gota (80, 25), luego la\n // mueve a su posición final — si se escala desde el origen del\n // viewBox, la gota \"vuela\" en vez de encogerse en su sitio.\n accessoriesSvg += `\n <g transform=\"translate(${drop.x}, ${dropY.toFixed(2)}) scale(${drop.scale}) translate(-80, -25)\" opacity=\"${opacity.toFixed(2)}\">\n <path d=\"M 76 26 C 76 22 80 20 80 20 C 80 20 84 22 84 26 C 84 28.5 82.2 30 80 30 C 77.8 30 76 28.5 76 26 Z\" />\n </g>\n `;\n }\n }\n accessoriesSvg += `</g>`;\n }\n\n if (params.storm) {\n // Dos nubecitas de tormenta encima de la cabeza, sin rayo — solo las nubes.\n // Cada una deriva y respira por su cuenta y fuera de fase para que no se\n // queden pegadas ahí quietas.\n const stormOpacity = Math.min(1, params.storm);\n const driftL = Math.sin(currentTime * 1.4) * 1.2;\n const driftR = Math.sin(currentTime * 1.4 + 1.8) * 1.2;\n const breatheL = 0.85 + Math.sin(currentTime * 1.4) * 0.15;\n const breatheR = 0.85 + Math.sin(currentTime * 1.4 + 1.8) * 0.15;\n accessoriesSvg += `\n <g opacity=\"${stormOpacity.toFixed(2)}\" fill=\"#8a8a86\">\n <path transform=\"translate(${driftL.toFixed(2)}, ${(Math.abs(driftL) * -0.4).toFixed(2)})\" opacity=\"${breatheL.toFixed(2)}\" d=\"M 22 6 C 22 3 25 1.5 27 2.3 C 27.6 0.5 30 -0.3 31.7 1 C 33.3 -0.7 36.5 0.3 36.5 3 C 38.2 3 39.5 4.5 39 6.2 C 39 8 37.3 9 35.6 9 L 24 9 C 22.3 9 22 7.5 22 6 Z\" />\n <path transform=\"translate(${driftR.toFixed(2)}, ${(Math.abs(driftR) * -0.4).toFixed(2)})\" opacity=\"${breatheR.toFixed(2)}\" d=\"M 62 8 C 62 5.3 64.8 3.9 66.6 4.6 C 67.2 3 69.4 2.3 71 3.5 C 72.5 1.9 75.4 2.8 75.4 5.3 C 77 5.3 78.2 6.7 77.7 8.2 C 77.7 9.8 76.1 10.7 74.6 10.7 L 63.8 10.7 C 62.3 10.7 62 9.4 62 8 Z\" />\n </g>\n `;\n }\n\n if (params.scribble) {\n // El mismo garabato que el ojo de Knot (buildScribbleGroup), pero encima\n // de la cabeza — gira despacio y sin ritmo fijo, como un pensamiento que\n // no logra cerrar el círculo, y late un poco de tamaño con otra frecuencia\n const scribbleOpacity = Math.min(1, params.scribble);\n const wobble = Math.sin(currentTime * 1.6) * 6;\n const pulse = 1 + Math.sin(currentTime * 2.3) * 0.06;\n accessoriesSvg += `\n <g transform=\"translate(50, 3) rotate(${wobble.toFixed(2)}) translate(-50, -3)\" opacity=\"${scribbleOpacity.toFixed(2)}\">\n ${buildScribbleGroup(50, 3, pulse, '#5B7FD6', 2.3)}\n </g>\n `;\n }\n\n if (params.puff) {\n // Bocanada de aliento cansado saliendo de la boca — sube y se disuelve\n const puffProgress = (currentTime * 0.55) % 1;\n const puffMouthY = params.mouthY ?? 63;\n const puffX = 68 + puffProgress * 12;\n const puffY = puffMouthY - puffProgress * 10;\n const puffScale = 0.4 + puffProgress * 0.9;\n const puffOpacity = Math.min(1, params.puff) * Math.sin(puffProgress * Math.PI) * 0.8;\n if (puffOpacity > 0.01) {\n accessoriesSvg += `\n <g fill=\"#B9BDB6\" opacity=\"${puffOpacity.toFixed(2)}\" transform=\"translate(${puffX.toFixed(2)}, ${puffY.toFixed(2)}) scale(${puffScale.toFixed(2)})\">\n <circle cx=\"0\" cy=\"0\" r=\"3.4\" />\n <circle cx=\"3\" cy=\"-1.2\" r=\"2.1\" />\n <circle cx=\"-2.4\" cy=\"-1\" r=\"1.8\" />\n </g>\n `;\n }\n }\n\n let browsSvg = '';\n if (params.browY !== 0 || params.browTilt !== 0) {\n const browBaseY = 32 + params.browY + gazeY * 0.5;\n const leftAngle = params.browTilt;\n const rightAngle = -params.browTilt;\n\n browsSvg = `\n <g transform=\"rotate(${leftAngle}, ${leftProj.projX}, ${browBaseY})\">\n <line x1=\"${leftProj.projX - 6}\" y1=\"${browBaseY}\" x2=\"${leftProj.projX + 6}\" y2=\"${browBaseY}\" stroke=\"${strokeColor}\" stroke-width=\"2.8\" stroke-linecap=\"round\" />\n </g>\n <g transform=\"rotate(${rightAngle}, ${rightProj.projX}, ${browBaseY})\">\n <line x1=\"${rightProj.projX - 6}\" y1=\"${browBaseY}\" x2=\"${rightProj.projX + 6}\" y2=\"${browBaseY}\" stroke=\"${strokeColor}\" stroke-width=\"2.8\" stroke-linecap=\"round\" />\n </g>\n `;\n }\n\n // Boca (24 tipos únicos, 0-24, más el default por mouthCurve)\n const mouthType = Math.round(params.mouthType ?? 0);\n const mouthW = Math.max(0, 14 * params.mouthWidth);\n const mouthX = 50 + gazeX * 0.6;\n const mouthY = (params.mouthY ?? 63) + gazeY * 0.4;\n\n let mouthSvg = '';\n switch (mouthType) {\n case 1: // ovalOpen / O\n mouthSvg = `<ellipse cx=\"${mouthX}\" cy=\"${mouthY}\" rx=\"${mouthW}\" ry=\"${mouthW * 1.24}\" fill=\"#B3554A\" />`;\n break;\n\n case 2: { // zigzag / ~~~~\n const step = (mouthW * 2) / 4;\n let d = `M ${mouthX - mouthW} ${mouthY}`;\n for (let i = 1; i <= 4; i++) d += ` L ${mouthX - mouthW + step * i} ${mouthY + (i % 2 ? 2.83 : 0)}`;\n mouthSvg = `<path d=\"${d}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`;\n break;\n }\n\n case 3: // flatLine / —\n mouthSvg = `<line x1=\"${mouthX - mouthW}\" y1=\"${mouthY}\" x2=\"${mouthX + mouthW}\" y2=\"${mouthY}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" />`;\n break;\n\n case 13: // hollowCircle / o (Fidge)\n mouthSvg = `<circle cx=\"${mouthX}\" cy=\"${mouthY}\" r=\"${mouthW * 2}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.8\" />`;\n break;\n\n case 14: // sin boca (Nima)\n mouthSvg = '';\n break;\n\n case 4: // teethClench / [≡]\n mouthSvg = `\n <rect x=\"${mouthX - 10}\" y=\"${mouthY - 4}\" width=\"20\" height=\"8\" rx=\"2\" fill=\"#ffffff\" stroke=\"${strokeColor}\" stroke-width=\"2.5\" />\n <line x1=\"${mouthX - 10}\" y1=\"${mouthY}\" x2=\"${mouthX + 10}\" y2=\"${mouthY}\" stroke=\"${strokeColor}\" stroke-width=\"1.8\" />\n <line x1=\"${mouthX - 3}\" y1=\"${mouthY - 4}\" x2=\"${mouthX - 3}\" y2=\"${mouthY + 4}\" stroke=\"${strokeColor}\" stroke-width=\"1.5\" />\n <line x1=\"${mouthX + 3}\" y1=\"${mouthY - 4}\" x2=\"${mouthX + 3}\" y2=\"${mouthY + 4}\" stroke=\"${strokeColor}\" stroke-width=\"1.5\" />\n `;\n break;\n\n case 5: // teethGrin / Sonrisa con dientes superiores\n mouthSvg = `\n <path d=\"M ${mouthX - 12} ${mouthY - 2} Q ${mouthX} ${mouthY + 12} ${mouthX + 12} ${mouthY - 2} Z\" fill=\"${strokeColor}\" />\n <path d=\"M ${mouthX - 10} ${mouthY - 2} L ${mouthX + 10} ${mouthY - 2} L ${mouthX + 8} ${mouthY + 2} L ${mouthX - 8} ${mouthY + 2} Z\" fill=\"#ffffff\" />\n `;\n break;\n\n case 6: // wideHappyOpen / D\n mouthSvg = `<path d=\"M ${mouthX - 13} ${mouthY - 3} Q ${mouthX} ${mouthY + 14} ${mouthX + 13} ${mouthY - 3} Z\" fill=\"#E87C8A\" stroke=\"${strokeColor}\" stroke-width=\"2.5\" />`;\n break;\n\n case 7: // crossMouth / X\n mouthSvg = `\n <g stroke=\"${strokeColor}\" stroke-width=\"3.5\" stroke-linecap=\"round\">\n <line x1=\"${mouthX - 5}\" y1=\"${mouthY - 5}\" x2=\"${mouthX + 5}\" y2=\"${mouthY + 5}\" />\n <line x1=\"${mouthX - 5}\" y1=\"${mouthY + 5}\" x2=\"${mouthX + 5}\" y2=\"${mouthY - 5}\" />\n </g>\n `;\n break;\n\n case 8: // maskCover / Mascarilla médica\n mouthSvg = `\n <g>\n <line x1=\"12\" y1=\"${mouthY - 2}\" x2=\"${mouthX - 14}\" y2=\"${mouthY - 2}\" stroke=\"#ffffff\" stroke-width=\"2\" />\n <line x1=\"12\" y1=\"${mouthY + 4}\" x2=\"${mouthX - 14}\" y2=\"${mouthY + 4}\" stroke=\"#ffffff\" stroke-width=\"2\" />\n <line x1=\"88\" y1=\"${mouthY - 2}\" x2=\"${mouthX + 14}\" y2=\"${mouthY - 2}\" stroke=\"#ffffff\" stroke-width=\"2\" />\n <line x1=\"88\" y1=\"${mouthY + 4}\" x2=\"${mouthX + 14}\" y2=\"${mouthY + 4}\" stroke=\"#ffffff\" stroke-width=\"2\" />\n <rect x=\"${mouthX - 15}\" y=\"${mouthY - 7}\" width=\"30\" height=\"16\" rx=\"3\" fill=\"#ffffff\" stroke=\"${strokeColor}\" stroke-width=\"2.2\" />\n </g>\n `;\n break;\n\n case 9: // wavyWMouth / ~ / 3\n mouthSvg = `<path d=\"M ${mouthX - 6} ${mouthY} Q ${mouthX - 3} ${mouthY - 3} ${mouthX} ${mouthY} Q ${mouthX + 3} ${mouthY - 3} ${mouthX + 6} ${mouthY}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.8\" stroke-linecap=\"round\" />`;\n break;\n\n case 10: // dotMouth / •\n mouthSvg = `<circle cx=\"${mouthX}\" cy=\"${mouthY}\" r=\"2.5\" fill=\"${strokeColor}\" />`;\n break;\n\n case 11: // diagonalLine / /\n mouthSvg = `<line x1=\"${mouthX - 6}\" y1=\"${mouthY + 3}\" x2=\"${mouthX + 6}\" y2=\"${mouthY - 3}\" stroke=\"${strokeColor}\" stroke-width=\"3\" stroke-linecap=\"round\" />`;\n break;\n\n case 12: // frownCurve / ∩\n mouthSvg = `<path d=\"M ${mouthX - mouthW} ${mouthY + 4} Q ${mouthX} ${mouthY - 6} ${mouthX + mouthW} ${mouthY + 4}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"3.2\" stroke-linecap=\"round\" />`;\n break;\n\n case 15: // tongueOut / :P juguetón\n mouthSvg = `\n <path d=\"M ${mouthX - mouthW} ${mouthY} Q ${mouthX} ${mouthY + 6} ${mouthX + mouthW} ${mouthY}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" />\n <path d=\"M ${mouthX - 3} ${mouthY + 2} Q ${mouthX} ${mouthY + 10} ${mouthX + 3} ${mouthY + 2} Z\" fill=\"#E3536C\" />\n `;\n break;\n\n case 16: // smirk / media sonrisa asimétrica\n mouthSvg = `<path d=\"M ${mouthX - mouthW} ${mouthY} Q ${mouthX + mouthW * 0.3} ${mouthY} ${mouthX + mouthW} ${mouthY - 5}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" />`;\n break;\n\n case 17: // triangleMouth / gatito\n mouthSvg = `<path d=\"M ${mouthX - 3.5} ${mouthY - 2} L ${mouthX + 3.5} ${mouthY - 2} L ${mouthX} ${mouthY + 4} Z\" fill=\"#E3536C\" />`;\n break;\n\n case 18: // catThree / >3< — la curva doble típica de las caras kawaii\n mouthSvg = `<path d=\"M ${mouthX - 3} ${mouthY - 4} Q ${mouthX + 3} ${mouthY - 4} ${mouthX - 1} ${mouthY} Q ${mouthX + 3} ${mouthY + 4} ${mouthX - 3} ${mouthY + 4}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`;\n break;\n\n case 19: // boxOpen / boca cuadrada de sorpresa\n mouthSvg = `<path d=\"M ${mouthX - 6} ${mouthY - 4} L ${mouthX + 6} ${mouthY - 4} L ${mouthX + 4} ${mouthY + 5} L ${mouthX - 4} ${mouthY + 5} Z\" fill=\"#B3554A\" stroke=\"${strokeColor}\" stroke-width=\"2\" />`;\n break;\n\n case 20: // pursed / mmm, boquita apretada\n mouthSvg = `<ellipse cx=\"${mouthX}\" cy=\"${mouthY}\" rx=\"3\" ry=\"1.4\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"2.2\" />`;\n break;\n\n case 21: { // teethRow / sonrisa abierta con fila de dientes marcados\n const w = mouthW;\n let bars = '';\n for (let i = 1; i < 4; i++) {\n const bx = mouthX - w + ((2 * w) / 4) * i;\n bars += `<line x1=\"${bx.toFixed(2)}\" y1=\"${mouthY - 4}\" x2=\"${bx.toFixed(2)}\" y2=\"${mouthY + 4}\" stroke=\"${strokeColor}\" stroke-width=\"1.3\" />`;\n }\n mouthSvg = `<rect x=\"${(mouthX - w).toFixed(2)}\" y=\"${mouthY - 4}\" width=\"${(w * 2).toFixed(2)}\" height=\"8\" rx=\"2\" fill=\"#ffffff\" stroke=\"${strokeColor}\" stroke-width=\"2.2\" />${bars}`;\n break;\n }\n\n case 22: // sideTongue / lengua de costado, asimétrica (a diferencia de 15, centrada)\n mouthSvg = `\n <path d=\"M ${mouthX - mouthW} ${mouthY} Q ${mouthX} ${mouthY + 5} ${mouthX + mouthW} ${mouthY}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" />\n <path d=\"M ${mouthX + mouthW - 3} ${mouthY + 2} Q ${mouthX + mouthW + 3} ${mouthY + 6} ${mouthX + mouthW - 1} ${mouthY + 9} Q ${mouthX + mouthW - 5} ${mouthY + 6} ${mouthX + mouthW - 3} ${mouthY + 2} Z\" fill=\"#E3536C\" />\n `;\n break;\n\n case 23: // megaTongue / boca abierta con lengua grande, goofy\n mouthSvg = `\n <path d=\"M ${mouthX - mouthW * 1.1} ${mouthY - 3} Q ${mouthX} ${mouthY + 10} ${mouthX + mouthW * 1.1} ${mouthY - 3} Z\" fill=\"#8a2f36\" />\n <ellipse cx=\"${mouthX}\" cy=\"${mouthY + 4}\" rx=\"${mouthW * 0.6}\" ry=\"4\" fill=\"#E3536C\" />\n `;\n break;\n\n case 24: // catCup / sonrisa sassy con labio inferior marcado\n mouthSvg = `\n <path d=\"M ${mouthX - mouthW} ${mouthY} Q ${mouthX} ${mouthY + 7} ${mouthX + mouthW} ${mouthY - 2}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" />\n <ellipse cx=\"${mouthX + mouthW * 0.3}\" cy=\"${mouthY + 3}\" rx=\"2\" ry=\"1.2\" fill=\"#E3536C\" opacity=\"0.7\" />\n `;\n break;\n\n case 0:\n default:\n // smileCurve estándar\n if (params.mouthCurve === 0) {\n mouthSvg = `<line x1=\"${mouthX - mouthW}\" y1=\"${mouthY}\" x2=\"${mouthX + mouthW}\" y2=\"${mouthY}\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" />`;\n } else {\n const mouthControlY = mouthY + params.mouthCurve * 14;\n mouthSvg = `<path d=\"M ${mouthX - mouthW} ${mouthY} Q ${mouthX} ${mouthControlY.toFixed(2)} ${mouthX + mouthW} ${mouthY}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"${STROKE_W}\" stroke-linecap=\"round\" />`;\n }\n break;\n }\n\n // Mejillas o rayas de sonrojo\n const cheekOpacity = Math.max(0, Math.min(1, params.cheek));\n let cheeksSvg = '';\n if (params.blushStripes) {\n cheeksSvg = `\n <g stroke=\"#E3536C\" stroke-width=\"2\" opacity=\"0.75\" stroke-linecap=\"round\">\n <line x1=\"20\" y1=\"52\" x2=\"24\" y2=\"58\" />\n <line x1=\"24\" y1=\"52\" x2=\"28\" y2=\"58\" />\n <line x1=\"28\" y1=\"52\" x2=\"32\" y2=\"58\" />\n <line x1=\"68\" y1=\"52\" x2=\"72\" y2=\"58\" />\n <line x1=\"72\" y1=\"52\" x2=\"76\" y2=\"58\" />\n <line x1=\"76\" y1=\"52\" x2=\"80\" y2=\"58\" />\n </g>\n `;\n } else if (cheekOpacity > 0.01) {\n cheeksSvg = `\n <ellipse cx=\"${27 + gazeX * 0.4}\" cy=\"${56 + gazeY * 0.4}\" rx=\"6\" ry=\"4\" fill=\"${cheekColor}\" opacity=\"${cheekOpacity.toFixed(2)}\" />\n <ellipse cx=\"${73 + gazeX * 0.4}\" cy=\"${56 + gazeY * 0.4}\" rx=\"6\" ry=\"4\" fill=\"${cheekColor}\" opacity=\"${cheekOpacity.toFixed(2)}\" />\n `;\n }\n\n const groupTransform = [\n `translate(${(params.shiftX ?? 0).toFixed(2)}, ${params.bob.toFixed(2)})`,\n flipX ? 'translate(100, 0) scale(-1, 1)' : '',\n emphasis ? 'translate(50, 50) scale(1.1) translate(-50, -50)' : '',\n ].filter(Boolean).join(' ');\n\n return `\n <svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" style=\"overflow: visible;\">\n <defs>\n <style>\n @keyframes wissive-zzz-loop {\n 0% { transform: translate(0px, 4px) scale(0.55); opacity: 0; }\n 18% { transform: translate(3px, -2px) scale(0.85); opacity: 0.95; }\n 55% { transform: translate(8px, -11px) scale(1.1); opacity: 1; }\n 85% { transform: translate(14px, -19px) scale(0.85); opacity: 0.6; }\n 100% { transform: translate(18px, -25px) scale(0.5); opacity: 0; }\n }\n @keyframes wissive-tear-drip {\n 0% { transform: translateY(-2px) scaleY(0.7); opacity: 0.4; }\n 50% { transform: translateY(5px) scaleY(1.18); opacity: 0.95; }\n 85% { transform: translateY(12px) scaleY(0.8); opacity: 0.3; }\n 100% { transform: translateY(15px) scaleY(0.3); opacity: 0; }\n }\n @keyframes wissive-sweat-slide {\n 0% { transform: translateY(0px); opacity: 0.4; }\n 50% { transform: translateY(5px); opacity: 0.95; }\n 100% { transform: translateY(9px); opacity: 0.15; }\n }\n .wissive-zzz-1 { animation: wissive-zzz-loop 3s cubic-bezier(0.33, 0, 0.25, 1) infinite 0s; transform-box: fill-box; transform-origin: center; }\n .wissive-zzz-2 { animation: wissive-zzz-loop 3s cubic-bezier(0.33, 0, 0.25, 1) infinite -1s; transform-box: fill-box; transform-origin: center; }\n .wissive-zzz-3 { animation: wissive-zzz-loop 3s cubic-bezier(0.33, 0, 0.25, 1) infinite -2s; transform-box: fill-box; transform-origin: center; }\n .wissive-anim-tear { animation: wissive-tear-drip 1.8s cubic-bezier(0.4, 0, 0.6, 1) infinite; transform-box: fill-box; transform-origin: top center; }\n .wissive-anim-sweat { animation: wissive-sweat-slide 2.2s ease-in-out infinite; transform-box: fill-box; transform-origin: top center; }\n </style>\n </defs>\n <g transform=\"${groupTransform}\">\n <!-- Silueta del cuerpo (una o varias subformas: cuerpo + orejas, brazos…) -->\n ${silhouetteParts}\n <!-- Mejillas o Rayas -->\n ${cheeksSvg}\n <!-- Accesorios (ZZZ, Gotas) -->\n ${accessoriesSvg}\n <!-- Lágrimas -->\n ${tearsSvg}\n <!-- Ojos -->\n ${leftEyeSvg}\n ${rightEyeSvg}\n <!-- Cejas -->\n ${browsSvg}\n <!-- Boca -->\n ${mouthSvg}\n </g>\n </svg>\n `;\n}\n\nexport function renderSvgElement(\n silhouette: SilhouetteType,\n baseColor: string,\n params: FaceParameters,\n size: number,\n renderOptions: RenderOptions = {}\n): string {\n return buildFace(silhouette, baseColor, params, size, renderOptions);\n}\n","export interface EventCallbacks {\n onHoverStart: () => void;\n onHoverEnd: () => void;\n onClickStart: () => void;\n onClickEnd: () => void;\n onNearChange: (isNear: boolean) => void;\n onGazeMove?: (gazeX: number, gazeY: number) => void;\n}\n\n/**\n * Detecta si el dispositivo actual soporta hover real (puntero fino como mouse o trackpad).\n * Devuelve false en dispositivos táctiles primarios (smartphones, tablets sin mouse).\n */\nexport function supportsHover(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return true;\n return window.matchMedia('(hover: hover)').matches;\n}\n\n/**\n * Detecta si el entorno es primariamente táctil (pantallas táctiles sin hover).\n */\nexport function isTouchDevice(): boolean {\n if (typeof window === 'undefined') return false;\n return (\n (typeof window.matchMedia === 'function' && window.matchMedia('(hover: none)').matches) ||\n 'ontouchstart' in window ||\n (typeof navigator !== 'undefined' && navigator.maxTouchPoints > 0)\n );\n}\n\n// ─── Proximity & Gaze Centralized Manager ─────────────────────────────\n// Un solo listener de 'mousemove' en window compartido por todas las instancias\n// de la página, en lugar de N listeners individuales.\ninterface ProximitySubscriber {\n element: HTMLElement;\n nearRadius: number;\n isNear: boolean;\n isActive: () => boolean;\n onNearChange: (isNear: boolean) => void;\n onGazeMove?: (gazeX: number, gazeY: number) => void;\n}\n\nconst proximitySubscribers = new Set<ProximitySubscriber>();\nlet isGlobalMouseMoveAttached = false;\n\nfunction handleGlobalMouseMove(e: MouseEvent) {\n const clientX = e.clientX;\n const clientY = e.clientY;\n const halfWinW = (typeof window !== 'undefined' ? window.innerWidth : 1000) / 2 || 1;\n const halfWinH = (typeof window !== 'undefined' ? window.innerHeight : 1000) / 2 || 1;\n\n for (const sub of proximitySubscribers) {\n const rect = sub.element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n // Gaze tracking opcional\n if (sub.onGazeMove) {\n const normX = Math.max(-0.6, Math.min(0.6, (clientX - centerX) / halfWinW));\n const normY = Math.max(-0.6, Math.min(0.6, (clientY - centerY) / halfWinH));\n sub.onGazeMove(22 * normX, 14 * normY);\n }\n\n // Si ya está en hover, click o foco, ignoramos el cálculo de proximidad\n if (sub.isActive()) {\n continue;\n }\n\n const distance = Math.hypot(clientX - centerX, clientY - centerY);\n const nowNear = distance <= sub.nearRadius;\n if (nowNear !== sub.isNear) {\n sub.isNear = nowNear;\n sub.onNearChange(nowNear);\n }\n }\n}\n\nfunction registerProximitySubscriber(sub: ProximitySubscriber) {\n proximitySubscribers.add(sub);\n if (!isGlobalMouseMoveAttached && typeof window !== 'undefined') {\n window.addEventListener('mousemove', handleGlobalMouseMove, { passive: true });\n isGlobalMouseMoveAttached = true;\n }\n}\n\nfunction unregisterProximitySubscriber(sub: ProximitySubscriber) {\n proximitySubscribers.delete(sub);\n if (proximitySubscribers.size === 0 && isGlobalMouseMoveAttached && typeof window !== 'undefined') {\n window.removeEventListener('mousemove', handleGlobalMouseMove);\n isGlobalMouseMoveAttached = false;\n }\n}\n\nexport function attachEventListeners(\n element: HTMLElement,\n callbacks: EventCallbacks,\n nearRadius: number = 120\n): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n let isHovered = false;\n let isClicked = false;\n let isFocused = false;\n let isKeyDown = false;\n\n const handleMouseEnter = () => {\n isHovered = true;\n callbacks.onHoverStart();\n };\n\n const handleMouseLeave = () => {\n isHovered = false;\n isClicked = false;\n callbacks.onHoverEnd();\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n isClicked = true;\n callbacks.onClickStart();\n };\n\n const handleMouseUp = () => {\n if (!isClicked) return;\n isClicked = false;\n callbacks.onClickEnd();\n };\n\n // ─── Touch Support ──────────────────────────────────────────────────\n const handleTouchStart = () => {\n isClicked = true;\n callbacks.onClickStart();\n };\n\n const handleTouchEnd = () => {\n if (!isClicked) return;\n isClicked = false;\n callbacks.onClickEnd();\n };\n\n const handleTouchCancel = () => {\n if (!isClicked) return;\n isClicked = false;\n callbacks.onClickEnd();\n };\n\n // ─── Keyboard & Focus accessibility ─────────────────────────────────\n const handleFocus = () => {\n isFocused = true;\n callbacks.onHoverStart();\n };\n\n const handleBlur = () => {\n isFocused = false;\n if (isKeyDown) {\n isKeyDown = false;\n isClicked = false;\n callbacks.onClickEnd();\n }\n callbacks.onHoverEnd();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault(); // Evitar scroll de la página con la tecla Espacio\n if (!isKeyDown) {\n isKeyDown = true;\n isClicked = true;\n callbacks.onClickStart();\n }\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (isKeyDown) {\n isKeyDown = false;\n isClicked = false;\n callbacks.onClickEnd();\n }\n }\n };\n\n element.addEventListener('mouseenter', handleMouseEnter);\n element.addEventListener('mouseleave', handleMouseLeave);\n element.addEventListener('mousedown', handleMouseDown);\n window.addEventListener('mouseup', handleMouseUp);\n\n element.addEventListener('focus', handleFocus);\n element.addEventListener('blur', handleBlur);\n element.addEventListener('keydown', handleKeyDown);\n element.addEventListener('keyup', handleKeyUp);\n\n element.addEventListener('touchstart', handleTouchStart, { passive: true });\n window.addEventListener('touchend', handleTouchEnd, { passive: true });\n window.addEventListener('touchcancel', handleTouchCancel, { passive: true });\n\n // ─── Proximity Subscriber Registration ─────────────────────────────\n // En dispositivos puramente táctiles (hover: none), omitimos el cálculo de proximidad\n // continuo para ahorrar batería y CPU, salvo que se active gazeTracking explícito.\n const proximitySubscriber: ProximitySubscriber = {\n element,\n nearRadius,\n isNear: false,\n isActive: () => isHovered || isClicked || isFocused,\n onNearChange: callbacks.onNearChange,\n onGazeMove: callbacks.onGazeMove,\n };\n\n if (supportsHover() || callbacks.onGazeMove) {\n registerProximitySubscriber(proximitySubscriber);\n }\n\n return () => {\n element.removeEventListener('mouseenter', handleMouseEnter);\n element.removeEventListener('mouseleave', handleMouseLeave);\n element.removeEventListener('mousedown', handleMouseDown);\n window.removeEventListener('mouseup', handleMouseUp);\n\n element.removeEventListener('focus', handleFocus);\n element.removeEventListener('blur', handleBlur);\n element.removeEventListener('keydown', handleKeyDown);\n element.removeEventListener('keyup', handleKeyUp);\n\n element.removeEventListener('touchstart', handleTouchStart);\n window.removeEventListener('touchend', handleTouchEnd);\n window.removeEventListener('touchcancel', handleTouchCancel);\n\n unregisterProximitySubscriber(proximitySubscriber);\n };\n}\n\n\n","// Import dinámico: cuelume es peer dependency opcional. Un import estático\n// rompería la carga entera de la librería para quien no la tenga instalada\n// (el caso normal). Se resuelve una sola vez y se cachea la promesa.\ntype CuelumeModule = {\n play: (name: any, options?: { volume?: number }) => void;\n setVolume: (volume: number) => void;\n} | null;\n\nlet cuelumePromise: Promise<CuelumeModule> | undefined;\nfunction getCuelume(): Promise<CuelumeModule> {\n if (!cuelumePromise) {\n cuelumePromise = import(/* @vite-ignore */ 'cuelume').catch(() => null);\n }\n return cuelumePromise;\n}\n\nexport type CueSoundType =\n | 'chime'\n | 'sparkle'\n | 'droplet'\n | 'bloom'\n | 'whisper'\n | 'tick'\n | 'press'\n | 'release'\n | 'toggle'\n | 'success'\n | 'error'\n | 'page'\n | 'loading'\n | 'ready'\n | 'pulse'\n | 'scan'\n | 'arrival';\n\nexport class SoundEngine {\n private enabled: boolean = true;\n private volume: number = 0.6;\n\n constructor() {\n getCuelume().then((m) => {\n try {\n m?.setVolume(this.volume);\n } catch (_) {}\n });\n }\n\n public setEnabled(enabled: boolean) {\n this.enabled = enabled;\n }\n\n public isEnabled(): boolean {\n return this.enabled;\n }\n\n public setVolumeLevel(vol: number) {\n this.volume = Math.max(0, Math.min(1, vol));\n getCuelume().then((m) => {\n try {\n m?.setVolume(this.volume);\n } catch (_) {}\n });\n }\n\n public getVolumeLevel(): number {\n return this.volume;\n }\n\n public playCue(cueName: CueSoundType, options: { volume?: number } = {}) {\n if (!this.enabled) return;\n getCuelume().then((m) => {\n try {\n m?.play(cueName as any, { volume: options.volume ?? this.volume });\n } catch (e) {\n // Ignorar restricciones de autoplay si aún no se ha interactuado\n }\n });\n }\n\n public playSound(emotion: string, action: 'hover' | 'click' | 'bounce') {\n if (!this.enabled) return;\n\n let cue: CueSoundType = 'tick';\n\n switch (emotion) {\n case 'happy': // Mochi\n cue = action === 'click' ? 'sparkle' : 'chime';\n break;\n\n case 'flutter': // Zumi\n cue = action === 'click' ? 'pulse' : 'bloom';\n break;\n\n case 'pleasure': // Suri\n cue = action === 'click' ? 'bloom' : 'droplet';\n break;\n\n case 'peaceful': // Nima\n cue = action === 'click' ? 'arrival' : 'whisper';\n break;\n\n case 'normal': // Cota\n cue = action === 'click' ? 'toggle' : 'tick';\n break;\n\n case 'tired':\n case 'sleepy': // Dozy / Snug\n cue = action === 'click' ? 'loading' : 'whisper';\n break;\n\n case 'sad':\n case 'disappointed': // Lumo / Wilt\n cue = action === 'click' ? 'scan' : 'droplet';\n break;\n\n case 'anxiety':\n case 'stress': // Fidge / Knot\n cue = action === 'click' ? 'pulse' : 'tick';\n break;\n\n case 'anger': // Brix\n cue = action === 'click' ? 'press' : 'release';\n break;\n\n case 'surprised': // Pip\n cue = action === 'click' ? 'success' : 'chime';\n break;\n\n case 'numbness': // Void\n cue = action === 'click' ? 'ready' : 'page';\n break;\n\n default:\n cue = action === 'click' ? 'sparkle' : 'tick';\n break;\n }\n\n this.playCue(cue);\n }\n}\n\nexport const soundEngine = new SoundEngine();\n\n/**\n * Control global del sonido para todas las instancias de Wissive en la página.\n */\nexport function setGlobalSound(enabled: boolean): void {\n soundEngine.setEnabled(enabled);\n}\n\n/**\n * Consulta si el sonido está habilitado globalmente.\n */\nexport function isGlobalSoundEnabled(): boolean {\n return soundEngine.isEnabled();\n}\n\n/**\n * Ajusta el nivel de volumen global (0.0 a 1.0) para todos los sonidos de Wissive.\n */\nexport function setGlobalVolume(volume: number): void {\n soundEngine.setVolumeLevel(volume);\n}\n\n/**\n * Obtiene el volumen global actual (0.0 a 1.0).\n */\nexport function getGlobalVolume(): number {\n return soundEngine.getVolumeLevel();\n}\n\n","import { spiralPoints } from './spiral.ts';\n\nexport type ParticleShape =\n | 'heart' | 'star' | 'sparkle' | 'drop' | 'diamond' | 'zigzag' | 'circle' | 'ring' | 'zzz'\n // Añadidas para que las 14 emociones tengan partícula propia\n | 'petal' | 'spiral' | 'bubble' | 'ember' | 'shard' | 'burst' | 'dot' | 'glitch';\n\ninterface Particle {\n x: number;\n y: number;\n vx: number;\n vy: number;\n life: number;\n maxLife: number;\n size: number;\n rotation: number;\n rotSpeed: number;\n shape: ParticleShape;\n color: string;\n opacity: number;\n swayFreq?: number;\n swayAmp?: number;\n}\n\nexport class ParticleEmitter {\n private particles: Particle[] = [];\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private animating = false;\n private rafId: number | null = null;\n private size: number;\n private dpr: number;\n\n constructor(container: HTMLElement, size: number) {\n this.size = size;\n this.dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n\n this.canvas = document.createElement('canvas');\n this.setupCanvas();\n\n container.style.position = 'relative';\n container.style.overflow = 'visible';\n container.appendChild(this.canvas);\n\n this.ctx = this.canvas.getContext('2d')!;\n }\n\n private setupCanvas() {\n const dpr = this.dpr;\n const canvasSize = this.size * 2.5;\n\n this.canvas.width = canvasSize * dpr;\n this.canvas.height = canvasSize * dpr;\n this.canvas.style.cssText = `\n position: absolute;\n top: -${this.size * 0.75}px;\n left: -${this.size * 0.75}px;\n width: ${canvasSize}px;\n height: ${canvasSize}px;\n pointer-events: none;\n z-index: 10;\n `;\n }\n\n public resize(newSize: number) {\n this.size = newSize;\n this.dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n this.setupCanvas();\n }\n\n public burst(emotion: string, count: number = 8, originX?: number, originY?: number) {\n const canvasSize = this.size * 2.5;\n const cx = originX ?? (canvasSize / 2);\n const cy = originY ?? (canvasSize / 2);\n\n for (let i = 0; i < count; i++) {\n const angle = (Math.PI * 2 * i) / count + (Math.random() - 0.5) * 0.7;\n const speed = 2.5 + Math.random() * 3.5;\n const particle = this.createParticle(emotion, cx, cy, angle, speed);\n this.particles.push(particle);\n }\n\n if (!this.animating) {\n this.animating = true;\n this.tick();\n }\n }\n\n private createParticle(\n emotion: string,\n cx: number,\n cy: number,\n angle: number,\n speed: number\n ): Particle {\n const radiusOffset = 10 + Math.random() * 15;\n const spawnX = cx + Math.cos(angle) * radiusOffset;\n const spawnY = cy + Math.sin(angle) * radiusOffset;\n\n const maxLife = 0.6 + Math.random() * 0.5;\n\n const base: Particle = {\n x: spawnX,\n y: spawnY,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed - 1.2,\n life: maxLife,\n maxLife: maxLife,\n size: (6 + Math.random() * 8) * (this.size / 120),\n rotation: Math.random() * Math.PI * 2,\n rotSpeed: (Math.random() - 0.5) * 0.2,\n shape: 'circle',\n color: '#F2A9B8',\n opacity: 1,\n };\n\n const isAccent = Math.random() > 0.6;\n\n // Cada emoción: par de formas propio, paleta propia y física propia.\n // Antes 10 de las 14 compartían rama y se veían idénticas.\n const pick = (palette: string[]) => palette[Math.floor(Math.random() * palette.length)];\n\n switch (emotion) {\n // Mochi — corazones que suben ligeros\n case 'happy':\n base.shape = isAccent ? 'sparkle' : 'heart';\n base.color = pick(['#F2A9B8', '#E3536C', '#FF8FAB', '#FFD1DC', '#FFF0F5']);\n base.vy -= 0.6;\n break;\n\n // Suri — pétalos que caen meciéndose\n case 'pleasure':\n base.shape = isAccent ? 'circle' : 'petal';\n base.color = pick(['#F28FC2', '#FFC2DE', '#FFE3F0', '#E5739F']);\n base.vy += 0.9;\n base.vx *= 0.6;\n base.rotSpeed *= 2.5;\n base.swayFreq = 5 + Math.random() * 3;\n base.swayAmp = 0.9 + Math.random() * 0.5;\n break;\n\n // Zumi — chispas doradas rápidas y erráticas\n case 'flutter':\n base.shape = isAccent ? 'sparkle' : 'star';\n base.color = pick(['#F2CB4E', '#FFD700', '#FFA500', '#FFF4CC']);\n base.vy -= 1;\n base.vx *= 1.5;\n base.rotSpeed *= 2;\n break;\n\n // Nima — anillos verdes que ascienden serenos\n case 'peaceful':\n base.shape = isAccent ? 'circle' : 'ring';\n base.color = pick(['#9AC9A0', '#B5E8B5', '#7FD17F', '#E8F5E9']);\n base.vy -= 0.8;\n base.swayFreq = 8 + Math.random() * 4;\n base.swayAmp = 0.4 + Math.random() * 0.4;\n break;\n\n // Cota — puntos menta, discretos y sin dramatismo\n case 'normal':\n base.shape = isAccent ? 'circle' : 'dot';\n base.color = pick(['#C9DCD3', '#A8C7BB', '#E4F0EA', '#8FB3A4']);\n base.size *= 0.65;\n base.vx *= 0.5;\n base.vy *= 0.5;\n break;\n\n // Dozy — zzz grises pesados\n case 'tired':\n base.shape = isAccent ? 'ring' : 'zzz';\n base.color = pick(['#D6DBCF', '#BFC7B8', '#EDF0E8', '#A9B3A0']);\n base.vy -= 1.2;\n base.vx *= 0.25;\n base.swayFreq = 6 + Math.random() * 4;\n base.swayAmp = 0.5;\n break;\n\n // Snug — burbujas de sueño, grandes y lentísimas\n case 'sleepy':\n base.shape = isAccent ? 'zzz' : 'bubble';\n base.color = pick(['#AFCBE0', '#D3E8F5', '#ffffff', '#8FB6D1']);\n base.size *= 1.35;\n base.vy -= 1.5;\n base.vx *= 0.2;\n base.swayFreq = 3 + Math.random() * 2;\n base.swayAmp = 0.7;\n break;\n\n // Lumo — lágrimas azules que caen rectas\n case 'sad':\n base.shape = isAccent ? 'circle' : 'drop';\n base.color = pick(['#7FA6D9', '#A0C4E8', '#6B9ACF', '#E1F5FE']);\n base.vy += 1.8;\n base.vx *= 0.3;\n break;\n\n // Wilt — fragmentos ocre que caen dando tumbos\n case 'disappointed':\n base.shape = isAccent ? 'drop' : 'shard';\n base.color = pick(['#EBD98A', '#C9B86B', '#F5E9B8', '#A89550']);\n base.vy += 1.2;\n base.vx *= 0.8;\n base.rotSpeed *= 4;\n break;\n\n // Fidge — zigzags morados nerviosos y pequeños\n case 'anxiety':\n base.shape = isAccent ? 'circle' : 'zigzag';\n base.color = pick(['#A99BD9', '#C4B5F0', '#8B7BC4', '#D1C4E9']);\n base.size *= 0.8;\n base.vx *= 1.4;\n break;\n\n // Knot — espirales que giran sobre sí mismas\n case 'stress':\n base.shape = isAccent ? 'zigzag' : 'spiral';\n base.color = pick(['#C97F76', '#E09A91', '#A85F57', '#F0BDB6']);\n base.size *= 0.9;\n base.rotSpeed *= 6;\n base.swayFreq = 12 + Math.random() * 6;\n base.swayAmp = 0.6;\n break;\n\n // Brix — brasas que suben con el calor\n case 'anger':\n base.shape = isAccent ? 'diamond' : 'ember';\n base.color = pick(['#D9566A', '#FF4444', '#FF6B35', '#FFA033']);\n base.vy -= 1.4;\n base.vx *= 0.7;\n base.size *= 0.9;\n break;\n\n // Pip — estallido radial con esquirlas saliendo disparadas\n case 'surprised':\n base.shape = isAccent ? 'dot' : 'burst';\n base.color = pick(['#F0B98A', '#FFCFA3', '#FF9F1C', '#FFE8D1']);\n base.size *= 1.15;\n base.vx *= 1.8;\n base.vy *= 1.8;\n break;\n\n // Void — fallos lilas que apenas se mueven y se apagan rápido\n case 'numbness':\n base.shape = isAccent ? 'dot' : 'glitch';\n base.color = pick(['#D9C6E0', '#C0A8CC', '#EDE2F0', '#A98FB8']);\n base.vx *= 0.25;\n base.vy *= 0.25;\n base.life *= 0.6;\n base.rotSpeed = 0;\n break;\n\n default:\n base.shape = isAccent ? 'sparkle' : 'circle';\n base.color = pick(['#F2A9B8', '#F2CB4E', '#9AC9A0']);\n break;\n }\n\n return base;\n }\n\n private tick = () => {\n const width = this.canvas.width;\n const height = this.canvas.height;\n\n this.ctx.clearRect(0, 0, width, height);\n\n const dt = 0.016;\n\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n\n p.life -= dt;\n if (p.life <= 0) {\n this.particles.splice(i, 1);\n continue;\n }\n\n p.vx *= 0.95;\n p.vy *= 0.95;\n\n if (p.swayFreq && p.swayAmp) {\n p.x += Math.sin((p.maxLife - p.life) * p.swayFreq) * p.swayAmp;\n }\n\n p.x += p.vx;\n p.y += p.vy;\n p.rotation += p.rotSpeed;\n\n this.drawParticle(p);\n }\n\n if (this.particles.length > 0) {\n this.rafId = requestAnimationFrame(this.tick);\n } else {\n this.animating = false;\n this.ctx.clearRect(0, 0, width, height);\n }\n };\n\n private drawParticle(p: Particle) {\n const ctx = this.ctx;\n const dpr = this.dpr;\n\n const lifeProgress = 1 - p.life / p.maxLife;\n\n let scaleFactor = 1;\n if (lifeProgress < 0.18) {\n scaleFactor = lifeProgress / 0.18;\n } else if (lifeProgress > 0.65) {\n scaleFactor = (1 - lifeProgress) / 0.35;\n }\n scaleFactor = Math.max(0, Math.min(1.2, scaleFactor));\n\n const s = p.size * scaleFactor;\n if (s <= 0.1) return;\n\n const opacity = Math.max(0, Math.min(1, (p.life / p.maxLife) * 1.2));\n\n ctx.save();\n ctx.translate(p.x * dpr, p.y * dpr);\n ctx.rotate(p.rotation);\n ctx.globalAlpha = opacity;\n\n switch (p.shape) {\n case 'heart':\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.moveTo(0, s * 0.35 * dpr);\n ctx.bezierCurveTo(\n -s * 0.7 * dpr, -s * 0.1 * dpr,\n -s * 0.8 * dpr, -s * 0.8 * dpr,\n 0, -s * 0.45 * dpr\n );\n ctx.bezierCurveTo(\n s * 0.8 * dpr, -s * 0.8 * dpr,\n s * 0.7 * dpr, -s * 0.1 * dpr,\n 0, s * 0.35 * dpr\n );\n ctx.closePath();\n ctx.fill();\n break;\n\n case 'star': {\n ctx.fillStyle = p.color;\n ctx.beginPath();\n const pts = 5;\n const outerR = s * dpr;\n const innerR = s * 0.45 * dpr;\n for (let j = 0; j < pts * 2; j++) {\n const r = j % 2 === 0 ? outerR : innerR;\n const angle = (j * Math.PI) / pts - Math.PI / 2;\n const px = Math.cos(angle) * r;\n const py = Math.sin(angle) * r;\n if (j === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.closePath();\n ctx.fill();\n break;\n }\n\n case 'sparkle': {\n ctx.fillStyle = p.color;\n ctx.beginPath();\n const r = s * 1.1 * dpr;\n ctx.moveTo(0, -r);\n ctx.quadraticCurveTo(0, 0, r, 0);\n ctx.quadraticCurveTo(0, 0, 0, r);\n ctx.quadraticCurveTo(0, 0, -r, 0);\n ctx.quadraticCurveTo(0, 0, 0, -r);\n ctx.closePath();\n ctx.fill();\n break;\n }\n\n case 'drop':\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.moveTo(0, -s * 0.8 * dpr);\n ctx.bezierCurveTo(\n s * 0.7 * dpr, -s * 0.2 * dpr,\n s * 0.6 * dpr, s * 0.7 * dpr,\n 0, s * 0.7 * dpr\n );\n ctx.bezierCurveTo(\n -s * 0.6 * dpr, s * 0.7 * dpr,\n -s * 0.7 * dpr, -s * 0.2 * dpr,\n 0, -s * 0.8 * dpr\n );\n ctx.closePath();\n ctx.fill();\n break;\n\n case 'diamond':\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.moveTo(0, -s * dpr);\n ctx.lineTo(s * 0.65 * dpr, 0);\n ctx.lineTo(0, s * dpr);\n ctx.lineTo(-s * 0.65 * dpr, 0);\n ctx.closePath();\n ctx.fill();\n break;\n\n case 'zigzag':\n ctx.strokeStyle = p.color;\n ctx.lineWidth = Math.max(2, s * 0.25) * dpr;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.beginPath();\n ctx.moveTo(-s * 0.6 * dpr, -s * 0.5 * dpr);\n ctx.lineTo(-s * 0.1 * dpr, -s * 0.1 * dpr);\n ctx.lineTo(-s * 0.3 * dpr, s * 0.1 * dpr);\n ctx.lineTo(s * 0.6 * dpr, s * 0.5 * dpr);\n ctx.stroke();\n break;\n\n case 'ring':\n ctx.strokeStyle = p.color;\n ctx.lineWidth = Math.max(1.5, s * 0.25) * dpr;\n ctx.beginPath();\n ctx.arc(0, 0, s * 0.55 * dpr, 0, Math.PI * 2);\n ctx.stroke();\n break;\n\n case 'zzz':\n ctx.strokeStyle = p.color;\n ctx.lineWidth = Math.max(2, s * 0.25) * dpr;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.beginPath();\n ctx.moveTo(-s * 0.4 * dpr, -s * 0.5 * dpr);\n ctx.lineTo(s * 0.4 * dpr, -s * 0.5 * dpr);\n ctx.lineTo(-s * 0.4 * dpr, s * 0.5 * dpr);\n ctx.lineTo(s * 0.4 * dpr, s * 0.5 * dpr);\n ctx.stroke();\n break;\n\n case 'petal':\n // Pétalo: dos curvas que se cierran en punta\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.moveTo(0, -s * 0.9 * dpr);\n ctx.quadraticCurveTo(s * 0.75 * dpr, -s * 0.1 * dpr, 0, s * 0.9 * dpr);\n ctx.quadraticCurveTo(-s * 0.75 * dpr, -s * 0.1 * dpr, 0, -s * 0.9 * dpr);\n ctx.closePath();\n ctx.fill();\n break;\n\n case 'spiral': {\n ctx.strokeStyle = p.color;\n ctx.lineWidth = Math.max(1.5, s * 0.2) * dpr;\n ctx.lineCap = 'round';\n ctx.beginPath();\n const radius = s * 0.85 * dpr;\n spiralPoints().forEach(([ux, uy], i) => {\n const px = ux * radius;\n const py = uy * radius;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n ctx.stroke();\n break;\n }\n\n case 'bubble':\n // Burbuja: contorno suave con un brillo descentrado\n ctx.strokeStyle = p.color;\n ctx.lineWidth = Math.max(1, s * 0.14) * dpr;\n ctx.beginPath();\n ctx.arc(0, 0, s * 0.6 * dpr, 0, Math.PI * 2);\n ctx.stroke();\n ctx.fillStyle = p.color;\n ctx.globalAlpha *= 0.7;\n ctx.beginPath();\n ctx.arc(-s * 0.22 * dpr, -s * 0.24 * dpr, s * 0.13 * dpr, 0, Math.PI * 2);\n ctx.fill();\n break;\n\n case 'ember': {\n // Brasa: gota invertida, más ancha abajo\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.moveTo(0, -s * 0.95 * dpr);\n ctx.bezierCurveTo(\n s * 0.5 * dpr, -s * 0.2 * dpr,\n s * 0.62 * dpr, s * 0.55 * dpr,\n 0, s * 0.75 * dpr\n );\n ctx.bezierCurveTo(\n -s * 0.62 * dpr, s * 0.55 * dpr,\n -s * 0.5 * dpr, -s * 0.2 * dpr,\n 0, -s * 0.95 * dpr\n );\n ctx.closePath();\n ctx.fill();\n break;\n }\n\n case 'shard':\n // Fragmento irregular\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.moveTo(0, -s * 0.9 * dpr);\n ctx.lineTo(s * 0.55 * dpr, -s * 0.15 * dpr);\n ctx.lineTo(s * 0.2 * dpr, s * 0.85 * dpr);\n ctx.lineTo(-s * 0.45 * dpr, s * 0.3 * dpr);\n ctx.closePath();\n ctx.fill();\n break;\n\n case 'burst': {\n // Estallido: cuatro rayos radiales, sin relleno central\n ctx.strokeStyle = p.color;\n ctx.lineWidth = Math.max(1.5, s * 0.22) * dpr;\n ctx.lineCap = 'round';\n ctx.beginPath();\n for (let j = 0; j < 4; j++) {\n const a = (j * Math.PI) / 2;\n const inner = s * 0.3 * dpr;\n const outer = s * dpr;\n ctx.moveTo(Math.cos(a) * inner, Math.sin(a) * inner);\n ctx.lineTo(Math.cos(a) * outer, Math.sin(a) * outer);\n }\n ctx.stroke();\n break;\n }\n\n case 'dot':\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.arc(0, 0, s * 0.28 * dpr, 0, Math.PI * 2);\n ctx.fill();\n break;\n\n case 'glitch':\n // Fallo: dos rectángulos desplazados\n ctx.fillStyle = p.color;\n ctx.fillRect(-s * 0.6 * dpr, -s * 0.28 * dpr, s * 1.2 * dpr, s * 0.22 * dpr);\n ctx.globalAlpha *= 0.6;\n ctx.fillRect(-s * 0.25 * dpr, s * 0.06 * dpr, s * 0.9 * dpr, s * 0.16 * dpr);\n break;\n\n case 'circle':\n default:\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.arc(0, 0, s * 0.5 * dpr, 0, Math.PI * 2);\n ctx.fill();\n break;\n }\n\n ctx.restore();\n }\n\n public destroy() {\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n this.particles = [];\n this.canvas.remove();\n }\n}\n","/**\n * Drag & Toss physics with elastic Squash & Stretch deformation.\n *\n * The user can grab an emoji and drag it around. While dragging, the body\n * stretches in the direction of movement. When released, it flies away with\n * the accumulated velocity and bounces back to its origin like jelly.\n */\n\nexport interface DragPhysicsState {\n /** Current visual offset from origin (px) */\n offsetX: number;\n offsetY: number;\n /** Squash & Stretch deformation for CSS transform */\n scaleX: number;\n scaleY: number;\n /** Rotation from drag inertia (rad) */\n rotation: number;\n /** true while the user is actively dragging */\n isDragging: boolean;\n}\n\ninterface Vec2 {\n x: number;\n y: number;\n}\n\nexport class DragPhysics {\n // Position\n private posX = 0;\n private posY = 0;\n\n // Velocity\n private velX = 0;\n private velY = 0;\n\n // Drag tracking\n private dragging = false;\n private startPointerX = 0;\n private startPointerY = 0;\n private lastPointerX = 0;\n private lastPointerY = 0;\n private lastPointerTime = 0;\n\n // Velocity samples for a smooth toss (ring buffer of last N moves)\n private velocitySamples: Vec2[] = [];\n private readonly MAX_SAMPLES = 6;\n\n // Spring constants for the return-to-origin bounce\n private readonly springK = 0.08; // stiffness — lower = softer jelly\n private readonly springD = 0.82; // damping — lower = bouncier\n private readonly tossDecay = 0.96; // air friction on free flight\n\n // Stretch limits\n private readonly maxStretch = 0.25;\n\n // Physics loop\n private animating = false;\n private rafId: number | null = null;\n\n // Callbacks\n private onUpdate: (state: DragPhysicsState) => void;\n private onDragStart?: () => void;\n private onDragEnd?: () => void;\n\n // Element ref\n private el: HTMLElement;\n\n constructor(\n element: HTMLElement,\n onUpdate: (state: DragPhysicsState) => void,\n options?: {\n onDragStart?: () => void;\n onDragEnd?: () => void;\n }\n ) {\n this.el = element;\n this.onUpdate = onUpdate;\n this.onDragStart = options?.onDragStart;\n this.onDragEnd = options?.onDragEnd;\n\n // Mouse events\n this.el.addEventListener('mousedown', this.handlePointerDown as EventListener);\n window.addEventListener('mousemove', this.handlePointerMove as EventListener);\n window.addEventListener('mouseup', this.handlePointerUp as EventListener);\n\n // Touch events\n this.el.addEventListener('touchstart', this.handleTouchDown, { passive: false });\n window.addEventListener('touchmove', this.handleTouchMove, { passive: false });\n window.addEventListener('touchend', this.handleTouchUp);\n }\n\n // ─── Pointer Abstraction ───────────────────────────────────────────\n\n private handlePointerDown = (e: MouseEvent) => {\n e.preventDefault();\n this.startDrag(e.clientX, e.clientY);\n };\n\n private handlePointerMove = (e: MouseEvent) => {\n if (!this.dragging) return;\n this.moveDrag(e.clientX, e.clientY);\n };\n\n private handlePointerUp = () => {\n if (!this.dragging) return;\n this.endDrag();\n };\n\n private handleTouchDown = (e: TouchEvent) => {\n e.preventDefault();\n const t = e.touches[0];\n this.startDrag(t.clientX, t.clientY);\n };\n\n private handleTouchMove = (e: TouchEvent) => {\n if (!this.dragging) return;\n e.preventDefault();\n const t = e.touches[0];\n this.moveDrag(t.clientX, t.clientY);\n };\n\n private handleTouchUp = () => {\n if (!this.dragging) return;\n this.endDrag();\n };\n\n // ─── Drag Logic ────────────────────────────────────────────────────\n\n private startDrag(px: number, py: number) {\n this.dragging = true;\n this.startPointerX = px - this.posX;\n this.startPointerY = py - this.posY;\n this.lastPointerX = px;\n this.lastPointerY = py;\n this.lastPointerTime = performance.now();\n this.velocitySamples = [];\n\n // Kill any existing velocity so the emoji \"sticks\" to the cursor\n this.velX = 0;\n this.velY = 0;\n\n this.el.style.cursor = 'grabbing';\n this.onDragStart?.();\n this.startPhysicsLoop();\n }\n\n private moveDrag(px: number, py: number) {\n const now = performance.now();\n const dt = Math.max(1, now - this.lastPointerTime);\n\n // Track velocity samples\n this.velocitySamples.push({\n x: (px - this.lastPointerX) / dt,\n y: (py - this.lastPointerY) / dt,\n });\n if (this.velocitySamples.length > this.MAX_SAMPLES) {\n this.velocitySamples.shift();\n }\n\n this.posX = px - this.startPointerX;\n this.posY = py - this.startPointerY;\n this.lastPointerX = px;\n this.lastPointerY = py;\n this.lastPointerTime = now;\n }\n\n private endDrag() {\n this.dragging = false;\n this.el.style.cursor = 'pointer';\n\n // Compute toss velocity from recent samples (average)\n if (this.velocitySamples.length > 0) {\n let sx = 0, sy = 0;\n for (const s of this.velocitySamples) {\n sx += s.x;\n sy += s.y;\n }\n // Scale factor: velocity was per-ms, we want px/frame at ~60fps (~16ms)\n const n = this.velocitySamples.length;\n this.velX = (sx / n) * 16;\n this.velY = (sy / n) * 16;\n\n // Clamp max toss speed\n const maxV = 25;\n const speed = Math.hypot(this.velX, this.velY);\n if (speed > maxV) {\n this.velX = (this.velX / speed) * maxV;\n this.velY = (this.velY / speed) * maxV;\n }\n }\n\n this.onDragEnd?.();\n this.startPhysicsLoop();\n }\n\n // ─── Physics Simulation ────────────────────────────────────────────\n\n private startPhysicsLoop() {\n if (this.animating) return;\n this.animating = true;\n this.rafId = requestAnimationFrame(this.physicsTick);\n }\n\n private physicsTick = () => {\n\n if (this.dragging) {\n // While dragging, just emit the current state with elastic deformation\n this.emitState();\n this.rafId = requestAnimationFrame(this.physicsTick);\n return;\n }\n\n // Free flight: apply spring back to origin + air friction\n // Spring force: F = -k * pos\n const fx = -this.springK * this.posX;\n const fy = -this.springK * this.posY;\n\n this.velX = (this.velX + fx) * this.springD;\n this.velY = (this.velY + fy) * this.springD;\n\n // Air decay\n this.velX *= this.tossDecay;\n this.velY *= this.tossDecay;\n\n this.posX += this.velX;\n this.posY += this.velY;\n\n this.emitState();\n\n // Stop when close enough to origin and nearly stationary\n const dist = Math.hypot(this.posX, this.posY);\n const speed = Math.hypot(this.velX, this.velY);\n if (dist < 0.3 && speed < 0.1) {\n this.posX = 0;\n this.posY = 0;\n this.velX = 0;\n this.velY = 0;\n this.animating = false;\n this.emitState();\n return;\n }\n\n this.rafId = requestAnimationFrame(this.physicsTick);\n };\n\n private emitState() {\n // Compute elastic Squash & Stretch based on velocity\n let stretchX = 1;\n let stretchY = 1;\n let rotation = 0;\n\n if (this.dragging) {\n // Stretch in drag direction\n const dx = this.posX;\n const dy = this.posY;\n const dist = Math.hypot(dx, dy);\n const stretch = Math.min(this.maxStretch, dist * 0.002);\n const angle = Math.atan2(dy, dx);\n\n // Decompose stretch along the drag direction\n stretchX = 1 + stretch * Math.abs(Math.cos(angle));\n stretchY = 1 - stretch * 0.5 * Math.abs(Math.cos(angle));\n // Slight counter-axis compression\n if (Math.abs(Math.sin(angle)) > Math.abs(Math.cos(angle))) {\n stretchY = 1 + stretch * Math.abs(Math.sin(angle));\n stretchX = 1 - stretch * 0.5 * Math.abs(Math.sin(angle));\n }\n\n rotation = Math.atan2(dy, dx) * 0.06; // subtle tilt in drag direction\n } else {\n // Velocity-based jelly wobble during free flight / bounce\n const speed = Math.hypot(this.velX, this.velY);\n const wobble = Math.min(this.maxStretch, speed * 0.012);\n const angle = Math.atan2(this.velY, this.velX);\n\n stretchX = 1 + wobble * Math.abs(Math.cos(angle));\n stretchY = 1 - wobble * 0.6 * Math.abs(Math.cos(angle));\n if (Math.abs(Math.sin(angle)) > Math.abs(Math.cos(angle))) {\n stretchY = 1 + wobble * Math.abs(Math.sin(angle));\n stretchX = 1 - wobble * 0.6 * Math.abs(Math.sin(angle));\n }\n\n rotation = Math.atan2(this.velY, this.velX) * 0.04;\n }\n\n this.onUpdate({\n offsetX: this.posX,\n offsetY: this.posY,\n scaleX: stretchX,\n scaleY: stretchY,\n rotation,\n isDragging: this.dragging,\n });\n }\n\n public destroy() {\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n this.el.removeEventListener('mousedown', this.handlePointerDown as EventListener);\n window.removeEventListener('mousemove', this.handlePointerMove as EventListener);\n window.removeEventListener('mouseup', this.handlePointerUp as EventListener);\n this.el.removeEventListener('touchstart', this.handleTouchDown);\n window.removeEventListener('touchmove', this.handleTouchMove);\n window.removeEventListener('touchend', this.handleTouchUp);\n }\n}\n","/**\n * Utilidades de accesibilidad (A11y) para Wissive:\n * - Detección y subscripción a prefers-reduced-motion\n * - Cálculo de luminancia relativa y ratio de contraste WCAG 2.1\n */\n\n/**\n * Detecta si el usuario prefiere movimiento reducido en su sistema operativo.\n */\nexport function isReducedMotionPreferred(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return false;\n }\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Se suscribe a los cambios de la preferencia prefers-reduced-motion del sistema.\n */\nexport function subscribeToReducedMotion(onChange: (reduced: boolean) => void): () => void {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return () => {};\n }\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n const listener = (e: MediaQueryListEvent) => onChange(e.matches);\n \n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', listener);\n return () => mediaQuery.removeEventListener('change', listener);\n } else {\n // Fallback para navegadores antiguos\n mediaQuery.addListener(listener);\n return () => mediaQuery.removeListener(listener);\n }\n}\n\n/**\n * Convierte un color HEX o RGB a componentes [R, G, B] normalizados (0 a 1).\n */\nfunction parseColorToRGB(color: string): [number, number, number] {\n let hex = color.trim().replace('#', '');\n if (hex.length === 3) {\n hex = hex.split('').map(c => c + c).join('');\n }\n if (hex.length === 6) {\n const num = parseInt(hex, 16);\n return [(num >> 16 & 255) / 255, (num >> 8 & 255) / 255, (num & 255) / 255];\n }\n // Default a negro si no se puede parsear\n return [0, 0, 0];\n}\n\n/**\n * Calcula la luminancia relativa de un color según la norma WCAG 2.1.\n */\nexport function getLuminance(color: string): number {\n const [r, g, b] = parseColorToRGB(color);\n const transformComponent = (c: number) => {\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n };\n const R = transformComponent(r);\n const G = transformComponent(g);\n const B = transformComponent(b);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n}\n\n/**\n * Calcula el ratio de contraste entre dos colores (e.g. 3:1, 4.5:1).\n */\nexport function getContrastRatio(color1: string, color2: string): number {\n const l1 = getLuminance(color1);\n const l2 = getLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Verifica si el ratio de contraste cumple con los criterios mínimos de WCAG (3:1 para componentes gráficos).\n */\nexport function checkContrast(bgColor: string, fgColor: string, minRatio: number = 3.0): {\n ratio: number;\n passes: boolean;\n} {\n const ratio = getContrastRatio(bgColor, fgColor);\n return {\n ratio: Number(ratio.toFixed(2)),\n passes: ratio >= minRatio,\n };\n}\n","import { InteractionState } from '../emojis/types';\n\nexport interface EmojiTheme {\n baseColor: string;\n strokeColor?: string;\n glowColor?: string;\n}\n\nexport type ThemeOption = 'auto' | EmojiTheme;\n\n/**\n * Mapeo de paleta de colores por estado de emoción/actividad\n */\nexport const STATE_THEME_MAP: Partial<Record<InteractionState, EmojiTheme>> = {\n // Emociones positivas & energía\n happy: { baseColor: '#F7C6CE', strokeColor: '#1c1917' },\n excited: { baseColor: '#FFD54F', strokeColor: '#1c1917' },\n celebrate: { baseColor: '#FF80AB', strokeColor: '#1c1917' },\n laughing: { baseColor: '#FFE082', strokeColor: '#1c1917' },\n playful: { baseColor: '#F48FB1', strokeColor: '#1c1917' },\n proud: { baseColor: '#CE93D8', strokeColor: '#1c1917' },\n\n // Reposo, sueño & descanso\n idle: { baseColor: '#F7C6CE', strokeColor: '#1c1917' },\n sleeping: { baseColor: '#9FA8DA', strokeColor: '#1A237E' },\n drowsy: { baseColor: '#C5CAE9', strokeColor: '#283593' },\n 'powering-down': { baseColor: '#78909C', strokeColor: '#263238' },\n bored: { baseColor: '#B0BEC5', strokeColor: '#37474F' },\n\n // Fuego, ira & alerta\n angry: { baseColor: '#EF5350', strokeColor: '#B71C1C' },\n alerting: { baseColor: '#FF7043', strokeColor: '#BF360C' },\n notifying: { baseColor: '#FFA726', strokeColor: '#E65100' },\n suspicious: { baseColor: '#D4E157', strokeColor: '#33691E' },\n\n // Pensamiento, procesamiento & escaneo AI\n thinking: { baseColor: '#4DD0E1', strokeColor: '#006064' },\n searching: { baseColor: '#26C6DA', strokeColor: '#004D40' },\n loading: { baseColor: '#4FC3F7', strokeColor: '#01579B' },\n listening: { baseColor: '#81C784', strokeColor: '#1B5E20' },\n dictating: { baseColor: '#AED581', strokeColor: '#33691E' },\n writing: { baseColor: '#FFF176', strokeColor: '#F57F17' },\n orbit: { baseColor: '#80DEEA', strokeColor: '#00838F' },\n radar: { baseColor: '#4DB6AC', strokeColor: '#004D40' },\n progress: { baseColor: '#64B5F6', strokeColor: '#0D47A1' },\n\n // Tristeza, duda & empatía\n sad: { baseColor: '#90CAF9', strokeColor: '#1565C0' },\n scared: { baseColor: '#B39DDB', strokeColor: '#4527A0' },\n confused: { baseColor: '#FFE082', strokeColor: '#E65100' },\n curious: { baseColor: '#A5D6A7', strokeColor: '#1B5E20' },\n shy: { baseColor: '#F48FB1', strokeColor: '#880E4F' },\n waking: { baseColor: '#FFF59D', strokeColor: '#F57F17' },\n spawning: { baseColor: '#E1BEE7', strokeColor: '#4A148C' },\n};\n\n/**\n * Convierte color HEX a objeto RGB {r, g, b}\n */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n let c = hex.trim().replace('#', '');\n if (c.length === 3) {\n c = c.split('').map(x => x + x).join('');\n }\n const num = parseInt(c, 16);\n if (isNaN(num)) return { r: 247, g: 198, b: 206 };\n return {\n r: (num >> 16) & 255,\n g: (num >> 8) & 255,\n b: num & 255,\n };\n}\n\n/**\n * Interpola suavemente entre dos colores HEX\n */\nexport function blendColors(colorA: string, colorB: string, factor: number): string {\n const rgbA = hexToRgb(colorA);\n const rgbB = hexToRgb(colorB);\n\n const f = Math.max(0, Math.min(1, factor));\n const r = Math.round(rgbA.r + (rgbB.r - rgbA.r) * f);\n const g = Math.round(rgbA.g + (rgbB.g - rgbA.g) * f);\n const b = Math.round(rgbA.b + (rgbB.b - rgbA.b) * f);\n\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Obtiene el tema sugerido para un estado dado, con fallback a la paleta predeterminada del emoji.\n */\nexport function getThemeForState(_state: InteractionState, defaultBaseColor: string): EmojiTheme {\n return {\n baseColor: defaultBaseColor,\n strokeColor: '#1c1917',\n };\n}\n\n","import type { FaceParameters, MotionType } from '../emojis/types';\n\n/**\n * Animación idle por personalidad.\n *\n * Cada emoji tiene una firma de movimiento propia. La clave para que se sienta\n * \"vivo\" no es el desplazamiento principal (bob/shiftX) sino el movimiento\n * secundario: inclinación de cabeza desfasada, respiración leída en eyeScale,\n * micro-expresión (cejas/boca/mejillas) y acentos irregulares que rompen el\n * bucle senoidal perfecto.\n *\n * Todas las funciones son ADITIVAS sobre los valores del resorte.\n */\nexport type IdleMotionFn = (\n p: FaceParameters,\n t: number,\n speed: number,\n amp: number\n) => void;\n\n/** Acento corto y esporádico: 1 durante una fracción del ciclo, 0 el resto. */\nfunction accent(t: number, period: number, width: number): number {\n const cycle = (t / period) % 1;\n return cycle < width ? Math.sin((cycle / width) * Math.PI) : 0;\n}\n\nexport const IDLE_MOTIONS: Record<MotionType, IdleMotionFn> = {\n // Mochi — saltitos alegres, mejillas que florecen en el apogeo\n bouncy(p, t, speed, amp) {\n const hop = Math.abs(Math.sin(t * speed));\n p.bob += hop * amp - amp * 0.5;\n p.cheek += hop * 0.15;\n p.eyeScale += hop * 0.04;\n p.turnAngle += Math.sin(t * speed * 0.5) * 0.05;\n },\n\n // Zumi — aleteo rápido lateral, entrecierra los ojos por el zumbido\n flutter(p, t, speed, amp) {\n const beat = Math.sin(t * speed);\n p.shiftX += beat * amp;\n p.bob += Math.cos(t * speed * 0.7) * amp * 0.5;\n p.turnAngle += beat * 0.06;\n p.eyeScale -= Math.abs(beat) * 0.03;\n },\n\n // Suri — respiración profunda y lenta, inclinación que va por detrás\n serene(p, t, speed, amp) {\n const breath = Math.sin(t * speed);\n p.bob += breath * amp;\n p.eyeScale += breath * 0.05;\n p.cheek += (breath + 1) * 0.06;\n p.turnAngle += Math.sin(t * speed * 0.4 - 0.6) * 0.045;\n },\n\n // Nima — deriva fantasmal en ocho (frecuencias 2:1)\n float(p, t, speed, amp) {\n p.bob += Math.sin(t * speed) * amp;\n p.shiftX += Math.sin(t * speed * 0.5) * amp * 1.1;\n p.turnAngle += Math.sin(t * speed * 0.5 - 0.9) * 0.07;\n },\n\n // Cota — respiración mínima y mirada que divaga sin rumbo\n calm(p, t, speed, amp) {\n const breath = Math.sin(t * speed);\n p.bob += breath * amp;\n p.eyeScale += breath * 0.025;\n p.gazeX += Math.sin(t * speed * 0.23) * 2.5;\n p.turnAngle += Math.sin(t * speed * 0.31) * 0.03;\n },\n\n // Dozy — cabecea hasta dormirse y despierta de golpe\n droop(p, t, speed, amp) {\n const cycle = (t * speed * 0.18) % 1;\n // Caída lenta (82% del ciclo) y recuperación brusca (18%)\n const sag = cycle < 0.82 ? cycle / 0.82 : 1 - (cycle - 0.82) / 0.18;\n p.bob += sag * amp * 2.2;\n p.eyeOpen = Math.max(0, p.eyeOpen - sag * 0.45);\n p.browY += sag * 2;\n p.turnAngle += sag * 0.12;\n },\n\n // Lumo — respiración entrecortada del llanto, mirada baja\n sob(p, t, speed, amp) {\n // Dos senos incompatibles = respiración irregular, nunca se repite igual\n const shudder = Math.sin(t * speed) + Math.sin(t * speed * 2.7) * 0.4;\n p.bob += shudder * amp;\n p.browY += 1 + Math.sin(t * speed) * 0.8;\n p.gazeY += 1.5;\n p.mouthCurve -= 0.05 + Math.abs(Math.sin(t * speed)) * 0.05;\n },\n\n // Fidge — temblor nervioso y mirada que se dispara de un lado a otro\n jitter(p, t, speed, amp) {\n p.shiftX += (Math.random() - 0.5) * amp;\n p.bob += (Math.random() - 0.5) * amp;\n p.gazeX += Math.sin(t * speed * 1.7) * 4 + (Math.random() - 0.5) * 2;\n p.turnAngle += (Math.random() - 0.5) * 0.03;\n },\n\n // Brix — rumor contenido que estalla en llamaradas puntuales\n fiery(p, t, speed, amp) {\n const rumble = Math.sin(t * speed * 3.1) * 0.35;\n // Potencia alta = pico corto y raro en vez de una onda suave\n const flare = Math.pow(Math.max(0, Math.sin(t * speed * 0.35)), 6);\n p.bob += rumble * amp - flare * amp * 1.8;\n p.shiftX += rumble * amp * 0.5;\n p.eyeScale += flare * 0.18;\n p.browY -= flare * 2.5;\n p.browTilt -= flare * 0.25;\n },\n\n // Wilt — se desinfla y se vuelve a inflar, resignado\n wilt(p, t, speed, amp) {\n const deflate = (Math.sin(t * speed * 0.6) + 1) / 2;\n p.bob += deflate * amp * 1.8;\n p.mouthCurve -= deflate * 0.12;\n p.browY += deflate * 1.6;\n p.eyeScale -= deflate * 0.05;\n },\n\n // Knot — bamboleo circular con la cabeza rodando\n dizzy(p, t, speed, amp) {\n p.shiftX += Math.sin(t * speed) * amp;\n p.bob += Math.cos(t * speed) * amp * 0.7;\n p.turnAngle += Math.sin(t * speed) * 0.14;\n p.gazeX += Math.cos(t * speed) * 3;\n },\n\n // Snug — respiración profunda de sueño, párpados pesados\n snooze(p, t, speed, amp) {\n const breath = Math.sin(t * speed);\n p.bob += breath * amp * 1.6;\n p.eyeScale += breath * 0.06;\n p.eyeOpen *= 0.35;\n p.cheek += (breath + 1) * 0.05;\n p.turnAngle += Math.sin(t * speed - 0.8) * 0.05;\n },\n\n // Pip — sobresaltos secos; entre uno y otro aguanta la respiración con tensión\n pop(p, t, speed, amp) {\n const startle = accent(t, 1 / (speed * 0.1), 0.18);\n // Base tensa: sin ella se quedaba congelado entre sobresaltos\n const held = Math.sin(t * speed * 1.6) * 0.18;\n p.bob += held * amp - startle * amp * 2.2;\n p.eyeScale += held * 0.02 + startle * 0.22;\n p.browY -= startle * 3;\n p.mouthOpen += startle * 0.25;\n },\n\n // Void — casi inmóvil, con micro-fallos tipo glitch\n drift(p, t, speed, amp) {\n p.bob += Math.sin(t * speed) * amp * 0.6;\n const glitch = accent(t, 3.7, 0.04);\n p.shiftX += glitch * (Math.random() - 0.5) * 5;\n p.gazeX += glitch * (Math.random() - 0.5) * 6;\n p.eyeScale -= glitch * 0.08;\n },\n};\n\n/**\n * Aplica la animación idle correspondiente al perfil de movimiento.\n * `intensity` reduce la amplitud sin apagarla — los estados near/hover/click\n * siguen respirando en vez de quedarse congelados.\n */\nexport function applyIdleMotion(\n motionType: MotionType,\n p: FaceParameters,\n t: number,\n speed: number,\n amp: number,\n intensity = 1\n): void {\n const fn = IDLE_MOTIONS[motionType] || IDLE_MOTIONS.calm;\n fn(p, t, speed, amp * intensity);\n}\n\n/* ─────────────────────────────────────────────────────────────────────\n * Movimiento por estado\n *\n * Antes eran siete grupos de `case` encadenados: 5 estados compartían el\n * mismo barrido de mirada, 4 la misma boca, 4 el mismo salto… y 15 estados\n * se quedaban completamente inmóviles. Aquí cada estado tiene su propia\n * firma; `speed`/`amp` vienen del emoji, así que un mismo estado se sigue\n * sintiendo distinto en Mochi que en Void.\n * ──────────────────────────────────────────────────────────────────── */\n\nexport const STATE_MOTIONS: Record<string, IdleMotionFn> = {\n // ── Ciclo de vida ──────────────────────────────────────────────────\n sleeping(p, t) {\n const breath = Math.sin(t * 0.9);\n p.eyeOpen = 0.05;\n p.bob += breath * 2.4;\n p.eyeScale += breath * 0.04;\n // Suspiro más hondo de vez en cuando\n p.bob += accent(t, 9, 0.15) * 1.8;\n },\n waking(p, t) {\n const stretch = accent(t, 4, 0.4);\n p.bob += Math.sin(t * 2.2) * 1.6 - stretch * 3;\n p.eyeOpen = Math.min(1, 0.35 + stretch * 0.65);\n p.eyeScale += stretch * 0.1;\n p.turnAngle += Math.sin(t * 1.1) * 0.06;\n },\n listening(p, t) {\n // Cabeza ladeada y sostenida, con asentimientos cortos\n p.turnAngle += 0.1 + Math.sin(t * 1.4) * 0.03;\n p.bob += accent(t, 2.6, 0.25) * 2.2;\n p.eyeScale += 0.06;\n p.gazeY -= 0.8;\n },\n thinking(p, t) {\n // Mirada arriba a la izquierda, vagando despacio\n p.gazeX += -6 + Math.sin(t * 0.9) * 3;\n p.gazeY += -4 + Math.cos(t * 0.7) * 2;\n p.browY -= 1 + Math.sin(t * 1.3) * 0.8;\n p.turnAngle += Math.sin(t * 0.6) * 0.05;\n },\n searching(p, t) {\n // Barrido horizontal rápido, como quien rastrea una lista\n p.gazeX += Math.sin(t * 5.5) * 11;\n p.gazeY += Math.sin(t * 2.3) * 2.5;\n p.turnAngle += Math.sin(t * 5.5) * 0.05;\n p.eyeScale += 0.05;\n },\n working(p, t) {\n // Cadencia regular de trabajo, boca firme\n p.bob += Math.sin(t * 3.4) * 1.4;\n p.turnAngle += Math.sin(t * 3.4 - 0.5) * 0.035;\n p.gazeY += 1.5;\n p.mouthWidth *= 0.9;\n },\n\n // ── Reacciones ─────────────────────────────────────────────────────\n excited(p, t) {\n p.bob += -Math.abs(Math.sin(t * 7)) * 5.5;\n p.eyeScale += 0.1 + Math.abs(Math.sin(t * 7)) * 0.06;\n p.cheek += 0.2;\n p.turnAngle += Math.sin(t * 3.5) * 0.07;\n },\n surprised(p, t) {\n // Congelado del susto, con un temblor fino encima\n p.bob += Math.sin(t * 9) * 0.9;\n p.eyeScale += 0.12;\n p.browY -= 1.5;\n p.shiftX += Math.sin(t * 13) * 0.4;\n },\n suspicious(p, t) {\n // Casi inmóvil: mira de reojo y aguanta\n p.gazeX += -7 + Math.sin(t * 0.5) * 2.5;\n p.eyeScale -= 0.08;\n p.browTilt -= 0.12;\n p.bob += Math.sin(t * 0.8) * 0.5;\n },\n angry(p, t) {\n p.shiftX += (Math.random() - 0.5) * 3;\n p.bob += (Math.random() - 0.5) * 2;\n // Aprieta las cejas por rachas\n const clench = accent(t, 2.2, 0.3);\n p.browY -= clench * 2;\n p.browTilt -= clench * 0.2;\n },\n drowsy(p, t) {\n const sag = (Math.sin(t * 0.8) + 1) / 2;\n p.bob += sag * 3;\n p.eyeOpen = Math.max(0.08, 0.5 - sag * 0.4);\n // Reabre los ojos de golpe cuando se le va la cabeza\n p.eyeOpen += accent(t, 6.5, 0.08) * 0.5;\n p.browY += sag * 2;\n },\n happy(p, t) {\n p.bob += -Math.abs(Math.sin(t * 3.2)) * 2.4;\n p.cheek += 0.15 + Math.abs(Math.sin(t * 3.2)) * 0.1;\n p.turnAngle += Math.sin(t * 1.6) * 0.05;\n },\n curious(p, t) {\n // Ladeo que oscila y mirada que salta de un punto a otro\n p.turnAngle += Math.sin(t * 1.2) * 0.13;\n p.gazeX += Math.sin(t * 2.1) * 6;\n p.eyeScale += 0.08;\n p.bob += Math.sin(t * 2.4) * 1;\n },\n confused(p, t) {\n // Bamboleo lento de lado a lado, cejas descompensadas\n p.turnAngle += Math.sin(t * 0.9) * 0.16;\n p.shiftX += Math.sin(t * 0.9) * 1.8;\n p.browTilt += 0.15 + Math.sin(t * 1.7) * 0.1;\n p.gazeX += Math.sin(t * 0.6) * 4;\n },\n bored(p, t) {\n // Vaivén lentísimo, mirada perdida fuera de cuadro, suspiro\n p.shiftX += Math.sin(t * 0.5) * 2.2;\n p.gazeX += 6 + Math.sin(t * 0.3) * 3;\n p.eyeOpen = Math.min(p.eyeOpen, 0.5);\n p.bob += accent(t, 7, 0.2) * 2;\n },\n proud(p, t) {\n // Pecho arriba, barbilla levantada\n p.bob += -2 + Math.sin(t * 1.1) * 0.8;\n p.turnAngle += Math.sin(t * 0.7) * 0.04;\n p.gazeY -= 2;\n p.cheek += 0.1;\n },\n shy(p, t) {\n // Se encoge y mira abajo desviando\n p.bob += 1.5 + Math.sin(t * 1.3) * 0.7;\n p.gazeX += -4 + Math.sin(t * 0.9) * 1.5;\n p.gazeY += 4;\n p.cheek += 0.25;\n p.eyeScale -= 0.06;\n },\n sad(p, t) {\n p.bob += 2 + Math.sin(t * 0.9) * 1.4;\n p.gazeY += 3;\n p.browY += 1.5;\n p.turnAngle += Math.sin(t * 0.5) * 0.03;\n },\n laughing(p, t) {\n // Sacudida rápida con la boca marcando el ritmo\n p.bob += -Math.abs(Math.sin(t * 9)) * 4;\n p.mouthOpen += 0.2 + Math.abs(Math.sin(t * 9)) * 0.3;\n p.cheek += 0.3;\n p.turnAngle += Math.sin(t * 4.5) * 0.05;\n },\n scared(p, t) {\n // Tiritona de frecuencia alta y encogimiento\n p.shiftX += Math.sin(t * 22) * 1.2;\n p.bob += 1.2 + Math.sin(t * 18) * 0.8;\n p.eyeScale += 0.14;\n p.browTilt += 0.2;\n },\n playful(p, t) {\n // Bamboleo irregular: dos frecuencias que no encajan\n p.bob += (Math.sin(t * 4.3) + Math.sin(t * 6.7) * 0.5) * 1.8;\n p.turnAngle += Math.sin(t * 3.1) * 0.11;\n p.shiftX += Math.sin(t * 2.2) * 1.5;\n p.cheek += 0.18;\n },\n celebrate(p, t) {\n // Saltos grandes con giro alterno\n p.bob += -Math.abs(Math.sin(t * 5)) * 7;\n p.turnAngle += Math.sin(t * 2.5) * 0.18;\n p.cheek += 0.35;\n p.eyeScale += 0.1;\n },\n\n // ── Morfos de agente ───────────────────────────────────────────────\n orbit(p, t) {\n // Órbita circular limpia y continua\n p.gazeX += Math.cos(t * 2.2) * 10;\n p.gazeY += Math.sin(t * 2.2) * 6;\n p.turnAngle += Math.cos(t * 2.2) * 0.06;\n },\n radar(p, t) {\n // Barrido con pausa en cada extremo (no es un seno puro)\n const sweep = Math.sin(t * 1.6);\n p.gazeX += Math.sign(sweep) * Math.pow(Math.abs(sweep), 0.45) * 11;\n p.turnAngle += sweep * 0.05;\n p.eyeScale += 0.04;\n },\n progress(p, t) {\n // Latido de metrónomo, sin desplazamiento lateral\n const beat = Math.pow(Math.max(0, Math.sin(t * 3)), 3);\n p.bob += -beat * 3;\n p.eyeScale += beat * 0.09;\n },\n\n // ── Ciclo de producto ──────────────────────────────────────────────\n spawning(p, t) {\n // Aparición con rebote que se va asentando\n const settle = Math.exp(-((t * 1.5) % 6) * 0.7);\n p.bob += -Math.sin(t * 6) * 4 * settle;\n p.eyeScale += settle * 0.15;\n },\n humming(p, t) {\n p.bob += Math.sin(t * 2.6) * 1.6;\n p.mouthOpen += 0.1 + Math.abs(Math.sin(t * 2.6)) * 0.08;\n p.turnAngle += Math.sin(t * 1.3) * 0.05;\n p.cheek += 0.12;\n },\n loading(p, t) {\n // Pulso paciente, sin prisa\n p.eyeScale += Math.sin(t * 1.8) * 0.08;\n p.bob += Math.sin(t * 1.8) * 1.2;\n p.gazeY += Math.sin(t * 0.9) * 1.5;\n },\n dictating(p, t) {\n // Boca disparada, cabeza quieta\n p.mouthOpen = 0.25 + Math.abs(Math.sin(t * 11)) * 0.4;\n p.bob += Math.sin(t * 2) * 0.6;\n p.browY -= 0.5;\n },\n writing(p, t) {\n // Cabezadas cortas siguiendo el renglón, mirada abajo\n p.gazeY += 4;\n p.gazeX += Math.sin(t * 4.5) * 5;\n p.bob += Math.abs(Math.sin(t * 4.5)) * 1.2;\n },\n sending(p, t) {\n // Empuje hacia delante que vuelve\n const push = accent(t, 1.6, 0.3);\n p.shiftX += push * 4;\n p.bob += -push * 2;\n p.turnAngle += push * 0.08;\n },\n receiving(p, t) {\n // Retroceso al recibir, ojos que se abren\n const pull = accent(t, 1.6, 0.3);\n p.shiftX += -pull * 4;\n p.bob += pull * 1.5;\n p.eyeScale += pull * 0.12;\n },\n uploading(p, t) {\n // Deriva que sube y reaparece abajo\n const rise = 1 - ((t * 0.7) % 1);\n p.bob += rise * 4 - 2;\n p.gazeY -= 2;\n p.eyeScale += (1 - rise) * 0.05;\n },\n notifying(p, t) {\n // Doble repique: dos toques seguidos y pausa\n const blip = accent(t, 2.4, 0.12) + accent(t - 0.22, 2.4, 0.12);\n p.bob += -blip * 4;\n p.eyeScale += blip * 0.12;\n p.turnAngle += blip * 0.06;\n },\n alerting(p, t) {\n // Sacudida urgente y ojos muy abiertos\n p.shiftX += Math.sin(t * 16) * 2.5;\n p.bob += Math.sin(t * 12) * 1.5;\n p.eyeScale += 0.16;\n p.browY -= 2;\n },\n dragging(p, t) {\n // Bamboleo que va por detrás, como algo colgando\n p.turnAngle += Math.sin(t * 2.4 - 1.2) * 0.14;\n p.shiftX += Math.sin(t * 2.4) * 2;\n p.bob += Math.cos(t * 2.4 - 1.2) * 1.5;\n },\n bouncing(p, t) {\n // Rebote vertical puro y grande\n p.bob += -Math.abs(Math.sin(t * 5.5)) * 8;\n },\n 'powering-down'(p, t) {\n // Se hunde y parpadea de forma intermitente antes de apagarse\n const sink = Math.min(1, (t % 8) / 8);\n p.bob += sink * 4;\n p.eyeOpen = Math.max(0.03, 0.4 - sink * 0.37);\n p.eyeOpen += accent(t, 2.7, 0.05) * 0.3;\n p.eyeScale -= sink * 0.1;\n },\n};\n\n/**\n * Aplica el movimiento propio de un estado.\n * Devuelve `false` si el estado no tiene firma propia — en ese caso el llamador\n * debe recurrir a la animación de personalidad del emoji.\n */\nexport function applyStateMotion(\n state: string,\n p: FaceParameters,\n t: number,\n speed: number,\n amp: number\n): boolean {\n const fn = STATE_MOTIONS[state];\n if (!fn) return false;\n fn(p, t, speed, amp);\n return true;\n}\n","import type { FaceParameters } from '../emojis/types';\n\nexport type SequenceMode = 'loop' | 'once' | 'ping-pong';\n\nexport interface SequenceStep {\n /** Nombre de un estado del emoji (usa su pool de expresiones) */\n state?: string;\n /** Parámetros crudos — se aplican encima si además hay `state` */\n params?: Partial<FaceParameters>;\n /** ms que dura este paso antes de pasar al siguiente */\n duration?: number;\n}\n\nexport interface SequenceOptions {\n mode?: SequenceMode;\n onComplete?: () => void;\n}\n\nexport const DEFAULT_STEP_MS = 600;\n\nexport interface SequencePlayer {\n play: (steps: SequenceStep[], options?: SequenceOptions) => void;\n stop: () => void;\n isPlaying: () => boolean;\n}\n\n/**\n * Encadena expresiones en una línea de tiempo.\n *\n * No toca resortes ni DOM: recibe `resolveStep` (paso → parámetros) y\n * `applyStep` (parámetros → destino), de modo que la interpolación entre pasos\n * la sigue haciendo el motor de resortes que ya existe.\n */\nexport function createSequencePlayer(hooks: {\n resolveStep: (step: SequenceStep) => Partial<FaceParameters>;\n applyStep: (params: Partial<FaceParameters>) => void;\n}): SequencePlayer {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let playing = false;\n\n const stop = () => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n playing = false;\n };\n\n const play = (steps: SequenceStep[], options: SequenceOptions = {}) => {\n stop();\n if (steps.length === 0) return;\n\n const mode = options.mode ?? 'once';\n playing = true;\n let index = 0;\n let direction = 1;\n\n const advance = () => {\n if (!playing) return;\n\n const step = steps[index];\n hooks.applyStep(hooks.resolveStep(step));\n\n timer = setTimeout(() => {\n if (mode === 'ping-pong') {\n // Rebota en los extremos: A,B,C,B,A,B,C…\n if (steps.length > 1) {\n if (index + direction >= steps.length || index + direction < 0) {\n direction = -direction;\n }\n index += direction;\n }\n } else {\n index += 1;\n if (index >= steps.length) {\n if (mode === 'loop') {\n index = 0;\n } else {\n stop();\n options.onComplete?.();\n return;\n }\n }\n }\n advance();\n }, step.duration ?? DEFAULT_STEP_MS);\n };\n\n advance();\n };\n\n return { play, stop, isPlaying: () => playing };\n}\n","import type { InteractionState } from './types';\n\n/**\n * Registro de estados en runtime — fuente única de verdad.\n *\n * Los tipos de `types.ts` solo existen en compilación, así que la UI se\n * inventaba su propia lista y quedó desincronizada: `idle` duplicado,\n * etiquetas en francés y un recuento de 39 que no cuadraba con la realidad.\n */\nexport interface StateGroup {\n label: string;\n states: InteractionState[];\n}\n\nexport const STATE_GROUPS: StateGroup[] = [\n {\n label: 'Interacción',\n states: ['idle', 'near', 'hover', 'click'],\n },\n {\n // `idle` vive en el grupo de Interacción, no se repite aquí\n label: 'Ciclo de vida',\n states: ['sleeping', 'waking', 'listening', 'thinking', 'searching', 'working'],\n },\n {\n label: 'Reacciones',\n states: [\n 'excited', 'surprised', 'suspicious', 'angry', 'drowsy', 'happy',\n 'curious', 'confused', 'bored', 'proud', 'shy', 'sad',\n 'laughing', 'scared', 'playful', 'celebrate',\n ],\n },\n {\n label: 'Morfos de agente',\n states: ['orbit', 'radar', 'progress'],\n },\n {\n label: 'Ciclo de producto',\n states: [\n 'spawning', 'humming', 'loading', 'dictating', 'writing', 'sending',\n 'receiving', 'uploading', 'notifying', 'alerting', 'dragging',\n 'bouncing', 'powering-down',\n ],\n },\n];\n\n/** Todos los estados, sin repetidos, en orden de grupo */\nexport const ALL_STATES: InteractionState[] = STATE_GROUPS.flatMap((g) => g.states);\n\n/** Estados cuya animación la pone la personalidad del emoji, no el estado */\nexport const PERSONALITY_DRIVEN_STATES: InteractionState[] = ['idle', 'near', 'hover', 'click'];\n\n/**\n * Estados que el emoji puede visitar por su cuenta en reposo (deambular\n * autónomo) — solo \"Reacciones\": son expresión pura, sin significado de\n * aplicación. Deliberadamente NO incluye \"Ciclo de producto\" ni \"Morfos de\n * agente\" (uploading, thinking, orbit…): esos los debe fijar la app anfitriona\n * porque comunican un estado real, y mostrarlos al azar sería mentir.\n */\nexport const AUTONOMOUS_STATES: InteractionState[] =\n STATE_GROUPS.find((g) => g.label === 'Reacciones')!.states;\n\n/**\n * Todo estado que un emoji podría \"visitar\" al deambular — es decir, todos\n * menos los de Interacción (idle/near/hover/click no se \"visitan\", los\n * decide la interacción real del usuario). A diferencia de AUTONOMOUS_STATES,\n * esto SÍ incluye Ciclo de producto/Morfos de agente: sirve como el universo\n * de opciones cuando alguien elige el banco a mano (p.ej. el picker del\n * emoji personalizado) — ahí ya no es la librería \"mintiendo\" por su cuenta,\n * es una elección explícita del usuario para su propio emoji.\n */\nexport const ALL_WANDERABLE_STATES: InteractionState[] = ALL_STATES.filter(\n (s) => !PERSONALITY_DRIVEN_STATES.includes(s)\n);\n\n/**\n * Resuelve qué banco de estados usar para deambular, en orden de prioridad:\n * opción explícita del llamador > banco propio del emoji (p.ej. un custom\n * con `stateBank`) > banco genérico. Función pura para poder testear la\n * prioridad sin tener que instanciar un emoji real (createEmoji necesita DOM).\n */\nexport function resolveAutonomousStatePool(\n explicitPool: InteractionState[] | undefined,\n definitionPool: InteractionState[] | undefined\n): InteractionState[] {\n return explicitPool ?? definitionPool ?? AUTONOMOUS_STATES;\n}\n\n/** Elige uno al azar de `pool`, evitando repetir `previous` cuando hay más de una opción */\nexport function pickWithoutRepeat<T>(pool: T[], previous: T | null): T {\n if (pool.length <= 1) return pool[0];\n let next = pool[Math.floor(Math.random() * pool.length)];\n while (next === previous) {\n next = pool[Math.floor(Math.random() * pool.length)];\n }\n return next;\n}\n","import { WissiveInstance } from '../index';\nimport { sharedLoop } from './raf';\nimport { soundEngine } from './sound';\n\nexport interface EmojiGroupOptions {\n proximityThreshold?: number; // Distancia en px para activar la sinergia (def: 220px)\n enableGazeSync?: boolean; // Los emojis se miran entre sí cuando están cerca (def: true)\n enableSynergies?: boolean; // Reacciones emocionales cruzadas (def: true)\n}\n\ninterface ConnectedPair {\n idA: string;\n idB: string;\n connectedSince: number;\n}\n\nexport class EmojiGroup {\n private instances: Map<string, WissiveInstance> = new Map();\n private options: Required<EmojiGroupOptions>;\n private connectedPairs: Map<string, ConnectedPair> = new Map();\n private isRunning = false;\n\n constructor(instances: WissiveInstance[] = [], options: EmojiGroupOptions = {}) {\n this.options = {\n proximityThreshold: options.proximityThreshold ?? 220,\n enableGazeSync: options.enableGazeSync ?? true,\n enableSynergies: options.enableSynergies ?? true,\n };\n\n instances.forEach(inst => this.add(inst));\n this.start();\n }\n\n public add(instance: WissiveInstance) {\n if (!instance || !instance.id) return;\n this.instances.set(instance.id, instance);\n }\n\n public remove(instance: WissiveInstance) {\n if (!instance || !instance.id) return;\n this.instances.delete(instance.id);\n }\n\n public start() {\n if (this.isRunning) return;\n this.isRunning = true;\n sharedLoop.add(this.update);\n }\n\n public stop() {\n if (!this.isRunning) return;\n this.isRunning = false;\n sharedLoop.remove(this.update);\n }\n\n private getPairKey(id1: string, id2: string): string {\n return id1 < id2 ? `${id1}:${id2}` : `${id2}:${id1}`;\n }\n\n private update = () => {\n const list = Array.from(this.instances.values());\n if (list.length < 2) return;\n\n const currentPairKeys = new Set<string>();\n\n for (let i = 0; i < list.length; i++) {\n for (let j = i + 1; j < list.length; j++) {\n const instA = list[i];\n const instB = list[j];\n\n const posA = instA.getPosition();\n const posB = instB.getPosition();\n\n const dx = posB.x - posA.x;\n const dy = posB.y - posA.y;\n const distance = Math.hypot(dx, dy);\n\n if (distance <= this.options.proximityThreshold && distance > 0) {\n const pairKey = this.getPairKey(instA.id, instB.id);\n currentPairKeys.add(pairKey);\n\n // 1. Mirada mutua (Gaze Sync)\n if (this.options.enableGazeSync) {\n const normXA = Math.max(-0.8, Math.min(0.8, dx / 160)) * 22;\n const normYA = Math.max(-0.8, Math.min(0.8, dy / 160)) * 14;\n\n instA.setGaze({ x: normXA, y: normYA });\n instB.setGaze({ x: -normXA, y: -normYA });\n }\n\n // 2. Evento de primera conexión (Sinergia)\n let pairInfo = this.connectedPairs.get(pairKey);\n if (!pairInfo) {\n pairInfo = {\n idA: instA.id,\n idB: instB.id,\n connectedSince: Date.now(),\n };\n this.connectedPairs.set(pairKey, pairInfo);\n this.triggerSynergy(instA, instB);\n } else {\n // Emisión continua suave de chispas en la mitad de su trayectoria\n if (Math.random() < 0.08 && this.options.enableSynergies) {\n instA.triggerParticles(1);\n instB.triggerParticles(1);\n }\n }\n }\n }\n }\n\n // Limpiar pares que ya no están cerca\n for (const [pairKey, pair] of this.connectedPairs.entries()) {\n if (!currentPairKeys.has(pairKey)) {\n const instA = this.instances.get(pair.idA);\n const instB = this.instances.get(pair.idB);\n\n if (instA) instA.setGaze({ x: 0, y: 0 });\n if (instB) instB.setGaze({ x: 0, y: 0 });\n\n this.connectedPairs.delete(pairKey);\n }\n }\n };\n\n /**\n * Reacción de sinergia entre dos emojis según sus emociones\n */\n private triggerSynergy(instA: WissiveInstance, instB: WissiveInstance) {\n if (!this.options.enableSynergies) return;\n\n const catA = instA.emotionCategory || 'happy';\n const catB = instB.emotionCategory || 'happy';\n\n // Ráfaga de partículas conectivas y sonido de sinergia\n soundEngine.playSound(catA, 'hover');\n instA.triggerParticles(6);\n instB.triggerParticles(6);\n\n\n // Reacciones entre tipos de emociones\n if (catA === 'happy' && catB === 'happy') {\n // Ambas muy felices -> Rebotan juntas\n instA.bounce();\n instB.bounce();\n } else if ((catA === 'happy' && catB === 'sad') || (catA === 'sad' && catB === 'happy')) {\n // Feliz reconforta a Triste\n const happyInst = catA === 'happy' ? instA : instB;\n const sadInst = catA === 'sad' ? instA : instB;\n happyInst.setEmotion('hover');\n sadInst.setEmotion('near');\n } else if (catA === 'intense' || catB === 'intense') {\n // Choque de energía / estrés -> Giro rápido\n instA.spin(0.5);\n instB.spin(0.5);\n }\n }\n\n public destroy() {\n this.stop();\n this.instances.clear();\n this.connectedPairs.clear();\n }\n}\n\nexport function createEmojiGroup(\n instances: WissiveInstance[] = [],\n options: EmojiGroupOptions = {}\n): EmojiGroup {\n return new EmojiGroup(instances, options);\n}\n","import type { EmojiDefinition, InteractionState, SilhouetteType } from './types';\nimport { LIB, EMOJI_COTA } from './catalog.ts';\nimport { ALL_WANDERABLE_STATES } from './states.ts';\n\nconst STORAGE_PREFIX = 'wissive:custom:';\n\nexport interface CustomEmojiOptions {\n /** Color base, ej. '#F2A9B8' */\n baseColor?: string;\n /** Silueta base — cualquiera de las 22 que soporta getSilhouettePath() en\n * render/svg.ts (las 14 de los personajes del catálogo + 8 sin usar\n * todavía por ninguno). Default 'circle'. */\n silhouette?: SilhouetteType;\n /** Nombre de un emoji del catálogo (LIB) del que tomar el tipo/tamaño de ojos */\n eyesFrom?: string;\n /** Nombre de un emoji del catálogo del que tomar el tipo/curva/ancho de boca */\n mouthFrom?: string;\n /**\n * Tipo de ojo crudo (ver el switch(eyeType) en render/svg.ts, 0-23) — para\n * los tipos nuevos que ningún personaje del catálogo usa todavía (estrella,\n * reojo, guiño). Gana sobre `eyesFrom` si se especifican los dos.\n */\n eyeTypeOverride?: number;\n /** Tipo de boca crudo (0-16), mismo caso que eyeTypeOverride. Gana sobre `mouthFrom`. */\n mouthTypeOverride?: number;\n /** Nombre de un emoji del catálogo del que tomar la animación idle (motion) */\n motionFrom?: string;\n /** Nombre de un emoji del catálogo del que tomar el estilo de partículas (burst) */\n particlesFrom?: string;\n /** Nombre de un emoji del catálogo del que tomar el set de sonidos */\n soundFrom?: string;\n /**\n * Banco de estados que este emoji puede realizar por su cuenta en reposo\n * (deambular autónomo) — cualquier subconjunto de ALL_WANDERABLE_STATES\n * (todos menos idle/near/hover/click). Elegido a mano por quien arma el\n * emoji, así que aquí sí se permiten los de \"Ciclo de producto\"/\"Morfos\n * de agente\" — es una decisión explícita, no la librería inventando.\n * Sin especificar, usa el banco genérico (AUTONOMOUS_STATES, 16 \"Reacciones\").\n */\n stateBank?: InteractionState[];\n}\n\nfunction cloneExpressions(source: EmojiDefinition['expressions']): EmojiDefinition['expressions'] {\n const out: EmojiDefinition['expressions'] = {};\n for (const state in source) {\n out[state] = source[state].map((p) => ({ ...p }));\n }\n return out;\n}\n\n/**\n * Construye una definición de emoji personalizado: base neutra (Cota),\n * silueta a elección (circle por default), con ojos/boca/animación tomados\n * opcionalmente de cualquier otro emoji del catálogo.\n */\nexport function buildCustomEmoji(name: string, options: CustomEmojiOptions = {}): EmojiDefinition {\n const eyesSource = options.eyesFrom ? LIB[options.eyesFrom] : undefined;\n const mouthSource = options.mouthFrom ? LIB[options.mouthFrom] : undefined;\n const motionSource = options.motionFrom ? LIB[options.motionFrom] : undefined;\n const particlesSource = options.particlesFrom ? LIB[options.particlesFrom] : undefined;\n const soundSource = options.soundFrom ? LIB[options.soundFrom] : undefined;\n\n const expressions = cloneExpressions(EMOJI_COTA.expressions);\n for (const state in expressions) {\n // Cada emoji tiene un banco de variantes por estado (idle/near/hover/click) —\n // se toma la variante del mismo estado, no solo la de idle, para conservar\n // los matices (cheek, bob, etc.) al pasar de un estado a otro.\n const eyesVariant = eyesSource && (eyesSource.expressions[state]?.[0] ?? eyesSource.expressions.idle[0]);\n const mouthVariant = mouthSource && (mouthSource.expressions[state]?.[0] ?? mouthSource.expressions.idle[0]);\n\n expressions[state] = expressions[state].map((p) => ({\n ...p,\n ...(eyesVariant && { eyeType: eyesVariant.eyeType, eyeScale: eyesVariant.eyeScale }),\n ...(mouthVariant && {\n mouthType: mouthVariant.mouthType,\n mouthCurve: mouthVariant.mouthCurve,\n mouthWidth: mouthVariant.mouthWidth,\n }),\n // Los overrides van al final y ganan: son para los tipos nuevos que\n // ningún personaje del catálogo tiene todavía, así que no hay un\n // \"from\" del que copiarlos.\n ...(options.eyeTypeOverride !== undefined && { eyeType: options.eyeTypeOverride }),\n ...(options.mouthTypeOverride !== undefined && { mouthType: options.mouthTypeOverride }),\n }));\n }\n\n // idle/near/hover/click no se \"visitan\" al deambular — los sigue\n // decidiendo la interacción real; todo lo demás es elección válida aquí.\n const stateBank = options.stateBank?.filter((s) => ALL_WANDERABLE_STATES.includes(s));\n\n return {\n name,\n emotion: 'custom',\n baseColor: options.baseColor || EMOJI_COTA.baseColor,\n silhouette: options.silhouette || 'circle',\n motion: motionSource ? { ...motionSource.motion } : { ...EMOJI_COTA.motion },\n expressions,\n particleEmotion: particlesSource?.emotion,\n soundEmotion: soundSource?.emotion,\n ...(stateBank && stateBank.length > 0 && { autonomousStatePool: stateBank }),\n };\n}\n\nexport function saveCustomEmoji(name: string, def: EmojiDefinition): void {\n localStorage.setItem(STORAGE_PREFIX + name, JSON.stringify(def));\n}\n\nexport function loadCustomEmoji(name: string): EmojiDefinition | null {\n const raw = localStorage.getItem(STORAGE_PREFIX + name);\n return raw ? (JSON.parse(raw) as EmojiDefinition) : null;\n}\n\n/**\n * Construye (o reconstruye) un emoji personalizado, lo persiste en localStorage\n * y lo registra en LIB para poder usarlo directamente con createEmoji(name, ...).\n */\nexport function createCustomEmoji(name: string, options: CustomEmojiOptions = {}): EmojiDefinition {\n const def = buildCustomEmoji(name, options);\n LIB[name] = def;\n saveCustomEmoji(name, def);\n return def;\n}\n","import { InteractionState, EmojiDefinition, FaceParameters } from './emojis/types';\nimport { getEmojiDefinition } from './emojis/catalog';\nimport { createMultiSpring, MultiSpring } from './core/spring';\nimport { StateManager } from './core/state';\nimport { sharedLoop } from './core/raf';\nimport { buildFace } from './render/svg';\nimport { attachEventListeners, supportsHover, isTouchDevice } from './events/listeners';\nimport {\n soundEngine,\n setGlobalSound,\n isGlobalSoundEnabled,\n setGlobalVolume,\n getGlobalVolume,\n} from './core/sound';\nimport { ParticleEmitter } from './render/particles';\nimport { DragPhysics, DragPhysicsState } from './core/drag';\nimport { isReducedMotionPreferred, subscribeToReducedMotion } from './core/a11y';\nimport { blendColors, ThemeOption } from './core/theme';\nimport { applyIdleMotion, applyStateMotion } from './core/motion';\nimport { createSequencePlayer, SequenceStep, SequenceOptions } from './core/sequence';\nimport { resolveAutonomousStatePool, pickWithoutRepeat } from './emojis/states';\nimport { createEmojiGroup } from './core/group';\n\n/** Cuánta animación de personalidad conserva cada estado de interacción */\nconst INTERACTION_MOTION_INTENSITY: Record<string, number> = {\n idle: 1,\n near: 0.7,\n hover: 0.5,\n click: 0.35,\n};\n\n\nexport type WissivePresetSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl';\nexport type WissiveSize = WissivePresetSize | number;\n\nexport const SIZE_PRESETS: Record<WissivePresetSize, number> = {\n xs: 48,\n sm: 80,\n base: 120,\n lg: 160,\n xl: 200,\n '2xl': 240,\n};\n\nexport function resolveSize(size: WissiveSize = 'base'): number {\n if (typeof size === 'number') return size;\n return SIZE_PRESETS[size] ?? 120;\n}\n\nexport interface WissiveOptions {\n target: HTMLElement;\n size?: WissiveSize;\n sound?: boolean;\n interactive?: boolean;\n draggable?: boolean;\n nearRadius?: number;\n flipX?: boolean;\n emphasis?: boolean;\n gazeTracking?: boolean;\n ambientParticles?: boolean;\n /** Visita reacciones al azar cuando está en reposo, para que se sienta vivo (default: true) */\n autonomousStates?: boolean;\n /** Qué estados puede visitar al deambular (default: `definition.autonomousStatePool` o AUTONOMOUS_STATES) */\n autonomousStatePool?: InteractionState[];\n reducedMotion?: 'auto' | boolean;\n theme?: ThemeOption;\n}\n\nexport interface WissiveInstance {\n id: string;\n name: string;\n emotionCategory: string;\n getElement: () => HTMLElement;\n getPosition: () => { x: number; y: number };\n getCurrentState: () => InteractionState;\n setEmotion: (state: InteractionState) => void;\n spin: (turns?: number) => void;\n bounce: () => void;\n setGaze: (gaze: { x: number; y: number }) => void;\n setGazeTracking: (enabled: boolean) => void;\n setSound: (enabled: boolean) => void;\n setDraggable: (enabled: boolean) => void;\n setFlipX: (flip: boolean) => void;\n setEmphasis: (emphasis: boolean) => void;\n setAmbientParticles: (enabled: boolean) => void;\n setAutonomousStates: (enabled: boolean) => void;\n setAutonomousStatePool: (pool: InteractionState[]) => void;\n setReducedMotion: (setting: 'auto' | boolean) => void;\n setTheme: (theme: ThemeOption) => void;\n setSize: (size: WissiveSize) => void;\n triggerParticles: (count?: number) => void;\n playSequence: (steps: SequenceStep[], options?: SequenceOptions) => void;\n stopSequence: () => void;\n isSequencePlaying: () => boolean;\n destroy: () => void;\n}\n\n\n\nexport function createEmoji(\n name: string,\n options: WissiveOptions\n): WissiveInstance {\n const {\n target,\n size = 'base',\n interactive = true,\n draggable: initialDraggable = true,\n nearRadius = 120,\n sound: initialSound = true,\n flipX: initialFlipX = false,\n emphasis: initialEmphasis = false,\n gazeTracking: initialGazeTracking = false,\n ambientParticles: initialAmbientParticles = true,\n autonomousStates: initialAutonomousStates = true,\n autonomousStatePool: initialAutonomousStatePool,\n reducedMotion: initialReducedMotion = 'auto',\n theme: initialTheme = 'auto',\n } = options;\n\n const definition: EmojiDefinition = getEmojiDefinition(name) || getEmojiDefinition('mochi')!;\n const motion = definition.motion;\n\n let currentSize = resolveSize(size);\n let userReducedMotionSetting: 'auto' | boolean = initialReducedMotion;\n let userThemeSetting: ThemeOption = initialTheme;\n let currentColor = definition.baseColor;\n const particleEmotion = definition.particleEmotion || definition.emotion;\n const soundEmotion = definition.soundEmotion || definition.emotion;\n\n const isReducedMotionActive = (): boolean => {\n if (typeof userReducedMotionSetting === 'boolean') return userReducedMotionSetting;\n return isReducedMotionPreferred();\n };\n\n\n\n\n // Wrapper — absorbs drag translation so the grid layout stays stable\n const wrapper = document.createElement('div');\n wrapper.className = 'wissive-wrapper';\n wrapper.style.width = `${currentSize}px`;\n wrapper.style.height = `${currentSize}px`;\n wrapper.style.display = 'inline-block';\n wrapper.style.position = 'relative';\n\n const container = document.createElement('div');\n container.className = 'wissive-emoji';\n container.setAttribute('role', 'img');\n if (interactive) {\n container.setAttribute('tabindex', '0');\n }\n \n const stateLabels: Partial<Record<InteractionState, string>> = {\n idle: 'Reposo',\n near: 'Cerca',\n hover: 'Hover',\n click: 'Presionado',\n };\n\n\n const updateAriaLabel = (st: InteractionState) => {\n container.setAttribute(\n 'aria-label',\n `${definition.name} (${definition.emotion}) emoji - Estado: ${stateLabels[st] || st}`\n );\n };\n\n updateAriaLabel('idle');\n\n container.style.width = `${currentSize}px`;\n container.style.height = `${currentSize}px`;\n container.style.display = 'inline-block';\n container.style.userSelect = 'none';\n container.style.cursor = interactive ? 'pointer' : 'default';\n container.style.willChange = 'transform';\n container.style.transformOrigin = 'center center';\n\n wrapper.appendChild(container);\n target.appendChild(wrapper);\n\n const unsubscribeReducedMotion = subscribeToReducedMotion(() => {\n render();\n });\n\n let isFlipX = initialFlipX;\n let isEmphasis = initialEmphasis;\n let isGazeTracking = initialGazeTracking;\n let isSoundEnabled = initialSound;\n let isDraggable = initialDraggable;\n let isAmbientParticlesEnabled = initialAmbientParticles;\n let isAutonomousStatesEnabled = initialAutonomousStates;\n let autonomousStatePool: InteractionState[] = resolveAutonomousStatePool(\n initialAutonomousStatePool,\n definition.autonomousStatePool\n );\n\n const stateManager = new StateManager();\n const initialPool = definition.expressions.idle;\n const initialParams = stateManager.pickVariant(initialPool, 'idle');\n\n const springs: MultiSpring<FaceParameters> = createMultiSpring<FaceParameters>(initialParams, {\n stiffness: motion.stiffness,\n damping: motion.damping,\n });\n\n let isNearActive = false;\n let isHoverActive = false;\n let isClickActive = false;\n\n let idleTime = Math.random() * 100;\n let isBlinking = false;\n let blinkTimer: number | null = null;\n let nextBlinkTimeout: number | null = null;\n\n // ─── Particle System ───────────────────────────────────────────────\n // Attached to wrapper (not container) because container.innerHTML is replaced every frame\n const particles = new ParticleEmitter(wrapper, currentSize);\n\n\n // ─── Drag Physics State ────────────────────────────────────────────\n let dragState: DragPhysicsState = {\n offsetX: 0,\n offsetY: 0,\n scaleX: 1,\n scaleY: 1,\n rotation: 0,\n isDragging: false,\n };\n\n let dragPhysics: DragPhysics | null = null;\n\n const initDrag = () => {\n if (dragPhysics) return;\n dragPhysics = new DragPhysics(\n container,\n (state) => {\n dragState = state;\n applyTransform();\n },\n {\n onDragStart: () => {\n // Emit particles trail while dragging\n if (isSoundEnabled) soundEngine.playSound(soundEmotion, 'click');\n },\n onDragEnd: () => {\n // Burst particles on release (toss)\n particles.burst(particleEmotion, 10);\n if (isSoundEnabled) soundEngine.playSound(soundEmotion, 'bounce');\n },\n }\n );\n };\n\n if (isDraggable && interactive) {\n initDrag();\n }\n\n // ─── Unified Transform ─────────────────────────────────────────────\n // Combines: breathing + drag offset + drag elastic deformation\n const applyTransform = () => {\n // Breathing base (overridden by drag deformation when dragging/bouncing or disabled if reduced motion)\n const isReduced = isReducedMotionActive();\n const breathSpeed = isReduced ? 0 : motion.idleSpeed * 0.35;\n const breathAmp = isReduced ? 0 : 0.04;\n const breathScX = 1 + breathAmp * Math.cos(idleTime * breathSpeed);\n const breathScY = 1 - breathAmp * Math.sin(idleTime * breathSpeed);\n\n // Combine: drag deformation takes priority when active\n const hasDragMotion = dragState.offsetX !== 0 || dragState.offsetY !== 0\n || dragState.scaleX !== 1 || dragState.scaleY !== 1;\n\n let finalScX: number, finalScY: number, finalRot: number;\n\n if (hasDragMotion) {\n // Multiply breathing with drag deformation\n finalScX = breathScX * dragState.scaleX;\n finalScY = breathScY * dragState.scaleY;\n finalRot = dragState.rotation;\n } else {\n finalScX = breathScX;\n finalScY = breathScY;\n finalRot = 0;\n }\n\n const tx = dragState.offsetX;\n const ty = dragState.offsetY;\n\n container.style.transform =\n `translate(${tx.toFixed(1)}px, ${ty.toFixed(1)}px) ` +\n `rotate(${(finalRot * 180 / Math.PI).toFixed(2)}deg) ` +\n `scale(${finalScX.toFixed(4)}, ${finalScY.toFixed(4)})`;\n };\n\n // ─── Render ────────────────────────────────────────────────────────\n const render = () => {\n const currentParams = springs.getValues();\n const currentState = stateManager.getState();\n\n // Transición suave de color de tema (en 'auto' se conserva el color original predeterminado)\n let targetThemeColor = definition.baseColor;\n if (typeof userThemeSetting === 'object' && userThemeSetting.baseColor) {\n targetThemeColor = userThemeSetting.baseColor;\n }\n\n currentColor = blendColors(currentColor, targetThemeColor, 0.15);\n\n\n if (isBlinking) {\n currentParams.eyeOpen = 0.05;\n }\n\n // Cada estado tiene firma propia; si no la tiene (idle/near/hover/click),\n // manda la animación de personalidad del emoji, atenuada según el estado.\n if (!isReducedMotionActive()) {\n const hasStateMotion = applyStateMotion(\n currentState as string,\n currentParams,\n idleTime,\n motion.idleSpeed,\n motion.idleAmplitude\n );\n\n if (!hasStateMotion) {\n const intensity = INTERACTION_MOTION_INTENSITY[currentState as string] ?? 1;\n applyIdleMotion(\n motion.motionType,\n currentParams,\n idleTime,\n motion.idleSpeed,\n motion.idleAmplitude,\n intensity\n );\n }\n }\n\n // Apply unified transform (breathing + drag)\n applyTransform();\n\n container.innerHTML = buildFace(\n definition.silhouette,\n currentColor,\n currentParams,\n currentSize,\n { flipX: isFlipX, emphasis: isEmphasis },\n idleTime\n );\n };\n\n\n // ─── Expression Transitions ────────────────────────────────────────\n const transitionToVariant = (newState: InteractionState = stateManager.getState()) => {\n stateManager.setState(newState);\n const pool = stateManager.resolvePool(definition.expressions, newState);\n if (!pool || pool.length === 0) return;\n\n if (pool.length === 1) {\n const targetParams = stateManager.pickVariant(pool, newState);\n springs.setTargets(targetParams);\n sharedLoop.add(tick);\n return;\n }\n\n isBlinking = true;\n sharedLoop.add(tick);\n\n setTimeout(() => {\n const targetParams = stateManager.pickVariant(pool, newState);\n springs.setTargets(targetParams);\n sharedLoop.add(tick);\n\n setTimeout(() => {\n isBlinking = false;\n sharedLoop.add(tick);\n }, 120);\n }, 100);\n };\n\n const updateState = (newState: InteractionState) => {\n updateAriaLabel(newState);\n transitionToVariant(newState);\n };\n\n // ─── Expression Timeline ───────────────────────────────────────────\n const sequencePlayer = createSequencePlayer({\n resolveStep(step) {\n // Un paso puede referirse a un estado (reutiliza su pool de expresiones)\n // y/o traer parámetros crudos, que mandan sobre el estado.\n const fromState = step.state\n ? stateManager.pickVariant(\n stateManager.resolvePool(definition.expressions, step.state),\n step.state\n )\n : {};\n return { ...fromState, ...step.params };\n },\n applyStep(params) {\n springs.setTargets(params);\n sharedLoop.add(tick);\n },\n });\n\n\n // ─── Main Animation Loop ──────────────────────────────────────────\n const tick = (dt: number) => {\n idleTime += dt;\n const isMoving = springs.update(dt);\n render();\n\n if (!isMoving && stateManager.getState() !== 'idle') {\n sharedLoop.remove(tick);\n }\n };\n\n sharedLoop.add(tick);\n\n // ─── Blink ─────────────────────────────────────────────────────────\n const scheduleNextBlink = () => {\n const minDelay = 3000;\n const maxDelay = 7000;\n const delay = minDelay + Math.random() * (maxDelay - minDelay);\n\n nextBlinkTimeout = window.setTimeout(() => {\n if (stateManager.getState() === 'idle' && !isBlinking) {\n isBlinking = true;\n sharedLoop.add(tick);\n\n blinkTimer = window.setTimeout(() => {\n isBlinking = false;\n sharedLoop.add(tick);\n }, 180);\n }\n scheduleNextBlink();\n }, delay);\n };\n\n scheduleNextBlink();\n\n // ─── Idle Variant Cycling ──────────────────────────────────────────\n let idleTimeoutId: number | null = null;\n\n const scheduleNextIdleVariant = () => {\n const min = motion.idleIntervalMin;\n const max = motion.idleIntervalMax;\n const delay = min + Math.random() * (max - min);\n\n idleTimeoutId = window.setTimeout(() => {\n // Una secuencia en curso manda sobre el ciclado aleatorio de idle\n if (stateManager.getState() === 'idle' && !sequencePlayer.isPlaying()) {\n transitionToVariant('idle');\n }\n scheduleNextIdleVariant();\n }, delay);\n };\n\n scheduleNextIdleVariant();\n\n // ─── Autonomous Glance ─────────────────────────────────────────────\n let glanceTimeoutId: number | null = null;\n let glanceResetTimeoutId: number | null = null;\n\n const scheduleNextGlance = () => {\n const minDelay = 3500;\n const maxDelay = 8000;\n const delay = minDelay + Math.random() * (maxDelay - minDelay);\n\n glanceTimeoutId = window.setTimeout(() => {\n if (stateManager.getState() === 'idle' && !isGazeTracking && !sequencePlayer.isPlaying()) {\n const directions = [\n { x: -9, y: 0 },\n { x: 9, y: 0 },\n { x: -7, y: -4 },\n { x: 7, y: -4 },\n { x: 0, y: -5 },\n { x: 0, y: 4 },\n ];\n const choice = directions[Math.floor(Math.random() * directions.length)];\n springs.setTargets({ gazeX: choice.x, gazeY: choice.y });\n sharedLoop.add(tick);\n\n const holdTime = 1200 + Math.random() * 1500;\n glanceResetTimeoutId = window.setTimeout(() => {\n if (!isGazeTracking) {\n springs.setTargets({ gazeX: 0, gazeY: 0 });\n sharedLoop.add(tick);\n }\n }, holdTime);\n }\n scheduleNextGlance();\n }, delay);\n };\n\n scheduleNextGlance();\n\n // ─── Autonomous Ambient Particles ──────────────────────────────────\n let ambientParticleTimeoutId: number | null = null;\n\n const scheduleNextAmbientParticle = () => {\n const minDelay = 3500;\n const maxDelay = 8500;\n const delay = minDelay + Math.random() * (maxDelay - minDelay);\n\n ambientParticleTimeoutId = window.setTimeout(() => {\n if (isAmbientParticlesEnabled && !isReducedMotionActive()) {\n const currentState = stateManager.getState();\n if (currentState === 'idle' || currentState === 'near' || currentState === 'hover') {\n // Emit 2 to 4 ambient particles around the emoji\n const count = Math.floor(2 + Math.random() * 3);\n particles.burst(particleEmotion, count);\n }\n }\n scheduleNextAmbientParticle();\n }, delay);\n };\n\n scheduleNextAmbientParticle();\n\n // ─── Autonomous State Wandering ─────────────────────────────────────\n // Sin esto el emoji solo cambia de estado por interacción del usuario o\n // por llamadas explícitas — en reposo se queda pegado a \"idle\" para\n // siempre. Aquí, de tanto en tanto, visita solo una reacción real (nunca\n // los estados de \"ciclo de producto\"/\"agente\" como uploading o thinking:\n // esos los debe decidir la app anfitriona porque significan algo, no son\n // decoración).\n let autonomousTimeoutId: number | null = null;\n let autonomousHoldTimeoutId: number | null = null;\n let lastAutonomousState: InteractionState | null = null;\n\n const scheduleNextAutonomousState = () => {\n const minDelay = 5000;\n const maxDelay = 11000;\n const delay = minDelay + Math.random() * (maxDelay - minDelay);\n\n autonomousTimeoutId = window.setTimeout(() => {\n const canWander =\n isAutonomousStatesEnabled &&\n autonomousStatePool.length > 0 &&\n !isReducedMotionActive() &&\n !sequencePlayer.isPlaying() &&\n stateManager.getState() === 'idle' &&\n !isNearActive && !isHoverActive && !isClickActive;\n\n if (canWander) {\n const next = pickWithoutRepeat(autonomousStatePool, lastAutonomousState);\n lastAutonomousState = next;\n updateState(next);\n\n const holdTime = 1800 + Math.random() * 2200;\n autonomousHoldTimeoutId = window.setTimeout(() => {\n // Si el usuario interactuó durante la visita, eso manda; si no, vuelve a idle\n if (stateManager.getState() === next && !isNearActive && !isHoverActive && !isClickActive) {\n updateState('idle');\n }\n }, holdTime);\n }\n scheduleNextAutonomousState();\n }, delay);\n };\n\n scheduleNextAutonomousState();\n\n // ─── Timer Cleanup ─────────────────────────────────────────────────\n const stopTimers = () => {\n if (idleTimeoutId !== null) {\n clearTimeout(idleTimeoutId);\n idleTimeoutId = null;\n }\n if (nextBlinkTimeout !== null) {\n clearTimeout(nextBlinkTimeout);\n nextBlinkTimeout = null;\n }\n if (blinkTimer !== null) {\n clearTimeout(blinkTimer);\n blinkTimer = null;\n }\n if (glanceTimeoutId !== null) {\n clearTimeout(glanceTimeoutId);\n glanceTimeoutId = null;\n }\n if (glanceResetTimeoutId !== null) {\n clearTimeout(glanceResetTimeoutId);\n glanceResetTimeoutId = null;\n }\n if (ambientParticleTimeoutId !== null) {\n clearTimeout(ambientParticleTimeoutId);\n ambientParticleTimeoutId = null;\n }\n if (autonomousTimeoutId !== null) {\n clearTimeout(autonomousTimeoutId);\n autonomousTimeoutId = null;\n }\n if (autonomousHoldTimeoutId !== null) {\n clearTimeout(autonomousHoldTimeoutId);\n autonomousHoldTimeoutId = null;\n }\n };\n\n // ─── Event Listeners ───────────────────────────────────────────────\n let detachListeners: (() => void) | null = null;\n\n const determineCurrentState = (): InteractionState => {\n if (isClickActive) return 'click';\n if (isHoverActive) return 'hover';\n if (isNearActive) return 'near';\n return 'idle';\n };\n\n if (interactive) {\n detachListeners = attachEventListeners(\n container,\n {\n onHoverStart: () => {\n isHoverActive = true;\n if (isSoundEnabled) soundEngine.playSound(soundEmotion, 'hover');\n updateState(determineCurrentState());\n },\n onHoverEnd: () => {\n isHoverActive = false;\n updateState(determineCurrentState());\n },\n onClickStart: () => {\n isClickActive = true;\n if (isSoundEnabled) soundEngine.playSound(soundEmotion, 'click');\n if (!isReducedMotionActive()) {\n particles.burst(particleEmotion, 8);\n }\n updateState(determineCurrentState());\n },\n onClickEnd: () => {\n isClickActive = false;\n updateState(determineCurrentState());\n },\n onNearChange: (near) => {\n isNearActive = near;\n updateState(determineCurrentState());\n },\n onGazeMove: (gazeX, gazeY) => {\n if (isGazeTracking) {\n springs.setTargets({ gazeX, gazeY });\n sharedLoop.add(tick);\n }\n },\n },\n nearRadius\n );\n }\n\n const instanceId = 'wissive-' + Math.random().toString(36).substring(2, 9);\n\n // ─── Public API ────────────────────────────────────────────────────\n return {\n id: instanceId,\n name: definition.name,\n emotionCategory: definition.emotion,\n getElement() {\n return container;\n },\n getPosition() {\n const rect = container.getBoundingClientRect();\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n },\n getCurrentState() {\n return stateManager.getState();\n },\n setEmotion(state: InteractionState) {\n if (!isReducedMotionActive()) {\n if (state === 'click') {\n particles.burst(particleEmotion, 8);\n } else if (state === 'hover') {\n particles.burst(particleEmotion, 4);\n }\n }\n updateState(state);\n },\n spin(turns = 1) {\n const current = springs.getValues().turnAngle || 0;\n springs.setTargets({ turnAngle: current + Math.PI * 2 * turns });\n sharedLoop.add(tick);\n },\n bounce() {\n if (isSoundEnabled) soundEngine.playSound(soundEmotion, 'bounce');\n if (!isReducedMotionActive()) {\n particles.burst(particleEmotion, 5);\n }\n const current = springs.getValues().bob || 0;\n springs.setTargets({ bob: current - 14 });\n sharedLoop.add(tick);\n },\n setGaze(gaze: { x: number; y: number }) {\n springs.setTargets({ gazeX: gaze.x, gazeY: gaze.y });\n sharedLoop.add(tick);\n },\n setGazeTracking(enabled: boolean) {\n isGazeTracking = enabled;\n if (!enabled) {\n springs.setTargets({ gazeX: 0, gazeY: 0 });\n sharedLoop.add(tick);\n }\n },\n setSound(enabled: boolean) {\n isSoundEnabled = enabled;\n },\n setDraggable(enabled: boolean) {\n isDraggable = enabled;\n if (enabled && !dragPhysics && interactive) {\n initDrag();\n } else if (!enabled && dragPhysics) {\n dragPhysics.destroy();\n dragPhysics = null;\n dragState = { offsetX: 0, offsetY: 0, scaleX: 1, scaleY: 1, rotation: 0, isDragging: false };\n applyTransform();\n }\n },\n setFlipX(flip: boolean) {\n isFlipX = flip;\n render();\n },\n setEmphasis(emphasis: boolean) {\n isEmphasis = emphasis;\n render();\n },\n setAmbientParticles(enabled: boolean) {\n isAmbientParticlesEnabled = enabled;\n },\n setAutonomousStates(enabled: boolean) {\n isAutonomousStatesEnabled = enabled;\n },\n setAutonomousStatePool(pool: InteractionState[]) {\n autonomousStatePool = pool;\n },\n setReducedMotion(setting: 'auto' | boolean) {\n userReducedMotionSetting = setting;\n render();\n },\n setTheme(theme: ThemeOption) {\n userThemeSetting = theme;\n render();\n },\n setSize(newSize: WissiveSize) {\n currentSize = resolveSize(newSize);\n wrapper.style.width = `${currentSize}px`;\n wrapper.style.height = `${currentSize}px`;\n container.style.width = `${currentSize}px`;\n container.style.height = `${currentSize}px`;\n particles.resize(currentSize);\n render();\n },\n triggerParticles(count = 8) {\n if (!isReducedMotionActive()) {\n particles.burst(particleEmotion, count);\n }\n },\n playSequence(steps: SequenceStep[], options?: SequenceOptions) {\n sequencePlayer.play(steps, options);\n },\n stopSequence() {\n sequencePlayer.stop();\n transitionToVariant(stateManager.getState());\n },\n isSequencePlaying() {\n return sequencePlayer.isPlaying();\n },\n destroy() {\n sequencePlayer.stop();\n stopTimers();\n unsubscribeReducedMotion();\n sharedLoop.remove(tick);\n particles.destroy();\n if (dragPhysics) dragPhysics.destroy();\n if (detachListeners) {\n detachListeners();\n }\n wrapper.remove();\n },\n };\n}\n\nexport * from './emojis/types';\nexport * from './core/spring';\nexport * from './core/state';\nexport * from './core/raf';\nexport * from './render/svg';\nexport * from './core/sound';\nexport * from './core/drag';\nexport * from './render/particles';\nexport * from './core/a11y';\nexport * from './core/theme';\nexport * from './core/motion';\nexport * from './core/sequence';\nexport * from './core/group';\nexport * from './events/listeners';\nexport * from './emojis/catalog';\nexport * from './emojis/custom';\nexport * from './emojis/states';\n\nexport const Wissive = {\n create: createEmoji,\n createGroup: createEmojiGroup,\n setGlobalSound,\n isGlobalSoundEnabled,\n setGlobalVolume,\n getGlobalVolume,\n supportsHover,\n isTouchDevice,\n};\n\nexport default Wissive;\n\n\n\n\n"],"names":["createDefaultParams","overrides","EMOJI_MOCHI","EMOJI_ZUMI","EMOJI_SURI","EMOJI_NIMA","EMOJI_COTA","EMOJI_DOZY","EMOJI_LUMO","EMOJI_FIDGE","EMOJI_BRIX","EMOJI_WILT","EMOJI_KNOT","EMOJI_SNUG","EMOJI_PIP","EMOJI_VOID","LIB","getEmojiDefinition","nameOrEmotion","key","item","makeSpring","initialValue","config","stiffness","damping","mass","state","target","value","dt","subDt","isMoving","i","displacement","springForce","dampingForce","acceleration","createMultiSpring","initialValues","keys","springs","values","targets","active","getProceduralStateParams","base","p","StateManager","__publicField","newState","changed","expressions","pool","baseParams","lastIdx","nextIdx","AnimationLoop","cb","now","sharedLoop","spiralPoints","turns","step","points","maxAngle","a","r","getSilhouettePath","silhouette","SCRIBBLE_LOCAL_PATH","buildScribbleGroup","cx","cy","scale","color","strokeWidth","extraAttrs","buildFace","baseColor","params","size","renderOptions","time","currentTime","strokeColor","cheekColor","STROKE_W","silhouetteParts","d","flipX","emphasis","gazeX","gazeY","eyeHalfGap","baseEyeY","rawLeftEyeX","rawRightEyeX","headRadius","headCenterX","turn","computeSphericalProjection","rawX","offset","clampedOffset","long0","longNew","cosNew","isVisible","projX","scaleX","leftProj","rightProj","eyeScale","eyeType","leftEyeSvg","rightEyeSvg","renderSingleEye","x","y","isRight","effectiveScale","eyeTransform","spiralRadius","ux","uy","px","py","k","rx","ry","h","tearsSvg","tears","tearMaxOpacity","dripProgress","dripY","opacity","scaleY","ly","lx","lxNum","rxNum","lyNum","accessoriesSvg","cycleTime","zCount","progress","strokeW","zScale","drops","sweatOpacity","drop","dropY","stormOpacity","driftL","driftR","breatheL","breatheR","scribbleOpacity","wobble","pulse","puffProgress","puffMouthY","puffX","puffY","puffScale","puffOpacity","browsSvg","browBaseY","leftAngle","rightAngle","mouthType","mouthW","mouthX","mouthY","mouthSvg","w","bars","bx","mouthControlY","cheekOpacity","cheeksSvg","groupTransform","renderSvgElement","supportsHover","isTouchDevice","proximitySubscribers","isGlobalMouseMoveAttached","handleGlobalMouseMove","e","clientX","clientY","halfWinW","halfWinH","sub","rect","centerX","centerY","normX","normY","nowNear","registerProximitySubscriber","unregisterProximitySubscriber","attachEventListeners","element","callbacks","nearRadius","isHovered","isClicked","isFocused","isKeyDown","handleMouseEnter","handleMouseLeave","handleMouseDown","handleMouseUp","handleTouchStart","handleTouchEnd","handleTouchCancel","handleFocus","handleBlur","handleKeyDown","handleKeyUp","proximitySubscriber","cuelumePromise","getCuelume","SoundEngine","m","enabled","vol","cueName","options","emotion","action","cue","soundEngine","setGlobalSound","isGlobalSoundEnabled","setGlobalVolume","volume","getGlobalVolume","ParticleEmitter","container","width","height","dpr","canvasSize","newSize","count","originX","originY","angle","speed","particle","radiusOffset","spawnX","spawnY","maxLife","isAccent","pick","palette","ctx","lifeProgress","scaleFactor","s","pts","outerR","innerR","j","radius","inner","outer","DragPhysics","onUpdate","t","fx","fy","dist","_a","sx","sy","n","maxV","stretchX","stretchY","rotation","dx","dy","stretch","isReducedMotionPreferred","subscribeToReducedMotion","onChange","mediaQuery","listener","parseColorToRGB","hex","c","num","getLuminance","g","b","transformComponent","R","G","B","getContrastRatio","color1","color2","l1","l2","lighter","darker","checkContrast","bgColor","fgColor","minRatio","ratio","STATE_THEME_MAP","hexToRgb","blendColors","colorA","colorB","factor","rgbA","rgbB","f","toHex","getThemeForState","_state","defaultBaseColor","accent","period","cycle","IDLE_MOTIONS","amp","hop","beat","breath","sag","shudder","rumble","flare","deflate","startle","held","glitch","applyIdleMotion","motionType","intensity","STATE_MOTIONS","clench","sweep","settle","push","pull","rise","blip","sink","applyStateMotion","fn","DEFAULT_STEP_MS","createSequencePlayer","hooks","timer","playing","stop","steps","mode","index","direction","advance","STATE_GROUPS","ALL_STATES","PERSONALITY_DRIVEN_STATES","AUTONOMOUS_STATES","ALL_WANDERABLE_STATES","resolveAutonomousStatePool","explicitPool","definitionPool","pickWithoutRepeat","previous","next","EmojiGroup","instances","list","currentPairKeys","instA","instB","posA","posB","distance","pairKey","normXA","normYA","pairInfo","pair","inst","instance","id1","id2","catA","catB","happyInst","sadInst","createEmojiGroup","STORAGE_PREFIX","cloneExpressions","source","out","buildCustomEmoji","name","eyesSource","mouthSource","motionSource","particlesSource","soundSource","eyesVariant","mouthVariant","_b","stateBank","_c","saveCustomEmoji","def","loadCustomEmoji","raw","createCustomEmoji","INTERACTION_MOTION_INTENSITY","SIZE_PRESETS","resolveSize","createEmoji","interactive","initialDraggable","initialSound","initialFlipX","initialEmphasis","initialGazeTracking","initialAmbientParticles","initialAutonomousStates","initialAutonomousStatePool","initialReducedMotion","initialTheme","definition","motion","currentSize","userReducedMotionSetting","userThemeSetting","currentColor","particleEmotion","soundEmotion","isReducedMotionActive","wrapper","stateLabels","updateAriaLabel","st","unsubscribeReducedMotion","render","isFlipX","isEmphasis","isGazeTracking","isSoundEnabled","isDraggable","isAmbientParticlesEnabled","isAutonomousStatesEnabled","autonomousStatePool","stateManager","initialPool","initialParams","isNearActive","isHoverActive","isClickActive","idleTime","isBlinking","blinkTimer","nextBlinkTimeout","particles","dragState","dragPhysics","initDrag","applyTransform","isReduced","breathSpeed","breathAmp","breathScX","breathScY","hasDragMotion","finalScX","finalScY","finalRot","tx","ty","currentParams","currentState","targetThemeColor","transitionToVariant","targetParams","tick","updateState","sequencePlayer","scheduleNextBlink","delay","idleTimeoutId","scheduleNextIdleVariant","min","max","glanceTimeoutId","glanceResetTimeoutId","scheduleNextGlance","directions","choice","holdTime","ambientParticleTimeoutId","scheduleNextAmbientParticle","autonomousTimeoutId","autonomousHoldTimeoutId","lastAutonomousState","scheduleNextAutonomousState","stopTimers","detachListeners","determineCurrentState","near","current","gaze","flip","setting","theme","Wissive"],"mappings":"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"}
|