@hiscovega/grisso 1.0.4 → 1.0.6

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,6 @@
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 valores basados en CSS custom properties (design tokens).
4
4
 
5
5
  ## Instalación
6
6
 
@@ -10,47 +10,92 @@ npm install @hiscovega/grisso
10
10
 
11
11
  ## Uso
12
12
 
13
- ### Opción A: CSS directo
13
+ ### CLI
14
14
 
15
- Importa el CSS pre-compilado directamente. Útil para desarrollo o cuando no usas PostCSS.
15
+ Genera CSS desde la terminal. Forma recomendada de usar Grisso, ideal para scripts de build y CI/CD.
16
16
 
17
- ```css
18
- /* En tu CSS global */
19
- @import "@hiscovega/grisso";
20
- ```
17
+ ```bash
18
+ # CSS completo a stdout
19
+ npx grisso build
20
+
21
+ # Escribir a archivo
22
+ npx grisso build --output dist/grisso.css
23
+
24
+ # Con config personalizada
25
+ npx grisso build --config grisso.config.mjs --output dist/grisso.css
26
+
27
+ # Tree-shaking (solo clases usadas)
28
+ npx grisso build --content "src/**/*.tsx" --content "src/**/*.css" --output dist/grisso.css
21
29
 
22
- O en HTML:
30
+ # Proteger clases del tree-shaking
31
+ npx grisso build --content "src/**/*.tsx" --safelist "^p-" --safelist "^m-" --output dist/grisso.css
23
32
 
24
- ```html
25
- <link rel="stylesheet" href="node_modules/@hiscovega/grisso/dist/grisso.css" />
33
+ # Sin minificar (útil para depuración)
34
+ npx grisso build --no-minify --output dist/grisso.css
35
+
36
+ # Pipear a otro comando
37
+ npx grisso build | pbcopy
26
38
  ```
27
39
 
28
- ### Opción B: PostCSS plugin (recomendado — con tree-shaking)
40
+ **Flags de `grisso build`:**
29
41
 
30
- Añade el plugin a tu configuración de PostCSS. El CSS de Grisso se inyecta automáticamente y solo las clases usadas llegan al bundle final.
42
+ | Flag | Descripción |
43
+ | -------------------- | ------------------------------------------- |
44
+ | `--config <ruta>` | Ruta a `grisso.config.mjs` |
45
+ | `--content <glob>` | Globs para tree-shaking (repetible) |
46
+ | `--safelist <regex>` | Patrones de clases a preservar (repetible) |
47
+ | `--output <ruta>` | Archivo de salida (sin `--output` → stdout) |
48
+ | `--no-minify` | Deshabilitar minificación |
49
+ | `--help, -h` | Ayuda del comando |
31
50
 
32
- ```js
33
- // postcss.config.js
34
- import grisso from "@hiscovega/grisso/plugin";
51
+ Sin `--output`, el CSS va a stdout y los mensajes de estado a stderr, siguiendo la convención Unix.
35
52
 
36
- export default {
37
- plugins: [
38
- grisso({
39
- content: ["./src/**/*.{js,ts,jsx,tsx,css}"],
40
- }),
41
- ],
42
- };
53
+ #### `grisso tokens`
54
+
55
+ Genera un scaffold con todas las CSS custom properties (design tokens) que necesitas definir. Extrae dinámicamente los tokens de la config resuelta.
56
+
57
+ ```bash
58
+ # Scaffold CSS a stdout
59
+ npx grisso tokens
60
+
61
+ # Escribir a archivo
62
+ npx grisso tokens --output tokens.css
63
+
64
+ # Con config personalizada (refleja extends/overrides)
65
+ npx grisso tokens --config grisso.config.mjs --output tokens.css
66
+
67
+ # Config resuelta como JSON
68
+ npx grisso tokens --format json
43
69
  ```
44
70
 
45
- Sin `content`, se incluye todo el CSS (útil en desarrollo):
71
+ **Flags de `grisso tokens`:**
46
72
 
47
- ```js
48
- grisso();
73
+ | Flag | Descripción |
74
+ | ----------------- | ------------------------------------------------- |
75
+ | `--config <ruta>` | Ruta a `grisso.config.mjs` |
76
+ | `--format <fmt>` | Formato de salida: `css` (default) o `json` |
77
+ | `--output <ruta>` | Archivo de salida (sin `--output` → stdout) |
78
+ | `--help, -h` | Ayuda del comando |
79
+
80
+ El scaffold CSS genera un `:root { }` con todas las properties vacías, agrupadas por sección, listo para rellenar:
81
+
82
+ ```css
83
+ :root {
84
+ /* ─── Spacing ─── */
85
+ --spc-4xs: ;
86
+ --spc-3xs: ;
87
+ /* ... */
88
+
89
+ /* ─── Colors: marca ─── */
90
+ --brand-1: ;
91
+ --brand-2: ;
92
+ /* ... */
93
+ }
49
94
  ```
50
95
 
51
- ### Opción C: API programática (sin PostCSS)
96
+ ### API programática
52
97
 
53
- Usa `buildCSS()` directamente desde Node.js. Genera, purga y optimiza CSS sin depender de PostCSS — ideal para scripts de build, herramientas custom o entornos donde PostCSS no está disponible.
98
+ Usa `buildCSS()` directamente desde Node.js. Genera, purga y optimiza CSS — ideal para scripts de build, herramientas custom o integración con cualquier bundler.
54
99
 
55
100
  ```js
56
101
  import { buildCSS } from "@hiscovega/grisso/build";
@@ -61,11 +106,12 @@ const css = await buildCSS();
61
106
 
62
107
  **Opciones de `buildCSS()`:**
63
108
 
64
- | Opción | Tipo | Default | Descripción |
65
- |---|---|---|---|
66
- | `config` | `string` | — | Ruta a `grisso.config.mjs` personalizado |
67
- | `content` | `string[]` | — | Globs de archivos a escanear para tree-shaking |
68
- | `minify` | `boolean` | `true` | Minificar el CSS de salida |
109
+ | Opción | Tipo | Default | Descripción |
110
+ | ---------- | ---------------------- | ------- | ---------------------------------------------------------------- |
111
+ | `config` | `string` | — | Ruta a `grisso.config.mjs` personalizado |
112
+ | `content` | `string[]` | — | Globs de archivos a escanear para tree-shaking |
113
+ | `safelist` | `(string \| RegExp)[]` | — | Patrones de clases a preservar (se mergea con `config.safelist`) |
114
+ | `minify` | `boolean` | `true` | Minificar el CSS de salida |
69
115
 
70
116
  Sin `content`, se incluye todo el CSS. Con `content`, se eliminan las clases no usadas via PurgeCSS.
71
117
 
@@ -131,6 +177,30 @@ export default {
131
177
  };
132
178
  ```
133
179
 
180
+ #### `extractTokens()` — scaffold de tokens
181
+
182
+ Usa `extractTokens()` para generar programáticamente el scaffold de custom properties (o JSON) desde la config resuelta.
183
+
184
+ ```js
185
+ import { extractTokens } from "@hiscovega/grisso/tokens";
186
+
187
+ // Scaffold CSS con todas las custom properties
188
+ const css = await extractTokens();
189
+
190
+ // JSON con los token maps resueltos
191
+ const json = await extractTokens({
192
+ format: "json",
193
+ config: "./grisso.config.mjs",
194
+ });
195
+ ```
196
+
197
+ **Opciones de `extractTokens()`:**
198
+
199
+ | Opción | Tipo | Default | Descripción |
200
+ | -------- | ---------------- | ------- | ----------------------------------------- |
201
+ | `config` | `string` | — | Ruta a `grisso.config.mjs` personalizado |
202
+ | `format` | `"css" \| "json"` | `"css"` | Formato de salida |
203
+
134
204
  **Servidor de desarrollo** — generar CSS on-the-fly:
135
205
 
136
206
  ```js
@@ -148,7 +218,7 @@ app.get("/grisso.css", async (req, res) => {
148
218
 
149
219
  ## Configuración personalizada
150
220
 
151
- 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:
221
+ Crea un `grisso.config.mjs` en la raíz de tu proyecto para extender o reemplazar los tokens por defecto.
152
222
 
153
223
  ```js
154
224
  // grisso.config.mjs
@@ -160,7 +230,7 @@ export default {
160
230
  lg: "24px",
161
231
  },
162
232
 
163
- // `extend` MERGEA con los defaults
233
+ // `extend` MERGEA con los defaults (arrays se concatenan)
164
234
  extend: {
165
235
  foregroundColors: {
166
236
  5: "var(--text-5)",
@@ -168,26 +238,28 @@ export default {
168
238
  shadows: {
169
239
  "2xl": "var(--box-shadow-2xl)",
170
240
  },
241
+ // Se concatena con el default []
242
+ safelist: [/^p-/],
171
243
  },
172
244
  };
173
245
  ```
174
246
 
175
- Pasa la ruta al plugin:
247
+ 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`.
176
248
 
177
- ```js
178
- grisso({
179
- content: ["./src/**/*.{js,ts,jsx,tsx,css}"],
180
- config: "./grisso.config.mjs",
181
- });
182
- ```
183
-
184
- Si no se pasa `config`, el plugin busca automáticamente `grisso.config.mjs` en el directorio de trabajo. Si no existe, usa los defaults.
249
+ Si no se pasa `config` a `buildCSS()`, busca automáticamente `grisso.config.mjs` en el directorio de trabajo. Si no existe, usa los defaults.
185
250
 
186
251
  Los defaults se pueden consultar importando `@hiscovega/grisso/config`.
187
252
 
188
253
  ## Design Tokens (CSS custom properties)
189
254
 
190
- Grisso usa CSS custom properties para todos los valores. Copia `tokens-example.css` y adapta los valores a tu design system:
255
+ Grisso usa CSS custom properties para todos los valores. Genera un scaffold con todas las properties que necesitas definir:
256
+
257
+ ```bash
258
+ # Genera scaffold dinámico desde tu config resuelta
259
+ npx grisso tokens --output src/tokens.css
260
+ ```
261
+
262
+ Alternativamente, copia el ejemplo estático:
191
263
 
192
264
  ```bash
193
265
  cp node_modules/@hiscovega/grisso/tokens-example.css src/tokens.css
@@ -208,7 +280,7 @@ Importa los tokens antes que Grisso en tu CSS global:
208
280
 
209
281
  ```css
210
282
  @import "./tokens.css";
211
- @import "@hiscovega/grisso"; /* o via plugin de PostCSS */
283
+ @import "@hiscovega/grisso";
212
284
  ```
213
285
 
214
286
  ## Clases disponibles
@@ -219,7 +291,7 @@ Importa los tokens antes que Grisso en tu CSS global:
219
291
  {breakpoint}-{propiedad}-{escala}
220
292
  ```
221
293
 
222
- Ejemplos: `flex`, `tablet-flex`, `p-md`, `desktop-mt-lg`, `text-center`
294
+ Ejemplos: `flex`, `tablet-flex`, `p-md`, `desktop-mt-lg`, `text-center`, `w-1/2`, `z-10`, `tracking-tight`
223
295
 
224
296
  ### Breakpoints (mobile-first)
225
297
 
@@ -232,22 +304,22 @@ Ejemplos: `flex`, `tablet-flex`, `p-md`, `desktop-mt-lg`, `text-center`
232
304
 
233
305
  ### Categorías
234
306
 
235
- | Categoría | Ejemplos |
236
- | -------------- | -------------------------------------------------------------------- |
237
- | **Layout** | `flex`, `block`, `hidden`, `relative`, `absolute`, `overflow-hidden` |
238
- | **Flex/Grid** | `flex-col`, `flex-wrap`, `items-center`, `justify-between`, `gap-md` |
239
- | **Spacing** | `p-sm`, `pt-lg`, `mx-auto`, `mt-xs`, `mb-md` |
240
- | **Sizing** | `w-full`, `h-full`, `w-1`, `max-w-full` |
241
- | **Tipografía** | `text-1`, `text-center`, `font-bold`, `leading-tight` |
242
- | **Fondos** | `bg-1`, `bg-ui`, `bg-cover`, `bg-center` |
243
- | **Bordes** | `border-sm`, `divide-x`, `outline-none` |
244
- | **Efectos** | `shadow-md`, `opacity-3`, `overlay-2` |
245
- | **Iconos** | `icon-1`, `icon-3` |
307
+ | Categoría | Ejemplos |
308
+ | -------------- | ----------------------------------------------------------------------------------------------------- |
309
+ | **Layout** | `flex`, `block`, `hidden`, `relative`, `absolute`, `overflow-hidden`, `inset-0`, `inset-x-sm`, `z-10` |
310
+ | **Flex/Grid** | `flex-col`, `flex-wrap`, `items-center`, `justify-between`, `gap-md` |
311
+ | **Spacing** | `p-sm`, `pt-lg`, `mx-auto`, `mt-xs`, `mb-md` |
312
+ | **Sizing** | `w-full`, `h-full`, `w-1/2`, `w-2/3`, `h-1/4`, `max-w-full` |
313
+ | **Tipografía** | `text-1`, `text-center`, `font-bold`, `font-light`, `leading-snug`, `tracking-tight` |
314
+ | **Fondos** | `bg-1`, `bg-ui`, `bg-cover`, `bg-center` |
315
+ | **Bordes** | `border-sm`, `border-1`, `border-t-sm`, `divide-x`, `outline-none` |
316
+ | **Efectos** | `shadow-md`, `opacity-3`, `overlay-2` |
317
+ | **Iconos** | `icon-1`, `icon-3` |
246
318
 
247
319
  ## Build
248
320
 
249
321
  ```bash
250
- npm run build # Compila TS + genera dist/grisso.css (~156 KB)
322
+ npm run build # Compila TS + genera dist/grisso.css (~154 KB)
251
323
  npm run typecheck # Type-check sin emitir (tsc --noEmit)
252
324
  npm run lint # Lint con Biome
253
325
  npm test # Tests con Vitest
@@ -255,27 +327,20 @@ npm run test:watch # Tests en modo watch
255
327
  npm run playground # Build + tree-shake + abre playground/index.html
256
328
  ```
257
329
 
258
- ### Build script
330
+ ### CLI
259
331
 
260
- El script de build acepta flags opcionales:
261
-
262
- ```bash
263
- node scripts/build.js # Full build → dist/grisso.css
264
- node scripts/build.js --config grisso.config.mjs # Con config personalizada
265
- node scripts/build.js --content "src/**/*.html" --output out.css # Tree-shaken
266
- node scripts/build.js --config conf.mjs --content "src/**" --output x # Todo junto
267
- ```
332
+ El CLI se usa internamente y está disponible para consumidores via `npx grisso build`. Ver [CLI](#cli) para detalles completos.
268
333
 
269
- Con `--content`, se usa PurgeCSS para eliminar clases no usadas (156 KB → ~4 KB en el playground).
334
+ Con `--content`, se usa PurgeCSS para eliminar clases no usadas (~154 KB → ~4 KB en el playground).
270
335
 
271
336
  ## Desarrollo: Añadir nuevas utilities
272
337
 
273
- 1. Edita el partial correspondiente en `src/js/partials/{category}.ts`
338
+ 1. Edita el partial correspondiente en `src/partials/{category}.ts`
274
339
  2. Usa `simpleClass`, `complexClass` o `customClass` con los tokens del config
275
340
  3. Ejecuta `npm run build`
276
341
 
277
342
  ```ts
278
- // src/js/partials/layout.ts
343
+ // src/partials/layout.ts
279
344
  import { simpleClass, complexClass } from "../generators.js";
280
345
 
281
346
  // Clase simple — genera .flex + variantes responsive