@softize/opus 15.0.1 → 15.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 +33 -0
- package/README.md +3 -3
- package/bin/lib/check.mjs +134 -11
- package/bin/lib/gen-manifest.mjs +1 -0
- package/bin/lib/gen-runner.mjs +37 -0
- package/bin/lib/introspect.mjs +16 -4
- package/docs/adr/0004-page-content-state-is-composed.md +3 -0
- package/docs/adr/0010-page-header-owns-page-chrome.md +4 -0
- package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +70 -0
- package/docs/adr/0012-data-products-are-first-class-declarations.md +72 -0
- package/docs/data-products.md +66 -0
- package/docs/protocol.md +12 -0
- package/package.json +15 -14
- package/registry/skills/build-opus-ui/references/ui-patterns.md +12 -2
- package/registry/skills/maintain-opus-docs/scripts/audit-docs.mjs +0 -0
- package/src/core/data-product.ts +121 -0
- package/src/core/domain.ts +56 -2
- package/src/core/index.ts +9 -0
- package/src/core/runtime.ts +27 -2
- package/src/core/types.ts +2 -0
- package/src/mcp/index.ts +1 -0
- package/src/ui/components/patterns/page.tsx +200 -18
- package/src/ui/components/patterns/surface-header.tsx +13 -4
- package/src/ui/components/primitives/chat.tsx +58 -14
- package/src/ui/docs/content/chat.md +6 -0
- package/src/ui/docs/content/page.md +99 -26
- package/src/ui/meta.ts +1 -1
- package/src/ui/react.tsx +4 -0
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
## Esqueleto de página
|
|
2
2
|
|
|
3
|
-
Use `Page` para manter
|
|
4
|
-
`PageHeader`
|
|
5
|
-
|
|
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 fornece as ações e o título passa a
|
|
6
|
+
`PageIntro` dentro do conteúdo.
|
|
6
7
|
|
|
7
8
|
Em larguras amplas, as ações ficam no extremo oposto e acompanham a base do título e da descrição;
|
|
8
9
|
em larguras estreitas, passam para uma linha abaixo. O container é centralizado e ocupa a largura
|
|
9
10
|
disponível até `80rem` (`max-w-7xl`). Use `className` somente quando a composição pedir outro teto
|
|
10
11
|
ou largura total.
|
|
11
12
|
|
|
12
|
-
A forma curta é o padrão para páginas comuns.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
A forma curta é o padrão para páginas comuns. Fora de `PageShell`, ela cria `PageHeader` e
|
|
14
|
+
`PageBody`. Dentro dele, cria `PageIntro` e `PageBody`, enquanto envia as ações para a barra. A forma
|
|
15
|
+
explícita permite escolher a região adequada: `PageHeader` reúne navegação e contexto; `PageIntro`
|
|
16
|
+
dá mais presença ao título dentro do conteúdo. Contadores e outros indicadores pertencem ao
|
|
17
|
+
conteúdo que os explica.
|
|
16
18
|
|
|
17
|
-
`
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
`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
|
+
da mesma superfície. Canvas e outros workspaces espaciais imersivos podem usar um shell próprio.
|
|
20
22
|
|
|
21
23
|
Estados integrais de carregamento, falha ou ausência são compostos no body com `PageState`,
|
|
22
24
|
detalhado abaixo. `Page` não recebe flags de dados: uma página pode agregar fontes independentes e
|
|
@@ -63,13 +65,63 @@ Não combine `PageBack` com breadcrumb. Use o retorno para um único pai conheci
|
|
|
63
65
|
mais de um ancestral relevante, envolva o `Breadcrumb` em `PageNavigation`; ele ocupa a mesma
|
|
64
66
|
posição introdutória sem transformar a trilha em ação.
|
|
65
67
|
|
|
66
|
-
##
|
|
68
|
+
## Barra persistente do shell
|
|
67
69
|
|
|
68
|
-
Use `
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
Use `PageShell` quando o shell conhece o breadcrumb e a rota conhece título e ações. Não crie um
|
|
71
|
+
`PaneHeader` paralelo nem esconda slots de `Page` com CSS. O Opus projeta `PageActions` na barra e
|
|
72
|
+
transforma a introdução da forma curta em `PageIntro`.
|
|
73
|
+
|
|
74
|
+
```tsx preview col
|
|
75
|
+
<PageShell
|
|
76
|
+
navigation={
|
|
77
|
+
<Breadcrumb>
|
|
78
|
+
<BreadcrumbList>
|
|
79
|
+
<BreadcrumbItem>Vendas</BreadcrumbItem>
|
|
80
|
+
<BreadcrumbSeparator />
|
|
81
|
+
<BreadcrumbPage>Clientes</BreadcrumbPage>
|
|
82
|
+
</BreadcrumbList>
|
|
83
|
+
</Breadcrumb>
|
|
84
|
+
}
|
|
85
|
+
>
|
|
86
|
+
<Page
|
|
87
|
+
title="Clientes"
|
|
88
|
+
actions={
|
|
89
|
+
<Button size="sm">
|
|
90
|
+
<Plus /> Novo cliente
|
|
91
|
+
</Button>
|
|
92
|
+
}
|
|
93
|
+
>
|
|
94
|
+
Conteúdo da listagem.
|
|
95
|
+
</Page>
|
|
96
|
+
</PageShell>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
A barra permanece visível durante `PageState`; somente a introdução desaparece. Se uma ação não
|
|
100
|
+
puder ser executada sem o conteúdo, a própria rota deve omiti-la naquele estado.
|
|
101
|
+
|
|
102
|
+
Na composição explícita dentro do shell, use `PageIntro` e `PageBody`:
|
|
103
|
+
|
|
104
|
+
```tsx preview col
|
|
105
|
+
<PageShell navigation={<Breadcrumb>...</Breadcrumb>}>
|
|
106
|
+
<Page>
|
|
107
|
+
<PageIntro>
|
|
108
|
+
<PageTitle>Clientes</PageTitle>
|
|
109
|
+
<PageDescription>Cadastros disponíveis para atendimento.</PageDescription>
|
|
110
|
+
<PageActions>
|
|
111
|
+
<Button size="sm">Novo cliente</Button>
|
|
112
|
+
</PageActions>
|
|
113
|
+
</PageIntro>
|
|
114
|
+
<PageBody>Conteúdo da listagem.</PageBody>
|
|
115
|
+
</Page>
|
|
116
|
+
</PageShell>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Cabeçalho em barra da própria Page
|
|
120
|
+
|
|
121
|
+
Use `PageHeader variant="bar"` quando uma página autocontida conhecer título, retorno e ações. Essa
|
|
122
|
+
forma continua útil fora de um shell persistente. `PageBack` vira icon-only e recebe tooltip e nome
|
|
123
|
+
acessível “Voltar para {destino}”. Use `sm` em botões com texto e `icon-sm` em botões somente com
|
|
124
|
+
ícone.
|
|
73
125
|
|
|
74
126
|
```tsx preview col
|
|
75
127
|
<Page className="max-w-none">
|
|
@@ -86,11 +138,8 @@ botões que exibem somente um ícone.
|
|
|
86
138
|
</Page>
|
|
87
139
|
```
|
|
88
140
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
`PageActionsTarget` continua disponível para um workspace imersivo que já possua um chrome próprio.
|
|
93
|
-
Ele projeta somente `PageActions` no elemento informado; não cria uma segunda região de cabeçalho.
|
|
141
|
+
Não aninhe essa variante em `PageShell`, que já possui a barra. `PageActionsTarget` continua
|
|
142
|
+
disponível para um workspace imersivo que tenha chrome próprio e não use `PageShell`.
|
|
94
143
|
|
|
95
144
|
## Composição explícita
|
|
96
145
|
|
|
@@ -118,16 +167,21 @@ render(
|
|
|
118
167
|
);
|
|
119
168
|
```
|
|
120
169
|
|
|
170
|
+
Use `PageIntro` no lugar de `PageHeader` quando a página precisar apenas de uma introdução no
|
|
171
|
+
conteúdo, sem navegação própria. Dentro de `PageShell`, essa é a única composição explícita válida;
|
|
172
|
+
fora dele, as duas formas são aceitas porque cumprem papéis diferentes.
|
|
173
|
+
|
|
121
174
|
## Estados integrais
|
|
122
175
|
|
|
123
176
|
Use `PageState` quando carregamento, falha ou ausência substituírem todo o conteúdo principal. Na
|
|
124
177
|
forma curta ele pode ser escrito como filho direto de `Page`, que cria o `PageBody`; na forma
|
|
125
178
|
explícita, coloque-o sozinho dentro de `PageBody`. Enquanto `status` for `loading`, `error` ou
|
|
126
|
-
`empty`, `Page` oculta o cabeçalho inteiro — incluindo
|
|
127
|
-
disponível.
|
|
179
|
+
`empty`, uma `Page` isolada oculta o cabeçalho inteiro — incluindo `PageBack` — e o estado ocupa a
|
|
180
|
+
altura disponível. Dentro de `PageShell`, a barra persistente permanece e somente `PageIntro` é
|
|
181
|
+
ocultado. Uma subpágina isolada que dependa do retorno oferece a saída pelo `action` do próprio
|
|
128
182
|
`PageState`. O título do estado assume o heading principal. Esse registro também funciona quando um
|
|
129
|
-
componente intermediário decide qual `PageState` renderizar. Em `ready`, o cabeçalho
|
|
130
|
-
voltam à composição normal.
|
|
183
|
+
componente intermediário decide qual `PageState` renderizar. Em `ready`, o cabeçalho ou a introdução
|
|
184
|
+
e o conteúdo voltam à composição normal.
|
|
131
185
|
|
|
132
186
|
```tsx preview col
|
|
133
187
|
<Page title="Relatório">
|
|
@@ -172,6 +226,25 @@ estado na própria seção com `DataState`, `ActionView`, `ActionList` ou `Alert
|
|
|
172
226
|
| `className` | `string` | `max-w-7xl` | Classes do container para substituir o teto padrão de `80rem`. |
|
|
173
227
|
| `children` | `ReactNode` | | O body da página — espaçamento e diagramação são seus. |
|
|
174
228
|
|
|
229
|
+
## Propriedades de PageShell
|
|
230
|
+
|
|
231
|
+
| Propriedade | Tipo | Descrição |
|
|
232
|
+
| ----------------- | ----------------------------- | ---------------------------------------------------------------------- |
|
|
233
|
+
| `navigation` | `ReactNode` | Navegação contextual da barra, normalmente um `Breadcrumb`. |
|
|
234
|
+
| `actions` | `ReactNode` | Ações conhecidas pelo shell, antes das ações declaradas pela `Page`. |
|
|
235
|
+
| `children` | `ReactNode` | Rota que renderiza uma `Page` descendente. |
|
|
236
|
+
| `headerClassName` | `string` | Classes adicionais do container interno da barra. |
|
|
237
|
+
| `className` | `string` | Classes adicionais da moldura. |
|
|
238
|
+
| demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à moldura. |
|
|
239
|
+
|
|
240
|
+
## Propriedades de PageIntro
|
|
241
|
+
|
|
242
|
+
| Propriedade | Tipo | Descrição |
|
|
243
|
+
| ----------- | ----------------------------- | ---------------------------------------------------------------- |
|
|
244
|
+
| `children` | `ReactNode` | Um `PageTitle` e, opcionalmente, descrição e ações da página. |
|
|
245
|
+
| `className` | `string` | Classes adicionais da região introdutória. |
|
|
246
|
+
| demais | Atributos de `HTMLDivElement` | Atributos nativos repassados à região introdutória. |
|
|
247
|
+
|
|
175
248
|
## Propriedades de PageHeader
|
|
176
249
|
|
|
177
250
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
@@ -202,7 +275,7 @@ estado na própria seção com `DataState`, `ActionView`, `ActionList` ou `Alert
|
|
|
202
275
|
|
|
203
276
|
| Propriedade | Tipo | Descrição |
|
|
204
277
|
| ----------- | --------------------------------- | ------------------------------------------------------ |
|
|
205
|
-
| `children` | `ReactNode` | Título principal `h1`; compacto na
|
|
278
|
+
| `children` | `ReactNode` | Título principal `h1`; compacto na barra e ampliado em `PageIntro`. |
|
|
206
279
|
| `className` | `string` | Classes adicionais do título. |
|
|
207
280
|
| demais | Atributos de `HTMLHeadingElement` | Atributos nativos repassados ao heading. |
|
|
208
281
|
|
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, descrição e ações
|
|
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, descrição 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; título e descrição formam PageIntro no conteúdo. Fora dele, a forma explícita escolhe PageHeader para o cabeçalho completo ou PageIntro para uma introdução sem navegação; `PageHeader variant=\"bar\"` atende uma página autocontida. PageActionsTarget fica restrito a workspaces imersivos sem PageShell. PageState oculta o header da Page isolada ou somente PageIntro dentro de PageShell. Para uma região disponível à criação ou vínculo, use Empty.",
|
|
404
404
|
},
|
|
405
405
|
router: {
|
|
406
406
|
name: "router",
|
package/src/ui/react.tsx
CHANGED
|
@@ -33,6 +33,7 @@ export type {
|
|
|
33
33
|
ChatMessage,
|
|
34
34
|
ChatArtifact,
|
|
35
35
|
ChatTranscriptItem,
|
|
36
|
+
ChatTranscriptMessage,
|
|
36
37
|
} from "./components/primitives/chat.tsx";
|
|
37
38
|
export { Ask } from "./components/primitives/ask.tsx";
|
|
38
39
|
export type { AskProps } from "./components/primitives/ask.tsx";
|
|
@@ -421,8 +422,10 @@ export type { DataStateProps } from "./components/patterns/data-state.tsx";
|
|
|
421
422
|
|
|
422
423
|
// Esqueleto de página do back-office (main + container + header título/descrição/ação).
|
|
423
424
|
export {
|
|
425
|
+
PageShell,
|
|
424
426
|
Page,
|
|
425
427
|
PageHeader,
|
|
428
|
+
PageIntro,
|
|
426
429
|
PageNavigation,
|
|
427
430
|
PageBack,
|
|
428
431
|
PageTitle,
|
|
@@ -433,6 +436,7 @@ export {
|
|
|
433
436
|
} from "./components/patterns/page.tsx";
|
|
434
437
|
export type {
|
|
435
438
|
PageProps,
|
|
439
|
+
PageShellProps,
|
|
436
440
|
PageBackProps,
|
|
437
441
|
PageHeaderProps,
|
|
438
442
|
PageHeaderVariant,
|