@softize/opus 15.2.2 → 16.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 +51 -18
- package/bin/lib/check.mjs +98 -15
- package/bin/lib/copy.mjs +811 -314
- package/bin/lib/gen-manifest.mjs +24 -23
- package/bin/lib/gen-runner.mjs +188 -148
- package/docs/adr/0010-page-header-owns-page-chrome.md +3 -4
- package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +5 -3
- package/docs/adr/0012-modal-header-only-names-the-surface.md +45 -0
- package/docs/adr/0013-presentation-is-a-portable-action-oriented-artifact.md +92 -0
- package/docs/code-style.md +24 -19
- package/package.json +5 -1
- package/registry/skills/build-opus-ui/references/ui-patterns.md +43 -26
- package/src/core/presentation.ts +512 -0
- package/src/presentation/index.ts +1 -0
- package/src/ui/components/patterns/action-list-dialog.tsx +26 -9
- package/src/ui/components/patterns/confirm.tsx +34 -29
- package/src/ui/components/patterns/form-dialog.tsx +20 -8
- package/src/ui/components/patterns/list.tsx +26 -9
- package/src/ui/components/patterns/page.tsx +99 -139
- package/src/ui/components/patterns/presentation.tsx +316 -0
- package/src/ui/components/patterns/sidebar.tsx +3 -3
- package/src/ui/components/patterns/trigger.tsx +38 -17
- package/src/ui/components/primitives/button-group.tsx +53 -43
- package/src/ui/components/primitives/command.tsx +30 -72
- package/src/ui/components/primitives/dialog.tsx +23 -89
- package/src/ui/components/primitives/drawer.tsx +8 -34
- package/src/ui/docs/content/action-form-dialog.md +12 -10
- package/src/ui/docs/content/action-list-dialog.md +22 -17
- package/src/ui/docs/content/button.md +52 -35
- package/src/ui/docs/content/communication.md +26 -26
- package/src/ui/docs/content/dialog.md +173 -154
- package/src/ui/docs/content/drawer.md +12 -11
- package/src/ui/docs/content/page.md +72 -91
- package/src/ui/docs/content/presentation.md +158 -0
- package/src/ui/docs/registry.tsx +6 -0
- package/src/ui/meta.ts +8 -2
- package/src/ui/react.tsx +10 -3
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
Use a família `Dialog` quando a pessoa precisar concluir uma tarefa ou responder sem perder o
|
|
4
4
|
contexto da página. A forma escolhida depende do tipo de interrupção:
|
|
5
5
|
|
|
6
|
-
| Necessidade
|
|
7
|
-
|
|
8
|
-
| Exibir uma tarefa ou conteúdo modal que pode ser fechado.
|
|
9
|
-
| Exigir uma resposta e impedir o fechamento pelo clique externo.
|
|
6
|
+
| Necessidade | Escolha |
|
|
7
|
+
| -------------------------------------------------------------------------------- | -------------------------------------------------------- |
|
|
8
|
+
| Exibir uma tarefa ou conteúdo modal que pode ser fechado. | Componha `Dialog`. |
|
|
9
|
+
| Exigir uma resposta e impedir o fechamento pelo clique externo. | Componha `Dialog mode="alert"`. |
|
|
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
|
-
| Escolher entre vários resultados simples.
|
|
11
|
+
| Escolher entre vários resultados simples. | Use `dialog.choose`. |
|
|
12
12
|
|
|
13
13
|
Para conteúdo ancorado e não modal, use `Popover`. Para uma lista de ações, use `Menu`.
|
|
14
14
|
|
|
@@ -26,7 +26,6 @@ borda semântica, raio `xl` e elevação para permanecer distinta da página.
|
|
|
26
26
|
<DialogContent>
|
|
27
27
|
<DialogHeader>
|
|
28
28
|
<DialogTitle>Novo workspace</DialogTitle>
|
|
29
|
-
<DialogDescription>O workspace agrupa os repositórios e agentes do cliente.</DialogDescription>
|
|
30
29
|
</DialogHeader>
|
|
31
30
|
<DialogBody className="space-y-2">
|
|
32
31
|
<Label htmlFor="workspace-name">Nome</Label>
|
|
@@ -53,61 +52,83 @@ um contrato pronto. As chamadas são assíncronas e resolvem somente depois da r
|
|
|
53
52
|
|
|
54
53
|
```tsx preview
|
|
55
54
|
function Demo() {
|
|
56
|
-
const [result, setResult] = useState(
|
|
55
|
+
const [result, setResult] = useState("Nenhuma resposta.");
|
|
57
56
|
|
|
58
57
|
return (
|
|
59
58
|
<div className="flex flex-wrap items-center gap-3">
|
|
60
59
|
<DialogHost />
|
|
61
|
-
<Button
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
<Button
|
|
61
|
+
variant="outline"
|
|
62
|
+
size="sm"
|
|
63
|
+
onClick={async () => {
|
|
64
|
+
await dialog.alert({
|
|
65
|
+
title: "Sessão expirada",
|
|
66
|
+
body: "Entre novamente para continuar.",
|
|
67
|
+
});
|
|
68
|
+
setResult("Aviso reconhecido.");
|
|
69
|
+
}}
|
|
70
|
+
>
|
|
68
71
|
Abrir aviso
|
|
69
72
|
</Button>
|
|
70
|
-
<Button
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
<Button
|
|
74
|
+
variant="outline"
|
|
75
|
+
size="sm"
|
|
76
|
+
onClick={async () => {
|
|
77
|
+
const accepted = await dialog.confirm({
|
|
78
|
+
title: "Excluir sessão?",
|
|
79
|
+
body: "O worktree e o preview desta sessão serão removidos.",
|
|
80
|
+
action: "Excluir",
|
|
81
|
+
context: "danger",
|
|
82
|
+
});
|
|
83
|
+
setResult(accepted ? "Sessão excluída." : "Sessão mantida.");
|
|
84
|
+
}}
|
|
85
|
+
>
|
|
79
86
|
Confirmar exclusão
|
|
80
87
|
</Button>
|
|
81
|
-
<Button
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
<Button
|
|
89
|
+
variant="outline"
|
|
90
|
+
size="sm"
|
|
91
|
+
onClick={async () => {
|
|
92
|
+
const name = await dialog.prompt({
|
|
93
|
+
title: "Renomear snapshot",
|
|
94
|
+
action: "Renomear",
|
|
95
|
+
placeholder: "Ex.: versão final",
|
|
96
|
+
});
|
|
97
|
+
setResult(name === null ? "Nome mantido." : `Novo nome: ${name}`);
|
|
98
|
+
}}
|
|
99
|
+
>
|
|
89
100
|
Renomear snapshot
|
|
90
101
|
</Button>
|
|
91
|
-
<Button
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
102
|
+
<Button
|
|
103
|
+
variant="outline"
|
|
104
|
+
size="sm"
|
|
105
|
+
onClick={async () => {
|
|
106
|
+
const choice = await dialog.choose({
|
|
107
|
+
title: "Fechar editor?",
|
|
108
|
+
body: "O contrato possui alterações que ainda não foram salvas.",
|
|
109
|
+
actions: [
|
|
110
|
+
{
|
|
111
|
+
result: "continue",
|
|
112
|
+
label: "Continuar editando",
|
|
113
|
+
initialFocus: true,
|
|
114
|
+
},
|
|
115
|
+
{ result: "discard", label: "Descartar", variant: "outline" },
|
|
116
|
+
{ result: "save", label: "Salvar e fechar" },
|
|
117
|
+
],
|
|
118
|
+
});
|
|
119
|
+
setResult(
|
|
120
|
+
choice === null ? "Editor mantido." : `Resultado: ${choice}`,
|
|
121
|
+
);
|
|
122
|
+
}}
|
|
123
|
+
>
|
|
103
124
|
Fechar editor
|
|
104
125
|
</Button>
|
|
105
126
|
<span className="text-sm text-muted-foreground">{result}</span>
|
|
106
127
|
</div>
|
|
107
|
-
)
|
|
128
|
+
);
|
|
108
129
|
}
|
|
109
130
|
|
|
110
|
-
render(<Demo />)
|
|
131
|
+
render(<Demo />);
|
|
111
132
|
```
|
|
112
133
|
|
|
113
134
|
`dialog.alert` devolve `Promise<void>`, `dialog.confirm` devolve `Promise<boolean>`,
|
|
@@ -136,17 +157,23 @@ Monte um `DialogHost` no shell do aplicativo, ao lado do `Toaster`:
|
|
|
136
157
|
Sem o host, a chamada lança um erro imediatamente. Solicitações concorrentes entram em uma fila e
|
|
137
158
|
aparecem uma por vez, preservando a resposta de cada `await`.
|
|
138
159
|
|
|
139
|
-
### Adicionar
|
|
160
|
+
### Adicionar contexto relevante
|
|
140
161
|
|
|
141
|
-
|
|
162
|
+
O título basta quando apenas nomeia a tarefa. Use `body` para uma consequência, instrução ou outro
|
|
163
|
+
contexto que realmente ajude a pessoa a decidir. O conteúdo aparece no início do corpo e pode ser
|
|
164
|
+
texto, um `Alert` ou uma composição própria:
|
|
142
165
|
|
|
143
166
|
```tsx
|
|
144
167
|
const accepted = await dialog.confirm({
|
|
145
|
-
title:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
168
|
+
title: "Encerrar três sessões?",
|
|
169
|
+
body: (
|
|
170
|
+
<Alert
|
|
171
|
+
context="warning"
|
|
172
|
+
description="Os agentes vinculados serão interrompidos."
|
|
173
|
+
/>
|
|
174
|
+
),
|
|
175
|
+
action: "Encerrar sessões",
|
|
176
|
+
});
|
|
150
177
|
```
|
|
151
178
|
|
|
152
179
|
Use `ActionTrigger` quando a confirmação já pertencer ao contrato de uma action. Use
|
|
@@ -163,7 +190,7 @@ layout específico.
|
|
|
163
190
|
|
|
164
191
|
```tsx preview
|
|
165
192
|
function ResponseDialogDemo() {
|
|
166
|
-
const [result, setResult] = useState(
|
|
193
|
+
const [result, setResult] = useState("Nenhuma resposta.");
|
|
167
194
|
|
|
168
195
|
return (
|
|
169
196
|
<div className="space-y-3">
|
|
@@ -174,10 +201,12 @@ function ResponseDialogDemo() {
|
|
|
174
201
|
<DialogContent>
|
|
175
202
|
<DialogHeader>
|
|
176
203
|
<DialogTitle>Fechar editor?</DialogTitle>
|
|
177
|
-
<DialogDescription>
|
|
178
|
-
O contrato possui alterações que ainda não foram salvas.
|
|
179
|
-
</DialogDescription>
|
|
180
204
|
</DialogHeader>
|
|
205
|
+
<DialogBody>
|
|
206
|
+
<p className="text-sm text-muted-foreground">
|
|
207
|
+
O contrato possui alterações que ainda não foram salvas.
|
|
208
|
+
</p>
|
|
209
|
+
</DialogBody>
|
|
181
210
|
<DialogFooter className="grid-cols-3">
|
|
182
211
|
<DialogClose result="continue" initialFocus asChild>
|
|
183
212
|
<Button variant="ghost">Continuar editando</Button>
|
|
@@ -193,10 +222,10 @@ function ResponseDialogDemo() {
|
|
|
193
222
|
</Dialog>
|
|
194
223
|
<p className="text-sm text-muted-foreground">{result}</p>
|
|
195
224
|
</div>
|
|
196
|
-
)
|
|
225
|
+
);
|
|
197
226
|
}
|
|
198
227
|
|
|
199
|
-
render(<ResponseDialogDemo />)
|
|
228
|
+
render(<ResponseDialogDemo />);
|
|
200
229
|
```
|
|
201
230
|
|
|
202
231
|
`DialogClose` fecha a superfície sem escolher a aparência. Use `asChild` e componha um `Button`;
|
|
@@ -207,7 +236,8 @@ botão. O texto informa o efeito real, como `Excluir`, `Revogar acesso` ou `Ence
|
|
|
207
236
|
|
|
208
237
|
## Acessibilidade
|
|
209
238
|
|
|
210
|
-
- `DialogTitle`
|
|
239
|
+
- `DialogTitle` nomeia a superfície para tecnologias assistivas. Quando um texto conciso do corpo
|
|
240
|
+
também precisar descrevê-la, relacione seu `id` por `aria-describedby` em `DialogContent`.
|
|
211
241
|
- O modo padrão permite fechamento externo; `mode="alert"` exige uma resposta explícita.
|
|
212
242
|
- O comportamento selecionado por `mode` determina o papel de acessibilidade; `role` não configura
|
|
213
243
|
o comportamento.
|
|
@@ -216,86 +246,79 @@ botão. O texto informa o efeito real, como `Excluir`, `Revogar acesso` ou `Ence
|
|
|
216
246
|
|
|
217
247
|
## Propriedades de Dialog
|
|
218
248
|
|
|
219
|
-
| Propriedade
|
|
220
|
-
|
|
221
|
-
| `open`
|
|
222
|
-
| `defaultOpen`
|
|
223
|
-
| `onOpenChange` | `(open: boolean) => void`
|
|
224
|
-
| `mode`
|
|
225
|
-
| `onResult`
|
|
226
|
-
| `modal`
|
|
249
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
250
|
+
| -------------- | -------------------------- | ----------- | ----------------------------------------------------------------------------------- |
|
|
251
|
+
| `open` | `boolean` | | Controla a abertura. |
|
|
252
|
+
| `defaultOpen` | `boolean` | `false` | Define a abertura inicial no modo não controlado. |
|
|
253
|
+
| `onOpenChange` | `(open: boolean) => void` | | Recebe mudanças de abertura. |
|
|
254
|
+
| `mode` | `'default' \| 'alert'` | `'default'` | Exige resposta explícita em `alert`; o componente deriva o papel de acessibilidade. |
|
|
255
|
+
| `onResult` | `(result: string) => void` | | Recebe o resultado do `DialogClose` acionado. |
|
|
256
|
+
| `modal` | `boolean` | `true` | No modo padrão, mantém foco e interação restritos à superfície aberta. |
|
|
227
257
|
|
|
228
258
|
## Propriedades de DialogTrigger
|
|
229
259
|
|
|
230
|
-
| Propriedade | Tipo
|
|
231
|
-
|
|
232
|
-
| `asChild`
|
|
233
|
-
| `children`
|
|
260
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
261
|
+
| ----------- | ----------- | ------- | -------------------------------------------------- |
|
|
262
|
+
| `asChild` | `boolean` | `false` | Usa o filho como gatilho sem criar outro elemento. |
|
|
263
|
+
| `children` | `ReactNode` | | Controle que abre o diálogo. |
|
|
234
264
|
|
|
235
265
|
## Propriedades de DialogContent
|
|
236
266
|
|
|
237
|
-
| Propriedade
|
|
238
|
-
|
|
239
|
-
| `showCloseButton` | `boolean`
|
|
240
|
-
| `className`
|
|
241
|
-
| `children`
|
|
267
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
268
|
+
| ----------------- | ----------- | ------ | -------------------------------------------------------------------------------------------------------- |
|
|
269
|
+
| `showCloseButton` | `boolean` | `true` | No modo padrão, exibe o botão de fechamento no canto; o modo de alerta exige uma resposta identificável. |
|
|
270
|
+
| `className` | `string` | | Ajusta a superfície. |
|
|
271
|
+
| `children` | `ReactNode` | | Cabeçalho, corpo, rodapé ou conteúdo próprio. |
|
|
242
272
|
|
|
243
273
|
## Propriedades de DialogHeader
|
|
244
274
|
|
|
245
|
-
| Propriedade | Tipo
|
|
246
|
-
|
|
247
|
-
| `className` | `string`
|
|
248
|
-
| `children`
|
|
275
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
276
|
+
| ----------- | ----------- | ------ | ------------------------ |
|
|
277
|
+
| `className` | `string` | | Ajusta a faixa superior. |
|
|
278
|
+
| `children` | `ReactNode` | | Título e mídia opcional. |
|
|
249
279
|
|
|
250
280
|
## Propriedades de DialogBody
|
|
251
281
|
|
|
252
|
-
| Propriedade | Tipo
|
|
253
|
-
|
|
254
|
-
| `className` | `string`
|
|
255
|
-
| `children`
|
|
282
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
283
|
+
| ----------- | ----------- | ------ | ---------------------------------------------------------------------- |
|
|
284
|
+
| `className` | `string` | | Ajusta o corpo rolável do modo padrão ou o conteúdo próprio do alerta. |
|
|
285
|
+
| `children` | `ReactNode` | | Conteúdo principal da tarefa. |
|
|
256
286
|
|
|
257
287
|
## Propriedades de DialogFooter
|
|
258
288
|
|
|
259
|
-
| Propriedade | Tipo
|
|
260
|
-
|
|
261
|
-
| `className` | `string`
|
|
262
|
-
| `children`
|
|
289
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
290
|
+
| ----------- | ----------- | ------ | ---------------------------------------------------------------- |
|
|
291
|
+
| `className` | `string` | | Ajusta a faixa do modo padrão ou a grade de respostas do alerta. |
|
|
292
|
+
| `children` | `ReactNode` | | Ações secundárias e principal. |
|
|
263
293
|
|
|
264
294
|
## Propriedades de DialogTitle
|
|
265
295
|
|
|
266
|
-
| Propriedade | Tipo
|
|
267
|
-
|
|
268
|
-
| `className` | `string`
|
|
269
|
-
| `children`
|
|
270
|
-
|
|
271
|
-
## Propriedades de DialogDescription
|
|
272
|
-
|
|
273
|
-
| Propriedade | Tipo | Padrão | Descrição |
|
|
274
|
-
|---|---|---|---|
|
|
275
|
-
| `className` | `string` | | Ajusta a descrição. |
|
|
276
|
-
| `children` | `ReactNode` | | Contexto, efeito ou consequência relevante. |
|
|
296
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
297
|
+
| ----------- | ----------- | ------ | ------------------------------------ |
|
|
298
|
+
| `className` | `string` | | Ajusta o título. |
|
|
299
|
+
| `children` | `ReactNode` | | Nome da tarefa ou do conteúdo modal. |
|
|
277
300
|
|
|
278
301
|
## Propriedades de DialogMedia
|
|
279
302
|
|
|
280
|
-
| Propriedade | Tipo
|
|
281
|
-
|
|
282
|
-
| `className` | `string`
|
|
283
|
-
| `children`
|
|
303
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
304
|
+
| ----------- | ----------- | ------ | ----------------------------------------- |
|
|
305
|
+
| `className` | `string` | | Ajusta a moldura quadrada da mídia. |
|
|
306
|
+
| `children` | `ReactNode` | | Ícone que reforça o contexto da resposta. |
|
|
284
307
|
|
|
285
308
|
## Propriedades de DialogClose
|
|
286
309
|
|
|
287
|
-
| Propriedade
|
|
288
|
-
|
|
289
|
-
| `initialFocus` | `boolean`
|
|
290
|
-
| `result`
|
|
291
|
-
| `asChild`
|
|
292
|
-
| `children`
|
|
310
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
311
|
+
| -------------- | ----------- | ------- | ------------------------------------------------------------------------ |
|
|
312
|
+
| `initialFocus` | `boolean` | `false` | No modo de alerta, marca o controle como destino inicial seguro do foco. |
|
|
313
|
+
| `result` | `string` | | Entrega esta resposta a `Dialog onResult` antes de fechar. |
|
|
314
|
+
| `asChild` | `boolean` | `false` | Aplica o fechamento ao filho; use com `Button`. |
|
|
315
|
+
| `children` | `ReactNode` | | Controle que fecha o diálogo. |
|
|
293
316
|
|
|
294
317
|
## Propriedades de DialogOverlay
|
|
295
318
|
|
|
296
|
-
| Propriedade | Tipo
|
|
297
|
-
|
|
298
|
-
| `className` | `string` |
|
|
319
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
320
|
+
| ----------- | -------- | ------ | ----------------------------------- |
|
|
321
|
+
| `className` | `string` | | Ajusta a camada que cobre a página. |
|
|
299
322
|
|
|
300
323
|
## Propriedades de DialogPortal
|
|
301
324
|
|
|
@@ -309,57 +332,53 @@ imperativa.
|
|
|
309
332
|
|
|
310
333
|
## Opções de dialog.alert
|
|
311
334
|
|
|
312
|
-
| Opção
|
|
313
|
-
|
|
314
|
-
| `title`
|
|
315
|
-
| `
|
|
316
|
-
| `
|
|
317
|
-
| `
|
|
318
|
-
| `action` | `string` | `'OK'` | Define o rótulo de reconhecimento. |
|
|
335
|
+
| Opção | Tipo | Padrão | Descrição |
|
|
336
|
+
| -------- | ----------- | ------ | ------------------------------------------------ |
|
|
337
|
+
| `title` | `ReactNode` | | Nomeia o aviso que exige reconhecimento. |
|
|
338
|
+
| `body` | `ReactNode` | | Apresenta contexto relevante no início do corpo. |
|
|
339
|
+
| `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
|
|
340
|
+
| `action` | `string` | `'OK'` | Define o rótulo de reconhecimento. |
|
|
319
341
|
|
|
320
342
|
## Opções de dialog.confirm
|
|
321
343
|
|
|
322
|
-
| Opção
|
|
323
|
-
|
|
324
|
-
| `title`
|
|
325
|
-
| `
|
|
326
|
-
| `
|
|
327
|
-
| `
|
|
328
|
-
| `
|
|
329
|
-
| `
|
|
330
|
-
| `context` | `'primary' \| 'danger'` | `'primary'` | Define o contexto da ação afirmativa. |
|
|
344
|
+
| Opção | Tipo | Padrão | Descrição |
|
|
345
|
+
| --------- | ----------------------- | ------------- | ------------------------------------------------------------------- |
|
|
346
|
+
| `title` | `ReactNode` | | Nomeia a decisão. |
|
|
347
|
+
| `body` | `ReactNode` | | Apresenta a consequência ou outro contexto necessário para decidir. |
|
|
348
|
+
| `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
|
|
349
|
+
| `action` | `string` | `'Confirmar'` | Define o rótulo do resultado afirmativo. |
|
|
350
|
+
| `cancel` | `string` | `'Cancelar'` | Define o rótulo da resposta negativa. |
|
|
351
|
+
| `context` | `'primary' \| 'danger'` | `'primary'` | Define o contexto da ação afirmativa. |
|
|
331
352
|
|
|
332
353
|
## Opções de dialog.prompt
|
|
333
354
|
|
|
334
|
-
| Opção
|
|
335
|
-
|
|
336
|
-
| `title`
|
|
337
|
-
| `
|
|
338
|
-
| `
|
|
339
|
-
| `
|
|
340
|
-
| `
|
|
341
|
-
| `
|
|
342
|
-
| `
|
|
343
|
-
| `
|
|
344
|
-
| `defaultValue` | `string` | | Define e seleciona o valor inicial do campo. |
|
|
355
|
+
| Opção | Tipo | Padrão | Descrição |
|
|
356
|
+
| -------------- | ----------------------- | ------------- | ------------------------------------------------------------------ |
|
|
357
|
+
| `title` | `ReactNode` | | Nomeia a informação solicitada. |
|
|
358
|
+
| `body` | `ReactNode` | | Explica como a informação será usada quando isso mudar a resposta. |
|
|
359
|
+
| `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
|
|
360
|
+
| `action` | `string` | `'Confirmar'` | Define o rótulo do resultado afirmativo. |
|
|
361
|
+
| `cancel` | `string` | `'Cancelar'` | Define o rótulo da resposta negativa. |
|
|
362
|
+
| `context` | `'primary' \| 'danger'` | `'primary'` | Define o contexto da ação afirmativa. |
|
|
363
|
+
| `placeholder` | `string` | | Orienta o formato esperado quando um exemplo ajuda. |
|
|
364
|
+
| `defaultValue` | `string` | | Define e seleciona o valor inicial do campo. |
|
|
345
365
|
|
|
346
366
|
## Opções de dialog.choose
|
|
347
367
|
|
|
348
|
-
| Opção
|
|
349
|
-
|
|
350
|
-
| `title`
|
|
351
|
-
| `
|
|
352
|
-
| `
|
|
353
|
-
| `
|
|
354
|
-
| `actions` | `readonly DialogChoice[]` | | Declara os resultados disponíveis. |
|
|
368
|
+
| Opção | Tipo | Padrão | Descrição |
|
|
369
|
+
| --------- | ------------------------- | ------ | ------------------------------------------------ |
|
|
370
|
+
| `title` | `ReactNode` | | Nomeia a escolha. |
|
|
371
|
+
| `body` | `ReactNode` | | Apresenta o contexto necessário antes das ações. |
|
|
372
|
+
| `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
|
|
373
|
+
| `actions` | `readonly DialogChoice[]` | | Declara os resultados disponíveis. |
|
|
355
374
|
|
|
356
375
|
## Propriedades de DialogChoice
|
|
357
376
|
|
|
358
|
-
| Propriedade
|
|
359
|
-
|
|
360
|
-
| `result`
|
|
361
|
-
| `label`
|
|
362
|
-
| `initialFocus` | `boolean`
|
|
363
|
-
| `context`
|
|
364
|
-
| `variant`
|
|
365
|
-
| `disabled`
|
|
377
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
378
|
+
| -------------- | --------------- | ----------------------------------------- | ----------------------------------------------------- |
|
|
379
|
+
| `result` | `string` | | Valor único devolvido quando a ação for escolhida. |
|
|
380
|
+
| `label` | `ReactNode` | | Rótulo que descreve o resultado da ação. |
|
|
381
|
+
| `initialFocus` | `boolean` | `false` | Marca a única saída segura que recebe o foco inicial. |
|
|
382
|
+
| `context` | `ButtonContext` | Última ação: `primary`; demais: `neutral` | Define o significado semântico. |
|
|
383
|
+
| `variant` | `ButtonVariant` | Última ação: `solid`; demais: `ghost` | Define o tratamento visual. |
|
|
384
|
+
| `disabled` | `boolean` | `false` | Impede a escolha desta ação. |
|
|
@@ -12,10 +12,10 @@ entra pela direita e pode ser fechado por Esc, pelo overlay ou pelo botão de fe
|
|
|
12
12
|
<DrawerContent side="right">
|
|
13
13
|
<DrawerHeader>
|
|
14
14
|
<DrawerTitle>criarTicket</DrawerTitle>
|
|
15
|
-
<DrawerDescription>Ação · domínio Suporte</DrawerDescription>
|
|
16
15
|
</DrawerHeader>
|
|
17
16
|
<DrawerBody className="text-sm text-muted-foreground">
|
|
18
|
-
|
|
17
|
+
<p>Ação · domínio Suporte</p>
|
|
18
|
+
<p>Campos, entrada/saída, arquivo…</p>
|
|
19
19
|
</DrawerBody>
|
|
20
20
|
</DrawerContent>
|
|
21
21
|
</Drawer>
|
|
@@ -53,19 +53,20 @@ mesmo alinhamento horizontal entre título, conteúdo e ações.
|
|
|
53
53
|
|
|
54
54
|
## Propriedades de Drawer
|
|
55
55
|
|
|
56
|
-
| Propriedade
|
|
57
|
-
|
|
58
|
-
| `open`
|
|
59
|
-
| `onOpenChange` | `(open: boolean) => void` |
|
|
56
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
57
|
+
| -------------- | ------------------------- | ------ | ------------------------------------------------------------------ |
|
|
58
|
+
| `open` | `boolean` | | Estado no modo controlado. |
|
|
59
|
+
| `onOpenChange` | `(open: boolean) => void` | | Atualiza o estado para permitir abertura ou fechamento por código. |
|
|
60
60
|
|
|
61
61
|
## Propriedades de DrawerContent
|
|
62
62
|
|
|
63
|
-
| Propriedade
|
|
64
|
-
|
|
65
|
-
| `side`
|
|
66
|
-
| `showCloseButton` | `boolean`
|
|
63
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
64
|
+
| ----------------- | ---------------------------------------- | --------- | -------------------------------------------------------------------------------- |
|
|
65
|
+
| `side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'right'` | Borda de onde o painel aparece. |
|
|
66
|
+
| `showCloseButton` | `boolean` | `true` | Exibe o botão de fechamento. Desative quando o painel exigir uma ação explícita. |
|
|
67
67
|
|
|
68
68
|
## Propriedades de DrawerBody
|
|
69
69
|
|
|
70
70
|
`DrawerBody` aceita os atributos de `HTMLDivElement` e ocupa a região flexível e rolável entre
|
|
71
|
-
`DrawerHeader` e `DrawerFooter`.
|
|
71
|
+
`DrawerHeader` e `DrawerFooter`. O cabeçalho nomeia o painel; contexto relevante entra no começo
|
|
72
|
+
do corpo como texto ou `Alert`.
|