@sero-ai/ui 0.4.0 → 0.4.2

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 (332) hide show
  1. package/.turbo/turbo-build.log +628 -628
  2. package/.turbo/turbo-test.log +18 -0
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/CHANGELOG.md +22 -2
  5. package/LICENSE +201 -0
  6. package/dist/components/ai-elements/agent.cjs +6 -6
  7. package/dist/components/ai-elements/agent.js +6 -6
  8. package/dist/components/ai-elements/artifact.cjs +2 -2
  9. package/dist/components/ai-elements/artifact.js +2 -2
  10. package/dist/components/ai-elements/attachments.cjs +2 -2
  11. package/dist/components/ai-elements/attachments.js +2 -2
  12. package/dist/components/ai-elements/chain-of-thought.cjs +2 -2
  13. package/dist/components/ai-elements/chain-of-thought.js +2 -2
  14. package/dist/components/ai-elements/code-block.cjs +7 -5
  15. package/dist/components/ai-elements/code-block.d.cts +2 -1
  16. package/dist/components/ai-elements/code-block.d.ts +2 -1
  17. package/dist/components/ai-elements/code-block.js +7 -5
  18. package/dist/components/ai-elements/commit.cjs +2 -2
  19. package/dist/components/ai-elements/commit.js +2 -2
  20. package/dist/components/ai-elements/confirmation.cjs +1 -1
  21. package/dist/components/ai-elements/confirmation.js +1 -1
  22. package/dist/components/ai-elements/conversation.cjs +2 -2
  23. package/dist/components/ai-elements/conversation.js +2 -2
  24. package/dist/components/ai-elements/environment-variables.cjs +3 -3
  25. package/dist/components/ai-elements/environment-variables.js +3 -3
  26. package/dist/components/ai-elements/file-tree.cjs +1 -1
  27. package/dist/components/ai-elements/file-tree.js +1 -1
  28. package/dist/components/ai-elements/inline-citation.cjs +3 -3
  29. package/dist/components/ai-elements/inline-citation.js +3 -3
  30. package/dist/components/ai-elements/jsx-preview.cjs +1 -1
  31. package/dist/components/ai-elements/jsx-preview.js +1 -1
  32. package/dist/components/ai-elements/message.cjs +1 -1
  33. package/dist/components/ai-elements/message.js +1 -1
  34. package/dist/components/ai-elements/package-info.cjs +4 -4
  35. package/dist/components/ai-elements/package-info.js +4 -4
  36. package/dist/components/ai-elements/prompt-input-context.cjs +2 -3
  37. package/dist/components/ai-elements/prompt-input-context.js +2 -3
  38. package/dist/components/ai-elements/queue.cjs +2 -2
  39. package/dist/components/ai-elements/queue.js +2 -2
  40. package/dist/components/ai-elements/reasoning.cjs +2 -2
  41. package/dist/components/ai-elements/reasoning.js +2 -2
  42. package/dist/components/ai-elements/sandbox.cjs +3 -3
  43. package/dist/components/ai-elements/sandbox.js +3 -3
  44. package/dist/components/ai-elements/schema-display.cjs +12 -12
  45. package/dist/components/ai-elements/schema-display.js +12 -12
  46. package/dist/components/ai-elements/speech-input.cjs +18 -2
  47. package/dist/components/ai-elements/speech-input.js +16 -0
  48. package/dist/components/ai-elements/stack-trace.cjs +1 -1
  49. package/dist/components/ai-elements/stack-trace.js +1 -1
  50. package/dist/components/ai-elements/task.cjs +3 -3
  51. package/dist/components/ai-elements/task.js +3 -3
  52. package/dist/components/ai-elements/terminal.cjs +2 -2
  53. package/dist/components/ai-elements/terminal.js +2 -2
  54. package/dist/components/ai-elements/test-results.cjs +4 -4
  55. package/dist/components/ai-elements/test-results.js +4 -4
  56. package/dist/components/ai-elements/tool.cjs +4 -4
  57. package/dist/components/ai-elements/tool.js +4 -4
  58. package/dist/components/ai-elements/transcription.cjs +1 -1
  59. package/dist/components/ai-elements/transcription.js +1 -1
  60. package/dist/components/ai-elements/web-preview.cjs +2 -2
  61. package/dist/components/ai-elements/web-preview.js +2 -2
  62. package/dist/components/context-editor/CapabilitySection.cjs +2 -2
  63. package/dist/components/context-editor/CapabilitySection.js +2 -2
  64. package/dist/components/context-editor/ContextEditor.cjs +2 -2
  65. package/dist/components/context-editor/ContextEditor.js +2 -2
  66. package/dist/components/context-editor/PresetBar.cjs +3 -3
  67. package/dist/components/context-editor/PresetBar.js +3 -3
  68. package/dist/components/context-editor/SystemPromptSection.cjs +4 -4
  69. package/dist/components/context-editor/SystemPromptSection.js +4 -4
  70. package/dist/components/context-editor/parts.cjs +6 -6
  71. package/dist/components/context-editor/parts.js +6 -6
  72. package/dist/components/dashboard/activity-list.cjs +2 -2
  73. package/dist/components/dashboard/activity-list.js +2 -2
  74. package/dist/components/dashboard/catalog.cjs +1 -322
  75. package/dist/components/dashboard/catalog.d.cts +1 -2
  76. package/dist/components/dashboard/catalog.d.ts +1 -2
  77. package/dist/components/dashboard/catalog.js +0 -322
  78. package/dist/components/dashboard/catalog.json +312 -0
  79. package/dist/components/dashboard/empty-state.cjs +1 -1
  80. package/dist/components/dashboard/empty-state.js +1 -1
  81. package/dist/components/dashboard/index.d.cts +1 -1
  82. package/dist/components/dashboard/index.d.ts +1 -1
  83. package/dist/components/dashboard/item-list.cjs +2 -2
  84. package/dist/components/dashboard/item-list.js +2 -2
  85. package/dist/components/dashboard/layout.cjs +1 -1
  86. package/dist/components/dashboard/layout.js +1 -1
  87. package/dist/components/dashboard/metric.cjs +1 -1
  88. package/dist/components/dashboard/metric.js +1 -1
  89. package/dist/components/dashboard/stale-indicator.cjs +1 -1
  90. package/dist/components/dashboard/stale-indicator.js +1 -1
  91. package/dist/components/dashboard/status.cjs +6 -2
  92. package/dist/components/dashboard/status.js +7 -3
  93. package/dist/components/dashboard/tone.cjs +9 -1
  94. package/dist/components/dashboard/tone.d.cts +7 -1
  95. package/dist/components/dashboard/tone.d.ts +7 -1
  96. package/dist/components/dashboard/tone.js +8 -0
  97. package/dist/components/dashboard/typography.cjs +4 -4
  98. package/dist/components/dashboard/typography.d.cts +1 -1
  99. package/dist/components/dashboard/typography.d.ts +1 -1
  100. package/dist/components/dashboard/typography.js +4 -4
  101. package/dist/components/model-selection/available-model-picker.cjs +6 -6
  102. package/dist/components/model-selection/available-model-picker.js +6 -6
  103. package/dist/components/model-selection/thinking-level-picker.cjs +1 -1
  104. package/dist/components/model-selection/thinking-level-picker.js +1 -1
  105. package/dist/components/model-selection/thinking-picker.cjs +70 -0
  106. package/dist/components/model-selection/thinking-picker.d.cts +12 -0
  107. package/dist/components/model-selection/thinking-picker.d.ts +12 -0
  108. package/dist/components/model-selection/thinking-picker.js +70 -0
  109. package/dist/components/ui/accordion.cjs +2 -2
  110. package/dist/components/ui/accordion.js +2 -2
  111. package/dist/components/ui/alert-dialog.cjs +4 -2
  112. package/dist/components/ui/alert-dialog.js +4 -2
  113. package/dist/components/ui/alert.cjs +2 -2
  114. package/dist/components/ui/alert.js +2 -2
  115. package/dist/components/ui/avatar.cjs +2 -2
  116. package/dist/components/ui/avatar.js +2 -2
  117. package/dist/components/ui/breadcrumb.cjs +1 -1
  118. package/dist/components/ui/breadcrumb.js +1 -1
  119. package/dist/components/ui/button-group.cjs +1 -1
  120. package/dist/components/ui/button-group.js +1 -1
  121. package/dist/components/ui/button.cjs +1 -1
  122. package/dist/components/ui/button.js +1 -1
  123. package/dist/components/ui/calendar.cjs +2 -2
  124. package/dist/components/ui/calendar.js +2 -2
  125. package/dist/components/ui/card.cjs +1 -1
  126. package/dist/components/ui/card.js +1 -1
  127. package/dist/components/ui/carousel.cjs +3 -2
  128. package/dist/components/ui/carousel.js +2 -1
  129. package/dist/components/ui/chart.cjs +36 -27
  130. package/dist/components/ui/chart.d.cts +21 -17
  131. package/dist/components/ui/chart.d.ts +21 -17
  132. package/dist/components/ui/chart.js +30 -21
  133. package/dist/components/ui/combobox.cjs +7 -5
  134. package/dist/components/ui/combobox.js +7 -5
  135. package/dist/components/ui/command.cjs +3 -3
  136. package/dist/components/ui/command.js +3 -3
  137. package/dist/components/ui/context-menu.cjs +10 -7
  138. package/dist/components/ui/context-menu.js +10 -7
  139. package/dist/components/ui/dialog.cjs +4 -2
  140. package/dist/components/ui/dialog.js +4 -2
  141. package/dist/components/ui/drawer.cjs +4 -2
  142. package/dist/components/ui/drawer.js +4 -2
  143. package/dist/components/ui/dropdown-menu.cjs +10 -7
  144. package/dist/components/ui/dropdown-menu.js +10 -7
  145. package/dist/components/ui/empty.cjs +2 -2
  146. package/dist/components/ui/empty.js +2 -2
  147. package/dist/components/ui/field.cjs +5 -5
  148. package/dist/components/ui/field.js +5 -5
  149. package/dist/components/ui/form.cjs +2 -2
  150. package/dist/components/ui/form.js +2 -2
  151. package/dist/components/ui/hover-card.cjs +3 -1
  152. package/dist/components/ui/hover-card.js +3 -1
  153. package/dist/components/ui/input-group.cjs +3 -3
  154. package/dist/components/ui/input-group.js +3 -3
  155. package/dist/components/ui/input-otp.cjs +1 -1
  156. package/dist/components/ui/input-otp.js +1 -1
  157. package/dist/components/ui/input.cjs +1 -1
  158. package/dist/components/ui/input.js +1 -1
  159. package/dist/components/ui/item.cjs +3 -3
  160. package/dist/components/ui/item.js +3 -3
  161. package/dist/components/ui/label.cjs +1 -1
  162. package/dist/components/ui/label.js +1 -1
  163. package/dist/components/ui/menubar.cjs +9 -7
  164. package/dist/components/ui/menubar.js +9 -7
  165. package/dist/components/ui/native-select.cjs +1 -1
  166. package/dist/components/ui/native-select.js +1 -1
  167. package/dist/components/ui/navigation-menu.cjs +2 -2
  168. package/dist/components/ui/navigation-menu.js +2 -2
  169. package/dist/components/ui/plugin-safety-disclaimer.cjs +1 -1
  170. package/dist/components/ui/plugin-safety-disclaimer.js +1 -1
  171. package/dist/components/ui/popover.cjs +4 -2
  172. package/dist/components/ui/popover.js +4 -2
  173. package/dist/components/ui/select.cjs +5 -3
  174. package/dist/components/ui/select.js +5 -3
  175. package/dist/components/ui/sheet.cjs +4 -2
  176. package/dist/components/ui/sheet.js +4 -2
  177. package/dist/components/ui/sidebar.cjs +5 -5
  178. package/dist/components/ui/sidebar.js +5 -5
  179. package/dist/components/ui/table.cjs +2 -2
  180. package/dist/components/ui/table.js +2 -2
  181. package/dist/components/ui/tabs.cjs +1 -1
  182. package/dist/components/ui/tabs.js +1 -1
  183. package/dist/components/ui/textarea.cjs +1 -1
  184. package/dist/components/ui/textarea.js +1 -1
  185. package/dist/components/ui/toggle.cjs +1 -1
  186. package/dist/components/ui/toggle.js +1 -1
  187. package/dist/components/ui/tooltip.cjs +3 -1
  188. package/dist/components/ui/tooltip.js +3 -1
  189. package/dist/index.cjs +5 -1
  190. package/dist/index.d.cts +4 -1
  191. package/dist/index.d.ts +4 -1
  192. package/dist/index.js +5 -1
  193. package/dist/plugin-style-scope-context.cjs +10 -0
  194. package/dist/plugin-style-scope-context.d.cts +13 -0
  195. package/dist/plugin-style-scope-context.d.ts +13 -0
  196. package/dist/plugin-style-scope-context.js +10 -0
  197. package/dist/plugin-style-scope.cjs +25 -0
  198. package/dist/plugin-style-scope.d.cts +11 -0
  199. package/dist/plugin-style-scope.d.ts +11 -0
  200. package/dist/plugin-style-scope.js +25 -0
  201. package/dist/reference.cjs +1251 -3
  202. package/dist/reference.d.cts +11 -5
  203. package/dist/reference.d.ts +11 -5
  204. package/dist/reference.js +1224 -6
  205. package/dist/styles/globals.css +22 -3
  206. package/dist/styles/plugin-theme.css +80 -0
  207. package/dist/styles/plugin.css +14 -2
  208. package/package.json +53 -70
  209. package/scripts/ensure-pnpm-publish.mjs +23 -0
  210. package/scripts/smoke-dist.mjs +68 -0
  211. package/src/components/ai-elements/agent.tsx +6 -6
  212. package/src/components/ai-elements/artifact.tsx +2 -2
  213. package/src/components/ai-elements/attachments.tsx +2 -2
  214. package/src/components/ai-elements/chain-of-thought.tsx +2 -2
  215. package/src/components/ai-elements/code-block.tsx +6 -3
  216. package/src/components/ai-elements/commit.tsx +2 -2
  217. package/src/components/ai-elements/confirmation.tsx +1 -1
  218. package/src/components/ai-elements/conversation.tsx +2 -2
  219. package/src/components/ai-elements/environment-variables.tsx +3 -3
  220. package/src/components/ai-elements/file-tree.tsx +1 -1
  221. package/src/components/ai-elements/inline-citation.tsx +3 -3
  222. package/src/components/ai-elements/jsx-preview.tsx +1 -1
  223. package/src/components/ai-elements/message.tsx +1 -1
  224. package/src/components/ai-elements/package-info.tsx +4 -4
  225. package/src/components/ai-elements/prompt-input-context.tsx +3 -2
  226. package/src/components/ai-elements/queue.tsx +2 -2
  227. package/src/components/ai-elements/reasoning.tsx +2 -2
  228. package/src/components/ai-elements/sandbox.tsx +3 -3
  229. package/src/components/ai-elements/schema-display.tsx +12 -12
  230. package/src/components/ai-elements/speech-input.tsx +17 -0
  231. package/src/components/ai-elements/stack-trace.tsx +1 -1
  232. package/src/components/ai-elements/task.tsx +3 -3
  233. package/src/components/ai-elements/terminal.tsx +2 -2
  234. package/src/components/ai-elements/test-results.tsx +4 -4
  235. package/src/components/ai-elements/tool.tsx +4 -4
  236. package/src/components/ai-elements/transcription.tsx +1 -1
  237. package/src/components/ai-elements/web-preview.tsx +2 -2
  238. package/src/components/context-editor/CapabilitySection.tsx +2 -2
  239. package/src/components/context-editor/ContextEditor.tsx +2 -2
  240. package/src/components/context-editor/PresetBar.tsx +3 -3
  241. package/src/components/context-editor/SystemPromptSection.tsx +4 -4
  242. package/src/components/context-editor/parts.tsx +6 -6
  243. package/src/components/dashboard/__tests__/catalog.test.ts +7 -2
  244. package/src/components/dashboard/__tests__/state.test.tsx +19 -2
  245. package/src/components/dashboard/activity-list.tsx +2 -2
  246. package/src/components/dashboard/catalog.json +312 -0
  247. package/src/components/dashboard/catalog.ts +6 -328
  248. package/src/components/dashboard/empty-state.tsx +1 -1
  249. package/src/components/dashboard/index.ts +2 -2
  250. package/src/components/dashboard/item-list.tsx +2 -2
  251. package/src/components/dashboard/layout.tsx +1 -1
  252. package/src/components/dashboard/metric.tsx +1 -1
  253. package/src/components/dashboard/stale-indicator.tsx +1 -1
  254. package/src/components/dashboard/status.tsx +15 -2
  255. package/src/components/dashboard/tone.ts +13 -0
  256. package/src/components/dashboard/typography.tsx +5 -5
  257. package/src/components/model-selection/available-model-picker.tsx +7 -7
  258. package/src/components/model-selection/thinking-level-picker.tsx +1 -1
  259. package/src/components/model-selection/thinking-picker.tsx +90 -0
  260. package/src/components/ui/accordion.tsx +2 -2
  261. package/src/components/ui/alert-dialog.tsx +4 -2
  262. package/src/components/ui/alert.tsx +2 -2
  263. package/src/components/ui/avatar.tsx +2 -2
  264. package/src/components/ui/breadcrumb.tsx +1 -1
  265. package/src/components/ui/button-group.tsx +1 -1
  266. package/src/components/ui/button.tsx +1 -1
  267. package/src/components/ui/calendar.tsx +3 -3
  268. package/src/components/ui/card.tsx +1 -1
  269. package/src/components/ui/carousel.tsx +2 -1
  270. package/src/components/ui/chart.tsx +54 -36
  271. package/src/components/ui/combobox.tsx +7 -5
  272. package/src/components/ui/command.tsx +3 -3
  273. package/src/components/ui/context-menu.tsx +10 -7
  274. package/src/components/ui/dialog.tsx +4 -2
  275. package/src/components/ui/drawer.tsx +4 -2
  276. package/src/components/ui/dropdown-menu.tsx +10 -7
  277. package/src/components/ui/empty.tsx +2 -2
  278. package/src/components/ui/field.tsx +5 -5
  279. package/src/components/ui/form.tsx +2 -2
  280. package/src/components/ui/hover-card.tsx +3 -1
  281. package/src/components/ui/input-group.tsx +3 -3
  282. package/src/components/ui/input-otp.tsx +1 -1
  283. package/src/components/ui/input.tsx +1 -1
  284. package/src/components/ui/item.tsx +3 -3
  285. package/src/components/ui/label.tsx +1 -1
  286. package/src/components/ui/menubar.tsx +9 -7
  287. package/src/components/ui/native-select.tsx +1 -1
  288. package/src/components/ui/navigation-menu.tsx +2 -2
  289. package/src/components/ui/plugin-safety-disclaimer.tsx +1 -1
  290. package/src/components/ui/popover.tsx +4 -2
  291. package/src/components/ui/select.tsx +5 -3
  292. package/src/components/ui/sheet.tsx +4 -2
  293. package/src/components/ui/sidebar.tsx +5 -5
  294. package/src/components/ui/table.tsx +2 -2
  295. package/src/components/ui/tabs.tsx +1 -1
  296. package/src/components/ui/textarea.tsx +1 -1
  297. package/src/components/ui/toggle.tsx +1 -1
  298. package/src/components/ui/tooltip.tsx +3 -1
  299. package/src/index.ts +5 -1
  300. package/src/plugin-style-scope-context.ts +21 -0
  301. package/src/plugin-style-scope.test.tsx +38 -0
  302. package/src/plugin-style-scope.tsx +35 -0
  303. package/src/styles/globals.css +22 -3
  304. package/src/styles/plugin-theme.css +80 -0
  305. package/src/styles/plugin.css +14 -2
  306. package/tsup.config.ts +13 -3
  307. package/tsup.reference.config.ts +15 -0
  308. package/dist/components/reference/ActivityExample.cjs +0 -47
  309. package/dist/components/reference/ActivityExample.d.cts +0 -5
  310. package/dist/components/reference/ActivityExample.d.ts +0 -5
  311. package/dist/components/reference/ActivityExample.js +0 -47
  312. package/dist/components/reference/ResourceExample.cjs +0 -54
  313. package/dist/components/reference/ResourceExample.d.cts +0 -5
  314. package/dist/components/reference/ResourceExample.d.ts +0 -5
  315. package/dist/components/reference/ResourceExample.js +0 -54
  316. package/dist/components/reference/SchedulerExample.cjs +0 -68
  317. package/dist/components/reference/SchedulerExample.d.cts +0 -5
  318. package/dist/components/reference/SchedulerExample.d.ts +0 -5
  319. package/dist/components/reference/SchedulerExample.js +0 -68
  320. package/dist/components/reference/StarterExample.cjs +0 -34
  321. package/dist/components/reference/StarterExample.d.cts +0 -5
  322. package/dist/components/reference/StarterExample.d.ts +0 -5
  323. package/dist/components/reference/StarterExample.js +0 -34
  324. package/dist/components/reference/index.cjs +0 -10
  325. package/dist/components/reference/index.d.cts +0 -5
  326. package/dist/components/reference/index.d.ts +0 -5
  327. package/dist/components/reference/index.js +0 -10
  328. package/dist/dashboard-catalog.cjs +0 -8
  329. package/dist/dashboard-catalog.d.cts +0 -1
  330. package/dist/dashboard-catalog.d.ts +0 -1
  331. package/dist/dashboard-catalog.js +0 -8
  332. package/src/dashboard-catalog.ts +0 -13
@@ -1,11 +1,11 @@
1
- // Dashboard component catalogue — the source of truth for discovery.
1
+ // Dashboard component catalogue — type for the JSON source of truth.
2
2
  //
3
- // This is package metadata, not a runtime service. It changes through normal
4
- // source review and ships with @sero-ai/ui. Widget code imports the React
5
- // components from "@sero-ai/ui"; tooling and the agent read this metadata via
6
- // "@sero-ai/ui/dashboard-catalog" to discover the supported vocabulary.
3
+ // The catalogue data lives in `catalog.json` (plain data, no compiler needed)
4
+ // and ships as `@sero-ai/ui/dashboard-catalog.json`. Tooling and the agent read
5
+ // that file directly; this module only provides the entry type so TypeScript
6
+ // callers can type the parsed JSON.
7
7
  //
8
- // Keep this in step with the two readable views on release:
8
+ // Keep `catalog.json` in step with the two readable views on release:
9
9
  // - packages/templates/skills/sero-dashboard-ui/references/component-catalog.md
10
10
  // - the docs-site dashboard component catalogue page
11
11
  // (Generation + drift validation is a deferred follow-up.)
@@ -27,325 +27,3 @@ export interface DashboardComponentCatalogEntry {
27
27
  status: "stable" | "experimental";
28
28
  example?: string;
29
29
  }
30
-
31
- export const dashboardComponentCatalog: DashboardComponentCatalogEntry[] = [
32
- // ── Layout and structure ──────────────────────────────────────
33
- {
34
- name: "WidgetContent",
35
- category: "layout",
36
- kind: "composite",
37
- summary:
38
- "Full-height widget frame with standard padding and a container-query boundary.",
39
- useWhen: "As the outermost element of every dashboard widget.",
40
- related: ["Stack", "Inline"],
41
- status: "stable",
42
- example: "<WidgetContent><Stack gap=\"sm\">…</Stack></WidgetContent>",
43
- },
44
- {
45
- name: "Stack",
46
- category: "layout",
47
- kind: "composite",
48
- summary: "Vertical layout with semantic spacing, alignment and optional scrolling.",
49
- useWhen: "For the primary top-to-bottom content flow inside a widget.",
50
- related: ["Inline", "WidgetContent"],
51
- status: "stable",
52
- example: "<Stack gap=\"sm\" scroll>…</Stack>",
53
- },
54
- {
55
- name: "Inline",
56
- category: "layout",
57
- kind: "composite",
58
- summary: "Horizontal layout with spacing, alignment, wrap and justify.",
59
- useWhen: "For a row of items such as a header with a trailing action.",
60
- related: ["Stack"],
61
- status: "stable",
62
- example: "<Inline justify=\"between\" align=\"center\">…</Inline>",
63
- },
64
- {
65
- name: "Grid",
66
- category: "layout",
67
- kind: "composite",
68
- summary: "Responsive grid with bounded columns and gap.",
69
- useWhen: "For metric and summary layouts that reflow by width.",
70
- related: ["MetricGroup"],
71
- status: "stable",
72
- example: "<Grid columns=\"auto\" minColumnWidth={120}>…</Grid>",
73
- },
74
- {
75
- name: "Section",
76
- category: "layout",
77
- kind: "composite",
78
- summary: "Compact section with optional heading, description and trailing action.",
79
- useWhen: "To group related content under a labelled heading.",
80
- related: ["Divider", "Heading"],
81
- status: "stable",
82
- example: "<Section heading=\"Summary\" action={…}>…</Section>",
83
- },
84
- {
85
- name: "Divider",
86
- category: "layout",
87
- kind: "composite",
88
- summary: "Compact horizontal or vertical divider built on Separator.",
89
- useWhen: "To separate sections without a heavy border.",
90
- related: ["Section"],
91
- status: "stable",
92
- example: "<Divider spacing=\"sm\" />",
93
- },
94
- // ── Typography and media ──────────────────────────────────────
95
- {
96
- name: "Text",
97
- category: "typography",
98
- kind: "composite",
99
- summary:
100
- "Semantic text variants (body, label, supporting, muted, numeric) with truncation.",
101
- useWhen: "For any text, instead of ad-hoc font-size utilities.",
102
- related: ["Heading"],
103
- status: "stable",
104
- example: "<Text variant=\"label\">Jobs</Text>",
105
- },
106
- {
107
- name: "Heading",
108
- category: "typography",
109
- kind: "composite",
110
- summary: "Compact heading levels and sizes that keep correct HTML semantics.",
111
- useWhen: "For section and view titles.",
112
- related: ["Section", "Text"],
113
- status: "stable",
114
- example: "<Heading level={2} size=\"md\">Overview</Heading>",
115
- },
116
- {
117
- name: "Icon",
118
- category: "typography",
119
- kind: "composite",
120
- summary: "Consistent icon wrapper for size, tone and accessibility.",
121
- useWhen: "To render an icon component with a shared size and tone.",
122
- related: ["IconButton"],
123
- status: "stable",
124
- example: "<Icon icon={Clock} size=\"sm\" tone=\"warning\" />",
125
- },
126
- // ── Data display ──────────────────────────────────────────────
127
- {
128
- name: "Metric",
129
- category: "data-display",
130
- kind: "composite",
131
- summary: "Label + value with optional icon, supporting text and trend.",
132
- useWhen: "To show a single number inline.",
133
- related: ["MetricCard", "MetricGroup"],
134
- status: "stable",
135
- example: "<Metric label=\"Jobs\" value={6} />",
136
- },
137
- {
138
- name: "MetricCard",
139
- category: "data-display",
140
- kind: "composite",
141
- summary: "A contained surface for a Metric or compact summary.",
142
- useWhen: "To give a metric its own bounded card.",
143
- related: ["Metric", "MetricGroup"],
144
- status: "stable",
145
- example: "<MetricCard><Metric label=\"Jobs\" value={6} /></MetricCard>",
146
- },
147
- {
148
- name: "MetricGroup",
149
- category: "data-display",
150
- kind: "composite",
151
- summary: "Arranges multiple metrics responsively in a bounded grid.",
152
- useWhen: "To show several metrics that reflow by width.",
153
- related: ["Metric", "Grid"],
154
- status: "stable",
155
- example: "<MetricGroup><Metric … /><Metric … /></MetricGroup>",
156
- },
157
- {
158
- name: "Status",
159
- category: "data-display",
160
- kind: "composite",
161
- summary: "Semantic status dot, label or pill with neutral/success/warning/error/info tones.",
162
- useWhen: "To show a health or state indicator. Map domain status onto a tone.",
163
- related: ["Badge"],
164
- status: "stable",
165
- example: "<Status tone=\"success\">Active</Status>",
166
- },
167
- {
168
- name: "Badge",
169
- category: "data-display",
170
- kind: "primitive",
171
- summary: "Existing badge primitive, extended with success/warning/info tones.",
172
- useWhen: "For compact counts, tags and category labels.",
173
- related: ["Status"],
174
- status: "stable",
175
- example: "<Badge variant=\"success\">Passed</Badge>",
176
- },
177
- {
178
- name: "KeyValue",
179
- category: "data-display",
180
- kind: "composite",
181
- summary: "A single label/value row with predictable alignment and truncation.",
182
- useWhen: "For metadata, totals and configuration summaries.",
183
- related: ["KeyValueList"],
184
- status: "stable",
185
- example: "<KeyValue label=\"Region\" value=\"eu-west-1\" mono />",
186
- },
187
- {
188
- name: "KeyValueList",
189
- category: "data-display",
190
- kind: "composite",
191
- summary: "A vertical list of KeyValue rows.",
192
- useWhen: "For a block of metadata pairs.",
193
- related: ["KeyValue"],
194
- status: "stable",
195
- example: "<KeyValueList><KeyValue … /></KeyValueList>",
196
- },
197
- {
198
- name: "ItemList",
199
- category: "data-display",
200
- kind: "composite",
201
- summary: "Compact rows with leading media, text, trailing metadata, actions and overflow.",
202
- useWhen: "For entity lists (files, notes, results).",
203
- related: ["ItemListItem", "ActivityList"],
204
- status: "stable",
205
- example: "<ItemList overflowCount={3}><ItemListItem … /></ItemList>",
206
- },
207
- {
208
- name: "ItemListItem",
209
- category: "data-display",
210
- kind: "composite",
211
- summary: "A single compact list row with media, primary/secondary text and actions.",
212
- useWhen: "As the row inside an ItemList.",
213
- related: ["ItemList"],
214
- status: "stable",
215
- example: "<ItemListItem primary=\"Report.pdf\" trailing=\"2h\" />",
216
- },
217
- {
218
- name: "ActivityList",
219
- category: "data-display",
220
- kind: "composite",
221
- summary: "A chronological list for recent events with a shared overflow footer.",
222
- useWhen: "For time-ordered activity or upcoming events.",
223
- related: ["ActivityListItem", "ItemList"],
224
- status: "stable",
225
- example: "<ActivityList><ActivityListItem … /></ActivityList>",
226
- },
227
- {
228
- name: "ActivityListItem",
229
- category: "data-display",
230
- kind: "composite",
231
- summary: "An event row with a status marker or icon, label, timestamp and detail.",
232
- useWhen: "As the row inside an ActivityList.",
233
- related: ["ActivityList", "Status"],
234
- status: "stable",
235
- example: "<ActivityListItem label=\"Backup\" timestamp=\"08:00\" tone=\"success\" />",
236
- },
237
- {
238
- name: "ProgressRing",
239
- category: "data-display",
240
- kind: "composite",
241
- summary: "Accessible circular progress / donut gauge, no charting dependency.",
242
- useWhen: "For a bounded value such as a success rate or usage percentage.",
243
- related: ["Metric"],
244
- status: "stable",
245
- example: "<ProgressRing value={75} label=\"Success rate\" tone=\"success\" />",
246
- },
247
- {
248
- name: "StaleIndicator",
249
- category: "data-display",
250
- kind: "composite",
251
- summary: "Compact hint that data may be out of date, with optional refresh action.",
252
- useWhen: "When displayed data can lag its source.",
253
- related: ["DataBoundary"],
254
- status: "stable",
255
- example: "<StaleIndicator lastUpdated=\"Updated 5m ago\" onRefresh={…} />",
256
- },
257
- // ── Runtime states and feedback ───────────────────────────────
258
- {
259
- name: "DataBoundary",
260
- category: "state",
261
- kind: "composite",
262
- summary: "Selects presentation for loading / ready / empty / stale / error states.",
263
- useWhen: "To switch a widget's content by data state without owning fetching.",
264
- related: ["EmptyState", "MetricSkeleton", "StaleIndicator"],
265
- status: "stable",
266
- example: "<DataBoundary state={state} loading={…} empty={…} error={…}>…</DataBoundary>",
267
- },
268
- {
269
- name: "EmptyState",
270
- category: "state",
271
- kind: "composite",
272
- summary: "Compact empty state built on the Empty primitives.",
273
- useWhen: "When there is nothing to show yet.",
274
- related: ["DataBoundary"],
275
- status: "stable",
276
- example: "<EmptyState icon={Inbox} title=\"No activity yet\" />",
277
- },
278
- {
279
- name: "Alert",
280
- category: "state",
281
- kind: "primitive",
282
- summary: "Existing alert primitive for inline warnings and errors.",
283
- useWhen: "For a persistent inline message inside a widget or view.",
284
- related: ["DataBoundary"],
285
- status: "stable",
286
- example: "<Alert variant=\"destructive\">Failed to load</Alert>",
287
- },
288
- {
289
- name: "MetricSkeleton",
290
- category: "state",
291
- kind: "composite",
292
- summary: "Loading placeholder for a row of metrics.",
293
- useWhen: "As the `loading` fallback for metric layouts.",
294
- related: ["DataBoundary", "ListSkeleton"],
295
- status: "stable",
296
- example: "<MetricSkeleton count={3} />",
297
- },
298
- {
299
- name: "ListSkeleton",
300
- category: "state",
301
- kind: "composite",
302
- summary: "Loading placeholder for a list of rows.",
303
- useWhen: "As the `loading` fallback for item lists.",
304
- related: ["DataBoundary", "ItemList"],
305
- status: "stable",
306
- example: "<ListSkeleton count={4} />",
307
- },
308
- {
309
- name: "ActivitySkeleton",
310
- category: "state",
311
- kind: "composite",
312
- summary: "Loading placeholder for an activity list.",
313
- useWhen: "As the `loading` fallback for activity feeds.",
314
- related: ["DataBoundary", "ActivityList"],
315
- status: "stable",
316
- example: "<ActivitySkeleton count={4} />",
317
- },
318
- {
319
- name: "Skeleton",
320
- category: "state",
321
- kind: "primitive",
322
- summary: "Existing skeleton primitive for bespoke loading shapes.",
323
- useWhen: "When the prebuilt skeleton patterns do not fit.",
324
- related: ["MetricSkeleton", "ListSkeleton", "ActivitySkeleton"],
325
- status: "stable",
326
- example: "<Skeleton className=\"h-4 w-24\" />",
327
- },
328
- // ── Actions ───────────────────────────────────────────────────
329
- {
330
- name: "Button",
331
- category: "action",
332
- kind: "primitive",
333
- summary: "Existing button primitive, the standard text-action control.",
334
- useWhen: "For a labelled action.",
335
- related: ["IconButton"],
336
- status: "stable",
337
- example: "<Button size=\"sm\">Open</Button>",
338
- },
339
- {
340
- name: "IconButton",
341
- category: "action",
342
- kind: "composite",
343
- summary: "Small icon-only button with a required accessible label.",
344
- useWhen: "For a compact action such as refresh or dismiss.",
345
- related: ["Button", "Icon"],
346
- status: "stable",
347
- example: "<IconButton icon={RotateCw} label=\"Refresh\" size=\"xs\" />",
348
- },
349
- ];
350
-
351
- export default dashboardComponentCatalog;
@@ -53,7 +53,7 @@ function EmptyState({
53
53
  <Icon icon={icon} size="md" className="text-current" />
54
54
  </EmptyMedia>
55
55
  )}
56
- <EmptyTitle className="text-sm font-medium text-[var(--text-primary)]">
56
+ <EmptyTitle className="text-base font-medium text-[var(--text-primary)]">
57
57
  {title}
58
58
  </EmptyTitle>
59
59
  {message && (
@@ -1,8 +1,8 @@
1
1
  // @sero-ai/ui dashboard components — shared compact presentation for widgets
2
2
  // and full plugin views. Import from the package root: `@sero-ai/ui`.
3
3
  //
4
- // The component catalogue (metadata for discovery tooling) is exported
5
- // separately from `@sero-ai/ui/dashboard-catalog`, not from here.
4
+ // The component catalogue (metadata for discovery tooling) is plain data at
5
+ // `@sero-ai/ui/dashboard-catalog.json`, not exported from here.
6
6
 
7
7
  export * from "./tone";
8
8
  export * from "./spacing";
@@ -65,7 +65,7 @@ function ItemListItem({
65
65
  )}
66
66
  </ItemContent>
67
67
  {trailing && (
68
- <span className="shrink-0 text-[11px] tabular-nums text-[var(--text-muted)]">
68
+ <span className="shrink-0 text-sm tabular-nums text-[var(--text-muted)]">
69
69
  {trailing}
70
70
  </span>
71
71
  )}
@@ -95,7 +95,7 @@ function ItemList({
95
95
  >
96
96
  {children}
97
97
  {overflowCount > 0 && (
98
- <span className="px-2 text-[11px] text-[var(--text-muted)]">
98
+ <span className="px-2 text-sm text-[var(--text-muted)]">
99
99
  +{overflowCount} more
100
100
  </span>
101
101
  )}
@@ -235,7 +235,7 @@ function Section({
235
235
  <div className="flex items-center justify-between gap-2">
236
236
  <div className="flex min-w-0 flex-col gap-0.5">
237
237
  {heading && (
238
- <h3 className="truncate text-[11px] font-semibold uppercase tracking-wider text-[var(--text-muted)]">
238
+ <h3 className="truncate text-sm font-semibold uppercase tracking-wider text-[var(--text-muted)]">
239
239
  {heading}
240
240
  </h3>
241
241
  )}
@@ -67,7 +67,7 @@ function Metric({
67
67
  >
68
68
  <div className="flex items-center gap-1.5">
69
69
  {icon && <Icon icon={icon} size="sm" />}
70
- <span className="truncate text-[11px] font-medium uppercase tracking-wide text-[var(--text-muted)]">
70
+ <span className="truncate text-sm font-medium uppercase tracking-wide text-[var(--text-muted)]">
71
71
  {label}
72
72
  </span>
73
73
  </div>
@@ -31,7 +31,7 @@ function StaleIndicator({
31
31
  <div
32
32
  data-slot="stale-indicator"
33
33
  className={cn(
34
- "flex items-center gap-1.5 text-[11px] text-[var(--text-muted)]",
34
+ "flex items-center gap-1.5 text-sm text-[var(--text-muted)]",
35
35
  className,
36
36
  )}
37
37
  {...props}
@@ -8,7 +8,7 @@
8
8
  import * as React from "react";
9
9
 
10
10
  import { cn } from "../../lib/utils";
11
- import { toneColor, toneDot, tonePill, type Tone } from "./tone";
11
+ import { toneColor, toneDot, toneLabel, tonePill, type Tone } from "./tone";
12
12
 
13
13
  export interface StatusProps extends React.ComponentProps<"span"> {
14
14
  tone?: Tone;
@@ -28,6 +28,16 @@ function Status({
28
28
  ...props
29
29
  }: StatusProps) {
30
30
  const hasLabel = children != null && children !== "";
31
+ const hasAccessibleName =
32
+ props["aria-label"] != null || props["aria-labelledby"] != null;
33
+
34
+ // A bare indicator (no visible children) is otherwise silent to assistive
35
+ // tech. Give it a text alternative — the caller's aria-label if provided,
36
+ // else the generic tone name — so its state is announced, not an empty region.
37
+ const hiddenLabel =
38
+ !hasLabel && !hasAccessibleName ? (
39
+ <span className="sr-only">{toneLabel[tone]}</span>
40
+ ) : null;
31
41
 
32
42
  if (variant === "pill") {
33
43
  return (
@@ -43,6 +53,7 @@ function Status({
43
53
  >
44
54
  <span className={cn("size-1.5 shrink-0 rounded-full", toneDot[tone])} />
45
55
  {children}
56
+ {hiddenLabel}
46
57
  </span>
47
58
  );
48
59
  }
@@ -51,7 +62,8 @@ function Status({
51
62
  <span
52
63
  data-slot="status"
53
64
  data-tone={tone}
54
- // A bare dot carries no text, so surface the tone to assistive tech.
65
+ // A bare dot carries no visible text, so expose its state to assistive
66
+ // tech via role="status" plus the hidden label below.
55
67
  role={hasLabel ? undefined : "status"}
56
68
  className={cn(
57
69
  "inline-flex items-center gap-1.5 text-xs font-medium text-[var(--text-secondary)]",
@@ -68,6 +80,7 @@ function Status({
68
80
  )}
69
81
  />
70
82
  {children}
83
+ {hiddenLabel}
71
84
  </span>
72
85
  );
73
86
  }
@@ -25,6 +25,19 @@ export const toneDot: Record<Tone, string> = {
25
25
  info: "bg-[var(--status-info)]",
26
26
  };
27
27
 
28
+ /**
29
+ * Default accessible name for a tone, used as the text alternative when a
30
+ * status indicator carries no visible label. Generic by design — callers with
31
+ * a domain-specific meaning should pass their own `aria-label`.
32
+ */
33
+ export const toneLabel: Record<Tone, string> = {
34
+ neutral: "Neutral",
35
+ success: "Success",
36
+ warning: "Warning",
37
+ error: "Error",
38
+ info: "Info",
39
+ };
40
+
28
41
  /** Muted tinted background + matching text for a tone (pills, chips). */
29
42
  export const tonePill: Record<Tone, string> = {
30
43
  neutral: "bg-[var(--surface-flat)] text-[var(--text-secondary)]",
@@ -2,7 +2,7 @@
2
2
  //
3
3
  // Text, Heading and Icon give one type scale and one icon treatment so
4
4
  // equivalent text and icons render identically across widgets, replacing the
5
- // scattered `text-[9px]`/`text-[10px]` and per-widget muted colours.
5
+ // scattered `text-xs`/`text-sm` and per-widget muted colours.
6
6
 
7
7
  import * as React from "react";
8
8
  import { cva, type VariantProps } from "class-variance-authority";
@@ -15,13 +15,13 @@ import { toneColor, type Tone } from "./tone";
15
15
  const textVariants = cva("min-w-0", {
16
16
  variants: {
17
17
  variant: {
18
- body: "text-sm text-[var(--text-primary)]",
18
+ body: "text-base text-[var(--text-primary)]",
19
19
  label:
20
- "text-[11px] font-semibold uppercase tracking-wider text-[var(--text-muted)]",
20
+ "text-sm font-semibold uppercase tracking-wider text-[var(--text-muted)]",
21
21
  supporting: "text-xs text-[var(--text-secondary)]",
22
22
  muted: "text-xs text-[var(--text-muted)]",
23
23
  numeric:
24
- "text-sm font-semibold tabular-nums text-[var(--text-primary)]",
24
+ "text-base font-semibold tabular-nums text-[var(--text-primary)]",
25
25
  },
26
26
  },
27
27
  defaultVariants: { variant: "body" },
@@ -72,7 +72,7 @@ function Text({
72
72
 
73
73
  const headingSize = {
74
74
  sm: "text-xs font-semibold",
75
- md: "text-sm font-semibold",
75
+ md: "text-base font-semibold",
76
76
  lg: "text-base font-semibold",
77
77
  } as const;
78
78
 
@@ -102,7 +102,7 @@ export function AvailableModelPicker<
102
102
  role="button"
103
103
  tabIndex={disabled ? -1 : 0}
104
104
  className={cn(
105
- 'flex w-full items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-left text-sm transition-colors',
105
+ 'flex w-full items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-left text-base transition-colors',
106
106
  'hover:bg-secondary/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',
107
107
  disabled && 'cursor-not-allowed opacity-50',
108
108
  className,
@@ -122,13 +122,13 @@ export function AvailableModelPicker<
122
122
  <Sparkles className="size-3 shrink-0 text-amber-500/70" />
123
123
  ) : null}
124
124
  </div>
125
- <div className="truncate text-[11px] text-muted-foreground">
125
+ <div className="truncate text-sm text-muted-foreground">
126
126
  {selected.group.displayName}
127
127
  </div>
128
128
  </div>
129
129
  </>
130
130
  ) : selected.fallbackLabel ? (
131
- <span className="min-w-0 flex-1 truncate font-mono text-xs text-muted-foreground">
131
+ <span className="min-w-0 flex-1 truncate font-mono text-sm text-muted-foreground">
132
132
  {selected.fallbackLabel}
133
133
  </span>
134
134
  ) : (
@@ -169,11 +169,11 @@ export function AvailableModelPicker<
169
169
 
170
170
  <div className="max-h-[280px] overflow-y-auto py-1">
171
171
  {groups.length === 0 ? (
172
- <div className="px-3 py-4 text-center text-xs text-muted-foreground">
172
+ <div className="px-3 py-4 text-center text-sm text-muted-foreground">
173
173
  {noModelsLabel}
174
174
  </div>
175
175
  ) : totalResults === 0 ? (
176
- <div className="px-3 py-4 text-center text-xs text-muted-foreground">
176
+ <div className="px-3 py-4 text-center text-sm text-muted-foreground">
177
177
  {emptyLabel}
178
178
  </div>
179
179
  ) : (
@@ -186,7 +186,7 @@ export function AvailableModelPicker<
186
186
  alt={group.displayName}
187
187
  className="size-3.5 shrink-0 rounded-sm dark:invert"
188
188
  />
189
- <span className="text-[10px] font-semibold uppercase tracking-wider text-muted-foreground">
189
+ <span className="text-sm font-semibold uppercase tracking-wider text-muted-foreground">
190
190
  {group.displayName}
191
191
  </span>
192
192
  </div>
@@ -200,7 +200,7 @@ export function AvailableModelPicker<
200
200
  type="button"
201
201
  onClick={() => handleSelect(model.provider, model.modelId)}
202
202
  className={cn(
203
- 'flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-left text-xs transition-colors',
203
+ 'flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-left text-sm transition-colors',
204
204
  isSelected
205
205
  ? 'bg-secondary text-foreground'
206
206
  : 'text-muted-foreground hover:bg-secondary/60 hover:text-foreground',
@@ -39,7 +39,7 @@ export function ThinkingLevelPicker({
39
39
  disabled={disabled || !isAvailable}
40
40
  onClick={() => onChange(level)}
41
41
  className={cn(
42
- 'rounded-md px-2 py-1.5 text-[11px] font-medium transition-colors',
42
+ 'rounded-md px-2 py-1.5 text-sm font-medium transition-colors',
43
43
  isActive
44
44
  ? 'bg-background text-foreground shadow-sm'
45
45
  : 'text-muted-foreground hover:bg-background/70 hover:text-foreground',