@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
@@ -261,13 +261,13 @@ export const InlineCitationSource = ({
261
261
  }: InlineCitationSourceProps) => (
262
262
  <div className={cn("space-y-1", className)} {...props}>
263
263
  {title && (
264
- <h4 className="truncate font-medium text-sm leading-tight">{title}</h4>
264
+ <h4 className="truncate font-medium text-base leading-tight">{title}</h4>
265
265
  )}
266
266
  {url && (
267
267
  <p className="truncate break-all text-muted-foreground text-xs">{url}</p>
268
268
  )}
269
269
  {description && (
270
- <p className="line-clamp-3 text-muted-foreground text-sm leading-relaxed">
270
+ <p className="line-clamp-3 text-muted-foreground text-base leading-relaxed">
271
271
  {description}
272
272
  </p>
273
273
  )}
@@ -284,7 +284,7 @@ export const InlineCitationQuote = ({
284
284
  }: InlineCitationQuoteProps) => (
285
285
  <blockquote
286
286
  className={cn(
287
- "border-muted border-l-2 pl-3 text-muted-foreground text-sm italic",
287
+ "border-muted border-l-2 pl-3 text-muted-foreground text-base italic",
288
288
  className
289
289
  )}
290
290
  {...props}
@@ -229,7 +229,7 @@ export const JSXPreviewError = memo(
229
229
  return (
230
230
  <div
231
231
  className={cn(
232
- "flex items-center gap-2 rounded-md border border-destructive/50 bg-destructive/10 p-3 text-destructive text-sm",
232
+ "flex items-center gap-2 rounded-md border border-destructive/50 bg-destructive/10 p-3 text-destructive text-base",
233
233
  className
234
234
  )}
235
235
  {...props}
@@ -55,7 +55,7 @@ export const MessageContent = ({
55
55
  }: MessageContentProps) => (
56
56
  <div
57
57
  className={cn(
58
- "is-user:dark flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-sm",
58
+ "is-user:dark flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-base",
59
59
  "group-[.is-user]:ml-auto group-[.is-user]:rounded-lg group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground",
60
60
  "group-[.is-assistant]:text-foreground",
61
61
  className
@@ -83,7 +83,7 @@ export const PackageInfoName = ({
83
83
  return (
84
84
  <div className={cn("flex items-center gap-2", className)} {...props}>
85
85
  <PackageIcon className="size-4 text-muted-foreground" />
86
- <span className="font-medium font-mono text-sm">{children ?? name}</span>
86
+ <span className="font-medium font-mono text-base">{children ?? name}</span>
87
87
  </div>
88
88
  );
89
89
  };
@@ -150,7 +150,7 @@ export const PackageInfoVersion = ({
150
150
  return (
151
151
  <div
152
152
  className={cn(
153
- "mt-2 flex items-center gap-2 font-mono text-muted-foreground text-sm",
153
+ "mt-2 flex items-center gap-2 font-mono text-muted-foreground text-base",
154
154
  className
155
155
  )}
156
156
  {...props}
@@ -177,7 +177,7 @@ export const PackageInfoDescription = ({
177
177
  children,
178
178
  ...props
179
179
  }: PackageInfoDescriptionProps) => (
180
- <p className={cn("mt-2 text-muted-foreground text-sm", className)} {...props}>
180
+ <p className={cn("mt-2 text-muted-foreground text-base", className)} {...props}>
181
181
  {children}
182
182
  </p>
183
183
  );
@@ -222,7 +222,7 @@ export const PackageInfoDependency = ({
222
222
  ...props
223
223
  }: PackageInfoDependencyProps) => (
224
224
  <div
225
- className={cn("flex items-center justify-between text-sm", className)}
225
+ className={cn("flex items-center justify-between text-base", className)}
226
226
  {...props}
227
227
  >
228
228
  {children ?? (
@@ -245,8 +245,9 @@ export const PromptInputActionAddAttachments = ({
245
245
  );
246
246
 
247
247
  return (
248
- <DropdownMenuItem {...props} onSelect={handleSelect}>
249
- <ImageIcon className="mr-2 size-4" /> {label}
248
+ <DropdownMenuItem {...props} onSelect={handleSelect} className="text-sm">
249
+ <ImageIcon className="size-4" />
250
+ {label}
250
251
  </DropdownMenuItem>
251
252
  );
252
253
  };
@@ -37,7 +37,7 @@ export type QueueItemProps = ComponentProps<"li">;
37
37
  export const QueueItem = ({ className, ...props }: QueueItemProps) => (
38
38
  <li
39
39
  className={cn(
40
- "group flex flex-col gap-1 rounded-md px-3 py-1 text-sm transition-colors hover:bg-muted",
40
+ "group flex flex-col gap-1 rounded-md px-3 py-1 text-base transition-colors hover:bg-muted",
41
41
  className
42
42
  )}
43
43
  {...props}
@@ -216,7 +216,7 @@ export const QueueSectionTrigger = ({
216
216
  <CollapsibleTrigger asChild>
217
217
  <button
218
218
  className={cn(
219
- "group flex w-full items-center justify-between rounded-md bg-muted/40 px-3 py-2 text-left font-medium text-muted-foreground text-sm transition-colors hover:bg-muted",
219
+ "group flex w-full items-center justify-between rounded-md bg-muted/40 px-3 py-2 text-left font-medium text-muted-foreground text-base transition-colors hover:bg-muted",
220
220
  className
221
221
  )}
222
222
  type="button"
@@ -177,7 +177,7 @@ export const ReasoningTrigger = memo(
177
177
  return (
178
178
  <CollapsibleTrigger
179
179
  className={cn(
180
- "flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground",
180
+ "flex w-full items-center gap-2 text-muted-foreground text-base transition-colors hover:text-foreground",
181
181
  className
182
182
  )}
183
183
  {...props}
@@ -211,7 +211,7 @@ export const ReasoningContent = memo(
211
211
  ({ className, children, ...props }: ReasoningContentProps) => (
212
212
  <CollapsibleContent
213
213
  className={cn(
214
- "mt-4 text-sm",
214
+ "mt-4 text-base",
215
215
  "data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-muted-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in",
216
216
  className
217
217
  )}
@@ -53,7 +53,7 @@ export const SandboxHeader = ({
53
53
  >
54
54
  <div className="flex items-center gap-2">
55
55
  <Code className="size-4 text-muted-foreground" />
56
- <span className="font-medium text-sm">{title}</span>
56
+ <span className="font-medium text-base">{title}</span>
57
57
  {getStatusBadge(state)}
58
58
  </div>
59
59
  <ChevronDownIcon className="size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180" />
@@ -116,7 +116,7 @@ export const SandboxTabsTrigger = ({
116
116
  }: SandboxTabsTriggerProps) => (
117
117
  <TabsTrigger
118
118
  className={cn(
119
- "rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none",
119
+ "rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-base transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none",
120
120
  className
121
121
  )}
122
122
  {...props}
@@ -129,5 +129,5 @@ export const SandboxTabContent = ({
129
129
  className,
130
130
  ...props
131
131
  }: SandboxTabContentProps) => (
132
- <TabsContent className={cn("mt-0 text-sm", className)} {...props} />
132
+ <TabsContent className={cn("mt-0 text-base", className)} {...props} />
133
133
  );
@@ -174,7 +174,7 @@ export const SchemaDisplayPath = ({
174
174
 
175
175
  return (
176
176
  <span
177
- className={cn("font-mono text-sm", className)}
177
+ className={cn("font-mono text-base", className)}
178
178
  // biome-ignore lint/security/noDangerouslySetInnerHtml: "needed for parameter highlighting"
179
179
  // oxlint-disable-next-line eslint-plugin-react(no-danger)
180
180
  dangerouslySetInnerHTML={{ __html: children ?? highlightedPath }}
@@ -196,7 +196,7 @@ export const SchemaDisplayDescription = ({
196
196
  return (
197
197
  <p
198
198
  className={cn(
199
- "border-b px-4 py-3 text-muted-foreground text-sm",
199
+ "border-b px-4 py-3 text-muted-foreground text-base",
200
200
  className
201
201
  )}
202
202
  {...props}
@@ -231,7 +231,7 @@ export const SchemaDisplayParameters = ({
231
231
  <Collapsible className={cn(className)} defaultOpen {...props}>
232
232
  <CollapsibleTrigger className="group flex w-full items-center gap-2 px-4 py-3 text-left transition-colors hover:bg-muted/50">
233
233
  <ChevronRightIcon className="size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" />
234
- <span className="font-medium text-sm">Parameters</span>
234
+ <span className="font-medium text-base">Parameters</span>
235
235
  <Badge className="ml-auto text-xs" variant="secondary">
236
236
  {parameters?.length}
237
237
  </Badge>
@@ -262,7 +262,7 @@ export const SchemaDisplayParameter = ({
262
262
  }: SchemaDisplayParameterProps) => (
263
263
  <div className={cn("px-4 py-3 pl-10", className)} {...props}>
264
264
  <div className="flex items-center gap-2">
265
- <span className="font-mono text-sm">{name}</span>
265
+ <span className="font-mono text-base">{name}</span>
266
266
  <Badge className="text-xs" variant="outline">
267
267
  {type}
268
268
  </Badge>
@@ -281,7 +281,7 @@ export const SchemaDisplayParameter = ({
281
281
  )}
282
282
  </div>
283
283
  {description && (
284
- <p className="mt-1 text-muted-foreground text-sm">{description}</p>
284
+ <p className="mt-1 text-muted-foreground text-base">{description}</p>
285
285
  )}
286
286
  </div>
287
287
  );
@@ -299,7 +299,7 @@ export const SchemaDisplayRequest = ({
299
299
  <Collapsible className={cn(className)} defaultOpen {...props}>
300
300
  <CollapsibleTrigger className="group flex w-full items-center gap-2 px-4 py-3 text-left transition-colors hover:bg-muted/50">
301
301
  <ChevronRightIcon className="size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" />
302
- <span className="font-medium text-sm">Request Body</span>
302
+ <span className="font-medium text-base">Request Body</span>
303
303
  </CollapsibleTrigger>
304
304
  <CollapsibleContent>
305
305
  <div className="border-t">
@@ -326,7 +326,7 @@ export const SchemaDisplayResponse = ({
326
326
  <Collapsible className={cn(className)} defaultOpen {...props}>
327
327
  <CollapsibleTrigger className="group flex w-full items-center gap-2 px-4 py-3 text-left transition-colors hover:bg-muted/50">
328
328
  <ChevronRightIcon className="size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" />
329
- <span className="font-medium text-sm">Response</span>
329
+ <span className="font-medium text-base">Response</span>
330
330
  </CollapsibleTrigger>
331
331
  <CollapsibleContent>
332
332
  <div className="border-t">
@@ -382,7 +382,7 @@ export const SchemaDisplayProperty = ({
382
382
  style={{ paddingLeft }}
383
383
  >
384
384
  <ChevronRightIcon className="size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" />
385
- <span className="font-mono text-sm">{name}</span>
385
+ <span className="font-mono text-base">{name}</span>
386
386
  <Badge className="text-xs" variant="outline">
387
387
  {type}
388
388
  </Badge>
@@ -397,7 +397,7 @@ export const SchemaDisplayProperty = ({
397
397
  </CollapsibleTrigger>
398
398
  {description && (
399
399
  <p
400
- className="pb-2 text-muted-foreground text-sm"
400
+ className="pb-2 text-muted-foreground text-base"
401
401
  style={{ paddingLeft: paddingLeft + 24 }}
402
402
  >
403
403
  {description}
@@ -434,7 +434,7 @@ export const SchemaDisplayProperty = ({
434
434
  <div className="flex items-center gap-2">
435
435
  {/* Spacer for alignment */}
436
436
  <span className="size-4" />
437
- <span className="font-mono text-sm">{name}</span>
437
+ <span className="font-mono text-base">{name}</span>
438
438
  <Badge className="text-xs" variant="outline">
439
439
  {type}
440
440
  </Badge>
@@ -448,7 +448,7 @@ export const SchemaDisplayProperty = ({
448
448
  )}
449
449
  </div>
450
450
  {description && (
451
- <p className="mt-1 pl-6 text-muted-foreground text-sm">{description}</p>
451
+ <p className="mt-1 pl-6 text-muted-foreground text-base">{description}</p>
452
452
  )}
453
453
  </div>
454
454
  );
@@ -463,7 +463,7 @@ export const SchemaDisplayExample = ({
463
463
  }: SchemaDisplayExampleProps) => (
464
464
  <pre
465
465
  className={cn(
466
- "mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-sm",
466
+ "mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-base",
467
467
  className
468
468
  )}
469
469
  {...props}
@@ -101,6 +101,7 @@ export const SpeechInput = ({
101
101
  const [isRecognitionReady, setIsRecognitionReady] = useState(false);
102
102
  const recognitionRef = useRef<SpeechRecognition | null>(null);
103
103
  const mediaRecorderRef = useRef<MediaRecorder | null>(null);
104
+ const mediaRecorderCleanupRef = useRef<(() => void) | null>(null);
104
105
  const streamRef = useRef<MediaStream | null>(null);
105
106
  const audioChunksRef = useRef<Blob[]>([]);
106
107
  const onTranscriptionChangeRef = useRef<
@@ -184,6 +185,7 @@ export const SpeechInput = ({
184
185
  if (mediaRecorderRef.current?.state === "recording") {
185
186
  mediaRecorderRef.current.stop();
186
187
  }
188
+ mediaRecorderCleanupRef.current?.();
187
189
  if (streamRef.current) {
188
190
  for (const track of streamRef.current.getTracks()) {
189
191
  track.stop();
@@ -216,6 +218,7 @@ export const SpeechInput = ({
216
218
  track.stop();
217
219
  }
218
220
  streamRef.current = null;
221
+ cleanupMediaRecorder();
219
222
 
220
223
  const audioBlob = new Blob(audioChunksRef.current, {
221
224
  type: "audio/webm",
@@ -242,6 +245,19 @@ export const SpeechInput = ({
242
245
  track.stop();
243
246
  }
244
247
  streamRef.current = null;
248
+ cleanupMediaRecorder();
249
+ };
250
+
251
+ const cleanupMediaRecorder = () => {
252
+ mediaRecorder.removeEventListener("dataavailable", handleDataAvailable);
253
+ mediaRecorder.removeEventListener("stop", handleStop);
254
+ mediaRecorder.removeEventListener("error", handleError);
255
+ if (mediaRecorderRef.current === mediaRecorder) {
256
+ mediaRecorderRef.current = null;
257
+ }
258
+ if (mediaRecorderCleanupRef.current === cleanupMediaRecorder) {
259
+ mediaRecorderCleanupRef.current = null;
260
+ }
245
261
  };
246
262
 
247
263
  mediaRecorder.addEventListener("dataavailable", handleDataAvailable);
@@ -249,6 +265,7 @@ export const SpeechInput = ({
249
265
  mediaRecorder.addEventListener("error", handleError);
250
266
 
251
267
  mediaRecorderRef.current = mediaRecorder;
268
+ mediaRecorderCleanupRef.current = cleanupMediaRecorder;
252
269
  mediaRecorder.start();
253
270
  setIsListening(true);
254
271
  } catch {
@@ -197,7 +197,7 @@ export const StackTrace = memo(
197
197
  <StackTraceContext.Provider value={contextValue}>
198
198
  <div
199
199
  className={cn(
200
- "not-prose w-full overflow-hidden rounded-lg border bg-background font-mono text-sm",
200
+ "not-prose w-full overflow-hidden rounded-lg border bg-background font-mono text-base",
201
201
  className
202
202
  )}
203
203
  {...props}
@@ -31,7 +31,7 @@ export const TaskItemFile = ({
31
31
  export type TaskItemProps = ComponentProps<"div">;
32
32
 
33
33
  export const TaskItem = ({ children, className, ...props }: TaskItemProps) => (
34
- <div className={cn("text-muted-foreground text-sm", className)} {...props}>
34
+ <div className={cn("text-muted-foreground text-base", className)} {...props}>
35
35
  {children}
36
36
  </div>
37
37
  );
@@ -58,9 +58,9 @@ export const TaskTrigger = ({
58
58
  }: TaskTriggerProps) => (
59
59
  <CollapsibleTrigger asChild className={cn("group", className)} {...props}>
60
60
  {children ?? (
61
- <div className="flex w-full cursor-pointer items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground">
61
+ <div className="flex w-full cursor-pointer items-center gap-2 text-muted-foreground text-base transition-colors hover:text-foreground">
62
62
  <SearchIcon className="size-4" />
63
- <p className="text-sm">{title}</p>
63
+ <p className="text-base">{title}</p>
64
64
  <ChevronDownIcon className="size-4 transition-transform group-data-[state=open]:rotate-180" />
65
65
  </div>
66
66
  )}
@@ -107,7 +107,7 @@ export const TerminalTitle = ({
107
107
  ...props
108
108
  }: TerminalTitleProps) => (
109
109
  <div
110
- className={cn("flex items-center gap-2 text-sm text-zinc-400", className)}
110
+ className={cn("flex items-center gap-2 text-base text-zinc-400", className)}
111
111
  {...props}
112
112
  >
113
113
  <TerminalIcon className="size-4" />
@@ -258,7 +258,7 @@ export const TerminalContent = ({
258
258
  return (
259
259
  <div
260
260
  className={cn(
261
- "max-h-96 overflow-auto p-4 font-mono text-sm leading-relaxed",
261
+ "max-h-96 overflow-auto p-4 font-mono text-base leading-relaxed",
262
262
  className
263
263
  )}
264
264
  ref={containerRef}
@@ -151,7 +151,7 @@ export const TestResultsDuration = ({
151
151
  }
152
152
 
153
153
  return (
154
- <span className={cn("text-muted-foreground text-sm", className)} {...props}>
154
+ <span className={cn("text-muted-foreground text-base", className)} {...props}>
155
155
  {children ?? formatDuration(summary.duration)}
156
156
  </span>
157
157
  );
@@ -263,7 +263,7 @@ export const TestSuiteName = ({
263
263
  >
264
264
  <ChevronRightIcon className="size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" />
265
265
  <TestStatusIcon status={status} />
266
- <span className="font-medium text-sm">{children ?? name}</span>
266
+ <span className="font-medium text-base">{children ?? name}</span>
267
267
  </CollapsibleTrigger>
268
268
  );
269
269
  };
@@ -353,7 +353,7 @@ export const Test = ({
353
353
  return (
354
354
  <TestContext.Provider value={contextValue}>
355
355
  <div
356
- className={cn("flex items-center gap-2 px-4 py-2 text-sm", className)}
356
+ className={cn("flex items-center gap-2 px-4 py-2 text-base", className)}
357
357
  {...props}
358
358
  >
359
359
  {children ?? (
@@ -469,7 +469,7 @@ export const TestErrorMessage = ({
469
469
  }: TestErrorMessageProps) => (
470
470
  <p
471
471
  className={cn(
472
- "font-medium text-red-700 text-sm dark:text-red-400",
472
+ "font-medium text-red-700 text-base dark:text-red-400",
473
473
  className
474
474
  )}
475
475
  {...props}
@@ -92,7 +92,7 @@ export const ToolHeader = ({
92
92
  {...props}
93
93
  >
94
94
  <div className="flex items-center gap-2">
95
- <WrenchIcon className="size-4 text-muted-foreground" />
95
+ <WrenchIcon className="size-3.5 text-muted-foreground" />
96
96
  <span className="font-medium text-sm">{title ?? derivedName}</span>
97
97
  {getStatusBadge(state)}
98
98
  </div>
@@ -123,7 +123,7 @@ export const ToolInput = ({ className, input, ...props }: ToolInputProps) => (
123
123
  Parameters
124
124
  </h4>
125
125
  <div className="rounded-md bg-muted/50">
126
- <CodeBlock code={JSON.stringify(input, null, 2)} language="json" />
126
+ <CodeBlock className="text-sm" code={JSON.stringify(input, null, 2)} language="json" />
127
127
  </div>
128
128
  </div>
129
129
  );
@@ -147,10 +147,10 @@ export const ToolOutput = ({
147
147
 
148
148
  if (typeof output === "object" && !isValidElement(output)) {
149
149
  Output = (
150
- <CodeBlock code={JSON.stringify(output, null, 2)} language="json" />
150
+ <CodeBlock className="text-sm" code={JSON.stringify(output, null, 2)} language="json" />
151
151
  );
152
152
  } else if (typeof output === "string") {
153
- Output = <CodeBlock code={output} language="json" />;
153
+ Output = <CodeBlock className="text-sm" code={output} language="json" />;
154
154
  }
155
155
 
156
156
  return (
@@ -60,7 +60,7 @@ export const Transcription = ({
60
60
  <TranscriptionContext.Provider value={contextValue}>
61
61
  <div
62
62
  className={cn(
63
- "flex flex-wrap gap-1 text-sm leading-relaxed",
63
+ "flex flex-wrap gap-1 text-base leading-relaxed",
64
64
  className
65
65
  )}
66
66
  data-slot="transcription"
@@ -173,7 +173,7 @@ export const WebPreviewUrl = ({
173
173
 
174
174
  return (
175
175
  <Input
176
- className="h-8 flex-1 text-sm"
176
+ className="h-8 flex-1 text-base"
177
177
  onChange={onChange ?? handleChange}
178
178
  onKeyDown={handleKeyDown}
179
179
  placeholder="Enter URL..."
@@ -227,7 +227,7 @@ export const WebPreviewConsole = ({
227
227
 
228
228
  return (
229
229
  <Collapsible
230
- className={cn("border-t bg-muted/50 font-mono text-sm", className)}
230
+ className={cn("border-t bg-muted/50 font-mono text-base", className)}
231
231
  onOpenChange={setConsoleOpen}
232
232
  open={consoleOpen}
233
233
  {...props}
@@ -53,7 +53,7 @@ export function CapabilitySection<TItem extends ContextToolInfo | ContextSkillIn
53
53
  <div className="space-y-1">
54
54
  {items.length > 0 && (
55
55
  <div className="mb-1 flex items-center justify-between rounded-md border-b border-border/20 px-2 pb-2">
56
- <span className="text-[11px] font-medium text-[var(--text-secondary)]">
56
+ <span className="text-sm font-medium text-[var(--text-secondary)]">
57
57
  {includeAllLabel}
58
58
  </span>
59
59
  <Switch
@@ -75,7 +75,7 @@ export function CapabilitySection<TItem extends ContextToolInfo | ContextSkillIn
75
75
  ))}
76
76
 
77
77
  {items.length === 0 && (
78
- <span className="text-[11px] italic text-[var(--text-muted)]">
78
+ <span className="text-sm italic text-[var(--text-muted)]">
79
79
  {emptyLabel}
80
80
  </span>
81
81
  )}
@@ -81,7 +81,7 @@ export function ContextEditor({
81
81
  showCloseButton
82
82
  >
83
83
  <DialogHeader>
84
- <DialogTitle className="flex items-center gap-2 text-sm">
84
+ <DialogTitle className="flex items-center gap-2 text-base">
85
85
  <Settings2 className="size-4 text-[var(--text-muted)]" />
86
86
  {title}
87
87
  </DialogTitle>
@@ -113,7 +113,7 @@ export function ContextEditor({
113
113
  {applyError && (
114
114
  <div className="flex items-start gap-2 rounded-md border border-status-error-border bg-status-error-muted px-3 py-2">
115
115
  <AlertCircle className="mt-0.5 size-3.5 shrink-0 text-status-error" />
116
- <span className="text-[11px] text-status-error">{applyError}</span>
116
+ <span className="text-sm text-status-error">{applyError}</span>
117
117
  </div>
118
118
  )}
119
119
 
@@ -39,7 +39,7 @@ export function PresetBar({
39
39
  return (
40
40
  <>
41
41
  <div className="flex items-center gap-2">
42
- <span className="text-[11px] font-medium text-[var(--text-muted)]">
42
+ <span className="text-sm font-medium text-[var(--text-muted)]">
43
43
  Preset:
44
44
  </span>
45
45
  <Select value={activePresetId ?? ''} onValueChange={onPresetChange}>
@@ -68,7 +68,7 @@ export function PresetBar({
68
68
  {!showSaveInput && (
69
69
  <button type="button"
70
70
  onClick={onShowSave}
71
- className="flex items-center gap-1 rounded-md px-2 py-1 text-[11px] text-[var(--text-muted)] transition-colors hover:bg-[var(--bg-elevated)] hover:text-[var(--text-secondary)]"
71
+ className="flex items-center gap-1 rounded-md px-2 py-1 text-sm text-[var(--text-muted)] transition-colors hover:bg-[var(--bg-elevated)] hover:text-[var(--text-secondary)]"
72
72
  >
73
73
  <Save className="size-3" />
74
74
  Save as
@@ -78,7 +78,7 @@ export function PresetBar({
78
78
  {hasOverrides && (
79
79
  <button type="button"
80
80
  onClick={onReset}
81
- className="ml-auto flex items-center gap-1 rounded-md px-2 py-1 text-[11px] text-[var(--text-muted)] transition-colors hover:bg-[var(--bg-elevated)] hover:text-[var(--text-secondary)]"
81
+ className="ml-auto flex items-center gap-1 rounded-md px-2 py-1 text-sm text-[var(--text-muted)] transition-colors hover:bg-[var(--bg-elevated)] hover:text-[var(--text-secondary)]"
82
82
  >
83
83
  <RotateCcw className="size-3" />
84
84
  Reset
@@ -59,7 +59,7 @@ export function SystemPromptSection({
59
59
  >
60
60
  <div className="space-y-2">
61
61
  <div className="flex items-center justify-between">
62
- <span className="text-[10px] text-[var(--text-muted)]">
62
+ <span className="text-sm text-[var(--text-muted)]">
63
63
  {systemPrompt === null
64
64
  ? c.defaultHint
65
65
  : systemPrompt === ''
@@ -69,7 +69,7 @@ export function SystemPromptSection({
69
69
  {systemPrompt !== null && (
70
70
  <button type="button"
71
71
  onClick={() => onSystemPromptChange(null)}
72
- className="text-[10px] text-[var(--text-muted)] transition-colors hover:text-[var(--text-secondary)]"
72
+ className="text-sm text-[var(--text-muted)] transition-colors hover:text-[var(--text-secondary)]"
73
73
  >
74
74
  Reset to default
75
75
  </button>
@@ -78,10 +78,10 @@ export function SystemPromptSection({
78
78
  <textarea aria-label="System prompt"
79
79
  value={displayedPrompt}
80
80
  onChange={(event) => onSystemPromptChange(event.target.value)}
81
- className="h-80 w-full resize-y rounded-md border border-border/30 bg-[var(--bg-base)] p-2 font-mono text-[11px] text-[var(--text-secondary)] placeholder:text-[var(--text-muted)] outline-none focus:border-[var(--accent-primary)]"
81
+ className="h-80 w-full resize-y rounded-md border border-border/30 bg-[var(--bg-base)] p-2 font-mono text-sm text-[var(--text-secondary)] placeholder:text-[var(--text-muted)] outline-none focus:border-[var(--accent-primary)]"
82
82
  placeholder={c.placeholder}
83
83
  />
84
- <p className="text-[10px] text-[var(--text-muted)]">{c.footnote}</p>
84
+ <p className="text-sm text-[var(--text-muted)]">{c.footnote}</p>
85
85
  </div>
86
86
  </ContextSection>
87
87
  );
@@ -94,7 +94,7 @@ export function ContextSection({
94
94
  </span>
95
95
 
96
96
  {count !== undefined && (
97
- <span className="text-[11px] text-[var(--text-muted)]">
97
+ <span className="text-sm text-[var(--text-muted)]">
98
98
  ({count})
99
99
  </span>
100
100
  )}
@@ -102,7 +102,7 @@ export function ContextSection({
102
102
  {badge && (
103
103
  <span
104
104
  className={cn(
105
- 'ml-auto rounded-full px-2 py-0.5 text-[10px] font-medium',
105
+ 'ml-auto rounded-full px-2 py-0.5 text-sm font-medium',
106
106
  badgeClass[badgeVariant],
107
107
  )}
108
108
  >
@@ -154,13 +154,13 @@ export function ToggleRow({
154
154
  >
155
155
  <div className="min-w-0 flex-1">
156
156
  <div className={cn(
157
- 'text-[11px] font-medium',
157
+ 'text-sm font-medium',
158
158
  enabled ? 'text-[var(--text-secondary)]' : 'text-[var(--text-muted)]',
159
159
  )}>
160
160
  {name}
161
161
  </div>
162
162
  {description && (
163
- <div className="mt-0.5 text-[10px] leading-snug text-[var(--text-muted)]/60">
163
+ <div className="mt-0.5 text-sm leading-snug text-[var(--text-muted)]/60">
164
164
  {description}
165
165
  </div>
166
166
  )}
@@ -202,13 +202,13 @@ export function SavePresetInput({
202
202
  <button type="button"
203
203
  onClick={() => name.trim() && onSave(name.trim())}
204
204
  disabled={!name.trim()}
205
- className="rounded-md bg-[var(--accent-primary)] px-2 py-1 text-[11px] font-medium text-white disabled:opacity-50"
205
+ className="rounded-md bg-[var(--accent-primary)] px-2 py-1 text-sm font-medium text-white disabled:opacity-50"
206
206
  >
207
207
  Save
208
208
  </button>
209
209
  <button type="button"
210
210
  onClick={onCancel}
211
- className="text-[11px] text-[var(--text-muted)] hover:text-[var(--text-secondary)]"
211
+ className="text-sm text-[var(--text-muted)] hover:text-[var(--text-secondary)]"
212
212
  >
213
213
  Cancel
214
214
  </button>
@@ -1,10 +1,15 @@
1
- // Catalogue integrity — keeps the typed catalogue honest against the exports.
1
+ // Catalogue integrity — keeps the JSON catalogue honest against the exports.
2
2
 
3
3
  import { describe, expect, it } from "vitest";
4
4
 
5
- import { dashboardComponentCatalog } from "../catalog";
5
+ import type { DashboardComponentCatalogEntry } from "../catalog";
6
+ import catalogJson from "../catalog.json";
6
7
  import * as dashboard from "../index";
7
8
 
9
+ // The JSON is the source of truth. JSON imports widen literal unions to
10
+ // `string`, so assert the authored entry shape for the checks below.
11
+ const dashboardComponentCatalog = catalogJson as DashboardComponentCatalogEntry[];
12
+
8
13
  // Reused primitives live in other component folders, not the dashboard barrel.
9
14
  const REUSED_PRIMITIVES = new Set(["Badge", "Alert", "Button", "Skeleton"]);
10
15