@codenhub/styles 0.7.0 → 0.9.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/README.es.md +9 -8
- package/README.md +8 -7
- package/README.pt-BR.md +9 -8
- package/dist/aesthetics/chunky-tile.css +1 -1
- package/dist/aesthetics/cyber.css +1 -1
- package/dist/aesthetics/glass.css +1 -1
- package/dist/aesthetics/index.css +2 -2
- package/dist/aesthetics/neobrutalism.css +1 -1
- package/dist/aesthetics/pixel.css +1 -1
- package/dist/aesthetics/sketch.css +1 -1
- package/dist/cli.js +358 -0
- package/dist/components.css +50 -2
- package/dist/index.css +50 -2
- package/dist/index.d.ts +1 -0
- package/dist/native.css +50 -2
- package/dist/palette.css +1 -1
- package/dist/purge/classes.json +1 -0
- package/dist/purge/index.css +50 -0
- package/dist/theme.css +2 -2
- package/docs/accessibility.md +46 -27
- package/docs/changelog/0.8.0.md +70 -0
- package/docs/changelog/0.9.0.md +40 -0
- package/docs/changelog/index.md +2 -0
- package/docs/es/accessibility.md +47 -28
- package/docs/es/index.md +4 -3
- package/docs/es/integrating/index.md +38 -10
- package/docs/es/integrating/tailwind.md +79 -8
- package/docs/es/integrating/without-a-bundler.md +157 -5
- package/docs/es/setup.md +43 -34
- package/docs/es/usage/aesthetics.md +20 -14
- package/docs/es/usage/buttons.md +6 -2
- package/docs/es/usage/composing.md +6 -2
- package/docs/es/usage/content-and-layout.md +10 -4
- package/docs/es/usage/customizing.md +46 -26
- package/docs/es/usage/feedback.md +5 -1
- package/docs/es/usage/forms.md +30 -5
- package/docs/es/usage/index.md +7 -3
- package/docs/es/usage/presets.md +92 -0
- package/docs/es/usage/solo.md +4 -2
- package/docs/es/usage/theming.md +29 -16
- package/docs/es/usage/tooltips.md +2 -2
- package/docs/index.md +3 -2
- package/docs/integrating/index.md +38 -10
- package/docs/integrating/tailwind.md +78 -7
- package/docs/integrating/without-a-bundler.md +156 -4
- package/docs/pt-BR/accessibility.md +47 -28
- package/docs/pt-BR/index.md +4 -3
- package/docs/pt-BR/integrating/index.md +38 -10
- package/docs/pt-BR/integrating/tailwind.md +79 -8
- package/docs/pt-BR/integrating/without-a-bundler.md +157 -5
- package/docs/pt-BR/setup.md +43 -34
- package/docs/pt-BR/usage/aesthetics.md +20 -14
- package/docs/pt-BR/usage/buttons.md +6 -2
- package/docs/pt-BR/usage/composing.md +6 -2
- package/docs/pt-BR/usage/content-and-layout.md +10 -4
- package/docs/pt-BR/usage/customizing.md +46 -26
- package/docs/pt-BR/usage/feedback.md +5 -1
- package/docs/pt-BR/usage/forms.md +30 -5
- package/docs/pt-BR/usage/index.md +7 -3
- package/docs/pt-BR/usage/presets.md +92 -0
- package/docs/pt-BR/usage/solo.md +4 -2
- package/docs/pt-BR/usage/theming.md +22 -9
- package/docs/pt-BR/usage/tooltips.md +2 -2
- package/docs/setup.md +31 -22
- package/docs/usage/aesthetics.md +19 -13
- package/docs/usage/buttons.md +5 -1
- package/docs/usage/composing.md +5 -1
- package/docs/usage/content-and-layout.md +9 -3
- package/docs/usage/customizing.md +45 -25
- package/docs/usage/feedback.md +4 -0
- package/docs/usage/forms.md +29 -4
- package/docs/usage/index.md +6 -2
- package/docs/usage/presets.md +91 -0
- package/docs/usage/solo.md +3 -1
- package/docs/usage/theming.md +21 -8
- package/docs/usage/tooltips.md +1 -1
- package/llms-full.txt +695 -134
- package/llms.txt +3 -2
- package/package.json +117 -65
- package/{dist/tw → tw}/aesthetics/chunky-tile.css +43 -20
- package/{dist/tw → tw}/aesthetics/cyber.css +19 -25
- package/{dist/tw → tw}/aesthetics/glass.css +110 -36
- package/{dist/tw → tw}/aesthetics/neobrutalism.css +41 -21
- package/{dist/tw → tw}/aesthetics/pixel.css +3 -0
- package/tw/aesthetics/sketch.css +435 -0
- package/{dist/tw → tw}/box.css +109 -26
- package/tw/components/button.css +11 -0
- package/tw/components/button.rules.css +187 -0
- package/tw/components/feedback.css +11 -0
- package/{dist/tw/components/feedback.css → tw/components/feedback.rules.css} +156 -33
- package/tw/components/form.css +11 -0
- package/{dist/tw/components/form.css → tw/components/form.rules.css} +584 -141
- package/tw/components/index.css +16 -0
- package/tw/components/rules.css +41 -0
- package/tw/components/surface.css +11 -0
- package/tw/components/surface.rules.css +225 -0
- package/tw/components/tooltip.css +11 -0
- package/{dist/tw/components/tooltip.css → tw/components/tooltip.rules.css} +82 -61
- package/{dist/tw → tw}/corner.css +18 -12
- package/{dist/tw → tw}/elevation.css +27 -21
- package/{dist/tw → tw}/index.css +11 -9
- package/tw/index.d.ts +1 -0
- package/tw/intent.css +312 -0
- package/tw/modifiers.css +127 -0
- package/tw/native.css +323 -0
- package/tw/presentation.css +139 -0
- package/tw/reset.css +10 -0
- package/{dist/tw/reset.css → tw/reset.rules.css} +7 -8
- package/tw/size.css +34 -0
- package/tw/surface.css +9 -0
- package/tw/surface.rules.css +212 -0
- package/{dist/tw → tw}/theme.css +93 -29
- package/tw/typography.css +8 -0
- package/{dist/tw/typography.css → tw/typography.rules.css} +0 -3
- package/{dist/tw → tw}/utilities/content.css +248 -108
- package/tw/utilities/index.css +11 -0
- package/tw/utilities/layout.css +210 -0
- package/tw/utilities/rules.css +8 -0
- package/dist/tw/aesthetics/sketch.css +0 -398
- package/dist/tw/components/button.css +0 -139
- package/dist/tw/components/index.css +0 -35
- package/dist/tw/components/surface.css +0 -184
- package/dist/tw/intent.css +0 -229
- package/dist/tw/native.css +0 -203
- package/dist/tw/palette.css +0 -460
- package/dist/tw/presentation.css +0 -68
- package/dist/tw/surface.css +0 -61
- package/dist/tw/utilities/index.css +0 -6
- package/dist/tw/utilities/layout.css +0 -144
- /package/{dist/tw → tw}/aesthetics/index.css +0 -0
|
@@ -3,7 +3,7 @@ title: Visión general
|
|
|
3
3
|
description: Cómo se carga la hoja de estilos en el build de un framework, y qué guía seguir.
|
|
4
4
|
group: Integración
|
|
5
5
|
order: 2
|
|
6
|
-
source:
|
|
6
|
+
source: 2028acef66a8ab3659cef35e08ecc0db1de7bdeb
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Integración
|
|
@@ -21,16 +21,44 @@ Importar desde un solo lugar importa por dos motivos. Algunos frameworks solo _p
|
|
|
21
21
|
|
|
22
22
|
## Qué guía seguir
|
|
23
23
|
|
|
24
|
-
| Stack
|
|
25
|
-
|
|
|
26
|
-
| Un proyecto con Tailwind CSS v4 en cualquier bundler
|
|
27
|
-
| Next.js / React
|
|
28
|
-
| Vue
|
|
29
|
-
| Svelte / SvelteKit
|
|
30
|
-
| Astro
|
|
31
|
-
| HTML simple, Rails, Django o cualquier aplicación sin paso de build de CSS | [Sin bundler](./without-a-bundler.md) |
|
|
24
|
+
| Stack | Guía |
|
|
25
|
+
| ----------------------------------------------------------------------------------------------- | ------------------------------------- |
|
|
26
|
+
| Un proyecto con Tailwind CSS v4 en cualquier bundler | [Tailwind CSS v4](./tailwind.md) |
|
|
27
|
+
| Next.js / React | [Next.js](./nextjs.md) |
|
|
28
|
+
| Vue | [Vue](./vue.md) |
|
|
29
|
+
| Svelte / SvelteKit | [Svelte](./svelte.md) |
|
|
30
|
+
| Astro | [Astro](./astro.md) |
|
|
31
|
+
| HTML simple, Rails, Laravel, Django o cualquier aplicación sin paso de build de CSS con Node.js | [Sin bundler](./without-a-bundler.md) |
|
|
32
32
|
|
|
33
|
-
Un proyecto sin framework, un build simple con Vite, webpack o Parcel,
|
|
33
|
+
Un proyecto sin framework, un build simple con Vite, webpack o Parcel, importa la hoja de estilos compilada desde la entrada CSS global que el proyecto ya tiene, como muestra [Configuración inicial → Importar la hoja de estilos](../setup.md#importar-la-hoja-de-estilos). Vite y webpack resuelven el nombre del paquete tal cual; Parcel y PostCSS con `postcss-import` necesitan el cambio de abajo. La hoja de estilos compilada contiene todas las clases; para incluir solo las que usan tus páginas sin adoptar Tailwind, escribe una hoja de estilos reducida con el [comando `build`](./without-a-bundler.md#generar-solo-las-clases-que-usas) del paquete e impórtala en su lugar.
|
|
34
|
+
|
|
35
|
+
### Bundlers que necesitan un empujón
|
|
36
|
+
|
|
37
|
+
Ambas herramientas encuentran la hoja de estilos en cuanto se les dice cómo; ninguna necesita otro punto de entrada.
|
|
38
|
+
|
|
39
|
+
**Parcel.** Activa su soporte del mapa `exports` de un paquete en tu `package.json`:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"@parcel/resolver-default": {
|
|
44
|
+
"packageExports": true
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Luego importa el paquete con el prefijo `npm:` de Parcel, que le indica que el nombre es un paquete y no un archivo junto a la hoja de estilos:
|
|
50
|
+
|
|
51
|
+
```css
|
|
52
|
+
@import "npm:@codenhub/styles";
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**PostCSS con `postcss-import`.** El plugin no lee el mapa `exports` de un paquete, así que el nombre del paquete por sí solo no se resuelve. Importa en su lugar el archivo compilado por su ruta en disco, relativa a tu propia hoja de estilos, el mismo archivo que nombraría un `<link>`:
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
@import "../node_modules/@codenhub/styles/dist/index.css";
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Los demás puntos de entrada compilados funcionan igual, como `@codenhub/styles/dist/aesthetics/neobrutalism.css`.
|
|
34
62
|
|
|
35
63
|
## Comprobar que funciona
|
|
36
64
|
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
title: Tailwind CSS v4
|
|
3
3
|
description: Usar los puntos de entrada de código fuente /tw en un proyecto con Tailwind CSS v4.
|
|
4
4
|
order: 1
|
|
5
|
-
source:
|
|
5
|
+
source: 4866b77d4cfb1655499f633fff8bf61dde2aa4bb
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Tailwind CSS v4
|
|
9
9
|
|
|
10
|
-
Un proyecto que ya usa Tailwind CSS v4 puede compilar el código fuente de este paquete en lugar de cargar su salida compilada. Así, las utilidades de tu aplicación y las clases del paquete salen de un solo build, comparten un tema y usan una sola variante `dark:`. Esta página cubre el import, las estéticas, los puntos de entrada específicos y los problemas de build con los que probablemente te encuentres.
|
|
10
|
+
Un proyecto que ya usa Tailwind CSS v4 puede compilar el código fuente de este paquete en lugar de cargar su salida compilada. Así, las utilidades de tu aplicación y las clases del paquete salen de un solo build, comparten un tema y usan una sola variante `dark:`. Esta página cubre el import, las estéticas, los puntos de entrada específicos, cómo construir tus propios componentes con `@apply`, cómo prescindir de la paleta de Tailwind y los problemas de build con los que probablemente te encuentres.
|
|
11
11
|
|
|
12
12
|
## Por qué código fuente en lugar de compilado
|
|
13
13
|
|
|
14
|
-
Los puntos de entrada `/tw` publican código fuente copiado y sin compilar desde `
|
|
14
|
+
Los puntos de entrada `/tw` publican código fuente copiado y sin compilar desde la carpeta `tw/` del paquete; tu propio build de Tailwind lo compila junto con tu aplicación, así que sus directivas `@theme`, `@utility` y `@apply` se resuelven junto con las tuyas. Los puntos de entrada compilados (`@codenhub/styles`) siguen funcionando en un proyecto con Tailwind, pero entonces se ejecutan dos pipelines de CSS separados en paralelo en lugar de uno: usa `/tw` salvo que un motivo concreto lo descarte.
|
|
15
15
|
|
|
16
16
|
## Importar el punto de entrada de código fuente
|
|
17
17
|
|
|
@@ -23,7 +23,7 @@ Los puntos de entrada `/tw` publican código fuente copiado y sin compilar desde
|
|
|
23
23
|
|
|
24
24
|
`/tw` importa el propio Tailwind, así que sustituye a tu `@import "tailwindcss"` en lugar de sumarse a él: con los dos, el Preflight de Tailwind se emite dos veces. Todos los demás puntos de entrada `/tw/*` esperan que tu import vaya primero; consulta [Usar un punto de entrada específico](#usar-un-punto-de-entrada-específico).
|
|
25
25
|
|
|
26
|
-
Tailwind CSS v4 escanea tu proyecto automáticamente: la mayoría de los proyectos no necesita nada más que el import anterior. Las rutas de `@source` se resuelven respecto al archivo CSS que las declara, no respecto a la raíz de tu proyecto, así que aquí `./src` significa "el `src/` que está junto a esta hoja de estilos"; ajústalo según dónde esté realmente tu hoja de estilos global. Añade `@source` solo para el markup al que el escaneo automático de Tailwind no llega por sí solo: una ruta excluida por defecto (incluida en `.gitignore`, o dentro de `node_modules`, por ejemplo una librería de componentes externa) o, en un monorepo, una que está fuera del árbol de directorios de este archivo. Apúntalo al markup de tu aplicación, no a este paquete:
|
|
26
|
+
Tailwind CSS v4 escanea tu proyecto automáticamente: la mayoría de los proyectos no necesita nada más que el import anterior. Las rutas de `@source` se resuelven respecto al archivo CSS que las declara, no respecto a la raíz de tu proyecto, así que aquí `./src` significa "el `src/` que está junto a esta hoja de estilos"; ajústalo según dónde esté realmente tu hoja de estilos global. Añade `@source` solo para el markup al que el escaneo automático de Tailwind no llega por sí solo: una ruta excluida por defecto (incluida en `.gitignore`, o dentro de `node_modules`, por ejemplo una librería de componentes externa) o, en un monorepo, una que está fuera del árbol de directorios de este archivo. Apúntalo al markup de tu aplicación, no a este paquete: el código fuente del paquete nombra cada clase que define, así que escanearlo las emite todas, las usen tus páginas o no.
|
|
27
27
|
|
|
28
28
|
## Añadir estéticas
|
|
29
29
|
|
|
@@ -47,6 +47,71 @@ A diferencia de `/tw`, los puntos de entrada específicos y `/tw/native` no impo
|
|
|
47
47
|
@import "@codenhub/styles/tw/button";
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
+
## Construir tus propios componentes con `@apply`
|
|
51
|
+
|
|
52
|
+
En `/tw`, cada componente, helper y clase de eje es una utilidad de Tailwind. Eso incluye las intenciones (`neutral`, `primary`, `secondary`, `success`, `warning`, `destructive`, `info`), la presentación (`solid`, `soft`, `ghost`, `edged`, `edgeless`), la elevación (`flat`, `raised`, `floating`), los patrones de esquina (`cut-diagonal`, `cut-diagonal-reverse`) y los tamaños (`sm`, `lg`). Así, una clase tuya puede llevar una receta completa:
|
|
53
|
+
|
|
54
|
+
```css
|
|
55
|
+
@import "@codenhub/styles/tw";
|
|
56
|
+
|
|
57
|
+
@utility btn-save {
|
|
58
|
+
@apply btn primary soft sm;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@utility btn-danger {
|
|
62
|
+
@apply btn destructive md:lg dark:solid;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```html
|
|
67
|
+
<button class="btn-save" type="submit">Guardar</button>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- **Un componente aplicado se comporta como la clase.** `btn-save` reacciona al hover, se presiona, recibe el foco y sigue a una estética igual que `class="btn primary soft sm"`.
|
|
71
|
+
- **Las variantes funcionan.** `hover:primary`, `md:lg` y `dark:solid` aplican una clase de eje bajo esa condición, en tu marcado o dentro de `@apply`.
|
|
72
|
+
- **Escribe tu clase como `@utility`.** Así se queda en la capa `utilities`, y tus demás utilidades en el mismo elemento le siguen ganando. Una regla simple `.btn-save { @apply … }` también funciona, pero queda sin capa, así que lo que aplica gana a todas las utilidades del elemento; [Personalización → Helpers de composición](../usage/customizing.md#helpers-de-composición) tiene los detalles.
|
|
73
|
+
- **Los modificadores también se aplican.** Los modificadores de un componente, como `.tight` en `.stack`, `.icon` en `.btn` o `.interactive` en `.card`, también son utilidades, así que `@apply stack tight`, `@apply btn icon pill` y `md:tight` funcionan. El estado deshabilitado es la excepción: sigue siendo un atributo o la clase `.disabled` en el marcado.
|
|
74
|
+
- **Tu utilidad gana a los valores internos de un componente.** `p-0 text-center` en una celda de `.data-table`, `text-sm` en un `.label` y `px-8` en un `.btn.sm` se aplican todos.
|
|
75
|
+
|
|
76
|
+
[Preajustes](../usage/presets.md) compara esto con las demás formas de definir un aspecto una sola vez.
|
|
77
|
+
|
|
78
|
+
## Prescindir de la paleta de Tailwind
|
|
79
|
+
|
|
80
|
+
`/tw` se construye sobre el tema por defecto de Tailwind, así que las utilidades de su paleta, como `bg-red-500`, siguen disponibles. Si tu diseño usa solo los tokens del paquete, borra los tonos que no usas:
|
|
81
|
+
|
|
82
|
+
```css
|
|
83
|
+
@import "@codenhub/styles/tw";
|
|
84
|
+
|
|
85
|
+
@theme {
|
|
86
|
+
--color-red-*: initial;
|
|
87
|
+
--color-orange-*: initial;
|
|
88
|
+
--color-yellow-*: initial;
|
|
89
|
+
--color-lime-*: initial;
|
|
90
|
+
--color-green-*: initial;
|
|
91
|
+
--color-teal-*: initial;
|
|
92
|
+
--color-cyan-*: initial;
|
|
93
|
+
--color-sky-*: initial;
|
|
94
|
+
--color-blue-*: initial;
|
|
95
|
+
--color-violet-*: initial;
|
|
96
|
+
--color-purple-*: initial;
|
|
97
|
+
--color-fuchsia-*: initial;
|
|
98
|
+
--color-pink-*: initial;
|
|
99
|
+
--color-slate-*: initial;
|
|
100
|
+
--color-gray-*: initial;
|
|
101
|
+
--color-zinc-*: initial;
|
|
102
|
+
--color-stone-*: initial;
|
|
103
|
+
--color-black: initial;
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Los colores propios del paquete no cambian, y puedes seguir añadiendo colores tuyos en el mismo bloque.
|
|
108
|
+
|
|
109
|
+
El bloque deja fuera `neutral`, `emerald`, `amber`, `rose`, `indigo` y `white` a propósito: el tema construye sus colores a partir de ellos.
|
|
110
|
+
|
|
111
|
+
- **No borres todo el espacio de nombres.** `--color-*: initial` quita también los colores semánticos del paquete, y el build se detiene con un error como `Cannot apply unknown utility class`.
|
|
112
|
+
- **No borres una escala que lee el tema.** Borrar `--color-emerald-*` compila sin error, pero los colores de éxito construidos con ella se pierden.
|
|
113
|
+
- **No borres los espacios de nombres de tipo, fuente o espaciado.** Los componentes aplican las utilidades `text-*` y `font-*` de Tailwind y su función `--spacing()`, así que `--text-*: initial`, `--font-*: initial`, `--spacing: initial` o `--*: initial` detiene la compilación con `Cannot apply unknown utility class` o `The --spacing(…) function requires that the --spacing theme variable exists`. Sobrescribe valores sueltos, como `--text-sm`. Borrar `--radius-*` es seguro.
|
|
114
|
+
|
|
50
115
|
## Solución de problemas
|
|
51
116
|
|
|
52
117
|
**Las clases no producen ningún estilo**
|
|
@@ -63,11 +128,17 @@ A diferencia de `/tw`, los puntos de entrada específicos y `/tw/native` no impo
|
|
|
63
128
|
|
|
64
129
|
**Una clase construida en tiempo de ejecución no tiene estilo**
|
|
65
130
|
|
|
66
|
-
- **Qué ha pasado:** `<button class="btn primary">` tiene estilo, pero un botón cuya
|
|
67
|
-
- **Por qué:** Tailwind
|
|
68
|
-
- **Solución:** escribe
|
|
131
|
+
- **Qué ha pasado:** `<button class="btn primary">` tiene estilo, pero un botón cuya clase viene de una variable, como `"btn " + variant`, o de contenido de un CMS, no.
|
|
132
|
+
- **Por qué:** Tailwind emite solo las clases que encuentra escritas completas en los archivos que escanea. Eso vale también para las clases de componente del paquete: un build con `/tw` emite `.alert` solo si `alert` aparece en algún lugar que escanea, lo que limita la hoja de estilos a lo que usan tus páginas. Las clases de intención, de presentación, de elevación, de esquina y de tamaño, como `.primary`, `.soft` y `.sm`, también son utilidades, así que les pasa lo mismo. Las clases de estética, como `.glass`, son CSS plano y se emiten siempre. Un nombre armado en tiempo de ejecución nunca aparece completo en un archivo, así que el escaneo no lo ve.
|
|
133
|
+
- **Solución:** escribe cada nombre de clase completo en algún lugar que Tailwind escanee, por ejemplo en un objeto de consulta (`{ save: "btn primary", remove: "btn destructive" }`), o enumera en tu hoja de estilos los nombres que tu código o tu contenido pueden producir:
|
|
134
|
+
|
|
135
|
+
```css
|
|
136
|
+
@import "@codenhub/styles/tw";
|
|
137
|
+
|
|
138
|
+
@source inline("btn alert badge primary destructive soft");
|
|
139
|
+
```
|
|
69
140
|
|
|
70
|
-
Todos los puntos de entrada `/tw` requieren Tailwind CSS 4.3.2 o posterior, por debajo de 5
|
|
141
|
+
Todos los puntos de entrada `/tw` requieren Tailwind CSS 4.3.2 o posterior, por debajo de 5 (`>=4.3.2 <5`).
|
|
71
142
|
|
|
72
143
|
## La variante `dark:`
|
|
73
144
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Sin bundler
|
|
3
|
-
description: Enlazar las hojas de estilos compiladas desde HTML simple, Rails, Django o cualquier aplicación renderizada en el servidor.
|
|
3
|
+
description: Enlazar las hojas de estilos compiladas desde HTML simple, Rails, Laravel, Django o cualquier aplicación renderizada en el servidor, y el build por línea de comandos.
|
|
4
4
|
order: 6
|
|
5
|
-
source:
|
|
5
|
+
source: ca6e2fe1c1b8c2404b90d9a1bd77b25b7e124f82
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Sin bundler
|
|
@@ -11,7 +11,10 @@ Las hojas de estilos compiladas son CSS terminado: cada una es un único archivo
|
|
|
11
11
|
|
|
12
12
|
Lo que necesita una herramienta de build es el _nombre_ del import. `@import "@codenhub/styles"` nombra un paquete, y encontrar el archivo que hay detrás de ese nombre, `node_modules/@codenhub/styles/dist/index.css`, lo hacen herramientas que conocen Node, como Vite, webpack o la CLI de Tailwind, que leen el mapa `exports` del paquete. Un navegador no: resuelve la URL de un `@import` respecto a la hoja de estilos que lo contiene y un `<link href>` respecto a la página, así que un nombre de paquete sin más se convierte en una petición a una ruta que no existe. Sin bundler, enlaza el archivo por su ruta.
|
|
13
13
|
|
|
14
|
-
Los puntos de entrada `/tw` son código fuente de Tailwind y necesitan un build de Tailwind. `/tw/aesthetics` es la excepción, CSS simple sin nada que Tailwind tenga que procesar, pero sin bundler enlaza en su lugar los archivos compilados de `dist/aesthetics/`, como se muestra abajo. Esta página
|
|
14
|
+
Los puntos de entrada `/tw` son código fuente de Tailwind y necesitan un build de Tailwind. `/tw/aesthetics` es la excepción, CSS simple sin nada que Tailwind tenga que procesar, pero sin bundler enlaza en su lugar los archivos compilados de `dist/aesthetics/`, como se muestra abajo. Esta página es para una página que no tiene un build de CSS con Node.js: HTML simple, Rails, Laravel, Django o cualquier aplicación renderizada en el servidor. Hay dos caminos:
|
|
15
|
+
|
|
16
|
+
1. **Enlazar la hoja de estilos compilada.** No necesita más que archivos estáticos. Envías todas las clases, las usen tus páginas o no.
|
|
17
|
+
2. **Generar una hoja de estilos con el comando `chs build` del paquete.** Escanea tus plantillas y escribe una hoja de estilos con solo las clases que usan. Consulta [Generar solo las clases que usas](#generar-solo-las-clases-que-usas).
|
|
15
18
|
|
|
16
19
|
## Qué archivo enlazar
|
|
17
20
|
|
|
@@ -27,14 +30,17 @@ Cada ruta de import compilada es un archivo en la carpeta `dist/` del paquete:
|
|
|
27
30
|
| `@codenhub/styles/aesthetics` | `dist/aesthetics/index.css` |
|
|
28
31
|
| `@codenhub/styles/aesthetics/*` | `dist/aesthetics/<name>.css`, como `dist/aesthetics/pixel.css` |
|
|
29
32
|
|
|
30
|
-
Enlaza
|
|
33
|
+
Enlaza un solo archivo base, no varios, porque se solapan, y las estéticas que uses. Su orden no importa, porque cada archivo declara las [capas de cascada](../setup.md#capas-de-cascada) antes de usar alguna. [Configuración inicial → Todos los puntos de entrada](../setup.md#todos-los-puntos-de-entrada) explica qué contiene cada uno.
|
|
31
34
|
|
|
32
35
|
## Desde un CDN
|
|
33
36
|
|
|
34
37
|
jsDelivr y unpkg sirven todos los archivos de cada versión publicada en npm, así que una página puede enlazar uno sin instalar nada:
|
|
35
38
|
|
|
36
39
|
```html
|
|
37
|
-
<
|
|
40
|
+
<head>
|
|
41
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.9.0/dist/index.css" />
|
|
42
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.9.0/dist/aesthetics/pixel.css" />
|
|
43
|
+
</head>
|
|
38
44
|
```
|
|
39
45
|
|
|
40
46
|
Pon la versión exacta en la URL. Sin ella, el CDN sirve la última versión, y por debajo de 1.0 una versión menor puede renombrar o eliminar una clase; consulta [Versionado](../index.md#versionado).
|
|
@@ -80,6 +86,8 @@ Después enlázala desde el layout, por su ruta dentro de esa carpeta:
|
|
|
80
86
|
|
|
81
87
|
Apunta la ruta a `node_modules/@codenhub` y no directamente a `dist/`. Propshaft sirve los archivos por su ruta dentro de cada carpeta de assets, así que añadir `dist/` directamente publicaría un `index.css` suelto que choca con cualquier `index.css` tuyo.
|
|
82
88
|
|
|
89
|
+
Los archivos que enlazas están en `dist/`, que contiene CSS terminado sin `@import` que resolver, más un `index.d.ts` vacío para TypeScript y el comando `chs build` con los archivos que lee. El código fuente de Tailwind vive en `tw/`, fuera de `dist/`, así que un pipeline estático que sirve `dist/` o le añade huellas no encuentra ningún `@import` que no pueda resolver.
|
|
90
|
+
|
|
83
91
|
### Django
|
|
84
92
|
|
|
85
93
|
Añade la carpeta a `STATICFILES_DIRS` con un prefijo, que mantiene sus nombres de archivo separados de tus propios archivos estáticos:
|
|
@@ -96,10 +104,154 @@ STATICFILES_DIRS = [
|
|
|
96
104
|
<link rel="stylesheet" href="{% static 'codenhub-styles/index.css' %}" />
|
|
97
105
|
```
|
|
98
106
|
|
|
107
|
+
Apunta el prefijo a `dist`, no a la carpeta del paquete. `dist/` contiene CSS terminado sin `@import` que resolver, más un `index.d.ts` vacío para TypeScript y el comando `chs build` con los archivos que lee, que el almacenamiento copia tal cual, así que `collectstatic` también funciona con `ManifestStaticFilesStorage`, que añade una huella a cada archivo y reescribe las referencias que contiene. La carpeta del paquete también contiene el código fuente de Tailwind en `tw/`, cuyas líneas `@import "tailwindcss/..."` ese almacenamiento no puede resolver.
|
|
108
|
+
|
|
99
109
|
### Laravel
|
|
100
110
|
|
|
101
111
|
Una aplicación Laravel usa Vite por defecto, así que tiene un bundler: importa el paquete desde `resources/css/app.css` como en [Configuración inicial → Importar la hoja de estilos](../setup.md#importar-la-hoja-de-estilos), y carga ese archivo con la directiva `@vite` como de costumbre.
|
|
102
112
|
|
|
113
|
+
## Generar solo las clases que usas
|
|
114
|
+
|
|
115
|
+
El paquete trae un comando, `chs`, que lee tus plantillas en busca de nombres de clase y escribe una sola hoja de estilos minificada con solo las clases de StyleKit que usan. Una página que usa un botón recibe alrededor de una octava parte de la hoja de estilos completa; el tamaño exacto depende de las clases que uses, porque cada componente trae las reglas compartidas de las que depende.
|
|
116
|
+
|
|
117
|
+
El comando también sirve con un bundler. Un proyecto cuyo bundler no ejecuta Tailwind, como un build simple con Vite o webpack, puede escribir la hoja de estilos entre sus fuentes, `--output src/stylekit.css`, e importar ese archivo donde importaría `@codenhub/styles`. Un proyecto que usa Tailwind CSS v4 obtiene la misma reducción con el [punto de entrada de código fuente](./tailwind.md) y no necesita el comando.
|
|
118
|
+
|
|
119
|
+
Necesita Node.js 24 o posterior en la máquina que genera el CSS, sea tu portátil, un job de CI o un paso del despliegue, y nada más: el paquete es toda la instalación, sin Tailwind y sin configuración. Instálalo como dependencia de desarrollo desde la raíz de tu proyecto; npm crea un `package.json` si no tienes uno:
|
|
120
|
+
|
|
121
|
+
```sh
|
|
122
|
+
npm install --save-dev @codenhub/styles
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
La hoja de estilos que escribe el comando es CSS simple, así que los servidores que sirven tu sitio no necesitan ni Node.js ni el paquete. Añade el build a los scripts de tu `package.json`, donde el comando instalado está en el path con su nombre:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"scripts": {
|
|
130
|
+
"build:css": "chs build --content \"app/views/**/*.erb\" --output public/stylekit.css"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Después ejecútalo desde la raíz de tu proyecto:
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
npm run build:css
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Para ejecutarlo una sola vez sin un script, llámalo por el nombre del paquete:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
npx @codenhub/styles build --content "app/views/**/*.erb" --output public/stylekit.css
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
No escribas `npx chs`. `chs` es el nombre del comando dentro de este paquete, pero npm también tiene un paquete sin relación llamado `chs`, y `npx chs` ejecuta ese en cualquier carpeta donde este paquete no esté instalado.
|
|
148
|
+
|
|
149
|
+
Si todo va bien, el comando imprime una línea: la ruta absoluta que escribió y el tamaño del archivo en bytes:
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
/home/you/shop/public/stylekit.css 24497 bytes
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Enlaza ese archivo desde tu layout como cualquier hoja de estilos estática.
|
|
156
|
+
|
|
157
|
+
### Vistas de Rails
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
"build:css": "chs build --content \"app/views/**/*.erb\" --content \"app/helpers/**/*.rb\" --output public/stylekit.css"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```erb
|
|
164
|
+
<%# app/views/layouts/application.html.erb %>
|
|
165
|
+
<link rel="stylesheet" href="/stylekit.css" />
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Vistas Blade de Laravel
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
"build:css": "chs build --content \"resources/views/**/*.blade.php\" --output public/css/stylekit.css"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```blade
|
|
175
|
+
{{-- resources/views/layouts/app.blade.php --}}
|
|
176
|
+
<link rel="stylesheet" href="{{ asset('css/stylekit.css') }}" />
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Plantillas de Django
|
|
180
|
+
|
|
181
|
+
Un proyecto Django guarda las plantillas en una carpeta `templates/` del proyecto, en la carpeta `templates/` de cada app, o en ambas. Pasa un `--content` por cada lugar donde estén las tuyas, y deja fuera los que no uses, porque un glob que no coincide con nada hace fallar el build:
|
|
182
|
+
|
|
183
|
+
```json
|
|
184
|
+
"build:css": "chs build --content \"templates/**/*.html\" --content \"shop/templates/**/*.html\" --output static/stylekit.css"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
```django
|
|
188
|
+
{% load static %}
|
|
189
|
+
<link rel="stylesheet" href="{% static 'stylekit.css' %}" />
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Escribe la salida en una carpeta incluida en `STATICFILES_DIRS`, aquí `static/`, para que `collectstatic` la recoja. La configuración de arriba solo incluye la carpeta del paquete, así que añade `BASE_DIR / "static"` a esa lista si tu proyecto aún no la tiene.
|
|
193
|
+
|
|
194
|
+
### Opciones
|
|
195
|
+
|
|
196
|
+
- `--content <glob>`, o `-c <glob>`, indica los archivos en los que buscar nombres de clase. Es obligatorio y se puede repetir: pásalo una vez por glob, y el build lee todos los archivos que coincidan con alguno. Un glob relativo se resuelve respecto a la carpeta desde la que ejecutas el comando, así que ejecútalo desde la raíz de tu proyecto; un glob absoluto se usa tal cual. `**` coincide con cualquier número de carpetas, y `{rb,erb}` con cualquiera de las dos extensiones. Sirve cualquier archivo de texto, tenga la extensión que tenga. Cada glob tiene que coincidir con al menos un archivo, o el build falla y lo nombra, así que una errata no puede publicar una hoja de estilos vacía. Los archivos que excluye tu `.gitignore` se leen igualmente cuando un glob coincide con ellos, y no se lee nada fuera de tus globs.
|
|
197
|
+
- Pon cada glob entre comillas, con `\"` dentro de un script de `package.json`. Sin comillas, tu shell puede expandir el glob a una lista de archivos antes de que el comando lo vea, y solo el primer archivo cuenta como valor de `--content`. Cuando eso deja nombres de archivo sobrantes, el build los rechaza en lugar de leer en silencio menos de lo que querías; cuando el glob coincidió con un solo archivo, el build lee solo ese archivo y nada de lo que tus plantillas añadan más adelante.
|
|
198
|
+
- `--output <file>`, o `-o <file>`, es la hoja de estilos que se escribe. Es obligatorio. Una ruta relativa se resuelve respecto a la carpeta desde la que ejecutas el comando, las carpetas padre que falten se crean, y un archivo existente se reemplaza.
|
|
199
|
+
- `--aesthetic <name>` añade una de las [estéticas](../usage/aesthetics.md): `neobrutalism`, `glass`, `pixel`, `chunky-tile`, `cyber` o `sketch`. Repítelo para más de una; nombrar una dos veces la incluye una sola vez. Las estéticas se piden explícitamente porque el build no puede saber por tus plantillas cuál quieres: cada una se añade cuando la pides, sin sus reglas para las clases que tus plantillas no usan, y no se incluye ninguna cuando no lo haces.
|
|
200
|
+
- `--no-minify` escribe en su lugar CSS legible e indentado. Sirve para leer lo que generó el build; en producción sirve el archivo minificado.
|
|
201
|
+
- `--help` imprime el uso, con las estéticas que trae esta versión. `--version` imprime la versión del paquete. Ninguno de los dos genera nada, y ambos terminan con estado 0.
|
|
202
|
+
|
|
203
|
+
La salida siempre contiene el tema, sus design tokens como propiedades personalizadas de CSS, el reset, las reglas base de las que dependen todos los componentes y las clases que una página recibe en tiempo de ejecución en lugar de desde una plantilla, como `.theme-dark`. Encima va cada clase de StyleKit que usan tus plantillas. La salida se construye a partir de la hoja de estilos completa, no de `/native`, así que no incluye los mapeos sin clases. Un build cuyas plantillas nombran todas las clases escribe la hoja de estilos completa, byte a byte.
|
|
204
|
+
|
|
205
|
+
### Cómo se encuentran las clases
|
|
206
|
+
|
|
207
|
+
El build no ejecuta tus plantillas. Lee como texto simple cada archivo que coincide con tus globs de `--content`, recoge cada palabra que podría ser un nombre de clase y escribe las reglas de las palabras que son clases de StyleKit. Tailwind CSS también lee el contenido así.
|
|
208
|
+
|
|
209
|
+
Una clase tiene que aparecer en un archivo como una palabra completa. `class="btn primary"`, `class: "btn primary"` y `classes = ["btn", "primary"]` funcionan, y también una clase escrita antes o después de dos puntos, como en `class:primary={isPrimary}` de Svelte o en `btn: true` de un hash de Ruby. Una palabra que solo parece una clase también cuenta: un comentario que dice "card" añade todas las reglas de la tarjeta a la hoja de estilos, lo que agranda el archivo y no cambia nada en la página.
|
|
210
|
+
|
|
211
|
+
Un nombre de clase que tu código arma al renderizar nunca aparece completo en ningún archivo, así que el build no puede encontrarlo. En `class="btn <%= @order.priority %>"`, `btn` se encuentra, pero la intención es lo que contenga `priority` al renderizar; si es `destructive`, el botón se renderiza sin su rojo. Hay dos salidas:
|
|
212
|
+
|
|
213
|
+
- **Escribe los nombres de clase completos.** Asigna cada valor a un nombre de clase completo en un archivo que el build lea, como `{ "urgent" => "destructive", "normal" => "neutral" }.fetch(@order.priority)` en un helper.
|
|
214
|
+
- **Enuméralos en un archivo de safelist.** Un archivo de texto simple con un nombre de clase por línea, añadido con su propio `--content`, como `--content config/stylekit-classes.txt`. Guárdalo junto al código que arma los nombres de clase, para que quien cambie uno vea el otro.
|
|
215
|
+
|
|
216
|
+
### Variantes
|
|
217
|
+
|
|
218
|
+
Una clase de intención, presentación o modificador puede llevar uno de diez prefijos, escritos como en Tailwind: `sm:`, `md:`, `lg:`, `xl:` y `2xl:` la aplican a partir de ese breakpoint, `hover:`, `focus:`, `focus-visible:` y `active:` mientras el elemento está en ese estado, y `dark:` allí donde se aplica el tema oscuro, como describe [Temas → La variante dark:](../usage/theming.md#la-variante-dark). `md:lg` hace grande un botón a partir del breakpoint `md`, y `hover:primary` le da la intención primary al pasar el cursor:
|
|
219
|
+
|
|
220
|
+
```html
|
|
221
|
+
<button class="btn sm md:lg ghost hover:soft">Save</button>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Eso abarca las intenciones como `primary` y `destructive`, las clases de relleno y de borde como `soft` y `edged`, y los modificadores como `sm`, `lg`, `raised`, `pill`, `tight` y `ruled`. `disabled` no lleva ninguno: es un estado en el que está el elemento, así que escríbelo como atributo o como clase. Las clases de componente como `btn` y `card`, y los helpers de texto y de layout, no llevan prefijo.
|
|
225
|
+
|
|
226
|
+
Cada prefijo es una copia fija de esas clases, incluida en el paquete, así que la lista recoge los más comunes y no todos los de Tailwind. El comando no apila prefijos, como en `md:hover:primary`, ni ofrece otros, como `print:` o `group-hover:`. Una clase así no recibe estilo, y el elemento se renderiza sin ella.
|
|
227
|
+
|
|
228
|
+
### Lo que no hace
|
|
229
|
+
|
|
230
|
+
- **No incluye utilidades de Tailwind.** `flex`, `mt-4`, `text-red-500` y el resto de Tailwind no son clases de StyleKit, así que el build las deja fuera. Para el layout, los propios [helpers de layout](../usage/content-and-layout.md) de StyleKit están en el build como cualquier otra clase. Un proyecto que quiere las utilidades de Tailwind, sus demás variantes o prefijos apilados ejecuta Tailwind por su cuenta e importa el [punto de entrada de código fuente](./tailwind.md), que da las tres cosas.
|
|
231
|
+
- **No tiene modo watch.** Genera una vez y termina. Vuelve a ejecutarlo después de cambiar una plantilla, desde un script o desde un observador de archivos que ya tengan tu framework o tu editor. Una clase que la hoja de estilos todavía no tiene deja su elemento sin estilo hasta el siguiente build.
|
|
232
|
+
- **No tiene archivo de configuración ni CSS propio.** No puedes añadir tus propios valores de `@theme`, definiciones de `@utility` ni plugins. Para cambiar el aspecto, sobrescribe las propiedades personalizadas en una hoja de estilos tuya cargada después de esta, como describe [Personalización](../usage/customizing.md).
|
|
233
|
+
- **No tiene otros comandos.** `build` es el único; `--help` y `--version` son los únicos flags que funcionan sin él.
|
|
234
|
+
|
|
235
|
+
### En un despliegue
|
|
236
|
+
|
|
237
|
+
Genera la hoja de estilos antes del paso que recoge o añade huella a tus assets, como `rails assets:precompile`, `php artisan optimize` o `python manage.py collectstatic`. Puedes hacer commit de la salida, de modo que los servidores no necesitan Node.js en absoluto, a cambio de un archivo generado que alguien tiene que acordarse de regenerar; o generarla en el despliegue, de modo que la máquina de build necesita Node.js 24 o posterior.
|
|
238
|
+
|
|
239
|
+
Fija la versión. Por debajo de 1.0 una versión menor puede renombrar o eliminar una clase, así que el mismo comando puede escribir otra hoja de estilos con una versión más nueva. La salida no depende de nada más que de la versión del paquete y de tus plantillas, así que haz commit de `package.json` y del lockfile que escribe npm, e instala con `npm ci` en la máquina de build, para que cada build use la versión que probaste.
|
|
240
|
+
|
|
241
|
+
### Cuando el build falla
|
|
242
|
+
|
|
243
|
+
Cada fallo imprime una línea que empieza por `chs:` en la salida de error estándar y termina con estado 1, sin escribir el archivo de salida, así que un script de despliegue se detiene en lugar de publicar una hoja de estilos desactualizada o vacía. La línea dice qué salió mal y qué hacer:
|
|
244
|
+
|
|
245
|
+
- **`missing --content` o `missing --output`.** Añade la que nombra. Un `--output` vacío o con solo espacios cuenta como ausente.
|
|
246
|
+
- **`--content "<glob>" matches no file in <folder>`.** Suele ser una errata en la ruta, un comando ejecutado desde una carpeta distinta de la raíz de tu proyecto, o un glob de un lugar que tu proyecto no usa. Generar a partir de nada escribiría una hoja de estilos sin clases de componente, y el sitio perdería sus estilos sin avisar.
|
|
247
|
+
- **`unexpected argument "<file>"`.** Casi siempre es un glob de `--content` sin comillas, que tu shell expandió a una lista de archivos. Pon el glob entre comillas.
|
|
248
|
+
- **`unknown option "<flag>"`.** Una errata, o una opción de otra herramienta, como `--watch` o `--config`. `--help` enumera las opciones.
|
|
249
|
+
- **`option "<flag>" is missing its value or does not take one`.** Un flag que lleva valor fue lo último de la línea, o se le dio un valor a `--no-minify`, como en `--no-minify=true`.
|
|
250
|
+
- **`unknown aesthetic "<name>"; choose from ...`.** Elige uno de los nombres de la lista. Van en minúsculas y con guion, como `chunky-tile`.
|
|
251
|
+
- **`missing command` o `unknown command "<name>"`.** La primera palabra después de `chs` tiene que ser `build`.
|
|
252
|
+
- **`this command needs Node.js 24 or newer`.** Actualiza Node.js en la máquina que genera el CSS.
|
|
253
|
+
- **`cannot write the stylesheet: <reason>`.** `<reason>` es el propio mensaje de Node.js. `EISDIR` significa que `--output` nombra una carpeta existente, así que nombra un archivo dentro de ella; `EACCES` o `EPERM` significa que no puedes escribir ahí.
|
|
254
|
+
|
|
103
255
|
## Comprobar que funciona
|
|
104
256
|
|
|
105
257
|
Renderiza un elemento con estilo, como en [Integración → Comprobar que funciona](./index.md#comprobar-que-funciona):
|
package/docs/es/setup.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: Configuración inicial
|
|
3
3
|
description: Instala el paquete, elige entre CSS compilado o código fuente de Tailwind y renderiza la estructura base de la página de ajustes.
|
|
4
4
|
order: 1
|
|
5
|
-
source:
|
|
5
|
+
source: 01adaabea85fb4d04139c86d9ad693e23c321d04
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Configuración inicial
|
|
@@ -44,9 +44,11 @@ La hoja de estilos completa incluye el reset, los tokens, los helpers de layout
|
|
|
44
44
|
|
|
45
45
|
Elige uno:
|
|
46
46
|
|
|
47
|
-
- **CSS compilado** (`@codenhub/styles`, el del ejemplo anterior). Úsalo salvo que tengas un motivo para no hacerlo. Funciona cualquier bundler que resuelva imports de CSS desde paquetes, como Vite, webpack o la CLI de Tailwind.
|
|
47
|
+
- **CSS compilado** (`@codenhub/styles`, el del ejemplo anterior). Úsalo salvo que tengas un motivo para no hacerlo. Funciona cualquier bundler que resuelva imports de CSS desde paquetes, como Vite, webpack o la CLI de Tailwind. Incluye todas las clases, las usen tus páginas o no.
|
|
48
48
|
- **Código fuente de Tailwind CSS v4** (`@codenhub/styles/tw`). Úsalo cuando tu proyecto ya usa Tailwind v4. Tu build compila el paquete junto con tus propias utilidades, así que obtienes una sola hoja de estilos y la variante `dark:` de Tailwind coincide con el tema del paquete. Necesita Tailwind 4.3.2 o posterior, por debajo de 5.
|
|
49
|
-
- **Sin bundler.** Enlaza el archivo compilado desde `node_modules` o desde un CDN con una etiqueta `<link
|
|
49
|
+
- **Sin bundler.** Enlaza el archivo compilado desde `node_modules` o desde un CDN con una etiqueta `<link>`; consulta [Sin bundler](./integrating/without-a-bundler.md).
|
|
50
|
+
|
|
51
|
+
Para incluir solo las clases que usan tus páginas en un proyecto que no usa Tailwind, con bundler o sin él, el comando `chs build` del paquete lee tus archivos y escribe una hoja de estilos con solo esas clases, que importas o enlazas en lugar de la compilada; consulta [Generar solo las clases que usas](./integrating/without-a-bundler.md#generar-solo-las-clases-que-usas).
|
|
50
52
|
|
|
51
53
|
Tu framework puede necesitar su propia configuración, como dónde va la hoja de estilos global en Next.js o en Astro. Cada una de estas guías cubre una configuración y después te devuelve aquí:
|
|
52
54
|
|
|
@@ -71,16 +73,18 @@ El orden de los dos imports no importa, porque cada punto de entrada declara las
|
|
|
71
73
|
## Requisitos
|
|
72
74
|
|
|
73
75
|
- **Navegadores:** Chrome 123, Safari 17.5 o Firefox 128 y posteriores. Los colores usan `light-dark()` y `color-scheme` (Firefox 120). `.input-group` lee el estado inválido y deshabilitado de un control anidado con `:has()` (Firefox 121). Las clases de elevación registran una propiedad que no se hereda con `@property` (Firefox 128); sin ella, una clase de elevación también llegaría a los elementos sin clase que contiene.
|
|
74
|
-
- **Herramientas:** un `@import` con un nombre de paquete necesita una herramienta que resuelva imports de CSS desde paquetes
|
|
75
|
-
- **Tailwind:** 4.3.2 o posterior, por debajo de 5, solo para los puntos de entrada de código fuente `/tw`. Es una peer dependency opcional, así que los puntos de entrada compilados
|
|
76
|
+
- **Herramientas:** un `@import` con un nombre de paquete necesita una herramienta que resuelva imports de CSS desde paquetes a través de su mapa `exports`. Si no tienes una, enlaza el archivo compilado por su ruta o desde un CDN; consulta [Sin bundler](./integrating/without-a-bundler.md). Dos herramientas habituales necesitan un pequeño ajuste, descrito en [Integración → Bundlers que necesitan un empujón](./integrating/index.md#bundlers-que-necesitan-un-empujón): Parcel, y PostCSS con `postcss-import`.
|
|
77
|
+
- **Tailwind:** 4.3.2 o posterior, por debajo de 5, solo para los puntos de entrada de código fuente `/tw`. Es una peer dependency opcional, así que ni los puntos de entrada compilados ni el comando `chs build` la instalan.
|
|
78
|
+
- **Node.js:** 24 o posterior en la máquina que ejecuta el comando `chs build`. Las hojas de estilos no lo necesitan, pero el paquete lo declara como su engine, así que Yarn 1, y npm con `engine-strict`, rechazan la instalación en un Node.js anterior.
|
|
76
79
|
- **Tu aplicación:** el paquete no tiene JavaScript. El HTML semántico, ARIA, el comportamiento de teclado, la gestión del foco, la validación y los anuncios son cosa tuya; consulta [Accesibilidad](./accessibility.md).
|
|
77
80
|
|
|
78
81
|
## Cuando nada tiene estilo
|
|
79
82
|
|
|
80
83
|
- **Falta el import o no se carga de forma global.** Las clases no hacen nada hasta que la hoja de estilos está en la página. Impórtala una vez en una hoja de estilos que cargue cada página, no en un componente que puede no renderizarse.
|
|
81
|
-
- **El nombre del paquete no se resuelve.** Un `<link>` simple o una herramienta sin resolución de paquetes CSS no puede leer `@import "@codenhub/styles"`. Enlaza `node_modules/@codenhub/styles/dist/index.css`, o sigue [Sin bundler](./integrating/without-a-bundler.md).
|
|
84
|
+
- **El nombre del paquete no se resuelve.** Un `<link>` simple o una herramienta sin resolución de paquetes CSS no puede leer `@import "@codenhub/styles"`. Enlaza `node_modules/@codenhub/styles/dist/index.css`, o sigue [Sin bundler](./integrating/without-a-bundler.md). Parcel y `postcss-import` lo resuelven con un pequeño cambio; consulta [Integración → Bundlers que necesitan un empujón](./integrating/index.md#bundlers-que-necesitan-un-empujón).
|
|
82
85
|
- **Se carga una ruta `/tw` sin Tailwind.** Los archivos `/tw` son código fuente de Tailwind: contienen `@theme`, `@utility` y `@apply`, que los navegadores no entienden. Tu build de Tailwind tiene que compilarlos; consulta [Tailwind CSS v4](./integrating/tailwind.md).
|
|
83
|
-
- **
|
|
86
|
+
- **Un punto de entrada `/tw` específico se importa sin Tailwind antes.** `@codenhub/styles/tw/button` y los demás archivos de un solo componente no importan Tailwind. Importados solos, compilan sin error pero no producen ninguna regla de componente. Pon `@import "tailwindcss";` antes; consulta [Tailwind CSS v4 → Usar un punto de entrada específico](./integrating/tailwind.md#usar-un-punto-de-entrada-específico).
|
|
87
|
+
- **Falta una clase construida en tiempo de ejecución (solo con código fuente de Tailwind).** Tailwind genera una clase de utilidad, también los componentes del paquete como `.btn`, solo cuando encuentra su nombre en tus archivos fuente. Un nombre armado a partir de strings, como `` `btn ${tone}` ``, es invisible para ese escaneo. Escribe los nombres de clase completos, o enuméralos como se describe en [Tailwind CSS v4](./integrating/tailwind.md).
|
|
84
88
|
|
|
85
89
|
### CSS crítico en línea
|
|
86
90
|
|
|
@@ -90,9 +94,9 @@ Eso no se aplica a los archivos `/tw`. Son código fuente de Tailwind, no CSS te
|
|
|
90
94
|
|
|
91
95
|
## Todos los puntos de entrada
|
|
92
96
|
|
|
93
|
-
Los puntos de entrada compilados son CSS terminado. Los puntos de entrada `/tw` publican el código fuente sin compilar desde `
|
|
97
|
+
Los puntos de entrada compilados son CSS terminado. Los puntos de entrada `/tw` publican el código fuente sin compilar desde `tw/`, junto a `dist/`, que un build de Tailwind v4 tiene que procesar. Un punto de entrada `/tw` de un solo componente incluye los tokens del tema, así que sus clases no necesitan nada más del paquete, pero necesita `@import "tailwindcss";` antes; consulta [Tailwind CSS v4 → Usar un punto de entrada específico](./integrating/tailwind.md#usar-un-punto-de-entrada-específico).
|
|
94
98
|
|
|
95
|
-
Cada ruta de import resuelve el mismo archivo con las condiciones de exportación `style`, `import` y `default`. Un import de CSS es un efecto secundario, así que asegúrate de que tu bundler no lo descarte como no usado.
|
|
99
|
+
Cada ruta de import resuelve el mismo archivo con las condiciones de exportación `style`, `import` y `default`. Antes va una condición `types` que apunta a una declaración vacía, así que TypeScript acepta un import por efecto secundario como `import "@codenhub/styles";` con `noUncheckedSideEffectImports`, que TypeScript 6 activa por defecto. Un import de CSS es un efecto secundario, así que asegúrate de que tu bundler no lo descarte como no usado.
|
|
96
100
|
|
|
97
101
|
| Ruta de import | Qué contiene y qué cambia |
|
|
98
102
|
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -100,7 +104,7 @@ Cada ruta de import resuelve el mismo archivo con las condiciones de exportació
|
|
|
100
104
|
| `@codenhub/styles/theme` | Tokens compilados y las clases de intención, presentación, elevación y patrón de esquinas. Define las propiedades del tema raíz y los selectores claro y oscuro. Sin reset ni componentes. |
|
|
101
105
|
| `@codenhub/styles/palette` | Custom properties `--palette-*` generadas: el color de relleno, de texto y de borde de cada combinación de intención y presentación como valor plano, más los colores planos `border`, `surface` y `text`. Para código que no puede usar el propio paquete; consulta [Personalización → Paleta generada](./usage/customizing.md#paleta-generada). |
|
|
102
106
|
| `@codenhub/styles/components` | Tokens compilados, helpers de tipografía y todas las clases de componentes. Cada componente lleva su propia regla de movimiento reducido, y la corrección para `<dialog>` cerrado viene con `.card`. Sin reset, sin helpers de layout ni de contenido, sin mapeo sin clases. |
|
|
103
|
-
| `@codenhub/styles/native` |
|
|
107
|
+
| `@codenhub/styles/native` | Tokens, tipografía, helpers de layout y de contenido, componentes y el reset del paquete compilados, más el [mapeo sin clases](#html-sin-clases) para elementos HTML simples. Sin el Preflight de Tailwind. Aplica el reset y selectores de elemento amplios. |
|
|
104
108
|
| `@codenhub/styles/aesthetics` | Las seis estéticas compiladas, `.neobrutalism`, `.glass`, `.pixel`, `.chunky-tile`, `.cyber` y `.sketch`, cada una con su clase `-solo`. No trae tokens ni componentes propios; impórtalo en cualquier orden. |
|
|
105
109
|
| `@codenhub/styles/aesthetics/*` | Una estética compilada y su clase solo: `/neobrutalism`, `/glass`, `/pixel`, `/chunky-tile`, `/cyber` o `/sketch`. |
|
|
106
110
|
| `@codenhub/styles/tw` | Versión en código fuente de la hoja de estilos completa. Importa el propio Tailwind y después el tema, la tipografía, los helpers, los componentes y el reset. Las mismas reglas globales. |
|
|
@@ -112,9 +116,9 @@ Cada ruta de import resuelve el mismo archivo con las condiciones de exportació
|
|
|
112
116
|
| `@codenhub/styles/tw/feedback` | Tema en código fuente más `.alert`, `.badge`, `.skeleton` y `.progress`, con sus animaciones. |
|
|
113
117
|
| `@codenhub/styles/tw/tooltip` | Tema en código fuente más las clases de tooltip. |
|
|
114
118
|
| `@codenhub/styles/tw/reset` | Tema, helpers de tipografía y el reset global en código fuente. Cambia la raíz, el body y los elementos, y define reglas de selección, movimiento, foco, barras de desplazamiento y colores forzados. |
|
|
115
|
-
| `@codenhub/styles/tw/native` | Versión en código fuente de `/native`: todo, más el reset y el mapeo sin clases. El efecto global más amplio.
|
|
119
|
+
| `@codenhub/styles/tw/native` | Versión en código fuente de `/native`: todo salvo el Preflight de Tailwind, más el reset del paquete y el mapeo sin clases. El efecto global más amplio. |
|
|
116
120
|
| `@codenhub/styles/tw/typography` | Tema en código fuente más los helpers de tipografía. Define los selectores de tema; sin reset, sin mapeo sin clases. |
|
|
117
|
-
| `@codenhub/styles/tw/utilities` | Tema y tipografía en código fuente más los helpers de layout y de contenido.
|
|
121
|
+
| `@codenhub/styles/tw/utilities` | Tema y tipografía en código fuente más los helpers de layout y de contenido. |
|
|
118
122
|
| `@codenhub/styles/tw/aesthetics` | Las seis estéticas en código fuente. `/tw/aesthetics/neobrutalism`, `/glass`, `/pixel`, `/chunky-tile`, `/cyber` y `/sketch` publican una cada uno. CSS simple, sin efectos secundarios de tema ni de reset. |
|
|
119
123
|
| `@codenhub/styles/package.json` | El manifiesto del paquete, como JSON. Para herramientas que leen la versión instalada o el mapa de exportaciones; no es una hoja de estilos. |
|
|
120
124
|
|
|
@@ -122,19 +126,21 @@ No importes en un mismo build dos puntos de entrada que se solapan, como `@coden
|
|
|
122
126
|
|
|
123
127
|
## HTML sin clases
|
|
124
128
|
|
|
125
|
-
`@codenhub/styles/native` da estilo a elementos HTML simples sin ninguna clase, para contenido al que no puedes añadir clases, como la salida de Markdown o el cuerpo de un CMS.
|
|
126
|
-
|
|
127
|
-
| Elemento | Con el estilo de
|
|
128
|
-
| --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
129
|
-
| `h1`, `h2`, `h3`, `h4`, `h5` y `h6` | `.text-title-lg`, `.text-title`, `.text-title-sm`, `.text-label-lg`, `.text-label`
|
|
130
|
-
| `
|
|
131
|
-
| `table` | `.data-table`
|
|
132
|
-
| `kbd`, `blockquote`, `q`, `code`, `pre` | `.kbd`, `.quote`, `.quote-inline`, `.code`, `.pre`
|
|
133
|
-
| `hr` | `.divider`
|
|
134
|
-
| `input` sin tipo, o con tipo `text`, `number`, `email`, `password`, `url`, `tel`, `search`, `month`, `week`, `time`, `date`, `datetime-local` | `.ipt`
|
|
135
|
-
| `textarea`, `select` | `.textarea`, `.select`
|
|
136
|
-
| `input type="checkbox"`, `input type="radio"` | `.checkbox`, `.radio`
|
|
137
|
-
| `button`, `input type="button"`, `type="submit"`, `type="reset"` | `.btn`
|
|
129
|
+
`@codenhub/styles/native` da estilo a elementos HTML simples sin ninguna clase, para contenido al que no puedes añadir clases, como la salida de Markdown o el cuerpo de un CMS. Contiene todo lo que contiene la hoja de estilos completa salvo el Preflight de Tailwind, el reset de los valores por defecto del navegador que `@codenhub/styles` trae con Tailwind. El reset propio del paquete sí está: el box sizing, el fondo, el color del texto y la fuente de la raíz, el reset de márgenes de títulos, párrafos y listas, los colores de selección, los anillos de foco y la regla de movimiento reducido. Después añade este mapeo:
|
|
130
|
+
|
|
131
|
+
| Elemento | Con el estilo de |
|
|
132
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
133
|
+
| `h1`, `h2`, `h3`, `h4`, `h5` y `h6` | `.text-title-lg`, `.text-title`, `.text-title-sm`, `.text-label-lg`, `.text-label` |
|
|
134
|
+
| `body` | `.text-body`, heredado por los párrafos, los elementos de lista y el resto del texto |
|
|
135
|
+
| `table` | `.data-table` |
|
|
136
|
+
| `kbd`, `blockquote`, `q`, `code`, `pre` | `.kbd`, `.quote`, `.quote-inline`, `.code`, `.pre` |
|
|
137
|
+
| `hr` | `.divider` |
|
|
138
|
+
| `input` sin tipo, o con tipo `text`, `number`, `email`, `password`, `url`, `tel`, `search`, `month`, `week`, `time`, `date`, `datetime-local` | `.ipt` |
|
|
139
|
+
| `textarea`, `select` | `.textarea`, `.select` |
|
|
140
|
+
| `input type="checkbox"`, `input type="radio"` | `.checkbox`, `.radio` |
|
|
141
|
+
| `button`, `input type="button"`, `type="submit"`, `type="reset"` | `.btn` |
|
|
142
|
+
| `dialog` | `.card.floating`: oculto hasta que se abre, y entonces una tarjeta flotante centrada |
|
|
143
|
+
| `progress` | `.progress`, lleno hasta su `value`; sin `value` es el barrido indeterminado |
|
|
138
144
|
|
|
139
145
|
```html
|
|
140
146
|
<article>
|
|
@@ -152,7 +158,9 @@ Lo que no hace:
|
|
|
152
158
|
- **Algunos tipos de input se quedan como están:** `file`, `range`, `color` y `hidden` conservan el aspecto propio del navegador.
|
|
153
159
|
- **Sin switch.** Un checkbox con `role="switch"` se sigue pintando como checkbox; el mapeo no lee roles. A una página que necesita switches le conviene más la hoja de estilos basada en clases.
|
|
154
160
|
- **Los enlaces mantienen el texto que los rodea.** Un enlace dentro de un encabezado conserva el tamaño del encabezado; un enlace nunca recibe estilo de botón.
|
|
155
|
-
-
|
|
161
|
+
- **El texto de cuerpo se define una sola vez.** `p` y `li` toman su tipografía del elemento en el que están, así que un contenedor que define su propio tamaño, peso o espaciado entre letras lo aplica al Markdown que contiene. Los controles conservan su propio espaciado entre letras: un botón, un badge y un campo de texto quedan en `normal`, sea lo que sea que definan la página o el contenedor.
|
|
162
|
+
- **El comportamiento nativo sigue siendo nativo.** Un `<dialog>` se abre con `show()` o `showModal()` como siempre; el mapeo solo lo pinta. El barrido de un `<progress>` se detiene con la preferencia de movimiento reducido, y en colores forzados la barra usa los colores del sistema.
|
|
163
|
+
- **`pre code` no recibe estilo doble.** El código dentro de un `pre` pierde el chip que dibujaría por sí solo: fondo, relleno, borde, sombra, brillo y recorte.
|
|
156
164
|
|
|
157
165
|
El mapeo es global: se da estilo a cada elemento de la página que coincida, incluidos los elementos dentro de widgets de terceros. Está en la [capa de cascada](#capas-de-cascada) `base`, así que cualquier clase lo supera. Añade una clase de intención o de presentación a un elemento mapeado, como `<button class="destructive">`, y se aplica igual que en `.btn`.
|
|
158
166
|
|
|
@@ -160,18 +168,19 @@ El mapeo es global: se da estilo a cada elemento de la página que coincida, inc
|
|
|
160
168
|
|
|
161
169
|
Cada punto de entrada pone su CSS en las cuatro capas de cascada de Tailwind y declara su orden antes de usar alguna, así que el resultado no depende de qué archivo se carga primero:
|
|
162
170
|
|
|
163
|
-
| Capa | Contiene
|
|
164
|
-
| ------------ |
|
|
165
|
-
| `theme` | El tema de Tailwind, los tokens base, los selectores de tema y `/palette`.
|
|
166
|
-
| `base` | El reset y los estilos de elementos sin clases.
|
|
167
|
-
| `components` | Las clases de intención
|
|
168
|
-
| `utilities` | Todos los componentes (`.btn`, `.card`, `.ipt`, etc.), junto a tus propias utilidades de Tailwind.
|
|
169
|
-
| _sin capa_ | Las sobrescrituras de colores forzados y de movimiento reducido, la corrección para `<dialog>` cerrado y las clases `-solo`.
|
|
171
|
+
| Capa | Contiene |
|
|
172
|
+
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
173
|
+
| `theme` | El tema de Tailwind, los tokens base, los selectores de tema y `/palette`. |
|
|
174
|
+
| `base` | El reset y los estilos de elementos sin clases. |
|
|
175
|
+
| `components` | Las clases de estética y los valores de intención neutros de los que parte cada componente. |
|
|
176
|
+
| `utilities` | Todos los componentes (`.btn`, `.card`, `.ipt`, etc.), junto a tus propias utilidades de Tailwind. Las clases de intención, presentación, borde, elevación, esquina y tamaño están en `utilities.families`, una subcapa que pierde frente a cualquier otra regla de `utilities`. |
|
|
177
|
+
| _sin capa_ | Las sobrescrituras de colores forzados y de movimiento reducido, la corrección para `<dialog>` cerrado y las clases `-solo`. |
|
|
170
178
|
|
|
171
179
|
Lo que eso significa cuando escribes tu propio CSS:
|
|
172
180
|
|
|
173
|
-
- **Tu utilidad o tu CSS sin capa supera a una clase de intención, presentación, elevación o estética** en el mismo elemento. `[--ui-fill:50%]` en un botón `.solid`, `font-serif` en una región `.pixel` o `.my-card { --ui-radius: 0 }` en tu propia hoja de estilos se aplican.
|
|
181
|
+
- **Tu utilidad o tu CSS sin capa supera a una clase de intención, presentación, elevación o estética** en el mismo elemento. `[--ui-fill:50%]` en un botón `.solid`, `font-serif` en una región `.pixel` o `.my-card { --ui-radius-surface: 0 }` en tu propia hoja de estilos se aplican.
|
|
174
182
|
- **Un componente y tu utilidad comparten la capa `utilities`.** Entre ellos decide la especificidad y después el orden en el código, como entre dos utilidades cualesquiera. Tu CSS sin capa siempre supera a un componente.
|
|
183
|
+
- **Tu utilidad supera los valores por defecto internos de un componente.** `p-0 text-center` en una celda de tabla, `text-sm` en una `.label` o `px-8` en un `.btn.sm` se aplican, porque el componente escribe esos valores por defecto de modo que gane una clase en el elemento.
|
|
175
184
|
- **El estado supera a tu intención.** Un campo con `aria-invalid="true"` sigue siendo destructivo aunque lleve una utilidad de intención.
|
|
176
185
|
- **Las clases `-solo` no tienen capa a propósito**, para que superen los estilos con capa o de especificidad cero de un componente de terceros. Una regla sin capa más específica, o una igual de específica que se cargue después, sigue superándolas; consulta [Clases solo](./usage/solo.md).
|
|
177
186
|
|