@softize/opus 21.0.1 → 22.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/bin/lib/check.mjs +31 -28
  3. package/docs/adr/0004-page-content-state-is-composed.md +3 -2
  4. package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +3 -0
  5. package/docs/adr/0006-semantic-context-precedes-visual-variant.md +23 -14
  6. package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +5 -0
  7. package/docs/adr/0013-presentation-is-a-portable-action-oriented-artifact.md +7 -4
  8. package/docs/adr/0016-list-collection-header-belongs-to-content.md +13 -8
  9. package/docs/adr/0023-surfaces-share-one-anatomy-and-two-layouts.md +27 -26
  10. package/docs/adr/0025-content-frame-treatment-does-not-change-semantics.md +1 -0
  11. package/docs/adr/0029-page-header-is-the-single-page-introduction.md +71 -0
  12. package/docs/adr/0030-framed-content-can-use-sectioned-anatomy.md +89 -0
  13. package/docs/adr/0031-detail-dividers-own-the-tabular-label-treatment.md +61 -0
  14. package/docs/adr/0032-tab-baseline-respects-the-container-inset.md +59 -0
  15. package/docs/adr/0033-drawer-uses-an-inset-structural-frame.md +72 -0
  16. package/docs/adr/0034-tabs-can-own-a-frame-without-owning-a-surface.md +60 -0
  17. package/docs/adr/0035-button-group-separates-frame-relationship-and-distribution.md +63 -0
  18. package/docs/adr/0036-tabs-declares-trigger-distribution.md +58 -0
  19. package/docs/radius-scale.md +5 -2
  20. package/package.json +1 -1
  21. package/registry/skills/build-opus-ui/SKILL.md +9 -6
  22. package/registry/skills/build-opus-ui/references/evaluations.md +5 -2
  23. package/registry/skills/build-opus-ui/references/ui-patterns.md +14 -16
  24. package/src/ui/components/patterns/content-header.tsx +51 -13
  25. package/src/ui/components/patterns/list.tsx +51 -33
  26. package/src/ui/components/patterns/page.tsx +139 -251
  27. package/src/ui/components/patterns/presentation.tsx +2 -6
  28. package/src/ui/components/primitives/button-group.tsx +80 -8
  29. package/src/ui/components/primitives/button.tsx +85 -60
  30. package/src/ui/components/primitives/detail.tsx +63 -57
  31. package/src/ui/components/primitives/dialog.tsx +8 -11
  32. package/src/ui/components/primitives/drawer.tsx +16 -12
  33. package/src/ui/components/primitives/tabs.tsx +123 -54
  34. package/src/ui/docs/content/button.md +55 -29
  35. package/src/ui/docs/content/content.md +61 -36
  36. package/src/ui/docs/content/detail.md +28 -19
  37. package/src/ui/docs/content/drawer.md +53 -47
  38. package/src/ui/docs/content/input.md +51 -35
  39. package/src/ui/docs/content/page.md +84 -95
  40. package/src/ui/docs/content/pane.md +83 -63
  41. package/src/ui/docs/content/presentation.md +20 -20
  42. package/src/ui/docs/content/tabs.md +107 -36
  43. package/src/ui/meta.ts +5 -5
  44. package/src/ui/react.tsx +0 -1
@@ -89,8 +89,8 @@ fundo sustenta o modal, mas não é uma etapa para onde voltar. Formulários mod
89
89
  rodapé pelo conteúdo, com `Cancelar` em `ghost` e a ação principal sólida.
90
90
 
91
91
  Dentro de [`PageShell`](/ui/page), a superfície `page` usa a anatomia real da aplicação. O
92
- `PageHeader` recebe só a navegação e as ações globais; o título abre o conteúdo em `PageIntro`, e o
93
- corpo vai para `PageBody`, com `PageFooter` quando há ações de rodapé.
92
+ `PageHeader` reúne a navegação contextual, o título e as ações globais; o corpo vai para `PageBody`,
93
+ com `PageFooter` quando há ações de rodapé.
94
94
 
95
95
  Uma Presentation de listagem exibida como página muda essa distribuição para manter a criação perto
96
96
  da coleção. O `PageBody` recebe um [`Content`](/ui/content) com a
@@ -186,7 +186,7 @@ lança um erro que nomeia a Presentation.
186
186
 
187
187
  Com `heading: "shell"`, o padrão, a casca emite o título da definição. Quando o conteúdo React já
188
188
  declara o heading principal da página, como um `Content level={1}`, use `heading: "content"`: dentro
189
- de `PageShell`, a casca deixa de emitir o `PageIntro` e o documento continua com um único `h1`. Em
189
+ de `PageShell`, a casca deixa de emitir o `PageHeader` com título e o documento continua com um único `h1`. Em
190
190
  Dialog e Drawer, o título continua no cabeçalho da superfície.
191
191
 
192
192
  Se o conteúdo precisa ocupar a altura da página e controlar a própria rolagem, como uma lista com
@@ -231,24 +231,24 @@ no manifest e concentre a inspeção na Lens em vez de criar um launcher flutuan
231
231
 
232
232
  ## Propriedades de Presentation
233
233
 
234
- | Propriedade | Tipo | Padrão | Descrição |
235
- | -------------------- | ------------------------------------------------ | ------ | --------------------------------------------------------------------------------------------------- |
236
- | `definition` | `PresentationDefinition` | | Artefato estático que descreve o recurso. |
237
- | `definitions` | `PresentationDefinition[]` | | Registry alcançável por navegação, abertura e retorno. |
238
- | `actions` | `PresentationActionRegistry` | | Contratos compartilháveis referenciados pelo artefato. |
239
- | `invocation` | `PresentationInvocation` | | Superfície, input e pilha da exibição atual. |
240
- | `bindingContext` | `PresentationBindingContext` | | Rota, item, seleção, sessão e resultado disponíveis. |
241
- | `assistant` | `PresentationAssistantRuntime` | | Painel contextual fornecido pela superfície hospedeira. |
242
- | `onInvocationChange` | `(next: PresentationInvocation \| null) => void` | | Recebe navegação, retorno e fechamento. |
243
- | `onRefresh` | `(action: string \| null) => void` | | Recebe invalidações declaradas após sucesso. |
244
- | `listState` | `ActionListState` | | Recorte controlado da action `list` do body, quando a aplicação o sincroniza com a URL. |
245
- | `onListStateChange` | `(state: ActionListState) => void` | | Recebe cada mudança de recorte ou exibição da lista do body, como busca, filtros, período e página. |
246
- | `open` | `boolean` | `true` | Estado controlado de Dialog ou Drawer. |
247
- | `onOpenChange` | `(open: boolean) => void` | | Notifica abertura e fechamento da superfície modal. |
248
- | `className` | `string` | | Classes adicionais da superfície. |
249
- | `bodyClassName` | `string` | | Classes adicionais do body, aplicadas uma única vez. |
234
+ | Propriedade | Tipo | Padrão | Descrição |
235
+ | -------------------- | ------------------------------------------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
236
+ | `definition` | `PresentationDefinition` | | Artefato estático que descreve o recurso. |
237
+ | `definitions` | `PresentationDefinition[]` | | Registry alcançável por navegação, abertura e retorno. |
238
+ | `actions` | `PresentationActionRegistry` | | Contratos compartilháveis referenciados pelo artefato. |
239
+ | `invocation` | `PresentationInvocation` | | Superfície, input e pilha da exibição atual. |
240
+ | `bindingContext` | `PresentationBindingContext` | | Rota, item, seleção, sessão e resultado disponíveis. |
241
+ | `assistant` | `PresentationAssistantRuntime` | | Painel contextual fornecido pela superfície hospedeira. |
242
+ | `onInvocationChange` | `(next: PresentationInvocation \| null) => void` | | Recebe navegação, retorno e fechamento. |
243
+ | `onRefresh` | `(action: string \| null) => void` | | Recebe invalidações declaradas após sucesso. |
244
+ | `listState` | `ActionListState` | | Recorte controlado da action `list` do body, quando a aplicação o sincroniza com a URL. |
245
+ | `onListStateChange` | `(state: ActionListState) => void` | | Recebe cada mudança de recorte ou exibição da lista do body, como busca, filtros, período e página. |
246
+ | `open` | `boolean` | `true` | Estado controlado de Dialog ou Drawer. |
247
+ | `onOpenChange` | `(open: boolean) => void` | | Notifica abertura e fechamento da superfície modal. |
248
+ | `className` | `string` | | Classes adicionais da superfície. |
249
+ | `bodyClassName` | `string` | | Classes adicionais do body, aplicadas uma única vez. |
250
250
  | `layout` | `'flow' \| 'fill'` | `'flow'` | Em `page`, `fill` limita a altura ao shell e entrega a rolagem ao conteúdo do body; a lista de um body `list` ocupa essa altura e rola só os resultados. Dialog e Drawer ignoram. |
251
- | `children` | `ReactNode` | | Conteúdo React do body declarado com `body.component`. Obrigatório nesse caso e recusado com `body.action`. |
251
+ | `children` | `ReactNode` | | Conteúdo React do body declarado com `body.component`. Obrigatório nesse caso e recusado com `body.action`. |
252
252
 
253
253
  ## Propriedades de PresentationInspector
254
254
 
@@ -10,32 +10,91 @@ mostrar somente o ícone, declare `aria-label` para preservar seu nome acessíve
10
10
  ```tsx preview col
11
11
  <Tabs defaultValue="sessions">
12
12
  <TabsList>
13
- <TabsTrigger value="overview" icon={<LayoutDashboard />}>Visão geral</TabsTrigger>
14
- <TabsTrigger value="sessions" icon={<History />}>Sessões</TabsTrigger>
15
- <TabsTrigger value="skills" icon={<Settings />}>Skills</TabsTrigger>
13
+ <TabsTrigger value="overview" icon={<LayoutDashboard />}>
14
+ Visão geral
15
+ </TabsTrigger>
16
+ <TabsTrigger value="sessions" icon={<History />}>
17
+ Sessões
18
+ </TabsTrigger>
19
+ <TabsTrigger value="skills" icon={<Settings />}>
20
+ Skills
21
+ </TabsTrigger>
16
22
  </TabsList>
17
23
  <TabsContent value="overview">
18
- <p className="text-sm text-muted-foreground">Resumo do workspace Empresa X.</p>
24
+ <p className="text-sm text-muted-foreground">
25
+ Resumo do workspace Empresa X.
26
+ </p>
19
27
  </TabsContent>
20
28
  <TabsContent value="sessions">
21
- <p className="text-sm text-muted-foreground">3 sessões nesta semana, 1 em andamento.</p>
29
+ <p className="text-sm text-muted-foreground">
30
+ 3 sessões nesta semana, 1 em andamento.
31
+ </p>
22
32
  </TabsContent>
23
33
  <TabsContent value="skills">
24
- <p className="text-sm text-muted-foreground">6 skills vinculadas aos agentes do workspace.</p>
34
+ <p className="text-sm text-muted-foreground">
35
+ 6 skills vinculadas aos agentes do workspace.
36
+ </p>
25
37
  </TabsContent>
26
38
  </Tabs>
27
39
  ```
28
40
 
41
+ ## Emoldurar abas e painéis
42
+
43
+ Use `framed` quando a navegação e seus painéis precisarem formar um único bloco. A propriedade
44
+ reúne borda, raio e recorte no próprio `Tabs`, mas não aplica fundo: o bloco herda a
45
+ superfície em que foi composto. Por isso, não envolva `Tabs` em um `Card` somente para obter essa
46
+ moldura.
47
+
48
+ ```tsx preview col
49
+ <Tabs defaultValue="overview" framed className="gap-0">
50
+ <TabsList variant="line" className="px-2 pt-2">
51
+ <TabsTrigger value="overview">Visão geral</TabsTrigger>
52
+ <TabsTrigger value="history">Histórico</TabsTrigger>
53
+ </TabsList>
54
+ <TabsContent value="overview" className="p-4">
55
+ <p className="text-sm text-muted-foreground">
56
+ Resumo do workspace Empresa X.
57
+ </p>
58
+ </TabsContent>
59
+ <TabsContent value="history" className="p-4">
60
+ <p className="text-sm text-muted-foreground">
61
+ Alterações recentes do workspace.
62
+ </p>
63
+ </TabsContent>
64
+ </Tabs>
65
+ ```
66
+
67
+ ## Distribuir as abas igualmente
68
+
69
+ Use `distribution="equal"` quando as seções tiverem o mesmo nível e precisarem repartir a largura
70
+ disponível. O valor padrão, `content`, mantém cada gatilho com a largura do próprio rótulo. A
71
+ área interativa e o fundo de hover ocupam toda a fração recebida pela aba. A distribuição não
72
+ altera os painéis associados.
73
+
74
+ ```tsx preview col
75
+ <Tabs defaultValue="overview" distribution="equal">
76
+ <TabsList variant="line">
77
+ <TabsTrigger value="overview">Visão geral</TabsTrigger>
78
+ <TabsTrigger value="contacts">Contatos</TabsTrigger>
79
+ <TabsTrigger value="history">Histórico</TabsTrigger>
80
+ </TabsList>
81
+ <TabsContent value="overview">Resumo do atendimento.</TabsContent>
82
+ <TabsContent value="contacts">Tentativas de contato.</TabsContent>
83
+ <TabsContent value="history">Alterações registradas.</TabsContent>
84
+ </Tabs>
85
+ ```
86
+
29
87
  ## Variante line
30
88
 
31
89
  Use `variant="line"` em `TabsList` quando a navegação precisar de uma linha-base, como em um
32
90
  cabeçalho. Na orientação horizontal, a lista ocupa toda a largura disponível e a aba ativa é
33
- marcada sobre essa linha, em vez de usar uma superfície preenchida. Dentro de `DrawerBody`, a
34
- linha atravessa o gutter até as bordas do drawer sem deslocar os rótulos. O mesmo comportamento
35
- vale para `DialogBody`.
36
- Os itens removem o padding horizontal, usam `0.75rem` de padding vertical e preservam `1.25rem`
37
- de espaço entre si. Nessa orientação, a altura é definida pelo conteúdo para que o padding
38
- vertical amplie a área interativa.
91
+ marcada sobre essa linha, em vez de usar uma superfície preenchida. A linha respeita o recuo do
92
+ contêiner; dentro de `DrawerBody` e `DialogBody`, ela acompanha o alinhamento do restante do corpo
93
+ sem alcançar as laterais da superfície.
94
+ Cada item contém uma área interativa com a mesma altura de um Button do tamanho correspondente. A
95
+ área permanece transparente e recebe fundo apenas no hover; a aba ativa é indicada pela linha
96
+ primária inferior. Um respiro de `0.375rem` separa o controle dessa linha; em `Tabs framed`, ele
97
+ aumenta para `0.5rem` e acompanha o padding superior da moldura.
39
98
 
40
99
  ```tsx preview col
41
100
  <Tabs defaultValue="agents">
@@ -45,10 +104,14 @@ vertical amplie a área interativa.
45
104
  <TabsTrigger value="settings">Configurações</TabsTrigger>
46
105
  </TabsList>
47
106
  <TabsContent value="agents">
48
- <p className="text-sm text-muted-foreground">developer, reviewer e designer ativos.</p>
107
+ <p className="text-sm text-muted-foreground">
108
+ developer, reviewer e designer ativos.
109
+ </p>
49
110
  </TabsContent>
50
111
  <TabsContent value="repos">
51
- <p className="text-sm text-muted-foreground">empresa-x-api e empresa-x-web vinculados.</p>
112
+ <p className="text-sm text-muted-foreground">
113
+ empresa-x-api e empresa-x-web vinculados.
114
+ </p>
52
115
  </TabsContent>
53
116
  <TabsContent value="settings">
54
117
  <p className="text-sm text-muted-foreground">Preferências do workspace.</p>
@@ -69,13 +132,19 @@ Com `orientation="vertical"`, a lista forma uma coluna. O exemplo usa a variante
69
132
  <TabsTrigger value="history">Histórico</TabsTrigger>
70
133
  </TabsList>
71
134
  <TabsContent value="prompt">
72
- <p className="text-sm text-muted-foreground">O prompt do agente developer.</p>
135
+ <p className="text-sm text-muted-foreground">
136
+ O prompt do agente developer.
137
+ </p>
73
138
  </TabsContent>
74
139
  <TabsContent value="skills">
75
- <p className="text-sm text-muted-foreground">Skills vinculadas a este agente.</p>
140
+ <p className="text-sm text-muted-foreground">
141
+ Skills vinculadas a este agente.
142
+ </p>
76
143
  </TabsContent>
77
144
  <TabsContent value="history">
78
- <p className="text-sm text-muted-foreground">Sessões anteriores deste agente.</p>
145
+ <p className="text-sm text-muted-foreground">
146
+ Sessões anteriores deste agente.
147
+ </p>
79
148
  </TabsContent>
80
149
  </Tabs>
81
150
  ```
@@ -98,31 +167,33 @@ mais alto que os elementos vizinhos.
98
167
 
99
168
  ## Propriedades de Tabs
100
169
 
101
- | Propriedade | Tipo | Padrão | Descrição |
102
- |---|---|---|---|
103
- | `defaultValue` | `string` | | Aba inicial no modo não controlado. |
104
- | `value` | `string` | | Aba ativa no modo controlado. Use com `onValueChange`. |
105
- | `onValueChange` | `(value: string) => void` | | Chamado quando a pessoa seleciona outra aba. |
106
- | `size` | `'default' \| 'sm'` | `'default'` | Altura da lista na escala única dos controles (2.25 e 2rem), aplicada em `TabsList`. Não altera a altura de `line` horizontal, que acompanha o conteúdo. |
107
- | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Direção da lista de abas. |
170
+ | Propriedade | Tipo | Padrão | Descrição |
171
+ | --------------- | ---------------------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
172
+ | `defaultValue` | `string` | | Aba inicial no modo não controlado. |
173
+ | `value` | `string` | | Aba ativa no modo controlado. Use com `onValueChange`. |
174
+ | `onValueChange` | `(value: string) => void` | | Chamado quando a pessoa seleciona outra aba. |
175
+ | `size` | `'default' \| 'sm'` | `'default'` | Altura da lista na escala única dos controles (2.25 e 2rem), aplicada em `TabsList`. Não altera a altura de `line` horizontal, que acompanha o conteúdo. |
176
+ | `distribution` | `'content' \| 'equal'` | `'content'` | Preserva a largura dos rótulos ou divide igualmente a largura disponível entre os gatilhos. |
177
+ | `framed` | `boolean` | `false` | Aplica borda, raio e recorte ao conjunto sem definir fundo ou foreground. |
178
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Direção da lista de abas. |
108
179
 
109
180
  ## Propriedades de TabsList
110
181
 
111
- | Propriedade | Tipo | Padrão | Descrição |
112
- |---|---|---|---|
113
- | `variant` | `'default' \| 'line'` | `'default'` | `default` usa uma superfície preenchida; `line` cria uma linha-base horizontal de largura total e marca nela a aba ativa. |
182
+ | Propriedade | Tipo | Padrão | Descrição |
183
+ | ----------- | --------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- |
184
+ | `variant` | `'default' \| 'line'` | `'default'` | `default` usa uma superfície preenchida; `line` cria uma linha-base horizontal de largura total e marca nela a aba ativa. |
114
185
 
115
186
  ## Propriedades de TabsTrigger
116
187
 
117
- | Propriedade | Tipo | Padrão | Descrição |
118
- |---|---|---|---|
119
- | `value` | `string` | | Identificador que associa o gatilho ao `TabsContent` correspondente. |
120
- | `icon` | `ReactNode` | | Ícone decorativo antes do rótulo, em `1rem`. Em uma aba sem texto, declare também `aria-label`. |
121
- | `disabled` | `boolean` | `false` | Impede a seleção da aba. |
188
+ | Propriedade | Tipo | Padrão | Descrição |
189
+ | ----------- | ----------- | ------- | ----------------------------------------------------------------------------------------------- |
190
+ | `value` | `string` | | Identificador que associa o gatilho ao `TabsContent` correspondente. |
191
+ | `icon` | `ReactNode` | | Ícone decorativo antes do rótulo, em `1rem`. Em uma aba sem texto, declare também `aria-label`. |
192
+ | `disabled` | `boolean` | `false` | Impede a seleção da aba. |
122
193
 
123
194
  ## Propriedades de TabsContent
124
195
 
125
- | Propriedade | Tipo | Padrão | Descrição |
126
- |---|---|---|---|
127
- | `value` | `string` | | Identificador do painel, igual ao `value` do `TabsTrigger` que o abre. |
128
- | `forceMount` | `true` | | Mantém o painel montado mesmo quando outra aba está ativa. |
196
+ | Propriedade | Tipo | Padrão | Descrição |
197
+ | ------------ | -------- | ------ | ---------------------------------------------------------------------- |
198
+ | `value` | `string` | | Identificador do painel, igual ao `value` do `TabsTrigger` que o abre. |
199
+ | `forceMount` | `true` | | Mantém o painel montado mesmo quando outra aba está ativa. |
package/src/ui/meta.ts CHANGED
@@ -63,7 +63,7 @@ export const componentMeta = {
63
63
  name: "detail",
64
64
  ancestry: "opus",
65
65
  whenToUse:
66
- 'Apresente dados somente leitura como pares de rótulo e valor. DetailGroup organiza os DetailField com a semântica de uma lista de definições; `columns` controla a grade, `orientation` posiciona rótulo e valor e, no modo horizontal, alinha os rótulos em uma coluna compartilhada. `variant="framed"` aplica a 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.',
66
+ 'Apresente dados somente leitura como pares de rótulo e valor. DetailGroup organiza os DetailField com a semântica de uma lista de definições; `columns` controla a grade e `orientation` posiciona rótulo e valor. Em orientação horizontal, `dividers` ativa o tratamento tabular completo: divisórias, padding por célula, fundo sutil e largura compartilhada dos rótulos. `variant="framed"` aplica somente a moldura externa. Para entrada, validação e erro, use Field; para uma coleção pesquisável, use ActionList.',
67
67
  },
68
68
  dock: {
69
69
  name: "dock",
@@ -75,7 +75,7 @@ export const componentMeta = {
75
75
  name: "button",
76
76
  ancestry: "shadcn",
77
77
  whenToUse:
78
- "Inicie uma ação com um controle clicável. Use `context` para o significado, `variant` para o tratamento visual e `size` para a escala compartilhada (`xs`…`lg` e os quadrados `icon-*`); `icon` recebe um nó e `busy` comunica o andamento e impede um novo acionamento. Para ações relacionadas, use ButtonGroup conectado ou espaçado.",
78
+ "Inicie uma ação com um controle clicável. Use `context` para o significado, `variant` para o tratamento visual e `size` para a escala compartilhada (`xs`…`lg` e os quadrados `icon-*`); `icon` recebe um nó e `busy` comunica o andamento e impede um novo acionamento. Para ações relacionadas, use ButtonGroup conectado, espaçado ou dividido.",
79
79
  },
80
80
  card: {
81
81
  name: "card",
@@ -123,7 +123,7 @@ export const componentMeta = {
123
123
  name: "content-header",
124
124
  ancestry: "opus",
125
125
  whenToUse:
126
- 'Estruture uma região com título e corpo. No caso comum, declare título, mídia, descrição, contador e ações diretamente em Content; use `framed` quando a região precisar de limite próprio, `frameVariant="legend"` para integrar visualmente o header à borda e `as="fieldset"` somente para agrupar campos sob uma legenda nativa. Componha ContentHeader apenas quando precisar controlar a anatomia.',
126
+ 'Estruture uma região com título e corpo. No caso comum, declare título, mídia, descrição, contador e ações diretamente em Content; use `framed` quando a região precisar de limite próprio, `layout="sectioned"` quando o filho controlar o recuo do body, `frameVariant="legend"` para integrar visualmente o header à borda e `as="fieldset"` somente para agrupar campos sob uma legenda nativa. Componha ContentHeader apenas quando precisar controlar a anatomia.',
127
127
  },
128
128
  copyable: {
129
129
  name: "copyable",
@@ -201,7 +201,7 @@ export const componentMeta = {
201
201
  name: "tabs",
202
202
  ancestry: "shadcn",
203
203
  whenToUse:
204
- "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.",
204
+ '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, escala, distribuição e moldura. Use `distribution="equal"` para repartir a largura entre seções equivalentes e `framed` para delimitar o conjunto sem criar uma nova superfície.',
205
205
  },
206
206
  textarea: {
207
207
  name: "textarea",
@@ -412,7 +412,7 @@ export const componentMeta = {
412
412
  name: "page",
413
413
  ancestry: "opus",
414
414
  whenToUse:
415
- "Estruture uma página com cabeçalho, introdução, estado e conteúdo na mesma anatomia. Page renderiza o `<main>` com um container centralizado de até 80rem (`max-w-7xl`); PageHeader declara navegação e ações globais, PageIntro é a introdução opcional e PageBody recebe o conteúdo. PageShell mantém a barra persistente de 3.75rem e projeta nela os slots do PageHeader. Uma região interna pode fornecer o heading principal com Content. PageActionsTarget fica restrito a workspaces imersivos sem PageShell. PageState substitui o conteúdo inteiro durante carregamento, falha ou ausência e oculta PageIntro, por isso informações indispensáveis entram no corpo, como Alert ou texto. Para uma falha parcial, mantenha o estado na seção com DataState; para uma região disponível à criação ou vínculo, use Empty.",
415
+ "Estruture uma página com cabeçalho, estado e conteúdo na mesma anatomia. Page renderiza o `<main>` com um container centralizado de até 80rem (`max-w-7xl`); PageHeader reúne navegação contextual opcional, título e ações, enquanto PageBody recebe o conteúdo. PageShell pode fornecer navegação e ações conhecidas pela aplicação sem criar uma barra visual. Uma região interna pode fornecer o heading principal com Content. PageActionsTarget fica restrito a workspaces imersivos. PageState substitui o header e o conteúdo durante carregamento, falha ou ausência, por isso informações indispensáveis entram no corpo, como Alert ou texto. Para uma falha parcial, mantenha o estado na seção com DataState; para uma região disponível para criação ou vínculo, use Empty.",
416
416
  },
417
417
  presentation: {
418
418
  name: "presentation",
package/src/ui/react.tsx CHANGED
@@ -460,7 +460,6 @@ export {
460
460
  PageShell,
461
461
  Page,
462
462
  PageHeader,
463
- PageIntro,
464
463
  PageNavigation,
465
464
  PageBack,
466
465
  PageTitle,