@cueplusplus/ui 0.2.0 → 0.5.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 (628) hide show
  1. package/CHANGELOG.md +2250 -0
  2. package/dist/agent-runtime/_glyphs.js +43 -0
  3. package/dist/agent-runtime/branch-picker.d.ts +45 -0
  4. package/dist/agent-runtime/branch-picker.js +87 -0
  5. package/dist/agent-runtime/index.d.ts +4 -0
  6. package/dist/agent-runtime/index.js +4 -0
  7. package/dist/agent-runtime/tool-call-card.d.ts +69 -0
  8. package/dist/agent-runtime/tool-call-card.js +187 -0
  9. package/dist/agent-runtime/use-agent-thread.d.ts +164 -0
  10. package/dist/agent-runtime/use-agent-thread.js +251 -0
  11. package/dist/brand/_chassis.d.ts +1 -1
  12. package/dist/brand/cue-mark.d.ts +1 -1
  13. package/dist/brand/cue-mark.js +1 -1
  14. package/dist/chat/index.d.ts +2 -2
  15. package/dist/chat/message-list.d.ts +6 -0
  16. package/dist/chat/message-list.js +35 -0
  17. package/dist/chrome/_edge-scroller.js +12 -1
  18. package/dist/chrome/_tabs-scroll.d.ts +1 -1
  19. package/dist/chrome/_tabs-scroll.js +1 -1
  20. package/dist/chrome/app-shell.d.ts +52 -2
  21. package/dist/chrome/app-shell.js +80 -8
  22. package/dist/chrome/index.d.ts +2 -2
  23. package/dist/configurator/_export.js +3 -2
  24. package/dist/configurator/_overrides.d.ts +1 -1
  25. package/dist/configurator/_overrides.js +18 -6
  26. package/dist/configurator/token-editor.js +4 -1
  27. package/dist/date/_segments.js +37 -2
  28. package/dist/elements/activity-graph.d.ts +40 -0
  29. package/dist/elements/activity-graph.js +81 -0
  30. package/dist/elements/agent-card.d.ts +49 -0
  31. package/dist/elements/agent-card.js +91 -0
  32. package/dist/elements/agent-handoff.d.ts +24 -0
  33. package/dist/elements/agent-handoff.js +53 -0
  34. package/dist/elements/agent-mode-badge.d.ts +72 -0
  35. package/dist/elements/agent-mode-badge.js +110 -0
  36. package/dist/elements/agent-plan.d.ts +24 -0
  37. package/dist/elements/agent-plan.js +74 -0
  38. package/dist/elements/agent-status.d.ts +29 -0
  39. package/dist/elements/agent-status.js +46 -0
  40. package/dist/elements/agent-surface.d.ts +65 -0
  41. package/dist/elements/agent-surface.js +68 -0
  42. package/dist/elements/animated-number.d.ts +86 -0
  43. package/dist/elements/animated-number.js +118 -0
  44. package/dist/elements/approval-card.d.ts +40 -0
  45. package/dist/elements/approval-card.js +78 -0
  46. package/dist/elements/artifact-card.d.ts +30 -0
  47. package/dist/elements/artifact-card.js +58 -0
  48. package/dist/elements/background-inbox.d.ts +39 -0
  49. package/dist/elements/background-inbox.js +60 -0
  50. package/dist/elements/canvas-split.d.ts +77 -0
  51. package/dist/elements/canvas-split.js +138 -0
  52. package/dist/elements/chart.d.ts +41 -0
  53. package/dist/elements/chart.js +117 -0
  54. package/dist/elements/chat-panel.d.ts +46 -0
  55. package/dist/elements/chat-panel.js +104 -0
  56. package/dist/elements/checkpoint-history.d.ts +31 -0
  57. package/dist/elements/checkpoint-history.js +65 -0
  58. package/dist/elements/clamp.d.ts +90 -0
  59. package/dist/elements/clamp.js +109 -0
  60. package/dist/elements/code-diff.d.ts +42 -0
  61. package/dist/elements/code-diff.js +69 -0
  62. package/dist/elements/code-runner.d.ts +38 -0
  63. package/dist/elements/code-runner.js +84 -0
  64. package/dist/elements/command-palette.d.ts +48 -0
  65. package/dist/elements/command-palette.js +129 -0
  66. package/dist/elements/compaction-row.d.ts +63 -0
  67. package/dist/elements/compaction-row.js +110 -0
  68. package/dist/elements/comparison-card.d.ts +47 -0
  69. package/dist/elements/comparison-card.js +69 -0
  70. package/dist/elements/composer.d.ts +274 -0
  71. package/dist/elements/composer.js +505 -0
  72. package/dist/elements/computer-use.d.ts +40 -0
  73. package/dist/elements/computer-use.js +92 -0
  74. package/dist/elements/confidence-marker.d.ts +39 -0
  75. package/dist/elements/confidence-marker.js +64 -0
  76. package/dist/elements/connection-state.d.ts +29 -0
  77. package/dist/elements/connection-state.js +66 -0
  78. package/dist/elements/context-breakdown.d.ts +30 -0
  79. package/dist/elements/context-breakdown.js +86 -0
  80. package/dist/elements/context-usage.d.ts +99 -0
  81. package/dist/elements/context-usage.js +225 -0
  82. package/dist/elements/conversation-search.d.ts +48 -0
  83. package/dist/elements/conversation-search.js +88 -0
  84. package/dist/elements/cost-meter.d.ts +33 -0
  85. package/dist/elements/cost-meter.js +75 -0
  86. package/dist/elements/data-table.d.ts +31 -0
  87. package/dist/elements/data-table.js +67 -0
  88. package/dist/elements/day-separator.d.ts +34 -0
  89. package/dist/elements/day-separator.js +50 -0
  90. package/dist/elements/diagram.d.ts +34 -0
  91. package/dist/elements/diagram.js +75 -0
  92. package/dist/elements/document-reference.d.ts +37 -0
  93. package/dist/elements/document-reference.js +66 -0
  94. package/dist/elements/draft-restore.d.ts +27 -0
  95. package/dist/elements/draft-restore.js +54 -0
  96. package/dist/elements/edit-message.d.ts +36 -0
  97. package/dist/elements/edit-message.js +77 -0
  98. package/dist/elements/elements.css +459 -0
  99. package/dist/elements/elicitation-form.d.ts +48 -0
  100. package/dist/elements/elicitation-form.js +106 -0
  101. package/dist/elements/empty-state.d.ts +52 -0
  102. package/dist/elements/empty-state.js +98 -0
  103. package/dist/elements/end-of-turn-summary.d.ts +60 -0
  104. package/dist/elements/end-of-turn-summary.js +75 -0
  105. package/dist/elements/error-state.d.ts +29 -0
  106. package/dist/elements/error-state.js +55 -0
  107. package/dist/elements/feedback-dialog.d.ts +36 -0
  108. package/dist/elements/feedback-dialog.js +81 -0
  109. package/dist/elements/file-tree.d.ts +45 -0
  110. package/dist/elements/file-tree.js +84 -0
  111. package/dist/elements/flow-graph.d.ts +45 -0
  112. package/dist/elements/flow-graph.js +78 -0
  113. package/dist/elements/generative/chart.js +200 -0
  114. package/dist/elements/generative/faults.js +111 -0
  115. package/dist/elements/generative/icons.d.ts +41 -0
  116. package/dist/elements/generative/icons.js +190 -0
  117. package/dist/elements/generative/intrinsics.js +483 -0
  118. package/dist/elements/generative/spec.d.ts +110 -0
  119. package/dist/elements/generative/spec.js +366 -0
  120. package/dist/elements/generative.css +1145 -0
  121. package/dist/elements/generative.d.ts +144 -0
  122. package/dist/elements/generative.js +126 -0
  123. package/dist/elements/guardrail-notice.d.ts +29 -0
  124. package/dist/elements/guardrail-notice.js +63 -0
  125. package/dist/elements/image-generation.d.ts +18 -0
  126. package/dist/elements/image-generation.js +64 -0
  127. package/dist/elements/index.d.ts +116 -0
  128. package/dist/elements/index.js +115 -0
  129. package/dist/elements/inline-citation.d.ts +43 -0
  130. package/dist/elements/inline-citation.js +93 -0
  131. package/dist/elements/job-progress.d.ts +49 -0
  132. package/dist/elements/job-progress.js +74 -0
  133. package/dist/elements/launcher-bubble.d.ts +34 -0
  134. package/dist/elements/launcher-bubble.js +72 -0
  135. package/dist/elements/live-region-announcer.d.ts +130 -0
  136. package/dist/elements/live-region-announcer.js +230 -0
  137. package/dist/elements/loading-state.d.ts +27 -0
  138. package/dist/elements/loading-state.js +36 -0
  139. package/dist/elements/map-answer.d.ts +38 -0
  140. package/dist/elements/map-answer.js +93 -0
  141. package/dist/elements/markdown.d.ts +131 -0
  142. package/dist/elements/markdown.js +528 -0
  143. package/dist/elements/math-block.d.ts +51 -0
  144. package/dist/elements/math-block.js +70 -0
  145. package/dist/elements/mcp-server-panel.d.ts +41 -0
  146. package/dist/elements/mcp-server-panel.js +115 -0
  147. package/dist/elements/memory-chips.d.ts +30 -0
  148. package/dist/elements/memory-chips.js +43 -0
  149. package/dist/elements/message-actions.d.ts +38 -0
  150. package/dist/elements/message-actions.js +71 -0
  151. package/dist/elements/message-attachment.d.ts +48 -0
  152. package/dist/elements/message-attachment.js +63 -0
  153. package/dist/elements/message-branches.d.ts +25 -0
  154. package/dist/elements/message-branches.js +65 -0
  155. package/dist/elements/message-pair.d.ts +33 -0
  156. package/dist/elements/message-pair.js +65 -0
  157. package/dist/elements/message-queue.d.ts +31 -0
  158. package/dist/elements/message-queue.js +80 -0
  159. package/dist/elements/message-timing.d.ts +33 -0
  160. package/dist/elements/message-timing.js +37 -0
  161. package/dist/elements/mobile-composer.d.ts +44 -0
  162. package/dist/elements/mobile-composer.js +88 -0
  163. package/dist/elements/model-picker.d.ts +38 -0
  164. package/dist/elements/model-picker.js +69 -0
  165. package/dist/elements/number-ticker.d.ts +18 -0
  166. package/dist/elements/number-ticker.js +47 -0
  167. package/dist/elements/onboarding.d.ts +30 -0
  168. package/dist/elements/onboarding.js +75 -0
  169. package/dist/elements/permission-grant.d.ts +35 -0
  170. package/dist/elements/permission-grant.js +86 -0
  171. package/dist/elements/permission-scopes.d.ts +215 -0
  172. package/dist/elements/permission-scopes.js +249 -0
  173. package/dist/elements/prompt-library.d.ts +43 -0
  174. package/dist/elements/prompt-library.js +117 -0
  175. package/dist/elements/queue-dock.d.ts +101 -0
  176. package/dist/elements/queue-dock.js +132 -0
  177. package/dist/elements/quota-banner.d.ts +26 -0
  178. package/dist/elements/quota-banner.js +66 -0
  179. package/dist/elements/quote-reply.d.ts +44 -0
  180. package/dist/elements/quote-reply.js +79 -0
  181. package/dist/elements/range.d.ts +29 -0
  182. package/dist/elements/range.js +45 -0
  183. package/dist/elements/read-aloud.d.ts +45 -0
  184. package/dist/elements/read-aloud.js +75 -0
  185. package/dist/elements/reasoning-effort.d.ts +36 -0
  186. package/dist/elements/reasoning-effort.js +67 -0
  187. package/dist/elements/reasoning-panel.d.ts +46 -0
  188. package/dist/elements/reasoning-panel.js +75 -0
  189. package/dist/elements/recommendation-card.d.ts +45 -0
  190. package/dist/elements/recommendation-card.js +83 -0
  191. package/dist/elements/regenerate-menu.d.ts +45 -0
  192. package/dist/elements/regenerate-menu.js +51 -0
  193. package/dist/elements/replay.d.ts +217 -0
  194. package/dist/elements/replay.js +498 -0
  195. package/dist/elements/research-report.d.ts +38 -0
  196. package/dist/elements/research-report.js +69 -0
  197. package/dist/elements/retrieval-chunks.d.ts +43 -0
  198. package/dist/elements/retrieval-chunks.js +81 -0
  199. package/dist/elements/revert-dock.d.ts +159 -0
  200. package/dist/elements/revert-dock.js +327 -0
  201. package/dist/elements/reviewable-diff.d.ts +45 -0
  202. package/dist/elements/reviewable-diff.js +110 -0
  203. package/dist/elements/risk-badge.d.ts +52 -0
  204. package/dist/elements/risk-badge.js +91 -0
  205. package/dist/elements/schedule-card.d.ts +42 -0
  206. package/dist/elements/schedule-card.js +90 -0
  207. package/dist/elements/score-breakdown.d.ts +47 -0
  208. package/dist/elements/score-breakdown.js +82 -0
  209. package/dist/elements/scroll-anchor.d.ts +32 -0
  210. package/dist/elements/scroll-anchor.js +121 -0
  211. package/dist/elements/settings-panel.d.ts +52 -0
  212. package/dist/elements/settings-panel.js +107 -0
  213. package/dist/elements/shared-conversation.d.ts +39 -0
  214. package/dist/elements/shared-conversation.js +68 -0
  215. package/dist/elements/sources.d.ts +33 -0
  216. package/dist/elements/sources.js +61 -0
  217. package/dist/elements/speaker-identity.d.ts +32 -0
  218. package/dist/elements/speaker-identity.js +51 -0
  219. package/dist/elements/spec-sheet.d.ts +31 -0
  220. package/dist/elements/spec-sheet.js +45 -0
  221. package/dist/elements/stopped-run.d.ts +22 -0
  222. package/dist/elements/stopped-run.js +50 -0
  223. package/dist/elements/streaming-text.d.ts +31 -0
  224. package/dist/elements/streaming-text.js +45 -0
  225. package/dist/elements/subagent-list.d.ts +37 -0
  226. package/dist/elements/subagent-list.js +79 -0
  227. package/dist/elements/suggestions.d.ts +30 -0
  228. package/dist/elements/suggestions.js +36 -0
  229. package/dist/elements/surfaces.d.ts +85 -0
  230. package/dist/elements/surfaces.js +107 -0
  231. package/dist/elements/tail-status.d.ts +131 -0
  232. package/dist/elements/tail-status.js +94 -0
  233. package/dist/elements/terminal-block.d.ts +29 -0
  234. package/dist/elements/terminal-block.js +54 -0
  235. package/dist/elements/thinking-indicator.d.ts +18 -0
  236. package/dist/elements/thinking-indicator.js +36 -0
  237. package/dist/elements/thread-list.d.ts +35 -0
  238. package/dist/elements/thread-list.js +68 -0
  239. package/dist/elements/thread-search.d.ts +42 -0
  240. package/dist/elements/thread-search.js +99 -0
  241. package/dist/elements/timeline.d.ts +37 -0
  242. package/dist/elements/timeline.js +46 -0
  243. package/dist/elements/todo-list.d.ts +42 -0
  244. package/dist/elements/todo-list.js +59 -0
  245. package/dist/elements/tool-call.d.ts +41 -0
  246. package/dist/elements/tool-call.js +85 -0
  247. package/dist/elements/tool-error.d.ts +39 -0
  248. package/dist/elements/tool-error.js +76 -0
  249. package/dist/elements/tool-group.d.ts +45 -0
  250. package/dist/elements/tool-group.js +71 -0
  251. package/dist/elements/tool-timeline.d.ts +65 -0
  252. package/dist/elements/tool-timeline.js +88 -0
  253. package/dist/elements/trace-waterfall.d.ts +37 -0
  254. package/dist/elements/trace-waterfall.js +69 -0
  255. package/dist/elements/transcript-rules.d.ts +67 -0
  256. package/dist/elements/transcript-rules.js +95 -0
  257. package/dist/elements/turn-footer.d.ts +74 -0
  258. package/dist/elements/turn-footer.js +101 -0
  259. package/dist/elements/typing-indicator.d.ts +16 -0
  260. package/dist/elements/typing-indicator.js +51 -0
  261. package/dist/elements/verdict-row.d.ts +89 -0
  262. package/dist/elements/verdict-row.js +150 -0
  263. package/dist/elements/vocabulary.d.ts +612 -0
  264. package/dist/elements/vocabulary.js +611 -0
  265. package/dist/elements/voice-conversation.d.ts +49 -0
  266. package/dist/elements/voice-conversation.js +123 -0
  267. package/dist/elements/web-preview.d.ts +32 -0
  268. package/dist/elements/web-preview.js +66 -0
  269. package/dist/elements/web-search.d.ts +37 -0
  270. package/dist/elements/web-search.js +66 -0
  271. package/dist/elements/work-collapse.d.ts +103 -0
  272. package/dist/elements/work-collapse.js +131 -0
  273. package/dist/icons/containers.d.ts +89 -0
  274. package/dist/icons/containers.js +295 -0
  275. package/dist/icons/index.d.ts +2 -0
  276. package/dist/index.d.ts +9 -7
  277. package/dist/index.js +3 -2
  278. package/dist/instruments/index.d.ts +2 -2
  279. package/dist/instruments/index.js +2 -2
  280. package/dist/instruments/table.d.ts +14 -1
  281. package/dist/instruments/table.js +20 -1
  282. package/dist/instruments/two-step-button.js +25 -6
  283. package/dist/layout/sidebar.d.ts +19 -1
  284. package/dist/layout/sidebar.js +19 -1
  285. package/dist/primitives/button.js +11 -1
  286. package/dist/primitives/chip.d.ts +34 -8
  287. package/dist/primitives/chip.js +97 -11
  288. package/dist/styles.css +11 -1
  289. package/dist/system/agent-skin.d.ts +27 -0
  290. package/dist/system/agent-skin.js +20 -0
  291. package/dist/system/index.d.ts +3 -3
  292. package/dist/system/portal.d.ts +5 -3
  293. package/dist/system/portal.js +36 -8
  294. package/dist/system/prepaint.d.ts +20 -2
  295. package/dist/system/prepaint.js +39 -33
  296. package/dist/system/theme-provider.d.ts +13 -2
  297. package/dist/system/theme-provider.js +107 -26
  298. package/dist/system/use-density.d.ts +9 -0
  299. package/dist/system/use-density.js +9 -0
  300. package/dist/system/use-isomorphic-layout-effect.js +19 -1
  301. package/dist/theming/_presets.d.ts +1 -1
  302. package/dist/theming/_presets.js +124 -8
  303. package/dist/theming/contrast.d.ts +16 -4
  304. package/dist/theming/contrast.js +33 -6
  305. package/dist/theming/create-theme.d.ts +8 -4
  306. package/dist/theming/create-theme.js +56 -20
  307. package/dist/theming/serialize.d.ts +11 -2
  308. package/dist/theming/serialize.js +87 -9
  309. package/manifest/components/accordion.json +154 -0
  310. package/manifest/components/activity-graph.json +88 -0
  311. package/manifest/components/agent-card.json +120 -0
  312. package/manifest/components/agent-handoff.json +87 -0
  313. package/manifest/components/agent-mode-badge.json +84 -0
  314. package/manifest/components/agent-pile.json +116 -0
  315. package/manifest/components/agent-plan.json +67 -0
  316. package/manifest/components/agent-status.json +73 -0
  317. package/manifest/components/agent-surface.json +78 -0
  318. package/manifest/components/alert-dialog.json +190 -0
  319. package/manifest/components/animated-number.json +67 -0
  320. package/manifest/components/app-bar.json +244 -0
  321. package/manifest/components/app-shell.json +383 -0
  322. package/manifest/components/app-window-frame.json +102 -0
  323. package/manifest/components/approval-card.json +106 -0
  324. package/manifest/components/artifact-card.json +81 -0
  325. package/manifest/components/ask-box.json +209 -0
  326. package/manifest/components/audience-icon.json +52 -0
  327. package/manifest/components/autocomplete.json +197 -0
  328. package/manifest/components/avatar-group.json +72 -0
  329. package/manifest/components/avatar.json +95 -0
  330. package/manifest/components/background-inbox.json +71 -0
  331. package/manifest/components/branch-picker.json +124 -0
  332. package/manifest/components/breadcrumb.json +74 -0
  333. package/manifest/components/button-group.json +74 -0
  334. package/manifest/components/button.json +126 -0
  335. package/manifest/components/calendar.json +65 -0
  336. package/manifest/components/canvas-split-body.json +62 -0
  337. package/manifest/components/canvas-split-document.json +54 -0
  338. package/manifest/components/canvas-split-header.json +83 -0
  339. package/manifest/components/canvas-split-line.json +62 -0
  340. package/manifest/components/canvas-split-message.json +62 -0
  341. package/manifest/components/canvas-split-thread.json +54 -0
  342. package/manifest/components/canvas-split.json +60 -0
  343. package/manifest/components/card.json +140 -0
  344. package/manifest/components/carousel.json +200 -0
  345. package/manifest/components/catalogue-icon.json +52 -0
  346. package/manifest/components/channel-beta-icon.json +52 -0
  347. package/manifest/components/channel-matrix.json +173 -0
  348. package/manifest/components/channel-released-icon.json +52 -0
  349. package/manifest/components/chart-container.json +111 -0
  350. package/manifest/components/chart-ramp.json +72 -0
  351. package/manifest/components/chart-swatch.json +65 -0
  352. package/manifest/components/chart-tooltip-content.json +114 -0
  353. package/manifest/components/chart.json +93 -0
  354. package/manifest/components/chat-empty-state.json +55 -0
  355. package/manifest/components/chat-panel-assistant-message.json +51 -0
  356. package/manifest/components/chat-panel-composer.json +66 -0
  357. package/manifest/components/chat-panel-messages.json +51 -0
  358. package/manifest/components/chat-panel-typing.json +51 -0
  359. package/manifest/components/chat-panel-user-message.json +51 -0
  360. package/manifest/components/chat-panel.json +57 -0
  361. package/manifest/components/checkbox-group.json +68 -0
  362. package/manifest/components/checkbox.json +93 -0
  363. package/manifest/components/checkpoint-history.json +80 -0
  364. package/manifest/components/chip.json +144 -0
  365. package/manifest/components/clamp.json +102 -0
  366. package/manifest/components/cli-tool-icon.json +52 -0
  367. package/manifest/components/code-diff.json +87 -0
  368. package/manifest/components/code-runner.json +97 -0
  369. package/manifest/components/collapsible.json +120 -0
  370. package/manifest/components/color-area.json +59 -0
  371. package/manifest/components/color-field.json +79 -0
  372. package/manifest/components/color-picker.json +175 -0
  373. package/manifest/components/color-slider.json +75 -0
  374. package/manifest/components/color-swatch.json +68 -0
  375. package/manifest/components/colors-section.json +66 -0
  376. package/manifest/components/combobox.json +198 -0
  377. package/manifest/components/command-palette.json +177 -0
  378. package/manifest/components/compaction-row.json +100 -0
  379. package/manifest/components/comparison-card.json +83 -0
  380. package/manifest/components/composer-actions.json +65 -0
  381. package/manifest/components/composer-attach-button.json +65 -0
  382. package/manifest/components/composer-attachment-chip.json +75 -0
  383. package/manifest/components/composer-attachments.json +60 -0
  384. package/manifest/components/composer-bar.json +73 -0
  385. package/manifest/components/composer-command-item.json +79 -0
  386. package/manifest/components/composer-context.json +67 -0
  387. package/manifest/components/composer-input.json +73 -0
  388. package/manifest/components/composer-menu-item.json +72 -0
  389. package/manifest/components/composer-menu.json +79 -0
  390. package/manifest/components/composer-model-item.json +75 -0
  391. package/manifest/components/composer-model-trigger.json +75 -0
  392. package/manifest/components/composer-person-item.json +79 -0
  393. package/manifest/components/composer-send.json +80 -0
  394. package/manifest/components/composer-toolbar.json +65 -0
  395. package/manifest/components/composer-voice-button.json +68 -0
  396. package/manifest/components/composer-voice.json +75 -0
  397. package/manifest/components/composer.json +176 -0
  398. package/manifest/components/computer-use.json +84 -0
  399. package/manifest/components/confidence-marker.json +74 -0
  400. package/manifest/components/connection-state.json +84 -0
  401. package/manifest/components/container.json +60 -0
  402. package/manifest/components/context-breakdown.json +65 -0
  403. package/manifest/components/context-menu.json +121 -0
  404. package/manifest/components/context-usage.json +85 -0
  405. package/manifest/components/conversation-search.json +92 -0
  406. package/manifest/components/copy-button.json +93 -0
  407. package/manifest/components/cost-meter.json +74 -0
  408. package/manifest/components/cue-logotype.json +96 -0
  409. package/manifest/components/cue-mark.json +97 -0
  410. package/manifest/components/cue-portal-frame.json +55 -0
  411. package/manifest/components/data-table-pagination.json +83 -0
  412. package/manifest/components/data-table-toolbar.json +104 -0
  413. package/manifest/components/date-field.json +80 -0
  414. package/manifest/components/date-picker.json +191 -0
  415. package/manifest/components/date-range-picker.json +191 -0
  416. package/manifest/components/day-separator.json +58 -0
  417. package/manifest/components/delegation-card.json +144 -0
  418. package/manifest/components/density.json +58 -0
  419. package/manifest/components/description-list.json +84 -0
  420. package/manifest/components/diagram.json +100 -0
  421. package/manifest/components/dialog.json +198 -0
  422. package/manifest/components/disclosure.json +109 -0
  423. package/manifest/components/dmx-bar.json +94 -0
  424. package/manifest/components/dmx-strip.json +101 -0
  425. package/manifest/components/document-reference.json +90 -0
  426. package/manifest/components/draft-restore.json +82 -0
  427. package/manifest/components/drawer.json +179 -0
  428. package/manifest/components/dropdown-menu.json +229 -0
  429. package/manifest/components/edit-message.json +105 -0
  430. package/manifest/components/elements-command-palette.json +100 -0
  431. package/manifest/components/elements-composer.json +71 -0
  432. package/manifest/components/elements-data-table.json +68 -0
  433. package/manifest/components/elements-timeline.json +69 -0
  434. package/manifest/components/elicitation-form.json +103 -0
  435. package/manifest/components/empty-state-composer.json +64 -0
  436. package/manifest/components/empty-state-greeting.json +49 -0
  437. package/manifest/components/empty-state-suggestion.json +57 -0
  438. package/manifest/components/empty-state-suggestions.json +49 -0
  439. package/manifest/components/empty-state.json +90 -0
  440. package/manifest/components/end-of-turn-summary.json +77 -0
  441. package/manifest/components/env-var-input.json +150 -0
  442. package/manifest/components/error-state.json +80 -0
  443. package/manifest/components/export-dialog.json +84 -0
  444. package/manifest/components/eyebrow.json +56 -0
  445. package/manifest/components/feedback-dialog.json +107 -0
  446. package/manifest/components/field-description.json +63 -0
  447. package/manifest/components/field-error.json +77 -0
  448. package/manifest/components/field-label.json +63 -0
  449. package/manifest/components/field.json +79 -0
  450. package/manifest/components/file-tree.json +83 -0
  451. package/manifest/components/file-upload.json +159 -0
  452. package/manifest/components/flow-background.json +50 -0
  453. package/manifest/components/flow-controls.json +50 -0
  454. package/manifest/components/flow-graph.json +75 -0
  455. package/manifest/components/folder-icon.json +52 -0
  456. package/manifest/components/footer.json +112 -0
  457. package/manifest/components/frac.json +59 -0
  458. package/manifest/components/generation-loader.json +64 -0
  459. package/manifest/components/generative-ui.json +93 -0
  460. package/manifest/components/grid.json +81 -0
  461. package/manifest/components/group-bar.json +102 -0
  462. package/manifest/components/guardrail-notice.json +91 -0
  463. package/manifest/components/hover-card.json +151 -0
  464. package/manifest/components/icon-button.json +88 -0
  465. package/manifest/components/image-generation.json +67 -0
  466. package/manifest/components/info-tip.json +98 -0
  467. package/manifest/components/inline-citation.json +77 -0
  468. package/manifest/components/input-group.json +91 -0
  469. package/manifest/components/input.json +89 -0
  470. package/manifest/components/item.json +129 -0
  471. package/manifest/components/job-progress.json +96 -0
  472. package/manifest/components/kbd.json +52 -0
  473. package/manifest/components/launcher-bubble.json +105 -0
  474. package/manifest/components/link.json +81 -0
  475. package/manifest/components/live-region-announcer.json +79 -0
  476. package/manifest/components/log-viewer.json +139 -0
  477. package/manifest/components/map-answer.json +83 -0
  478. package/manifest/components/markdown-text.json +94 -0
  479. package/manifest/components/math-block.json +74 -0
  480. package/manifest/components/mcp-server-icon.json +52 -0
  481. package/manifest/components/mcp-server-panel.json +87 -0
  482. package/manifest/components/memory-chips.json +65 -0
  483. package/manifest/components/menubar.json +157 -0
  484. package/manifest/components/message-actions.json +99 -0
  485. package/manifest/components/message-attachments.json +63 -0
  486. package/manifest/components/message-branches.json +71 -0
  487. package/manifest/components/message-list.json +100 -0
  488. package/manifest/components/message-pair.json +86 -0
  489. package/manifest/components/message-queue.json +74 -0
  490. package/manifest/components/message-timing.json +62 -0
  491. package/manifest/components/message.json +116 -0
  492. package/manifest/components/meter.json +114 -0
  493. package/manifest/components/mobile-composer.json +126 -0
  494. package/manifest/components/model-picker.json +76 -0
  495. package/manifest/components/multi-select.json +190 -0
  496. package/manifest/components/musical-time-input.json +113 -0
  497. package/manifest/components/navigation-menu.json +226 -0
  498. package/manifest/components/node-card.json +109 -0
  499. package/manifest/components/node-handle.json +69 -0
  500. package/manifest/components/number-field.json +107 -0
  501. package/manifest/components/number-ticker.json +61 -0
  502. package/manifest/components/onboarding.json +84 -0
  503. package/manifest/components/otp-field.json +128 -0
  504. package/manifest/components/page-shell.json +96 -0
  505. package/manifest/components/pagination.json +92 -0
  506. package/manifest/components/panel-header.json +77 -0
  507. package/manifest/components/panel.json +71 -0
  508. package/manifest/components/password-input.json +119 -0
  509. package/manifest/components/permission-grant.json +92 -0
  510. package/manifest/components/permission-scopes.json +139 -0
  511. package/manifest/components/piano-keyboard.json +120 -0
  512. package/manifest/components/plussie.json +111 -0
  513. package/manifest/components/popover.json +193 -0
  514. package/manifest/components/preset-section.json +73 -0
  515. package/manifest/components/progress.json +95 -0
  516. package/manifest/components/prompt-library.json +99 -0
  517. package/manifest/components/queue-dock.json +110 -0
  518. package/manifest/components/quota-banner.json +94 -0
  519. package/manifest/components/quote-reply.json +105 -0
  520. package/manifest/components/radio-group.json +73 -0
  521. package/manifest/components/radio.json +80 -0
  522. package/manifest/components/rating.json +141 -0
  523. package/manifest/components/read-aloud.json +111 -0
  524. package/manifest/components/reasoning-effort.json +81 -0
  525. package/manifest/components/reasoning-panel.json +108 -0
  526. package/manifest/components/recommendation-card.json +107 -0
  527. package/manifest/components/regenerate-menu.json +89 -0
  528. package/manifest/components/replay-player.json +102 -0
  529. package/manifest/components/research-report.json +76 -0
  530. package/manifest/components/resizable.json +88 -0
  531. package/manifest/components/retrieval-chunks.json +84 -0
  532. package/manifest/components/revert-dock.json +150 -0
  533. package/manifest/components/reviewable-diff.json +93 -0
  534. package/manifest/components/risk-badge.json +74 -0
  535. package/manifest/components/row.json +109 -0
  536. package/manifest/components/schedule-card.json +101 -0
  537. package/manifest/components/score-breakdown.json +91 -0
  538. package/manifest/components/scroll-anchor.json +72 -0
  539. package/manifest/components/scroll-area.json +91 -0
  540. package/manifest/components/scrollable-tabs-list.json +83 -0
  541. package/manifest/components/scrub-input.json +200 -0
  542. package/manifest/components/seam-cell.json +75 -0
  543. package/manifest/components/seam-grid.json +75 -0
  544. package/manifest/components/seam-list.json +56 -0
  545. package/manifest/components/search-input.json +134 -0
  546. package/manifest/components/section-header.json +112 -0
  547. package/manifest/components/segmented-control.json +138 -0
  548. package/manifest/components/select.json +194 -0
  549. package/manifest/components/separator.json +53 -0
  550. package/manifest/components/settings-panel.json +118 -0
  551. package/manifest/components/shape-section.json +66 -0
  552. package/manifest/components/shared-conversation.json +89 -0
  553. package/manifest/components/sheet.json +186 -0
  554. package/manifest/components/shimmer-label.json +59 -0
  555. package/manifest/components/sidebar.json +198 -0
  556. package/manifest/components/signal-edge.json +56 -0
  557. package/manifest/components/skeleton.json +46 -0
  558. package/manifest/components/skill-icon.json +52 -0
  559. package/manifest/components/slider.json +89 -0
  560. package/manifest/components/sources.json +83 -0
  561. package/manifest/components/sparkline.json +76 -0
  562. package/manifest/components/speaker-identity.json +61 -0
  563. package/manifest/components/spec-sheet.json +80 -0
  564. package/manifest/components/spectrum-visualizer.json +115 -0
  565. package/manifest/components/spinner.json +61 -0
  566. package/manifest/components/stack-icon.json +52 -0
  567. package/manifest/components/stack.json +96 -0
  568. package/manifest/components/stacks-matrix-icon.json +52 -0
  569. package/manifest/components/stat.json +87 -0
  570. package/manifest/components/status-bar.json +58 -0
  571. package/manifest/components/status-dot.json +78 -0
  572. package/manifest/components/stepper.json +89 -0
  573. package/manifest/components/stopped-run.json +81 -0
  574. package/manifest/components/streaming-text.json +71 -0
  575. package/manifest/components/sub.json +44 -0
  576. package/manifest/components/subagent-list.json +88 -0
  577. package/manifest/components/suggestions.json +84 -0
  578. package/manifest/components/sup.json +44 -0
  579. package/manifest/components/swap-label.json +71 -0
  580. package/manifest/components/switch.json +87 -0
  581. package/manifest/components/table-scroll-region.json +69 -0
  582. package/manifest/components/table.json +155 -0
  583. package/manifest/components/tabs.json +145 -0
  584. package/manifest/components/tags-input.json +190 -0
  585. package/manifest/components/tail-status.json +109 -0
  586. package/manifest/components/terminal-block.json +91 -0
  587. package/manifest/components/terminal-frame.json +119 -0
  588. package/manifest/components/textarea.json +76 -0
  589. package/manifest/components/theme-configurator.json +124 -0
  590. package/manifest/components/theme-provider.json +134 -0
  591. package/manifest/components/thinking-indicator.json +63 -0
  592. package/manifest/components/thread-list.json +76 -0
  593. package/manifest/components/thread-search.json +90 -0
  594. package/manifest/components/threshold-rail.json +160 -0
  595. package/manifest/components/time-boundary.json +62 -0
  596. package/manifest/components/time-field.json +80 -0
  597. package/manifest/components/timeline-ruler.json +139 -0
  598. package/manifest/components/timeline.json +115 -0
  599. package/manifest/components/title-bar.json +82 -0
  600. package/manifest/components/toast.json +130 -0
  601. package/manifest/components/todo-list.json +69 -0
  602. package/manifest/components/toggle-group.json +106 -0
  603. package/manifest/components/toggle.json +109 -0
  604. package/manifest/components/token-editor.json +90 -0
  605. package/manifest/components/tool-call-card.json +200 -0
  606. package/manifest/components/tool-call.json +119 -0
  607. package/manifest/components/tool-error.json +114 -0
  608. package/manifest/components/tool-group.json +83 -0
  609. package/manifest/components/tool-timeline.json +119 -0
  610. package/manifest/components/toolbar.json +163 -0
  611. package/manifest/components/tooltip.json +164 -0
  612. package/manifest/components/trace-waterfall.json +74 -0
  613. package/manifest/components/tree-visibility-toggle.json +84 -0
  614. package/manifest/components/tree.json +140 -0
  615. package/manifest/components/turn-footer.json +105 -0
  616. package/manifest/components/two-step-button.json +113 -0
  617. package/manifest/components/typing-indicator.json +53 -0
  618. package/manifest/components/universe-grid.json +127 -0
  619. package/manifest/components/unread-divider.json +55 -0
  620. package/manifest/components/usage-chart.json +124 -0
  621. package/manifest/components/verdict-row.json +91 -0
  622. package/manifest/components/voice-conversation.json +109 -0
  623. package/manifest/components/web-preview.json +87 -0
  624. package/manifest/components/web-search.json +92 -0
  625. package/manifest/components/work-collapse.json +102 -0
  626. package/manifest/manifest.json +4779 -0
  627. package/manifest/tokens.json +159 -0
  628. package/package.json +54 -5
@@ -1,7 +1,7 @@
1
1
  import { converter, parse } from "culori";
2
2
  //#region src/theming/contrast.ts
3
3
  /**
4
- * WCAG contrast, and the eight pairs a theme is judged on.
4
+ * WCAG contrast, and the eleven pairs a theme is judged on.
5
5
  *
6
6
  * A generator that only derived colours would be a colour toy: the reason to
7
7
  * compute a palette instead of picking one is that the computer can then *check*
@@ -82,13 +82,25 @@ function contrastRatio(foreground, background) {
82
82
  return (high + .05) / (low + .05);
83
83
  }
84
84
  /**
85
- * The eight pairs that decide whether a theme is usable.
85
+ * The eleven pairs that decide whether a theme is usable.
86
86
  *
87
87
  * Not every pair in the palette: the ones a reader's comprehension actually
88
88
  * depends on. Primary ink is held to AAA because it carries the prose; secondary
89
- * ink and accent ink to AA because they carry labels; the five status colours to
90
- * the non-text AA floor because they are read as *signals* — a dot, a rim, a bar
91
- * — never as body copy.
89
+ * ink and accent ink to AA because they carry labels; the five status colours
90
+ * and the live hue to the non-text AA floor because they are read as *signals*
91
+ * — a dot, a rim, a bar — never as body copy.
92
+ *
93
+ * `danger` and `warn` each appear twice, and they are the only tones that do.
94
+ * `ok`, `busy`, `info` and `stream` are *only* ever signals, so the non-text
95
+ * floor is the whole truth about them. The red and the amber are also grounds:
96
+ * they are the two tones this system fills a control with, and what they fill is
97
+ * the confirm on something irreversible and the confirm on something merely
98
+ * consequential. Text on either fill is text, so its ink is held to the text
99
+ * floor against the tone it sits on rather than against the page.
100
+ *
101
+ * `stream` is measured for the same reason `ok` is: `createTheme()` darkens it
102
+ * to this floor when it has to invent a light block, and a report that did not
103
+ * check what the derivation targets would be checking the wrong thing.
92
104
  */
93
105
  const CONTRAST_REQUIREMENTS = [
94
106
  {
@@ -112,12 +124,27 @@ const CONTRAST_REQUIREMENTS = [
112
124
  minimum: WCAG_AA_TEXT,
113
125
  reason: "The label on a solid accent button has to be readable."
114
126
  },
127
+ {
128
+ id: "danger-fg/danger",
129
+ foreground: "danger-fg",
130
+ background: "danger",
131
+ minimum: WCAG_AA_TEXT,
132
+ reason: "The label on a solid destructive fill is read before something irreversible happens."
133
+ },
134
+ {
135
+ id: "warn-fg/warn",
136
+ foreground: "warn-fg",
137
+ background: "warn",
138
+ minimum: WCAG_AA_TEXT,
139
+ reason: "The label on a solid warning fill is read before a consequential press lands."
140
+ },
115
141
  ...[
116
142
  "ok",
117
143
  "busy",
118
144
  "warn",
119
145
  "danger",
120
- "info"
146
+ "info",
147
+ "stream"
121
148
  ].map((status) => ({
122
149
  id: `${status}/bg`,
123
150
  foreground: status,
@@ -30,7 +30,7 @@ declare const DEFAULT_THEME_BASE: ThemeName;
30
30
  /**
31
31
  * How far the sunken ground sits below the page, in oklch lightness.
32
32
  *
33
- * Small on purpose: sunken is a well, not a second theme. Across the eight
33
+ * Small on purpose: sunken is a well, not a second theme. Across the ten
34
34
  * shipped presets the authored gap runs −0.011 to −0.031.
35
35
  */
36
36
  declare const SUNKEN_LIGHTNESS_STEP = -0.02;
@@ -75,7 +75,7 @@ declare const ACCENT_FG_MINIMUM = 4.5;
75
75
  * extreme rather than to the arithmetic mirror: `1 − L` of a 0.16 near-black is a
76
76
  * 0.84 mid-grey, which is not a page. Compressing instead maps the ladder of
77
77
  * dark grounds onto a narrow paper band — a deeper dark theme gets a cleaner
78
- * white page — and lands within 0.01 of all eight authored light presets.
78
+ * white page — and lands within 0.01 of all ten authored light presets.
79
79
  */
80
80
  declare const LIGHT_GROUND_COMPRESSION = 0.1;
81
81
  interface ThemeAnchors {
@@ -103,8 +103,12 @@ interface ThemeAnchors {
103
103
  accent?: string;
104
104
  /** Individual rungs of the surface ladder, overriding whatever would be derived. */
105
105
  surfaces?: Partial<Record<"sunken" | "surface-1" | "surface-2" | "surface-3", string>>;
106
- /** Individual status tones. Never derived — a signal colour is a decision. */
107
- status?: Partial<Record<"ok" | "busy" | "warn" | "danger" | "info", string>>;
106
+ /**
107
+ * Individual status tones, plus `stream` — the live hue an agent surface
108
+ * paints a token still arriving with. Never derived: a signal colour is a
109
+ * decision.
110
+ */
111
+ status?: Partial<Record<"ok" | "busy" | "warn" | "danger" | "info" | "stream", string>>;
108
112
  /**
109
113
  * Font stacks. `mono` is the one the presets themselves override; `sans` and
110
114
  * `display` are emitted only when given. Values pass through verbatim, so they
@@ -1,7 +1,7 @@
1
1
  import { formatColorString } from "../color/_convert.js";
2
2
  import { BASE_FONT_STACKS, DEFAULT_DENSITY_LEVEL, DENSITY_RADIUS_SCALE, RESOLVED_MONO, THEME_COLOR_TOKENS, THEME_PRESETS } from "./_presets.js";
3
3
  import { WCAG_AA_TEXT, contrastRatio, contrastReport } from "./contrast.js";
4
- import { assertCssValue, assertThemeName, derivedTokens, serializeThemeCss, themeSelector, tokenProperty } from "./serialize.js";
4
+ import { assertCssValue, assertThemeName, derivedTokens, serializeSystemModeAliases, serializeThemeCss, themeSelector, tokenProperty } from "./serialize.js";
5
5
  import { clampChroma, converter, formatHex, inGamut, parse } from "culori";
6
6
  //#region src/theming/create-theme.ts
7
7
  /**
@@ -32,7 +32,7 @@ const DEFAULT_THEME_BASE = "cue";
32
32
  /**
33
33
  * How far the sunken ground sits below the page, in oklch lightness.
34
34
  *
35
- * Small on purpose: sunken is a well, not a second theme. Across the eight
35
+ * Small on purpose: sunken is a well, not a second theme. Across the ten
36
36
  * shipped presets the authored gap runs −0.011 to −0.031.
37
37
  */
38
38
  const SUNKEN_LIGHTNESS_STEP = -.02;
@@ -81,7 +81,7 @@ const ACCENT_FG_MINIMUM = WCAG_AA_TEXT;
81
81
  * extreme rather than to the arithmetic mirror: `1 − L` of a 0.16 near-black is a
82
82
  * 0.84 mid-grey, which is not a page. Compressing instead maps the ladder of
83
83
  * dark grounds onto a narrow paper band — a deeper dark theme gets a cleaner
84
- * white page — and lands within 0.01 of all eight authored light presets.
84
+ * white page — and lands within 0.01 of all ten authored light presets.
85
85
  */
86
86
  const LIGHT_GROUND_COMPRESSION = .1;
87
87
  /** Lightness a derived light colour steps down by while hunting for contrast. */
@@ -178,14 +178,31 @@ function lookup(map, token) {
178
178
  * and stays correct if a consumer overrides the accent in tier 1 later.
179
179
  */
180
180
  const SELECTION_WASH = `color-mix(in oklch, var(--cue-accent) 22%, transparent)`;
181
- /** The five status tones, in the order every theme block declares them. */
182
- const STATUSES = [
181
+ /**
182
+ * The five tones plus the live hue, in the order the colour contract lists them.
183
+ *
184
+ * `stream` resolves exactly like a status — authored, never derived from the
185
+ * accent, and darkened to the non-text floor when a light block has to be
186
+ * invented — but it is not a `tone` any component takes. See
187
+ * `ThemeAnchors.status`.
188
+ */
189
+ const TINTED = [...[
183
190
  "ok",
184
191
  "busy",
185
192
  "warn",
186
193
  "danger",
187
194
  "info"
188
- ];
195
+ ], "stream"];
196
+ /**
197
+ * The tones that are also *grounds*, in contract order.
198
+ *
199
+ * Every other status colour is only ever a signal — a dot, a rim, a wash — and
200
+ * whatever text sits near it sits on a surface. These two get filled: the amber
201
+ * carries the confirm on a consequential press and the red the confirm on an
202
+ * irreversible one, and text on a fill is text. So each gets an ink derived
203
+ * against itself, `warn-fg` and `danger-fg`.
204
+ */
205
+ const INKED = ["warn", "danger"];
189
206
  /** The three raised surfaces, in ladder order. */
190
207
  const SURFACES = [
191
208
  "surface-1",
@@ -243,7 +260,12 @@ function resolveDark(anchors, preset) {
243
260
  const accent = colors["accent"];
244
261
  define("accent-hover", void 0, accentMoved, () => shift(readColor(accent, "accent"), ACCENT_HOVER_LIGHTNESS_STEP));
245
262
  define("accent-fg", void 0, accentMoved, () => pickInk(accent, [colors["bg"], colors["fg"]]));
246
- for (const tone of STATUSES) define(tone, status[tone], false);
263
+ for (const tone of TINTED) define(tone, status[tone], false);
264
+ for (const tone of INKED) define(`${tone}-fg`, void 0, status[tone] !== void 0, () => pickInk(colors[tone], [
265
+ colors["bg"],
266
+ colors["sunken"],
267
+ colors["fg"]
268
+ ]));
247
269
  define("selection", void 0, accentMoved, () => SELECTION_WASH);
248
270
  define("focus", void 0, accentMoved, () => accent);
249
271
  define("data-ground", void 0, false);
@@ -311,7 +333,12 @@ function resolveLight(dark, preset) {
311
333
  const accent = colors["accent"];
312
334
  define("accent-hover", () => shift(readColor(accent, "accent"), ACCENT_HOVER_LIGHTNESS_STEP));
313
335
  define("accent-fg", () => pickInk(accent, [colors["bg"], colors["fg"]]));
314
- for (const tone of STATUSES) define(tone, () => darkenToContrast(dark.colors[tone], paperGround, 3, tone));
336
+ for (const tone of TINTED) define(tone, () => darkenToContrast(dark.colors[tone], paperGround, 3, tone));
337
+ for (const tone of INKED) define(`${tone}-fg`, () => pickInk(colors[tone], [
338
+ colors["bg"],
339
+ colors["sunken"],
340
+ colors["fg"]
341
+ ]));
315
342
  define("selection", () => SELECTION_WASH);
316
343
  define("focus", () => accent);
317
344
  define("data-ground", () => dark.colors["data-ground"]);
@@ -400,7 +427,7 @@ function createTheme(anchors) {
400
427
  const derived = Object.entries(derivedTokens());
401
428
  const fonts = resolveFonts(anchors, preset.fonts);
402
429
  const radius = anchors.radiusScale === void 0 ? null : radiusBlocks(name, anchors.radiusScale);
403
- const darkSections = [
430
+ const darkPaletteSections = [
404
431
  { declarations: colorDeclarations(dark.colors) },
405
432
  {
406
433
  comment: DERIVED_COMMENT,
@@ -409,25 +436,26 @@ function createTheme(anchors) {
409
436
  {
410
437
  comment: FONT_COMMENT,
411
438
  declarations: fonts
412
- },
413
- ...radius === null ? [] : [{
414
- comment: SHAPE_COMMENT,
415
- declarations: radius.base
416
- }]
439
+ }
417
440
  ];
441
+ const darkSections = [...darkPaletteSections, ...radius === null ? [] : [{
442
+ comment: SHAPE_COMMENT,
443
+ declarations: radius.base
444
+ }]];
445
+ const lightSections = light === null ? null : [{ declarations: colorDeclarations(light.colors) }, {
446
+ comment: DERIVED_COMMENT,
447
+ declarations: derived
448
+ }];
418
449
  const blocks = [
419
450
  {
420
451
  selector: themeSelector(name),
421
452
  colorScheme: "dark",
422
453
  sections: darkSections
423
454
  },
424
- ...light === null ? [] : [{
455
+ ...lightSections === null ? [] : [{
425
456
  selector: themeSelector(name, { mode: "light" }),
426
457
  colorScheme: "light",
427
- sections: [{ declarations: colorDeclarations(light.colors) }, {
428
- comment: DERIVED_COMMENT,
429
- declarations: derived
430
- }]
458
+ sections: lightSections
431
459
  }],
432
460
  ...radius?.blocks ?? []
433
461
  ];
@@ -441,7 +469,15 @@ function createTheme(anchors) {
441
469
  }]];
442
470
  return {
443
471
  name,
444
- css: serializeThemeCss(blocks, { banner: `@cueplusplus/ui — theme "${name}"` }),
472
+ css: `${serializeThemeCss(blocks, { banner: `@cueplusplus/ui — theme "${name}"` }).trimEnd()}\n\n${serializeSystemModeAliases(name, [{
473
+ mode: "dark",
474
+ colorScheme: "light dark",
475
+ sections: darkPaletteSections
476
+ }, {
477
+ mode: "light",
478
+ colorScheme: "light dark",
479
+ sections: lightSections ?? darkPaletteSections
480
+ }])}\n`,
445
481
  tokens: Object.fromEntries(darkSections.flatMap((section) => section.declarations)),
446
482
  light: light === null ? null : Object.fromEntries([...colorDeclarations(light.colors), ...derived]),
447
483
  report: contrastReport(inputs)
@@ -88,12 +88,21 @@ declare function themeSelector(name: string, options?: ThemeSelectorOptions): st
88
88
  * `:root`, for the same reason the build does it: a custom property's `var()`
89
89
  * references are substituted at the element that declares it, so a `:root`-level
90
90
  * mix would freeze the default theme's accent into every nested theme.
91
+ *
92
+ * This is deliberately a second copy of the `DERIVED` table in
93
+ * `packages/tokens/build.mjs`. It has to be one: that table runs at publish time
94
+ * over DTCG files under Style Dictionary, this one runs in a browser over a
95
+ * palette somebody just typed, and neither package can import the other's. What
96
+ * keeps a copy from drifting is not discipline but
97
+ * `test/theming/serialize.test.ts`, which compares this list against the
98
+ * compiled stylesheet in both directions — a derivation added to one side alone
99
+ * fails there rather than in a consumer's app six weeks later.
91
100
  */
92
101
  declare const DERIVED_TOKEN_TEMPLATES: ReadonlyArray<readonly [string, string]>;
93
102
  /**
94
103
  * {@link DERIVED_TOKEN_TEMPLATES} as a property → value map.
95
104
  *
96
- * @returns The eleven derived declarations, keyed by custom property.
105
+ * @returns The sixteen derived declarations, keyed by custom property.
97
106
  * @example
98
107
  * derivedTokens()["--cue-accent-soft"];
99
108
  */
@@ -110,7 +119,7 @@ interface ThemeBlock {
110
119
  /** The selector the rule declares under. */
111
120
  selector: string;
112
121
  /** Emitted as `color-scheme`, ahead of the custom properties. Omit to skip it. */
113
- colorScheme?: "dark" | "light";
122
+ colorScheme?: "dark" | "light" | "light dark";
114
123
  /** The declarations, grouped into commented sections. */
115
124
  sections: readonly ThemeBlockSection[];
116
125
  }
@@ -97,6 +97,53 @@ function themeSelector(name, options = {}) {
97
97
  density === void 0 ? "" : `[data-density="${density}"]`
98
98
  ].join("");
99
99
  }
100
+ /** The tone vocabulary that gets a soft fill and a soft border in every theme. */
101
+ const STATUSES = [
102
+ "ok",
103
+ "busy",
104
+ "warn",
105
+ "danger",
106
+ "info"
107
+ ];
108
+ /**
109
+ * The live hue — a token still arriving, a tool still running, a cursor that
110
+ * has not stopped.
111
+ *
112
+ * Not a member of {@link STATUSES}, because a status is something a `Chip` or a
113
+ * `StatusDot` can be *told to be* and "streaming" is not a tone a caller picks:
114
+ * it is a property of a surface while the model is talking. What it shares with
115
+ * the statuses is the shape of its family — a full-strength ink, a soft fill and
116
+ * a rim — so it derives alongside them. `packages/tokens/build.mjs` carries the
117
+ * same pair of constants for the same reason; see the note on
118
+ * {@link DERIVED_TOKEN_TEMPLATES}.
119
+ */
120
+ const STREAM = "stream";
121
+ /** Every tone that earns a derived soft fill and a derived rim. */
122
+ const TINTED = [...STATUSES, STREAM];
123
+ /**
124
+ * The three shares of the foreground the list idioms are ruled with.
125
+ *
126
+ * `--cue-border` is an authored anchor, and what a preset authors is a *box
127
+ * edge* — the line around a card, an input, a panel. Repeated down thirty rows a
128
+ * box edge reads as a stack of boxes rather than as a list, so a rule between
129
+ * things is drawn lighter than the edge around a thing.
130
+ *
131
+ * Mixed from `--cue-fg` rather than authored, which is what makes them hold for
132
+ * a preset `createTheme()` produced from a palette nobody vetted: the rules keep
133
+ * their relationship to the type they separate whatever the palette turned out
134
+ * to be, in both modes, with nothing to get wrong.
135
+ *
136
+ * `row-hover` is the same measurement from the other side — the faintest wash
137
+ * that still reads as one row picked out of a list. It does not replace the
138
+ * surface ramp: a row sitting *on* a surface still lifts to the next rung
139
+ * (`hover:bg-surface-2`), which is what this library's own rows do. This is for
140
+ * rows drawn directly on `--cue-bg`, where the next rung is a visible step.
141
+ */
142
+ const HAIRLINE_TEMPLATES = [
143
+ ["hair", "color-mix(in oklch, var(--cue-fg) 6%, transparent)"],
144
+ ["hair-strong", "color-mix(in oklch, var(--cue-fg) 12%, transparent)"],
145
+ ["row-hover", "color-mix(in oklch, var(--cue-fg) 3.5%, transparent)"]
146
+ ];
100
147
  /**
101
148
  * The derived colours every theme block carries, as `[token, value]` pairs.
102
149
  *
@@ -105,18 +152,25 @@ function themeSelector(name, options = {}) {
105
152
  * `:root`, for the same reason the build does it: a custom property's `var()`
106
153
  * references are substituted at the element that declares it, so a `:root`-level
107
154
  * mix would freeze the default theme's accent into every nested theme.
155
+ *
156
+ * This is deliberately a second copy of the `DERIVED` table in
157
+ * `packages/tokens/build.mjs`. It has to be one: that table runs at publish time
158
+ * over DTCG files under Style Dictionary, this one runs in a browser over a
159
+ * palette somebody just typed, and neither package can import the other's. What
160
+ * keeps a copy from drifting is not discipline but
161
+ * `test/theming/serialize.test.ts`, which compares this list against the
162
+ * compiled stylesheet in both directions — a derivation added to one side alone
163
+ * fails there rather than in a consumer's app six weeks later.
108
164
  */
109
- const DERIVED_TOKEN_TEMPLATES = [["accent-soft", "color-mix(in oklch, var(--cue-accent) 14%, transparent)"], ...[
110
- "ok",
111
- "busy",
112
- "warn",
113
- "danger",
114
- "info"
115
- ].flatMap((status) => [[`${status}-soft`, `color-mix(in oklch, var(--cue-${status}) 12%, transparent)`], [`${status}-border`, `color-mix(in oklch, var(--cue-${status}) 35%, transparent)`]])];
165
+ const DERIVED_TOKEN_TEMPLATES = [
166
+ ["accent-soft", "color-mix(in oklch, var(--cue-accent) 14%, transparent)"],
167
+ ...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)`]]),
168
+ ...HAIRLINE_TEMPLATES
169
+ ];
116
170
  /**
117
171
  * {@link DERIVED_TOKEN_TEMPLATES} as a property → value map.
118
172
  *
119
- * @returns The eleven derived declarations, keyed by custom property.
173
+ * @returns The sixteen derived declarations, keyed by custom property.
120
174
  * @example
121
175
  * derivedTokens()["--cue-accent-soft"];
122
176
  */
@@ -148,6 +202,30 @@ function serializeThemeBlock(block) {
148
202
  }
149
203
  return `${block.selector} {\n${lines.join("\n")}\n}`;
150
204
  }
205
+ /** Indent a complete rule once so it can live inside an at-rule. */
206
+ function indentRule(rule) {
207
+ return rule.split("\n").map((line) => ` ${line}`).join("\n");
208
+ }
209
+ /**
210
+ * Alias resolved dark/light palettes onto the preserved logical `system` mode.
211
+ *
212
+ * Both `createTheme()` and the configurator call this function. Keeping the
213
+ * selector and media-query spelling here prevents exported overrides from
214
+ * drifting away from generated custom themes.
215
+ *
216
+ * @internal Used by package-owned theme serializers; not part of the public
217
+ * `@cueplusplus/ui/theming` barrel.
218
+ */
219
+ function serializeSystemModeAliases(theme, aliases) {
220
+ const name = assertThemeName(theme);
221
+ return aliases.map(({ mode, colorScheme, sections }) => {
222
+ return `@media (prefers-color-scheme: ${mode}) {\n${indentRule(serializeThemeBlock({
223
+ selector: `[data-theme="${name}"][data-mode="system"]`,
224
+ colorScheme,
225
+ sections
226
+ }))}\n}`;
227
+ }).join("\n\n");
228
+ }
151
229
  /**
152
230
  * A whole generated stylesheet: banner, then one rule per block.
153
231
  *
@@ -162,4 +240,4 @@ function serializeThemeCss(blocks, options = {}) {
162
240
  return `${[...options.banner === void 0 ? [] : [`/*! ${options.banner}\n * Generated by createTheme(). Do not edit by hand.\n */`], ...rules].join("\n\n")}\n`;
163
241
  }
164
242
  //#endregion
165
- export { CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, THEME_NAME_PATTERN, assertCssValue, assertThemeName, derivedTokens, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty };
243
+ export { CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, THEME_NAME_PATTERN, assertCssValue, assertThemeName, derivedTokens, serializeSystemModeAliases, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty };
@@ -0,0 +1,154 @@
1
+ {
2
+ "name": "Accordion",
3
+ "slug": "accordion",
4
+ "group": "layout",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A stack of sections, one (or several) open at a time.\n\nWraps Base UI's `Accordion`, so the disclosure ARIA, keyboard handling and\nopen-state bookkeeping are the primitive's. This layer adds the console skin:\nhairline separation, mono summary rows on the control ladder, and a height\ntransition that respects `prefers-reduced-motion`.",
9
+ "props": [],
10
+ "typeReferences": [],
11
+ "subcomponents": [
12
+ "Root",
13
+ "Item",
14
+ "Header",
15
+ "Trigger",
16
+ "Panel"
17
+ ],
18
+ "parts": [
19
+ {
20
+ "name": "Root",
21
+ "usage": "Accordion.Root",
22
+ "description": "Groups the sections and owns which of them are open.",
23
+ "props": [
24
+ {
25
+ "name": "className",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Extra classes for the accordion frame."
30
+ }
31
+ ],
32
+ "typeReferences": [
33
+ "Omit<BaseAccordion.Root.Props, \"className\">"
34
+ ]
35
+ },
36
+ {
37
+ "name": "Item",
38
+ "usage": "Accordion.Item",
39
+ "description": "One section.\n\nSeparation is a hairline the section draws above itself, dropped on the first\none — so a stack shows rules *between* sections and none against the rim of\nwhatever contains them. Same rule as `Row`, for the same reason.",
40
+ "props": [
41
+ {
42
+ "name": "className",
43
+ "type": "string",
44
+ "required": false,
45
+ "defaultValue": null,
46
+ "description": "Extra classes for the section."
47
+ }
48
+ ],
49
+ "typeReferences": [
50
+ "Omit<BaseAccordion.Item.Props, \"className\">"
51
+ ]
52
+ },
53
+ {
54
+ "name": "Header",
55
+ "usage": "Accordion.Header",
56
+ "description": "The heading that labels a section's panel. An `<h3>` with no type of its own.",
57
+ "props": [
58
+ {
59
+ "name": "className",
60
+ "type": "string",
61
+ "required": false,
62
+ "defaultValue": null,
63
+ "description": "Extra classes for the heading."
64
+ }
65
+ ],
66
+ "typeReferences": [
67
+ "Omit<BaseAccordion.Header.Props, \"className\">"
68
+ ]
69
+ },
70
+ {
71
+ "name": "Trigger",
72
+ "usage": "Accordion.Trigger",
73
+ "description": "The summary row that opens a section.\n\nA mono row on the control ladder, padded to the same gutters as a `Row`, with\na caret that rotates off the trigger's own `data-panel-open` — nothing in\nReact has to know the section is open for the arrow to turn.",
74
+ "props": [
75
+ {
76
+ "name": "className",
77
+ "type": "string",
78
+ "required": false,
79
+ "defaultValue": null,
80
+ "description": "Extra classes for the summary row."
81
+ }
82
+ ],
83
+ "typeReferences": [
84
+ "Omit<BaseAccordion.Trigger.Props, \"className\">"
85
+ ]
86
+ },
87
+ {
88
+ "name": "Panel",
89
+ "usage": "Accordion.Panel",
90
+ "description": "A section's body.\n\nHeight is animated from `--accordion-panel-height`, which Base UI measures.\nThe animating element carries no padding — padding is part of the box height,\nso it would be counted into the `0 → measured` transition and make the panel\njump at both ends — hence the inner body element.",
91
+ "props": [
92
+ {
93
+ "name": "className",
94
+ "type": "string",
95
+ "required": false,
96
+ "defaultValue": null,
97
+ "description": "Extra classes for the animating box. Padding belongs on `bodyClassName`."
98
+ },
99
+ {
100
+ "name": "bodyClassName",
101
+ "type": "string",
102
+ "required": false,
103
+ "defaultValue": null,
104
+ "description": "Extra classes for the padded body inside it."
105
+ }
106
+ ],
107
+ "typeReferences": [
108
+ "Omit<BaseAccordion.Panel.Props, \"className\">"
109
+ ]
110
+ }
111
+ ],
112
+ "variants": {},
113
+ "defaultVariants": {},
114
+ "tokensUsed": [
115
+ "--cue-accent",
116
+ "--cue-border",
117
+ "--cue-control-md",
118
+ "--cue-fg",
119
+ "--cue-fg-muted",
120
+ "--cue-fg-subtle",
121
+ "--cue-font-mono",
122
+ "--cue-icon-sm",
123
+ "--cue-pad-row-x",
124
+ "--cue-space-1",
125
+ "--cue-space-3",
126
+ "--cue-space-4",
127
+ "--cue-text-ui"
128
+ ],
129
+ "summary": "A stack of sections, one (or several) open at a time.",
130
+ "examples": [
131
+ {
132
+ "title": "Usage",
133
+ "code": "<Accordion.Root>\n <Accordion.Item value=\"routing\">\n <Accordion.Header><Accordion.Trigger>routing</Accordion.Trigger></Accordion.Header>\n <Accordion.Panel>…</Accordion.Panel>\n </Accordion.Item>\n</Accordion.Root>\n<Accordion.Root multiple defaultValue={[\"routing\"]}>…</Accordion.Root>",
134
+ "language": "tsx"
135
+ }
136
+ ],
137
+ "status": "todo-docs",
138
+ "url": "/docs/components/accordion",
139
+ "mdUrl": "/docs/components/accordion.md",
140
+ "jsonUrl": "/r/components/accordion.json",
141
+ "specimens": [
142
+ {
143
+ "title": "Accordion",
144
+ "group": "layout",
145
+ "components": [
146
+ "Accordion"
147
+ ],
148
+ "code": "<Accordion.Root className=\"w-full max-w-[36rem]\" defaultValue={[\"patch\"]}>\n <Accordion.Item value=\"patch\">\n <Accordion.Header>\n <Accordion.Trigger>Patch</Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Panel>48 fixtures across 4 universes.</Accordion.Panel>\n </Accordion.Item>\n <Accordion.Item value=\"cues\">\n <Accordion.Header>\n <Accordion.Trigger>Cues</Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Panel>12 cues, last edited 4 minutes ago.</Accordion.Panel>\n </Accordion.Item>\n <Accordion.Item value=\"network\" disabled>\n <Accordion.Header>\n <Accordion.Trigger>Network</Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Panel>Art-Net on 10.0.0.42.</Accordion.Panel>\n </Accordion.Item>\n</Accordion.Root>",
149
+ "note": "Hairline-separated items with mono summary rows. Several can be open at once.",
150
+ "interaction": "the whole header row is the trigger; the panel animates its height and stills under prefers-reduced-motion."
151
+ }
152
+ ],
153
+ "todo": true
154
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "ActivityGraph",
3
+ "slug": "activity-graph",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "heat-graph"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "A half-year of runs as a calendar of cells, dense where the work was.",
11
+ "props": [
12
+ {
13
+ "name": "data",
14
+ "type": "readonly DataPoint[]",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Date and count pairs from the heat-graph package. Levels are classified for you;\ngaps are filled as empty cells."
18
+ },
19
+ {
20
+ "name": "start",
21
+ "type": "string | Date",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "First day of the window. Pass it explicitly: left unset, heat-graph draws a full\nyear ending today, which will not match your data."
25
+ },
26
+ {
27
+ "name": "end",
28
+ "type": "string | Date",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Last day of the window. Cells are fixed-size, so a long window scrolls\nhorizontally rather than shrinking."
32
+ },
33
+ {
34
+ "name": "title",
35
+ "type": "string",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "What is being counted."
39
+ },
40
+ {
41
+ "name": "total",
42
+ "type": "string",
43
+ "required": true,
44
+ "defaultValue": null,
45
+ "description": "Pre-formatted summary shown opposite the title."
46
+ }
47
+ ],
48
+ "typeReferences": [
49
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"data\" | \"start\" | \"end\" | \"title\" | \"total\"\n> & {\n /**\n * Date and count pairs from the heat-graph package. Levels are classified for you;\n * gaps are filled as empty cells.\n */\n data: readonly HeatGraph.DataPoint[];\n /**\n * First day of the window. Pass it explicitly: left unset, heat-graph draws a full\n * year ending today, which will not match your data.\n */\n start: string | Date;\n /**\n * Last day of the window. Cells are fixed-size, so a long window scrolls\n * horizontally rather than shrinking.\n */\n end: string | Date;\n /** What is being counted. */\n title: string;\n /** Pre-formatted summary shown opposite the title. */\n total: string;\n}"
50
+ ],
51
+ "subcomponents": [],
52
+ "parts": [],
53
+ "variants": {},
54
+ "defaultVariants": {},
55
+ "tokensUsed": [
56
+ "--cue-fg-subtle",
57
+ "--cue-radius-control",
58
+ "--cue-radius-overlay",
59
+ "--cue-stream",
60
+ "--cue-surface-2",
61
+ "--cue-text-body"
62
+ ],
63
+ "summary": "A half-year of runs as a calendar of cells, dense where the work was.",
64
+ "examples": [
65
+ {
66
+ "title": "Usage",
67
+ "code": "import { ActivityGraph } from \"@cueplusplus/ui/elements\";\n\n<ActivityGraph\n data={data}\n start={start}\n end={end}\n title=\"Agent runs\"\n total=\"1,204 in 6 months\"\n/>",
68
+ "language": "tsx"
69
+ }
70
+ ],
71
+ "status": "todo-docs",
72
+ "url": "/docs/components/activity-graph",
73
+ "mdUrl": "/docs/components/activity-graph.md",
74
+ "jsonUrl": "/r/components/activity-graph.json",
75
+ "specimens": [
76
+ {
77
+ "title": "ActivityGraph",
78
+ "group": "elements-agents",
79
+ "components": [
80
+ "ActivityGraph"
81
+ ],
82
+ "code": "<Specimens>\n <Specimen label=\"six months\" wide>\n <ActivityGraph\n data={RUN_DAYS}\n start=\"2026-02-01\"\n end=\"2026-08-21\"\n title=\"Agent runs\"\n total=\"1,204 in 6 months\"\n />\n </Specimen>\n <Specimen label=\"a fortnight\" wide>\n <ActivityGraph\n data={RECENT_DAYS}\n start={RECENT_DAYS[0]!.date}\n end={RECENT_DAYS[RECENT_DAYS.length - 1]!.date}\n title=\"Agent runs\"\n total=\"63 in 14 days\"\n />\n </Specimen>\n</Specimens>",
83
+ "note": "Half a year of runs as a calendar of cells, dense where the work was. It is the one element in the family with a runtime dependency of its own — `heat-graph`, an optional peer — which does the calendar arithmetic and the levelling; everything you can see here is cue's, from the five-step ramp in the streaming hue down to the legend. Cells are a fixed size, so a long window scrolls sideways rather than shrinking into a smudge.",
84
+ "interaction": "none. The five legend swatches are `aria-hidden` and sit between the words less and more, which is what carries the scale."
85
+ }
86
+ ],
87
+ "todo": true
88
+ }