@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.
- package/CHANGELOG.md +47 -0
- package/bin/lib/check.mjs +31 -28
- package/docs/adr/0004-page-content-state-is-composed.md +3 -2
- package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +3 -0
- package/docs/adr/0006-semantic-context-precedes-visual-variant.md +23 -14
- package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +5 -0
- package/docs/adr/0013-presentation-is-a-portable-action-oriented-artifact.md +7 -4
- package/docs/adr/0016-list-collection-header-belongs-to-content.md +13 -8
- package/docs/adr/0023-surfaces-share-one-anatomy-and-two-layouts.md +27 -26
- package/docs/adr/0025-content-frame-treatment-does-not-change-semantics.md +1 -0
- package/docs/adr/0029-page-header-is-the-single-page-introduction.md +71 -0
- package/docs/adr/0030-framed-content-can-use-sectioned-anatomy.md +89 -0
- package/docs/adr/0031-detail-dividers-own-the-tabular-label-treatment.md +61 -0
- package/docs/adr/0032-tab-baseline-respects-the-container-inset.md +59 -0
- package/docs/adr/0033-drawer-uses-an-inset-structural-frame.md +72 -0
- package/docs/adr/0034-tabs-can-own-a-frame-without-owning-a-surface.md +60 -0
- package/docs/adr/0035-button-group-separates-frame-relationship-and-distribution.md +63 -0
- package/docs/adr/0036-tabs-declares-trigger-distribution.md +58 -0
- package/docs/radius-scale.md +5 -2
- package/package.json +1 -1
- package/registry/skills/build-opus-ui/SKILL.md +9 -6
- package/registry/skills/build-opus-ui/references/evaluations.md +5 -2
- package/registry/skills/build-opus-ui/references/ui-patterns.md +14 -16
- package/src/ui/components/patterns/content-header.tsx +51 -13
- package/src/ui/components/patterns/list.tsx +51 -33
- package/src/ui/components/patterns/page.tsx +139 -251
- package/src/ui/components/patterns/presentation.tsx +2 -6
- package/src/ui/components/primitives/button-group.tsx +80 -8
- package/src/ui/components/primitives/button.tsx +85 -60
- package/src/ui/components/primitives/detail.tsx +63 -57
- package/src/ui/components/primitives/dialog.tsx +8 -11
- package/src/ui/components/primitives/drawer.tsx +16 -12
- package/src/ui/components/primitives/tabs.tsx +123 -54
- package/src/ui/docs/content/button.md +55 -29
- package/src/ui/docs/content/content.md +61 -36
- package/src/ui/docs/content/detail.md +28 -19
- package/src/ui/docs/content/drawer.md +53 -47
- package/src/ui/docs/content/input.md +51 -35
- package/src/ui/docs/content/page.md +84 -95
- package/src/ui/docs/content/pane.md +83 -63
- package/src/ui/docs/content/presentation.md +20 -20
- package/src/ui/docs/content/tabs.md +107 -36
- package/src/ui/meta.ts +5 -5
- package/src/ui/react.tsx +0 -1
|
@@ -1,31 +1,26 @@
|
|
|
1
1
|
## Esqueleto de página
|
|
2
2
|
|
|
3
|
-
Use `Page` para manter
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
`
|
|
14
|
-
|
|
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
|
-
|
|
28
|
-
da mesma superfície. Canvas e outros workspaces
|
|
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.
|
|
53
|
-
|
|
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
|
-
</
|
|
80
|
+
</PageHeader>
|
|
88
81
|
<PageBody>Dados do cliente.</PageBody>
|
|
89
82
|
</Page>
|
|
90
83
|
```
|
|
91
84
|
|
|
92
|
-
##
|
|
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
|
|
96
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
|
181
|
-
|
|
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
|
-
{[
|
|
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
|
|
226
|
+
## Levar as ações para um hospedeiro próprio
|
|
231
227
|
|
|
232
|
-
`
|
|
233
|
-
|
|
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
|
|
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
|
|
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`,
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
|
305
|
-
| ----------- |
|
|
306
|
-
| `title` | `ReactNode`
|
|
307
|
-
| `actions` | `ReactNode`
|
|
308
|
-
| `layout` | `'flow' \| 'fill'`
|
|
309
|
-
| `className` | `string`
|
|
310
|
-
| `children` | `ReactNode`
|
|
311
|
-
| demais | Atributos de `HTMLElement` |
|
|
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
|
|
316
|
-
|
|
|
317
|
-
| `navigation`
|
|
318
|
-
| `actions`
|
|
319
|
-
| `children`
|
|
320
|
-
| `
|
|
321
|
-
|
|
|
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
|
|
335
|
-
| ----------- |
|
|
336
|
-
| `className` | `string`
|
|
337
|
-
| `children` | `ReactNode`
|
|
338
|
-
| demais | Atributos de `HTMLDivElement` | Atributos nativos repassados
|
|
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
|
|
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">
|
|
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">
|
|
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
|
|
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">
|
|
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
|
|
120
|
-
|
|
|
121
|
-
| Divisores
|
|
122
|
-
| Faixa do cabeçalho | altura fixa de `3.75rem`
|
|
123
|
-
| Ritmo vertical
|
|
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
|
|
126
|
-
|
|
127
|
-
|
|
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">
|
|
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">
|
|
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">
|
|
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">
|
|
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">
|
|
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
|
|
219
|
-
|
|
|
220
|
-
| [`Split`](/ui/split)
|
|
221
|
-
| `Pane`
|
|
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
|
|
237
|
-
|
|
238
|
-
| `layout`
|
|
239
|
-
| `inset`
|
|
240
|
-
| `id`
|
|
241
|
-
| `initialSize`
|
|
242
|
-
| `minSize` / `maxSize` | `number \| string`
|
|
243
|
-
| `grow`
|
|
244
|
-
| `className`
|
|
245
|
-
| `children`
|
|
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
|
|
250
|
-
|
|
251
|
-
| `children`
|
|
252
|
-
| `className` | `string`
|
|
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
|
|
257
|
-
|
|
258
|
-
| `size`
|
|
259
|
-
| `context`
|
|
260
|
-
| `variant`
|
|
261
|
-
| `className` | `string`
|
|
262
|
-
| `asChild`
|
|
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
|
|
267
|
-
|
|
268
|
-
| `level`
|
|
269
|
-
| `className` | `string`
|
|
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
|
|
274
|
-
|
|
275
|
-
| `children`
|
|
276
|
-
| `className` | `string`
|
|
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
|
|
281
|
-
|
|
282
|
-
| `children`
|
|
283
|
-
| `className` | `string`
|
|
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
|
|
288
|
-
|
|
289
|
-
| `children`
|
|
290
|
-
| `className` | `string`
|
|
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
|
|
298
|
-
|
|
299
|
-
| `children`
|
|
300
|
-
| `className` | `string`
|
|
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. |
|