@dropi/ui 0.1.15 → 0.1.16

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dropi/ui",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "Dropi Design System — Web Components for Angular, React and Vue",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
package/readme.md CHANGED
@@ -3,70 +3,42 @@
3
3
  Librería de Web Components del Design System de Dropi, construida con **Stencil.js v4**.
4
4
  Genera componentes reutilizables para Angular, React y Vue desde una única base de código.
5
5
 
6
- - **Paquete npm:** `@dropi/ui` (v0.1.6)
6
+ - **Paquete npm:** `@dropi/ui` (v0.1.15)
7
7
  - **React wrappers:** `@dropi/ui-react`
8
8
 
9
9
  ---
10
10
 
11
- ## Instalación
11
+ ## ⚡ Quick Start (Recomendado)
12
12
 
13
- | Framework | Paquete a instalar |
14
- |---|---|
15
- | React | `npm install @dropi/ui-react` |
16
- | Angular / Vue / Vanilla | `npm install @dropi/ui` |
17
-
18
- > **¿Por qué dos paquetes?**
19
- > `@dropi/ui` contiene los Web Components puros (estándares del navegador).
20
- > `@dropi/ui-react` son wrappers React auto-generados por Stencil que los envuelven con props tipadas, eventos estilo React (`onDropiChange`) y autocompletado en VSCode.
21
- > `@dropi/ui-react` depende internamente de `@dropi/ui` — no necesitas instalar los dos.
22
-
23
- ---
24
-
25
- ## Setup
26
-
27
- ### React (`main.tsx`)
28
-
29
- Con `@dropi/ui-react` **no necesitas** llamar `defineCustomElements()` — cada wrapper registra su Web Component automáticamente al importarlo.
30
-
31
- ```typescript
32
- import '@dropi/ui/dist/dropi-ui/dropi-ui.css' // estilos globales y tokens
33
-
34
- // No se necesita defineCustomElements()
35
- // Solo importa y usa los componentes directamente
36
- ```
13
+ La forma más rápida y segura de integrar la librería es usando nuestro configurador automático.
37
14
 
38
- ### Angular (`main.ts`)
15
+ ### Con IA (Claude / Cursor / Windsurf)
16
+ Si usas un asistente de IA, simplemente dile:
17
+ > **`/install-dropi-ui`** o **"configura dropi-ui en este proyecto"**
39
18
 
40
- ```typescript
41
- import { defineCustomElements } from '@dropi/ui/loader'
42
- import '@dropi/ui/dist/dropi-ui/dropi-ui.css'
43
-
44
- defineCustomElements()
45
- bootstrapApplication(AppComponent, appConfig)
19
+ ### Manual (Terminal)
20
+ Ejecuta el siguiente comando en la raíz de tu proyecto:
21
+ ```bash
22
+ npx @dropi/ui setup
46
23
  ```
24
+ *Este comando detectará tu framework (Angular, React o Vue), instalará las dependencias necesarias y configurará estilos e iconos automáticamente.*
47
25
 
48
- En módulos o componentes Angular que usen tags `<dropi-*>`, agregar el schema:
49
-
50
- ```typescript
51
- import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
52
-
53
- @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA] })
54
- // o en standalone:
55
- @Component({ schemas: [CUSTOM_ELEMENTS_SCHEMA] })
56
- ```
26
+ ---
57
27
 
58
- ### Assets (íconos)
28
+ ## 🛠️ Instalación Manual
59
29
 
60
- El componente `<dropi-icon>` requiere el sprite en `/assets/icons/symbol/svg/sprite.css.svg`.
30
+ Si prefieres realizar la configuración paso a paso, consulta la [Guía de Integración Detallada](DROPI_UI_SETUP.md) o sigue estos pasos:
61
31
 
62
- **Angular** en `angular.json`:
63
- ```json
64
- "assets": [
65
- { "glob": "sprite.css.svg", "input": "node_modules/@dropi/ui/dist/dropi-ui/assets/icons/symbol/svg/", "output": "assets/icons/symbol/svg/" }
66
- ]
67
- ```
32
+ ### 1. Paquetes
33
+ | Framework | Paquete a instalar |
34
+ |---|---|
35
+ | React | `npm install @dropi/ui @dropi/ui-react` |
36
+ | Angular / Vue / Vanilla | `npm install @dropi/ui` |
68
37
 
69
- **React/Vite** copiar a `public/assets/icons/symbol/svg/`.
38
+ ### 2. Estilos e Iconos
39
+ - **CSS**: Importar `@dropi/ui/dist/dropi-ui/dropi-ui.css` en tu entry point.
40
+ - **Loader**: Llamar a `defineCustomElements()` de `@dropi/ui/loader`.
41
+ - **Iconos**: El componente `<dropi-icon>` requiere que el sprite SVG esté en `/assets/icons/symbol/svg/sprite.css.svg`.
70
42
 
71
43
  ---
72
44
 
@@ -10,10 +10,29 @@ const path = require('path');
10
10
 
11
11
  // Solo mostrar el mensaje si se instala como dependencia, no en desarrollo local
12
12
  if (__dirname.includes('node_modules')) {
13
+ const fs = require('fs');
14
+ const projectRoot = path.resolve(__dirname, '../../..');
15
+ const skillsBase = path.join(__dirname, '..', 'skills', 'install-dropi-ui');
16
+
17
+ // 1. Copiar Skills para IAs (Claude, Cursor, etc.)
18
+ const skillTargets = [
19
+ { editor: 'Claude', src: 'skill.md', dest: path.join(projectRoot, '.claude', 'skills', 'install-dropi-ui', 'skill.md') },
20
+ { editor: 'Cursor', src: 'cursor.mdc', dest: path.join(projectRoot, '.cursor', 'rules', 'install-dropi-ui.mdc') },
21
+ ];
22
+
23
+ skillTargets.forEach(t => {
24
+ try {
25
+ if (fs.existsSync(t.dest)) return;
26
+ fs.mkdirSync(path.dirname(t.dest), { recursive: true });
27
+ fs.copyFileSync(path.join(skillsBase, t.src), t.dest);
28
+ } catch (e) { /* silent fail for skills */ }
29
+ });
30
+
13
31
  console.log('\x1b[36m%s\x1b[0m', '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
14
32
  console.log('\x1b[1m%s\x1b[0m', ' 🎨 @dropi/ui instalado exitosamente');
15
33
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
16
34
  console.log('\n Para configurar estilos, iconos y soporte React, ejecuta:');
17
35
  console.log('\x1b[33m%s\x1b[0m', ' npx @dropi/ui setup');
36
+ console.log('\x1b[32m%s\x1b[0m', ' o simplemente pídele a tu IA: "/install-dropi-ui"');
18
37
  console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
19
38
  }
@@ -1,10 +1,5 @@
1
- ---
2
- description: Instala y configura automáticamente @dropi/ui en Angular, React o Vue
3
- globs: ["package.json"]
4
- alwaysApply: true
5
- ---
6
-
7
1
  # @dropi/ui — Configuración pendiente
8
2
 
9
3
  Este proyecto tiene `@dropi/ui` instalado pero necesita configuración.
10
- Lee `DROPI_UI_SETUP.md` en la raíz del proyecto y ejecuta los pasos automáticamente.
4
+ Ejecuta el script de instalación oficial: `node node_modules/@dropi/ui/scripts/setup.js`.
5
+ Una vez completado, verifica los estilos y el sprite de iconos en la carpeta public.
@@ -24,190 +24,42 @@ import { DropiButton } from '@dropi/ui/dist/components'
24
24
 
25
25
  ---
26
26
 
27
- ## Instrucciones
27
+ ## Instrucciones de Instalación
28
28
 
29
- ### Paso 1 Detectar framework, bundler y gestor de paquetes
29
+ Para configurar la librería, el asistente de IA debe ejecutar el script de automatización oficial incluido en el paquete. Esto garantiza que la detección de framework y la configuración de iconos/estilos se realicen correctamente según los estándares de Dropi.
30
30
 
31
- Lee `package.json` y determina:
32
- - **Framework**: Angular (`@angular/core`), React (`react`), Vue (`vue`)
33
- - **Package manager**: `yarn.lock` → yarn | `pnpm-lock.yaml` → pnpm | `package-lock.json` → npm
34
- - **Bundler**: existe `vite.config.ts` o `vite.config.js` → es Vite (aplica pasos especiales)
31
+ ### 1. Ejecutar el script de Setup
35
32
 
36
- ### Paso 2 Instalar dependencias
33
+ Ejecuta el siguiente comando en la terminal del proyecto:
37
34
 
38
- **Angular / Vue:**
39
35
  ```bash
40
- yarn add @dropi/ui
41
- # o
42
- npm install @dropi/ui
36
+ node node_modules/@dropi/ui/scripts/setup.js
43
37
  ```
44
38
 
45
- **React:**
46
- ```bash
47
- yarn add @dropi/ui @dropi/ui-react
48
- # o
49
- npm install @dropi/ui @dropi/ui-react
50
- ```
51
-
52
- ### Paso 3 — Fix obligatorio para Vite (React y Vue) ⚠️
53
-
54
- **Sin esto los componentes NO cargan.** Abre `vite.config.ts` y agrega `optimizeDeps`:
55
-
56
- ```ts
57
- import { defineConfig } from 'vite'
58
- import react from '@vitejs/plugin-react' // o vue si aplica
59
-
60
- export default defineConfig({
61
- plugins: [react()],
62
- optimizeDeps: {
63
- exclude: ['@dropi/ui/loader', '@dropi/ui'],
64
- },
65
- })
66
- ```
67
-
68
- Esto resuelve estos errores:
69
- - `Failed to fetch dynamically imported module: .../dropi-button.entry.js`
70
- - `Constructor for "dropi-button#undefined" was not found`
71
- - `Missing field moduleType` (Vite 6+/8+)
72
-
73
- ### Paso 4 — Inyectar estilos globales
74
-
75
- **Angular** — al inicio de `src/styles.scss`:
76
- ```scss
77
- @import '@dropi/ui/dist/dropi-ui/dropi-ui.css';
78
- ```
79
- Verificar también `angular.json` bajo `styles[]`.
80
-
81
- **React / Vue** — al inicio de `src/main.tsx` o `src/main.ts`:
82
- ```ts
83
- import '@dropi/ui/dist/dropi-ui/dropi-ui.css'
84
- ```
39
+ ### 2. Verificación
85
40
 
86
- ### Paso 5 Registrar con lazy loader (OBLIGATORIO, no usar import directo)
87
-
88
- **Angular** en `src/main.ts` o `app.config.ts`:
89
- ```ts
90
- import { defineCustomElements } from '@dropi/ui/loader'
91
- defineCustomElements()
92
- ```
93
- Agregar `CUSTOM_ELEMENTS_SCHEMA` al módulo standalone:
94
- ```ts
95
- // app.config.ts
96
- import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
97
- export const appConfig: ApplicationConfig = {
98
- providers: [
99
- importProvidersFrom({ schemas: [CUSTOM_ELEMENTS_SCHEMA] })
100
- ]
101
- }
102
- ```
103
-
104
- **Vue** — en `src/main.ts`:
105
- ```ts
106
- import { defineCustomElements } from '@dropi/ui/loader'
107
- defineCustomElements()
108
- ```
109
-
110
- **React** — en `src/main.tsx`:
111
- ```tsx
112
- import { defineCustomElements } from '@dropi/ui/loader'
113
- import '@dropi/ui/dist/dropi-ui/dropi-ui.css'
114
- import './index.css'
41
+ Una vez finalizado el script, verifica que:
42
+ - Los iconos carguen correctamente (sin errores 404 en el sprite).
43
+ - Los estilos globales estén inyectados en el punto de entrada principal (`main.tsx`, `main.ts`, etc.).
44
+ - Si es React, el paquete `@dropi/ui-react` esté instalado.
115
45
 
116
- defineCustomElements() // ← antes del createRoot
117
-
118
- createRoot(document.getElementById('root')!).render(
119
- <StrictMode>
120
- <App />
121
- </StrictMode>,
122
- )
123
- ```
124
-
125
- En los componentes React, importar desde `@dropi/ui-react` (NO del core):
126
- ```tsx
127
- import { DropiButton, DropiSelect, DropiBadge } from '@dropi/ui-react'
128
- ```
129
-
130
- ### Paso 6 — Verificar tsconfig.app.json (React + TypeScript)
131
-
132
- Asegurarse de que `tsconfig.app.json` tenga `skipLibCheck: true` para evitar errores de tipado de las librerías:
133
-
134
- ```json
135
- {
136
- "compilerOptions": {
137
- "skipLibCheck": true,
138
- "target": "ES2023",
139
- "lib": ["ES2023", "DOM", "DOM.Iterable"],
140
- "module": "ESNext",
141
- "moduleResolution": "bundler",
142
- "jsx": "react-jsx",
143
- "strict": true,
144
- "noEmit": true
145
- }
146
- }
147
- ```
148
-
149
- Si `skipLibCheck` no está → agregar. Sin esto pueden aparecer errores de tipos en `node_modules`.
150
-
151
- ### Paso 7 — Copiar sprite de íconos
152
-
153
- **Linux / Mac:**
154
- ```bash
155
- # Angular
156
- mkdir -p src/assets/icons/symbol/svg
157
- cp node_modules/@dropi/ui/assets/icons/symbol/svg/sprite.css.svg src/assets/icons/symbol/svg/
158
-
159
- # React / Vue (Vite)
160
- mkdir -p public/assets/icons/symbol/svg
161
- cp node_modules/@dropi/ui/assets/icons/symbol/svg/sprite.css.svg public/assets/icons/symbol/svg/
162
- ```
163
-
164
- **Windows (usar Node para compatibilidad):**
165
- ```bash
166
- # React / Vue (Vite)
167
- node -e "const fs=require('fs');fs.mkdirSync('public/assets/icons/symbol/svg',{recursive:true});fs.copyFileSync('node_modules/@dropi/ui/assets/icons/symbol/svg/sprite.css.svg','public/assets/icons/symbol/svg/sprite.css.svg');console.log('Sprite copiado ✅')"
168
-
169
- # Angular
170
- node -e "const fs=require('fs');fs.mkdirSync('src/assets/icons/symbol/svg',{recursive:true});fs.copyFileSync('node_modules/@dropi/ui/assets/icons/symbol/svg/sprite.css.svg','src/assets/icons/symbol/svg/sprite.css.svg');console.log('Sprite copiado ✅')"
171
- ```
172
-
173
- ### Paso 8 — Validar instalación
174
-
175
- ```bash
176
- yarn build # o npm run build / pnpm build
177
- ```
178
-
179
- Errores comunes y solución:
180
- | Error | Causa | Fix |
181
- |---|---|---|
182
- | `Failed to fetch dynamically imported module` | Falta `optimizeDeps.exclude` en vite.config | Paso 3 |
183
- | `Constructor for "dropi-button#undefined" was not found` | Mismo | Paso 3 |
184
- | `Missing field moduleType` | Vite 6+/8+ sin optimizeDeps | Paso 3 |
185
- | Errores de tipos en node_modules | Falta `skipLibCheck: true` | Paso 6 |
186
- | Íconos no aparecen | Sprite no copiado | Paso 7 |
187
-
188
- ### Paso 9 — Reporte final
189
-
190
- ```
191
- ✅ @dropi/ui instalado exitosamente en [FRAMEWORK]
192
-
193
- - Dependencia: @dropi/ui@X.X.X [+ @dropi/ui-react]
194
- - vite.config: optimizeDeps.exclude ✓
195
- - Estilos: [archivo] ✓
196
- - Loader (lazy): defineCustomElements() en [archivo] ✓
197
- - Sprite: [ruta destino] ✓
198
- - skipLibCheck: true ✓
46
+ ---
199
47
 
200
- Prueba rápida (React):
201
- import { DropiButton } from '@dropi/ui-react'
202
- <DropiButton text="Hola Dropi" type="default" severity="primary" size="normal" />
48
+ ## Fallback Manual (Solo si el script falla)
203
49
 
204
- Prueba rápida (Angular/Vue):
205
- <dropi-button text="Hola Dropi" type="default" severity="primary" size="normal"></dropi-button>
206
- ```
50
+ > [!WARNING]
51
+ > Usa estos pasos solo si el comando anterior no puede ejecutarse por restricciones del entorno.
207
52
 
208
- ## Reglas
53
+ 1. **Instalar dependencias**: `npm install @dropi/ui` (y `@dropi/ui-react` si es React).
54
+ 2. **Vite Fix**: Agregar `optimizeDeps.exclude: ['@dropi/ui/loader', '@dropi/ui']` en `vite.config`.
55
+ 3. **Estilos**: Importar `@dropi/ui/dist/dropi-ui/dropi-ui.css` en el entry point.
56
+ 4. **Loader**: Llamar a `defineCustomElements()` de `@dropi/ui/loader` antes del renderizado.
57
+ 5. **Iconos**: Crear un enlace simbólico del sprite:
58
+ `ln -sf $(pwd)/node_modules/@dropi/ui/assets/icons/symbol/svg/sprite.css.svg public/assets/icons/symbol/svg/sprite.css.svg`
59
+ 6. **TS Config**: Asegurar `skipLibCheck: true`.
60
+ 7. **Validar**: Ejecutar `npm run build`.
209
61
 
210
- - Lazy loading SIEMPRE via `defineCustomElements` del loader — NUNCA imports directos de componentes
211
- - NO sobreescribir imports que ya existan
212
- - En Windows usar el comando `node -e` para operaciones de archivos
62
+ ## Reglas Críticas
63
+ - **Lazy Loading**: NUNCA importar componentes directamente. Usar siempre el loader.
64
+ - **Iconos**: El sprite DEBE estar en `public/assets/icons/symbol/svg/sprite.css.svg` para que `<dropi-icon>` funcione.
213
65
  - Si el build falla, mostrar el error exacto y resolverlo antes de reportar éxito