@softize/opus 17.2.0 → 18.0.1

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 (46) hide show
  1. package/CHANGELOG.md +62 -1
  2. package/bin/lib/check.mjs +212 -45
  3. package/docs/adr/0010-page-header-owns-page-chrome.md +2 -2
  4. package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +4 -0
  5. package/docs/adr/0013-presentation-is-a-portable-action-oriented-artifact.md +14 -2
  6. package/docs/adr/0015-action-size-follows-interaction-density.md +1 -1
  7. package/docs/adr/0016-list-collection-header-belongs-to-content.md +80 -0
  8. package/package.json +1 -1
  9. package/registry/skills/build-opus-ui/SKILL.md +30 -20
  10. package/registry/skills/build-opus-ui/references/evaluations.md +9 -3
  11. package/registry/skills/build-opus-ui/references/ui-patterns.md +30 -18
  12. package/src/core/presentation.ts +223 -24
  13. package/src/core/runtime.ts +3 -0
  14. package/src/core/types.ts +2 -0
  15. package/src/mcp/index.ts +1 -0
  16. package/src/ui/components/patterns/action-form-card.tsx +8 -1
  17. package/src/ui/components/patterns/confirm.tsx +194 -157
  18. package/src/ui/components/patterns/content-header.tsx +17 -2
  19. package/src/ui/components/patterns/form-dialog.tsx +28 -14
  20. package/src/ui/components/patterns/form.tsx +340 -222
  21. package/src/ui/components/patterns/list.tsx +43 -44
  22. package/src/ui/components/patterns/page-heading-context.tsx +34 -0
  23. package/src/ui/components/patterns/page-state.tsx +2 -0
  24. package/src/ui/components/patterns/page.tsx +165 -51
  25. package/src/ui/components/patterns/presentation.tsx +140 -84
  26. package/src/ui/components/patterns/surface-header.tsx +5 -6
  27. package/src/ui/components/patterns/trigger.tsx +113 -83
  28. package/src/ui/components/primitives/button.tsx +2 -2
  29. package/src/ui/components/primitives/chat.tsx +19 -5
  30. package/src/ui/components/primitives/control.ts +9 -3
  31. package/src/ui/components/primitives/dialog.tsx +16 -9
  32. package/src/ui/components/primitives/drawer.tsx +9 -6
  33. package/src/ui/docs/content/action-form-card.md +9 -8
  34. package/src/ui/docs/content/action-form-dialog.md +11 -12
  35. package/src/ui/docs/content/action-form.md +25 -25
  36. package/src/ui/docs/content/action-list.md +101 -70
  37. package/src/ui/docs/content/action-trigger.md +2 -2
  38. package/src/ui/docs/content/button.md +1 -1
  39. package/src/ui/docs/content/chat.md +4 -4
  40. package/src/ui/docs/content/content.md +29 -13
  41. package/src/ui/docs/content/dialog.md +27 -21
  42. package/src/ui/docs/content/drawer.md +8 -6
  43. package/src/ui/docs/content/page.md +43 -50
  44. package/src/ui/docs/content/presentation.md +39 -28
  45. package/src/ui/docs/doc-client.tsx +1 -1
  46. package/src/ui/meta.ts +4 -4
@@ -1,23 +1,24 @@
1
1
  ## Esqueleto de página
2
2
 
3
- Use `Page` para manter título, ações, estado e conteúdo na mesma anatomia. Sozinha, ela apresenta
4
- `PageHeader` dentro do container. Quando a aplicação possui uma barra persistente, envolva a rota
5
- com `PageShell`: o shell fornece a navegação, a página projeta as ações na barra e o título inicia
6
- o conteúdo.
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
- `PageHeader` mantém navegação, título e ações na mesma linha. O container é centralizado e ocupa a
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 `PageIntro` e `PageBody`: o título fica na introdução e as ações são
14
- projetadas na barra. A forma explícita segue a mesma anatomia, sem duplicar o título ao lado do
15
- breadcrumb.
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 `3rem`, mesmo quando o conteúdo muda de estado. Tabs ficam reservados a recortes
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 título e ações. Não crie um
69
- `PaneHeader` paralelo nem esconda slots de `Page` com CSS. O Opus mantém o `PageTitle` no início do
70
- conteúdo e projeta somente navegação contextual e `PageActions` na barra.
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 dentro do shell, use `PageIntro` e `PageBody`:
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
- <PageIntro>
106
- <PageTitle>Clientes</PageTitle>
97
+ <PageHeader>
107
98
  <PageActions>
108
- <Button>Novo cliente</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` somente quando o conteúdo precisar de uma introdução em vez do
142
- header convencional. Dentro do shell, ele é a região estrutural do título e não deve ser combinado
143
- com `PageHeader`.
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 | Tipo | Padrão | Descrição |
193
- | ------------- | ----------- | ----------- | ----------------------------------------------------------------------------------------------- |
194
- | `title` | `ReactNode` | | O h1 da página. |
195
- | `actions` | `ReactNode` | | Ações contextuais no extremo oposto do cabeçalho; em telas estreitas, ficam abaixo do contexto. |
196
- | `className` | `string` | `max-w-7xl` | Classes do container para substituir o teto padrão de `80rem`. |
197
- | `children` | `ReactNode` | | O body da página — espaçamento e diagramação são seus. |
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 ações da página dentro de `PageShell`, ou introdução de uma página isolada. |
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` | Um `PageTitle` e, opcionalmente, `PageBack` ou `PageNavigation` e ações. |
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 com `Cancelar` e a ação principal.
9
- Em Page hospedada por `PageShell`, a barra concentra navegação e ações, enquanto o título abre o
10
- conteúdo em um `PageIntro`. Assim o breadcrumb não disputa espaço nem repete o título na mesma linha.
11
- Ações textuais de header e footer usam o tamanho `default`, pois pertencem à decisão da superfície;
12
- o tamanho `sm` permanece reservado às operações densas de toolbar, seção e coleção. Contexto e
13
- variante continuam definindo hierarquia visual sem alterar essa medida.
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 no header da barra, apresenta o título em `PageIntro` e compõe `PageBody` e,
21
- quando necessário, `PageFooter`.
22
- Fora do shell, ela materializa o `PageHeader` completo para exemplos e superfícies independentes.
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: "Salvar workspace",
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: "Workspace",
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` nomeia a ação conforme o resultado esperado, como “Criar departamento” ou
96
- Salvar alterações”. Actions que precisam de
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`. A aplicação sincroniza a invocação com a URL apenas quando ela precisar sobreviver a
145
- refresh, deep link ou histórico.
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 | Padrão | Descrição |
158
- | -------------------- | ----------------------------------------- | ------ | ----------------------------------------------------------- |
159
- | `definition` | `PresentationDefinition` | | Artefato estático que descreve o recurso. |
160
- | `definitions` | `PresentationDefinition[]` | | Registry alcançável por navegação, abertura e retorno. |
161
- | `actions` | `PresentationActionRegistry` | | Contratos compartilháveis referenciados pelo artefato. |
162
- | `invocation` | `PresentationInvocation` | | Surface, input e pilha da exibição atual. |
163
- | `bindingContext` | `PresentationBindingContext` | | Rota, item, seleção, sessão e resultado disponíveis. |
164
- | `onInvocationChange` | `(next: PresentationInvocation \| null) => void` | | Recebe navegação, retorno e fechamento. |
165
- | `onRefresh` | `(action: string \| null) => void` | | Recebe invalidações declaradas após sucesso. |
166
- | `open` | `boolean` | `true` | Estado controlado de Dialog ou Drawer. |
167
- | `onOpenChange` | `(open: boolean) => void` | | Notifica abertura e fechamento da superfície modal. |
168
- | `className` | `string` | | Classes adicionais da superfície. |
169
- | `bodyClassName` | `string` | | Classes adicionais do body, aplicadas uma única vez. |
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: 'Novo workspace',
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`). O shorthand cobre título e ações. Quando shell e rota conhecem partes diferentes da página, PageShell mantém a barra de 3rem, recebe a navegação e projeta as ações da Page; o título inicia o conteúdo em PageIntro. Fora do shell, a forma explícita usa PageHeader para o cabeçalho completo. PageActionsTarget fica restrito a workspaces imersivos sem PageShell. PageState oculta somente PageIntro; informações importantes entram no corpo como Alert ou texto. Para uma região disponível à criação ou vínculo, use Empty.",
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",