@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
@@ -1,3 +1,4 @@
1
+ import "./published.js";
1
2
  import { ThemeRegistry } from "./vocabulary.js";
2
3
  import "react";
3
4
  import { DensityEntry, FontEntry, ThemeManifest } from "@cueplusplus/theme-base";
@@ -40,7 +41,7 @@ declare function useThemes(): readonly ThemeManifest[];
40
41
  */
41
42
  declare function useDensities(): readonly DensityEntry[];
42
43
  /**
43
- * The font pairings, by the same rule: the base eight, then the active theme's.
44
+ * The font pairings, by the same rule: the base twelve, then the active theme's.
44
45
  *
45
46
  * @throws If called outside a `<ThemeProvider>`.
46
47
  * @example
@@ -1,13 +1,30 @@
1
1
  "use client";
2
+ import { published, useReadSelected } from "./published.js";
2
3
  import "./vocabulary.js";
3
4
  import * as React from "react";
4
5
  //#region src/system/theme-registry.tsx
5
- /** Internal: consumers read it through the three hooks. `null` outside a provider. */
6
- const ThemeRegistryContext = React.createContext(null);
7
- function useRegistry(hook) {
8
- const registry = React.useContext(ThemeRegistryContext);
9
- if (registry === null) throw new Error(`${hook}() must be called inside a <ThemeProvider>.`);
10
- return registry;
6
+ /**
7
+ * Internal: consumers read it through the three hooks. `null` outside a provider.
8
+ *
9
+ * Carried as a `Published` (see `published.ts`): the registry is built for the
10
+ * active theme, which a root's restore can change while streamed boundaries
11
+ * below are still hydrating.
12
+ */
13
+ const ThemeRegistryContext = React.createContext(published(null));
14
+ /** What a slice reads outside any provider — never a value a registry can hold. */
15
+ const NO_REGISTRY = Symbol("no registry");
16
+ /**
17
+ * One slice of the registry. The registry is rebuilt for every active theme,
18
+ * but the themes a registry lists do not change with it — so a `useThemes()`
19
+ * reader sits out the restore entirely: the rebuilt registry is posted beside
20
+ * the context (see `published.ts`), and this reader re-renders only if its own
21
+ * slice moved. An edit that switches the theme moves the context itself, and
22
+ * that re-renders every reader of it, as any context does.
23
+ */
24
+ function useRegistry(hook, select) {
25
+ const slice = useReadSelected(ThemeRegistryContext, (registry) => registry === null ? NO_REGISTRY : select(registry));
26
+ if (slice === NO_REGISTRY) throw new Error(`${hook}() must be called inside a <ThemeProvider>.`);
27
+ return slice;
11
28
  }
12
29
  /**
13
30
  * Every registered manifest, in registration order.
@@ -27,7 +44,7 @@ function useRegistry(hook) {
27
44
  * ));
28
45
  */
29
46
  function useThemes() {
30
- return useRegistry("useThemes").themes;
47
+ return useRegistry("useThemes", (registry) => registry.themes);
31
48
  }
32
49
  /**
33
50
  * The rungs an app may offer right now: the base five, then the ACTIVE theme's
@@ -48,10 +65,10 @@ function useThemes() {
48
65
  * />
49
66
  */
50
67
  function useDensities() {
51
- return useRegistry("useDensities").densities;
68
+ return useRegistry("useDensities", (registry) => registry.densities);
52
69
  }
53
70
  /**
54
- * The font pairings, by the same rule: the base eight, then the active theme's.
71
+ * The font pairings, by the same rule: the base twelve, then the active theme's.
55
72
  *
56
73
  * @throws If called outside a `<ThemeProvider>`.
57
74
  * @example
@@ -60,7 +77,7 @@ function useDensities() {
60
77
  * const sans = useFonts().find((f) => f.name === font)?.stacks["font-sans"];
61
78
  */
62
79
  function useFonts() {
63
- return useRegistry("useFonts").fonts;
80
+ return useRegistry("useFonts", (registry) => registry.fonts);
64
81
  }
65
82
  //#endregion
66
83
  export { ThemeRegistryContext, useDensities, useFonts, useThemes };
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
3
+ import { useRead } from "./published.js";
3
4
  import { DEFAULT_DENSITY, DensityContext } from "./density.js";
4
5
  import { warnOnce } from "./vocabulary.js";
5
6
  import { ThemeRegistryContext } from "./theme-registry.js";
@@ -181,7 +182,7 @@ function measureControlHeight(ladder, density, theme, size) {
181
182
  * });
182
183
  */
183
184
  function useDensity() {
184
- return React.useContext(DensityContext) ?? "compact";
185
+ return useRead(DensityContext) ?? "compact";
185
186
  }
186
187
  /**
187
188
  * The pixel height of a control at the ambient density — what a virtualiser or a
@@ -208,8 +209,8 @@ function useDensity() {
208
209
  */
209
210
  function useControlHeight(size = "md") {
210
211
  const density = useDensity();
211
- const theme = React.useContext(ThemeContext)?.theme ?? null;
212
- const ladder = ladderFor(React.useContext(ThemeRegistryContext), density);
212
+ const theme = useRead(ThemeContext)?.theme ?? null;
213
+ const ladder = ladderFor(useRead(ThemeRegistryContext), density);
213
214
  const { sm, md, lg } = ladder;
214
215
  const [height, setHeight] = React.useState(() => ladder[size] * ASSUMED_ROOT_FONT_SIZE);
215
216
  useIsomorphicLayoutEffect(() => {
@@ -3,8 +3,8 @@ import { ThemeContextValue } from "./theme-provider.js";
3
3
  /**
4
4
  * Read and drive the ambient theme state.
5
5
  *
6
- * Returns `{ theme, manifest, density, mode, font, styleSet, resolvedMode,
7
- * setTheme, setDensity, setMode, setFont, setStyleSet }`.
6
+ * Returns `{ theme, manifest, density, mode, font, styleSet, paint, resolvedMode,
7
+ * setTheme, setDensity, setMode, setFont, setStyleSet, setPaint }`.
8
8
  * `density` here is the *provider's* level — a nested `<Density>` island does not
9
9
  * change it; use `useDensity()` when you want the level that actually applies
10
10
  * where you are. `font` is the pairing the provider holds; it has no island, so
@@ -19,6 +19,9 @@ import { ThemeContextValue } from "./theme-provider.js";
19
19
  * provider included — exactly as the DOM resolves it, so this and the set a
20
20
  * portal or a `<Preview>` stage carries are one value.
21
21
  *
22
+ * `paint` is the pack in force on the same terms: `null` when nothing has
23
+ * chosen one, and the pack stamped around a provider that names none.
24
+ *
22
25
  * @throws If called outside a `<ThemeProvider>`. Theme state is never guessed:
23
26
  * a missing provider is a wiring bug, not a fallback situation.
24
27
  * @example
@@ -1,12 +1,12 @@
1
1
  "use client";
2
+ import { useRead } from "./published.js";
2
3
  import { ThemeContext } from "./theme-provider.js";
3
- import * as React from "react";
4
4
  //#region src/system/use-theme.ts
5
5
  /**
6
6
  * Read and drive the ambient theme state.
7
7
  *
8
- * Returns `{ theme, manifest, density, mode, font, styleSet, resolvedMode,
9
- * setTheme, setDensity, setMode, setFont, setStyleSet }`.
8
+ * Returns `{ theme, manifest, density, mode, font, styleSet, paint, resolvedMode,
9
+ * setTheme, setDensity, setMode, setFont, setStyleSet, setPaint }`.
10
10
  * `density` here is the *provider's* level — a nested `<Density>` island does not
11
11
  * change it; use `useDensity()` when you want the level that actually applies
12
12
  * where you are. `font` is the pairing the provider holds; it has no island, so
@@ -21,6 +21,9 @@ import * as React from "react";
21
21
  * provider included — exactly as the DOM resolves it, so this and the set a
22
22
  * portal or a `<Preview>` stage carries are one value.
23
23
  *
24
+ * `paint` is the pack in force on the same terms: `null` when nothing has
25
+ * chosen one, and the pack stamped around a provider that names none.
26
+ *
24
27
  * @throws If called outside a `<ThemeProvider>`. Theme state is never guessed:
25
28
  * a missing provider is a wiring bug, not a fallback situation.
26
29
  * @example
@@ -28,7 +31,7 @@ import * as React from "react";
28
31
  * <Switch checked={resolvedMode === "light"} onCheckedChange={(on) => setMode(on ? "light" : "dark")} />
29
32
  */
30
33
  function useTheme() {
31
- const context = React.useContext(ThemeContext);
34
+ const context = useRead(ThemeContext);
32
35
  if (context === null) throw new Error("useTheme() must be called inside a <ThemeProvider>.");
33
36
  return context;
34
37
  }
@@ -69,7 +69,7 @@ function vocabulary(themes) {
69
69
  };
70
70
  }
71
71
  /**
72
- * Whether a value is one of the three style sets.
72
+ * Whether a value is one of the eight style sets.
73
73
  *
74
74
  * A standalone function rather than a member of {@link Vocabulary}, and the
75
75
  * asymmetry is the point: every other axis is asked *under a theme*, because a
@@ -83,7 +83,7 @@ function isStyleSet(value) {
83
83
  return typeof value === "string" && STYLE_SETS.includes(value);
84
84
  }
85
85
  /**
86
- * Whether a value is one of the look packs.
86
+ * Whether a value is one of the paint packs.
87
87
  *
88
88
  * Standalone for exactly the reason {@link isStyleSet} is, and the reason reads
89
89
  * the same one axis over: no theme can add a pack. The vocabulary is emitted by
@@ -416,7 +416,8 @@ function radiusBlocks(name, radiusScale) {
416
416
  blocks.push({
417
417
  selector: themeSelector(name, {
418
418
  density: level,
419
- pair: true
419
+ pair: true,
420
+ follows: true
420
421
  }),
421
422
  sections: [{ declarations: [[property, scaled(radiusScale, scale)]] }]
422
423
  });
@@ -485,12 +486,15 @@ function createTheme(anchors) {
485
486
  }];
486
487
  const blocks = [
487
488
  {
488
- selector: themeSelector(name),
489
+ selector: themeSelector(name, { follows: true }),
489
490
  colorScheme: "dark",
490
491
  sections: darkSections
491
492
  },
492
493
  ...lightSections === null ? [] : [{
493
- selector: themeSelector(name, { mode: "light" }),
494
+ selector: themeSelector(name, {
495
+ mode: "light",
496
+ follows: true
497
+ }),
494
498
  colorScheme: "light",
495
499
  sections: lightSections
496
500
  }],
@@ -504,15 +508,17 @@ function createTheme(anchors) {
504
508
  tokens: light.colors,
505
509
  provisional: light.provisional
506
510
  }]];
511
+ const explicitCss = serializeThemeCss(blocks, { banner: `@cueplusplus/ui — theme "${name}"` }).trimEnd();
512
+ const systemScheme = lightSections === null ? "dark" : "light dark";
507
513
  return {
508
514
  name,
509
- css: `${serializeThemeCss(blocks, { banner: `@cueplusplus/ui — theme "${name}"` }).trimEnd()}\n\n${serializeSystemModeAliases(name, [{
515
+ css: `${explicitCss}\n\n${serializeSystemModeAliases(name, [{
510
516
  mode: "dark",
511
- colorScheme: "light dark",
517
+ colorScheme: systemScheme,
512
518
  sections: darkPaletteSections
513
519
  }, {
514
520
  mode: "light",
515
- colorScheme: "light dark",
521
+ colorScheme: systemScheme,
516
522
  sections: lightSections ?? darkPaletteSections
517
523
  }])}\n`,
518
524
  tokens: Object.fromEntries(darkSections.flatMap((section) => section.declarations)),
@@ -56,8 +56,13 @@ declare function assertCssValue(name: string, value: string): string;
56
56
  */
57
57
  declare function tokenProperty(name: string): string;
58
58
  interface ThemeSelectorOptions {
59
- /** Cross with the mode axis. Only `"light"` needs a selector; dark is the base block. */
60
- mode?: "dark" | "light";
59
+ /**
60
+ * Cross with the mode axis. `"dark"` is the base block and needs none;
61
+ * `"light"` does, and so does `"system"` — the block a theme writes once
62
+ * inside each `prefers-color-scheme` query, for a document that stamps
63
+ * `data-mode="system"`.
64
+ */
65
+ mode?: "dark" | "light" | "system";
61
66
  /** Cross with the density axis. Used only for the radius multiplier. */
62
67
  density?: Density;
63
68
  /**
@@ -76,6 +81,31 @@ interface ThemeSelectorOptions {
76
81
  * match the root itself.
77
82
  */
78
83
  pair?: boolean;
84
+ /**
85
+ * Put the follower's twins in front of the selector, one a line, as every
86
+ * stylesheet this library and `@cueplusplus/theme-tools` write does.
87
+ *
88
+ * Under a root `ThemeProvider` that persists, a nested provider or a
89
+ * `Preview` stage that names a theme and not a mode (or a mode and not a
90
+ * theme, or no rung) leaves the axis it did not name to `<html>` until it
91
+ * has mounted: it stamps no `data-mode` (or `data-theme`, or `data-density`)
92
+ * and carries `data-cue-follows` naming what it left out, because on the
93
+ * server the only value it could stamp is the root's default, while `<html>`
94
+ * already carries the visitor's. A compound block such as
95
+ * `[data-theme="x"][data-mode="light"]` does not match such an island; its
96
+ * twin, keyed on `<html>`'s value and the marker, does — at the same
97
+ * specificity, so every precedence relation carries over. Without it a
98
+ * hand-assembled theme paints its dark block for a light visitor until the
99
+ * island mounts.
100
+ *
101
+ * The twins depend on which block this is: the dark block's reaches an
102
+ * island that follows `<html>`'s theme; the light and system blocks' also
103
+ * reach one that follows `<html>`'s mode; a rung's reach one that follows
104
+ * `<html>`'s rung. A mode crossed with a rung is refused with a `TypeError`:
105
+ * an island can follow either axis without the other, so no single list is
106
+ * right for the compound.
107
+ */
108
+ follows?: boolean;
79
109
  }
80
110
  /**
81
111
  * The selector a theme's declarations live under.
@@ -89,6 +119,8 @@ interface ThemeSelectorOptions {
89
119
  * @returns The CSS selector.
90
120
  * @example
91
121
  * themeSelector("acme", { mode: "light" }); // → '[data-theme="acme"][data-mode="light"]'
122
+ * themeSelector("acme", { mode: "light", follows: true });
123
+ * // → ':where(:root[data-theme="acme"]) [data-mode="light"][data-cue-follows~="theme"],\n:where(:root[data-mode="light"]) [data-theme="acme"][data-cue-follows~="mode"],\n[data-theme="acme"][data-mode="light"]'
92
124
  * themeSelector("acme", { density: "compact", pair: true });
93
125
  * // → '[data-theme="acme"] [data-density="compact"]:where([data-cue-theme="acme"]), [data-theme="acme"] [data-density="compact"]:where(:not([data-cue-theme]):not([data-theme]:not([data-theme="acme"])):not([data-theme="acme"] [data-theme]:not([data-theme="acme"]) *)), [data-theme="acme"][data-density="compact"]'
94
126
  */
@@ -83,18 +83,93 @@ function tokenProperty(name) {
83
83
  * @returns The CSS selector.
84
84
  * @example
85
85
  * themeSelector("acme", { mode: "light" }); // → '[data-theme="acme"][data-mode="light"]'
86
+ * themeSelector("acme", { mode: "light", follows: true });
87
+ * // → ':where(:root[data-theme="acme"]) [data-mode="light"][data-cue-follows~="theme"],\n:where(:root[data-mode="light"]) [data-theme="acme"][data-cue-follows~="mode"],\n[data-theme="acme"][data-mode="light"]'
86
88
  * themeSelector("acme", { density: "compact", pair: true });
87
89
  * // → '[data-theme="acme"] [data-density="compact"]:where([data-cue-theme="acme"]), [data-theme="acme"] [data-density="compact"]:where(:not([data-cue-theme]):not([data-theme]:not([data-theme="acme"])):not([data-theme="acme"] [data-theme]:not([data-theme="acme"]) *)), [data-theme="acme"][data-density="compact"]'
88
90
  */
89
91
  function themeSelector(name, options = {}) {
92
+ const { mode, density, follows } = options;
93
+ const crossed = mode === "light" || mode === "system" ? mode : null;
94
+ const selector = compoundSelector(name, options);
95
+ if (follows !== true) return selector;
96
+ if (density !== void 0 && crossed !== null) throw new TypeError(`themeSelector: follows cannot be combined with mode "${crossed}" and density "${density}"; an island can follow either axis without the other`);
97
+ return [...density !== void 0 ? [rungFollowerSelector(name, density), followerSelector(name, "density", density)] : crossed === null ? [themeFollowerSelector(name, null)] : [themeFollowerSelector(name, crossed), followerSelector(name, "mode", crossed)], selector].join(",\n");
98
+ }
99
+ /** {@link themeSelector} without the twins: the compound, and the paired forms beside it. */
100
+ function compoundSelector(name, options) {
90
101
  const { mode, density, pair } = options;
91
102
  const themeAttr = `[data-theme="${name}"]`;
92
- const theme = `${themeAttr}${mode === "light" ? "[data-mode=\"light\"]" : ""}`;
103
+ const theme = `${themeAttr}${mode === "light" || mode === "system" ? `[data-mode="${mode}"]` : ""}`;
93
104
  if (density === void 0) return theme;
94
105
  const crossed = `[data-density="${density}"]`;
95
106
  if (pair !== true) return `${theme}${crossed}`;
96
107
  return `${`${theme} ${crossed}:where([data-cue-theme="${name}"])`}, ${`${theme} ${crossed}:where(:not([data-cue-theme]):not([data-theme]:not(${themeAttr})):not(${themeAttr} [data-theme]:not(${themeAttr}) *))`}, ${theme}${crossed}`;
97
108
  }
109
+ /**
110
+ * The selector a theme island matches while it follows a persisting root's
111
+ * `axis` before it mounts, when `<html>` carries `value` — written first, on
112
+ * its own line, in the selector list of the compound block it stands in for.
113
+ *
114
+ * `ThemeProvider` renders a persisting root's PROPS on the server, while the
115
+ * pre-paint script has already stamped the visitor's stored axes on `<html>`.
116
+ * A nested provider that names a theme and no mode (or no rung), and a
117
+ * `Preview` stage that names a theme and no mode, would have to stamp the only
118
+ * mode it knows there — the root's prop. So until its own layout effect runs it
119
+ * stamps neither `data-mode` nor `data-density` of the root's, and carries
120
+ * `data-cue-follows="mode density"` (the axes it has left to the document)
121
+ * instead. `@cueplusplus/theme-tools`' `follows` emits the same line for every
122
+ * packaged theme, and its docblock carries the argument for anchoring on
123
+ * `:root`: the runtime marks only an axis that is the persisting root's, and
124
+ * that root mirrors the axis onto `<html>`, so `<html>`'s value is the one the
125
+ * island is about to stamp. `:where()` keeps it at the compound's (0,2,0).
126
+ *
127
+ * The public route to it is `themeSelector(name, { mode, follows: true })`,
128
+ * which puts it, and the theme follower's twin, in front of the compound —
129
+ * what `createTheme()` and the system aliases below write. The configurator's
130
+ * override blocks, which name both modes, compose it themselves.
131
+ *
132
+ * @internal Used by package-owned serializers; not part of the public
133
+ * `@cueplusplus/ui/theming` barrel.
134
+ */
135
+ function followerSelector(name, axis, value) {
136
+ return `:where(:root[data-${axis}="${value}"]) [data-theme="${name}"][data-cue-follows~="${axis}"]`;
137
+ }
138
+ /**
139
+ * The same twin one axis over: what an island matches while it follows a
140
+ * persisting root's THEME before it mounts, when `<html>` carries `name` —
141
+ * written first in the selector list of the colour block of theme `name` for
142
+ * the island's own `mode`.
143
+ *
144
+ * A nested provider or a `Preview` stage that names a mode and no theme stamps
145
+ * its mode and, until it mounts, no `data-theme`, carrying
146
+ * `data-cue-follows~="theme"` instead (theme-tools' `followsTheme` is the
147
+ * packaged half, and says why). `mode` is the half of the compound the twin
148
+ * stands in for: `"light"` or `"system"` for those blocks, and `null` for the
149
+ * bare dark block, whose twin asks only that the island carry a mode —
150
+ * `:where([data-mode])`, weightless, so the twin weighs (0,1,0) like
151
+ * `[data-theme="x"]` itself, and the others (0,2,0) like their compounds.
152
+ *
153
+ * @internal Used by package-owned serializers; not part of the public
154
+ * `@cueplusplus/ui/theming` barrel.
155
+ */
156
+ function themeFollowerSelector(name, mode) {
157
+ return `:where(:root[data-theme="${name}"]) ${mode === null ? ":where([data-mode])" : `[data-mode="${mode}"]`}[data-cue-follows~="theme"]`;
158
+ }
159
+ /**
160
+ * The rung twin for an island that follows BOTH the persisting root's theme and
161
+ * its rung before it mounts (a provider that names only a mode): keyed on
162
+ * `<html>`'s theme and rung together, for a theme's own retune of that rung.
163
+ * The rung's base values it re-declares through `@cueplusplus/tokens`' own
164
+ * follower twin; an island that names the theme is reached by
165
+ * {@link followerSelector}'s density form instead.
166
+ *
167
+ * @internal Used by package-owned serializers; not part of the public
168
+ * `@cueplusplus/ui/theming` barrel.
169
+ */
170
+ function rungFollowerSelector(name, density) {
171
+ return `:where(:root[data-theme="${name}"][data-density="${density}"]) [data-cue-follows~="theme"][data-cue-follows~="density"]`;
172
+ }
98
173
  /** The tone vocabulary that gets a soft fill and a soft border in every theme. */
99
174
  const STATUSES = [
100
175
  "ok",
@@ -163,7 +238,11 @@ const HAIRLINE_TEMPLATES = [
163
238
  const DERIVED_TOKEN_TEMPLATES = [
164
239
  ["accent-soft", "color-mix(in oklch, var(--cue-accent) 14%, transparent)"],
165
240
  ...TINTED.flatMap((tone) => [[`${tone}-soft`, `color-mix(in oklch, var(--cue-${tone}) 12%, transparent)`], [`${tone}-border`, `color-mix(in oklch, var(--cue-${tone}) 35%, transparent)`]]),
166
- ...HAIRLINE_TEMPLATES
241
+ ...HAIRLINE_TEMPLATES,
242
+ ["accent-fill", "var(--cue-accent)"],
243
+ ["accent-fill-fg", "var(--cue-accent-fg)"],
244
+ ["accent-fill-hover", "var(--cue-accent-hover)"],
245
+ ["shade", "var(--cue-fg)"]
167
246
  ];
168
247
  /**
169
248
  * {@link DERIVED_TOKEN_TEMPLATES} as a property → value map.
@@ -218,7 +297,10 @@ function serializeSystemModeAliases(theme, aliases) {
218
297
  const name = assertThemeName(theme);
219
298
  return aliases.map(({ mode, colorScheme, sections }) => {
220
299
  return `@media (prefers-color-scheme: ${mode}) {\n${indentRule(serializeThemeBlock({
221
- selector: `[data-theme="${name}"][data-mode="system"]`,
300
+ selector: themeSelector(name, {
301
+ mode: "system",
302
+ follows: true
303
+ }),
222
304
  colorScheme,
223
305
  sections
224
306
  }))}\n}`;
@@ -238,4 +320,4 @@ function serializeThemeCss(blocks, options = {}) {
238
320
  return `${[...options.banner === void 0 ? [] : [`/*! ${options.banner}\n * Generated by createTheme(). Do not edit by hand.\n */`], ...rules].join("\n\n")}\n`;
239
321
  }
240
322
  //#endregion
241
- export { CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, RESOLVED_MONO, THEME_NAME_PATTERN$1 as THEME_NAME_PATTERN, assertCssValue, assertThemeName, derivedTokens, serializeSystemModeAliases, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty };
323
+ export { CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, RESOLVED_MONO, THEME_NAME_PATTERN$1 as THEME_NAME_PATTERN, assertCssValue, assertThemeName, derivedTokens, followerSelector, rungFollowerSelector, serializeSystemModeAliases, serializeThemeBlock, serializeThemeCss, themeFollowerSelector, themeSelector, tokenProperty };
@@ -130,12 +130,13 @@
130
130
  "variants": {},
131
131
  "defaultVariants": {},
132
132
  "tokensUsed": [
133
- "--cue-accent",
134
133
  "--cue-border",
135
134
  "--cue-control-md",
136
135
  "--cue-fg",
137
136
  "--cue-fg-muted",
138
137
  "--cue-fg-subtle",
138
+ "--cue-focus",
139
+ "--cue-focus-ring",
139
140
  "--cue-font-mono",
140
141
  "--cue-icon-sm",
141
142
  "--cue-leading-ui",
@@ -143,6 +144,11 @@
143
144
  "--cue-space-1",
144
145
  "--cue-space-3",
145
146
  "--cue-space-4",
147
+ "--cue-style-collapse-height",
148
+ "--cue-style-control-face",
149
+ "--cue-style-focus-width",
150
+ "--cue-style-label-weight",
151
+ "--cue-style-quiet-ink",
146
152
  "--cue-text-ui"
147
153
  ],
148
154
  "summary": "A stack of sections, one or several open at a time.",
@@ -111,8 +111,11 @@
111
111
  "--cue-control-md",
112
112
  "--cue-control-sm",
113
113
  "--cue-fg-muted",
114
+ "--cue-focus",
115
+ "--cue-focus-ring",
114
116
  "--cue-font-mono",
115
117
  "--cue-icon-sm",
118
+ "--cue-style-focus-width",
116
119
  "--cue-surface-2",
117
120
  "--cue-surface-3",
118
121
  "--cue-text-label",
@@ -174,19 +174,56 @@
174
174
  "--cue-fg-subtle",
175
175
  "--cue-font-mono",
176
176
  "--cue-leading-ui",
177
+ "--cue-paint-rim-width",
178
+ "--cue-paint-scrim-filter",
179
+ "--cue-paint-shade-far",
180
+ "--cue-paint-shade-hairline",
181
+ "--cue-paint-shade-near",
182
+ "--cue-paint-shadow-scale",
183
+ "--cue-paint-shadow-spread",
184
+ "--cue-paint-sheen-ink",
185
+ "--cue-paint-stroke-angle",
186
+ "--cue-paint-stroke-overlay-from",
187
+ "--cue-paint-stroke-overlay-to",
188
+ "--cue-paint-stroke-width",
177
189
  "--cue-radius-control",
178
190
  "--cue-radius-overlay",
191
+ "--cue-radius-scale",
179
192
  "--cue-scrim",
180
193
  "--cue-space-1",
181
194
  "--cue-space-2",
182
195
  "--cue-space-3",
183
196
  "--cue-space-4",
184
197
  "--cue-space-6",
198
+ "--cue-style-body-face",
199
+ "--cue-style-body-leading",
200
+ "--cue-style-body-size",
201
+ "--cue-style-body-weight",
202
+ "--cue-style-control-face",
203
+ "--cue-style-display-variation",
204
+ "--cue-style-heading-ink",
205
+ "--cue-style-label-case",
206
+ "--cue-style-label-face",
207
+ "--cue-style-label-ink",
208
+ "--cue-style-label-size",
209
+ "--cue-style-label-tracking",
210
+ "--cue-style-label-weight",
211
+ "--cue-style-menu-highlight",
212
+ "--cue-style-menu-item-radius",
213
+ "--cue-style-overlay-ground",
214
+ "--cue-style-overlay-title-leading",
215
+ "--cue-style-overlay-title-size",
216
+ "--cue-style-quiet-ink",
217
+ "--cue-style-title-face",
218
+ "--cue-style-title-weight",
185
219
  "--cue-surface-2",
186
220
  "--cue-text-emphasis",
187
221
  "--cue-text-label",
222
+ "--cue-text-micro",
188
223
  "--cue-text-ui",
189
- "--cue-tracking-caps"
224
+ "--cue-tracking-caps",
225
+ "--cue-tracking-caps-loose",
226
+ "--cue-tracking-caps-tight"
190
227
  ],
191
228
  "summary": "A modal that asks one question with two answers, for anything irreversible.",
192
229
  "examples": [
@@ -20,7 +20,7 @@
20
20
  {
21
21
  "name": "Root",
22
22
  "usage": "AppBar.Root",
23
- "description": "The bar across the top of a document: brand, navigation, actions.\n\nOne rung of the chrome ladder tall, from `--cue-chrome-toolbar` — the same\ntoken `Toolbar` and the docs site's hand-rolled header use, so a page that\nstacks a bar on a toolbar gets two equal strips rather than two guesses.\n\nSticky by default, and translucent because of it: a bar pinned over scrolling\ncontent needs a ground, and `bg-surface-1/95` plus `backdrop-blur` says\n\"there is content under this\" where an opaque fill would claim the content\nends here. `z-40` is above the page and below the `z-50` this library's\noverlays float at, so a menu opened from the bar is never behind it.\n\n**This is a bar, not a menu.** `NavigationMenu` is the mega-menu — triggers\nthat open panels — and it goes *inside* an `AppBar.Nav` when a section has\nchildren. This component is the strip it sits in.\n\nStatic markup — no `\"use client\"` on this module, deliberately: a site header\nis where a framework reads its data, so the bar has to be renderable from a\nserver component. The one part with state is the navigation's scroller, and\nthe client boundary is drawn around that alone (`_edge-scroller.tsx`).\n\nIt adds **no viewport breakpoint**. `AppShell` holds the library's only one,\nfor navigation shape, and a horizontal bar does not need it: the brand and\nthe actions are `shrink-0`, the navigation between them takes the remaining\nwidth and scrolls inside it, so a 390px viewport gets the same bar with a\nshorter window onto the same links rather than a second layout to maintain.",
23
+ "description": "The bar across the top of a document: brand, navigation, actions.\n\nOne rung of the chrome ladder tall, from `--cue-chrome-toolbar` — the same\ntoken `Toolbar` and the docs site's hand-rolled header use, so a page that\nstacks a bar on a toolbar gets two equal strips rather than two guesses.\nA style set may make it taller, lighten, drop or dash its rule and widen its\ninline inset (`style-appbar-height`, `style-chrome-rule`,\n`style-chrome-rule-style`, `style-appbar-inset`); under a set that names\nnone of them it is exactly this.\n\nSticky by default, and translucent because of it: a bar pinned over scrolling\ncontent needs a ground, and `bg-surface-1/95` plus `backdrop-blur` says\n\"there is content under this\" where an opaque fill would claim the content\nends here. `z-40` is above the page and below the `z-50` this library's\noverlays float at, so a menu opened from the bar is never behind it.\n\n**This is a bar, not a menu.** `NavigationMenu` is the mega-menu — triggers\nthat open panels — and it goes *inside* an `AppBar.Nav` when a section has\nchildren. This component is the strip it sits in.\n\nStatic markup — no `\"use client\"` on this module, deliberately: a site header\nis where a framework reads its data, so the bar has to be renderable from a\nserver component. The one part with state is the navigation's scroller, and\nthe client boundary is drawn around that alone (`_edge-scroller.tsx`).\n\nIt adds **no viewport breakpoint**. `AppShell` holds the library's only one,\nfor navigation shape, and a horizontal bar does not need it: the brand and\nthe actions are `shrink-0`, the navigation between them takes the remaining\nwidth and scrolls inside it, so a 390px viewport gets the same bar with a\nshorter window onto the same links rather than a second layout to maintain.",
24
24
  "props": [
25
25
  {
26
26
  "name": "sticky",
@@ -140,7 +140,7 @@
140
140
  {
141
141
  "name": "Link",
142
142
  "usage": "AppBar.Link",
143
- "description": "One destination in the bar.\n\nA `Link`, so `render={<NextLink href=\"/x\" />}` composes it with a router and\n`external` gives an outbound link its `↗`, plus the bar's type register and\nthe `shrink-0` that keeps a label from being squeezed into an ellipsis while\nthe navigation around it scrolls.",
143
+ "description": "One destination in the bar.\n\nA `Link`, so `render={<NextLink href=\"/x\" />}` composes it with a router and\n`external` gives an outbound link its `↗`, plus the bar's type register and\nthe `shrink-0` that keeps a label from being squeezed into an ellipsis while\nthe navigation around it scrolls.\n\nThe register is mono at the UI size by default. A style set may change its\nface, case, tracking, size and weight, pad it, and give it a hover ground\n(the `style-nav-*` names), which is how a Look's header links follow it.",
144
144
  "props": [
145
145
  {
146
146
  "name": "register",
@@ -230,11 +230,32 @@
230
230
  "--cue-edge-fade",
231
231
  "--cue-fg",
232
232
  "--cue-fg-muted",
233
+ "--cue-focus",
234
+ "--cue-focus-ring",
233
235
  "--cue-font-mono",
234
236
  "--cue-icon-sm",
237
+ "--cue-paint-fade-length",
238
+ "--cue-paint-glass-fallback-ink",
239
+ "--cue-paint-glass-filter",
240
+ "--cue-paint-glass-ink",
241
+ "--cue-radius-control",
235
242
  "--cue-space-3",
236
243
  "--cue-space-4",
237
244
  "--cue-space-5",
245
+ "--cue-style-appbar-height",
246
+ "--cue-style-appbar-inset",
247
+ "--cue-style-chrome-rule",
248
+ "--cue-style-chrome-rule-style",
249
+ "--cue-style-focus-width",
250
+ "--cue-style-hover-ink",
251
+ "--cue-style-nav-case",
252
+ "--cue-style-nav-face",
253
+ "--cue-style-nav-hover-ground",
254
+ "--cue-style-nav-pad",
255
+ "--cue-style-nav-size",
256
+ "--cue-style-nav-tracking",
257
+ "--cue-style-nav-weight",
258
+ "--cue-style-quiet-ink",
238
259
  "--cue-surface-1",
239
260
  "--cue-text-ui"
240
261
  ],
@@ -417,6 +417,11 @@
417
417
  "--cue-font-mono",
418
418
  "--cue-nav-width",
419
419
  "--cue-pad-row-x",
420
+ "--cue-paint-fade",
421
+ "--cue-paint-texture",
422
+ "--cue-paint-texture-blend",
423
+ "--cue-paint-texture-opacity",
424
+ "--cue-paint-texture-size",
420
425
  "--cue-space-3",
421
426
  "--cue-space-4",
422
427
  "--cue-space-5",
@@ -241,11 +241,12 @@
241
241
  "variants": {},
242
242
  "defaultVariants": {},
243
243
  "tokensUsed": [
244
- "--cue-accent",
245
244
  "--cue-border",
246
245
  "--cue-fg",
247
246
  "--cue-fg-muted",
248
247
  "--cue-fg-subtle",
248
+ "--cue-focus",
249
+ "--cue-focus-ring",
249
250
  "--cue-font-mono",
250
251
  "--cue-icon-sm",
251
252
  "--cue-leading-ui",
@@ -254,6 +255,7 @@
254
255
  "--cue-space-2",
255
256
  "--cue-space-3",
256
257
  "--cue-space-4",
258
+ "--cue-style-focus-width",
257
259
  "--cue-surface-1",
258
260
  "--cue-text-body",
259
261
  "--cue-text-label",