@codenhub/styles 0.8.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 -9
- package/README.md +8 -8
- package/README.pt-BR.md +9 -9
- 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 +1 -1
- 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 +231 -62
- package/dist/components.css +49 -1
- package/dist/index.css +49 -1
- package/dist/native.css +49 -1
- package/dist/purge/classes.json +1 -0
- package/dist/purge/index.css +50 -0
- package/dist/theme.css +1 -1
- package/docs/changelog/0.8.0.md +1 -1
- package/docs/changelog/0.9.0.md +40 -0
- package/docs/changelog/index.md +1 -0
- package/docs/es/index.md +2 -2
- package/docs/es/integrating/tailwind.md +2 -1
- package/docs/es/integrating/without-a-bundler.md +60 -31
- package/docs/es/setup.md +4 -3
- package/docs/es/usage/aesthetics.md +2 -2
- package/docs/es/usage/content-and-layout.md +3 -1
- package/docs/es/usage/customizing.md +30 -16
- package/docs/es/usage/forms.md +2 -2
- package/docs/es/usage/index.md +2 -2
- package/docs/es/usage/solo.md +2 -2
- package/docs/es/usage/theming.md +2 -2
- package/docs/es/usage/tooltips.md +2 -2
- package/docs/index.md +1 -1
- package/docs/integrating/tailwind.md +1 -0
- package/docs/integrating/without-a-bundler.md +59 -30
- package/docs/pt-BR/index.md +2 -2
- package/docs/pt-BR/integrating/tailwind.md +2 -1
- package/docs/pt-BR/integrating/without-a-bundler.md +60 -31
- package/docs/pt-BR/setup.md +4 -3
- package/docs/pt-BR/usage/aesthetics.md +2 -2
- package/docs/pt-BR/usage/content-and-layout.md +3 -1
- package/docs/pt-BR/usage/customizing.md +30 -16
- package/docs/pt-BR/usage/forms.md +2 -2
- package/docs/pt-BR/usage/index.md +2 -2
- package/docs/pt-BR/usage/solo.md +2 -2
- package/docs/pt-BR/usage/theming.md +2 -2
- package/docs/pt-BR/usage/tooltips.md +2 -2
- package/docs/setup.md +3 -2
- package/docs/usage/aesthetics.md +1 -1
- package/docs/usage/content-and-layout.md +2 -0
- package/docs/usage/customizing.md +29 -15
- package/docs/usage/forms.md +1 -1
- package/docs/usage/index.md +1 -1
- package/docs/usage/solo.md +1 -1
- package/docs/usage/theming.md +1 -1
- package/docs/usage/tooltips.md +1 -1
- package/llms-full.txt +145 -61
- package/llms.txt +3 -2
- package/package.json +12 -10
- package/tw/aesthetics/chunky-tile.css +4 -1
- package/tw/aesthetics/cyber.css +4 -1
- package/tw/aesthetics/glass.css +5 -0
- package/tw/aesthetics/neobrutalism.css +4 -1
- package/tw/aesthetics/pixel.css +3 -0
- package/tw/aesthetics/sketch.css +18 -0
- package/tw/box.css +21 -15
- package/tw/components/button.rules.css +1 -1
- package/tw/components/feedback.rules.css +22 -3
- package/tw/components/form.rules.css +65 -35
- package/tw/components/surface.rules.css +8 -5
- package/tw/components/tooltip.rules.css +39 -34
- package/tw/elevation.css +8 -8
- package/tw/native.css +4 -1
- package/tw/theme.css +1 -1
- package/tw/utilities/content.css +74 -54
- package/tw/utilities/layout.css +7 -5
package/docs/es/usage/index.md
CHANGED
|
@@ -3,7 +3,7 @@ title: Visión general
|
|
|
3
3
|
description: Las guías que terminan la pantalla de ajustes y, después, las páginas de consulta con cada clase, token y valor por defecto.
|
|
4
4
|
group: Uso
|
|
5
5
|
order: 4
|
|
6
|
-
source:
|
|
6
|
+
source: 07b651854dab2e401235175521adae9360b33df2
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Uso
|
|
@@ -23,7 +23,7 @@ Guías, en orden:
|
|
|
23
23
|
Páginas de consulta:
|
|
24
24
|
|
|
25
25
|
- [Composición](./composing.md): las reglas completas para combinar intención, presentación y elevación, los valores por defecto de cada componente y qué ejes lee cada uno.
|
|
26
|
-
- [Personalización](./customizing.md): tokens de presentación y de material, controles de las estéticas, las
|
|
26
|
+
- [Personalización](./customizing.md): tokens de presentación y de material, controles de las estéticas, las variables públicas de componente, la paleta generada y los helpers de composición para construir tus propios componentes.
|
|
27
27
|
- [Contenido y layout](./content-and-layout.md): todos los helpers de layout, la escala tipográfica, tarjetas y paneles, tablas, citas, código y teclas.
|
|
28
28
|
|
|
29
29
|
Cuando la pantalla funcione:
|
package/docs/es/usage/solo.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: Clases solo
|
|
3
3
|
description: Cómo pintar una estética sobre un elemento de otra librería, como un toast o un diálogo, y qué lee e ignora una clase solo.
|
|
4
4
|
order: 7
|
|
5
|
-
source:
|
|
5
|
+
source: ed6b271ec9d3eb83dfc5f098f587d8fc0d5e2ad3
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Clases solo
|
|
@@ -77,7 +77,7 @@ Sin ninguna de esas clases, una clase solo pinta solo el material (borde, esquin
|
|
|
77
77
|
## Cómo gana y cuándo se mueve
|
|
78
78
|
|
|
79
79
|
- **Gana a los estilos de la otra librería.** Las reglas no tienen capa y tienen un solo nivel de clase, así que ganan a las reglas con capa de un componente, y a las de especificidad cero, se carguen donde se carguen. Una regla ajena sin capa que sea más específica, o igual de específica y posterior en la página, sigue ganando. La otra cara es que una utilidad de Tailwind en el mismo elemento, como `rounded-none`, pierde frente a la clase solo: ajústalo mediante sus controles.
|
|
80
|
-
- **Solo pulsa una acción.** Neobrutalism, chunky tile y cyber pulsan un `button`, un `a[href]`, un `[role="button"]`, un `summary` o un `input` de tipo botón que
|
|
80
|
+
- **Solo pulsa una acción.** Neobrutalism, chunky tile y cyber pulsan un `button`, un `a[href]`, un `[role="button"]`, un `summary` o un `input` de tipo botón salvo que lleve el atributo `disabled`, `.disabled`, `aria-disabled="true"` o `data-disabled`. Solo el atributo deshabilita un botón; la pulsación ignora también los otros tres, ya que una página los usa para marcar uno que trata como deshabilitado. Todo lo demás se queda quieto, así que un toast no se hunde al hacer clic. La etiqueta más gruesa de chunky tile sigue la misma regla.
|
|
81
81
|
- **No toca el movimiento de un contenedor.** Solo una acción toma la `transition` de la pulsación, y la pulsación mueve el elemento mediante las propiedades `translate` y `scale`, no `transform`. Un toast conserva sus propias transiciones y su propio `transform`. En una acción, la `transition` de la pulsación reemplaza la que tuviera el elemento.
|
|
82
82
|
- **El movimiento reducido conserva la pulsación y quita su movimiento.** Con `prefers-reduced-motion: reduce`, neobrutalism, chunky tile y cyber siguen pulsando, pero al instante: el elemento cae en su sombra o su barra, o se encoge, sin recorrer la distancia.
|
|
83
83
|
|
package/docs/es/usage/theming.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: Temas
|
|
3
3
|
description: Modo claro y oscuro, reemplazar la paleta con los colores de marca, definir una intención propia, y cada token de color, intención, base y fuente con su valor por defecto.
|
|
4
4
|
order: 5
|
|
5
|
-
source:
|
|
5
|
+
source: b54ac4e817f35fb4f5f32b7f7022061f9658147a
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Temas
|
|
@@ -67,7 +67,7 @@ Con los puntos de entrada de código fuente de Tailwind (`/tw`), el paquete reem
|
|
|
67
67
|
|
|
68
68
|
Se diferencia de los tokens en un caso: un tema explícito anidado dentro del opuesto. Un elemento `.light` dentro de uno `.dark` tiene tokens claros, porque gana el `color-scheme` más cercano. Pero `dark:` coincide por selector, y `.dark *` coincide con cada elemento dentro de `.dark`, así que una utilidad `dark:` dentro de ese elemento `.light` se sigue aplicando. Si una página usa a la vez tokens y utilidades `dark:`, no anides temas opuestos.
|
|
69
69
|
|
|
70
|
-
Los puntos de entrada compilados no definen una variante `dark:`; no tienen un build de Tailwind en el que definirla.
|
|
70
|
+
Los puntos de entrada compilados no definen una variante `dark:`; no tienen un build de Tailwind en el que definirla. El [comando `chs build`](../integrating/without-a-bundler.md#variantes) sí ofrece `dark:`, con los mismos selectores, solo en las clases de intención, presentación y modificador.
|
|
71
71
|
|
|
72
72
|
## Cambiar el color de marca
|
|
73
73
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: Tooltips
|
|
3
3
|
description: Ayuda de campo que se abre con hover y con foco, cómo conectarla para los lectores de pantalla y la tecla Escape, y dónde queda recortado un tooltip.
|
|
4
4
|
order: 4
|
|
5
|
-
source:
|
|
5
|
+
source: ac236b423d466ebd014b7738dd076ace2cfc50a3
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Tooltips
|
|
@@ -76,7 +76,7 @@ WCAG 1.4.13 pide tres cosas al contenido que aparece con hover o con foco. El pa
|
|
|
76
76
|
- **Persistente.** Sigue abierta hasta que el puntero y el foco se van.
|
|
77
77
|
- **Descartable.** El usuario tiene que poder cerrarla sin mover el puntero ni el foco, normalmente con Escape. El CSS no puede escuchar una tecla, así que esta parte es tuya.
|
|
78
78
|
|
|
79
|
-
Para cambiar el tiempo de permanencia, define `--tooltip-linger` en el elemento `.tooltip
|
|
79
|
+
Para cambiar el tiempo de permanencia, define `--tooltip-linger` en el elemento `.tooltip` o en cualquier elemento que lo rodee, por ejemplo `style="--tooltip-linger: 500ms"`. Mantenlo lo bastante largo para que el puntero llegue a la burbuja. `--tooltip-gap` define de la misma forma el espacio entre el disparador y la burbuja. Ambas son [variables públicas de componente](./customizing.md#variables-de-componente).
|
|
80
80
|
|
|
81
81
|
Para Escape, escribe `data-state="closed"` en `.tooltip`: oculta la burbuja aunque tenga hover o foco. Quita el atributo solo cuando tanto el puntero como el foco hayan salido del tooltip, para que el siguiente hover o foco lo vuelva a abrir. Si lo quitas antes, mientras el disparador todavía tiene el foco, el mensaje vuelve a aparecer sin que el usuario haga nada.
|
|
82
82
|
|
package/docs/index.md
CHANGED
|
@@ -78,7 +78,7 @@ The package is below 1.0 and follows the [semantic versioning rule for 0.x relea
|
|
|
78
78
|
- A minor release, such as 0.7.0 to 0.8.0, may break. It can rename or remove a class or token, or change a default. Every break is listed under **Changed** or **Removed** on that version's [changelog](./changelog/index.md) page, with what to use instead.
|
|
79
79
|
- A patch release, such as 0.7.0 to 0.7.1, never breaks.
|
|
80
80
|
|
|
81
|
-
npm's default range for a new dependency, `^0.
|
|
81
|
+
npm's default range for a new dependency, `^0.9.0`, already accepts patches only, because below 1.0 a caret range does not cross into the next minor version. Read the changelog before raising it. When you link a file from a CDN, put the exact version in the URL; see [Without a bundler](./integrating/without-a-bundler.md).
|
|
82
82
|
|
|
83
83
|
Breaks are not softened with aliases because the model is still settling, and keeping each old name beside its replacement would grow the surface every release. A rename or removal usually costs one find-and-replace when you upgrade; a changed default may need your own CSS retuned.
|
|
84
84
|
|
|
@@ -109,6 +109,7 @@ The block leaves out `neutral`, `emerald`, `amber`, `rose`, `indigo`, and `white
|
|
|
109
109
|
|
|
110
110
|
- **Do not clear the whole namespace.** `--color-*: initial` also removes the package's semantic colors, and the build stops with an error such as `Cannot apply unknown utility class`.
|
|
111
111
|
- **Do not clear a ramp the theme reads.** Clearing `--color-emerald-*` builds without an error, but the success colors made from it are lost.
|
|
112
|
+
- **Do not clear the type, font, or spacing namespaces.** The components apply Tailwind's `text-*` and `font-*` utilities and its `--spacing()` function, so `--text-*: initial`, `--font-*: initial`, `--spacing: initial`, or `--*: initial` stops the build with `Cannot apply unknown utility class` or `The --spacing(…) function requires that the --spacing theme variable exists`. Override single values instead, such as `--text-sm`. Clearing `--radius-*` is safe.
|
|
112
113
|
|
|
113
114
|
## Troubleshooting
|
|
114
115
|
|
|
@@ -12,8 +12,8 @@ What needs a build tool is the import _name_. `@import "@codenhub/styles"` names
|
|
|
12
12
|
|
|
13
13
|
The `/tw` entrypoints are Tailwind source and need a Tailwind build. `/tw/aesthetics` is the exception, plain CSS with nothing for Tailwind to process, but without a bundler link the compiled `dist/aesthetics/` files instead, as below. This page is for a page that has no Node.js CSS build: plain HTML, Rails, Laravel, Django, or any server-rendered app. There are two paths:
|
|
14
14
|
|
|
15
|
-
1. **Link the compiled stylesheet.**
|
|
16
|
-
2. **Build a stylesheet with the package's `build` command.** It scans your templates and writes a stylesheet with only the classes they use. See [Build only the classes you use](#build-only-the-classes-you-use).
|
|
15
|
+
1. **Link the compiled stylesheet.** It needs nothing but static files. You ship every class, whether your pages use it or not.
|
|
16
|
+
2. **Build a stylesheet with the package's `chs build` command.** It scans your templates and writes a stylesheet with only the classes they use. See [Build only the classes you use](#build-only-the-classes-you-use).
|
|
17
17
|
|
|
18
18
|
## Which file to link
|
|
19
19
|
|
|
@@ -37,8 +37,8 @@ jsDelivr and unpkg serve every file of every published npm version, so a page ca
|
|
|
37
37
|
|
|
38
38
|
```html
|
|
39
39
|
<head>
|
|
40
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.
|
|
41
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.
|
|
40
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.9.0/dist/index.css" />
|
|
41
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.9.0/dist/aesthetics/pixel.css" />
|
|
42
42
|
</head>
|
|
43
43
|
```
|
|
44
44
|
|
|
@@ -85,7 +85,7 @@ Then link it from the layout, by its path below that folder:
|
|
|
85
85
|
|
|
86
86
|
Point the path at `node_modules/@codenhub` rather than at `dist/` itself. Propshaft serves files by their path below each asset folder, so adding `dist/` directly would publish a bare `index.css` that collides with any `index.css` of your own.
|
|
87
87
|
|
|
88
|
-
The files you link are in `dist/`, which holds
|
|
88
|
+
The files you link are in `dist/`, which holds finished CSS with no `@import` to resolve, plus an empty `index.d.ts` for TypeScript and the `chs build` command with the files it reads. The Tailwind source lives in `tw/`, outside `dist/`, so a static pipeline that serves or fingerprints `dist/` meets no `@import` it cannot resolve.
|
|
89
89
|
|
|
90
90
|
### Django
|
|
91
91
|
|
|
@@ -103,7 +103,7 @@ STATICFILES_DIRS = [
|
|
|
103
103
|
<link rel="stylesheet" href="{% static 'codenhub-styles/index.css' %}" />
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
Point the prefix at `dist`, not at the package folder. `dist/` holds
|
|
106
|
+
Point the prefix at `dist`, not at the package folder. `dist/` holds finished CSS with no `@import` to resolve, plus an empty `index.d.ts` for TypeScript and the `chs build` command with the files it reads, which the storage copies as they are, so `collectstatic` also works with `ManifestStaticFilesStorage`, which fingerprints each file and rewrites the references inside it. The package folder also holds the Tailwind source in `tw/`, whose `@import "tailwindcss/..."` lines that storage cannot resolve.
|
|
107
107
|
|
|
108
108
|
### Laravel
|
|
109
109
|
|
|
@@ -111,34 +111,52 @@ A Laravel app runs Vite by default, so it has a bundler: import the package from
|
|
|
111
111
|
|
|
112
112
|
## Build only the classes you use
|
|
113
113
|
|
|
114
|
-
The package carries a command, `
|
|
114
|
+
The package carries a command, `chs`, that reads your templates for class names and writes one minified stylesheet with only the StyleKit classes they use. A page that uses one button gets about an eighth of the full stylesheet; the exact size depends on which classes you use, since each component brings the shared rules it relies on.
|
|
115
115
|
|
|
116
116
|
The command works with a bundler too. A project whose bundler does not run Tailwind, such as a plain Vite or webpack build, can write the stylesheet into its sources, `--output src/stylekit.css`, and import that file where it would import `@codenhub/styles`. A project that runs Tailwind CSS v4 gets the same trimming from the [source entrypoint](./tailwind.md) and does not need the command.
|
|
117
117
|
|
|
118
|
-
It needs Node.js 24 or newer on the machine that builds the CSS, whether that is your laptop, a CI job, or a deploy step
|
|
118
|
+
It needs Node.js 24 or newer on the machine that builds the CSS, whether that is your laptop, a CI job, or a deploy step, and nothing else: the package is the whole install, with no Tailwind and no configuration. Install it as a development dependency from your project root; npm creates a `package.json` if you have none:
|
|
119
119
|
|
|
120
120
|
```sh
|
|
121
|
-
npm install --save-dev @codenhub/styles
|
|
121
|
+
npm install --save-dev @codenhub/styles
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
-
The stylesheet the command writes is plain CSS, so the servers that serve your site need neither Node.js nor
|
|
124
|
+
The stylesheet the command writes is plain CSS, so the servers that serve your site need neither Node.js nor the package. Add the build to your `package.json` scripts, where the installed command is on the path by its name:
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"scripts": {
|
|
129
|
+
"build:css": "chs build --content \"app/views/**/*.erb\" --output public/stylekit.css"
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Then run it from your project root:
|
|
125
135
|
|
|
126
136
|
```sh
|
|
127
|
-
|
|
137
|
+
npm run build:css
|
|
128
138
|
```
|
|
129
139
|
|
|
140
|
+
To run it once without a script, call it through the package name:
|
|
141
|
+
|
|
142
|
+
```sh
|
|
143
|
+
npx @codenhub/styles build --content "app/views/**/*.erb" --output public/stylekit.css
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Do not type `npx chs`. `chs` is the command's name inside this package, but npm also has an unrelated package called `chs`, and `npx chs` runs that one in any folder where this package is not installed.
|
|
147
|
+
|
|
130
148
|
On success the command prints one line, the absolute path it wrote and the file's size in bytes:
|
|
131
149
|
|
|
132
150
|
```text
|
|
133
|
-
/home/you/shop/public/stylekit.css
|
|
151
|
+
/home/you/shop/public/stylekit.css 24497 bytes
|
|
134
152
|
```
|
|
135
153
|
|
|
136
154
|
Link that file from your layout like any static stylesheet.
|
|
137
155
|
|
|
138
156
|
### Rails views
|
|
139
157
|
|
|
140
|
-
```
|
|
141
|
-
|
|
158
|
+
```json
|
|
159
|
+
"build:css": "chs build --content \"app/views/**/*.erb\" --content \"app/helpers/**/*.rb\" --output public/stylekit.css"
|
|
142
160
|
```
|
|
143
161
|
|
|
144
162
|
```erb
|
|
@@ -148,8 +166,8 @@ npx codenhub-styles build --content "app/views/**/*.erb" --content "app/helpers/
|
|
|
148
166
|
|
|
149
167
|
### Laravel Blade views
|
|
150
168
|
|
|
151
|
-
```
|
|
152
|
-
|
|
169
|
+
```json
|
|
170
|
+
"build:css": "chs build --content \"resources/views/**/*.blade.php\" --output public/css/stylekit.css"
|
|
153
171
|
```
|
|
154
172
|
|
|
155
173
|
```blade
|
|
@@ -161,8 +179,8 @@ npx codenhub-styles build --content "resources/views/**/*.blade.php" --output pu
|
|
|
161
179
|
|
|
162
180
|
A Django project keeps templates in a project-level `templates/` folder, in each app's own `templates/` folder, or both. Give one `--content` for each place yours live, and leave out any place you do not use, since a glob that matches nothing fails the build:
|
|
163
181
|
|
|
164
|
-
```
|
|
165
|
-
|
|
182
|
+
```json
|
|
183
|
+
"build:css": "chs build --content \"templates/**/*.html\" --content \"shop/templates/**/*.html\" --output static/stylekit.css"
|
|
166
184
|
```
|
|
167
185
|
|
|
168
186
|
```django
|
|
@@ -175,41 +193,53 @@ Write the output into a folder listed in `STATICFILES_DIRS`, here `static/`, so
|
|
|
175
193
|
### Options
|
|
176
194
|
|
|
177
195
|
- `--content <glob>`, or `-c <glob>`, names the files to read for class names. It is required and repeatable: pass it once per glob, and the build reads every file any of them matches. A relative glob is resolved against the folder you run the command in, so run it from your project root; an absolute glob is used as given. `**` matches any number of folders, and `{rb,erb}` either extension. Any text file works, whatever its extension. Each glob has to match at least one file, or the build fails and names it, so a typo cannot ship an empty stylesheet. Files your `.gitignore` excludes are still read when a glob matches them, and nothing outside your globs is read.
|
|
178
|
-
- Quote every glob. Without quotes, your shell may expand the glob into a list of files before the command sees it, and only the first file counts as the `--content` value. When that leaves extra file names behind, the build rejects them rather than silently reading less than you meant; when the glob matched a single file, the build reads just that file and nothing your templates add later.
|
|
196
|
+
- Quote every glob, with `\"` inside a `package.json` script. Without quotes, your shell may expand the glob into a list of files before the command sees it, and only the first file counts as the `--content` value. When that leaves extra file names behind, the build rejects them rather than silently reading less than you meant; when the glob matched a single file, the build reads just that file and nothing your templates add later.
|
|
179
197
|
- `--output <file>`, or `-o <file>`, is the stylesheet to write. It is required. A relative path is resolved against the folder you run the command in, missing parent folders are created, and an existing file is replaced.
|
|
180
|
-
- `--aesthetic <name>` adds one of the [aesthetics](../usage/aesthetics.md): `neobrutalism`, `glass`, `pixel`, `chunky-tile`, `cyber`, or `sketch`. Repeat it for more than one; naming one twice includes it once. Aesthetics are opt-in because the build cannot tell from your templates which one you want
|
|
198
|
+
- `--aesthetic <name>` adds one of the [aesthetics](../usage/aesthetics.md): `neobrutalism`, `glass`, `pixel`, `chunky-tile`, `cyber`, or `sketch`. Repeat it for more than one; naming one twice includes it once. Aesthetics are opt-in because the build cannot tell from your templates which one you want: each is added when you ask for it, less its rules for classes your templates do not use, and none is included when you do not.
|
|
181
199
|
- `--no-minify` writes readable, indented CSS instead. Useful for reading what the build produced; serve the minified file.
|
|
182
200
|
- `--help` prints the usage, with the aesthetics this version ships. `--version` prints the package version. Both build nothing and exit with status 0.
|
|
183
201
|
|
|
184
|
-
The output always holds the theme, its design tokens as CSS custom properties, the reset,
|
|
202
|
+
The output always holds the theme, its design tokens as CSS custom properties, the reset, the base rules every component relies on, and the classes a page gets at run time rather than from a template, such as `.theme-dark`. On top of that comes each StyleKit class your templates use. The output is built from the complete stylesheet, not from `/native`, so it has no classless mappings. A build whose templates name every class writes the complete stylesheet, byte for byte.
|
|
185
203
|
|
|
186
204
|
### How classes are found
|
|
187
205
|
|
|
188
|
-
The build does not run your templates. It reads each file your `--content` globs match as plain text, collects every word that could be a class name, and writes the rules for the words that are StyleKit classes
|
|
206
|
+
The build does not run your templates. It reads each file your `--content` globs match as plain text, collects every word that could be a class name, and writes the rules for the words that are StyleKit classes. This is how Tailwind CSS reads content too.
|
|
189
207
|
|
|
190
|
-
A class has to appear in a file as one whole word. `class="btn primary"`, `class: "btn primary"`, and `classes = ["btn", "primary"]` all work
|
|
208
|
+
A class has to appear in a file as one whole word. `class="btn primary"`, `class: "btn primary"`, and `classes = ["btn", "primary"]` all work, and so does a class written before a colon or after one, as in Svelte's `class:primary={isPrimary}` or a Ruby hash's `btn: true`. A word that only looks like a class also counts: a comment that says "card" adds the card's full rules to the stylesheet, which makes the file larger and changes nothing on the page.
|
|
191
209
|
|
|
192
210
|
A class name your code assembles while rendering never appears whole in any file, so the build cannot find it. In `class="btn <%= @order.priority %>"`, `btn` is found, but the intent is whatever `priority` holds at render time; if that is `destructive`, the button renders without its red. Two ways out:
|
|
193
211
|
|
|
194
212
|
- **Write class names whole.** Map each value to a complete class name in a file the build reads, such as `{ "urgent" => "destructive", "normal" => "neutral" }.fetch(@order.priority)` in a helper.
|
|
195
213
|
- **List them in a safelist file.** A plain text file with one class name per line, added with its own `--content`, such as `--content config/stylekit-classes.txt`. Keep it next to the code that builds the class names, so whoever changes one sees the other.
|
|
196
214
|
|
|
215
|
+
### Variants
|
|
216
|
+
|
|
217
|
+
An intent, presentation, or modifier class can take one of ten prefixes, written as in Tailwind: `sm:`, `md:`, `lg:`, `xl:`, and `2xl:` apply it from that breakpoint up, `hover:`, `focus:`, `focus-visible:`, and `active:` while the element is in that state, and `dark:` wherever the dark theme applies, as [Theming → The dark: variant](../usage/theming.md#the-dark-variant) describes. `md:lg` makes a button large from the `md` breakpoint, and `hover:primary` gives it the primary intent on hover:
|
|
218
|
+
|
|
219
|
+
```html
|
|
220
|
+
<button class="btn sm md:lg ghost hover:soft">Save</button>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
That covers intents such as `primary` and `destructive`, the fill and edge classes such as `soft` and `edged`, and modifiers such as `sm`, `lg`, `raised`, `pill`, `tight`, and `ruled`. `disabled` takes none: it is a state the element is in, so write it as the attribute or the class. Component classes such as `btn` and `card`, and the text and layout helpers, take no prefix.
|
|
224
|
+
|
|
225
|
+
Each prefix is a fixed copy of those classes, built into the package, so the list is the common ones rather than all of Tailwind's. The command does not stack prefixes, as in `md:hover:primary`, and offers no other ones, such as `print:` or `group-hover:`. Such a class is not styled, and the element renders without it.
|
|
226
|
+
|
|
197
227
|
### What it does not do
|
|
198
228
|
|
|
229
|
+
- **No Tailwind utilities.** `flex`, `mt-4`, `text-red-500`, and the rest of Tailwind are not StyleKit classes, so the build leaves them out. For layout, StyleKit's own [layout helpers](../usage/content-and-layout.md) are in the build like any other class. A project that wants Tailwind's utilities, its other variants, or prefixes stacked runs Tailwind itself and imports the [source entrypoint](./tailwind.md), which gives all three.
|
|
199
230
|
- **No watch mode.** It builds once and exits. Run it again after you change a template, from a script, or from a file watcher your framework or editor already has. A class the stylesheet does not have yet leaves its element unstyled until the next build.
|
|
200
|
-
- **No configuration file and no custom CSS.** You cannot add your own `@theme` values, `@utility` definitions, or plugins. To change the look, override the custom properties in a stylesheet of your own loaded after this one, as [Customizing](../usage/customizing.md) describes.
|
|
231
|
+
- **No configuration file and no custom CSS.** You cannot add your own `@theme` values, `@utility` definitions, or plugins. To change the look, override the custom properties in a stylesheet of your own loaded after this one, as [Customizing](../usage/customizing.md) describes.
|
|
201
232
|
- **No other commands.** `build` is the only one; `--help` and `--version` are the only flags that run without it.
|
|
202
|
-
- **No Tailwind version of its own.** Each build uses the `@tailwindcss/cli` and `tailwindcss` installed in your project, within the `>=4.3.2 <5` range StyleKit supports, so your lockfile pins them.
|
|
203
233
|
|
|
204
234
|
### In a deploy
|
|
205
235
|
|
|
206
236
|
Build the stylesheet before whatever step collects or fingerprints your assets, such as `rails assets:precompile`, `php artisan optimize`, or `python manage.py collectstatic`. Either commit the output, so the servers need no Node.js at all at the cost of a generated file someone has to remember to rebuild, or build it on deploy, so the build machine needs Node.js 24 or newer.
|
|
207
237
|
|
|
208
|
-
Pin the version. Below 1.0 a minor release may rename or remove a class, so the same command can write a different stylesheet with a newer version.
|
|
238
|
+
Pin the version. Below 1.0 a minor release may rename or remove a class, so the same command can write a different stylesheet with a newer version. The output depends on nothing but the package's version and your templates, so commit `package.json` and the lockfile npm writes, and install with `npm ci` on the build machine, so every build uses the version you tested.
|
|
209
239
|
|
|
210
240
|
### When the build fails
|
|
211
241
|
|
|
212
|
-
Every failure prints one line starting with `
|
|
242
|
+
Every failure prints one line starting with `chs:` to standard error and exits with status 1, without writing the output file, so a deploy script stops instead of shipping a stale or empty stylesheet. The line says what went wrong and what to do:
|
|
213
243
|
|
|
214
244
|
- **`missing --content` or `missing --output`.** Add the one it names. An `--output` that is empty or only spaces counts as missing.
|
|
215
245
|
- **`--content "<glob>" matches no file in <folder>`.** Usually a typo in the path, a command run from another folder than your project root, or a glob for a place your project does not use. Building from nothing would write a stylesheet with no component classes, and the site would quietly lose its styling.
|
|
@@ -217,10 +247,9 @@ Every failure prints one line starting with `codenhub-styles:` to standard error
|
|
|
217
247
|
- **`unknown option "<flag>"`.** A typo, or an option from another tool, such as `--watch` or `--config`. `--help` lists the options.
|
|
218
248
|
- **`option "<flag>" is missing its value or does not take one`.** A flag that takes a value was the last thing on the line, or `--no-minify` was given one, as in `--no-minify=true`.
|
|
219
249
|
- **`unknown aesthetic "<name>"; choose from ...`.** Pick one of the names listed. They are lowercase and hyphenated, as in `chunky-tile`.
|
|
220
|
-
- **`missing command` or `unknown command "<name>"`.** The first word after `
|
|
221
|
-
- **`this command needs @tailwindcss/cli and tailwindcss, which are not installed`.** The line names whichever of the two is missing and ends with the command that installs it. Run that from your project root.
|
|
250
|
+
- **`missing command` or `unknown command "<name>"`.** The first word after `chs` has to be `build`.
|
|
222
251
|
- **`this command needs Node.js 24 or newer`.** Update Node.js on the machine that builds the CSS.
|
|
223
|
-
- **`
|
|
252
|
+
- **`cannot write the stylesheet: <reason>`.** `<reason>` is Node.js's own message. `EISDIR` means `--output` names an existing folder, so name a file inside it; `EACCES` or `EPERM` means you cannot write there.
|
|
224
253
|
|
|
225
254
|
## Verifying it worked
|
|
226
255
|
|
package/docs/pt-BR/index.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Introdução
|
|
3
3
|
description: Para que serve o @codenhub/styles, quanto ele custa e em que ordem ler esta documentação.
|
|
4
|
-
source:
|
|
4
|
+
source: 4226ac998f12fb17bed33172417919586cb6c930
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# @codenhub/styles
|
|
@@ -79,7 +79,7 @@ O pacote está abaixo da 1.0 e segue a [regra do versionamento semântico para v
|
|
|
79
79
|
- Uma versão minor, como da 0.7.0 para a 0.8.0, pode quebrar compatibilidade. Ela pode renomear ou remover uma classe ou token, ou mudar um padrão. Toda quebra é listada em **Changed** ou **Removed** na página do [changelog](../changelog/index.md) daquela versão, com o que usar no lugar.
|
|
80
80
|
- Uma versão patch, como da 0.7.0 para a 0.7.1, nunca quebra.
|
|
81
81
|
|
|
82
|
-
O range padrão do npm para uma dependência nova, `^0.
|
|
82
|
+
O range padrão do npm para uma dependência nova, `^0.9.0`, já aceita apenas patches, porque abaixo da 1.0 um range com circunflexo não avança para a próxima versão minor. Leia o changelog antes de subir esse range. Ao referenciar um arquivo de uma CDN, coloque a versão exata na URL; veja [Sem bundler](./integrating/without-a-bundler.md).
|
|
83
83
|
|
|
84
84
|
As quebras não são amenizadas com aliases porque o modelo ainda está se assentando, e manter cada nome antigo ao lado do substituto aumentaria a superfície a cada versão. Uma renomeação ou remoção costuma custar um localizar-e-substituir quando você atualiza; um padrão alterado pode exigir que você reajuste o seu próprio CSS.
|
|
85
85
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: Tailwind CSS v4
|
|
3
3
|
description: Como usar os entrypoints de código-fonte /tw num projeto com Tailwind CSS v4.
|
|
4
4
|
order: 1
|
|
5
|
-
source:
|
|
5
|
+
source: 4866b77d4cfb1655499f633fff8bf61dde2aa4bb
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Tailwind CSS v4
|
|
@@ -110,6 +110,7 @@ O bloco deixa de fora `neutral`, `emerald`, `amber`, `rose`, `indigo` e `white`
|
|
|
110
110
|
|
|
111
111
|
- **Não limpe o namespace inteiro.** `--color-*: initial` também remove as cores semânticas do pacote, e o build para com um erro como `Cannot apply unknown utility class`.
|
|
112
112
|
- **Não limpe uma escala que o tema lê.** Limpar `--color-emerald-*` compila sem erro, mas as cores de sucesso feitas com ela se perdem.
|
|
113
|
+
- **Não limpe os namespaces de tipo, fonte ou espaçamento.** Os componentes aplicam os utilitários `text-*` e `font-*` do Tailwind e a função `--spacing()` dele, então `--text-*: initial`, `--font-*: initial`, `--spacing: initial` ou `--*: initial` interrompe a compilação com `Cannot apply unknown utility class` ou `The --spacing(…) function requires that the --spacing theme variable exists`. Sobrescreva valores isolados, como `--text-sm`. Limpar `--radius-*` é seguro.
|
|
113
114
|
|
|
114
115
|
## Solução de problemas
|
|
115
116
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: Sem bundler
|
|
3
3
|
description: Como referenciar as folhas de estilos compiladas a partir de HTML puro, Rails, Laravel, Django ou qualquer aplicação renderizada no servidor, e o build por linha de comando.
|
|
4
4
|
order: 6
|
|
5
|
-
source:
|
|
5
|
+
source: ca6e2fe1c1b8c2404b90d9a1bd77b25b7e124f82
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Sem bundler
|
|
@@ -13,8 +13,8 @@ O que precisa de uma ferramenta de build é o _nome_ do import. `@import "@coden
|
|
|
13
13
|
|
|
14
14
|
Os entrypoints `/tw` são código-fonte do Tailwind e precisam de um build do Tailwind. O `/tw/aesthetics` é a exceção, CSS puro sem nada para o Tailwind processar, mas sem bundler referencie os arquivos compilados de `dist/aesthetics/`, como abaixo. Esta página é para uma página que não tem um build de CSS com Node.js: HTML puro, Rails, Laravel, Django ou qualquer aplicação renderizada no servidor. Há dois caminhos:
|
|
15
15
|
|
|
16
|
-
1. **Referencie a folha de estilos compilada.**
|
|
17
|
-
2. **Gere uma folha de estilos com o comando `build` do pacote.** Ela varre os seus templates e escreve uma folha de estilos com só as classes que eles usam. Veja [Gere só as classes que você usa](#gere-só-as-classes-que-você-usa).
|
|
16
|
+
1. **Referencie a folha de estilos compilada.** Não precisa de nada além de arquivos estáticos. Você entrega todas as classes, usadas ou não pelas suas páginas.
|
|
17
|
+
2. **Gere uma folha de estilos com o comando `chs build` do pacote.** Ela varre os seus templates e escreve uma folha de estilos com só as classes que eles usam. Veja [Gere só as classes que você usa](#gere-só-as-classes-que-você-usa).
|
|
18
18
|
|
|
19
19
|
## Qual arquivo referenciar
|
|
20
20
|
|
|
@@ -38,8 +38,8 @@ O jsDelivr e o unpkg servem todos os arquivos de todas as versões publicadas no
|
|
|
38
38
|
|
|
39
39
|
```html
|
|
40
40
|
<head>
|
|
41
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.
|
|
42
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.
|
|
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
43
|
</head>
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -86,7 +86,7 @@ Depois referencie o arquivo no layout, pelo caminho dele dentro dessa pasta:
|
|
|
86
86
|
|
|
87
87
|
Aponte o caminho para `node_modules/@codenhub`, e não para o próprio `dist/`. O Propshaft serve os arquivos pelo caminho dentro de cada pasta de assets, então adicionar `dist/` diretamente publicaria um `index.css` solto, que colide com qualquer `index.css` seu.
|
|
88
88
|
|
|
89
|
-
Os arquivos que você referencia ficam em `dist/`, que guarda
|
|
89
|
+
Os arquivos que você referencia ficam em `dist/`, que guarda CSS pronto sem `@import` a resolver, mais um `index.d.ts` vazio para o TypeScript e o comando `chs build` com os arquivos que ele lê. O código-fonte do Tailwind fica em `tw/`, fora de `dist/`, então um pipeline estático que serve `dist/` ou aplica fingerprint aos arquivos dele não encontra nenhum `@import` que não consiga resolver.
|
|
90
90
|
|
|
91
91
|
### Django
|
|
92
92
|
|
|
@@ -104,7 +104,7 @@ STATICFILES_DIRS = [
|
|
|
104
104
|
<link rel="stylesheet" href="{% static 'codenhub-styles/index.css' %}" />
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
Aponte o prefixo para `dist`, não para a pasta do pacote. `dist/` contém
|
|
107
|
+
Aponte o prefixo para `dist`, não para a pasta do pacote. `dist/` contém CSS pronto sem `@import` a resolver, mais um `index.d.ts` vazio para o TypeScript e o comando `chs build` com os arquivos que ele lê, que o storage copia como estão, então o `collectstatic` também funciona com `ManifestStaticFilesStorage`, que coloca uma impressão digital (hash) no nome de cada arquivo e reescreve as referências dentro dele. A pasta do pacote também contém o código-fonte do Tailwind em `tw/`, com linhas `@import "tailwindcss/..."` que esse storage não consegue resolver.
|
|
108
108
|
|
|
109
109
|
### Laravel
|
|
110
110
|
|
|
@@ -112,34 +112,52 @@ Uma aplicação Laravel roda Vite por padrão, então ela tem um bundler: import
|
|
|
112
112
|
|
|
113
113
|
## Gere só as classes que você usa
|
|
114
114
|
|
|
115
|
-
O pacote traz um comando, `
|
|
115
|
+
O pacote traz um comando, `chs`, que lê os seus templates atrás de nomes de classe e escreve uma única folha de estilos minificada com só as classes do StyleKit que eles usam. Uma página que usa um botão recebe cerca de um oitavo da folha de estilos completa; o tamanho exato depende das classes que você usa, porque cada componente traz as regras compartilhadas de que depende.
|
|
116
116
|
|
|
117
117
|
O comando também serve com um bundler. Um projeto cujo bundler não roda o Tailwind, como um build simples com Vite ou webpack, pode escrever a folha de estilos entre os seus fontes, `--output src/stylekit.css`, e importar esse arquivo onde importaria `@codenhub/styles`. Um projeto que usa o Tailwind CSS v4 tem a mesma redução pelo [entrypoint de código-fonte](./tailwind.md) e não precisa do comando.
|
|
118
118
|
|
|
119
|
-
Ele precisa do Node.js 24 ou mais recente na máquina que gera o CSS, seja o seu notebook, um job de CI ou uma etapa do deploy
|
|
119
|
+
Ele precisa do Node.js 24 ou mais recente na máquina que gera o CSS, seja o seu notebook, um job de CI ou uma etapa do deploy, e de nada mais: o pacote é toda a instalação, sem Tailwind e sem configuração. Instale-o como dependência de desenvolvimento a partir da raiz do projeto; o npm cria um `package.json` se você não tiver um:
|
|
120
120
|
|
|
121
121
|
```sh
|
|
122
|
-
npm install --save-dev @codenhub/styles
|
|
122
|
+
npm install --save-dev @codenhub/styles
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
-
A folha de estilos que o comando escreve é CSS puro, então os servidores que servem o seu site não precisam nem do Node.js nem
|
|
125
|
+
A folha de estilos que o comando escreve é CSS puro, então os servidores que servem o seu site não precisam nem do Node.js nem do pacote. Acrescente o build aos scripts do seu `package.json`, onde o comando instalado está no path pelo nome dele:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"scripts": {
|
|
130
|
+
"build:css": "chs build --content \"app/views/**/*.erb\" --output public/stylekit.css"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Depois rode a partir da raiz do projeto:
|
|
126
136
|
|
|
127
137
|
```sh
|
|
128
|
-
|
|
138
|
+
npm run build:css
|
|
129
139
|
```
|
|
130
140
|
|
|
141
|
+
Para rodá-lo uma vez sem script, chame-o pelo nome do pacote:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
npx @codenhub/styles build --content "app/views/**/*.erb" --output public/stylekit.css
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Não digite `npx chs`. `chs` é o nome do comando dentro deste pacote, mas o npm também tem um pacote sem relação chamado `chs`, e `npx chs` roda esse outro em qualquer pasta onde este pacote não esteja instalado.
|
|
148
|
+
|
|
131
149
|
Quando dá certo, o comando imprime uma linha: o caminho absoluto que escreveu e o tamanho do arquivo em bytes:
|
|
132
150
|
|
|
133
151
|
```text
|
|
134
|
-
/home/you/shop/public/stylekit.css
|
|
152
|
+
/home/you/shop/public/stylekit.css 24497 bytes
|
|
135
153
|
```
|
|
136
154
|
|
|
137
155
|
Referencie esse arquivo no seu layout como qualquer folha de estilos estática.
|
|
138
156
|
|
|
139
157
|
### Views do Rails
|
|
140
158
|
|
|
141
|
-
```
|
|
142
|
-
|
|
159
|
+
```json
|
|
160
|
+
"build:css": "chs build --content \"app/views/**/*.erb\" --content \"app/helpers/**/*.rb\" --output public/stylekit.css"
|
|
143
161
|
```
|
|
144
162
|
|
|
145
163
|
```erb
|
|
@@ -149,8 +167,8 @@ npx codenhub-styles build --content "app/views/**/*.erb" --content "app/helpers/
|
|
|
149
167
|
|
|
150
168
|
### Views Blade do Laravel
|
|
151
169
|
|
|
152
|
-
```
|
|
153
|
-
|
|
170
|
+
```json
|
|
171
|
+
"build:css": "chs build --content \"resources/views/**/*.blade.php\" --output public/css/stylekit.css"
|
|
154
172
|
```
|
|
155
173
|
|
|
156
174
|
```blade
|
|
@@ -162,8 +180,8 @@ npx codenhub-styles build --content "resources/views/**/*.blade.php" --output pu
|
|
|
162
180
|
|
|
163
181
|
Um projeto Django guarda os templates numa pasta `templates/` do projeto, na pasta `templates/` de cada app, ou nas duas. Passe um `--content` para cada lugar onde ficam os seus, e deixe de fora os que você não usa, porque um glob que não casa com nada faz o build falhar:
|
|
164
182
|
|
|
165
|
-
```
|
|
166
|
-
|
|
183
|
+
```json
|
|
184
|
+
"build:css": "chs build --content \"templates/**/*.html\" --content \"shop/templates/**/*.html\" --output static/stylekit.css"
|
|
167
185
|
```
|
|
168
186
|
|
|
169
187
|
```django
|
|
@@ -176,41 +194,53 @@ Escreva a saída numa pasta listada em `STATICFILES_DIRS`, aqui `static/`, para
|
|
|
176
194
|
### Opções
|
|
177
195
|
|
|
178
196
|
- `--content <glob>`, ou `-c <glob>`, indica os arquivos onde procurar nomes de classe. É obrigatório e pode ser repetido: passe uma vez por glob, e o build lê todo arquivo que casar com algum deles. Um glob relativo é resolvido em relação à pasta de onde você roda o comando, então rode a partir da raiz do projeto; um glob absoluto é usado como está. `**` casa com qualquer número de pastas, e `{rb,erb}` com qualquer uma das duas extensões. Qualquer arquivo de texto serve, seja qual for a extensão. Cada glob precisa casar com pelo menos um arquivo, senão o build falha e o nomeia, então um erro de digitação não consegue publicar uma folha de estilos vazia. Arquivos que o seu `.gitignore` exclui são lidos mesmo assim quando um glob casa com eles, e nada fora dos seus globs é lido.
|
|
179
|
-
- Coloque cada glob entre aspas. Sem aspas, o seu shell pode expandir o glob numa lista de arquivos antes de o comando vê-lo, e só o primeiro arquivo conta como valor do `--content`. Quando isso deixa nomes de arquivo sobrando, o build os rejeita em vez de ler em silêncio menos do que você queria; quando o glob casou com um único arquivo, o build lê só esse arquivo e nada que os seus templates ganharem depois.
|
|
197
|
+
- Coloque cada glob entre aspas, com `\"` dentro de um script do `package.json`. Sem aspas, o seu shell pode expandir o glob numa lista de arquivos antes de o comando vê-lo, e só o primeiro arquivo conta como valor do `--content`. Quando isso deixa nomes de arquivo sobrando, o build os rejeita em vez de ler em silêncio menos do que você queria; quando o glob casou com um único arquivo, o build lê só esse arquivo e nada que os seus templates ganharem depois.
|
|
180
198
|
- `--output <file>`, ou `-o <file>`, é a folha de estilos a escrever. É obrigatório. Um caminho relativo é resolvido em relação à pasta de onde você roda o comando, pastas-pai que faltam são criadas, e um arquivo existente é substituído.
|
|
181
|
-
- `--aesthetic <name>` acrescenta uma das [estéticas](../usage/aesthetics.md): `neobrutalism`, `glass`, `pixel`, `chunky-tile`, `cyber` ou `sketch`. Repita para mais de uma; nomear uma duas vezes a inclui uma vez só. As estéticas precisam ser pedidas porque o build não tem como saber pelos seus templates qual você quer
|
|
199
|
+
- `--aesthetic <name>` acrescenta uma das [estéticas](../usage/aesthetics.md): `neobrutalism`, `glass`, `pixel`, `chunky-tile`, `cyber` ou `sketch`. Repita para mais de uma; nomear uma duas vezes a inclui uma vez só. As estéticas precisam ser pedidas porque o build não tem como saber pelos seus templates qual você quer: cada uma entra quando você a pede, menos as regras dela para classes que os seus templates não usam, e nenhuma entra quando você não pede.
|
|
182
200
|
- `--no-minify` escreve CSS legível e indentado no lugar. Útil para ler o que o build gerou; em produção, sirva o arquivo minificado.
|
|
183
201
|
- `--help` imprime o uso, com as estéticas que esta versão traz. `--version` imprime a versão do pacote. Nenhum dos dois gera nada, e os dois terminam com status 0.
|
|
184
202
|
|
|
185
|
-
A saída sempre traz o tema, os design tokens dele como propriedades personalizadas de CSS, o reset
|
|
203
|
+
A saída sempre traz o tema, os design tokens dele como propriedades personalizadas de CSS, o reset, as regras base de que todo componente depende e as classes que uma página recebe em tempo de execução, e não de um template, como `.theme-dark`. Por cima vem cada classe do StyleKit que os seus templates usam. A saída é gerada a partir da folha de estilos completa, não da `/native`, então não inclui os mapeamentos sem classes. Um build cujos templates nomeiam todas as classes escreve a folha de estilos completa, byte por byte.
|
|
186
204
|
|
|
187
205
|
### Como as classes são encontradas
|
|
188
206
|
|
|
189
|
-
O build não executa os seus templates. Ele lê como texto puro cada arquivo que casa com os seus globs de `--content`, recolhe cada palavra que poderia ser um nome de classe e escreve as regras das palavras que são classes do StyleKit
|
|
207
|
+
O build não executa os seus templates. Ele lê como texto puro cada arquivo que casa com os seus globs de `--content`, recolhe cada palavra que poderia ser um nome de classe e escreve as regras das palavras que são classes do StyleKit. É assim que o Tailwind CSS também lê o conteúdo.
|
|
190
208
|
|
|
191
|
-
Uma classe precisa aparecer num arquivo como uma palavra inteira. `class="btn primary"`, `class: "btn primary"` e `classes = ["btn", "primary"]` funcionam. Uma palavra que só parece uma classe também conta: um comentário que diz "card" adiciona todas as regras do card à folha de estilos, o que aumenta o arquivo e não muda nada na página.
|
|
209
|
+
Uma classe precisa aparecer num arquivo como uma palavra inteira. `class="btn primary"`, `class: "btn primary"` e `classes = ["btn", "primary"]` funcionam, assim como uma classe escrita antes ou depois de dois-pontos, como no `class:primary={isPrimary}` do Svelte ou no `btn: true` de um hash Ruby. Uma palavra que só parece uma classe também conta: um comentário que diz "card" adiciona todas as regras do card à folha de estilos, o que aumenta o arquivo e não muda nada na página.
|
|
192
210
|
|
|
193
211
|
Um nome de classe que o seu código monta na renderização nunca aparece inteiro em nenhum arquivo, então o build não consegue encontrá-lo. Em `class="btn <%= @order.priority %>"`, o `btn` é encontrado, mas a intenção é o que `priority` tiver na hora de renderizar; se for `destructive`, o botão aparece sem o vermelho dele. Há duas saídas:
|
|
194
212
|
|
|
195
213
|
- **Escreva os nomes de classe inteiros.** Associe cada valor a um nome de classe completo num arquivo que o build leia, como `{ "urgent" => "destructive", "normal" => "neutral" }.fetch(@order.priority)` num helper.
|
|
196
214
|
- **Liste-os num arquivo de safelist.** Um arquivo de texto puro com um nome de classe por linha, adicionado com o seu próprio `--content`, como `--content config/stylekit-classes.txt`. Guarde-o perto do código que monta os nomes de classe, para que quem mudar um veja o outro.
|
|
197
215
|
|
|
216
|
+
### Variantes
|
|
217
|
+
|
|
218
|
+
Uma classe de intenção, apresentação ou modificador pode receber um de dez prefixos, escritos como no Tailwind: `sm:`, `md:`, `lg:`, `xl:` e `2xl:` a aplicam a partir daquele breakpoint, `hover:`, `focus:`, `focus-visible:` e `active:` enquanto o elemento está naquele estado, e `dark:` onde quer que o tema escuro se aplique, como [Temas → A variante `dark:`](../usage/theming.md#a-variante-dark) descreve. `md:lg` deixa um botão grande a partir do breakpoint `md`, e `hover:primary` dá a ele a intenção primary no hover:
|
|
219
|
+
|
|
220
|
+
```html
|
|
221
|
+
<button class="btn sm md:lg ghost hover:soft">Save</button>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Isso cobre intenções como `primary` e `destructive`, as classes de preenchimento e borda como `soft` e `edged`, e modificadores como `sm`, `lg`, `raised`, `pill`, `tight` e `ruled`. `disabled` não recebe nenhum: é um estado em que o elemento está, então escreva-o como atributo ou como classe. Classes de componente como `btn` e `card`, e os helpers de texto e de layout, não recebem prefixo.
|
|
225
|
+
|
|
226
|
+
Cada prefixo é uma cópia fixa dessas classes, embutida no pacote, então a lista traz os comuns, e não todos os do Tailwind. O comando não empilha prefixos, como em `md:hover:primary`, e não oferece outros, como `print:` ou `group-hover:`. Uma classe assim não recebe estilo, e o elemento aparece sem ela.
|
|
227
|
+
|
|
198
228
|
### O que ele não faz
|
|
199
229
|
|
|
230
|
+
- **Não tem utilitários do Tailwind.** `flex`, `mt-4`, `text-red-500` e o resto do Tailwind não são classes do StyleKit, então o build os deixa de fora. Para layout, os [helpers de layout](../usage/content-and-layout.md) do próprio StyleKit entram no build como qualquer outra classe. Um projeto que quer os utilitários do Tailwind, as outras variantes dele ou prefixos empilhados roda o próprio Tailwind e importa o [entrypoint de código-fonte](./tailwind.md), que dá os três.
|
|
200
231
|
- **Não tem modo watch.** Ele gera uma vez e termina. Rode de novo depois de mudar um template, a partir de um script ou de um observador de arquivos que o seu framework ou editor já tenha. Uma classe que a folha de estilos ainda não tem deixa o elemento sem estilo até o próximo build.
|
|
201
|
-
- **Não tem arquivo de configuração nem CSS próprio.** Você não consegue acrescentar os seus próprios valores de `@theme`, definições de `@utility` nem plugins. Para mudar o visual, sobrescreva as propriedades personalizadas numa folha de estilos sua carregada depois desta, como [Personalização](../usage/customizing.md) descreve.
|
|
232
|
+
- **Não tem arquivo de configuração nem CSS próprio.** Você não consegue acrescentar os seus próprios valores de `@theme`, definições de `@utility` nem plugins. Para mudar o visual, sobrescreva as propriedades personalizadas numa folha de estilos sua carregada depois desta, como [Personalização](../usage/customizing.md) descreve.
|
|
202
233
|
- **Não tem outros comandos.** `build` é o único; `--help` e `--version` são as únicas flags que funcionam sem ele.
|
|
203
|
-
- **Não traz uma versão do Tailwind própria.** Cada build usa os `@tailwindcss/cli` e `tailwindcss` instalados no seu projeto, dentro da faixa `>=4.3.2 <5` que o StyleKit suporta, então o seu lockfile os fixa.
|
|
204
234
|
|
|
205
235
|
### Num deploy
|
|
206
236
|
|
|
207
237
|
Gere a folha de estilos antes da etapa que recolhe ou aplica fingerprint aos seus assets, como `rails assets:precompile`, `php artisan optimize` ou `python manage.py collectstatic`. Você pode fazer commit da saída, e aí os servidores não precisam de Node.js nenhum, ao custo de um arquivo gerado que alguém precisa lembrar de regenerar; ou gerá-la no deploy, e aí a máquina de build precisa do Node.js 24 ou mais recente.
|
|
208
238
|
|
|
209
|
-
Fixe a versão. Abaixo da 1.0 uma versão minor pode renomear ou remover uma classe, então o mesmo comando pode escrever outra folha de estilos com uma versão mais nova.
|
|
239
|
+
Fixe a versão. Abaixo da 1.0 uma versão minor pode renomear ou remover uma classe, então o mesmo comando pode escrever outra folha de estilos com uma versão mais nova. A saída não depende de nada além da versão do pacote e dos seus templates, então faça commit do `package.json` e do lockfile que o npm escreve, e instale com `npm ci` na máquina de build, para que cada build use a versão que você testou.
|
|
210
240
|
|
|
211
241
|
### Quando o build falha
|
|
212
242
|
|
|
213
|
-
Toda falha imprime uma linha começando com `
|
|
243
|
+
Toda falha imprime uma linha começando com `chs:` na saída de erro padrão e termina com status 1, sem escrever o arquivo de saída, então um script de deploy para em vez de publicar uma folha de estilos desatualizada ou vazia. A linha diz o que deu errado e o que fazer:
|
|
214
244
|
|
|
215
245
|
- **`missing --content` ou `missing --output`.** Acrescente a que ela nomeia. Um `--output` vazio ou só com espaços conta como ausente.
|
|
216
246
|
- **`--content "<glob>" matches no file in <folder>`.** Em geral é um erro de digitação no caminho, um comando rodado de outra pasta que não a raiz do projeto, ou um glob de um lugar que o seu projeto não usa. Gerar a partir de nada escreveria uma folha de estilos sem classes de componente, e o site perderia o estilo sem aviso.
|
|
@@ -218,10 +248,9 @@ Toda falha imprime uma linha começando com `codenhub-styles:` na saída de erro
|
|
|
218
248
|
- **`unknown option "<flag>"`.** Um erro de digitação, ou uma opção de outra ferramenta, como `--watch` ou `--config`. `--help` lista as opções.
|
|
219
249
|
- **`option "<flag>" is missing its value or does not take one`.** Uma flag que leva valor foi a última coisa da linha, ou o `--no-minify` recebeu um valor, como em `--no-minify=true`.
|
|
220
250
|
- **`unknown aesthetic "<name>"; choose from ...`.** Escolha um dos nomes listados. Eles são em minúsculas e com hífen, como `chunky-tile`.
|
|
221
|
-
- **`missing command` ou `unknown command "<name>"`.** A primeira palavra depois de `
|
|
222
|
-
- **`this command needs @tailwindcss/cli and tailwindcss, which are not installed`.** A linha nomeia o que estiver faltando dos dois e termina com o comando que o instala. Rode esse comando a partir da raiz do projeto.
|
|
251
|
+
- **`missing command` ou `unknown command "<name>"`.** A primeira palavra depois de `chs` precisa ser `build`.
|
|
223
252
|
- **`this command needs Node.js 24 or newer`.** Atualize o Node.js na máquina que gera o CSS.
|
|
224
|
-
- **`
|
|
253
|
+
- **`cannot write the stylesheet: <reason>`.** `<reason>` é a própria mensagem do Node.js. `EISDIR` quer dizer que o `--output` nomeia uma pasta existente, então nomeie um arquivo dentro dela; `EACCES` ou `EPERM` quer dizer que você não pode escrever ali.
|
|
225
254
|
|
|
226
255
|
## Conferindo se funcionou
|
|
227
256
|
|