@codenhub/styles 0.5.0 → 0.7.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/NOTICE +18 -16
- package/README.es.md +61 -0
- package/README.md +27 -22
- package/README.pt-BR.md +61 -0
- package/dist/aesthetics/chunky-tile.css +1 -1
- package/dist/aesthetics/cyber.css +1 -1
- package/dist/aesthetics/glass.css +1 -1
- package/dist/aesthetics/index.css +2 -2
- package/dist/aesthetics/neobrutalism.css +1 -1
- package/dist/aesthetics/pixel.css +1 -1
- package/dist/aesthetics/sketch.css +1 -1
- package/dist/components.css +2 -2
- package/dist/index.css +2 -2
- package/dist/native.css +2 -2
- package/dist/palette.css +1 -1
- package/dist/theme.css +2 -2
- package/dist/tw/aesthetics/chunky-tile.css +120 -62
- package/dist/tw/aesthetics/cyber.css +102 -40
- package/dist/tw/aesthetics/glass.css +371 -19
- package/dist/tw/aesthetics/index.css +2 -1
- package/dist/tw/aesthetics/neobrutalism.css +121 -33
- package/dist/tw/aesthetics/pixel.css +111 -16
- package/dist/tw/aesthetics/sketch.css +100 -28
- package/dist/tw/box.css +69 -28
- package/dist/tw/components/button.css +35 -14
- package/dist/tw/components/feedback.css +61 -58
- package/dist/tw/components/form.css +255 -142
- package/dist/tw/components/index.css +4 -9
- package/dist/tw/components/surface.css +80 -68
- package/dist/tw/components/tooltip.css +75 -41
- package/dist/tw/elevation.css +14 -22
- package/dist/tw/index.css +15 -19
- package/dist/tw/intent.css +35 -27
- package/dist/tw/native.css +22 -12
- package/dist/tw/palette.css +14 -11
- package/dist/tw/presentation.css +16 -30
- package/dist/tw/reset.css +36 -43
- package/dist/tw/surface.css +11 -12
- package/dist/tw/theme.css +87 -103
- package/dist/tw/utilities/content.css +311 -200
- package/dist/tw/utilities/layout.css +41 -37
- package/docs/accessibility.md +104 -58
- package/docs/changelog/0.1.1.md +1 -0
- package/docs/changelog/0.2.0.md +1 -0
- package/docs/changelog/0.3.0.md +1 -0
- package/docs/changelog/0.4.0.md +1 -0
- package/docs/changelog/0.5.0.md +8 -3
- package/docs/changelog/0.6.0.md +53 -0
- package/docs/changelog/0.7.0.md +50 -0
- package/docs/changelog/index.md +2 -0
- package/docs/concepts.md +188 -46
- package/docs/es/accessibility.md +150 -0
- package/docs/es/concepts.md +212 -0
- package/docs/es/index.md +104 -0
- package/docs/es/integrating/astro.md +35 -0
- package/docs/es/integrating/index.md +47 -0
- package/docs/es/integrating/nextjs.md +67 -0
- package/docs/es/integrating/svelte.md +45 -0
- package/docs/es/integrating/tailwind.md +78 -0
- package/docs/es/integrating/vue.md +31 -0
- package/docs/es/integrating/without-a-bundler.md +115 -0
- package/docs/es/setup.md +180 -0
- package/docs/es/usage/aesthetics.md +276 -0
- package/docs/es/usage/buttons.md +131 -0
- package/docs/es/usage/composing.md +164 -0
- package/docs/es/usage/content-and-layout.md +215 -0
- package/docs/es/usage/customizing.md +298 -0
- package/docs/es/usage/feedback.md +153 -0
- package/docs/es/usage/forms.md +231 -0
- package/docs/es/usage/index.md +29 -0
- package/docs/es/usage/solo.md +84 -0
- package/docs/es/usage/theming.md +296 -0
- package/docs/es/usage/tooltips.md +127 -0
- package/docs/index.md +89 -21
- package/docs/integrating/astro.md +3 -4
- package/docs/integrating/index.md +18 -13
- package/docs/integrating/nextjs.md +4 -5
- package/docs/integrating/svelte.md +5 -4
- package/docs/integrating/tailwind.md +29 -8
- package/docs/integrating/vue.md +3 -4
- package/docs/integrating/without-a-bundler.md +114 -0
- package/docs/pt-BR/accessibility.md +150 -0
- package/docs/pt-BR/concepts.md +212 -0
- package/docs/pt-BR/index.md +104 -0
- package/docs/pt-BR/integrating/astro.md +35 -0
- package/docs/pt-BR/integrating/index.md +47 -0
- package/docs/pt-BR/integrating/nextjs.md +67 -0
- package/docs/pt-BR/integrating/svelte.md +45 -0
- package/docs/pt-BR/integrating/tailwind.md +78 -0
- package/docs/pt-BR/integrating/vue.md +31 -0
- package/docs/pt-BR/integrating/without-a-bundler.md +115 -0
- package/docs/pt-BR/setup.md +180 -0
- package/docs/pt-BR/usage/aesthetics.md +276 -0
- package/docs/pt-BR/usage/buttons.md +131 -0
- package/docs/pt-BR/usage/composing.md +164 -0
- package/docs/pt-BR/usage/content-and-layout.md +215 -0
- package/docs/pt-BR/usage/customizing.md +298 -0
- package/docs/pt-BR/usage/feedback.md +153 -0
- package/docs/pt-BR/usage/forms.md +231 -0
- package/docs/pt-BR/usage/index.md +29 -0
- package/docs/pt-BR/usage/solo.md +84 -0
- package/docs/pt-BR/usage/theming.md +296 -0
- package/docs/pt-BR/usage/tooltips.md +127 -0
- package/docs/setup.md +134 -91
- package/docs/usage/aesthetics.md +102 -65
- package/docs/usage/buttons.md +108 -40
- package/docs/usage/composing.md +105 -92
- package/docs/usage/content-and-layout.md +159 -127
- package/docs/usage/customizing.md +112 -43
- package/docs/usage/feedback.md +135 -70
- package/docs/usage/forms.md +184 -99
- package/docs/usage/index.md +18 -14
- package/docs/usage/solo.md +83 -0
- package/docs/usage/theming.md +260 -119
- package/docs/usage/tooltips.md +103 -42
- package/llms-full.txt +2465 -1272
- package/llms.txt +25 -17
- package/package.json +28 -35
- package/dist/tw/components/loader.css +0 -117
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Montando uma tela
|
|
3
|
+
description: Organize o layout da página de configurações, defina a tipografia e adicione cards e botões enquanto aprende intenção, preenchimento, borda e estética.
|
|
4
|
+
order: 3
|
|
5
|
+
source: 8fa5ed2f6fb9a2786f61301f94bbe806649d7e1d
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Montando uma tela
|
|
9
|
+
|
|
10
|
+
Esta página transforma a estrutura vazia da [Configuração](./setup.md) na primeira parte de verdade da tela de configurações: um cabeçalho de página, um card de perfil com os botões de salvar e cancelar, e um resumo do plano ao lado de um card de uso. No caminho, ela apresenta as três escolhas que todo componente faz, intenção, apresentação e estética, no momento em que a tela precisa de cada uma. Todo o resto desta documentação se apoia nesse modelo.
|
|
11
|
+
|
|
12
|
+
## A menor tela possível
|
|
13
|
+
|
|
14
|
+
Um cabeçalho de página e um card com um botão:
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<main class="section">
|
|
18
|
+
<div class="section-content narrow stack">
|
|
19
|
+
<h1 class="text-title">Account settings</h1>
|
|
20
|
+
<section class="card stack">
|
|
21
|
+
<h2 class="text-title-sm">Profile</h2>
|
|
22
|
+
<p>Your name appears on invoices and shared projects.</p>
|
|
23
|
+
<button class="btn primary" type="button">Save changes</button>
|
|
24
|
+
</section>
|
|
25
|
+
</div>
|
|
26
|
+
</main>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Cada classe faz uma coisa só:
|
|
30
|
+
|
|
31
|
+
- `.section` dá espaçamento à página: uma margem lateral responsiva (de 1 a 2rem) e um espaço generoso acima e abaixo (de 4 a 7rem).
|
|
32
|
+
- `.section-content` centraliza uma coluna com largura máxima; `.narrow` faz essa largura ser 48rem em vez de 80rem, uma largura confortável para um formulário.
|
|
33
|
+
- `.stack` empilha os filhos na vertical com um espaçamento de 1rem.
|
|
34
|
+
- `.text-title` e `.text-title-sm` definem tamanhos de título: 1.875rem em negrito e 1.25rem em seminegrito.
|
|
35
|
+
- `.card` é um contêiner com borda, cantos arredondados e 1.25rem de padding.
|
|
36
|
+
- `.btn` cria um botão, e `.primary` dá a ele a cor primária.
|
|
37
|
+
|
|
38
|
+
Os títulos não são dimensionados pela tag: o reset dá a um `<h1>` sem classe de tipografia o mesmo tamanho e peso do texto ao redor. Isso mantém a estrutura do documento, ou seja, qual o nível de título de um elemento, separada do tamanho com que você quer que ele apareça. Se quiser títulos estilizados automaticamente, veja [Configuração → HTML sem classes](./setup.md#html-sem-classes).
|
|
39
|
+
|
|
40
|
+
## Organize o layout da página
|
|
41
|
+
|
|
42
|
+
Três utilitários de layout cobrem a maioria das telas, e os três usam o mesmo espaçamento, `--layout-gap` (1rem):
|
|
43
|
+
|
|
44
|
+
- `.stack` para listas verticais de blocos.
|
|
45
|
+
- `.cluster` para uma linha que quebra quando acaba o espaço, como um grupo de botões. Adicione `.between` para empurrar o primeiro e o último itens para as extremidades opostas.
|
|
46
|
+
- `.auto-grid` para um grid de cards iguais que ganha ou perde colunas conforme o espaço muda. Uma coluna nunca fica mais estreita que `--layout-grid-min` (16rem), a menos que o próprio contêiner seja.
|
|
47
|
+
|
|
48
|
+
`.tight` (0.5rem) e `.loose` (1.5rem) mudam o espaçamento do layout em que estão. Um layout aninhado mantém o seu próprio espaçamento.
|
|
49
|
+
|
|
50
|
+
Adicione um cabeçalho e coloque os botões em linha:
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<main class="section">
|
|
54
|
+
<div class="section-content narrow stack loose">
|
|
55
|
+
<header class="stack tight">
|
|
56
|
+
<h1 class="text-title">Account settings</h1>
|
|
57
|
+
<p>Manage your profile, plan, and security.</p>
|
|
58
|
+
</header>
|
|
59
|
+
|
|
60
|
+
<section class="card stack" aria-labelledby="profile-title">
|
|
61
|
+
<h2 class="text-title-sm" id="profile-title">Profile</h2>
|
|
62
|
+
<p>Your name appears on invoices and shared projects.</p>
|
|
63
|
+
<div class="cluster">
|
|
64
|
+
<button class="btn primary" type="button">Save changes</button>
|
|
65
|
+
<button class="btn ghost" type="button">Cancel</button>
|
|
66
|
+
</div>
|
|
67
|
+
</section>
|
|
68
|
+
</div>
|
|
69
|
+
</main>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
[Conteúdo e layout](./usage/content-and-layout.md) lista todos os utilitários de layout, incluindo `.view`, `.divider` e `.visually-hidden`, e a escala tipográfica completa.
|
|
73
|
+
|
|
74
|
+
## Intenção: qual cor
|
|
75
|
+
|
|
76
|
+
O botão de salvar é `.primary` e o de cancelar não tem intenção, o que o deixa neutro. Uma classe de intenção escolhe um papel de cor:
|
|
77
|
+
|
|
78
|
+
| Classe | Use para | Cor padrão |
|
|
79
|
+
| -------------- | -------------------------------------- | -------------------------------------------- |
|
|
80
|
+
| _nenhuma_ | Qualquer coisa sem significado próprio | Os cinzas de texto e de borda da página |
|
|
81
|
+
| `.primary` | A ação principal de uma tela | Quase preto no claro, quase branco no escuro |
|
|
82
|
+
| `.secondary` | Uma segunda ação, mais discreta | Cinza médio |
|
|
83
|
+
| `.success` | Confirmações e estados concluídos | Verde esmeralda |
|
|
84
|
+
| `.warning` | Algo que precisa de atenção em breve | Âmbar, com texto escuro |
|
|
85
|
+
| `.destructive` | Exclusões, revogações e erros | Vermelho rosado |
|
|
86
|
+
| `.info` | Avisos neutros e ajuda | Índigo |
|
|
87
|
+
|
|
88
|
+
A intenção fica no elemento que a carrega. Colocar `.destructive` numa `<section>` não deixa vermelhos todos os botões dentro dela; você escreve a classe em cada botão. Isso é proposital: um contêiner que recolorisse silenciosamente tudo o que tem dentro deixaria vermelho também o botão de cancelar de uma zona de perigo vermelha.
|
|
89
|
+
|
|
90
|
+
`.neutral` declara o padrão explicitamente. Você raramente precisa dela, porque não ter classe de intenção já significa neutro; ela importa onde a cor viria de outro lugar, como numa linha de tabela, que herda a intenção da tabela.
|
|
91
|
+
|
|
92
|
+
## Apresentação: quanta cor
|
|
93
|
+
|
|
94
|
+
O botão de cancelar é `.ghost`: sem preenchimento, só o texto colorido, então ele parece menos importante que o de salvar. Esse é o eixo de apresentação, com duas escolhas independentes:
|
|
95
|
+
|
|
96
|
+
- **Preenchimento:** `.solid` preenche o componente com a cor da intenção e troca o texto para a cor de contraste. `.soft` mistura um tom claro de 12% e mantém o texto na cor da intenção. `.ghost` não tem preenchimento em repouso.
|
|
97
|
+
- **Borda:** `.edged` desenha uma borda na cor da intenção; `.edgeless` não desenha nenhuma.
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<button class="btn primary">Save changes</button>
|
|
101
|
+
<button class="btn primary soft">Preview</button>
|
|
102
|
+
<button class="btn primary ghost edged">Export data</button>
|
|
103
|
+
<button class="btn ghost">Cancel</button>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Todo componente tem o seu próprio padrão quando nenhuma classe de apresentação se aplica. Um botão é sólido e sem borda. Um card não tem preenchimento e tem borda. Um campo de formulário não tem preenchimento e tem borda. [Composição](./usage/composing.md#padrões-dos-componentes) lista o padrão de cada componente.
|
|
107
|
+
|
|
108
|
+
Diferente da intenção, a apresentação é herdada. Um `.soft` num contêiner deixa tudo dentro dele soft, a menos que um elemento diga o contrário, e uma classe no próprio elemento sempre vence uma herdada de um contêiner:
|
|
109
|
+
|
|
110
|
+
```html
|
|
111
|
+
<div class="cluster soft">
|
|
112
|
+
<button class="btn primary">Soft primary</button>
|
|
113
|
+
<button class="btn success">Soft success</button>
|
|
114
|
+
<button class="btn primary solid">Solid: its own class wins</button>
|
|
115
|
+
</div>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Alguns componentes limitam o que a apresentação pode fazer, para proteger algo de que precisam. Um campo de formulário que herda de um contêiner `.solid` só é preenchido até 6%, para que o texto digitado continue legível. Um checkbox sempre mantém a borda, porque a borda é a única coisa que mostra uma caixa desmarcada. Esses limites aparecem junto com cada componente e estão reunidos em [Composição](./usage/composing.md).
|
|
119
|
+
|
|
120
|
+
## Termine a primeira tela
|
|
121
|
+
|
|
122
|
+
Adicione um resumo do plano ao lado de um card de uso num grid, e dê ao resumo um tom primário soft para que ele se destaque como o estado atual da conta:
|
|
123
|
+
|
|
124
|
+
```html
|
|
125
|
+
<main class="section">
|
|
126
|
+
<div class="section-content narrow stack loose">
|
|
127
|
+
<header class="stack tight">
|
|
128
|
+
<h1 class="text-title">Account settings</h1>
|
|
129
|
+
<p>Manage your profile, plan, and security.</p>
|
|
130
|
+
</header>
|
|
131
|
+
|
|
132
|
+
<section class="card stack" aria-labelledby="profile-title">
|
|
133
|
+
<h2 class="text-title-sm" id="profile-title">Profile</h2>
|
|
134
|
+
<p>Your name appears on invoices and shared projects.</p>
|
|
135
|
+
<div class="cluster">
|
|
136
|
+
<button class="btn primary" type="button">Save changes</button>
|
|
137
|
+
<button class="btn ghost" type="button">Cancel</button>
|
|
138
|
+
</div>
|
|
139
|
+
</section>
|
|
140
|
+
|
|
141
|
+
<div class="auto-grid">
|
|
142
|
+
<section class="card soft primary stack tight" aria-labelledby="plan-title">
|
|
143
|
+
<h2 class="text-label" id="plan-title">Current plan</h2>
|
|
144
|
+
<p class="text-title-sm">Team, billed yearly</p>
|
|
145
|
+
<p class="text-body">Renews on 12 March 2027.</p>
|
|
146
|
+
</section>
|
|
147
|
+
<section class="card stack tight" aria-labelledby="usage-title">
|
|
148
|
+
<h2 class="text-label" id="usage-title">Storage</h2>
|
|
149
|
+
<p class="text-title-sm">48 GB of 100 GB</p>
|
|
150
|
+
<p class="text-body">Shared by 6 members.</p>
|
|
151
|
+
</section>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</main>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Numa janela larga, os dois cards ficam lado a lado; quando a coluna é estreita demais para duas colunas de 16rem mais o espaçamento entre elas, eles se empilham. A página de [Feedback](./usage/feedback.md) transforma o número do card de armazenamento numa barra de uso.
|
|
158
|
+
|
|
159
|
+
Um `.card` fica em repouso a uma unidade de profundidade, mas no visual base essa profundidade não tem sombra visível; ela aparece quando uma estética desenha uma ou quando você adiciona `.raised` ou `.floating`. [Composição → Elevação](./usage/composing.md#elevação) trata da profundidade.
|
|
160
|
+
|
|
161
|
+
## Estética: do que é feito
|
|
162
|
+
|
|
163
|
+
O terceiro eixo muda o material de tudo o que estiver dentro dele: cantos, espessura de borda, sombras e, às vezes, a fonte. Ele precisa de um import próprio (veja [Configuração → Adicione uma estética](./setup.md#adicione-uma-estética-opcional)):
|
|
164
|
+
|
|
165
|
+
```html
|
|
166
|
+
<main class="section neobrutalism">
|
|
167
|
+
<!-- A mesma tela de configurações: cantos retos, linhas escuras grossas, sombras deslocadas e duras -->
|
|
168
|
+
</main>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Assim como a apresentação, uma estética é herdada, e um componente dentro dela pode ter outra. Você não precisa dela para montar a tela; a página de [Estéticas](./usage/aesthetics.md) compara as seis.
|
|
172
|
+
|
|
173
|
+
## Palavras que esta documentação usa
|
|
174
|
+
|
|
175
|
+
Algumas páginas descrevem como um componente é pintado. Cada uma destas palavras tem um único significado:
|
|
176
|
+
|
|
177
|
+
| Palavra | Significado |
|
|
178
|
+
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
179
|
+
| Preenchimento (fill) | Quanto da cor da intenção cobre o componente, de 0% (`.ghost`) a 100% (`.solid`). |
|
|
180
|
+
| Teto (cap) | O maior preenchimento que um componente permite. Um campo de formulário limita um preenchimento herdado a 6%, por exemplo. |
|
|
181
|
+
| Placa (plate) | O fundo pintado do componente: o preenchimento, misturado sobre o chão. |
|
|
182
|
+
| Chão (ground) | A cor sobre a qual o preenchimento é misturado. Normalmente é a própria página que aparece por trás; alguns componentes definem o seu, como o tom claro da intenção sob `.kbd` e `.code`. |
|
|
183
|
+
| Borda (edge) | O contorno em volta do componente. É diferente das linhas divisórias, as linhas dentro de uma tabela. |
|
|
184
|
+
| Tinta (ink) | Uma cor usada para desenhar linhas: a borda, as linhas divisórias de uma tabela, a marca de um checkbox. "Tinta do texto" é a cor do texto impresso sobre uma placa. |
|
|
185
|
+
| Material | O que uma estética muda: raio e formato dos cantos, espessura e estilo da borda, sombra e transparência. |
|
|
186
|
+
| Bloco (slab) | Uma sombra dura, sem desfoque, deslocada para baixo e para um lado, como as que `.neobrutalism` e `.chunky-tile` desenham. |
|
|
187
|
+
| Elevação | Quanto da sombra em vigor um elemento recebe: nenhuma (`.flat`), uma unidade (`.raised`) ou duas (`.floating`). |
|
|
188
|
+
|
|
189
|
+
## Os tokens por trás das classes
|
|
190
|
+
|
|
191
|
+
Toda classe lê custom properties de CSS, chamadas de tokens, então você pode mudar o resultado sem reescrever uma classe:
|
|
192
|
+
|
|
193
|
+
| Tipo | Controla | Onde estão listados |
|
|
194
|
+
| ------------ | ------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
195
|
+
| Cor | A paleta: cores de intenção, texto, bordas e fundos, para o claro e o escuro. | [Temas → Tokens de cor](./usage/theming.md#tokens-de-cor) |
|
|
196
|
+
| Fundamentais | Larguras e espaçamentos de layout, raios dos cantos, altura dos controles, foco, movimento. | [Temas → Tokens fundamentais](./usage/theming.md#tokens-fundamentais) |
|
|
197
|
+
| Intenção | Os slots de cor que um componente lê depois que uma classe de intenção escolhe um papel. | [Temas → Tokens de intenção](./usage/theming.md#tokens-de-intenção) |
|
|
198
|
+
| Apresentação | As porcentagens de preenchimento e de borda que as classes de apresentação definem. | [Personalização → Tokens de apresentação](./usage/customizing.md#tokens-de-apresentação) |
|
|
199
|
+
| Material | Raio, espessura de borda, geometria da sombra e transparência. | [Personalização → Tokens de material](./usage/customizing.md#tokens-de-material) |
|
|
200
|
+
| Estética | Um ajuste por estética, como `--pixel-unit` ou `--tile-lift`. | [Personalização → Tokens de estética](./usage/customizing.md#tokens-de-estética) |
|
|
201
|
+
|
|
202
|
+
Os tokens de cor e os fundamentais são o que a maioria das aplicações muda primeiro, para combinar com a marca. Os demais são de nível mais baixo: os componentes os leem, e as classes de apresentação e de estética os definem por você.
|
|
203
|
+
|
|
204
|
+
## Limites para conhecer desde já
|
|
205
|
+
|
|
206
|
+
- **A intenção não é herdada.** Escreva-a em cada elemento que a mostra. A única exceção são as linhas de tabela.
|
|
207
|
+
- **As classes são só estilo.** `<div class="btn">` parece um botão, mas não pode receber foco nem ser acionado pelo teclado. Use `<button>` ou `<a href>` e veja [Acessibilidade](./accessibility.md).
|
|
208
|
+
- **Uma combinação que a documentação não descreve não é suportada.** Ela pode até renderizar, mas pode mudar em qualquer versão; veja [Introdução → O que conta como suportado](./index.md#o-que-conta-como-suportado).
|
|
209
|
+
|
|
210
|
+
## A seguir
|
|
211
|
+
|
|
212
|
+
A tela tem uma ação primária e uma discreta. [Botões](./usage/buttons.md) acrescenta o resto: uma ação destrutiva para a zona de perigo, botões de ícone, tamanhos e estados desabilitados.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Introdução
|
|
3
|
+
description: Para que serve o @codenhub/styles, quanto ele custa e em que ordem ler esta documentação.
|
|
4
|
+
source: 238cac2f0ca6132818c99d938219a6c537bc837a
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# @codenhub/styles
|
|
8
|
+
|
|
9
|
+
O `@codenhub/styles` permite montar uma interface consistente e com suporte a temas escrevendo nomes de classe em HTML puro. Você importa uma folha de estilos e ganha tokens, um reset, utilitários de layout e tipografia, e classes para botões, campos de formulário, alertas, cards, tabelas e tooltips. Não há JavaScript para carregar nem biblioteca de componentes para encapsular: um `<button class="btn primary">` é toda a integração.
|
|
10
|
+
|
|
11
|
+
Esta documentação monta uma tela pequena do início ao fim: uma página de configurações de conta com um formulário de perfil, um resumo do plano e uma zona de perigo. Cada página acrescenta algo a ela, então no final você terá visto todas as partes do pacote funcionando juntas, e não isoladas.
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<main class="section">
|
|
15
|
+
<div class="section-content narrow stack">
|
|
16
|
+
<h1 class="text-title">Account settings</h1>
|
|
17
|
+
<form class="card stack">
|
|
18
|
+
<h2 class="text-title-sm">Profile</h2>
|
|
19
|
+
<div class="field">
|
|
20
|
+
<label class="label" for="display-name">Display name</label>
|
|
21
|
+
<input class="ipt" id="display-name" name="display-name" value="Ada Lovelace" />
|
|
22
|
+
</div>
|
|
23
|
+
<div class="cluster">
|
|
24
|
+
<button class="btn primary" type="submit">Save changes</button>
|
|
25
|
+
<button class="btn ghost" type="reset">Cancel</button>
|
|
26
|
+
</div>
|
|
27
|
+
</form>
|
|
28
|
+
</div>
|
|
29
|
+
</main>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Três escolhas por componente
|
|
33
|
+
|
|
34
|
+
Todo componente responde a três perguntas independentes com classes, então um visual novo nunca exige uma nova variante de componente:
|
|
35
|
+
|
|
36
|
+
- **Intenção: qual cor?** `.primary`, `.secondary`, `.success`, `.warning`, `.destructive` ou `.info`. Sem nenhuma, o componente fica neutro.
|
|
37
|
+
- **Apresentação: quanto dessa cor?** `.solid`, `.soft` ou `.ghost` define o preenchimento; `.edged` ou `.edgeless` define a borda.
|
|
38
|
+
- **Estética: do que ele é feito?** Uma classe opcional, como `.neobrutalism` ou `.glass`, muda cantos, espessura de borda, sombras e tipografia de tudo o que estiver dentro dela.
|
|
39
|
+
|
|
40
|
+
`<button class="btn destructive ghost edged">Delete account</button>` é um botão vermelho com contorno, e envolver a página em `.pixel` o transforma num botão em pixel art sem mexer no botão. [Montando uma tela](./concepts.md) apresenta cada eixo no momento em que a página de configurações precisa dele.
|
|
41
|
+
|
|
42
|
+
## CSS compilado ou código-fonte do Tailwind
|
|
43
|
+
|
|
44
|
+
O pacote entrega as mesmas classes de duas formas:
|
|
45
|
+
|
|
46
|
+
- **CSS compilado**, pronto para usar. Importe de qualquer bundler ou referencie o arquivo a partir de uma CDN. Você não precisa do Tailwind.
|
|
47
|
+
- **Código-fonte do Tailwind CSS v4**, em `@codenhub/styles/tw`. Use quando o seu projeto já roda Tailwind v4, para que o seu build compile o pacote junto com os seus próprios utilitários e tema.
|
|
48
|
+
|
|
49
|
+
A [Configuração](./setup.md) ajuda você a escolher.
|
|
50
|
+
|
|
51
|
+
## O que ele não faz
|
|
52
|
+
|
|
53
|
+
- **Nada de JavaScript.** Não há runtime, bindings para frameworks nem código gerado. Tudo o que precisa de script, como abrir um dialog, alternar o tema ou dispensar um tooltip, fica por conta do seu código.
|
|
54
|
+
- **Nada de semântica ou comportamento.** As classes pintam elementos; elas não acrescentam semântica de HTML, ARIA, tratamento de teclado, gerenciamento de foco, validação nem anúncios. A página de [Acessibilidade](./accessibility.md) traça a linha exata.
|
|
55
|
+
- **Nada de troca de tema.** Escolher entre claro e escuro é uma classe ou atributo que você define. O pacote separado `@codenhub/theme` pode lembrar e aplicar essa escolha para você.
|
|
56
|
+
- **Nada de fontes ou ícones.** Nenhum arquivo de fonte é baixado. Estéticas que pedem uma fonte especial usam uma fonte do sistema até você fornecer uma. Ícones, incluindo spinners de carregamento, vêm do seu próprio conjunto de ícones, como o `@codenhub/icons`.
|
|
57
|
+
- **Nada de aliases de compatibilidade.** Uma classe ou token removido aparece no changelog, não fica mantido com o nome antigo.
|
|
58
|
+
|
|
59
|
+
## Trade-offs
|
|
60
|
+
|
|
61
|
+
Conheça estes custos antes de adotar o pacote:
|
|
62
|
+
|
|
63
|
+
- **Os nomes de classe são curtos e sem prefixo.** `.primary`, `.success`, `.dark`, `.label`, `.field`, `.section`, `.stack`, `.flat` e `.ghost` são nomes globais. Outra folha de estilos na mesma página que use esses nomes colide com esta. O pacote fica em [camadas de cascata](./setup.md#camadas-de-cascata), então o seu próprio CSS fora de camadas vence uma colisão, mas as regras de uma biblioteca de terceiros para o mesmo nome continuam valendo junto com as do pacote.
|
|
64
|
+
- **As folhas de estilos completas são grandes antes da compressão.** No momento em que este texto foi escrito, minificada, a folha de estilos completa tem cerca de 410 KB, a `/native` cerca de 575 KB e a `/components` cerca de 320 KB. Servidas com gzip, ficam em cerca de 19 KB, 25 KB e 15 KB. Os arquivos específicos são bem menores: `/theme` tem cerca de 10 KB (2 KB com gzip) e cada estética tem de 4 a 21 KB (1 a 2 KB com gzip). A maior parte do tamanho é composição que todo componente repete, e é por isso que a compressão elimina tanto. Importe o entrypoint mais restrito que cubra a página; veja [Configuração → Todos os entrypoints](./setup.md#todos-os-entrypoints).
|
|
65
|
+
- **`--color-foreground` é um fundo, não uma cor de texto.** É o tom um passo distante da página, sobre o qual fica um card ou painel discreto. A cor do texto é `--color-text`.
|
|
66
|
+
- **Quatro cores de hover são valores fixos.** `--color-success-hover`, `--color-warning-hover`, `--color-destructive-hover` e `--color-info-hover` são pré-calculadas, porque misturá-las em tempo real travava o WebKit. Se você sobrescrever só `--color-success`, o hover dela mantém o tom antigo, então substitua a família inteira; veja [Temas → Tokens de cor](./usage/theming.md#tokens-de-cor).
|
|
67
|
+
- **Só navegadores modernos.** Chrome 123, Safari 17.5 ou Firefox 128 e mais recentes. Não há camada de fallback para navegadores mais antigos.
|
|
68
|
+
|
|
69
|
+
## O que conta como suportado
|
|
70
|
+
|
|
71
|
+
Uma combinação de classes é suportada quando esta documentação a descreve e a demo pública em [demo.codenhub.dev/styles](https://demo.codenhub.dev/styles/) a mostra. A demo renderiza as fixtures de teste do pacote, incluindo as matrizes completas de intenção, apresentação e estética, usando o CSS gerado pelo build. Uma combinação que não está documentada nem aparece na demo pode até gerar CSS, mas não é mantida e pode mudar em qualquer versão.
|
|
72
|
+
|
|
73
|
+
A demo é reconstruída a partir da branch main, não a cada versão. Ela pode mostrar trabalho ainda não lançado, então, quando a demo e esta documentação discordarem sobre uma versão já lançada, valem a documentação e o [changelog](../changelog/index.md) daquela versão.
|
|
74
|
+
|
|
75
|
+
## Versionamento
|
|
76
|
+
|
|
77
|
+
O pacote está abaixo da 1.0 e segue a [regra do versionamento semântico para versões 0.x](https://semver.org/lang/pt-BR/#spec-item-4): a superfície pública ainda pode mudar entre versões minor.
|
|
78
|
+
|
|
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
|
+
- Uma versão patch, como da 0.7.0 para a 0.7.1, nunca quebra.
|
|
81
|
+
|
|
82
|
+
O range padrão do npm para uma dependência nova, `^0.7.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
|
+
|
|
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
|
+
|
|
86
|
+
## Ordem de leitura
|
|
87
|
+
|
|
88
|
+
Na primeira vez, leia nesta ordem. Cada página acrescenta algo à tela de configurações e termina indicando a próxima.
|
|
89
|
+
|
|
90
|
+
1. [Configuração](./setup.md): instale o pacote, escolha entre CSS compilado ou código-fonte do Tailwind e renderize a estrutura vazia da página.
|
|
91
|
+
2. [Integração](./integrating/index.md): só se você usa Next.js, Vue, Svelte, Astro, Tailwind v4 ou nenhum bundler. Cada guia devolve você ao caminho principal.
|
|
92
|
+
3. [Montando uma tela](./concepts.md): organize o layout da página, defina a tipografia e adicione um card e um botão de salvar, aprendendo intenção, preenchimento e borda pelo caminho.
|
|
93
|
+
4. [Uso](./usage/index.md): o resto da tela, nesta ordem:
|
|
94
|
+
- [Botões](./usage/buttons.md): ações secundárias e destrutivas, tamanhos, botões de ícone e estados desabilitados.
|
|
95
|
+
- [Formulários](./usage/forms.md): campos com rótulo, dicas, erros, ícones, selects, checkboxes, radios e switches.
|
|
96
|
+
- [Feedback](./usage/feedback.md): um estado de salvamento, um alerta de sucesso, um badge de plano, um placeholder de carregamento e uma barra de uso.
|
|
97
|
+
- [Tooltips](./usage/tooltips.md): ajuda de campo que funciona com mouse, teclado e leitor de tela.
|
|
98
|
+
- [Temas](./usage/theming.md): modo claro e escuro, cores da marca e suas próprias intenções.
|
|
99
|
+
- [Estéticas](./usage/aesthetics.md): mude o estilo da tela inteira com uma classe.
|
|
100
|
+
- [Classes solo](./usage/solo.md): aplique uma estética a um componente que este pacote não estiliza.
|
|
101
|
+
- [Composição](./usage/composing.md), [Personalização](./usage/customizing.md) e [Conteúdo e layout](./usage/content-and-layout.md): páginas de consulta com cada regra de eixo, token, padrão e classe utilitária.
|
|
102
|
+
5. [Acessibilidade](./accessibility.md): o que o CSS resolve por você e o que a sua aplicação ainda precisa fazer.
|
|
103
|
+
|
|
104
|
+
O [changelog](../changelog/index.md) lista todas as versões e o que mudou em cada uma.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Astro
|
|
3
|
+
description: Como carregar a folha de estilos numa aplicação Astro.
|
|
4
|
+
order: 5
|
|
5
|
+
source: 4f93b3a6e0d1cd24a0b7d0eb6050cc98690cd598
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Astro
|
|
9
|
+
|
|
10
|
+
O Astro renderiza componentes de forma estática por padrão, mas o import de uma folha de estilos global ainda só precisa acontecer uma vez — a partir de um layout compartilhado, não de páginas ou islands individuais.
|
|
11
|
+
|
|
12
|
+
## Importe a folha de estilos
|
|
13
|
+
|
|
14
|
+
```astro
|
|
15
|
+
---
|
|
16
|
+
// src/layouts/Layout.astro
|
|
17
|
+
import "@codenhub/styles";
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<html lang="en">
|
|
21
|
+
<body>
|
|
22
|
+
<slot />
|
|
23
|
+
</body>
|
|
24
|
+
</html>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Toda página que usa esse layout carrega a folha de estilos uma vez. Usa Tailwind CSS v4? Em vez disso, importe `@codenhub/styles/tw` pela integração de Tailwind do Astro — veja [Tailwind CSS v4](./tailwind.md), incluindo quando um `@source` explícito é realmente necessário.
|
|
28
|
+
|
|
29
|
+
## Force um tema
|
|
30
|
+
|
|
31
|
+
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).
|
|
32
|
+
|
|
33
|
+
## A seguir
|
|
34
|
+
|
|
35
|
+
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,47 @@
|
|
|
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: f2ccb27bbdbe15278726278864c01a586505eb16
|
|
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, Django ou qualquer aplicação sem etapa de build de CSS | [Sem bundler](./without-a-bundler.md) |
|
|
32
|
+
|
|
33
|
+
Um projeto sem framework — um build simples com Vite, webpack ou Parcel — não precisa de nada além de [Configuração → Importe a folha de estilos](../setup.md#importe-a-folha-de-estilos): importe a folha de estilos compilada a partir do arquivo CSS global que o projeto já tem.
|
|
34
|
+
|
|
35
|
+
## Conferindo se funcionou
|
|
36
|
+
|
|
37
|
+
Depois do import, renderize um elemento estilizado e confirme que ele pegou os tokens do pacote, e não o padrão do navegador:
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<button class="btn primary">Save changes</button>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
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.
|
|
44
|
+
|
|
45
|
+
## A seguir
|
|
46
|
+
|
|
47
|
+
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,78 @@
|
|
|
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: 7988dc023c91950991a720ea7da7edfe3378d4d7
|
|
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 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 de `dist/tw`; 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 `/tw` já entrega a definição de todas as classes que publica, então varrê-lo também só deixa o build mais lento, sem acrescentar classes.
|
|
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
|
+
## Solução de problemas
|
|
51
|
+
|
|
52
|
+
**As classes não resultam em nenhum estilo**
|
|
53
|
+
|
|
54
|
+
- **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.
|
|
55
|
+
- **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.
|
|
56
|
+
- **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).
|
|
57
|
+
|
|
58
|
+
**Regras de token e de reset duplicadas**
|
|
59
|
+
|
|
60
|
+
- **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.
|
|
61
|
+
- **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.
|
|
62
|
+
- **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`.
|
|
63
|
+
|
|
64
|
+
**Uma classe montada em tempo de execução fica sem estilo**
|
|
65
|
+
|
|
66
|
+
- **O que aconteceu:** `<button class="btn primary">` é estilizado, mas um botão cuja intenção vem de uma variável, como `` `btn ${tone}` ``, não é.
|
|
67
|
+
- **Por quê:** o Tailwind só gera uma classe quando encontra o nome completo nos seus arquivos de código. As classes de componente e de eixo do próprio pacote são sempre geradas, mas os seus próprios utilitários não, e um nome montado a partir de strings é invisível para a varredura.
|
|
68
|
+
- **Como resolver:** escreva os nomes de classe completos no seu código, por exemplo num objeto de consulta (`{ save: "btn primary", remove: "btn destructive" }`), ou liste os nomes que o seu código pode produzir com `@source inline("...")` na sua folha de estilos.
|
|
69
|
+
|
|
70
|
+
Todo entrypoint `/tw` exige Tailwind CSS 4.3.2 ou mais recente, abaixo da 5: o código-fonte usa `@source not` e `@source inline()`, que chegaram na 4.1, e é testado com a 4.3.2.
|
|
71
|
+
|
|
72
|
+
## A variante `dark:`
|
|
73
|
+
|
|
74
|
+
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).
|
|
75
|
+
|
|
76
|
+
## A seguir
|
|
77
|
+
|
|
78
|
+
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.
|