@softize/opus 17.2.0 → 18.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 +55 -1
- package/bin/lib/check.mjs +212 -45
- package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +4 -0
- package/docs/adr/0013-presentation-is-a-portable-action-oriented-artifact.md +14 -2
- package/docs/adr/0016-list-collection-header-belongs-to-content.md +80 -0
- package/package.json +1 -1
- package/registry/skills/build-opus-ui/SKILL.md +30 -20
- package/registry/skills/build-opus-ui/references/evaluations.md +9 -3
- package/registry/skills/build-opus-ui/references/ui-patterns.md +29 -17
- package/src/core/presentation.ts +223 -24
- package/src/core/runtime.ts +3 -0
- package/src/core/types.ts +2 -0
- package/src/mcp/index.ts +1 -0
- package/src/ui/components/patterns/action-form-card.tsx +8 -1
- package/src/ui/components/patterns/confirm.tsx +194 -157
- package/src/ui/components/patterns/content-header.tsx +17 -2
- package/src/ui/components/patterns/form-dialog.tsx +28 -14
- package/src/ui/components/patterns/form.tsx +340 -222
- package/src/ui/components/patterns/list.tsx +43 -44
- package/src/ui/components/patterns/page-heading-context.tsx +34 -0
- package/src/ui/components/patterns/page-state.tsx +2 -0
- package/src/ui/components/patterns/page.tsx +164 -50
- package/src/ui/components/patterns/presentation.tsx +140 -84
- package/src/ui/components/patterns/surface-header.tsx +5 -6
- package/src/ui/components/patterns/trigger.tsx +112 -82
- package/src/ui/components/primitives/button.tsx +2 -2
- package/src/ui/components/primitives/chat.tsx +19 -5
- package/src/ui/components/primitives/control.ts +9 -3
- package/src/ui/components/primitives/dialog.tsx +16 -9
- package/src/ui/components/primitives/drawer.tsx +9 -6
- package/src/ui/docs/content/action-form-card.md +9 -8
- package/src/ui/docs/content/action-form-dialog.md +11 -12
- package/src/ui/docs/content/action-form.md +25 -25
- package/src/ui/docs/content/action-list.md +101 -70
- package/src/ui/docs/content/chat.md +4 -4
- package/src/ui/docs/content/content.md +29 -13
- package/src/ui/docs/content/dialog.md +27 -21
- package/src/ui/docs/content/drawer.md +8 -6
- package/src/ui/docs/content/page.md +43 -50
- package/src/ui/docs/content/presentation.md +39 -28
- package/src/ui/docs/doc-client.tsx +1 -1
- package/src/ui/meta.ts +4 -4
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
## Esqueleto de página
|
|
2
2
|
|
|
3
|
-
Use `Page` para manter
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
7
|
|
|
8
|
-
|
|
8
|
+
Fora do shell, `PageHeader` também pode receber `PageTitle`. O container é centralizado e ocupa a
|
|
9
9
|
largura disponível até `80rem` (`max-w-7xl`). Use `className` somente quando a composição pedir
|
|
10
10
|
outro teto ou largura total.
|
|
11
11
|
|
|
12
12
|
A forma curta é o padrão para páginas comuns. Fora de `PageShell`, ela cria `PageHeader` e
|
|
13
|
-
`PageBody`. Dentro dele, cria `
|
|
14
|
-
|
|
15
|
-
|
|
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.
|
|
16
17
|
Contadores e outros indicadores pertencem ao
|
|
17
18
|
conteúdo que os explica.
|
|
18
19
|
|
|
19
20
|
`PageShell` não inclui sidebar nem inventa breadcrumb. Ele ocupa o painel principal já delimitado e
|
|
20
|
-
mantém a barra com `
|
|
21
|
+
mantém a barra com `3.75rem`, mesmo quando o conteúdo muda de estado. Tabs ficam reservados a recortes
|
|
21
22
|
da mesma superfície. Canvas e outros workspaces espaciais imersivos podem usar um shell próprio.
|
|
22
23
|
|
|
23
24
|
Estados integrais de carregamento, falha ou ausência são compostos no body com `PageState`,
|
|
@@ -29,11 +30,7 @@ render(
|
|
|
29
30
|
<div className="w-full overflow-hidden rounded-lg border border-border">
|
|
30
31
|
<Page
|
|
31
32
|
title="Workspaces"
|
|
32
|
-
actions={
|
|
33
|
-
<Button>
|
|
34
|
-
<Plus /> Novo workspace
|
|
35
|
-
</Button>
|
|
36
|
-
}
|
|
33
|
+
actions={<Button variant="outline">Exportar</Button>}
|
|
37
34
|
>
|
|
38
35
|
<div className="rounded-lg border border-dashed border-border p-10 text-center text-sm text-muted-foreground">
|
|
39
36
|
O conteúdo da página (tabela, cards, grid…).
|
|
@@ -65,9 +62,10 @@ posição introdutória sem transformar a trilha em ação.
|
|
|
65
62
|
|
|
66
63
|
## Barra persistente do shell
|
|
67
64
|
|
|
68
|
-
Use `PageShell` quando o shell conhece o breadcrumb e a rota conhece
|
|
69
|
-
`PaneHeader` paralelo nem esconda slots de `Page` com CSS. O Opus
|
|
70
|
-
|
|
65
|
+
Use `PageShell` quando o shell conhece o breadcrumb e a rota conhece ações globais ou uma
|
|
66
|
+
introdução. Não crie um `PaneHeader` paralelo nem esconda slots de `Page` com CSS. O Opus projeta
|
|
67
|
+
`PageNavigation`, `PageBack` e `PageActions` do `PageHeader` na barra; `PageIntro` permanece no
|
|
68
|
+
conteúdo.
|
|
71
69
|
|
|
72
70
|
```tsx preview col
|
|
73
71
|
<PageShell
|
|
@@ -81,14 +79,7 @@ conteúdo e projeta somente navegação contextual e `PageActions` na barra.
|
|
|
81
79
|
</Breadcrumb>
|
|
82
80
|
}
|
|
83
81
|
>
|
|
84
|
-
<Page
|
|
85
|
-
title="Clientes"
|
|
86
|
-
actions={
|
|
87
|
-
<Button>
|
|
88
|
-
<Plus /> Novo cliente
|
|
89
|
-
</Button>
|
|
90
|
-
}
|
|
91
|
-
>
|
|
82
|
+
<Page title="Clientes" actions={<Button variant="outline">Exportar</Button>}>
|
|
92
83
|
Conteúdo da listagem.
|
|
93
84
|
</Page>
|
|
94
85
|
</PageShell>
|
|
@@ -97,16 +88,19 @@ conteúdo e projeta somente navegação contextual e `PageActions` na barra.
|
|
|
97
88
|
A barra permanece visível durante `PageState`; uma introdução opcional desaparece. Se uma ação não
|
|
98
89
|
puder ser executada sem o conteúdo, a própria rota deve omiti-la naquele estado.
|
|
99
90
|
|
|
100
|
-
Na composição explícita
|
|
91
|
+
Na composição explícita, combine somente as regiões necessárias. Este exemplo usa o header para
|
|
92
|
+
uma ação global e o intro para o título:
|
|
101
93
|
|
|
102
94
|
```tsx preview col
|
|
103
95
|
<PageShell navigation={<Breadcrumb>...</Breadcrumb>}>
|
|
104
96
|
<Page>
|
|
105
|
-
<
|
|
106
|
-
<PageTitle>Clientes</PageTitle>
|
|
97
|
+
<PageHeader>
|
|
107
98
|
<PageActions>
|
|
108
|
-
<Button>
|
|
99
|
+
<Button>Exportar</Button>
|
|
109
100
|
</PageActions>
|
|
101
|
+
</PageHeader>
|
|
102
|
+
<PageIntro>
|
|
103
|
+
<PageTitle>Clientes</PageTitle>
|
|
110
104
|
</PageIntro>
|
|
111
105
|
<PageBody>Conteúdo da listagem.</PageBody>
|
|
112
106
|
</Page>
|
|
@@ -124,9 +118,7 @@ render(
|
|
|
124
118
|
<PageHeader>
|
|
125
119
|
<PageTitle>Workspaces</PageTitle>
|
|
126
120
|
<PageActions>
|
|
127
|
-
<Button>
|
|
128
|
-
<Plus /> Novo workspace
|
|
129
|
-
</Button>
|
|
121
|
+
<Button variant="outline">Exportar</Button>
|
|
130
122
|
</PageActions>
|
|
131
123
|
</PageHeader>
|
|
132
124
|
<PageBody>
|
|
@@ -138,9 +130,10 @@ render(
|
|
|
138
130
|
);
|
|
139
131
|
```
|
|
140
132
|
|
|
141
|
-
Fora de `PageShell`, use `PageIntro`
|
|
142
|
-
|
|
143
|
-
|
|
133
|
+
Fora de `PageShell`, use `PageIntro` quando o conteúdo precisar de uma introdução separada do
|
|
134
|
+
chrome. Dentro do shell, ele pode ser combinado com `PageHeader`: o primeiro permanece no conteúdo
|
|
135
|
+
e o segundo alimenta a barra. Em uma página de listagem, `Content` pode fornecer o título e as ações
|
|
136
|
+
da coleção, deixando `Page` apenas com `PageBody`.
|
|
144
137
|
|
|
145
138
|
## Estados integrais
|
|
146
139
|
|
|
@@ -189,12 +182,12 @@ estado na própria seção com `DataState`, `ActionView`, `ActionList` ou `Alert
|
|
|
189
182
|
|
|
190
183
|
## Propriedades de Page
|
|
191
184
|
|
|
192
|
-
| Propriedade
|
|
193
|
-
|
|
|
194
|
-
| `title`
|
|
195
|
-
| `actions`
|
|
196
|
-
| `className`
|
|
197
|
-
| `children`
|
|
185
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
186
|
+
| ----------- | ----------- | ----------- | ----------------------------------------------------------------------------------------------- |
|
|
187
|
+
| `title` | `ReactNode` | | O h1 da página. |
|
|
188
|
+
| `actions` | `ReactNode` | | Ações contextuais no extremo oposto do cabeçalho; em telas estreitas, ficam abaixo do contexto. |
|
|
189
|
+
| `className` | `string` | `max-w-7xl` | Classes do container para substituir o teto padrão de `80rem`. |
|
|
190
|
+
| `children` | `ReactNode` | | O body da página — espaçamento e diagramação são seus. |
|
|
198
191
|
|
|
199
192
|
## Propriedades de PageShell
|
|
200
193
|
|
|
@@ -209,18 +202,18 @@ estado na própria seção com `DataState`, `ActionView`, `ActionList` ou `Alert
|
|
|
209
202
|
|
|
210
203
|
## Propriedades de PageIntro
|
|
211
204
|
|
|
212
|
-
| Propriedade | Tipo | Descrição
|
|
213
|
-
| ----------- | ----------------------------- |
|
|
214
|
-
| `children` | `ReactNode` | Título e
|
|
215
|
-
| `className` | `string` | Classes adicionais da região introdutória.
|
|
216
|
-
| demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à região introdutória.
|
|
205
|
+
| Propriedade | Tipo | Descrição |
|
|
206
|
+
| ----------- | ----------------------------- | --------------------------------------------------------------------- |
|
|
207
|
+
| `children` | `ReactNode` | Título introdutório e, quando necessário, ações ligadas à introdução. |
|
|
208
|
+
| `className` | `string` | Classes adicionais da região introdutória. |
|
|
209
|
+
| demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à região introdutória. |
|
|
217
210
|
|
|
218
211
|
## Propriedades de PageHeader
|
|
219
212
|
|
|
220
|
-
| Propriedade | Tipo | Descrição
|
|
221
|
-
| ----------- | ----------- |
|
|
222
|
-
| `className` | `string` | Classes adicionais da região externa do cabeçalho.
|
|
223
|
-
| `children` | `ReactNode` |
|
|
213
|
+
| Propriedade | Tipo | Descrição |
|
|
214
|
+
| ----------- | ----------- | ---------------------------------------------------------------------------------------- |
|
|
215
|
+
| `className` | `string` | Classes adicionais da região externa do cabeçalho. |
|
|
216
|
+
| `children` | `ReactNode` | `PageBack` ou `PageNavigation`, `PageActions` e, fora do shell, um `PageTitle` opcional. |
|
|
224
217
|
|
|
225
218
|
## Propriedades de PageBack
|
|
226
219
|
|
|
@@ -5,21 +5,24 @@ cabeçalho, body e rodapé.
|
|
|
5
5
|
Dialog e Drawer mantêm no cabeçalho a ordem horizontal de navegação ou retorno, título e ações.
|
|
6
6
|
O retorno aparece em uma surface modal somente
|
|
7
7
|
quando ela foi aberta sobre outro Dialog ou Drawer; a Page ao fundo sustenta o modal, mas não cria
|
|
8
|
-
uma etapa de navegação. Formulários modais encerram o footer
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
uma etapa de navegação. Formulários modais encerram o footer dividido igualmente entre `Cancelar`
|
|
9
|
+
em `outline` e a ação principal.
|
|
10
|
+
Em Page hospedada por `PageShell`, a barra concentra navegação e ações globais. Uma Presentation
|
|
11
|
+
de listagem materializa título e comandos de header no `Content` que envolve o `ActionList`; assim
|
|
12
|
+
a criação permanece próxima da coleção. Esses comandos usam `default`. Nas demais Presentations, o
|
|
13
|
+
título abre o conteúdo em `PageIntro` e comandos da superfície usam `default`.
|
|
14
14
|
|
|
15
15
|
Use esse padrão quando uma lista puder abrir um detalhe lateral, quando a mesma edição precisar
|
|
16
16
|
funcionar em modal e em rota própria ou quando um fluxo começar compacto e crescer sem ganhar uma
|
|
17
17
|
segunda implementação.
|
|
18
18
|
|
|
19
19
|
Dentro de `PageShell`, a superfície `page` usa a anatomia real da aplicação: a Presentation projeta
|
|
20
|
-
navigation e actions
|
|
21
|
-
quando necessário, `PageFooter`.
|
|
22
|
-
|
|
20
|
+
navigation e actions globais por `PageHeader`, mantém a introdução no conteúdo quando existir e
|
|
21
|
+
compõe `PageBody` e, quando necessário, `PageFooter`. Para uma action `list`, `PageBody` recebe
|
|
22
|
+
`Content + ActionList`; o header da coleção recebe o título e os comandos declarados no placement
|
|
23
|
+
`header`. Dialog e Drawer continuam usando o header da própria superfície.
|
|
24
|
+
Os comandos da coleção ficam no extremo oposto ao título e permanecem textuais, mesmo quando a
|
|
25
|
+
action declara um ícone. A criação usa `Criar recurso`, sem ícone, em um botão `default`.
|
|
23
26
|
Não envolva a Presentation em um card para simular a página; valide proporção, rolagem e ações no
|
|
24
27
|
shell que efetivamente hospeda a rota.
|
|
25
28
|
|
|
@@ -27,7 +30,7 @@ shell que efetivamente hospeda a rota.
|
|
|
27
30
|
const workspaceUpdate = defineContract({
|
|
28
31
|
name: "workspace.update",
|
|
29
32
|
kind: "form",
|
|
30
|
-
label: "
|
|
33
|
+
label: "Editar workspace",
|
|
31
34
|
input: z.object({ name: z.string() }),
|
|
32
35
|
output: z.object({ id: z.string() }),
|
|
33
36
|
fields: { name: { label: "Nome" } },
|
|
@@ -36,7 +39,7 @@ const workspaceUpdate = defineContract({
|
|
|
36
39
|
const workspacePresentation = definePresentation({
|
|
37
40
|
schemaVersion: 1,
|
|
38
41
|
id: "workspace.update",
|
|
39
|
-
title: "
|
|
42
|
+
title: "Editar workspace",
|
|
40
43
|
body: { action: workspaceUpdate.name },
|
|
41
44
|
});
|
|
42
45
|
|
|
@@ -92,16 +95,23 @@ render(<Example />);
|
|
|
92
95
|
|
|
93
96
|
`definePresentation` cria o artefato serializável. O body recebe uma action `form`, `list` ou
|
|
94
97
|
`view`; uma action `simple` aparece como comando no cabeçalho ou no rodapé. Em formulário,
|
|
95
|
-
`body.submitLabel`
|
|
96
|
-
“
|
|
98
|
+
`body.submitLabel` sobrescreve o padrão “Salvar” quando a operação tem outro resultado observável,
|
|
99
|
+
como “Renomear” ou “Criar nova versão”. Actions que precisam de
|
|
97
100
|
interface abrem outra Presentation. Bindings fornecem valores vindos da rota, do registro, da
|
|
98
101
|
seleção, da sessão ou do resultado anterior sem guardar callbacks no JSON.
|
|
99
102
|
|
|
103
|
+
Quando a exibição precisa sobreviver a refresh, deep link ou histórico, declare `route` na própria
|
|
104
|
+
Presentation. O `path` aceita segmentos fixos e parâmetros como `:id`; `surface` determina como a
|
|
105
|
+
URL abre o recurso. Em uma rota de edição, `record` indica qual Presentation de lista fornece o
|
|
106
|
+
registro e qual campo corresponde ao parâmetro. Um adaptador de rota pode então reconstruir a
|
|
107
|
+
invocação sem repetir uma árvore condicional no componente da página.
|
|
108
|
+
|
|
100
109
|
```ts
|
|
101
110
|
const workspaceList = definePresentation({
|
|
102
111
|
schemaVersion: 1,
|
|
103
112
|
id: "workspace.list",
|
|
104
113
|
title: "Workspaces",
|
|
114
|
+
route: { path: "/workspaces", surface: "page" },
|
|
105
115
|
body: {
|
|
106
116
|
action: "workspace.list",
|
|
107
117
|
open: {
|
|
@@ -141,8 +151,9 @@ const invocation = definePresentationInvocation({
|
|
|
141
151
|
|
|
142
152
|
`openPresentation` empilha a exibição atual; `backPresentation` restaura o frame anterior.
|
|
143
153
|
`closePresentation` encerra dialog ou drawer e recusa page. Efeitos `navigate` escolhem `push` ou
|
|
144
|
-
`replace`.
|
|
145
|
-
|
|
154
|
+
`replace`. `matchPresentationRoute` resolve a definição e os parâmetros de uma URL declarada;
|
|
155
|
+
`pathForPresentationInvocation` faz o caminho inverso. A aplicação continua responsável apenas por
|
|
156
|
+
ligar esse estado ao router que hospeda a Presentation.
|
|
146
157
|
|
|
147
158
|
## Inspecionar o JSON
|
|
148
159
|
|
|
@@ -154,19 +165,19 @@ no manifest e concentre a inspeção na Lens em vez de criar um launcher flutuan
|
|
|
154
165
|
|
|
155
166
|
## Propriedades de Presentation
|
|
156
167
|
|
|
157
|
-
| Propriedade | Tipo
|
|
158
|
-
| -------------------- |
|
|
159
|
-
| `definition` | `PresentationDefinition`
|
|
160
|
-
| `definitions` | `PresentationDefinition[]`
|
|
161
|
-
| `actions` | `PresentationActionRegistry`
|
|
162
|
-
| `invocation` | `PresentationInvocation`
|
|
163
|
-
| `bindingContext` | `PresentationBindingContext`
|
|
164
|
-
| `onInvocationChange` | `(next: PresentationInvocation \| null) => void` | | Recebe navegação, retorno e fechamento.
|
|
165
|
-
| `onRefresh` | `(action: string \| null) => void`
|
|
166
|
-
| `open` | `boolean`
|
|
167
|
-
| `onOpenChange` | `(open: boolean) => void`
|
|
168
|
-
| `className` | `string`
|
|
169
|
-
| `bodyClassName` | `string`
|
|
168
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
169
|
+
| -------------------- | ------------------------------------------------ | ------ | ------------------------------------------------------ |
|
|
170
|
+
| `definition` | `PresentationDefinition` | | Artefato estático que descreve o recurso. |
|
|
171
|
+
| `definitions` | `PresentationDefinition[]` | | Registry alcançável por navegação, abertura e retorno. |
|
|
172
|
+
| `actions` | `PresentationActionRegistry` | | Contratos compartilháveis referenciados pelo artefato. |
|
|
173
|
+
| `invocation` | `PresentationInvocation` | | Surface, input e pilha da exibição atual. |
|
|
174
|
+
| `bindingContext` | `PresentationBindingContext` | | Rota, item, seleção, sessão e resultado disponíveis. |
|
|
175
|
+
| `onInvocationChange` | `(next: PresentationInvocation \| null) => void` | | Recebe navegação, retorno e fechamento. |
|
|
176
|
+
| `onRefresh` | `(action: string \| null) => void` | | Recebe invalidações declaradas após sucesso. |
|
|
177
|
+
| `open` | `boolean` | `true` | Estado controlado de Dialog ou Drawer. |
|
|
178
|
+
| `onOpenChange` | `(open: boolean) => void` | | Notifica abertura e fechamento da superfície modal. |
|
|
179
|
+
| `className` | `string` | | Classes adicionais da superfície. |
|
|
180
|
+
| `bodyClassName` | `string` | | Classes adicionais do body, aplicadas uma única vez. |
|
|
170
181
|
|
|
171
182
|
## Propriedades de PresentationInspector
|
|
172
183
|
|
|
@@ -49,7 +49,7 @@ const workspaceStatus = attachLogicalType(z.enum(STATUS), docWorkspaceStatus)
|
|
|
49
49
|
export const docWorkspaceCreate = defineContract({
|
|
50
50
|
name: 'workspace.create',
|
|
51
51
|
kind: 'form',
|
|
52
|
-
label: '
|
|
52
|
+
label: 'Criar workspace',
|
|
53
53
|
messages: { success: 'Workspace criado', error: 'Falha ao criar workspace' },
|
|
54
54
|
input: z.object({
|
|
55
55
|
name: z.string().min(2).max(120),
|
package/src/ui/meta.ts
CHANGED
|
@@ -117,7 +117,7 @@ export const componentMeta = {
|
|
|
117
117
|
name: "content-header",
|
|
118
118
|
ancestry: "opus",
|
|
119
119
|
whenToUse:
|
|
120
|
-
"Estruture uma região de conteúdo com título, contador, descrição e ações. No caso comum, declare esses valores diretamente em Content; componha ContentHeader apenas quando precisar controlar a anatomia. Contadores pertencem a Content e não ao título da Page.",
|
|
120
|
+
"Estruture uma região de conteúdo com título, contador, descrição e ações. No caso comum, declare esses valores diretamente em Content; componha ContentHeader apenas quando precisar controlar a anatomia. Em coleções, Content mantém título e criação junto do ActionList. Contadores pertencem a Content e não ao título da Page.",
|
|
121
121
|
},
|
|
122
122
|
copyable: {
|
|
123
123
|
name: "copyable",
|
|
@@ -382,7 +382,7 @@ export const componentMeta = {
|
|
|
382
382
|
name: "action-list",
|
|
383
383
|
ancestry: "opus",
|
|
384
384
|
whenToUse:
|
|
385
|
-
"Apresente uma coleção pesquisável a partir de uma ListAction. O contrato declara colunas, filtros, período e busca; ActionList coordena visualizações, paginação, seleção em lote e sincronização com a URL. Para um único recurso, use ActionView.",
|
|
385
|
+
"Apresente uma coleção pesquisável a partir de uma ListAction. O contrato declara colunas, filtros, período e busca; ActionList coordena visualizações, paginação, seleção em lote e sincronização com a URL. Em uma página, envolva a lista com Content para manter título e criação junto da coleção. Para um único recurso, use ActionView.",
|
|
386
386
|
},
|
|
387
387
|
"action-trigger": {
|
|
388
388
|
name: "action-trigger",
|
|
@@ -400,13 +400,13 @@ export const componentMeta = {
|
|
|
400
400
|
name: "page",
|
|
401
401
|
ancestry: "opus",
|
|
402
402
|
whenToUse:
|
|
403
|
-
"O esqueleto de página do back-office: <main> + container centralizado com teto padrão de 80rem (`max-w-7xl`).
|
|
403
|
+
"O esqueleto de página do back-office: <main> + container centralizado com teto padrão de 80rem (`max-w-7xl`). PageHeader declara navegação e ações globais; PageIntro é a introdução opcional; PageBody recebe o conteúdo. PageShell mantém a barra de 3.75rem e projeta os slots do PageHeader. Uma região interna pode fornecer o heading principal com Content. PageActionsTarget fica restrito a workspaces imersivos sem PageShell. PageState oculta PageIntro; informações importantes entram no corpo como Alert ou texto. Para uma região disponível à criação ou vínculo, use Empty.",
|
|
404
404
|
},
|
|
405
405
|
presentation: {
|
|
406
406
|
name: "presentation",
|
|
407
407
|
ancestry: "opus",
|
|
408
408
|
whenToUse:
|
|
409
|
-
"Descreva um recurso que precisa manter a mesma anatomia ao aparecer como Page, Dialog ou Drawer. Presentation organiza navegação, título, ações de cabeçalho, body e ações de rodapé sem redefinir o conteúdo para cada superfície. A definição persistente liga esses slots a actions Opus; a invocação carrega o estado JSON da execução. PresentationInspector abre um snapshot isolado, enquanto a Lens apresenta o inventário estático projetado no manifest.",
|
|
409
|
+
"Descreva um recurso que precisa manter a mesma anatomia ao aparecer como Page, Dialog ou Drawer. Presentation organiza navegação, título, ações de cabeçalho, body e ações de rodapé sem redefinir o conteúdo para cada superfície. Em Page de listagem, Content mantém título e ações junto do ActionList; modais usam o header da superfície. Route pode declarar URL, surface e origem do registro para deep links. A definição persistente liga esses slots a actions Opus; a invocação carrega o estado JSON da execução. PresentationInspector abre um snapshot isolado, enquanto a Lens apresenta o inventário estático projetado no manifest.",
|
|
410
410
|
},
|
|
411
411
|
router: {
|
|
412
412
|
name: "router",
|