@softize/opus 17.1.0 → 17.2.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 CHANGED
@@ -7,6 +7,15 @@ Depois de qualquer bump, rode os gates (`typecheck` · `test` · `opus check` ·
7
7
  `opus copy --check` · `base copy check` · `manifest:check`) — eles apontam o que a
8
8
  mudança cobra do seu código.
9
9
 
10
+ ## 17.2.0 — 2026-09-12
11
+
12
+ Páginas hospedadas por `PageShell` passam a apresentar o título no início do conteúdo, em
13
+ `PageIntro`, e reservam a barra persistente para navegação e ações. O shorthand de `Page` aplica
14
+ essa anatomia automaticamente, evitando repetir a página atual ao lado do breadcrumb.
15
+
16
+ Na composição explícita dentro de `PageShell`, substitua `PageHeader` por `PageIntro`. Fora do
17
+ shell, `PageHeader` continua sendo o cabeçalho convencional da página.
18
+
10
19
  ## 17.1.0 — 2026-09-12
11
20
 
12
21
  Formulários de `Presentation` em Dialog e Drawer passam a oferecer `Cancelar` ao lado da ação
@@ -21,14 +21,13 @@ renderiza a barra, recebe a navegação conhecida pelo shell e oferece o alvo ca
21
21
  declaradas pela `Page` descendente. Essa barra existe somente por `PageShell`; `PageHeader` não
22
22
  possui variante visual para reproduzi-la dentro da página.
23
23
 
24
- Quando uma `Page` está dentro de `PageShell`, `PageHeader` continua sendo seu header estrutural.
25
- `PageTitle`, `PageNavigation`, `PageBack` e `PageActions` são projetados nos alvos da barra sem
26
- duplicar a anatomia no body. Na forma explícita, a página usa `PageHeader` e `PageBody`, com
27
- `PageIntro` opcional para contexto adicional no conteúdo. Fora de `PageShell`, `PageHeader` aparece
28
- dentro do container da página.
29
-
30
- `PageState` oculta somente `PageIntro`. A barra do `PageShell` permanece visível com navegação,
31
- título e ações mesmo quando o conteúdo carrega, falha ou está vazio. Uma ação que depende do
24
+ Quando uma `Page` está dentro de `PageShell`, `PageIntro` é seu header estrutural no conteúdo.
25
+ `PageTitle` permanece nessa região, enquanto `PageNavigation`, `PageBack` e `PageActions` são
26
+ projetados nos alvos da barra. Na forma explícita, a página usa `PageIntro` e `PageBody`, sem
27
+ `PageHeader`. Fora de `PageShell`, `PageHeader` continua dentro do container da página.
28
+
29
+ `PageState` oculta o título de `PageIntro`. A barra do `PageShell` permanece visível com navegação
30
+ e ações mesmo quando o conteúdo carrega, falha ou está vazio. Uma ação que depende do
32
31
  conteúdo deve se omitir por estado na própria rota.
33
32
 
34
33
  `PageShell` não substitui o shell completo da aplicação, não inclui sidebar e não cria navegação.
@@ -38,10 +37,9 @@ Ele apenas coordena a barra e a área em que uma única `Page` é renderizada.
38
37
 
39
38
  - shell e rota podem continuar conhecendo partes diferentes da página sem criar componentes locais
40
39
  de chrome;
41
- - título e ações têm destinos oficiais na barra;
40
+ - o título inicia o conteúdo e as ações têm destino oficial na barra;
42
41
  - estados integrais preservam a barra e escondem somente a introdução do conteúdo;
43
- - a composição de `Page` com `PageHeader` é a mesma dentro e fora de `PageShell`; apenas seu destino
44
- visual muda;
42
+ - a composição explícita usa `PageIntro` dentro do shell e `PageHeader` fora dele;
45
43
  - `PageActionsTarget` continua disponível apenas para workspaces imersivos que não usam
46
44
  `PageShell`.
47
45
 
@@ -64,7 +62,7 @@ estado do conteúdo. A moldura do shell não deve oscilar com a consulta da rota
64
62
 
65
63
  ## Verificação
66
64
 
67
- - testes cobrem a projeção de navegação, título e ações, a permanência da barra e a ocultação de `PageIntro` em estados
65
+ - testes cobrem o título no início do conteúdo, a projeção de navegação e ações, a permanência da barra e a ocultação de `PageIntro` em estados
68
66
  integrais;
69
67
  - a documentação demonstra a composição de `PageShell`, `PageIntro` e `Page` sem CSS externo;
70
68
  - consumidores removem barras paralelas e `PageActionsTarget` ao adotar o novo contrato.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softize/opus",
3
- "version": "17.1.0",
3
+ "version": "17.2.0",
4
4
  "description": "End-to-end action protocol for TypeScript. Single package with subpath exports (core + adapters).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -40,10 +40,11 @@ existentes, mantendo navegação observável e componentes reutilizáveis sem la
40
40
  esses defaults na tela.
41
41
  7. Tratar página, filtro, seleção e modal importante como estado navegável por URL quando
42
42
  o produto precisa de deep link, back/forward ou refresh.
43
- 8. Compor superfícies pela gramática estrutural do catálogo: `Page` contém `PageHeader` e
44
- `PageBody`; `Content` contém `ContentHeader` e `ContentBody`; Card, Drawer e Pane usam seus
43
+ 8. Compor superfícies pela gramática estrutural do catálogo: fora de `PageShell`, `Page` contém
44
+ `PageHeader` e `PageBody`; dentro dele, contém `PageIntro` e `PageBody`; `Content` contém
45
+ `ContentHeader` e `ContentBody`; Card, Drawer e Pane usam seus
45
46
  respectivos `*Body`. Para o caso direto, usar a sintaxe abreviada de `Page` (`title`,
46
- `description`, `actions`) ou de `Content` (as mesmas mais `count`); não misturá-la com o
47
+ `actions`) ou de `Content` (`title`, `description`, `actions` e `count`); não misturá-la com o
47
48
  header explícito. O título da página não carrega contador. Ajustar o
48
49
  nível do heading pela hierarquia semântica, não pelo destaque visual. O `Page` mantém seu teto
49
50
  centralizado padrão de `80rem`.
@@ -3,8 +3,9 @@
3
3
  - Dispara: “Monte a tela de edição usando a form action do Opus.”
4
4
  - Não dispara: “Ajuste o CSS de um e-mail estático.”
5
5
  - Execução: implementar uma lista com modal roteável e provar loading, erro, vazio e back.
6
- - Execução estrutural: montar uma página de relatório com `Page > PageHeader + PageBody`, uma seção
7
- `Content > ContentHeader + ContentBody`, `ActionFilterBar` separado do renderer, `ItemGroup` para
6
+ - Execução estrutural: montar uma página de relatório isolada com `Page > PageHeader + PageBody`,
7
+ outra em `PageShell` com `Page > PageIntro + PageBody`, uma seção `Content > ContentHeader +
8
+ ContentBody`, `ActionFilterBar` separado do renderer, `ItemGroup` para
8
9
  uma coleção secundária e um `ActionFormDialog`; provar teto padrão de `80rem`, hierarquia por
9
10
  `level`, vazio estrutural sólido, `Empty` apenas para criação ou vínculo, números sem alinhamento
10
11
  inferido e cancelamento `ghost` no modal.
@@ -4,14 +4,14 @@
4
4
  - Campos, labels, mensagens e invalidações pertencem ao contrato quando são parte da
5
5
  operação, não a uma tela isolada.
6
6
  - URL representa estado que precisa sobreviver a refresh, deep link ou histórico.
7
- - `Page` fornece o `<main>` e o container centralizado com teto padrão de `80rem`. Sua forma
8
- explícita é `Page > PageHeader (PageBack? | PageNavigation?, PageTitle,
7
+ - `Page` fornece o `<main>` e o container centralizado com teto padrão de `80rem`. Fora de
8
+ `PageShell`, sua forma explícita é `Page > PageHeader (PageBack? | PageNavigation?, PageTitle,
9
9
  PageActions?) + PageBody`; `title` e `actions` no próprio `Page` são a abreviação
10
10
  para o caso direto.
11
11
  Não misturar as duas formas. Alterar `className` apenas quando a superfície tiver uma necessidade
12
12
  real de largura; não reconstruir esse container em cada rota.
13
- - `PageIntro` é uma região opcional do body para contexto realmente útil; não substitui nem duplica
14
- o título estrutural do `PageHeader`.
13
+ - `PageIntro` é a região estrutural do título quando a página está em `PageShell`; fora dele, pode
14
+ substituir `PageHeader` quando o conteúdo precisar começar por uma introdução.
15
15
  - `PageHeader` é a região de cabeçalho dentro de uma `Page` isolada e organiza navegação, título e
16
16
  ações na mesma linha. Em uma subpágina simples, `PageBack` recebe o destino pai explícito e aparece
17
17
  antes do título como controle somente com ícone. Para mais de um ancestral relevante, use
@@ -20,13 +20,13 @@ PageActions?) + PageBody`; `title` e `actions` no próprio `Page` são a abrevia
20
20
  possuam chrome próprio.
21
21
  - Quando shell e rota conhecem partes diferentes da mesma página, use `PageShell` ao redor da rota.
22
22
  O shell é o único responsável pela barra: fornece `navigation`; a `Page` descendente continua
23
- declarando `title` e `actions`. O Opus mantém a barra de `3rem` e projeta título e ações nela.
23
+ declarando `title` e `actions`. O Opus mantém a barra de `3rem`, projeta ações nela e inicia o
24
+ conteúdo com o título em `PageIntro`.
24
25
  Ações com texto na barra usam o tamanho `default`, como as ações de footer de Dialog e Drawer;
25
26
  ações somente com ícone de chrome usam `icon-sm`. O tamanho `sm` fica para ações operacionais em
26
27
  toolbar, seção ou coleção densa, e `xs`/`icon-xs` para ações internas de linha ou célula. Contexto
27
28
  e variante resolvem a hierarquia visual sem alterar essa medida. Na forma explícita dentro do
28
- shell, use `Page > PageHeader (PageNavigation?, PageTitle, PageActions?) + PageBody`, com
29
- `PageIntro` opcional antes do body. Não monte
29
+ shell, use `Page > PageIntro (PageNavigation?, PageTitle, PageActions?) + PageBody`. Não monte
30
30
  `PaneHeader`, portal ou seletor global para reconstruir essa composição.
31
31
  - `PageState` substitui todo o conteúdo principal quando a página carrega, falha ou está vazia. Na
32
32
  forma curta ele pode ser escrito como filho direto de `Page`, que cria o `PageBody`; na forma
@@ -34,7 +34,6 @@ const PageHeaderContext = createContext<PageHeadingRegion | null>(null);
34
34
  const PageIntegralStateContext = createContext(false);
35
35
  const PageActionsTargetContext = createContext<HTMLElement | null>(null);
36
36
  const PageNavigationTargetContext = createContext<HTMLElement | null>(null);
37
- const PageTitleTargetContext = createContext<HTMLElement | null>(null);
38
37
  const PageShellContext = createContext(false);
39
38
  const pageBarClassName =
40
39
  "flex h-12 shrink-0 items-center border-b border-border bg-background text-foreground";
@@ -124,7 +123,6 @@ export function PageShell({
124
123
  );
125
124
  const [navigationTarget, setNavigationTarget] =
126
125
  useState<HTMLDivElement | null>(null);
127
- const [titleTarget, setTitleTarget] = useState<HTMLDivElement | null>(null);
128
126
 
129
127
  return (
130
128
  <div
@@ -152,20 +150,18 @@ export function PageShell({
152
150
  <PageShellNavigationSlot targetRef={setNavigationTarget}>
153
151
  {navigation}
154
152
  </PageShellNavigationSlot>
155
- <PageShellTitleSlot targetRef={setTitleTarget} />
153
+ <PageShellTitleSlot />
156
154
  <PageShellActionsSlot targetRef={setActionsTarget}>
157
155
  {actions}
158
156
  </PageShellActionsSlot>
159
157
  </SurfaceHeader>
160
158
  <PageShellContext.Provider value>
161
159
  <PageNavigationTargetContext.Provider value={navigationTarget}>
162
- <PageTitleTargetContext.Provider value={titleTarget}>
163
- <PageActionsTarget target={actionsTarget}>
164
- <div data-slot="page-shell-content" className="min-h-0 flex-1">
165
- {children}
166
- </div>
167
- </PageActionsTarget>
168
- </PageTitleTargetContext.Provider>
160
+ <PageActionsTarget target={actionsTarget}>
161
+ <div data-slot="page-shell-content" className="min-h-0 flex-1">
162
+ {children}
163
+ </div>
164
+ </PageActionsTarget>
169
165
  </PageNavigationTargetContext.Provider>
170
166
  </PageShellContext.Provider>
171
167
  </div>
@@ -254,10 +250,16 @@ export function Page({
254
250
  }, []);
255
251
  if (
256
252
  shorthand &&
257
- nodes.some((node) => isValidElement(node) && node.type === PageHeader)
253
+ nodes.some(
254
+ (node) =>
255
+ isValidElement(node) &&
256
+ [PageHeader, PageIntro, PageBody, PageFooter].includes(
257
+ node.type as typeof PageHeader,
258
+ ),
259
+ )
258
260
  ) {
259
261
  throw new Error(
260
- "Page não permite misturar propriedades de shorthand com PageHeader explícito.",
262
+ "Page não permite misturar propriedades de shorthand com composição explícita.",
261
263
  );
262
264
  }
263
265
  if (!shorthand) {
@@ -277,9 +279,9 @@ export function Page({
277
279
  headers.length + bodies.length + footers.length === nodes.length;
278
280
  const validShellComposition =
279
281
  insideShell &&
280
- headers.length === 1 &&
282
+ headers.length === 0 &&
281
283
  bodies.length === 1 &&
282
- intros.length <= 1 &&
284
+ intros.length === 1 &&
283
285
  footers.length <= 1 &&
284
286
  headers.length + intros.length + bodies.length + footers.length ===
285
287
  nodes.length;
@@ -290,7 +292,7 @@ export function Page({
290
292
  ) {
291
293
  throw new Error(
292
294
  insideShell
293
- ? "Page explícito dentro de PageShell exige um PageHeader, um PageBody e aceita no máximo um PageIntro e um PageFooter como filhos diretos."
295
+ ? "Page explícito dentro de PageShell exige um PageIntro, um PageBody e aceita no máximo um PageFooter como filhos diretos."
294
296
  : "Page explícito exige um PageHeader ou PageIntro, um PageBody e no máximo um PageFooter como filhos diretos.",
295
297
  );
296
298
  }
@@ -298,10 +300,10 @@ export function Page({
298
300
  const content =
299
301
  shorthand && insideShell ? (
300
302
  <>
301
- <PageHeader>
303
+ <PageIntro>
302
304
  <PageTitle>{title}</PageTitle>
303
305
  {actions !== undefined && <PageActions>{actions}</PageActions>}
304
- </PageHeader>
306
+ </PageIntro>
305
307
  <PageBody>{children}</PageBody>
306
308
  </>
307
309
  ) : shorthand ? (
@@ -346,7 +348,7 @@ export function Page({
346
348
  );
347
349
  }
348
350
 
349
- /** Introdução opcional do conteúdo, separada da navegação persistente do shell. */
351
+ /** Título estrutural no conteúdo de PageShell ou introdução opcional de uma Page isolada. */
350
352
  export function PageIntro({
351
353
  className,
352
354
  children,
@@ -358,12 +360,16 @@ export function PageIntro({
358
360
  requireParent(page !== null, "PageIntro", "Page");
359
361
  if (integralState) {
360
362
  if (!insideShell) return <></>;
361
- const actions = Children.toArray(children).filter(
362
- (node) => isValidElement(node) && node.type === PageActions,
363
+ const persistentSlots = Children.toArray(children).filter(
364
+ (node) =>
365
+ isValidElement(node) &&
366
+ [PageBack, PageNavigation, PageActions].includes(
367
+ node.type as typeof PageBack,
368
+ ),
363
369
  );
364
370
  return (
365
371
  <PageHeaderContext.Provider value="intro">
366
- {actions}
372
+ {persistentSlots}
367
373
  </PageHeaderContext.Provider>
368
374
  );
369
375
  }
@@ -374,9 +380,11 @@ export function PageIntro({
374
380
  name="PageIntro"
375
381
  slot="page-intro"
376
382
  slots={{
383
+ leading: [PageBack, PageNavigation],
377
384
  title: PageTitle,
378
385
  actions: PageActions,
379
386
  }}
387
+ leadingPlacement="inline"
380
388
  className={className}
381
389
  {...props}
382
390
  >
@@ -431,10 +439,8 @@ export function PageTitle({
431
439
  ...props
432
440
  }: HTMLAttributes<HTMLHeadingElement>): ReactElement {
433
441
  const variant = useContext(PageHeaderContext);
434
- const insideShell = useContext(PageShellContext);
435
- const target = useContext(PageTitleTargetContext);
436
442
  requireParent(variant !== null, "PageTitle", "PageHeader ou PageIntro");
437
- const title = (
443
+ return (
438
444
  <h1
439
445
  data-slot="page-title"
440
446
  className={cn(
@@ -446,10 +452,6 @@ export function PageTitle({
446
452
  {...props}
447
453
  />
448
454
  );
449
- if (insideShell && variant === "header") {
450
- return target === null ? <></> : createPortal(title, target);
451
- }
452
- return title;
453
455
  }
454
456
 
455
457
  export function PageActions({
@@ -495,11 +497,7 @@ export function PageNavigation({
495
497
  const variant = useContext(PageHeaderContext);
496
498
  const insideShell = useContext(PageShellContext);
497
499
  const target = useContext(PageNavigationTargetContext);
498
- requireParent(
499
- variant !== null,
500
- "PageNavigation",
501
- "PageHeader",
502
- );
500
+ requireParent(variant !== null, "PageNavigation", "PageHeader ou PageIntro");
503
501
  const navigation = (
504
502
  <div
505
503
  data-slot="page-navigation-content"
@@ -507,7 +505,7 @@ export function PageNavigation({
507
505
  {...props}
508
506
  />
509
507
  );
510
- if (insideShell && variant === "header") {
508
+ if (insideShell) {
511
509
  return target === null ? <></> : createPortal(navigation, target);
512
510
  }
513
511
  return navigation;
@@ -522,7 +520,7 @@ export function PageBack({
522
520
  const variant = useContext(PageHeaderContext);
523
521
  const insideShell = useContext(PageShellContext);
524
522
  const target = useContext(PageNavigationTargetContext);
525
- requireParent(variant !== null, "PageBack", "PageHeader");
523
+ requireParent(variant !== null, "PageBack", "PageHeader ou PageIntro");
526
524
  const destination =
527
525
  typeof children === "string" ? children : "a página anterior";
528
526
  const accessibleLabel = ariaLabel ?? `Voltar para ${destination}`;
@@ -540,7 +538,7 @@ export function PageBack({
540
538
  </a>
541
539
  </Button>
542
540
  );
543
- if (insideShell && variant === "header") {
541
+ if (insideShell) {
544
542
  return target === null ? <></> : createPortal(back, target);
545
543
  }
546
544
  return back;
@@ -148,18 +148,16 @@ function PresentationFrame({
148
148
  if (insidePageShell) {
149
149
  return (
150
150
  <Page className={cn("flex min-h-full flex-col", className)}>
151
- <PageHeader>
151
+ <PageIntro>
152
152
  {navigation === undefined ? null : (
153
153
  <PageNavigation>{navigation}</PageNavigation>
154
154
  )}
155
+ <PageTitle>{title}</PageTitle>
155
156
  {headerActions === undefined ? null : (
156
157
  <PageActions>
157
158
  <PresentationActions>{headerActions}</PresentationActions>
158
159
  </PageActions>
159
160
  )}
160
- </PageHeader>
161
- <PageIntro>
162
- <PageTitle>{title}</PageTitle>
163
161
  </PageIntro>
164
162
  <PageBody className="min-h-0 flex-1 overflow-y-auto">{body}</PageBody>
165
163
  {hasFooter ? <PageFooter>{renderFooterActions()}</PageFooter> : null}
@@ -2,15 +2,17 @@
2
2
 
3
3
  Use `Page` para manter título, ações, estado e conteúdo na mesma anatomia. Sozinha, ela apresenta
4
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 e a página projeta título e ações na barra.
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.
6
7
 
7
8
  `PageHeader` mantém navegação, título e ações na mesma linha. O container é centralizado e ocupa a
8
9
  largura disponível até `80rem` (`max-w-7xl`). Use `className` somente quando a composição pedir
9
10
  outro teto ou largura total.
10
11
 
11
12
  A forma curta é o padrão para páginas comuns. Fora de `PageShell`, ela cria `PageHeader` e
12
- `PageBody`. Dentro dele, cria `PageHeader` e `PageBody`, projetando o header na barra. A forma
13
- explícita permite acrescentar um `PageIntro` opcional no conteúdo sem duplicar o título estrutural.
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.
14
16
  Contadores e outros indicadores pertencem ao
15
17
  conteúdo que os explica.
16
18
 
@@ -64,8 +66,8 @@ posição introdutória sem transformar a trilha em ação.
64
66
  ## Barra persistente do shell
65
67
 
66
68
  Use `PageShell` quando o shell conhece o breadcrumb e a rota conhece título e ações. Não crie um
67
- `PaneHeader` paralelo nem esconda slots de `Page` com CSS. O Opus projeta `PageTitle` e
68
- `PageActions` na barra.
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.
69
71
 
70
72
  ```tsx preview col
71
73
  <PageShell
@@ -95,17 +97,17 @@ Use `PageShell` quando o shell conhece o breadcrumb e a rota conhece título e a
95
97
  A barra permanece visível durante `PageState`; uma introdução opcional desaparece. Se uma ação não
96
98
  puder ser executada sem o conteúdo, a própria rota deve omiti-la naquele estado.
97
99
 
98
- Na composição explícita dentro do shell, use `PageHeader` e `PageBody`:
100
+ Na composição explícita dentro do shell, use `PageIntro` e `PageBody`:
99
101
 
100
102
  ```tsx preview col
101
103
  <PageShell navigation={<Breadcrumb>...</Breadcrumb>}>
102
104
  <Page>
103
- <PageHeader>
105
+ <PageIntro>
104
106
  <PageTitle>Clientes</PageTitle>
105
107
  <PageActions>
106
108
  <Button>Novo cliente</Button>
107
109
  </PageActions>
108
- </PageHeader>
110
+ </PageIntro>
109
111
  <PageBody>Conteúdo da listagem.</PageBody>
110
112
  </Page>
111
113
  </PageShell>
@@ -136,8 +138,9 @@ render(
136
138
  );
137
139
  ```
138
140
 
139
- Use `PageIntro` somente quando o conteúdo precisar de uma introdução adicional. Ele não substitui
140
- o `PageHeader`, não repete o título da página e pode ser omitido.
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`.
141
144
 
142
145
  ## Estados integrais
143
146
 
@@ -208,7 +211,7 @@ estado na própria seção com `DataState`, `ActionView`, `ActionList` ou `Alert
208
211
 
209
212
  | Propriedade | Tipo | Descrição |
210
213
  | ----------- | ----------------------------- | ------------------------------------------------------------- |
211
- | `children` | `ReactNode` | Conteúdo introdutório opcional do body. |
214
+ | `children` | `ReactNode` | Título e ações da página dentro de `PageShell`, ou introdução de uma página isolada. |
212
215
  | `className` | `string` | Classes adicionais da região introdutória. |
213
216
  | demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à região introdutória. |
214
217
 
package/src/ui/meta.ts CHANGED
@@ -400,7 +400,7 @@ 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 e recebe navegação, título e ações da Page. PageIntro é um bloco opcional de introdução no conteúdo. 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`). 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.",
404
404
  },
405
405
  presentation: {
406
406
  name: "presentation",