@softize/opus 18.0.1 → 18.1.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.
- package/CHANGELOG.md +105 -0
- package/PROMOTED.md +4 -5
- package/README.md +5 -4
- package/bin/cli.mjs +4 -0
- package/docs/adr/0004-page-content-state-is-composed.md +3 -0
- package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +6 -2
- package/docs/adr/0011-page-shell-coordinates-persistent-page-chrome.md +6 -1
- package/docs/adr/0014-structural-headers-do-not-carry-description.md +2 -2
- package/docs/adr/0015-action-size-follows-interaction-density.md +4 -3
- package/docs/adr/0017-ui-assumes-a-fixed-desktop-layout.md +54 -0
- package/docs/adr/{0012-modal-header-only-names-the-surface.md → 0018-modal-header-only-names-the-surface.md} +4 -1
- package/docs/adr/0019-productive-surfaces-use-compact-density.md +65 -0
- package/docs/code-style.md +2 -2
- package/docs/consumer-upgrade-propagation.md +1 -1
- package/docs/data-products.md +5 -3
- package/docs/protocol.md +6 -6
- package/docs/relative-unit-scale.md +9 -2
- package/docs/releasing.md +28 -4
- package/package.json +1 -1
- package/registry/skills/build-opus-ui/references/evaluations.md +3 -1
- package/registry/skills/build-opus-ui/references/ui-patterns.md +20 -4
- package/src/auth/drivers/jwt.ts +2 -1
- package/src/core/runtime.ts +32 -5
- package/src/core/types.ts +16 -7
- package/src/mcp/index.ts +13 -1
- package/src/ui/components/patterns/action-list-dialog.tsx +2 -2
- package/src/ui/components/patterns/content-header.tsx +2 -2
- package/src/ui/components/patterns/form-dialog.tsx +7 -2
- package/src/ui/components/patterns/form.tsx +1 -1
- package/src/ui/components/patterns/list.tsx +239 -47
- package/src/ui/components/patterns/presentation.tsx +7 -5
- package/src/ui/components/patterns/sidebar.tsx +1 -1
- package/src/ui/components/patterns/state-surface.tsx +2 -2
- package/src/ui/components/patterns/surface-header.tsx +4 -4
- package/src/ui/components/primitives/alert.tsx +2 -2
- package/src/ui/components/primitives/breadcrumb.tsx +1 -1
- package/src/ui/components/primitives/button-group.tsx +1 -1
- package/src/ui/components/primitives/button.tsx +3 -3
- package/src/ui/components/primitives/calendar.tsx +1 -1
- package/src/ui/components/primitives/card.tsx +1 -1
- package/src/ui/components/primitives/close-button.tsx +40 -0
- package/src/ui/components/primitives/detail.tsx +68 -30
- package/src/ui/components/primitives/dialog.tsx +36 -21
- package/src/ui/components/primitives/drawer.tsx +26 -19
- package/src/ui/components/primitives/empty-value.tsx +3 -3
- package/src/ui/components/primitives/empty.tsx +1 -1
- package/src/ui/components/primitives/field.tsx +12 -12
- package/src/ui/components/primitives/icon-picker.tsx +1 -1
- package/src/ui/components/primitives/input-group.tsx +1 -1
- package/src/ui/components/primitives/input.tsx +2 -2
- package/src/ui/components/primitives/item.tsx +5 -5
- package/src/ui/components/primitives/pagination.tsx +4 -4
- package/src/ui/components/primitives/radio-group.tsx +1 -1
- package/src/ui/components/primitives/select.tsx +3 -3
- package/src/ui/components/primitives/table.tsx +26 -17
- package/src/ui/components/primitives/tabs.tsx +80 -23
- package/src/ui/components/primitives/textarea.tsx +1 -1
- package/src/ui/components/primitives/toggle-group.tsx +9 -2
- package/src/ui/docs/content/action-form-dialog.md +11 -4
- package/src/ui/docs/content/action-form.md +13 -3
- package/src/ui/docs/content/action-list-dialog.md +5 -7
- package/src/ui/docs/content/action-list.md +53 -5
- package/src/ui/docs/content/action-trigger.md +9 -5
- package/src/ui/docs/content/action-view.md +12 -8
- package/src/ui/docs/content/actions.md +36 -13
- package/src/ui/docs/content/ai.md +26 -7
- package/src/ui/docs/content/alert.md +6 -3
- package/src/ui/docs/content/aspect-ratio.md +2 -2
- package/src/ui/docs/content/auth.md +25 -10
- package/src/ui/docs/content/avatar.md +1 -1
- package/src/ui/docs/content/badge.md +2 -2
- package/src/ui/docs/content/breadcrumb.md +3 -2
- package/src/ui/docs/content/button.md +33 -8
- package/src/ui/docs/content/calendar.md +1 -1
- package/src/ui/docs/content/card.md +1 -1
- package/src/ui/docs/content/carousel.md +14 -3
- package/src/ui/docs/content/chat.md +1 -1
- package/src/ui/docs/content/cli.md +13 -7
- package/src/ui/docs/content/command.md +34 -2
- package/src/ui/docs/content/composer.md +1 -1
- package/src/ui/docs/content/content.md +5 -4
- package/src/ui/docs/content/customization.md +12 -2
- package/src/ui/docs/content/cycle.md +7 -5
- package/src/ui/docs/content/data-state.md +6 -5
- package/src/ui/docs/content/data.md +3 -3
- package/src/ui/docs/content/detail.md +12 -10
- package/src/ui/docs/content/dialog.md +14 -7
- package/src/ui/docs/content/dictionary-value.md +1 -1
- package/src/ui/docs/content/dock.md +23 -2
- package/src/ui/docs/content/dot.md +0 -2
- package/src/ui/docs/content/drawer.md +7 -4
- package/src/ui/docs/content/empty-value.md +4 -4
- package/src/ui/docs/content/empty.md +1 -4
- package/src/ui/docs/content/events.md +1 -1
- package/src/ui/docs/content/field.md +21 -12
- package/src/ui/docs/content/getting-started.md +4 -2
- package/src/ui/docs/content/icon-picker.md +2 -2
- package/src/ui/docs/content/input-otp.md +2 -0
- package/src/ui/docs/content/input.md +2 -3
- package/src/ui/docs/content/item.md +6 -3
- package/src/ui/docs/content/kbd.md +2 -1
- package/src/ui/docs/content/mcp.md +10 -4
- package/src/ui/docs/content/menu.md +27 -0
- package/src/ui/docs/content/page.md +20 -6
- package/src/ui/docs/content/pagination.md +9 -2
- package/src/ui/docs/content/popover.md +2 -2
- package/src/ui/docs/content/presentation.md +48 -47
- package/src/ui/docs/content/progress.md +2 -6
- package/src/ui/docs/content/runtime.md +8 -5
- package/src/ui/docs/content/scheduler.md +1 -1
- package/src/ui/docs/content/select.md +13 -8
- package/src/ui/docs/content/sidebar.md +3 -2
- package/src/ui/docs/content/skeleton.md +1 -1
- package/src/ui/docs/content/slider.md +4 -4
- package/src/ui/docs/content/spinner.md +3 -3
- package/src/ui/docs/content/tabs.md +22 -12
- package/src/ui/docs/content/testing.md +4 -2
- package/src/ui/docs/content/toast.md +5 -6
- package/src/ui/docs/content/toggle.md +37 -0
- package/src/ui/docs/content/tokens.md +45 -2
- package/src/ui/docs/content/tooltip.md +4 -3
- package/src/ui/docs/content/truncate.md +3 -2
- package/src/ui/docs/content/ui.md +3 -1
- package/src/ui/docs/content/upgrading.md +43 -13
- package/src/ui/docs/doc-client.tsx +1 -1
- package/src/ui/docs/registry.tsx +30 -5
- package/src/ui/meta.ts +4 -4
- package/src/ui/react.tsx +1 -0
- package/src/ui/theme.css +3 -0
|
@@ -53,7 +53,7 @@ família oferece sólido, foreground, superfície sutil, ênfase e borda. Use as
|
|
|
53
53
|
```tsx preview
|
|
54
54
|
const CONTEXTS = ['neutral', 'primary', 'info', 'success', 'warning', 'danger']
|
|
55
55
|
render(
|
|
56
|
-
<div className="grid w-full
|
|
56
|
+
<div className="grid w-full grid-cols-3 gap-2">
|
|
57
57
|
{CONTEXTS.map((context) => (
|
|
58
58
|
<div
|
|
59
59
|
key={context}
|
|
@@ -79,7 +79,7 @@ render(
|
|
|
79
79
|
```tsx preview
|
|
80
80
|
const LINES = [
|
|
81
81
|
['border', 'Bordas de contêineres (cards, tabelas, separadores).'],
|
|
82
|
-
['input', 'Borda de campos de formulário.'],
|
|
82
|
+
['input', 'Borda e fundo sutil de campos de formulário.'],
|
|
83
83
|
['ring', 'O anel de foco (focus-visible).'],
|
|
84
84
|
]
|
|
85
85
|
render(
|
|
@@ -135,6 +135,49 @@ render(
|
|
|
135
135
|
> aplicação continuam responsáveis pela densidade. Uma aplicação pode ajustar `font-size` em
|
|
136
136
|
> `html`; texto, espaçamento, radius, foco e elevação acompanham a mesma decisão.
|
|
137
137
|
|
|
138
|
+
## Tipografia produtiva
|
|
139
|
+
|
|
140
|
+
Interfaces operacionais precisam acomodar controles, dados e ações sem transformar o corpo comum
|
|
141
|
+
em texto secundário. Use `text-sm` (`0.875rem`) como corpo produtivo: descrições curtas, valores,
|
|
142
|
+
rótulos e texto de componentes. Reserve `text-base` (`1rem`) para leitura mais confortável, como
|
|
143
|
+
prosa longa, conteúdo editorial ou uma ênfase que dependa de tamanho.
|
|
144
|
+
|
|
145
|
+
O tema não reduz o texto do `body`. Componentes e regiões produtivas declaram `text-sm`
|
|
146
|
+
explicitamente em uma raiz controlada, enquanto o texto geral do documento permanece em `1rem`.
|
|
147
|
+
Assim, escolher o corpo da interface não recalibra tipografia, espaçamento ou dimensões globais.
|
|
148
|
+
|
|
149
|
+
`base` nomeia o degrau de `1rem` da escala técnica; não significa que todo produto precisa usá-lo
|
|
150
|
+
como corpo predominante. Preserve a fonte raiz usual do documento para que `1rem` continue sendo a
|
|
151
|
+
referência do navegador e para que espaçamentos e controles em `rem` não mudem quando a intenção for
|
|
152
|
+
somente escolher um papel tipográfico.
|
|
153
|
+
|
|
154
|
+
A herança continua fazendo parte da composição. Declare `text-sm` na raiz de um componente ou de
|
|
155
|
+
uma região produtiva e omita a classe apenas nos filhos que herdam dessa raiz controlada. Um
|
|
156
|
+
elemento também declara `text-sm` quando precisa restaurar o corpo produtivo dentro de um contexto
|
|
157
|
+
com outro tamanho. Não crie um alias como `text-body`: ele esconderia o mesmo degrau sem eliminar
|
|
158
|
+
a necessidade de declarar o papel tipográfico.
|
|
159
|
+
|
|
160
|
+
```tsx preview
|
|
161
|
+
render(
|
|
162
|
+
<div className="space-y-3 text-sm">
|
|
163
|
+
<p>Corpo produtivo para a interface.</p>
|
|
164
|
+
<p className="text-base leading-relaxed">
|
|
165
|
+
Corpo ampliado para um trecho que pede leitura mais confortável.
|
|
166
|
+
</p>
|
|
167
|
+
<div className="text-xs text-muted-foreground">
|
|
168
|
+
Metadado compacto.
|
|
169
|
+
<p className="mt-1 text-sm text-foreground">
|
|
170
|
+
Corpo produtivo restaurado dentro do contexto compacto.
|
|
171
|
+
</p>
|
|
172
|
+
</div>
|
|
173
|
+
</div>,
|
|
174
|
+
)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Alterar `font-size` em `html` permanece válido quando a aplicação quer recalibrar **toda** a
|
|
178
|
+
interface. Essa decisão escala tipografia, espaços, controles, radius e elevação em conjunto; não é
|
|
179
|
+
o mecanismo para fazer `text-sm` se chamar `text-base`.
|
|
180
|
+
|
|
138
181
|
## Radius
|
|
139
182
|
|
|
140
183
|
> A escala mapeada no `@theme inline` preserva o sentido pré-v4 dos utilitários `rounded-*`
|
|
@@ -24,17 +24,18 @@ precisando de `aria-label`.
|
|
|
24
24
|
</Tooltip>
|
|
25
25
|
<Tooltip>
|
|
26
26
|
<TooltipTrigger asChild><Button variant="ghost">Direita</Button></TooltipTrigger>
|
|
27
|
-
<TooltipContent side="right">
|
|
27
|
+
<TooltipContent side="right">Abre à direita do botão.</TooltipContent>
|
|
28
28
|
</Tooltip>
|
|
29
29
|
<Tooltip>
|
|
30
30
|
<TooltipTrigger asChild><Button variant="ghost">Embaixo</Button></TooltipTrigger>
|
|
31
|
-
<TooltipContent side="bottom">
|
|
31
|
+
<TooltipContent side="bottom">Abre abaixo do botão.</TooltipContent>
|
|
32
32
|
</Tooltip>
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
## Provider na raiz
|
|
36
36
|
|
|
37
|
-
Monte um único `TooltipProvider` na raiz
|
|
37
|
+
Monte um único `TooltipProvider` na raiz do aplicativo. Ele é obrigatório: um `Tooltip` fora de um
|
|
38
|
+
provider lança erro. O provider também compartilha o atraso de exibição, então cada `Tooltip` não
|
|
38
39
|
precisa de um provider próprio.
|
|
39
40
|
|
|
40
41
|
```tsx
|
|
@@ -59,7 +59,8 @@ quando o texto completo ainda não oferecer contexto suficiente.
|
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
Requer `TooltipProvider` na raiz (o esqueleto do `opus create` já monta). Largura vem do
|
|
62
|
-
container ou de `className` (`max-w-*`) — o span é `block truncate
|
|
62
|
+
container ou de `className` (`max-w-*`) — o span é `block` e corta em reticências (`truncate`); com
|
|
63
|
+
`fade`, esmaece o fim da linha em vez das reticências.
|
|
63
64
|
|
|
64
65
|
## Propriedades de Truncate
|
|
65
66
|
|
|
@@ -67,4 +68,4 @@ container ou de `className` (`max-w-*`) — o span é `block truncate`.
|
|
|
67
68
|
|---|---|---|---|
|
|
68
69
|
| `tooltip` | `ReactNode` | os próprios `children` | Conteúdo da dica quando o texto transborda. |
|
|
69
70
|
| `fade` | `boolean` | `false` | Sinaliza o corte esmaecendo o fim da linha, no lugar das reticências. |
|
|
70
|
-
| `className` | `string` | | Largura (`max-w-*`) e demais ajustes; o span é `block truncate`. |
|
|
71
|
+
| `className` | `string` | | Largura (`max-w-*`) e demais ajustes; o span é `block`, com `truncate` fora do modo `fade`. |
|
|
@@ -24,10 +24,12 @@ para o aplicativo quando a API pública já atender ao caso.
|
|
|
24
24
|
```tsx
|
|
25
25
|
// Componentes e hooks — tudo do mesmo barrel.
|
|
26
26
|
import { Button, Dialog, useAction } from '@softize/opus/ui/react'
|
|
27
|
+
```
|
|
27
28
|
|
|
29
|
+
```css
|
|
28
30
|
/* index.css — o tema canônico + os componentes do Opus no scan do Tailwind. */
|
|
29
31
|
@import '@softize/opus/ui/theme.css';
|
|
30
|
-
@source '../node_modules/@softize/opus/src/ui';
|
|
32
|
+
@source '../node_modules/@softize/opus/src/ui/**/*.{ts,tsx}';
|
|
31
33
|
```
|
|
32
34
|
|
|
33
35
|
## Prebundle do Vite
|
|
@@ -10,10 +10,23 @@ gates apontam as adaptações necessárias no projeto.
|
|
|
10
10
|
## 1. Identificar a versão disponível
|
|
11
11
|
|
|
12
12
|
O **Maestro** compara o pin (`opus.json`) com a versão instalada e com a fonte a cada
|
|
13
|
-
sessão — o alerta no rodapé diz a distância (`
|
|
13
|
+
sessão — o alerta no rodapé diz a distância (`v18.0.1 → v18.1.0`) e o **Atualizar** faz
|
|
14
14
|
a parte mecânica: bump da dependência, re-materialização da camada de IA (skills,
|
|
15
|
-
hooks, agentes) e re-sync do bloco gerenciado do CLAUDE.md.
|
|
16
|
-
|
|
15
|
+
hooks, agentes) e re-sync do bloco gerenciado do CLAUDE.md.
|
|
16
|
+
|
|
17
|
+
Fora do Maestro, faça essa parte à mão:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm outdated @softize/opus # distância até a versão publicada
|
|
21
|
+
pnpm -r up @softize/opus@<versão> # em todo workspace que declara o Opus
|
|
22
|
+
pnpm run setup # opus setup && base setup: re-materializa base.json e skills
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Rode `setup` no diretório de cada app que tem `opus.json`; num monorepo criado por
|
|
26
|
+
`opus create --monorepo`, a raiz não tem esse script, e `pnpm -r run setup` alcança todos os apps.
|
|
27
|
+
O postinstall do pacote tenta materializar sozinho, mas é best-effort; se a camada materializada
|
|
28
|
+
ainda corresponder à versão anterior, o `opus check` aborta com
|
|
29
|
+
`base.json: Opus aplicado X, instalado Y`.
|
|
17
30
|
|
|
18
31
|
## 2. Ler as mudanças acumuladas
|
|
19
32
|
|
|
@@ -22,19 +35,36 @@ O changelog **viaja no pacote** — depois do bump, está em
|
|
|
22
35
|
a seção **Breaking** diz a migração (o que renomeou, o que fazer no seu código).
|
|
23
36
|
A esteira de release **recusa** publicar versão sem entrada — o arquivo não defasa.
|
|
24
37
|
|
|
25
|
-
- **minor** (
|
|
26
|
-
|
|
38
|
+
- **minor e patch** (18.0 → 18.1): leia todas as entradas intermediárias. Minors podem pedir ação,
|
|
39
|
+
como a troca de `PageHeader` por `PageIntro` no `PageShell` (17.2.0) ou o layout desktop fixo (18.1.0).
|
|
40
|
+
- **major** (17.x → 18.0): além disso, aplique as seções Breaking de cada versão pulada, na ordem.
|
|
27
41
|
|
|
28
42
|
## 3. Executar as verificações
|
|
29
43
|
|
|
30
|
-
O Opus
|
|
44
|
+
O Opus é publicado como código-fonte TypeScript: o que quebrou aparece com arquivo e linha.
|
|
45
|
+
Rode, na ordem:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pnpm typecheck # a API nova cobra os tipos
|
|
49
|
+
pnpm exec opus check # convenções (regras novas inclusas)
|
|
50
|
+
pnpm exec opus copy --check # inventário de copy em dia
|
|
51
|
+
pnpm exec base copy check # política de copy da base
|
|
52
|
+
pnpm test # comportamento
|
|
53
|
+
pnpm manifest:check # a spec projetada ficou fresca?
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Num monorepo, `typecheck` e `test` existem na raiz, mas `manifest:check` é script de cada app:
|
|
57
|
+
rode-o no diretório do app ou com `pnpm -r run manifest:check`. Nenhum desses comandos migra o
|
|
58
|
+
banco. Se o projeto tiver testes de integração, eles usam o banco que o próprio projeto configurar.
|
|
59
|
+
|
|
60
|
+
## 4. Migrar o banco, se houver
|
|
61
|
+
|
|
62
|
+
Se o `opus.config.ts` declara `database`, confira o schema e aplique a migração como uma etapa
|
|
63
|
+
separada, contra o banco do ambiente que você pretende alterar:
|
|
31
64
|
|
|
32
65
|
```bash
|
|
33
|
-
pnpm
|
|
34
|
-
pnpm exec opus
|
|
35
|
-
pnpm test # comportamento
|
|
36
|
-
pnpm manifest:check # a spec projetada ficou fresca?
|
|
37
|
-
opus db migrate # schema em dia (drift-check embutido)
|
|
66
|
+
pnpm exec opus db check # compara entidades e banco, sem escrever
|
|
67
|
+
pnpm exec opus db migrate # aplica o schema idempotente; escreve no banco
|
|
38
68
|
```
|
|
39
69
|
|
|
40
70
|
Com todas as verificações verdes, revise a atualização como qualquer outra mudança de código antes
|
|
@@ -42,6 +72,6 @@ de entregá-la.
|
|
|
42
72
|
|
|
43
73
|
## Pulou muitas versões?
|
|
44
74
|
|
|
45
|
-
O ritual não muda, só o volume: leia as
|
|
46
|
-
uma lista, não um diff), aplique na ordem e deixe os gates validarem o conjunto.
|
|
75
|
+
O ritual não muda, só o volume: leia todas as entradas acumuladas, não só as seções Breaking
|
|
76
|
+
(o changelog é uma lista, não um diff), aplique na ordem e deixe os gates validarem o conjunto.
|
|
47
77
|
Não há caminho especial — é o mesmo laço, com mais iterações.
|
|
@@ -105,7 +105,7 @@ export const docWorkspaceList = defineContract({
|
|
|
105
105
|
],
|
|
106
106
|
},
|
|
107
107
|
},
|
|
108
|
-
client: { label: 'Cliente', type: 'text',
|
|
108
|
+
client: { label: 'Cliente', type: 'text', placement: 'advanced' },
|
|
109
109
|
},
|
|
110
110
|
text: { fields: ['name'] },
|
|
111
111
|
sort: { fields: ['name'] },
|
package/src/ui/docs/registry.tsx
CHANGED
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
* helper `comp`; páginas conceituais renderizam o markdown direto (o próprio md traz o H1/lead).
|
|
12
12
|
*/
|
|
13
13
|
import { useEffect } from "react";
|
|
14
|
+
import {
|
|
15
|
+
definePresentation,
|
|
16
|
+
definePresentationInvocation,
|
|
17
|
+
} from "../../core/presentation.ts";
|
|
14
18
|
import * as lucideIcons from "lucide-react";
|
|
15
19
|
import * as opusUi from "../react.tsx";
|
|
16
20
|
import { componentMeta } from "../meta.ts";
|
|
@@ -154,7 +158,7 @@ export interface DocSection {
|
|
|
154
158
|
// o scope injetado entra POR CIMA do default no DocMarkdown, e `<Badge>` num exemplo
|
|
155
159
|
// tem que ser o COMPONENTE (chip), não o selo do lucide. Ícone colidido, se um exemplo
|
|
156
160
|
// precisar, entra por alias no scope do chamador.
|
|
157
|
-
const iconScope: Record<string, unknown> = Object.fromEntries(
|
|
161
|
+
export const iconScope: Record<string, unknown> = Object.fromEntries(
|
|
158
162
|
Object.entries(lucideIcons).filter(([name]) => !(name in opusUi)),
|
|
159
163
|
);
|
|
160
164
|
|
|
@@ -177,7 +181,7 @@ const comp =
|
|
|
177
181
|
);
|
|
178
182
|
|
|
179
183
|
/** O palco dos patterns no scope dos previews: ícones, cliente simulado e contratos de exemplo. */
|
|
180
|
-
const patternScope = {
|
|
184
|
+
export const patternScope = {
|
|
181
185
|
...iconScope,
|
|
182
186
|
DocBrowserActionProvider,
|
|
183
187
|
docWorkspaceCreate,
|
|
@@ -188,12 +192,28 @@ const patternScope = {
|
|
|
188
192
|
docSessionDelete,
|
|
189
193
|
};
|
|
190
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Palco da página de Presentation: o exemplo declara a própria Presentation sobre um contrato do
|
|
197
|
+
* palco, então precisa das funções de declaração além do palco dos patterns. Fora daqui elas não
|
|
198
|
+
* entram no scope — os demais previews consomem definições já prontas.
|
|
199
|
+
*/
|
|
200
|
+
export const presentationScope = {
|
|
201
|
+
...patternScope,
|
|
202
|
+
definePresentation,
|
|
203
|
+
definePresentationInvocation,
|
|
204
|
+
};
|
|
205
|
+
|
|
191
206
|
/** Página de pattern: igual ao `comp`, mas os previews enxergam o palco doc-client no scope. */
|
|
192
207
|
const pattern =
|
|
193
|
-
(
|
|
208
|
+
(
|
|
209
|
+
title: string,
|
|
210
|
+
key: keyof typeof componentMeta,
|
|
211
|
+
content: string,
|
|
212
|
+
scope: Record<string, unknown> = patternScope,
|
|
213
|
+
) =>
|
|
194
214
|
(): React.ReactElement => (
|
|
195
215
|
<DocPage title={title} meta={componentMeta[key]}>
|
|
196
|
-
<DocMarkdown content={content} scope={
|
|
216
|
+
<DocMarkdown content={content} scope={scope} />
|
|
197
217
|
</DocPage>
|
|
198
218
|
);
|
|
199
219
|
|
|
@@ -406,7 +426,12 @@ export const UI_SECTIONS: DocSection[] = [
|
|
|
406
426
|
{
|
|
407
427
|
slug: "presentation",
|
|
408
428
|
title: "Presentation",
|
|
409
|
-
render: pattern(
|
|
429
|
+
render: pattern(
|
|
430
|
+
"Presentation",
|
|
431
|
+
"presentation",
|
|
432
|
+
presentationMd,
|
|
433
|
+
presentationScope,
|
|
434
|
+
),
|
|
410
435
|
},
|
|
411
436
|
{
|
|
412
437
|
slug: "content",
|
package/src/ui/meta.ts
CHANGED
|
@@ -15,7 +15,7 @@ export const componentMeta = {
|
|
|
15
15
|
name: "content",
|
|
16
16
|
ancestry: "opus",
|
|
17
17
|
whenToUse:
|
|
18
|
-
"Organize uma região nomeada dentro de uma página ou de outra superfície. Use as propriedades de Content no caso comum e componha seus slots quando precisar controlar a estrutura.
|
|
18
|
+
"Organize uma região nomeada dentro de uma página ou de outra superfície. Use as propriedades de Content no caso comum e componha seus slots quando precisar controlar a estrutura. Numa página centrada em uma coleção, `level={1}` faz do Content o heading principal; nas demais, ele vem de PageTitle.",
|
|
19
19
|
},
|
|
20
20
|
ask: {
|
|
21
21
|
name: "ask",
|
|
@@ -153,7 +153,7 @@ export const componentMeta = {
|
|
|
153
153
|
name: "menu",
|
|
154
154
|
ancestry: "opus",
|
|
155
155
|
whenToUse:
|
|
156
|
-
'O menu de ações da casa: lista flutuante ancorada em um gatilho (Radix DropdownMenu). Compõe Menu > MenuTrigger + MenuContent e seus itens. `context="danger"` sinaliza item com consequência perigosa
|
|
156
|
+
'O menu de ações da casa: lista flutuante ancorada em um gatilho (Radix DropdownMenu). Compõe Menu > MenuTrigger + MenuContent e seus itens. `context="danger"` sinaliza item com consequência perigosa. Para escolher um valor, use Select; para busca por teclado, Command; para conteúdo livre ancorado, Popover.',
|
|
157
157
|
},
|
|
158
158
|
popover: {
|
|
159
159
|
name: "popover",
|
|
@@ -189,7 +189,7 @@ export const componentMeta = {
|
|
|
189
189
|
name: "table",
|
|
190
190
|
ancestry: "shadcn",
|
|
191
191
|
whenToUse:
|
|
192
|
-
'Tabela de dados. Compõe Table > (TableHeader > TableRow > TableHead, TableBody > TableRow > TableCell). `variant="plain"` vem sem borda externa; `variant="framed"` aplica a moldura canônica, recorta o scroll e destaca o cabeçalho. Para
|
|
192
|
+
'Tabela de dados. Compõe Table > (TableHeader > TableRow > TableHead, TableBody > TableRow > TableCell). `variant="plain"` vem sem borda externa; `variant="framed"` aplica a moldura canônica, recorta o scroll e destaca o cabeçalho. Para uma coleção com busca, filtros e paginação, use ActionList.',
|
|
193
193
|
},
|
|
194
194
|
tabs: {
|
|
195
195
|
name: "tabs",
|
|
@@ -279,7 +279,7 @@ export const componentMeta = {
|
|
|
279
279
|
name: "field",
|
|
280
280
|
ancestry: "shadcn",
|
|
281
281
|
whenToUse:
|
|
282
|
-
"Componha rótulo, controle, ajuda e erro com espaçamento consistente. Use a orientação vertical no caso comum e
|
|
282
|
+
"Componha rótulo, controle, ajuda e erro com espaçamento consistente. Use a orientação vertical no caso comum e a horizontal quando controle e texto precisarem ficar lado a lado; `responsive` continua aceito como alias da horizontal. Field cuida do layout; o formulário continua responsável por estado e validação.",
|
|
283
283
|
},
|
|
284
284
|
"input-otp": {
|
|
285
285
|
name: "input-otp",
|
package/src/ui/react.tsx
CHANGED
package/src/ui/theme.css
CHANGED