@codenhub/styles 0.6.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 +21 -16
- 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 +81 -23
- package/dist/tw/aesthetics/cyber.css +86 -29
- package/dist/tw/aesthetics/glass.css +177 -50
- package/dist/tw/aesthetics/neobrutalism.css +98 -22
- package/dist/tw/aesthetics/pixel.css +93 -8
- package/dist/tw/aesthetics/sketch.css +87 -22
- package/dist/tw/box.css +21 -2
- package/dist/tw/components/feedback.css +2 -2
- package/dist/tw/components/form.css +58 -19
- package/dist/tw/components/index.css +3 -4
- package/dist/tw/components/surface.css +15 -6
- package/dist/tw/index.css +1 -1
- package/dist/tw/intent.css +6 -5
- package/dist/tw/native.css +8 -8
- package/dist/tw/palette.css +6 -6
- package/dist/tw/reset.css +15 -15
- package/dist/tw/theme.css +29 -17
- package/dist/tw/utilities/content.css +43 -1
- package/dist/tw/utilities/layout.css +26 -12
- package/docs/accessibility.md +89 -60
- 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 +2 -1
- package/docs/changelog/0.7.0.md +50 -0
- package/docs/changelog/index.md +1 -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 +85 -26
- package/docs/integrating/astro.md +3 -4
- package/docs/integrating/index.md +18 -13
- package/docs/integrating/nextjs.md +3 -4
- package/docs/integrating/svelte.md +5 -4
- package/docs/integrating/tailwind.md +16 -3
- 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 +76 -66
- package/docs/usage/buttons.md +108 -40
- package/docs/usage/composing.md +105 -92
- package/docs/usage/content-and-layout.md +157 -126
- package/docs/usage/customizing.md +107 -37
- package/docs/usage/feedback.md +134 -71
- package/docs/usage/forms.md +176 -107
- package/docs/usage/index.md +18 -14
- package/docs/usage/solo.md +83 -0
- package/docs/usage/theming.md +260 -118
- package/docs/usage/tooltips.md +90 -49
- package/llms-full.txt +2358 -1313
- package/llms.txt +24 -22
- package/package.json +25 -32
- package/dist/tw/components/loader.css +0 -116
|
@@ -0,0 +1,231 @@
|
|
|
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: 58972b8573a07a3336b5765a725eb99abb2f907a
|
|
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
|
+
## Mostre um erro de validação
|
|
32
|
+
|
|
33
|
+
Marque o controle como inválido com `aria-invalid="true"` e dê à mensagem de erro `.hint.destructive`:
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<div class="field">
|
|
37
|
+
<label class="label" for="email">Email</label>
|
|
38
|
+
<input class="ipt" type="email" id="email" name="email" value="ada@" aria-invalid="true" aria-describedby="email-error" />
|
|
39
|
+
<span class="hint destructive" id="email-error">Enter a full email address, such as ada@example.com.</span>
|
|
40
|
+
</div>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
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.
|
|
44
|
+
|
|
45
|
+
## Monte o formulário de perfil
|
|
46
|
+
|
|
47
|
+
```html
|
|
48
|
+
<form class="card stack" aria-labelledby="profile-title">
|
|
49
|
+
<h2 class="text-title-sm" id="profile-title">Profile</h2>
|
|
50
|
+
|
|
51
|
+
<div class="field">
|
|
52
|
+
<label class="label" for="display-name">Display name</label>
|
|
53
|
+
<input class="ipt" id="display-name" name="display-name" value="Ada Lovelace" aria-describedby="display-name-hint" />
|
|
54
|
+
<span class="hint" id="display-name-hint">Shown on invoices and shared projects.</span>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div class="field">
|
|
58
|
+
<label class="label" for="email">Email</label>
|
|
59
|
+
<input class="ipt" type="email" id="email" name="email" value="ada@example.com" />
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="field">
|
|
63
|
+
<label class="label" for="bio">Bio</label>
|
|
64
|
+
<textarea class="textarea" id="bio" name="bio" rows="3"></textarea>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="field">
|
|
68
|
+
<label class="label" for="language">Language</label>
|
|
69
|
+
<select class="select" id="language" name="language">
|
|
70
|
+
<option>English</option>
|
|
71
|
+
<option>Português</option>
|
|
72
|
+
<option>Español</option>
|
|
73
|
+
</select>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<div class="cluster">
|
|
77
|
+
<button class="btn primary" type="submit">Save changes</button>
|
|
78
|
+
<button class="btn ghost" type="reset">Cancel</button>
|
|
79
|
+
</div>
|
|
80
|
+
</form>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
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.
|
|
84
|
+
|
|
85
|
+
## Adicione um ícone ou um prefixo fixo
|
|
86
|
+
|
|
87
|
+
`.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.
|
|
88
|
+
|
|
89
|
+
O endereço do perfil sempre começa com o mesmo host, então ele é um prefixo fixo:
|
|
90
|
+
|
|
91
|
+
```html
|
|
92
|
+
<div class="field">
|
|
93
|
+
<label class="label" for="profile-url">Profile address</label>
|
|
94
|
+
<div class="input-group" style="--input-group-gap: 0">
|
|
95
|
+
<span>app.example.com/u/</span>
|
|
96
|
+
<input class="ipt" id="profile-url" name="profile-url" value="ada" />
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
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).
|
|
102
|
+
|
|
103
|
+
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)):
|
|
104
|
+
|
|
105
|
+
```html
|
|
106
|
+
<div class="field">
|
|
107
|
+
<label class="label" for="member-search">Find a member</label>
|
|
108
|
+
<div class="input-group">
|
|
109
|
+
<i class="ic-lucide-search" aria-hidden="true"></i>
|
|
110
|
+
<input class="ipt" type="search" id="member-search" name="q" />
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
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.
|
|
116
|
+
|
|
117
|
+
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.
|
|
118
|
+
|
|
119
|
+
O grupo lê intenção e apresentação do mesmo jeito que um `.ipt` sozinho: `.input-group.primary` colore a borda, e `.input-group.soft.edgeless` é um campo afundado na página. `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 aparece quando qualquer coisa dentro do grupo tem foco, então, diferente de um campo sozinho, ele também aparece depois de um clique do mouse.
|
|
120
|
+
|
|
121
|
+
## Decorações do navegador
|
|
122
|
+
|
|
123
|
+
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.
|
|
124
|
+
|
|
125
|
+
`.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á.
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<div class="field">
|
|
129
|
+
<label class="label" for="member-filter">Find a member</label>
|
|
130
|
+
<div class="input-group unadorned">
|
|
131
|
+
<i class="ic-lucide-search" aria-hidden="true"></i>
|
|
132
|
+
<input class="ipt" type="search" id="member-filter" name="q" />
|
|
133
|
+
<button class="btn icon ghost p-xs" type="button" aria-label="Clear search">
|
|
134
|
+
<i class="ic-lucide-x" aria-hidden="true"></i>
|
|
135
|
+
</button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
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.
|
|
141
|
+
|
|
142
|
+
## Toggles
|
|
143
|
+
|
|
144
|
+
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:
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<fieldset class="stack tight">
|
|
148
|
+
<legend class="label">Notifications</legend>
|
|
149
|
+
<label class="cluster tight">
|
|
150
|
+
<input class="checkbox" type="checkbox" name="invoice-email" checked />
|
|
151
|
+
Email me when an invoice is ready
|
|
152
|
+
</label>
|
|
153
|
+
</fieldset>
|
|
154
|
+
|
|
155
|
+
<fieldset class="stack tight">
|
|
156
|
+
<legend class="label">Billing period</legend>
|
|
157
|
+
<label class="cluster tight">
|
|
158
|
+
<input class="radio" type="radio" name="period" value="monthly" />
|
|
159
|
+
Monthly
|
|
160
|
+
</label>
|
|
161
|
+
<label class="cluster tight">
|
|
162
|
+
<input class="radio" type="radio" name="period" value="yearly" checked />
|
|
163
|
+
Yearly, two months free
|
|
164
|
+
</label>
|
|
165
|
+
</fieldset>
|
|
166
|
+
|
|
167
|
+
<label class="cluster tight">
|
|
168
|
+
<input class="switch primary" type="checkbox" role="switch" name="public-profile" />
|
|
169
|
+
Public profile
|
|
170
|
+
</label>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
- `.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.
|
|
174
|
+
- `.cluster.tight` no `<label>` alinha o controle com o texto e deixa um espaçamento de 0.5rem.
|
|
175
|
+
- 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.
|
|
176
|
+
|
|
177
|
+
### Cores de marcado e desmarcado
|
|
178
|
+
|
|
179
|
+
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.
|
|
180
|
+
|
|
181
|
+
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:
|
|
182
|
+
|
|
183
|
+
| Toggle | Preenchimento desmarcado | Marcado |
|
|
184
|
+
| --------------- | ------------------------ | ------------------------------------------------------ |
|
|
185
|
+
| `.ghost` | 0% | 100% de preenchimento, com a marca na cor de contraste |
|
|
186
|
+
| `.soft`, padrão | 12% | 100% de preenchimento, com a marca na cor de contraste |
|
|
187
|
+
| `.solid` | 40% | 100% de preenchimento, com a marca na cor de contraste |
|
|
188
|
+
|
|
189
|
+
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.
|
|
190
|
+
|
|
191
|
+
`.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).
|
|
192
|
+
|
|
193
|
+
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).
|
|
194
|
+
|
|
195
|
+
## Preenchimento e borda em controles de texto
|
|
196
|
+
|
|
197
|
+
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:
|
|
198
|
+
|
|
199
|
+
| Num controle de texto | Preenchimento |
|
|
200
|
+
| ------------------------------------------------------------------ | ------------- |
|
|
201
|
+
| `.ghost`, padrão | 0% |
|
|
202
|
+
| Qualquer preenchimento vindo de um contêiner (`.soft` ou `.solid`) | 6% |
|
|
203
|
+
| `.soft` no controle | 12% |
|
|
204
|
+
| `.solid` no controle | 20% |
|
|
205
|
+
|
|
206
|
+
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.
|
|
207
|
+
|
|
208
|
+
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.
|
|
209
|
+
|
|
210
|
+
```html
|
|
211
|
+
<input class="ipt success" placeholder="Matches your current password" />
|
|
212
|
+
<input class="ipt soft edged" placeholder="Tinted, with a border" />
|
|
213
|
+
<input class="ipt soft edgeless" placeholder="Sunk into the page" />
|
|
214
|
+
<div class="soft">
|
|
215
|
+
<input class="ipt" placeholder="A container's .soft gives a 6% tint" />
|
|
216
|
+
</div>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
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.
|
|
220
|
+
|
|
221
|
+
## Controles desabilitados
|
|
222
|
+
|
|
223
|
+
`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.
|
|
224
|
+
|
|
225
|
+
## Criando o seu próprio controle
|
|
226
|
+
|
|
227
|
+
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.
|
|
228
|
+
|
|
229
|
+
## A seguir
|
|
230
|
+
|
|
231
|
+
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,29 @@
|
|
|
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: cd4fa5f3fc9bc6e1ca74206616c5f58edfa6abf7
|
|
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 últimas 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.
|
|
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 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,84 @@
|
|
|
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: 245473b119daf480163d69d38527a11b536fb5a0
|
|
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 movimento reduzido remove o deslocamento. O rótulo mais pesado do chunky tile segue a mesma regra.
|
|
81
|
+
|
|
82
|
+
## A seguir
|
|
83
|
+
|
|
84
|
+
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.
|