@hiscovega/grisso 1.0.5 → 1.0.7

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/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Grisso
2
2
 
3
- > Librería de utility CSS de Griddo similar a Tailwind CSS pero con valores basados en CSS custom properties (design tokens).
3
+ > Librería de utility CSS de Griddo con variantes responsive y de estado, basada en CSS custom properties (design tokens).
4
+
5
+ > [!WARNING]
6
+ > En la versión estable 2.0, el paquete se moverá a `@griddo/grisso`. El nombre actual `@hiscovega/grisso` dejará de recibir actualizaciones a partir de ese momento.
4
7
 
5
8
  ## Instalación
6
9
 
@@ -10,24 +13,9 @@ npm install @hiscovega/grisso
10
13
 
11
14
  ## Uso
12
15
 
13
- ### Opción A: CSS directo
14
-
15
- Importa el CSS pre-compilado directamente. Útil para desarrollo.
16
-
17
- ```css
18
- /* En tu CSS global */
19
- @import "@hiscovega/grisso";
20
- ```
21
-
22
- O en HTML:
23
-
24
- ```html
25
- <link rel="stylesheet" href="node_modules/@hiscovega/grisso/dist/grisso.css" />
26
- ```
27
-
28
- ### Opción B: CLI
16
+ ### CLI
29
17
 
30
- Genera CSS desde la terminal. Ideal para scripts de build y CI/CD.
18
+ Genera CSS desde la terminal. Forma recomendada de usar Grisso, ideal para scripts de build y CI/CD.
31
19
 
32
20
  ```bash
33
21
  # CSS completo a stdout
@@ -42,6 +30,9 @@ npx grisso build --config grisso.config.mjs --output dist/grisso.css
42
30
  # Tree-shaking (solo clases usadas)
43
31
  npx grisso build --content "src/**/*.tsx" --content "src/**/*.css" --output dist/grisso.css
44
32
 
33
+ # Proteger clases del tree-shaking
34
+ npx grisso build --content "src/**/*.tsx" --safelist "^p-" --safelist "^m-" --output dist/grisso.css
35
+
45
36
  # Sin minificar (útil para depuración)
46
37
  npx grisso build --no-minify --output dist/grisso.css
47
38
 
@@ -51,17 +42,61 @@ npx grisso build | pbcopy
51
42
 
52
43
  **Flags de `grisso build`:**
53
44
 
54
- | Flag | Descripción |
55
- |---|---|
56
- | `--config <ruta>` | Ruta a `grisso.config.mjs` |
57
- | `--content <glob>` | Globs para tree-shaking (repetible) |
58
- | `--output <ruta>` | Archivo de salida (sin `--output` → stdout) |
59
- | `--no-minify` | Deshabilitar minificación |
60
- | `--help, -h` | Ayuda del comando |
45
+ | Flag | Descripción |
46
+ | -------------------- | ------------------------------------------- |
47
+ | `--config <ruta>` | Ruta a `grisso.config.mjs` |
48
+ | `--content <glob>` | Globs para tree-shaking (repetible) |
49
+ | `--safelist <regex>` | Patrones de clases a preservar (repetible) |
50
+ | `--output <ruta>` | Archivo de salida (sin `--output` → stdout) |
51
+ | `--no-minify` | Deshabilitar minificación |
52
+ | `--help, -h` | Ayuda del comando |
61
53
 
62
54
  Sin `--output`, el CSS va a stdout y los mensajes de estado a stderr, siguiendo la convención Unix.
63
55
 
64
- ### Opción C: API programática
56
+ #### `grisso tokens`
57
+
58
+ Genera un scaffold con todas las CSS custom properties (design tokens) que necesitas definir. Extrae dinámicamente los tokens de la config resuelta.
59
+
60
+ ```bash
61
+ # Scaffold CSS a stdout
62
+ npx grisso tokens
63
+
64
+ # Escribir a archivo
65
+ npx grisso tokens --output tokens.css
66
+
67
+ # Con config personalizada (refleja extends/overrides)
68
+ npx grisso tokens --config grisso.config.mjs --output tokens.css
69
+
70
+ # Config resuelta como JSON
71
+ npx grisso tokens --format json
72
+ ```
73
+
74
+ **Flags de `grisso tokens`:**
75
+
76
+ | Flag | Descripción |
77
+ | ----------------- | ------------------------------------------------- |
78
+ | `--config <ruta>` | Ruta a `grisso.config.mjs` |
79
+ | `--format <fmt>` | Formato de salida: `css` (default) o `json` |
80
+ | `--output <ruta>` | Archivo de salida (sin `--output` → stdout) |
81
+ | `--help, -h` | Ayuda del comando |
82
+
83
+ El scaffold CSS genera un `:root { }` con todas las properties vacías, agrupadas por sección, listo para rellenar:
84
+
85
+ ```css
86
+ :root {
87
+ /* ─── Spacing ─── */
88
+ --spc-4xs: ;
89
+ --spc-3xs: ;
90
+ /* ... */
91
+
92
+ /* ─── Colors: marca ─── */
93
+ --brand-1: ;
94
+ --brand-2: ;
95
+ /* ... */
96
+ }
97
+ ```
98
+
99
+ ### API programática
65
100
 
66
101
  Usa `buildCSS()` directamente desde Node.js. Genera, purga y optimiza CSS — ideal para scripts de build, herramientas custom o integración con cualquier bundler.
67
102
 
@@ -74,11 +109,12 @@ const css = await buildCSS();
74
109
 
75
110
  **Opciones de `buildCSS()`:**
76
111
 
77
- | Opción | Tipo | Default | Descripción |
78
- |---|---|---|---|
79
- | `config` | `string` | — | Ruta a `grisso.config.mjs` personalizado |
80
- | `content` | `string[]` | — | Globs de archivos a escanear para tree-shaking |
81
- | `minify` | `boolean` | `true` | Minificar el CSS de salida |
112
+ | Opción | Tipo | Default | Descripción |
113
+ | ---------- | ---------------------- | ------- | ---------------------------------------------------------------- |
114
+ | `config` | `string` | — | Ruta a `grisso.config.mjs` personalizado |
115
+ | `content` | `string[]` | — | Globs de archivos a escanear para tree-shaking |
116
+ | `safelist` | `(string \| RegExp)[]` | — | Patrones de clases a preservar (se mergea con `config.safelist`) |
117
+ | `minify` | `boolean` | `true` | Minificar el CSS de salida |
82
118
 
83
119
  Sin `content`, se incluye todo el CSS. Con `content`, se eliminan las clases no usadas via PurgeCSS.
84
120
 
@@ -144,6 +180,30 @@ export default {
144
180
  };
145
181
  ```
146
182
 
183
+ #### `extractTokens()` — scaffold de tokens
184
+
185
+ Usa `extractTokens()` para generar programáticamente el scaffold de custom properties (o JSON) desde la config resuelta.
186
+
187
+ ```js
188
+ import { extractTokens } from "@hiscovega/grisso/tokens";
189
+
190
+ // Scaffold CSS con todas las custom properties
191
+ const css = await extractTokens();
192
+
193
+ // JSON con los token maps resueltos
194
+ const json = await extractTokens({
195
+ format: "json",
196
+ config: "./grisso.config.mjs",
197
+ });
198
+ ```
199
+
200
+ **Opciones de `extractTokens()`:**
201
+
202
+ | Opción | Tipo | Default | Descripción |
203
+ | -------- | ---------------- | ------- | ----------------------------------------- |
204
+ | `config` | `string` | — | Ruta a `grisso.config.mjs` personalizado |
205
+ | `format` | `"css" \| "json"` | `"css"` | Formato de salida |
206
+
147
207
  **Servidor de desarrollo** — generar CSS on-the-fly:
148
208
 
149
209
  ```js
@@ -161,7 +221,7 @@ app.get("/grisso.css", async (req, res) => {
161
221
 
162
222
  ## Configuración personalizada
163
223
 
164
- Crea un `grisso.config.mjs` en la raíz de tu proyecto para extender o reemplazar los tokens por defecto. Sigue el patrón de Tailwind v3:
224
+ Crea un `grisso.config.mjs` en la raíz de tu proyecto para extender o reemplazar los tokens por defecto.
165
225
 
166
226
  ```js
167
227
  // grisso.config.mjs
@@ -173,7 +233,14 @@ export default {
173
233
  lg: "24px",
174
234
  },
175
235
 
176
- // `extend` MERGEA con los defaults
236
+ // States: reemplaza los 5 defaults (hover, focus, focus-visible, active, disabled)
237
+ // Solo genera variantes para los estados listados
238
+ states: {
239
+ hover: ":hover",
240
+ focus: ":focus",
241
+ },
242
+
243
+ // `extend` MERGEA con los defaults (arrays se concatenan)
177
244
  extend: {
178
245
  foregroundColors: {
179
246
  5: "var(--text-5)",
@@ -181,17 +248,30 @@ export default {
181
248
  shadows: {
182
249
  "2xl": "var(--box-shadow-2xl)",
183
250
  },
251
+ // Se concatena con el default []
252
+ safelist: [/^p-/],
184
253
  },
185
254
  };
186
255
  ```
187
256
 
257
+ La `safelist` controla qué clases se protegen del tree-shaking. Por defecto está vacía. En top-level reemplaza, en `extend` se concatena. Acepta `RegExp` y `string`.
258
+
259
+ Los `states` controlan qué variantes de estado se generan. Cada entrada es `nombre: pseudo-clase`. Top-level reemplaza completamente; `extend.states` mergea con los defaults.
260
+
188
261
  Si no se pasa `config` a `buildCSS()`, busca automáticamente `grisso.config.mjs` en el directorio de trabajo. Si no existe, usa los defaults.
189
262
 
190
263
  Los defaults se pueden consultar importando `@hiscovega/grisso/config`.
191
264
 
192
265
  ## Design Tokens (CSS custom properties)
193
266
 
194
- Grisso usa CSS custom properties para todos los valores. Copia `tokens-example.css` y adapta los valores a tu design system:
267
+ Grisso usa CSS custom properties para todos los valores. Genera un scaffold con todas las properties que necesitas definir:
268
+
269
+ ```bash
270
+ # Genera scaffold dinámico desde tu config resuelta
271
+ npx grisso tokens --output src/tokens.css
272
+ ```
273
+
274
+ Alternativamente, copia el ejemplo estático:
195
275
 
196
276
  ```bash
197
277
  cp node_modules/@hiscovega/grisso/tokens-example.css src/tokens.css
@@ -220,10 +300,10 @@ Importa los tokens antes que Grisso en tu CSS global:
220
300
  ### Nomenclatura
221
301
 
222
302
  ```
223
- {breakpoint}-{propiedad}-{escala}
303
+ {breakpoint}-{state}-{propiedad}-{escala}
224
304
  ```
225
305
 
226
- Ejemplos: `flex`, `tablet-flex`, `p-md`, `desktop-mt-lg`, `text-center`, `w-1/2`, `z-10`, `tracking-tight`
306
+ Ejemplos: `flex`, `tablet-flex`, `p-md`, `hover-bg-1`, `focus-border-1`, `tablet-hover-p-sm`, `desktop-mt-lg`, `w-1/2`
227
307
 
228
308
  ### Breakpoints (mobile-first)
229
309
 
@@ -234,24 +314,40 @@ Ejemplos: `flex`, `tablet-flex`, `p-md`, `desktop-mt-lg`, `text-center`, `w-1/2`
234
314
  | `desktop-` | 1024px+ |
235
315
  | `ultrawide-` | 1680px+ |
236
316
 
317
+ ### State variants
318
+
319
+ Todas las utilidades generan variantes de estado automáticamente. El tree-shaking elimina las no usadas.
320
+
321
+ | Prefijo | Pseudo-clase |
322
+ | ------------------ | ---------------- |
323
+ | `hover-` | `:hover` |
324
+ | `focus-` | `:focus` |
325
+ | `focus-visible-` | `:focus-visible` |
326
+ | `active-` | `:active` |
327
+ | `disabled-` | `:disabled` |
328
+
329
+ Se combinan con breakpoints: `tablet-hover-bg-1`, `desktop-focus-p-sm`.
330
+
331
+ Orden del cascade: base → state → responsive → responsive+state.
332
+
237
333
  ### Categorías
238
334
 
239
- | Categoría | Ejemplos |
240
- | -------------- | ----------------------------------------------------------------------------- |
335
+ | Categoría | Ejemplos |
336
+ | -------------- | ----------------------------------------------------------------------------------------------------- |
241
337
  | **Layout** | `flex`, `block`, `hidden`, `relative`, `absolute`, `overflow-hidden`, `inset-0`, `inset-x-sm`, `z-10` |
242
- | **Flex/Grid** | `flex-col`, `flex-wrap`, `items-center`, `justify-between`, `gap-md` |
243
- | **Spacing** | `p-sm`, `pt-lg`, `mx-auto`, `mt-xs`, `mb-md` |
244
- | **Sizing** | `w-full`, `h-full`, `w-1/2`, `w-2/3`, `h-1/4`, `max-w-full` |
245
- | **Tipografía** | `text-1`, `text-center`, `font-bold`, `font-light`, `leading-snug`, `tracking-tight` |
246
- | **Fondos** | `bg-1`, `bg-ui`, `bg-cover`, `bg-center` |
247
- | **Bordes** | `border-sm`, `border-1`, `border-t-sm`, `divide-x`, `outline-none` |
248
- | **Efectos** | `shadow-md`, `opacity-3`, `overlay-2` |
249
- | **Iconos** | `icon-1`, `icon-3` |
338
+ | **Flex/Grid** | `flex-col`, `flex-wrap`, `items-center`, `justify-between`, `gap-md` |
339
+ | **Spacing** | `p-sm`, `pt-lg`, `mx-auto`, `mt-xs`, `mb-md` |
340
+ | **Sizing** | `w-full`, `h-full`, `w-1/2`, `w-2/3`, `h-1/4`, `max-w-full` |
341
+ | **Tipografía** | `text-1`, `text-center`, `font-bold`, `font-light`, `leading-snug`, `tracking-tight` |
342
+ | **Fondos** | `bg-1`, `bg-ui`, `bg-cover`, `bg-center` |
343
+ | **Bordes** | `border-sm`, `border-1`, `border-t-sm`, `divide-x`, `outline-none` |
344
+ | **Efectos** | `shadow-md`, `opacity-3`, `overlay-2` |
345
+ | **Iconos** | `icon-1`, `icon-3` |
250
346
 
251
347
  ## Build
252
348
 
253
349
  ```bash
254
- npm run build # Compila TS + genera dist/grisso.css (~154 KB)
350
+ npm run build # Compila TS + genera dist/grisso.css (~800 KB)
255
351
  npm run typecheck # Type-check sin emitir (tsc --noEmit)
256
352
  npm run lint # Lint con Biome
257
353
  npm test # Tests con Vitest
@@ -261,9 +357,9 @@ npm run playground # Build + tree-shake + abre playground/index.html
261
357
 
262
358
  ### CLI
263
359
 
264
- El CLI se usa internamente y está disponible para consumidores via `npx grisso build`. Ver [Opción B: CLI](#opción-b-cli) para detalles completos.
360
+ El CLI se usa internamente y está disponible para consumidores via `npx grisso build`. Ver [CLI](#cli) para detalles completos.
265
361
 
266
- Con `--content`, se usa PurgeCSS para eliminar clases no usadas (~154 KB → ~4 KB en el playground).
362
+ Con `--content`, se usa PurgeCSS para eliminar clases no usadas (~800 KB → ~4 KB en el playground).
267
363
 
268
364
  ## Desarrollo: Añadir nuevas utilities
269
365
 
@@ -275,11 +371,11 @@ Con `--content`, se usa PurgeCSS para eliminar clases no usadas (~154 KB → ~4
275
371
  // src/partials/layout.ts
276
372
  import { simpleClass, complexClass } from "../generators.js";
277
373
 
278
- // Clase simple — genera .flex + variantes responsive
279
- simpleClass("flex", "display", "flex", breakpoints);
374
+ // Clase simple — genera .flex + variantes de estado y responsive
375
+ simpleClass("flex", "display", "flex", breakpoints, states);
280
376
 
281
- // Clase basada en tokens — genera .p-xs, .p-sm, etc. + variantes responsive
282
- complexClass("p-", "padding", spacing, breakpoints);
377
+ // Clase basada en tokens — genera .p-xs, .hover-p-xs:hover, .tablet-p-xs, etc.
378
+ complexClass("p-", "padding", spacing, breakpoints, states);
283
379
  ```
284
380
 
285
381
  ## Publicación (release)