@cueplusplus/ui 0.15.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 (508) hide show
  1. package/CHANGELOG.md +1083 -0
  2. package/README.md +26 -0
  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 +4 -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 +17 -1
  16. package/dist/chrome/_tabs-scroll.js +20 -3
  17. package/dist/chrome/app-bar.js +10 -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 +19 -31
  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 +9 -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-field.d.ts +2 -1
  40. package/dist/color/color-picker.d.ts +2 -1
  41. package/dist/color/color-swatch.js +1 -1
  42. package/dist/configurator/_overrides.js +13 -4
  43. package/dist/configurator/configurator.js +4 -1
  44. package/dist/configurator/export-dialog.js +5 -2
  45. package/dist/configurator/panel-sections.js +6 -2
  46. package/dist/configurator/token-editor.js +4 -1
  47. package/dist/date/calendar.js +12 -8
  48. package/dist/date/date-field.d.ts +2 -1
  49. package/dist/date/date-picker.d.ts +2 -1
  50. package/dist/date/date-range-picker.d.ts +2 -1
  51. package/dist/date/time-field.d.ts +2 -1
  52. package/dist/dmx/channel-matrix.js +3 -2
  53. package/dist/dmx/dmx-bar.js +1 -1
  54. package/dist/dmx/dmx-strip.js +1 -1
  55. package/dist/dmx/universe-grid.js +3 -2
  56. package/dist/elements/activity-graph.js +3 -3
  57. package/dist/elements/agent-card.js +3 -3
  58. package/dist/elements/approval-card.js +3 -3
  59. package/dist/elements/artifact-card.js +2 -2
  60. package/dist/elements/background-inbox.js +2 -2
  61. package/dist/elements/canvas-split.js +2 -2
  62. package/dist/elements/chart.js +1 -1
  63. package/dist/elements/chat-panel.js +2 -2
  64. package/dist/elements/checkpoint-history.js +2 -2
  65. package/dist/elements/clamp.js +2 -1
  66. package/dist/elements/code-diff.js +1 -1
  67. package/dist/elements/code-runner.js +1 -1
  68. package/dist/elements/command-palette.js +6 -5
  69. package/dist/elements/comparison-card.js +2 -2
  70. package/dist/elements/composer.js +9 -8
  71. package/dist/elements/computer-use.js +1 -1
  72. package/dist/elements/confidence-marker.js +2 -1
  73. package/dist/elements/connection-state.js +1 -1
  74. package/dist/elements/context-breakdown.js +1 -1
  75. package/dist/elements/context-usage.js +1 -1
  76. package/dist/elements/conversation-search.js +4 -3
  77. package/dist/elements/cost-meter.js +1 -1
  78. package/dist/elements/data-table.js +2 -2
  79. package/dist/elements/day-separator.js +1 -1
  80. package/dist/elements/diagram.js +1 -1
  81. package/dist/elements/document-reference.js +3 -3
  82. package/dist/elements/draft-restore.js +1 -1
  83. package/dist/elements/edit-message.js +4 -3
  84. package/dist/elements/elements.css +26 -5
  85. package/dist/elements/elicitation-form.js +3 -3
  86. package/dist/elements/empty-state.js +2 -1
  87. package/dist/elements/error-state.js +1 -1
  88. package/dist/elements/feedback-dialog.js +4 -3
  89. package/dist/elements/file-tree.js +2 -2
  90. package/dist/elements/flow-graph.js +2 -2
  91. package/dist/elements/guardrail-notice.js +3 -3
  92. package/dist/elements/image-generation.js +1 -1
  93. package/dist/elements/inline-citation.js +3 -3
  94. package/dist/elements/job-progress.js +3 -3
  95. package/dist/elements/launcher-bubble.js +2 -2
  96. package/dist/elements/loading-state.js +1 -1
  97. package/dist/elements/map-answer.js +3 -2
  98. package/dist/elements/markdown.js +5 -4
  99. package/dist/elements/math-block.js +1 -1
  100. package/dist/elements/mcp-server-panel.js +3 -3
  101. package/dist/elements/message-attachment.js +4 -4
  102. package/dist/elements/message-pair.js +1 -1
  103. package/dist/elements/message-queue.js +2 -2
  104. package/dist/elements/mobile-composer.js +4 -3
  105. package/dist/elements/model-picker.js +3 -3
  106. package/dist/elements/onboarding.js +2 -2
  107. package/dist/elements/permission-grant.js +2 -2
  108. package/dist/elements/permission-scopes.js +5 -4
  109. package/dist/elements/prompt-library.js +7 -6
  110. package/dist/elements/queue-dock.js +4 -3
  111. package/dist/elements/quota-banner.js +1 -1
  112. package/dist/elements/quote-reply.js +1 -1
  113. package/dist/elements/read-aloud.js +2 -2
  114. package/dist/elements/reasoning-panel.js +2 -1
  115. package/dist/elements/recommendation-card.d.ts +1 -1
  116. package/dist/elements/recommendation-card.js +2 -2
  117. package/dist/elements/regenerate-menu.js +2 -2
  118. package/dist/elements/research-report.js +1 -1
  119. package/dist/elements/retrieval-chunks.js +1 -1
  120. package/dist/elements/revert-dock.js +5 -4
  121. package/dist/elements/reviewable-diff.js +1 -1
  122. package/dist/elements/schedule-card.js +3 -3
  123. package/dist/elements/score-breakdown.js +1 -1
  124. package/dist/elements/scroll-anchor.js +2 -2
  125. package/dist/elements/settings-panel.js +3 -2
  126. package/dist/elements/shared-conversation.js +2 -2
  127. package/dist/elements/sources.js +4 -3
  128. package/dist/elements/speaker-identity.js +1 -1
  129. package/dist/elements/spec-sheet.js +1 -1
  130. package/dist/elements/streaming-text.js +1 -1
  131. package/dist/elements/subagent-list.js +2 -2
  132. package/dist/elements/suggestions.js +1 -1
  133. package/dist/elements/surfaces.d.ts +1 -1
  134. package/dist/elements/surfaces.js +2 -1
  135. package/dist/elements/tail-status.js +1 -1
  136. package/dist/elements/terminal-block.js +1 -1
  137. package/dist/elements/thread-list.js +1 -1
  138. package/dist/elements/thread-search.js +5 -4
  139. package/dist/elements/timeline.js +1 -1
  140. package/dist/elements/todo-list.js +2 -2
  141. package/dist/elements/tool-call.js +4 -3
  142. package/dist/elements/tool-error.js +2 -2
  143. package/dist/elements/tool-group.js +1 -1
  144. package/dist/elements/tool-timeline.js +4 -3
  145. package/dist/elements/trace-waterfall.js +1 -1
  146. package/dist/elements/verdict-row.js +2 -2
  147. package/dist/elements/voice-conversation.js +3 -2
  148. package/dist/elements/web-preview.js +1 -1
  149. package/dist/elements/web-search.js +2 -2
  150. package/dist/elements/work-collapse.js +2 -1
  151. package/dist/flow/node-card.js +3 -2
  152. package/dist/flow/use-flow-theme.js +2 -1
  153. package/dist/forms/_chassis-size.d.ts +22 -0
  154. package/dist/forms/_chassis.d.ts +28 -15
  155. package/dist/forms/_chassis.js +34 -8
  156. package/dist/forms/_listbox.js +8 -5
  157. package/dist/forms/autocomplete.d.ts +2 -1
  158. package/dist/forms/checkbox.js +8 -2
  159. package/dist/forms/combobox.d.ts +2 -1
  160. package/dist/forms/env-var-input.d.ts +2 -1
  161. package/dist/forms/env-var-input.js +3 -2
  162. package/dist/forms/field.d.ts +2 -1
  163. package/dist/forms/field.js +15 -4
  164. package/dist/forms/file-upload.js +3 -2
  165. package/dist/forms/index.d.ts +2 -1
  166. package/dist/forms/input-group.d.ts +2 -1
  167. package/dist/forms/input.d.ts +2 -1
  168. package/dist/forms/multi-select.d.ts +2 -1
  169. package/dist/forms/number-field.js +2 -1
  170. package/dist/forms/otp-field.d.ts +2 -1
  171. package/dist/forms/password-input.d.ts +2 -1
  172. package/dist/forms/password-input.js +4 -2
  173. package/dist/forms/radio-group.js +6 -2
  174. package/dist/forms/rating.js +2 -1
  175. package/dist/forms/scrub-input.d.ts +2 -1
  176. package/dist/forms/scrub-input.js +2 -1
  177. package/dist/forms/search-input.d.ts +2 -1
  178. package/dist/forms/search-input.js +2 -1
  179. package/dist/forms/select.d.ts +2 -1
  180. package/dist/forms/select.js +6 -2
  181. package/dist/forms/slider.js +6 -2
  182. package/dist/forms/switch.js +6 -2
  183. package/dist/forms/tags-input.d.ts +2 -1
  184. package/dist/forms/textarea.js +2 -1
  185. package/dist/forms/toggle-group.d.ts +1 -1
  186. package/dist/forms/toggle.d.ts +1 -1
  187. package/dist/forms/toggle.js +3 -1
  188. package/dist/index.d.ts +4 -3
  189. package/dist/index.js +2 -2
  190. package/dist/instruments/_data-row.js +2 -1
  191. package/dist/instruments/app-window-frame.js +1 -1
  192. package/dist/instruments/code-block.js +8 -2
  193. package/dist/instruments/group-bar.js +1 -1
  194. package/dist/instruments/ledger.js +6 -2
  195. package/dist/instruments/log-viewer.js +5 -3
  196. package/dist/instruments/progress.js +5 -2
  197. package/dist/instruments/seam-grid.js +5 -3
  198. package/dist/instruments/stat.js +10 -3
  199. package/dist/instruments/table.js +28 -10
  200. package/dist/instruments/terminal-frame.js +4 -2
  201. package/dist/instruments/usage-chart.js +1 -1
  202. package/dist/layout/_collapse.js +6 -1
  203. package/dist/layout/bento.js +7 -4
  204. package/dist/layout/breadcrumb.js +7 -3
  205. package/dist/layout/card.js +14 -6
  206. package/dist/layout/carousel.js +3 -2
  207. package/dist/layout/collapsible.js +5 -1
  208. package/dist/layout/container.js +2 -1
  209. package/dist/layout/description-list.js +4 -1
  210. package/dist/layout/frames.js +11 -5
  211. package/dist/layout/item.js +3 -2
  212. package/dist/layout/link.d.ts +16 -0
  213. package/dist/layout/link.js +22 -3
  214. package/dist/layout/pagination.js +2 -1
  215. package/dist/layout/preview.d.ts +32 -12
  216. package/dist/layout/preview.js +149 -40
  217. package/dist/layout/resizable.js +2 -1
  218. package/dist/layout/sidebar.js +11 -3
  219. package/dist/layout/stepper.js +6 -2
  220. package/dist/lib/cn.js +29 -2
  221. package/dist/midi/musical-time-input.d.ts +2 -1
  222. package/dist/midi/piano-keyboard.js +3 -2
  223. package/dist/midi/spectrum-visualizer.js +1 -1
  224. package/dist/midi/threshold-rail.js +2 -1
  225. package/dist/midi/timeline-ruler.js +1 -1
  226. package/dist/overlays/_surface.d.ts +72 -12
  227. package/dist/overlays/_surface.js +86 -12
  228. package/dist/overlays/command-palette.js +9 -5
  229. package/dist/overlays/dialog.d.ts +5 -0
  230. package/dist/overlays/dialog.js +6 -1
  231. package/dist/overlays/info-tip.js +2 -1
  232. package/dist/overlays/menubar.js +3 -1
  233. package/dist/overlays/popover.js +2 -1
  234. package/dist/overlays/toast.js +6 -2
  235. package/dist/overlays/tooltip.js +4 -1
  236. package/dist/primitives/button.d.ts +15 -0
  237. package/dist/primitives/button.js +40 -10
  238. package/dist/primitives/chip.d.ts +20 -2
  239. package/dist/primitives/chip.js +39 -17
  240. package/dist/primitives/kbd.d.ts +6 -0
  241. package/dist/primitives/kbd.js +10 -1
  242. package/dist/primitives/skeleton.js +1 -1
  243. package/dist/system/_focus-ring-field.js +29 -0
  244. package/dist/system/_focus-ring.js +125 -0
  245. package/dist/system/_paint-elevation.js +9 -0
  246. package/dist/system/_paint-glass.js +46 -0
  247. package/dist/system/_paint-glow.js +51 -0
  248. package/dist/system/_paint-ground-pattern.js +30 -0
  249. package/dist/system/_paint-rest-shade.js +32 -0
  250. package/dist/system/_paint-rim.js +59 -0
  251. package/dist/system/_paint-stroke-sunken.js +19 -0
  252. package/dist/system/_paint-stroke-surface-1.js +19 -0
  253. package/dist/system/_paint-stroke-surface-2.js +40 -0
  254. package/dist/system/_paint-texture.js +56 -0
  255. package/dist/system/_style-app-bar.js +65 -0
  256. package/dist/system/_style-band.js +57 -0
  257. package/dist/system/_style-body-leading.js +21 -0
  258. package/dist/system/_style-body-size.js +30 -0
  259. package/dist/system/_style-body-weight.js +24 -0
  260. package/dist/system/_style-body.js +27 -0
  261. package/dist/system/_style-caption.js +19 -0
  262. package/dist/system/_style-card-pad.js +43 -0
  263. package/dist/system/_style-check.js +33 -0
  264. package/dist/system/_style-chip.js +103 -0
  265. package/dist/system/_style-code.js +13 -0
  266. package/dist/system/_style-collapse.js +14 -0
  267. package/dist/system/_style-control-face.js +29 -0
  268. package/dist/system/_style-control-label.js +22 -0
  269. package/dist/system/_style-control-step.js +22 -0
  270. package/dist/system/_style-control.js +76 -0
  271. package/dist/system/_style-data-face.js +28 -0
  272. package/dist/system/_style-description.js +23 -0
  273. package/dist/system/_style-eyebrow.js +43 -0
  274. package/dist/system/_style-footer-rule.js +47 -0
  275. package/dist/system/_style-gutter.js +17 -0
  276. package/dist/system/_style-help-ink.js +14 -0
  277. package/dist/system/_style-help.js +29 -0
  278. package/dist/system/_style-input-face.js +34 -0
  279. package/dist/system/_style-kbd.js +46 -0
  280. package/dist/system/_style-label-case.js +36 -0
  281. package/dist/system/_style-label-face.js +32 -0
  282. package/dist/system/_style-label-ink.js +29 -0
  283. package/dist/system/_style-label-leading.js +14 -0
  284. package/dist/system/_style-label-size.js +36 -0
  285. package/dist/system/_style-label-tracking.js +45 -0
  286. package/dist/system/_style-label-weight.js +40 -0
  287. package/dist/system/_style-lede.js +49 -0
  288. package/dist/system/_style-link.js +46 -0
  289. package/dist/system/_style-menu.js +30 -0
  290. package/dist/system/_style-nav-item.js +41 -0
  291. package/dist/system/_style-nav-voice.js +43 -0
  292. package/dist/system/_style-option.js +42 -0
  293. package/dist/system/_style-overlay-title.js +35 -0
  294. package/dist/system/_style-page-title.js +48 -0
  295. package/dist/system/_style-popover-pad.js +13 -0
  296. package/dist/system/_style-quiet-ink.js +13 -0
  297. package/dist/system/_style-row-pad.js +13 -0
  298. package/dist/system/_style-seam.js +43 -0
  299. package/dist/system/_style-section-rule.js +26 -0
  300. package/dist/system/_style-segment.js +30 -0
  301. package/dist/system/_style-segmented-control.js +86 -0
  302. package/dist/system/_style-selected.js +36 -0
  303. package/dist/system/_style-stage-marks.js +26 -0
  304. package/dist/system/_style-tab.js +71 -0
  305. package/dist/system/_style-textarea.js +21 -0
  306. package/dist/system/_style-title.js +37 -0
  307. package/dist/system/_style-tooltip.js +17 -0
  308. package/dist/system/density.d.ts +15 -5
  309. package/dist/system/density.js +188 -25
  310. package/dist/system/index.d.ts +2 -2
  311. package/dist/system/index.js +2 -2
  312. package/dist/system/overrides.d.ts +1 -0
  313. package/dist/system/overrides.js +151 -3
  314. package/dist/system/portal.d.ts +3 -2
  315. package/dist/system/portal.js +22 -10
  316. package/dist/system/prepaint.d.ts +21 -5
  317. package/dist/system/prepaint.js +3 -1
  318. package/dist/system/published.d.ts +1 -0
  319. package/dist/system/published.js +131 -0
  320. package/dist/system/theme-provider.d.ts +168 -60
  321. package/dist/system/theme-provider.js +375 -79
  322. package/dist/system/theme-registry.d.ts +2 -1
  323. package/dist/system/theme-registry.js +27 -10
  324. package/dist/system/use-density.js +4 -3
  325. package/dist/system/use-theme.d.ts +5 -2
  326. package/dist/system/use-theme.js +7 -4
  327. package/dist/system/vocabulary.js +2 -2
  328. package/dist/theming/create-theme.js +12 -6
  329. package/dist/theming/serialize.d.ts +34 -2
  330. package/dist/theming/serialize.js +86 -4
  331. package/manifest/components/accordion.json +7 -1
  332. package/manifest/components/agent-pile.json +3 -0
  333. package/manifest/components/alert-dialog.json +38 -1
  334. package/manifest/components/app-bar.json +23 -2
  335. package/manifest/components/app-shell.json +5 -0
  336. package/manifest/components/ask-box.json +3 -1
  337. package/manifest/components/autocomplete.json +49 -1
  338. package/manifest/components/band.json +14 -3
  339. package/manifest/components/bento.json +12 -1
  340. package/manifest/components/breadcrumb.json +8 -1
  341. package/manifest/components/button.json +31 -3
  342. package/manifest/components/calendar.json +7 -0
  343. package/manifest/components/card.json +28 -1
  344. package/manifest/components/carousel.json +4 -1
  345. package/manifest/components/channel-matrix.json +40 -1
  346. package/manifest/components/chart-tooltip-content.json +38 -1
  347. package/manifest/components/chat-empty-state.json +3 -1
  348. package/manifest/components/checkbox-group.json +14 -0
  349. package/manifest/components/checkbox.json +14 -0
  350. package/manifest/components/chip.json +16 -1
  351. package/manifest/components/clamp.json +3 -1
  352. package/manifest/components/code-block.json +10 -1
  353. package/manifest/components/collapsible.json +13 -2
  354. package/manifest/components/color-area.json +4 -2
  355. package/manifest/components/color-field.json +14 -0
  356. package/manifest/components/color-picker.json +14 -0
  357. package/manifest/components/color-slider.json +3 -1
  358. package/manifest/components/colors-section.json +9 -1
  359. package/manifest/components/combobox.json +49 -1
  360. package/manifest/components/command-palette.json +37 -1
  361. package/manifest/components/composer-actions.json +3 -0
  362. package/manifest/components/composer-attach-button.json +3 -0
  363. package/manifest/components/composer-attachment-chip.json +3 -0
  364. package/manifest/components/composer-attachments.json +3 -0
  365. package/manifest/components/composer-bar.json +3 -0
  366. package/manifest/components/composer-command-item.json +3 -0
  367. package/manifest/components/composer-context.json +3 -0
  368. package/manifest/components/composer-input.json +3 -0
  369. package/manifest/components/composer-menu-item.json +3 -0
  370. package/manifest/components/composer-menu.json +3 -0
  371. package/manifest/components/composer-model-item.json +3 -0
  372. package/manifest/components/composer-model-trigger.json +3 -0
  373. package/manifest/components/composer-person-item.json +3 -0
  374. package/manifest/components/composer-send.json +3 -0
  375. package/manifest/components/composer-toolbar.json +3 -0
  376. package/manifest/components/composer-voice-button.json +3 -0
  377. package/manifest/components/composer-voice.json +3 -0
  378. package/manifest/components/composer.json +14 -0
  379. package/manifest/components/confidence-marker.json +3 -1
  380. package/manifest/components/container.json +2 -1
  381. package/manifest/components/context-menu.json +38 -1
  382. package/manifest/components/conversation-search.json +3 -1
  383. package/manifest/components/cue-mark.json +2 -2
  384. package/manifest/components/cue-portal-frame.json +1 -1
  385. package/manifest/components/data-row.json +3 -1
  386. package/manifest/components/data-tree.json +3 -1
  387. package/manifest/components/date-field.json +14 -0
  388. package/manifest/components/date-picker.json +14 -0
  389. package/manifest/components/date-range-picker.json +14 -0
  390. package/manifest/components/delegation-card.json +3 -1
  391. package/manifest/components/density.json +21 -7
  392. package/manifest/components/description-list.json +6 -1
  393. package/manifest/components/dialog.json +39 -1
  394. package/manifest/components/disclosure.json +13 -2
  395. package/manifest/components/dmx-bar.json +37 -1
  396. package/manifest/components/dmx-strip.json +37 -1
  397. package/manifest/components/drawer.json +38 -1
  398. package/manifest/components/dropdown-menu.json +38 -1
  399. package/manifest/components/edit-message.json +3 -1
  400. package/manifest/components/elements-command-palette.json +3 -1
  401. package/manifest/components/elements-composer.json +3 -0
  402. package/manifest/components/empty-state-composer.json +3 -1
  403. package/manifest/components/empty-state-greeting.json +3 -1
  404. package/manifest/components/empty-state-suggestion.json +3 -1
  405. package/manifest/components/empty-state-suggestions.json +3 -1
  406. package/manifest/components/env-var-input.json +14 -1
  407. package/manifest/components/export-dialog.json +6 -1
  408. package/manifest/components/eyebrow.json +13 -2
  409. package/manifest/components/feedback-dialog.json +3 -0
  410. package/manifest/components/field-description.json +14 -0
  411. package/manifest/components/field-error.json +14 -0
  412. package/manifest/components/field-label.json +15 -1
  413. package/manifest/components/field.json +14 -0
  414. package/manifest/components/file-upload.json +3 -0
  415. package/manifest/components/footer.json +14 -1
  416. package/manifest/components/frames.json +14 -1
  417. package/manifest/components/hover-card.json +38 -1
  418. package/manifest/components/info-tip.json +3 -0
  419. package/manifest/components/input-group.json +14 -0
  420. package/manifest/components/input.json +14 -0
  421. package/manifest/components/item.json +3 -1
  422. package/manifest/components/kbd.json +10 -1
  423. package/manifest/components/ledger.json +9 -2
  424. package/manifest/components/link.json +10 -0
  425. package/manifest/components/log-viewer.json +10 -0
  426. package/manifest/components/map-answer.json +3 -1
  427. package/manifest/components/markdown-text.json +3 -0
  428. package/manifest/components/menubar.json +41 -2
  429. package/manifest/components/message-list.json +10 -0
  430. package/manifest/components/message.json +6 -1
  431. package/manifest/components/mobile-composer.json +3 -1
  432. package/manifest/components/multi-select.json +49 -1
  433. package/manifest/components/musical-time-input.json +14 -0
  434. package/manifest/components/navigation-menu.json +41 -1
  435. package/manifest/components/node-card.json +3 -0
  436. package/manifest/components/number-field.json +14 -1
  437. package/manifest/components/otp-field.json +13 -0
  438. package/manifest/components/page-shell.json +14 -0
  439. package/manifest/components/pagination.json +3 -0
  440. package/manifest/components/panel-header.json +12 -0
  441. package/manifest/components/panel.json +13 -1
  442. package/manifest/components/password-input.json +14 -1
  443. package/manifest/components/permission-scopes.json +3 -1
  444. package/manifest/components/piano-keyboard.json +3 -0
  445. package/manifest/components/popover.json +39 -1
  446. package/manifest/components/preset-section.json +9 -1
  447. package/manifest/components/preview.json +30 -10
  448. package/manifest/components/progress.json +6 -1
  449. package/manifest/components/prompt-library.json +3 -1
  450. package/manifest/components/queue-dock.json +3 -1
  451. package/manifest/components/radio-group.json +8 -0
  452. package/manifest/components/radio.json +8 -0
  453. package/manifest/components/rating.json +4 -1
  454. package/manifest/components/reasoning-panel.json +3 -1
  455. package/manifest/components/recommendation-card.json +1 -1
  456. package/manifest/components/resizable.json +4 -1
  457. package/manifest/components/revert-dock.json +3 -1
  458. package/manifest/components/row.json +5 -1
  459. package/manifest/components/scroll-area.json +4 -2
  460. package/manifest/components/scrollable-tabs-list.json +19 -0
  461. package/manifest/components/scrub-input.json +14 -1
  462. package/manifest/components/seam-cell.json +1 -0
  463. package/manifest/components/seam-grid.json +1 -0
  464. package/manifest/components/seam-list.json +5 -1
  465. package/manifest/components/search-input.json +14 -1
  466. package/manifest/components/section-header.json +15 -2
  467. package/manifest/components/segmented-control.json +17 -0
  468. package/manifest/components/select.json +28 -0
  469. package/manifest/components/settings-panel.json +3 -0
  470. package/manifest/components/shape-section.json +9 -1
  471. package/manifest/components/sheet.json +38 -1
  472. package/manifest/components/shimmer-label.json +3 -0
  473. package/manifest/components/sidebar.json +19 -2
  474. package/manifest/components/slider.json +8 -0
  475. package/manifest/components/sources.json +3 -1
  476. package/manifest/components/stat.json +9 -0
  477. package/manifest/components/status-bar.json +4 -0
  478. package/manifest/components/stepper.json +8 -0
  479. package/manifest/components/swap-label.json +3 -0
  480. package/manifest/components/switch.json +8 -0
  481. package/manifest/components/table-scroll-region.json +20 -2
  482. package/manifest/components/table.json +20 -2
  483. package/manifest/components/tabs.json +20 -1
  484. package/manifest/components/tags-input.json +49 -1
  485. package/manifest/components/terminal-frame.json +3 -0
  486. package/manifest/components/textarea.json +16 -0
  487. package/manifest/components/theme-configurator.json +38 -1
  488. package/manifest/components/theme-provider.json +37 -19
  489. package/manifest/components/thread-search.json +3 -1
  490. package/manifest/components/threshold-rail.json +3 -0
  491. package/manifest/components/time-field.json +14 -0
  492. package/manifest/components/toast.json +39 -0
  493. package/manifest/components/toggle-group.json +1 -19
  494. package/manifest/components/toggle.json +3 -5
  495. package/manifest/components/token-editor.json +6 -1
  496. package/manifest/components/tool-call-card.json +9 -2
  497. package/manifest/components/tool-call.json +3 -1
  498. package/manifest/components/tool-timeline.json +3 -1
  499. package/manifest/components/toolbar.json +4 -1
  500. package/manifest/components/tooltip.json +40 -1
  501. package/manifest/components/tree-visibility-toggle.json +3 -0
  502. package/manifest/components/tree.json +3 -0
  503. package/manifest/components/universe-grid.json +3 -0
  504. package/manifest/components/voice-conversation.json +3 -0
  505. package/manifest/components/work-collapse.json +3 -1
  506. package/manifest/manifest.json +205 -185
  507. package/manifest/tokens.json +260 -4
  508. package/package.json +6 -6
@@ -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
  *
@@ -1,15 +1,26 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { LABEL_CASE } from "../system/_style-label-case.js";
3
+ import { LABEL_TRACKING_LOOSE } from "../system/_style-label-tracking.js";
4
+ import { EYEBROW_FACE, EYEBROW_GLYPH, EYEBROW_INK, EYEBROW_SIZE, EYEBROW_WEIGHT } from "../system/_style-eyebrow.js";
2
5
  import * as React from "react";
3
6
  import { jsx, jsxs } from "react/jsx-runtime";
4
7
  //#region src/chrome/eyebrow.tsx
5
8
  /**
6
9
  * The small accent kicker that sits above a title: `// PATCH`.
7
10
  *
8
- * Mono, uppercase and widely tracked, in the theme's accent — the one place
9
- * where the accent is used for pure typography rather than for a control. The
10
- * slashes are marked `aria-hidden` and `select-none`, so a screen reader reads
11
- * "patch" and a copy-paste of the page does not carry punctuation that was only
12
- * ever decoration.
11
+ * Mono, uppercase and widely tracked by default — the style set's choice
12
+ * inside one — in the theme's accent: the one place where the accent is used
13
+ * for pure typography rather than for a control. The slashes are marked
14
+ * `aria-hidden` and `select-none`, so a screen reader reads "patch" and a
15
+ * copy-paste of the page does not carry punctuation that was only ever
16
+ * decoration.
17
+ *
18
+ * A style set can restyle it apart from its other captions: its face, size,
19
+ * ink and weight (`--cue-style-eyebrow-face`, `-size`, `-ink`, `-weight`, each
20
+ * falling back through the label names to the console's voice), and whether
21
+ * the slashes print at all (`--cue-style-eyebrow-glyph: none` drops them, as
22
+ * every measured Look does). `slashes={false}` still removes them from the
23
+ * markup under any set.
13
24
  *
14
25
  * Static markup — no `"use client"`.
15
26
  *
@@ -22,12 +33,12 @@ const Eyebrow = React.forwardRef(function Eyebrow({ className, slashes = true, c
22
33
  return /* @__PURE__ */ jsxs("span", {
23
34
  ref,
24
35
  "data-slot": "eyebrow",
25
- className: cn("inline-flex items-center gap-(--cue-space-2) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps-loose) text-accent uppercase", className),
36
+ className: cn("inline-flex items-center gap-(--cue-space-2)", EYEBROW_SIZE, EYEBROW_INK, EYEBROW_WEIGHT, EYEBROW_FACE, LABEL_TRACKING_LOOSE, LABEL_CASE, className),
26
37
  ...elementProps,
27
38
  children: [slashes ? /* @__PURE__ */ jsx("span", {
28
39
  "data-slot": "eyebrow-glyph",
29
40
  "aria-hidden": "true",
30
- className: "select-none",
41
+ className: cn("select-none", EYEBROW_GLYPH),
31
42
  children: "//"
32
43
  }) : null, children]
33
44
  });
@@ -66,6 +66,11 @@ interface FooterProps extends React.ComponentPropsWithoutRef<"footer"> {
66
66
  * docblock says why that is a fact about the published manifest and not only
67
67
  * about the markup.
68
68
  *
69
+ * Both rules are solid unless a style set says otherwise: `style-footer-rule-style`
70
+ * dashes the rule across the top and the rule over the fine print together,
71
+ * through the slot their borders already read, so a caller's own
72
+ * `className="border-dotted"` still wins. `Band`'s rule does not read it.
73
+ *
69
74
  * Static markup — no `"use client"`.
70
75
  *
71
76
  * @example
@@ -1,6 +1,12 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { LABEL_INK_SUBTLE } from "../system/_style-label-ink.js";
3
+ import { LABEL_FACE } from "../system/_style-label-face.js";
4
+ import { NAV_VOICE } from "../system/_style-nav-voice.js";
5
+ import { LABEL_SIZE } from "../system/_style-label-size.js";
2
6
  import { Container } from "../layout/container.js";
3
7
  import { bandClasses } from "./_band.js";
8
+ import { FOOTER_RULE, FOOTER_RULE_STYLE } from "../system/_style-footer-rule.js";
9
+ import { SECTION_RULE_EDGE } from "../system/_style-section-rule.js";
4
10
  import * as React from "react";
5
11
  import { jsx, jsxs } from "react/jsx-runtime";
6
12
  //#region src/chrome/footer.tsx
@@ -44,6 +50,11 @@ import { jsx, jsxs } from "react/jsx-runtime";
44
50
  * docblock says why that is a fact about the published manifest and not only
45
51
  * about the markup.
46
52
  *
53
+ * Both rules are solid unless a style set says otherwise: `style-footer-rule-style`
54
+ * dashes the rule across the top and the rule over the fine print together,
55
+ * through the slot their borders already read, so a caller's own
56
+ * `className="border-dotted"` still wins. `Band`'s rule does not read it.
57
+ *
47
58
  * Static markup — no `"use client"`.
48
59
  *
49
60
  * @example
@@ -66,14 +77,14 @@ const Footer = React.forwardRef(function Footer({ className, columnClassName, wi
66
77
  ref,
67
78
  "data-slot": "footer",
68
79
  "data-separation": "rule",
69
- className: cn(bandClasses("rule"), "border-(--cue-band-rule-color)", className),
80
+ className: cn(bandClasses("rule"), FOOTER_RULE, FOOTER_RULE_STYLE, "border-(--cue-band-rule-color)", className),
70
81
  ...elementProps,
71
82
  children: /* @__PURE__ */ jsxs(Container, {
72
83
  width,
73
- className: cn("flex flex-col gap-(--cue-space-6) font-mono text-(length:--cue-text-ui)", columnClassName),
84
+ className: cn(`flex flex-col gap-(--cue-space-6) ${NAV_VOICE}`, columnClassName),
74
85
  children: [children, meta === void 0 ? null : /* @__PURE__ */ jsx("div", {
75
86
  "data-slot": "footer-meta",
76
- className: "flex flex-wrap items-center justify-between gap-(--cue-space-3) border-t border-border pt-(--cue-space-5) font-mono text-(length:--cue-text-label) text-fg-subtle",
87
+ className: cn(`flex flex-wrap items-center justify-between gap-(--cue-space-3) border-t pt-(--cue-space-5) ${LABEL_SIZE} ${LABEL_INK_SUBTLE}`, SECTION_RULE_EDGE, FOOTER_RULE_STYLE, LABEL_FACE),
77
88
  children: meta
78
89
  })]
79
90
  })
@@ -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 { CaretDownGlyph } from "./_glyphs.js";
4
6
  import { useCuePortalProps } from "../system/portal.js";
5
7
  import { overlayPopupTransitionClasses, overlayPositionerClasses, overlaySurfaceClasses } from "../overlays/_surface.js";
@@ -64,7 +66,7 @@ const NavigationMenu$1 = {
64
66
  return /* @__PURE__ */ jsxs(NavigationMenu.Trigger, {
65
67
  ref,
66
68
  "data-slot": "navigation-menu-trigger",
67
- className: cn("inline-flex h-control-md cursor-default items-center gap-(--cue-space-2) rounded-(--radius-control) px-(--cue-space-3) font-mono text-(length:--cue-text-ui) whitespace-nowrap text-fg-muted no-underline 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", className),
69
+ className: cn(`inline-flex h-control-md cursor-default items-center gap-(--cue-space-2) rounded-control px-(--cue-space-3) text-(length:--cue-text-ui) whitespace-nowrap text-fg-muted no-underline 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`, CONTROL_FACE, className),
68
70
  ...elementProps,
69
71
  children: [children, caret ? /* @__PURE__ */ jsx(NavigationMenu.Icon, {
70
72
  className: "flex items-center transition-transform duration-150 data-[popup-open]:rotate-180 motion-reduce:transition-none",
@@ -86,7 +88,7 @@ const NavigationMenu$1 = {
86
88
  "data-slot": "navigation-menu-link",
87
89
  "data-active": active === true ? "" : void 0,
88
90
  "aria-current": active === true ? "page" : void 0,
89
- className: cn("flex cursor-pointer flex-col gap-(--cue-space-1) rounded-(--radius-control) px-(--cue-space-3) py-(--cue-space-2) font-mono text-(length:--cue-text-ui) text-fg-muted no-underline transition-colors duration-150 outline-none select-none hover:bg-surface-3 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-accent data-[active]:text-accent", className),
91
+ className: cn(`flex cursor-pointer flex-col gap-(--cue-space-1) rounded-control px-(--cue-space-3) py-(--cue-space-2) text-(length:--cue-text-ui) text-fg-muted no-underline transition-colors duration-150 outline-none select-none hover:bg-surface-3 hover:text-fg ${FOCUS_RING_INSET} data-[active]:text-accent`, CONTROL_FACE, className),
90
92
  ...elementProps,
91
93
  children: [/* @__PURE__ */ jsx("span", { children }), description === void 0 ? null : /* @__PURE__ */ jsx("span", {
92
94
  className: "text-(length:--cue-text-label) leading-(--cue-leading-ui) text-fg-subtle",
@@ -1,4 +1,7 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { BODY_VOICE } from "../system/_style-body.js";
3
+ import { LEDE_INK, LEDE_LEADING, LEDE_SIZE, LEDE_TRACKING } from "../system/_style-lede.js";
4
+ import { PAGE_TITLE_VOICE } from "../system/_style-page-title.js";
2
5
  import * as React from "react";
3
6
  import { jsx, jsxs } from "react/jsx-runtime";
4
7
  //#region src/chrome/page-shell.tsx
@@ -48,25 +51,25 @@ const PageShell = React.forwardRef(function PageShell({ className, width = "narr
48
51
  ...elementProps,
49
52
  children: [hasHeader ? /* @__PURE__ */ jsxs("header", {
50
53
  "data-slot": "page-shell-header",
51
- className: "flex items-start justify-between gap-(--cue-space-4)",
54
+ className: "flex flex-wrap items-start justify-between gap-(--cue-space-4)",
52
55
  children: [/* @__PURE__ */ jsxs("div", {
53
- className: "flex min-w-0 flex-col gap-(--cue-space-2)",
56
+ className: "flex min-w-[min(100%,20rem)] flex-col gap-(--cue-space-2)",
54
57
  children: [
55
58
  eyebrow,
56
59
  title === void 0 ? null : /* @__PURE__ */ jsx("h1", {
57
60
  "data-slot": "page-shell-title",
58
- className: "font-mono text-(length:--cue-text-title) font-medium text-fg",
61
+ className: PAGE_TITLE_VOICE,
59
62
  children: title
60
63
  }),
61
64
  subtitle === void 0 ? null : /* @__PURE__ */ jsx("p", {
62
65
  "data-slot": "page-shell-subtitle",
63
- className: "font-mono text-(length:--cue-text-ui) leading-(--cue-leading-ui) text-fg-muted",
66
+ className: `${BODY_VOICE} ${LEDE_SIZE} ${LEDE_LEADING} ${LEDE_TRACKING} ${LEDE_INK}`,
64
67
  children: subtitle
65
68
  })
66
69
  ]
67
70
  }), actions === void 0 ? null : /* @__PURE__ */ jsx("div", {
68
71
  "data-slot": "page-shell-actions",
69
- className: "flex shrink-0 items-center gap-(--cue-space-2)",
72
+ className: "flex min-w-0 flex-wrap items-center gap-(--cue-space-2)",
70
73
  children: actions
71
74
  })]
72
75
  }) : null, children]
@@ -12,8 +12,11 @@ type PanelProps = React.ComponentPropsWithoutRef<"div">;
12
12
  * panel's radius, which is what makes a stack of hairline rows read as one
13
13
  * object.
14
14
  *
15
- * Deliberately flat: no shadow. In this system only a floating surface (a
16
- * dialog, a menu, a toast) is allowed one — see `overlays/_surface.ts`.
15
+ * Deliberately flat: no elevation. In this system only a floating surface (a
16
+ * dialog, a menu, a toast) is allowed one — see `overlays/_surface.ts`. What a
17
+ * panel does carry is the paint axis's rim and its resting shade, both in
18
+ * `RIM_INSET` and both transparent until a pack tints them: a one-stop contact
19
+ * shade that sets the panel on the page, not a ladder rung that lifts it off.
17
20
  *
18
21
  * Static markup — no `"use client"`.
19
22
  *
@@ -1,4 +1,6 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { RIM_INSET } from "../system/_paint-rim.js";
3
+ import { TITLE_VOICE } from "../system/_style-title.js";
2
4
  import * as React from "react";
3
5
  import { jsx, jsxs } from "react/jsx-runtime";
4
6
  //#region src/chrome/panel.tsx
@@ -12,8 +14,11 @@ import { jsx, jsxs } from "react/jsx-runtime";
12
14
  * panel's radius, which is what makes a stack of hairline rows read as one
13
15
  * object.
14
16
  *
15
- * Deliberately flat: no shadow. In this system only a floating surface (a
16
- * dialog, a menu, a toast) is allowed one — see `overlays/_surface.ts`.
17
+ * Deliberately flat: no elevation. In this system only a floating surface (a
18
+ * dialog, a menu, a toast) is allowed one — see `overlays/_surface.ts`. What a
19
+ * panel does carry is the paint axis's rim and its resting shade, both in
20
+ * `RIM_INSET` and both transparent until a pack tints them: a one-stop contact
21
+ * shade that sets the panel on the page, not a ladder rung that lifts it off.
17
22
  *
18
23
  * Static markup — no `"use client"`.
19
24
  *
@@ -28,7 +33,7 @@ const Panel = React.forwardRef(function Panel({ className, ...elementProps }, re
28
33
  return /* @__PURE__ */ jsx("div", {
29
34
  ref,
30
35
  "data-slot": "panel",
31
- className: cn("overflow-hidden rounded-(--radius-surface) border border-border bg-surface-1", className),
36
+ className: cn(`overflow-hidden rounded-surface border border-border bg-surface-1 ${RIM_INSET}`, className),
32
37
  ...elementProps
33
38
  });
34
39
  });
@@ -53,7 +58,7 @@ const PanelHeader = React.forwardRef(function PanelHeader({ className, title, ac
53
58
  className: "flex min-w-0 items-center gap-(--cue-space-3)",
54
59
  children: [title === void 0 ? null : /* @__PURE__ */ jsx("span", {
55
60
  "data-slot": "panel-header-title",
56
- className: "truncate font-mono text-(length:--cue-text-emphasis) font-medium text-fg",
61
+ className: `overflow-x-clip text-ellipsis whitespace-nowrap ${TITLE_VOICE}`,
57
62
  children: title
58
63
  }), children]
59
64
  }), actions === void 0 ? null : /* @__PURE__ */ jsx("div", {
@@ -1,5 +1,8 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { FOCUS_RING_INSET_2 } from "../system/_focus-ring.js";
2
3
  import { cva } from "../lib/cva.js";
4
+ import { DATA_FACE } from "../system/_style-data-face.js";
5
+ import { SEAM_INK, SEAM_RIM } from "../system/_style-seam.js";
3
6
  import * as React from "react";
4
7
  import { jsx } from "react/jsx-runtime";
5
8
  //#region src/chrome/row.tsx
@@ -18,14 +21,14 @@ import { jsx } from "react/jsx-runtime";
18
21
  * @example
19
22
  * <li className={rowVariants({ interactive: true })} />
20
23
  */
21
- const rowVariants = cva("flex w-full items-center gap-(--cue-space-3) px-(--cue-pad-row-x) py-(--cue-pad-row-y) font-mono text-(length:--cue-text-ui) text-fg", {
24
+ const rowVariants = cva(`flex w-full items-center gap-(--cue-space-3) px-(--cue-pad-row-x) py-(--cue-pad-row-y) ${DATA_FACE} text-(length:--cue-text-ui) text-fg`, {
22
25
  variants: {
23
26
  seam: {
24
27
  true: "bg-bg",
25
28
  false: "border-t border-border first:border-t-0 [[data-slot=panel-header]+&]:border-t-0"
26
29
  },
27
30
  interactive: {
28
- true: "cursor-pointer text-left transition-colors duration-150 outline-none hover:bg-surface-2 focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent disabled:pointer-events-none disabled:opacity-40",
31
+ true: `cursor-pointer text-left transition-colors duration-150 outline-none hover:bg-surface-2 ${FOCUS_RING_INSET_2} disabled:pointer-events-none disabled:opacity-40`,
29
32
  false: ""
30
33
  }
31
34
  },
@@ -98,7 +101,7 @@ const SeamList = React.forwardRef(function SeamList({ className, ...elementProps
98
101
  return /* @__PURE__ */ jsx("div", {
99
102
  ref,
100
103
  "data-slot": "seam-list",
101
- className: cn("flex flex-col gap-px overflow-hidden rounded-(--radius-surface) border border-border bg-border", className),
104
+ className: cn(`flex flex-col gap-px overflow-hidden rounded-surface border ${SEAM_RIM} ${SEAM_INK}`, className),
102
105
  ...elementProps
103
106
  });
104
107
  });
@@ -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 * as React from "react";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { ScrollArea } from "@base-ui/react/scroll-area";
@@ -36,7 +37,7 @@ const ScrollArea$1 = React.forwardRef(function ScrollArea$2({ className, viewpor
36
37
  /* @__PURE__ */ jsx(ScrollArea.Viewport, {
37
38
  ref: viewportRef,
38
39
  "data-slot": "scroll-area-viewport",
39
- className: cn("size-full overscroll-contain outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-2 focus-visible:outline-accent", viewportClassName),
40
+ className: cn(`size-full overscroll-contain outline-none ${FOCUS_RING_INSET_2}`, viewportClassName),
40
41
  children: /* @__PURE__ */ jsx(ScrollArea.Content, {
41
42
  "data-slot": "scroll-area-content",
42
43
  children
@@ -1,6 +1,15 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
4
+ import { LABEL_INK } from "../system/_style-label-ink.js";
5
+ import { LABEL_FACE } from "../system/_style-label-face.js";
6
+ import { LABEL_WEIGHT } from "../system/_style-label-weight.js";
7
+ import { LABEL_CASE } from "../system/_style-label-case.js";
8
+ import { LABEL_TRACKING } from "../system/_style-label-tracking.js";
3
9
  import { ChevronRightGlyph } from "./_glyphs.js";
10
+ import { LABEL_SIZE } from "../system/_style-label-size.js";
11
+ import { SECTION_RULE_FILL } from "../system/_style-section-rule.js";
12
+ import { DATA_FACE } from "../system/_style-data-face.js";
4
13
  import * as React from "react";
5
14
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
15
  //#region src/chrome/section-header.tsx
@@ -35,18 +44,18 @@ const SectionHeader = React.forwardRef(function SectionHeader({ className, label
35
44
  }) : null,
36
45
  /* @__PURE__ */ jsx("span", {
37
46
  "data-slot": "section-header-label",
38
- className: "shrink-0 font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-muted uppercase",
47
+ className: cn("shrink-0", LABEL_SIZE, LABEL_INK, LABEL_WEIGHT, LABEL_FACE, LABEL_TRACKING, LABEL_CASE),
39
48
  children: label
40
49
  }),
41
50
  count === void 0 ? null : /* @__PURE__ */ jsx("span", {
42
51
  "data-slot": "section-header-count",
43
- className: "shrink-0 font-mono text-(length:--cue-text-label) tabular-nums text-fg-subtle",
52
+ className: `shrink-0 ${DATA_FACE} text-(length:--cue-text-label) tabular-nums text-fg-subtle`,
44
53
  children: count
45
54
  }),
46
55
  /* @__PURE__ */ jsx("span", {
47
56
  "data-slot": "section-header-rule",
48
57
  "aria-hidden": "true",
49
- className: "h-px min-w-(--cue-space-4) flex-1 bg-border"
58
+ className: cn("h-px min-w-(--cue-space-4) flex-1", SECTION_RULE_FILL)
50
59
  })
51
60
  ] });
52
61
  const headClasses = "flex min-w-0 flex-1 items-center gap-(--cue-space-3)";
@@ -62,7 +71,7 @@ const SectionHeader = React.forwardRef(function SectionHeader({ className, label
62
71
  "aria-expanded": open,
63
72
  onClick: toggle,
64
73
  "data-slot": "section-header-toggle",
65
- className: cn(headClasses, "cursor-pointer text-left outline-none hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent"),
74
+ className: cn(headClasses, `cursor-pointer text-left outline-none hover:text-fg ${FOCUS_RING_OFFSET_2}`),
66
75
  children: headContent
67
76
  }) : /* @__PURE__ */ jsx("div", {
68
77
  className: headClasses,
@@ -1,7 +1,11 @@
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 { useComposedRefs } from "../lib/compose.js";
4
6
  import { EDGE_SCROLLER_CLASSES, EdgeChevrons, useEdgeScroll } from "./_edge-scroller.js";
7
+ import { SEGMENT_IDLE_INK } from "../system/_style-segment.js";
8
+ import { SEGMENTED_CHEVRON_GROUND, SEGMENTED_RIM, SEGMENTED_TRACK, SEGMENT_PRESSED, SEGMENT_RADIUS } from "../system/_style-segmented-control.js";
5
9
  import * as React from "react";
6
10
  import { jsx, jsxs } from "react/jsx-runtime";
7
11
  import { Toggle } from "@base-ui/react/toggle";
@@ -17,8 +21,13 @@ const ITEM_SIZES = {
17
21
  * solid accent fill. A solid bar inside a small control reads as a second,
18
22
  * louder button and drowns the labels around it (the luma defect ruling); the
19
23
  * soft tint says "this one" at exactly the volume a view switcher deserves.
24
+ *
25
+ * That is the default. A style set may draw the choice as a raised pill on a
26
+ * filled track instead — its ground, ink, edge, weight and resting shade, the
27
+ * track and its inset — through the segment names: `_style-segmented-control.ts`
28
+ * for the pressed segment, and `_style-segment.ts` for the half `Tabs` shares.
20
29
  */
21
- const ITEM_CLASSES = "inline-flex shrink-0 cursor-pointer select-none items-center justify-center gap-(--cue-space-2) whitespace-nowrap rounded-(--radius-control) font-mono text-fg-muted transition-colors duration-150 outline-none hover:text-fg data-[pressed]:bg-accent-soft data-[pressed]:text-accent 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";
30
+ const ITEM_CLASSES = `inline-flex shrink-0 cursor-pointer select-none items-center justify-center gap-(--cue-space-2) whitespace-nowrap ${SEGMENT_RADIUS} ${CONTROL_FACE} ${SEGMENT_IDLE_INK} transition-colors duration-150 outline-none hover:text-fg ${SEGMENT_PRESSED} ${FOCUS_RING_INSET} disabled:pointer-events-none disabled:opacity-40 data-[disabled]:pointer-events-none data-[disabled]:opacity-40`;
22
31
  /**
23
32
  * A one-of-N switch drawn as a row of segments: the console's view picker.
24
33
  *
@@ -57,7 +66,7 @@ const SegmentedControl = React.forwardRef(function SegmentedControl({ items, val
57
66
  const iconSize = size === "sm" ? "size-icon-sm" : "size-icon-md";
58
67
  return /* @__PURE__ */ jsxs("div", {
59
68
  "data-slot": "segmented-control-frame",
60
- className: cn("relative inline-flex max-w-full min-w-0 shrink-0 items-center rounded-(--radius-control) border border-border bg-surface-1 p-(--cue-space-1)", className),
69
+ className: cn(`relative inline-flex max-w-full min-w-0 shrink-0 items-center rounded-control border ${SEGMENTED_RIM} ${SEGMENTED_TRACK}`, className),
61
70
  children: [/* @__PURE__ */ jsx(ToggleGroup, {
62
71
  ref: groupRef,
63
72
  value: value === void 0 ? [] : [value],
@@ -87,7 +96,7 @@ const SegmentedControl = React.forwardRef(function SegmentedControl({ items, val
87
96
  onNudge: scroll.nudge,
88
97
  previousLabel,
89
98
  nextLabel,
90
- className: "rounded-(--radius-control) bg-surface-1"
99
+ className: `rounded-control ${SEGMENTED_CHEVRON_GROUND}`
91
100
  })]
92
101
  });
93
102
  });
@@ -1,4 +1,5 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { LABEL_FACE } from "../system/_style-label-face.js";
2
3
  import { STATUS_BAR_GROUP_CLASSES, statusBarItemClasses } from "./_status-bar.js";
3
4
  import { StatusBarInteractiveItem } from "./_status-bar-item.js";
4
5
  import * as React from "react";
@@ -8,7 +9,7 @@ const StatusBarRoot = React.forwardRef(function StatusBar({ className, ...elemen
8
9
  return /* @__PURE__ */ jsx("div", {
9
10
  ref,
10
11
  "data-slot": "status-bar",
11
- className: cn("flex h-(--cue-chrome-statusbar) w-full shrink-0 items-center gap-(--cue-space-4) overflow-x-clip border-t border-border bg-surface-1 px-(--cue-pad-row-x) font-mono text-(length:--cue-text-label) text-fg-subtle", className),
12
+ className: cn("flex h-(--cue-chrome-statusbar) w-full shrink-0 items-center gap-(--cue-space-4) overflow-x-clip border-t border-border bg-surface-1 px-(--cue-pad-row-x) text-(length:--cue-text-label) text-fg-subtle", LABEL_FACE, className),
12
13
  ...elementProps
13
14
  });
14
15
  });
@@ -1,6 +1,10 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_INSET_2, FOCUS_RING_OFFSET_2 } from "../system/_focus-ring.js";
4
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
3
5
  import { EDGE_SCROLLER_CLASSES, EdgeChevrons, useEdgeScroll } from "./_edge-scroller.js";
6
+ import { SEGMENT_IDLE_INK } from "../system/_style-segment.js";
7
+ import { TAB_ACTIVE, TAB_RULE, TAB_SHAPE, TAB_TRACK, TAB_UNDERLINE } from "../system/_style-tab.js";
4
8
  import * as React from "react";
5
9
  import { jsx, jsxs } from "react/jsx-runtime";
6
10
  import { Tabs } from "@base-ui/react/tabs";
@@ -25,7 +29,7 @@ const TabsList = React.forwardRef(function TabsList({ className, ...elementProps
25
29
  return /* @__PURE__ */ jsx(Tabs.List, {
26
30
  ref,
27
31
  "data-slot": "tabs-list",
28
- className: cn("relative flex items-center gap-(--cue-space-1) border-b border-border data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[orientation=vertical]:border-b-0 data-[orientation=vertical]:border-r", className),
32
+ className: cn(`relative flex items-center gap-(--cue-space-1) ${TAB_RULE} border-border ${TAB_TRACK} data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[orientation=vertical]:border-b-0 data-[orientation=vertical]:border-r`, className),
29
33
  ...elementProps
30
34
  });
31
35
  });
@@ -33,12 +37,16 @@ const TabsList = React.forwardRef(function TabsList({ className, ...elementProps
33
37
  * One tab. Selected state is an accent underline sitting on the list's rule —
34
38
  * never a filled pill, which at console density turns a row of four tabs into a
35
39
  * row of four buttons and loses the "one surface, several views" reading.
40
+ *
41
+ * That is the default. A Look that draws its tabs as a segmented track says so
42
+ * through the style set's segment names, and takes the rule and the underline
43
+ * away with `style-tab-rule` and `style-tab-underline`.
36
44
  */
37
45
  const TabsTab = React.forwardRef(function TabsTab({ className, ...elementProps }, ref) {
38
46
  return /* @__PURE__ */ jsx(Tabs.Tab, {
39
47
  ref,
40
48
  "data-slot": "tabs-tab",
41
- className: cn("relative inline-flex h-control-md shrink-0 cursor-pointer items-center justify-center gap-(--cue-space-2) rounded-t-(--radius-control) px-(--cue-space-4) 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-2 focus-visible:outline-accent", "data-[disabled]:pointer-events-none data-[disabled]:opacity-40", "after:absolute after:inset-x-0 after:-bottom-px after:h-px after:bg-transparent after:content-['']", "data-[active]:text-accent data-[active]:after:bg-accent", className),
49
+ className: cn(`relative inline-flex h-control-md shrink-0 cursor-pointer items-center justify-center gap-(--cue-space-2) ${TAB_SHAPE} px-(--cue-space-4) text-(length:--cue-text-ui) whitespace-nowrap ${SEGMENT_IDLE_INK} transition-colors duration-150 outline-none select-none`, CONTROL_FACE, `hover:text-fg ${FOCUS_RING_INSET_2}`, "data-[disabled]:pointer-events-none data-[disabled]:opacity-40", "after:absolute after:inset-x-0 after:-bottom-px after:h-px after:bg-transparent after:content-['']", `${TAB_ACTIVE} ${TAB_UNDERLINE}`, className),
42
50
  ...elementProps
43
51
  });
44
52
  });
@@ -47,7 +55,7 @@ const TabsPanel = React.forwardRef(function TabsPanel({ className, ...elementPro
47
55
  return /* @__PURE__ */ jsx(Tabs.Panel, {
48
56
  ref,
49
57
  "data-slot": "tabs-panel",
50
- className: cn("min-w-0 outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent", className),
58
+ className: cn(`min-w-0 outline-none ${FOCUS_RING_OFFSET_2}`, className),
51
59
  ...elementProps
52
60
  });
53
61
  });
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING_INSET } from "../system/_focus-ring.js";
3
4
  import { useComposedRefs } from "../lib/compose.js";
4
5
  import { EDGE_SCROLLER_CLASSES, EdgeChevrons, useEdgeScroll } from "./_edge-scroller.js";
5
6
  import * as React from "react";
@@ -54,7 +55,7 @@ const Toolbar$1 = {
54
55
  return /* @__PURE__ */ jsxs(Toolbar.Button, {
55
56
  ref,
56
57
  "data-slot": "toolbar-button",
57
- className: cn("inline-flex h-control-md shrink-0 cursor-pointer items-center justify-center gap-(--cue-space-2) 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:bg-surface-2 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-accent data-[disabled]:pointer-events-none data-[disabled]:opacity-40", className),
58
+ className: cn(`inline-flex h-control-md shrink-0 cursor-pointer items-center justify-center gap-(--cue-space-2) rounded-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:bg-surface-2 hover:text-fg ${FOCUS_RING_INSET} data-[disabled]:pointer-events-none data-[disabled]:opacity-40`, className),
58
59
  ...elementProps,
59
60
  children: [Icon === void 0 ? null : /* @__PURE__ */ jsx(Icon, {
60
61
  "aria-hidden": "true",
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING, FOCUS_RING_INSET } from "../system/_focus-ring.js";
3
4
  import { TREE_GUIDE_GLYPHS, flattenTree } from "./_tree.js";
4
5
  import { ChevronRightGlyph, EyeGlyph, EyeOffGlyph, GhostGlyph } from "./_glyphs.js";
5
6
  import * as React from "react";
@@ -145,7 +146,7 @@ const Tree = React.forwardRef(function Tree({ className, items, expanded: expand
145
146
  "data-disabled": item.disabled === true ? "" : void 0,
146
147
  onFocus: () => setActiveId(item.id),
147
148
  onClick: () => select(row),
148
- className: "group/tree-row flex h-control-sm cursor-default items-center gap-(--cue-space-1) rounded-(--radius-control) pr-(--cue-space-2) font-mono text-(length:--cue-text-ui) whitespace-nowrap text-fg-muted outline-none select-none hover:bg-surface-2 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-accent data-[selected]:bg-accent-soft data-[selected]:text-accent data-[disabled]:pointer-events-none data-[disabled]:opacity-40",
149
+ className: `group/tree-row flex h-control-sm cursor-default items-center gap-(--cue-space-1) rounded-control pr-(--cue-space-2) font-mono text-(length:--cue-text-ui) whitespace-nowrap text-fg-muted outline-none select-none hover:bg-surface-2 hover:text-fg ${FOCUS_RING_INSET} data-[selected]:bg-accent-soft data-[selected]:text-accent data-[disabled]:pointer-events-none data-[disabled]:opacity-40`,
149
150
  children: [
150
151
  guides ? row.guides.map((guide, depth) => /* @__PURE__ */ jsx("span", {
151
152
  "aria-hidden": "true",
@@ -239,7 +240,7 @@ const TreeVisibilityToggle = React.forwardRef(function TreeVisibilityToggle({ cl
239
240
  if (event.defaultPrevented) return;
240
241
  onValueChange(NEXT_VISIBILITY[value]);
241
242
  },
242
- className: cn("flex size-icon-md shrink-0 cursor-pointer items-center justify-center rounded-(--radius-control) border-0 bg-transparent p-0 outline-none transition-colors duration-150 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent motion-reduce:transition-none data-[state=visible]:text-fg-subtle data-[state=ghost]:text-info data-[state=hidden]:text-warn", className),
243
+ className: cn(`flex size-icon-md shrink-0 cursor-pointer items-center justify-center rounded-control border-0 bg-transparent p-0 outline-none transition-colors duration-150 hover:text-fg ${FOCUS_RING} motion-reduce:transition-none data-[state=visible]:text-fg-subtle data-[state=ghost]:text-info data-[state=hidden]:text-warn`, className),
243
244
  ...elementProps,
244
245
  children: /* @__PURE__ */ jsx(Glyph, { className: "size-icon-sm" })
245
246
  });
@@ -1,15 +1,21 @@
1
+ import { FOCUS_RING_DATA_OFFSET_2 } from "../system/_focus-ring.js";
1
2
  //#region src/color/_thumb.ts
2
3
  /**
3
4
  * The draggable puck shared by the colour area and every colour rail.
4
5
  *
5
- * The one place in this system where a ring is not a token colour: the thumb
6
+ * The one place in this system where the RIM is not a token colour: the thumb
6
7
  * sits on top of arbitrary user colour, so it needs a light rim *and* a dark
7
8
  * halo to stay visible against both ends of the spectrum. `--cue-fg` /
8
9
  * `--cue-bg` supply the pair, which keeps it theme-driven without pretending a
9
- * single token could do the job.
10
+ * single token could do the job. The keyboard ring is a different question —
11
+ * it is an indicator, not decoration — and reads `--cue-focus` like every
12
+ * other ring in this system (spec 2026-09-26-looks-fidelity §3.12, F-9): three
13
+ * shipped presets (hivehub, luma, venu, all light) fail WCAG 1.4.11 with the
14
+ * un-gated accent here, since the puck is exactly the small, thin indicator
15
+ * that clause guards.
10
16
  *
11
17
  * @internal Not part of the public API.
12
18
  */
13
- const colorThumbClasses = "size-[0.875rem] rounded-full border-2 border-fg shadow-[0_0_0_1px_var(--cue-bg)] outline-none data-[focus-visible]:outline-2 data-[focus-visible]:outline-solid data-[focus-visible]:outline-offset-2 data-[focus-visible]:outline-accent data-[dragging]:scale-110 data-[disabled]:opacity-40";
19
+ const colorThumbClasses = `size-[0.875rem] rounded-full border-2 border-fg shadow-[0_0_0_1px_var(--cue-bg)] outline-none ${FOCUS_RING_DATA_OFFSET_2} data-[dragging]:scale-110 data-[disabled]:opacity-40`;
14
20
  //#endregion
15
21
  export { colorThumbClasses };
@@ -26,7 +26,7 @@ import { ColorArea, ColorThumb } from "react-aria-components";
26
26
  function ColorArea$1({ className, thumbClassName, value, defaultValue, ...areaProps }) {
27
27
  return /* @__PURE__ */ jsx(ColorArea, {
28
28
  "data-slot": "color-area",
29
- className: ariaClassName("relative h-[9rem] w-full touch-none rounded-(--radius-control) border border-border outline-none data-[disabled]:opacity-40", className),
29
+ className: ariaClassName("relative h-[9rem] w-full touch-none rounded-control border border-border outline-none data-[disabled]:opacity-40", className),
30
30
  value: toAriaColor(value),
31
31
  defaultValue: toAriaColor(defaultValue),
32
32
  ...areaProps,
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "../forms/_chassis.js";
1
+ import { FormControlSize } from "../forms/_chassis-size.js";
2
+ import "../forms/_chassis.js";
2
3
  import * as React from "react";
3
4
  import { ColorFieldProps, InputProps } from "react-aria-components";
4
5
  //#region src/color/color-field.d.ts
@@ -1,5 +1,6 @@
1
1
  import { ColorFormat } from "./_convert.js";
2
- import { FormControlSize } from "../forms/_chassis.js";
2
+ import { FormControlSize } from "../forms/_chassis-size.js";
3
+ import "../forms/_chassis.js";
3
4
  import * as React from "react";
4
5
  //#region src/color/color-picker.d.ts
5
6
  interface ColorPickerProps {
@@ -32,7 +32,7 @@ const SWATCH_SIZES = {
32
32
  function ColorSwatch$1({ size = "md", className, color, ...swatchProps }) {
33
33
  return /* @__PURE__ */ jsx("span", {
34
34
  "data-slot": "color-swatch",
35
- className: cn("relative inline-block shrink-0 overflow-hidden rounded-(--radius-control) border border-border", SWATCH_SIZES[size], checkerClasses, className),
35
+ className: cn("relative inline-block shrink-0 overflow-hidden rounded-control border border-border", SWATCH_SIZES[size], checkerClasses, className),
36
36
  children: /* @__PURE__ */ jsx(ColorSwatch, {
37
37
  color: toAriaColor(color),
38
38
  className: "block size-full",
@@ -1,4 +1,4 @@
1
- import { THEME_NAME_PATTERN as THEME_NAME_PATTERN$1, assertCssValue, serializeSystemModeAliases, serializeThemeBlock, tokenProperty } from "../theming/serialize.js";
1
+ import { THEME_NAME_PATTERN as THEME_NAME_PATTERN$1, assertCssValue, followerSelector, serializeSystemModeAliases, serializeThemeBlock, themeFollowerSelector, tokenProperty } from "../theming/serialize.js";
2
2
  import { DEFAULT_DENSITY_LEVEL, DENSITY_RADIUS_SCALE, THEME_COLOR_TOKENS } from "../theming/create-theme.js";
3
3
  import { resolve } from "@cueplusplus/theme-base";
4
4
  //#region src/configurator/_overrides.ts
@@ -320,9 +320,18 @@ function orderedDeclarations(entries) {
320
320
  * form: a bare `[data-theme="x"]` for dark, because that is the block a
321
321
  * stylesheet writes first. An override has to beat that block **and** the light
322
322
  * block above it, so it always names the mode.
323
+ *
324
+ * Which is why it carries the follower's twin in both modes, not only in light:
325
+ * a theme island that follows a persisting root's mode stamps no `data-mode`
326
+ * until it mounts, and a compound naming `dark` misses it exactly as one naming
327
+ * `light` does (see `followerSelector`). And the theme follower's twin for the
328
+ * same reason one axis over: an island that names a mode and follows the
329
+ * root's theme stamps no `data-theme` until it mounts (see
330
+ * `themeFollowerSelector`). Same specificity, so source order still puts these
331
+ * after every theme's own blocks.
323
332
  */
324
333
  function overrideSelector(theme, mode) {
325
- return `[data-theme="${theme}"][data-mode="${mode}"]`;
334
+ return `${themeFollowerSelector(theme, mode)},\n${followerSelector(theme, "mode", mode)},\n[data-theme="${theme}"][data-mode="${mode}"]`;
326
335
  }
327
336
  /** Round a product of two scales to something a stylesheet can print. */
328
337
  const scaled = (a, b) => String(Number((a * b).toFixed(4)));
@@ -376,7 +385,7 @@ function serializeOverrideCss(overrides, options = {}) {
376
385
  if (scaledDeclarations.length > 0) for (const level of DENSITY_LEVELS) {
377
386
  const isDefault = level === DEFAULT_DENSITY_LEVEL;
378
387
  blocks.push({
379
- selector: isDefault ? `:root,\n[data-density="${level}"]` : `[data-density="${level}"]`,
388
+ selector: `:where(:root[data-density="${level}"]) [data-cue-follows~="density"],\n${isDefault ? ":root,\n" : ""}[data-density="${level}"]`,
380
389
  sections: [{
381
390
  comment: isDefault ? CROSSED_COMMENT : void 0,
382
391
  declarations: scaledDeclarations.map(([property, value]) => [property, crossed(property, value, level)])
@@ -384,7 +393,7 @@ function serializeOverrideCss(overrides, options = {}) {
384
393
  });
385
394
  }
386
395
  if (flatDeclarations.length > 0) blocks.push({
387
- selector: ":root,\n[data-density]",
396
+ selector: "[data-cue-follows~=\"density\"],\n:root,\n[data-density]",
388
397
  sections: [{ declarations: flatDeclarations }]
389
398
  });
390
399
  if (inlineDeclarations.length > 0) blocks.push({