@cueplusplus/ui 0.16.0 → 0.17.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 (480) hide show
  1. package/CHANGELOG.md +825 -0
  2. package/README.md +1 -1
  3. package/dist/agent-runtime/tool-call-card.js +7 -3
  4. package/dist/brand/_chassis.d.ts +1 -1
  5. package/dist/brand/cue-mark.d.ts +1 -1
  6. package/dist/brand/cue-mark.js +1 -1
  7. package/dist/charts/ramps.js +1 -1
  8. package/dist/chat/agent-pile.js +2 -1
  9. package/dist/chat/ask-box.js +4 -3
  10. package/dist/chat/delegation-card.js +3 -2
  11. package/dist/chat/message-list.js +3 -2
  12. package/dist/chat/message.js +17 -7
  13. package/dist/chrome/_edge-scroller.js +2 -1
  14. package/dist/chrome/_status-bar.js +9 -3
  15. package/dist/chrome/_tabs-scroll.d.ts +1 -1
  16. package/dist/chrome/_tabs-scroll.js +1 -1
  17. package/dist/chrome/app-bar.js +9 -3
  18. package/dist/chrome/app-shell.js +2 -1
  19. package/dist/chrome/band.d.ts +18 -12
  20. package/dist/chrome/band.js +18 -32
  21. package/dist/chrome/eyebrow.d.ts +13 -5
  22. package/dist/chrome/eyebrow.js +18 -7
  23. package/dist/chrome/footer.d.ts +5 -0
  24. package/dist/chrome/footer.js +14 -3
  25. package/dist/chrome/navigation-menu.js +4 -2
  26. package/dist/chrome/page-shell.js +8 -5
  27. package/dist/chrome/panel.d.ts +5 -2
  28. package/dist/chrome/panel.js +8 -4
  29. package/dist/chrome/row.js +6 -3
  30. package/dist/chrome/scroll-area.js +2 -1
  31. package/dist/chrome/section-header.js +13 -4
  32. package/dist/chrome/segmented-control.js +12 -3
  33. package/dist/chrome/status-bar.js +2 -1
  34. package/dist/chrome/tabs.js +11 -3
  35. package/dist/chrome/toolbar.js +2 -1
  36. package/dist/chrome/tree.js +3 -2
  37. package/dist/color/_thumb.js +9 -3
  38. package/dist/color/color-area.js +1 -1
  39. package/dist/color/color-swatch.js +1 -1
  40. package/dist/configurator/_overrides.js +13 -4
  41. package/dist/configurator/configurator.js +4 -1
  42. package/dist/configurator/export-dialog.js +5 -2
  43. package/dist/configurator/panel-sections.js +6 -2
  44. package/dist/configurator/token-editor.js +4 -1
  45. package/dist/date/calendar.js +12 -8
  46. package/dist/dmx/channel-matrix.js +3 -2
  47. package/dist/dmx/dmx-bar.js +1 -1
  48. package/dist/dmx/dmx-strip.js +1 -1
  49. package/dist/dmx/universe-grid.js +3 -2
  50. package/dist/elements/activity-graph.js +3 -3
  51. package/dist/elements/agent-card.js +3 -3
  52. package/dist/elements/approval-card.js +3 -3
  53. package/dist/elements/artifact-card.js +2 -2
  54. package/dist/elements/background-inbox.js +2 -2
  55. package/dist/elements/canvas-split.js +2 -2
  56. package/dist/elements/chart.js +1 -1
  57. package/dist/elements/chat-panel.js +2 -2
  58. package/dist/elements/checkpoint-history.js +2 -2
  59. package/dist/elements/clamp.js +2 -1
  60. package/dist/elements/code-diff.js +1 -1
  61. package/dist/elements/code-runner.js +1 -1
  62. package/dist/elements/command-palette.js +6 -5
  63. package/dist/elements/comparison-card.js +2 -2
  64. package/dist/elements/composer.js +9 -8
  65. package/dist/elements/computer-use.js +1 -1
  66. package/dist/elements/confidence-marker.js +2 -1
  67. package/dist/elements/connection-state.js +1 -1
  68. package/dist/elements/context-breakdown.js +1 -1
  69. package/dist/elements/context-usage.js +1 -1
  70. package/dist/elements/conversation-search.js +4 -3
  71. package/dist/elements/cost-meter.js +1 -1
  72. package/dist/elements/data-table.js +2 -2
  73. package/dist/elements/day-separator.js +1 -1
  74. package/dist/elements/diagram.js +1 -1
  75. package/dist/elements/document-reference.js +3 -3
  76. package/dist/elements/draft-restore.js +1 -1
  77. package/dist/elements/edit-message.js +4 -3
  78. package/dist/elements/elements.css +26 -5
  79. package/dist/elements/elicitation-form.js +3 -3
  80. package/dist/elements/empty-state.js +2 -1
  81. package/dist/elements/error-state.js +1 -1
  82. package/dist/elements/feedback-dialog.js +4 -3
  83. package/dist/elements/file-tree.js +2 -2
  84. package/dist/elements/flow-graph.js +2 -2
  85. package/dist/elements/guardrail-notice.js +3 -3
  86. package/dist/elements/image-generation.js +1 -1
  87. package/dist/elements/inline-citation.js +3 -3
  88. package/dist/elements/job-progress.js +3 -3
  89. package/dist/elements/launcher-bubble.js +2 -2
  90. package/dist/elements/loading-state.js +1 -1
  91. package/dist/elements/map-answer.js +3 -2
  92. package/dist/elements/markdown.js +5 -4
  93. package/dist/elements/math-block.js +1 -1
  94. package/dist/elements/mcp-server-panel.js +3 -3
  95. package/dist/elements/message-attachment.js +4 -4
  96. package/dist/elements/message-pair.js +1 -1
  97. package/dist/elements/message-queue.js +2 -2
  98. package/dist/elements/mobile-composer.js +4 -3
  99. package/dist/elements/model-picker.js +3 -3
  100. package/dist/elements/onboarding.js +2 -2
  101. package/dist/elements/permission-grant.js +2 -2
  102. package/dist/elements/permission-scopes.js +5 -4
  103. package/dist/elements/prompt-library.js +7 -6
  104. package/dist/elements/queue-dock.js +4 -3
  105. package/dist/elements/quota-banner.js +1 -1
  106. package/dist/elements/quote-reply.js +1 -1
  107. package/dist/elements/read-aloud.js +2 -2
  108. package/dist/elements/reasoning-panel.js +2 -1
  109. package/dist/elements/recommendation-card.d.ts +1 -1
  110. package/dist/elements/recommendation-card.js +2 -2
  111. package/dist/elements/regenerate-menu.js +2 -2
  112. package/dist/elements/research-report.js +1 -1
  113. package/dist/elements/retrieval-chunks.js +1 -1
  114. package/dist/elements/revert-dock.js +5 -4
  115. package/dist/elements/reviewable-diff.js +1 -1
  116. package/dist/elements/schedule-card.js +3 -3
  117. package/dist/elements/score-breakdown.js +1 -1
  118. package/dist/elements/scroll-anchor.js +2 -2
  119. package/dist/elements/settings-panel.js +3 -2
  120. package/dist/elements/shared-conversation.js +2 -2
  121. package/dist/elements/sources.js +4 -3
  122. package/dist/elements/speaker-identity.js +1 -1
  123. package/dist/elements/spec-sheet.js +1 -1
  124. package/dist/elements/streaming-text.js +1 -1
  125. package/dist/elements/subagent-list.js +2 -2
  126. package/dist/elements/suggestions.js +1 -1
  127. package/dist/elements/surfaces.d.ts +1 -1
  128. package/dist/elements/surfaces.js +2 -1
  129. package/dist/elements/tail-status.js +1 -1
  130. package/dist/elements/terminal-block.js +1 -1
  131. package/dist/elements/thread-list.js +1 -1
  132. package/dist/elements/thread-search.js +5 -4
  133. package/dist/elements/timeline.js +1 -1
  134. package/dist/elements/todo-list.js +2 -2
  135. package/dist/elements/tool-call.js +4 -3
  136. package/dist/elements/tool-error.js +2 -2
  137. package/dist/elements/tool-group.js +1 -1
  138. package/dist/elements/tool-timeline.js +4 -3
  139. package/dist/elements/trace-waterfall.js +1 -1
  140. package/dist/elements/verdict-row.js +2 -2
  141. package/dist/elements/voice-conversation.js +3 -2
  142. package/dist/elements/web-preview.js +1 -1
  143. package/dist/elements/web-search.js +2 -2
  144. package/dist/elements/work-collapse.js +2 -1
  145. package/dist/flow/node-card.js +3 -2
  146. package/dist/flow/use-flow-theme.js +2 -1
  147. package/dist/forms/_chassis.d.ts +26 -6
  148. package/dist/forms/_chassis.js +33 -8
  149. package/dist/forms/_listbox.js +8 -5
  150. package/dist/forms/checkbox.js +8 -2
  151. package/dist/forms/env-var-input.js +3 -2
  152. package/dist/forms/field.d.ts +2 -1
  153. package/dist/forms/field.js +15 -4
  154. package/dist/forms/file-upload.js +3 -2
  155. package/dist/forms/number-field.js +2 -1
  156. package/dist/forms/password-input.js +4 -2
  157. package/dist/forms/radio-group.js +6 -2
  158. package/dist/forms/rating.js +2 -1
  159. package/dist/forms/scrub-input.js +2 -1
  160. package/dist/forms/search-input.js +2 -1
  161. package/dist/forms/select.js +5 -2
  162. package/dist/forms/slider.js +6 -2
  163. package/dist/forms/switch.js +6 -2
  164. package/dist/forms/textarea.js +2 -1
  165. package/dist/forms/toggle.js +3 -1
  166. package/dist/index.d.ts +2 -2
  167. package/dist/index.js +2 -2
  168. package/dist/instruments/_data-row.js +2 -1
  169. package/dist/instruments/app-window-frame.js +1 -1
  170. package/dist/instruments/code-block.js +8 -2
  171. package/dist/instruments/group-bar.js +1 -1
  172. package/dist/instruments/ledger.js +6 -2
  173. package/dist/instruments/log-viewer.js +4 -3
  174. package/dist/instruments/progress.js +5 -2
  175. package/dist/instruments/seam-grid.js +5 -3
  176. package/dist/instruments/stat.js +10 -3
  177. package/dist/instruments/table.js +28 -10
  178. package/dist/instruments/terminal-frame.js +4 -2
  179. package/dist/instruments/usage-chart.js +1 -1
  180. package/dist/layout/_collapse.js +6 -1
  181. package/dist/layout/bento.js +7 -4
  182. package/dist/layout/breadcrumb.js +7 -3
  183. package/dist/layout/card.js +12 -6
  184. package/dist/layout/carousel.js +3 -2
  185. package/dist/layout/collapsible.js +5 -1
  186. package/dist/layout/container.js +2 -1
  187. package/dist/layout/description-list.js +4 -1
  188. package/dist/layout/frames.js +11 -5
  189. package/dist/layout/item.js +3 -2
  190. package/dist/layout/link.d.ts +16 -0
  191. package/dist/layout/link.js +22 -3
  192. package/dist/layout/pagination.js +2 -1
  193. package/dist/layout/preview.d.ts +32 -12
  194. package/dist/layout/preview.js +149 -40
  195. package/dist/layout/resizable.js +2 -1
  196. package/dist/layout/sidebar.js +11 -3
  197. package/dist/layout/stepper.js +6 -2
  198. package/dist/lib/cn.js +29 -2
  199. package/dist/midi/piano-keyboard.js +3 -2
  200. package/dist/midi/spectrum-visualizer.js +1 -1
  201. package/dist/midi/threshold-rail.js +2 -1
  202. package/dist/midi/timeline-ruler.js +1 -1
  203. package/dist/overlays/_surface.d.ts +72 -12
  204. package/dist/overlays/_surface.js +84 -12
  205. package/dist/overlays/command-palette.js +9 -5
  206. package/dist/overlays/dialog.d.ts +5 -0
  207. package/dist/overlays/dialog.js +6 -1
  208. package/dist/overlays/info-tip.js +2 -1
  209. package/dist/overlays/menubar.js +3 -1
  210. package/dist/overlays/popover.js +2 -1
  211. package/dist/overlays/toast.js +6 -2
  212. package/dist/overlays/tooltip.js +4 -1
  213. package/dist/primitives/button.d.ts +15 -0
  214. package/dist/primitives/button.js +40 -11
  215. package/dist/primitives/chip.d.ts +19 -1
  216. package/dist/primitives/chip.js +39 -17
  217. package/dist/primitives/kbd.d.ts +6 -0
  218. package/dist/primitives/kbd.js +10 -1
  219. package/dist/primitives/skeleton.js +1 -1
  220. package/dist/system/_focus-ring-field.js +29 -0
  221. package/dist/system/_focus-ring.js +125 -0
  222. package/dist/system/_paint-glow.js +22 -3
  223. package/dist/system/_paint-rest-shade.js +32 -0
  224. package/dist/system/_paint-rim.js +22 -4
  225. package/dist/system/_paint-stroke-surface-1.js +1 -1
  226. package/dist/system/_paint-stroke-surface-2.js +14 -1
  227. package/dist/system/_paint-texture.js +5 -2
  228. package/dist/system/_style-app-bar.js +65 -0
  229. package/dist/system/_style-band.js +57 -0
  230. package/dist/system/_style-body-leading.js +21 -0
  231. package/dist/system/_style-body-size.js +30 -0
  232. package/dist/system/_style-body-weight.js +24 -0
  233. package/dist/system/_style-body.js +27 -0
  234. package/dist/system/_style-caption.js +19 -0
  235. package/dist/system/_style-card-pad.js +43 -0
  236. package/dist/system/_style-check.js +33 -0
  237. package/dist/system/_style-chip.js +103 -0
  238. package/dist/system/_style-code.js +13 -0
  239. package/dist/system/_style-collapse.js +14 -0
  240. package/dist/system/_style-control-face.js +29 -0
  241. package/dist/system/_style-control-label.js +22 -0
  242. package/dist/system/_style-control-step.js +22 -0
  243. package/dist/system/_style-control.js +76 -0
  244. package/dist/system/_style-data-face.js +28 -0
  245. package/dist/system/_style-description.js +23 -0
  246. package/dist/system/_style-eyebrow.js +43 -0
  247. package/dist/system/_style-footer-rule.js +47 -0
  248. package/dist/system/_style-gutter.js +17 -0
  249. package/dist/system/_style-help-ink.js +14 -0
  250. package/dist/system/_style-help.js +29 -0
  251. package/dist/system/_style-input-face.js +34 -0
  252. package/dist/system/_style-kbd.js +46 -0
  253. package/dist/system/_style-label-case.js +36 -0
  254. package/dist/system/_style-label-face.js +32 -0
  255. package/dist/system/_style-label-ink.js +29 -0
  256. package/dist/system/_style-label-leading.js +14 -0
  257. package/dist/system/_style-label-size.js +36 -0
  258. package/dist/system/_style-label-tracking.js +45 -0
  259. package/dist/system/_style-label-weight.js +40 -0
  260. package/dist/system/_style-lede.js +49 -0
  261. package/dist/system/_style-link.js +46 -0
  262. package/dist/system/_style-menu.js +30 -0
  263. package/dist/system/_style-nav-item.js +41 -0
  264. package/dist/system/_style-nav-voice.js +43 -0
  265. package/dist/system/_style-option.js +42 -0
  266. package/dist/system/_style-overlay-title.js +35 -0
  267. package/dist/system/_style-page-title.js +48 -0
  268. package/dist/system/_style-popover-pad.js +13 -0
  269. package/dist/system/_style-quiet-ink.js +13 -0
  270. package/dist/system/_style-row-pad.js +13 -0
  271. package/dist/system/_style-seam.js +43 -0
  272. package/dist/system/_style-section-rule.js +26 -0
  273. package/dist/system/_style-segment.js +30 -0
  274. package/dist/system/_style-segmented-control.js +86 -0
  275. package/dist/system/_style-selected.js +36 -0
  276. package/dist/system/_style-stage-marks.js +26 -0
  277. package/dist/system/_style-tab.js +71 -0
  278. package/dist/system/_style-textarea.js +21 -0
  279. package/dist/system/_style-title.js +37 -0
  280. package/dist/system/_style-tooltip.js +17 -0
  281. package/dist/system/density.d.ts +15 -5
  282. package/dist/system/density.js +188 -25
  283. package/dist/system/index.d.ts +2 -2
  284. package/dist/system/index.js +2 -2
  285. package/dist/system/overrides.d.ts +1 -0
  286. package/dist/system/overrides.js +151 -3
  287. package/dist/system/portal.d.ts +3 -2
  288. package/dist/system/portal.js +22 -10
  289. package/dist/system/prepaint.d.ts +21 -5
  290. package/dist/system/prepaint.js +3 -1
  291. package/dist/system/published.d.ts +1 -0
  292. package/dist/system/published.js +131 -0
  293. package/dist/system/theme-provider.d.ts +118 -21
  294. package/dist/system/theme-provider.js +362 -73
  295. package/dist/system/theme-registry.d.ts +2 -1
  296. package/dist/system/theme-registry.js +27 -10
  297. package/dist/system/use-density.js +4 -3
  298. package/dist/system/use-theme.d.ts +5 -2
  299. package/dist/system/use-theme.js +7 -4
  300. package/dist/system/vocabulary.js +2 -2
  301. package/dist/theming/create-theme.js +12 -6
  302. package/dist/theming/serialize.d.ts +34 -2
  303. package/dist/theming/serialize.js +86 -4
  304. package/manifest/components/accordion.json +7 -1
  305. package/manifest/components/agent-pile.json +3 -0
  306. package/manifest/components/alert-dialog.json +29 -3
  307. package/manifest/components/app-bar.json +19 -2
  308. package/manifest/components/app-shell.json +5 -0
  309. package/manifest/components/ask-box.json +3 -1
  310. package/manifest/components/autocomplete.json +38 -1
  311. package/manifest/components/band.json +7 -3
  312. package/manifest/components/bento.json +12 -1
  313. package/manifest/components/breadcrumb.json +8 -1
  314. package/manifest/components/button.json +27 -3
  315. package/manifest/components/calendar.json +7 -0
  316. package/manifest/components/card.json +22 -1
  317. package/manifest/components/carousel.json +4 -1
  318. package/manifest/components/channel-matrix.json +31 -3
  319. package/manifest/components/chart-tooltip-content.json +29 -3
  320. package/manifest/components/chat-empty-state.json +3 -1
  321. package/manifest/components/checkbox-group.json +14 -0
  322. package/manifest/components/checkbox.json +14 -0
  323. package/manifest/components/chip.json +16 -1
  324. package/manifest/components/clamp.json +3 -1
  325. package/manifest/components/code-block.json +10 -1
  326. package/manifest/components/collapsible.json +13 -2
  327. package/manifest/components/color-area.json +4 -2
  328. package/manifest/components/color-field.json +10 -0
  329. package/manifest/components/color-picker.json +10 -0
  330. package/manifest/components/color-slider.json +3 -1
  331. package/manifest/components/colors-section.json +9 -1
  332. package/manifest/components/combobox.json +38 -1
  333. package/manifest/components/command-palette.json +28 -3
  334. package/manifest/components/composer-actions.json +3 -0
  335. package/manifest/components/composer-attach-button.json +3 -0
  336. package/manifest/components/composer-attachment-chip.json +3 -0
  337. package/manifest/components/composer-attachments.json +3 -0
  338. package/manifest/components/composer-bar.json +3 -0
  339. package/manifest/components/composer-command-item.json +3 -0
  340. package/manifest/components/composer-context.json +3 -0
  341. package/manifest/components/composer-input.json +3 -0
  342. package/manifest/components/composer-menu-item.json +3 -0
  343. package/manifest/components/composer-menu.json +3 -0
  344. package/manifest/components/composer-model-item.json +3 -0
  345. package/manifest/components/composer-model-trigger.json +3 -0
  346. package/manifest/components/composer-person-item.json +3 -0
  347. package/manifest/components/composer-send.json +3 -0
  348. package/manifest/components/composer-toolbar.json +3 -0
  349. package/manifest/components/composer-voice-button.json +3 -0
  350. package/manifest/components/composer-voice.json +3 -0
  351. package/manifest/components/composer.json +10 -0
  352. package/manifest/components/confidence-marker.json +3 -1
  353. package/manifest/components/container.json +2 -1
  354. package/manifest/components/context-menu.json +29 -3
  355. package/manifest/components/conversation-search.json +3 -1
  356. package/manifest/components/cue-mark.json +2 -2
  357. package/manifest/components/cue-portal-frame.json +1 -1
  358. package/manifest/components/data-row.json +3 -1
  359. package/manifest/components/data-tree.json +3 -1
  360. package/manifest/components/date-field.json +10 -0
  361. package/manifest/components/date-picker.json +10 -0
  362. package/manifest/components/date-range-picker.json +10 -0
  363. package/manifest/components/delegation-card.json +3 -1
  364. package/manifest/components/density.json +15 -7
  365. package/manifest/components/description-list.json +6 -1
  366. package/manifest/components/dialog.json +30 -3
  367. package/manifest/components/disclosure.json +13 -2
  368. package/manifest/components/dmx-bar.json +28 -3
  369. package/manifest/components/dmx-strip.json +28 -3
  370. package/manifest/components/drawer.json +29 -3
  371. package/manifest/components/dropdown-menu.json +29 -3
  372. package/manifest/components/edit-message.json +3 -1
  373. package/manifest/components/elements-command-palette.json +3 -1
  374. package/manifest/components/elements-composer.json +3 -0
  375. package/manifest/components/empty-state-composer.json +3 -1
  376. package/manifest/components/empty-state-greeting.json +3 -1
  377. package/manifest/components/empty-state-suggestion.json +3 -1
  378. package/manifest/components/empty-state-suggestions.json +3 -1
  379. package/manifest/components/env-var-input.json +10 -1
  380. package/manifest/components/export-dialog.json +6 -1
  381. package/manifest/components/eyebrow.json +13 -2
  382. package/manifest/components/feedback-dialog.json +3 -0
  383. package/manifest/components/field-description.json +14 -0
  384. package/manifest/components/field-error.json +14 -0
  385. package/manifest/components/field-label.json +15 -1
  386. package/manifest/components/field.json +14 -0
  387. package/manifest/components/file-upload.json +3 -0
  388. package/manifest/components/footer.json +14 -1
  389. package/manifest/components/frames.json +14 -1
  390. package/manifest/components/hover-card.json +29 -3
  391. package/manifest/components/info-tip.json +3 -0
  392. package/manifest/components/input-group.json +10 -0
  393. package/manifest/components/input.json +10 -0
  394. package/manifest/components/item.json +3 -1
  395. package/manifest/components/kbd.json +10 -1
  396. package/manifest/components/ledger.json +9 -2
  397. package/manifest/components/link.json +10 -0
  398. package/manifest/components/log-viewer.json +3 -0
  399. package/manifest/components/map-answer.json +3 -1
  400. package/manifest/components/markdown-text.json +3 -0
  401. package/manifest/components/menubar.json +32 -4
  402. package/manifest/components/message-list.json +3 -0
  403. package/manifest/components/message.json +6 -1
  404. package/manifest/components/mobile-composer.json +3 -1
  405. package/manifest/components/multi-select.json +38 -1
  406. package/manifest/components/musical-time-input.json +10 -0
  407. package/manifest/components/navigation-menu.json +32 -3
  408. package/manifest/components/node-card.json +3 -0
  409. package/manifest/components/number-field.json +10 -1
  410. package/manifest/components/otp-field.json +9 -0
  411. package/manifest/components/page-shell.json +14 -0
  412. package/manifest/components/pagination.json +3 -0
  413. package/manifest/components/panel-header.json +10 -0
  414. package/manifest/components/panel.json +11 -1
  415. package/manifest/components/password-input.json +10 -1
  416. package/manifest/components/permission-scopes.json +3 -1
  417. package/manifest/components/piano-keyboard.json +3 -0
  418. package/manifest/components/popover.json +30 -3
  419. package/manifest/components/preset-section.json +9 -1
  420. package/manifest/components/preview.json +24 -10
  421. package/manifest/components/progress.json +6 -1
  422. package/manifest/components/prompt-library.json +3 -1
  423. package/manifest/components/queue-dock.json +3 -1
  424. package/manifest/components/radio-group.json +8 -0
  425. package/manifest/components/radio.json +8 -0
  426. package/manifest/components/rating.json +4 -1
  427. package/manifest/components/reasoning-panel.json +3 -1
  428. package/manifest/components/recommendation-card.json +1 -1
  429. package/manifest/components/resizable.json +4 -1
  430. package/manifest/components/revert-dock.json +3 -1
  431. package/manifest/components/row.json +5 -1
  432. package/manifest/components/scroll-area.json +4 -2
  433. package/manifest/components/scrollable-tabs-list.json +18 -0
  434. package/manifest/components/scrub-input.json +10 -1
  435. package/manifest/components/seam-cell.json +1 -0
  436. package/manifest/components/seam-grid.json +1 -0
  437. package/manifest/components/seam-list.json +5 -1
  438. package/manifest/components/search-input.json +10 -1
  439. package/manifest/components/section-header.json +15 -2
  440. package/manifest/components/segmented-control.json +16 -0
  441. package/manifest/components/select.json +17 -0
  442. package/manifest/components/settings-panel.json +3 -0
  443. package/manifest/components/shape-section.json +9 -1
  444. package/manifest/components/sheet.json +29 -3
  445. package/manifest/components/shimmer-label.json +3 -0
  446. package/manifest/components/sidebar.json +19 -2
  447. package/manifest/components/slider.json +8 -0
  448. package/manifest/components/sources.json +3 -1
  449. package/manifest/components/stat.json +9 -0
  450. package/manifest/components/status-bar.json +4 -0
  451. package/manifest/components/stepper.json +8 -0
  452. package/manifest/components/swap-label.json +3 -0
  453. package/manifest/components/switch.json +8 -0
  454. package/manifest/components/table-scroll-region.json +20 -2
  455. package/manifest/components/table.json +20 -2
  456. package/manifest/components/tabs.json +19 -1
  457. package/manifest/components/tags-input.json +38 -1
  458. package/manifest/components/terminal-frame.json +3 -0
  459. package/manifest/components/textarea.json +12 -0
  460. package/manifest/components/theme-configurator.json +29 -3
  461. package/manifest/components/theme-provider.json +31 -19
  462. package/manifest/components/thread-search.json +3 -1
  463. package/manifest/components/threshold-rail.json +3 -0
  464. package/manifest/components/time-field.json +10 -0
  465. package/manifest/components/toast.json +30 -2
  466. package/manifest/components/toggle.json +4 -0
  467. package/manifest/components/token-editor.json +6 -1
  468. package/manifest/components/tool-call-card.json +9 -2
  469. package/manifest/components/tool-call.json +3 -1
  470. package/manifest/components/tool-timeline.json +3 -1
  471. package/manifest/components/toolbar.json +3 -1
  472. package/manifest/components/tooltip.json +31 -3
  473. package/manifest/components/tree-visibility-toggle.json +3 -0
  474. package/manifest/components/tree.json +3 -0
  475. package/manifest/components/universe-grid.json +3 -0
  476. package/manifest/components/voice-conversation.json +3 -0
  477. package/manifest/components/work-collapse.json +3 -1
  478. package/manifest/manifest.json +204 -184
  479. package/manifest/tokens.json +241 -4
  480. package/package.json +5 -5
@@ -35,7 +35,7 @@ function DaySeparator({ messages, className, ...props }) {
35
35
  }), /* @__PURE__ */ jsxs("div", {
36
36
  className: cn("group flex items-baseline gap-2", message.role === "user" && "flex-row-reverse"),
37
37
  children: [/* @__PURE__ */ jsx("span", {
38
- className: cn("max-w-[80%] text-(length:--cue-text-body) leading-(--cue-leading-ui) break-words", message.role === "user" ? "bg-surface-1 rounded-(--radius-overlay) px-3.5 py-2" : "text-fg-muted"),
38
+ className: cn("max-w-[80%] text-(length:--cue-text-body) leading-(--cue-leading-ui) break-words", message.role === "user" ? "bg-surface-1 rounded-overlay px-3.5 py-2" : "text-fg-muted"),
39
39
  children: message.text
40
40
  }), /* @__PURE__ */ jsx("span", {
41
41
  className: cn(mono, "text-transparent group-hover:text-fg-subtle shrink-0 tabular-nums transition-colors"),
@@ -18,7 +18,7 @@ import { MaximizeIcon, MinusIcon, PlusIcon, RotateCcwIcon } from "lucide-react";
18
18
  function Diagram({ title, zoom, children, onZoomIn, onZoomOut, onReset, onExpand, className, ...props }) {
19
19
  return /* @__PURE__ */ jsxs("div", {
20
20
  "data-slot": "diagram",
21
- className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
21
+ className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-overlay", className),
22
22
  ...props,
23
23
  children: [/* @__PURE__ */ jsxs("div", {
24
24
  className: "flex items-center gap-1 px-3 py-2",
@@ -22,12 +22,12 @@ function DocumentReference({ title, pages, anchors, activePage, onJump, classNam
22
22
  const currentIndex = anchors.findIndex((anchor) => anchor.page === activePage);
23
23
  return /* @__PURE__ */ jsxs("div", {
24
24
  "data-slot": "document-reference",
25
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
25
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-3.5", className),
26
26
  ...props,
27
27
  children: [/* @__PURE__ */ jsxs("div", {
28
28
  className: "flex items-center gap-2.5",
29
29
  children: [/* @__PURE__ */ jsx("span", {
30
- className: "bg-surface-1 text-fg-muted flex size-8 shrink-0 items-center justify-center rounded-(--radius-surface)",
30
+ className: "bg-surface-1 text-fg-muted flex size-8 shrink-0 items-center justify-center rounded-surface",
31
31
  children: /* @__PURE__ */ jsx(FileTextIcon, { className: "size-3.5" })
32
32
  }), /* @__PURE__ */ jsxs("div", {
33
33
  className: "flex min-w-0 flex-1 flex-col",
@@ -50,7 +50,7 @@ function DocumentReference({ title, pages, anchors, activePage, onJump, classNam
50
50
  type: "button",
51
51
  "aria-current": i === currentIndex || void 0,
52
52
  onClick: () => onJump?.(anchor.page),
53
- className: cn("flex flex-col gap-1 rounded-(--radius-surface) px-2.5 py-2 text-start transition-colors", anchor.page === activePage ? field : "hover:bg-surface-1"),
53
+ className: cn("flex flex-col gap-1 rounded-surface px-2.5 py-2 text-start transition-colors", anchor.page === activePage ? field : "hover:bg-surface-1"),
54
54
  children: [/* @__PURE__ */ jsxs("span", {
55
55
  className: cn(mono, "text-fg-subtle"),
56
56
  children: ["p. ", anchor.page]
@@ -20,7 +20,7 @@ import { PencilLineIcon, XIcon } from "lucide-react";
20
20
  function DraftRestore({ draft, savedAt, onRestore, onDiscard, className, ...props }) {
21
21
  return /* @__PURE__ */ jsxs("div", {
22
22
  "data-slot": "draft-restore",
23
- className: cn(paper, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in flex w-full max-w-sm items-center gap-2.5 rounded-(--radius-overlay) py-2 pr-2 pl-3.5 duration-300", className),
23
+ className: cn(paper, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in flex w-full max-w-sm items-center gap-2.5 rounded-overlay py-2 pr-2 pl-3.5 duration-300", className),
24
24
  ...props,
25
25
  children: [
26
26
  /* @__PURE__ */ jsx(PencilLineIcon, { className: "text-fg-subtle size-3.5 shrink-0" }),
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
3
4
  import { field, inkButton, paper } from "./surfaces.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { AlertTriangleIcon } from "lucide-react";
@@ -28,13 +29,13 @@ function EditMessage({ value, discardedReplies, editing, onValueChange, onSave,
28
29
  children: /* @__PURE__ */ jsx("button", {
29
30
  type: "button",
30
31
  onClick: onStartEdit,
31
- className: cn(field, "hover:bg-surface-2 max-w-[85%] rounded-(--radius-overlay) px-3.5 py-2.5 text-start text-(length:--cue-text-body) transition-colors"),
32
+ className: cn(field, "hover:bg-surface-2 max-w-[85%] rounded-overlay px-3.5 py-2.5 text-start text-(length:--cue-text-body) transition-colors"),
32
33
  children: value
33
34
  })
34
35
  });
35
36
  return /* @__PURE__ */ jsxs("div", {
36
37
  "data-slot": "edit-message",
37
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
38
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-3.5", className),
38
39
  ...props,
39
40
  children: [
40
41
  /* @__PURE__ */ jsx("textarea", {
@@ -42,7 +43,7 @@ function EditMessage({ value, discardedReplies, editing, onValueChange, onSave,
42
43
  onChange: (event) => onValueChange?.(event.target.value),
43
44
  rows: 2,
44
45
  "aria-label": "Edit your message",
45
- className: cn(field, "text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent resize-none rounded-(--radius-surface) px-3 py-2.5 text-(length:--cue-text-body) leading-(--cue-leading-ui) outline-none")
46
+ className: cn(field, `text-fg ${FOCUS_RING} resize-none rounded-surface px-3 py-2.5 text-(length:--cue-text-body) leading-(--cue-leading-ui) outline-none`)
46
47
  }),
47
48
  discardedReplies > 0 && /* @__PURE__ */ jsxs("div", {
48
49
  className: "flex items-center gap-2 text-warn",
@@ -284,17 +284,35 @@
284
284
  * carries for `--radius-*`:
285
285
  *
286
286
  * - **Absent by choice:** `--cue-busy`, `--cue-info`, `--cue-selection`,
287
- * `--cue-focus`, `--cue-scrim`. No element in this family reads them — the
288
- * codemod maps upstream's blue onto `--cue-stream`, and upstream has no
289
- * selection or scrim of its own to transcribe. The consequence is worth
290
- * knowing before you mix families: a *cue* component rendered inside an
291
- * island — a `Chip tone="busy"`, a `Toast`, anything that draws a focus ring
287
+ * `--cue-scrim`. No element in this family reads them — the codemod maps
288
+ * upstream's blue onto `--cue-stream`, and upstream has no selection or
289
+ * scrim of its own to transcribe. The consequence is worth knowing before
290
+ * you mix families: a *cue* component rendered inside an island — a
291
+ * `Chip tone="busy"`, a `Toast`
292
292
  * — paints half in each palette, its ground and ink from assistant-ui and its
293
293
  * tone from the console's theme. That is a mixed surface, not a bug, and the
294
294
  * island is not the place to fix it: re-pointing the whole contract here
295
295
  * would make this a theme, which is exactly what `AgentSurface` is documented
296
296
  * not to be.
297
297
  *
298
+ * `--cue-focus` used to be on this list too, on the reasoning that no
299
+ * element in this family drew a ring. Spec 2026-09-26-looks-fidelity §3.12
300
+ * (F-9) made that false: `_focus-ring.ts` gave every one of this system's
301
+ * focusable elements a ring drawn from `--cue-focus` rather than restated
302
+ * per site, this family's included, and the two were never one and the same
303
+ * before then only by coincidence — a fixed 2px ring in `--cue-accent`,
304
+ * which this island already re-points to its own ink for exactly the
305
+ * reasons above. Left off this island, an element inside it would draw the
306
+ * ring in the OUTER console theme's `--cue-focus` instead of the island's —
307
+ * under a theme where the two differ (ten of the thirty shipped blocks),
308
+ * the one visible seam a reader would find is a focus ring in the wrong
309
+ * palette on an otherwise self-consistent surface. So it is set below,
310
+ * equal to the island's own `--cue-fg` exactly as `--cue-accent` already
311
+ * is: not a second colour to keep in step, the same one the ring drew
312
+ * before this module existed, kept in step with it now that the module
313
+ * names it explicitly.
314
+ *
315
+
298
316
  * - **Absent by construction:** every derived token —
299
317
  * `--cue-ok-soft`, `--cue-stream-border`, `--cue-accent-soft`, `--cue-hair`,
300
318
  * `--cue-row-hover` and the rest. They cannot follow the island. Each is a
@@ -326,6 +344,7 @@
326
344
  --cue-border-strong: color-mix(in oklab, var(--cue-fg) 20%, transparent);
327
345
  --cue-border-overlay: color-mix(in oklab, oklch(1 0 0 / 10%) 60%, transparent);
328
346
  --cue-accent: var(--cue-fg);
347
+ --cue-focus: var(--cue-fg);
329
348
  --cue-accent-hover: color-mix(in oklab, var(--cue-fg) 90%, transparent);
330
349
  --cue-accent-fg: var(--cue-bg);
331
350
  --cue-ok: oklch(0.765 0.177 163.223);
@@ -365,6 +384,7 @@
365
384
  --cue-border-strong: color-mix(in oklab, var(--cue-fg) 20%, transparent);
366
385
  --cue-border-overlay: color-mix(in oklab, oklch(0.92 0.004 286.32) 60%, transparent);
367
386
  --cue-accent: var(--cue-fg);
387
+ --cue-focus: var(--cue-fg);
368
388
  --cue-accent-hover: color-mix(in oklab, var(--cue-fg) 90%, transparent);
369
389
  --cue-accent-fg: var(--cue-bg);
370
390
  --cue-ok: oklch(0.696 0.17 162.48);
@@ -395,6 +415,7 @@
395
415
  --cue-border-strong: color-mix(in oklab, var(--cue-fg) 20%, transparent);
396
416
  --cue-border-overlay: color-mix(in oklab, oklch(0.92 0.004 286.32) 60%, transparent);
397
417
  --cue-accent: var(--cue-fg);
418
+ --cue-focus: var(--cue-fg);
398
419
  --cue-accent-hover: color-mix(in oklab, var(--cue-fg) 90%, transparent);
399
420
  --cue-accent-fg: var(--cue-bg);
400
421
  --cue-ok: oklch(0.696 0.17 162.48);
@@ -22,14 +22,14 @@ import { CheckIcon, PlugIcon, XIcon } from "lucide-react";
22
22
  function ElicitationForm({ server, message, fields, state, onAccept, onDecline, className, ...props }) {
23
23
  return /* @__PURE__ */ jsxs("div", {
24
24
  "data-slot": "elicitation-form",
25
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3.5 rounded-(--radius-overlay) p-4", className),
25
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3.5 rounded-overlay p-4", className),
26
26
  ...props,
27
27
  children: [
28
28
  /* @__PURE__ */ jsxs("div", {
29
29
  className: "flex items-center gap-2.5",
30
30
  children: [
31
31
  /* @__PURE__ */ jsx("span", {
32
- className: "bg-surface-1 text-fg-muted flex size-7 shrink-0 items-center justify-center rounded-(--radius-surface)",
32
+ className: "bg-surface-1 text-fg-muted flex size-7 shrink-0 items-center justify-center rounded-surface",
33
33
  children: /* @__PURE__ */ jsx(PlugIcon, { className: "size-3.5" })
34
34
  }),
35
35
  /* @__PURE__ */ jsx("span", {
@@ -73,7 +73,7 @@ function ElicitationForm({ server, message, fields, state, onAccept, onDecline,
73
73
  children: item.value === "true" ? "On" : "Off"
74
74
  })]
75
75
  }) : /* @__PURE__ */ jsx("span", {
76
- className: cn(field, "text-fg-muted rounded-(--radius-surface) px-2.5 py-1.5 text-(length:--cue-text-ui)"),
76
+ className: cn(field, "text-fg-muted rounded-surface px-2.5 py-1.5 text-(length:--cue-text-ui)"),
77
77
  children: item.value
78
78
  })]
79
79
  }, item.name))
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
3
4
  import { inkButton, paper } from "./surfaces.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { ArrowUpIcon } from "lucide-react";
@@ -63,7 +64,7 @@ function EmptyStateSuggestion({ index = 0, className, style, ...props }) {
63
64
  animationDelay: `${120 + index * 70}ms`,
64
65
  ...style
65
66
  },
66
- className: cn(paper, "cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in cue-elements-fill-mode-both focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent rounded-full px-4 py-2 text-(length:--cue-text-body) transition-transform duration-500 outline-none hover:-translate-y-px active:scale-[0.96] motion-reduce:animate-none", className),
67
+ className: cn(paper, `cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in cue-elements-fill-mode-both ${FOCUS_RING} rounded-full px-4 py-2 text-(length:--cue-text-body) transition-transform duration-500 outline-none hover:-translate-y-px active:scale-[0.96] motion-reduce:animate-none`, className),
67
68
  ...props
68
69
  });
69
70
  }
@@ -31,7 +31,7 @@ function ErrorState({ title, detail, retrying, onRetry, className, ...props }) {
31
31
  return /* @__PURE__ */ jsxs("div", {
32
32
  "data-slot": "error-state",
33
33
  role: "alert",
34
- className: cn("cue-elements-fade-in cue-elements-animate-in flex w-full max-w-sm items-start gap-2.5 rounded-(--radius-overlay) bg-danger/10 px-4 py-3 text-(length:--cue-text-body) duration-300 motion-reduce:animate-none", className),
34
+ className: cn("cue-elements-fade-in cue-elements-animate-in flex w-full max-w-sm items-start gap-2.5 rounded-overlay bg-danger/10 px-4 py-3 text-(length:--cue-text-body) duration-300 motion-reduce:animate-none", className),
35
35
  ...props,
36
36
  children: [
37
37
  /* @__PURE__ */ jsx(CircleAlertIcon, { className: "mt-0.5 size-4 shrink-0 text-danger/80" }),
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
3
4
  import { field, inkButton, mono, paper } from "./surfaces.js";
4
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
6
  import { CheckIcon, ThumbsDownIcon } from "lucide-react";
@@ -23,7 +24,7 @@ import { CheckIcon, ThumbsDownIcon } from "lucide-react";
23
24
  function FeedbackDialog({ reasons, selected, note, sent, onToggleReason, onNoteChange, onSubmit, className, ...props }) {
24
25
  return /* @__PURE__ */ jsxs("div", {
25
26
  "data-slot": "feedback-dialog",
26
- className: cn(paper, "flex w-full max-w-sm rounded-(--radius-overlay) p-4", sent ? "items-center gap-2.5 text-(length:--cue-text-body)" : "flex-col gap-3", className),
27
+ className: cn(paper, "flex w-full max-w-sm rounded-overlay p-4", sent ? "items-center gap-2.5 text-(length:--cue-text-body)" : "flex-col gap-3", className),
27
28
  ...props,
28
29
  children: [/* @__PURE__ */ jsx("div", {
29
30
  role: "status",
@@ -34,7 +35,7 @@ function FeedbackDialog({ reasons, selected, note, sent, onToggleReason, onNoteC
34
35
  className: "flex items-center gap-2.5",
35
36
  children: [
36
37
  /* @__PURE__ */ jsx("span", {
37
- className: "bg-surface-1 text-fg-muted flex size-7 shrink-0 items-center justify-center rounded-(--radius-surface)",
38
+ className: "bg-surface-1 text-fg-muted flex size-7 shrink-0 items-center justify-center rounded-surface",
38
39
  children: /* @__PURE__ */ jsx(ThumbsDownIcon, { className: "size-3.5" })
39
40
  }),
40
41
  /* @__PURE__ */ jsx("span", {
@@ -66,7 +67,7 @@ function FeedbackDialog({ reasons, selected, note, sent, onToggleReason, onNoteC
66
67
  rows: 2,
67
68
  placeholder: "Anything else?",
68
69
  "aria-label": "Anything else?",
69
- className: cn(field, "text-fg-muted placeholder:text-fg-subtle focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent resize-none rounded-(--radius-surface) px-3 py-2 text-(length:--cue-text-ui) outline-none")
70
+ className: cn(field, `text-fg-muted placeholder:text-fg-subtle ${FOCUS_RING} resize-none rounded-surface px-3 py-2 text-(length:--cue-text-ui) outline-none`)
70
71
  }),
71
72
  /* @__PURE__ */ jsx("button", {
72
73
  type: "button",
@@ -22,7 +22,7 @@ function FileTree({ nodes, visibleCount, totalAdditions, totalDeletions, classNa
22
22
  const files = nodes.filter((node) => node.kind === "file").length;
23
23
  return /* @__PURE__ */ jsxs("div", {
24
24
  "data-slot": "file-tree",
25
- className: cn(paper, "flex w-full max-w-sm flex-col gap-2 rounded-(--radius-overlay) p-3.5", className),
25
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-2 rounded-overlay p-3.5", className),
26
26
  ...props,
27
27
  children: [/* @__PURE__ */ jsxs("div", {
28
28
  className: "flex items-baseline justify-between px-1",
@@ -46,7 +46,7 @@ function FileTree({ nodes, visibleCount, totalAdditions, totalDeletions, classNa
46
46
  }), /* @__PURE__ */ jsx("div", {
47
47
  className: "flex flex-col",
48
48
  children: take(nodes, visibleCount).map((node) => /* @__PURE__ */ jsx("div", {
49
- className: "cue-elements-fade-in cue-elements-slide-in-from-left-1 cue-elements-animate-in cue-elements-fill-mode-both hover:bg-surface-1 flex items-center gap-2 rounded-(--radius-surface) px-1 py-1 text-(length:--cue-text-body) transition-colors duration-300",
49
+ className: "cue-elements-fade-in cue-elements-slide-in-from-left-1 cue-elements-animate-in cue-elements-fill-mode-both hover:bg-surface-1 flex items-center gap-2 rounded-surface px-1 py-1 text-(length:--cue-text-body) transition-colors duration-300",
50
50
  style: { paddingInlineStart: `${.25 + node.depth * .85}rem` },
51
51
  children: node.kind === "folder" ? /* @__PURE__ */ jsxs(Fragment, { children: [
52
52
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "text-fg-subtle size-3 shrink-0" }),
@@ -29,7 +29,7 @@ function FlowGraph({ nodes, edges, visibleCount, className, ...props }) {
29
29
  });
30
30
  return /* @__PURE__ */ jsx("div", {
31
31
  "data-slot": "flow-graph",
32
- className: cn(paper, "w-full max-w-md overflow-x-auto rounded-(--radius-overlay) p-4", className),
32
+ className: cn(paper, "w-full max-w-md overflow-x-auto rounded-overlay p-4", className),
33
33
  ...props,
34
34
  children: /* @__PURE__ */ jsxs("div", {
35
35
  className: "relative",
@@ -59,7 +59,7 @@ function FlowGraph({ nodes, edges, visibleCount, className, ...props }) {
59
59
  }, `${edge.from}-${edge.to}`);
60
60
  })
61
61
  }), shown.map((node) => /* @__PURE__ */ jsx("div", {
62
- className: cn("cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-animate-in cue-elements-fill-mode-both absolute flex items-center justify-center rounded-(--radius-surface) border text-center text-(length:--cue-text-ui) leading-tight duration-300", node.state === "done" && "border-border bg-surface-1 text-fg-muted", node.state === "active" && "text-fg border-stream/30 bg-stream/10", node.state === "pending" && "border-border text-fg-subtle border-dashed"),
62
+ className: cn("cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-animate-in cue-elements-fill-mode-both absolute flex items-center justify-center rounded-surface border text-center text-(length:--cue-text-ui) leading-tight duration-300", node.state === "done" && "border-border bg-surface-1 text-fg-muted", node.state === "active" && "text-fg border-stream/30 bg-stream/10", node.state === "pending" && "border-border text-fg-subtle border-dashed"),
63
63
  style: {
64
64
  left: node.column * COL_W,
65
65
  top: node.row * ROW_H,
@@ -20,14 +20,14 @@ import { ShieldIcon } from "lucide-react";
20
20
  function GuardrailNotice({ title, explanation, policy, alternatives, onPick, className, ...props }) {
21
21
  return /* @__PURE__ */ jsxs("div", {
22
22
  "data-slot": "guardrail-notice",
23
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
23
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-4", className),
24
24
  ...props,
25
25
  children: [
26
26
  /* @__PURE__ */ jsxs("div", {
27
27
  className: "flex items-center gap-2.5",
28
28
  children: [
29
29
  /* @__PURE__ */ jsx("span", {
30
- className: "flex size-7 shrink-0 items-center justify-center rounded-(--radius-surface) bg-warn/12 text-warn",
30
+ className: "flex size-7 shrink-0 items-center justify-center rounded-surface bg-warn/12 text-warn",
31
31
  children: /* @__PURE__ */ jsx(ShieldIcon, { className: "size-3.5" })
32
32
  }),
33
33
  /* @__PURE__ */ jsx("span", {
@@ -52,7 +52,7 @@ function GuardrailNotice({ title, explanation, policy, alternatives, onPick, cla
52
52
  }), alternatives.map((alternative) => /* @__PURE__ */ jsx("button", {
53
53
  type: "button",
54
54
  onClick: () => onPick?.(alternative),
55
- className: "hover:bg-surface-1 text-fg-muted hover:text-fg -mx-1.5 rounded-(--radius-surface) px-1.5 py-1 text-start text-(length:--cue-text-body) transition-colors",
55
+ className: "hover:bg-surface-1 text-fg-muted hover:text-fg -mx-1.5 rounded-surface px-1.5 py-1 text-start text-(length:--cue-text-body) transition-colors",
56
56
  children: alternative
57
57
  }, alternative))]
58
58
  })
@@ -19,7 +19,7 @@ function ImageGeneration({ prompt, generating, className, ...props }) {
19
19
  className: cn("flex w-52 flex-col gap-2.5", className),
20
20
  ...props,
21
21
  children: [/* @__PURE__ */ jsxs("div", {
22
- className: cn(paper, "relative aspect-square w-full overflow-hidden rounded-(--radius-overlay)"),
22
+ className: cn(paper, "relative aspect-square w-full overflow-hidden rounded-overlay"),
23
23
  children: [
24
24
  /* @__PURE__ */ jsx("div", {
25
25
  className: "absolute inset-0 grid grid-cols-8 place-items-center p-6",
@@ -13,7 +13,7 @@ function Citation({ index, source, open, onOpenChange }) {
13
13
  children: [/* @__PURE__ */ jsx(PreviewCard.Trigger, {
14
14
  delay: 0,
15
15
  render: /* @__PURE__ */ jsx("button", { type: "button" }),
16
- className: cn("mx-0.5 inline-flex h-4 min-w-4 translate-y-[-2px] cursor-default items-center justify-center rounded-(--radius-control) px-1 align-middle font-mono text-(length:--cue-text-micro) font-medium tabular-nums transition-colors", open ? "bg-accent text-accent-fg" : "bg-surface-2 text-fg-muted hover:text-fg"),
16
+ className: cn("mx-0.5 inline-flex h-4 min-w-4 translate-y-[-2px] cursor-default items-center justify-center rounded-control px-1 align-middle font-mono text-(length:--cue-text-micro) font-medium tabular-nums transition-colors", open ? "bg-accent text-accent-fg" : "bg-surface-2 text-fg-muted hover:text-fg"),
17
17
  children: index + 1
18
18
  }), /* @__PURE__ */ jsx(PreviewCard.Portal, {
19
19
  ...portalProps,
@@ -21,12 +21,12 @@ function Citation({ index, source, open, onOpenChange }) {
21
21
  side: "top",
22
22
  sideOffset: 8,
23
23
  children: /* @__PURE__ */ jsxs(PreviewCard.Popup, {
24
- className: cn(floating, "z-50 w-64 origin-(--transform-origin) rounded-(--radius-overlay) p-3.5 outline-none", "transition-[opacity,scale] duration-200 ease-[cubic-bezier(0.23,1,0.32,1)] motion-reduce:transition-none", "data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0", "data-[ending-style]:scale-[0.97] data-[ending-style]:opacity-0"),
24
+ className: cn(floating, "z-50 w-64 origin-(--transform-origin) rounded-overlay p-3.5 outline-none", "transition-[opacity,scale] duration-200 ease-[cubic-bezier(0.23,1,0.32,1)] motion-reduce:transition-none", "data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0", "data-[ending-style]:scale-[0.97] data-[ending-style]:opacity-0"),
25
25
  children: [
26
26
  /* @__PURE__ */ jsxs("div", {
27
27
  className: "flex items-center gap-1.5",
28
28
  children: [/* @__PURE__ */ jsx("span", {
29
- className: "bg-surface-2 text-fg-muted flex size-4 items-center justify-center rounded-(--radius-control) text-(length:--cue-text-micro) font-medium",
29
+ className: "bg-surface-2 text-fg-muted flex size-4 items-center justify-center rounded-control text-(length:--cue-text-micro) font-medium",
30
30
  children: source.domain[0]?.toUpperCase()
31
31
  }), /* @__PURE__ */ jsx("span", {
32
32
  className: cn(mono, "text-fg-subtle"),
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
- import { mono, paper } from "./surfaces.js";
3
+ import { ghostButton, mono, paper } from "./surfaces.js";
4
4
  import { clamp, pct, progressOf, take } from "./range.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { CheckIcon, Loader2Icon, XIcon } from "lucide-react";
@@ -29,7 +29,7 @@ function JobProgress({ title, stages, stageIndex, stageProgress, eta, onCancel,
29
29
  const finished = stage >= stages.length;
30
30
  return /* @__PURE__ */ jsxs("div", {
31
31
  "data-slot": "job-progress",
32
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
32
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-4", className),
33
33
  ...props,
34
34
  children: [
35
35
  /* @__PURE__ */ jsxs("div", {
@@ -48,7 +48,7 @@ function JobProgress({ title, stages, stageIndex, stageProgress, eta, onCancel,
48
48
  type: "button",
49
49
  "aria-label": "Cancel the job",
50
50
  onClick: onCancel,
51
- className: cn("flex items-center justify-center rounded-full text-fg-muted outline-none transition-[background-color,color,scale] duration-150 hover:bg-surface-2 hover:text-fg active:scale-[0.96] focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent motion-reduce:transition-none", "size-6 shrink-0"),
51
+ className: cn(ghostButton, "size-6 shrink-0"),
52
52
  children: /* @__PURE__ */ jsx(XIcon, { className: "size-3.5" })
53
53
  })
54
54
  ]
@@ -24,7 +24,7 @@ function LauncherBubble({ open, unread, greeting, prompts, onToggle, onPick, onS
24
24
  className: cn("flex w-full max-w-[19rem] flex-col items-end gap-2.5", className),
25
25
  ...props,
26
26
  children: [open && /* @__PURE__ */ jsxs("div", {
27
- className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-slide-in-from-bottom-2 cue-elements-animate-in flex w-full flex-col gap-3 rounded-(--radius-overlay) p-4 duration-200"),
27
+ className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-slide-in-from-bottom-2 cue-elements-animate-in flex w-full flex-col gap-3 rounded-overlay p-4 duration-200"),
28
28
  children: [
29
29
  /* @__PURE__ */ jsxs("div", {
30
30
  className: "flex flex-col gap-1",
@@ -41,7 +41,7 @@ function LauncherBubble({ open, unread, greeting, prompts, onToggle, onPick, onS
41
41
  children: prompts.map((prompt) => /* @__PURE__ */ jsx("button", {
42
42
  type: "button",
43
43
  onClick: () => onPick?.(prompt),
44
- className: cn("bg-fg/[0.06]", "hover:bg-surface-2 text-fg-muted rounded-(--radius-surface) px-3 py-2 text-start text-(length:--cue-text-body) transition-colors"),
44
+ className: cn("bg-fg/[0.06]", "hover:bg-surface-2 text-fg-muted rounded-surface px-3 py-2 text-start text-(length:--cue-text-body) transition-colors"),
45
45
  children: prompt
46
46
  }, prompt))
47
47
  }),
@@ -6,7 +6,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
6
6
  const CELL_SHAPES = {
7
7
  dots: "rounded-full",
8
8
  squares: "rounded-none",
9
- rounded: "rounded-(--radius-control)"
9
+ rounded: "rounded-control"
10
10
  };
11
11
  /**
12
12
  * The wait before there is anything to show. A nine-cell matrix keeps time under a
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
3
4
  import { field, mono, paper } from "./surfaces.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  //#region src/elements/map-answer.tsx
@@ -15,7 +16,7 @@ function MapAnswer({ pins, activeId, route, onSelect, className, ...props }) {
15
16
  const path = pins.map((pin) => `${pin.x},${pin.y}`).join(" ");
16
17
  return /* @__PURE__ */ jsxs("div", {
17
18
  "data-slot": "map-answer",
18
- className: cn(paper, "flex w-full max-w-sm flex-col overflow-hidden rounded-(--radius-overlay)", className),
19
+ className: cn(paper, "flex w-full max-w-sm flex-col overflow-hidden rounded-overlay", className),
19
20
  ...props,
20
21
  children: [/* @__PURE__ */ jsxs("div", {
21
22
  className: cn(field, "relative h-40"),
@@ -64,7 +65,7 @@ function MapAnswer({ pins, activeId, route, onSelect, className, ...props }) {
64
65
  "aria-label": pin.label,
65
66
  "aria-current": pin.id === activeId || void 0,
66
67
  onClick: () => onSelect?.(pin.id),
67
- className: "focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent absolute flex size-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full outline-none",
68
+ className: `${FOCUS_RING} absolute flex size-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full outline-none`,
68
69
  style: {
69
70
  left: `${pin.x}%`,
70
71
  top: `${pin.y}%`
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
3
4
  import { codeScroll, codeSurface, field, mono } from "./surfaces.js";
4
5
  import * as React from "react";
5
6
  import { jsx } from "react/jsx-runtime";
@@ -452,7 +453,7 @@ function markdownComponents(options) {
452
453
  title,
453
454
  target,
454
455
  rel: "noopener noreferrer nofollow",
455
- className: "text-accent underline underline-offset-2 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-solid focus-visible:outline-accent",
456
+ className: `text-accent underline underline-offset-2 ${FOCUS_RING}`,
456
457
  children
457
458
  }),
458
459
  strong: ({ children }) => /* @__PURE__ */ jsx("strong", {
@@ -503,11 +504,11 @@ function markdownComponents(options) {
503
504
  loading: "lazy",
504
505
  decoding: "async",
505
506
  referrerPolicy: "no-referrer",
506
- className: "max-w-full rounded-(--radius-control) border border-border"
507
+ className: "max-w-full rounded-control border border-border"
507
508
  }),
508
509
  code: ({ children, className: codeClass }) => /* @__PURE__ */ jsx("code", {
509
510
  "data-slot": "markdown-code",
510
- className: cn(mono, "rounded-(--radius-control) [pre_&]:rounded-none [pre_&]:bg-transparent [pre_&]:px-0 [pre_&]:py-0", field, "px-[0.35em] py-[0.1em]", codeClass),
511
+ className: cn(mono, "rounded-control [pre_&]:rounded-none [pre_&]:bg-transparent [pre_&]:px-0 [pre_&]:py-0", field, "px-[0.35em] py-[0.1em]", codeClass),
511
512
  children
512
513
  }),
513
514
  pre: ({ children, node }) => {
@@ -515,7 +516,7 @@ function markdownComponents(options) {
515
516
  return /* @__PURE__ */ jsx("pre", {
516
517
  "data-slot": "markdown-code-block",
517
518
  "data-language": block.language,
518
- className: cn("m-0 rounded-(--radius-control) border border-border p-(--cue-space-3)", field, codeScroll),
519
+ className: cn("m-0 rounded-control border border-border p-(--cue-space-3)", field, codeScroll),
519
520
  children: renderCodeBlock === void 0 ? children : /* @__PURE__ */ jsx("span", {
520
521
  className: codeSurface,
521
522
  children: renderCodeBlock(block)
@@ -15,7 +15,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
15
15
  function MathBlock({ label, steps, visibleSteps, className, ...props }) {
16
16
  return /* @__PURE__ */ jsxs("div", {
17
17
  "data-slot": "math-block",
18
- className: cn(paper, "flex w-full max-w-sm flex-col gap-2.5 rounded-(--radius-overlay) p-4", className),
18
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-2.5 rounded-overlay p-4", className),
19
19
  ...props,
20
20
  children: [label && /* @__PURE__ */ jsx("span", {
21
21
  className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle"),
@@ -34,7 +34,7 @@ function McpServerPanel({ servers, expandedId, onToggle, onAuthorize, className,
34
34
  const connected = servers.filter((server) => server.status === "connected").length;
35
35
  return /* @__PURE__ */ jsxs("div", {
36
36
  "data-slot": "mcp-server-panel",
37
- className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-(--radius-overlay) p-3", className),
37
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-overlay p-3", className),
38
38
  ...props,
39
39
  children: [/* @__PURE__ */ jsxs("div", {
40
40
  className: "flex items-baseline justify-between px-1 pb-1",
@@ -58,7 +58,7 @@ function McpServerPanel({ servers, expandedId, onToggle, onAuthorize, className,
58
58
  type: "button",
59
59
  "aria-expanded": expanded,
60
60
  onClick: () => onToggle?.(server.id),
61
- className: "hover:bg-surface-1 flex items-center gap-2.5 rounded-(--radius-surface) px-1.5 py-2 text-start transition-colors",
61
+ className: "hover:bg-surface-1 flex items-center gap-2.5 rounded-surface px-1.5 py-2 text-start transition-colors",
62
62
  children: [
63
63
  /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn("text-fg-subtle size-3 shrink-0 transition-transform duration-200 motion-reduce:transition-none", expanded && "rotate-90") }),
64
64
  /* @__PURE__ */ jsx(PlugIcon, { className: "text-fg-subtle size-3.5 shrink-0" }),
@@ -102,7 +102,7 @@ function McpServerPanel({ servers, expandedId, onToggle, onAuthorize, className,
102
102
  }), /* @__PURE__ */ jsx("div", {
103
103
  className: "flex flex-wrap gap-1",
104
104
  children: server.tools.map((tool) => /* @__PURE__ */ jsx("span", {
105
- className: cn("bg-fg/[0.06]", "font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-muted rounded-(--radius-control) px-1.5 py-0.5"),
105
+ className: cn("bg-fg/[0.06]", "font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-muted rounded-control px-1.5 py-0.5"),
106
106
  children: tool
107
107
  }, tool))
108
108
  })]
@@ -17,11 +17,11 @@ function MessageAttachments({ attachments, onOpen, className, ...props }) {
17
17
  children: attachments.map((item) => item.kind === "image" ? /* @__PURE__ */ jsxs("button", {
18
18
  type: "button",
19
19
  onClick: () => onOpen?.(item.id),
20
- className: cn(paper, "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both group flex w-full items-center gap-3 overflow-hidden rounded-(--radius-overlay) p-2 text-start duration-300"),
20
+ className: cn(paper, "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both group flex w-full items-center gap-3 overflow-hidden rounded-overlay p-2 text-start duration-300"),
21
21
  children: [
22
22
  /* @__PURE__ */ jsx("span", {
23
23
  "aria-hidden": true,
24
- className: "size-12 shrink-0 rounded-(--radius-surface) bg-cover bg-center transition-transform duration-300 group-hover:scale-[1.04] motion-reduce:transition-none",
24
+ className: "size-12 shrink-0 rounded-surface bg-cover bg-center transition-transform duration-300 group-hover:scale-[1.04] motion-reduce:transition-none",
25
25
  style: {
26
26
  backgroundImage: item.swatch,
27
27
  backgroundColor: "var(--cue-fg)"
@@ -42,9 +42,9 @@ function MessageAttachments({ attachments, onOpen, className, ...props }) {
42
42
  }, item.id) : /* @__PURE__ */ jsxs("button", {
43
43
  type: "button",
44
44
  onClick: () => onOpen?.(item.id),
45
- className: cn(field, "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both hover:bg-surface-2 flex w-full items-center gap-2.5 rounded-(--radius-overlay) px-3 py-2.5 text-start transition-colors duration-300"),
45
+ className: cn(field, "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both hover:bg-surface-2 flex w-full items-center gap-2.5 rounded-overlay px-3 py-2.5 text-start transition-colors duration-300"),
46
46
  children: [/* @__PURE__ */ jsx("span", {
47
- className: "bg-bg text-fg-muted flex size-8 shrink-0 items-center justify-center rounded-(--radius-surface)",
47
+ className: "bg-bg text-fg-muted flex size-8 shrink-0 items-center justify-center rounded-surface",
48
48
  children: item.kind === "document" ? /* @__PURE__ */ jsx(FileTextIcon, { className: "size-3.5" }) : /* @__PURE__ */ jsx(PaperclipIcon, { className: "size-3.5" })
49
49
  }), /* @__PURE__ */ jsxs("span", {
50
50
  className: "flex min-w-0 flex-1 flex-col gap-0.5",
@@ -25,7 +25,7 @@ function MessagePair({ userMessage, words, visibleWords, streaming, variant = "b
25
25
  className: cn("flex w-full max-w-sm flex-col gap-5", className),
26
26
  ...props,
27
27
  children: [/* @__PURE__ */ jsx("p", {
28
- className: cn("max-w-[85%] self-end text-(length:--cue-text-body)", variant === "bubble" ? cn(paper, "rounded-(--radius-overlay) px-3.5 py-2") : "text-fg text-end"),
28
+ className: cn("max-w-[85%] self-end text-(length:--cue-text-body)", variant === "bubble" ? cn(paper, "rounded-overlay px-3.5 py-2") : "text-fg text-end"),
29
29
  children: userMessage
30
30
  }), /* @__PURE__ */ jsxs("div", {
31
31
  className: "group/message flex flex-col items-start",
@@ -23,7 +23,7 @@ function MessageQueue({ running, queued, onCancel, className, ...props }) {
23
23
  ...props,
24
24
  children: [
25
25
  /* @__PURE__ */ jsxs("div", {
26
- className: cn(paper, "flex items-center gap-2.5 rounded-(--radius-overlay) p-3"),
26
+ className: cn(paper, "flex items-center gap-2.5 rounded-overlay p-3"),
27
27
  children: [
28
28
  /* @__PURE__ */ jsxs("span", {
29
29
  className: "relative flex size-2 shrink-0",
@@ -52,7 +52,7 @@ function MessageQueue({ running, queued, onCancel, className, ...props }) {
52
52
  /* @__PURE__ */ jsx("ul", {
53
53
  className: "flex flex-col gap-1.5",
54
54
  children: queued.map((message, index) => /* @__PURE__ */ jsxs("li", {
55
- className: cn(field, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex items-center gap-2.5 rounded-(--radius-overlay) py-2 pr-2 pl-3 duration-300"),
55
+ className: cn(field, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex items-center gap-2.5 rounded-overlay py-2 pr-2 pl-3 duration-300"),
56
56
  children: [
57
57
  /* @__PURE__ */ jsx("span", {
58
58
  className: cn(mono, "text-fg-subtle w-3 shrink-0 tabular-nums"),
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
3
4
  import { field, ghostButton, inkButton } from "./surfaces.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { ArrowUpIcon, MicIcon, PlusIcon, SquareIcon } from "lucide-react";
@@ -22,7 +23,7 @@ import { ArrowUpIcon, MicIcon, PlusIcon, SquareIcon } from "lucide-react";
22
23
  function MobileComposer({ value, keyboardOpen, running, actions, onAction, onAttach, onValueChange, onSend, onStop, onFocus, className, ...props }) {
23
24
  return /* @__PURE__ */ jsxs("div", {
24
25
  "data-slot": "mobile-composer",
25
- className: cn("bg-bg border-border flex w-full max-w-[19rem] flex-col gap-2.5 rounded-t-(--radius-overlay) border-t px-3 pt-3", keyboardOpen ? "pb-3" : "pb-6", className),
26
+ className: cn("bg-bg border-border flex w-full max-w-[19rem] flex-col gap-2.5 rounded-t-overlay border-t px-3 pt-3", keyboardOpen ? "pb-3" : "pb-6", className),
26
27
  ...props,
27
28
  children: [
28
29
  !keyboardOpen && /* @__PURE__ */ jsx("div", {
@@ -47,7 +48,7 @@ function MobileComposer({ value, keyboardOpen, running, actions, onAction, onAtt
47
48
  children: /* @__PURE__ */ jsx(PlusIcon, { className: "size-4" })
48
49
  }),
49
50
  /* @__PURE__ */ jsxs("div", {
50
- className: cn(field, "flex min-w-0 flex-1 items-center gap-2 rounded-(--radius-overlay) px-3 py-2"),
51
+ className: cn(field, "flex min-w-0 flex-1 items-center gap-2 rounded-overlay px-3 py-2"),
51
52
  children: [/* @__PURE__ */ jsx("input", {
52
53
  value,
53
54
  onChange: (event) => onValueChange?.(event.target.value),
@@ -60,7 +61,7 @@ function MobileComposer({ value, keyboardOpen, running, actions, onAction, onAtt
60
61
  },
61
62
  placeholder: "Message",
62
63
  "aria-label": "Message",
63
- className: "text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-emphasis) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
64
+ className: `text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-emphasis) outline-none ${FOCUS_RING}`
64
65
  }), value === "" && /* @__PURE__ */ jsx(MicIcon, { className: "text-fg-subtle size-4 shrink-0" })]
65
66
  }),
66
67
  /* @__PURE__ */ jsx("button", {