@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
@@ -18,12 +18,64 @@
18
18
  * @example
19
19
  * <Popover.Popup className={cn(overlaySurfaceClasses, className)} />
20
20
  */
21
- declare const overlaySurfaceClasses = "rounded-(--radius-overlay) border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-2),var(--cue-surface-2)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border-overlay)),var(--cue-paint-stroke-to,var(--cue-border-overlay)))] bg-origin-border [background-clip:padding-box,border-box] shadow-[0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-shade-hairline,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(6px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-near,transparent),0_calc(8px*var(--cue-paint-shadow-scale))_calc(24px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-far,rgba(0,0,0,0.4)),inset_0_1px_0_0_var(--cue-paint-sheen-ink,transparent)]";
21
+ declare const overlaySurfaceClasses = "rounded-overlay border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-style-overlay-ground,var(--cue-surface-2)),var(--cue-style-overlay-ground,var(--cue-surface-2))),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-overlay-from,var(--cue-border-overlay)),var(--cue-paint-stroke-overlay-to,var(--cue-border-overlay)))] bg-origin-border [background-clip:padding-box,border-box] shadow-[0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-shade-hairline,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(6px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-near,transparent),0_calc(8px*var(--cue-paint-shadow-scale))_calc(24px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-far,rgba(0,0,0,0.4)),inset_0_1px_0_0_var(--cue-paint-sheen-ink,transparent)]";
22
22
  /**
23
23
  * The full-viewport dim behind a modal surface. `--cue-scrim` is theme-owned —
24
24
  * dusk and hivehub tune their own — so the value is never hard-coded here.
25
+ *
26
+ * **The scrim's own filter (spec §3.10, P0.6) lives on a `::before`
27
+ * pseudo-element, never on `backdrop-filter` of the scrim itself.** Every
28
+ * element here is public through `backdropClassName` (dialog, sheet, drawer,
29
+ * alert-dialog and command-palette all feed it into
30
+ * `cn(scrimClasses, backdropClassName)`), which exists precisely so a consumer
31
+ * can put their own `backdrop-blur-*` on this element — so the scrim's own
32
+ * `backdrop-filter` is a slot this recipe must never write to at all, not a
33
+ * slot to compose into.
34
+ *
35
+ * **Why not fill one of Tailwind's own composition slots instead (the
36
+ * `_paint-glass.ts` technique).** Measured, and it does not survive
37
+ * `paint-scrim-filter: none`, which is every shipped pack's value but
38
+ * glaze's (`blur(8px)`, the Porcelain Look's dialog backdrop).
39
+ * Tailwind's composed `backdrop-filter: var(--tw-backdrop-blur,)
40
+ * var(--tw-backdrop-brightness,) … var(--tw-backdrop-grayscale,) …` accepts
41
+ * only `<filter-function>`s in that list; `none` is not one, so a slot filled
42
+ * with the literal text `none` sitting beside a consumer's `blur(8px)` is an
43
+ * **invalid** `backdrop-filter` value as a whole — not "no extra blur" but a
44
+ * parse failure that drops the entire declaration, computing `none` even for
45
+ * the consumer's own choice. `_paint-glass.ts` never meets this: its slot's
46
+ * default is a real filter function (`blur(8px)`), never the keyword `none`.
47
+ *
48
+ * **The pseudo-element has no such slot to collide over.** Its own
49
+ * `backdrop-filter: var(--cue-paint-scrim-filter, none)` is the only
50
+ * declaration for that property on that box, so `none` is simply valid and
51
+ * inert there, exactly as intended, whatever the scrim element's own
52
+ * `backdrop-filter` (via `backdropClassName`) computes. `content-['']` gives
53
+ * it a box; `absolute inset-0` sizes it to the scrim, whose own `fixed`
54
+ * positioning is a containing block for it; `pointer-events-none` keeps it out
55
+ * of the scrim's own click handling. The pseudo paints after the scrim's own
56
+ * `bg-(--cue-scrim)`, so a real filter blurs that tint together with the page
57
+ * — a flat tint, so the blur of it is the same tint.
58
+ *
59
+ * **The scrim never fades by its own opacity, because that would isolate the
60
+ * pseudo's backdrop.** An ancestor with opacity under 1 is a backdrop root: a
61
+ * descendant's `backdrop-filter` sees only what is painted inside it. When the
62
+ * scrim faded in by `opacity`, glaze's blur on the pseudo therefore had
63
+ * nothing to blur for the whole fade — the page stayed sharp while it dimmed,
64
+ * snapped to 8px the frame opacity reached 1, and lost the blur on the first
65
+ * frame of the exit (measured in Chromium; `paint-noop.spec.ts`'s P43 case
66
+ * reads the pixels halfway through). So the scrim holds opacity 1 and fades
67
+ * its parts: its background from `transparent`, the pseudo by its *own*
68
+ * opacity (an element's own opacity does not isolate its own backdrop), and
69
+ * its own `backdrop-filter` from `none` — the last only so a consumer's
70
+ * `backdrop-blur-*`, which faded with the scrim's opacity before, still fades
71
+ * rather than snapping in. That one is written for the starting and ending
72
+ * frames alone, where a whole-property `none` outranks the consumer's
73
+ * composed declaration without entering it; at rest the property is theirs.
74
+ * The pseudo's `transition` and timing are its own classes: Tailwind
75
+ * registers `--tw-duration` and `--tw-ease` with `inherits: false`, so the
76
+ * scrim's `duration-150 ease-out` never reach it.
25
77
  */
26
- declare const scrimClasses = "fixed inset-0 z-50 bg-(--cue-scrim) transition-opacity duration-150 ease-out motion-reduce:transition-none data-[starting-style]:opacity-0 data-[ending-style]:opacity-0";
78
+ declare const scrimClasses = "fixed inset-0 z-50 bg-(--cue-scrim) before:absolute before:inset-0 before:content-[''] before:pointer-events-none before:[backdrop-filter:var(--cue-paint-scrim-filter,none)] transition-[background-color,backdrop-filter] duration-150 ease-out before:transition-opacity before:duration-150 before:ease-out motion-reduce:transition-none motion-reduce:before:transition-none data-[starting-style]:bg-transparent data-[ending-style]:bg-transparent data-[starting-style]:[backdrop-filter:none] data-[ending-style]:[backdrop-filter:none] data-[starting-style]:before:opacity-0 data-[ending-style]:before:opacity-0";
27
79
  /**
28
80
  * What a Base UI `Positioner` needs and nothing more: it is a layout box, not a
29
81
  * painted one. The stacking context lives here so the popup itself can stay
@@ -44,22 +96,30 @@ declare const overlayPopupTransitionClasses = "origin-(--transform-origin) trans
44
96
  * transition property list to name both.
45
97
  */
46
98
  declare const overlayModalTransitionClasses = "transition-[opacity,scale] duration-150 ease-out motion-reduce:transition-none data-[starting-style]:scale-[0.98] data-[starting-style]:opacity-0 data-[ending-style]:scale-[0.98] data-[ending-style]:opacity-0";
47
- /** Body copy inside an overlay: mono, one rung under the panel's own text. */
48
- declare const overlayTextClasses = "font-mono text-(length:--cue-text-ui) text-fg";
49
- /** The heading line of a dialog, an alert dialog or a popover. */
50
- declare const overlayTitleClasses = "font-mono text-(length:--cue-text-emphasis) font-medium text-fg";
51
- /** The supporting line under an overlay title. */
52
- declare const overlayDescriptionClasses = "font-mono text-(length:--cue-text-ui) leading-(--cue-leading-ui) text-fg-muted";
99
+ /**
100
+ * Body copy inside an overlay: the body voice (mono unless a style set names
101
+ * another face — `_style-body.ts`), one rung under the panel's own text.
102
+ */
103
+ declare const overlayTextClasses = "font-[family-name:var(--cue-style-body-face,var(--cue-font-mono))] font-[number:var(--cue-style-body-weight,inherit)] text-(length:--cue-text-ui) text-fg";
104
+ /**
105
+ * The heading line of a dialog, an alert dialog or a popover: the title voice's
106
+ * face, weight and ink at the overlay title's own size (`_style-overlay-title.ts`).
107
+ */
108
+ declare const overlayTitleClasses = "font-[family-name:var(--cue-style-title-face,var(--cue-font-mono))] text-[length:var(--cue-style-overlay-title-size,var(--cue-text-emphasis))] leading-[var(--cue-style-overlay-title-leading,inherit)] font-[number:var(--cue-style-title-weight,500)] [font-variation-settings:var(--cue-style-display-variation,normal)] text-[color:var(--cue-style-heading-ink,var(--cue-fg))]";
109
+ /** The supporting line under an overlay title, in the body voice. */
110
+ declare const overlayDescriptionClasses = "font-[family-name:var(--cue-style-body-face,var(--cue-font-mono))] font-[number:var(--cue-style-body-weight,inherit)] text-[length:var(--cue-style-body-size,var(--cue-text-ui))] leading-[var(--cue-style-body-leading,var(--cue-leading-ui))] text-fg-muted";
53
111
  /** The action strip at the foot of a modal surface. */
54
112
  declare const overlayFooterClasses = "flex items-center justify-end gap-(--cue-space-3) pt-(--cue-space-2)";
55
113
  /**
56
114
  * One row of a menu: the short rung of the density control ladder, highlighted
57
115
  * with `accent-soft` rather than a solid fill (the luma defect ruling — a solid
58
- * accent bar on a hovered row is too loud at console density).
116
+ * accent bar on a hovered row is too loud at console density). The row's ink
117
+ * and the highlight are the style set's, with those as their defaults
118
+ * (`_style-menu.ts`).
59
119
  */
60
- declare const menuItemClasses = "flex h-control-sm cursor-default items-center gap-(--cue-space-2) rounded-(--radius-control) 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-[disabled]:pointer-events-none data-[disabled]:opacity-40";
61
- /** The uppercase mono caption over a group of menu rows. */
62
- declare const menuLabelClasses = "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase select-none";
120
+ declare const menuItemClasses = "flex h-control-sm cursor-default items-center gap-(--cue-space-2) rounded-[var(--cue-style-menu-item-radius,calc(var(--cue-radius-control)*var(--cue-radius-scale)))] px-(--cue-space-3) font-[family-name:var(--cue-style-control-face,var(--cue-font-mono))] text-(length:--cue-text-ui) text-[color:var(--cue-style-quiet-ink,var(--cue-fg-muted))] data-[highlighted]:bg-[color:var(--cue-style-menu-highlight,var(--cue-accent-soft))] outline-none select-none data-[highlighted]:text-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-40";
121
+ /** The uppercase mono caption over a group of menu rows — by default. */
122
+ declare const menuLabelClasses = "flex h-control-sm items-center px-(--cue-space-3) font-[family-name:var(--cue-style-label-face,var(--cue-font-mono))] text-[length:var(--cue-style-label-size,var(--cue-text-label))] tracking-[var(--cue-style-label-tracking,var(--cue-tracking-caps))] text-[color:var(--cue-style-label-ink,var(--cue-fg-subtle))] font-[number:var(--cue-style-label-weight,inherit)] [text-transform:var(--cue-style-label-case,uppercase)] select-none";
63
123
  /** The hairline between menu groups. */
64
124
  declare const menuSeparatorClasses = "my-(--cue-space-1) h-px bg-border";
65
125
  /** Padding of a menu popup — a single space unit so rows reach the rim. */
@@ -1,5 +1,17 @@
1
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
2
+ import { LABEL_INK_SUBTLE } from "../system/_style-label-ink.js";
3
+ import { LABEL_FACE } from "../system/_style-label-face.js";
4
+ import { LABEL_WEIGHT } from "../system/_style-label-weight.js";
5
+ import { LABEL_CASE } from "../system/_style-label-case.js";
6
+ import { LABEL_TRACKING } from "../system/_style-label-tracking.js";
1
7
  import { ELEVATION_2 } from "../system/_paint-elevation.js";
8
+ import { LABEL_SIZE } from "../system/_style-label-size.js";
2
9
  import { STROKE_SURFACE_2 } from "../system/_paint-stroke-surface-2.js";
10
+ import { BODY_VOICE } from "../system/_style-body.js";
11
+ import { MENU_ITEM_INK, MENU_ITEM_RADIUS } from "../system/_style-menu.js";
12
+ import { OVERLAY_TITLE_VOICE } from "../system/_style-overlay-title.js";
13
+ import { BODY_LEADING } from "../system/_style-body-leading.js";
14
+ import { BODY_SIZE } from "../system/_style-body-size.js";
3
15
  //#region src/overlays/_surface.ts
4
16
  /**
5
17
  * The conventions every floating surface in this system shares.
@@ -20,12 +32,64 @@ import { STROKE_SURFACE_2 } from "../system/_paint-stroke-surface-2.js";
20
32
  * @example
21
33
  * <Popover.Popup className={cn(overlaySurfaceClasses, className)} />
22
34
  */
23
- const overlaySurfaceClasses = `rounded-(--radius-overlay) ${STROKE_SURFACE_2} ${ELEVATION_2}`;
35
+ const overlaySurfaceClasses = `rounded-overlay ${STROKE_SURFACE_2} ${ELEVATION_2}`;
24
36
  /**
25
37
  * The full-viewport dim behind a modal surface. `--cue-scrim` is theme-owned —
26
38
  * dusk and hivehub tune their own — so the value is never hard-coded here.
39
+ *
40
+ * **The scrim's own filter (spec §3.10, P0.6) lives on a `::before`
41
+ * pseudo-element, never on `backdrop-filter` of the scrim itself.** Every
42
+ * element here is public through `backdropClassName` (dialog, sheet, drawer,
43
+ * alert-dialog and command-palette all feed it into
44
+ * `cn(scrimClasses, backdropClassName)`), which exists precisely so a consumer
45
+ * can put their own `backdrop-blur-*` on this element — so the scrim's own
46
+ * `backdrop-filter` is a slot this recipe must never write to at all, not a
47
+ * slot to compose into.
48
+ *
49
+ * **Why not fill one of Tailwind's own composition slots instead (the
50
+ * `_paint-glass.ts` technique).** Measured, and it does not survive
51
+ * `paint-scrim-filter: none`, which is every shipped pack's value but
52
+ * glaze's (`blur(8px)`, the Porcelain Look's dialog backdrop).
53
+ * Tailwind's composed `backdrop-filter: var(--tw-backdrop-blur,)
54
+ * var(--tw-backdrop-brightness,) … var(--tw-backdrop-grayscale,) …` accepts
55
+ * only `<filter-function>`s in that list; `none` is not one, so a slot filled
56
+ * with the literal text `none` sitting beside a consumer's `blur(8px)` is an
57
+ * **invalid** `backdrop-filter` value as a whole — not "no extra blur" but a
58
+ * parse failure that drops the entire declaration, computing `none` even for
59
+ * the consumer's own choice. `_paint-glass.ts` never meets this: its slot's
60
+ * default is a real filter function (`blur(8px)`), never the keyword `none`.
61
+ *
62
+ * **The pseudo-element has no such slot to collide over.** Its own
63
+ * `backdrop-filter: var(--cue-paint-scrim-filter, none)` is the only
64
+ * declaration for that property on that box, so `none` is simply valid and
65
+ * inert there, exactly as intended, whatever the scrim element's own
66
+ * `backdrop-filter` (via `backdropClassName`) computes. `content-['']` gives
67
+ * it a box; `absolute inset-0` sizes it to the scrim, whose own `fixed`
68
+ * positioning is a containing block for it; `pointer-events-none` keeps it out
69
+ * of the scrim's own click handling. The pseudo paints after the scrim's own
70
+ * `bg-(--cue-scrim)`, so a real filter blurs that tint together with the page
71
+ * — a flat tint, so the blur of it is the same tint.
72
+ *
73
+ * **The scrim never fades by its own opacity, because that would isolate the
74
+ * pseudo's backdrop.** An ancestor with opacity under 1 is a backdrop root: a
75
+ * descendant's `backdrop-filter` sees only what is painted inside it. When the
76
+ * scrim faded in by `opacity`, glaze's blur on the pseudo therefore had
77
+ * nothing to blur for the whole fade — the page stayed sharp while it dimmed,
78
+ * snapped to 8px the frame opacity reached 1, and lost the blur on the first
79
+ * frame of the exit (measured in Chromium; `paint-noop.spec.ts`'s P43 case
80
+ * reads the pixels halfway through). So the scrim holds opacity 1 and fades
81
+ * its parts: its background from `transparent`, the pseudo by its *own*
82
+ * opacity (an element's own opacity does not isolate its own backdrop), and
83
+ * its own `backdrop-filter` from `none` — the last only so a consumer's
84
+ * `backdrop-blur-*`, which faded with the scrim's opacity before, still fades
85
+ * rather than snapping in. That one is written for the starting and ending
86
+ * frames alone, where a whole-property `none` outranks the consumer's
87
+ * composed declaration without entering it; at rest the property is theirs.
88
+ * The pseudo's `transition` and timing are its own classes: Tailwind
89
+ * registers `--tw-duration` and `--tw-ease` with `inherits: false`, so the
90
+ * scrim's `duration-150 ease-out` never reach it.
27
91
  */
28
- const scrimClasses = "fixed inset-0 z-50 bg-(--cue-scrim) transition-opacity duration-150 ease-out motion-reduce:transition-none data-[starting-style]:opacity-0 data-[ending-style]:opacity-0";
92
+ const scrimClasses = "fixed inset-0 z-50 bg-(--cue-scrim) before:absolute before:inset-0 before:content-[''] before:pointer-events-none before:[backdrop-filter:var(--cue-paint-scrim-filter,none)] transition-[background-color,backdrop-filter] duration-150 ease-out before:transition-opacity before:duration-150 before:ease-out motion-reduce:transition-none motion-reduce:before:transition-none data-[starting-style]:bg-transparent data-[ending-style]:bg-transparent data-[starting-style]:[backdrop-filter:none] data-[ending-style]:[backdrop-filter:none] data-[starting-style]:before:opacity-0 data-[ending-style]:before:opacity-0";
29
93
  /**
30
94
  * What a Base UI `Positioner` needs and nothing more: it is a layout box, not a
31
95
  * painted one. The stacking context lives here so the popup itself can stay
@@ -46,22 +110,30 @@ const overlayPopupTransitionClasses = "origin-(--transform-origin) transition-[o
46
110
  * transition property list to name both.
47
111
  */
48
112
  const overlayModalTransitionClasses = "transition-[opacity,scale] duration-150 ease-out motion-reduce:transition-none data-[starting-style]:scale-[0.98] data-[starting-style]:opacity-0 data-[ending-style]:scale-[0.98] data-[ending-style]:opacity-0";
49
- /** Body copy inside an overlay: mono, one rung under the panel's own text. */
50
- const overlayTextClasses = "font-mono text-(length:--cue-text-ui) text-fg";
51
- /** The heading line of a dialog, an alert dialog or a popover. */
52
- const overlayTitleClasses = "font-mono text-(length:--cue-text-emphasis) font-medium text-fg";
53
- /** The supporting line under an overlay title. */
54
- const overlayDescriptionClasses = "font-mono text-(length:--cue-text-ui) leading-(--cue-leading-ui) text-fg-muted";
113
+ /**
114
+ * Body copy inside an overlay: the body voice (mono unless a style set names
115
+ * another face — `_style-body.ts`), one rung under the panel's own text.
116
+ */
117
+ const overlayTextClasses = `${BODY_VOICE} text-(length:--cue-text-ui) text-fg`;
118
+ /**
119
+ * The heading line of a dialog, an alert dialog or a popover: the title voice's
120
+ * face, weight and ink at the overlay title's own size (`_style-overlay-title.ts`).
121
+ */
122
+ const overlayTitleClasses = OVERLAY_TITLE_VOICE;
123
+ /** The supporting line under an overlay title, in the body voice. */
124
+ const overlayDescriptionClasses = `${BODY_VOICE} ${BODY_SIZE} ${BODY_LEADING} text-fg-muted`;
55
125
  /** The action strip at the foot of a modal surface. */
56
126
  const overlayFooterClasses = "flex items-center justify-end gap-(--cue-space-3) pt-(--cue-space-2)";
57
127
  /**
58
128
  * One row of a menu: the short rung of the density control ladder, highlighted
59
129
  * with `accent-soft` rather than a solid fill (the luma defect ruling — a solid
60
- * accent bar on a hovered row is too loud at console density).
130
+ * accent bar on a hovered row is too loud at console density). The row's ink
131
+ * and the highlight are the style set's, with those as their defaults
132
+ * (`_style-menu.ts`).
61
133
  */
62
- const menuItemClasses = "flex h-control-sm cursor-default items-center gap-(--cue-space-2) rounded-(--radius-control) 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-[disabled]:pointer-events-none data-[disabled]:opacity-40";
63
- /** The uppercase mono caption over a group of menu rows. */
64
- const menuLabelClasses = "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase select-none";
134
+ const menuItemClasses = `flex h-control-sm cursor-default items-center gap-(--cue-space-2) ${MENU_ITEM_RADIUS} px-(--cue-space-3) ${CONTROL_FACE} text-(length:--cue-text-ui) ${MENU_ITEM_INK} outline-none select-none data-[highlighted]:text-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-40`;
135
+ /** The uppercase mono caption over a group of menu rows — by default. */
136
+ const menuLabelClasses = `flex h-control-sm items-center px-(--cue-space-3) ${LABEL_FACE} ${LABEL_SIZE} ${LABEL_TRACKING} ${LABEL_INK_SUBTLE} ${LABEL_WEIGHT} ${LABEL_CASE} select-none`;
65
137
  /** The hairline between menu groups. */
66
138
  const menuSeparatorClasses = "my-(--cue-space-1) h-px bg-border";
67
139
  /** Padding of a menu popup — a single space unit so rows reach the rim. */
@@ -1,5 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
4
+ import { LABEL_FACE } from "../system/_style-label-face.js";
5
+ import { LABEL_CASE } from "../system/_style-label-case.js";
6
+ import { LABEL_TRACKING } from "../system/_style-label-tracking.js";
3
7
  import { SearchGlyph } from "./_glyphs.js";
4
8
  import { useCuePortalProps } from "../system/portal.js";
5
9
  import { overlayModalTransitionClasses, overlaySurfaceClasses, scrimClasses } from "./_surface.js";
@@ -48,7 +52,7 @@ function groupCommands(items) {
48
52
  return groups;
49
53
  }
50
54
  /** The row: same rhythm as a menu row, with a reserved gutter for the icon. */
51
- const commandItemClasses = "flex h-control-md cursor-default items-center gap-(--cue-space-3) rounded-(--radius-control) 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-[disabled]:pointer-events-none data-[disabled]:opacity-40";
55
+ const commandItemClasses = `flex h-control-md cursor-default items-center gap-(--cue-space-3) rounded-control px-(--cue-space-3) ${CONTROL_FACE} text-(length:--cue-text-ui) text-fg-muted outline-none select-none data-[highlighted]:bg-accent-soft data-[highlighted]:text-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-40`;
52
56
  /**
53
57
  * The ⌘K surface: type a few letters, run a command.
54
58
  *
@@ -140,12 +144,12 @@ function CommandPalette({ items, onSelect, open: openProp, defaultOpen = false,
140
144
  "aria-label": label,
141
145
  placeholder,
142
146
  "data-slot": "command-palette-input",
143
- className: "h-full w-full min-w-0 border-0 bg-transparent p-0 font-mono text-(length:--cue-text-body) text-fg outline-none placeholder:text-fg-subtle"
147
+ className: cn("h-full w-full min-w-0 border-0 bg-transparent p-0 text-(length:--cue-text-body) text-fg outline-none placeholder:text-fg-subtle", CONTROL_FACE)
144
148
  })]
145
149
  }),
146
150
  /* @__PURE__ */ jsx(Combobox.Empty, {
147
151
  "data-slot": "command-palette-empty",
148
- className: "flex h-control-lg items-center px-(--cue-space-4) font-mono text-(length:--cue-text-ui) text-fg-subtle select-none",
152
+ className: cn("flex h-control-lg items-center px-(--cue-space-4) text-(length:--cue-text-ui) text-fg-subtle select-none", CONTROL_FACE),
149
153
  children: emptyMessage
150
154
  }),
151
155
  /* @__PURE__ */ jsx(Combobox.List, {
@@ -155,7 +159,7 @@ function CommandPalette({ items, onSelect, open: openProp, defaultOpen = false,
155
159
  items: group.items,
156
160
  className: "block",
157
161
  children: [group.value === "" ? null : /* @__PURE__ */ jsx(Combobox.GroupLabel, {
158
- className: "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) text-fg-subtle uppercase select-none",
162
+ className: cn("flex h-control-sm items-center px-(--cue-space-3) text-(length:--cue-text-micro) text-fg-subtle select-none", LABEL_FACE, LABEL_TRACKING, LABEL_CASE),
159
163
  children: group.value
160
164
  }), /* @__PURE__ */ jsx(Combobox.Collection, { children: (item) => /* @__PURE__ */ jsxs(Combobox.Item, {
161
165
  value: item,
@@ -182,7 +186,7 @@ function CommandPalette({ items, onSelect, open: openProp, defaultOpen = false,
182
186
  ]
183
187
  }), footer === null ? null : /* @__PURE__ */ jsx("div", {
184
188
  "data-slot": "command-palette-footer",
185
- className: "flex shrink-0 items-center gap-(--cue-space-4) border-t border-border bg-surface-1 px-(--cue-space-4) py-(--cue-space-2) font-mono text-(length:--cue-text-micro) text-fg-subtle select-none",
189
+ className: cn("flex shrink-0 items-center gap-(--cue-space-4) border-t border-border bg-surface-1 px-(--cue-space-4) py-(--cue-space-2) text-(length:--cue-text-micro) text-fg-subtle select-none", CONTROL_FACE),
186
190
  children: footer
187
191
  })]
188
192
  })]
@@ -8,6 +8,11 @@ import { Dialog } from "@base-ui/react/dialog";
8
8
  * Centring is `top/left 50%` plus a translate rather than a flex-centred
9
9
  * wrapper: the popup owns its own position, so nothing else has to cover the
10
10
  * viewport and steal pointer events from the scrim.
11
+ *
12
+ * Its corner is `DIALOG_RADIUS`, the style set's `--cue-style-dialog-radius`
13
+ * over the overlay rung, spent after `overlaySurfaceClasses` so the popup's
14
+ * own `cn` drops the shared `rounded-overlay`: only the dialog reads the name,
15
+ * and every other overlay keeps the rung.
11
16
  */
12
17
  declare const dialogPopupVariants: (props?: ({
13
18
  width?: "sm" | "md" | "lg" | null | undefined;
@@ -15,8 +15,13 @@ import { Dialog } from "@base-ui/react/dialog";
15
15
  * Centring is `top/left 50%` plus a translate rather than a flex-centred
16
16
  * wrapper: the popup owns its own position, so nothing else has to cover the
17
17
  * viewport and steal pointer events from the scrim.
18
+ *
19
+ * Its corner is `DIALOG_RADIUS`, the style set's `--cue-style-dialog-radius`
20
+ * over the overlay rung, spent after `overlaySurfaceClasses` so the popup's
21
+ * own `cn` drops the shared `rounded-overlay`: only the dialog reads the name,
22
+ * and every other overlay keeps the rung.
18
23
  */
19
- const dialogPopupVariants = cva(`${overlaySurfaceClasses} ${overlayModalTransitionClasses} fixed top-1/2 left-1/2 z-50 flex max-h-[85vh] w-[calc(100vw-2rem)] -translate-x-1/2 -translate-y-1/2 flex-col gap-(--cue-space-4) overflow-y-auto p-(--cue-space-6) outline-none`, {
24
+ const dialogPopupVariants = cva(`${overlaySurfaceClasses} rounded-[calc(var(--cue-style-dialog-radius,var(--cue-radius-overlay))*var(--cue-radius-scale))] ${overlayModalTransitionClasses} fixed top-1/2 left-1/2 z-50 flex max-h-[85vh] w-[calc(100vw-2rem)] -translate-x-1/2 -translate-y-1/2 flex-col gap-(--cue-space-4) overflow-y-auto p-(--cue-space-6) outline-none`, {
20
25
  variants: { width: {
21
26
  sm: "max-w-[20rem]",
22
27
  md: "max-w-[28rem]",
@@ -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 { Tooltip } from "./tooltip.js";
4
5
  import "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -27,7 +28,7 @@ function InfoTip({ text, width = 224, label = "More information", side = "top",
27
28
  delay,
28
29
  "aria-label": label,
29
30
  "data-slot": "info-tip-trigger",
30
- className: cn("inline-flex size-[0.8125rem] shrink-0 cursor-help items-center justify-center rounded-full border border-border-strong bg-transparent font-mono text-(length:--cue-text-micro) leading-none font-bold text-fg-muted italic outline-none select-none hover:border-accent hover:text-accent focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent", className),
31
+ className: cn(`inline-flex size-[0.8125rem] shrink-0 cursor-help items-center justify-center rounded-full border border-border-strong bg-transparent font-mono text-(length:--cue-text-micro) leading-none font-bold text-fg-muted italic outline-none select-none hover:border-accent hover:text-accent ${FOCUS_RING}`, className),
31
32
  children: "i"
32
33
  }), /* @__PURE__ */ jsx(Tooltip.Content, {
33
34
  side,
@@ -1,5 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_INSET } from "../system/_focus-ring.js";
4
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
3
5
  import { useCuePortalProps } from "../system/portal.js";
4
6
  import { menuPopupClasses, overlayPopupTransitionClasses, overlayPositionerClasses, overlaySurfaceClasses } from "./_surface.js";
5
7
  import { DropdownMenu } from "./dropdown-menu.js";
@@ -66,7 +68,7 @@ const Menubar$1 = {
66
68
  return /* @__PURE__ */ jsx(Menu.Trigger, {
67
69
  ref,
68
70
  "data-slot": "menubar-trigger",
69
- className: cn("inline-flex h-control-sm shrink-0 cursor-default items-center rounded-(--radius-control) px-(--cue-space-3) font-mono text-(length:--cue-text-ui) whitespace-nowrap text-fg-muted transition-colors duration-150 outline-none select-none hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-accent data-[popup-open]:bg-accent-soft data-[popup-open]:text-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-40", className),
71
+ className: cn(`inline-flex h-control-sm shrink-0 cursor-default items-center rounded-control px-(--cue-space-3) text-(length:--cue-text-ui) whitespace-nowrap text-fg-muted transition-colors duration-150 outline-none select-none hover:text-fg ${FOCUS_RING_INSET} data-[popup-open]:bg-accent-soft data-[popup-open]:text-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-40`, CONTROL_FACE, className),
70
72
  ...elementProps
71
73
  });
72
74
  }),
@@ -4,6 +4,7 @@ import { useComposedRefs } from "../lib/compose.js";
4
4
  import { useCuePortalProps } from "../system/portal.js";
5
5
  import { overlayDescriptionClasses, overlayPopupTransitionClasses, overlayPositionerClasses, overlaySurfaceClasses, overlayTitleClasses } from "./_surface.js";
6
6
  import { useCloseOnWheel } from "./_wheel.js";
7
+ import { POPOVER_PAD } from "../system/_style-popover-pad.js";
7
8
  import * as React from "react";
8
9
  import { jsx } from "react/jsx-runtime";
9
10
  import { Popover } from "@base-ui/react/popover";
@@ -78,7 +79,7 @@ const Popover$1 = {
78
79
  children: /* @__PURE__ */ jsx(Popover.Popup, {
79
80
  ref: composedRef,
80
81
  "data-slot": "popover-popup",
81
- className: cn(overlaySurfaceClasses, overlayPopupTransitionClasses, "flex max-w-[calc(100vw-2rem)] flex-col gap-(--cue-space-3) p-(--cue-space-4) outline-none", className),
82
+ className: cn(overlaySurfaceClasses, overlayPopupTransitionClasses, `flex max-w-[calc(100vw-2rem)] flex-col gap-(--cue-space-3) ${POPOVER_PAD} outline-none`, className),
82
83
  ...popupProps,
83
84
  children
84
85
  })
@@ -1,5 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
4
+ import { LABEL_FACE } from "../system/_style-label-face.js";
5
+ import { LABEL_CASE } from "../system/_style-label-case.js";
6
+ import { LABEL_TRACKING_TIGHT } from "../system/_style-label-tracking.js";
3
7
  import { CrossGlyph } from "./_glyphs.js";
4
8
  import { useCuePortalProps } from "../system/portal.js";
5
9
  import { overlaySurfaceClasses } from "./_surface.js";
@@ -87,12 +91,12 @@ function ToastItem({ toast, className, closeLabel }) {
87
91
  }),
88
92
  /* @__PURE__ */ jsx(Toast.Action, {
89
93
  "data-slot": "toast-action",
90
- className: "mt-(--cue-space-1) inline-flex h-control-sm w-fit cursor-pointer items-center justify-center rounded-(--radius-control) border border-border px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps-tight) text-fg-muted uppercase transition-colors outline-none hover:border-border-strong hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
94
+ className: cn(`mt-(--cue-space-1) inline-flex h-control-sm w-fit cursor-pointer items-center justify-center rounded-control border border-border px-(--cue-space-3) text-(length:--cue-text-label) text-fg-muted transition-colors outline-none hover:border-border-strong hover:text-fg ${FOCUS_RING}`, LABEL_FACE, LABEL_TRACKING_TIGHT, LABEL_CASE)
91
95
  }),
92
96
  /* @__PURE__ */ jsx(Toast.Close, {
93
97
  "aria-label": closeLabel,
94
98
  "data-slot": "toast-close",
95
- className: "absolute top-(--cue-space-2) right-(--cue-space-2) flex size-icon-md cursor-pointer items-center justify-center rounded-(--radius-control) 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",
99
+ className: `absolute top-(--cue-space-2) right-(--cue-space-2) flex size-icon-md cursor-pointer items-center justify-center rounded-control text-fg-subtle outline-none transition-colors hover:text-fg ${FOCUS_RING}`,
96
100
  children: /* @__PURE__ */ jsx(CrossGlyph, { className: "size-icon-sm" })
97
101
  })
98
102
  ]
@@ -1,7 +1,10 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
3
4
  import { useCuePortalProps } from "../system/portal.js";
5
+ import { BODY_LEADING } from "../system/_style-body-leading.js";
4
6
  import { overlayPopupTransitionClasses, overlayPositionerClasses, overlaySurfaceClasses } from "./_surface.js";
7
+ import { TOOLTIP_PAD, TOOLTIP_SIZE } from "../system/_style-tooltip.js";
5
8
  import * as React from "react";
6
9
  import { jsx } from "react/jsx-runtime";
7
10
  import { Tooltip } from "@base-ui/react/tooltip";
@@ -83,7 +86,7 @@ const Tooltip$1 = {
83
86
  id,
84
87
  role: "tooltip",
85
88
  "data-slot": "tooltip-popup",
86
- className: cn(overlaySurfaceClasses, overlayPopupTransitionClasses, "max-w-[16rem] px-(--cue-space-3) py-(--cue-space-2) font-mono text-(length:--cue-text-label) leading-(--cue-leading-ui) text-fg", className),
89
+ className: cn(overlaySurfaceClasses, overlayPopupTransitionClasses, `max-w-[16rem] ${TOOLTIP_PAD} ${TOOLTIP_SIZE} ${BODY_LEADING} text-fg`, CONTROL_FACE, className),
87
90
  ...popupProps,
88
91
  children
89
92
  })
@@ -6,6 +6,16 @@ import { useRender } from "@base-ui/react/use-render";
6
6
  * The `Button` class recipe, exported so other surfaces (a link that must look
7
7
  * like a button, a third-party trigger) can borrow the exact same classes.
8
8
  *
9
+ * **It returns the recipe unmerged**, and its `className` option only appends.
10
+ * A class concatenated onto it — by a template string, `clsx`, or that option —
11
+ * does not replace the recipe's own; the two compete by the order Tailwind
12
+ * emits them in, which is not a contract. The inline padding in particular is
13
+ * a `px-[calc(…)]` reader of the style set's `style-control-pad`, and Tailwind
14
+ * emits it after every numeric `px-*`, so a concatenated `px-2` no longer wins
15
+ * the way it did over the `px-(--cue-space-*)` rung it replaced. To override a
16
+ * class of the recipe, pass `className` to `Button` itself, which merges, or
17
+ * merge the result with `tailwind-merge`.
18
+ *
9
19
  * @example
10
20
  * <a className={buttonVariants({ variant: "primary", size: "sm" })} href="/go">Go</a>
11
21
  */
@@ -47,6 +57,11 @@ interface ButtonProps extends React.ComponentPropsWithoutRef<"button">, VariantP
47
57
  * The focus ring is an `outline`, never a `box-shadow`, so it survives inside
48
58
  * `overflow: hidden` panels.
49
59
  *
60
+ * `className` is merged with `tailwind-merge`, so a caller's `px-2`,
61
+ * `font-semibold` or `shadow-none` replaces the class the recipe set for the
62
+ * same property. Only here: `buttonVariants()` concatenates, and says what that
63
+ * costs.
64
+ *
50
65
  * @example
51
66
  * <Button variant="primary" size="sm" icon={Play}>Run cue</Button>
52
67
  * @example
@@ -1,13 +1,21 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_PAINT } from "../system/_focus-ring.js";
4
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
5
+ import { REST_SHADE_CLASS } from "../system/_paint-rest-shade.js";
3
6
  import { cva } from "../lib/cva.js";
4
- import { GLOW_CLASSES } from "../system/_paint-glow.js";
7
+ import { CONTROL_STEP_SIZE_LG } from "../system/_style-control-step.js";
8
+ import { GLOW_CLASSES, GLOW_DANGER_CLASSES } from "../system/_paint-glow.js";
9
+ import { CONTROL_CASE, CONTROL_PAD_LG, CONTROL_PAD_MD, CONTROL_PAD_SM, CONTROL_TRACKING, CONTROL_TRIM, CONTROL_WEIGHT, GHOST_INK, OUTLINE_EDGE, OUTLINE_INK, SECONDARY_EDGE, SECONDARY_GROUND, SECONDARY_INK } from "../system/_style-control.js";
5
10
  import * as React from "react";
6
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
12
  import { useRender } from "@base-ui/react/use-render";
8
13
  //#region src/primitives/button.tsx
9
14
  /**
10
- * The chassis every control-shaped primitive shares: layout, mono type, the
15
+ * The chassis every control-shaped primitive shares: layout, the control face
16
+ * (mono, unless a style set names another — `CONTROL_FACE` says why), the
17
+ * control's weight, tracking, label trim and case (500, `normal`, `normal` and
18
+ * `none` unless a style set names others — `_style-control.ts` says why), the
11
19
  * density radius, the transition and the focus ring. Deliberately carries no
12
20
  * size and no colour so `Button` (height + horizontal padding) and `IconButton`
13
21
  * (one square token) can each add their own without fighting `tailwind-merge`.
@@ -19,9 +27,15 @@ import { useRender } from "@base-ui/react/use-render";
19
27
  * Restoring the style at ring time is what makes the focus indicator exist
20
28
  * (WCAG 2.4.7). `test/focus-ring.test.ts` guards every occurrence.
21
29
  *
30
+ * The ring's width and colour are {@link FOCUS_RING_PAINT} — `_focus-ring.ts`
31
+ * says why every site but this one reads a fixed offset from there too. This
32
+ * one reads `--cue-style-focus-offset` instead, because the offset here is a
33
+ * style-set knob (kiln pulls it to -1px) rather than one of that module's three
34
+ * fixed shapes; `1px` is the offset this chassis drew before either existed.
35
+ *
22
36
  * @internal Not part of the public API; imported by `icon-button.tsx`.
23
37
  */
24
- const buttonChassis = "inline-flex select-none items-center justify-center gap-[0.4em] whitespace-nowrap rounded-(--radius-control) font-mono font-medium transition-colors duration-150 outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent disabled:pointer-events-none disabled:opacity-40";
38
+ const buttonChassis = `inline-flex select-none items-center justify-center gap-[0.4em] whitespace-nowrap rounded-control ${CONTROL_FACE} ${CONTROL_WEIGHT} ${CONTROL_TRACKING} ${CONTROL_TRIM} ${CONTROL_CASE} transition-colors duration-150 outline-none ${FOCUS_RING_PAINT} focus-visible:outline-offset-[var(--cue-style-focus-offset,1px)] disabled:pointer-events-none disabled:opacity-40`;
25
39
  /**
26
40
  * The shared colour vocabulary. `accent` is theme-controlled, so `primary`
27
41
  * reads as white-on-black in `cue` and cyan-on-near-black in `terminal` with no
@@ -40,17 +54,27 @@ const buttonChassis = "inline-flex select-none items-center justify-center gap-[
40
54
  * @internal Not part of the public API; imported by `icon-button.tsx`.
41
55
  */
42
56
  const buttonTones = {
43
- primary: `bg-accent text-accent-fg hover:bg-accent-hover border border-transparent ${GLOW_CLASSES}`,
44
- secondary: "border border-border text-fg-muted hover:border-border-strong hover:text-fg bg-surface-2",
45
- ghost: "text-fg-muted hover:text-fg hover:bg-surface-2 border border-transparent",
46
- outline: "border border-border text-fg hover:border-accent hover:text-accent bg-transparent",
47
- danger: "bg-danger text-danger-fg hover:opacity-90 border border-transparent",
57
+ primary: `bg-accent-fill text-accent-fill-fg hover:bg-accent-fill-hover border border-transparent ${GLOW_CLASSES}`,
58
+ secondary: `border ${SECONDARY_EDGE} ${SECONDARY_INK} hover:text-[color:var(--cue-style-secondary-hover-ink,var(--cue-fg))] hover:border-[color:var(--cue-style-secondary-hover-edge,var(--cue-border-strong))] ${SECONDARY_GROUND}`,
59
+ ghost: `${GHOST_INK} hover:text-fg hover:bg-surface-2 border border-transparent`,
60
+ outline: `border ${OUTLINE_EDGE} ${OUTLINE_INK} hover:border-accent hover:text-accent bg-transparent ${REST_SHADE_CLASS}`,
61
+ danger: `bg-danger text-danger-fg hover:opacity-90 border border-transparent ${GLOW_DANGER_CLASSES}`,
48
62
  "danger-outline": "border text-danger bg-transparent hover:bg-danger/10 border-danger/40"
49
63
  };
50
64
  /**
51
65
  * The `Button` class recipe, exported so other surfaces (a link that must look
52
66
  * like a button, a third-party trigger) can borrow the exact same classes.
53
67
  *
68
+ * **It returns the recipe unmerged**, and its `className` option only appends.
69
+ * A class concatenated onto it — by a template string, `clsx`, or that option —
70
+ * does not replace the recipe's own; the two compete by the order Tailwind
71
+ * emits them in, which is not a contract. The inline padding in particular is
72
+ * a `px-[calc(…)]` reader of the style set's `style-control-pad`, and Tailwind
73
+ * emits it after every numeric `px-*`, so a concatenated `px-2` no longer wins
74
+ * the way it did over the `px-(--cue-space-*)` rung it replaced. To override a
75
+ * class of the recipe, pass `className` to `Button` itself, which merges, or
76
+ * merge the result with `tailwind-merge`.
77
+ *
54
78
  * @example
55
79
  * <a className={buttonVariants({ variant: "primary", size: "sm" })} href="/go">Go</a>
56
80
  */
@@ -58,9 +82,9 @@ const buttonVariants = cva(buttonChassis, {
58
82
  variants: {
59
83
  variant: buttonTones,
60
84
  size: {
61
- sm: "h-control-sm px-(--cue-space-4) text-(length:--cue-text-ui)",
62
- md: "h-control-md px-(--cue-space-5) text-(length:--cue-text-ui)",
63
- lg: "h-control-lg px-(--cue-space-6) text-(length:--cue-text-emphasis)"
85
+ sm: `h-control-sm ${CONTROL_PAD_SM} text-(length:--cue-text-ui)`,
86
+ md: `h-control-md ${CONTROL_PAD_MD} text-(length:--cue-text-ui)`,
87
+ lg: `h-control-lg ${CONTROL_PAD_LG} ${CONTROL_STEP_SIZE_LG}`
64
88
  }
65
89
  },
66
90
  defaultVariants: {
@@ -76,6 +100,11 @@ const buttonVariants = cva(buttonChassis, {
76
100
  * The focus ring is an `outline`, never a `box-shadow`, so it survives inside
77
101
  * `overflow: hidden` panels.
78
102
  *
103
+ * `className` is merged with `tailwind-merge`, so a caller's `px-2`,
104
+ * `font-semibold` or `shadow-none` replaces the class the recipe set for the
105
+ * same property. Only here: `buttonVariants()` concatenates, and says what that
106
+ * costs.
107
+ *
79
108
  * @example
80
109
  * <Button variant="primary" size="sm" icon={Play}>Run cue</Button>
81
110
  * @example
@@ -24,6 +24,14 @@ import * as React from "react";
24
24
  * page rather than a container. The rim is therefore a compound of tone and
25
25
  * variant, exactly as the fill is.
26
26
  *
27
+ * **The recipe reads the style set** (spec 2026-09-26-looks-fidelity §3.6,
28
+ * `system/_style-chip.ts`): the six tones' fill and rim are
29
+ * `color-mix(in oklab, var(--cue-<tone>) var(--cue-style-chip-fill, 10%), transparent)`
30
+ * and the same with `--cue-style-chip-edge` at `35%` — exactly `bg-<tone>/10`
31
+ * and `border-<tone>/35` under no set, and a set's own shares inside one. The
32
+ * case, tracking, radius, size and weight read `--cue-style-chip-case`,
33
+ * `-tracking`, `-radius`, `-size` and `--cue-style-label-weight` the same way.
34
+ *
27
35
  * @example
28
36
  * <span className={chipVariants({ tone: "danger", variant: "outline" })}>fault</span>
29
37
  * @example
@@ -46,7 +54,17 @@ interface ChipProps extends React.HTMLAttributes<HTMLElement>, VariantProps<type
46
54
  children?: React.ReactNode;
47
55
  }
48
56
  /**
49
- * A compact status/label pill: mono, uppercase, wide-tracked, one line tall.
57
+ * A compact status/label pill: mono, uppercase, wide-tracked, one line tall —
58
+ * by default, the style set's choice inside one.
59
+ *
60
+ * A chip speaks in the label voice: it reads the label face
61
+ * (`--cue-style-label-face`) and its own case (`--cue-style-chip-case`, which
62
+ * falls back to the label case), so under a sans, sentence-case Look its text
63
+ * is sans and sentence case like the captions around it. This reverses the
64
+ * earlier ruling that a tag's text is the value being shown and stays mono
65
+ * (spec 2026-09-26-looks-fidelity F-15): under a sans Look a mono uppercase
66
+ * chip was the most visible console voice left on the page. A consumer that
67
+ * wants a chip mono under every set passes `className="font-mono uppercase"`.
50
68
  *
51
69
  * `tone` uses the shared status vocabulary (`ok | busy | warn | danger | info`)
52
70
  * plus `neutral` and `accent`, so a chip, a `StatusDot` and a `Meter` always