@softize/opus 15.2.2 → 16.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +60 -18
  2. package/bin/lib/check.mjs +98 -15
  3. package/bin/lib/copy.mjs +811 -314
  4. package/bin/lib/gen-manifest.mjs +24 -23
  5. package/bin/lib/gen-runner.mjs +188 -148
  6. package/docs/adr/0010-page-header-owns-page-chrome.md +3 -4
  7. package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +5 -3
  8. package/docs/adr/0012-modal-header-only-names-the-surface.md +45 -0
  9. package/docs/adr/0013-presentation-is-a-portable-action-oriented-artifact.md +92 -0
  10. package/docs/code-style.md +24 -19
  11. package/package.json +5 -1
  12. package/registry/skills/build-opus-ui/references/ui-patterns.md +43 -26
  13. package/src/core/presentation.ts +512 -0
  14. package/src/presentation/index.ts +1 -0
  15. package/src/ui/components/patterns/action-list-dialog.tsx +26 -9
  16. package/src/ui/components/patterns/confirm.tsx +34 -29
  17. package/src/ui/components/patterns/form-dialog.tsx +20 -8
  18. package/src/ui/components/patterns/list.tsx +26 -9
  19. package/src/ui/components/patterns/page.tsx +99 -139
  20. package/src/ui/components/patterns/presentation.tsx +539 -0
  21. package/src/ui/components/patterns/sidebar.tsx +3 -3
  22. package/src/ui/components/patterns/trigger.tsx +38 -17
  23. package/src/ui/components/primitives/button-group.tsx +53 -43
  24. package/src/ui/components/primitives/command.tsx +30 -72
  25. package/src/ui/components/primitives/dialog.tsx +23 -89
  26. package/src/ui/components/primitives/drawer.tsx +8 -34
  27. package/src/ui/docs/content/action-form-dialog.md +12 -10
  28. package/src/ui/docs/content/action-list-dialog.md +22 -17
  29. package/src/ui/docs/content/button.md +52 -35
  30. package/src/ui/docs/content/communication.md +26 -26
  31. package/src/ui/docs/content/dialog.md +173 -154
  32. package/src/ui/docs/content/drawer.md +12 -11
  33. package/src/ui/docs/content/page.md +72 -91
  34. package/src/ui/docs/content/presentation.md +188 -0
  35. package/src/ui/docs/registry.tsx +6 -0
  36. package/src/ui/meta.ts +8 -2
  37. package/src/ui/react.tsx +16 -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 | 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"`. |
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. | Use `dialog.choose`. |
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('Nenhuma resposta.')
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 variant="outline" size="sm" onClick={async () => {
62
- await dialog.alert({
63
- title: 'Sessão expirada',
64
- description: 'Entre novamente para continuar.',
65
- })
66
- setResult('Aviso reconhecido.')
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 variant="outline" size="sm" onClick={async () => {
71
- const accepted = await dialog.confirm({
72
- title: 'Excluir sessão?',
73
- description: 'O worktree e o preview desta sessão serão removidos.',
74
- action: 'Excluir',
75
- context: 'danger',
76
- })
77
- setResult(accepted ? 'Sessão excluída.' : 'Sessão mantida.')
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 variant="outline" size="sm" onClick={async () => {
82
- const name = await dialog.prompt({
83
- title: 'Renomear snapshot',
84
- action: 'Renomear',
85
- placeholder: 'Ex.: versão final',
86
- })
87
- setResult(name === null ? 'Nome mantido.' : `Novo nome: ${name}`)
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 variant="outline" size="sm" onClick={async () => {
92
- const choice = await dialog.choose({
93
- title: 'Fechar editor?',
94
- description: 'O contrato possui alterações que ainda não foram salvas.',
95
- actions: [
96
- { result: 'continue', label: 'Continuar editando', initialFocus: true },
97
- { result: 'discard', label: 'Descartar', variant: 'outline' },
98
- { result: 'save', label: 'Salvar e fechar' },
99
- ],
100
- })
101
- setResult(choice === null ? 'Editor mantido.' : `Resultado: ${choice}`)
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 conteúdo próprio
160
+ ### Adicionar contexto relevante
140
161
 
141
- Use `body` quando a descrição não for suficiente, como em uma lista de recursos afetados:
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: 'Encerrar três sessões?',
146
- description: 'Os agentes vinculados serão interrompidos.',
147
- body: <AffectedSessions />,
148
- action: 'Encerrar sessões',
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('Nenhuma resposta.')
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` e `DialogDescription` nomeiam e descrevem a superfície para tecnologias assistivas.
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 | Tipo | Padrão | Descrição |
220
- |---|---|---|---|
221
- | `open` | `boolean` | | Controla a abertura. |
222
- | `defaultOpen` | `boolean` | `false` | Define a abertura inicial no modo não controlado. |
223
- | `onOpenChange` | `(open: boolean) => void` | | Recebe mudanças de abertura. |
224
- | `mode` | `'default' \| 'alert'` | `'default'` | Exige resposta explícita em `alert`; o componente deriva o papel de acessibilidade. |
225
- | `onResult` | `(result: string) => void` | | Recebe o resultado do `DialogClose` acionado. |
226
- | `modal` | `boolean` | `true` | No modo padrão, mantém foco e interação restritos à superfície aberta. |
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 | Padrão | Descrição |
231
- |---|---|---|---|
232
- | `asChild` | `boolean` | `false` | Usa o filho como gatilho sem criar outro elemento. |
233
- | `children` | `ReactNode` | | Controle que abre o diálogo. |
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 | Tipo | Padrão | Descrição |
238
- |---|---|---|---|
239
- | `showCloseButton` | `boolean` | `true` | No modo padrão, exibe o botão de fechamento no canto; o modo de alerta exige uma resposta identificável. |
240
- | `className` | `string` | | Ajusta a superfície. |
241
- | `children` | `ReactNode` | | Cabeçalho, corpo, rodapé ou conteúdo próprio. |
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 | Padrão | Descrição |
246
- |---|---|---|---|
247
- | `className` | `string` | | Ajusta a faixa superior. |
248
- | `children` | `ReactNode` | | Título, descrição e mídia opcional. |
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 | Padrão | Descrição |
253
- |---|---|---|---|
254
- | `className` | `string` | | Ajusta o corpo rolável do modo padrão ou o conteúdo próprio do alerta. |
255
- | `children` | `ReactNode` | | Conteúdo principal da tarefa. |
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 | Padrão | Descrição |
260
- |---|---|---|---|
261
- | `className` | `string` | | Ajusta a faixa do modo padrão ou a grade de respostas do alerta. |
262
- | `children` | `ReactNode` | | Ações secundárias e principal. |
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 | Padrão | Descrição |
267
- |---|---|---|---|
268
- | `className` | `string` | | Ajusta o título. |
269
- | `children` | `ReactNode` | | Nome da tarefa ou do conteúdo modal. |
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 | Padrão | Descrição |
281
- |---|---|---|---|
282
- | `className` | `string` | | Ajusta a moldura quadrada da mídia. |
283
- | `children` | `ReactNode` | | Ícone que reforça o contexto da resposta. |
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 | Tipo | Padrão | Descrição |
288
- |---|---|---|---|
289
- | `initialFocus` | `boolean` | `false` | No modo de alerta, marca o controle como destino inicial seguro do foco. |
290
- | `result` | `string` | | Entrega esta resposta a `Dialog onResult` antes de fechar. |
291
- | `asChild` | `boolean` | `false` | Aplica o fechamento ao filho; use com `Button`. |
292
- | `children` | `ReactNode` | | Controle que fecha o diálogo. |
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 | Padrão | Descrição |
297
- |---|---|---|---|
298
- | `className` | `string` | | Ajusta a camada que cobre a página. |
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 | Tipo | Padrão | Descrição |
313
- |---|---|---|---|
314
- | `title` | `ReactNode` | | Nomeia o aviso que exige reconhecimento. |
315
- | `description` | `ReactNode` | | Explica efeito, alcance ou próximo passo. |
316
- | `body` | `ReactNode` | | Acrescenta conteúdo próprio abaixo da descrição. |
317
- | `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
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 | Tipo | Padrão | Descrição |
323
- |---|---|---|---|
324
- | `title` | `ReactNode` | | Nomeia a decisão. |
325
- | `description` | `ReactNode` | | Explica a consequência necessária para decidir. |
326
- | `body` | `ReactNode` | | Acrescenta conteúdo próprio abaixo da descrição. |
327
- | `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
328
- | `action` | `string` | `'Confirmar'` | Define o rótulo do resultado afirmativo. |
329
- | `cancel` | `string` | `'Cancelar'` | Define o rótulo da resposta negativa. |
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 | Tipo | Padrão | Descrição |
335
- |---|---|---|---|
336
- | `title` | `ReactNode` | | Nomeia a informação solicitada. |
337
- | `description` | `ReactNode` | | Explica como a informação será usada. |
338
- | `body` | `ReactNode` | | Acrescenta conteúdo próprio abaixo da descrição. |
339
- | `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
340
- | `action` | `string` | `'Confirmar'` | Define o rótulo do resultado afirmativo. |
341
- | `cancel` | `string` | `'Cancelar'` | Define o rótulo da resposta negativa. |
342
- | `context` | `'primary' \| 'danger'` | `'primary'` | Define o contexto da ação afirmativa. |
343
- | `placeholder` | `string` | | Orienta o formato esperado quando um exemplo ajuda. |
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 | Tipo | Padrão | Descrição |
349
- |---|---|---|---|
350
- | `title` | `ReactNode` | | Nomeia a escolha. |
351
- | `description` | `ReactNode` | | Explica o contexto necessário para escolher. |
352
- | `body` | `ReactNode` | | Acrescenta conteúdo próprio antes das ações. |
353
- | `media` | `ReactNode` | | Exibe um ícone na moldura de `DialogMedia`. |
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 | Tipo | Padrão | Descrição |
359
- |---|---|---|---|
360
- | `result` | `string` | | Valor único devolvido quando a ação for escolhida. |
361
- | `label` | `ReactNode` | | Rótulo que descreve o resultado da ação. |
362
- | `initialFocus` | `boolean` | `false` | Marca a única saída segura que recebe o foco inicial. |
363
- | `context` | `ButtonContext` | Última ação: `primary`; demais: `neutral` | Define o significado semântico. |
364
- | `variant` | `ButtonVariant` | Última ação: `solid`; demais: `ghost` | Define o tratamento visual. |
365
- | `disabled` | `boolean` | `false` | Impede a escolha desta ação. |
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
- Campos, entrada/saída, arquivo…
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 | 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. |
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 | 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. |
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`.