@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
@@ -1,31 +1,26 @@
1
1
  ## Esqueleto de página
2
2
 
3
- Use `Page` para manter chrome, introdução, estado e conteúdo na mesma anatomia. `PageHeader`
4
- declara navegação e ações globais; `PageIntro` apresenta um título introdutório quando ele for
5
- necessário. Quando a aplicação possui uma barra persistente, `PageShell` projeta os slots do
6
- `PageHeader` nessa barra.
7
-
8
- Fora do shell, `PageHeader` também pode receber `PageTitle`. O container é centralizado e ocupa a
9
- largura disponível até `80rem` (`max-w-7xl`). Use `className` somente quando a composição pedir
10
- outro teto ou largura total.
11
-
12
- A forma curta é o padrão para páginas comuns. Fora de `PageShell`, ela cria `PageHeader` e
13
- `PageBody`. Dentro dele, cria `PageHeader` para as ações, `PageIntro` para o título e `PageBody`.
14
- A forma explícita exige exatamente um heading principal. Use `PageTitle` no header ou intro,
15
- `Content level={1}` no body, ou deixe um `PageState` ativo assumir esse papel. Assim, header e
16
- introdução podem ser omitidos quando o próprio conteúdo nomeia a página. Contadores e outros
17
- indicadores pertencem ao conteúdo que os explica.
18
-
19
- A `Page` é contínua por definição: separar o chrome do conteúdo é trabalho do shell, e não há
20
- divisores entre regiões para declarar. O `layout` da `Page` não é a anatomia de superfície de
3
+ Use `Page` para manter cabeçalho, estado e conteúdo na mesma anatomia. `PageHeader` é a única
4
+ introdução estrutural: reúne navegação contextual opcional, título e ações. O container é
5
+ centralizado e ocupa a largura disponível até `80rem` (`max-w-7xl`). Use `className` somente quando
6
+ a composição pedir outro teto ou largura total.
7
+
8
+ A forma curta é o padrão para páginas comuns e cria `PageHeader` e `PageBody`. A forma explícita
9
+ exige exatamente um heading principal. Use `PageTitle` no header, `Content level={1}` no body, ou
10
+ deixe um `PageState` ativo assumir esse papel. O header pode ser omitido quando o próprio conteúdo
11
+ nomeia a página. Contadores e outros indicadores pertencem ao conteúdo que os explica.
12
+
13
+ A `Page` é contínua por definição e não há divisores entre suas regiões. O `layout` da `Page` não
14
+ é a anatomia de superfície de
21
15
  [`Card`](/ui/card), [`Dialog`](/ui/dialog), [`Drawer`](/ui/drawer) e [`Pane`](/ui/pane) — aqui ele
22
16
  decide a ocupação de altura. `flow`, o padrão, deixa a página crescer e a rolagem acontecer na
23
17
  janela; `fill` limita a página à altura do shell para que uma região interna, como uma tabela longa
24
18
  ou um split, assuma a rolagem.
25
19
 
26
20
  `PageShell` não inclui sidebar nem inventa breadcrumb. Ele ocupa o painel principal já delimitado e
27
- mantém a barra com `3.75rem`, mesmo quando o conteúdo muda de estado. Tabs ficam reservados a recortes
28
- da mesma superfície. Canvas e outros workspaces espaciais imersivos podem usar um shell próprio.
21
+ entrega ao `PageHeader` descendente a navegação e as ações conhecidas pela aplicação, sem criar uma
22
+ barra visual. Tabs ficam reservados a recortes da mesma superfície. Canvas e outros workspaces
23
+ espaciais imersivos podem usar um shell próprio.
29
24
 
30
25
  Estados integrais de carregamento, falha ou ausência são compostos no body com `PageState`,
31
26
  detalhado abaixo. `Page` não recebe flags de dados: uma página pode agregar fontes independentes e
@@ -49,8 +44,8 @@ render(
49
44
  ## Retorno para a página pai
50
45
 
51
46
  Use `PageBack` em uma subpágina simples. O destino é explícito para continuar correto após refresh ou
52
- acesso por link direto; não derive esse retorno do histórico do navegador. No header padrão, o
53
- controle aparece antes do título como ícone; o nome acessível e a dica nativa do navegador (atributo
47
+ acesso por link direto; não derive esse retorno do histórico do navegador. O controle aparece acima
48
+ da linha do título como ícone; o nome acessível e a dica nativa do navegador (atributo
54
49
  `title`) derivam do destino.
55
50
 
56
51
  ```tsx preview col
@@ -81,20 +76,17 @@ ocupa a mesma posição introdutória sem transformar a trilha em ação.
81
76
  </BreadcrumbList>
82
77
  </Breadcrumb>
83
78
  </PageNavigation>
84
- </PageHeader>
85
- <PageIntro>
86
79
  <PageTitle>Carla Souza</PageTitle>
87
- </PageIntro>
80
+ </PageHeader>
88
81
  <PageBody>Dados do cliente.</PageBody>
89
82
  </Page>
90
83
  ```
91
84
 
92
- ## Barra persistente do shell
85
+ ## Contexto conhecido pelo shell
93
86
 
94
87
  Use `PageShell` quando o shell conhece o breadcrumb e a rota conhece ações globais ou uma
95
- introdução. Não crie um `PaneHeader` paralelo nem esconda slots de `Page` com CSS. O Opus projeta
96
- `PageNavigation`, `PageBack` e `PageActions` do `PageHeader` na barra; `PageIntro` permanece no
97
- conteúdo.
88
+ introdução. Não crie um `PaneHeader` paralelo nem esconda slots de `Page` com CSS. O Opus compõe a
89
+ navegação e as ações do shell no `PageHeader` rolável da página ativa.
98
90
 
99
91
  ```tsx preview col
100
92
  <PageShell
@@ -114,11 +106,10 @@ conteúdo.
114
106
  </PageShell>
115
107
  ```
116
108
 
117
- A barra permanece visível durante `PageState`; uma introdução opcional desaparece. Se uma ação não
118
- puder ser executada sem o conteúdo, a própria rota deve omiti-la naquele estado.
109
+ Durante `PageState`, o cabeçalho inteiro desaparece e o título do estado assume o heading principal.
110
+ Se uma ação não puder ser executada sem o conteúdo, a própria rota deve omiti-la naquele estado.
119
111
 
120
- Na composição explícita, combine somente as regiões necessárias. Este exemplo usa o header para
121
- uma ação global e o intro para o título:
112
+ Na composição explícita, combine navegação, título e ações no mesmo header:
122
113
 
123
114
  ```tsx preview col
124
115
  <PageShell
@@ -134,13 +125,11 @@ uma ação global e o intro para o título:
134
125
  >
135
126
  <Page>
136
127
  <PageHeader>
128
+ <PageTitle>Clientes</PageTitle>
137
129
  <PageActions>
138
130
  <Button>Exportar</Button>
139
131
  </PageActions>
140
132
  </PageHeader>
141
- <PageIntro>
142
- <PageTitle>Clientes</PageTitle>
143
- </PageIntro>
144
133
  <PageBody>Conteúdo da listagem.</PageBody>
145
134
  </Page>
146
135
  </PageShell>
@@ -169,16 +158,15 @@ render(
169
158
  );
170
159
  ```
171
160
 
172
- Fora de `PageShell`, use `PageIntro` quando o conteúdo precisar de uma introdução separada do
173
- chrome. Dentro do shell, ele pode ser combinado com `PageHeader`: o primeiro permanece no conteúdo
174
- e o segundo alimenta a barra. Em uma página de listagem, [`Content`](/ui/content) pode fornecer o
175
- título e as ações da coleção, deixando `Page` apenas com `PageBody`.
161
+ Em uma página de listagem, [`Content`](/ui/content) pode fornecer o título e as ações da coleção,
162
+ deixando `Page` apenas com `PageBody`. Se `PageShell` fornecer navegação ou ações nesse caso, `Page`
163
+ materializa somente o `PageHeader` necessário para recebê-las, sem duplicar o heading de `Content`.
176
164
 
177
165
  ## Ações de etapa no rodapé
178
166
 
179
167
  Use `PageFooter` quando a página for uma etapa de um fluxo e a decisão precisar ficar ao alcance ao
180
- fim do conteúdo, como confirmar uma importação. O rodapé fica depois do body, com a mesma altura da
181
- barra e as ações alinhadas no fim da linha.
168
+ fim do conteúdo, como confirmar uma importação. O rodapé fica depois do body, com as ações alinhadas
169
+ no fim da linha.
182
170
 
183
171
  ```tsx preview col
184
172
  <Page>
@@ -210,7 +198,15 @@ render(
210
198
  <PageTitle>Ordens de serviço</PageTitle>
211
199
  </PageHeader>
212
200
  <PageBody className="min-h-0 flex-1 space-y-2 overflow-y-auto">
213
- {['OS-1842', 'OS-1839', 'OS-1835', 'OS-1830', 'OS-1827', 'OS-1821', 'OS-1818'].map((id) => (
201
+ {[
202
+ "OS-1842",
203
+ "OS-1839",
204
+ "OS-1835",
205
+ "OS-1830",
206
+ "OS-1827",
207
+ "OS-1821",
208
+ "OS-1818",
209
+ ].map((id) => (
214
210
  <div key={id} className="rounded-md border border-border p-3 text-sm">
215
211
  {id}
216
212
  </div>
@@ -227,30 +223,36 @@ sozinha: `PageBody`, `Content` e `ContentBody` passam a repassar a altura até e
227
223
  tabela fica fixo e só os resultados rolam. As demais seções do `PageBody` mantêm a altura do
228
224
  próprio conteúdo, e uma página `fill` sem lista não muda.
229
225
 
230
- ## Levar as ações para outra barra
226
+ ## Levar as ações para um hospedeiro próprio
231
227
 
232
- `PageShell` já projeta as ações na barra persistente. Use `PageActionsTarget` somente quando um
233
- hospedeiro próprio tiver outra barra para elas: as `PageActions` da árvore interna passam a ser
228
+ Use `PageActionsTarget` somente quando um hospedeiro próprio tiver uma região externa para elas: as
229
+ `PageActions` da árvore interna passam a ser
234
230
  renderizadas no elemento indicado em `target`. Enquanto `target` for `null`, fora de um shell, as
235
231
  ações continuam no cabeçalho da página.
236
232
 
237
233
  ```tsx preview col
238
234
  function Example() {
239
- const [target, setTarget] = useState<HTMLElement | null>(null)
235
+ const [target, setTarget] = useState<HTMLElement | null>(null);
240
236
 
241
237
  return (
242
238
  <div className="space-y-3">
243
- <div ref={setTarget} className="flex justify-end rounded-lg border border-border p-2" />
239
+ <div
240
+ ref={setTarget}
241
+ className="flex justify-end rounded-lg border border-border p-2"
242
+ />
244
243
  <PageActionsTarget target={target}>
245
- <Page title="Clientes" actions={<Button variant="outline">Exportar</Button>}>
244
+ <Page
245
+ title="Clientes"
246
+ actions={<Button variant="outline">Exportar</Button>}
247
+ >
246
248
  Conteúdo da listagem.
247
249
  </Page>
248
250
  </PageActionsTarget>
249
251
  </div>
250
- )
252
+ );
251
253
  }
252
254
 
253
- render(<Example />)
255
+ render(<Example />);
254
256
  ```
255
257
 
256
258
  ## Estados integrais
@@ -258,12 +260,11 @@ render(<Example />)
258
260
  Use `PageState` quando carregamento, falha ou ausência substituírem todo o conteúdo principal. Na
259
261
  forma curta ele pode ser escrito como filho direto de `Page`, que cria o `PageBody`; na forma
260
262
  explícita, coloque-o sozinho dentro de `PageBody`. Enquanto `status` for `loading`, `error` ou
261
- `empty`, uma `Page` isolada oculta o cabeçalho inteiro — incluindo `PageBack` — e o estado ocupa a
262
- altura disponível. Dentro de `PageShell`, a barra persistente permanece e somente `PageIntro` é
263
- ocultado. Uma subpágina isolada que dependa do retorno oferece a saída pelo `action` do próprio
264
- `PageState`. O título do estado assume o heading principal. Esse registro também funciona quando um
265
- componente intermediário decide qual `PageState` renderizar. Em `ready`, o cabeçalho ou a introdução
266
- e o conteúdo voltam à composição normal.
263
+ `empty`, `Page` oculta o cabeçalho inteiro — incluindo a navegação e as ações recebidas de
264
+ `PageShell` — e o estado ocupa a altura disponível. Uma subpágina que dependa do retorno oferece a
265
+ saída pelo `action` do próprio `PageState`. O título do estado assume o heading principal. Esse
266
+ registro também funciona quando um componente intermediário decide qual `PageState` renderizar. Em
267
+ `ready`, o cabeçalho e o conteúdo voltam à composição normal.
267
268
 
268
269
  ```tsx preview col
269
270
  <Page title="Relatório">
@@ -301,51 +302,39 @@ estado na própria seção com [`DataState`](/ui/data-state), [`ActionView`](/ui
301
302
 
302
303
  ## Propriedades de Page
303
304
 
304
- | Propriedade | Tipo | Padrão | Descrição |
305
- | ----------- | ----------- | ----------- | ----------------------------------------------------------------------------------------------- |
306
- | `title` | `ReactNode` | | O h1 da página. |
307
- | `actions` | `ReactNode` | | Ações contextuais no extremo oposto do cabeçalho. |
308
- | `layout` | `'flow' \| 'fill'` | `'flow'` | Ocupação de altura, não anatomia: `fill` limita a página ao shell para que uma região interna role e leva essa altura até uma `ActionList` composta em `PageBody`. |
309
- | `className` | `string` | `max-w-7xl` | Classes do container para substituir o teto padrão de `80rem`. |
310
- | `children` | `ReactNode` | | O body da página — espaçamento e diagramação são seus. |
311
- | demais | Atributos de `HTMLElement` | | Atributos nativos repassados ao elemento `main`, como `id` ou `aria-label`. `className` vai para o container interno. |
305
+ | Propriedade | Tipo | Padrão | Descrição |
306
+ | ----------- | -------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
307
+ | `title` | `ReactNode` | | O h1 da página. |
308
+ | `actions` | `ReactNode` | | Ações contextuais no extremo oposto do cabeçalho. |
309
+ | `layout` | `'flow' \| 'fill'` | `'flow'` | Ocupação de altura, não anatomia: `fill` limita a página ao shell para que uma região interna role e leva essa altura até uma `ActionList` composta em `PageBody`. |
310
+ | `className` | `string` | `max-w-7xl` | Classes do container para substituir o teto padrão de `80rem`. |
311
+ | `children` | `ReactNode` | | O body da página — espaçamento e diagramação são seus. |
312
+ | demais | Atributos de `HTMLElement` | | Atributos nativos repassados ao elemento `main`, como `id` ou `aria-label`. `className` vai para o container interno. |
312
313
 
313
314
  ## Propriedades de PageShell
314
315
 
315
- | Propriedade | Tipo | Descrição |
316
- | ----------------- | ----------------------------- | -------------------------------------------------------------------- |
317
- | `navigation` | `ReactNode` | Navegação contextual da barra, normalmente um `Breadcrumb`. |
318
- | `actions` | `ReactNode` | Ações conhecidas pelo shell, antes das ações declaradas pela `Page`. |
319
- | `children` | `ReactNode` | Rota que renderiza uma `Page` descendente. |
320
- | `headerClassName` | `string` | Classes adicionais do container interno da barra. |
321
- | `className` | `string` | Classes adicionais da moldura. |
322
- | demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à moldura. |
323
-
324
- ## Propriedades de PageIntro
325
-
326
- | Propriedade | Tipo | Descrição |
327
- | ----------- | ----------------------------- | --------------------------------------------------------------------- |
328
- | `children` | `ReactNode` | `PageBack` ou `PageNavigation`, título introdutório e, quando necessário, ações ligadas à introdução. |
329
- | `className` | `string` | Classes adicionais da região introdutória. |
330
- | demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à região introdutória. |
316
+ | Propriedade | Tipo | Descrição |
317
+ | ------------ | ----------------------------- | -------------------------------------------------------------------------- |
318
+ | `navigation` | `ReactNode` | Navegação contextual composta acima do título no `PageHeader` descendente. |
319
+ | `actions` | `ReactNode` | Ações conhecidas pelo shell, antes das ações declaradas pela `Page`. |
320
+ | `children` | `ReactNode` | Rota que renderiza uma `Page` descendente. |
321
+ | `className` | `string` | Classes adicionais da moldura. |
322
+ | demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à moldura. |
331
323
 
332
324
  ## Propriedades de PageHeader
333
325
 
334
- | Propriedade | Tipo | Descrição |
335
- | ----------- | ----------- | ---------------------------------------------------------------------------------------- |
336
- | `className` | `string` | Classes adicionais da região externa do cabeçalho, fora de `PageShell`. |
337
- | `children` | `ReactNode` | `PageBack` ou `PageNavigation`, `PageActions` e, fora do shell, um `PageTitle` opcional. |
338
- | demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à região externa do cabeçalho, fora de `PageShell`. |
339
-
340
- Dentro de `PageShell`, `PageHeader` não renderiza uma região própria: devolve somente os filhos,
341
- que o shell projeta na barra, e ignora `className` e os demais atributos.
326
+ | Propriedade | Tipo | Descrição |
327
+ | ----------- | ----------------------------- | ------------------------------------------------------------------------ |
328
+ | `className` | `string` | Classes adicionais do cabeçalho rolável. |
329
+ | `children` | `ReactNode` | `PageBack` ou `PageNavigation`, um `PageTitle` opcional e `PageActions`. |
330
+ | demais | Atributos de `HTMLDivElement` | Atributos nativos repassados ao cabeçalho. |
342
331
 
343
332
  ## Propriedades de PageBack
344
333
 
345
334
  | Propriedade | Tipo | Padrão | Descrição |
346
335
  | ------------ | -------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------ |
347
336
  | `href` | `string` | obrigatório | Destino explícito da página pai. Sem ele o retorno não é tabulável nem tem nome acessível. |
348
- | `children` | `ReactNode` | obrigatório | Nome do destino pai usado no rótulo acessível e na dica nativa (`title`). |
337
+ | `children` | `ReactNode` | obrigatório | Nome do destino pai usado no rótulo acessível e na dica nativa (`title`). |
349
338
  | `aria-label` | `string` | `Voltar para {children}` | Nome acessível; informe-o quando `children` não for texto simples. |
350
339
  | `onClick` | `MouseEventHandler<HTMLAnchorElement>` | | Integração opcional com o roteador do consumidor, junto do `href`, nunca no lugar dele. |
351
340
  | `className` | `string` | | Classes adicionais do link renderizado como botão `ghost`. |
@@ -360,11 +349,11 @@ que o shell projeta na barra, e ignora `className` e os demais atributos.
360
349
 
361
350
  ## Propriedades de PageTitle
362
351
 
363
- | Propriedade | Tipo | Descrição |
364
- | ----------- | --------------------------------- | ----------------------------------------------- |
365
- | `children` | `ReactNode` | Título principal `h1`, com a mesma escala em `PageHeader` e `PageIntro`. |
366
- | `className` | `string` | Classes adicionais do título. |
367
- | demais | Atributos de `HTMLHeadingElement` | Atributos nativos repassados ao heading. |
352
+ | Propriedade | Tipo | Descrição |
353
+ | ----------- | --------------------------------- | ---------------------------------------- |
354
+ | `children` | `ReactNode` | Título principal `h1` de `PageHeader`. |
355
+ | `className` | `string` | Classes adicionais do título. |
356
+ | demais | Atributos de `HTMLHeadingElement` | Atributos nativos repassados ao heading. |
368
357
 
369
358
  ## Propriedades de PageActions
370
359
 
@@ -45,11 +45,15 @@ render(
45
45
  </PaneHeader>
46
46
  <PaneBody className="space-y-1">
47
47
  <p className="text-sm">Revisão do contrato</p>
48
- <p className="text-sm text-muted-foreground">Importação de clientes</p>
48
+ <p className="text-sm text-muted-foreground">
49
+ Importação de clientes
50
+ </p>
49
51
  <p className="text-sm text-muted-foreground">Fila de execuções</p>
50
52
  </PaneBody>
51
53
  <PaneFooter>
52
- <Button variant="ghost" size="sm">Ver arquivadas</Button>
54
+ <Button variant="ghost" size="sm">
55
+ Ver arquivadas
56
+ </Button>
53
57
  </PaneFooter>
54
58
  </Pane>
55
59
  <Pane grow>
@@ -86,7 +90,11 @@ render(
86
90
  <Split>
87
91
  <Pane initialSize="18rem">
88
92
  <PaneHeader>
89
- <Input icon={<Search />} placeholder="Buscar conversa" aria-label="Buscar conversa" />
93
+ <Input
94
+ icon={<Search />}
95
+ placeholder="Buscar conversa"
96
+ aria-label="Buscar conversa"
97
+ />
90
98
  <PaneActions>
91
99
  <Button variant="ghost" size="icon-sm" aria-label="Nova conversa">
92
100
  <SquarePen />
@@ -95,7 +103,9 @@ render(
95
103
  </PaneHeader>
96
104
  <PaneBody className="space-y-1">
97
105
  <p className="text-sm">Revisão do contrato</p>
98
- <p className="text-sm text-muted-foreground">Importação de clientes</p>
106
+ <p className="text-sm text-muted-foreground">
107
+ Importação de clientes
108
+ </p>
99
109
  </PaneBody>
100
110
  </Pane>
101
111
  <Pane grow>
@@ -116,15 +126,15 @@ ao lado. Para algo antes do título, use `PaneMedia`; para algo ao lado, use `Pa
116
126
  `layout` declara a anatomia da superfície inteira e fica no root; os slots leem esse valor e não o
117
127
  recebem. Cada valor é um pacote de recuo, ritmo vertical e divisores.
118
128
 
119
- | Aspecto | `sectioned` (padrão) | `continuous` |
120
- | --- | --- | --- |
121
- | Divisores | entre as regiões vizinhas | nenhum |
122
- | Faixa do cabeçalho | altura fixa de `3.75rem` | acompanha o conteúdo |
123
- | Ritmo vertical | regiões simétricas | o cabeçalho se aproxima do corpo |
129
+ | Aspecto | `sectioned` (padrão) | `continuous` |
130
+ | ------------------ | ------------------------- | -------------------------------- |
131
+ | Divisores | entre as regiões vizinhas | nenhum |
132
+ | Faixa do cabeçalho | altura fixa de `3.75rem` | acompanha o conteúdo |
133
+ | Ritmo vertical | regiões simétricas | o cabeçalho se aproxima do corpo |
124
134
 
125
- O padrão `sectioned` é o pane de operação: a faixa do cabeçalho tem a mesma altura da barra do
126
- [`PageShell`](/ui/page), então uma navegação lateral e o chrome da página se alinham na mesma
127
- linha. Use `continuous` quando o pane for um bloco de leitura contínuo, sem fronteiras a marcar.
135
+ O padrão `sectioned` é o pane de operação: a faixa do cabeçalho preserva uma medida fixa para que
136
+ painéis irmãos mantenham o mesmo ritmo. Use `continuous` quando o pane for um bloco de leitura
137
+ contínuo, sem fronteiras a marcar.
128
138
 
129
139
  Os divisores são derivados da vizinhança: cada região desenha a linha quando há uma região do outro
130
140
  lado. Um cabeçalho sem corpo não fecha nada, e um cabeçalho seguido direto de um rodapé produz uma
@@ -165,10 +175,14 @@ render(
165
175
  </PaneActions>
166
176
  </PaneHeader>
167
177
  <PaneBody>
168
- <p className="text-sm text-muted-foreground">Cabeçalho, corpo e rodapé.</p>
178
+ <p className="text-sm text-muted-foreground">
179
+ Cabeçalho, corpo e rodapé.
180
+ </p>
169
181
  </PaneBody>
170
182
  <PaneFooter>
171
- <Button variant="ghost" size="sm">Configurações</Button>
183
+ <Button variant="ghost" size="sm">
184
+ Configurações
185
+ </Button>
172
186
  </PaneFooter>
173
187
  </Pane>
174
188
  </div>
@@ -182,14 +196,18 @@ render(
182
196
  <PaneDescription>O espaço separa as regiões.</PaneDescription>
183
197
  </PaneHeader>
184
198
  <PaneBody>
185
- <p className="text-sm text-muted-foreground">Sem rodapé e sem divisores.</p>
199
+ <p className="text-sm text-muted-foreground">
200
+ Sem rodapé e sem divisores.
201
+ </p>
186
202
  </PaneBody>
187
203
  </Pane>
188
204
  </div>
189
205
  <div className="h-56 overflow-hidden rounded-lg border border-border">
190
206
  <Pane className="h-full">
191
207
  <PaneBody>
192
- <p className="text-sm text-muted-foreground">Só corpo: nenhuma fronteira a marcar.</p>
208
+ <p className="text-sm text-muted-foreground">
209
+ Só corpo: nenhuma fronteira a marcar.
210
+ </p>
193
211
  </PaneBody>
194
212
  </Pane>
195
213
  </div>
@@ -202,7 +220,9 @@ render(
202
220
  <PaneTitle>Sem corpo</PaneTitle>
203
221
  </PaneHeader>
204
222
  <PaneFooter>
205
- <Button variant="ghost" size="sm">Ação persistente</Button>
223
+ <Button variant="ghost" size="sm">
224
+ Ação persistente
225
+ </Button>
206
226
  </PaneFooter>
207
227
  </Pane>
208
228
  </div>
@@ -215,11 +235,11 @@ render(
215
235
  Três componentes dividem a responsabilidade de uma coluna, e trocá-los de papel é a origem mais
216
236
  comum de layout duplicado:
217
237
 
218
- | Componente | Responsabilidade |
219
- | --- | --- |
220
- | [`Split`](/ui/split) | Relação espacial entre as áreas e, com `resizable`, o arraste da fronteira. |
221
- | `Pane` | Tamanho recebido, recuo e as regiões internas: cabeçalho, corpo e rodapé. |
222
- | [`Sidebar`](/ui/sidebar) | Superfície da navegação lateral e o estado de colapso dos destinos. |
238
+ | Componente | Responsabilidade |
239
+ | ------------------------ | --------------------------------------------------------------------------- |
240
+ | [`Split`](/ui/split) | Relação espacial entre as áreas e, com `resizable`, o arraste da fronteira. |
241
+ | `Pane` | Tamanho recebido, recuo e as regiões internas: cabeçalho, corpo e rodapé. |
242
+ | [`Sidebar`](/ui/sidebar) | Superfície da navegação lateral e o estado de colapso dos destinos. |
223
243
 
224
244
  Tamanho inicial, limites e persistência do layout são declarados no `Pane` e operados pelo `Split`
225
245
  — a [página do Split](/ui/split) trata deles. Uma `Sidebar` é composta dentro de um `Pane` e usa os
@@ -233,68 +253,68 @@ documento não muda a aparência da faixa.
233
253
 
234
254
  ## Propriedades de Pane
235
255
 
236
- | Propriedade | Tipo | Padrão | Descrição |
237
- |---|---|---|---|
238
- | `layout` | `'continuous' \| 'sectioned'` | `'sectioned'` | Anatomia da superfície inteira; os slots leem esse valor e não o recebem. |
239
- | `inset` | `'none' \| 'sm' \| 'md' \| 'lg'` | `'md'`, ou `'none'` com slots diretos | Respiro interno do pane sem slots; slots dentro de outro componente exigem declarar. |
240
- | `id` | `string` | | Identidade estável usada pelo layout redimensionável e persistido. |
241
- | `initialSize` | `number \| string` | | Tamanho inicial; número é porcentagem, string aceita `%`, `rem`, `em`, `vh`, `vw` e `px`. |
242
- | `minSize` / `maxSize` | `number \| string` | | Limites aplicados pelo `Split` quando ele é redimensionável. |
243
- | `grow` | `boolean` | `false` | Ocupa o espaço remanescente no layout simples. |
244
- | `className` | `string` | | Ajusta a coluna. |
245
- | `children` | `ReactNode` | | Conteúdo direto ou os slots estruturais. |
256
+ | Propriedade | Tipo | Padrão | Descrição |
257
+ | --------------------- | -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------------------------- |
258
+ | `layout` | `'continuous' \| 'sectioned'` | `'sectioned'` | Anatomia da superfície inteira; os slots leem esse valor e não o recebem. |
259
+ | `inset` | `'none' \| 'sm' \| 'md' \| 'lg'` | `'md'`, ou `'none'` com slots diretos | Respiro interno do pane sem slots; slots dentro de outro componente exigem declarar. |
260
+ | `id` | `string` | | Identidade estável usada pelo layout redimensionável e persistido. |
261
+ | `initialSize` | `number \| string` | | Tamanho inicial; número é porcentagem, string aceita `%`, `rem`, `em`, `vh`, `vw` e `px`. |
262
+ | `minSize` / `maxSize` | `number \| string` | | Limites aplicados pelo `Split` quando ele é redimensionável. |
263
+ | `grow` | `boolean` | `false` | Ocupa o espaço remanescente no layout simples. |
264
+ | `className` | `string` | | Ajusta a coluna. |
265
+ | `children` | `ReactNode` | | Conteúdo direto ou os slots estruturais. |
246
266
 
247
267
  ## Propriedades de PaneHeader
248
268
 
249
- | Propriedade | Tipo | Padrão | Descrição |
250
- |---|---|---|---|
251
- | `children` | `ReactNode` | | `PaneMedia`, `PaneTitle`, `PaneDescription` e `PaneActions`, no máximo um de cada, e conteúdo livre, que aparece depois do título e da descrição. |
252
- | `className` | `string` | | Ajusta a faixa fixa sobre o recuo do layout. |
269
+ | Propriedade | Tipo | Padrão | Descrição |
270
+ | ----------- | ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
271
+ | `children` | `ReactNode` | | `PaneMedia`, `PaneTitle`, `PaneDescription` e `PaneActions`, no máximo um de cada, e conteúdo livre, que aparece depois do título e da descrição. |
272
+ | `className` | `string` | | Ajusta a faixa fixa sobre o recuo do layout. |
253
273
 
254
274
  ## Propriedades de PaneMedia
255
275
 
256
- | Propriedade | Tipo | Padrão | Descrição |
257
- |---|---|---|---|
258
- | `size` | `'xs' \| 'sm' \| 'default' \| 'lg'` | `'xs'` | Tamanho da moldura e do glifo na escala compartilhada. |
259
- | `context` | `'neutral' \| 'primary' \| 'info' \| 'success' \| 'warning' \| 'danger'` | `'neutral'` | Declara o significado da cor. |
260
- | `variant` | `'subtle' \| 'outline'` | `'subtle'` | Usa preenchimento tonal ou acrescenta borda. |
261
- | `className` | `string` | | Ajusta a moldura sem substituir a escala. |
262
- | `asChild` | `boolean` | `false` | Cede o elemento para uma marca com visual próprio — um orbe, um logotipo — que ocupa o slot sem ganhar a moldura por cima. |
276
+ | Propriedade | Tipo | Padrão | Descrição |
277
+ | ----------- | ------------------------------------------------------------------------ | ----------- | -------------------------------------------------------------------------------------------------------------------------- |
278
+ | `size` | `'xs' \| 'sm' \| 'default' \| 'lg'` | `'xs'` | Tamanho da moldura e do glifo na escala compartilhada. |
279
+ | `context` | `'neutral' \| 'primary' \| 'info' \| 'success' \| 'warning' \| 'danger'` | `'neutral'` | Declara o significado da cor. |
280
+ | `variant` | `'subtle' \| 'outline'` | `'subtle'` | Usa preenchimento tonal ou acrescenta borda. |
281
+ | `className` | `string` | | Ajusta a moldura sem substituir a escala. |
282
+ | `asChild` | `boolean` | `false` | Cede o elemento para uma marca com visual próprio — um orbe, um logotipo — que ocupa o slot sem ganhar a moldura por cima. |
263
283
 
264
284
  ## Propriedades de PaneTitle
265
285
 
266
- | Propriedade | Tipo | Padrão | Descrição |
267
- |---|---|---|---|
268
- | `level` | `1 \| 2 \| 3 \| 4 \| 5 \| 6` | `2` | Hierarquia do documento. O tamanho vem do `layout`, nunca do nível. |
269
- | `className` | `string` | | Ajusta o título, que trunca quando não cabe. |
286
+ | Propriedade | Tipo | Padrão | Descrição |
287
+ | ----------- | ---------------------------- | ------ | ------------------------------------------------------------------- |
288
+ | `level` | `1 \| 2 \| 3 \| 4 \| 5 \| 6` | `2` | Hierarquia do documento. O tamanho vem do `layout`, nunca do nível. |
289
+ | `className` | `string` | | Ajusta o título, que trunca quando não cabe. |
270
290
 
271
291
  ## Propriedades de PaneDescription
272
292
 
273
- | Propriedade | Tipo | Padrão | Descrição |
274
- |---|---|---|---|
275
- | `children` | `ReactNode` | | Frase curta de apoio sob o título; trunca quando não cabe. |
276
- | `className` | `string` | | Ajusta a descrição. |
293
+ | Propriedade | Tipo | Padrão | Descrição |
294
+ | ----------- | ----------- | ------ | ---------------------------------------------------------- |
295
+ | `children` | `ReactNode` | | Frase curta de apoio sob o título; trunca quando não cabe. |
296
+ | `className` | `string` | | Ajusta a descrição. |
277
297
 
278
298
  ## Propriedades de PaneActions
279
299
 
280
- | Propriedade | Tipo | Padrão | Descrição |
281
- |---|---|---|---|
282
- | `children` | `ReactNode` | | Controles no extremo oposto ao título. |
283
- | `className` | `string` | | Ajusta o agrupamento das ações. |
300
+ | Propriedade | Tipo | Padrão | Descrição |
301
+ | ----------- | ----------- | ------ | -------------------------------------- |
302
+ | `children` | `ReactNode` | | Controles no extremo oposto ao título. |
303
+ | `className` | `string` | | Ajusta o agrupamento das ações. |
284
304
 
285
305
  ## Propriedades de PaneBody
286
306
 
287
- | Propriedade | Tipo | Padrão | Descrição |
288
- |---|---|---|---|
289
- | `children` | `ReactNode` | | Conteúdo que ocupa o espaço entre cabeçalho e rodapé. |
290
- | `className` | `string` | | Ajusta a região flexível e rolável. |
307
+ | Propriedade | Tipo | Padrão | Descrição |
308
+ | ----------- | ----------- | ------ | ----------------------------------------------------- |
309
+ | `children` | `ReactNode` | | Conteúdo que ocupa o espaço entre cabeçalho e rodapé. |
310
+ | `className` | `string` | | Ajusta a região flexível e rolável. |
291
311
 
292
312
  `PaneContent` continua exportado como alias depreciado de `PaneBody` e sai em uma próxima versão
293
313
  maior. Código novo usa `PaneBody`.
294
314
 
295
315
  ## Propriedades de PaneFooter
296
316
 
297
- | Propriedade | Tipo | Padrão | Descrição |
298
- |---|---|---|---|
299
- | `children` | `ReactNode` | | Navegação ou ações que precisam permanecer acessíveis no rodapé. |
300
- | `className` | `string` | | Ajusta a faixa fixa sobre o recuo do layout. |
317
+ | Propriedade | Tipo | Padrão | Descrição |
318
+ | ----------- | ----------- | ------ | ---------------------------------------------------------------- |
319
+ | `children` | `ReactNode` | | Navegação ou ações que precisam permanecer acessíveis no rodapé. |
320
+ | `className` | `string` | | Ajusta a faixa fixa sobre o recuo do layout. |