@codenhub/styles 0.6.0 → 0.8.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.
Files changed (151) hide show
  1. package/NOTICE +18 -16
  2. package/README.es.md +62 -0
  3. package/README.md +28 -22
  4. package/README.pt-BR.md +62 -0
  5. package/dist/aesthetics/chunky-tile.css +1 -1
  6. package/dist/aesthetics/cyber.css +1 -1
  7. package/dist/aesthetics/glass.css +1 -1
  8. package/dist/aesthetics/index.css +2 -2
  9. package/dist/aesthetics/neobrutalism.css +1 -1
  10. package/dist/aesthetics/pixel.css +1 -1
  11. package/dist/aesthetics/sketch.css +1 -1
  12. package/dist/cli.js +189 -0
  13. package/dist/components.css +2 -2
  14. package/dist/index.css +2 -2
  15. package/dist/index.d.ts +1 -0
  16. package/dist/native.css +2 -2
  17. package/dist/palette.css +1 -1
  18. package/dist/theme.css +2 -2
  19. package/docs/accessibility.md +108 -60
  20. package/docs/changelog/0.1.1.md +1 -0
  21. package/docs/changelog/0.2.0.md +1 -0
  22. package/docs/changelog/0.3.0.md +1 -0
  23. package/docs/changelog/0.4.0.md +1 -0
  24. package/docs/changelog/0.5.0.md +8 -3
  25. package/docs/changelog/0.6.0.md +2 -1
  26. package/docs/changelog/0.7.0.md +50 -0
  27. package/docs/changelog/0.8.0.md +70 -0
  28. package/docs/changelog/index.md +2 -0
  29. package/docs/concepts.md +188 -46
  30. package/docs/es/accessibility.md +169 -0
  31. package/docs/es/concepts.md +212 -0
  32. package/docs/es/index.md +105 -0
  33. package/docs/es/integrating/astro.md +35 -0
  34. package/docs/es/integrating/index.md +75 -0
  35. package/docs/es/integrating/nextjs.md +67 -0
  36. package/docs/es/integrating/svelte.md +45 -0
  37. package/docs/es/integrating/tailwind.md +148 -0
  38. package/docs/es/integrating/vue.md +31 -0
  39. package/docs/es/integrating/without-a-bundler.md +238 -0
  40. package/docs/es/setup.md +188 -0
  41. package/docs/es/usage/aesthetics.md +282 -0
  42. package/docs/es/usage/buttons.md +135 -0
  43. package/docs/es/usage/composing.md +168 -0
  44. package/docs/es/usage/content-and-layout.md +219 -0
  45. package/docs/es/usage/customizing.md +304 -0
  46. package/docs/es/usage/feedback.md +157 -0
  47. package/docs/es/usage/forms.md +256 -0
  48. package/docs/es/usage/index.md +33 -0
  49. package/docs/es/usage/presets.md +92 -0
  50. package/docs/es/usage/solo.md +86 -0
  51. package/docs/es/usage/theming.md +309 -0
  52. package/docs/es/usage/tooltips.md +127 -0
  53. package/docs/index.md +86 -26
  54. package/docs/integrating/astro.md +3 -4
  55. package/docs/integrating/index.md +46 -13
  56. package/docs/integrating/nextjs.md +3 -4
  57. package/docs/integrating/svelte.md +5 -4
  58. package/docs/integrating/tailwind.md +89 -6
  59. package/docs/integrating/vue.md +3 -4
  60. package/docs/integrating/without-a-bundler.md +237 -0
  61. package/docs/pt-BR/accessibility.md +169 -0
  62. package/docs/pt-BR/concepts.md +212 -0
  63. package/docs/pt-BR/index.md +105 -0
  64. package/docs/pt-BR/integrating/astro.md +35 -0
  65. package/docs/pt-BR/integrating/index.md +75 -0
  66. package/docs/pt-BR/integrating/nextjs.md +67 -0
  67. package/docs/pt-BR/integrating/svelte.md +45 -0
  68. package/docs/pt-BR/integrating/tailwind.md +148 -0
  69. package/docs/pt-BR/integrating/vue.md +31 -0
  70. package/docs/pt-BR/integrating/without-a-bundler.md +238 -0
  71. package/docs/pt-BR/setup.md +188 -0
  72. package/docs/pt-BR/usage/aesthetics.md +282 -0
  73. package/docs/pt-BR/usage/buttons.md +135 -0
  74. package/docs/pt-BR/usage/composing.md +168 -0
  75. package/docs/pt-BR/usage/content-and-layout.md +219 -0
  76. package/docs/pt-BR/usage/customizing.md +304 -0
  77. package/docs/pt-BR/usage/feedback.md +157 -0
  78. package/docs/pt-BR/usage/forms.md +256 -0
  79. package/docs/pt-BR/usage/index.md +33 -0
  80. package/docs/pt-BR/usage/presets.md +92 -0
  81. package/docs/pt-BR/usage/solo.md +86 -0
  82. package/docs/pt-BR/usage/theming.md +309 -0
  83. package/docs/pt-BR/usage/tooltips.md +127 -0
  84. package/docs/setup.md +142 -91
  85. package/docs/usage/aesthetics.md +89 -73
  86. package/docs/usage/buttons.md +112 -40
  87. package/docs/usage/composing.md +109 -92
  88. package/docs/usage/content-and-layout.md +160 -125
  89. package/docs/usage/customizing.md +117 -41
  90. package/docs/usage/feedback.md +138 -71
  91. package/docs/usage/forms.md +201 -107
  92. package/docs/usage/index.md +22 -14
  93. package/docs/usage/presets.md +91 -0
  94. package/docs/usage/solo.md +85 -0
  95. package/docs/usage/theming.md +273 -118
  96. package/docs/usage/tooltips.md +90 -49
  97. package/llms-full.txt +2820 -1298
  98. package/llms.txt +24 -22
  99. package/package.json +134 -91
  100. package/{dist/tw → tw}/aesthetics/chunky-tile.css +107 -29
  101. package/{dist/tw → tw}/aesthetics/cyber.css +88 -40
  102. package/{dist/tw → tw}/aesthetics/glass.css +257 -61
  103. package/{dist/tw → tw}/aesthetics/neobrutalism.css +113 -20
  104. package/{dist/tw → tw}/aesthetics/pixel.css +93 -8
  105. package/tw/aesthetics/sketch.css +417 -0
  106. package/{dist/tw → tw}/box.css +105 -9
  107. package/tw/components/button.css +11 -0
  108. package/tw/components/button.rules.css +187 -0
  109. package/tw/components/feedback.css +11 -0
  110. package/{dist/tw/components/feedback.css → tw/components/feedback.rules.css} +136 -32
  111. package/tw/components/form.css +11 -0
  112. package/{dist/tw/components/form.css → tw/components/form.rules.css} +577 -125
  113. package/tw/components/index.css +16 -0
  114. package/tw/components/rules.css +41 -0
  115. package/tw/components/surface.css +11 -0
  116. package/tw/components/surface.rules.css +222 -0
  117. package/tw/components/tooltip.css +11 -0
  118. package/{dist/tw/components/tooltip.css → tw/components/tooltip.rules.css} +43 -27
  119. package/{dist/tw → tw}/corner.css +18 -12
  120. package/{dist/tw → tw}/elevation.css +23 -17
  121. package/{dist/tw → tw}/index.css +12 -10
  122. package/tw/index.d.ts +1 -0
  123. package/tw/intent.css +312 -0
  124. package/tw/modifiers.css +127 -0
  125. package/tw/native.css +320 -0
  126. package/tw/presentation.css +139 -0
  127. package/tw/reset.css +10 -0
  128. package/{dist/tw/reset.css → tw/reset.rules.css} +21 -22
  129. package/tw/size.css +34 -0
  130. package/tw/surface.css +9 -0
  131. package/tw/surface.rules.css +212 -0
  132. package/{dist/tw → tw}/theme.css +121 -45
  133. package/tw/typography.css +8 -0
  134. package/{dist/tw/typography.css → tw/typography.rules.css} +0 -3
  135. package/{dist/tw → tw}/utilities/content.css +212 -50
  136. package/tw/utilities/index.css +11 -0
  137. package/tw/utilities/layout.css +208 -0
  138. package/tw/utilities/rules.css +8 -0
  139. package/dist/tw/aesthetics/sketch.css +0 -333
  140. package/dist/tw/components/button.css +0 -139
  141. package/dist/tw/components/index.css +0 -36
  142. package/dist/tw/components/loader.css +0 -116
  143. package/dist/tw/components/surface.css +0 -175
  144. package/dist/tw/intent.css +0 -228
  145. package/dist/tw/native.css +0 -203
  146. package/dist/tw/palette.css +0 -460
  147. package/dist/tw/presentation.css +0 -68
  148. package/dist/tw/surface.css +0 -61
  149. package/dist/tw/utilities/index.css +0 -6
  150. package/dist/tw/utilities/layout.css +0 -130
  151. /package/{dist/tw → tw}/aesthetics/index.css +0 -0
@@ -0,0 +1,75 @@
1
+ ---
2
+ title: Visão geral
3
+ description: Como a folha de estilos é carregada no build de um framework e qual guia seguir.
4
+ group: Integração
5
+ order: 2
6
+ source: 2028acef66a8ab3659cef35e08ecc0db1de7bdeb
7
+ ---
8
+
9
+ # Integração
10
+
11
+ Esta seção é um desvio do caminho principal de leitura, para projetos em que o framework decide onde o CSS global pode ficar. O pacote não tem JavaScript nem bindings para frameworks (veja a [Introdução](../index.md#o-que-ele-não-faz)), então integrá-lo se resume a duas coisas: onde o seu framework deixa você carregar uma folha de estilos global e se o projeto roda Tailwind CSS v4. Siga o guia que corresponde à sua stack e depois volte para [Montando uma tela](../concepts.md).
12
+
13
+ ## O modelo comum
14
+
15
+ Toda stack faz os mesmos dois imports, a partir do mesmo tipo de lugar — um layout raiz, o arquivo de entrada da aplicação ou um arquivo CSS global, nunca uma página ou um componente mais abaixo na árvore:
16
+
17
+ 1. Um [entrypoint](../setup.md#todos-os-entrypoints) — o `@codenhub/styles` compilado para qualquer build, ou `@codenhub/styles/tw` quando o projeto já roda Tailwind CSS v4.
18
+ 2. `@codenhub/styles/aesthetics` (ou `/tw/aesthetics`) depois dele, só se o projeto usar uma [estética](../usage/aesthetics.md).
19
+
20
+ Importar de um único lugar importa por dois motivos. Alguns frameworks só _permitem_ CSS global a partir de um arquivo raiz designado e falham no build caso contrário — o Pages Router do Next.js é um deles; veja [Next.js → Solução de problemas](./nextjs.md#solução-de-problemas). Onde o framework permite de forma mais ampla, como faz o App Router do Next.js, importar a partir da raiz continua sendo a escolha recomendada para uma ordem de CSS previsível — e importar por componente carregaria as mesmas regras de reset e de tokens uma vez por componente, em vez de uma vez por aplicação.
21
+
22
+ ## Qual guia seguir
23
+
24
+ | Stack | Guia |
25
+ | --------------------------------------------------------------------------------------------- | ------------------------------------- |
26
+ | Um projeto com Tailwind CSS v4 em qualquer 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 puro, Rails, Laravel, Django ou qualquer aplicação sem etapa de build de CSS com Node.js | [Sem bundler](./without-a-bundler.md) |
32
+
33
+ Um projeto sem framework — um build simples com Vite, webpack ou Parcel — importa a folha de estilos compilada a partir do arquivo CSS global que o projeto já tem, como mostra [Configuração → Importe a folha de estilos](../setup.md#importe-a-folha-de-estilos). Vite e webpack resolvem o nome do pacote como ele é; Parcel e PostCSS com `postcss-import` precisam da mudança abaixo. A folha de estilos compilada traz todas as classes; para entregar só as que as suas páginas usam sem adotar o Tailwind, escreva uma folha de estilos reduzida com o [comando `build`](./without-a-bundler.md#gere-só-as-classes-que-você-usa) do pacote e importe-a no lugar.
34
+
35
+ ### Bundlers que precisam de um empurrão
36
+
37
+ As duas ferramentas encontram a folha de estilos assim que alguém diz como; nenhuma precisa de outro entrypoint.
38
+
39
+ **Parcel.** Ative o suporte ao mapa `exports` de um pacote no seu `package.json`:
40
+
41
+ ```json
42
+ {
43
+ "@parcel/resolver-default": {
44
+ "packageExports": true
45
+ }
46
+ }
47
+ ```
48
+
49
+ Depois importe o pacote com o prefixo `npm:` do Parcel, que diz a ele que o nome é um pacote, e não um arquivo ao lado da folha de estilos:
50
+
51
+ ```css
52
+ @import "npm:@codenhub/styles";
53
+ ```
54
+
55
+ **PostCSS com `postcss-import`.** O plugin não lê o mapa `exports` de um pacote, então o nome do pacote sozinho não é resolvido. Importe em vez disso o arquivo compilado pelo caminho em disco, relativo à sua própria folha de estilos, o mesmo arquivo que um `<link>` apontaria:
56
+
57
+ ```css
58
+ @import "../node_modules/@codenhub/styles/dist/index.css";
59
+ ```
60
+
61
+ Os outros entrypoints compilados funcionam do mesmo jeito, como `@codenhub/styles/dist/aesthetics/neobrutalism.css`.
62
+
63
+ ## Conferindo se funcionou
64
+
65
+ Depois do import, renderize um elemento estilizado e confirme que ele pegou os tokens do pacote, e não o padrão do navegador:
66
+
67
+ ```html
68
+ <button class="btn primary">Save changes</button>
69
+ ```
70
+
71
+ Um botão arredondado preenchido com a cor primária (quase preto numa página clara, quase branco numa escura) significa que a folha de estilos carregou. Texto com o padrão do navegador, sem estilo, na maioria das vezes significa que o especificador do import não foi resolvido — confira na [tabela de entrypoints](../setup.md#todos-os-entrypoints) o especificador exato a importar, e confirme que o ferramental do seu build resolve imports de CSS de pacotes; veja [Configuração → Requisitos](../setup.md#requisitos). Sem ferramenta de build, referencie o arquivo pelo caminho; veja [Sem bundler](./without-a-bundler.md). [Configuração → Quando nada é estilizado](../setup.md#quando-nada-é-estilizado) lista as outras causas comuns.
72
+
73
+ ## A seguir
74
+
75
+ Quando o botão renderizar, volte para o caminho principal: [Montando uma tela](../concepts.md) adiciona o primeiro card e o primeiro formulário à página de configurações.
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: Next.js
3
+ description: Como carregar a folha de estilos numa aplicação Next.js / React.
4
+ order: 2
5
+ source: fd8dc12652c64995638c5b902a1ca35787f9a37c
6
+ ---
7
+
8
+ # Next.js
9
+
10
+ O Next.js tem duas arquiteturas de roteamento, e elas tratam o CSS global de formas diferentes:
11
+
12
+ - **App Router** (um diretório `app/`): o CSS global — incluindo a folha de estilos de um pacote externo como este — pode ser importado de qualquer layout, página ou componente dentro de `app/`. Importar a partir do layout raiz é só uma recomendação, para uma ordem de CSS previsível entre as rotas; o Next.js não impõe isso e nenhum erro acontece se você importar em outro lugar.
13
+ - **Pages Router** (um diretório `pages/`, sem `app/`): o CSS global fica restrito a `pages/_app.tsx`. Importar de qualquer outro lugar faz o build falhar — quem impõe isso é o próprio Next.js, não este pacote; veja [Solução de problemas](#solução-de-problemas).
14
+ - **Os dois diretórios presentes** (no meio de uma migração): importe a folha de estilos nos dois arquivos raiz. Os dois roteadores servem as suas próprias rotas de forma independente, então uma rota em `pages/` nunca vê uma folha de estilos importada só em `app/layout.tsx`, e vice-versa.
15
+
16
+ ## Importe a folha de estilos
17
+
18
+ Adicione o import ao arquivo raiz do seu roteador:
19
+
20
+ **App Router**
21
+
22
+ ```tsx
23
+ // app/layout.tsx
24
+ import "@codenhub/styles";
25
+
26
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
27
+ return (
28
+ <html lang="en">
29
+ <body>{children}</body>
30
+ </html>
31
+ );
32
+ }
33
+ ```
34
+
35
+ **Pages Router**
36
+
37
+ ```tsx
38
+ // pages/_app.tsx
39
+ import "@codenhub/styles";
40
+ import type { AppProps } from "next/app";
41
+
42
+ export default function App({ Component, pageProps }: AppProps) {
43
+ return <Component {...pageProps} />;
44
+ }
45
+ ```
46
+
47
+ Usa Tailwind CSS v4? `@import "@codenhub/styles/tw"` é uma diretiva de CSS, então o lugar dele é num arquivo CSS, não num import solto em `layout.tsx`/`_app.tsx` — adicione-o (com `@source`, se precisar; `/tw` já importa o próprio Tailwind, então deixe de fora o seu `@import "tailwindcss"`) ao seu arquivo CSS global e, em vez disso, importe esse arquivo a partir do mesmo arquivo raiz mostrado acima. Veja [Tailwind CSS v4](./tailwind.md).
48
+
49
+ ## Force um tema
50
+
51
+ Aplique `.dark` ou `.light` no `<html>` para forçar um tema em vez de seguir a preferência do sistema; veja [Temas → Claro e escuro](../usage/theming.md#claro-e-escuro).
52
+
53
+ ```tsx
54
+ <html lang="en" className="dark">
55
+ ```
56
+
57
+ ## Solução de problemas
58
+
59
+ **O build com Pages Router falha com "Global CSS cannot be imported from files other than your Custom `<App>`"**
60
+
61
+ - **O que aconteceu:** o Next.js rejeitou uma instrução `import` de CSS global fora de `pages/_app.tsx`. Essa restrição é específica do Pages Router — quem a impõe é o próprio Next.js, não este pacote, e ela vale para qualquer import de CSS global, não especificamente para o `@codenhub/styles`. Ela não vale para o App Router, em que o mesmo import funciona a partir de qualquer layout, página ou componente.
62
+ - **Por quê:** o Pages Router não tem uma fronteira de CSS por rota como o App Router tem, então o Next.js exige um único arquivo previsível para as folhas de estilos globais, para evitar conflitos de ordem entre as páginas.
63
+ - **Como resolver:** mova a linha `import "@codenhub/styles"` para `pages/_app.tsx` e remova-a de onde ela estiver agora.
64
+
65
+ ## A seguir
66
+
67
+ Volte para o caminho principal: [Montando uma tela](../concepts.md) adiciona o primeiro card e o primeiro formulário à página de configurações. [Configuração → Todos os entrypoints](../setup.md#todos-os-entrypoints) lista todas as outras folhas de estilos que você pode importar.
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: Svelte
3
+ description: Como carregar a folha de estilos numa aplicação Svelte / SvelteKit.
4
+ order: 4
5
+ source: 9c8bc0fee69e4b2bf1edd85c784b7df8ff1e883d
6
+ ---
7
+
8
+ # Svelte
9
+
10
+ O Svelte e o SvelteKit deixam você importar CSS de qualquer componente, mas o reset e os tokens do pacote devem carregar uma vez, antes de qualquer componente renderizar. Esta página mostra onde fica esse único import no SvelteKit e numa aplicação Svelte simples.
11
+
12
+ ## Importe a folha de estilos
13
+
14
+ **SvelteKit** — importe a partir do layout raiz, para carregar uma vez em todas as rotas:
15
+
16
+ ```svelte
17
+ <!-- src/routes/+layout.svelte -->
18
+ <script>
19
+ import "@codenhub/styles";
20
+ let { children } = $props();
21
+ </script>
22
+
23
+ {@render children()}
24
+ ```
25
+
26
+ **Svelte simples + Vite** — importe a partir do arquivo de entrada:
27
+
28
+ ```ts
29
+ // main.ts
30
+ import "@codenhub/styles";
31
+ import { mount } from "svelte";
32
+ import App from "./App.svelte";
33
+
34
+ mount(App, { target: document.getElementById("app")! });
35
+ ```
36
+
37
+ Usa Tailwind CSS v4? Em vez disso, importe `@codenhub/styles/tw` a partir do arquivo CSS de entrada da aplicação — veja [Tailwind CSS v4](./tailwind.md).
38
+
39
+ ## Force um tema
40
+
41
+ Aplique `.dark` ou `.light` no `<html>` (edite `src/app.html` no SvelteKit) para forçar um tema em vez de seguir a preferência do sistema; veja [Temas → Claro e escuro](../usage/theming.md#claro-e-escuro).
42
+
43
+ ## A seguir
44
+
45
+ Volte para o caminho principal: [Montando uma tela](../concepts.md) adiciona o primeiro card e o primeiro formulário à página de configurações. [Configuração → Todos os entrypoints](../setup.md#todos-os-entrypoints) lista todas as outras folhas de estilos que você pode importar.
@@ -0,0 +1,148 @@
1
+ ---
2
+ title: Tailwind CSS v4
3
+ description: Como usar os entrypoints de código-fonte /tw num projeto com Tailwind CSS v4.
4
+ order: 1
5
+ source: a86fe5fa121db14ab917b10fb69e839111ddbc47
6
+ ---
7
+
8
+ # Tailwind CSS v4
9
+
10
+ Um projeto que já roda Tailwind CSS v4 pode compilar o código-fonte deste pacote em vez de carregar a saída compilada. Os utilitários da sua aplicação e as classes do pacote saem então de um único build, compartilham um único tema e usam uma única variante `dark:`. Esta página trata do import, das estéticas, dos entrypoints específicos, de como construir seus próprios componentes com `@apply`, de como descartar a paleta do Tailwind e dos problemas de build que você provavelmente vai encontrar.
11
+
12
+ ## Por que código-fonte em vez de compilado
13
+
14
+ Os entrypoints `/tw` publicam uma cópia do código-fonte não compilado da pasta `tw/` do pacote; o seu próprio build do Tailwind o compila junto com a sua aplicação, então as diretivas `@theme`, `@utility` e `@apply` dele são resolvidas junto com as suas. Os entrypoints compilados (`@codenhub/styles`) continuam funcionando num projeto com Tailwind, mas aí dois pipelines de CSS separados rodam lado a lado em vez de um — use `/tw`, a menos que um motivo específico o descarte.
15
+
16
+ ## Importe o entrypoint de código-fonte
17
+
18
+ ```css
19
+ @import "@codenhub/styles/tw";
20
+
21
+ @source "./src";
22
+ ```
23
+
24
+ O `/tw` importa o próprio Tailwind, então ele substitui o seu `@import "tailwindcss"` em vez de se somar a ele: com os dois, o Preflight do Tailwind é emitido duas vezes. Todos os outros entrypoints `/tw/*` esperam que o seu import venha antes; veja [Usando um entrypoint específico](#usando-um-entrypoint-específico).
25
+
26
+ O Tailwind CSS v4 varre o seu projeto automaticamente — a maioria dos projetos não precisa de nada além do import acima. Os caminhos de `@source` são resolvidos a partir do arquivo CSS que os declara, não da raiz do projeto, então `./src` aqui significa "o `src/` ao lado desta folha de estilos"; ajuste para onde a sua folha de estilos global realmente está. Adicione `@source` só para markup que a varredura automática do Tailwind não alcança sozinha: um caminho excluído por padrão (listado no `.gitignore`, ou dentro de `node_modules` — uma biblioteca de componentes externa, por exemplo) ou, num monorepo, um caminho fora da árvore de diretórios deste arquivo. Aponte para o markup da sua aplicação, não para este pacote: o código-fonte do pacote nomeia todas as classes que ele define, então varrê-lo emite todas elas, quer as suas páginas as usem ou não.
27
+
28
+ ## Adicione estéticas
29
+
30
+ Adicione uma estética a partir do entrypoint de código-fonte do mesmo jeito que no compilado, depois do import base:
31
+
32
+ ```css
33
+ @import "@codenhub/styles/tw";
34
+ @import "@codenhub/styles/tw/aesthetics";
35
+
36
+ @source "./src";
37
+ ```
38
+
39
+ ## Usando um entrypoint específico
40
+
41
+ Importe um entrypoint `/tw/*` específico em vez do combinado — como `/tw/button` ou `/tw/form` — quando um build só precisa de uma família de componentes; veja a [tabela de entrypoints](../setup.md#todos-os-entrypoints) completa para saber o que cada um reúne.
42
+
43
+ Diferente do `/tw`, os entrypoints específicos e o `/tw/native` não importam o Tailwind, então mantenha o seu próprio import primeiro:
44
+
45
+ ```css
46
+ @import "tailwindcss";
47
+ @import "@codenhub/styles/tw/button";
48
+ ```
49
+
50
+ ## Construa seus próprios componentes com `@apply`
51
+
52
+ No `/tw`, todo componente, helper e classe de eixo é um utilitário do Tailwind. Isso inclui as intenções (`neutral`, `primary`, `secondary`, `success`, `warning`, `destructive`, `info`), a apresentação (`solid`, `soft`, `ghost`, `edged`, `edgeless`), a elevação (`flat`, `raised`, `floating`), os padrões de canto (`cut-diagonal`, `cut-diagonal-reverse`) e os tamanhos (`sm`, `lg`). Assim, uma classe sua pode carregar uma receita inteira:
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">Salvar</button>
68
+ ```
69
+
70
+ - **Um componente aplicado se comporta como a classe.** `btn-save` reage ao hover, é pressionado, recebe foco e segue uma estética do mesmo jeito que `class="btn primary soft sm"`.
71
+ - **Variantes funcionam.** `hover:primary`, `md:lg` e `dark:solid` aplicam uma classe de eixo sob essa condição, no seu markup ou dentro do `@apply`.
72
+ - **Escreva a sua classe como `@utility`.** Assim ela fica na camada `utilities`, e os seus outros utilitários no mesmo elemento continuam vencendo. Uma regra simples `.btn-save { @apply … }` também funciona, mas fica sem camada, então o que ela aplica vence todos os utilitários do elemento; [Personalização → Helpers de composição](../usage/customizing.md#helpers-de-composição) tem os detalhes.
73
+ - **Modificadores também se aplicam.** Os modificadores de um componente, como `.tight` no `.stack`, `.icon` no `.btn` ou `.interactive` no `.card`, também são utilitários, então `@apply stack tight`, `@apply btn icon pill` e `md:tight` funcionam. O estado desabilitado é a exceção: continua sendo um atributo ou a classe `.disabled` no markup.
74
+ - **O seu utilitário vence os padrões internos de um componente.** `p-0 text-center` numa célula de `.data-table`, `text-sm` num `.label` e `px-8` num `.btn.sm` são todos aplicados.
75
+
76
+ A página de [Predefinições](../usage/presets.md) compara isso com as outras formas de definir um visual uma única vez.
77
+
78
+ ## Descarte a paleta do Tailwind
79
+
80
+ O `/tw` é construído sobre o tema padrão do Tailwind, então os utilitários da paleta do Tailwind, como `bg-red-500`, continuam disponíveis. Se o seu design usa só os tokens do pacote, limpe os tons que você não usa:
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
+ As cores do próprio pacote não mudam, e você ainda pode acrescentar cores suas no mesmo bloco.
108
+
109
+ O bloco deixa de fora `neutral`, `emerald`, `amber`, `rose`, `indigo` e `white` de propósito: o tema constrói as cores dele a partir deles.
110
+
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
+ - **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
+
114
+ ## Solução de problemas
115
+
116
+ **As classes não resultam em nenhum estilo**
117
+
118
+ - **O que aconteceu:** os componentes usam classes documentadas como `.btn.primary`, mas nenhum estilo aparece, mesmo com `@import "@codenhub/styles/tw"` na folha de estilos.
119
+ - **Por quê:** raramente o problema é o próprio `@source` — o Tailwind já varre o seu projeto automaticamente. A causa mais comum é markup que fica num lugar que a varredura automática exclui por padrão: um caminho listado no `.gitignore` ou um componente vindo de `node_modules`. O Tailwind pode não ver uma classe usada só ali e deixa de gerar a regra dela.
120
+ - **Como resolver:** adicione um `@source` explícito apontando para esse diretório, resolvido a partir desta folha de estilos — como no [exemplo acima](#importe-o-entrypoint-de-código-fonte).
121
+
122
+ **Regras de token e de reset duplicadas**
123
+
124
+ - **O que aconteceu:** a folha de estilos gerada está maior do que o esperado, e as devtools do navegador mostram as mesmas custom properties ou regras de reset definidas duas vezes.
125
+ - **Por quê:** uma de duas coisas. Importar um entrypoint compilado (`@codenhub/styles`) e um entrypoint `/tw` (`@codenhub/styles/tw`) no mesmo build compila os mesmos tokens e o mesmo reset a partir de duas fontes independentes; o build do Tailwind não tem como saber que elas descrevem o mesmo pacote. Ou então a sua folha de estilos importa `tailwindcss` ao lado do `/tw`, que já o importa, e o Preflight é emitido duas vezes.
126
+ - **Como resolver:** escolha um caminho por projeto — entrypoints `/tw` para um projeto que roda Tailwind CSS v4, entrypoints compilados em todos os outros — e remova o seu próprio `@import "tailwindcss"` quando importar o `/tw`.
127
+
128
+ **Uma classe montada em tempo de execução fica sem estilo**
129
+
130
+ - **O que aconteceu:** `<button class="btn primary">` é estilizado, mas um botão cuja classe vem de uma variável, como `"btn " + variant`, ou de conteúdo de um CMS, não é.
131
+ - **Por quê:** o Tailwind emite só as classes que encontra escritas por extenso nos arquivos que varre. Isso vale também para as classes de componente do pacote: um build com `/tw` emite `.alert` só se `alert` aparecer em algum lugar que ele varre, o que mantém a folha de estilos restrita ao que as suas páginas usam. As classes de intenção, de apresentação, de elevação, de canto e de tamanho, como `.primary`, `.soft` e `.sm`, também são utilitários, então o mesmo vale para elas. As classes de estética, como `.glass`, são CSS comum e sempre emitidas. Um nome montado em tempo de execução nunca aparece inteiro num arquivo, então a varredura não o encontra.
132
+ - **Como resolver:** escreva cada nome de classe completo em algum lugar que o Tailwind varre, por exemplo num objeto de consulta (`{ save: "btn primary", remove: "btn destructive" }`), ou liste na sua folha de estilos os nomes que o seu código ou o seu conteúdo podem produzir:
133
+
134
+ ```css
135
+ @import "@codenhub/styles/tw";
136
+
137
+ @source inline("btn alert badge primary destructive soft");
138
+ ```
139
+
140
+ Todo entrypoint `/tw` exige Tailwind CSS 4.3.2 ou mais recente, abaixo da 5 (`>=4.3.2 <5`).
141
+
142
+ ## A variante `dark:`
143
+
144
+ Os entrypoints `/tw` definem a sua própria variante `dark:`, então os seus utilitários trocam de tema com os mesmos seletores de claro e escuro que os tokens do pacote usam. Ela tem uma diferença conhecida em relação aos tokens quando há temas aninhados; veja [Temas → A variante dark:](../usage/theming.md#a-variante-dark).
145
+
146
+ ## A seguir
147
+
148
+ Volte para o caminho principal: [Montando uma tela](../concepts.md) adiciona o primeiro card e o primeiro formulário à página de configurações. Tudo o que ela mostra funciona do mesmo jeito com `/tw`.
@@ -0,0 +1,31 @@
1
+ ---
2
+ title: Vue
3
+ description: Como carregar a folha de estilos numa aplicação Vue / Vite.
4
+ order: 3
5
+ source: 9cc23f66518b0aa3ce886602f39d05820b2b8bcf
6
+ ---
7
+
8
+ # Vue
9
+
10
+ O Vue não impõe restrição sobre de onde o CSS é importado, mas importá-lo uma vez, a partir do arquivo de entrada da aplicação, evita que o reset e os tokens carreguem mais de uma vez e garante que eles estejam no lugar antes de qualquer componente renderizar.
11
+
12
+ ## Importe a folha de estilos
13
+
14
+ ```ts
15
+ // main.ts
16
+ import "@codenhub/styles";
17
+ import { createApp } from "vue";
18
+ import App from "./App.vue";
19
+
20
+ createApp(App).mount("#app");
21
+ ```
22
+
23
+ Usa Tailwind CSS v4? Importe `@codenhub/styles/tw` a partir de um arquivo CSS de entrada em vez do `main.ts`, usando o plugin `@tailwindcss/vite` — veja [Tailwind CSS v4](./tailwind.md).
24
+
25
+ ## Force um tema
26
+
27
+ Aplique `.dark` ou `.light` no elemento raiz para forçar um tema em vez de seguir a preferência do sistema; veja [Temas → Claro e escuro](../usage/theming.md#claro-e-escuro).
28
+
29
+ ## A seguir
30
+
31
+ Volte para o caminho principal: [Montando uma tela](../concepts.md) adiciona o primeiro card e o primeiro formulário à página de configurações. [Configuração → Todos os entrypoints](../setup.md#todos-os-entrypoints) lista todas as outras folhas de estilos que você pode importar.
@@ -0,0 +1,238 @@
1
+ ---
2
+ title: Sem bundler
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
+ order: 6
5
+ source: 6289ea781c99dcda5c027a72fede9e2f1cab8414
6
+ ---
7
+
8
+ # Sem bundler
9
+
10
+ As folhas de estilos compiladas são CSS pronto: cada uma é um único arquivo, sem `@import` e sem referência a outro arquivo, e toda imagem que ela desenha vem embutida como uma URL `data:`: as máscaras do visto e do traço do checkbox e os filtros SVG de lente que o `.glass-liquid` usa. Uma página pode carregar qualquer uma delas com uma tag `<link>` simples, de qualquer servidor, sem etapa de build, e a folha de estilos não faz nenhuma requisição adicional.
11
+
12
+ O que precisa de uma ferramenta de build é o _nome_ do import. `@import "@codenhub/styles"` nomeia um pacote, e encontrar o arquivo por trás desse nome — `node_modules/@codenhub/styles/dist/index.css` — é trabalho de ferramentas que conhecem o Node, como Vite, webpack ou a CLI do Tailwind, que leem o mapa `exports` do pacote. Um navegador não faz isso: ele resolve a URL de um `@import` em relação à folha de estilos que o contém, e um `<link href>` em relação à página, então um nome de pacote solto vira uma requisição para um caminho que não existe. Sem bundler, referencie o arquivo pelo caminho.
13
+
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
+
16
+ 1. **Referencie a folha de estilos compilada.** Funciona hoje, só com 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 `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
+
19
+ ## Qual arquivo referenciar
20
+
21
+ Cada caminho de import compilado é um arquivo na pasta `dist/` do pacote:
22
+
23
+ | Caminho de import | Arquivo |
24
+ | ------------------------------- | -------------------------------------------------------------- |
25
+ | `@codenhub/styles` | `dist/index.css` |
26
+ | `@codenhub/styles/theme` | `dist/theme.css` |
27
+ | `@codenhub/styles/components` | `dist/components.css` |
28
+ | `@codenhub/styles/native` | `dist/native.css` |
29
+ | `@codenhub/styles/palette` | `dist/palette.css` |
30
+ | `@codenhub/styles/aesthetics` | `dist/aesthetics/index.css` |
31
+ | `@codenhub/styles/aesthetics/*` | `dist/aesthetics/<name>.css`, como `dist/aesthetics/pixel.css` |
32
+
33
+ Referencie um arquivo base só, não vários, porque eles se sobrepõem, e as estéticas que você usar. A ordem entre eles não importa, porque todo arquivo declara as [camadas de cascata](../setup.md#camadas-de-cascata) antes de usar qualquer uma. [Configuração → Todos os entrypoints](../setup.md#todos-os-entrypoints) explica o que cada um contém.
34
+
35
+ ## A partir de uma CDN
36
+
37
+ O jsDelivr e o unpkg servem todos os arquivos de todas as versões publicadas no npm, então uma página pode referenciar um deles sem instalar nada:
38
+
39
+ ```html
40
+ <head>
41
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.8.0/dist/index.css" />
42
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.8.0/dist/aesthetics/pixel.css" />
43
+ </head>
44
+ ```
45
+
46
+ Coloque a versão exata na URL. Sem ela, a CDN serve a versão mais recente, e abaixo da 1.0 uma versão minor pode renomear ou remover uma classe; veja [Versionamento](../index.md#versionamento).
47
+
48
+ ## A partir do seu próprio servidor
49
+
50
+ Instale o pacote e depois sirva a pasta `dist/` dele como arquivos estáticos:
51
+
52
+ ```sh
53
+ npm install @codenhub/styles
54
+ ```
55
+
56
+ Cada framework serve uma pasta de `node_modules` de um jeito, então cada um aparece abaixo. Quando o framework lê a pasta no lugar onde ela está, como fazem o Rails e o Django, atualizar o pacote e fazer um novo deploy é tudo o que uma atualização exige.
57
+
58
+ ### HTML puro
59
+
60
+ Copie `node_modules/@codenhub/styles/dist` para a pasta que o seu servidor publica e depois referencie o arquivo:
61
+
62
+ ```html
63
+ <link rel="stylesheet" href="/vendor/codenhub-styles/index.css" />
64
+ ```
65
+
66
+ Repita a cópia a cada atualização, por exemplo a partir de um script `postinstall` do npm.
67
+
68
+ ### Ruby on Rails
69
+
70
+ Uma aplicação Rails criada com `cssbundling-rails` já roda um bundler: importe o pacote a partir de `app/assets/stylesheets/application.css`, como em [Configuração → Importe a folha de estilos](../setup.md#importe-a-folha-de-estilos).
71
+
72
+ Com Propshaft e sem bundler de CSS, adicione a pasta do pacote aos caminhos de assets:
73
+
74
+ ```ruby
75
+ # config/initializers/assets.rb
76
+ Rails.application.config.assets.paths << Rails.root.join("node_modules/@codenhub")
77
+ ```
78
+
79
+ Depois referencie o arquivo no layout, pelo caminho dele dentro dessa pasta:
80
+
81
+ ```erb
82
+ <%# app/views/layouts/application.html.erb %>
83
+ <%= stylesheet_link_tag "styles/dist/index" %>
84
+ <%= stylesheet_link_tag "styles/dist/aesthetics/pixel" %>
85
+ ```
86
+
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
+
89
+ Os arquivos que você referencia ficam em `dist/`, que guarda só CSS pronto, mais um `index.d.ts` vazio para o TypeScript. 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
+
91
+ ### Django
92
+
93
+ Adicione a pasta a `STATICFILES_DIRS` com um prefixo, o que mantém os nomes dos arquivos dela separados dos seus próprios arquivos estáticos:
94
+
95
+ ```python
96
+ # settings.py
97
+ STATICFILES_DIRS = [
98
+ ("codenhub-styles", BASE_DIR / "node_modules/@codenhub/styles/dist"),
99
+ ]
100
+ ```
101
+
102
+ ```django
103
+ {% load static %}
104
+ <link rel="stylesheet" href="{% static 'codenhub-styles/index.css' %}" />
105
+ ```
106
+
107
+ Aponte o prefixo para `dist`, não para a pasta do pacote. `dist/` contém só CSS pronto, mais um `index.d.ts` vazio para o TypeScript que o storage copia como está, 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
+
109
+ ### Laravel
110
+
111
+ Uma aplicação Laravel roda Vite por padrão, então ela tem um bundler: importe o pacote a partir de `resources/css/app.css`, como em [Configuração → Importe a folha de estilos](../setup.md#importe-a-folha-de-estilos), e carregue esse arquivo com a diretiva `@vite`, como de costume.
112
+
113
+ ## Gere só as classes que você usa
114
+
115
+ O pacote traz um comando, `codenhub-styles`, que o compila para você. Ele lê os seus templates atrás de nomes de classe e escreve uma única folha de estilos minificada com só as classes do StyleKit e os utilitários do Tailwind que eles usam. Uma página que usa um botão recebe uma pequena fração 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
+
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
+
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. Ele compila com o Tailwind CSS, que o pacote não instala por você, então um projeto que só linka a folha de estilos compilada nunca o baixa. Instale os três pacotes como dependências de desenvolvimento a partir da raiz do projeto; o npm cria um `package.json` se você não tiver um, e nenhuma configuração do Tailwind é necessária:
120
+
121
+ ```sh
122
+ npm install --save-dev @codenhub/styles @tailwindcss/cli tailwindcss
123
+ ```
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 de nenhum desses pacotes. Rode a partir da raiz do projeto:
126
+
127
+ ```sh
128
+ npx codenhub-styles build --content "app/views/**/*.erb" --output public/stylekit.css
129
+ ```
130
+
131
+ Quando dá certo, o comando imprime uma linha: o caminho absoluto que escreveu e o tamanho do arquivo em bytes:
132
+
133
+ ```text
134
+ /home/you/shop/public/stylekit.css 25782 bytes
135
+ ```
136
+
137
+ Referencie esse arquivo no seu layout como qualquer folha de estilos estática.
138
+
139
+ ### Views do Rails
140
+
141
+ ```sh
142
+ npx codenhub-styles build --content "app/views/**/*.erb" --content "app/helpers/**/*.rb" --output public/stylekit.css
143
+ ```
144
+
145
+ ```erb
146
+ <%# app/views/layouts/application.html.erb %>
147
+ <link rel="stylesheet" href="/stylekit.css" />
148
+ ```
149
+
150
+ ### Views Blade do Laravel
151
+
152
+ ```sh
153
+ npx codenhub-styles build --content "resources/views/**/*.blade.php" --output public/css/stylekit.css
154
+ ```
155
+
156
+ ```blade
157
+ {{-- resources/views/layouts/app.blade.php --}}
158
+ <link rel="stylesheet" href="{{ asset('css/stylekit.css') }}" />
159
+ ```
160
+
161
+ ### Templates do Django
162
+
163
+ 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
+
165
+ ```sh
166
+ npx codenhub-styles build --content "templates/**/*.html" --content "shop/templates/**/*.html" --output static/stylekit.css
167
+ ```
168
+
169
+ ```django
170
+ {% load static %}
171
+ <link rel="stylesheet" href="{% static 'stylekit.css' %}" />
172
+ ```
173
+
174
+ Escreva a saída numa pasta listada em `STATICFILES_DIRS`, aqui `static/`, para que o `collectstatic` a recolha. A configuração acima lista só a pasta do pacote, então adicione `BASE_DIR / "static"` a essa lista se o seu projeto ainda não a tiver.
175
+
176
+ ### Opções
177
+
178
+ - `--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.
180
+ - `--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, então cada uma é escrita inteira quando você a pede, e nenhuma entra quando você não pede.
182
+ - `--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
+ - `--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
+
185
+ A saída sempre traz o tema, os design tokens dele como propriedades personalizadas de CSS, o reset e as regras base de que todo componente depende. Por cima vêm cada classe do StyleKit que os seus templates usam, com as variantes com que você a combina, como `primary` ou `soft`, e cada utilitário do Tailwind que eles usam, como `flex` ou `mt-4`. A saída é gerada a partir da folha de estilos completa, não da `/native`, então não inclui os mapeamentos sem classes.
186
+
187
+ ### Como as classes são encontradas
188
+
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 ou utilitários do Tailwind. É assim que o Tailwind CSS também lê o conteúdo.
190
+
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.
192
+
193
+ 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
+
195
+ - **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
+ - **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
+
198
+ ### O que ele não faz
199
+
200
+ - **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. Quando você precisar da configuração do próprio Tailwind, instale o Tailwind CSS e importe o entrypoint de código-fonte a partir da sua própria entrada do Tailwind, como [Tailwind CSS v4](./tailwind.md) mostra.
202
+ - **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
+
205
+ ### Num deploy
206
+
207
+ 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
+
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. 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 as versões que você testou.
210
+
211
+ ### Quando o build falha
212
+
213
+ Toda falha imprime uma linha começando com `codenhub-styles:` 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
+
215
+ - **`missing --content` ou `missing --output`.** Acrescente a que ela nomeia. Um `--output` vazio ou só com espaços conta como ausente.
216
+ - **`--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.
217
+ - **`unexpected argument "<file>"`.** Quase sempre é um glob de `--content` sem aspas, que o seu shell expandiu numa lista de arquivos. Coloque o glob entre aspas.
218
+ - **`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
+ - **`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
+ - **`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 `codenhub-styles` precisa ser `build`.
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.
223
+ - **`this command needs Node.js 24 or newer`.** Atualize o Node.js na máquina que gera o CSS.
224
+ - **`Tailwind failed to build the stylesheet: <reason>`.** `<reason>` é a própria mensagem do Tailwind. `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. Para qualquer outro motivo, rode o mesmo comando com `--no-minify` para descartar o minificador, e informe a mensagem junto com a versão que o `--version` imprime.
225
+
226
+ ## Conferindo se funcionou
227
+
228
+ Renderize um elemento estilizado, como em [Integração → Conferindo se funcionou](./index.md#conferindo-se-funcionou):
229
+
230
+ ```html
231
+ <button class="btn primary">Save changes</button>
232
+ ```
233
+
234
+ Um botão arredondado preenchido com a cor primária significa que a folha de estilos carregou. Se o botão parecer o padrão do navegador, abra o painel de rede do navegador: um `404` na folha de estilos significa que o caminho ou a configuração de arquivos estáticos está errado.
235
+
236
+ ## A seguir
237
+
238
+ Volte para o caminho principal: [Montando uma tela](../concepts.md) adiciona o primeiro card e o primeiro formulário à página de configurações. [Configuração → Todos os entrypoints](../setup.md#todos-os-entrypoints) lista todas as outras folhas de estilos que você pode importar.