@softize/opus 12.9.0 → 12.11.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 +44 -0
- package/bin/lib/check.mjs +1103 -310
- package/bin/lib/copy.mjs +74 -6
- package/docs/adr/0003-dictionary-presentation-is-declared.md +3 -0
- package/docs/adr/0004-page-content-state-is-composed.md +65 -0
- package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +97 -0
- package/docs/adr/0006-semantic-context-precedes-visual-variant.md +182 -0
- package/docs/code-style.md +6 -2
- package/package.json +1 -1
- package/registry/instructions/opus.md +5 -0
- package/registry/skills/build-opus-ui/SKILL.md +27 -16
- package/registry/skills/build-opus-ui/references/evaluations.md +16 -5
- package/registry/skills/build-opus-ui/references/ui-patterns.md +38 -15
- package/registry/skills/model-opus-dictionary/SKILL.md +4 -2
- package/registry/skills/model-opus-dictionary/references/evaluations.md +4 -3
- package/registry/templates/app/src/App.tsx +1 -1
- package/src/core/dictionary.ts +52 -14
- package/src/core/index.ts +10 -0
- package/src/core/ui-context.ts +29 -0
- package/src/schema/drivers/zod.ts +34 -19
- package/src/ui/components/patterns/action-form-card.tsx +18 -12
- package/src/ui/components/patterns/confirm.tsx +26 -3
- package/src/ui/components/patterns/content-header.tsx +335 -61
- package/src/ui/components/patterns/data-state.tsx +23 -10
- package/src/ui/components/patterns/form.tsx +1 -1
- package/src/ui/components/patterns/list.tsx +1096 -777
- package/src/ui/components/patterns/page-state.tsx +115 -0
- package/src/ui/components/patterns/page.tsx +231 -41
- package/src/ui/components/patterns/sidebar.tsx +354 -80
- package/src/ui/components/patterns/trigger.tsx +13 -9
- package/src/ui/components/patterns/view.tsx +7 -11
- package/src/ui/components/primitives/alert-dialog.tsx +7 -5
- package/src/ui/components/primitives/alert.tsx +298 -80
- package/src/ui/components/primitives/ask.tsx +2 -1
- package/src/ui/components/primitives/badge.tsx +91 -30
- package/src/ui/components/primitives/button.tsx +99 -60
- package/src/ui/components/primitives/calendar.tsx +39 -39
- package/src/ui/components/primitives/card.tsx +96 -23
- package/src/ui/components/primitives/detail.tsx +2 -2
- package/src/ui/components/primitives/dictionary-value.tsx +9 -14
- package/src/ui/components/primitives/dot.tsx +74 -21
- package/src/ui/components/primitives/drawer.tsx +33 -20
- package/src/ui/components/primitives/field.tsx +4 -4
- package/src/ui/components/primitives/item.tsx +137 -81
- package/src/ui/components/primitives/menu.tsx +11 -3
- package/src/ui/components/primitives/metric-card.tsx +133 -0
- package/src/ui/components/primitives/table.tsx +2 -2
- package/src/ui/components/primitives/tooltip.tsx +1 -1
- package/src/ui/docs/DocBrowser.tsx +3 -3
- package/src/ui/docs/changelog.tsx +1 -1
- package/src/ui/docs/content/action-form-card.md +1 -1
- package/src/ui/docs/content/alert-dialog.md +8 -8
- package/src/ui/docs/content/alert.md +54 -23
- package/src/ui/docs/content/badge.md +18 -19
- package/src/ui/docs/content/button.md +12 -9
- package/src/ui/docs/content/card.md +5 -5
- package/src/ui/docs/content/content.md +44 -0
- package/src/ui/docs/content/customization.md +2 -2
- package/src/ui/docs/content/detail.md +5 -2
- package/src/ui/docs/content/dialog.md +2 -2
- package/src/ui/docs/content/dictionary-value.md +11 -10
- package/src/ui/docs/content/dot.md +7 -7
- package/src/ui/docs/content/drawer.md +6 -3
- package/src/ui/docs/content/field.md +1 -1
- package/src/ui/docs/content/input-group.md +3 -2
- package/src/ui/docs/content/item.md +47 -21
- package/src/ui/docs/content/menu.md +5 -4
- package/src/ui/docs/content/metric-card.md +41 -0
- package/src/ui/docs/content/page-state.md +45 -0
- package/src/ui/docs/content/page.md +48 -10
- package/src/ui/docs/content/semantic-context.md +63 -0
- package/src/ui/docs/content/sidebar.md +4 -4
- package/src/ui/docs/content/skeleton.md +2 -2
- package/src/ui/docs/content/table.md +3 -3
- package/src/ui/docs/content/tokens.md +28 -0
- package/src/ui/docs/content/tooltip.md +15 -1
- package/src/ui/docs/doc-client.tsx +2 -2
- package/src/ui/docs/registry.tsx +596 -228
- package/src/ui/lib/semantic-context.ts +30 -0
- package/src/ui/meta.ts +292 -270
- package/src/ui/react.tsx +378 -111
- package/src/ui/theme.css +66 -0
package/src/ui/docs/registry.tsx
CHANGED
|
@@ -10,96 +10,98 @@
|
|
|
10
10
|
* componente ganham o cabeçalho (título + badge de origem + whenToUse) do `meta` central via o
|
|
11
11
|
* helper `comp`; páginas conceituais renderizam o markdown direto (o próprio md traz o H1/lead).
|
|
12
12
|
*/
|
|
13
|
-
import { useEffect } from
|
|
14
|
-
import * as lucideIcons from
|
|
15
|
-
import * as opusUi from
|
|
16
|
-
import { componentMeta } from
|
|
17
|
-
import { navigate } from
|
|
18
|
-
import { DocPage } from
|
|
19
|
-
import { DocMarkdown } from
|
|
20
|
-
import { OpusChangelog } from
|
|
13
|
+
import { useEffect } from "react";
|
|
14
|
+
import * as lucideIcons from "lucide-react";
|
|
15
|
+
import * as opusUi from "../react.tsx";
|
|
16
|
+
import { componentMeta } from "../meta.ts";
|
|
17
|
+
import { navigate } from "../router.ts";
|
|
18
|
+
import { DocPage } from "./doc.tsx";
|
|
19
|
+
import { DocMarkdown } from "./markdown.tsx";
|
|
20
|
+
import { OpusChangelog } from "./changelog.tsx";
|
|
21
21
|
|
|
22
22
|
// — Conceituais (Começar/Framework/Design/Introdução) —
|
|
23
|
-
import gettingStartedMd from
|
|
24
|
-
import upgradingMd from
|
|
25
|
-
import cycleMd from
|
|
26
|
-
import authMd from
|
|
27
|
-
import auditMd from
|
|
28
|
-
import eventsMd from
|
|
29
|
-
import logMd from
|
|
30
|
-
import queueMd from
|
|
31
|
-
import schedulerMd from
|
|
32
|
-
import actionsMd from
|
|
33
|
-
import dataMd from
|
|
34
|
-
import storageMd from
|
|
35
|
-
import aiMd from
|
|
36
|
-
import mcpMd from
|
|
37
|
-
import testingMd from
|
|
38
|
-
import runtimeMd from
|
|
39
|
-
import uiMd from
|
|
40
|
-
import cliMd from
|
|
41
|
-
import tokensMd from
|
|
42
|
-
import
|
|
43
|
-
import
|
|
23
|
+
import gettingStartedMd from "./content/getting-started.md?raw";
|
|
24
|
+
import upgradingMd from "./content/upgrading.md?raw";
|
|
25
|
+
import cycleMd from "./content/cycle.md?raw";
|
|
26
|
+
import authMd from "./content/auth.md?raw";
|
|
27
|
+
import auditMd from "./content/audit.md?raw";
|
|
28
|
+
import eventsMd from "./content/events.md?raw";
|
|
29
|
+
import logMd from "./content/log.md?raw";
|
|
30
|
+
import queueMd from "./content/queue.md?raw";
|
|
31
|
+
import schedulerMd from "./content/scheduler.md?raw";
|
|
32
|
+
import actionsMd from "./content/actions.md?raw";
|
|
33
|
+
import dataMd from "./content/data.md?raw";
|
|
34
|
+
import storageMd from "./content/storage.md?raw";
|
|
35
|
+
import aiMd from "./content/ai.md?raw";
|
|
36
|
+
import mcpMd from "./content/mcp.md?raw";
|
|
37
|
+
import testingMd from "./content/testing.md?raw";
|
|
38
|
+
import runtimeMd from "./content/runtime.md?raw";
|
|
39
|
+
import uiMd from "./content/ui.md?raw";
|
|
40
|
+
import cliMd from "./content/cli.md?raw";
|
|
41
|
+
import tokensMd from "./content/tokens.md?raw";
|
|
42
|
+
import semanticContextMd from "./content/semantic-context.md?raw";
|
|
43
|
+
import communicationMd from "./content/communication.md?raw";
|
|
44
|
+
import customizationMd from "./content/customization.md?raw";
|
|
44
45
|
|
|
45
46
|
// — Componentes —
|
|
46
|
-
import accordionMd from
|
|
47
|
-
import alertMd from
|
|
48
|
-
import alertDialogMd from
|
|
49
|
-
import confirmMd from
|
|
50
|
-
import aspectRatioMd from
|
|
51
|
-
import avatarMd from
|
|
52
|
-
import badgeMd from
|
|
53
|
-
import dotMd from
|
|
54
|
-
import dockMd from
|
|
55
|
-
import breadcrumbMd from
|
|
56
|
-
import buttonMd from
|
|
57
|
-
import buttonGroupMd from
|
|
58
|
-
import calendarMd from
|
|
59
|
-
import cardMd from
|
|
60
|
-
import
|
|
61
|
-
import
|
|
62
|
-
import
|
|
63
|
-
import
|
|
64
|
-
import
|
|
65
|
-
import
|
|
66
|
-
import
|
|
67
|
-
import
|
|
68
|
-
import
|
|
69
|
-
import
|
|
70
|
-
import
|
|
71
|
-
import
|
|
72
|
-
import
|
|
73
|
-
import
|
|
74
|
-
import
|
|
75
|
-
import
|
|
76
|
-
import
|
|
77
|
-
import
|
|
78
|
-
import
|
|
79
|
-
import
|
|
80
|
-
import
|
|
81
|
-
import
|
|
82
|
-
import
|
|
83
|
-
import
|
|
84
|
-
import
|
|
85
|
-
import
|
|
86
|
-
import
|
|
87
|
-
import
|
|
88
|
-
import
|
|
89
|
-
import
|
|
90
|
-
import
|
|
91
|
-
import
|
|
92
|
-
import
|
|
93
|
-
import
|
|
94
|
-
import
|
|
95
|
-
import
|
|
96
|
-
import
|
|
97
|
-
import
|
|
98
|
-
import
|
|
99
|
-
import
|
|
100
|
-
import
|
|
101
|
-
import
|
|
102
|
-
import
|
|
47
|
+
import accordionMd from "./content/accordion.md?raw";
|
|
48
|
+
import alertMd from "./content/alert.md?raw";
|
|
49
|
+
import alertDialogMd from "./content/alert-dialog.md?raw";
|
|
50
|
+
import confirmMd from "./content/confirm.md?raw";
|
|
51
|
+
import aspectRatioMd from "./content/aspect-ratio.md?raw";
|
|
52
|
+
import avatarMd from "./content/avatar.md?raw";
|
|
53
|
+
import badgeMd from "./content/badge.md?raw";
|
|
54
|
+
import dotMd from "./content/dot.md?raw";
|
|
55
|
+
import dockMd from "./content/dock.md?raw";
|
|
56
|
+
import breadcrumbMd from "./content/breadcrumb.md?raw";
|
|
57
|
+
import buttonMd from "./content/button.md?raw";
|
|
58
|
+
import buttonGroupMd from "./content/button-group.md?raw";
|
|
59
|
+
import calendarMd from "./content/calendar.md?raw";
|
|
60
|
+
import cardMd from "./content/card.md?raw";
|
|
61
|
+
import metricCardMd from "./content/metric-card.md?raw";
|
|
62
|
+
import carouselMd from "./content/carousel.md?raw";
|
|
63
|
+
import askMd from "./content/ask.md?raw";
|
|
64
|
+
import chatMd from "./content/chat.md?raw";
|
|
65
|
+
import checkboxMd from "./content/checkbox.md?raw";
|
|
66
|
+
import collapsibleMd from "./content/collapsible.md?raw";
|
|
67
|
+
import iconPickerMd from "./content/icon-picker.md?raw";
|
|
68
|
+
import commandMd from "./content/command.md?raw";
|
|
69
|
+
import composerMd from "./content/composer.md?raw";
|
|
70
|
+
import copyableMd from "./content/copyable.md?raw";
|
|
71
|
+
import dialogMd from "./content/dialog.md?raw";
|
|
72
|
+
import detailMd from "./content/detail.md?raw";
|
|
73
|
+
import dictionaryValueMd from "./content/dictionary-value.md?raw";
|
|
74
|
+
import emptyValueMd from "./content/empty-value.md?raw";
|
|
75
|
+
import drawerMd from "./content/drawer.md?raw";
|
|
76
|
+
import menuMd from "./content/menu.md?raw";
|
|
77
|
+
import emptyMd from "./content/empty.md?raw";
|
|
78
|
+
import fieldMd from "./content/field.md?raw";
|
|
79
|
+
import inputMd from "./content/input.md?raw";
|
|
80
|
+
import inputGroupMd from "./content/input-group.md?raw";
|
|
81
|
+
import inputOtpMd from "./content/input-otp.md?raw";
|
|
82
|
+
import itemMd from "./content/item.md?raw";
|
|
83
|
+
import kbdMd from "./content/kbd.md?raw";
|
|
84
|
+
import labelMd from "./content/label.md?raw";
|
|
85
|
+
import markdownMd from "./content/markdown.md?raw";
|
|
86
|
+
import paginationMd from "./content/pagination.md?raw";
|
|
87
|
+
import popoverMd from "./content/popover.md?raw";
|
|
88
|
+
import progressMd from "./content/progress.md?raw";
|
|
89
|
+
import radioGroupMd from "./content/radio-group.md?raw";
|
|
90
|
+
import scrollAreaMd from "./content/scroll-area.md?raw";
|
|
91
|
+
import selectMd from "./content/select.md?raw";
|
|
92
|
+
import separatorMd from "./content/separator.md?raw";
|
|
93
|
+
import skeletonMd from "./content/skeleton.md?raw";
|
|
94
|
+
import sliderMd from "./content/slider.md?raw";
|
|
95
|
+
import spinnerMd from "./content/spinner.md?raw";
|
|
96
|
+
import switchMd from "./content/switch.md?raw";
|
|
97
|
+
import tableMd from "./content/table.md?raw";
|
|
98
|
+
import tabsMd from "./content/tabs.md?raw";
|
|
99
|
+
import textareaMd from "./content/textarea.md?raw";
|
|
100
|
+
import toastMd from "./content/toast.md?raw";
|
|
101
|
+
import toggleMd from "./content/toggle.md?raw";
|
|
102
|
+
import toggleGroupMd from "./content/toggle-group.md?raw";
|
|
103
|
+
import tooltipMd from "./content/tooltip.md?raw";
|
|
104
|
+
import truncateMd from "./content/truncate.md?raw";
|
|
103
105
|
|
|
104
106
|
// — Patterns (markdown + palco doc-client injetado no scope dos previews) —
|
|
105
107
|
import {
|
|
@@ -110,37 +112,39 @@ import {
|
|
|
110
112
|
docWorkspaceList,
|
|
111
113
|
docWorkspaceStatus,
|
|
112
114
|
docWorkspaceView,
|
|
113
|
-
} from
|
|
114
|
-
import actionFormMd from
|
|
115
|
-
import actionFormDialogMd from
|
|
116
|
-
import actionFormCardMd from
|
|
117
|
-
import actionSearchMd from
|
|
118
|
-
import actionViewMd from
|
|
119
|
-
import actionTriggerMd from
|
|
120
|
-
import actionSearchDialogMd from
|
|
121
|
-
import pageMd from
|
|
122
|
-
import
|
|
123
|
-
import
|
|
124
|
-
import
|
|
125
|
-
import
|
|
115
|
+
} from "./doc-client";
|
|
116
|
+
import actionFormMd from "./content/action-form.md?raw";
|
|
117
|
+
import actionFormDialogMd from "./content/action-form-dialog.md?raw";
|
|
118
|
+
import actionFormCardMd from "./content/action-form-card.md?raw";
|
|
119
|
+
import actionSearchMd from "./content/action-list.md?raw";
|
|
120
|
+
import actionViewMd from "./content/action-view.md?raw";
|
|
121
|
+
import actionTriggerMd from "./content/action-trigger.md?raw";
|
|
122
|
+
import actionSearchDialogMd from "./content/action-list-dialog.md?raw";
|
|
123
|
+
import pageMd from "./content/page.md?raw";
|
|
124
|
+
import contentMd from "./content/content.md?raw";
|
|
125
|
+
import pageStateMd from "./content/page-state.md?raw";
|
|
126
|
+
import sidebarMd from "./content/sidebar.md?raw";
|
|
127
|
+
import splitMd from "./content/split.md?raw";
|
|
128
|
+
import routerMd from "./content/router.md?raw";
|
|
129
|
+
import dataStateMd from "./content/data-state.md?raw";
|
|
126
130
|
|
|
127
131
|
export interface DocEntry {
|
|
128
|
-
slug: string
|
|
129
|
-
title: string
|
|
132
|
+
slug: string;
|
|
133
|
+
title: string;
|
|
130
134
|
/** Tag técnica opcional exibida na nav ao lado do título — o subpath do SDK (ex.: 'auth'). */
|
|
131
|
-
badge?: string
|
|
132
|
-
render: () => React.ReactElement
|
|
135
|
+
badge?: string;
|
|
136
|
+
render: () => React.ReactElement;
|
|
133
137
|
}
|
|
134
138
|
|
|
135
139
|
export interface DocGroup {
|
|
136
140
|
/** Sub-rótulo opcional dentro da seção (ex.: Primitivos). Ausente = páginas direto na seção. */
|
|
137
|
-
label?: string
|
|
138
|
-
pages: DocEntry[]
|
|
141
|
+
label?: string;
|
|
142
|
+
pages: DocEntry[];
|
|
139
143
|
}
|
|
140
144
|
|
|
141
145
|
export interface DocSection {
|
|
142
|
-
label: string
|
|
143
|
-
groups: DocGroup[]
|
|
146
|
+
label: string;
|
|
147
|
+
groups: DocGroup[];
|
|
144
148
|
}
|
|
145
149
|
|
|
146
150
|
/**
|
|
@@ -154,10 +158,12 @@ export interface DocSection {
|
|
|
154
158
|
// precisar, entra por alias no scope do chamador.
|
|
155
159
|
const iconScope: Record<string, unknown> = Object.fromEntries(
|
|
156
160
|
Object.entries(lucideIcons).filter(([name]) => !(name in opusUi)),
|
|
157
|
-
)
|
|
161
|
+
);
|
|
158
162
|
|
|
159
163
|
/** Página conceitual (Começar/Framework/Design/Intro): markdown direto (o H1/lead moram no md). */
|
|
160
|
-
const doc = (content: string) => (): React.ReactElement =>
|
|
164
|
+
const doc = (content: string) => (): React.ReactElement => (
|
|
165
|
+
<DocMarkdown content={content} scope={iconScope} />
|
|
166
|
+
);
|
|
161
167
|
|
|
162
168
|
/**
|
|
163
169
|
* Página de componente: o cabeçalho (título + badge de origem + whenToUse) vem do `meta` central
|
|
@@ -170,7 +176,7 @@ const comp =
|
|
|
170
176
|
<DocPage title={title} meta={componentMeta[key]}>
|
|
171
177
|
<DocMarkdown content={content} scope={iconScope} />
|
|
172
178
|
</DocPage>
|
|
173
|
-
)
|
|
179
|
+
);
|
|
174
180
|
|
|
175
181
|
/** O palco dos patterns no scope dos previews: ícones + client fake + contratos de mentira. */
|
|
176
182
|
const patternScope = {
|
|
@@ -182,7 +188,7 @@ const patternScope = {
|
|
|
182
188
|
docWorkspaceView,
|
|
183
189
|
docSessionArchive,
|
|
184
190
|
docSessionDelete,
|
|
185
|
-
}
|
|
191
|
+
};
|
|
186
192
|
|
|
187
193
|
/** Página de pattern: igual ao `comp`, mas os previews enxergam o palco doc-client no scope. */
|
|
188
194
|
const pattern =
|
|
@@ -191,18 +197,20 @@ const pattern =
|
|
|
191
197
|
<DocPage title={title} meta={componentMeta[key]}>
|
|
192
198
|
<DocMarkdown content={content} scope={patternScope} />
|
|
193
199
|
</DocPage>
|
|
194
|
-
)
|
|
200
|
+
);
|
|
195
201
|
|
|
196
202
|
/** Entrada 'UI' do Docs: a UI é um recurso do MESMO SDK, mas mora na superfície `/ui` (o
|
|
197
203
|
* catálogo é grande e visual). Em vez de duplicar, a página redireciona pra lá. */
|
|
198
204
|
function UiRedirect(): React.ReactElement {
|
|
199
205
|
useEffect(() => {
|
|
200
|
-
if (typeof window ===
|
|
206
|
+
if (typeof window === "undefined") return;
|
|
201
207
|
// `replace`: um redirect não merece uma entrada no histórico — com `push`, o "voltar"
|
|
202
208
|
// cairia aqui de novo e redirecionaria outra vez.
|
|
203
|
-
navigate(
|
|
204
|
-
}, [])
|
|
205
|
-
return
|
|
209
|
+
navigate("/ui", { replace: true });
|
|
210
|
+
}, []);
|
|
211
|
+
return (
|
|
212
|
+
<p className="text-sm text-muted-foreground">Redirecionando para a UI…</p>
|
|
213
|
+
);
|
|
206
214
|
}
|
|
207
215
|
|
|
208
216
|
/** As seções da doc do SDK (surface `/docs` do site). "Começar" fica na RAIZ (seção sem
|
|
@@ -210,13 +218,21 @@ function UiRedirect(): React.ReactElement {
|
|
|
210
218
|
export const PROTOCOL_SECTIONS: DocSection[] = [
|
|
211
219
|
{
|
|
212
220
|
// Sem label → páginas soltas no topo do menu (sem cabeçalho de seção).
|
|
213
|
-
label:
|
|
221
|
+
label: "",
|
|
214
222
|
groups: [
|
|
215
223
|
{
|
|
216
224
|
pages: [
|
|
217
|
-
{
|
|
218
|
-
|
|
219
|
-
|
|
225
|
+
{
|
|
226
|
+
slug: "getting-started",
|
|
227
|
+
title: "Getting started",
|
|
228
|
+
render: doc(gettingStartedMd),
|
|
229
|
+
},
|
|
230
|
+
{ slug: "cycle", title: "Evolução contínua", render: doc(cycleMd) },
|
|
231
|
+
{
|
|
232
|
+
slug: "upgrading",
|
|
233
|
+
title: "Atualizar a base",
|
|
234
|
+
render: doc(upgradingMd),
|
|
235
|
+
},
|
|
220
236
|
],
|
|
221
237
|
},
|
|
222
238
|
],
|
|
@@ -224,15 +240,27 @@ export const PROTOCOL_SECTIONS: DocSection[] = [
|
|
|
224
240
|
{
|
|
225
241
|
// O núcleo invariante do protocolo — uma página por recurso. Opus é protocolo + peças
|
|
226
242
|
// opcionais entregues como SDK (não Framework: a inversão de controle é do app).
|
|
227
|
-
label:
|
|
243
|
+
label: "Protocolo",
|
|
228
244
|
groups: [
|
|
229
245
|
{
|
|
230
246
|
pages: [
|
|
231
|
-
{
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
247
|
+
{
|
|
248
|
+
slug: "actions",
|
|
249
|
+
title: "Actions & contratos",
|
|
250
|
+
render: doc(actionsMd),
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
slug: "runtime",
|
|
254
|
+
title: "Runtime & adapters",
|
|
255
|
+
render: doc(runtimeMd),
|
|
256
|
+
},
|
|
257
|
+
{ slug: "data", title: "Camada de dados", render: doc(dataMd) },
|
|
258
|
+
{
|
|
259
|
+
slug: "testing",
|
|
260
|
+
title: "Testes de action",
|
|
261
|
+
render: doc(testingMd),
|
|
262
|
+
},
|
|
263
|
+
{ slug: "cli", title: "CLI opus", render: doc(cliMd) },
|
|
236
264
|
],
|
|
237
265
|
},
|
|
238
266
|
],
|
|
@@ -240,171 +268,504 @@ export const PROTOCOL_SECTIONS: DocSection[] = [
|
|
|
240
268
|
{
|
|
241
269
|
// As peças OPT-IN que você liga (adapter + driver). A UI também é recurso do SDK, mas
|
|
242
270
|
// com catálogo próprio — a entrada 'ui' redireciona pra superfície /ui.
|
|
243
|
-
label:
|
|
271
|
+
label: "Recursos",
|
|
244
272
|
groups: [
|
|
245
273
|
{
|
|
246
274
|
pages: [
|
|
247
|
-
{
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
{
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
275
|
+
{
|
|
276
|
+
slug: "auth",
|
|
277
|
+
title: "Autenticação",
|
|
278
|
+
badge: "auth",
|
|
279
|
+
render: doc(authMd),
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
slug: "audit",
|
|
283
|
+
title: "Auditoria",
|
|
284
|
+
badge: "audit",
|
|
285
|
+
render: doc(auditMd),
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
slug: "events",
|
|
289
|
+
title: "Eventos",
|
|
290
|
+
badge: "events",
|
|
291
|
+
render: doc(eventsMd),
|
|
292
|
+
},
|
|
293
|
+
{ slug: "log", title: "Log", badge: "log", render: doc(logMd) },
|
|
294
|
+
{
|
|
295
|
+
slug: "queue",
|
|
296
|
+
title: "Filas",
|
|
297
|
+
badge: "queue",
|
|
298
|
+
render: doc(queueMd),
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
slug: "scheduler",
|
|
302
|
+
title: "Agendador",
|
|
303
|
+
badge: "scheduler",
|
|
304
|
+
render: doc(schedulerMd),
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
slug: "storage",
|
|
308
|
+
title: "Armazenamento",
|
|
309
|
+
badge: "storage",
|
|
310
|
+
render: doc(storageMd),
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
slug: "ai",
|
|
314
|
+
title: "IA generativa",
|
|
315
|
+
badge: "ai",
|
|
316
|
+
render: doc(aiMd),
|
|
317
|
+
},
|
|
318
|
+
{ slug: "mcp", title: "MCP", badge: "mcp", render: doc(mcpMd) },
|
|
319
|
+
{ slug: "ui", title: "UI ↗", render: () => <UiRedirect /> },
|
|
257
320
|
],
|
|
258
321
|
},
|
|
259
322
|
],
|
|
260
323
|
},
|
|
261
|
-
]
|
|
324
|
+
];
|
|
262
325
|
|
|
263
326
|
/** As seções da parte de UI do SDK (`/ui`): consumo, design, catálogo de componentes e
|
|
264
327
|
* patterns. Mesma família das seções de protocolo — superfície própria só pelo volume. */
|
|
265
328
|
export const UI_SECTIONS: DocSection[] = [
|
|
266
329
|
{
|
|
267
330
|
// Raiz (sem label): o "getting started" da UI.
|
|
268
|
-
label:
|
|
269
|
-
groups: [
|
|
331
|
+
label: "",
|
|
332
|
+
groups: [
|
|
333
|
+
{
|
|
334
|
+
pages: [
|
|
335
|
+
{
|
|
336
|
+
slug: "como-consumir",
|
|
337
|
+
title: "Getting started",
|
|
338
|
+
render: doc(uiMd),
|
|
339
|
+
},
|
|
340
|
+
],
|
|
341
|
+
},
|
|
342
|
+
],
|
|
270
343
|
},
|
|
271
344
|
{
|
|
272
|
-
label:
|
|
345
|
+
label: "Design",
|
|
273
346
|
groups: [
|
|
274
347
|
{
|
|
275
348
|
pages: [
|
|
276
|
-
{ slug:
|
|
277
|
-
{
|
|
278
|
-
|
|
349
|
+
{ slug: "tokens", title: "Tokens & Tema", render: doc(tokensMd) },
|
|
350
|
+
{
|
|
351
|
+
slug: "semantic-context",
|
|
352
|
+
title: "Contexto & Variante",
|
|
353
|
+
render: doc(semanticContextMd),
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
slug: "communication",
|
|
357
|
+
title: "Comunicação",
|
|
358
|
+
render: doc(communicationMd),
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
slug: "customization",
|
|
362
|
+
title: "Customização",
|
|
363
|
+
render: doc(customizationMd),
|
|
364
|
+
},
|
|
279
365
|
],
|
|
280
366
|
},
|
|
281
367
|
],
|
|
282
368
|
},
|
|
283
369
|
{
|
|
284
|
-
label:
|
|
370
|
+
label: "Componentes",
|
|
285
371
|
groups: [
|
|
286
372
|
{
|
|
287
|
-
label:
|
|
373
|
+
label: "Fundamentos",
|
|
288
374
|
pages: [
|
|
289
|
-
{
|
|
375
|
+
{
|
|
376
|
+
slug: "router",
|
|
377
|
+
title: "Router",
|
|
378
|
+
render: pattern("Router", "router", routerMd),
|
|
379
|
+
},
|
|
290
380
|
],
|
|
291
381
|
},
|
|
292
382
|
{
|
|
293
|
-
label:
|
|
383
|
+
label: "Layout",
|
|
294
384
|
pages: [
|
|
295
|
-
{
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
{
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
385
|
+
{
|
|
386
|
+
slug: "split",
|
|
387
|
+
title: "Split & Pane",
|
|
388
|
+
render: pattern("Split & Pane", "split", splitMd),
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
slug: "sidebar",
|
|
392
|
+
title: "Sidebar",
|
|
393
|
+
render: pattern("Sidebar", "sidebar", sidebarMd),
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
slug: "page",
|
|
397
|
+
title: "Page",
|
|
398
|
+
render: pattern("Page", "page", pageMd),
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
slug: "content",
|
|
402
|
+
title: "Content",
|
|
403
|
+
render: pattern("Content", "content", contentMd),
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
slug: "page-state",
|
|
407
|
+
title: "Page State",
|
|
408
|
+
render: pattern("Page State", "page-state", pageStateMd),
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
slug: "accordion",
|
|
412
|
+
title: "Accordion",
|
|
413
|
+
render: comp("Accordion", "accordion", accordionMd),
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
slug: "aspect-ratio",
|
|
417
|
+
title: "Aspect Ratio",
|
|
418
|
+
render: comp("Aspect Ratio", "aspect-ratio", aspectRatioMd),
|
|
419
|
+
},
|
|
420
|
+
{ slug: "card", title: "Card", render: comp("Card", "card", cardMd) },
|
|
421
|
+
{
|
|
422
|
+
slug: "metric-card",
|
|
423
|
+
title: "Metric Card",
|
|
424
|
+
render: comp("Metric Card", "metric-card", metricCardMd),
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
slug: "collapsible",
|
|
428
|
+
title: "Collapsible",
|
|
429
|
+
render: comp("Collapsible", "collapsible", collapsibleMd),
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
slug: "scroll-area",
|
|
433
|
+
title: "Scroll Area",
|
|
434
|
+
render: comp("Scroll Area", "scroll-area", scrollAreaMd),
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
slug: "separator",
|
|
438
|
+
title: "Separator",
|
|
439
|
+
render: comp("Separator", "separator", separatorMd),
|
|
440
|
+
},
|
|
304
441
|
],
|
|
305
442
|
},
|
|
306
443
|
{
|
|
307
|
-
label:
|
|
444
|
+
label: "Actions",
|
|
308
445
|
pages: [
|
|
309
|
-
{
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
{
|
|
315
|
-
|
|
446
|
+
{
|
|
447
|
+
slug: "action-form",
|
|
448
|
+
title: "Action Form",
|
|
449
|
+
render: pattern("Action Form", "action-form", actionFormMd),
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
slug: "action-form-card",
|
|
453
|
+
title: "Action Form Card",
|
|
454
|
+
render: pattern(
|
|
455
|
+
"Action Form Card",
|
|
456
|
+
"action-form-card",
|
|
457
|
+
actionFormCardMd,
|
|
458
|
+
),
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
slug: "action-form-dialog",
|
|
462
|
+
title: "Action Form Dialog",
|
|
463
|
+
render: pattern(
|
|
464
|
+
"Action Form Dialog",
|
|
465
|
+
"action-form-dialog",
|
|
466
|
+
actionFormDialogMd,
|
|
467
|
+
),
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
slug: "action-list",
|
|
471
|
+
title: "Action List",
|
|
472
|
+
render: pattern("Action List", "action-list", actionSearchMd),
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
slug: "action-list-dialog",
|
|
476
|
+
title: "Action List Dialog",
|
|
477
|
+
render: pattern(
|
|
478
|
+
"Action List Dialog",
|
|
479
|
+
"action-list-dialog",
|
|
480
|
+
actionSearchDialogMd,
|
|
481
|
+
),
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
slug: "action-trigger",
|
|
485
|
+
title: "Action Trigger",
|
|
486
|
+
render: pattern(
|
|
487
|
+
"Action Trigger",
|
|
488
|
+
"action-trigger",
|
|
489
|
+
actionTriggerMd,
|
|
490
|
+
),
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
slug: "action-view",
|
|
494
|
+
title: "Action View",
|
|
495
|
+
render: pattern("Action View", "action-view", actionViewMd),
|
|
496
|
+
},
|
|
316
497
|
],
|
|
317
498
|
},
|
|
318
499
|
{
|
|
319
|
-
label:
|
|
500
|
+
label: "IA",
|
|
320
501
|
pages: [
|
|
321
|
-
{ slug:
|
|
322
|
-
{ slug:
|
|
323
|
-
{
|
|
502
|
+
{ slug: "ask", title: "Ask", render: comp("Ask", "ask", askMd) },
|
|
503
|
+
{ slug: "chat", title: "Chat", render: comp("Chat", "chat", chatMd) },
|
|
504
|
+
{
|
|
505
|
+
slug: "composer",
|
|
506
|
+
title: "Composer",
|
|
507
|
+
render: comp("Composer", "composer", composerMd),
|
|
508
|
+
},
|
|
324
509
|
],
|
|
325
510
|
},
|
|
326
511
|
{
|
|
327
|
-
label:
|
|
512
|
+
label: "Formulário",
|
|
328
513
|
pages: [
|
|
329
|
-
{
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
{
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
{
|
|
340
|
-
|
|
341
|
-
|
|
514
|
+
{
|
|
515
|
+
slug: "calendar",
|
|
516
|
+
title: "Calendar",
|
|
517
|
+
render: comp("Calendar", "calendar", calendarMd),
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
slug: "checkbox",
|
|
521
|
+
title: "Checkbox",
|
|
522
|
+
render: comp("Checkbox", "checkbox", checkboxMd),
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
slug: "field",
|
|
526
|
+
title: "Field",
|
|
527
|
+
render: comp("Field", "field", fieldMd),
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
slug: "icon-picker",
|
|
531
|
+
title: "Icon Picker",
|
|
532
|
+
render: comp("Icon Picker", "icon-picker", iconPickerMd),
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
slug: "input",
|
|
536
|
+
title: "Input",
|
|
537
|
+
render: comp("Input", "input", inputMd),
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
slug: "input-group",
|
|
541
|
+
title: "Input Group",
|
|
542
|
+
render: comp("Input Group", "input-group", inputGroupMd),
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
slug: "input-otp",
|
|
546
|
+
title: "Input OTP",
|
|
547
|
+
render: comp("Input OTP", "input-otp", inputOtpMd),
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
slug: "label",
|
|
551
|
+
title: "Label",
|
|
552
|
+
render: comp("Label", "label", labelMd),
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
slug: "radio-group",
|
|
556
|
+
title: "Radio Group",
|
|
557
|
+
render: comp("Radio Group", "radio-group", radioGroupMd),
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
slug: "select",
|
|
561
|
+
title: "Select",
|
|
562
|
+
render: comp("Select", "select", selectMd),
|
|
563
|
+
},
|
|
564
|
+
{
|
|
565
|
+
slug: "slider",
|
|
566
|
+
title: "Slider",
|
|
567
|
+
render: comp("Slider", "slider", sliderMd),
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
slug: "switch",
|
|
571
|
+
title: "Switch",
|
|
572
|
+
render: comp("Switch", "switch", switchMd),
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
slug: "textarea",
|
|
576
|
+
title: "Textarea",
|
|
577
|
+
render: comp("Textarea", "textarea", textareaMd),
|
|
578
|
+
},
|
|
342
579
|
],
|
|
343
580
|
},
|
|
344
581
|
{
|
|
345
|
-
label:
|
|
582
|
+
label: "Botões",
|
|
346
583
|
pages: [
|
|
347
|
-
{
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
584
|
+
{
|
|
585
|
+
slug: "button",
|
|
586
|
+
title: "Button",
|
|
587
|
+
render: comp("Button", "button", buttonMd),
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
slug: "button-group",
|
|
591
|
+
title: "Button Group",
|
|
592
|
+
render: comp("Button Group", "button-group", buttonGroupMd),
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
slug: "toggle",
|
|
596
|
+
title: "Toggle",
|
|
597
|
+
render: comp("Toggle", "toggle", toggleMd),
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
slug: "toggle-group",
|
|
601
|
+
title: "Toggle Group",
|
|
602
|
+
render: comp("Toggle Group", "toggle-group", toggleGroupMd),
|
|
603
|
+
},
|
|
351
604
|
],
|
|
352
605
|
},
|
|
353
606
|
{
|
|
354
|
-
label:
|
|
607
|
+
label: "Navegação",
|
|
355
608
|
pages: [
|
|
356
|
-
{
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
609
|
+
{
|
|
610
|
+
slug: "breadcrumb",
|
|
611
|
+
title: "Breadcrumb",
|
|
612
|
+
render: comp("Breadcrumb", "breadcrumb", breadcrumbMd),
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
slug: "command",
|
|
616
|
+
title: "Command",
|
|
617
|
+
render: comp("Command", "command", commandMd),
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
slug: "pagination",
|
|
621
|
+
title: "Pagination",
|
|
622
|
+
render: comp("Pagination", "pagination", paginationMd),
|
|
623
|
+
},
|
|
624
|
+
{ slug: "tabs", title: "Tabs", render: comp("Tabs", "tabs", tabsMd) },
|
|
360
625
|
],
|
|
361
626
|
},
|
|
362
627
|
{
|
|
363
|
-
label:
|
|
628
|
+
label: "Exibição",
|
|
364
629
|
pages: [
|
|
365
|
-
{
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
{
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
{ slug:
|
|
376
|
-
{ slug:
|
|
377
|
-
{
|
|
378
|
-
|
|
630
|
+
{
|
|
631
|
+
slug: "avatar",
|
|
632
|
+
title: "Avatar",
|
|
633
|
+
render: comp("Avatar", "avatar", avatarMd),
|
|
634
|
+
},
|
|
635
|
+
{
|
|
636
|
+
slug: "badge",
|
|
637
|
+
title: "Badge",
|
|
638
|
+
render: comp("Badge", "badge", badgeMd),
|
|
639
|
+
},
|
|
640
|
+
{ slug: "dot", title: "Dot", render: comp("Dot", "dot", dotMd) },
|
|
641
|
+
{ slug: "dock", title: "Dock", render: comp("Dock", "dock", dockMd) },
|
|
642
|
+
{
|
|
643
|
+
slug: "carousel",
|
|
644
|
+
title: "Carousel",
|
|
645
|
+
render: comp("Carousel", "carousel", carouselMd),
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
slug: "copyable",
|
|
649
|
+
title: "Copyable",
|
|
650
|
+
render: comp("Copyable", "copyable", copyableMd),
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
slug: "detail",
|
|
654
|
+
title: "Detail",
|
|
655
|
+
render: comp("Detail", "detail", detailMd),
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
slug: "dictionary-value",
|
|
659
|
+
title: "Dictionary Value",
|
|
660
|
+
render: comp(
|
|
661
|
+
"Dictionary Value",
|
|
662
|
+
"dictionary-value",
|
|
663
|
+
dictionaryValueMd,
|
|
664
|
+
),
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
slug: "empty-value",
|
|
668
|
+
title: "Empty Value",
|
|
669
|
+
render: comp("Empty Value", "empty-value", emptyValueMd),
|
|
670
|
+
},
|
|
671
|
+
{ slug: "item", title: "Item", render: comp("Item", "item", itemMd) },
|
|
672
|
+
{ slug: "kbd", title: "Kbd", render: comp("Kbd", "kbd", kbdMd) },
|
|
673
|
+
{
|
|
674
|
+
slug: "markdown",
|
|
675
|
+
title: "Markdown",
|
|
676
|
+
render: comp("Markdown", "markdown", markdownMd),
|
|
677
|
+
},
|
|
678
|
+
{
|
|
679
|
+
slug: "table",
|
|
680
|
+
title: "Table",
|
|
681
|
+
render: comp("Table", "table", tableMd),
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
slug: "truncate",
|
|
685
|
+
title: "Truncate",
|
|
686
|
+
render: comp("Truncate", "truncate", truncateMd),
|
|
687
|
+
},
|
|
379
688
|
],
|
|
380
689
|
},
|
|
381
690
|
{
|
|
382
|
-
label:
|
|
691
|
+
label: "Feedback",
|
|
383
692
|
pages: [
|
|
384
|
-
{
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
{
|
|
390
|
-
|
|
391
|
-
|
|
693
|
+
{
|
|
694
|
+
slug: "alert",
|
|
695
|
+
title: "Alert",
|
|
696
|
+
render: comp("Alert", "alert", alertMd),
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
slug: "confirm",
|
|
700
|
+
title: "Dialog (imperativo)",
|
|
701
|
+
render: comp("Dialog (imperativo)", "confirm", confirmMd),
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
slug: "data-state",
|
|
705
|
+
title: "Data State",
|
|
706
|
+
render: comp("Data State", "data-state", dataStateMd),
|
|
707
|
+
},
|
|
708
|
+
{
|
|
709
|
+
slug: "empty",
|
|
710
|
+
title: "Empty",
|
|
711
|
+
render: comp("Empty", "empty", emptyMd),
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
slug: "progress",
|
|
715
|
+
title: "Progress",
|
|
716
|
+
render: comp("Progress", "progress", progressMd),
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
slug: "skeleton",
|
|
720
|
+
title: "Skeleton",
|
|
721
|
+
render: comp("Skeleton", "skeleton", skeletonMd),
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
slug: "spinner",
|
|
725
|
+
title: "Spinner",
|
|
726
|
+
render: comp("Spinner", "spinner", spinnerMd),
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
slug: "toast",
|
|
730
|
+
title: "Toast",
|
|
731
|
+
render: comp("Toast", "toast", toastMd),
|
|
732
|
+
},
|
|
392
733
|
],
|
|
393
734
|
},
|
|
394
735
|
{
|
|
395
|
-
label:
|
|
736
|
+
label: "Sobreposição",
|
|
396
737
|
pages: [
|
|
397
|
-
{
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
{
|
|
738
|
+
{
|
|
739
|
+
slug: "alert-dialog",
|
|
740
|
+
title: "Alert Dialog",
|
|
741
|
+
render: comp("Alert Dialog", "alert-dialog", alertDialogMd),
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
slug: "dialog",
|
|
745
|
+
title: "Dialog",
|
|
746
|
+
render: comp("Dialog", "dialog", dialogMd),
|
|
747
|
+
},
|
|
748
|
+
{
|
|
749
|
+
slug: "drawer",
|
|
750
|
+
title: "Drawer",
|
|
751
|
+
render: comp("Drawer", "drawer", drawerMd),
|
|
752
|
+
},
|
|
753
|
+
{ slug: "menu", title: "Menu", render: comp("Menu", "menu", menuMd) },
|
|
754
|
+
{
|
|
755
|
+
slug: "popover",
|
|
756
|
+
title: "Popover",
|
|
757
|
+
render: comp("Popover", "popover", popoverMd),
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
slug: "tooltip",
|
|
761
|
+
title: "Tooltip",
|
|
762
|
+
render: comp("Tooltip", "tooltip", tooltipMd),
|
|
763
|
+
},
|
|
403
764
|
],
|
|
404
765
|
},
|
|
405
766
|
],
|
|
406
767
|
},
|
|
407
|
-
]
|
|
768
|
+
];
|
|
408
769
|
|
|
409
770
|
/** O catálogo INTEIRO (compat): Maestro (lente) e `/__docs` mostram tudo numa nav só —
|
|
410
771
|
* inclusive o changelog, que no SITE é página do menu superior (fora destas seções);
|
|
@@ -417,7 +778,11 @@ export const DOC_SECTIONS: DocSection[] = [
|
|
|
417
778
|
{
|
|
418
779
|
pages: [
|
|
419
780
|
...PROTOCOL_SECTIONS[0]!.groups[0]!.pages,
|
|
420
|
-
{
|
|
781
|
+
{
|
|
782
|
+
slug: "changelog",
|
|
783
|
+
title: "Changelog",
|
|
784
|
+
render: () => <OpusChangelog />,
|
|
785
|
+
},
|
|
421
786
|
],
|
|
422
787
|
},
|
|
423
788
|
],
|
|
@@ -426,7 +791,10 @@ export const DOC_SECTIONS: DocSection[] = [
|
|
|
426
791
|
// à parte — então tira a entrada-redirect 'ui' (o catálogo já entra via UI_SECTIONS).
|
|
427
792
|
...PROTOCOL_SECTIONS.slice(1).map((s) => ({
|
|
428
793
|
...s,
|
|
429
|
-
groups: s.groups.map((g) => ({
|
|
794
|
+
groups: s.groups.map((g) => ({
|
|
795
|
+
...g,
|
|
796
|
+
pages: g.pages.filter((p) => p.slug !== "ui"),
|
|
797
|
+
})),
|
|
430
798
|
})),
|
|
431
799
|
...UI_SECTIONS,
|
|
432
|
-
]
|
|
800
|
+
];
|