@softize/opus 12.10.0 → 13.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 +56 -0
- package/bin/lib/check.mjs +1098 -310
- package/bin/lib/copy.mjs +12 -5
- package/docs/adr/0003-dictionary-presentation-is-declared.md +3 -0
- package/docs/adr/0004-page-content-state-is-composed.md +65 -0
- package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +180 -0
- package/docs/adr/0006-semantic-context-precedes-visual-variant.md +182 -0
- package/docs/adr/0007-toast-actions-form-an-ordered-collection.md +63 -0
- package/docs/adr/0008-hierarchical-navigation-is-composed-at-the-consumer-boundary.md +71 -0
- package/docs/radius-scale.md +1 -1
- package/package.json +1 -1
- package/registry/instructions/opus.md +5 -0
- package/registry/skills/build-opus-ui/SKILL.md +27 -16
- package/registry/skills/build-opus-ui/references/evaluations.md +16 -5
- package/registry/skills/build-opus-ui/references/ui-patterns.md +38 -15
- package/registry/skills/maintain-opus-docs/SKILL.md +83 -0
- package/registry/skills/maintain-opus-docs/agents/openai.yaml +4 -0
- package/registry/skills/maintain-opus-docs/references/editorial-standard.md +85 -0
- package/registry/skills/maintain-opus-docs/references/evaluations.md +34 -0
- package/registry/skills/maintain-opus-docs/scripts/audit-docs.mjs +81 -0
- package/registry/skills/model-opus-dictionary/SKILL.md +4 -2
- package/registry/skills/model-opus-dictionary/references/evaluations.md +4 -3
- package/registry/templates/app/src/App.tsx +1 -1
- package/src/core/dictionary.ts +52 -14
- package/src/core/index.ts +10 -0
- package/src/core/ui-context.ts +29 -0
- package/src/schema/drivers/zod.ts +17 -8
- package/src/ui/components/patterns/action-form-card.tsx +18 -12
- package/src/ui/components/patterns/confirm.tsx +163 -40
- package/src/ui/components/patterns/content-header.tsx +335 -61
- package/src/ui/components/patterns/data-state.tsx +23 -10
- package/src/ui/components/patterns/list.tsx +1097 -783
- package/src/ui/components/patterns/page-state.tsx +115 -0
- package/src/ui/components/patterns/page.tsx +231 -41
- package/src/ui/components/patterns/sidebar.tsx +357 -83
- package/src/ui/components/patterns/trigger.tsx +37 -30
- package/src/ui/components/patterns/view.tsx +7 -11
- package/src/ui/components/primitives/alert.tsx +298 -110
- package/src/ui/components/primitives/ask.tsx +2 -1
- package/src/ui/components/primitives/badge.tsx +91 -30
- package/src/ui/components/primitives/button.tsx +99 -60
- package/src/ui/components/primitives/calendar.tsx +39 -39
- package/src/ui/components/primitives/card.tsx +96 -23
- package/src/ui/components/primitives/detail.tsx +2 -2
- package/src/ui/components/primitives/dialog.tsx +196 -39
- package/src/ui/components/primitives/dictionary-value.tsx +9 -14
- package/src/ui/components/primitives/dot.tsx +74 -21
- package/src/ui/components/primitives/drawer.tsx +40 -24
- package/src/ui/components/primitives/empty.tsx +3 -3
- package/src/ui/components/primitives/item.tsx +135 -79
- package/src/ui/components/primitives/menu.tsx +11 -3
- package/src/ui/components/primitives/metric-card.tsx +133 -0
- package/src/ui/components/primitives/sonner.tsx +187 -8
- package/src/ui/components/primitives/table.tsx +2 -2
- package/src/ui/docs/DocBrowser.tsx +104 -25
- package/src/ui/docs/changelog.tsx +1 -1
- package/src/ui/docs/content/accordion.md +22 -16
- package/src/ui/docs/content/action-form-card.md +8 -8
- package/src/ui/docs/content/action-form-dialog.md +9 -9
- package/src/ui/docs/content/action-form.md +28 -34
- package/src/ui/docs/content/action-list-dialog.md +11 -6
- package/src/ui/docs/content/action-list.md +64 -39
- package/src/ui/docs/content/action-trigger.md +21 -14
- package/src/ui/docs/content/action-view.md +8 -8
- package/src/ui/docs/content/actions.md +9 -9
- package/src/ui/docs/content/ai.md +3 -3
- package/src/ui/docs/content/alert.md +54 -28
- package/src/ui/docs/content/aspect-ratio.md +4 -4
- package/src/ui/docs/content/audit.md +2 -2
- package/src/ui/docs/content/auth.md +3 -3
- package/src/ui/docs/content/avatar.md +34 -14
- package/src/ui/docs/content/badge.md +21 -22
- package/src/ui/docs/content/breadcrumb.md +13 -8
- package/src/ui/docs/content/button.md +93 -15
- package/src/ui/docs/content/calendar.md +5 -5
- package/src/ui/docs/content/card.md +6 -6
- package/src/ui/docs/content/carousel.md +16 -11
- package/src/ui/docs/content/chat.md +3 -3
- package/src/ui/docs/content/checkbox.md +7 -7
- package/src/ui/docs/content/cli.md +5 -5
- package/src/ui/docs/content/collapsible.md +8 -8
- package/src/ui/docs/content/command.md +16 -8
- package/src/ui/docs/content/composer.md +2 -2
- package/src/ui/docs/content/content.md +44 -0
- package/src/ui/docs/content/copyable.md +4 -3
- package/src/ui/docs/content/customization.md +7 -7
- package/src/ui/docs/content/cycle.md +3 -3
- package/src/ui/docs/content/data-state.md +11 -12
- package/src/ui/docs/content/data.md +26 -33
- package/src/ui/docs/content/detail.md +8 -5
- package/src/ui/docs/content/dialog.md +339 -31
- package/src/ui/docs/content/dictionary-value.md +19 -18
- package/src/ui/docs/content/dock.md +3 -3
- package/src/ui/docs/content/dot.md +7 -7
- package/src/ui/docs/content/drawer.md +32 -16
- package/src/ui/docs/content/empty-value.md +2 -2
- package/src/ui/docs/content/empty.md +19 -12
- package/src/ui/docs/content/events.md +4 -4
- package/src/ui/docs/content/field.md +34 -12
- package/src/ui/docs/content/getting-started.md +1 -1
- package/src/ui/docs/content/icon-picker.md +8 -4
- package/src/ui/docs/content/input-otp.md +20 -12
- package/src/ui/docs/content/input.md +121 -9
- package/src/ui/docs/content/item.md +64 -24
- package/src/ui/docs/content/kbd.md +19 -11
- package/src/ui/docs/content/label.md +5 -3
- package/src/ui/docs/content/log.md +4 -4
- package/src/ui/docs/content/markdown.md +7 -6
- package/src/ui/docs/content/mcp.md +13 -15
- package/src/ui/docs/content/menu.md +36 -17
- package/src/ui/docs/content/metric-card.md +41 -0
- package/src/ui/docs/content/observability.md +2 -2
- package/src/ui/docs/content/page.md +93 -10
- package/src/ui/docs/content/pagination.md +22 -17
- package/src/ui/docs/content/popover.md +16 -8
- package/src/ui/docs/content/progress.md +7 -5
- package/src/ui/docs/content/queue.md +5 -5
- package/src/ui/docs/content/radio-group.md +20 -12
- package/src/ui/docs/content/router.md +11 -6
- package/src/ui/docs/content/scheduler.md +4 -5
- package/src/ui/docs/content/scroll-area.md +12 -7
- package/src/ui/docs/content/select.md +42 -29
- package/src/ui/docs/content/semantic-context.md +63 -0
- package/src/ui/docs/content/separator.md +5 -5
- package/src/ui/docs/content/sidebar.md +325 -56
- package/src/ui/docs/content/skeleton.md +5 -4
- package/src/ui/docs/content/slider.md +8 -7
- package/src/ui/docs/content/spinner.md +8 -8
- package/src/ui/docs/content/split.md +8 -5
- package/src/ui/docs/content/storage.md +6 -8
- package/src/ui/docs/content/switch.md +8 -7
- package/src/ui/docs/content/table.md +16 -6
- package/src/ui/docs/content/tabs.md +28 -14
- package/src/ui/docs/content/testing.md +9 -11
- package/src/ui/docs/content/textarea.md +5 -4
- package/src/ui/docs/content/toast.md +47 -13
- package/src/ui/docs/content/toggle.md +75 -7
- package/src/ui/docs/content/tokens.md +31 -3
- package/src/ui/docs/content/tooltip.md +19 -11
- package/src/ui/docs/content/truncate.md +7 -8
- package/src/ui/docs/content/ui.md +10 -9
- package/src/ui/docs/content/upgrading.md +7 -8
- package/src/ui/docs/doc-client.tsx +2 -2
- package/src/ui/docs/registry.tsx +580 -229
- package/src/ui/lib/semantic-context.ts +30 -0
- package/src/ui/meta.ts +278 -286
- package/src/ui/react.tsx +377 -111
- package/src/ui/theme.css +116 -0
- package/src/ui/components/primitives/alert-dialog.tsx +0 -190
- package/src/ui/docs/content/alert-dialog.md +0 -73
- package/src/ui/docs/content/button-group.md +0 -71
- package/src/ui/docs/content/confirm.md +0 -120
- package/src/ui/docs/content/input-group.md +0 -78
- package/src/ui/docs/content/toggle-group.md +0 -81
package/src/ui/meta.ts
CHANGED
|
@@ -1,433 +1,425 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @softize/opus/ui/meta — o mapa CENTRAL de `meta` de todos os componentes.
|
|
3
3
|
*
|
|
4
|
-
* O componente portado é byte-fiel ao shadcn (sem `meta` co-localizado,
|
|
4
|
+
* O componente portado é byte-fiel ao shadcn (sem `meta` co-localizado, para re-sincronizar
|
|
5
5
|
* limpo); o metadado de descoberta (whenToUse/ancestry) mora AQUI, fora do arquivo. Quem
|
|
6
6
|
* precisa do meta em RUNTIME — a doc de UI (DocBrowser), o manifesto, ferramentas — importa
|
|
7
7
|
* este subpath explicitamente (`@softize/opus/ui/meta`); o barrel de runtime (react.tsx) não
|
|
8
8
|
* o re-exporta de propósito (metadado de build-time, fora do bundle dos apps).
|
|
9
9
|
*/
|
|
10
|
-
import type { ComponentMeta } from
|
|
10
|
+
import type { ComponentMeta } from "./index.ts";
|
|
11
11
|
|
|
12
12
|
/** Todos os metas, chaveados pelo nome canônico (kebab). Fonte única — zero duplicação. */
|
|
13
13
|
export const componentMeta = {
|
|
14
|
-
|
|
15
|
-
name:
|
|
16
|
-
ancestry:
|
|
14
|
+
content: {
|
|
15
|
+
name: "content",
|
|
16
|
+
ancestry: "opus",
|
|
17
17
|
whenToUse:
|
|
18
|
-
|
|
18
|
+
"Organize uma região nomeada dentro de uma página ou de outra superfície. Use as propriedades de Content no caso comum e componha seus slots quando precisar controlar a estrutura. Para o cabeçalho principal da tela, use Page.",
|
|
19
19
|
},
|
|
20
|
-
|
|
21
|
-
name:
|
|
22
|
-
ancestry:
|
|
20
|
+
ask: {
|
|
21
|
+
name: "ask",
|
|
22
|
+
ancestry: "opus",
|
|
23
23
|
whenToUse:
|
|
24
|
-
|
|
24
|
+
"Colete respostas para uma a quatro perguntas estruturadas, com opções de escolha única, múltipla ou texto livre. O consumidor controla as respostas e conecta o envio ao canal apropriado; Ask não faz transporte nem persistência.",
|
|
25
25
|
},
|
|
26
|
-
|
|
27
|
-
name:
|
|
28
|
-
ancestry:
|
|
26
|
+
alert: {
|
|
27
|
+
name: "alert",
|
|
28
|
+
ancestry: "opus",
|
|
29
29
|
whenToUse:
|
|
30
|
-
|
|
30
|
+
"Aviso inline no fluxo da página — `context` declara neutral/info/success/warning/danger e `variant` escolhe subtle/outline (ADR 0006). Forma curta: `<Alert title description icon context />`; para conteúdo rico, componha AlertMedia + AlertHeader (AlertTitle e AlertDescription) + AlertActions. A mídia mantém uma moldura tonal quadrada, mesmo com descrição multilinha. O texto comunica o significado sem depender só da cor. Para interromper cobrando decisão, use `dialog.confirm()`; para recado passageiro, `toast`.",
|
|
31
31
|
},
|
|
32
|
-
|
|
33
|
-
name:
|
|
34
|
-
ancestry:
|
|
32
|
+
badge: {
|
|
33
|
+
name: "badge",
|
|
34
|
+
ancestry: "shadcn",
|
|
35
35
|
whenToUse:
|
|
36
|
-
|
|
36
|
+
"Rótulo curto de status/categoria. `context` declara neutral/primary/info/success/warning/danger; `variant` escolhe solid/subtle/outline (ADR 0006). Não-interativo — para clique, use Button ou `asChild` em um <a>. Valor de dicionário com papel declarado usa DictionaryValue em vez de escolher contexto ou variante na tela.",
|
|
37
37
|
},
|
|
38
|
-
|
|
39
|
-
name:
|
|
40
|
-
ancestry:
|
|
38
|
+
"empty-value": {
|
|
39
|
+
name: "empty-value",
|
|
40
|
+
ancestry: "opus",
|
|
41
41
|
whenToUse:
|
|
42
|
-
|
|
42
|
+
"Mostre valores ausentes de forma consistente e acessível. O modo compacto usa um travessão visual e preserva “Não informado” para leitores de tela; `label` permite declarar uma ausência específica do domínio. Zero e falso continuam sendo valores.",
|
|
43
43
|
},
|
|
44
|
-
|
|
45
|
-
name:
|
|
46
|
-
ancestry:
|
|
44
|
+
"dictionary-value": {
|
|
45
|
+
name: "dictionary-value",
|
|
46
|
+
ancestry: "opus",
|
|
47
47
|
whenToUse:
|
|
48
|
-
|
|
48
|
+
"Apresente um valor de `t.dict` conforme a semântica declarada no próprio dicionário. Classificações, status, estágios e valores simples recebem tratamentos previsíveis sem inferências pelo nome; use as propriedades de apresentação apenas para exceções explícitas.",
|
|
49
49
|
},
|
|
50
|
-
|
|
51
|
-
name:
|
|
52
|
-
ancestry:
|
|
50
|
+
dot: {
|
|
51
|
+
name: "dot",
|
|
52
|
+
ancestry: "opus",
|
|
53
53
|
whenToUse:
|
|
54
|
-
|
|
54
|
+
"Sinal compacto de estado. `context` declara neutral/primary/info/success/warning/danger e `variant` escolhe solid/outline. Passe `label` quando a cor reforçar informação; sem label, o ponto é decorativo. Para texto visível, use Badge.",
|
|
55
55
|
},
|
|
56
|
-
|
|
57
|
-
name:
|
|
58
|
-
ancestry:
|
|
56
|
+
detail: {
|
|
57
|
+
name: "detail",
|
|
58
|
+
ancestry: "opus",
|
|
59
59
|
whenToUse:
|
|
60
|
-
'
|
|
60
|
+
'Dados somente leitura em pares chave/valor. Compõe DetailGroup > DetailField com semântica de lista de definições; `columns` controla a grade, `orientation` posiciona chave e valor e alinha uma coluna compartilhada de rótulos no modo horizontal, `variant="framed"` aplica moldura e `dividers` acrescenta somente as divisórias internas. Para entrada, validação e erro, use Field; para uma coleção pesquisável, use ActionList.',
|
|
61
61
|
},
|
|
62
|
-
|
|
63
|
-
name:
|
|
64
|
-
ancestry:
|
|
62
|
+
dock: {
|
|
63
|
+
name: "dock",
|
|
64
|
+
ancestry: "opus",
|
|
65
65
|
whenToUse:
|
|
66
|
-
|
|
66
|
+
"Ancore ferramentas a uma superfície de trabalho, como canvas, editor ou prévia. Agrupe ações relacionadas com DockGroup e mantenha o estado da superfície em SurfaceStatus. Para ações da página, use Page; para opções exclusivas, use ToggleGroup.",
|
|
67
67
|
},
|
|
68
|
-
|
|
69
|
-
name:
|
|
70
|
-
ancestry:
|
|
68
|
+
button: {
|
|
69
|
+
name: "button",
|
|
70
|
+
ancestry: "shadcn",
|
|
71
71
|
whenToUse:
|
|
72
|
-
|
|
72
|
+
"Inicie uma ação com um controle clicável. Use `context` para o significado, `variant` para o tratamento visual e `size` para a escala; `busy` comunica o andamento e impede um novo acionamento. Para ações relacionadas, use ButtonGroup.",
|
|
73
73
|
},
|
|
74
|
-
|
|
75
|
-
name:
|
|
76
|
-
ancestry:
|
|
74
|
+
card: {
|
|
75
|
+
name: "card",
|
|
76
|
+
ancestry: "shadcn",
|
|
77
77
|
whenToUse:
|
|
78
|
-
|
|
78
|
+
"Agrupe conteúdo relacionado em uma superfície delimitada. Use Card diretamente para um bloco simples ou componha cabeçalho, corpo e rodapé quando houver hierarquia e ações. CardContent permanece apenas como alias temporário de compatibilidade.",
|
|
79
79
|
},
|
|
80
|
-
|
|
81
|
-
name:
|
|
82
|
-
ancestry:
|
|
80
|
+
"metric-card": {
|
|
81
|
+
name: "metric-card",
|
|
82
|
+
ancestry: "opus",
|
|
83
83
|
whenToUse:
|
|
84
|
-
|
|
84
|
+
"Medida resumida com rótulo, valor em destaque e descrição opcional. `context` realça semanticamente somente o ícone; aceita ação relacionada e estado de carregamento. O consumidor calcula e formata o valor; para conteúdo geral ou estrutura livre, use Card.",
|
|
85
85
|
},
|
|
86
|
-
|
|
87
|
-
name:
|
|
88
|
-
ancestry:
|
|
86
|
+
chat: {
|
|
87
|
+
name: "chat",
|
|
88
|
+
ancestry: "opus",
|
|
89
89
|
whenToUse:
|
|
90
|
-
|
|
90
|
+
"Monte uma conversa completa com mensagens, composição, carregamento e rolagem automática. A propriedade `send` aceita resposta integral ou streaming de eventos; use Composer quando precisar apenas da entrada de texto. Defina uma altura para o contêiner.",
|
|
91
91
|
},
|
|
92
|
-
|
|
93
|
-
name:
|
|
94
|
-
ancestry:
|
|
92
|
+
checkbox: {
|
|
93
|
+
name: "checkbox",
|
|
94
|
+
ancestry: "shadcn",
|
|
95
95
|
whenToUse:
|
|
96
|
-
|
|
96
|
+
"Caixa de marcação booleana (Radix). Controlado por `checked`/`onCheckedChange`. Parear com Label. Para escolha única de várias opções, use Select/RadioGroup.",
|
|
97
97
|
},
|
|
98
|
-
|
|
99
|
-
name:
|
|
100
|
-
ancestry:
|
|
98
|
+
"icon-picker": {
|
|
99
|
+
name: "icon-picker",
|
|
100
|
+
ancestry: "opus",
|
|
101
101
|
whenToUse:
|
|
102
|
-
|
|
102
|
+
"Permita escolher um ícone por uma lista pesquisável. O valor é o nome do ícone em kebab-case; use a mesma paleta ao renderizá-lo e forneça `icons` quando o produto precisar de um vocabulário próprio.",
|
|
103
103
|
},
|
|
104
|
-
|
|
105
|
-
name:
|
|
106
|
-
ancestry:
|
|
104
|
+
command: {
|
|
105
|
+
name: "command",
|
|
106
|
+
ancestry: "shadcn",
|
|
107
107
|
whenToUse:
|
|
108
|
-
|
|
108
|
+
"Lista filtrável com teclado (cmdk) — base de command-palettes. Use CommandDialog para palette modal (⌘K). Para escolha simples, use o Select direto.",
|
|
109
109
|
},
|
|
110
|
-
|
|
111
|
-
name:
|
|
112
|
-
ancestry:
|
|
110
|
+
composer: {
|
|
111
|
+
name: "composer",
|
|
112
|
+
ancestry: "opus",
|
|
113
113
|
whenToUse:
|
|
114
|
-
|
|
114
|
+
"Receba texto para envio sem montar uma conversa completa. Enter envia, Shift+Enter quebra a linha e `actions` acrescenta uma faixa para seletores relacionados. O componente é controlado; use Chat quando também precisar de mensagens e estado da conversa.",
|
|
115
115
|
},
|
|
116
|
-
|
|
117
|
-
name:
|
|
118
|
-
ancestry:
|
|
116
|
+
"content-header": {
|
|
117
|
+
name: "content-header",
|
|
118
|
+
ancestry: "opus",
|
|
119
119
|
whenToUse:
|
|
120
|
-
|
|
120
|
+
"Estruture o cabeçalho de um Content com título, descrição, metadados e ações. No caso comum, declare esses valores diretamente em Content; componha ContentHeader apenas quando precisar controlar a anatomia.",
|
|
121
121
|
},
|
|
122
|
-
|
|
123
|
-
name:
|
|
124
|
-
ancestry:
|
|
122
|
+
copyable: {
|
|
123
|
+
name: "copyable",
|
|
124
|
+
ancestry: "opus",
|
|
125
125
|
whenToUse:
|
|
126
|
-
|
|
126
|
+
"Copie identificadores, tokens, slugs ou URLs com confirmação visual. Sem filhos, Copyable funciona como botão de ícone; com filhos, mantém um rótulo visível. Em ambientes sem acesso à área de transferência, a ação não produz efeito.",
|
|
127
127
|
},
|
|
128
|
-
|
|
129
|
-
name:
|
|
130
|
-
ancestry:
|
|
131
|
-
whenToUse: 'Rótulo acessível de um campo. `htmlFor` aponta pro id do controle. Parear com Input/Textarea/Select.',
|
|
132
|
-
},
|
|
133
|
-
'markdown': {
|
|
134
|
-
name: 'markdown',
|
|
135
|
-
ancestry: 'opus',
|
|
128
|
+
dialog: {
|
|
129
|
+
name: "dialog",
|
|
130
|
+
ancestry: "opus",
|
|
136
131
|
whenToUse:
|
|
137
|
-
|
|
132
|
+
"Abra conteúdo ou uma tarefa em uma janela modal com foco contido. Use o modo padrão quando a superfície puder ser dispensada e `mode=\"alert\"` quando exigir resposta explícita. Para o caso imperativo comum, use `dialog.alert`, `dialog.confirm`, `dialog.prompt` ou `dialog.choose`. Distribua conteúdo próprio entre cabeçalho, corpo rolável e rodapé de ações.",
|
|
138
133
|
},
|
|
139
|
-
|
|
140
|
-
name:
|
|
141
|
-
ancestry:
|
|
134
|
+
input: {
|
|
135
|
+
name: "input",
|
|
136
|
+
ancestry: "shadcn",
|
|
142
137
|
whenToUse:
|
|
143
|
-
|
|
138
|
+
"Receba texto em uma única linha com os atributos nativos de `input`. Use `icon` para identidade e `trailing` para uma ação no fim do campo; associe uma Label. Quando precisar combinar múltiplos adornos ou controles na mesma moldura, use InputGroup.",
|
|
144
139
|
},
|
|
145
|
-
|
|
146
|
-
name:
|
|
147
|
-
ancestry:
|
|
140
|
+
label: {
|
|
141
|
+
name: "label",
|
|
142
|
+
ancestry: "shadcn",
|
|
148
143
|
whenToUse:
|
|
149
|
-
|
|
144
|
+
"Rótulo acessível de um campo. `htmlFor` aponta para o id do controle. Parear com Input/Textarea/Select.",
|
|
150
145
|
},
|
|
151
|
-
|
|
152
|
-
name:
|
|
153
|
-
ancestry:
|
|
146
|
+
markdown: {
|
|
147
|
+
name: "markdown",
|
|
148
|
+
ancestry: "opus",
|
|
154
149
|
whenToUse:
|
|
155
|
-
|
|
156
|
-
},
|
|
157
|
-
'separator': {
|
|
158
|
-
name: 'separator',
|
|
159
|
-
ancestry: 'shadcn',
|
|
160
|
-
whenToUse: 'Linha divisória entre seções/itens (Radix). `orientation` horizontal|vertical. Decorativa por padrão (a11y).',
|
|
150
|
+
"Renderize Markdown como HTML semântico com a tipografia do tema. HTML recebido no texto é escapado, por isso o componente pode apresentar conteúdo de pessoas ou modelos com segurança. Para código com destaque e cópia, use CodeBlock.",
|
|
161
151
|
},
|
|
162
|
-
|
|
163
|
-
name:
|
|
164
|
-
ancestry:
|
|
165
|
-
whenToUse:
|
|
152
|
+
menu: {
|
|
153
|
+
name: "menu",
|
|
154
|
+
ancestry: "opus",
|
|
155
|
+
whenToUse:
|
|
156
|
+
'O menu de ações da casa: lista flutuante ancorada em um gatilho (Radix DropdownMenu). Compõe Menu > MenuTrigger + MenuContent e seus itens. `context="danger"` sinaliza item com consequência perigosa; `destructive` permanece alias de migração. Para escolher um valor, use Select; para busca por teclado, Command; para conteúdo livre ancorado, Popover.',
|
|
166
157
|
},
|
|
167
|
-
|
|
168
|
-
name:
|
|
169
|
-
ancestry:
|
|
170
|
-
whenToUse:
|
|
158
|
+
popover: {
|
|
159
|
+
name: "popover",
|
|
160
|
+
ancestry: "shadcn",
|
|
161
|
+
whenToUse:
|
|
162
|
+
"Painel flutuante ancorado em um gatilho, sem modal (Radix). Para conteúdo livre (form curto, detalhes). Use PopoverHeader/PopoverTitle/PopoverDescription para estruturar. Para lista de ações, use Menu; para modal, Dialog.",
|
|
171
163
|
},
|
|
172
|
-
|
|
173
|
-
name:
|
|
174
|
-
ancestry:
|
|
164
|
+
select: {
|
|
165
|
+
name: "select",
|
|
166
|
+
ancestry: "opus",
|
|
175
167
|
whenToUse:
|
|
176
|
-
|
|
168
|
+
"Ofereça escolhas a partir de uma lista declarada em `options`. Habilite pesquisa, seleção múltipla, busca remota ou controle nativo conforme a necessidade; use RadioGroup quando poucas opções precisarem permanecer visíveis.",
|
|
177
169
|
},
|
|
178
|
-
|
|
179
|
-
name:
|
|
180
|
-
ancestry:
|
|
170
|
+
separator: {
|
|
171
|
+
name: "separator",
|
|
172
|
+
ancestry: "shadcn",
|
|
181
173
|
whenToUse:
|
|
182
|
-
|
|
174
|
+
"Linha divisória entre seções/itens (Radix). `orientation` horizontal|vertical. Decorativa por padrão (a11y).",
|
|
183
175
|
},
|
|
184
|
-
|
|
185
|
-
name:
|
|
186
|
-
ancestry:
|
|
176
|
+
skeleton: {
|
|
177
|
+
name: "skeleton",
|
|
178
|
+
ancestry: "shadcn",
|
|
187
179
|
whenToUse:
|
|
188
|
-
|
|
180
|
+
"Reserve a forma aproximada do conteúdo enquanto ele carrega. Defina dimensões com `className`; para uma espera sem forma conhecida, use Spinner.",
|
|
189
181
|
},
|
|
190
|
-
|
|
191
|
-
name:
|
|
192
|
-
ancestry:
|
|
182
|
+
spinner: {
|
|
183
|
+
name: "spinner",
|
|
184
|
+
ancestry: "shadcn",
|
|
193
185
|
whenToUse:
|
|
194
|
-
|
|
186
|
+
"Indique uma espera sem progresso determinado, como uma ação ou consulta em andamento. Para reservar a forma do conteúdo, use Skeleton.",
|
|
195
187
|
},
|
|
196
|
-
|
|
197
|
-
name:
|
|
198
|
-
ancestry:
|
|
188
|
+
table: {
|
|
189
|
+
name: "table",
|
|
190
|
+
ancestry: "shadcn",
|
|
199
191
|
whenToUse:
|
|
200
|
-
'
|
|
192
|
+
'Tabela de dados. Compõe Table > (TableHeader > TableRow > TableHead, TableBody > TableRow > TableCell). `variant="plain"` vem sem borda externa; `variant="framed"` aplica a moldura canônica, recorta o scroll e destaca o cabeçalho. Para listagem tabular — para o pattern de search use ActionList.',
|
|
201
193
|
},
|
|
202
|
-
|
|
203
|
-
name:
|
|
204
|
-
ancestry:
|
|
194
|
+
tabs: {
|
|
195
|
+
name: "tabs",
|
|
196
|
+
ancestry: "shadcn",
|
|
205
197
|
whenToUse:
|
|
206
|
-
|
|
198
|
+
"Alterne entre painéis relacionados no mesmo nível de navegação. Cada TabsTrigger aponta para um TabsContent pelo mesmo `value`; TabsList controla o tratamento visual e Tabs define orientação e escala.",
|
|
207
199
|
},
|
|
208
|
-
|
|
209
|
-
name:
|
|
210
|
-
ancestry:
|
|
200
|
+
textarea: {
|
|
201
|
+
name: "textarea",
|
|
202
|
+
ancestry: "shadcn",
|
|
211
203
|
whenToUse:
|
|
212
|
-
|
|
204
|
+
"Campo de texto multilinha. Aceita os atributos nativos de <textarea> (rows, placeholder, disabled). Cresce com o conteúdo via `field-sizing-content`.",
|
|
213
205
|
},
|
|
214
|
-
|
|
215
|
-
name:
|
|
216
|
-
ancestry:
|
|
206
|
+
toast: {
|
|
207
|
+
name: "toast",
|
|
208
|
+
ancestry: "shadcn",
|
|
217
209
|
whenToUse:
|
|
218
|
-
|
|
210
|
+
"Comunique um resultado temporário sem interromper o fluxo. Monte Toaster uma vez na raiz e dispare a notificação pela API `toast`; ações seguem a ordem declarada e a última recebe destaque primário. Para uma mensagem persistente no contexto da página, use Alert.",
|
|
219
211
|
},
|
|
220
|
-
|
|
221
|
-
name:
|
|
222
|
-
ancestry:
|
|
212
|
+
tooltip: {
|
|
213
|
+
name: "tooltip",
|
|
214
|
+
ancestry: "shadcn",
|
|
223
215
|
whenToUse:
|
|
224
|
-
|
|
216
|
+
"Ofereça uma dica curta ao passar o ponteiro ou focar um elemento. Envolva a árvore em TooltipProvider e mantenha ações ou conteúdo essencial fora do tooltip.",
|
|
225
217
|
},
|
|
226
|
-
|
|
227
|
-
name:
|
|
228
|
-
ancestry:
|
|
218
|
+
truncate: {
|
|
219
|
+
name: "truncate",
|
|
220
|
+
ancestry: "opus",
|
|
229
221
|
whenToUse:
|
|
230
|
-
|
|
222
|
+
"Trunque uma linha de texto e mostre a dica somente quando houver transbordamento. Use `tooltip` para substituir o conteúdo da dica e `fade` para trocar as reticências por um esmaecimento. Requer TooltipProvider na raiz.",
|
|
231
223
|
},
|
|
232
|
-
|
|
233
|
-
name:
|
|
234
|
-
ancestry:
|
|
224
|
+
accordion: {
|
|
225
|
+
name: "accordion",
|
|
226
|
+
ancestry: "shadcn",
|
|
235
227
|
whenToUse:
|
|
236
|
-
|
|
228
|
+
"Lista de seções empilhadas que abrem/fecham (Radix). `type` single (um painel por vez — combine com `collapsible` para permitir fechar todos) ou multiple (vários abertos). Cada AccordionItem precisa de `value`; o chevron já vem no AccordionTrigger. Para alternar conteúdo lado a lado, use Tabs; para um único bloco recolhível solto, use Collapsible.",
|
|
237
229
|
},
|
|
238
|
-
|
|
239
|
-
name:
|
|
240
|
-
ancestry:
|
|
230
|
+
"aspect-ratio": {
|
|
231
|
+
name: "aspect-ratio",
|
|
232
|
+
ancestry: "shadcn",
|
|
241
233
|
whenToUse:
|
|
242
|
-
|
|
234
|
+
"Preserve a proporção de mídias, miniaturas e prévias enquanto a largura muda ou o conteúdo carrega. A largura vem do contêiner e `ratio` determina a altura; borda, arredondamento e recorte pertencem ao AspectRatio.",
|
|
243
235
|
},
|
|
244
|
-
|
|
245
|
-
name:
|
|
246
|
-
ancestry:
|
|
236
|
+
avatar: {
|
|
237
|
+
name: "avatar",
|
|
238
|
+
ancestry: "shadcn",
|
|
247
239
|
whenToUse:
|
|
248
|
-
|
|
240
|
+
"Represente uma pessoa ou agente por imagem, iniciais ou ícone de fallback. AvatarBadge acrescenta um estado no canto; AvatarGroup reúne participantes e AvatarGroupCount resume o excedente.",
|
|
249
241
|
},
|
|
250
|
-
|
|
251
|
-
name:
|
|
252
|
-
ancestry:
|
|
242
|
+
breadcrumb: {
|
|
243
|
+
name: "breadcrumb",
|
|
244
|
+
ancestry: "shadcn",
|
|
253
245
|
whenToUse:
|
|
254
|
-
|
|
246
|
+
"Trilha de navegação hierárquica (workspace → repositório → sessão): mostra onde o usuário está e o caminho de volta. `BreadcrumbLink` para os níveis navegáveis, `BreadcrumbPage` para o atual (não clicável), `BreadcrumbSeparator` entre eles e `BreadcrumbEllipsis` para colapsar trilhas longas. Para alternar painéis no mesmo nível, use Tabs.",
|
|
255
247
|
},
|
|
256
|
-
|
|
257
|
-
name:
|
|
258
|
-
ancestry:
|
|
248
|
+
calendar: {
|
|
249
|
+
name: "calendar",
|
|
250
|
+
ancestry: "shadcn",
|
|
259
251
|
whenToUse:
|
|
260
|
-
'
|
|
252
|
+
'Grade de datas (react-day-picker) para escolher um dia ou um intervalo. `mode` define a seleção (single/multiple/range) e o formato de `selected`/`onSelect` (Date, Date[] ou { from, to }). `captionLayout="dropdown"` troca o título do mês por seletores de mês/ano (pular para um período distante); `numberOfMonths` mostra meses lado a lado; `disabled` (Matcher) corta datas. Para exibir em um popover de campo, ancore no Popover.',
|
|
261
253
|
},
|
|
262
|
-
|
|
263
|
-
name:
|
|
264
|
-
ancestry:
|
|
254
|
+
carousel: {
|
|
255
|
+
name: "carousel",
|
|
256
|
+
ancestry: "shadcn",
|
|
265
257
|
whenToUse:
|
|
266
|
-
|
|
258
|
+
"Trilho de slides deslizáveis (embla). Compõe Carousel > CarouselContent > CarouselItem + CarouselPrevious/CarouselNext; o `basis` do item controla quantos cabem na vista. `orientation` (horizontal/vertical), `opts` repassa o embla (loop, align), `setApi` expõe a instância. Para lista paginada de dados, use Table; para navegação entre painéis, Tabs.",
|
|
267
259
|
},
|
|
268
|
-
|
|
269
|
-
name:
|
|
270
|
-
ancestry:
|
|
260
|
+
collapsible: {
|
|
261
|
+
name: "collapsible",
|
|
262
|
+
ancestry: "shadcn",
|
|
271
263
|
whenToUse:
|
|
272
|
-
|
|
264
|
+
"Seção que abre e fecha (Radix): um CollapsibleTrigger revela ou esconde o CollapsibleContent. Compõe Collapsible > (CollapsibleTrigger + CollapsibleContent) — o Trigger já é o `<button>`. `defaultOpen` para o modo não controlado; `open`/`onOpenChange` para o controlado (ex.: girar o chevron); `disabled` trava o gatilho. Para alternar entre vários painéis, use Tabs; para menu de ações ancorado, Menu.",
|
|
273
265
|
},
|
|
274
|
-
|
|
275
|
-
name:
|
|
276
|
-
ancestry:
|
|
266
|
+
drawer: {
|
|
267
|
+
name: "drawer",
|
|
268
|
+
ancestry: "opus",
|
|
277
269
|
whenToUse:
|
|
278
|
-
|
|
270
|
+
"Mostre detalhes ou edição a partir de uma borda da tela, sem trocar de página. Estruture cabeçalho, corpo e rodapé dentro de DrawerContent e escolha a borda com `side`. Para uma janela centralizada, use Dialog; para ações ancoradas, use Menu.",
|
|
279
271
|
},
|
|
280
|
-
|
|
281
|
-
name:
|
|
282
|
-
ancestry:
|
|
272
|
+
empty: {
|
|
273
|
+
name: "empty",
|
|
274
|
+
ancestry: "shadcn",
|
|
283
275
|
whenToUse:
|
|
284
|
-
|
|
276
|
+
"Apresente uma região disponível para receber ou criar conteúdo, com mensagem e ações de próximo passo. Para uma lista ou tabela sem registros, use DataState ou ActionList; para erro, use Alert.",
|
|
285
277
|
},
|
|
286
|
-
|
|
287
|
-
name:
|
|
288
|
-
ancestry:
|
|
278
|
+
field: {
|
|
279
|
+
name: "field",
|
|
280
|
+
ancestry: "shadcn",
|
|
289
281
|
whenToUse:
|
|
290
|
-
|
|
282
|
+
"Componha rótulo, controle, ajuda e erro com espaçamento consistente. Use a orientação vertical no caso comum e as orientações horizontal ou responsiva quando controle e texto precisarem ficar lado a lado. Field cuida do layout; o formulário continua responsável por estado e validação.",
|
|
291
283
|
},
|
|
292
|
-
|
|
293
|
-
name:
|
|
294
|
-
ancestry:
|
|
284
|
+
"input-otp": {
|
|
285
|
+
name: "input-otp",
|
|
286
|
+
ancestry: "shadcn",
|
|
295
287
|
whenToUse:
|
|
296
|
-
|
|
288
|
+
"Receba um código numérico dividido em posições, como uma confirmação de acesso ou segundo fator. InputOTP define o comprimento, os slots representam as posições e o separador organiza blocos. Para texto livre, use Input.",
|
|
297
289
|
},
|
|
298
|
-
|
|
299
|
-
name:
|
|
300
|
-
ancestry:
|
|
290
|
+
item: {
|
|
291
|
+
name: "item",
|
|
292
|
+
ancestry: "shadcn",
|
|
301
293
|
whenToUse:
|
|
302
|
-
|
|
294
|
+
"Monte uma linha de conteúdo com mídia, título, descrição, corpo e ações. Ícones e imagens mantêm uma moldura quadrada alinhada ao topo; ItemGroup organiza várias linhas e seus divisores. ItemContent permanece apenas como alias legado.",
|
|
303
295
|
},
|
|
304
|
-
|
|
305
|
-
name:
|
|
306
|
-
ancestry:
|
|
296
|
+
kbd: {
|
|
297
|
+
name: "kbd",
|
|
298
|
+
ancestry: "shadcn",
|
|
307
299
|
whenToUse:
|
|
308
|
-
|
|
300
|
+
"Apresente uma tecla ou combinação de teclas. KbdGroup reúne várias teclas e conectores, mas não registra o atalho; o consumidor continua responsável pelo evento de teclado.",
|
|
309
301
|
},
|
|
310
|
-
|
|
311
|
-
name:
|
|
312
|
-
ancestry:
|
|
302
|
+
pagination: {
|
|
303
|
+
name: "pagination",
|
|
304
|
+
ancestry: "shadcn",
|
|
313
305
|
whenToUse:
|
|
314
|
-
|
|
306
|
+
"Navegação entre páginas montada por composição: Pagination › PaginationContent › PaginationItem com PaginationLink, mais PaginationPrevious/PaginationNext e PaginationEllipsis. `page` dá o número e o nome acessível (“Página N”); `isActive` marca a atual. Com `href` o link é `<a>`; sem `href` vira `<button>` (modo controlado, com foco e `disabled`). Os números têm largura mínima quadrada e crescem com os dígitos; as setas seguem quadradas (`iconOnly`). `label` localiza as setas. É o único paginador: ActionList compõe esta primitiva na escala densa do rodapé. Para rolagem infinita ou listas curtas, dispense a barra.",
|
|
315
307
|
},
|
|
316
|
-
|
|
317
|
-
name:
|
|
318
|
-
ancestry:
|
|
308
|
+
progress: {
|
|
309
|
+
name: "progress",
|
|
310
|
+
ancestry: "shadcn",
|
|
319
311
|
whenToUse:
|
|
320
|
-
|
|
312
|
+
"Mostre o avanço conhecido de uma tarefa com um valor entre zero e cem. Para uma espera sem percentual, use Spinner; para reservar a forma do conteúdo, use Skeleton.",
|
|
321
313
|
},
|
|
322
|
-
|
|
323
|
-
name:
|
|
324
|
-
ancestry:
|
|
314
|
+
"radio-group": {
|
|
315
|
+
name: "radio-group",
|
|
316
|
+
ancestry: "shadcn",
|
|
325
317
|
whenToUse:
|
|
326
|
-
|
|
318
|
+
"Escolha única entre opções mutuamente exclusivas, todas visíveis ao mesmo tempo (Radix). Cada RadioGroupItem tem um `value`; o item escolhido vira o `value` do RadioGroup, controlado por `value`/`onValueChange` (ou `defaultValue` no modo não controlado). Pareie cada item com um Label. Para poucas opções que cabem na tela; com muitas, prefira Select; para ligar/desligar um único item, Checkbox ou Switch.",
|
|
327
319
|
},
|
|
328
|
-
|
|
329
|
-
name:
|
|
330
|
-
ancestry:
|
|
320
|
+
split: {
|
|
321
|
+
name: "split",
|
|
322
|
+
ancestry: "opus",
|
|
331
323
|
whenToUse:
|
|
332
|
-
|
|
324
|
+
"Divide uma área em panes em sequência horizontal ou vertical. Use `resizable` quando a pessoa deve ajustar a fronteira; o mesmo `<Split>` vira flex simples sem ele. Cada `<Pane>` declara tamanho inicial/mínimo e inset. É o mecanismo espacial para sidebar, conteúdo e rail.",
|
|
333
325
|
},
|
|
334
|
-
|
|
335
|
-
name:
|
|
336
|
-
ancestry:
|
|
326
|
+
sidebar: {
|
|
327
|
+
name: "sidebar",
|
|
328
|
+
ancestry: "opus",
|
|
337
329
|
whenToUse:
|
|
338
|
-
|
|
330
|
+
"Organize navegação global ou contextual em uma coluna lateral. Split e Pane definem posição e largura; Sidebar fornece a superfície e o colapso, enquanto PaneHeader, PaneBody e PaneFooter estruturam as regiões fixa e rolável. Use SidebarNav para grupos planos, componha árvores com SidebarItem e SidebarTreeGroup e use ShellNav quando a navegação precisar de cabeçalho e rodapé próprios.",
|
|
339
331
|
},
|
|
340
|
-
|
|
341
|
-
name:
|
|
342
|
-
ancestry:
|
|
332
|
+
"scroll-area": {
|
|
333
|
+
name: "scroll-area",
|
|
334
|
+
ancestry: "shadcn",
|
|
343
335
|
whenToUse:
|
|
344
|
-
'
|
|
336
|
+
'Região rolável com barra estilizada da casa (Radix), no lugar da scrollbar do sistema. Dê altura (ou largura) ao ScrollArea via className e ponha o conteúdo dentro; a barra vertical já vem por padrão. Para rolagem horizontal, acrescente `<ScrollBar orientation="horizontal" />` como filho. Para a página inteira rolar, deixe o navegador cuidar — isto é para um painel com altura fixa (lista de sessões, log, trilho de skills).',
|
|
345
337
|
},
|
|
346
|
-
|
|
347
|
-
name:
|
|
348
|
-
ancestry:
|
|
338
|
+
slider: {
|
|
339
|
+
name: "slider",
|
|
340
|
+
ancestry: "shadcn",
|
|
349
341
|
whenToUse:
|
|
350
|
-
|
|
342
|
+
"Controle de valor em uma faixa contínua, arrastado pelo thumb (Radix). `min`/`max`/`step` delimitam a faixa; `value`/`onValueChange` controlam (array de números — `[n]` para um thumb, `[a, b]` para um intervalo) ou `defaultValue` no modo não controlado. `orientation` horizontal/vertical, `disabled` esmaece. Para um número exato digitado, use Input type=number; para ligar/desligar, Switch.",
|
|
351
343
|
},
|
|
352
|
-
|
|
353
|
-
name:
|
|
354
|
-
ancestry:
|
|
344
|
+
switch: {
|
|
345
|
+
name: "switch",
|
|
346
|
+
ancestry: "shadcn",
|
|
355
347
|
whenToUse:
|
|
356
|
-
|
|
348
|
+
"Liga/desliga imediato de uma preferência booleana (Radix). Controlado por `checked`/`onCheckedChange` (boolean) e em par com Label. Use para estado que vale na hora (ativar agente, sincronizar); para confirmar dentro de um formulário, prefira Checkbox.",
|
|
357
349
|
},
|
|
358
|
-
|
|
359
|
-
name:
|
|
360
|
-
ancestry:
|
|
350
|
+
toggle: {
|
|
351
|
+
name: "toggle",
|
|
352
|
+
ancestry: "shadcn",
|
|
361
353
|
whenToUse:
|
|
362
|
-
|
|
354
|
+
"Alterne um estado diretamente no contexto atual. ToggleGroup reúne escolhas únicas ou múltiplas e compartilha aparência e escala entre os itens. Para um valor booleano com rótulo em formulário, prefira Switch ou Checkbox.",
|
|
363
355
|
},
|
|
364
356
|
|
|
365
|
-
|
|
366
|
-
name:
|
|
367
|
-
ancestry:
|
|
357
|
+
confirm: {
|
|
358
|
+
name: "dialog",
|
|
359
|
+
ancestry: "opus",
|
|
368
360
|
whenToUse:
|
|
369
|
-
|
|
361
|
+
"Solicite reconhecimento, confirmação ou uma resposta curta por uma API imperativa. Monte DialogHost uma vez no shell e use `dialog.alert`, `dialog.confirm` ou `dialog.prompt`; as solicitações são exibidas uma por vez. Para ações declaradas em contrato, prefira ActionTrigger; para formulários, use ActionFormDialog.",
|
|
370
362
|
},
|
|
371
|
-
|
|
372
|
-
name:
|
|
373
|
-
ancestry:
|
|
363
|
+
"action-form": {
|
|
364
|
+
name: "action-form",
|
|
365
|
+
ancestry: "opus",
|
|
374
366
|
whenToUse:
|
|
375
|
-
|
|
367
|
+
"Renderize e envie uma FormAction com validação, estado de envio e notificação consistentes. Sem filhos, os campos seguem o schema do contrato; com ActionFormField, o consumidor controla o layout sem duplicar rótulos ou erros. Para uma ação sem campos, use ActionTrigger.",
|
|
376
368
|
},
|
|
377
|
-
|
|
378
|
-
name:
|
|
379
|
-
ancestry:
|
|
369
|
+
"action-form-dialog": {
|
|
370
|
+
name: "action-form-dialog",
|
|
371
|
+
ancestry: "opus",
|
|
380
372
|
whenToUse:
|
|
381
|
-
|
|
373
|
+
"ActionForm dentro de um Dialog (form em modal) — controla open/onOpenChange + title; fecha no sucesso. Aceita children (modo composição) como o ActionForm. Para form inline em uma página, use ActionForm direto.",
|
|
382
374
|
},
|
|
383
|
-
|
|
384
|
-
name:
|
|
385
|
-
ancestry:
|
|
375
|
+
"action-form-card": {
|
|
376
|
+
name: "action-form-card",
|
|
377
|
+
ancestry: "opus",
|
|
386
378
|
whenToUse:
|
|
387
|
-
|
|
379
|
+
"Apresente uma FormAction como seção delimitada da página. ActionFormCard combina a estrutura do Card com o comportamento de ActionForm. Para um modal, use ActionFormDialog; sem superfície adicional, use ActionForm.",
|
|
388
380
|
},
|
|
389
|
-
|
|
390
|
-
name:
|
|
391
|
-
ancestry:
|
|
381
|
+
"action-list": {
|
|
382
|
+
name: "action-list",
|
|
383
|
+
ancestry: "opus",
|
|
392
384
|
whenToUse:
|
|
393
|
-
|
|
385
|
+
"Apresente uma coleção pesquisável a partir de uma ListAction. O contrato declara colunas, filtros, período e busca; ActionList coordena visualizações, paginação, seleção em lote e sincronização com a URL. Para um único recurso, use ActionView.",
|
|
394
386
|
},
|
|
395
|
-
|
|
396
|
-
name:
|
|
397
|
-
ancestry:
|
|
387
|
+
"action-trigger": {
|
|
388
|
+
name: "action-trigger",
|
|
389
|
+
ancestry: "opus",
|
|
398
390
|
whenToUse:
|
|
399
|
-
|
|
391
|
+
"Dispare uma SimpleAction sem campos com carregamento, notificação e confirmação consistentes. Declare confirmações destrutivas no contrato; sem essa declaração, a ação é executada diretamente. Para mutações com campos, use ActionForm.",
|
|
400
392
|
},
|
|
401
|
-
|
|
402
|
-
name:
|
|
403
|
-
ancestry:
|
|
393
|
+
"action-view": {
|
|
394
|
+
name: "action-view",
|
|
395
|
+
ancestry: "opus",
|
|
404
396
|
whenToUse:
|
|
405
|
-
|
|
397
|
+
"Carregue e apresente um recurso de uma ViewAction com estados de carregamento, erro e ausência consistentes. Os filhos definem o layout a partir dos dados e de `refetch`; para uma coleção, use ActionList.",
|
|
406
398
|
},
|
|
407
|
-
|
|
408
|
-
name:
|
|
409
|
-
ancestry:
|
|
399
|
+
page: {
|
|
400
|
+
name: "page",
|
|
401
|
+
ancestry: "opus",
|
|
410
402
|
whenToUse:
|
|
411
|
-
|
|
403
|
+
"O esqueleto de página do back-office: <main> + container centralizado com teto padrão de 80rem (`max-w-7xl`). O shorthand com title, description, count e actions cria a mesma anatomia de PageHeader(PageTitle/PageDescription/PageMeta/PageActions) + PageBody disponível na forma explícita. `className` substitui o teto quando a composição pede outra largura. Quando todo o body estiver carregando, falhar ou estiver vazio, use PageState. Para listagem em modal, ActionListDialog.",
|
|
412
404
|
},
|
|
413
|
-
|
|
414
|
-
name:
|
|
415
|
-
ancestry:
|
|
405
|
+
router: {
|
|
406
|
+
name: "router",
|
|
407
|
+
ancestry: "opus",
|
|
416
408
|
whenToUse:
|
|
417
|
-
|
|
409
|
+
"Sincronize navegação simples com a URL sem adicionar uma biblioteca de rotas. Os hooks leem caminho, segmentos e busca de forma reativa, enquanto `navigate` preserva links diretos, recarga e histórico. Para padrões de rota, parâmetros tipados ou carregamento por rota, use um roteador dedicado.",
|
|
418
410
|
},
|
|
419
|
-
|
|
420
|
-
name:
|
|
421
|
-
ancestry:
|
|
411
|
+
"data-state": {
|
|
412
|
+
name: "data-state",
|
|
413
|
+
ancestry: "opus",
|
|
422
414
|
whenToUse:
|
|
423
|
-
|
|
415
|
+
"Coordene carregamento, erro, vazio e conteúdo de uma consulta assíncrona. Use DataState dentro da estrutura que receberá os dados; para uma região disponível à criação, use Empty. Ações em andamento pertencem ao estado `busy` do controle que as iniciou.",
|
|
424
416
|
},
|
|
425
|
-
|
|
426
|
-
name:
|
|
427
|
-
ancestry:
|
|
417
|
+
"action-list-dialog": {
|
|
418
|
+
name: "action-list-dialog",
|
|
419
|
+
ancestry: "opus",
|
|
428
420
|
whenToUse:
|
|
429
|
-
|
|
421
|
+
"Apresente uma ListAction dentro de um modal com título, descrição, total e ação relacionada. Os filhos recebem itens e `refetch` para definir a composição da lista. Para uma coleção na página, use ActionList; para um formulário modal, use ActionFormDialog.",
|
|
430
422
|
},
|
|
431
|
-
} as const satisfies Record<string, ComponentMeta
|
|
423
|
+
} as const satisfies Record<string, ComponentMeta>;
|
|
432
424
|
|
|
433
|
-
export type ComponentMetaKey = keyof typeof componentMeta
|
|
425
|
+
export type ComponentMetaKey = keyof typeof componentMeta;
|