@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,256 @@
1
+ ---
2
+ title: Formulários
3
+ description: Campos com rótulo, dicas e erros, ícones e prefixos fixos, selects e toggles de checkbox, radio e switch.
4
+ order: 2
5
+ source: 00e6a57cfd62f524fde5a550af721786edd7a5dd
6
+ ---
7
+
8
+ # Formulários
9
+
10
+ O card de perfil tem um botão de salvar, mas nada para salvar. Esta página o preenche: um nome de exibição com uma dica, um endereço de e-mail que mostra um erro de validação, um endereço de perfil com prefixo fixo, um select de idioma e os toggles de notificações, cobrança e visibilidade do perfil. O pacote estiliza cada controle; o seu HTML fornece os rótulos, a validação e as mensagens de erro, e esta página mostra como ligar uma coisa à outra.
11
+
12
+ ## Um campo com rótulo
13
+
14
+ Um campo é um rótulo, um controle e uma dica opcional, empilhados:
15
+
16
+ ```html
17
+ <div class="field">
18
+ <label class="label" for="display-name">Display name</label>
19
+ <input class="ipt" id="display-name" name="display-name" aria-describedby="display-name-hint" />
20
+ <span class="hint" id="display-name-hint">Shown on invoices and shared projects.</span>
21
+ </div>
22
+ ```
23
+
24
+ - `.field` empilha os filhos com um espaçamento pequeno (0.35rem) e ocupa a largura toda.
25
+ - `.label` define o texto do rótulo: 1rem, peso médio.
26
+ - `.hint` é um texto de ajuda menor, na cor secundária. Mantenha-o fora do `<label>` e aponte o `aria-describedby` para ele, para que um leitor de tela o anuncie como descrição em vez de lê-lo como parte do nome do campo.
27
+ - `.ipt` estiliza um `<input>`. Use `.textarea` para um `<textarea>` e `.select` para um `<select>`.
28
+
29
+ Um controle de texto tem pelo menos 2.5rem de altura (`--control-height`), a mesma altura de um botão padrão, então um campo e um botão ficam alinhados numa linha. O visual padrão dele é sem preenchimento e com borda. Um `.textarea` tem pelo menos 7rem de altura e pode ser redimensionado na vertical.
30
+
31
+ ### Tamanhos
32
+
33
+ `.ipt`, `.select`, `.textarea` e `.input-group` aceitam as classes de tamanho do botão, então um campo pequeno e um botão pequeno ficam alinhados numa linha:
34
+
35
+ | Classe | Altura | Padding lateral | Texto |
36
+ | ------ | ------ | --------------- | --------- |
37
+ | `.sm` | 2rem | 0.625rem | 0.875rem |
38
+ | padrão | 2.5rem | 0.75rem | herdado |
39
+ | `.lg` | 3rem | 1rem | 1.0625rem |
40
+
41
+ Os cantos acompanham o tamanho, como num botão. Um `.textarea` mantém a altura mínima de 7rem em todos os tamanhos; a classe muda o texto, o padding e os cantos dele. Defina o tamanho de um `.input-group` no grupo, não no controle dentro dele: o controle e os adornos recebem o tamanho de texto do grupo.
42
+
43
+ ```html
44
+ <div class="cluster tight">
45
+ <input class="ipt sm" aria-label="Coupon code" />
46
+ <button class="btn sm" type="button">Apply</button>
47
+ </div>
48
+ ```
49
+
50
+ ## Mostre um erro de validação
51
+
52
+ Marque o controle como inválido com `aria-invalid="true"` e dê à mensagem de erro `.hint.destructive`:
53
+
54
+ ```html
55
+ <div class="field">
56
+ <label class="label" for="email">Email</label>
57
+ <input class="ipt" type="email" id="email" name="email" value="ada@" aria-invalid="true" aria-describedby="email-error" />
58
+ <span class="hint destructive" id="email-error">Enter a full email address, such as ada@example.com.</span>
59
+ </div>
60
+ ```
61
+
62
+ Um controle inválido desenha a borda, o anel de foco e o texto digitado na cor destrutiva, seja qual for a classe de intenção dele. O texto usa o tom legível dessa cor, `--intent-strong`, para continuar legível na página. O pacote só pinta o estado: decidir que o valor é inválido, definir e remover o `aria-invalid` e escrever a mensagem ficam por conta do seu código. Remova o `aria-invalid` assim que o valor voltar a ser válido; se ele continuar definido, o campo continua vermelho. Num checkbox, radio ou switch, `aria-invalid="true"` desenha o toggle exatamente como `.destructive` desenha, marca de seleção incluída.
63
+
64
+ Um hint aceita qualquer uma das seis intenções embutidas, não só `.destructive`: `.hint.success` confirma que um valor foi aceito, e `.hint.warning` sinaliza um valor permitido, mas incomum. Cada um aparece no tom legível da sua intenção, `--intent-strong`, que mantém 4.5:1 em relação à página nos dois temas. Um hint sem intenção, com `.neutral` ou com uma [intenção que você mesmo definiu](./theming.md#sua-própria-intenção) continua na cor secundária. Só uma classe no próprio hint o colore; uma intenção no campo ou num contêiner em volta dele não.
65
+
66
+ ```html
67
+ <input class="ipt success" id="username" value="ada" aria-describedby="username-hint" /> <span class="hint success" id="username-hint">That username is available.</span>
68
+ ```
69
+
70
+ ## Monte o formulário de perfil
71
+
72
+ ```html
73
+ <form class="card stack" aria-labelledby="profile-title">
74
+ <h2 class="text-title-sm" id="profile-title">Profile</h2>
75
+
76
+ <div class="field">
77
+ <label class="label" for="display-name">Display name</label>
78
+ <input class="ipt" id="display-name" name="display-name" value="Ada Lovelace" aria-describedby="display-name-hint" />
79
+ <span class="hint" id="display-name-hint">Shown on invoices and shared projects.</span>
80
+ </div>
81
+
82
+ <div class="field">
83
+ <label class="label" for="email">Email</label>
84
+ <input class="ipt" type="email" id="email" name="email" value="ada@example.com" />
85
+ </div>
86
+
87
+ <div class="field">
88
+ <label class="label" for="bio">Bio</label>
89
+ <textarea class="textarea" id="bio" name="bio" rows="3"></textarea>
90
+ </div>
91
+
92
+ <div class="field">
93
+ <label class="label" for="language">Language</label>
94
+ <select class="select" id="language" name="language">
95
+ <option>English</option>
96
+ <option>Português</option>
97
+ <option>Español</option>
98
+ </select>
99
+ </div>
100
+
101
+ <div class="cluster">
102
+ <button class="btn primary" type="submit">Save changes</button>
103
+ <button class="btn ghost" type="reset">Cancel</button>
104
+ </div>
105
+ </form>
106
+ ```
107
+
108
+ Um `.select` desenha a sua própria seta. Com `multiple` ou com `size` maior que 1, ele vira uma caixa de listagem: sem seta, com a altura das linhas que mostra. A lista aberta de opções é desenhada pelo navegador e pelo sistema operacional, então ela não pega o visual do pacote.
109
+
110
+ ## Adicione um ícone ou um prefixo fixo
111
+
112
+ `.input-group` coloca um ícone ou um trecho de texto dentro da borda de um campo. O grupo desenha a borda, o fundo, o anel de foco e os estados inválido e desabilitado; o controle dentro dele abre mão dos seus, para que a borda seja desenhada uma vez só. Coloque o adorno antes do controle para que ele fique no início, ou depois para que fique no fim. Um grupo tem a altura de um campo sozinho, então fica alinhado com os campos e botões ao lado dele.
113
+
114
+ O endereço do perfil sempre começa com o mesmo host, então ele é um prefixo fixo:
115
+
116
+ ```html
117
+ <div class="field">
118
+ <label class="label" for="profile-url">Profile address</label>
119
+ <div class="input-group" style="--input-group-gap: 0">
120
+ <span>app.example.com/u/</span>
121
+ <input class="ipt" id="profile-url" name="profile-url" value="ada" />
122
+ </div>
123
+ </div>
124
+ ```
125
+
126
+ O espaçamento entre o controle e o adorno é `--input-group-gap`, 0.5rem por padrão. Isso funciona bem para um ícone, mas um texto que deve parecer parte do valor fica estranho com um espaço depois dele, então o exemplo define o valor como `0`. Defina-o no próprio `.input-group`: o grupo declara o seu próprio padrão, então um valor definido num elemento pai não tem efeito. Ela é uma das seis [variáveis públicas de componente](./customizing.md#variáveis-de-componente).
127
+
128
+ Uma busca de membros, com um ícone no início (as classes `ic-lucide-*` precisam do `@codenhub/icons` carregado; veja [Botões → Carregando ícones](./buttons.md#carregando-ícones)):
129
+
130
+ ```html
131
+ <div class="field">
132
+ <label class="label" for="member-search">Find a member</label>
133
+ <div class="input-group">
134
+ <i class="ic-lucide-search" aria-hidden="true"></i>
135
+ <input class="ipt" type="search" id="member-search" name="q" />
136
+ </div>
137
+ </div>
138
+ ```
139
+
140
+ Um `.select` também funciona num grupo. O grupo remove o padding lateral do controle, exceto no fim de um select de uma linha, que mantém 1.75rem para que o texto da opção escolhida não passe por baixo da seta.
141
+
142
+ Qualquer elemento serve de adorno: uma classe de ícone, um `<svg>` inline, um `<img>` ou texto. O pacote não entrega ícones para campos, porque uma imagem embutida não conseguiria acompanhar a cor do seu texto, o seu tema ou a sua estética.
143
+
144
+ O grupo lê intenção e apresentação do mesmo jeito que um `.ipt` sozinho: `.input-group.primary` colore a borda e o texto digitado, e `.input-group.soft.edgeless` é um campo afundado na página. Coloque a intenção no grupo, não no controle de dentro: o grupo desenha o campo, então o texto do controle recebe a intenção do grupo, e uma classe de intenção no controle não tem efeito. `aria-invalid="true"` ou `disabled` no controle de dentro se aplica ao grupo inteiro, e o mesmo vale para qualquer um dos dois no próprio grupo. O anel de foco do grupo aparece quando o campo dele tem foco, então, diferente de um campo sozinho, ele também aparece depois de um clique do mouse. Um botão dentro do grupo, como um botão de limpar, desenha o seu próprio anel quando tem foco, e o grupo não desenha nenhum: um único anel sempre marca o único controle que tem foco.
145
+
146
+ ## Decorações do navegador
147
+
148
+ Alguns tipos de input vêm com botões embutidos: o botão de seletor de um campo de data ou hora, as setas para cima e para baixo de um campo numérico e o botão de limpar de um campo de busca. O pacote os mantém, porque cada um também faz alguma coisa: o botão de seletor é o único jeito de abrir o seletor com o mouse, e o botão de limpar esvazia o campo.
149
+
150
+ `.unadorned` os remove, para um campo em que você desenha os seus próprios. Coloque a classe no controle ou no `.input-group` dele. Remover uma decoração remove o que ela fazia, então ligue o seu substituto você mesmo: `input.showPicker()` abre um seletor, `stepUp()` e `stepDown()` substituem as setas, e definir `value` como `""` e disparar um evento `input` substitui um botão de limpar. Digitar continua funcionando em qualquer caso. O Firefox não oferece um jeito de remover o botão do seletor de data, então ele continua lá.
151
+
152
+ ```html
153
+ <div class="field">
154
+ <label class="label" for="member-filter">Find a member</label>
155
+ <div class="input-group unadorned">
156
+ <i class="ic-lucide-search" aria-hidden="true"></i>
157
+ <input class="ipt" type="search" id="member-filter" name="q" />
158
+ <button class="btn icon ghost p-xs" type="button" aria-label="Clear search">
159
+ <i class="ic-lucide-x" aria-hidden="true"></i>
160
+ </button>
161
+ </div>
162
+ </div>
163
+ ```
164
+
165
+ O botão de limpar acima é um `<button>` de verdade, com nome acessível. Um botão dentro de um grupo mantém as suas próprias classes: um `.btn.ghost` não tem preenchimento e, como todo botão por padrão, não tem borda, então ele fica dentro da borda do campo sem desenhar uma própria.
166
+
167
+ ## Toggles
168
+
169
+ A tela de configurações tem três tipos de toggle: um checkbox para optar por receber e-mails de fatura, radio buttons para escolher o período de cobrança e um switch para deixar o perfil público. Cada classe vai num `<input>` nativo do tipo correspondente:
170
+
171
+ ```html
172
+ <fieldset class="stack tight">
173
+ <legend class="label">Notifications</legend>
174
+ <label class="cluster tight">
175
+ <input class="checkbox" type="checkbox" name="invoice-email" checked />
176
+ Email me when an invoice is ready
177
+ </label>
178
+ </fieldset>
179
+
180
+ <fieldset class="stack tight">
181
+ <legend class="label">Billing period</legend>
182
+ <label class="cluster tight">
183
+ <input class="radio" type="radio" name="period" value="monthly" />
184
+ Monthly
185
+ </label>
186
+ <label class="cluster tight">
187
+ <input class="radio" type="radio" name="period" value="yearly" checked />
188
+ Yearly, two months free
189
+ </label>
190
+ </fieldset>
191
+
192
+ <label class="cluster tight">
193
+ <input class="switch primary" type="checkbox" role="switch" name="public-profile" />
194
+ Public profile
195
+ </label>
196
+ ```
197
+
198
+ - `.checkbox` vai em `type="checkbox"`, `.radio` em `type="radio"` e `.switch` em `type="checkbox"`. Dê você mesmo `role="switch"` a um switch, para que ele seja anunciado como ligado ou desligado, e não como marcado.
199
+ - `.cluster.tight` no `<label>` alinha o controle com o texto e deixa um espaçamento de 0.5rem.
200
+ - Um checkbox com a propriedade `indeterminate` definida, para um grupo em que só alguns itens estão marcados, mostra um traço, e mantém o traço mesmo quando também está `checked`, como faz o checkbox nativo do navegador. Defina-a por script (`input.indeterminate = true`); não existe atributo para isso.
201
+
202
+ ### Cores de marcado e desmarcado
203
+
204
+ Uma classe de intenção define a cor de marcado. Sem intenção, um toggle marcado é preenchido com a cor do texto, e a marca é desenhada na cor da página: uma caixa preta com um visto branco numa página clara. Diferente de um botão neutro, um toggle neutro é preenchido por completo quando marcado.
205
+
206
+ A apresentação muda só o visual desmarcado. Todo toggle fica em `.soft` por padrão; depois de marcado, cada um tem um único visual, seja qual for a apresentação:
207
+
208
+ | Toggle | Preenchimento desmarcado | Marcado |
209
+ | --------------- | ------------------------ | ------------------------------------------------------ |
210
+ | `.ghost` | 0% | 100% de preenchimento, com a marca na cor de contraste |
211
+ | `.soft`, padrão | 12% | 100% de preenchimento, com a marca na cor de contraste |
212
+ | `.solid` | 40% | 100% de preenchimento, com a marca na cor de contraste |
213
+
214
+ Um checkbox marcado e um switch marcado recortam a marca da placa preenchida. Um radio marcado engrossa o anel para o dobro da espessura de linha em repouso, até 3px, ganha a cor cheia da intenção nele e mostra um ponto. O limite de 3px impede que o anel engula o ponto numa estética de linha grossa.
215
+
216
+ `.checkbox` e `.radio` sempre desenham a borda, mesmo com `.edgeless`, porque a borda é a única coisa que mostra uma caixa desmarcada. `.switch.ghost` também mantém a borda, já que, sem preenchimento e sem borda, nada marcaria o trilho. Esses casos estão listados em [Composição](./composing.md#referência-de-eixos-por-componente).
217
+
218
+ Uma estética que desenha a borda como uma sombra interna, como a `.pixel`, não consegue deixar essa sombra mais larga que a espessura da borda do toggle. Um checkbox de 16px ou um switch de 20px não tem espaço para um anel interno mais grosso sem cobrir a marca. Isso só importa se você mesmo definir `--ui-shadow-spread`; veja [Personalização → Tokens de material](./customizing.md#tokens-de-material).
219
+
220
+ ## Preenchimento e borda em controles de texto
221
+
222
+ Controles de texto aceitam intenção, que colore a borda, o anel de foco e o texto digitado, este no tom legível da intenção (`--intent-strong`). Eles também aceitam os dois eixos de apresentação. O preenchimento deles tem um teto baixo, para que o texto digitado continue legível:
223
+
224
+ | Num controle de texto | Preenchimento |
225
+ | ------------------------------------------------------------------ | ------------- |
226
+ | `.ghost`, padrão | 0% |
227
+ | Qualquer preenchimento vindo de um contêiner (`.soft` ou `.solid`) | 6% |
228
+ | `.soft` no controle | 12% |
229
+ | `.solid` no controle | 20% |
230
+
231
+ O preenchimento de um contêiner é pensado para as superfícies dentro dele, então um campo sem classe pega só um leve 6% dele. Para mais, coloque a classe no próprio campo.
232
+
233
+ A borda funciona do mesmo jeito. Um `.edgeless` herdado de um contêiner é ignorado, para que uma toolbar não deixe um campo sem contorno visível. Um `.edgeless` escrito no próprio controle é respeitado: é assim que você pede um campo sem borda. Um campo sem borda não atende ao requisito de contraste do WCAG 1.4.11 para o limite de um controle, então ele nunca é o padrão; o anel de foco dele continua aparecendo.
234
+
235
+ ```html
236
+ <input class="ipt success" placeholder="Matches your current password" />
237
+ <input class="ipt soft edged" placeholder="Tinted, with a border" />
238
+ <input class="ipt soft edgeless" placeholder="Sunk into the page" />
239
+ <div class="soft">
240
+ <input class="ipt" placeholder="A container's .soft gives a 6% tint" />
241
+ </div>
242
+ ```
243
+
244
+ Em repouso, a borda de um campo é propositalmente mais clara que 3:1 em relação à página, para que o hover e o foco tenham uma mudança visível a fazer. [Acessibilidade → Limites dos controles](../accessibility.md#limites-dos-controles) explica esse trade-off e como conseguir uma borda mais forte.
245
+
246
+ ## Controles desabilitados
247
+
248
+ `disabled`, `aria-disabled="true"`, `data-disabled` ou `.disabled` num controle o desenham com opacidade reduzida e cursor de não permitido. Assim como nos botões, só o atributo `disabled` impede a digitação; os outros mudam apenas a aparência.
249
+
250
+ ## Criando o seu próprio controle
251
+
252
+ Para um controle parecido com texto que o pacote não entrega, `.text-control` dá a um elemento os mesmos estilos de borda, placeholder, hover, foco, inválido e desabilitado do `.ipt`, sem a altura nem o padding dele. [Personalização → Helpers de composição](./customizing.md#helpers-de-composição) explica essa classe junto com os outros blocos de construção.
253
+
254
+ ## A seguir
255
+
256
+ O formulário já pode ser preenchido e enviado. [Feedback](./feedback.md) mostra o que a tela faz em seguida: um botão de salvar que avisa que está salvando, uma mensagem de sucesso, um badge de plano e uma barra de uso do armazenamento.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Visão geral
3
+ description: Os guias que terminam a tela de configurações e, depois, as páginas de consulta com cada classe, token e padrão.
4
+ group: Uso
5
+ order: 4
6
+ source: ccdf1949cd4f7688574d6f4fae9ad2cf34465fb3
7
+ ---
8
+
9
+ # Uso
10
+
11
+ Estes guias terminam a tela de configurações começada em [Montando uma tela](../concepts.md). Leia os sete primeiros em ordem: cada um acrescenta uma parte da tela e pressupõe os anteriores. As três seguintes são páginas de consulta; os guias mandam você para elas quando precisam da tabela completa, e você pode voltar sempre que precisar de um padrão ou de uma regra. A última, Predefinições, é para quando a tela já funciona e você cansou de digitar as mesmas classes.
12
+
13
+ Guias, em ordem:
14
+
15
+ 1. [Botões](./buttons.md): a ação destrutiva da zona de perigo, botões de ícone, tamanhos, links com cara de botão e estados desabilitados, além de como carregar ícones.
16
+ 2. [Formulários](./forms.md): o formulário de perfil, com rótulos, dicas, erros de validação, um input com ícone ou com prefixo fixo, um select e toggles de checkbox, radio e switch.
17
+ 3. [Feedback](./feedback.md): o que a tela mostra durante e depois do salvamento: um botão carregando, um alerta de sucesso, um badge de plano, um placeholder de carregamento e uma barra de uso do armazenamento.
18
+ 4. [Tooltips](./tooltips.md): texto de ajuda ao lado de um campo de formulário, como prepará-lo para quem usa teclado e leitor de tela, e onde um tooltip pode ser cortado.
19
+ 5. [Temas](./theming.md): modo claro e escuro, como trocar a paleta pelas cores da marca e como definir uma intenção própria, com as tabelas completas de tokens de cor e tokens fundamentais.
20
+ 6. [Estéticas](./aesthetics.md): os seis visuais opcionais, o que cada um muda e os seus limites.
21
+ 7. [Classes solo](./solo.md): como aplicar uma estética a um componente de outra biblioteca.
22
+
23
+ Páginas de consulta:
24
+
25
+ - [Composição](./composing.md): as regras completas para combinar intenção, apresentação e elevação, os padrões de cada componente e quais eixos cada componente lê.
26
+ - [Personalização](./customizing.md): tokens de apresentação e de material, ajustes de estética, as seis variáveis públicas de componente, a paleta gerada e os helpers de composição para montar os seus próprios componentes.
27
+ - [Conteúdo e layout](./content-and-layout.md): todos os utilitários de layout, a escala tipográfica, cards e painéis, tabelas, citações, código e teclas de teclado.
28
+
29
+ Quando a tela estiver funcionando:
30
+
31
+ - [Predefinições](./presets.md): defina um visual uma única vez, com classes de eixo em um contêiner, tokens de tema e de material, ou as suas próprias classes de componente feitas com `@apply`.
32
+
33
+ Quando terminar, a página de [Acessibilidade](../accessibility.md) reúne o que o CSS faz por você e o que a sua aplicação ainda deve aos usuários.
@@ -0,0 +1,92 @@
1
+ ---
2
+ title: Predefinições
3
+ description: Três formas de definir um visual uma única vez em vez de em cada elemento, e quando usar cada uma.
4
+ order: 11
5
+ source: 308b21076223635a3323bcfecb70abe3a9e6d1c7
6
+ ---
7
+
8
+ # Predefinições
9
+
10
+ A esta altura, a tela de configurações diz `btn primary soft sm` em uma dúzia de lugares, e mudar de ideia significa mudar uma dúzia de lugares. Esta página trata das três formas de definir um visual uma única vez: classes de eixo em um contêiner, tokens de tema e de material, e as suas próprias classes de componente feitas com `@apply`. Cada uma serve para um tipo diferente de "uma única vez".
11
+
12
+ ## Qual usar
13
+
14
+ | Você quer | Use |
15
+ | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
16
+ | Que todos os componentes de uma região compartilhem um preenchimento, uma borda ou um material | [Classes de eixo em um contêiner](#classes-de-eixo-em-um-contêiner) |
17
+ | Outras cores, cantos, bordas ou profundidade para uma página ou uma região | [Tokens de tema e de material](#tokens-de-tema-e-de-material) |
18
+ | Um nome para uma receita que você repete, como "o botão de salvar" | [Suas próprias classes de componente](#suas-próprias-classes-de-componente) |
19
+
20
+ Elas se combinam. Uma região pode definir um token de material, ficar sob uma estética e conter a sua própria classe de botão, e cada elemento ainda pode sobrescrever o que herda.
21
+
22
+ ## Classes de eixo em um contêiner
23
+
24
+ Algumas classes funcionam num contêiner além de num componente, e tudo dentro dele as recebe:
25
+
26
+ - As classes de apresentação: `.solid`, `.soft`, `.ghost`, `.edged` e `.edgeless`.
27
+ - Os padrões de canto: `.cut-diagonal` e `.cut-diagonal-reverse`.
28
+ - As [estéticas](./aesthetics.md), como `.glass` ou `.pixel`.
29
+
30
+ ```html
31
+ <div class="cluster soft edged">
32
+ <button class="btn primary" type="button">Negrito</button>
33
+ <button class="btn" type="button">Itálico</button>
34
+ <button class="btn destructive solid" type="button">Limpar formatação</button>
35
+ </div>
36
+ ```
37
+
38
+ Os botões da barra são soft e com borda, e o último pede o próprio preenchimento. Uma classe no elemento sempre vence a de um contêiner.
39
+
40
+ Os outros eixos não são herdados. A intenção, a elevação (`.flat`, `.raised`, `.floating`) e o tamanho (`.sm`, `.lg`) mudam só o elemento em que estão, então uma barra `.sm` não encolhe os seus botões; [Composição → Combinando classes](./composing.md#combinando-classes) explica por quê. Uma classe de estética também define o próprio padrão de canto na sua região, então um `.cut-diagonal` acima de uma região `.pixel` não chega dentro dela.
41
+
42
+ Use uma classe de contêiner quando o visual pertence à região, como uma barra lateral discreta, e não aos componentes dentro dela.
43
+
44
+ ## Tokens de tema e de material
45
+
46
+ Tokens são propriedades personalizadas de CSS. Defina um no `:root` e a página inteira segue; defina num elemento e só o que está dentro segue. Eles vão mais longe que as classes, porque os componentes os leem enquanto são desenhados:
47
+
48
+ ```css
49
+ .admin {
50
+ --radius-control: 0.25rem;
51
+ --radius-surface: 0.5rem;
52
+ --border-width: 2px;
53
+ }
54
+ ```
55
+
56
+ Todo botão, campo, balão de tooltip e superfície dentro de `.admin` recebe os cantos mais fechados e a borda mais grossa, sem classe em nenhum deles. Checkboxes, `.kbd` e `.code` mantêm o próprio canto menor, `--radius-small`.
57
+
58
+ As tabelas ficam onde os tokens são explicados, então esta página não as repete:
59
+
60
+ - [Temas → Tokens de cor](./theming.md#tokens-de-cor): cores de marca e de status, nos dois temas.
61
+ - [Temas → Tokens fundamentais](./theming.md#tokens-fundamentais): cantos, largura da borda, altura dos controles, anel de foco, profundidade e movimento.
62
+ - [Personalização → Tokens de apresentação](./customizing.md#tokens-de-apresentação): quanto um preenchimento, uma borda ou um hover acrescenta.
63
+ - [Personalização → Tokens de material](./customizing.md#tokens-de-material): o que uma estética define, e que você mesmo pode definir, como `--ui-radius`.
64
+ - [Personalização → Tokens de estética](./customizing.md#tokens-de-estética): os ajustes de cada estética, como `--neo-offset`.
65
+
66
+ Use tokens quando a mudança é um valor, como uma cor ou um canto, e não uma escolha entre classes.
67
+
68
+ ## Suas próprias classes de componente
69
+
70
+ Com os entrypoints de código-fonte do Tailwind, todo componente, helper e classe de eixo é um utilitário do Tailwind, então uma classe sua pode carregar a receita inteira:
71
+
72
+ ```css
73
+ @import "@codenhub/styles/tw";
74
+
75
+ @utility btn-save {
76
+ @apply btn primary soft sm;
77
+ }
78
+ ```
79
+
80
+ ```html
81
+ <button class="btn-save" type="submit">Salvar alterações</button>
82
+ ```
83
+
84
+ `btn-save` se comporta como `btn primary soft sm` escrito por extenso, com estéticas e hover incluídos, e mudar a receita muda todos os botões de salvar. Modificadores que pertencem a um componente, como `.tight` no `.stack` ou `.icon` no `.btn`, também são utilitários, então `@apply btn icon` dá a você um botão de ícone próprio. [Tailwind CSS v4 → Construa seus próprios componentes com `@apply`](../integrating/tailwind.md#construa-seus-próprios-componentes-com-apply) tem as regras, inclusive por que `@utility` é melhor que uma regra simples.
85
+
86
+ Com o CSS compilado não existe `@apply`. Mantenha a receita num único lugar do outro lado: um partial de template, um componente do seu framework ou uma constante como `const saveButton = "btn primary soft sm"`.
87
+
88
+ Use a sua própria classe quando a mesma combinação nomeia uma única coisa no seu design, como o botão de salvar ou o card de plano.
89
+
90
+ ## A seguir
91
+
92
+ A página de [Acessibilidade](../accessibility.md) lista o que o CSS faz pelos seus usuários e o que a sua aplicação ainda deve a eles.
@@ -0,0 +1,86 @@
1
+ ---
2
+ title: Classes solo
3
+ description: Como aplicar uma estética a um único elemento de outra biblioteca, como um toast ou um dialog, e o que uma classe solo lê e ignora.
4
+ order: 7
5
+ source: c44308a8768737292529d4f93b703b3fa200255a
6
+ ---
7
+
8
+ # Classes solo
9
+
10
+ Suponha que a tela de configurações mostre "Profile saved" num toast de uma biblioteca de notificações, e não no alerta deste pacote. Sob `.neobrutalism`, todo card e botão tem o contorno grosso e a sombra dura, e o toast não: uma classe de estética só define valores que os componentes deste pacote leem, então não muda nada num elemento que o pacote não estiliza. Uma classe solo aplica a estética diretamente no único elemento que a carrega:
11
+
12
+ ```html
13
+ <div class="toast neobrutalism-solo success" role="status">Profile saved.</div>
14
+ ```
15
+
16
+ ## As seis classes solo
17
+
18
+ Cada estética entrega a sua classe solo no mesmo entrypoint, e uma classe solo não precisa de mais nada carregado:
19
+
20
+ ```css
21
+ /* The only stylesheet from this package on the page. */
22
+ @import "@codenhub/styles/aesthetics/glass";
23
+ ```
24
+
25
+ ```html
26
+ <div class="toast glass-solo">A pane over whatever is behind it.</div>
27
+ ```
28
+
29
+ | Estética | Classe solo | Desenha |
30
+ | --------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
31
+ | `.glass` | `.glass-solo` | Um fundo translúcido, uma borda fina de brilho, o desfoque, uma sombra suave em duas camadas e o canto de superfície. Com `.glass-liquid`, a placa liquid, desenhada no seu `::before` e `::after`. |
32
+ | `.neobrutalism` | `.neobrutalism-solo` | Uma borda de 2px na cor da tinta, cantos retos e a sombra dura deslocada. |
33
+ | `.pixel` | `.pixel-solo` | O contorno escalonado, o anel interno no lugar de uma borda e a fonte pixelada. |
34
+ | `.chunky-tile` | `.chunky-tile-solo` | O canto do bloco, uma borda de 2px, a barra embaixo dele e a fonte arredondada. |
35
+ | `.cyber` | `.cyber-solo` | A diagonal de superfície (a diagonal de controle num botão ou link), uma borda de 1px, o brilho e a fonte. |
36
+ | `.sketch` | `.sketch-solo` | Cantos elípticos irregulares (um contorno mais fechado numa placa, um mais solto num botão ou link, e cantos pequenos e arredondados com `.sketch-rounded`), uma linha de tinta sólida de 1px, a sombra deslocada de 2px e a fonte manuscrita. |
37
+
38
+ Não coloque uma classe solo nos componentes deste pacote. Um `.card` já desenha o seu preenchimento, a sua borda e a sua intenção, e uma classe solo desenharia uma segunda borda e um segundo preenchimento por cima deles. Use a classe de estética ali; ela também funciona num único elemento: `<button class="btn pixel">`.
39
+
40
+ ## O que uma classe solo lê
41
+
42
+ Um elemento solo aceita as mesmas classes de apresentação, intenção e elevação que um `.card` aceitaria:
43
+
44
+ ```html
45
+ <div class="toast pixel-solo edgeless">No ring</div>
46
+ <div class="toast glass-solo solid success">An opaque green pane</div>
47
+ <div class="toast neobrutalism-solo flat">No offset shadow</div>
48
+
49
+ <section class="soft edged">
50
+ <div class="toast chunky-tile-solo info">Soft and edged from the container, info from itself</div>
51
+ </section>
52
+ ```
53
+
54
+ | O quê | Lido de |
55
+ | --------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
56
+ | Preenchimento e borda (`.solid`, `.edged`, …) | O elemento ou qualquer contêiner: a apresentação é herdada, como acontece com os componentes. |
57
+ | Intenção (`.success`, …) | Só o elemento, como nos componentes. Um contêiner `.success` deixa neutro um elemento solo dentro dele. |
58
+ | Elevação (`.flat`, `.raised`, …) | Só o elemento, como nos componentes. Ela escala a sombra deslocada, a barra e a sombra do sketch. |
59
+ | A estética em volta (`.pixel`, …) | Nunca. Veja [O que uma classe solo ignora](#o-que-uma-classe-solo-ignora). |
60
+
61
+ Sem nenhuma dessas classes, uma classe solo desenha só o material (borda, canto, profundidade, contorno, desfoque, fonte e clique) e deixa o fundo e a cor do texto do próprio elemento como estavam.
62
+
63
+ - **Só as seis intenções embutidas.** Uma classe solo só lê a intenção de `.primary`, `.secondary`, `.success`, `.warning`, `.destructive` e `.info`. Uma classe de intenção definida por você, como em [Temas → Sua própria intenção](./theming.md#sua-própria-intenção), não é lida, e o elemento é desenhado neutro. Para dar uma cor personalizada a um elemento solo, mude o tema de uma das intenções embutidas nele ou num contêiner, como aquela seção descreve.
64
+ - **O preenchimento é uma camada sobre o fundo do próprio elemento.** Cinco das seis desenham o preenchimento como uma sombra interna e não definem `background`, então um toast solo `.soft` é um tom sobre o que o toast já era, e um `.solid` com uma intenção colorida é opaco. O glass define o seu próprio fundo, porque o fundo translúcido é o seu material, e mistura o preenchimento sobre ele. Um `.solid` neutro é um tom de 20%, e não o cinza opaco que um componente desenha.
65
+ - **A cor do texto pressupõe o tema.** Ela só é definida onde um preenchimento ou uma intenção é pedido, e é a cor que o tema usa na página ou no preenchimento. Num elemento cujo próprio fundo não segue o tema, como um toast branco numa página escura, uma intenção `.soft` ou `.ghost` pode pôr texto claro sobre fundo claro; use `.solid` ou deixe a intenção de fora.
66
+ - **Não há tom de hover.** Não se sabe se um elemento solo é clicável, então ele não recebe a cor de hover que um `.btn` recebe.
67
+ - **Ela lê os ajustes da sua estética e os tokens do tema, com os valores entregues como fallback.** `--glass-radius-surface`, `--neo-offset`, `--pixel-unit`, `--tile-lift`, `--tile-radius`, `--cyber-cut`, `--cyber-shape`, `--cyber-shape-surface`, `--cyber-glow`, `--cyber-ink`, `--sketch-radius`, `--sketch-radius-surface`, `--sketch-radius-rounded`, `--sketch-radius-surface-rounded` e os tokens de fonte, como `--font-sketch`, funcionam todos, definidos no elemento ou em qualquer ancestral. Com o tema carregado, ela segue o tema; sem ele, renderiza o visual entregue.
68
+ - **Os valores escuros precisam de um esquema de cores.** Os pares claro e escuro usam `light-dark()`, que segue o `color-scheme` do elemento. O tema do pacote o define; uma página sem o tema recebe os valores claros.
69
+ - **As classes que ela lê vêm do tema.** `.solid`, `.edgeless`, `.success`, `.flat` e as demais vêm na folha de estilos base e em `@codenhub/styles/theme`. Com só um entrypoint de estética na página, essas classes não fazem nada, e a classe solo desenha o seu visual sem classes.
70
+
71
+ ## O que uma classe solo ignora
72
+
73
+ - **A estética em volta.** Ela não lê nenhum dos valores que uma classe de estética define, nem `--elevation-color`. Um `.glass-solo` dentro de uma região `.pixel` mantém os seus próprios cantos, e `--ui-radius` ou `--ui-border-width` definidos nele ou acima dele não fazem nada. Ajuste-o pelos seus ajustes.
74
+ - **Os seus próprios filhos.** Um elemento solo não é uma região de estética. Um componente dentro dele mantém o visual da página em volta, mesmo com `.glass-liquid` ou `.sketch-rounded` ao lado da classe solo. Ele só passa adiante o que qualquer contêiner passa: a fonte da classe solo e o preenchimento ou a borda de uma classe de apresentação nele, então um `.card` dentro de uma placa `.glass-solo.solid` é sólido, como dentro de qualquer contêiner `.solid`.
75
+ - **A sombra do glass e `.flat`.** `.flat` não remove a sombra de `.glass-solo`, assim como não remove sob `.glass`.
76
+
77
+ ## Como ela vence e quando ela se move
78
+
79
+ - **Ela vence os estilos da outra biblioteca.** As regras são sem camada e têm uma classe de profundidade, então vencem as regras com camada de um componente, e as de especificidade zero, onde quer que as duas carreguem. Uma regra externa sem camada que seja mais específica, ou igualmente específica e posterior na página, ainda vence. O outro lado disso é que um utilitário do Tailwind no mesmo elemento, como `rounded-none`, perde para a classe solo: use os ajustes dela em vez disso.
80
+ - **Ela só faz clicar uma ação.** Neobrutalism, chunky tile e cyber afundam ao clicar um `button`, um `a[href]`, um `[role="button"]`, um `summary` ou um `input` do tipo botão que não esteja desabilitado. Todo o resto fica parado, então um toast não afunda ao ser clicado. O rótulo mais pesado do chunky tile segue a mesma regra.
81
+ - **Ela não mexe no movimento de um contêiner.** Só uma ação recebe a `transition` do clique, e o clique move o elemento pelas propriedades `translate` e `scale`, não por `transform`. Um toast mantém as suas próprias transições e o seu próprio `transform`. Numa ação, a `transition` do clique substitui qualquer uma que o elemento tivesse.
82
+ - **O movimento reduzido mantém o clique e tira o movimento dele.** Com `prefers-reduced-motion: reduce`, neobrutalism, chunky tile e cyber ainda respondem ao clique, mas de imediato: o elemento pousa na sua sombra ou barra, ou encolhe, sem se deslocar até lá.
83
+
84
+ ## A seguir
85
+
86
+ Os guias terminam aqui. [Composição](./composing.md), [Personalização](./customizing.md) e [Conteúdo e layout](./content-and-layout.md) são as páginas de consulta, e a página de [Acessibilidade](../accessibility.md) lista o que o CSS faz pelos seus usuários e o que a sua aplicação ainda deve a eles.