@softize/opus 12.11.0 → 13.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 +29 -0
- package/bin/lib/check.mjs +2 -7
- package/bin/lib/copy.mjs +1 -5
- package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +93 -10
- package/docs/adr/0007-toast-actions-form-an-ordered-collection.md +63 -0
- package/docs/adr/0008-hierarchical-navigation-is-composed-at-the-consumer-boundary.md +71 -0
- package/docs/radius-scale.md +1 -1
- package/package.json +1 -1
- package/registry/skills/maintain-opus-docs/SKILL.md +83 -0
- package/registry/skills/maintain-opus-docs/agents/openai.yaml +4 -0
- package/registry/skills/maintain-opus-docs/references/editorial-standard.md +85 -0
- package/registry/skills/maintain-opus-docs/references/evaluations.md +34 -0
- package/registry/skills/maintain-opus-docs/scripts/audit-docs.mjs +81 -0
- package/src/ui/components/patterns/confirm.tsx +140 -40
- package/src/ui/components/patterns/list.tsx +35 -40
- package/src/ui/components/patterns/page-state.tsx +2 -2
- package/src/ui/components/patterns/sidebar.tsx +26 -26
- package/src/ui/components/patterns/trigger.tsx +25 -22
- package/src/ui/components/primitives/alert.tsx +3 -3
- package/src/ui/components/primitives/dialog.tsx +196 -39
- package/src/ui/components/primitives/drawer.tsx +8 -5
- package/src/ui/components/primitives/empty.tsx +3 -3
- package/src/ui/components/primitives/item.tsx +3 -3
- package/src/ui/components/primitives/sonner.tsx +187 -8
- package/src/ui/docs/DocBrowser.tsx +102 -23
- package/src/ui/docs/content/accordion.md +22 -16
- package/src/ui/docs/content/action-form-card.md +8 -8
- package/src/ui/docs/content/action-form-dialog.md +9 -9
- package/src/ui/docs/content/action-form.md +28 -34
- package/src/ui/docs/content/action-list-dialog.md +11 -6
- package/src/ui/docs/content/action-list.md +64 -39
- package/src/ui/docs/content/action-trigger.md +21 -14
- package/src/ui/docs/content/action-view.md +8 -8
- package/src/ui/docs/content/actions.md +9 -9
- package/src/ui/docs/content/ai.md +3 -3
- package/src/ui/docs/content/alert.md +14 -12
- package/src/ui/docs/content/aspect-ratio.md +4 -4
- package/src/ui/docs/content/audit.md +2 -2
- package/src/ui/docs/content/auth.md +3 -3
- package/src/ui/docs/content/avatar.md +34 -14
- package/src/ui/docs/content/badge.md +3 -3
- package/src/ui/docs/content/breadcrumb.md +13 -8
- package/src/ui/docs/content/button.md +81 -6
- package/src/ui/docs/content/calendar.md +5 -5
- package/src/ui/docs/content/card.md +1 -1
- package/src/ui/docs/content/carousel.md +16 -11
- package/src/ui/docs/content/chat.md +3 -3
- package/src/ui/docs/content/checkbox.md +7 -7
- package/src/ui/docs/content/cli.md +5 -5
- package/src/ui/docs/content/collapsible.md +8 -8
- package/src/ui/docs/content/command.md +16 -8
- package/src/ui/docs/content/composer.md +2 -2
- package/src/ui/docs/content/content.md +2 -2
- package/src/ui/docs/content/copyable.md +4 -3
- package/src/ui/docs/content/customization.md +5 -5
- package/src/ui/docs/content/cycle.md +3 -3
- package/src/ui/docs/content/data-state.md +11 -12
- package/src/ui/docs/content/data.md +26 -33
- package/src/ui/docs/content/detail.md +3 -3
- package/src/ui/docs/content/dialog.md +339 -31
- package/src/ui/docs/content/dictionary-value.md +8 -8
- package/src/ui/docs/content/dock.md +3 -3
- package/src/ui/docs/content/drawer.md +27 -14
- package/src/ui/docs/content/empty-value.md +2 -2
- package/src/ui/docs/content/empty.md +19 -12
- package/src/ui/docs/content/events.md +4 -4
- package/src/ui/docs/content/field.md +34 -12
- package/src/ui/docs/content/getting-started.md +1 -1
- package/src/ui/docs/content/icon-picker.md +8 -4
- package/src/ui/docs/content/input-otp.md +20 -12
- package/src/ui/docs/content/input.md +121 -9
- package/src/ui/docs/content/item.md +27 -13
- package/src/ui/docs/content/kbd.md +19 -11
- package/src/ui/docs/content/label.md +5 -3
- package/src/ui/docs/content/log.md +4 -4
- package/src/ui/docs/content/markdown.md +7 -6
- package/src/ui/docs/content/mcp.md +13 -15
- package/src/ui/docs/content/menu.md +34 -16
- package/src/ui/docs/content/observability.md +2 -2
- package/src/ui/docs/content/page.md +51 -6
- package/src/ui/docs/content/pagination.md +22 -17
- package/src/ui/docs/content/popover.md +16 -8
- package/src/ui/docs/content/progress.md +7 -5
- package/src/ui/docs/content/queue.md +5 -5
- package/src/ui/docs/content/radio-group.md +20 -12
- package/src/ui/docs/content/router.md +11 -6
- package/src/ui/docs/content/scheduler.md +4 -5
- package/src/ui/docs/content/scroll-area.md +12 -7
- package/src/ui/docs/content/select.md +42 -29
- package/src/ui/docs/content/separator.md +5 -5
- package/src/ui/docs/content/sidebar.md +323 -54
- package/src/ui/docs/content/skeleton.md +3 -2
- package/src/ui/docs/content/slider.md +8 -7
- package/src/ui/docs/content/spinner.md +8 -8
- package/src/ui/docs/content/split.md +8 -5
- package/src/ui/docs/content/storage.md +6 -8
- package/src/ui/docs/content/switch.md +8 -7
- package/src/ui/docs/content/table.md +13 -3
- package/src/ui/docs/content/tabs.md +28 -14
- package/src/ui/docs/content/testing.md +9 -11
- package/src/ui/docs/content/textarea.md +5 -4
- package/src/ui/docs/content/toast.md +47 -13
- package/src/ui/docs/content/toggle.md +75 -7
- package/src/ui/docs/content/tokens.md +3 -3
- package/src/ui/docs/content/tooltip.md +19 -11
- package/src/ui/docs/content/truncate.md +7 -8
- package/src/ui/docs/content/ui.md +10 -9
- package/src/ui/docs/content/upgrading.md +7 -8
- package/src/ui/docs/registry.tsx +20 -37
- package/src/ui/meta.ts +64 -94
- package/src/ui/react.tsx +15 -16
- package/src/ui/theme.css +50 -0
- package/src/ui/components/primitives/alert-dialog.tsx +0 -192
- package/src/ui/docs/content/alert-dialog.md +0 -73
- package/src/ui/docs/content/button-group.md +0 -71
- package/src/ui/docs/content/confirm.md +0 -120
- package/src/ui/docs/content/input-group.md +0 -79
- package/src/ui/docs/content/page-state.md +0 -45
- package/src/ui/docs/content/toggle-group.md +0 -81
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,35 @@ 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
|
+
## 13.0.0 — 2026-09-07
|
|
11
|
+
|
|
12
|
+
Dialogs passam a formar uma única família. `Dialog mode="alert"` oferece a semântica de
|
|
13
|
+
`alertdialog`, exige uma resposta explícita e compartilha conteúdo, cabeçalho, mídia, corpo e rodapé
|
|
14
|
+
com o modo padrão. `DialogClose` pode declarar `result` e foco inicial, enquanto `Dialog.onResult`
|
|
15
|
+
recebe a escolha. A API imperativa mantém `alert`, `confirm` e `prompt` e acrescenta
|
|
16
|
+
`dialog.choose({ actions })` para uma ou mais respostas nomeadas.
|
|
17
|
+
|
|
18
|
+
Alerts, toasts, itens, estados vazios, dialogs e drawers alinham mídia e ações pela mesma anatomia.
|
|
19
|
+
Molduras de ícone permanecem quadradas mesmo com descrições em várias linhas; ações ficam na região
|
|
20
|
+
final da superfície e usam `Button` explicitamente. Toast aceita uma coleção ordenada em `actions`,
|
|
21
|
+
com a última ação destacada por padrão. Drawer aproxima cabeçalho, corpo e rodapé do enquadramento de
|
|
22
|
+
Dialog. Tabelas ganham respiro consistente, cabeçalhos muted e representação muted para valores
|
|
23
|
+
ausentes. `Page` passa a usar teto padrão de `80rem`, e `SidebarTreeGroup` incorpora a guia visual
|
|
24
|
+
para navegação hierárquica.
|
|
25
|
+
|
|
26
|
+
A documentação publicada foi reorganizada por famílias de uso. Button Group, Input Group, Toggle
|
|
27
|
+
Group e Page State passam a viver nas páginas dos componentes que os contextualizam, cada API com
|
|
28
|
+
sua própria referência de propriedades. Dialog reúne os modos declarativo e imperativo, Sidebar
|
|
29
|
+
documenta composição em árvore, e as categorias do catálogo ganham ícones próprios. A nova skill
|
|
30
|
+
`maintain-opus-docs` registra o padrão editorial e os gates usados para manter esse catálogo.
|
|
31
|
+
|
|
32
|
+
**Breaking:** os exports `AlertDialog*` foram removidos. Troque a raiz por
|
|
33
|
+
`<Dialog mode="alert">`, os demais slots pelos equivalentes `Dialog*` e componha cada ação como
|
|
34
|
+
`<DialogClose asChild><Button>…</Button></DialogClose>`. Para distinguir respostas, declare
|
|
35
|
+
`result` em `DialogClose` e trate o valor em `Dialog.onResult`. Os campos `action` e `cancel` de
|
|
36
|
+
Toast também foram removidos; use `actions`. `EmptyContent` foi removido; use `EmptyActions`.
|
|
37
|
+
`SidebarNavGroup.subgroups` deixa de existir: componha níveis adicionais com `SidebarTreeGroup`.
|
|
38
|
+
|
|
10
39
|
## 12.11.0 — 2026-09-04
|
|
11
40
|
|
|
12
41
|
A UI passa a separar intenção semântica de tratamento visual. `context` aceita `neutral`,
|
package/bin/lib/check.mjs
CHANGED
|
@@ -125,6 +125,7 @@ const UI_STRUCTURAL_PARENTS = new Map([
|
|
|
125
125
|
["DialogHeader", new Set(["DialogContent"])],
|
|
126
126
|
["DialogBody", new Set(["DialogContent"])],
|
|
127
127
|
["DialogFooter", new Set(["DialogContent"])],
|
|
128
|
+
["DialogMedia", new Set(["DialogHeader"])],
|
|
128
129
|
["DialogTitle", new Set(["DialogHeader"])],
|
|
129
130
|
["DialogDescription", new Set(["DialogHeader"])],
|
|
130
131
|
["DrawerHeader", new Set(["DrawerContent"])],
|
|
@@ -149,15 +150,11 @@ const UI_STRUCTURAL_PARENTS = new Map([
|
|
|
149
150
|
["ItemTitle", new Set(["ItemHeader"])],
|
|
150
151
|
["ItemDescription", new Set(["ItemHeader"])],
|
|
151
152
|
["EmptyHeader", new Set(["Empty"])],
|
|
153
|
+
["EmptyActions", new Set(["Empty"])],
|
|
152
154
|
["EmptyContent", new Set(["Empty"])],
|
|
153
155
|
["EmptyMedia", new Set(["EmptyHeader"])],
|
|
154
156
|
["EmptyTitle", new Set(["EmptyHeader"])],
|
|
155
157
|
["EmptyDescription", new Set(["EmptyHeader"])],
|
|
156
|
-
["AlertDialogHeader", new Set(["AlertDialogContent"])],
|
|
157
|
-
["AlertDialogFooter", new Set(["AlertDialogContent"])],
|
|
158
|
-
["AlertDialogMedia", new Set(["AlertDialogHeader"])],
|
|
159
|
-
["AlertDialogTitle", new Set(["AlertDialogHeader"])],
|
|
160
|
-
["AlertDialogDescription", new Set(["AlertDialogHeader"])],
|
|
161
158
|
["PopoverHeader", new Set(["PopoverContent"])],
|
|
162
159
|
["PopoverTitle", new Set(["PopoverHeader"])],
|
|
163
160
|
["PopoverDescription", new Set(["PopoverHeader"])],
|
|
@@ -296,8 +293,6 @@ const UI_LEGACY_VARIANTS = new Map([
|
|
|
296
293
|
["MetricCard", new Set()],
|
|
297
294
|
["MenuItem", new Set(["default", "destructive"])],
|
|
298
295
|
["ActionTrigger", new Set(["default", "secondary", "destructive"])],
|
|
299
|
-
["AlertDialogAction", new Set(["default", "secondary", "destructive"])],
|
|
300
|
-
["AlertDialogCancel", new Set(["default", "secondary", "destructive"])],
|
|
301
296
|
]);
|
|
302
297
|
|
|
303
298
|
/** Os três nomes que denotam action/contrato — o arquivo sem nenhum deles é pulado. */
|
package/bin/lib/copy.mjs
CHANGED
|
@@ -71,10 +71,6 @@ const JSX_CHILD_ROLES = new Map([
|
|
|
71
71
|
['ActionFormCard', 'message'],
|
|
72
72
|
['ActionFormDialog', 'message'],
|
|
73
73
|
['AlertDescription', 'message'],
|
|
74
|
-
['AlertDialogAction', 'button'],
|
|
75
|
-
['AlertDialogCancel', 'button'],
|
|
76
|
-
['AlertDialogDescription', 'dialog-body'],
|
|
77
|
-
['AlertDialogTitle', 'title'],
|
|
78
74
|
['AlertTitle', 'title'],
|
|
79
75
|
['Badge', 'badge'],
|
|
80
76
|
['BreadcrumbLink', 'breadcrumb'],
|
|
@@ -215,7 +211,7 @@ const JSX_PROP_STYLE = new Map([
|
|
|
215
211
|
])
|
|
216
212
|
|
|
217
213
|
const JSX_PORTAL_BOUNDARIES = new Set([
|
|
218
|
-
'
|
|
214
|
+
'DialogContent', 'DrawerContent', 'MenuContent', 'MenuSubContent',
|
|
219
215
|
'PopoverContent', 'TooltipContent',
|
|
220
216
|
])
|
|
221
217
|
|
|
@@ -30,6 +30,9 @@ As superfícies mantidas pela casa adotam a gramática `Root > Header + Body + F
|
|
|
30
30
|
- `Dialog` permanece como referência porque já possui `DialogHeader` e `DialogBody`.
|
|
31
31
|
- `Alert` oferece `AlertMedia`, `AlertHeader`, `AlertTitle`, `AlertDescription` e
|
|
32
32
|
`AlertActions`; a forma curta por propriedades materializa esses mesmos slots.
|
|
33
|
+
- `Empty` oferece `EmptyHeader`, `EmptyMedia`, `EmptyTitle`, `EmptyDescription` e
|
|
34
|
+
`EmptyActions`. `EmptyContent` permaneceu como alias legado durante a versão 12 e foi removido na
|
|
35
|
+
versão 13.
|
|
33
36
|
- `Item` oferece `ItemMedia`, `ItemHeader`, `ItemTitle`, `ItemDescription`, `ItemBody`,
|
|
34
37
|
`ItemActions` e `ItemFooter`. `ItemContent` permanece temporariamente como alias legado de
|
|
35
38
|
corpo, mas deixa de envolver título e descrição no código novo.
|
|
@@ -44,13 +47,49 @@ explícita usa os slots da família.
|
|
|
44
47
|
|
|
45
48
|
`Content` técnico mantém seu nome quando representa o contêiner montado por uma primitiva ou um
|
|
46
49
|
painel controlado, como `DialogContent`, `PopoverContent`, `TabsContent` e `AccordionContent`.
|
|
47
|
-
`
|
|
48
|
-
superfície estrutural.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
`CarouselContent` também permanece porque representa o trilho técnico da primitiva, não o body de
|
|
51
|
+
uma superfície estrutural. No `Empty`, a antiga região `EmptyContent` não é um body: como contém
|
|
52
|
+
somente comandos, seu nome canônico passa a ser `EmptyActions`.
|
|
53
|
+
|
|
54
|
+
As superfícies modais centralizadas pertencem a uma única família pública, `Dialog`. O modo padrão
|
|
55
|
+
permite tarefas e conteúdo dispensáveis; `mode="alert"` exige uma resposta explícita e seleciona
|
|
56
|
+
internamente a primitiva que emite `role="alertdialog"`, prende o foco e impede o fechamento pelo
|
|
57
|
+
clique externo. O comportamento determina o papel de acessibilidade: `role` não é usado como chave
|
|
58
|
+
de configuração. A família pública `AlertDialog` deixa de existir, enquanto os métodos imperativos
|
|
59
|
+
`dialog.alert`, `dialog.confirm`, `dialog.prompt` e `dialog.choose` usam `Dialog mode="alert"`.
|
|
60
|
+
|
|
61
|
+
Os dois modos usam o fundo base e o texto de primeiro plano, delimitados por borda semântica, raio
|
|
62
|
+
`xl` e elevação. A anatomia interna continua responsável pelo espaçamento de cabeçalho, corpo e
|
|
63
|
+
rodapé. O fundo base preserva o contraste com faixas internas, enquanto a borda torna o limite do
|
|
64
|
+
modal reconhecível mesmo quando a página usa o mesmo fundo. No modo de alerta, `DialogMedia`
|
|
65
|
+
oferece a moldura quadrada de mídia e o header e o footer adotam a composição compacta da resposta.
|
|
66
|
+
|
|
67
|
+
`Drawer` preserva a moldura externa ancorada à borda da janela, mas compartilha com `Dialog` as
|
|
68
|
+
faixas internas: o header recebe divisor inferior, o footer recebe divisor superior sobre fundo
|
|
69
|
+
sutil e o body mantém o mesmo alinhamento horizontal. Essa aproximação não adiciona raio nem borda
|
|
70
|
+
ao lado preso à janela.
|
|
71
|
+
|
|
72
|
+
Primitives comportamentais não escolhem a aparência do controle. `DialogClose` e `DrawerClose`
|
|
73
|
+
aplicam fechamento ao filho; `Button` define contexto, variante, tamanho e o efeito do clique. Em
|
|
74
|
+
`Dialog mode="alert"`, `DialogClose initialFocus` marca a saída segura sem dividir fechamentos entre
|
|
75
|
+
action e cancel. `result` identifica uma resposta para `Dialog onResult` quando o consumidor precisa
|
|
76
|
+
observá-la. A composição com `asChild` mantém o elemento interativo único e torna a mesma regra
|
|
77
|
+
previsível em diálogos comuns, drawers e diálogos que exigem resposta.
|
|
78
|
+
|
|
79
|
+
A API imperativa mantém contratos semânticos curtos para reconhecimento, confirmação binária e
|
|
80
|
+
entrada textual. Para escolhas simples com mais resultados, `dialog.choose` recebe uma coleção de
|
|
81
|
+
ações e devolve a união dos valores de `result`, ou `null` quando a superfície fecha sem escolha.
|
|
82
|
+
A coleção exige um único `initialFocus` habilitado e resultados únicos. Composição JSX permanece
|
|
83
|
+
para fluxos cujo carregamento, validação, erro ou estado controlado precisa existir dentro do modal.
|
|
84
|
+
|
|
85
|
+
Nas superfícies horizontais, `Media` e `Header` formam a mesma linha estrutural. Quando `Media`
|
|
86
|
+
desenha uma moldura para ícone ou imagem, ela mantém largura e altura iguais e fica alinhada ao
|
|
87
|
+
topo. O conteúdo textual determina naturalmente a altura da linha sem transformar a mídia em um
|
|
88
|
+
retângulo quando a descrição ocupa mais linhas.
|
|
89
|
+
|
|
90
|
+
Nas superfícies de feedback, `Actions` se alinha ao fim lógico da área útil e permanece centralizado
|
|
91
|
+
verticalmente na mesma linha do conteúdo. `Alert` e `Toast` compartilham essa posição; descrições
|
|
92
|
+
longas ocupam o espaço restante e quebram linha sem deslocar as ações para o rodapé.
|
|
54
93
|
|
|
55
94
|
## Consequências
|
|
56
95
|
|
|
@@ -60,11 +99,14 @@ moldura; conteúdo textual maior continua determinando naturalmente a altura da
|
|
|
60
99
|
slots e `opus check` verifica a anatomia JSX completa. Nas famílias históricas, o lint reconhece
|
|
61
100
|
wrappers transparentes e render props: reprova uma família visivelmente errada sem proibir que
|
|
62
101
|
um slot seja encapsulado por um componente reutilizável.
|
|
63
|
-
- Aliases históricos
|
|
102
|
+
- Aliases históricos podem permanecer durante uma janela de migração e ser removidos numa versão
|
|
103
|
+
major; a versão 13 remove `EmptyContent` e mantém os demais aliases até uma decisão específica.
|
|
64
104
|
- Consumidores precisam migrar `ContentHeader` solto para `Content` e podem migrar as demais formas
|
|
65
105
|
gradualmente enquanto os aliases existirem.
|
|
66
106
|
- Alertas e itens simples ganham uma hierarquia igual sem perder suas semânticas distintas:
|
|
67
107
|
`Alert` comunica estado e `Item` representa uma entidade ou opção numa coleção.
|
|
108
|
+
- Diálogos comuns e diálogos que exigem resposta compartilham nome, anatomia e moldura visual;
|
|
109
|
+
consumidores escolhem a diferença comportamental com `mode`, sem reconstruir a superfície.
|
|
68
110
|
|
|
69
111
|
## Alternativas consideradas
|
|
70
112
|
|
|
@@ -84,6 +126,39 @@ Nomes como `SectionHeader` pressupõem outro pai; nomes como `GenericHeader` des
|
|
|
84
126
|
semântica; e `HeadingBlock` abandona a gramática das demais famílias. Foi descartada em favor de
|
|
85
127
|
dar a `ContentHeader` um pai estrutural real.
|
|
86
128
|
|
|
129
|
+
### Manter `DialogContent` como card sem borda
|
|
130
|
+
|
|
131
|
+
Preservaria a diferença histórica entre `Dialog` e o antigo `AlertDialog`, mas faria superfícies com a mesma
|
|
132
|
+
função modal responderem a fundos e limites diferentes. Foi descartada porque essa diferença não
|
|
133
|
+
representa comportamento distinto e pode reduzir a percepção do contorno sobre páginas com fundo
|
|
134
|
+
semelhante.
|
|
135
|
+
|
|
136
|
+
### Manter `AlertDialog` como família pública separada
|
|
137
|
+
|
|
138
|
+
Espelharia diretamente as duas primitives do Radix, mas duplicaria nomes estruturais e faria a API
|
|
139
|
+
pública expressar um detalhe de implementação. Foi descartada porque `mode="alert"` preserva a
|
|
140
|
+
semântica e as garantias comportamentais sem obrigar quem consome a reaprender outra família.
|
|
141
|
+
|
|
142
|
+
### Usar `role="alertdialog"` para selecionar o comportamento
|
|
143
|
+
|
|
144
|
+
Seguiria a API de alguns design systems, mas transformaria um atributo de acessibilidade em chave de
|
|
145
|
+
comportamento, algo que o restante do Opus não faz. Foi descartada para que o `mode` selecione as
|
|
146
|
+
garantias e o componente derive o `role` correto.
|
|
147
|
+
|
|
148
|
+
### Expor action e cancel como primitives distintos no diálogo de alerta
|
|
149
|
+
|
|
150
|
+
Preservaria os nomes do Radix, mas apresentaria um fechamento como “action” embora cancelar também
|
|
151
|
+
seja uma ação. Os dois caminhos fecham a superfície; a única diferença técnica relevante é o
|
|
152
|
+
registro do destino inicial do foco. Foi descartada em favor de `DialogClose`, cuja propriedade
|
|
153
|
+
`initialFocus` expressa essa diferença sem criar duas categorias públicas.
|
|
154
|
+
|
|
155
|
+
### Exigir composição JSX para toda escolha com mais de duas ações
|
|
156
|
+
|
|
157
|
+
Manteria a API imperativa menor, mas obrigaria cada consumidor a reconstruir fila, fechamento,
|
|
158
|
+
foco seguro e resolução para uma escolha sem estado próprio. Foi descartada porque `dialog.choose`
|
|
159
|
+
consegue preservar essas garantias e devolver um resultado tipado sem absorver formulários ou ações
|
|
160
|
+
assíncronas que precisam manter o modal aberto.
|
|
161
|
+
|
|
87
162
|
## Verificação
|
|
88
163
|
|
|
89
164
|
- Testes de UI comparam DOM, acessibilidade e `data-slot` das formas curta e explícita.
|
|
@@ -91,7 +166,15 @@ dar a `ContentHeader` um pai estrutural real.
|
|
|
91
166
|
família correspondente; essa relação entre elementos JSX não é representável somente pelo tipo
|
|
92
167
|
de `children` do React.
|
|
93
168
|
- `opus check` reprova relações JSX estruturais inválidas nos consumidores.
|
|
94
|
-
- Testes de layout verificam que `AlertMedia` e `ItemMedia`
|
|
95
|
-
|
|
169
|
+
- Testes de layout verificam que `AlertMedia` e `ItemMedia` mantêm molduras quadradas alinhadas ao
|
|
170
|
+
topo, sem fixar a altura do conteúdo textual.
|
|
171
|
+
- Testes de estrutura verificam que os dois modos de `DialogContent` usam fundo base, texto de
|
|
172
|
+
primeiro plano, borda semântica, raio e elevação, sem retornar ao fundo de card.
|
|
173
|
+
- Testes do `Drawer` verificam divisores, fundo do footer e alinhamento de padding entre header,
|
|
174
|
+
body e footer.
|
|
175
|
+
- Testes de estrutura verificam que `DialogClose` não materializa `Button`, usa `result` somente como
|
|
176
|
+
resposta e aplica `initialFocus` à primitive que registra a saída segura no modo de alerta.
|
|
177
|
+
- Testes do host verificam inferência dos resultados de `dialog.choose`, foco seguro, defaults
|
|
178
|
+
visuais, escolha explícita, fechamento sem escolha e entradas inválidas.
|
|
96
179
|
- Documentação e metadados apresentam a forma curta como caminho comum e a composição explícita
|
|
97
180
|
como caminho de extensão.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# ADR 0007 — Ações de Toast formam uma coleção ordenada
|
|
2
|
+
|
|
3
|
+
- Status: aceita
|
|
4
|
+
- Data: 2026-09-05
|
|
5
|
+
|
|
6
|
+
## Contexto
|
|
7
|
+
|
|
8
|
+
O Opus exportava diretamente a API do Sonner, que distingue uma ação principal (`action`) de uma
|
|
9
|
+
ação especializada de cancelamento (`cancel`). Essa divisão expõe uma decisão da dependência na API
|
|
10
|
+
da casa e força uma semântica que não existe em toda notificação. Os demais componentes do Opus
|
|
11
|
+
tratam ações como uma região ordenada, enquanto contexto e variante descrevem a hierarquia visual.
|
|
12
|
+
|
|
13
|
+
A compatibilidade importa porque consumidores da versão 12 já podem usar os campos do Sonner. Ao
|
|
14
|
+
mesmo tempo, manter os dois formatos indefinidamente deixaria a API ambígua e impediria que o Opus
|
|
15
|
+
controlasse composição, estilos e comportamento de forma consistente.
|
|
16
|
+
|
|
17
|
+
## Decisão
|
|
18
|
+
|
|
19
|
+
O contrato canônico de Toast passa a aceitar `actions`, uma coleção ordenada de `ToastAction`.
|
|
20
|
+
Cada entrada declara `label`, `onClick` e, quando necessário, `context`, `variant`, `disabled` e uma
|
|
21
|
+
chave React. As ações são renderizadas com `Button size="sm"`: a última usa `primary + solid` por
|
|
22
|
+
padrão e as anteriores usam `neutral + ghost`.
|
|
23
|
+
|
|
24
|
+
Depois do handler, o Toast fecha, salvo quando o evento chama `preventDefault()`. `actions` não
|
|
25
|
+
pode ser combinado com os campos antigos `action` ou `cancel`.
|
|
26
|
+
|
|
27
|
+
`action` e `cancel` permaneceram aceitos e marcados como obsoletos durante a versão 12. A versão 13
|
|
28
|
+
remove esses campos e a estilização de compatibilidade. Os consumidores dependem do contrato do
|
|
29
|
+
Opus, sem expor a divisão especializada do Sonner.
|
|
30
|
+
|
|
31
|
+
## Consequências
|
|
32
|
+
|
|
33
|
+
- Uma notificação pode ter zero, uma ou mais ações sem inventar um papel de cancelamento.
|
|
34
|
+
- A ordem da coleção comunica hierarquia e mantém o destaque principal no final, como nas demais
|
|
35
|
+
regiões de ação.
|
|
36
|
+
- Consumidores da versão 12 tiveram uma janela de migração antes da remoção dos campos obsoletos.
|
|
37
|
+
- `toast.promise` continua seguindo o contrato próprio do Sonner nesta etapa; a coleção canônica se
|
|
38
|
+
aplica aos disparos simples e tipados por estado.
|
|
39
|
+
|
|
40
|
+
## Alternativas consideradas
|
|
41
|
+
|
|
42
|
+
### Manter `action` e `cancel`
|
|
43
|
+
|
|
44
|
+
Preservaria a API da dependência, mas manteria uma distinção semântica artificial e impediria uma
|
|
45
|
+
composição uniforme. Foi descartada como contrato canônico.
|
|
46
|
+
|
|
47
|
+
### Remover os campos antigos imediatamente
|
|
48
|
+
|
|
49
|
+
Produziria uma API menor, mas quebraria consumidores dentro da mesma versão principal. Foi
|
|
50
|
+
descartada em favor de uma janela explícita de migração.
|
|
51
|
+
|
|
52
|
+
### Aceitar somente elementos React prontos
|
|
53
|
+
|
|
54
|
+
Daria liberdade total de composição, mas transferiria geometria, hierarquia e fechamento para cada
|
|
55
|
+
consumidor. Foi descartada porque ações declarativas cobrem o fluxo comum sem impedir personalização
|
|
56
|
+
por contexto e variante.
|
|
57
|
+
|
|
58
|
+
## Verificação
|
|
59
|
+
|
|
60
|
+
- Testes de DOM verificam que `actions` produz uma região única com `Button` do Opus.
|
|
61
|
+
- Testes de interação verificam ordem, defaults visuais, execução e fechamento.
|
|
62
|
+
- Testes de contrato reprovam a mistura de `actions` com `action` ou `cancel`.
|
|
63
|
+
- Documentação e metadata apresentam somente `actions` como caminho canônico.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# ADR 0008 — Navegação hierárquica é composta na fronteira do consumidor
|
|
2
|
+
|
|
3
|
+
- **Status:** aceita.
|
|
4
|
+
- **Data:** 2026-09-06.
|
|
5
|
+
|
|
6
|
+
## Contexto
|
|
7
|
+
|
|
8
|
+
`SidebarNav` oferece `groups`, `items` e `subgroups`. O terceiro nível foi introduzido para
|
|
9
|
+
preservar a estrutura seção → grupo → página do `DocBrowser`, mas não possui outro consumidor no
|
|
10
|
+
Opus nem nos aplicativos conhecidos. A API geral passou a carregar uma topologia rígida criada por
|
|
11
|
+
uma única tela.
|
|
12
|
+
|
|
13
|
+
Ao mesmo tempo, `SidebarItem` já representa os comportamentos necessários para árvores: um destino
|
|
14
|
+
principal, um controle irmão de expansão por `onToggle` e `expanded`, ações por item e indicadores
|
|
15
|
+
de drop. O estado da árvore e a origem de seus nós variam por consumidor. Porém, o recuo e a guia
|
|
16
|
+
vertical que comunicam descendência se repetiam nos aplicativos como a mesma combinação de classes,
|
|
17
|
+
embora sejam parte da linguagem visual da sidebar.
|
|
18
|
+
|
|
19
|
+
## Decisão
|
|
20
|
+
|
|
21
|
+
`SidebarNav` mantém somente a estrutura plana `groups → items`. `SidebarNavSubgroup` e a
|
|
22
|
+
propriedade `subgroups` deixam a API pública.
|
|
23
|
+
|
|
24
|
+
Hierarquias são compostas pelo consumidor com `SidebarGroupLabel`, `SidebarItem` e
|
|
25
|
+
`SidebarTreeGroup`. O consumidor controla expansão, ordem, profundidade e carregamento dos nós;
|
|
26
|
+
`SidebarTreeGroup` aplica a guia e o recuo dos descendentes, enquanto `SidebarItem` mantém a
|
|
27
|
+
apresentação e a acessibilidade de cada linha.
|
|
28
|
+
|
|
29
|
+
O `DocBrowser` materializa sua árvore própria a partir de `DocSection[]`. Seções aparecem como
|
|
30
|
+
rótulos, grupos nomeados viram nós expansíveis e páginas viram folhas. Grupos começam abertos para
|
|
31
|
+
preservar a descoberta atual, podem ser recolhidos e voltam a abrir quando passam a conter a página
|
|
32
|
+
ativa.
|
|
33
|
+
|
|
34
|
+
## Consequências
|
|
35
|
+
|
|
36
|
+
- A API geral deixa de prometer uma árvore limitada a exatamente três níveis.
|
|
37
|
+
- A documentação continua preservando seção, grupo e página sem usar um contrato específico no
|
|
38
|
+
componente compartilhado.
|
|
39
|
+
- Outros consumidores podem montar árvores rasas, recursivas, assíncronas ou arrastáveis com os
|
|
40
|
+
mesmos elementos, sem novas propriedades na `SidebarNav` nem classes locais para a guia.
|
|
41
|
+
- Remover `SidebarNavSubgroup` e `subgroups` é uma mudança incompatível e exige uma versão major na
|
|
42
|
+
próxima publicação do pacote.
|
|
43
|
+
- `DocBrowser` passa a possuir o estado de expansão de seus grupos.
|
|
44
|
+
|
|
45
|
+
## Alternativas consideradas
|
|
46
|
+
|
|
47
|
+
### Manter `subgroups`
|
|
48
|
+
|
|
49
|
+
Preservaria compatibilidade, mas manteria na API geral uma topologia usada somente pela
|
|
50
|
+
documentação. Foi descartada porque a composição existente já cobre o comportamento sem acoplar o
|
|
51
|
+
componente à estrutura de uma tela.
|
|
52
|
+
|
|
53
|
+
### Substituir por uma árvore recursiva em `SidebarNav`
|
|
54
|
+
|
|
55
|
+
Aceitar `children` recursivos permitiria profundidade arbitrária, mas também exigiria que o
|
|
56
|
+
componente decidisse expansão, carregamento, seleção e semântica de pastas para todos os produtos.
|
|
57
|
+
Foi descartada até que consumidores independentes revelem um contrato comum.
|
|
58
|
+
|
|
59
|
+
### Achatar a documentação
|
|
60
|
+
|
|
61
|
+
Converter grupos em uma lista única simplificaria o renderer, mas perderia a classificação que
|
|
62
|
+
também é produzida por pastas e pelo frontmatter das docs de projetos. Foi descartada porque a
|
|
63
|
+
hierarquia tem significado para descoberta e localização.
|
|
64
|
+
|
|
65
|
+
## Verificação
|
|
66
|
+
|
|
67
|
+
- Um teste de API impede que `SidebarNavSubgroup` volte a ser exportado.
|
|
68
|
+
- Testes de `SidebarNav` cobrem grupos planos, seleção e omissão de grupos vazios.
|
|
69
|
+
- Um teste de `SidebarTreeGroup` protege a guia, o recuo e o espaçamento entre descendentes.
|
|
70
|
+
- Testes de `DocBrowser` cobrem os três níveis, expansão e reabertura do grupo da página ativa.
|
|
71
|
+
- A documentação do Sidebar demonstra árvore com `SidebarTreeGroup` e não menciona `subgroups`.
|
package/docs/radius-scale.md
CHANGED
|
@@ -27,7 +27,7 @@ voltaria a acoplar forma e tipo de componente, problema removido na versão 10.0
|
|
|
27
27
|
token semântico por componente.
|
|
28
28
|
- Superfícies aninhadas evitam moldura dupla e normalmente usam um degrau menor que o contêiner.
|
|
29
29
|
Elementos conectados removem os raios nas arestas internas.
|
|
30
|
-
- Card
|
|
30
|
+
- Card e os dois modos de Dialog permanecem em `xl`. Molduras estruturais com cantos, como a tabela
|
|
31
31
|
standalone, permanecem em `lg`; Page, Split e Sidebar não ganham uma moldura por essa regra.
|
|
32
32
|
- Calendar e Command preservam a geometria embutível. Um consumidor standalone pode ajustar o
|
|
33
33
|
contêiner por `className` quando a composição pedir mais presença.
|
package/package.json
CHANGED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maintain-opus-docs
|
|
3
|
+
description: Cria, reorganiza e revisa a documentação publicada do Opus, incluindo páginas conceituais, famílias de componentes, exemplos vivos, props, navegação e redirects. Use ao documentar ou revisar o catálogo e os guias de @softize/opus.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Manter documentação Opus
|
|
7
|
+
|
|
8
|
+
## Resultado
|
|
9
|
+
|
|
10
|
+
Entregar documentação que ajuda a pessoa a escolher e usar o recurso pelo caminho canônico,
|
|
11
|
+
preserva a relação entre páginas, catálogo e API pública e continua verificável pelos gates do
|
|
12
|
+
repositório.
|
|
13
|
+
|
|
14
|
+
## Entradas
|
|
15
|
+
|
|
16
|
+
Identificar o público, a tarefa que levou a pessoa à página e o conjunto de APIs públicas coberto.
|
|
17
|
+
Ler [padrão editorial](references/editorial-standard.md) antes de escrever. Inspecionar o componente,
|
|
18
|
+
seus testes, metadata, exportações e páginas relacionadas; a documentação não define um contrato que
|
|
19
|
+
o código não sustenta.
|
|
20
|
+
|
|
21
|
+
## Procedimento
|
|
22
|
+
|
|
23
|
+
1. Inventariar as páginas, componentes e rotas afetadas antes de alterar a organização.
|
|
24
|
+
2. Decidir a unidade da página pelo conceito ensinado. Manter componentes compostos da mesma família
|
|
25
|
+
na mesma página quando compartilham decisão de uso e vocabulário; separar conceitos independentes.
|
|
26
|
+
3. Conduzir a leitura do caso comum para o específico: situação reconhecível, escolha recomendada,
|
|
27
|
+
exemplo mínimo, composição, variações, comportamentos e referência.
|
|
28
|
+
4. Escrever cada seção para funcionar por link direto, repetindo apenas o contexto indispensável.
|
|
29
|
+
5. Usar exemplos pequenos, executáveis e coerentes entre si. Explicar antes o que observar e depois
|
|
30
|
+
o comportamento automático ou a consequência que não esteja evidente no código.
|
|
31
|
+
6. Manter uma tabela de propriedades identificada para cada componente público coberto pela página.
|
|
32
|
+
Não usar uma tabela genérica para contratos diferentes.
|
|
33
|
+
7. Ao renomear ou agrupar páginas, atualizar registry, metadata, navegação e links; preservar slugs
|
|
34
|
+
publicados por redirect ou alias quando o endereço canônico mudar.
|
|
35
|
+
8. Reler todo o texto no fluxo renderizado e aplicar o checklist do padrão editorial linha por linha.
|
|
36
|
+
9. Atualizar testes, inventário de copy e projeções afetadas pelo mesmo conjunto de mudanças.
|
|
37
|
+
|
|
38
|
+
## Decisões
|
|
39
|
+
|
|
40
|
+
- A página ensina uma decisão de uso; a tabela de props documenta o contrato. Nenhuma substitui a
|
|
41
|
+
outra.
|
|
42
|
+
- O exemplo canônico aparece antes da enumeração de possibilidades. Alternativas entram no ponto em
|
|
43
|
+
que a pessoa precisa escolher entre elas.
|
|
44
|
+
- Defaults, efeitos automáticos, limites e riscos ficam próximos do exemplo em que se tornam
|
|
45
|
+
relevantes.
|
|
46
|
+
- Páginas conceituais podem ser extensas quando constroem um fluxo completo; páginas de componente
|
|
47
|
+
permanecem compactas e usam previews para carregar parte da explicação.
|
|
48
|
+
- Inspiração editorial externa orienta progressão e clareza, não autoriza copiar texto, idioma,
|
|
49
|
+
personalidade promocional ou convenções incompatíveis com o Opus.
|
|
50
|
+
|
|
51
|
+
## Verificação
|
|
52
|
+
|
|
53
|
+
Executar `node scripts/audit-docs.mjs "$(git rev-parse --show-toplevel)"` a partir do diretório
|
|
54
|
+
desta skill e, depois, os testes do renderer e do catálogo, typecheck, `opus check` e
|
|
55
|
+
`opus copy --check`. Conferir
|
|
56
|
+
que todos os previews renderizam, que cada API pública documentada possui sua própria referência,
|
|
57
|
+
que nenhum arquivo publicado ficou órfão e que links e redirects chegam à página esperada. Fazer uma
|
|
58
|
+
passada visual nas páginas alteradas e registrar qualquer limitação que o gate automático não cubra.
|
|
59
|
+
|
|
60
|
+
## Saída
|
|
61
|
+
|
|
62
|
+
Informar páginas criadas, agrupadas ou reescritas, decisões editoriais aplicadas, verificações
|
|
63
|
+
executadas e pendências reais. Em revisão ampla, fornecer o inventário coberto para tornar explícito
|
|
64
|
+
o significado de “toda a documentação”.
|
|
65
|
+
|
|
66
|
+
## Limites
|
|
67
|
+
|
|
68
|
+
- Não inventar comportamento, prop, default ou recomendação a partir do nome do componente.
|
|
69
|
+
- Não transformar a documentação em sequência de tabelas nem antecipar a referência antes do modelo
|
|
70
|
+
mental necessário.
|
|
71
|
+
- Não criar uma página por exportação quando os símbolos formam uma única família de uso.
|
|
72
|
+
- Não esconder APIs públicas de uma família em uma tabela de props compartilhada.
|
|
73
|
+
- Não editar projeção gerada quando existe fonte canônica.
|
|
74
|
+
- Não promover alteração de documentação a release, publicação ou push sem autorização específica.
|
|
75
|
+
|
|
76
|
+
## Recursos
|
|
77
|
+
|
|
78
|
+
- Ler [padrão editorial](references/editorial-standard.md) para anatomia, tom e revisão linha por
|
|
79
|
+
linha.
|
|
80
|
+
- Usar [avaliações](references/evaluations.md) ao criar ou alterar substancialmente esta skill.
|
|
81
|
+
- Usar `scripts/audit-docs.mjs [raiz-do-repositório]` para detectar páginas órfãs, fences
|
|
82
|
+
incompletos, saltos de heading e nomes genéricos de referência. O script complementa a leitura;
|
|
83
|
+
não decide clareza, progressão ou exatidão técnica.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Padrão editorial da documentação Opus
|
|
2
|
+
|
|
3
|
+
## Anatomia da página
|
|
4
|
+
|
|
5
|
+
Adotar a menor sequência que forme o modelo mental necessário:
|
|
6
|
+
|
|
7
|
+
1. **Situação e escolha:** dizer o que o recurso resolve e quando escolhê-lo. Contrastar com o
|
|
8
|
+
componente vizinho apenas quando essa distinção evita uma decisão errada.
|
|
9
|
+
2. **Exemplo canônico:** mostrar o menor uso realista e funcional antes das opções.
|
|
10
|
+
3. **Composição:** nomear as partes públicas e explicar a relação entre elas.
|
|
11
|
+
4. **Variações:** introduzir uma variação por necessidade observável, não por enumeração da API.
|
|
12
|
+
5. **Comportamentos e cuidados:** explicitar defaults, efeitos automáticos, acessibilidade, limites e
|
|
13
|
+
consequências perto do exemplo relevante.
|
|
14
|
+
6. **Referência:** terminar com uma seção identificada por componente público, sem fundir contratos
|
|
15
|
+
diferentes numa única tabela.
|
|
16
|
+
|
|
17
|
+
Nem toda página precisa de todas as seções. Remover a seção vazia em vez de preenchê-la com prosa
|
|
18
|
+
genérica.
|
|
19
|
+
|
|
20
|
+
## Voz
|
|
21
|
+
|
|
22
|
+
- Partir do objetivo da pessoa: “Use `Alert` para manter uma informação visível no contexto da
|
|
23
|
+
página.”
|
|
24
|
+
- Preferir verbo concreto e voz ativa: “O `PageHeader` organiza título e ações.”
|
|
25
|
+
- Apresentar o caminho recomendado com segurança; usar “pode” somente quando a alternativa é de
|
|
26
|
+
fato opcional.
|
|
27
|
+
- Introduzir termos técnicos em linguagem comum antes de depender deles.
|
|
28
|
+
- Manter tom próximo, sóbrio e profissional. Evitar propaganda, slogans, superlativos e entusiasmo
|
|
29
|
+
artificial.
|
|
30
|
+
- Evitar começar pela implementação: substituir “O componente é responsável por renderizar...”
|
|
31
|
+
pela decisão ou resultado que importa a quem usa.
|
|
32
|
+
- Usar frases e parágrafos curtos, sem fragmentar relações necessárias nem recorrer a abreviações.
|
|
33
|
+
|
|
34
|
+
## Exemplos
|
|
35
|
+
|
|
36
|
+
- Preparar o exemplo com uma frase que indique o objetivo ou o que deve ser observado.
|
|
37
|
+
- Manter exemplos executáveis, focados e coerentes com o caminho recomendado.
|
|
38
|
+
- Preferir uma pequena narrativa contínua a exemplos isolados que trocam de domínio sem necessidade.
|
|
39
|
+
- Não demonstrar combinações inválidas apenas para listar props.
|
|
40
|
+
- Depois do código, explicar somente efeitos que não sejam óbvios pela leitura: default aplicado,
|
|
41
|
+
estado controlado, ação automática, limite ou consequência.
|
|
42
|
+
- Usar preview para comportamento visual e bloco de código para integração sem palco executável.
|
|
43
|
+
|
|
44
|
+
## Famílias e referência
|
|
45
|
+
|
|
46
|
+
- Agrupar componentes quando a pessoa precisa compreendê-los em conjunto para realizar uma tarefa,
|
|
47
|
+
como `Button` e `ButtonGroup` ou `Page`, `PageHeader`, `PageBody` e `PageState`.
|
|
48
|
+
- Manter títulos e âncoras explícitos para cada membro da família.
|
|
49
|
+
- Criar `## Propriedades de ComponentName` para cada componente público que possui contrato próprio.
|
|
50
|
+
- Omitir tabela apenas para export sem props próprias ou alias cuja equivalência esteja declarada.
|
|
51
|
+
- Posicionar tipos compartilhados depois dos componentes que os utilizam ou numa seção claramente
|
|
52
|
+
nomeada.
|
|
53
|
+
|
|
54
|
+
## Links e navegação
|
|
55
|
+
|
|
56
|
+
- Inserir links no ponto da decisão: ao recomendar `Toast` como alternativa efêmera, ligar a palavra
|
|
57
|
+
à página correspondente.
|
|
58
|
+
- Não depender de uma seção genérica de “Veja também” para relações essenciais.
|
|
59
|
+
- Ao consolidar páginas, escolher um endereço canônico e preservar os anteriores com redirect.
|
|
60
|
+
- Conferir título visível, slug, registry, metadata e links como uma única identidade editorial.
|
|
61
|
+
|
|
62
|
+
## Revisão linha por linha
|
|
63
|
+
|
|
64
|
+
Para cada título, parágrafo, item, exemplo e célula de tabela, verificar:
|
|
65
|
+
|
|
66
|
+
1. A pessoa entende por que esta linha existe neste ponto da leitura?
|
|
67
|
+
2. A linha começa pela necessidade ou introduz detalhe interno cedo demais?
|
|
68
|
+
3. A afirmação é sustentada pelo código, teste ou decisão registrada?
|
|
69
|
+
4. Está claro se é default, obrigação, recomendação, alternativa ou exceção?
|
|
70
|
+
5. Há termo ainda não apresentado, pronome ambíguo ou contexto que só existe na cabeça de quem
|
|
71
|
+
implementou?
|
|
72
|
+
6. A frase pode ficar menor sem perder relação, condição ou consequência?
|
|
73
|
+
7. O exemplo mostra o caminho recomendado e continua compilável?
|
|
74
|
+
8. O texto ao redor do exemplo explica intenção e comportamento, sem narrar cada linha do código?
|
|
75
|
+
9. O título permite localizar a informação pela tarefa, inclusive por link direto?
|
|
76
|
+
10. Pontuação, capitalização, concordância e paralelismo estão consistentes?
|
|
77
|
+
|
|
78
|
+
Ao terminar cada página, reler a sequência inteira. Linhas corretas isoladamente ainda podem formar
|
|
79
|
+
uma página repetitiva, invertida ou sem progressão.
|
|
80
|
+
|
|
81
|
+
## Referência de estilo
|
|
82
|
+
|
|
83
|
+
O padrão absorve da documentação do Laravel a progressão do caso comum para os detalhes, os exemplos
|
|
84
|
+
como eixo narrativo, a explicação dos comportamentos automáticos e a navegação por decisões. O Opus
|
|
85
|
+
mantém sua própria voz em pt-BR: mais compacta, menos promocional e apoiada em previews visuais.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Avaliações
|
|
2
|
+
|
|
3
|
+
## Deve disparar
|
|
4
|
+
|
|
5
|
+
“Agrupe Button Group na página de Button, preserve a rota antiga e documente as props dos dois.”
|
|
6
|
+
|
|
7
|
+
“Revise toda a documentação publicada do Opus linha por linha e corrija a escrita.”
|
|
8
|
+
|
|
9
|
+
## Não deve disparar
|
|
10
|
+
|
|
11
|
+
“Escreva a regra de reembolso na documentação interna do produto.” Esse texto não pertence à
|
|
12
|
+
documentação publicada do SDK Opus.
|
|
13
|
+
|
|
14
|
+
“Corrija o alinhamento do ícone no Alert.” Uma mudança somente no componente pertence à
|
|
15
|
+
implementação de UI; esta skill entra apenas se a documentação também for criada ou alterada.
|
|
16
|
+
|
|
17
|
+
## Execução real
|
|
18
|
+
|
|
19
|
+
Fornecer uma página de família que começa pela lista completa de props, usa a mesma tabela para dois
|
|
20
|
+
componentes, mantém exemplos isolados sem objetivo, descreve implementação antes da decisão de uso e
|
|
21
|
+
remove a rota publicada do componente agrupado. Pedir a reorganização sem informar a resposta
|
|
22
|
+
esperada.
|
|
23
|
+
|
|
24
|
+
Aprovar somente quando a página começar pela situação e escolha, apresentar um exemplo canônico
|
|
25
|
+
executável, explicar defaults ou consequências no ponto relevante, criar referência identificada
|
|
26
|
+
para cada contrato público e preservar a rota anterior por redirect ou alias. Exigir que a escrita
|
|
27
|
+
seja próxima, direta e sóbria, sem copiar formulações da referência externa nem adotar tom
|
|
28
|
+
promocional.
|
|
29
|
+
|
|
30
|
+
Na revisão ampla, fornecer registry, metadata, componentes, testes e todas as páginas publicadas.
|
|
31
|
+
Exigir inventário explícito, leitura linha por linha, correção na fonte canônica, verificação dos
|
|
32
|
+
previews, typecheck, gates de copy e confirmação de que não restaram páginas órfãs. Reprovar se a
|
|
33
|
+
execução se limitar às páginas mais longas, fizer apenas busca por padrões ou declarar cobertura
|
|
34
|
+
total sem listar o universo revisado.
|