@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
@@ -17,7 +17,7 @@ function ModelPicker({ models, selectedId, onSelect, className, ...props }) {
17
17
  const families = [...new Set(models.map((model) => model.family))];
18
18
  return /* @__PURE__ */ jsx("div", {
19
19
  "data-slot": "model-picker",
20
- className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-(--radius-overlay) p-2", className),
20
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-overlay p-2", className),
21
21
  ...props,
22
22
  children: families.map((family) => /* @__PURE__ */ jsxs("div", {
23
23
  className: "flex flex-col",
@@ -30,7 +30,7 @@ function ModelPicker({ models, selectedId, onSelect, className, ...props }) {
30
30
  type: "button",
31
31
  "aria-pressed": selected,
32
32
  onClick: () => onSelect?.(model.id),
33
- className: cn("flex items-center gap-2.5 rounded-(--radius-surface) px-2 py-2 text-start transition-colors", selected ? "bg-surface-2" : "hover:bg-surface-1"),
33
+ className: cn("flex items-center gap-2.5 rounded-surface px-2 py-2 text-start transition-colors", selected ? "bg-surface-2" : "hover:bg-surface-1"),
34
34
  children: [
35
35
  /* @__PURE__ */ jsx("span", {
36
36
  className: "flex size-3.5 shrink-0 items-center justify-center",
@@ -44,7 +44,7 @@ function ModelPicker({ models, selectedId, onSelect, className, ...props }) {
44
44
  }), /* @__PURE__ */ jsx("span", {
45
45
  className: "flex flex-wrap gap-1",
46
46
  children: model.capabilities.map((capability) => /* @__PURE__ */ jsx("span", {
47
- className: cn(field, mono, "text-fg-muted rounded-(--radius-control) px-1 py-px"),
47
+ className: cn(field, mono, "text-fg-muted rounded-control px-1 py-px"),
48
48
  children: capability
49
49
  }, capability))
50
50
  })]
@@ -19,7 +19,7 @@ function Onboarding({ steps, index, onNext, onSkip, className, ...props }) {
19
19
  const last = current >= steps.length - 1;
20
20
  return /* @__PURE__ */ jsxs("div", {
21
21
  "data-slot": "onboarding",
22
- className: cn(paper, "flex w-full max-w-sm flex-col gap-4 rounded-(--radius-overlay) p-5", className),
22
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-4 rounded-overlay p-5", className),
23
23
  ...props,
24
24
  children: [/* @__PURE__ */ jsxs("div", {
25
25
  className: "cue-elements-fade-in cue-elements-animate-in flex flex-col gap-2 duration-300",
@@ -41,7 +41,7 @@ function Onboarding({ steps, index, onNext, onSkip, className, ...props }) {
41
41
  children: step.body
42
42
  }),
43
43
  /* @__PURE__ */ jsx("span", {
44
- className: cn(field, "text-fg-muted rounded-(--radius-surface) px-3 py-2 text-(length:--cue-text-body) leading-(--cue-leading-ui)"),
44
+ className: cn(field, "text-fg-muted rounded-surface px-3 py-2 text-(length:--cue-text-body) leading-(--cue-leading-ui)"),
45
45
  children: step.example
46
46
  })
47
47
  ]
@@ -21,13 +21,13 @@ import { KeyRoundIcon } from "lucide-react";
21
21
  function PermissionGrant({ capability, requester, reach, scope, onGrant, className, ...props }) {
22
22
  return /* @__PURE__ */ jsxs("div", {
23
23
  "data-slot": "permission-grant",
24
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3.5 rounded-(--radius-overlay) p-4", className),
24
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3.5 rounded-overlay p-4", className),
25
25
  ...props,
26
26
  children: [
27
27
  /* @__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-7 shrink-0 items-center justify-center rounded-(--radius-surface)",
30
+ className: "bg-surface-1 text-fg-muted flex size-7 shrink-0 items-center justify-center rounded-surface",
31
31
  children: /* @__PURE__ */ jsx(KeyRoundIcon, { className: "size-3.5" })
32
32
  }), /* @__PURE__ */ jsxs("div", {
33
33
  className: "flex min-w-0 flex-1 flex-col",
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_INSET_2, FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
3
4
  import { field, fieldInteractive, mono, paper } from "./surfaces.js";
4
5
  import { PERMISSION_LABELS } from "./vocabulary.js";
5
6
  import * as React from "react";
@@ -170,7 +171,7 @@ const PermissionScopes = React.forwardRef(function PermissionScopes({ question,
170
171
  event.preventDefault();
171
172
  answer.run();
172
173
  },
173
- className: cn(paper, "flex w-full max-w-md flex-col gap-2.5 rounded-(--radius-overlay) p-3", className),
174
+ className: cn(paper, "flex w-full max-w-md flex-col gap-2.5 rounded-overlay p-3", className),
174
175
  ...elementProps,
175
176
  children: [
176
177
  /* @__PURE__ */ jsxs("p", {
@@ -183,7 +184,7 @@ const PermissionScopes = React.forwardRef(function PermissionScopes({ question,
183
184
  }),
184
185
  input === void 0 ? null : /* @__PURE__ */ jsx("pre", {
185
186
  "data-slot": "permission-scopes-input",
186
- className: cn(field, mono, "text-fg-muted max-h-40 overflow-auto rounded-(--radius-control) px-2.5 py-2 whitespace-pre-wrap"),
187
+ className: cn(field, mono, "text-fg-muted max-h-40 overflow-auto rounded-control px-2.5 py-2 whitespace-pre-wrap"),
187
188
  children: input
188
189
  }),
189
190
  /* @__PURE__ */ jsx("ul", {
@@ -195,7 +196,7 @@ const PermissionScopes = React.forwardRef(function PermissionScopes({ question,
195
196
  type: "button",
196
197
  "data-answer": answer.id,
197
198
  onClick: answer.run,
198
- className: cn(answer.id === "always" ? fieldInteractive : "hover:bg-surface-2", "flex w-full items-baseline gap-1 rounded-(--radius-control) px-2 py-1.5 text-start text-(length:--cue-text-ui) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent", answer.id === "deny" ? "text-fg-muted" : "text-fg"),
199
+ className: cn(answer.id === "always" ? fieldInteractive : "hover:bg-surface-2", `flex w-full items-baseline gap-1 rounded-control px-2 py-1.5 text-start text-(length:--cue-text-ui) outline-none ${FOCUS_RING_INSET_2}`, answer.id === "deny" ? "text-fg-muted" : "text-fg"),
199
200
  children: [/* @__PURE__ */ jsx("span", {
200
201
  className: cn(mono, "shrink-0 opacity-60"),
201
202
  children: index + 1
@@ -211,7 +212,7 @@ const PermissionScopes = React.forwardRef(function PermissionScopes({ question,
211
212
  onClick: () => {
212
213
  onScopeChange(scopes[(scopes.indexOf(chosen) + 1) % scopes.length].id);
213
214
  },
214
- className: "text-fg-subtle ms-6 self-start rounded-(--radius-control) text-start text-(length:--cue-text-ui) wrap-anywhere underline decoration-dotted underline-offset-2 outline-none hover:decoration-solid focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent",
215
+ className: `text-fg-subtle ms-6 self-start rounded-control text-start text-(length:--cue-text-ui) wrap-anywhere underline decoration-dotted underline-offset-2 outline-none hover:decoration-solid ${FOCUS_RING_OFFSET_2}`,
215
216
  children: chosen.writes
216
217
  }) : /* @__PURE__ */ jsx("span", {
217
218
  "data-slot": "permission-scopes-destination",
@@ -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, paper } from "./surfaces.js";
4
5
  import { useId } from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -46,11 +47,11 @@ function PromptLibrary({ prompts, query, selectedId, onQueryChange, onSelect, on
46
47
  };
47
48
  return /* @__PURE__ */ jsxs("div", {
48
49
  "data-slot": "prompt-library",
49
- className: cn(paper, "flex w-full max-w-sm flex-col gap-2 rounded-(--radius-overlay) p-3", className),
50
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-2 rounded-overlay p-3", className),
50
51
  ...props,
51
52
  children: [
52
53
  /* @__PURE__ */ jsxs("div", {
53
- className: cn(field, "flex items-center gap-2 rounded-(--radius-surface) px-2.5 py-1.5"),
54
+ className: cn(field, "flex items-center gap-2 rounded-surface px-2.5 py-1.5"),
54
55
  children: [/* @__PURE__ */ jsx(BookmarkIcon, { className: "text-fg-subtle size-3.5 shrink-0" }), /* @__PURE__ */ jsx("input", {
55
56
  value: query,
56
57
  onChange: (event) => onQueryChange?.(event.target.value),
@@ -62,7 +63,7 @@ function PromptLibrary({ prompts, query, selectedId, onQueryChange, onSelect, on
62
63
  "aria-controls": listId,
63
64
  "aria-autocomplete": "list",
64
65
  "aria-activedescendant": selected ? optionId(selected.id) : void 0,
65
- className: "text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-body) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
66
+ className: `text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-body) outline-none ${FOCUS_RING}`
66
67
  })]
67
68
  }),
68
69
  /* @__PURE__ */ jsx("div", {
@@ -79,7 +80,7 @@ function PromptLibrary({ prompts, query, selectedId, onQueryChange, onSelect, on
79
80
  onMouseDown: (event) => event.preventDefault(),
80
81
  onClick: () => onSelect?.(prompt.id),
81
82
  onDoubleClick: () => onInsert?.(prompt.id),
82
- className: cn("flex items-center gap-2 rounded-(--radius-surface) px-2 py-1.5 text-start transition-colors", prompt.id === selectedId ? "bg-surface-1" : "hover:bg-surface-1"),
83
+ className: cn("flex items-center gap-2 rounded-surface px-2 py-1.5 text-start transition-colors", prompt.id === selectedId ? "bg-surface-1" : "hover:bg-surface-1"),
83
84
  children: [/* @__PURE__ */ jsx("span", {
84
85
  className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
85
86
  children: prompt.name
@@ -98,14 +99,14 @@ function PromptLibrary({ prompts, query, selectedId, onQueryChange, onSelect, on
98
99
  ]
99
100
  }),
100
101
  selected && /* @__PURE__ */ jsxs("div", {
101
- className: cn("bg-fg/[0.06]", "cue-elements-fade-in cue-elements-animate-in flex flex-col gap-2 rounded-(--radius-surface) p-2.5 duration-200"),
102
+ className: cn("bg-fg/[0.06]", "cue-elements-fade-in cue-elements-animate-in flex flex-col gap-2 rounded-surface p-2.5 duration-200"),
102
103
  children: [/* @__PURE__ */ jsx("p", {
103
104
  className: "text-fg-muted text-(length:--cue-text-ui) leading-(--cue-leading-ui) break-words",
104
105
  children: selected.body
105
106
  }), selected.variables.length > 0 && /* @__PURE__ */ jsx("div", {
106
107
  className: "flex flex-wrap gap-1",
107
108
  children: selected.variables.map((variable) => /* @__PURE__ */ jsx("span", {
108
- className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "bg-bg text-fg-muted rounded-(--radius-control) px-1.5 py-0.5"),
109
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "bg-bg text-fg-muted rounded-control px-1.5 py-0.5"),
109
110
  children: `{${variable}}`
110
111
  }, variable))
111
112
  })]
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_INSET_2 } from "../system/_focus-ring.js";
3
4
  import { field, ghostButton, mono, paper } from "./surfaces.js";
4
5
  import { QUEUE_LABELS } from "./vocabulary.js";
5
6
  import * as React from "react";
@@ -73,14 +74,14 @@ const QueueDock = React.forwardRef(function QueueDock({ messages, open, onOpenCh
73
74
  ref,
74
75
  "data-slot": "queue-dock",
75
76
  "data-open": String(open),
76
- className: cn(paper, "flex w-full flex-col rounded-(--radius-overlay)", className),
77
+ className: cn(paper, "flex w-full flex-col rounded-overlay", className),
77
78
  ...elementProps,
78
79
  children: [/* @__PURE__ */ jsxs("button", {
79
80
  type: "button",
80
81
  "aria-expanded": open,
81
82
  title: open ? copy.collapse : copy.expand,
82
83
  onClick: () => onOpenChange?.(!open),
83
- className: "hover:bg-surface-2 flex items-center gap-2.5 rounded-(--radius-overlay) px-3 py-2 text-start transition-colors focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent motion-reduce:transition-none",
84
+ className: `hover:bg-surface-2 flex items-center gap-2.5 rounded-overlay px-3 py-2 text-start transition-colors ${FOCUS_RING_INSET_2} motion-reduce:transition-none`,
84
85
  children: [/* @__PURE__ */ jsx(ChevronRightIcon, {
85
86
  "aria-hidden": true,
86
87
  className: cn("text-fg-subtle size-3 shrink-0 transition-transform duration-200 motion-reduce:transition-none", open && "rotate-90")
@@ -92,7 +93,7 @@ const QueueDock = React.forwardRef(function QueueDock({ messages, open, onOpenCh
92
93
  "data-slot": "queue-dock-entries",
93
94
  className: "flex flex-col gap-1 px-2 pb-2",
94
95
  children: messages.map((message, index) => /* @__PURE__ */ jsxs("li", {
95
- className: cn(field, "flex items-center gap-2 rounded-(--radius-control) py-1.5 pe-1.5 ps-2.5"),
96
+ className: cn(field, "flex items-center gap-2 rounded-control py-1.5 pe-1.5 ps-2.5"),
96
97
  children: [
97
98
  /* @__PURE__ */ jsx("span", {
98
99
  className: cn(mono, "text-fg-subtle w-3 shrink-0 tabular-nums"),
@@ -17,7 +17,7 @@ function QuotaBanner({ used, limit, unit, resetsIn, upgradeLabel, onUpgrade, cla
17
17
  const tight = (limit === 0 ? 0 : used / limit) >= .9;
18
18
  return /* @__PURE__ */ jsxs("div", {
19
19
  "data-slot": "quota-banner",
20
- className: cn(paper, "flex w-full max-w-sm flex-col gap-2.5 rounded-(--radius-overlay) p-3.5", className),
20
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-2.5 rounded-overlay p-3.5", className),
21
21
  ...props,
22
22
  children: [
23
23
  /* @__PURE__ */ jsxs("div", {
@@ -38,7 +38,7 @@ function QuoteReply({ before, selection, after, actions, toolbarVisible, quoted,
38
38
  children: before
39
39
  }),
40
40
  /* @__PURE__ */ jsx("span", {
41
- className: "text-fg rounded-(--radius-control) bg-stream/25 px-0.5",
41
+ className: "text-fg rounded-control bg-stream/25 px-0.5",
42
42
  children: selection
43
43
  }),
44
44
  /* @__PURE__ */ jsx("span", {
@@ -26,12 +26,12 @@ function ReadAloud({ words, spokenIndex, playing, rate, elapsed, duration, onTog
26
26
  const progress = pct(spokenIndex, words.length);
27
27
  return /* @__PURE__ */ jsxs("div", {
28
28
  "data-slot": "read-aloud",
29
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
29
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-3.5", className),
30
30
  ...props,
31
31
  children: [/* @__PURE__ */ jsx("p", {
32
32
  className: "text-(length:--cue-text-body) leading-(--cue-leading-ui)",
33
33
  children: words.map((word, i) => /* @__PURE__ */ jsxs("span", {
34
- className: cn("transition-colors duration-200 motion-reduce:transition-none", i < spokenIndex ? "text-fg-subtle" : i === spokenIndex ? "text-fg rounded-(--radius-control) bg-stream/15" : "text-fg-muted"),
34
+ className: cn("transition-colors duration-200 motion-reduce:transition-none", i < spokenIndex ? "text-fg-subtle" : i === spokenIndex ? "text-fg rounded-control bg-stream/15" : "text-fg-muted"),
35
35
  children: [word, " "]
36
36
  }, `${i}-${word}`))
37
37
  }), /* @__PURE__ */ jsxs("div", {
@@ -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 { ShimmerLabel, SwapLabel, collapsePanel } from "./surfaces.js";
4
5
  import { take } from "./range.js";
5
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -31,7 +32,7 @@ function ReasoningPanel({ steps, visibleSteps, streaming, open, onOpenChange, re
31
32
  onOpenChange,
32
33
  className: cn("w-full max-w-sm", className),
33
34
  children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
34
- className: "group/trigger text-fg-muted hover:text-fg flex items-center gap-1.5 py-1 text-(length:--cue-text-body) transition-[color,scale] outline-none active:scale-[0.98] focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent",
35
+ className: `group/trigger text-fg-muted hover:text-fg flex items-center gap-1.5 py-1 text-(length:--cue-text-body) transition-[color,scale] outline-none active:scale-[0.98] ${FOCUS_RING}`,
35
36
  children: [/* @__PURE__ */ jsxs(SwapLabel, {
36
37
  active: streaming ? 0 : 1,
37
38
  className: "text-start",
@@ -19,7 +19,7 @@ type RecommendationState = "idle" | "accepted";
19
19
  * onAccept={() => accept()}
20
20
  * >
21
21
  * Wire{" "}
22
- * <span className="bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
22
+ * <span className="bg-surface-2 text-fg-muted rounded-control px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
23
23
  * runtime.drafts
24
24
  * </span>{" "}
25
25
  * with three lines.
@@ -23,7 +23,7 @@ const CONFIDENCE_BARS = [
23
23
  * onAccept={() => accept()}
24
24
  * >
25
25
  * Wire{" "}
26
- * <span className="bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
26
+ * <span className="bg-surface-2 text-fg-muted rounded-control px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
27
27
  * runtime.drafts
28
28
  * </span>{" "}
29
29
  * with three lines.
@@ -32,7 +32,7 @@ const CONFIDENCE_BARS = [
32
32
  function RecommendationCard({ state, question, children, confidenceLabel, acceptedLabel, onAccept, onAlternatives, className, ...props }) {
33
33
  return /* @__PURE__ */ jsxs("div", {
34
34
  "data-slot": "recommendation-card",
35
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
35
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-4", className),
36
36
  ...props,
37
37
  children: [
38
38
  /* @__PURE__ */ jsx("p", {
@@ -31,11 +31,11 @@ function RegenerateMenu({ options, open, currentId, onOpenChange, onPick, classN
31
31
  className: cn(ghostButton, "size-7 self-start", open && "bg-surface-2 text-fg"),
32
32
  children: /* @__PURE__ */ jsx(RefreshCwIcon, { className: "size-3.5" })
33
33
  }), open && /* @__PURE__ */ jsx("div", {
34
- className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-slide-in-from-top-1 cue-elements-animate-in flex flex-col gap-0.5 rounded-(--radius-overlay) p-1.5 duration-200"),
34
+ className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-slide-in-from-top-1 cue-elements-animate-in flex flex-col gap-0.5 rounded-overlay p-1.5 duration-200"),
35
35
  children: options.map((option) => /* @__PURE__ */ jsxs("button", {
36
36
  type: "button",
37
37
  onClick: () => onPick?.(option.id),
38
- className: "hover:bg-surface-1 flex items-baseline gap-2 rounded-(--radius-surface) px-2.5 py-1.5 text-start transition-colors",
38
+ className: "hover:bg-surface-1 flex items-baseline gap-2 rounded-surface px-2.5 py-1.5 text-start transition-colors",
39
39
  children: [/* @__PURE__ */ jsx("span", {
40
40
  className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
41
41
  children: option.label
@@ -16,7 +16,7 @@ function ResearchReport({ title, sections, sourcesRead, className, ...props }) {
16
16
  const done = sections.filter((section) => section.state === "done").length;
17
17
  return /* @__PURE__ */ jsxs("div", {
18
18
  "data-slot": "research-report",
19
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
19
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-4", className),
20
20
  ...props,
21
21
  children: [/* @__PURE__ */ jsxs("div", {
22
22
  className: "flex flex-col gap-1",
@@ -41,7 +41,7 @@ function RetrievalChunks({ query, chunks, visibleCount, searching, className, ..
41
41
  /* @__PURE__ */ jsx("div", {
42
42
  className: "flex min-h-[7rem] flex-col gap-1.5",
43
43
  children: take(chunks, visibleCount).map((chunk) => /* @__PURE__ */ jsxs("div", {
44
- className: cn(paper, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex flex-col gap-1.5 rounded-(--radius-overlay) px-3.5 py-2.5 duration-300"),
44
+ className: cn(paper, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex flex-col gap-1.5 rounded-overlay px-3.5 py-2.5 duration-300"),
45
45
  children: [
46
46
  /* @__PURE__ */ jsxs("div", {
47
47
  className: "flex items-baseline gap-2",
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING, FOCUS_RING_INSET_2 } from "../system/_focus-ring.js";
3
4
  import { field, fieldInteractive, ghostButton, mono, paper } from "./surfaces.js";
4
5
  import { REVERT_LABELS, REVERT_SCOPES, REVERT_SCOPE_DESCRIPTIONS, REVERT_SCOPE_LABELS } from "./vocabulary.js";
5
6
  import * as React from "react";
@@ -210,7 +211,7 @@ const RevertDock = React.forwardRef(function RevertDock({ label = "Revert to thi
210
211
  "data-slot": "revert-dock",
211
212
  "data-open": String(open),
212
213
  "data-confirming": confirming ?? "none",
213
- className: cn(paper, "flex w-full flex-col rounded-(--radius-overlay)", className),
214
+ className: cn(paper, "flex w-full flex-col rounded-overlay", className),
214
215
  onKeyDown: (event) => {
215
216
  onKeyDown?.(event);
216
217
  if (event.key !== "Escape" || confirming === null) return;
@@ -226,7 +227,7 @@ const RevertDock = React.forwardRef(function RevertDock({ label = "Revert to thi
226
227
  if (open && confirming !== null) onConfirmingChange?.(null);
227
228
  onOpenChange?.(!open);
228
229
  },
229
- className: "hover:bg-surface-2 flex items-center gap-2.5 rounded-(--radius-overlay) px-3 py-2 text-start transition-colors focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent motion-reduce:transition-none",
230
+ className: `hover:bg-surface-2 flex items-center gap-2.5 rounded-overlay px-3 py-2 text-start transition-colors ${FOCUS_RING_INSET_2} motion-reduce:transition-none`,
230
231
  children: [
231
232
  /* @__PURE__ */ jsx(HistoryIcon, {
232
233
  "aria-hidden": true,
@@ -270,7 +271,7 @@ const RevertDock = React.forwardRef(function RevertDock({ label = "Revert to thi
270
271
  disabled: confirming !== null,
271
272
  id: armed ? scopeId : void 0,
272
273
  onClick: () => onConfirmingChange?.(scope),
273
- className: cn(confirming === null ? fieldInteractive : armed ? "bg-danger/10" : cn(field, "opacity-60"), "flex flex-col items-start gap-0.5 rounded-(--radius-control) px-3 py-2 text-start outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent"),
274
+ className: cn(confirming === null ? fieldInteractive : armed ? "bg-danger/10" : cn(field, "opacity-60"), `flex flex-col items-start gap-0.5 rounded-control px-3 py-2 text-start outline-none ${FOCUS_RING_INSET_2}`),
274
275
  children: [/* @__PURE__ */ jsx("span", {
275
276
  className: "text-fg text-(length:--cue-text-ui) font-medium",
276
277
  children: scopeCopy[scope]
@@ -311,7 +312,7 @@ const RevertDock = React.forwardRef(function RevertDock({ label = "Revert to thi
311
312
  onConfirmingChange?.(null);
312
313
  onRestore?.(confirming);
313
314
  },
314
- className: "bg-danger text-danger-fg flex items-center gap-1.5 rounded-(--radius-control) px-3 py-1.5 text-(length:--cue-text-ui) font-medium outline-none transition-[opacity,scale] duration-150 enabled:hover:opacity-90 enabled:active:scale-[0.96] disabled:opacity-60 focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent motion-reduce:transition-none",
315
+ className: `bg-danger text-danger-fg flex items-center gap-1.5 rounded-control px-3 py-1.5 text-(length:--cue-text-ui) font-medium outline-none transition-[opacity,scale] duration-150 enabled:hover:opacity-90 enabled:active:scale-[0.96] disabled:opacity-60 ${FOCUS_RING} motion-reduce:transition-none`,
315
316
  children: [/* @__PURE__ */ jsx(RotateCcwIcon, {
316
317
  "aria-hidden": true,
317
318
  className: "size-3.5"
@@ -29,7 +29,7 @@ function ReviewableDiff({ filename, hunks, onKeep, onDiscard, onApply, className
29
29
  const pending = hunks.filter((hunk) => hunk.decision === "pending").length;
30
30
  return /* @__PURE__ */ jsxs("div", {
31
31
  "data-slot": "reviewable-diff",
32
- className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
32
+ className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-overlay", className),
33
33
  ...props,
34
34
  children: [
35
35
  /* @__PURE__ */ jsxs("div", {
@@ -22,14 +22,14 @@ import { CheckIcon, ClockIcon, XIcon } from "lucide-react";
22
22
  function ScheduleCard({ name, cadence, nextRun, enabled, history, onToggle, className, ...props }) {
23
23
  return /* @__PURE__ */ jsxs("div", {
24
24
  "data-slot": "schedule-card",
25
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
25
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 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(ClockIcon, { className: "size-3.5" })
34
34
  }),
35
35
  /* @__PURE__ */ jsxs("div", {
@@ -54,7 +54,7 @@ function ScheduleCard({ name, cadence, nextRun, enabled, history, onToggle, clas
54
54
  ]
55
55
  }),
56
56
  /* @__PURE__ */ jsxs("div", {
57
- className: cn(field, "flex items-baseline gap-2 rounded-(--radius-surface) px-3 py-2", !enabled && "opacity-45"),
57
+ className: cn(field, "flex items-baseline gap-2 rounded-surface px-3 py-2", !enabled && "opacity-45"),
58
58
  children: [/* @__PURE__ */ jsx("span", {
59
59
  className: cn(mono, "text-fg-subtle"),
60
60
  children: "next"
@@ -22,7 +22,7 @@ function ScoreBreakdown({ verdict, total, outOf, criteria, visibleCount, classNa
22
22
  const ratio = outOf === 0 ? 0 : total / outOf;
23
23
  return /* @__PURE__ */ jsxs("div", {
24
24
  "data-slot": "score-breakdown",
25
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
25
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-4", className),
26
26
  ...props,
27
27
  children: [/* @__PURE__ */ jsxs("div", {
28
28
  className: "flex items-baseline gap-2",
@@ -90,14 +90,14 @@ function ScrollAnchor({ messages, paused = false, onSettled, className, ...props
90
90
  const newCount = count - seenCount;
91
91
  return /* @__PURE__ */ jsxs("div", {
92
92
  "data-slot": "scroll-anchor",
93
- className: cn(paper, "relative h-64 w-full max-w-sm overflow-hidden rounded-(--radius-overlay)", className),
93
+ className: cn(paper, "relative h-64 w-full max-w-sm overflow-hidden rounded-overlay", className),
94
94
  ...props,
95
95
  children: [
96
96
  /* @__PURE__ */ jsx("div", {
97
97
  ref: viewportRef,
98
98
  className: "flex h-full flex-col gap-2.5 overflow-y-hidden scroll-smooth motion-reduce:scroll-auto p-4",
99
99
  children: messages.slice(0, count).map((message, i) => /* @__PURE__ */ jsx("div", {
100
- className: cn("cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in max-w-[85%] text-(length:--cue-text-ui) leading-(--cue-leading-ui) duration-300 motion-reduce:animate-none", message.role === "user" ? cn(field, "self-end rounded-(--radius-overlay) px-3 py-1.5") : "text-fg-muted self-start"),
100
+ className: cn("cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in max-w-[85%] text-(length:--cue-text-ui) leading-(--cue-leading-ui) duration-300 motion-reduce:animate-none", message.role === "user" ? cn(field, "self-end rounded-overlay px-3 py-1.5") : "text-fg-muted self-start"),
101
101
  children: message.text
102
102
  }, i))
103
103
  }),
@@ -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 { clamp } from "./range.js";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -22,7 +23,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
22
23
  function SettingsPanel({ model, models, systemPrompt, temperature, toggles, onModelChange, onSystemPromptChange, onTemperatureChange, onToggle, className, ...props }) {
23
24
  return /* @__PURE__ */ jsxs("div", {
24
25
  "data-slot": "settings-panel",
25
- className: cn(paper, "flex w-full max-w-sm flex-col gap-4 rounded-(--radius-overlay) p-4", className),
26
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-4 rounded-overlay p-4", className),
26
27
  ...props,
27
28
  children: [
28
29
  /* @__PURE__ */ jsxs("div", {
@@ -51,7 +52,7 @@ function SettingsPanel({ model, models, systemPrompt, temperature, toggles, onMo
51
52
  onChange: (event) => onSystemPromptChange?.(event.target.value),
52
53
  rows: 3,
53
54
  "aria-label": "System prompt",
54
- className: cn(field, "text-fg-muted 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) leading-(--cue-leading-ui) outline-none")
55
+ className: cn(field, `text-fg-muted ${FOCUS_RING} resize-none rounded-surface px-3 py-2 text-(length:--cue-text-ui) leading-(--cue-leading-ui) outline-none`)
55
56
  })]
56
57
  }),
57
58
  /* @__PURE__ */ jsxs("div", {
@@ -21,7 +21,7 @@ import { LinkIcon } from "lucide-react";
21
21
  function SharedConversation({ title, sharedBy, sharedAt, turns, onContinue, className, ...props }) {
22
22
  return /* @__PURE__ */ jsxs("div", {
23
23
  "data-slot": "shared-conversation",
24
- className: cn(paper, "flex w-full max-w-sm flex-col overflow-hidden rounded-(--radius-overlay)", className),
24
+ className: cn(paper, "flex w-full max-w-sm flex-col overflow-hidden rounded-overlay", className),
25
25
  ...props,
26
26
  children: [
27
27
  /* @__PURE__ */ jsxs("div", {
@@ -45,7 +45,7 @@ function SharedConversation({ title, sharedBy, sharedAt, turns, onContinue, clas
45
45
  /* @__PURE__ */ jsx("div", {
46
46
  className: "border-border flex flex-col gap-2.5 border-t px-4 py-3.5",
47
47
  children: turns.map((turn) => /* @__PURE__ */ jsx("div", {
48
- className: cn("text-(length:--cue-text-body) leading-(--cue-leading-ui)", turn.role === "user" ? "bg-surface-1 ms-auto max-w-[85%] rounded-(--radius-overlay) px-3 py-2" : "text-fg-muted"),
48
+ className: cn("text-(length:--cue-text-body) leading-(--cue-leading-ui)", turn.role === "user" ? "bg-surface-1 ms-auto max-w-[85%] rounded-overlay px-3 py-2" : "text-fg-muted"),
49
49
  children: turn.text
50
50
  }, turn.id))
51
51
  }),
@@ -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 { collapsePanel, fieldInteractive, mono, paper } from "./surfaces.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { Collapsible } from "@base-ui/react/collapsible";
@@ -24,7 +25,7 @@ function Sources({ sources, open, onOpenChange, className }) {
24
25
  onOpenChange,
25
26
  className: cn("w-full max-w-sm", className),
26
27
  children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
27
- className: cn(fieldInteractive, "group/trigger text-fg-muted hover:text-fg inline-flex w-fit items-center gap-1.5 rounded-full px-3.5 py-2 text-(length:--cue-text-ui) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"),
28
+ className: cn(fieldInteractive, `group/trigger text-fg-muted hover:text-fg inline-flex w-fit items-center gap-1.5 rounded-full px-3.5 py-2 text-(length:--cue-text-ui) outline-none ${FOCUS_RING}`),
28
29
  children: [
29
30
  /* @__PURE__ */ jsx("span", { children: "Sources" }),
30
31
  /* @__PURE__ */ jsx("span", {
@@ -38,11 +39,11 @@ function Sources({ sources, open, onOpenChange, className }) {
38
39
  children: /* @__PURE__ */ jsx("div", {
39
40
  className: "grid grid-cols-2 gap-2 pt-2.5",
40
41
  children: sources.map((source) => /* @__PURE__ */ jsxs("div", {
41
- className: cn(paper, "flex flex-col gap-1.5 rounded-(--radius-overlay) p-3 transition-transform hover:-translate-y-px"),
42
+ className: cn(paper, "flex flex-col gap-1.5 rounded-overlay p-3 transition-transform hover:-translate-y-px"),
42
43
  children: [/* @__PURE__ */ jsxs("div", {
43
44
  className: "flex items-center gap-1.5",
44
45
  children: [/* @__PURE__ */ jsx("span", {
45
- className: "bg-surface-2 text-fg-muted flex size-4 shrink-0 items-center justify-center rounded-(--radius-control) text-(length:--cue-text-micro) font-medium",
46
+ className: "bg-surface-2 text-fg-muted flex size-4 shrink-0 items-center justify-center rounded-control text-(length:--cue-text-micro) font-medium",
46
47
  children: source.domain.charAt(0).toUpperCase()
47
48
  }), /* @__PURE__ */ jsx("span", {
48
49
  className: cn(mono, "text-fg-subtle truncate"),
@@ -26,7 +26,7 @@ function SpeakerIdentity({ turns, className, ...props }) {
26
26
  children: turns.map((turn) => /* @__PURE__ */ jsxs("div", {
27
27
  className: "flex gap-2.5",
28
28
  children: [/* @__PURE__ */ jsx("span", {
29
- className: cn("flex size-6 shrink-0 items-center justify-center rounded-(--radius-surface)", TONE[turn.kind], turn.kind === "subagent" && "rounded-full"),
29
+ className: cn("flex size-6 shrink-0 items-center justify-center rounded-surface", TONE[turn.kind], turn.kind === "subagent" && "rounded-full"),
30
30
  children: turn.kind === "user" ? /* @__PURE__ */ jsx(UserIcon, { className: "size-3" }) : turn.kind === "tool" ? /* @__PURE__ */ jsx(WrenchIcon, { className: "size-3" }) : /* @__PURE__ */ jsx(BotIcon, { className: "size-3" })
31
31
  }), /* @__PURE__ */ jsxs("div", {
32
32
  className: "flex min-w-0 flex-1 flex-col gap-0.5",
@@ -15,7 +15,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
15
15
  function SpecSheet({ title, subtitle, rows, visibleCount, className, ...props }) {
16
16
  return /* @__PURE__ */ jsxs("div", {
17
17
  "data-slot": "spec-sheet",
18
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
18
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-4", className),
19
19
  ...props,
20
20
  children: [/* @__PURE__ */ jsxs("div", {
21
21
  className: "flex flex-col gap-0.5",
@@ -31,7 +31,7 @@ function StreamingText({ segments, count, streaming, className, ...props }) {
31
31
  return /* @__PURE__ */ jsxs("span", {
32
32
  className: "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both duration-500 motion-reduce:animate-none",
33
33
  children: [/* @__PURE__ */ jsx("span", {
34
- className: cn("transition-colors duration-700 motion-reduce:transition-none", fresh && "text-stream", isMono && "bg-surface-2 rounded-(--radius-control) px-1.5 py-0.5 font-mono text-[0.85em]"),
34
+ className: cn("transition-colors duration-700 motion-reduce:transition-none", fresh && "text-stream", isMono && "bg-surface-2 rounded-control px-1.5 py-0.5 font-mono text-[0.85em]"),
35
35
  children: word
36
36
  }), " "]
37
37
  }, i);
@@ -28,7 +28,7 @@ function SubagentList({ agents, completedCount, progress, showSummary, summaryAg
28
28
  const done = index < completedCount;
29
29
  const width = progress[index] ?? 0;
30
30
  return /* @__PURE__ */ jsxs("div", {
31
- className: cn(paper, "flex flex-col gap-2 rounded-(--radius-overlay) px-3.5 py-2.5"),
31
+ className: cn(paper, "flex flex-col gap-2 rounded-overlay px-3.5 py-2.5"),
32
32
  children: [/* @__PURE__ */ jsxs("div", {
33
33
  className: "flex items-center gap-2",
34
34
  children: [
@@ -51,7 +51,7 @@ function SubagentList({ agents, completedCount, progress, showSummary, summaryAg
51
51
  })]
52
52
  }, agent.name);
53
53
  }), showSummary && /* @__PURE__ */ jsxs("div", {
54
- className: cn("bg-surface-1 border border-border", "cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in flex flex-col gap-2 rounded-(--radius-overlay) px-3.5 py-2.5 duration-300"),
54
+ className: cn("bg-surface-1 border border-border", "cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in flex flex-col gap-2 rounded-overlay px-3.5 py-2.5 duration-300"),
55
55
  children: [/* @__PURE__ */ jsxs("div", {
56
56
  className: "flex items-center gap-2",
57
57
  children: [
@@ -26,7 +26,7 @@ function Suggestions({ suggestions, selectedSuggestion, cycle, onSuggestion, var
26
26
  type: "button",
27
27
  "aria-pressed": selectedSuggestion === suggestion,
28
28
  onClick: () => onSuggestion(suggestion),
29
- className: cn(paper, "cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in cue-elements-fill-mode-both flex cursor-pointer items-center text-(length:--cue-text-body) transition-transform duration-300 hover:-translate-y-px active:scale-[0.96] motion-reduce:animate-none", list ? "w-full rounded-(--radius-overlay) px-4 py-2.5 text-start" : "rounded-full px-4 py-2", selectedSuggestion === suggestion && "bg-accent text-accent-fg"),
29
+ className: cn(paper, "cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in cue-elements-fill-mode-both flex cursor-pointer items-center text-(length:--cue-text-body) transition-transform duration-300 hover:-translate-y-px active:scale-[0.96] motion-reduce:animate-none", list ? "w-full rounded-overlay px-4 py-2.5 text-start" : "rounded-full px-4 py-2", selectedSuggestion === suggestion && "bg-accent text-accent-fg"),
30
30
  style: { animationDelay: `${index * 70}ms` },
31
31
  children: suggestion
32
32
  }, suggestion))
@@ -11,7 +11,7 @@ declare const fieldInteractive = "bg-fg/[0.06] transition-colors hover:bg-fg/[0.
11
11
  /** The press affordance: a 4% squash on pointer-down, stilled under reduced motion. */
12
12
  declare const pressable = "transition-transform duration-150 ease-[cubic-bezier(0.23,1,0.32,1)] active:scale-[0.96] motion-reduce:transition-none";
13
13
  /** A round chromeless icon button, with the ring cue puts on everything focusable. */
14
- declare const ghostButton = "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";
14
+ declare const ghostButton = "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-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:outline-offset-1 motion-reduce:transition-none";
15
15
  /** The inverse fill: accent ground, accent ink — the one loud button in a panel. */
16
16
  declare const inkButton = "bg-accent text-accent-fg transition-[background-color,scale] duration-150 ease-[cubic-bezier(0.23,1,0.32,1)] hover:bg-accent-hover active:scale-[0.96] motion-reduce:transition-none";
17
17
  /** The stacked layer of an icon crossfade. Both layers share one grid cell. */
@@ -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 { useLayoutEffect, useRef, useState } from "react";
4
5
  import { jsx } from "react/jsx-runtime";
5
6
  //#region src/elements/surfaces.tsx
@@ -14,7 +15,7 @@ const fieldInteractive = "bg-fg/[0.06] transition-colors hover:bg-fg/[0.09]";
14
15
  /** The press affordance: a 4% squash on pointer-down, stilled under reduced motion. */
15
16
  const pressable = "transition-transform duration-150 ease-[cubic-bezier(0.23,1,0.32,1)] active:scale-[0.96] motion-reduce:transition-none";
16
17
  /** A round chromeless icon button, with the ring cue puts on everything focusable. */
17
- const ghostButton = "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";
18
+ const ghostButton = `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_RING} motion-reduce:transition-none`;
18
19
  /** The inverse fill: accent ground, accent ink — the one loud button in a panel. */
19
20
  const inkButton = "bg-accent text-accent-fg transition-[background-color,scale] duration-150 ease-[cubic-bezier(0.23,1,0.32,1)] hover:bg-accent-hover active:scale-[0.96] motion-reduce:transition-none";
20
21
  /** The stacked layer of an icon crossfade. Both layers share one grid cell. */
@@ -84,7 +84,7 @@ const TailStatus = React.forwardRef(function TailStatus({ action, detail, active
84
84
  onCancel === void 0 ? null : /* @__PURE__ */ jsx("button", {
85
85
  type: "button",
86
86
  onClick: onCancel,
87
- className: cn(ghostButton, mono, "shrink-0 rounded-(--radius-control) px-2 py-1 uppercase"),
87
+ className: cn(ghostButton, mono, "shrink-0 rounded-control px-2 py-1 uppercase"),
88
88
  children: cancelLabel
89
89
  })
90
90
  ]