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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Wissive
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR A PARTICULAR PURPOSE AND OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,193 @@
1
+ # Wissive
2
+
3
+ **Micro-librería de JavaScript de emojis "vivos" — reactivos a hover, click y proximidad del mouse.**
4
+
5
+ ---
6
+
7
+ ## Instalación rápida
8
+
9
+ ### Vía npm
10
+ ```bash
11
+ npm install wissive
12
+ ```
13
+ ```js
14
+ import { createEmoji } from 'wissive';
15
+
16
+ createEmoji('mochi', { target: document.querySelector('#slot') });
17
+ ```
18
+
19
+ ### Vía CDN (sin instalar nada)
20
+ ```html
21
+ <script src="https://cdn.jsdelivr.net/npm/wissive/dist/wissive.umd.js"></script>
22
+ <div id="slot"></div>
23
+ <script>
24
+ Wissive.createEmoji('mochi', { target: document.querySelector('#slot') });
25
+ </script>
26
+ ```
27
+
28
+ > El paquete todavía no está publicado en npm (ver `requerimientos.md`, Fase 6) — estos son los
29
+ > comandos que funcionarán una vez publicado.
30
+
31
+ ---
32
+
33
+ ## 1. ¿Qué es Wissive?
34
+
35
+ Wissive es una librería de JavaScript vanilla (sin dependencias obligatorias, sin framework)
36
+ que renderiza emojis tipo *blob* con personalidad propia. Cada emoji reacciona en tiempo real
37
+ a la interacción del usuario — no es una imagen estática ni un GIF: es un motor que dibuja el
38
+ rostro por código (SVG) y lo anima con física de resorte (spring physics), eligiendo
39
+ expresiones de forma semi-aleatoria dentro de un set curado para cada estado de interacción.
40
+
41
+ No es un set de iconos. Es un **motor de expresión** con un catálogo de personajes ya
42
+ diseñados, pensado para que cualquier desarrollador lo instale y tenga, en dos líneas de
43
+ código, un emoji que "está vivo" en su interfaz.
44
+
45
+ ---
46
+
47
+ ## 2. Objetivo del proyecto
48
+
49
+ - Dar a cualquier sitio web una forma rápida de añadir personalidad y feedback emocional a
50
+ través de una carita animada, sin tener que diseñar ni animar nada desde cero.
51
+ - Que la librería sea **liviana, sin dependencias obligatorias**, y utilizable tanto con
52
+ bundlers modernos como directamente desde un `<script>` en HTML plano.
53
+ - Que **no dependa de ningún framework** para funcionar, pero que se pueda envolver fácilmente
54
+ en React, Vue o Astro sin fricción.
55
+ - Que cada emoji se sienta "vivo" gracias a variedad real: no una sola expresión por estado,
56
+ sino un pool de expresiones que se sortea, evitando la sensación de repetición.
57
+
58
+ ---
59
+
60
+ ## 3. Funcionalidad principal
61
+
62
+ ### 3.1 Catálogo de emojis
63
+ 14 personajes base con diseño propio (ver `desing.md`), cada uno con 24 expresiones
64
+ distribuidas en 4 estados de interacción. Catálogo visual y demo en vivo de los 14, con
65
+ snippet copiable por emoji (clic en el nombre): correr `pnpm run app` y abrir
66
+ [`app/index.html`](app/index.html).
67
+
68
+ ### 3.2 Estados de interacción
69
+ | Estado | Disparador | Descripción |
70
+ |---|---|---|
71
+ | `idle` | Sin interacción | Estado de reposo del emoji, respiración lenta. |
72
+ | `near` | El cursor se acerca sin tocar el emoji (radio configurable) | El emoji "nota" que algo se acerca. |
73
+ | `hover` | `mouseenter` / `mouseleave` | El cursor está directamente sobre el emoji. |
74
+ | `click` | `mousedown` / `mouseup` (o `touchstart` en móvil) | Reacción a la interacción directa. |
75
+
76
+ Cada estado tiene un **pool de variantes** de expresión; al dispararse el estado se sortea una
77
+ variante evitando repetir la anterior inmediatamente, dando sensación de variedad.
78
+
79
+ ### 3.3 Motor de animación
80
+ - Interpolación de parámetros (apertura de ojos, curvatura de boca, posición de cejas, etc.)
81
+ mediante un sistema de **resorte amortiguado (spring physics)**, no `transition` lineal de
82
+ CSS. Esto da movimiento orgánico entre expresiones.
83
+ - Un único `requestAnimationFrame` central compartido entre todas las instancias activas en
84
+ una misma página (no un loop por emoji).
85
+
86
+ ### 3.4 Sonido (opcional)
87
+ Integración opcional con [Cuelume](https://cuelume-site.pages.dev/) (librería de sonidos de
88
+ interacción sintetizados con Web Audio, sin archivos de audio). Se detecta en tiempo de
89
+ ejecución; si no está instalada, la librería sigue funcionando en silencio sin romperse.
90
+
91
+ ### 3.5 Accesibilidad
92
+ - `role="img"` + `aria-label` describiendo la emoción actual.
93
+ - Soporte de teclado (`tabindex`, `Enter`/`Espacio` equivalen a click).
94
+ - Respeta `prefers-reduced-motion` del sistema operativo.
95
+ - Fallback definido para touch (sin hover/near reales en móvil).
96
+
97
+ ---
98
+
99
+ ## 4. Cómo estará construido
100
+
101
+ ### 4.1 Lenguaje y estructura
102
+ - Código fuente en **TypeScript**, compilado a JS. Da autocompletado y tipos (`.d.ts`) a quien
103
+ la instale, sin obligar a nadie a usar TS.
104
+ - Sin dependencias de runtime obligatorias. Cuelume es *peer dependency* opcional.
105
+
106
+ ### 4.2 Arquitectura interna (capas)
107
+ ```
108
+ Diseño (paths/parametros SVG por expresión, por emoji)
109
+
110
+ Catálogo (LIB: nombre, color, forma base, pools de expresión por estado)
111
+
112
+ Motor de resorte (interpola parámetros numéricos en cada frame)
113
+
114
+ Selector de estado (idle/near/hover/click + sorteo del pool)
115
+
116
+ Renderer SVG (dibuja el emoji a partir de los parámetros actuales)
117
+
118
+ Capa de eventos (mouseenter/leave, mousedown/up, mousemove global para "near")
119
+ ```
120
+
121
+ ### 4.3 API pública (borrador)
122
+ ```js
123
+ import { createEmoji } from 'wissive';
124
+
125
+ const emoji = createEmoji('mochi', {
126
+ target: document.querySelector('#slot'),
127
+ size: 120,
128
+ sound: true, // requiere cuelume instalado
129
+ interactive: true, // false = solo decorativo, sin eventos
130
+ });
131
+
132
+ emoji.setEmotion('feliz'); // control programático
133
+ emoji.destroy(); // limpieza (RAF + listeners)
134
+ ```
135
+
136
+ ### 4.4 Formatos de build
137
+ - **ESM** — uso estándar con bundlers (Vite, Webpack, Rollup, Astro, etc.).
138
+ - **UMD/IIFE** — uso directo con `<script>`, sin instalar nada, vía CDN (jsDelivr/unpkg).
139
+ - **CJS** — compatibilidad con proyectos Node/legacy.
140
+
141
+ ### 4.5 Integración con frameworks
142
+ Wissive no depende de ningún framework. Hay wrappers oficiales para React, Vue y Astro —
143
+ `react`/`vue`/`astro` son *peer dependencies* opcionales, igual que Cuelume:
144
+
145
+ ```jsx
146
+ // React — import { Wissive } from 'wissive/react'
147
+ <Wissive name="mochi" size="lg" sound />
148
+ ```
149
+
150
+ ```vue
151
+ <!-- Vue — import { Wissive } from 'wissive/vue' -->
152
+ <script setup>
153
+ import { Wissive } from 'wissive/vue';
154
+ </script>
155
+ <template>
156
+ <Wissive name="mochi" :options="{ size: 'lg', sound: true }" />
157
+ </template>
158
+ ```
159
+
160
+ ```astro
161
+ ---
162
+ // Astro — import Wissive from 'wissive/astro' (export default: así compila
163
+ // Astro el template de un .astro, no hay export nombrado posible)
164
+ import Wissive from 'wissive/astro';
165
+ ---
166
+ <Wissive name="mochi" size="lg" sound />
167
+ ```
168
+
169
+ El de Astro no resuelve un problema de timing — su `<script>` ya corre client-side sin
170
+ ceremonia — resuelve repetición: usar el emoji en varias páginas sin copiar el `<script>` cada
171
+ vez. Los de React/Vue sí empaquetan el patrón manual de siempre (`useEffect`/`onMounted` que
172
+ llaman a `createEmoji()` en el montaje y `.destroy()` en el desmontaje), porque ahí sí hace
173
+ falta esperar a que el DOM real exista. Fuente: [`src/react.tsx`](src/react.tsx),
174
+ [`src/vue.ts`](src/vue.ts), [`src/astro/Wissive.astro`](src/astro/Wissive.astro).
175
+
176
+ El patrón manual (sin depender de ningún wrapper) está documentado en
177
+ [`examples/`](examples/) para los tres.
178
+
179
+ ### 4.6 Distribución
180
+ - Publicación en npm bajo un solo paquete (`wissive`), con *exports* separados por formato.
181
+ - Documentación y demo interactivo publicados como sitio estático (similar en espíritu al de
182
+ Cuelume: mostrar la librería funcionando en vivo en la propia página de docs).
183
+
184
+ ---
185
+
186
+ ## 5. Alcance fuera de la v1
187
+
188
+ Estas ideas quedan documentadas pero no forman parte del primer release (ver fases en
189
+ `requerimientos.md`):
190
+ - Secuencias encadenadas de expresiones (`.playSequence()`).
191
+ - Seguimiento de cursor con la mirada (ojos que se mueven, no solo cambian).
192
+ - Temas de color personalizados por el usuario de la librería.
193
+ - Emojis adicionales más allá de los 14 iniciales.