@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
@@ -21,7 +21,7 @@ import { CheckIcon, Loader2Icon } from "lucide-react";
21
21
  function TerminalBlock({ command, lines, visibleCount, done, variant = "paper", className, ...props }) {
22
22
  return /* @__PURE__ */ jsxs("div", {
23
23
  "data-slot": "terminal-block",
24
- className: cn(variant === "ink" ? "bg-sunken" : paper, "w-full max-w-md overflow-hidden rounded-(--radius-overlay) font-mono text-(length:--cue-text-ui)", className),
24
+ className: cn(variant === "ink" ? "bg-sunken" : paper, "w-full max-w-md overflow-hidden rounded-overlay font-mono text-(length:--cue-text-ui)", className),
25
25
  ...props,
26
26
  children: [/* @__PURE__ */ jsxs("div", {
27
27
  className: "flex items-center justify-between px-4 pt-3 pb-1.5",
@@ -33,7 +33,7 @@ function ThreadList({ threads, activeIndex, onActiveIndexChange, className, ...p
33
33
  type: "button",
34
34
  "aria-current": active || void 0,
35
35
  onClick: () => onActiveIndexChange?.(i),
36
- className: cn("group flex w-full items-center justify-between gap-2 rounded-(--radius-surface) px-3 py-2 text-start text-(length:--cue-text-body) transition-colors", active ? field : "hover:bg-surface-1"),
36
+ className: cn("group flex w-full items-center justify-between gap-2 rounded-surface px-3 py-2 text-start text-(length:--cue-text-body) transition-colors", active ? field : "hover:bg-surface-1"),
37
37
  children: [
38
38
  /* @__PURE__ */ jsx("span", {
39
39
  className: "flex-1 truncate",
@@ -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
  import { PinIcon, SearchIcon } from "lucide-react";
@@ -42,7 +43,7 @@ function ThreadSearch({ threads, query, activeId, onQueryChange, onSelect, class
42
43
  const row = (thread) => /* @__PURE__ */ jsxs("button", {
43
44
  type: "button",
44
45
  onClick: () => onSelect?.(thread.id),
45
- className: cn("flex flex-col gap-0.5 rounded-(--radius-surface) px-2 py-1 text-start transition-colors", thread.id === activeId ? "bg-surface-1" : "hover:bg-surface-1"),
46
+ className: cn("flex flex-col gap-0.5 rounded-surface px-2 py-1 text-start transition-colors", thread.id === activeId ? "bg-surface-1" : "hover:bg-surface-1"),
46
47
  children: [/* @__PURE__ */ jsxs("span", {
47
48
  className: "flex items-center gap-1.5",
48
49
  children: [thread.pinned && /* @__PURE__ */ jsx(PinIcon, { className: "text-fg-subtle size-2.5 shrink-0" }), /* @__PURE__ */ jsx("span", {
@@ -56,18 +57,18 @@ function ThreadSearch({ threads, query, activeId, onQueryChange, onSelect, class
56
57
  }, thread.id);
57
58
  return /* @__PURE__ */ jsxs("div", {
58
59
  "data-slot": "thread-search",
59
- className: cn(paper, "flex w-full max-w-sm flex-col gap-1.5 rounded-(--radius-overlay) p-3", className),
60
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-1.5 rounded-overlay p-3", className),
60
61
  ...props,
61
62
  children: [
62
63
  /* @__PURE__ */ jsxs("div", {
63
- className: cn(field, "flex items-center gap-2 rounded-(--radius-surface) px-2.5 py-1.5"),
64
+ className: cn(field, "flex items-center gap-2 rounded-surface px-2.5 py-1.5"),
64
65
  children: [/* @__PURE__ */ jsx(SearchIcon, { className: "text-fg-subtle size-3.5 shrink-0" }), /* @__PURE__ */ jsx("input", {
65
66
  value: query,
66
67
  onChange: (event) => onQueryChange?.(event.target.value),
67
68
  onKeyDown,
68
69
  placeholder: "Search threads",
69
70
  "aria-label": "Search threads",
70
- 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"
71
+ className: `text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-body) outline-none ${FOCUS_RING}`
71
72
  })]
72
73
  }),
73
74
  pinned.length > 0 && /* @__PURE__ */ jsxs("div", {
@@ -15,7 +15,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
15
15
  function ElementsTimeline({ events, visibleCount, className, ...props }) {
16
16
  return /* @__PURE__ */ jsx("div", {
17
17
  "data-slot": "timeline",
18
- className: cn(paper, "flex w-full max-w-sm flex-col rounded-(--radius-overlay) p-4", className),
18
+ className: cn(paper, "flex w-full max-w-sm flex-col rounded-overlay p-4", className),
19
19
  ...props,
20
20
  children: take(events, visibleCount).map((event, i, shown) => /* @__PURE__ */ jsxs("div", {
21
21
  className: "cue-elements-fade-in cue-elements-slide-in-from-left-1 cue-elements-animate-in cue-elements-fill-mode-both grid grid-cols-[3.5rem_1rem_minmax(0,1fr)] gap-x-2 duration-300",
@@ -41,11 +41,11 @@ function TodoList({ items, revision, className, ...props }) {
41
41
  children: [/* @__PURE__ */ jsx("span", {
42
42
  className: "flex size-4 h-5 shrink-0 items-center justify-center",
43
43
  children: item.status === "done" ? /* @__PURE__ */ jsx("span", {
44
- className: "border-border-strong bg-surface-2 flex size-3.5 items-center justify-center rounded-(--radius-control) border",
44
+ className: "border-border-strong bg-surface-2 flex size-3.5 items-center justify-center rounded-control border",
45
45
  children: /* @__PURE__ */ jsx(CheckIcon, { className: "text-fg-muted size-2.5" })
46
46
  }) : item.status === "active" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3.5 animate-spin text-stream motion-reduce:animate-none" }) : /* @__PURE__ */ jsx("span", {
47
47
  "aria-hidden": true,
48
- className: "border-border-strong size-3.5 rounded-(--radius-control) border"
48
+ className: "border-border-strong size-3.5 rounded-control border"
49
49
  })
50
50
  }), /* @__PURE__ */ jsx("span", {
51
51
  className: cn("min-w-0 flex-1 leading-5 break-words", item.status === "done" && "text-fg-subtle line-through decoration-[1.5px]", item.status === "active" && "text-fg", item.status === "pending" && "text-fg-muted"),
@@ -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, field, mono } from "./surfaces.js";
4
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
6
  import { Collapsible } from "@base-ui/react/collapsible";
@@ -29,7 +30,7 @@ function ToolCall({ label, activeLabel, query, request, result, running, open, o
29
30
  onOpenChange,
30
31
  className: cn("w-full max-w-sm", className),
31
32
  children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
32
- className: "group/trigger text-fg-muted hover:text-fg flex items-center gap-2 rounded-(--radius-control) py-1 text-(length:--cue-text-body) transition-colors outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent",
33
+ className: `group/trigger text-fg-muted hover:text-fg flex items-center gap-2 rounded-control py-1 text-(length:--cue-text-body) transition-colors outline-none ${FOCUS_RING}`,
33
34
  children: [
34
35
  /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-3.5 shrink-0 opacity-60 transition-transform duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] group-data-[panel-open]/trigger:rotate-90 motion-reduce:transition-none" }),
35
36
  /* @__PURE__ */ jsxs(SwapLabel, {
@@ -42,7 +43,7 @@ function ToolCall({ label, activeLabel, query, request, result, running, open, o
42
43
  }), /* @__PURE__ */ jsx(Fragment, { children: label })]
43
44
  }),
44
45
  /* @__PURE__ */ jsx("span", {
45
- className: cn(mono, "bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5"),
46
+ className: cn(mono, "bg-surface-2 text-fg-muted rounded-control px-1.5 py-0.5"),
46
47
  children: query
47
48
  }),
48
49
  /* @__PURE__ */ jsx("span", {
@@ -53,7 +54,7 @@ function ToolCall({ label, activeLabel, query, request, result, running, open, o
53
54
  }), /* @__PURE__ */ jsx(Collapsible.Panel, {
54
55
  className: cn(collapsePanel, "outline-none"),
55
56
  children: /* @__PURE__ */ jsxs("div", {
56
- className: cn(field, "mt-2 overflow-hidden rounded-(--radius-overlay) text-(length:--cue-text-ui)"),
57
+ className: cn(field, "mt-2 overflow-hidden rounded-overlay text-(length:--cue-text-ui)"),
57
58
  children: [
58
59
  /* @__PURE__ */ jsxs("div", {
59
60
  className: "px-3.5 pt-2.5 pb-2",
@@ -24,7 +24,7 @@ import { AlertCircleIcon, Loader2Icon, RotateCwIcon } from "lucide-react";
24
24
  function ToolError({ name, target, message, attempt, maxAttempts, retrying, onRetry, onSkip, className, ...props }) {
25
25
  return /* @__PURE__ */ jsxs("div", {
26
26
  "data-slot": "tool-error",
27
- className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
27
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-overlay p-3.5", className),
28
28
  ...props,
29
29
  children: [
30
30
  /* @__PURE__ */ jsxs("div", {
@@ -50,7 +50,7 @@ function ToolError({ name, target, message, attempt, maxAttempts, retrying, onRe
50
50
  ]
51
51
  }),
52
52
  /* @__PURE__ */ jsx("div", {
53
- className: cn(field, "rounded-(--radius-surface) px-3 py-2 font-mono text-(length:--cue-text-label) leading-(--cue-leading-ui) text-danger"),
53
+ className: cn(field, "rounded-surface px-3 py-2 font-mono text-(length:--cue-text-label) leading-(--cue-leading-ui) text-danger"),
54
54
  children: message
55
55
  }),
56
56
  /* @__PURE__ */ jsxs("div", {
@@ -22,7 +22,7 @@ function ToolGroup({ label, tools, open, onOpenChange, className, ...props }) {
22
22
  const failed = tools.filter((tool) => tool.state === "failed").length;
23
23
  return /* @__PURE__ */ jsxs("div", {
24
24
  "data-slot": "tool-group",
25
- className: cn(paper, "flex w-full max-w-sm flex-col overflow-hidden rounded-(--radius-overlay)", className),
25
+ className: cn(paper, "flex w-full max-w-sm flex-col overflow-hidden rounded-overlay", className),
26
26
  ...props,
27
27
  children: [/* @__PURE__ */ jsxs("button", {
28
28
  type: "button",
@@ -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 ToolTimeline({ steps, visibleSteps, streaming, open, onOpenChange, rest
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 rounded-(--radius-control) py-1 text-(length:--cue-text-body) transition-colors outline-none 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 rounded-control py-1 text-(length:--cue-text-body) transition-colors outline-none ${FOCUS_RING}`,
35
36
  children: [/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-3.5 shrink-0 opacity-60 transition-transform duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] group-data-[panel-open]/trigger:rotate-90 motion-reduce:transition-none" }), /* @__PURE__ */ jsxs(SwapLabel, {
36
37
  active: streaming ? 0 : 1,
37
38
  className: "text-start tabular-nums",
@@ -58,7 +59,7 @@ function ToolTimeline({ steps, visibleSteps, streaming, open, onOpenChange, rest
58
59
  children: step.verb
59
60
  }),
60
61
  /* @__PURE__ */ jsx("span", {
61
- className: "bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)",
62
+ className: "bg-surface-2 text-fg-muted rounded-control px-1.5 py-0.5 font-mono text-(length:--cue-text-label)",
62
63
  children: step.chip
63
64
  })
64
65
  ]
@@ -66,7 +67,7 @@ function ToolTimeline({ steps, visibleSteps, streaming, open, onOpenChange, rest
66
67
  }), stats.length > 0 && /* @__PURE__ */ jsx("div", {
67
68
  className: "flex flex-wrap gap-1.5 pt-1",
68
69
  children: stats.map((stat) => /* @__PURE__ */ jsxs("span", {
69
- className: "bg-surface-2 text-fg-muted inline-flex items-center gap-1 rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)",
70
+ className: "bg-surface-2 text-fg-muted inline-flex items-center gap-1 rounded-control px-1.5 py-0.5 font-mono text-(length:--cue-text-label)",
70
71
  children: [
71
72
  /* @__PURE__ */ jsx("span", { children: stat.file }),
72
73
  stat.added !== void 0 && /* @__PURE__ */ jsxs("span", {
@@ -21,7 +21,7 @@ function TraceWaterfall({ spans, totalMs, visibleCount, className, ...props }) {
21
21
  const span = totalMs || 1;
22
22
  return /* @__PURE__ */ jsxs("div", {
23
23
  "data-slot": "trace-waterfall",
24
- className: cn(paper, "flex w-full max-w-md flex-col gap-2 rounded-(--radius-overlay) p-4", className),
24
+ className: cn(paper, "flex w-full max-w-md flex-col gap-2 rounded-overlay p-4", className),
25
25
  ...props,
26
26
  children: [/* @__PURE__ */ jsxs("div", {
27
27
  className: "flex items-baseline justify-between",
@@ -82,7 +82,7 @@ const VerdictRow = React.forwardRef(function VerdictRow({ score, title, summary,
82
82
  ref,
83
83
  "data-slot": "verdict-row",
84
84
  "data-verdict": tone,
85
- className: cn(paper, "flex w-full flex-col gap-2 rounded-(--radius-overlay) px-3 py-2.5", className),
85
+ className: cn(paper, "flex w-full flex-col gap-2 rounded-overlay px-3 py-2.5", className),
86
86
  ...elementProps,
87
87
  children: [
88
88
  /* @__PURE__ */ jsxs("div", {
@@ -131,7 +131,7 @@ const VerdictRow = React.forwardRef(function VerdictRow({ score, title, summary,
131
131
  const chip = odds >= 70 ? "danger" : odds >= 50 ? "warn" : "neutral";
132
132
  return /* @__PURE__ */ jsxs("li", {
133
133
  "data-color": chip,
134
- className: cn(field, "flex max-w-full items-baseline gap-1.5 rounded-(--radius-control) px-2 py-0.5 text-(length:--cue-text-ui)", chip === "danger" ? "text-danger" : chip === "warn" ? "text-warn" : "text-fg-muted"),
134
+ className: cn(field, "flex max-w-full items-baseline gap-1.5 rounded-control px-2 py-0.5 text-(length:--cue-text-ui)", chip === "danger" ? "text-danger" : chip === "warn" ? "text-warn" : "text-fg-muted"),
135
135
  children: [/* @__PURE__ */ jsx("span", {
136
136
  className: "min-w-0 truncate",
137
137
  children: issue.label
@@ -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 { ghostButton, mono, paper } from "./surfaces.js";
4
5
  import { clamp } from "./range.js";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -38,7 +39,7 @@ function VoiceConversation({ mode, amplitude, transcript, muted, onToggleMute, o
38
39
  const canInterrupt = mode === "speaking" && onInterrupt !== void 0;
39
40
  return /* @__PURE__ */ jsxs("div", {
40
41
  "data-slot": "voice-conversation",
41
- className: cn(paper, "flex w-full max-w-xs flex-col items-center gap-4 rounded-(--radius-overlay) px-5 py-5", className),
42
+ className: cn(paper, "flex w-full max-w-xs flex-col items-center gap-4 rounded-overlay px-5 py-5", className),
42
43
  ...props,
43
44
  children: [
44
45
  /* @__PURE__ */ jsxs("button", {
@@ -46,7 +47,7 @@ function VoiceConversation({ mode, amplitude, transcript, muted, onToggleMute, o
46
47
  onClick: onInterrupt,
47
48
  disabled: !canInterrupt,
48
49
  "aria-label": "Interrupt the assistant",
49
- className: "focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent relative flex size-24 items-center justify-center rounded-full outline-none disabled:cursor-default",
50
+ className: `${FOCUS_RING} relative flex size-24 items-center justify-center rounded-full outline-none disabled:cursor-default`,
50
51
  children: [
51
52
  /* @__PURE__ */ jsx("span", {
52
53
  "aria-hidden": true,
@@ -19,7 +19,7 @@ import { ExternalLinkIcon, RotateCwIcon } from "lucide-react";
19
19
  function WebPreview({ origin, loading, children, onReload, onOpenExternal, className, ...props }) {
20
20
  return /* @__PURE__ */ jsxs("div", {
21
21
  "data-slot": "web-preview",
22
- className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
22
+ className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-overlay", className),
23
23
  ...props,
24
24
  children: [/* @__PURE__ */ jsxs("div", {
25
25
  className: "flex items-center gap-1.5 px-2.5 py-2",
@@ -42,10 +42,10 @@ function WebSearch({ query, results, visibleResults, searching, cycle, className
42
42
  /* @__PURE__ */ jsx("div", {
43
43
  className: "flex min-h-[5.75rem] flex-col",
44
44
  children: take(results, visibleResults).map((result) => /* @__PURE__ */ jsxs("div", {
45
- className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both hover:bg-surface-1 -mx-2.5 flex items-center gap-2.5 rounded-(--radius-surface) px-2.5 py-1.5 transition-colors duration-300",
45
+ className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both hover:bg-surface-1 -mx-2.5 flex items-center gap-2.5 rounded-surface px-2.5 py-1.5 transition-colors duration-300",
46
46
  children: [
47
47
  /* @__PURE__ */ jsx("span", {
48
- 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",
48
+ 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",
49
49
  children: result.domain.charAt(0).toUpperCase()
50
50
  }),
51
51
  /* @__PURE__ */ jsx("span", {
@@ -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 } from "./surfaces.js";
4
5
  import * as React from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -111,7 +112,7 @@ const WorkCollapse = React.forwardRef(function WorkCollapse({ durationMs, toolCa
111
112
  type: "button",
112
113
  "aria-expanded": open,
113
114
  onClick: () => onOpenChange?.(!open),
114
- className: "hover:bg-surface-1 -mx-2 flex items-center gap-2.5 rounded-(--radius-control) px-2 py-1 text-start transition-colors focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent motion-reduce:transition-none",
115
+ className: `hover:bg-surface-1 -mx-2 flex items-center gap-2.5 rounded-control px-2 py-1 text-start transition-colors ${FOCUS_RING} motion-reduce:transition-none`,
115
116
  children: [/* @__PURE__ */ jsx(ChevronRightIcon, {
116
117
  "aria-hidden": true,
117
118
  className: cn("text-fg-subtle size-3 shrink-0 transition-transform duration-200 motion-reduce:transition-none", open && "rotate-90")
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
3
4
  import { FLOW_NODE_FRAME_COLOR, FLOW_NODE_FRAME_PROPERTY, flowFrameColor } from "./_frame.js";
4
5
  import * as React from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -63,7 +64,7 @@ const NodeCard = React.forwardRef(function NodeCard({ className, style, tone, st
63
64
  "data-slot": "node-card",
64
65
  "data-tone": tone,
65
66
  "data-state": state,
66
- className: cn("relative flex min-w-0 flex-col rounded-(--radius-surface) bg-surface-1 font-mono text-(length:--cue-text-label) text-fg outline-1 outline-solid -outline-offset-1", state === "disabled" && "opacity-50", className),
67
+ className: cn("relative flex min-w-0 flex-col rounded-surface bg-surface-1 font-mono text-(length:--cue-text-label) text-fg outline-1 outline-solid -outline-offset-1", state === "disabled" && "opacity-50", className),
67
68
  style: {
68
69
  outlineColor: FLOW_NODE_FRAME_COLOR,
69
70
  ...frame === void 0 ? null : { [FLOW_NODE_FRAME_PROPERTY]: frame },
@@ -83,7 +84,7 @@ const NodeCard = React.forwardRef(function NodeCard({ className, style, tone, st
83
84
  "aria-expanded": expanded,
84
85
  "aria-controls": hasBody ? bodyId : void 0,
85
86
  "aria-label": toggleLabel ?? (expanded ? "Collapse" : "Expand"),
86
- className: cn(NO_CANVAS_GESTURE, "shrink-0 cursor-pointer border-0 bg-transparent p-0 text-(length:--cue-text-micro) leading-none text-fg-subtle outline-none select-none hover:text-fg-muted focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent"),
87
+ className: cn(NO_CANVAS_GESTURE, `shrink-0 cursor-pointer border-0 bg-transparent p-0 text-(length:--cue-text-micro) leading-none text-fg-subtle outline-none select-none hover:text-fg-muted ${FOCUS_RING_OFFSET_2}`),
87
88
  onClick: () => onExpandedChange(!expanded),
88
89
  children: /* @__PURE__ */ jsx("span", {
89
90
  "aria-hidden": "true",
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { useRead } from "../system/published.js";
2
3
  import { ThemeContext } from "../system/theme-provider.js";
3
4
  import { FLOW_NODE_FRAME_PROPERTY, flowFrameColor } from "./_frame.js";
4
5
  import { SignalEdge } from "./signal-edge.js";
@@ -96,7 +97,7 @@ const DEFAULT_EDGE_OPTIONS = Object.freeze({
96
97
  * const nodes = inputs.map((input) => ({ ...input, style: theme.nodeStyles.input }));
97
98
  */
98
99
  function useFlowTheme() {
99
- const colorMode = React.useContext(ThemeContext)?.resolvedMode ?? "dark";
100
+ const colorMode = useRead(ThemeContext)?.resolvedMode ?? "dark";
100
101
  return React.useMemo(() => ({
101
102
  colorMode,
102
103
  style: FLOW_THEME_VARIABLES,
@@ -83,14 +83,34 @@ import { FormControlSize } from "./_chassis-size.js";
83
83
  *
84
84
  * The compound modifier outranks the plain one on specificity — an attribute
85
85
  * selector and a pseudo-class against one pseudo-class — so its position in
86
- * Tailwind's utility order cannot decide it. `focus-visible:outline-solid` and
87
- * `focus-visible:outline-2` still supply the style and the width in both cases,
88
- * which is why only the colour is restated.
86
+ * Tailwind's utility order cannot decide it. {@link FOCUS_RING_FIELD} still
87
+ * supplies the style and the width in both cases, which is why only the
88
+ * colour is restated.
89
89
  *
90
90
  * `focus-visible:outline-solid` re-declares the outline style the sibling
91
91
  * `outline-none` switched off — see the note on `buttonChassis`.
92
+ *
93
+ * The width is {@link FOCUS_RING_FIELD}'s, read from `--cue-style-focus-width`
94
+ * (`_focus-ring.ts` says why every ring in this system shares one module); the
95
+ * border it is pulled back over reads `--cue-style-focus-edge` for the same
96
+ * reason a Look needs to move it — tender's dark band and kiln both do.
97
+ *
98
+ * The face (mono, unless a style set names another — `INPUT_FACE` says why) is
99
+ * what a person's typing renders in, at the body weight (`BODY_WEIGHT`:
100
+ * inherited, as it was before the name existed, unless a style set names one);
101
+ * a call site that deliberately keeps a typed value in mono regardless of the
102
+ * set (a hex colour code, a DMX value) restates `font-mono` on top, as
103
+ * `color-picker.tsx`'s hex field does.
104
+ *
105
+ * **The resting shade** ({@link REST_SHADE_CLASS}, spec §3.10) is the one
106
+ * shadow this recipe draws: the stroke paints a border and a ground and no
107
+ * shadow, so the shade is added as a utility of its own rather than composed
108
+ * into a list. It paints nothing until a pack tints `paint-rest-shade` —
109
+ * measured in `tests/browser/paint-elevation-noop.spec.ts` — and a caller's
110
+ * own `shadow-` utility replaces it through `twMerge`, as it would have
111
+ * replaced nothing before.
92
112
  */
93
- declare const controlSurface = "w-full rounded-(--radius-control) border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-sunken),var(--cue-sunken)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border)),var(--cue-paint-stroke-to,var(--cue-border)))] bg-origin-border [background-clip:padding-box,border-box] font-mono text-fg placeholder:text-fg-subtle outline-none focus:border-border-strong focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-(--cue-focus) disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger";
113
+ declare const controlSurface = "w-full rounded-control border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-sunken),var(--cue-sunken)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border)),var(--cue-paint-stroke-to,var(--cue-border)))] bg-origin-border [background-clip:padding-box,border-box] shadow-[shadow:0_calc(2px*var(--cue-paint-shadow-scale))_calc(4px*var(--cue-paint-shadow-scale))_var(--cue-paint-rest-shade,transparent)] font-[family-name:var(--cue-style-input-face,var(--cue-font-mono))] font-[number:var(--cue-style-body-weight,inherit)] text-fg placeholder:text-fg-subtle outline-none focus:border-[color:var(--cue-style-focus-edge,var(--cue-border-strong))] 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-[var(--cue-style-field-focus-offset,-1px)] disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger";
94
114
  /**
95
115
  * The full recessed-control recipe, one variant per rung of the control ladder.
96
116
  *
@@ -120,7 +140,7 @@ declare const controlClasses: string;
120
140
  * inherits the font size from the wrapper so the two never disagree about which
121
141
  * density rung they are on.
122
142
  */
123
- declare const bareControlClasses = "min-w-0 flex-1 border-0 bg-transparent p-0 font-mono text-[length:inherit] text-fg placeholder:text-fg-subtle outline-none disabled:opacity-40";
143
+ declare const bareControlClasses = "min-w-0 flex-1 border-0 bg-transparent p-0 font-[family-name:var(--cue-style-input-face,var(--cue-font-mono))] font-[number:var(--cue-style-body-weight,inherit)] text-[length:inherit] text-fg placeholder:text-fg-subtle outline-none disabled:opacity-40";
124
144
  /**
125
145
  * Focus feedback for a wrapper that owns the rim on behalf of an inner control.
126
146
  *
@@ -152,6 +172,6 @@ declare const bareControlClasses = "min-w-0 flex-1 border-0 bg-transparent p-0 f
152
172
  * UI's `Field` stamps it and where the group already takes
153
173
  * `data-[invalid]:border-danger` from {@link controlVariants}.
154
174
  */
155
- declare const controlGroupFocusClasses = "focus-within:border-border-strong has-focus-visible:outline-2 has-focus-visible:outline-solid has-focus-visible:-outline-offset-1 has-focus-visible:outline-(--cue-focus) data-[invalid]:has-focus-visible:outline-danger";
175
+ declare const controlGroupFocusClasses = "focus-within:border-border-strong has-focus-visible:outline-solid has-focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] has-focus-visible:outline-(--cue-focus) has-focus-visible:outline-offset-[var(--cue-style-field-focus-offset,-1px)] data-[invalid]:has-focus-visible:outline-danger";
156
176
  //#endregion
157
177
  export { ControlVariantProps, type FormControlSize, bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants };
@@ -1,5 +1,10 @@
1
+ import { REST_SHADE_CLASS } from "../system/_paint-rest-shade.js";
1
2
  import { cva } from "../lib/cva.js";
3
+ import { FOCUS_RING_FIELD, FOCUS_RING_GROUP_FIELD } from "../system/_focus-ring-field.js";
4
+ import { CONTROL_STEP_SIZE_BODY, CONTROL_STEP_SIZE_SM } from "../system/_style-control-step.js";
2
5
  import { STROKE_SUNKEN } from "../system/_paint-stroke-sunken.js";
6
+ import { BODY_WEIGHT } from "../system/_style-body-weight.js";
7
+ import { INPUT_FACE } from "../system/_style-input-face.js";
3
8
  //#region src/forms/_chassis.ts
4
9
  /**
5
10
  * Everything the recessed control chassis paints except the box itself.
@@ -83,14 +88,34 @@ import { STROKE_SUNKEN } from "../system/_paint-stroke-sunken.js";
83
88
  *
84
89
  * The compound modifier outranks the plain one on specificity — an attribute
85
90
  * selector and a pseudo-class against one pseudo-class — so its position in
86
- * Tailwind's utility order cannot decide it. `focus-visible:outline-solid` and
87
- * `focus-visible:outline-2` still supply the style and the width in both cases,
88
- * which is why only the colour is restated.
91
+ * Tailwind's utility order cannot decide it. {@link FOCUS_RING_FIELD} still
92
+ * supplies the style and the width in both cases, which is why only the
93
+ * colour is restated.
89
94
  *
90
95
  * `focus-visible:outline-solid` re-declares the outline style the sibling
91
96
  * `outline-none` switched off — see the note on `buttonChassis`.
97
+ *
98
+ * The width is {@link FOCUS_RING_FIELD}'s, read from `--cue-style-focus-width`
99
+ * (`_focus-ring.ts` says why every ring in this system shares one module); the
100
+ * border it is pulled back over reads `--cue-style-focus-edge` for the same
101
+ * reason a Look needs to move it — tender's dark band and kiln both do.
102
+ *
103
+ * The face (mono, unless a style set names another — `INPUT_FACE` says why) is
104
+ * what a person's typing renders in, at the body weight (`BODY_WEIGHT`:
105
+ * inherited, as it was before the name existed, unless a style set names one);
106
+ * a call site that deliberately keeps a typed value in mono regardless of the
107
+ * set (a hex colour code, a DMX value) restates `font-mono` on top, as
108
+ * `color-picker.tsx`'s hex field does.
109
+ *
110
+ * **The resting shade** ({@link REST_SHADE_CLASS}, spec §3.10) is the one
111
+ * shadow this recipe draws: the stroke paints a border and a ground and no
112
+ * shadow, so the shade is added as a utility of its own rather than composed
113
+ * into a list. It paints nothing until a pack tints `paint-rest-shade` —
114
+ * measured in `tests/browser/paint-elevation-noop.spec.ts` — and a caller's
115
+ * own `shadow-` utility replaces it through `twMerge`, as it would have
116
+ * replaced nothing before.
92
117
  */
93
- const controlSurface = `w-full rounded-(--radius-control) ${STROKE_SUNKEN} font-mono text-fg placeholder:text-fg-subtle outline-none focus:border-border-strong focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-(--cue-focus) disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger`;
118
+ const controlSurface = `w-full rounded-control ${STROKE_SUNKEN} ${REST_SHADE_CLASS} ${INPUT_FACE} ${BODY_WEIGHT} text-fg placeholder:text-fg-subtle outline-none focus:border-[color:var(--cue-style-focus-edge,var(--cue-border-strong))] ${FOCUS_RING_FIELD} disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger`;
94
119
  /**
95
120
  * The full recessed-control recipe, one variant per rung of the control ladder.
96
121
  *
@@ -103,9 +128,9 @@ const controlSurface = `w-full rounded-(--radius-control) ${STROKE_SUNKEN} font-
103
128
  */
104
129
  const controlVariants = cva(controlSurface, {
105
130
  variants: { size: {
106
- sm: "h-control-sm px-(--cue-space-3) text-(length:--cue-text-label)",
131
+ sm: `h-control-sm px-(--cue-space-3) ${CONTROL_STEP_SIZE_SM}`,
107
132
  md: "h-control-md px-(--cue-space-4) text-(length:--cue-text-ui)",
108
- lg: "h-control-lg px-(--cue-space-5) text-(length:--cue-text-body)"
133
+ lg: `h-control-lg px-(--cue-space-5) ${CONTROL_STEP_SIZE_BODY}`
109
134
  } },
110
135
  defaultVariants: { size: "md" }
111
136
  });
@@ -123,7 +148,7 @@ const controlClasses = controlVariants();
123
148
  * inherits the font size from the wrapper so the two never disagree about which
124
149
  * density rung they are on.
125
150
  */
126
- const bareControlClasses = "min-w-0 flex-1 border-0 bg-transparent p-0 font-mono text-[length:inherit] text-fg placeholder:text-fg-subtle outline-none disabled:opacity-40";
151
+ const bareControlClasses = `min-w-0 flex-1 border-0 bg-transparent p-0 ${INPUT_FACE} ${BODY_WEIGHT} text-[length:inherit] text-fg placeholder:text-fg-subtle outline-none disabled:opacity-40`;
127
152
  /**
128
153
  * Focus feedback for a wrapper that owns the rim on behalf of an inner control.
129
154
  *
@@ -155,6 +180,6 @@ const bareControlClasses = "min-w-0 flex-1 border-0 bg-transparent p-0 font-mono
155
180
  * UI's `Field` stamps it and where the group already takes
156
181
  * `data-[invalid]:border-danger` from {@link controlVariants}.
157
182
  */
158
- const controlGroupFocusClasses = "focus-within:border-border-strong has-focus-visible:outline-2 has-focus-visible:outline-solid has-focus-visible:-outline-offset-1 has-focus-visible:outline-(--cue-focus) data-[invalid]:has-focus-visible:outline-danger";
183
+ const controlGroupFocusClasses = `focus-within:border-border-strong ${FOCUS_RING_GROUP_FIELD} data-[invalid]:has-focus-visible:outline-danger`;
159
184
  //#endregion
160
185
  export { bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants };
@@ -1,4 +1,7 @@
1
+ import { FOCUS_RING } from "../system/_focus-ring.js";
2
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
1
3
  import { overlayPopupTransitionClasses, overlayPositionerClasses, overlaySurfaceClasses } from "../overlays/_surface.js";
4
+ import { OPTION_ROW } from "../system/_style-option.js";
2
5
  //#region src/forms/_listbox.ts
3
6
  /**
4
7
  * The shared skin of every filterable list in this group — `Combobox`,
@@ -26,9 +29,9 @@ const listboxListClasses = "max-h-[min(var(--available-height),18rem)] overflow-
26
29
  * navigation and the pointer agree on which row is active, and the tint is
27
30
  * `accent-soft` rather than a solid fill (the luma defect ruling).
28
31
  */
29
- const listboxItemClasses = "flex h-control-sm cursor-default items-center gap-(--cue-space-2) px-(--cue-space-3) font-mono text-(length:--cue-text-ui) text-fg-muted outline-none select-none data-[highlighted]:bg-accent-soft data-[highlighted]:text-fg data-[selected]:text-accent data-[disabled]:pointer-events-none data-[disabled]:opacity-40";
32
+ const listboxItemClasses = `flex h-control-sm cursor-default items-center gap-(--cue-space-2) px-(--cue-space-3) ${CONTROL_FACE} text-(length:--cue-text-ui) ${OPTION_ROW} outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40`;
30
33
  /** The "nothing matched" line: same rhythm as a row, but muted and unreachable. */
31
- const listboxEmptyClasses = "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-ui) text-fg-subtle select-none";
34
+ const listboxEmptyClasses = `flex h-control-sm items-center px-(--cue-space-3) ${CONTROL_FACE} text-(length:--cue-text-ui) text-fg-subtle select-none`;
32
35
  /** The tick gutter, always reserved so labels never jog sideways. */
33
36
  const listboxIndicatorClasses = "flex size-icon-sm shrink-0 items-center justify-center";
34
37
  /**
@@ -46,10 +49,10 @@ const chipFieldClasses = "flex w-full cursor-text flex-wrap items-center gap-(--
46
49
  * user data throws away information the user typed on purpose. Same shape, same
47
50
  * palette, ordinary casing.
48
51
  */
49
- const valueChipClasses = "group/chip inline-flex h-chip max-w-full min-w-0 cursor-default items-center gap-(--cue-space-1) rounded-(--radius-control) border border-border bg-surface-2 py-0 pr-(--cue-space-1) pl-(--cue-space-2) font-mono text-(length:--cue-text-label) leading-none text-fg-muted outline-none select-none data-[highlighted]:border-accent/60 data-[highlighted]:text-fg focus-within:border-accent/60 focus-within:text-fg";
52
+ const valueChipClasses = "group/chip inline-flex h-chip max-w-full min-w-0 cursor-default items-center gap-(--cue-space-1) rounded-control border border-border bg-surface-2 py-0 pr-(--cue-space-1) pl-(--cue-space-2) font-mono text-(length:--cue-text-label) leading-none text-fg-muted outline-none select-none data-[highlighted]:border-accent/60 data-[highlighted]:text-fg focus-within:border-accent/60 focus-within:text-fg";
50
53
  /** The chip's remove affordance. */
51
- const chipRemoveClasses = "flex size-icon-sm shrink-0 cursor-pointer items-center justify-center rounded-(--radius-control) border-0 bg-transparent p-0 text-fg-subtle outline-none transition-colors hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent";
54
+ const chipRemoveClasses = `flex size-icon-sm shrink-0 cursor-pointer items-center justify-center rounded-control border-0 bg-transparent p-0 text-fg-subtle outline-none transition-colors hover:text-fg ${FOCUS_RING}`;
52
55
  /** The trailing caret / clear affordance beside a filterable input. */
53
- const listboxAdornmentClasses = "flex shrink-0 cursor-pointer items-center justify-center rounded-(--radius-control) border-0 bg-transparent p-0 text-fg-subtle outline-none transition-colors hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent";
56
+ const listboxAdornmentClasses = `flex shrink-0 cursor-pointer items-center justify-center rounded-control border-0 bg-transparent p-0 text-fg-subtle outline-none transition-colors hover:text-fg ${FOCUS_RING}`;
54
57
  //#endregion
55
58
  export { chipFieldClasses, chipRemoveClasses, listboxAdornmentClasses, listboxEmptyClasses, listboxIndicatorClasses, listboxItemClasses, listboxListClasses, listboxPopupClasses, listboxPositionerClasses, valueChipClasses };
@@ -1,5 +1,11 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
4
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
5
+ import { LABEL_INK } from "../system/_style-label-ink.js";
6
+ import { REST_SHADE_CLASS } from "../system/_paint-rest-shade.js";
7
+ import { CHECK_EDGE, CHECK_RADIUS, CHECK_SIZE_MD } from "../system/_style-check.js";
8
+ import { CONTROL_LABEL_WEIGHT } from "../system/_style-control-label.js";
3
9
  import * as React from "react";
4
10
  import { jsx, jsxs } from "react/jsx-runtime";
5
11
  import { Checkbox } from "@base-ui/react/checkbox";
@@ -53,7 +59,7 @@ const Checkbox$1 = React.forwardRef(function Checkbox$2({ className, label, size
53
59
  ref,
54
60
  "data-slot": "checkbox",
55
61
  "aria-labelledby": hasLabel ? labelId : void 0,
56
- className: cn("flex shrink-0 items-center justify-center rounded-(--radius-control) border border-border bg-sunken text-accent-fg outline-none transition-colors", size === "sm" ? "size-icon-sm" : "size-icon-md", "hover:border-border-strong", "data-[checked]:border-accent data-[checked]:bg-accent", "data-[indeterminate]:border-accent data-[indeterminate]:bg-accent", "focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent", "data-[disabled]:pointer-events-none data-[disabled]:opacity-40", "data-[invalid]:border-danger", className),
62
+ className: cn(`flex shrink-0 items-center justify-center ${CHECK_RADIUS} border ${CHECK_EDGE} bg-sunken text-accent-fg outline-none transition-colors ${REST_SHADE_CLASS}`, size === "sm" ? "size-icon-sm" : CHECK_SIZE_MD, "hover:border-border-strong", "data-[checked]:border-accent data-[checked]:bg-accent", "data-[indeterminate]:border-accent data-[indeterminate]:bg-accent", `${FOCUS_RING}`, "data-[disabled]:pointer-events-none data-[disabled]:opacity-40", "data-[invalid]:border-danger", className),
57
63
  ...elementProps,
58
64
  children: /* @__PURE__ */ jsx(Checkbox.Indicator, {
59
65
  className: "flex size-full items-center justify-center data-[unchecked]:hidden",
@@ -66,7 +72,7 @@ const Checkbox$1 = React.forwardRef(function Checkbox$2({ className, label, size
66
72
  if (!hasLabel) return box;
67
73
  return /* @__PURE__ */ jsxs("label", {
68
74
  "data-slot": "checkbox-label",
69
- className: "inline-flex cursor-pointer items-center gap-(--cue-space-3) font-mono text-(length:--cue-text-ui) text-fg-muted select-none has-[[data-disabled]]:cursor-default has-[[data-disabled]]:opacity-40",
75
+ className: cn("inline-flex cursor-pointer items-center gap-(--cue-space-3) text-(length:--cue-text-ui) select-none has-[[data-disabled]]:cursor-default has-[[data-disabled]]:opacity-40", LABEL_INK, CONTROL_LABEL_WEIGHT, CONTROL_FACE),
70
76
  children: [box, /* @__PURE__ */ jsx("span", {
71
77
  id: labelId,
72
78
  children: label
@@ -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 { Input } from "./input.js";
4
5
  import { CrossGlyph, VariableGlyph } from "./_glyphs.js";
5
6
  import { PasswordInput } from "./password-input.js";
@@ -89,7 +90,7 @@ const EnvVarInput = React.forwardRef(function EnvVarInput({ className, value: va
89
90
  ...elementProps,
90
91
  children: variable === null ? secret ? /* @__PURE__ */ jsx(PasswordInput, { ...controlProps }) : /* @__PURE__ */ jsx(Input, { ...controlProps }) : /* @__PURE__ */ jsxs("div", {
91
92
  "data-slot": "env-var-pill",
92
- className: cn("flex w-full items-center gap-(--cue-space-2) rounded-(--radius-control) border border-warn/35 bg-warn/10 font-mono text-warn", PILL_SIZES[size], disabled === true && "opacity-40"),
93
+ className: cn("flex w-full items-center gap-(--cue-space-2) rounded-control border border-warn/35 bg-warn/10 font-mono text-warn", PILL_SIZES[size], disabled === true && "opacity-40"),
93
94
  children: [
94
95
  /* @__PURE__ */ jsx(VariableGlyph, {
95
96
  "aria-hidden": "true",
@@ -105,7 +106,7 @@ const EnvVarInput = React.forwardRef(function EnvVarInput({ className, value: va
105
106
  "aria-label": clearLabel,
106
107
  disabled,
107
108
  onClick: () => commit(""),
108
- className: "ml-auto flex size-icon-md shrink-0 cursor-pointer items-center justify-center rounded-(--radius-control) border-0 bg-transparent p-0 text-warn outline-none transition-colors hover:bg-warn/20 focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent disabled:pointer-events-none",
109
+ className: `ml-auto flex size-icon-md shrink-0 cursor-pointer items-center justify-center rounded-control border-0 bg-transparent p-0 text-warn outline-none transition-colors hover:bg-warn/20 ${FOCUS_RING} disabled:pointer-events-none`,
109
110
  children: /* @__PURE__ */ jsx(CrossGlyph, { className: "size-icon-sm" })
110
111
  })
111
112
  ]
@@ -29,7 +29,8 @@ interface FieldLabelProps extends Omit<Field.Label.Props, "className"> {
29
29
  className?: string;
30
30
  }
31
31
  /**
32
- * The name of a field: mono, uppercase, tracked out, one rung below body text.
32
+ * The name of a field: mono, uppercase, tracked out, one rung below body
33
+ * text — by default, the style set's choice inside one.
33
34
  *
34
35
  * Renders a real `<label>` wired to the field's control, so clicking it focuses
35
36
  * (or toggles) that control.