@softize/opus 18.5.0 → 20.0.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/CHANGELOG.md +275 -0
- package/bin/cli.mjs +5 -0
- package/bin/lib/check.mjs +198 -10
- package/bin/lib/copy.mjs +29 -0
- package/bin/lib/mcp.mjs +1 -1
- package/docs/adr/0023-surfaces-share-one-anatomy-and-two-layouts.md +298 -0
- package/docs/adr/0024-fill-height-propagates-by-context.md +118 -0
- package/docs/data-products.md +15 -9
- package/docs/protocol.md +3 -4
- package/docs/releasing.md +2 -2
- package/package.json +2 -2
- package/registry/skills/create-opus-action/scripts/scaffold.mjs +2 -1
- package/registry/templates/app/package.json +1 -1
- package/src/core/runtime.ts +96 -8
- package/src/core/types.ts +5 -2
- package/src/ui/components/patterns/action-form-card.tsx +11 -1
- package/src/ui/components/patterns/content-header.tsx +16 -12
- package/src/ui/components/patterns/fill-region.ts +150 -0
- package/src/ui/components/patterns/heading-level.ts +16 -0
- package/src/ui/components/patterns/list.tsx +103 -73
- package/src/ui/components/patterns/page.tsx +20 -4
- package/src/ui/components/patterns/pane.tsx +294 -0
- package/src/ui/components/patterns/presentation.tsx +81 -54
- package/src/ui/components/patterns/sidebar.tsx +13 -72
- package/src/ui/components/patterns/split.tsx +51 -38
- package/src/ui/components/patterns/surface-anatomy.ts +246 -0
- package/src/ui/components/patterns/surface-header.tsx +51 -6
- package/src/ui/components/patterns/surface-media.tsx +69 -0
- package/src/ui/components/patterns/trigger.tsx +12 -2
- package/src/ui/components/primitives/alert.tsx +9 -1
- package/src/ui/components/primitives/avatar.tsx +7 -3
- package/src/ui/components/primitives/card.tsx +91 -29
- package/src/ui/components/primitives/carousel.tsx +34 -5
- package/src/ui/components/primitives/checkbox.tsx +11 -3
- package/src/ui/components/primitives/command.tsx +14 -5
- package/src/ui/components/primitives/copyable.tsx +120 -10
- package/src/ui/components/primitives/detail.tsx +10 -13
- package/src/ui/components/primitives/dialog.tsx +179 -45
- package/src/ui/components/primitives/drawer.tsx +131 -24
- package/src/ui/components/primitives/empty.tsx +1 -1
- package/src/ui/components/primitives/icon-picker.tsx +6 -2
- package/src/ui/components/primitives/icon-tile.tsx +7 -0
- package/src/ui/components/primitives/input-group.tsx +9 -2
- package/src/ui/components/primitives/input-otp.tsx +1 -1
- package/src/ui/components/primitives/kbd.tsx +1 -1
- package/src/ui/components/primitives/label.tsx +3 -0
- package/src/ui/components/primitives/menu.tsx +5 -0
- package/src/ui/components/primitives/metric-card.tsx +98 -39
- package/src/ui/components/primitives/popover.tsx +1 -1
- package/src/ui/components/primitives/progress.tsx +9 -1
- package/src/ui/components/primitives/slider.tsx +62 -11
- package/src/ui/components/primitives/truncate.tsx +10 -1
- package/src/ui/docs/content/accordion.md +74 -27
- package/src/ui/docs/content/action-form-card.md +24 -15
- package/src/ui/docs/content/action-form-dialog.md +17 -7
- package/src/ui/docs/content/action-form.md +92 -77
- package/src/ui/docs/content/action-list-dialog.md +75 -38
- package/src/ui/docs/content/action-list.md +134 -52
- package/src/ui/docs/content/action-trigger.md +27 -10
- package/src/ui/docs/content/action-view.md +14 -14
- package/src/ui/docs/content/actions.md +161 -66
- package/src/ui/docs/content/ai.md +43 -44
- package/src/ui/docs/content/alert.md +83 -29
- package/src/ui/docs/content/ask.md +51 -26
- package/src/ui/docs/content/aspect-ratio.md +22 -24
- package/src/ui/docs/content/audit.md +23 -19
- package/src/ui/docs/content/auth.md +38 -19
- package/src/ui/docs/content/avatar.md +54 -5
- package/src/ui/docs/content/badge.md +29 -9
- package/src/ui/docs/content/breadcrumb.md +21 -8
- package/src/ui/docs/content/button.md +73 -43
- package/src/ui/docs/content/calendar.md +134 -26
- package/src/ui/docs/content/card.md +252 -35
- package/src/ui/docs/content/carousel.md +37 -6
- package/src/ui/docs/content/chat.md +118 -37
- package/src/ui/docs/content/checkbox.md +73 -7
- package/src/ui/docs/content/cli.md +94 -55
- package/src/ui/docs/content/collapsible.md +43 -19
- package/src/ui/docs/content/command.md +30 -8
- package/src/ui/docs/content/composer.md +23 -8
- package/src/ui/docs/content/content.md +37 -7
- package/src/ui/docs/content/copyable.md +39 -8
- package/src/ui/docs/content/customization.md +55 -46
- package/src/ui/docs/content/cycle.md +33 -18
- package/src/ui/docs/content/data-products.md +115 -0
- package/src/ui/docs/content/data-state.md +20 -6
- package/src/ui/docs/content/data.md +20 -19
- package/src/ui/docs/content/detail.md +12 -5
- package/src/ui/docs/content/dialog.md +219 -28
- package/src/ui/docs/content/dictionary-value.md +4 -4
- package/src/ui/docs/content/dock.md +54 -19
- package/src/ui/docs/content/dot.md +35 -5
- package/src/ui/docs/content/drawer.md +193 -22
- package/src/ui/docs/content/empty-value.md +20 -6
- package/src/ui/docs/content/empty.md +24 -3
- package/src/ui/docs/content/events.md +76 -16
- package/src/ui/docs/content/executions.md +9 -9
- package/src/ui/docs/content/field.md +21 -6
- package/src/ui/docs/content/getting-started.md +44 -34
- package/src/ui/docs/content/icon-picker.md +19 -13
- package/src/ui/docs/content/icon-tile.md +28 -5
- package/src/ui/docs/content/input-otp.md +58 -7
- package/src/ui/docs/content/input.md +22 -3
- package/src/ui/docs/content/item.md +53 -6
- package/src/ui/docs/content/kbd.md +5 -1
- package/src/ui/docs/content/label.md +13 -4
- package/src/ui/docs/content/log.md +5 -5
- package/src/ui/docs/content/markdown.md +5 -4
- package/src/ui/docs/content/mcp.md +49 -23
- package/src/ui/docs/content/menu.md +95 -10
- package/src/ui/docs/content/metric-card.md +68 -21
- package/src/ui/docs/content/observability.md +10 -9
- package/src/ui/docs/content/page.md +125 -11
- package/src/ui/docs/content/pagination.md +13 -5
- package/src/ui/docs/content/pane.md +300 -0
- package/src/ui/docs/content/popover.md +42 -5
- package/src/ui/docs/content/presentation.md +91 -47
- package/src/ui/docs/content/progress.md +27 -14
- package/src/ui/docs/content/queue.md +39 -21
- package/src/ui/docs/content/radio-group.md +26 -4
- package/src/ui/docs/content/router.md +29 -10
- package/src/ui/docs/content/runtime.md +90 -54
- package/src/ui/docs/content/scheduler.md +53 -21
- package/src/ui/docs/content/scroll-area.md +42 -35
- package/src/ui/docs/content/select.md +78 -33
- package/src/ui/docs/content/semantic-context.md +21 -2
- package/src/ui/docs/content/separator.md +15 -9
- package/src/ui/docs/content/sidebar.md +25 -45
- package/src/ui/docs/content/skeleton.md +13 -4
- package/src/ui/docs/content/slider.md +37 -9
- package/src/ui/docs/content/spinner.md +4 -3
- package/src/ui/docs/content/split.md +34 -20
- package/src/ui/docs/content/storage.md +8 -9
- package/src/ui/docs/content/switch.md +10 -7
- package/src/ui/docs/content/table.md +46 -8
- package/src/ui/docs/content/tabs.md +14 -4
- package/src/ui/docs/content/testing.md +76 -31
- package/src/ui/docs/content/textarea.md +5 -4
- package/src/ui/docs/content/toast.md +48 -7
- package/src/ui/docs/content/toggle.md +3 -3
- package/src/ui/docs/content/tokens.md +15 -26
- package/src/ui/docs/content/tooltip.md +18 -2
- package/src/ui/docs/content/truncate.md +36 -6
- package/src/ui/docs/content/ui.md +74 -22
- package/src/ui/docs/content/upgrading.md +45 -36
- package/src/ui/docs/plugin.ts +36 -2
- package/src/ui/docs/registry.tsx +14 -2
- package/src/ui/drivers/react.tsx +16 -8
- package/src/ui/meta.ts +38 -32
- package/src/ui/react.tsx +14 -0
- package/src/vite/design.ts +16 -4
|
@@ -10,7 +10,8 @@ contexto da página. A forma escolhida depende do tipo de interrupção:
|
|
|
10
10
|
| Pedir reconhecimento, confirmação binária ou uma string sem montar a superfície. | Use `dialog.alert`, `dialog.confirm` ou `dialog.prompt`. |
|
|
11
11
|
| Escolher entre vários resultados simples. | Use `dialog.choose`. |
|
|
12
12
|
|
|
13
|
-
Para conteúdo ancorado e não modal, use `Popover
|
|
13
|
+
Para conteúdo ancorado e não modal, use [`Popover`](/ui/popover). Para uma lista de ações, use
|
|
14
|
+
[`Menu`](/ui/menu).
|
|
14
15
|
|
|
15
16
|
## Compor uma tarefa modal
|
|
16
17
|
|
|
@@ -54,6 +55,164 @@ decide a distribuição nem a aparência dos botões.
|
|
|
54
55
|
`DialogClose` encerra o modal sem exigir estado controlado. Use `open` e `onOpenChange` quando outra
|
|
55
56
|
parte da interface também precisar controlar a abertura.
|
|
56
57
|
|
|
58
|
+
## Regiões separadas ou contínuas
|
|
59
|
+
|
|
60
|
+
`layout` declara a anatomia da superfície inteira e fica em `DialogContent`; os slots leem esse
|
|
61
|
+
valor e não o recebem. O padrão é `sectioned`: as regiões têm o mesmo recuo, o rodapé ganha uma
|
|
62
|
+
faixa sutil e as fronteiras entre regiões vizinhas ganham um divisor. É o modal de tarefa, com
|
|
63
|
+
cabeçalho, conteúdo e ações claramente separados.
|
|
64
|
+
|
|
65
|
+
Use `layout="continuous"` para uma superfície curta, em que o espaço basta para separar as regiões
|
|
66
|
+
e a linha seria um ruído — um aviso de uma frase, uma escolha rápida.
|
|
67
|
+
|
|
68
|
+
```tsx preview
|
|
69
|
+
<Dialog>
|
|
70
|
+
<DialogTrigger asChild>
|
|
71
|
+
<Button variant="outline">Publicar contrato</Button>
|
|
72
|
+
</DialogTrigger>
|
|
73
|
+
<DialogContent layout="continuous">
|
|
74
|
+
<DialogHeader>
|
|
75
|
+
<DialogTitle>Publicar contrato</DialogTitle>
|
|
76
|
+
</DialogHeader>
|
|
77
|
+
<DialogBody>
|
|
78
|
+
<p className="text-sm text-muted-foreground">
|
|
79
|
+
A versão publicada passa a valer para todos os consumidores.
|
|
80
|
+
</p>
|
|
81
|
+
</DialogBody>
|
|
82
|
+
<DialogFooter>
|
|
83
|
+
<ButtonGroup mode="spaced">
|
|
84
|
+
<DialogClose asChild>
|
|
85
|
+
<Button variant="ghost">Cancelar</Button>
|
|
86
|
+
</DialogClose>
|
|
87
|
+
<Button>Publicar</Button>
|
|
88
|
+
</ButtonGroup>
|
|
89
|
+
</DialogFooter>
|
|
90
|
+
</DialogContent>
|
|
91
|
+
</Dialog>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Os divisores do modo seccionado são derivados da vizinhança: cada região desenha a linha quando há
|
|
95
|
+
uma região do outro lado. Um cabeçalho sem corpo não fecha nada, e um cabeçalho seguido direto de um
|
|
96
|
+
rodapé produz uma linha só. A tela não escreve `border-b` nem `border-t`.
|
|
97
|
+
|
|
98
|
+
A faixa sutil do rodapé é a mesma no `Dialog` e no [`Drawer`](/ui/drawer): as duas famílias
|
|
99
|
+
compartilham a anatomia, e um fluxo que troca de superfície não muda de aparência no meio.
|
|
100
|
+
|
|
101
|
+
`mode="alert"` mantém a composição centrada da resposta obrigatória e não usa `layout`.
|
|
102
|
+
|
|
103
|
+
## Ações e navegação no cabeçalho
|
|
104
|
+
|
|
105
|
+
O cabeçalho reconhece quatro slots — `DialogNavigation`, `DialogMedia`, `DialogTitle` e
|
|
106
|
+
`DialogActions` — e posiciona cada um: a navegação abre a linha, o título ocupa a folga, as ações
|
|
107
|
+
vão para o extremo oposto e o botão de fechar entra depois delas. Um nó que não seja um desses
|
|
108
|
+
slots interrompe a renderização com um erro; contexto e conteúdo pertencem ao `DialogBody`.
|
|
109
|
+
|
|
110
|
+
Use `DialogActions` para uma ação da tela que precisa ficar à vista sem competir com o rodapé, como
|
|
111
|
+
abrir um assistente ou alternar um modo de visualização. Use `DialogNavigation` para o retorno de um
|
|
112
|
+
fluxo modal encadeado, em que a superfície permanece aberta e troca de etapa.
|
|
113
|
+
|
|
114
|
+
```tsx preview
|
|
115
|
+
<Dialog>
|
|
116
|
+
<DialogTrigger asChild>
|
|
117
|
+
<Button variant="outline">Revisar evento</Button>
|
|
118
|
+
</DialogTrigger>
|
|
119
|
+
<DialogContent>
|
|
120
|
+
<DialogHeader>
|
|
121
|
+
<DialogNavigation>
|
|
122
|
+
<Button variant="ghost" size="icon" aria-label="Voltar para a lista">
|
|
123
|
+
<ArrowLeft />
|
|
124
|
+
</Button>
|
|
125
|
+
</DialogNavigation>
|
|
126
|
+
<DialogTitle>Evento 4821</DialogTitle>
|
|
127
|
+
<DialogActions>
|
|
128
|
+
<Button variant="ghost" size="icon" aria-label="Mais ações">
|
|
129
|
+
<Ellipsis />
|
|
130
|
+
</Button>
|
|
131
|
+
</DialogActions>
|
|
132
|
+
</DialogHeader>
|
|
133
|
+
<DialogBody>
|
|
134
|
+
<p className="text-sm text-muted-foreground">Detalhe do evento selecionado.</p>
|
|
135
|
+
</DialogBody>
|
|
136
|
+
</DialogContent>
|
|
137
|
+
</Dialog>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Voltar e ações do cabeçalho usam `Button` `ghost` no tamanho `icon` (2.25rem), o mesmo que a
|
|
141
|
+
[`Presentation`](/ui/presentation) usa no voltar. O botão de fechar é menor: um `CloseButton` no
|
|
142
|
+
quadrado `icon-sm` (1.75rem) por padrão.
|
|
143
|
+
|
|
144
|
+
O cabeçalho não recebe descrição: um modal já é a superfície de uma tarefa, e o contexto que ajuda a
|
|
145
|
+
decidir aparece no começo do corpo, como texto ou `Alert`.
|
|
146
|
+
|
|
147
|
+
## Identificar a tarefa com um ícone
|
|
148
|
+
|
|
149
|
+
Use `DialogMedia` quando um ícone ajuda a reconhecer a tarefa antes da leitura do título. No modo
|
|
150
|
+
padrão, ele abre a linha do cabeçalho com a mesma moldura de [`IconTile`](/ui/icon-tile) das demais
|
|
151
|
+
superfícies. No `mode="alert"`, a moldura cresce e fica centralizada acima do título, porque ali o
|
|
152
|
+
ícone é o principal sinal de reconhecimento da resposta.
|
|
153
|
+
|
|
154
|
+
```tsx preview
|
|
155
|
+
render(
|
|
156
|
+
<div className="flex flex-wrap gap-3">
|
|
157
|
+
<Dialog>
|
|
158
|
+
<DialogTrigger asChild>
|
|
159
|
+
<Button variant="outline">Compartilhar contrato</Button>
|
|
160
|
+
</DialogTrigger>
|
|
161
|
+
<DialogContent>
|
|
162
|
+
<DialogHeader>
|
|
163
|
+
<DialogMedia>
|
|
164
|
+
<Share2 />
|
|
165
|
+
</DialogMedia>
|
|
166
|
+
<DialogTitle>Compartilhar contrato</DialogTitle>
|
|
167
|
+
</DialogHeader>
|
|
168
|
+
<DialogBody className="space-y-2">
|
|
169
|
+
<Label htmlFor="share-email">E-mail</Label>
|
|
170
|
+
<Input id="share-email" placeholder="nome@empresa.com.br" />
|
|
171
|
+
</DialogBody>
|
|
172
|
+
<DialogFooter>
|
|
173
|
+
<ButtonGroup mode="spaced">
|
|
174
|
+
<DialogClose asChild>
|
|
175
|
+
<Button variant="ghost">Cancelar</Button>
|
|
176
|
+
</DialogClose>
|
|
177
|
+
<Button>Compartilhar</Button>
|
|
178
|
+
</ButtonGroup>
|
|
179
|
+
</DialogFooter>
|
|
180
|
+
</DialogContent>
|
|
181
|
+
</Dialog>
|
|
182
|
+
<Dialog mode="alert">
|
|
183
|
+
<DialogTrigger asChild>
|
|
184
|
+
<Button variant="outline">Revogar acesso</Button>
|
|
185
|
+
</DialogTrigger>
|
|
186
|
+
<DialogContent>
|
|
187
|
+
<DialogHeader>
|
|
188
|
+
<DialogMedia context="danger">
|
|
189
|
+
<ShieldOff />
|
|
190
|
+
</DialogMedia>
|
|
191
|
+
<DialogTitle>Revogar acesso de Marina?</DialogTitle>
|
|
192
|
+
</DialogHeader>
|
|
193
|
+
<DialogBody>
|
|
194
|
+
<p className="text-sm text-muted-foreground">
|
|
195
|
+
Ela deixa de ver o contrato imediatamente.
|
|
196
|
+
</p>
|
|
197
|
+
</DialogBody>
|
|
198
|
+
<DialogFooter>
|
|
199
|
+
<ButtonGroup mode="spaced" distribution="equal">
|
|
200
|
+
<DialogClose initialFocus asChild>
|
|
201
|
+
<Button variant="outline">Cancelar</Button>
|
|
202
|
+
</DialogClose>
|
|
203
|
+
<DialogClose asChild>
|
|
204
|
+
<Button context="danger">Revogar acesso</Button>
|
|
205
|
+
</DialogClose>
|
|
206
|
+
</ButtonGroup>
|
|
207
|
+
</DialogFooter>
|
|
208
|
+
</DialogContent>
|
|
209
|
+
</Dialog>
|
|
210
|
+
</div>,
|
|
211
|
+
);
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Na API imperativa, a opção `media` recebe o ícone e o apresenta na mesma moldura do alerta.
|
|
215
|
+
|
|
57
216
|
## Pedir uma resposta pela API imperativa
|
|
58
217
|
|
|
59
218
|
Use `dialog.alert`, `dialog.confirm`, `dialog.prompt` e `dialog.choose` quando a resposta couber em
|
|
@@ -84,12 +243,13 @@ function Demo() {
|
|
|
84
243
|
size="sm"
|
|
85
244
|
onClick={async () => {
|
|
86
245
|
const accepted = await dialog.confirm({
|
|
87
|
-
title: "Excluir
|
|
88
|
-
body: "O
|
|
246
|
+
title: "Excluir rascunho?",
|
|
247
|
+
body: "O rascunho e os comentários dele serão removidos.",
|
|
248
|
+
media: <Trash2 />,
|
|
89
249
|
action: "Excluir",
|
|
90
250
|
context: "danger",
|
|
91
251
|
});
|
|
92
|
-
setResult(accepted ? "
|
|
252
|
+
setResult(accepted ? "Rascunho excluído." : "Rascunho mantido.");
|
|
93
253
|
}}
|
|
94
254
|
>
|
|
95
255
|
Confirmar exclusão
|
|
@@ -99,14 +259,14 @@ function Demo() {
|
|
|
99
259
|
size="sm"
|
|
100
260
|
onClick={async () => {
|
|
101
261
|
const name = await dialog.prompt({
|
|
102
|
-
title: "Renomear
|
|
262
|
+
title: "Renomear versão",
|
|
103
263
|
action: "Renomear",
|
|
104
264
|
placeholder: "Ex.: versão final",
|
|
105
265
|
});
|
|
106
266
|
setResult(name === null ? "Nome mantido." : `Novo nome: ${name}`);
|
|
107
267
|
}}
|
|
108
268
|
>
|
|
109
|
-
Renomear
|
|
269
|
+
Renomear versão
|
|
110
270
|
</Button>
|
|
111
271
|
<Button
|
|
112
272
|
variant="outline"
|
|
@@ -144,7 +304,8 @@ render(<Demo />);
|
|
|
144
304
|
`dialog.prompt` devolve `Promise<string | null>` e `dialog.choose` infere a união dos resultados
|
|
145
305
|
declarados, acrescida de `null`. Fechar ou cancelar resolve a resposta negativa de cada operação,
|
|
146
306
|
em vez de deixar a promise pendente. No aviso com uma ação, o botão ocupa toda a largura do rodapé;
|
|
147
|
-
confirmações e prompts distribuem confirmar e cancelar em duas colunas.
|
|
307
|
+
confirmações e prompts distribuem confirmar e cancelar em duas colunas. O `dialog.choose` usa uma
|
|
308
|
+
superfície mais larga, de `32rem`, para que as ações caibam lado a lado.
|
|
148
309
|
|
|
149
310
|
Em `dialog.choose`, declare pelo menos uma ação e marque exatamente uma ação habilitada com
|
|
150
311
|
`initialFocus`. Essa ação representa a saída segura. Os valores de `result` precisam ser únicos.
|
|
@@ -153,7 +314,7 @@ neutro e variante outline. Defina `context` ou `variant` na própria ação para
|
|
|
153
314
|
|
|
154
315
|
### Montar o host
|
|
155
316
|
|
|
156
|
-
Monte um `DialogHost` no shell do aplicativo, ao lado do `Toaster
|
|
317
|
+
Monte um `DialogHost` no shell do aplicativo, ao lado do [`Toaster`](/ui/toast):
|
|
157
318
|
|
|
158
319
|
```tsx
|
|
159
320
|
<>
|
|
@@ -163,8 +324,8 @@ Monte um `DialogHost` no shell do aplicativo, ao lado do `Toaster`:
|
|
|
163
324
|
</>
|
|
164
325
|
```
|
|
165
326
|
|
|
166
|
-
Sem o host, a
|
|
167
|
-
aparecem uma por vez, preservando a resposta de cada `await`.
|
|
327
|
+
Sem o host, a promise é rejeitada imediatamente com um erro. Solicitações concorrentes entram em
|
|
328
|
+
uma fila e aparecem uma por vez, preservando a resposta de cada `await`.
|
|
168
329
|
|
|
169
330
|
### Adicionar contexto relevante
|
|
170
331
|
|
|
@@ -174,21 +335,21 @@ texto, um `Alert` ou uma composição própria:
|
|
|
174
335
|
|
|
175
336
|
```tsx
|
|
176
337
|
const accepted = await dialog.confirm({
|
|
177
|
-
title: "
|
|
338
|
+
title: "Revogar três acessos?",
|
|
178
339
|
body: (
|
|
179
340
|
<Alert
|
|
180
341
|
context="warning"
|
|
181
|
-
description="
|
|
342
|
+
description="As pessoas convidadas deixam de ver o contrato imediatamente."
|
|
182
343
|
/>
|
|
183
344
|
),
|
|
184
|
-
action: "
|
|
345
|
+
action: "Revogar acessos",
|
|
185
346
|
});
|
|
186
347
|
```
|
|
187
348
|
|
|
188
|
-
Use `ActionTrigger` quando a confirmação já pertencer ao contrato de uma
|
|
189
|
-
`ActionFormDialog` para formulários com validação ou vários
|
|
190
|
-
uma string livre. Componha `Dialog` quando uma ação precisar
|
|
191
|
-
aberta para exibir carregamento, validação ou falha antes do fechamento.
|
|
349
|
+
Use [`ActionTrigger`](/ui/action-trigger) quando a confirmação já pertencer ao contrato de uma
|
|
350
|
+
action. Use [`ActionFormDialog`](/ui/action-form-dialog) para formulários com validação ou vários
|
|
351
|
+
campos. `dialog.prompt` atende somente uma string livre. Componha `Dialog` quando uma ação precisar
|
|
352
|
+
manter a superfície aberta para exibir carregamento, validação ou falha antes do fechamento.
|
|
192
353
|
|
|
193
354
|
## Compor uma resposta personalizada
|
|
194
355
|
|
|
@@ -197,6 +358,10 @@ com o clique externo. Prefira a API imperativa quando a resposta couber em `aler
|
|
|
197
358
|
`prompt` ou `choose`. Componha o componente quando a resposta depender de estado próprio ou de um
|
|
198
359
|
layout específico.
|
|
199
360
|
|
|
361
|
+
O alerta tem `20rem` de largura máxima, suficiente para duas ações lado a lado. Com três ações,
|
|
362
|
+
amplie a superfície com `className="max-w-lg"` em `DialogContent`, a mesma largura que o
|
|
363
|
+
`dialog.choose` usa; sem isso, os rótulos não cabem no rodapé.
|
|
364
|
+
|
|
200
365
|
```tsx preview
|
|
201
366
|
function ResponseDialogDemo() {
|
|
202
367
|
const [result, setResult] = useState("Nenhuma resposta.");
|
|
@@ -207,7 +372,7 @@ function ResponseDialogDemo() {
|
|
|
207
372
|
<DialogTrigger asChild>
|
|
208
373
|
<Button variant="outline">Fechar editor</Button>
|
|
209
374
|
</DialogTrigger>
|
|
210
|
-
<DialogContent>
|
|
375
|
+
<DialogContent className="max-w-lg">
|
|
211
376
|
<DialogHeader>
|
|
212
377
|
<DialogTitle>Fechar editor?</DialogTitle>
|
|
213
378
|
</DialogHeader>
|
|
@@ -243,13 +408,16 @@ render(<ResponseDialogDemo />);
|
|
|
243
408
|
contexto, variante e tamanho pertencem ao botão. `result` identifica a resposta entregue a
|
|
244
409
|
`Dialog onResult`. Marque com `initialFocus` a saída segura — normalmente `Cancelar`; em um aviso
|
|
245
410
|
com uma única ação, marque essa ação. Para uma confirmação destrutiva, use `context="danger"` no
|
|
246
|
-
botão. O texto informa o efeito real, como `Excluir`, `Revogar acesso` ou `
|
|
411
|
+
botão. O texto informa o efeito real, como `Excluir`, `Revogar acesso` ou `Arquivar contratos`.
|
|
247
412
|
|
|
248
413
|
## Acessibilidade
|
|
249
414
|
|
|
250
415
|
- `DialogTitle` nomeia a superfície para tecnologias assistivas. Quando um texto conciso do corpo
|
|
251
416
|
também precisar descrevê-la, relacione seu `id` por `aria-describedby` em `DialogContent`.
|
|
252
417
|
- O modo padrão permite fechamento externo; `mode="alert"` exige uma resposta explícita.
|
|
418
|
+
- Enquanto uma operação não puder ser interrompida, `closeDisabled` em `DialogContent` impede que o
|
|
419
|
+
botão de fechar, Esc e o clique externo fechem a superfície. As ações que você compõe com
|
|
420
|
+
`DialogClose` continuam ativas; desabilite-as pelo mesmo estado da operação.
|
|
253
421
|
- O comportamento selecionado por `mode` determina o papel de acessibilidade; `role` não configura
|
|
254
422
|
o comportamento.
|
|
255
423
|
- O foco permanece dentro do diálogo aberto e retorna ao gatilho após o fechamento.
|
|
@@ -278,17 +446,32 @@ botão. O texto informa o efeito real, como `Excluir`, `Revogar acesso` ou `Ence
|
|
|
278
446
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
279
447
|
| ----------------- | ----------- | ------ | --------------------------------------------------------------------------------------------------------- |
|
|
280
448
|
| `showCloseButton` | `boolean` | `true` | No modo padrão, inclui a ação de fechamento no header; o modo de alerta exige uma resposta identificável. |
|
|
281
|
-
| `closeDisabled` | `boolean` | `false` | Mantém
|
|
449
|
+
| `closeDisabled` | `boolean` | `false` | Mantém o botão de fechar visível e desabilitado e impede que Esc e o clique externo fechem a superfície. Handlers como `onEscapeKeyDown` e `onPointerDownOutside` continuam sendo chamados antes do bloqueio. |
|
|
282
450
|
| `closeSize` | `"xs" \| "sm"` | `"sm"` | Define o tamanho da ação circular de fechar. |
|
|
283
|
-
| `
|
|
451
|
+
| `layout` | `'continuous' \| 'sectioned'` | `'sectioned'` | Anatomia da superfície inteira; os slots leem esse valor e não o recebem. Ignorado em `mode="alert"`. |
|
|
452
|
+
| `className` | `string` | | Ajusta a superfície. A largura máxima é `32rem` no modo padrão e `20rem` no alerta; amplie o alerta com `max-w-lg` quando o rodapé tiver três ações. |
|
|
284
453
|
| `children` | `ReactNode` | | Cabeçalho, corpo, rodapé ou conteúdo próprio. |
|
|
285
454
|
|
|
286
455
|
## Propriedades de DialogHeader
|
|
287
456
|
|
|
288
457
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
289
458
|
| ----------- | ----------- | ------ | ---------------------------------------------------------- |
|
|
290
|
-
| `className` | `string` | | Ajusta a faixa superior.
|
|
291
|
-
| `children` | `ReactNode` | |
|
|
459
|
+
| `className` | `string` | | Ajusta a faixa superior sobre o recuo do layout. |
|
|
460
|
+
| `children` | `ReactNode` | | Somente `DialogNavigation`, `DialogMedia`, `DialogTitle` e `DialogActions`, no máximo um de cada; o fechamento padrão entra depois deles. |
|
|
461
|
+
|
|
462
|
+
## Propriedades de DialogNavigation
|
|
463
|
+
|
|
464
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
465
|
+
| ----------- | ----------- | ------ | -------------------------------------------------------------- |
|
|
466
|
+
| `className` | `string` | | Ajusta a região introdutória da linha. |
|
|
467
|
+
| `children` | `ReactNode` | | Retorno de um fluxo modal encadeado, antes do título. |
|
|
468
|
+
|
|
469
|
+
## Propriedades de DialogActions
|
|
470
|
+
|
|
471
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
472
|
+
| ----------- | ----------- | ------ | ------------------------------------------------------------------ |
|
|
473
|
+
| `className` | `string` | | Ajusta o agrupamento das ações. |
|
|
474
|
+
| `children` | `ReactNode` | | Ações da tela no cabeçalho, antes do botão de fechar. |
|
|
292
475
|
|
|
293
476
|
## Propriedades de DialogBody
|
|
294
477
|
|
|
@@ -308,15 +491,23 @@ botão. O texto informa o efeito real, como `Excluir`, `Revogar acesso` ou `Ence
|
|
|
308
491
|
|
|
309
492
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
310
493
|
| ----------- | ----------- | ------ | ------------------------------------ |
|
|
311
|
-
| `
|
|
494
|
+
| `level` | `1 \| 2 \| 3 \| 4 \| 5 \| 6` | `h2` da primitiva | Hierarquia do documento. O tamanho vem do `layout`, nunca do nível. |
|
|
495
|
+
| `className` | `string` | | Ajusta o título. No modo padrão, ele trunca quando não cabe na linha; no alerta, fica centralizado e pode ocupar mais de uma linha. |
|
|
312
496
|
| `children` | `ReactNode` | | Nome da tarefa ou do conteúdo modal. |
|
|
313
497
|
|
|
314
498
|
## Propriedades de DialogMedia
|
|
315
499
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
|
500
|
+
A moldura vem do `IconTile`, como nas demais famílias. No `mode="alert"` ela cresce e centraliza:
|
|
501
|
+
ali a mídia não acompanha uma linha de título, ela é o que faz a pessoa reconhecer a resposta.
|
|
502
|
+
|
|
503
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
504
|
+
| ----------- | ----------------------------------------------------------- | --------- | -------------------------------------------------- |
|
|
505
|
+
| `size` | `'xs' \| 'sm' \| 'default' \| 'lg'` | `sm` | Escala da moldura; no alerta vale a moldura maior. |
|
|
506
|
+
| `context` | `UiContext` | `neutral` | Cor semântica da moldura. |
|
|
507
|
+
| `variant` | `'subtle' \| 'outline'` | `subtle` | Tratamento visual da moldura. |
|
|
508
|
+
| `className` | `string` | | Ajustes pontuais da moldura. |
|
|
509
|
+
| `children` | `ReactNode` | | Ícone que reforça o contexto da resposta. |
|
|
510
|
+
| `asChild` | `boolean` | `false` | Cede o elemento para uma marca com visual próprio — um orbe, um logotipo — que ocupa o slot sem ganhar a moldura por cima. |
|
|
320
511
|
|
|
321
512
|
## Propriedades de DialogClose
|
|
322
513
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Use `DictionaryValue` para apresentar um valor de `t.dict` de acordo com o papel declarado pelo
|
|
2
|
-
próprio dicionário. A tela fornece o dicionário e o código; o componente escolhe texto,
|
|
3
|
-
sem perder o rótulo visível.
|
|
2
|
+
próprio dicionário. A tela fornece o dicionário e o código; o componente escolhe texto,
|
|
3
|
+
[`Badge`](/ui/badge) e ícone sem perder o rótulo visível.
|
|
4
4
|
|
|
5
5
|
```tsx preview
|
|
6
6
|
<DictionaryValue
|
|
@@ -56,7 +56,7 @@ export const customerStageDict = t.dict(
|
|
|
56
56
|
- `context` (`neutral` · `info` · `success` · `warning` · `danger`) só existe em status e estágio;
|
|
57
57
|
`t.dict` rejeita o contexto em classificação e em `plain`.
|
|
58
58
|
- `icon` é um nome do catálogo do Opus (`iconPickerIcons`). Nome fora do catálogo não renderiza
|
|
59
|
-
ícone; o
|
|
59
|
+
ícone; o componente não escolhe um substituto. Vocabulário próprio entra por `icons`.
|
|
60
60
|
- `description` é o texto curto para a pessoa e aparece em tooltip focável. Descrição igual ao
|
|
61
61
|
rótulo não vira tooltip. `doc` é o entendimento de negócio para manifest e Lens; não aparece.
|
|
62
62
|
|
|
@@ -100,7 +100,7 @@ Valor fora do dicionário aparece como texto com o próprio código, marcado com
|
|
|
100
100
|
|
|
101
101
|
## Em ActionList
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
Em [`ActionList`](/ui/action-list), a coluna cujo campo do schema de saída é um `t.dict().zod()` já renderiza `DictionaryValue` com o
|
|
104
104
|
papel declarado, sem `cells`. Quando o campo de saída é uma string comum, a coluna nomeia o
|
|
105
105
|
dicionário registrado no provider: `{ key: 'source', label: 'Fonte', dictionary: 'customerSource' }`.
|
|
106
106
|
Dimensões independentes (tipo e estágio, por exemplo) ficam em colunas distintas; não empilhar
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
agrupadas e sempre alcançáveis.
|
|
1
|
+
Use `Dock` para as ferramentas de uma superfície de trabalho, como um canvas ou um editor. Essas
|
|
2
|
+
telas raramente comportam mais uma barra no topo: a navegação da aplicação já ocupa esse lugar, e
|
|
3
|
+
um segundo cabeçalho empilharia duas faixas com a mesma função. A Dock coloca as ações sobre a
|
|
4
|
+
própria superfície, agrupadas e sempre alcançáveis.
|
|
5
5
|
|
|
6
6
|
```tsx preview
|
|
7
7
|
<div className="relative h-40 w-full rounded-lg border border-border bg-muted/20">
|
|
@@ -23,8 +23,8 @@ agrupadas e sempre alcançáveis.
|
|
|
23
23
|
|
|
24
24
|
O contêiner precisa ser `relative` — a Dock se ancora nele, não na janela. `position` escolhe a
|
|
25
25
|
aresta: `bottom` (centro), `bottom-left` e `bottom-right`. Uma superfície pode ter mais de uma
|
|
26
|
-
barra quando os papéis são distintos, como ferramentas ao centro e controles de
|
|
27
|
-
|
|
26
|
+
barra quando os papéis são distintos, como ferramentas ao centro e controles de visualização à
|
|
27
|
+
direita.
|
|
28
28
|
|
|
29
29
|
## Grupos e divisórias
|
|
30
30
|
|
|
@@ -44,10 +44,43 @@ Mensagem de sucesso é transitória por natureza — some depois de confirmar
|
|
|
44
44
|
permanece até o estado mudar. Essa decisão é da aplicação, que conhece o ciclo; o componente
|
|
45
45
|
apenas reserva o lugar.
|
|
46
46
|
|
|
47
|
-
`actions` recebe o que o recurso aberto permite fazer — em geral o mesmo menu que a
|
|
48
|
-
tem na navegação. Assim
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
`actions` recebe o que o recurso aberto permite fazer — em geral o mesmo [`Menu`](/ui/menu) que a
|
|
48
|
+
linha dele tem na navegação. Assim, renomear ou excluir também alcançam o item que está na tela.
|
|
49
|
+
Apenas o texto é região viva: anunciar o menu a cada mudança de estado seria ruído para quem usa
|
|
50
|
+
leitor de tela.
|
|
51
|
+
|
|
52
|
+
No exemplo, o estado de falha fica no canto superior esquerdo com o menu do recurso, e os controles
|
|
53
|
+
de visualização ficam no canto inferior direito.
|
|
54
|
+
|
|
55
|
+
```tsx preview
|
|
56
|
+
<div className="relative h-40 w-full rounded-lg border border-border bg-muted/20">
|
|
57
|
+
<SurfaceStatus
|
|
58
|
+
position="top-left"
|
|
59
|
+
context="danger"
|
|
60
|
+
actions={
|
|
61
|
+
<Menu>
|
|
62
|
+
<MenuTrigger asChild>
|
|
63
|
+
<Button variant="ghost" size="icon" aria-label="Ações do fluxo"><MoreHorizontal /></Button>
|
|
64
|
+
</MenuTrigger>
|
|
65
|
+
<MenuContent align="start">
|
|
66
|
+
<MenuItem><Pencil /> Renomear</MenuItem>
|
|
67
|
+
<MenuSeparator />
|
|
68
|
+
<MenuItem context="danger"><Trash2 /> Excluir</MenuItem>
|
|
69
|
+
</MenuContent>
|
|
70
|
+
</Menu>
|
|
71
|
+
}
|
|
72
|
+
>
|
|
73
|
+
Falha ao salvar
|
|
74
|
+
</SurfaceStatus>
|
|
75
|
+
<Dock label="Controles de visualização" position="bottom-right">
|
|
76
|
+
<DockGroup>
|
|
77
|
+
<DockAction icon={<ZoomOut />} label="Afastar" onClick={() => {}} />
|
|
78
|
+
<DockAction icon={<ZoomIn />} label="Aproximar" onClick={() => {}} />
|
|
79
|
+
<DockAction icon={<Maximize />} label="Ajustar à tela" onClick={() => {}} />
|
|
80
|
+
</DockGroup>
|
|
81
|
+
</Dock>
|
|
82
|
+
</div>
|
|
83
|
+
```
|
|
51
84
|
|
|
52
85
|
## Modo e execução
|
|
53
86
|
|
|
@@ -57,36 +90,36 @@ o rótulo, que também é o nome acessível.
|
|
|
57
90
|
|
|
58
91
|
## Teclado
|
|
59
92
|
|
|
60
|
-
A barra é uma `toolbar`: as setas andam entre as ações e Home/End vão às pontas. Cada ação
|
|
61
|
-
|
|
62
|
-
já monta.
|
|
93
|
+
A barra é uma `toolbar`: as setas andam entre as ações e Home/End vão às pontas. Cada ação exibe o nome em um
|
|
94
|
+
[tooltip](/ui/tooltip), então `<TooltipProvider>` precisa existir na raiz do app — o projeto criado
|
|
95
|
+
por `opus create` já o monta.
|
|
63
96
|
|
|
64
97
|
## Propriedades de Dock
|
|
65
98
|
|
|
66
99
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
67
100
|
| --- | --- | --- | --- |
|
|
68
101
|
| `position` | `'bottom' \| 'bottom-left' \| 'bottom-right'` | `'bottom'` | Aresta do contêiner onde a barra se ancora. |
|
|
69
|
-
| `label` | `string` | | Nome acessível da barra. |
|
|
70
|
-
| `children` | `ReactNode` | | Os grupos de ações, em `DockGroup`. |
|
|
102
|
+
| `label` | `string` | obrigatório | Nome acessível da barra. |
|
|
103
|
+
| `children` | `ReactNode` | obrigatório | Os grupos de ações, em `DockGroup`. |
|
|
71
104
|
| `className` | `string` | | Classes adicionais da barra. |
|
|
72
105
|
|
|
73
106
|
## Propriedades de DockGroup
|
|
74
107
|
|
|
75
108
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
76
109
|
| --- | --- | --- | --- |
|
|
77
|
-
| `children` | `ReactNode` | | As ações do grupo, em `DockAction`. A divisória antes do grupo é aplicada automaticamente, exceto no primeiro. |
|
|
110
|
+
| `children` | `ReactNode` | obrigatório | As ações do grupo, em `DockAction`. A divisória antes do grupo é aplicada automaticamente, exceto no primeiro. |
|
|
78
111
|
| `className` | `string` | | Classes adicionais do grupo. |
|
|
79
112
|
|
|
80
113
|
## Propriedades de DockAction
|
|
81
114
|
|
|
82
115
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
83
116
|
| --- | --- | --- | --- |
|
|
84
|
-
| `icon` | `ReactNode` | | Ícone exibido no botão. |
|
|
85
|
-
| `label` | `string` | | Nome da ação; vira o nome acessível e o tooltip quando não há `hint`. |
|
|
117
|
+
| `icon` | `ReactNode` | obrigatório | Ícone exibido no botão. |
|
|
118
|
+
| `label` | `string` | obrigatório | Nome da ação; vira o nome acessível e o tooltip quando não há `hint`. |
|
|
86
119
|
| `pressed` | `boolean` | | Presente quando a ação liga um modo: aplica o preenchimento e expõe `aria-pressed`. Ausente quando a ação apenas executa. |
|
|
87
120
|
| `disabled` | `boolean` | `false` | Desabilita a ação e a tira da navegação por setas. |
|
|
88
121
|
| `hint` | `ReactNode` | `label` | Conteúdo do tooltip quando ele precisa dizer mais que o rótulo. |
|
|
89
|
-
| `onClick` | `() => void` | | Executa a ação ou alterna o modo. |
|
|
122
|
+
| `onClick` | `() => void` | obrigatório | Executa a ação ou alterna o modo. |
|
|
90
123
|
| `className` | `string` | | Classes adicionais do botão. |
|
|
91
124
|
|
|
92
125
|
## Propriedades de SurfaceStatus
|
|
@@ -96,3 +129,5 @@ já monta.
|
|
|
96
129
|
| `position` | `'top-right' \| 'top-left'` | `'top-right'` | Canto da superfície onde o estado se ancora. |
|
|
97
130
|
| `context` | `'neutral' \| 'info' \| 'success' \| 'warning' \| 'danger'` | `'neutral'` | O que o estado comunica; tinge borda e texto pela família semântica. |
|
|
98
131
|
| `actions` | `ReactNode` | | Ações do recurso aberto, fora da região viva. |
|
|
132
|
+
| `children` | `ReactNode` | | O texto do estado, anunciado pela região viva a cada mudança. |
|
|
133
|
+
| `className` | `string` | | Classes adicionais do contêiner. |
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Indicador visual compacto para estados que já têm contexto. O tamanho permanece fixo; `context`
|
|
2
|
-
seleciona o significado e `variant` escolhe ponto sólido ou contornado. Quando a cor reforça
|
|
3
|
-
acessível. Sem `label`, o ponto é decorativo
|
|
2
|
+
seleciona o significado e `variant` escolhe ponto sólido ou contornado. Quando a cor reforça
|
|
3
|
+
significado, `label` fornece o nome acessível. Sem `label`, o ponto é decorativo e fica oculto dos
|
|
4
|
+
leitores de tela.
|
|
4
5
|
|
|
5
6
|
```tsx preview
|
|
6
7
|
<div className="flex items-center gap-4">
|
|
@@ -8,11 +9,25 @@ acessível. Sem `label`, o ponto é decorativo.
|
|
|
8
9
|
<Dot context="warning" label="Atenção" />
|
|
9
10
|
<Dot context="danger" label="Falhou" />
|
|
10
11
|
<Dot context="info" label="Publicado" />
|
|
11
|
-
<Dot context="neutral"
|
|
12
|
+
<Dot context="neutral" />
|
|
12
13
|
</div>
|
|
13
14
|
```
|
|
14
15
|
|
|
15
|
-
Use `Badge` quando o estado precisar permanecer legível sem depender do contexto ao
|
|
16
|
+
Use [`Badge`](/ui/badge) quando o estado precisar permanecer legível sem depender do contexto ao
|
|
17
|
+
redor.
|
|
18
|
+
|
|
19
|
+
## Ponto contornado
|
|
20
|
+
|
|
21
|
+
`variant="outline"` desenha só o contorno. Ele diferencia dois estados que compartilham o mesmo
|
|
22
|
+
`context`, como uma execução agendada e uma em andamento. O `label` continua nomeando cada estado.
|
|
23
|
+
|
|
24
|
+
```tsx preview
|
|
25
|
+
<div className="flex items-center gap-4 text-sm">
|
|
26
|
+
<span className="flex items-center gap-2"><Dot context="success" label="Em execução" /> developer</span>
|
|
27
|
+
<span className="flex items-center gap-2"><Dot context="success" variant="outline" label="Agendado" /> reviewer</span>
|
|
28
|
+
<span className="flex items-center gap-2"><Dot context="neutral" variant="outline" label="Inativo" /> designer</span>
|
|
29
|
+
</div>
|
|
30
|
+
```
|
|
16
31
|
|
|
17
32
|
## Propriedades de Dot
|
|
18
33
|
|
|
@@ -20,4 +35,19 @@ Use `Badge` quando o estado precisar permanecer legível sem depender do context
|
|
|
20
35
|
|---|---|---|---|
|
|
21
36
|
| `context` | `'neutral' \| 'primary' \| 'info' \| 'success' \| 'warning' \| 'danger'` | `'neutral'` | O significado da cor. |
|
|
22
37
|
| `variant` | `'solid' \| 'outline'` | `'solid'` | Ponto preenchido ou só contornado. |
|
|
23
|
-
| `label` | `string` | | Nome acessível quando a cor comunica estado;
|
|
38
|
+
| `label` | `string` | | Nome acessível quando a cor comunica estado; o ponto passa a ser exposto como imagem com esse nome. Sem ele, o ponto é decorativo (`aria-hidden`). |
|
|
39
|
+
|
|
40
|
+
Os demais atributos vão para o elemento `span`.
|
|
41
|
+
|
|
42
|
+
## Função dotVariants
|
|
43
|
+
|
|
44
|
+
`dotVariants({ context, variant })` retorna as classes do ponto para um elemento que não é
|
|
45
|
+
renderizado pelo `Dot`. Os padrões são os mesmos do componente: `neutral` e `solid`. Sem o
|
|
46
|
+
componente, o elemento não recebe `label` nem `aria-hidden`; trate a acessibilidade nele.
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
function dotVariants(options?: {
|
|
50
|
+
context?: DotContext | null
|
|
51
|
+
variant?: DotVariant | null
|
|
52
|
+
}): string
|
|
53
|
+
```
|