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