@cueplusplus/ui 0.16.0 → 0.18.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 (548) hide show
  1. package/CHANGELOG.md +901 -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/empty-state.js +8 -4
  22. package/dist/chrome/eyebrow.d.ts +13 -5
  23. package/dist/chrome/eyebrow.js +18 -7
  24. package/dist/chrome/footer.d.ts +5 -0
  25. package/dist/chrome/footer.js +14 -3
  26. package/dist/chrome/navigation-menu.js +6 -3
  27. package/dist/chrome/page-shell.js +8 -5
  28. package/dist/chrome/panel.d.ts +5 -2
  29. package/dist/chrome/panel.js +10 -5
  30. package/dist/chrome/row.js +9 -5
  31. package/dist/chrome/scroll-area.js +6 -4
  32. package/dist/chrome/section-header.js +13 -4
  33. package/dist/chrome/segmented-control.js +14 -4
  34. package/dist/chrome/status-bar.js +2 -1
  35. package/dist/chrome/tabs.js +14 -3
  36. package/dist/chrome/toolbar.js +6 -3
  37. package/dist/chrome/tree.js +3 -2
  38. package/dist/color/_thumb.js +9 -3
  39. package/dist/color/color-area.js +1 -1
  40. package/dist/color/color-swatch.js +1 -1
  41. package/dist/configurator/_overrides.js +13 -4
  42. package/dist/configurator/configurator.js +4 -1
  43. package/dist/configurator/export-dialog.js +5 -2
  44. package/dist/configurator/panel-sections.js +6 -2
  45. package/dist/configurator/token-editor.js +4 -1
  46. package/dist/date/_trigger.js +4 -1
  47. package/dist/date/calendar.js +22 -12
  48. package/dist/dmx/channel-matrix.js +3 -2
  49. package/dist/dmx/dmx-bar.js +1 -1
  50. package/dist/dmx/dmx-strip.js +1 -1
  51. package/dist/dmx/universe-grid.js +3 -2
  52. package/dist/elements/activity-graph.js +3 -3
  53. package/dist/elements/agent-card.js +3 -3
  54. package/dist/elements/approval-card.js +3 -3
  55. package/dist/elements/artifact-card.js +2 -2
  56. package/dist/elements/background-inbox.js +2 -2
  57. package/dist/elements/canvas-split.js +2 -2
  58. package/dist/elements/chart.js +1 -1
  59. package/dist/elements/chat-panel.js +2 -2
  60. package/dist/elements/checkpoint-history.js +2 -2
  61. package/dist/elements/clamp.js +2 -1
  62. package/dist/elements/code-diff.js +1 -1
  63. package/dist/elements/code-runner.js +1 -1
  64. package/dist/elements/command-palette.js +6 -5
  65. package/dist/elements/comparison-card.js +2 -2
  66. package/dist/elements/composer.js +9 -8
  67. package/dist/elements/computer-use.js +1 -1
  68. package/dist/elements/confidence-marker.js +2 -1
  69. package/dist/elements/connection-state.js +1 -1
  70. package/dist/elements/context-breakdown.js +1 -1
  71. package/dist/elements/context-usage.js +1 -1
  72. package/dist/elements/conversation-search.js +4 -3
  73. package/dist/elements/cost-meter.js +1 -1
  74. package/dist/elements/data-table.js +2 -2
  75. package/dist/elements/day-separator.js +1 -1
  76. package/dist/elements/diagram.js +1 -1
  77. package/dist/elements/document-reference.js +3 -3
  78. package/dist/elements/draft-restore.js +1 -1
  79. package/dist/elements/edit-message.js +4 -3
  80. package/dist/elements/elements.css +26 -5
  81. package/dist/elements/elicitation-form.js +3 -3
  82. package/dist/elements/empty-state.js +2 -1
  83. package/dist/elements/error-state.js +1 -1
  84. package/dist/elements/feedback-dialog.js +4 -3
  85. package/dist/elements/file-tree.js +2 -2
  86. package/dist/elements/flow-graph.js +2 -2
  87. package/dist/elements/guardrail-notice.js +3 -3
  88. package/dist/elements/image-generation.js +1 -1
  89. package/dist/elements/inline-citation.js +3 -3
  90. package/dist/elements/job-progress.js +3 -3
  91. package/dist/elements/launcher-bubble.js +2 -2
  92. package/dist/elements/loading-state.js +1 -1
  93. package/dist/elements/map-answer.js +3 -2
  94. package/dist/elements/markdown.js +5 -4
  95. package/dist/elements/math-block.js +1 -1
  96. package/dist/elements/mcp-server-panel.js +3 -3
  97. package/dist/elements/message-attachment.js +4 -4
  98. package/dist/elements/message-pair.js +1 -1
  99. package/dist/elements/message-queue.js +2 -2
  100. package/dist/elements/mobile-composer.js +4 -3
  101. package/dist/elements/model-picker.js +3 -3
  102. package/dist/elements/onboarding.js +2 -2
  103. package/dist/elements/permission-grant.js +2 -2
  104. package/dist/elements/permission-scopes.js +5 -4
  105. package/dist/elements/prompt-library.js +7 -6
  106. package/dist/elements/queue-dock.js +4 -3
  107. package/dist/elements/quota-banner.js +1 -1
  108. package/dist/elements/quote-reply.js +1 -1
  109. package/dist/elements/read-aloud.js +2 -2
  110. package/dist/elements/reasoning-panel.js +2 -1
  111. package/dist/elements/recommendation-card.d.ts +1 -1
  112. package/dist/elements/recommendation-card.js +2 -2
  113. package/dist/elements/regenerate-menu.js +2 -2
  114. package/dist/elements/research-report.js +1 -1
  115. package/dist/elements/retrieval-chunks.js +1 -1
  116. package/dist/elements/revert-dock.js +5 -4
  117. package/dist/elements/reviewable-diff.js +1 -1
  118. package/dist/elements/schedule-card.js +3 -3
  119. package/dist/elements/score-breakdown.js +1 -1
  120. package/dist/elements/scroll-anchor.js +2 -2
  121. package/dist/elements/settings-panel.js +3 -2
  122. package/dist/elements/shared-conversation.js +2 -2
  123. package/dist/elements/sources.js +4 -3
  124. package/dist/elements/speaker-identity.js +1 -1
  125. package/dist/elements/spec-sheet.js +1 -1
  126. package/dist/elements/streaming-text.js +1 -1
  127. package/dist/elements/subagent-list.js +2 -2
  128. package/dist/elements/suggestions.js +1 -1
  129. package/dist/elements/surfaces.d.ts +1 -1
  130. package/dist/elements/surfaces.js +2 -1
  131. package/dist/elements/tail-status.js +1 -1
  132. package/dist/elements/terminal-block.js +1 -1
  133. package/dist/elements/thread-list.js +1 -1
  134. package/dist/elements/thread-search.js +5 -4
  135. package/dist/elements/timeline.js +1 -1
  136. package/dist/elements/todo-list.js +2 -2
  137. package/dist/elements/tool-call.js +4 -3
  138. package/dist/elements/tool-error.js +2 -2
  139. package/dist/elements/tool-group.js +1 -1
  140. package/dist/elements/tool-timeline.js +4 -3
  141. package/dist/elements/trace-waterfall.js +1 -1
  142. package/dist/elements/verdict-row.js +2 -2
  143. package/dist/elements/voice-conversation.js +3 -2
  144. package/dist/elements/web-preview.js +1 -1
  145. package/dist/elements/web-search.js +2 -2
  146. package/dist/elements/work-collapse.js +2 -1
  147. package/dist/flow/node-card.js +3 -2
  148. package/dist/flow/use-flow-theme.js +2 -1
  149. package/dist/forms/_chassis.d.ts +34 -6
  150. package/dist/forms/_chassis.js +44 -9
  151. package/dist/forms/_listbox.js +22 -14
  152. package/dist/forms/checkbox.js +13 -4
  153. package/dist/forms/env-var-input.js +3 -2
  154. package/dist/forms/field.d.ts +2 -1
  155. package/dist/forms/field.js +16 -5
  156. package/dist/forms/file-upload.js +3 -2
  157. package/dist/forms/input-group.js +11 -2
  158. package/dist/forms/multi-select.js +4 -3
  159. package/dist/forms/number-field.js +7 -3
  160. package/dist/forms/otp-field.js +15 -6
  161. package/dist/forms/password-input.js +4 -2
  162. package/dist/forms/radio-group.js +10 -4
  163. package/dist/forms/rating.js +2 -1
  164. package/dist/forms/scrub-input.js +2 -1
  165. package/dist/forms/search-input.js +2 -1
  166. package/dist/forms/select.js +10 -4
  167. package/dist/forms/slider.js +9 -3
  168. package/dist/forms/switch.js +9 -3
  169. package/dist/forms/tags-input.js +4 -3
  170. package/dist/forms/textarea.js +3 -1
  171. package/dist/forms/toggle-group.js +2 -1
  172. package/dist/forms/toggle.js +5 -1
  173. package/dist/index.d.ts +2 -2
  174. package/dist/index.js +2 -2
  175. package/dist/instruments/_data-row.js +2 -1
  176. package/dist/instruments/app-window-frame.js +1 -1
  177. package/dist/instruments/code-block.js +8 -2
  178. package/dist/instruments/group-bar.js +1 -1
  179. package/dist/instruments/ledger.js +6 -2
  180. package/dist/instruments/log-viewer.js +4 -3
  181. package/dist/instruments/meter.js +2 -1
  182. package/dist/instruments/progress.js +9 -3
  183. package/dist/instruments/seam-grid.js +5 -3
  184. package/dist/instruments/stat.js +13 -4
  185. package/dist/instruments/table.js +29 -10
  186. package/dist/instruments/terminal-frame.js +4 -2
  187. package/dist/instruments/usage-chart.js +1 -1
  188. package/dist/layout/_collapse.js +26 -5
  189. package/dist/layout/accordion.js +2 -1
  190. package/dist/layout/bento.js +7 -4
  191. package/dist/layout/breadcrumb.js +10 -5
  192. package/dist/layout/card.js +14 -7
  193. package/dist/layout/carousel.js +3 -2
  194. package/dist/layout/collapsible.js +6 -1
  195. package/dist/layout/container.js +2 -1
  196. package/dist/layout/description-list.js +4 -1
  197. package/dist/layout/frames.js +11 -5
  198. package/dist/layout/item.js +3 -2
  199. package/dist/layout/link.d.ts +30 -0
  200. package/dist/layout/link.js +22 -3
  201. package/dist/layout/pagination.js +8 -8
  202. package/dist/layout/preview.d.ts +32 -12
  203. package/dist/layout/preview.js +149 -40
  204. package/dist/layout/resizable.js +2 -1
  205. package/dist/layout/sidebar.js +11 -3
  206. package/dist/layout/stepper.js +6 -2
  207. package/dist/lib/cn.js +29 -2
  208. package/dist/midi/piano-keyboard.js +3 -2
  209. package/dist/midi/spectrum-visualizer.js +1 -1
  210. package/dist/midi/threshold-rail.js +2 -1
  211. package/dist/midi/timeline-ruler.js +1 -1
  212. package/dist/overlays/_surface.d.ts +74 -14
  213. package/dist/overlays/_surface.js +87 -14
  214. package/dist/overlays/alert-dialog.js +1 -1
  215. package/dist/overlays/command-palette.js +28 -9
  216. package/dist/overlays/dialog.d.ts +5 -0
  217. package/dist/overlays/dialog.js +6 -1
  218. package/dist/overlays/drawer.js +8 -1
  219. package/dist/overlays/hover-card.js +3 -1
  220. package/dist/overlays/info-tip.js +2 -1
  221. package/dist/overlays/menubar.js +3 -1
  222. package/dist/overlays/popover.js +3 -1
  223. package/dist/overlays/toast.js +14 -6
  224. package/dist/overlays/tooltip.js +3 -1
  225. package/dist/primitives/avatar.js +6 -2
  226. package/dist/primitives/button.d.ts +16 -1
  227. package/dist/primitives/button.js +44 -12
  228. package/dist/primitives/chip.d.ts +11 -29
  229. package/dist/primitives/chip.js +40 -50
  230. package/dist/primitives/icon-button.d.ts +1 -1
  231. package/dist/primitives/kbd.d.ts +6 -0
  232. package/dist/primitives/kbd.js +10 -1
  233. package/dist/primitives/skeleton.js +2 -1
  234. package/dist/system/_focus-ring-field.js +29 -0
  235. package/dist/system/_focus-ring.js +125 -0
  236. package/dist/system/_paint-glow.js +22 -3
  237. package/dist/system/_paint-rest-shade.js +32 -0
  238. package/dist/system/_paint-rim.js +22 -4
  239. package/dist/system/_paint-stroke-surface-1.js +1 -1
  240. package/dist/system/_paint-stroke-surface-2.js +14 -1
  241. package/dist/system/_paint-texture.js +5 -2
  242. package/dist/system/_style-accordion-rule.js +32 -0
  243. package/dist/system/_style-app-bar.js +65 -0
  244. package/dist/system/_style-avatar.js +20 -0
  245. package/dist/system/_style-band.js +57 -0
  246. package/dist/system/_style-body-leading.js +19 -0
  247. package/dist/system/_style-body-size.js +30 -0
  248. package/dist/system/_style-body-weight.js +24 -0
  249. package/dist/system/_style-body.js +32 -0
  250. package/dist/system/_style-caption-ink.js +17 -0
  251. package/dist/system/_style-caption-size.js +19 -0
  252. package/dist/system/_style-caption-weight.js +18 -0
  253. package/dist/system/_style-caption.js +19 -0
  254. package/dist/system/_style-card-gap.js +14 -0
  255. package/dist/system/_style-card-pad.js +43 -0
  256. package/dist/system/_style-cell.js +18 -0
  257. package/dist/system/_style-check-glyph.js +14 -0
  258. package/dist/system/_style-check.js +40 -0
  259. package/dist/system/_style-chip.js +143 -0
  260. package/dist/system/_style-choice-gap.js +15 -0
  261. package/dist/system/_style-code.js +13 -0
  262. package/dist/system/_style-collapse.js +94 -0
  263. package/dist/system/_style-control-face.js +29 -0
  264. package/dist/system/_style-control-gap.js +14 -0
  265. package/dist/system/_style-control-label.js +29 -0
  266. package/dist/system/_style-control-step.js +22 -0
  267. package/dist/system/_style-control.js +76 -0
  268. package/dist/system/_style-crumb.js +44 -0
  269. package/dist/system/_style-data-face.js +28 -0
  270. package/dist/system/_style-day.js +25 -0
  271. package/dist/system/_style-description.js +23 -0
  272. package/dist/system/_style-disabled.js +70 -0
  273. package/dist/system/_style-disclosure.js +21 -0
  274. package/dist/system/_style-empty-state.js +42 -0
  275. package/dist/system/_style-eyebrow.js +43 -0
  276. package/dist/system/_style-field-chassis.js +38 -0
  277. package/dist/system/_style-field-gap.js +12 -0
  278. package/dist/system/_style-footer-rule.js +47 -0
  279. package/dist/system/_style-glyph-ink.js +20 -0
  280. package/dist/system/_style-glyph-opacity.js +20 -0
  281. package/dist/system/_style-glyph-size.js +21 -0
  282. package/dist/system/_style-group-gap.js +15 -0
  283. package/dist/system/_style-group-label-pad.js +14 -0
  284. package/dist/system/_style-group-label.js +24 -0
  285. package/dist/system/_style-gutter.js +17 -0
  286. package/dist/system/_style-help-ink.js +14 -0
  287. package/dist/system/_style-help.js +38 -0
  288. package/dist/system/_style-hover-card-width.js +15 -0
  289. package/dist/system/_style-input-face.js +34 -0
  290. package/dist/system/_style-kbd.js +58 -0
  291. package/dist/system/_style-label-case.js +36 -0
  292. package/dist/system/_style-label-face.js +32 -0
  293. package/dist/system/_style-label-ink.js +29 -0
  294. package/dist/system/_style-label-leading.js +14 -0
  295. package/dist/system/_style-label-size.js +36 -0
  296. package/dist/system/_style-label-tracking.js +45 -0
  297. package/dist/system/_style-label-weight.js +40 -0
  298. package/dist/system/_style-lede.js +49 -0
  299. package/dist/system/_style-link.js +58 -0
  300. package/dist/system/_style-menu.js +43 -0
  301. package/dist/system/_style-meter.js +15 -0
  302. package/dist/system/_style-nav-item.js +41 -0
  303. package/dist/system/_style-nav-menu.js +48 -0
  304. package/dist/system/_style-nav-voice.js +43 -0
  305. package/dist/system/_style-option.js +99 -0
  306. package/dist/system/_style-otp.js +15 -0
  307. package/dist/system/_style-outline-hover.js +18 -0
  308. package/dist/system/_style-overlay-title.js +35 -0
  309. package/dist/system/_style-page-title.js +48 -0
  310. package/dist/system/_style-page.js +17 -0
  311. package/dist/system/_style-palette.js +18 -0
  312. package/dist/system/_style-panel.js +21 -0
  313. package/dist/system/_style-popover-pad.js +13 -0
  314. package/dist/system/_style-popover-width.js +15 -0
  315. package/dist/system/_style-quiet-ink.js +13 -0
  316. package/dist/system/_style-radio.js +19 -0
  317. package/dist/system/_style-row-disabled.js +17 -0
  318. package/dist/system/_style-row-pad.js +13 -0
  319. package/dist/system/_style-row.js +30 -0
  320. package/dist/system/_style-scrollbar.js +19 -0
  321. package/dist/system/_style-seam.js +43 -0
  322. package/dist/system/_style-section-rule.js +26 -0
  323. package/dist/system/_style-segment-pad.js +15 -0
  324. package/dist/system/_style-segment.js +30 -0
  325. package/dist/system/_style-segmented-control.js +86 -0
  326. package/dist/system/_style-selected.js +36 -0
  327. package/dist/system/_style-skeleton.js +15 -0
  328. package/dist/system/_style-slider.js +26 -0
  329. package/dist/system/_style-stage-marks.js +26 -0
  330. package/dist/system/_style-stat.js +31 -0
  331. package/dist/system/_style-stepper.js +16 -0
  332. package/dist/system/_style-switch.js +26 -0
  333. package/dist/system/_style-tab-hover.js +15 -0
  334. package/dist/system/_style-tab.js +71 -0
  335. package/dist/system/_style-text-focus.js +26 -0
  336. package/dist/system/_style-textarea.js +21 -0
  337. package/dist/system/_style-title.js +37 -0
  338. package/dist/system/_style-toast.js +22 -0
  339. package/dist/system/_style-toggle.js +50 -0
  340. package/dist/system/_style-toolbar.js +23 -0
  341. package/dist/system/_style-tooltip.js +46 -0
  342. package/dist/system/density.d.ts +15 -5
  343. package/dist/system/density.js +188 -25
  344. package/dist/system/index.d.ts +2 -2
  345. package/dist/system/index.js +2 -2
  346. package/dist/system/overrides.d.ts +1 -0
  347. package/dist/system/overrides.js +151 -3
  348. package/dist/system/portal.d.ts +3 -2
  349. package/dist/system/portal.js +22 -10
  350. package/dist/system/prepaint.d.ts +21 -5
  351. package/dist/system/prepaint.js +3 -1
  352. package/dist/system/published.d.ts +1 -0
  353. package/dist/system/published.js +131 -0
  354. package/dist/system/theme-provider.d.ts +118 -21
  355. package/dist/system/theme-provider.js +362 -73
  356. package/dist/system/theme-registry.d.ts +2 -1
  357. package/dist/system/theme-registry.js +27 -10
  358. package/dist/system/use-density.js +4 -3
  359. package/dist/system/use-theme.d.ts +5 -2
  360. package/dist/system/use-theme.js +7 -4
  361. package/dist/system/vocabulary.js +2 -2
  362. package/dist/theming/create-theme.js +12 -6
  363. package/dist/theming/serialize.d.ts +34 -2
  364. package/dist/theming/serialize.js +86 -4
  365. package/manifest/components/accordion.json +29 -2
  366. package/manifest/components/agent-pile.json +3 -0
  367. package/manifest/components/alert-dialog.json +36 -3
  368. package/manifest/components/app-bar.json +61 -2
  369. package/manifest/components/app-shell.json +5 -0
  370. package/manifest/components/ask-box.json +3 -1
  371. package/manifest/components/autocomplete.json +85 -1
  372. package/manifest/components/avatar-group.json +7 -0
  373. package/manifest/components/avatar.json +7 -0
  374. package/manifest/components/band.json +7 -3
  375. package/manifest/components/bento.json +12 -1
  376. package/manifest/components/breadcrumb.json +12 -0
  377. package/manifest/components/button.json +43 -4
  378. package/manifest/components/calendar.json +13 -0
  379. package/manifest/components/card.json +23 -1
  380. package/manifest/components/carousel.json +4 -1
  381. package/manifest/components/channel-matrix.json +37 -3
  382. package/manifest/components/chart-tooltip-content.json +35 -3
  383. package/manifest/components/chat-empty-state.json +3 -1
  384. package/manifest/components/checkbox-group.json +36 -1
  385. package/manifest/components/checkbox.json +36 -1
  386. package/manifest/components/chip.json +22 -1
  387. package/manifest/components/clamp.json +3 -1
  388. package/manifest/components/code-block.json +10 -1
  389. package/manifest/components/collapsible.json +35 -2
  390. package/manifest/components/color-area.json +4 -2
  391. package/manifest/components/color-field.json +29 -0
  392. package/manifest/components/color-picker.json +29 -0
  393. package/manifest/components/color-slider.json +3 -1
  394. package/manifest/components/colors-section.json +9 -1
  395. package/manifest/components/combobox.json +85 -1
  396. package/manifest/components/command-palette.json +39 -3
  397. package/manifest/components/composer-actions.json +3 -0
  398. package/manifest/components/composer-attach-button.json +3 -0
  399. package/manifest/components/composer-attachment-chip.json +3 -0
  400. package/manifest/components/composer-attachments.json +3 -0
  401. package/manifest/components/composer-bar.json +3 -0
  402. package/manifest/components/composer-command-item.json +3 -0
  403. package/manifest/components/composer-context.json +3 -0
  404. package/manifest/components/composer-input.json +3 -0
  405. package/manifest/components/composer-menu-item.json +3 -0
  406. package/manifest/components/composer-menu.json +3 -0
  407. package/manifest/components/composer-model-item.json +3 -0
  408. package/manifest/components/composer-model-trigger.json +3 -0
  409. package/manifest/components/composer-person-item.json +3 -0
  410. package/manifest/components/composer-send.json +3 -0
  411. package/manifest/components/composer-toolbar.json +3 -0
  412. package/manifest/components/composer-voice-button.json +3 -0
  413. package/manifest/components/composer-voice.json +3 -0
  414. package/manifest/components/composer.json +29 -0
  415. package/manifest/components/confidence-marker.json +3 -1
  416. package/manifest/components/container.json +2 -1
  417. package/manifest/components/context-menu.json +35 -3
  418. package/manifest/components/conversation-search.json +3 -1
  419. package/manifest/components/cue-mark.json +2 -2
  420. package/manifest/components/cue-portal-frame.json +1 -1
  421. package/manifest/components/data-row.json +3 -1
  422. package/manifest/components/data-tree.json +3 -1
  423. package/manifest/components/date-field.json +28 -0
  424. package/manifest/components/date-picker.json +32 -0
  425. package/manifest/components/date-range-picker.json +32 -0
  426. package/manifest/components/delegation-card.json +3 -1
  427. package/manifest/components/density.json +15 -7
  428. package/manifest/components/description-list.json +6 -1
  429. package/manifest/components/dialog.json +37 -3
  430. package/manifest/components/disclosure.json +35 -2
  431. package/manifest/components/dmx-bar.json +34 -3
  432. package/manifest/components/dmx-strip.json +34 -3
  433. package/manifest/components/drawer.json +36 -3
  434. package/manifest/components/dropdown-menu.json +35 -3
  435. package/manifest/components/edit-message.json +3 -1
  436. package/manifest/components/elements-command-palette.json +3 -1
  437. package/manifest/components/elements-composer.json +3 -0
  438. package/manifest/components/empty-state-composer.json +3 -1
  439. package/manifest/components/empty-state-greeting.json +3 -1
  440. package/manifest/components/empty-state-suggestion.json +3 -1
  441. package/manifest/components/empty-state-suggestions.json +3 -1
  442. package/manifest/components/empty-state.json +13 -0
  443. package/manifest/components/env-var-input.json +28 -0
  444. package/manifest/components/export-dialog.json +6 -1
  445. package/manifest/components/eyebrow.json +13 -2
  446. package/manifest/components/feedback-dialog.json +3 -0
  447. package/manifest/components/field-description.json +15 -0
  448. package/manifest/components/field-error.json +15 -0
  449. package/manifest/components/field-label.json +16 -1
  450. package/manifest/components/field.json +15 -0
  451. package/manifest/components/file-upload.json +3 -0
  452. package/manifest/components/footer.json +14 -1
  453. package/manifest/components/frames.json +14 -1
  454. package/manifest/components/hover-card.json +37 -3
  455. package/manifest/components/info-tip.json +3 -0
  456. package/manifest/components/input-group.json +31 -0
  457. package/manifest/components/input.json +29 -0
  458. package/manifest/components/item.json +3 -1
  459. package/manifest/components/kbd.json +12 -1
  460. package/manifest/components/ledger.json +9 -2
  461. package/manifest/components/link.json +33 -0
  462. package/manifest/components/log-viewer.json +3 -0
  463. package/manifest/components/map-answer.json +3 -1
  464. package/manifest/components/markdown-text.json +3 -0
  465. package/manifest/components/menubar.json +38 -4
  466. package/manifest/components/message-list.json +3 -0
  467. package/manifest/components/message.json +6 -1
  468. package/manifest/components/meter.json +1 -0
  469. package/manifest/components/mobile-composer.json +3 -1
  470. package/manifest/components/multi-select.json +86 -1
  471. package/manifest/components/musical-time-input.json +29 -0
  472. package/manifest/components/navigation-menu.json +48 -3
  473. package/manifest/components/node-card.json +3 -0
  474. package/manifest/components/number-field.json +30 -0
  475. package/manifest/components/otp-field.json +29 -0
  476. package/manifest/components/page-shell.json +14 -0
  477. package/manifest/components/pagination.json +22 -0
  478. package/manifest/components/panel-header.json +13 -0
  479. package/manifest/components/panel.json +14 -1
  480. package/manifest/components/password-input.json +28 -0
  481. package/manifest/components/permission-scopes.json +3 -1
  482. package/manifest/components/piano-keyboard.json +3 -0
  483. package/manifest/components/popover.json +37 -3
  484. package/manifest/components/preset-section.json +9 -1
  485. package/manifest/components/preview.json +24 -10
  486. package/manifest/components/progress.json +10 -1
  487. package/manifest/components/prompt-library.json +3 -1
  488. package/manifest/components/queue-dock.json +3 -1
  489. package/manifest/components/radio-group.json +14 -0
  490. package/manifest/components/radio.json +14 -0
  491. package/manifest/components/rating.json +4 -1
  492. package/manifest/components/reasoning-panel.json +3 -1
  493. package/manifest/components/recommendation-card.json +1 -1
  494. package/manifest/components/resizable.json +4 -1
  495. package/manifest/components/revert-dock.json +3 -1
  496. package/manifest/components/row.json +8 -1
  497. package/manifest/components/scroll-area.json +6 -2
  498. package/manifest/components/scrollable-tabs-list.json +21 -0
  499. package/manifest/components/scrub-input.json +28 -0
  500. package/manifest/components/seam-cell.json +1 -0
  501. package/manifest/components/seam-grid.json +1 -0
  502. package/manifest/components/seam-list.json +8 -1
  503. package/manifest/components/search-input.json +28 -0
  504. package/manifest/components/section-header.json +15 -2
  505. package/manifest/components/segmented-control.json +17 -0
  506. package/manifest/components/select.json +42 -0
  507. package/manifest/components/settings-panel.json +3 -0
  508. package/manifest/components/shape-section.json +9 -1
  509. package/manifest/components/sheet.json +35 -3
  510. package/manifest/components/shimmer-label.json +3 -0
  511. package/manifest/components/sidebar.json +19 -2
  512. package/manifest/components/skeleton.json +2 -0
  513. package/manifest/components/slider.json +16 -0
  514. package/manifest/components/sources.json +3 -1
  515. package/manifest/components/stat.json +17 -0
  516. package/manifest/components/status-bar.json +4 -0
  517. package/manifest/components/stepper.json +8 -0
  518. package/manifest/components/swap-label.json +3 -0
  519. package/manifest/components/switch.json +30 -0
  520. package/manifest/components/table-scroll-region.json +22 -2
  521. package/manifest/components/table.json +22 -2
  522. package/manifest/components/tabs.json +22 -1
  523. package/manifest/components/tags-input.json +86 -1
  524. package/manifest/components/terminal-frame.json +3 -0
  525. package/manifest/components/textarea.json +31 -0
  526. package/manifest/components/theme-configurator.json +35 -3
  527. package/manifest/components/theme-provider.json +31 -19
  528. package/manifest/components/thread-search.json +3 -1
  529. package/manifest/components/threshold-rail.json +3 -0
  530. package/manifest/components/time-field.json +28 -0
  531. package/manifest/components/toast.json +39 -2
  532. package/manifest/components/toggle-group.json +2 -1
  533. package/manifest/components/toggle.json +32 -0
  534. package/manifest/components/token-editor.json +6 -1
  535. package/manifest/components/tool-call-card.json +9 -2
  536. package/manifest/components/tool-call.json +3 -1
  537. package/manifest/components/tool-timeline.json +3 -1
  538. package/manifest/components/toolbar.json +22 -1
  539. package/manifest/components/tooltip.json +42 -3
  540. package/manifest/components/tree-visibility-toggle.json +3 -0
  541. package/manifest/components/tree.json +3 -0
  542. package/manifest/components/universe-grid.json +3 -0
  543. package/manifest/components/voice-conversation.json +3 -0
  544. package/manifest/components/work-collapse.json +3 -1
  545. package/manifest/fixtures.json +15 -0
  546. package/manifest/manifest.json +210 -190
  547. package/manifest/tokens.json +395 -4
  548. package/package.json +6 -6
package/README.md CHANGED
@@ -74,7 +74,7 @@ export function App({ children }: { children: React.ReactNode }) {
74
74
  }
75
75
  ```
76
76
 
77
- The seven packs, where each was measured from and what each refuses:
77
+ The ten packs, where each was measured from and what each refuses:
78
78
  <https://ui.cueplusplus.com/docs/paint>. Serving a nonce-based Content-Security-Policy? Read
79
79
  [§4.5 of `CONSUMING.md`](https://github.com/cueplusplus/cue-ui/blob/main/docs/CONSUMING.md#45-content-security-policy-the-nonce-prop-and-what-it-does-not-reach)
80
80
  before you ship it — `paint="grain"` alone needs `img-src data:`.
@@ -2,8 +2,12 @@
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { AGENT_ROOT_COLOR, agentColor } from "../chat/agent-color.js";
4
4
  import { CheckGlyph } from "../chat/_glyphs.js";
5
+ import { FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
6
+ import { LABEL_FACE } from "../system/_style-label-face.js";
5
7
  import { Chip } from "../primitives/chip.js";
6
8
  import { Spinner } from "../primitives/spinner.js";
9
+ import { LABEL_CASE } from "../system/_style-label-case.js";
10
+ import { LABEL_TRACKING } from "../system/_style-label-tracking.js";
7
11
  import * as React from "react";
8
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
13
  //#region src/agent-runtime/tool-call-card.tsx
@@ -23,9 +27,9 @@ const DANGER_TONES = {
23
27
  * card with nothing to disclose draws instead — the two must sit at exactly the
24
28
  * same height and ink, or a list of calls ripples as some of them gain detail.
25
29
  */
26
- const HEADER = "flex min-w-0 items-center gap-(--cue-space-2) border-0 bg-transparent p-0 text-start font-mono text-(length:--cue-text-ui) text-fg-muted outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent";
30
+ const HEADER = `flex min-w-0 items-center gap-(--cue-space-2) border-0 bg-transparent p-0 text-start font-mono text-(length:--cue-text-ui) text-fg-muted outline-none ${FOCUS_RING_OFFSET_2}`;
27
31
  /** The label over a block in the body, in the same eyebrow as a message header. */
28
- const EYEBROW = "font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) uppercase text-fg-subtle";
32
+ const EYEBROW = `${LABEL_FACE} text-(length:--cue-text-micro) ${LABEL_TRACKING} ${LABEL_CASE} text-fg-subtle`;
29
33
  /**
30
34
  * An LLM's own tool call, shown while it runs and after.
31
35
  *
@@ -96,7 +100,7 @@ const ToolCallCard = React.forwardRef(function ToolCallCard({ className, tool, a
96
100
  "data-status": status,
97
101
  "data-state": hasDetail ? open ? "open" : "closed" : void 0,
98
102
  "data-danger": danger,
99
- className: cn("flex min-w-0 flex-col gap-(--cue-space-2) rounded-(--radius-control) border border-border px-(--cue-space-3) py-(--cue-space-2)", className),
103
+ className: cn("flex min-w-0 flex-col gap-(--cue-space-2) rounded-control border border-border px-(--cue-space-3) py-(--cue-space-2)", className),
100
104
  style: {
101
105
  "--agent-color": color,
102
106
  ...style
@@ -22,7 +22,7 @@ type BrandSize = "sm" | "md" | "lg";
22
22
  *
23
23
  * Not a light/dark pair. The source artwork ships two files that hard-code
24
24
  * `white`, `black` and `#1E1E1E`; this library ships one component that reads
25
- * the token layer, so a single element is correct in all ten presets and both
25
+ * the token layer, so a single element is correct in every preset and both
26
26
  * modes without anybody choosing a file.
27
27
  */
28
28
  type BrandTone = "inherit" | "fg" | "accent";
@@ -8,7 +8,7 @@ interface CueMarkProps extends BrandAssetProps {}
8
8
  * Square at every size, drawn from the artwork's own path data, and painted
9
9
  * entirely from tokens — the disc takes the tone's ink and the two "+" glyphs
10
10
  * take the ground, which is exactly the relationship the two shipped SVGs
11
- * encode by hand. One element is therefore correct in all ten presets and
11
+ * encode by hand. One element is therefore correct in every preset and
12
12
  * both modes, and there is no light/dark variant to pick.
13
13
  *
14
14
  * The two glyphs are {@link Plussie}'s eyes; both components read one geometry
@@ -10,7 +10,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  * Square at every size, drawn from the artwork's own path data, and painted
11
11
  * entirely from tokens — the disc takes the tone's ink and the two "+" glyphs
12
12
  * take the ground, which is exactly the relationship the two shipped SVGs
13
- * encode by hand. One element is therefore correct in all ten presets and
13
+ * encode by hand. One element is therefore correct in every preset and
14
14
  * both modes, and there is no light/dark variant to pick.
15
15
  *
16
16
  * The two glyphs are {@link Plussie}'s eyes; both components read one geometry
@@ -600,7 +600,7 @@ const ChartRamp = React.forwardRef(function ChartRamp({ className, colors, label
600
600
  role: "img",
601
601
  "aria-label": label,
602
602
  "data-slot": "chart-ramp",
603
- className: cn("flex w-full overflow-hidden rounded-(--radius-control)", className),
603
+ className: cn("flex w-full overflow-hidden rounded-control", className),
604
604
  style: { height: toRem(height) },
605
605
  ...elementProps,
606
606
  children: colors.map((color, index) => /* @__PURE__ */ jsx("span", {
@@ -2,6 +2,7 @@
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { agentColor } from "./agent-color.js";
4
4
  import { CrownGlyph } from "./_glyphs.js";
5
+ import { FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
5
6
  import * as React from "react";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region src/chat/agent-pile.tsx
@@ -62,7 +63,7 @@ const AgentPile = React.forwardRef(function AgentPile({ className, agents, root,
62
63
  agent.working === true ? "working" : null,
63
64
  agent.asking === true ? "asking a question" : null
64
65
  ].filter(Boolean).join(" · ");
65
- const avatarClasses = cn("relative flex shrink-0 items-center justify-center rounded-full border border-(--agent-color) bg-surface-2 font-mono leading-none text-(--agent-color) uppercase outline-none", AVATAR_SIZES[size], selected === agent.slug ? "ring-2 ring-(--agent-color)" : null, onSelect === void 0 ? null : "cursor-pointer transition-colors hover:bg-surface-3 focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent");
66
+ const avatarClasses = cn("relative flex shrink-0 items-center justify-center rounded-full border border-(--agent-color) bg-surface-2 font-mono leading-none text-(--agent-color) uppercase outline-none", AVATAR_SIZES[size], selected === agent.slug ? "ring-2 ring-(--agent-color)" : null, onSelect === void 0 ? null : `cursor-pointer transition-colors hover:bg-surface-3 ${FOCUS_RING_OFFSET_2}`);
66
67
  const initial = name.slice(0, 1).toUpperCase();
67
68
  return /* @__PURE__ */ jsxs("span", {
68
69
  "data-slot": "agent-pile-item",
@@ -2,6 +2,7 @@
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { AGENT_ROOT_COLOR, agentColor } from "./agent-color.js";
4
4
  import { CheckGlyph } from "./_glyphs.js";
5
+ import { FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
5
6
  import { Checkbox } from "../forms/checkbox.js";
6
7
  import { Input } from "../forms/input.js";
7
8
  import { NumberField } from "../forms/number-field.js";
@@ -114,14 +115,14 @@ const AskBox = React.forwardRef(function AskBox({ className, question, kind = "t
114
115
  "data-slot": "ask-box",
115
116
  "data-answered": "true",
116
117
  "data-kind": kind,
117
- className: cn("flex min-w-0 flex-col rounded-(--radius-surface) border border-border bg-surface-1 px-(--cue-space-4) py-(--cue-space-3)", className),
118
+ className: cn("flex min-w-0 flex-col rounded-surface border border-border bg-surface-1 px-(--cue-space-4) py-(--cue-space-3)", className),
118
119
  style: boxStyle,
119
120
  ...elementProps,
120
121
  children: [/* @__PURE__ */ jsxs("button", {
121
122
  type: "button",
122
123
  "data-slot": "ask-box-summary",
123
124
  "aria-expanded": open,
124
- className: "relative flex min-w-0 cursor-pointer items-center gap-(--cue-space-2) border-0 bg-transparent p-0 text-start font-mono text-(length:--cue-text-ui) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent",
125
+ className: `relative flex min-w-0 cursor-pointer items-center gap-(--cue-space-2) border-0 bg-transparent p-0 text-start font-mono text-(length:--cue-text-ui) outline-none ${FOCUS_RING_OFFSET_2}`,
125
126
  onClick: () => setOpen((current) => !current),
126
127
  children: [
127
128
  /* @__PURE__ */ jsx("span", {
@@ -304,7 +305,7 @@ const AskBox = React.forwardRef(function AskBox({ className, question, kind = "t
304
305
  "data-slot": "ask-box",
305
306
  "data-answered": "false",
306
307
  "data-kind": kind,
307
- className: cn("flex min-w-0 flex-col gap-(--cue-space-3) rounded-(--radius-surface) border border-(--agent-color) bg-surface-1 px-(--cue-space-4) py-(--cue-space-3)", className),
308
+ className: cn("flex min-w-0 flex-col gap-(--cue-space-3) rounded-surface border border-(--agent-color) bg-surface-1 px-(--cue-space-4) py-(--cue-space-3)", className),
308
309
  style: boxStyle,
309
310
  ...elementProps,
310
311
  children: [
@@ -2,6 +2,7 @@
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { agentColor } from "./agent-color.js";
4
4
  import { CheckGlyph } from "./_glyphs.js";
5
+ import { FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
5
6
  import { Spinner } from "../primitives/spinner.js";
6
7
  import * as React from "react";
7
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -52,7 +53,7 @@ const DelegationCard = React.forwardRef(function DelegationCard({ className, age
52
53
  "data-direction": direction,
53
54
  "data-state": open ? "open" : "closed",
54
55
  "data-status": status,
55
- className: cn("flex min-w-0 flex-col gap-(--cue-space-2) rounded-(--radius-control) border border-border px-(--cue-space-3) py-(--cue-space-2)", className),
56
+ className: cn("flex min-w-0 flex-col gap-(--cue-space-2) rounded-control border border-border px-(--cue-space-3) py-(--cue-space-2)", className),
56
57
  style: {
57
58
  "--agent-color": color,
58
59
  ...style
@@ -64,7 +65,7 @@ const DelegationCard = React.forwardRef(function DelegationCard({ className, age
64
65
  "data-slot": "delegation-card-trigger",
65
66
  "aria-expanded": open,
66
67
  "aria-controls": open ? bodyId : void 0,
67
- className: "flex min-w-0 cursor-pointer items-center gap-(--cue-space-2) border-0 bg-transparent p-0 text-start font-mono text-(length:--cue-text-ui) text-fg-muted outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent",
68
+ className: `flex min-w-0 cursor-pointer items-center gap-(--cue-space-2) border-0 bg-transparent p-0 text-start font-mono text-(length:--cue-text-ui) text-fg-muted outline-none ${FOCUS_RING_OFFSET_2}`,
68
69
  onClick: toggle,
69
70
  children: [
70
71
  /* @__PURE__ */ jsx("span", {
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { ChevronDownGlyph } from "./_glyphs.js";
4
+ import { FOCUS_RING, FOCUS_RING_INSET_2 } from "../system/_focus-ring.js";
4
5
  import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
5
6
  import { ELEVATION_2 } from "../system/_paint-elevation.js";
6
7
  import * as React from "react";
@@ -117,7 +118,7 @@ const MessageList = React.forwardRef(function MessageList({ className, children,
117
118
  "aria-label": ariaLabel,
118
119
  tabIndex: 0,
119
120
  "data-slot": "message-list-scroller",
120
- className: "min-h-0 flex-1 overflow-y-auto outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent",
121
+ className: `min-h-0 flex-1 overflow-y-auto outline-none ${FOCUS_RING_INSET_2}`,
121
122
  onScroll,
122
123
  children: count === 0 ? /* @__PURE__ */ jsx("div", {
123
124
  "data-slot": "message-list-empty",
@@ -132,7 +133,7 @@ const MessageList = React.forwardRef(function MessageList({ className, children,
132
133
  }), behind ? /* @__PURE__ */ jsxs("button", {
133
134
  type: "button",
134
135
  "data-slot": "message-list-jump",
135
- className: `absolute bottom-(--cue-space-4) left-1/2 flex -translate-x-1/2 cursor-pointer items-center gap-(--cue-space-2) rounded-(--radius-control) border border-border-overlay bg-surface-2 px-(--cue-space-4) py-(--cue-space-2) font-mono text-(length:--cue-text-label) text-fg ${ELEVATION_2} outline-none hover:border-accent hover:text-accent focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent`,
136
+ className: `absolute bottom-(--cue-space-4) left-1/2 flex -translate-x-1/2 cursor-pointer items-center gap-(--cue-space-2) rounded-control border border-border-overlay bg-surface-2 px-(--cue-space-4) py-(--cue-space-2) font-mono text-(length:--cue-text-label) text-fg ${ELEVATION_2} outline-none hover:border-accent hover:text-accent ${FOCUS_RING}`,
136
137
  onClick: jumpToLatest,
137
138
  children: [/* @__PURE__ */ jsx(ChevronDownGlyph, { className: "size-icon-sm" }), jumpLabel]
138
139
  }) : null]
@@ -1,5 +1,8 @@
1
1
  import { cn } from "../lib/cn.js";
2
2
  import { AGENT_ROOT_COLOR, agentColor } from "./agent-color.js";
3
+ import { LABEL_FACE } from "../system/_style-label-face.js";
4
+ import { LABEL_CASE } from "../system/_style-label-case.js";
5
+ import { LABEL_TRACKING } from "../system/_style-label-tracking.js";
3
6
  import * as React from "react";
4
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
8
  //#region src/chat/message.tsx
@@ -9,14 +12,21 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
12
  *
10
13
  * The tight corner is the tail, and it points at whoever is speaking: bottom
11
14
  * right for the right-aligned user turn, bottom left for the agent's. Written
12
- * against the radius tokens rather than literal pixels, so the whole family
13
- * tightens with `--cue-radius-scale` at ultra-compact density instead of
14
- * staying a fixed 10px blob next to 2px controls.
15
+ * as the overlay rung with one corner overridden to the control rung, rather
16
+ * than a `[border-radius:…]` arbitrary value reading `var(--radius-*)`
17
+ * directly — a `--radius-*` reader bypasses the compiled bridge utilities
18
+ * `rounded-control`/`rounded-overlay` resolve to, so it neither shows up in
19
+ * the class-token scan that guards this bridge nor tightens with
20
+ * `--cue-radius-scale` through the same path every other radius in this
21
+ * system does. `rounded-br-control`/`rounded-bl-control` are ordinary
22
+ * per-corner bridge utilities (`packages/tokens/build.mjs`'s `SIDES` table
23
+ * covers every corner, not just the four edges), so the four-value shorthand
24
+ * upstream Tailwind has no plain form for is two ordinary utility classes.
15
25
  */
16
26
  const ROLE_RADII = {
17
- user: "[border-radius:var(--radius-overlay)_var(--radius-overlay)_var(--radius-control)_var(--radius-overlay)]",
18
- agent: "[border-radius:var(--radius-overlay)_var(--radius-overlay)_var(--radius-overlay)_var(--radius-control)]",
19
- system: "rounded-(--radius-control)"
27
+ user: "rounded-overlay rounded-br-control",
28
+ agent: "rounded-overlay rounded-bl-control",
29
+ system: "rounded-control"
20
30
  };
21
31
  /**
22
32
  * Fill per role.
@@ -72,7 +82,7 @@ const Message = React.forwardRef(function Message({ className, role = "agent", a
72
82
  children: [
73
83
  hasHeader ? /* @__PURE__ */ jsxs("div", {
74
84
  "data-slot": "message-header",
75
- className: "flex min-w-0 items-baseline justify-between gap-(--cue-space-3) font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) uppercase",
85
+ className: cn("flex min-w-0 items-baseline justify-between gap-(--cue-space-3) text-(length:--cue-text-micro)", LABEL_FACE, LABEL_TRACKING, LABEL_CASE),
76
86
  children: [name === void 0 ? null : /* @__PURE__ */ jsx("span", {
77
87
  "data-slot": "message-author",
78
88
  className: cn("min-w-0 truncate", role === "user" ? "text-accent-fg opacity-70" : "text-(--agent-color)"),
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_INSET_2 } from "../system/_focus-ring.js";
3
4
  import { computeScrollEdges, edgeFadeMask } from "./_tabs-scroll.js";
4
5
  import { useComposedRefs } from "../lib/compose.js";
5
6
  import { ChevronLeftGlyph, ChevronRightGlyph } from "./_glyphs.js";
@@ -95,7 +96,7 @@ function useEdgeScroll(enabled = true) {
95
96
  * `relative` frame.
96
97
  */
97
98
  function EdgeChevrons({ edges, onNudge, previousLabel, nextLabel, className }) {
98
- const base = "absolute inset-y-0 z-10 flex w-(--cue-space-5) cursor-pointer items-center justify-center text-fg-muted outline-none hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent";
99
+ const base = `absolute inset-y-0 z-10 flex w-(--cue-space-5) cursor-pointer items-center justify-center text-fg-muted outline-none hover:text-fg ${FOCUS_RING_INSET_2}`;
99
100
  return /* @__PURE__ */ jsxs(Fragment, { children: [edges.start ? /* @__PURE__ */ jsx("button", {
100
101
  type: "button",
101
102
  "data-slot": "edge-scroll-previous",
@@ -1,4 +1,6 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { FOCUS_RING_INSET } from "../system/_focus-ring.js";
3
+ import { LABEL_FACE } from "../system/_style-label-face.js";
2
4
  //#region src/chrome/_status-bar.ts
3
5
  /**
4
6
  * The class half of `StatusBar` (see `./status-bar.tsx`).
@@ -42,8 +44,12 @@ const ITEM_BASE = "inline-flex min-w-0 shrink-0 items-center gap-(--cue-space-2)
42
44
  *
43
45
  * The reset first: a `<button>` arrives with a border, a ground, a gutter and a
44
46
  * font of the user agent's choosing, and none of them belong in a 24px strip.
45
- * `text-(length:--cue-text-label)` and `font-mono` are re-declared rather than
46
- * inherited for the same reason — form controls do not inherit type.
47
+ * `text-(length:--cue-text-label)` and the face are re-declared rather than
48
+ * inherited for the same reason — form controls do not inherit type. The face
49
+ * is the bar's own, {@link LABEL_FACE}, and not a fixed `font-mono`: the bar
50
+ * reads `--cue-style-label-face`, and a restatement that did not read it too
51
+ * left every control mono while the readings beside it went sans under a
52
+ * sans-voiced Look (tender, kiln, porcelain) — one bar in two faces.
47
53
  *
48
54
  * `h-full` is the VS Code reading of a status item and the one that makes hover
49
55
  * legible: the fill is the height of the bar, not the height of the words, so a
@@ -58,7 +64,7 @@ const ITEM_BASE = "inline-flex min-w-0 shrink-0 items-center gap-(--cue-space-2)
58
64
  * never match `:disabled` — the pseudo-class is defined on form controls — so
59
65
  * without the data twin a disabled link would read as perfectly live.
60
66
  */
61
- const INTERACTIVE_CHASSIS = "h-full cursor-pointer border-0 bg-transparent py-0 font-mono text-(length:--cue-text-label) outline-none transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-accent disabled:pointer-events-none disabled:opacity-40 data-[disabled]:pointer-events-none data-[disabled]:opacity-40 motion-reduce:transition-none";
67
+ const INTERACTIVE_CHASSIS = `h-full cursor-pointer border-0 bg-transparent py-0 ${LABEL_FACE} text-(length:--cue-text-label) outline-none transition-colors duration-150 ${FOCUS_RING_INSET} disabled:pointer-events-none disabled:opacity-40 data-[disabled]:pointer-events-none data-[disabled]:opacity-40 motion-reduce:transition-none`;
62
68
  /**
63
69
  * A quiet control's gutter, and the negative margin that pays for it.
64
70
  *
@@ -56,7 +56,7 @@ declare function computeScrollEdges(scrollLeft: number, scrollWidth: number, cli
56
56
  * overflowing edge is often the gap between two tabs, and fading empty space is
57
57
  * invisible — hence the chevron buttons in the component.
58
58
  *
59
- * **The default reach is a custom property, not a number**, so a look pack can
59
+ * **The default reach is a custom property, not a number**, so a paint pack can
60
60
  * lengthen or shorten every edge fade in the library at once. It is written as
61
61
  * `var(--cue-paint-fade-length,24px)` with the fallback spelled out, because an
62
62
  * ink or a paint name is declared with a `:root` default here but the mask is
@@ -59,7 +59,7 @@ function computeScrollEdges(scrollLeft, scrollWidth, clientWidth) {
59
59
  * overflowing edge is often the gap between two tabs, and fading empty space is
60
60
  * invisible — hence the chevron buttons in the component.
61
61
  *
62
- * **The default reach is a custom property, not a number**, so a look pack can
62
+ * **The default reach is a custom property, not a number**, so a paint pack can
63
63
  * lengthen or shorten every edge fade in the library at once. It is written as
64
64
  * `var(--cue-paint-fade-length,24px)` with the fallback spelled out, because an
65
65
  * ink or a paint name is declared with a `:root` default here but the mask is
@@ -3,6 +3,8 @@ import { Link } from "../layout/link.js";
3
3
  import { Separator } from "../primitives/separator.js";
4
4
  import { EdgeScrollNav } from "./_edge-scroller.js";
5
5
  import { GLASS_CLASSES } from "../system/_paint-glass.js";
6
+ import { APP_BAR_CHROME, APP_BAR_LINK, APP_BAR_QUIET_INK } from "../system/_style-app-bar.js";
7
+ import { NAV_VOICE } from "../system/_style-nav-voice.js";
6
8
  import * as React from "react";
7
9
  import { jsx } from "react/jsx-runtime";
8
10
  //#region src/chrome/app-bar.tsx
@@ -12,6 +14,10 @@ import { jsx } from "react/jsx-runtime";
12
14
  * One rung of the chrome ladder tall, from `--cue-chrome-toolbar` — the same
13
15
  * token `Toolbar` and the docs site's hand-rolled header use, so a page that
14
16
  * stacks a bar on a toolbar gets two equal strips rather than two guesses.
17
+ * A style set may make it taller, lighten, drop or dash its rule and widen its
18
+ * inline inset (`style-appbar-height`, `style-chrome-rule`,
19
+ * `style-chrome-rule-style`, `style-appbar-inset`); under a set that names
20
+ * none of them it is exactly this.
15
21
  *
16
22
  * Sticky by default, and translucent because of it: a bar pinned over scrolling
17
23
  * content needs a ground, and `bg-surface-1/95` plus `backdrop-blur` says
@@ -54,7 +60,7 @@ const AppBarRoot = React.forwardRef(function AppBarRoot({ className, sticky = tr
54
60
  return /* @__PURE__ */ jsx("header", {
55
61
  ref,
56
62
  "data-slot": "app-bar",
57
- className: cn(`flex h-(--cue-chrome-toolbar) w-full shrink-0 items-center gap-(--cue-space-4) border-b border-border px-(--cue-space-5) ${GLASS_CLASSES}`, sticky ? "sticky top-0 z-40" : null, className),
63
+ className: cn(`flex w-full shrink-0 items-center gap-(--cue-space-4) border-b ${APP_BAR_CHROME} ${GLASS_CLASSES}`, sticky ? "sticky top-0 z-40" : null, className),
58
64
  ...elementProps
59
65
  });
60
66
  });
@@ -109,7 +115,7 @@ const AppBarNav = React.forwardRef(function AppBarNav({ className, frameClassNam
109
115
  });
110
116
  });
111
117
  const REGISTERS = {
112
- muted: "text-fg-muted",
118
+ muted: APP_BAR_QUIET_INK,
113
119
  strong: "text-fg"
114
120
  };
115
121
  /**
@@ -151,7 +157,7 @@ const AppBar = {
151
157
  ref,
152
158
  "data-active": active ? "" : void 0,
153
159
  "aria-current": active ? "page" : void 0,
154
- className: cn("shrink-0 font-mono text-(length:--cue-text-ui)", active ? "text-accent" : REGISTERS[register], className),
160
+ className: cn(`shrink-0 rounded-control ${NAV_VOICE} ${APP_BAR_LINK}`, active ? "text-accent" : REGISTERS[register], className),
155
161
  ...linkProps
156
162
  });
157
163
  }),
@@ -5,6 +5,7 @@ import { Sidebar } from "../layout/sidebar.js";
5
5
  import { CrossGlyph } from "../overlays/_glyphs.js";
6
6
  import { Drawer } from "../overlays/drawer.js";
7
7
  import { IconButton } from "../primitives/icon-button.js";
8
+ import { TEXTURE_CLASSES } from "../system/_paint-texture.js";
8
9
  import { DRAG_CLASSES, NO_DRAG_CLASSES } from "./_drag.js";
9
10
  import * as React from "react";
10
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -113,7 +114,7 @@ const AppShell = {
113
114
  ref,
114
115
  "data-slot": "app-shell",
115
116
  "data-rail": rail ? "" : void 0,
116
- className: cn("group/app-shell relative flex h-dvh flex-col overflow-clip bg-bg text-fg", className),
117
+ className: cn("group/app-shell relative flex h-dvh flex-col overflow-clip bg-bg text-fg", TEXTURE_CLASSES, className),
117
118
  style: {
118
119
  [NAV_WIDTH_PROPERTY]: rail ? railWidth : navWidth,
119
120
  ...style
@@ -9,7 +9,7 @@ type BandSeparation = "rule" | "ground" | "bleed" | "none";
9
9
  *
10
10
  * `"prose"` is the default and is the only one of the five that moves with
11
11
  * `[data-style]`: 68ch with no set and under `console`, 74ch under `editorial`,
12
- * 60ch under `marketing`. The four rungs are fixed aliases and a band that
12
+ * 60ch under `marketing` and `graphite`. The four rungs are fixed aliases and a band that
13
13
  * names one has opted out of the axis for its measure — which is the right
14
14
  * answer for a band holding a `Bento` or a device frame, and the wrong one for
15
15
  * a band holding a paragraph.
@@ -39,13 +39,15 @@ interface BandProps extends React.ComponentPropsWithoutRef<"section"> {
39
39
  *
40
40
  * | set | `"rule"` draws | `"ground"` paints |
41
41
  * |---|---|---|
42
- * | *(no set)* and `console` | 1px | nothing — the ground is `transparent` |
42
+ * | *(no set)*, `console`, `tender`, `zine` and `porcelain` | 1px | nothing — the ground is `transparent` |
43
43
  * | `editorial` | a 0.5px hairline, **which Chromium paints at 1px at every DPR**; only retina WebKit draws it thinner | nothing — `transparent` |
44
44
  * | `marketing` | **nothing — the rule is `0px`** | `--cue-surface-1` |
45
+ * | `kiln` | **nothing — the rule is `0px`**; `Footer` keeps its own, through `--cue-style-footer-rule` | `--cue-sunken`, the recessed ground |
46
+ * | `graphite` | 1px, in `--cue-border` | nothing — `transparent` |
45
47
  *
46
- * Read the diagonal: `"ground"` is the marketing separation and `"rule"` is
47
- * everyone else's. A band that wants to separate under *every* set separates
48
- * by rhythm, which every set has.
48
+ * Read the diagonal: `"ground"` is the marketing and kiln separation and
49
+ * `"rule"` is everyone else's. A band that wants to separate under *every* set
50
+ * separates by rhythm, which every set has.
49
51
  */
50
52
  separation?: BandSeparation;
51
53
  /** Which measure the band's centred column takes. Defaults to `"prose"`. */
@@ -67,23 +69,27 @@ interface BandProps extends React.ComponentPropsWithoutRef<"section"> {
67
69
  * Every dimension it spends belongs to the style axis, so the same markup
68
70
  * composes differently under `[data-style]` without a prop changing: the
69
71
  * vertical rhythm is `--cue-band-y` (one `--cue-space-7` with no set, doubled
70
- * under `editorial`, trebled under `marketing`), the column is
72
+ * under `editorial`, trebled under `marketing` and `graphite`), the column is
71
73
  * `--cue-measure-prose` unless `width` names a fixed rung, and the rule and the
72
74
  * ground are `--cue-band-rule` and `--cue-band-ground`. Read `separation`'s own
73
75
  * documentation before choosing one, because two of the four can come out to
74
76
  * nothing and they do not vanish symmetrically: `--cue-band-ground` is
75
- * `transparent` on `:root` and on two of the three sets, so a `"ground"` paints
76
- * nothing in three of the four states a page can be in, while `--cue-band-rule`
77
- * is `0px` under `marketing` alone. Both are deliberate and nothing warns.
77
+ * `transparent` on `:root` and on every set but `marketing` and `kiln`, so a
78
+ * `"ground"` paints nothing on most pages, while `--cue-band-rule` is `0px`
79
+ * under those two alone. Both are deliberate and nothing warns.
78
80
  *
79
81
  * **Two substitution boundaries, because `--cue-band-y` is a `calc()` resolved
80
82
  * at the element that declares it.** A `<Density>` island nested inside a
81
83
  * styled page moves every `--cue-space-*` and the band rhythm does **not**
82
84
  * follow it — the island inherits the rhythm already resolved above. Restate
83
85
  * the set on the island (`<Density density="compact" styleSet="editorial">`) to
84
- * re-resolve it against that island's rung. Likewise a nested `[data-theme]`
85
- * under a marketing band paints the **outer** theme's `--cue-surface-1` through
86
- * an already-resolved `--cue-band-ground`.
86
+ * re-resolve it against that island's rung. Likewise a hand-stamped
87
+ * `[data-theme]` element under a marketing page paints the **outer** theme's
88
+ * `--cue-surface-1` through an already-resolved `--cue-band-ground`, and its
89
+ * rule in the outer theme's border. The library's own theme islands do not: a
90
+ * nested `ThemeProvider` that names a theme or a mode, and a `Preview` stage
91
+ * with a theme, a mode or a pairing, restate the set in force beside it, so a
92
+ * band inside one paints that island's ground and rule.
87
93
  *
88
94
  * It renders a `<section>`, which is not a landmark until it has an accessible
89
95
  * name — so a band with a heading should carry `aria-labelledby` pointing at
@@ -1,36 +1,15 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { TEXTURE_CLASSES } from "../system/_paint-texture.js";
2
3
  import { Container } from "../layout/container.js";
3
4
  import { bandClasses } from "./_band.js";
4
- import { TEXTURE_CLASSES } from "../system/_paint-texture.js";
5
+ import { BAND_BROAD_WIDTH, BAND_Y_HALVES } from "../system/_style-band.js";
5
6
  import { GROUND_PATTERN_CLASSES } from "../system/_paint-ground-pattern.js";
6
7
  import * as React from "react";
7
8
  import { jsx } from "react/jsx-runtime";
8
9
  //#region src/chrome/band.tsx
9
- /**
10
- * What each separation adds to the frame `bandClasses` draws, and the two
11
- * `--cue-*` names that live in this file rather than in the chassis beside it.
12
- *
13
- * `_band.ts` holds only what `Footer` can also render — the rhythm and the
14
- * rule — because docgen's token scanner reads a chassis file whole and cannot
15
- * see that `Footer` calls `bandClasses` with the literal `"rule"`. The ground
16
- * is reachable only from `<Band separation="ground">`, so it is written here,
17
- * next to the prop whose value selects it. `_band.ts`'s own docblock carries
18
- * the argument.
19
- *
20
- * `rule`'s entry is the colour and not the width: the width is
21
- * `--cue-band-rule` and belongs to the chassis, and both elements name the ink
22
- * in their own class list rather than inheriting it from the other.
23
- *
24
- * That ink is now a token. It was the literal `border-border`, spelled here and
25
- * again in `Footer`, which meant a style set could say how THICK the line
26
- * between two bands is and had no way to say what colour it was — and every
27
- * site measured in the 2026-09-22 corpus that separates bands by a line picks
28
- * one lighter than its box edge. `--cue-band-rule-color` defaults to
29
- * `var(--cue-border)` on `:root`, which is byte-for-byte what this drew before.
30
- */
31
10
  const SEPARATION_PAINT = {
32
11
  rule: "border-(--cue-band-rule-color)",
33
- ground: `bg-(--cue-band-ground) ${GROUND_PATTERN_CLASSES} ${TEXTURE_CLASSES}`,
12
+ ground: `bg-(--cue-band-ground) ${GROUND_PATTERN_CLASSES} ${TEXTURE_CLASSES} before:[mask-image:linear-gradient(var(--cue-band-ground),var(--cue-band-ground)),var(--cue-paint-fade)] before:[-webkit-mask-image:linear-gradient(var(--cue-band-ground),var(--cue-band-ground)),var(--cue-paint-fade)]`,
34
13
  bleed: null,
35
14
  none: null
36
15
  };
@@ -46,23 +25,27 @@ const SEPARATION_PAINT = {
46
25
  * Every dimension it spends belongs to the style axis, so the same markup
47
26
  * composes differently under `[data-style]` without a prop changing: the
48
27
  * vertical rhythm is `--cue-band-y` (one `--cue-space-7` with no set, doubled
49
- * under `editorial`, trebled under `marketing`), the column is
28
+ * under `editorial`, trebled under `marketing` and `graphite`), the column is
50
29
  * `--cue-measure-prose` unless `width` names a fixed rung, and the rule and the
51
30
  * ground are `--cue-band-rule` and `--cue-band-ground`. Read `separation`'s own
52
31
  * documentation before choosing one, because two of the four can come out to
53
32
  * nothing and they do not vanish symmetrically: `--cue-band-ground` is
54
- * `transparent` on `:root` and on two of the three sets, so a `"ground"` paints
55
- * nothing in three of the four states a page can be in, while `--cue-band-rule`
56
- * is `0px` under `marketing` alone. Both are deliberate and nothing warns.
33
+ * `transparent` on `:root` and on every set but `marketing` and `kiln`, so a
34
+ * `"ground"` paints nothing on most pages, while `--cue-band-rule` is `0px`
35
+ * under those two alone. Both are deliberate and nothing warns.
57
36
  *
58
37
  * **Two substitution boundaries, because `--cue-band-y` is a `calc()` resolved
59
38
  * at the element that declares it.** A `<Density>` island nested inside a
60
39
  * styled page moves every `--cue-space-*` and the band rhythm does **not**
61
40
  * follow it — the island inherits the rhythm already resolved above. Restate
62
41
  * the set on the island (`<Density density="compact" styleSet="editorial">`) to
63
- * re-resolve it against that island's rung. Likewise a nested `[data-theme]`
64
- * under a marketing band paints the **outer** theme's `--cue-surface-1` through
65
- * an already-resolved `--cue-band-ground`.
42
+ * re-resolve it against that island's rung. Likewise a hand-stamped
43
+ * `[data-theme]` element under a marketing page paints the **outer** theme's
44
+ * `--cue-surface-1` through an already-resolved `--cue-band-ground`, and its
45
+ * rule in the outer theme's border. The library's own theme islands do not: a
46
+ * nested `ThemeProvider` that names a theme or a mode, and a `Preview` stage
47
+ * with a theme, a mode or a pairing, restate the set in force beside it, so a
48
+ * band inside one paints that island's ground and rule.
66
49
  *
67
50
  * It renders a `<section>`, which is not a landmark until it has an accessible
68
51
  * name — so a band with a heading should carry `aria-labelledby` pointing at
@@ -84,6 +67,9 @@ const Band = React.forwardRef(function Band({ className, columnClassName, separa
84
67
  const column = width === "prose" ? {
85
68
  width: "full",
86
69
  className: "max-w-(--cue-measure-prose)"
70
+ } : width === "broad" ? {
71
+ width: "full",
72
+ className: BAND_BROAD_WIDTH
87
73
  } : {
88
74
  width,
89
75
  className: null
@@ -92,7 +78,7 @@ const Band = React.forwardRef(function Band({ className, columnClassName, separa
92
78
  ref,
93
79
  "data-slot": "band",
94
80
  "data-separation": separation,
95
- className: cn(bandClasses(separation), SEPARATION_PAINT[separation], className),
81
+ className: cn(bandClasses(separation), BAND_Y_HALVES, SEPARATION_PAINT[separation], className),
96
82
  ...elementProps,
97
83
  children: separation === "bleed" ? children : /* @__PURE__ */ jsx(Container, {
98
84
  width: column.width,
@@ -1,4 +1,8 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { GLYPH_INK_SUBTLE } from "../system/_style-glyph-ink.js";
3
+ import { BODY_LEADING } from "../system/_style-body-leading.js";
4
+ import { BODY_SIZE } from "../system/_style-body-size.js";
5
+ import { EMPTY_GAP, EMPTY_HINT_VOICE, EMPTY_ICON_SIZE, EMPTY_PAD, EMPTY_TITLE_FACE, EMPTY_TITLE_LEADING, EMPTY_TITLE_SIZE, EMPTY_TITLE_WEIGHT } from "../system/_style-empty-state.js";
2
6
  import * as React from "react";
3
7
  import { jsx, jsxs } from "react/jsx-runtime";
4
8
  //#region src/chrome/empty-state.tsx
@@ -26,22 +30,22 @@ const EmptyState = React.forwardRef(function EmptyState({ className, title, hint
26
30
  return /* @__PURE__ */ jsxs("div", {
27
31
  ref,
28
32
  "data-slot": "empty-state",
29
- className: cn("flex flex-col items-center justify-center gap-(--cue-space-3) px-(--cue-space-6) py-(--cue-space-7) text-center font-mono", className),
33
+ className: cn(`flex flex-col items-center justify-center ${EMPTY_GAP} px-(--cue-space-6) ${EMPTY_PAD} text-center font-mono`, className),
30
34
  ...elementProps,
31
35
  children: [
32
36
  Icon === void 0 ? null : /* @__PURE__ */ jsx(Icon, {
33
37
  "aria-hidden": "true",
34
38
  "data-slot": "empty-state-icon",
35
- className: "size-(--cue-space-7) shrink-0 text-fg-subtle"
39
+ className: `${EMPTY_ICON_SIZE} shrink-0 ${GLYPH_INK_SUBTLE}`
36
40
  }),
37
41
  /* @__PURE__ */ jsx("span", {
38
42
  "data-slot": "empty-state-title",
39
- className: "text-(length:--cue-text-emphasis) text-fg",
43
+ className: `${EMPTY_TITLE_FACE} ${EMPTY_TITLE_SIZE} ${EMPTY_TITLE_WEIGHT} ${EMPTY_TITLE_LEADING} text-fg`,
40
44
  children: title
41
45
  }),
42
46
  hint === void 0 ? null : /* @__PURE__ */ jsx("p", {
43
47
  "data-slot": "empty-state-hint",
44
- className: "max-w-[36ch] text-(length:--cue-text-ui) leading-(--cue-leading-ui) text-fg-muted",
48
+ className: `max-w-[36ch] ${EMPTY_HINT_VOICE} ${BODY_SIZE} ${BODY_LEADING} text-fg-muted`,
45
49
  children: hint
46
50
  }),
47
51
  children,
@@ -11,11 +11,19 @@ interface EyebrowProps extends React.ComponentPropsWithoutRef<"span"> {
11
11
  /**
12
12
  * The small accent kicker that sits above a title: `// PATCH`.
13
13
  *
14
- * Mono, uppercase and widely tracked, in the theme's accent — the one place
15
- * where the accent is used for pure typography rather than for a control. The
16
- * slashes are marked `aria-hidden` and `select-none`, so a screen reader reads
17
- * "patch" and a copy-paste of the page does not carry punctuation that was only
18
- * ever decoration.
14
+ * Mono, uppercase and widely tracked by default — the style set's choice
15
+ * inside one — in the theme's accent: the one place where the accent is used
16
+ * for pure typography rather than for a control. The slashes are marked
17
+ * `aria-hidden` and `select-none`, so a screen reader reads "patch" and a
18
+ * copy-paste of the page does not carry punctuation that was only ever
19
+ * decoration.
20
+ *
21
+ * A style set can restyle it apart from its other captions: its face, size,
22
+ * ink and weight (`--cue-style-eyebrow-face`, `-size`, `-ink`, `-weight`, each
23
+ * falling back through the label names to the console's voice), and whether
24
+ * the slashes print at all (`--cue-style-eyebrow-glyph: none` drops them, as
25
+ * every measured Look does). `slashes={false}` still removes them from the
26
+ * markup under any set.
19
27
  *
20
28
  * Static markup — no `"use client"`.
21
29
  *