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