@cueplusplus/ui 0.3.0 → 0.6.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 (541) hide show
  1. package/CHANGELOG.md +2263 -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/chat/index.d.ts +2 -2
  12. package/dist/chat/message-list.d.ts +6 -0
  13. package/dist/chat/message-list.js +35 -0
  14. package/dist/chrome/_drag.js +59 -0
  15. package/dist/chrome/_status-bar-item.js +85 -0
  16. package/dist/chrome/_status-bar.d.ts +15 -0
  17. package/dist/chrome/_status-bar.js +171 -0
  18. package/dist/chrome/app-shell.d.ts +120 -2
  19. package/dist/chrome/app-shell.js +107 -8
  20. package/dist/chrome/index.d.ts +4 -3
  21. package/dist/chrome/status-bar.d.ts +87 -4
  22. package/dist/chrome/status-bar.js +80 -16
  23. package/dist/chrome/title-bar.d.ts +11 -1
  24. package/dist/chrome/title-bar.js +1 -3
  25. package/dist/configurator/_export.js +3 -2
  26. package/dist/configurator/_overrides.d.ts +1 -1
  27. package/dist/configurator/token-editor.js +4 -1
  28. package/dist/date/_segments.js +52 -6
  29. package/dist/elements/activity-graph.d.ts +40 -0
  30. package/dist/elements/activity-graph.js +81 -0
  31. package/dist/elements/agent-card.d.ts +49 -0
  32. package/dist/elements/agent-card.js +91 -0
  33. package/dist/elements/agent-handoff.d.ts +24 -0
  34. package/dist/elements/agent-handoff.js +53 -0
  35. package/dist/elements/agent-mode-badge.d.ts +72 -0
  36. package/dist/elements/agent-mode-badge.js +110 -0
  37. package/dist/elements/agent-plan.d.ts +24 -0
  38. package/dist/elements/agent-plan.js +74 -0
  39. package/dist/elements/agent-status.d.ts +29 -0
  40. package/dist/elements/agent-status.js +46 -0
  41. package/dist/elements/agent-surface.d.ts +65 -0
  42. package/dist/elements/agent-surface.js +68 -0
  43. package/dist/elements/animated-number.d.ts +86 -0
  44. package/dist/elements/animated-number.js +118 -0
  45. package/dist/elements/approval-card.d.ts +40 -0
  46. package/dist/elements/approval-card.js +78 -0
  47. package/dist/elements/artifact-card.d.ts +30 -0
  48. package/dist/elements/artifact-card.js +58 -0
  49. package/dist/elements/background-inbox.d.ts +39 -0
  50. package/dist/elements/background-inbox.js +60 -0
  51. package/dist/elements/canvas-split.d.ts +77 -0
  52. package/dist/elements/canvas-split.js +138 -0
  53. package/dist/elements/chart.d.ts +41 -0
  54. package/dist/elements/chart.js +117 -0
  55. package/dist/elements/chat-panel.d.ts +46 -0
  56. package/dist/elements/chat-panel.js +104 -0
  57. package/dist/elements/checkpoint-history.d.ts +31 -0
  58. package/dist/elements/checkpoint-history.js +65 -0
  59. package/dist/elements/clamp.d.ts +90 -0
  60. package/dist/elements/clamp.js +109 -0
  61. package/dist/elements/code-diff.d.ts +42 -0
  62. package/dist/elements/code-diff.js +69 -0
  63. package/dist/elements/code-runner.d.ts +38 -0
  64. package/dist/elements/code-runner.js +84 -0
  65. package/dist/elements/command-palette.d.ts +48 -0
  66. package/dist/elements/command-palette.js +129 -0
  67. package/dist/elements/compaction-row.d.ts +63 -0
  68. package/dist/elements/compaction-row.js +110 -0
  69. package/dist/elements/comparison-card.d.ts +47 -0
  70. package/dist/elements/comparison-card.js +69 -0
  71. package/dist/elements/composer.d.ts +274 -0
  72. package/dist/elements/composer.js +505 -0
  73. package/dist/elements/computer-use.d.ts +40 -0
  74. package/dist/elements/computer-use.js +92 -0
  75. package/dist/elements/confidence-marker.d.ts +39 -0
  76. package/dist/elements/confidence-marker.js +64 -0
  77. package/dist/elements/connection-state.d.ts +29 -0
  78. package/dist/elements/connection-state.js +66 -0
  79. package/dist/elements/context-breakdown.d.ts +30 -0
  80. package/dist/elements/context-breakdown.js +86 -0
  81. package/dist/elements/context-usage.d.ts +99 -0
  82. package/dist/elements/context-usage.js +225 -0
  83. package/dist/elements/conversation-search.d.ts +48 -0
  84. package/dist/elements/conversation-search.js +88 -0
  85. package/dist/elements/cost-meter.d.ts +33 -0
  86. package/dist/elements/cost-meter.js +75 -0
  87. package/dist/elements/data-table.d.ts +31 -0
  88. package/dist/elements/data-table.js +67 -0
  89. package/dist/elements/day-separator.d.ts +34 -0
  90. package/dist/elements/day-separator.js +50 -0
  91. package/dist/elements/diagram.d.ts +34 -0
  92. package/dist/elements/diagram.js +75 -0
  93. package/dist/elements/document-reference.d.ts +37 -0
  94. package/dist/elements/document-reference.js +66 -0
  95. package/dist/elements/draft-restore.d.ts +27 -0
  96. package/dist/elements/draft-restore.js +54 -0
  97. package/dist/elements/edit-message.d.ts +36 -0
  98. package/dist/elements/edit-message.js +77 -0
  99. package/dist/elements/elements.css +459 -0
  100. package/dist/elements/elicitation-form.d.ts +48 -0
  101. package/dist/elements/elicitation-form.js +106 -0
  102. package/dist/elements/empty-state.d.ts +52 -0
  103. package/dist/elements/empty-state.js +98 -0
  104. package/dist/elements/end-of-turn-summary.d.ts +60 -0
  105. package/dist/elements/end-of-turn-summary.js +75 -0
  106. package/dist/elements/error-state.d.ts +29 -0
  107. package/dist/elements/error-state.js +55 -0
  108. package/dist/elements/feedback-dialog.d.ts +36 -0
  109. package/dist/elements/feedback-dialog.js +81 -0
  110. package/dist/elements/file-tree.d.ts +45 -0
  111. package/dist/elements/file-tree.js +84 -0
  112. package/dist/elements/flow-graph.d.ts +45 -0
  113. package/dist/elements/flow-graph.js +78 -0
  114. package/dist/elements/generative/chart.js +200 -0
  115. package/dist/elements/generative/faults.js +111 -0
  116. package/dist/elements/generative/icons.d.ts +41 -0
  117. package/dist/elements/generative/icons.js +190 -0
  118. package/dist/elements/generative/intrinsics.js +483 -0
  119. package/dist/elements/generative/spec.d.ts +110 -0
  120. package/dist/elements/generative/spec.js +366 -0
  121. package/dist/elements/generative.css +1145 -0
  122. package/dist/elements/generative.d.ts +144 -0
  123. package/dist/elements/generative.js +126 -0
  124. package/dist/elements/guardrail-notice.d.ts +29 -0
  125. package/dist/elements/guardrail-notice.js +63 -0
  126. package/dist/elements/image-generation.d.ts +18 -0
  127. package/dist/elements/image-generation.js +64 -0
  128. package/dist/elements/index.d.ts +116 -0
  129. package/dist/elements/index.js +115 -0
  130. package/dist/elements/inline-citation.d.ts +43 -0
  131. package/dist/elements/inline-citation.js +93 -0
  132. package/dist/elements/job-progress.d.ts +49 -0
  133. package/dist/elements/job-progress.js +74 -0
  134. package/dist/elements/launcher-bubble.d.ts +34 -0
  135. package/dist/elements/launcher-bubble.js +72 -0
  136. package/dist/elements/live-region-announcer.d.ts +130 -0
  137. package/dist/elements/live-region-announcer.js +230 -0
  138. package/dist/elements/loading-state.d.ts +27 -0
  139. package/dist/elements/loading-state.js +36 -0
  140. package/dist/elements/map-answer.d.ts +38 -0
  141. package/dist/elements/map-answer.js +93 -0
  142. package/dist/elements/markdown.d.ts +131 -0
  143. package/dist/elements/markdown.js +528 -0
  144. package/dist/elements/math-block.d.ts +51 -0
  145. package/dist/elements/math-block.js +70 -0
  146. package/dist/elements/mcp-server-panel.d.ts +41 -0
  147. package/dist/elements/mcp-server-panel.js +115 -0
  148. package/dist/elements/memory-chips.d.ts +30 -0
  149. package/dist/elements/memory-chips.js +43 -0
  150. package/dist/elements/message-actions.d.ts +38 -0
  151. package/dist/elements/message-actions.js +71 -0
  152. package/dist/elements/message-attachment.d.ts +48 -0
  153. package/dist/elements/message-attachment.js +63 -0
  154. package/dist/elements/message-branches.d.ts +25 -0
  155. package/dist/elements/message-branches.js +65 -0
  156. package/dist/elements/message-pair.d.ts +33 -0
  157. package/dist/elements/message-pair.js +65 -0
  158. package/dist/elements/message-queue.d.ts +31 -0
  159. package/dist/elements/message-queue.js +80 -0
  160. package/dist/elements/message-timing.d.ts +33 -0
  161. package/dist/elements/message-timing.js +37 -0
  162. package/dist/elements/mobile-composer.d.ts +44 -0
  163. package/dist/elements/mobile-composer.js +88 -0
  164. package/dist/elements/model-picker.d.ts +38 -0
  165. package/dist/elements/model-picker.js +69 -0
  166. package/dist/elements/number-ticker.d.ts +18 -0
  167. package/dist/elements/number-ticker.js +47 -0
  168. package/dist/elements/onboarding.d.ts +30 -0
  169. package/dist/elements/onboarding.js +75 -0
  170. package/dist/elements/permission-grant.d.ts +35 -0
  171. package/dist/elements/permission-grant.js +86 -0
  172. package/dist/elements/permission-scopes.d.ts +215 -0
  173. package/dist/elements/permission-scopes.js +249 -0
  174. package/dist/elements/prompt-library.d.ts +43 -0
  175. package/dist/elements/prompt-library.js +117 -0
  176. package/dist/elements/queue-dock.d.ts +101 -0
  177. package/dist/elements/queue-dock.js +132 -0
  178. package/dist/elements/quota-banner.d.ts +26 -0
  179. package/dist/elements/quota-banner.js +66 -0
  180. package/dist/elements/quote-reply.d.ts +44 -0
  181. package/dist/elements/quote-reply.js +79 -0
  182. package/dist/elements/range.d.ts +29 -0
  183. package/dist/elements/range.js +45 -0
  184. package/dist/elements/read-aloud.d.ts +45 -0
  185. package/dist/elements/read-aloud.js +75 -0
  186. package/dist/elements/reasoning-effort.d.ts +36 -0
  187. package/dist/elements/reasoning-effort.js +67 -0
  188. package/dist/elements/reasoning-panel.d.ts +46 -0
  189. package/dist/elements/reasoning-panel.js +75 -0
  190. package/dist/elements/recommendation-card.d.ts +45 -0
  191. package/dist/elements/recommendation-card.js +83 -0
  192. package/dist/elements/regenerate-menu.d.ts +45 -0
  193. package/dist/elements/regenerate-menu.js +51 -0
  194. package/dist/elements/replay.d.ts +217 -0
  195. package/dist/elements/replay.js +498 -0
  196. package/dist/elements/research-report.d.ts +38 -0
  197. package/dist/elements/research-report.js +69 -0
  198. package/dist/elements/retrieval-chunks.d.ts +43 -0
  199. package/dist/elements/retrieval-chunks.js +81 -0
  200. package/dist/elements/revert-dock.d.ts +159 -0
  201. package/dist/elements/revert-dock.js +327 -0
  202. package/dist/elements/reviewable-diff.d.ts +45 -0
  203. package/dist/elements/reviewable-diff.js +110 -0
  204. package/dist/elements/risk-badge.d.ts +52 -0
  205. package/dist/elements/risk-badge.js +91 -0
  206. package/dist/elements/schedule-card.d.ts +42 -0
  207. package/dist/elements/schedule-card.js +90 -0
  208. package/dist/elements/score-breakdown.d.ts +47 -0
  209. package/dist/elements/score-breakdown.js +82 -0
  210. package/dist/elements/scroll-anchor.d.ts +32 -0
  211. package/dist/elements/scroll-anchor.js +121 -0
  212. package/dist/elements/settings-panel.d.ts +52 -0
  213. package/dist/elements/settings-panel.js +107 -0
  214. package/dist/elements/shared-conversation.d.ts +39 -0
  215. package/dist/elements/shared-conversation.js +68 -0
  216. package/dist/elements/sources.d.ts +33 -0
  217. package/dist/elements/sources.js +61 -0
  218. package/dist/elements/speaker-identity.d.ts +32 -0
  219. package/dist/elements/speaker-identity.js +51 -0
  220. package/dist/elements/spec-sheet.d.ts +31 -0
  221. package/dist/elements/spec-sheet.js +45 -0
  222. package/dist/elements/stopped-run.d.ts +22 -0
  223. package/dist/elements/stopped-run.js +50 -0
  224. package/dist/elements/streaming-text.d.ts +31 -0
  225. package/dist/elements/streaming-text.js +45 -0
  226. package/dist/elements/subagent-list.d.ts +37 -0
  227. package/dist/elements/subagent-list.js +79 -0
  228. package/dist/elements/suggestions.d.ts +30 -0
  229. package/dist/elements/suggestions.js +36 -0
  230. package/dist/elements/surfaces.d.ts +85 -0
  231. package/dist/elements/surfaces.js +107 -0
  232. package/dist/elements/tail-status.d.ts +131 -0
  233. package/dist/elements/tail-status.js +94 -0
  234. package/dist/elements/terminal-block.d.ts +29 -0
  235. package/dist/elements/terminal-block.js +54 -0
  236. package/dist/elements/thinking-indicator.d.ts +18 -0
  237. package/dist/elements/thinking-indicator.js +36 -0
  238. package/dist/elements/thread-list.d.ts +35 -0
  239. package/dist/elements/thread-list.js +68 -0
  240. package/dist/elements/thread-search.d.ts +42 -0
  241. package/dist/elements/thread-search.js +99 -0
  242. package/dist/elements/timeline.d.ts +37 -0
  243. package/dist/elements/timeline.js +46 -0
  244. package/dist/elements/todo-list.d.ts +42 -0
  245. package/dist/elements/todo-list.js +59 -0
  246. package/dist/elements/tool-call.d.ts +41 -0
  247. package/dist/elements/tool-call.js +85 -0
  248. package/dist/elements/tool-error.d.ts +39 -0
  249. package/dist/elements/tool-error.js +76 -0
  250. package/dist/elements/tool-group.d.ts +45 -0
  251. package/dist/elements/tool-group.js +71 -0
  252. package/dist/elements/tool-timeline.d.ts +65 -0
  253. package/dist/elements/tool-timeline.js +88 -0
  254. package/dist/elements/trace-waterfall.d.ts +37 -0
  255. package/dist/elements/trace-waterfall.js +69 -0
  256. package/dist/elements/transcript-rules.d.ts +67 -0
  257. package/dist/elements/transcript-rules.js +95 -0
  258. package/dist/elements/turn-footer.d.ts +74 -0
  259. package/dist/elements/turn-footer.js +101 -0
  260. package/dist/elements/typing-indicator.d.ts +16 -0
  261. package/dist/elements/typing-indicator.js +51 -0
  262. package/dist/elements/verdict-row.d.ts +89 -0
  263. package/dist/elements/verdict-row.js +150 -0
  264. package/dist/elements/vocabulary.d.ts +612 -0
  265. package/dist/elements/vocabulary.js +611 -0
  266. package/dist/elements/voice-conversation.d.ts +49 -0
  267. package/dist/elements/voice-conversation.js +123 -0
  268. package/dist/elements/web-preview.d.ts +32 -0
  269. package/dist/elements/web-preview.js +66 -0
  270. package/dist/elements/web-search.d.ts +37 -0
  271. package/dist/elements/web-search.js +66 -0
  272. package/dist/elements/work-collapse.d.ts +103 -0
  273. package/dist/elements/work-collapse.js +131 -0
  274. package/dist/forms/_chassis.d.ts +104 -4
  275. package/dist/forms/_chassis.js +104 -4
  276. package/dist/forms/input-group.d.ts +8 -3
  277. package/dist/forms/input-group.js +8 -3
  278. package/dist/forms/number-field.d.ts +3 -2
  279. package/dist/forms/number-field.js +3 -2
  280. package/dist/icons/containers.d.ts +89 -0
  281. package/dist/icons/containers.js +295 -0
  282. package/dist/icons/index.d.ts +2 -0
  283. package/dist/index.d.ts +12 -6
  284. package/dist/index.js +5 -1
  285. package/dist/instruments/_data-row.js +118 -0
  286. package/dist/instruments/data-row.d.ts +94 -0
  287. package/dist/instruments/data-row.js +151 -0
  288. package/dist/instruments/data-tree.d.ts +126 -0
  289. package/dist/instruments/data-tree.js +303 -0
  290. package/dist/instruments/index.d.ts +5 -2
  291. package/dist/instruments/index.js +4 -1
  292. package/dist/instruments/ledger.d.ts +105 -0
  293. package/dist/instruments/ledger.js +114 -0
  294. package/dist/instruments/table.d.ts +70 -2
  295. package/dist/instruments/table.js +133 -39
  296. package/dist/instruments/two-step-button.js +25 -6
  297. package/dist/layout/sidebar.d.ts +19 -1
  298. package/dist/layout/sidebar.js +19 -1
  299. package/dist/primitives/button.js +11 -1
  300. package/dist/primitives/chip.d.ts +35 -9
  301. package/dist/primitives/chip.js +97 -11
  302. package/dist/system/agent-skin.d.ts +27 -0
  303. package/dist/system/agent-skin.js +20 -0
  304. package/dist/system/portal.d.ts +5 -3
  305. package/dist/system/portal.js +19 -5
  306. package/dist/system/theme-provider.js +54 -9
  307. package/dist/system/use-density.d.ts +9 -0
  308. package/dist/system/use-density.js +9 -0
  309. package/dist/system/use-isomorphic-layout-effect.js +19 -1
  310. package/dist/theming/_presets.d.ts +1 -1
  311. package/dist/theming/_presets.js +74 -11
  312. package/dist/theming/contrast.d.ts +16 -4
  313. package/dist/theming/contrast.js +33 -6
  314. package/dist/theming/create-theme.d.ts +6 -2
  315. package/dist/theming/create-theme.js +32 -5
  316. package/dist/theming/serialize.d.ts +10 -1
  317. package/dist/theming/serialize.js +62 -8
  318. package/manifest/components/activity-graph.json +88 -0
  319. package/manifest/components/agent-card.json +120 -0
  320. package/manifest/components/agent-handoff.json +87 -0
  321. package/manifest/components/agent-mode-badge.json +84 -0
  322. package/manifest/components/agent-plan.json +67 -0
  323. package/manifest/components/agent-status.json +73 -0
  324. package/manifest/components/agent-surface.json +78 -0
  325. package/manifest/components/alert-dialog.json +1 -1
  326. package/manifest/components/animated-number.json +67 -0
  327. package/manifest/components/app-shell.json +142 -9
  328. package/manifest/components/approval-card.json +106 -0
  329. package/manifest/components/artifact-card.json +81 -0
  330. package/manifest/components/audience-icon.json +52 -0
  331. package/manifest/components/autocomplete.json +2 -0
  332. package/manifest/components/background-inbox.json +71 -0
  333. package/manifest/components/branch-picker.json +124 -0
  334. package/manifest/components/button.json +1 -0
  335. package/manifest/components/canvas-split-body.json +62 -0
  336. package/manifest/components/canvas-split-document.json +54 -0
  337. package/manifest/components/canvas-split-header.json +83 -0
  338. package/manifest/components/canvas-split-line.json +62 -0
  339. package/manifest/components/canvas-split-message.json +62 -0
  340. package/manifest/components/canvas-split-thread.json +54 -0
  341. package/manifest/components/canvas-split.json +60 -0
  342. package/manifest/components/catalogue-icon.json +52 -0
  343. package/manifest/components/channel-beta-icon.json +52 -0
  344. package/manifest/components/channel-released-icon.json +52 -0
  345. package/manifest/components/chart.json +93 -0
  346. package/manifest/components/chat-empty-state.json +55 -0
  347. package/manifest/components/chat-panel-assistant-message.json +51 -0
  348. package/manifest/components/chat-panel-composer.json +66 -0
  349. package/manifest/components/chat-panel-messages.json +51 -0
  350. package/manifest/components/chat-panel-typing.json +51 -0
  351. package/manifest/components/chat-panel-user-message.json +51 -0
  352. package/manifest/components/chat-panel.json +57 -0
  353. package/manifest/components/checkpoint-history.json +80 -0
  354. package/manifest/components/chip.json +24 -12
  355. package/manifest/components/clamp.json +102 -0
  356. package/manifest/components/cli-tool-icon.json +52 -0
  357. package/manifest/components/code-diff.json +87 -0
  358. package/manifest/components/code-runner.json +97 -0
  359. package/manifest/components/color-field.json +2 -0
  360. package/manifest/components/color-picker.json +2 -0
  361. package/manifest/components/combobox.json +2 -0
  362. package/manifest/components/compaction-row.json +100 -0
  363. package/manifest/components/comparison-card.json +83 -0
  364. package/manifest/components/composer-actions.json +65 -0
  365. package/manifest/components/composer-attach-button.json +65 -0
  366. package/manifest/components/composer-attachment-chip.json +75 -0
  367. package/manifest/components/composer-attachments.json +60 -0
  368. package/manifest/components/composer-bar.json +73 -0
  369. package/manifest/components/composer-command-item.json +79 -0
  370. package/manifest/components/composer-context.json +67 -0
  371. package/manifest/components/composer-input.json +73 -0
  372. package/manifest/components/composer-menu-item.json +72 -0
  373. package/manifest/components/composer-menu.json +79 -0
  374. package/manifest/components/composer-model-item.json +75 -0
  375. package/manifest/components/composer-model-trigger.json +75 -0
  376. package/manifest/components/composer-person-item.json +79 -0
  377. package/manifest/components/composer-send.json +80 -0
  378. package/manifest/components/composer-toolbar.json +65 -0
  379. package/manifest/components/composer-voice-button.json +68 -0
  380. package/manifest/components/composer-voice.json +75 -0
  381. package/manifest/components/composer.json +2 -0
  382. package/manifest/components/computer-use.json +84 -0
  383. package/manifest/components/confidence-marker.json +74 -0
  384. package/manifest/components/connection-state.json +84 -0
  385. package/manifest/components/context-breakdown.json +65 -0
  386. package/manifest/components/context-usage.json +85 -0
  387. package/manifest/components/conversation-search.json +92 -0
  388. package/manifest/components/cost-meter.json +74 -0
  389. package/manifest/components/cue-portal-frame.json +1 -1
  390. package/manifest/components/data-row.json +203 -0
  391. package/manifest/components/data-tree.json +151 -0
  392. package/manifest/components/date-field.json +2 -0
  393. package/manifest/components/date-picker.json +2 -0
  394. package/manifest/components/date-range-picker.json +2 -0
  395. package/manifest/components/day-separator.json +58 -0
  396. package/manifest/components/delegation-card.json +1 -1
  397. package/manifest/components/density.json +1 -1
  398. package/manifest/components/diagram.json +100 -0
  399. package/manifest/components/document-reference.json +90 -0
  400. package/manifest/components/draft-restore.json +82 -0
  401. package/manifest/components/drawer.json +1 -1
  402. package/manifest/components/dropdown-menu.json +1 -1
  403. package/manifest/components/edit-message.json +105 -0
  404. package/manifest/components/elements-command-palette.json +100 -0
  405. package/manifest/components/elements-composer.json +71 -0
  406. package/manifest/components/elements-data-table.json +68 -0
  407. package/manifest/components/elements-timeline.json +69 -0
  408. package/manifest/components/elicitation-form.json +103 -0
  409. package/manifest/components/empty-state-composer.json +64 -0
  410. package/manifest/components/empty-state-greeting.json +49 -0
  411. package/manifest/components/empty-state-suggestion.json +57 -0
  412. package/manifest/components/empty-state-suggestions.json +49 -0
  413. package/manifest/components/end-of-turn-summary.json +77 -0
  414. package/manifest/components/env-var-input.json +2 -0
  415. package/manifest/components/error-state.json +80 -0
  416. package/manifest/components/feedback-dialog.json +107 -0
  417. package/manifest/components/file-tree.json +83 -0
  418. package/manifest/components/flow-graph.json +75 -0
  419. package/manifest/components/folder-icon.json +52 -0
  420. package/manifest/components/frac.json +59 -0
  421. package/manifest/components/generation-loader.json +64 -0
  422. package/manifest/components/generative-ui.json +93 -0
  423. package/manifest/components/guardrail-notice.json +91 -0
  424. package/manifest/components/hover-card.json +1 -1
  425. package/manifest/components/image-generation.json +67 -0
  426. package/manifest/components/info-tip.json +1 -1
  427. package/manifest/components/inline-citation.json +77 -0
  428. package/manifest/components/input-group.json +4 -2
  429. package/manifest/components/input.json +3 -1
  430. package/manifest/components/job-progress.json +96 -0
  431. package/manifest/components/launcher-bubble.json +105 -0
  432. package/manifest/components/ledger.json +187 -0
  433. package/manifest/components/live-region-announcer.json +79 -0
  434. package/manifest/components/map-answer.json +83 -0
  435. package/manifest/components/markdown-text.json +94 -0
  436. package/manifest/components/math-block.json +74 -0
  437. package/manifest/components/mcp-server-icon.json +52 -0
  438. package/manifest/components/mcp-server-panel.json +87 -0
  439. package/manifest/components/memory-chips.json +65 -0
  440. package/manifest/components/message-actions.json +99 -0
  441. package/manifest/components/message-attachments.json +63 -0
  442. package/manifest/components/message-branches.json +71 -0
  443. package/manifest/components/message-list.json +1 -1
  444. package/manifest/components/message-pair.json +86 -0
  445. package/manifest/components/message-queue.json +74 -0
  446. package/manifest/components/message-timing.json +62 -0
  447. package/manifest/components/mobile-composer.json +126 -0
  448. package/manifest/components/model-picker.json +76 -0
  449. package/manifest/components/multi-select.json +2 -0
  450. package/manifest/components/musical-time-input.json +2 -0
  451. package/manifest/components/node-card.json +1 -1
  452. package/manifest/components/node-handle.json +1 -1
  453. package/manifest/components/number-field.json +3 -1
  454. package/manifest/components/number-ticker.json +61 -0
  455. package/manifest/components/onboarding.json +84 -0
  456. package/manifest/components/otp-field.json +9 -7
  457. package/manifest/components/password-input.json +2 -0
  458. package/manifest/components/permission-grant.json +92 -0
  459. package/manifest/components/permission-scopes.json +139 -0
  460. package/manifest/components/popover.json +1 -1
  461. package/manifest/components/prompt-library.json +99 -0
  462. package/manifest/components/queue-dock.json +110 -0
  463. package/manifest/components/quota-banner.json +94 -0
  464. package/manifest/components/quote-reply.json +105 -0
  465. package/manifest/components/read-aloud.json +111 -0
  466. package/manifest/components/reasoning-effort.json +81 -0
  467. package/manifest/components/reasoning-panel.json +108 -0
  468. package/manifest/components/recommendation-card.json +107 -0
  469. package/manifest/components/regenerate-menu.json +89 -0
  470. package/manifest/components/replay-player.json +102 -0
  471. package/manifest/components/research-report.json +76 -0
  472. package/manifest/components/retrieval-chunks.json +84 -0
  473. package/manifest/components/revert-dock.json +150 -0
  474. package/manifest/components/reviewable-diff.json +93 -0
  475. package/manifest/components/risk-badge.json +74 -0
  476. package/manifest/components/schedule-card.json +101 -0
  477. package/manifest/components/score-breakdown.json +91 -0
  478. package/manifest/components/scroll-anchor.json +72 -0
  479. package/manifest/components/scroll-area.json +7 -7
  480. package/manifest/components/scrub-input.json +2 -0
  481. package/manifest/components/search-input.json +9 -7
  482. package/manifest/components/segmented-control.json +21 -21
  483. package/manifest/components/select.json +1 -0
  484. package/manifest/components/settings-panel.json +118 -0
  485. package/manifest/components/shared-conversation.json +89 -0
  486. package/manifest/components/shimmer-label.json +59 -0
  487. package/manifest/components/skill-icon.json +52 -0
  488. package/manifest/components/sources.json +83 -0
  489. package/manifest/components/speaker-identity.json +61 -0
  490. package/manifest/components/spec-sheet.json +80 -0
  491. package/manifest/components/stack-icon.json +52 -0
  492. package/manifest/components/stacks-matrix-icon.json +52 -0
  493. package/manifest/components/stat.json +1 -1
  494. package/manifest/components/status-bar.json +146 -12
  495. package/manifest/components/status-dot.json +1 -1
  496. package/manifest/components/stopped-run.json +81 -0
  497. package/manifest/components/streaming-text.json +71 -0
  498. package/manifest/components/sub.json +44 -0
  499. package/manifest/components/subagent-list.json +88 -0
  500. package/manifest/components/suggestions.json +84 -0
  501. package/manifest/components/sup.json +44 -0
  502. package/manifest/components/swap-label.json +71 -0
  503. package/manifest/components/table-scroll-region.json +6 -0
  504. package/manifest/components/table.json +88 -4
  505. package/manifest/components/tags-input.json +2 -0
  506. package/manifest/components/tail-status.json +109 -0
  507. package/manifest/components/terminal-block.json +91 -0
  508. package/manifest/components/textarea.json +3 -1
  509. package/manifest/components/theme-provider.json +2 -2
  510. package/manifest/components/thinking-indicator.json +63 -0
  511. package/manifest/components/thread-list.json +76 -0
  512. package/manifest/components/thread-search.json +90 -0
  513. package/manifest/components/threshold-rail.json +2 -2
  514. package/manifest/components/time-boundary.json +62 -0
  515. package/manifest/components/time-field.json +2 -0
  516. package/manifest/components/timeline.json +1 -1
  517. package/manifest/components/title-bar.json +1 -1
  518. package/manifest/components/todo-list.json +69 -0
  519. package/manifest/components/toggle-group.json +9 -7
  520. package/manifest/components/toggle.json +2 -0
  521. package/manifest/components/token-editor.json +1 -1
  522. package/manifest/components/tool-call-card.json +200 -0
  523. package/manifest/components/tool-call.json +119 -0
  524. package/manifest/components/tool-error.json +114 -0
  525. package/manifest/components/tool-group.json +83 -0
  526. package/manifest/components/tool-timeline.json +119 -0
  527. package/manifest/components/toolbar.json +7 -7
  528. package/manifest/components/tooltip.json +1 -1
  529. package/manifest/components/trace-waterfall.json +74 -0
  530. package/manifest/components/turn-footer.json +105 -0
  531. package/manifest/components/typing-indicator.json +53 -0
  532. package/manifest/components/unread-divider.json +55 -0
  533. package/manifest/components/usage-chart.json +1 -1
  534. package/manifest/components/verdict-row.json +91 -0
  535. package/manifest/components/voice-conversation.json +109 -0
  536. package/manifest/components/web-preview.json +87 -0
  537. package/manifest/components/web-search.json +92 -0
  538. package/manifest/components/work-collapse.json +102 -0
  539. package/manifest/manifest.json +2736 -60
  540. package/manifest/tokens.json +22 -1
  541. package/package.json +44 -2
@@ -2,21 +2,36 @@ import { ClassProp, VariantProps } from "../lib/cva.js";
2
2
  import * as React from "react";
3
3
  //#region src/primitives/chip.d.ts
4
4
  /**
5
- * The tinted-chip recipe: `bg-<tone>/10 border-<tone>/35 text-<tone>`.
5
+ * The tinted-chip recipe: `bg-<tone>/10 border-<tone>/35 text-<tone>`, and the
6
+ * two quieter readings of it — `outline`, which drops the fill, and `tag`,
7
+ * which drops the fill and the voice with it.
6
8
  *
7
- * Tone and fill are split across `variants` and `compoundVariants` on purpose.
8
- * Emitting `bg-<tone>/10` from the tone map and then cancelling it with
9
- * `bg-transparent` for the outline variant would leave two competing background
10
- * utilities in the class string and lean on `tailwind-merge` to pick a winner —
11
- * which it cannot do reliably for token-named colours. Compound variants emit
12
- * exactly one fill, always.
9
+ * Every property that varies is emitted from exactly one place: one rim, one
10
+ * ink, one fill, one gutter, one type size, always. Emitting `bg-<tone>/10`
11
+ * from the tone map and then cancelling it with `bg-transparent` would leave
12
+ * two competing utilities in the class string, and `chipVariants` is exported —
13
+ * a caller who uses it without `cn` gets a raw string where the winner is
14
+ * decided by stylesheet order rather than by which utility was written last.
15
+ * `h-chip h-4` proves the point at the other end: `tailwind-merge` cannot even
16
+ * see that as a conflict, because `chip` is a token name and not a scale step.
17
+ * So nothing here cancels anything. What varies moves into `variants` or
18
+ * `compoundVariants` until only one of it is ever emitted.
19
+ *
20
+ * That is why `neutral` carries no rim of its own. The other six tones rim
21
+ * themselves at `/35` in all three variants, but the neutral line has two
22
+ * weights in this system: `--cue-border` is a box edge, and a chip is a box;
23
+ * `--cue-hair-strong` is the rule between things, and a tag is a mark on the
24
+ * page rather than a container. The rim is therefore a compound of tone and
25
+ * variant, exactly as the fill is.
13
26
  *
14
27
  * @example
15
28
  * <span className={chipVariants({ tone: "danger", variant: "outline" })}>fault</span>
29
+ * @example
30
+ * <span className={chipVariants({ variant: "tag" })}>mcp</span>
16
31
  */
17
32
  declare const chipVariants: (props?: ({
18
- tone?: "info" | "warn" | "danger" | "accent" | "ok" | "busy" | "neutral" | null | undefined;
19
- variant?: "outline" | "tinted" | null | undefined;
33
+ tone?: "danger" | "info" | "warn" | "accent" | "ok" | "busy" | "neutral" | null | undefined;
34
+ variant?: "outline" | "tinted" | "tag" | null | undefined;
20
35
  interactive?: boolean | null | undefined;
21
36
  } & ClassProp) | undefined) => string;
22
37
  interface ChipProps extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof chipVariants> {
@@ -37,10 +52,21 @@ interface ChipProps extends React.HTMLAttributes<HTMLElement>, VariantProps<type
37
52
  * plus `neutral` and `accent`, so a chip, a `StatusDot` and a `Meter` always
38
53
  * agree on what "warn" looks like.
39
54
  *
55
+ * `variant` sets how loudly it says it. `tinted` is the chip proper — a tone
56
+ * tint behind tone ink. `outline` drops the fill and keeps the voice, for a
57
+ * chip on an already-busy ground. `tag` drops both: a hairline rim, micro type
58
+ * and closed tracking, for the facts that sit *beside* a row's name — a kind, a
59
+ * lifecycle, a scope — where a row full of tinted chips would read as a row of
60
+ * buttons. All three keep `h-chip`, so a mixed row still has one baseline.
61
+ *
40
62
  * @example
41
63
  * <Chip tone="ok">online</Chip>
42
64
  * @example
43
65
  * <Chip tone="accent" variant="outline" interactive onClick={toggle}>dimmer</Chip>
66
+ * @example
67
+ * <Chip variant="tag">mcp</Chip>
68
+ * @example
69
+ * <Chip tone="danger" variant="tag">needs auth</Chip>
44
70
  */
45
71
  declare const Chip: React.ForwardRefExoticComponent<ChipProps & React.RefAttributes<HTMLElement>>;
46
72
  //#endregion
@@ -5,22 +5,37 @@ import * as React from "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/primitives/chip.tsx
7
7
  /**
8
- * The tinted-chip recipe: `bg-<tone>/10 border-<tone>/35 text-<tone>`.
8
+ * The tinted-chip recipe: `bg-<tone>/10 border-<tone>/35 text-<tone>`, and the
9
+ * two quieter readings of it — `outline`, which drops the fill, and `tag`,
10
+ * which drops the fill and the voice with it.
9
11
  *
10
- * Tone and fill are split across `variants` and `compoundVariants` on purpose.
11
- * Emitting `bg-<tone>/10` from the tone map and then cancelling it with
12
- * `bg-transparent` for the outline variant would leave two competing background
13
- * utilities in the class string and lean on `tailwind-merge` to pick a winner —
14
- * which it cannot do reliably for token-named colours. Compound variants emit
15
- * exactly one fill, always.
12
+ * Every property that varies is emitted from exactly one place: one rim, one
13
+ * ink, one fill, one gutter, one type size, always. Emitting `bg-<tone>/10`
14
+ * from the tone map and then cancelling it with `bg-transparent` would leave
15
+ * two competing utilities in the class string, and `chipVariants` is exported —
16
+ * a caller who uses it without `cn` gets a raw string where the winner is
17
+ * decided by stylesheet order rather than by which utility was written last.
18
+ * `h-chip h-4` proves the point at the other end: `tailwind-merge` cannot even
19
+ * see that as a conflict, because `chip` is a token name and not a scale step.
20
+ * So nothing here cancels anything. What varies moves into `variants` or
21
+ * `compoundVariants` until only one of it is ever emitted.
22
+ *
23
+ * That is why `neutral` carries no rim of its own. The other six tones rim
24
+ * themselves at `/35` in all three variants, but the neutral line has two
25
+ * weights in this system: `--cue-border` is a box edge, and a chip is a box;
26
+ * `--cue-hair-strong` is the rule between things, and a tag is a mark on the
27
+ * page rather than a container. The rim is therefore a compound of tone and
28
+ * variant, exactly as the fill is.
16
29
  *
17
30
  * @example
18
31
  * <span className={chipVariants({ tone: "danger", variant: "outline" })}>fault</span>
32
+ * @example
33
+ * <span className={chipVariants({ variant: "tag" })}>mcp</span>
19
34
  */
20
- const chipVariants = cva("inline-flex h-chip select-none items-center justify-center gap-(--cue-space-2) whitespace-nowrap rounded-(--radius-control) border px-(--cue-space-3) font-mono text-(length:--cue-text-label) leading-none uppercase tracking-[0.15em] outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent", {
35
+ const chipVariants = cva("inline-flex h-chip select-none items-center justify-center gap-(--cue-space-2) whitespace-nowrap rounded-(--radius-control) border font-mono leading-none uppercase outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent", {
21
36
  variants: {
22
37
  tone: {
23
- neutral: "border-border text-fg-muted",
38
+ neutral: "text-fg-muted",
24
39
  accent: "border-accent/35 text-accent",
25
40
  ok: "border-ok/35 text-ok",
26
41
  busy: "border-busy/35 text-busy",
@@ -29,8 +44,9 @@ const chipVariants = cva("inline-flex h-chip select-none items-center justify-ce
29
44
  info: "border-info/35 text-info"
30
45
  },
31
46
  variant: {
32
- tinted: "",
33
- outline: "bg-transparent"
47
+ tinted: "px-(--cue-space-3) text-(length:--cue-text-label) tracking-[0.15em]",
48
+ outline: "bg-transparent px-(--cue-space-3) text-(length:--cue-text-label) tracking-[0.15em]",
49
+ tag: "bg-transparent px-(--cue-space-2) text-(length:--cue-text-micro) tracking-[0.06em]"
34
50
  },
35
51
  interactive: {
36
52
  true: "cursor-pointer disabled:pointer-events-none disabled:opacity-40",
@@ -38,6 +54,16 @@ const chipVariants = cva("inline-flex h-chip select-none items-center justify-ce
38
54
  }
39
55
  },
40
56
  compoundVariants: [
57
+ {
58
+ tone: "neutral",
59
+ variant: ["tinted", "outline"],
60
+ class: "border-border"
61
+ },
62
+ {
63
+ tone: "neutral",
64
+ variant: "tag",
65
+ class: "border-(--cue-hair-strong)"
66
+ },
41
67
  {
42
68
  tone: "neutral",
43
69
  variant: "tinted",
@@ -75,38 +101,87 @@ const chipVariants = cva("inline-flex h-chip select-none items-center justify-ce
75
101
  },
76
102
  {
77
103
  tone: "neutral",
104
+ variant: ["tinted", "outline"],
78
105
  interactive: true,
79
106
  class: "hover:border-border-strong hover:text-fg"
80
107
  },
108
+ {
109
+ tone: "neutral",
110
+ variant: "tag",
111
+ interactive: true,
112
+ class: "hover:border-border hover:text-fg"
113
+ },
81
114
  {
82
115
  tone: "accent",
116
+ variant: ["tinted", "outline"],
83
117
  interactive: true,
84
118
  class: "hover:border-accent/60 hover:bg-accent/20"
85
119
  },
120
+ {
121
+ tone: "accent",
122
+ variant: "tag",
123
+ interactive: true,
124
+ class: "hover:border-accent/60"
125
+ },
86
126
  {
87
127
  tone: "ok",
128
+ variant: ["tinted", "outline"],
88
129
  interactive: true,
89
130
  class: "hover:border-ok/60 hover:bg-ok/20"
90
131
  },
132
+ {
133
+ tone: "ok",
134
+ variant: "tag",
135
+ interactive: true,
136
+ class: "hover:border-ok/60"
137
+ },
91
138
  {
92
139
  tone: "busy",
140
+ variant: ["tinted", "outline"],
93
141
  interactive: true,
94
142
  class: "hover:border-busy/60 hover:bg-busy/20"
95
143
  },
144
+ {
145
+ tone: "busy",
146
+ variant: "tag",
147
+ interactive: true,
148
+ class: "hover:border-busy/60"
149
+ },
96
150
  {
97
151
  tone: "warn",
152
+ variant: ["tinted", "outline"],
98
153
  interactive: true,
99
154
  class: "hover:border-warn/60 hover:bg-warn/20"
100
155
  },
156
+ {
157
+ tone: "warn",
158
+ variant: "tag",
159
+ interactive: true,
160
+ class: "hover:border-warn/60"
161
+ },
101
162
  {
102
163
  tone: "danger",
164
+ variant: ["tinted", "outline"],
103
165
  interactive: true,
104
166
  class: "hover:border-danger/60 hover:bg-danger/20"
105
167
  },
168
+ {
169
+ tone: "danger",
170
+ variant: "tag",
171
+ interactive: true,
172
+ class: "hover:border-danger/60"
173
+ },
106
174
  {
107
175
  tone: "info",
176
+ variant: ["tinted", "outline"],
108
177
  interactive: true,
109
178
  class: "hover:border-info/60 hover:bg-info/20"
179
+ },
180
+ {
181
+ tone: "info",
182
+ variant: "tag",
183
+ interactive: true,
184
+ class: "hover:border-info/60"
110
185
  }
111
186
  ],
112
187
  defaultVariants: {
@@ -122,10 +197,21 @@ const chipVariants = cva("inline-flex h-chip select-none items-center justify-ce
122
197
  * plus `neutral` and `accent`, so a chip, a `StatusDot` and a `Meter` always
123
198
  * agree on what "warn" looks like.
124
199
  *
200
+ * `variant` sets how loudly it says it. `tinted` is the chip proper — a tone
201
+ * tint behind tone ink. `outline` drops the fill and keeps the voice, for a
202
+ * chip on an already-busy ground. `tag` drops both: a hairline rim, micro type
203
+ * and closed tracking, for the facts that sit *beside* a row's name — a kind, a
204
+ * lifecycle, a scope — where a row full of tinted chips would read as a row of
205
+ * buttons. All three keep `h-chip`, so a mixed row still has one baseline.
206
+ *
125
207
  * @example
126
208
  * <Chip tone="ok">online</Chip>
127
209
  * @example
128
210
  * <Chip tone="accent" variant="outline" interactive onClick={toggle}>dimmer</Chip>
211
+ * @example
212
+ * <Chip variant="tag">mcp</Chip>
213
+ * @example
214
+ * <Chip tone="danger" variant="tag">needs auth</Chip>
129
215
  */
130
216
  const Chip = React.forwardRef(function Chip({ className, tone, variant, interactive = false, disabled, children, ...elementProps }, ref) {
131
217
  const classes = cn(chipVariants({
@@ -0,0 +1,27 @@
1
+ import "react";
2
+ //#region src/system/agent-skin.d.ts
3
+ /**
4
+ * Which value-set paints the elements family inside this subtree.
5
+ *
6
+ * - `cue` — the default, and the one that needs no stylesheet: the vendored
7
+ * elements were rewritten onto `--cue-*` tokens, so they are already this
8
+ * system's components.
9
+ * - `aui` — supersede mode. `@cueplusplus/ui/elements.css` re-points those same
10
+ * tokens to assistant-ui's own values under `[data-cue-skin="aui"]`, so one
11
+ * DOM paints two ways with no branching in any component.
12
+ */
13
+ type AgentSkin = "cue" | "aui";
14
+ /**
15
+ * How far the supersede island goes: colour only, or colour and geometry.
16
+ *
17
+ * - `cue-metrics` — the default. Colour is re-pointed; cue's type scale, radius
18
+ * ladder and density ladder still apply, so an island tracks the density of
19
+ * the console around it.
20
+ * - `upstream` — assistant-ui's metrics too: their radii, their literal 13.5 /
21
+ * 12 / 11 px type, `--spacing` pinned at Tailwind's default. Density stops at
22
+ * the island edge, which is the point — this is the mode for showing an
23
+ * element exactly as its authors drew it.
24
+ */
25
+ type AgentFidelity = "upstream" | "cue-metrics";
26
+ //#endregion
27
+ export { AgentFidelity, AgentSkin };
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ //#region src/system/agent-skin.ts
4
+ /**
5
+ * Nearest ambient skin island. `null` means there is none, which is the case
6
+ * for almost every tree — and is why the portal stamp *removes* these two
7
+ * attributes rather than defaulting them.
8
+ *
9
+ * It lives in `system/` rather than beside `AgentSurface` for one reason: the
10
+ * portal stamp reads its axes from React context, never from the DOM (a portal
11
+ * is mounted outside its owner's subtree, so DOM discovery would read the
12
+ * body's values). `system/portal.tsx` is in the core barrel's import graph and
13
+ * `elements/` is behind an optional peer, so the context has to sit on the side
14
+ * that both can reach.
15
+ *
16
+ * @internal Consumers use `<AgentSurface>` from `@cueplusplus/ui/elements`.
17
+ */
18
+ const AgentSkinContext = React.createContext(null);
19
+ //#endregion
20
+ export { AgentSkinContext };
@@ -6,7 +6,9 @@ import * as React from "react";
6
6
  *
7
7
  * Returns a `container` element appended to `document.body` and stamped with
8
8
  * `data-theme` / `data-density` / `data-font` / `data-mode` (plus
9
- * `--cue-font-scale`) copied from the nearest provider and density island. The container is
9
+ * `--cue-font-scale`) copied from the nearest provider and density island, and
10
+ * with `data-cue-skin` / `data-cue-fidelity` when the caller sits inside an
11
+ * `AgentSurface` island. The container is
10
12
  * `display: contents`, so it changes no layout and creates no containing block —
11
13
  * fixed-position overlay content behaves exactly as if it were a direct child of
12
14
  * `<body>`.
@@ -38,8 +40,8 @@ interface CuePortalFrameProps {
38
40
  * chosen (a third-party overlay, or content already portaled by something else).
39
41
  *
40
42
  * Wraps `children` in a `display: contents` element carrying the same
41
- * `data-theme` / `data-density` / `data-font` / `data-mode` stamp and
42
- * `--cue-font-scale` as {@link useCuePortalProps}. Prefer the hook — a stamped container costs one
43
+ * `data-theme` / `data-density` / `data-font` / `data-mode` / `data-cue-skin` /
44
+ * `data-cue-fidelity` stamp and `--cue-font-scale` as {@link useCuePortalProps}. Prefer the hook — a stamped container costs one
43
45
  * element per overlay instead of one per render tree — and reach for this only
44
46
  * when the container prop is not available.
45
47
  *
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
3
+ import { AgentSkinContext } from "./agent-skin.js";
3
4
  import { DensityContext } from "./density.js";
4
5
  import { FontFamiliesContext, FontScaleContext, ThemeContext } from "./theme-provider.js";
5
6
  import * as React from "react";
@@ -25,13 +26,16 @@ function usePortalStamp() {
25
26
  const island = React.useContext(DensityContext);
26
27
  const fontScale = React.useContext(FontScaleContext);
27
28
  const fontFamilies = React.useContext(FontFamiliesContext);
29
+ const skin = React.useContext(AgentSkinContext);
28
30
  return {
29
31
  theme: theme?.theme ?? DEFAULT_THEME,
30
32
  density: island ?? theme?.density ?? "compact",
31
33
  mode: theme?.mode ?? DEFAULT_MODE,
32
34
  font: theme?.font ?? DEFAULT_FONT,
33
35
  fontScale,
34
- fontFamilies
36
+ fontFamilies,
37
+ skin: skin?.skin ?? null,
38
+ fidelity: skin?.fidelity ?? null
35
39
  };
36
40
  }
37
41
  /**
@@ -40,7 +44,9 @@ function usePortalStamp() {
40
44
  *
41
45
  * Returns a `container` element appended to `document.body` and stamped with
42
46
  * `data-theme` / `data-density` / `data-font` / `data-mode` (plus
43
- * `--cue-font-scale`) copied from the nearest provider and density island. The container is
47
+ * `--cue-font-scale`) copied from the nearest provider and density island, and
48
+ * with `data-cue-skin` / `data-cue-fidelity` when the caller sits inside an
49
+ * `AgentSurface` island. The container is
44
50
  * `display: contents`, so it changes no layout and creates no containing block —
45
51
  * fixed-position overlay content behaves exactly as if it were a direct child of
46
52
  * `<body>`.
@@ -85,7 +91,9 @@ function useCuePortalProps() {
85
91
  stamp.mode,
86
92
  stamp.fontScale,
87
93
  stamp.fontFamilies?.sans,
88
- stamp.fontFamilies?.mono
94
+ stamp.fontFamilies?.mono,
95
+ stamp.skin,
96
+ stamp.fidelity
89
97
  ]);
90
98
  return React.useMemo(() => container === null ? {} : { container }, [container]);
91
99
  }
@@ -95,6 +103,10 @@ function applyStamp(element, stamp) {
95
103
  element.setAttribute("data-density", stamp.density);
96
104
  element.setAttribute("data-font", stamp.font);
97
105
  element.setAttribute("data-mode", stamp.mode);
106
+ if (stamp.skin === null) element.removeAttribute("data-cue-skin");
107
+ else element.setAttribute("data-cue-skin", stamp.skin);
108
+ if (stamp.fidelity === null) element.removeAttribute("data-cue-fidelity");
109
+ else element.setAttribute("data-cue-fidelity", stamp.fidelity);
98
110
  if (stamp.fontScale === null) element.style.removeProperty(FONT_SCALE_PROPERTY);
99
111
  else element.style.setProperty(FONT_SCALE_PROPERTY, String(stamp.fontScale));
100
112
  setOptionalProperty(element, FONT_SANS_PROPERTY, stamp.fontFamilies?.sans);
@@ -109,8 +121,8 @@ function setOptionalProperty(element, property, value) {
109
121
  * chosen (a third-party overlay, or content already portaled by something else).
110
122
  *
111
123
  * Wraps `children` in a `display: contents` element carrying the same
112
- * `data-theme` / `data-density` / `data-font` / `data-mode` stamp and
113
- * `--cue-font-scale` as {@link useCuePortalProps}. Prefer the hook — a stamped container costs one
124
+ * `data-theme` / `data-density` / `data-font` / `data-mode` / `data-cue-skin` /
125
+ * `data-cue-fidelity` stamp and `--cue-font-scale` as {@link useCuePortalProps}. Prefer the hook — a stamped container costs one
114
126
  * element per overlay instead of one per render tree — and reach for this only
115
127
  * when the container prop is not available.
116
128
  *
@@ -132,6 +144,8 @@ function CuePortalFrame({ children, className, style }) {
132
144
  "data-density": stamp.density,
133
145
  "data-font": stamp.font,
134
146
  "data-mode": stamp.mode,
147
+ "data-cue-skin": stamp.skin ?? void 0,
148
+ "data-cue-fidelity": stamp.fidelity ?? void 0,
135
149
  className,
136
150
  style: frameStyle,
137
151
  children
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
- import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
3
+ import { useIsomorphicInsertionEffect, useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
4
4
  import { DEFAULT_DENSITY as DEFAULT_DENSITY$1, DENSITY_LEVELS, DensityContext } from "./density.js";
5
5
  import { DEFAULT_STORAGE_KEY } from "./prepaint.js";
6
6
  import * as React from "react";
@@ -51,6 +51,30 @@ function readPreferences(storageKey) {
51
51
  return {};
52
52
  }
53
53
  }
54
+ /** Resolve `"system"` the way {@link prepaintScript} resolves it: against the media query. */
55
+ function resolveMode(mode) {
56
+ if (mode !== "system") return mode;
57
+ if (typeof matchMedia !== "function") return DEFAULT_RESOLVED_MODE;
58
+ return matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
59
+ }
60
+ /**
61
+ * The stamp {@link prepaintScript} put on `<html>`, recomputed from the storage
62
+ * it read.
63
+ *
64
+ * Not read back off the element, because by the time anything here runs it is
65
+ * no longer there — see the `<html>` stamp below. Same key, same validation,
66
+ * same fallbacks, so this returns what the script decided rather than a second
67
+ * opinion about it.
68
+ */
69
+ function prepaintStamp(storageKey, fallback) {
70
+ const stored = readPreferences(storageKey);
71
+ return {
72
+ theme: typeof stored.theme === "string" && stored.theme.length > 0 ? stored.theme : fallback.theme,
73
+ density: isOneOf(DENSITY_LEVELS, stored.density) ? stored.density : fallback.density,
74
+ font: isOneOf(FONT_NAMES, stored.font) ? stored.font : fallback.font,
75
+ mode: resolveMode(isOneOf(MODES$1, stored.mode) ? stored.mode : fallback.mode)
76
+ };
77
+ }
54
78
  function writePreferences(storageKey, preferences) {
55
79
  if (typeof localStorage === "undefined") return;
56
80
  try {
@@ -199,9 +223,20 @@ function ThemeProvider({ theme: themeProp = DEFAULT_THEME, density: densityProp
199
223
  /** Nested providers hand the axis straight up: one document, one pairing. */
200
224
  const setFont = isRoot ? rootSetFont : ambient.setFont;
201
225
  const originalStamp = React.useRef(null);
202
- useIsomorphicLayoutEffect(() => {
203
- if (!isRoot || !restored || typeof document === "undefined") return;
226
+ useIsomorphicInsertionEffect(() => {
227
+ if (!isRoot || typeof document === "undefined") return;
204
228
  const root = document.documentElement;
229
+ const next = restored || !persistPreferences ? {
230
+ theme,
231
+ density,
232
+ font,
233
+ mode
234
+ } : prepaintStamp(storageKey, {
235
+ theme: themeProp,
236
+ density: densityProp,
237
+ font: fontProp,
238
+ mode: modeProp
239
+ });
205
240
  originalStamp.current ??= {
206
241
  theme: root.getAttribute("data-theme"),
207
242
  density: root.getAttribute("data-density"),
@@ -209,18 +244,28 @@ function ThemeProvider({ theme: themeProp = DEFAULT_THEME, density: densityProp
209
244
  mode: root.getAttribute("data-mode"),
210
245
  colorScheme: root.style.colorScheme
211
246
  };
212
- root.setAttribute("data-theme", theme);
213
- root.setAttribute("data-density", density);
214
- root.setAttribute("data-font", font);
215
- root.setAttribute("data-mode", mode);
216
- root.style.colorScheme = mode === "system" ? "light dark" : mode;
247
+ const write = (name, value) => {
248
+ if (root.getAttribute(name) !== value) root.setAttribute(name, value);
249
+ };
250
+ write("data-theme", next.theme);
251
+ write("data-density", next.density);
252
+ write("data-font", next.font);
253
+ write("data-mode", next.mode);
254
+ const scheme = next.mode === "system" ? "light dark" : next.mode;
255
+ if (root.style.colorScheme !== scheme) root.style.colorScheme = scheme;
217
256
  }, [
218
257
  isRoot,
219
258
  restored,
259
+ persistPreferences,
260
+ storageKey,
220
261
  theme,
221
262
  density,
222
263
  font,
223
- mode
264
+ mode,
265
+ themeProp,
266
+ densityProp,
267
+ fontProp,
268
+ modeProp
224
269
  ]);
225
270
  React.useEffect(() => () => {
226
271
  const original = originalStamp.current;
@@ -11,6 +11,15 @@ type ControlSize = "sm" | "md" | "lg";
11
11
  * per-rung variants (`density-ultra-compact:` … `density-ultra-large:`) instead.
12
12
  *
13
13
  * @returns The applicable density level.
14
+ * @example
15
+ * const density = useDensity();
16
+ * const rowHeight = useControlHeight("sm");
17
+ * // Shorter rows mean more of them on screen, so the reserve moves with the level.
18
+ * useVirtualizer({
19
+ * count: rows.length,
20
+ * estimateSize: () => rowHeight,
21
+ * overscan: density === "ultra-compact" ? 12 : 6,
22
+ * });
14
23
  */
15
24
  declare function useDensity(): Density;
16
25
  /**
@@ -63,6 +63,15 @@ function measureControlHeight(density, size) {
63
63
  * per-rung variants (`density-ultra-compact:` … `density-ultra-large:`) instead.
64
64
  *
65
65
  * @returns The applicable density level.
66
+ * @example
67
+ * const density = useDensity();
68
+ * const rowHeight = useControlHeight("sm");
69
+ * // Shorter rows mean more of them on screen, so the reserve moves with the level.
70
+ * useVirtualizer({
71
+ * count: rows.length,
72
+ * estimateSize: () => rowHeight,
73
+ * overscan: density === "ultra-compact" ? 12 : 6,
74
+ * });
66
75
  */
67
76
  function useDensity() {
68
77
  return React.useContext(DensityContext) ?? "compact";
@@ -11,5 +11,23 @@ import * as React from "react";
11
11
  * (never-invoked) passive variant instead.
12
12
  */
13
13
  const useIsomorphicLayoutEffect = typeof document === "undefined" ? React.useEffect : React.useLayoutEffect;
14
+ /**
15
+ * `useInsertionEffect` in the browser, `useEffect` on the server.
16
+ *
17
+ * One step earlier than the layout variant above, and the difference is the
18
+ * whole reason it exists. React runs **every** insertion effect in the tree
19
+ * during the mutation phase, before **any** layout effect runs; layout effects
20
+ * then run child-first, so a provider near the root is the last thing in the
21
+ * commit to get one. Anything a descendant's layout effect measures — Base UI
22
+ * calls `getComputedStyle` in several — is measured against whatever the
23
+ * document element is wearing at that moment.
24
+ *
25
+ * That matters exactly once: putting back what React 19 takes off `<html>` when
26
+ * it hydrates the document element. See the `<html>` stamp in
27
+ * `theme-provider.tsx`.
28
+ *
29
+ * Write only. An insertion effect must not read layout or schedule state.
30
+ */
31
+ const useIsomorphicInsertionEffect = typeof document === "undefined" ? React.useEffect : React.useInsertionEffect;
14
32
  //#endregion
15
- export { useIsomorphicLayoutEffect };
33
+ export { useIsomorphicInsertionEffect, useIsomorphicLayoutEffect };
@@ -4,7 +4,7 @@ import { Density, ThemeName } from "@cueplusplus/tokens";
4
4
  * The colour tokens every theme block declares, in the order the tokens build
5
5
  * emits them. A generated theme is complete exactly when it covers this list.
6
6
  */
7
- declare const THEME_COLOR_TOKENS: readonly ["bg", "sunken", "surface-1", "surface-2", "surface-3", "fg", "fg-muted", "fg-subtle", "border", "border-strong", "border-overlay", "accent", "accent-hover", "accent-fg", "ok", "busy", "warn", "danger", "info", "selection", "focus", "data-ground", "scrim"];
7
+ declare const THEME_COLOR_TOKENS: readonly ["bg", "sunken", "surface-1", "surface-2", "surface-3", "fg", "fg-muted", "fg-subtle", "border", "border-strong", "border-overlay", "accent", "accent-hover", "accent-fg", "ok", "busy", "warn", "warn-fg", "danger", "danger-fg", "info", "stream", "selection", "focus", "data-ground", "scrim"];
8
8
  /** One of the colour tokens a theme block owns. */
9
9
  type ThemeColorToken = (typeof THEME_COLOR_TOKENS)[number];
10
10
  //#endregion