@cueplusplus/ui 0.3.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 (488) hide show
  1. package/CHANGELOG.md +2229 -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/app-shell.d.ts +52 -2
  15. package/dist/chrome/app-shell.js +80 -8
  16. package/dist/chrome/index.d.ts +2 -2
  17. package/dist/configurator/_export.js +3 -2
  18. package/dist/configurator/_overrides.d.ts +1 -1
  19. package/dist/configurator/token-editor.js +4 -1
  20. package/dist/date/_segments.js +37 -2
  21. package/dist/elements/activity-graph.d.ts +40 -0
  22. package/dist/elements/activity-graph.js +81 -0
  23. package/dist/elements/agent-card.d.ts +49 -0
  24. package/dist/elements/agent-card.js +91 -0
  25. package/dist/elements/agent-handoff.d.ts +24 -0
  26. package/dist/elements/agent-handoff.js +53 -0
  27. package/dist/elements/agent-mode-badge.d.ts +72 -0
  28. package/dist/elements/agent-mode-badge.js +110 -0
  29. package/dist/elements/agent-plan.d.ts +24 -0
  30. package/dist/elements/agent-plan.js +74 -0
  31. package/dist/elements/agent-status.d.ts +29 -0
  32. package/dist/elements/agent-status.js +46 -0
  33. package/dist/elements/agent-surface.d.ts +65 -0
  34. package/dist/elements/agent-surface.js +68 -0
  35. package/dist/elements/animated-number.d.ts +86 -0
  36. package/dist/elements/animated-number.js +118 -0
  37. package/dist/elements/approval-card.d.ts +40 -0
  38. package/dist/elements/approval-card.js +78 -0
  39. package/dist/elements/artifact-card.d.ts +30 -0
  40. package/dist/elements/artifact-card.js +58 -0
  41. package/dist/elements/background-inbox.d.ts +39 -0
  42. package/dist/elements/background-inbox.js +60 -0
  43. package/dist/elements/canvas-split.d.ts +77 -0
  44. package/dist/elements/canvas-split.js +138 -0
  45. package/dist/elements/chart.d.ts +41 -0
  46. package/dist/elements/chart.js +117 -0
  47. package/dist/elements/chat-panel.d.ts +46 -0
  48. package/dist/elements/chat-panel.js +104 -0
  49. package/dist/elements/checkpoint-history.d.ts +31 -0
  50. package/dist/elements/checkpoint-history.js +65 -0
  51. package/dist/elements/clamp.d.ts +90 -0
  52. package/dist/elements/clamp.js +109 -0
  53. package/dist/elements/code-diff.d.ts +42 -0
  54. package/dist/elements/code-diff.js +69 -0
  55. package/dist/elements/code-runner.d.ts +38 -0
  56. package/dist/elements/code-runner.js +84 -0
  57. package/dist/elements/command-palette.d.ts +48 -0
  58. package/dist/elements/command-palette.js +129 -0
  59. package/dist/elements/compaction-row.d.ts +63 -0
  60. package/dist/elements/compaction-row.js +110 -0
  61. package/dist/elements/comparison-card.d.ts +47 -0
  62. package/dist/elements/comparison-card.js +69 -0
  63. package/dist/elements/composer.d.ts +274 -0
  64. package/dist/elements/composer.js +505 -0
  65. package/dist/elements/computer-use.d.ts +40 -0
  66. package/dist/elements/computer-use.js +92 -0
  67. package/dist/elements/confidence-marker.d.ts +39 -0
  68. package/dist/elements/confidence-marker.js +64 -0
  69. package/dist/elements/connection-state.d.ts +29 -0
  70. package/dist/elements/connection-state.js +66 -0
  71. package/dist/elements/context-breakdown.d.ts +30 -0
  72. package/dist/elements/context-breakdown.js +86 -0
  73. package/dist/elements/context-usage.d.ts +99 -0
  74. package/dist/elements/context-usage.js +225 -0
  75. package/dist/elements/conversation-search.d.ts +48 -0
  76. package/dist/elements/conversation-search.js +88 -0
  77. package/dist/elements/cost-meter.d.ts +33 -0
  78. package/dist/elements/cost-meter.js +75 -0
  79. package/dist/elements/data-table.d.ts +31 -0
  80. package/dist/elements/data-table.js +67 -0
  81. package/dist/elements/day-separator.d.ts +34 -0
  82. package/dist/elements/day-separator.js +50 -0
  83. package/dist/elements/diagram.d.ts +34 -0
  84. package/dist/elements/diagram.js +75 -0
  85. package/dist/elements/document-reference.d.ts +37 -0
  86. package/dist/elements/document-reference.js +66 -0
  87. package/dist/elements/draft-restore.d.ts +27 -0
  88. package/dist/elements/draft-restore.js +54 -0
  89. package/dist/elements/edit-message.d.ts +36 -0
  90. package/dist/elements/edit-message.js +77 -0
  91. package/dist/elements/elements.css +459 -0
  92. package/dist/elements/elicitation-form.d.ts +48 -0
  93. package/dist/elements/elicitation-form.js +106 -0
  94. package/dist/elements/empty-state.d.ts +52 -0
  95. package/dist/elements/empty-state.js +98 -0
  96. package/dist/elements/end-of-turn-summary.d.ts +60 -0
  97. package/dist/elements/end-of-turn-summary.js +75 -0
  98. package/dist/elements/error-state.d.ts +29 -0
  99. package/dist/elements/error-state.js +55 -0
  100. package/dist/elements/feedback-dialog.d.ts +36 -0
  101. package/dist/elements/feedback-dialog.js +81 -0
  102. package/dist/elements/file-tree.d.ts +45 -0
  103. package/dist/elements/file-tree.js +84 -0
  104. package/dist/elements/flow-graph.d.ts +45 -0
  105. package/dist/elements/flow-graph.js +78 -0
  106. package/dist/elements/generative/chart.js +200 -0
  107. package/dist/elements/generative/faults.js +111 -0
  108. package/dist/elements/generative/icons.d.ts +41 -0
  109. package/dist/elements/generative/icons.js +190 -0
  110. package/dist/elements/generative/intrinsics.js +483 -0
  111. package/dist/elements/generative/spec.d.ts +110 -0
  112. package/dist/elements/generative/spec.js +366 -0
  113. package/dist/elements/generative.css +1145 -0
  114. package/dist/elements/generative.d.ts +144 -0
  115. package/dist/elements/generative.js +126 -0
  116. package/dist/elements/guardrail-notice.d.ts +29 -0
  117. package/dist/elements/guardrail-notice.js +63 -0
  118. package/dist/elements/image-generation.d.ts +18 -0
  119. package/dist/elements/image-generation.js +64 -0
  120. package/dist/elements/index.d.ts +116 -0
  121. package/dist/elements/index.js +115 -0
  122. package/dist/elements/inline-citation.d.ts +43 -0
  123. package/dist/elements/inline-citation.js +93 -0
  124. package/dist/elements/job-progress.d.ts +49 -0
  125. package/dist/elements/job-progress.js +74 -0
  126. package/dist/elements/launcher-bubble.d.ts +34 -0
  127. package/dist/elements/launcher-bubble.js +72 -0
  128. package/dist/elements/live-region-announcer.d.ts +130 -0
  129. package/dist/elements/live-region-announcer.js +230 -0
  130. package/dist/elements/loading-state.d.ts +27 -0
  131. package/dist/elements/loading-state.js +36 -0
  132. package/dist/elements/map-answer.d.ts +38 -0
  133. package/dist/elements/map-answer.js +93 -0
  134. package/dist/elements/markdown.d.ts +131 -0
  135. package/dist/elements/markdown.js +528 -0
  136. package/dist/elements/math-block.d.ts +51 -0
  137. package/dist/elements/math-block.js +70 -0
  138. package/dist/elements/mcp-server-panel.d.ts +41 -0
  139. package/dist/elements/mcp-server-panel.js +115 -0
  140. package/dist/elements/memory-chips.d.ts +30 -0
  141. package/dist/elements/memory-chips.js +43 -0
  142. package/dist/elements/message-actions.d.ts +38 -0
  143. package/dist/elements/message-actions.js +71 -0
  144. package/dist/elements/message-attachment.d.ts +48 -0
  145. package/dist/elements/message-attachment.js +63 -0
  146. package/dist/elements/message-branches.d.ts +25 -0
  147. package/dist/elements/message-branches.js +65 -0
  148. package/dist/elements/message-pair.d.ts +33 -0
  149. package/dist/elements/message-pair.js +65 -0
  150. package/dist/elements/message-queue.d.ts +31 -0
  151. package/dist/elements/message-queue.js +80 -0
  152. package/dist/elements/message-timing.d.ts +33 -0
  153. package/dist/elements/message-timing.js +37 -0
  154. package/dist/elements/mobile-composer.d.ts +44 -0
  155. package/dist/elements/mobile-composer.js +88 -0
  156. package/dist/elements/model-picker.d.ts +38 -0
  157. package/dist/elements/model-picker.js +69 -0
  158. package/dist/elements/number-ticker.d.ts +18 -0
  159. package/dist/elements/number-ticker.js +47 -0
  160. package/dist/elements/onboarding.d.ts +30 -0
  161. package/dist/elements/onboarding.js +75 -0
  162. package/dist/elements/permission-grant.d.ts +35 -0
  163. package/dist/elements/permission-grant.js +86 -0
  164. package/dist/elements/permission-scopes.d.ts +215 -0
  165. package/dist/elements/permission-scopes.js +249 -0
  166. package/dist/elements/prompt-library.d.ts +43 -0
  167. package/dist/elements/prompt-library.js +117 -0
  168. package/dist/elements/queue-dock.d.ts +101 -0
  169. package/dist/elements/queue-dock.js +132 -0
  170. package/dist/elements/quota-banner.d.ts +26 -0
  171. package/dist/elements/quota-banner.js +66 -0
  172. package/dist/elements/quote-reply.d.ts +44 -0
  173. package/dist/elements/quote-reply.js +79 -0
  174. package/dist/elements/range.d.ts +29 -0
  175. package/dist/elements/range.js +45 -0
  176. package/dist/elements/read-aloud.d.ts +45 -0
  177. package/dist/elements/read-aloud.js +75 -0
  178. package/dist/elements/reasoning-effort.d.ts +36 -0
  179. package/dist/elements/reasoning-effort.js +67 -0
  180. package/dist/elements/reasoning-panel.d.ts +46 -0
  181. package/dist/elements/reasoning-panel.js +75 -0
  182. package/dist/elements/recommendation-card.d.ts +45 -0
  183. package/dist/elements/recommendation-card.js +83 -0
  184. package/dist/elements/regenerate-menu.d.ts +45 -0
  185. package/dist/elements/regenerate-menu.js +51 -0
  186. package/dist/elements/replay.d.ts +217 -0
  187. package/dist/elements/replay.js +498 -0
  188. package/dist/elements/research-report.d.ts +38 -0
  189. package/dist/elements/research-report.js +69 -0
  190. package/dist/elements/retrieval-chunks.d.ts +43 -0
  191. package/dist/elements/retrieval-chunks.js +81 -0
  192. package/dist/elements/revert-dock.d.ts +159 -0
  193. package/dist/elements/revert-dock.js +327 -0
  194. package/dist/elements/reviewable-diff.d.ts +45 -0
  195. package/dist/elements/reviewable-diff.js +110 -0
  196. package/dist/elements/risk-badge.d.ts +52 -0
  197. package/dist/elements/risk-badge.js +91 -0
  198. package/dist/elements/schedule-card.d.ts +42 -0
  199. package/dist/elements/schedule-card.js +90 -0
  200. package/dist/elements/score-breakdown.d.ts +47 -0
  201. package/dist/elements/score-breakdown.js +82 -0
  202. package/dist/elements/scroll-anchor.d.ts +32 -0
  203. package/dist/elements/scroll-anchor.js +121 -0
  204. package/dist/elements/settings-panel.d.ts +52 -0
  205. package/dist/elements/settings-panel.js +107 -0
  206. package/dist/elements/shared-conversation.d.ts +39 -0
  207. package/dist/elements/shared-conversation.js +68 -0
  208. package/dist/elements/sources.d.ts +33 -0
  209. package/dist/elements/sources.js +61 -0
  210. package/dist/elements/speaker-identity.d.ts +32 -0
  211. package/dist/elements/speaker-identity.js +51 -0
  212. package/dist/elements/spec-sheet.d.ts +31 -0
  213. package/dist/elements/spec-sheet.js +45 -0
  214. package/dist/elements/stopped-run.d.ts +22 -0
  215. package/dist/elements/stopped-run.js +50 -0
  216. package/dist/elements/streaming-text.d.ts +31 -0
  217. package/dist/elements/streaming-text.js +45 -0
  218. package/dist/elements/subagent-list.d.ts +37 -0
  219. package/dist/elements/subagent-list.js +79 -0
  220. package/dist/elements/suggestions.d.ts +30 -0
  221. package/dist/elements/suggestions.js +36 -0
  222. package/dist/elements/surfaces.d.ts +85 -0
  223. package/dist/elements/surfaces.js +107 -0
  224. package/dist/elements/tail-status.d.ts +131 -0
  225. package/dist/elements/tail-status.js +94 -0
  226. package/dist/elements/terminal-block.d.ts +29 -0
  227. package/dist/elements/terminal-block.js +54 -0
  228. package/dist/elements/thinking-indicator.d.ts +18 -0
  229. package/dist/elements/thinking-indicator.js +36 -0
  230. package/dist/elements/thread-list.d.ts +35 -0
  231. package/dist/elements/thread-list.js +68 -0
  232. package/dist/elements/thread-search.d.ts +42 -0
  233. package/dist/elements/thread-search.js +99 -0
  234. package/dist/elements/timeline.d.ts +37 -0
  235. package/dist/elements/timeline.js +46 -0
  236. package/dist/elements/todo-list.d.ts +42 -0
  237. package/dist/elements/todo-list.js +59 -0
  238. package/dist/elements/tool-call.d.ts +41 -0
  239. package/dist/elements/tool-call.js +85 -0
  240. package/dist/elements/tool-error.d.ts +39 -0
  241. package/dist/elements/tool-error.js +76 -0
  242. package/dist/elements/tool-group.d.ts +45 -0
  243. package/dist/elements/tool-group.js +71 -0
  244. package/dist/elements/tool-timeline.d.ts +65 -0
  245. package/dist/elements/tool-timeline.js +88 -0
  246. package/dist/elements/trace-waterfall.d.ts +37 -0
  247. package/dist/elements/trace-waterfall.js +69 -0
  248. package/dist/elements/transcript-rules.d.ts +67 -0
  249. package/dist/elements/transcript-rules.js +95 -0
  250. package/dist/elements/turn-footer.d.ts +74 -0
  251. package/dist/elements/turn-footer.js +101 -0
  252. package/dist/elements/typing-indicator.d.ts +16 -0
  253. package/dist/elements/typing-indicator.js +51 -0
  254. package/dist/elements/verdict-row.d.ts +89 -0
  255. package/dist/elements/verdict-row.js +150 -0
  256. package/dist/elements/vocabulary.d.ts +612 -0
  257. package/dist/elements/vocabulary.js +611 -0
  258. package/dist/elements/voice-conversation.d.ts +49 -0
  259. package/dist/elements/voice-conversation.js +123 -0
  260. package/dist/elements/web-preview.d.ts +32 -0
  261. package/dist/elements/web-preview.js +66 -0
  262. package/dist/elements/web-search.d.ts +37 -0
  263. package/dist/elements/web-search.js +66 -0
  264. package/dist/elements/work-collapse.d.ts +103 -0
  265. package/dist/elements/work-collapse.js +131 -0
  266. package/dist/icons/containers.d.ts +89 -0
  267. package/dist/icons/containers.js +295 -0
  268. package/dist/icons/index.d.ts +2 -0
  269. package/dist/index.d.ts +6 -4
  270. package/dist/index.js +2 -1
  271. package/dist/instruments/two-step-button.js +25 -6
  272. package/dist/layout/sidebar.d.ts +19 -1
  273. package/dist/layout/sidebar.js +19 -1
  274. package/dist/primitives/button.js +11 -1
  275. package/dist/primitives/chip.d.ts +35 -9
  276. package/dist/primitives/chip.js +97 -11
  277. package/dist/system/agent-skin.d.ts +27 -0
  278. package/dist/system/agent-skin.js +20 -0
  279. package/dist/system/portal.d.ts +5 -3
  280. package/dist/system/portal.js +19 -5
  281. package/dist/system/theme-provider.js +54 -9
  282. package/dist/system/use-density.d.ts +9 -0
  283. package/dist/system/use-density.js +9 -0
  284. package/dist/system/use-isomorphic-layout-effect.js +19 -1
  285. package/dist/theming/_presets.d.ts +1 -1
  286. package/dist/theming/_presets.js +71 -8
  287. package/dist/theming/contrast.d.ts +16 -4
  288. package/dist/theming/contrast.js +33 -6
  289. package/dist/theming/create-theme.d.ts +6 -2
  290. package/dist/theming/create-theme.js +32 -5
  291. package/dist/theming/serialize.d.ts +10 -1
  292. package/dist/theming/serialize.js +62 -8
  293. package/manifest/components/activity-graph.json +88 -0
  294. package/manifest/components/agent-card.json +120 -0
  295. package/manifest/components/agent-handoff.json +87 -0
  296. package/manifest/components/agent-mode-badge.json +84 -0
  297. package/manifest/components/agent-plan.json +67 -0
  298. package/manifest/components/agent-status.json +73 -0
  299. package/manifest/components/agent-surface.json +78 -0
  300. package/manifest/components/alert-dialog.json +1 -1
  301. package/manifest/components/animated-number.json +67 -0
  302. package/manifest/components/app-shell.json +99 -7
  303. package/manifest/components/approval-card.json +106 -0
  304. package/manifest/components/artifact-card.json +81 -0
  305. package/manifest/components/audience-icon.json +52 -0
  306. package/manifest/components/background-inbox.json +71 -0
  307. package/manifest/components/branch-picker.json +124 -0
  308. package/manifest/components/button.json +1 -0
  309. package/manifest/components/canvas-split-body.json +62 -0
  310. package/manifest/components/canvas-split-document.json +54 -0
  311. package/manifest/components/canvas-split-header.json +83 -0
  312. package/manifest/components/canvas-split-line.json +62 -0
  313. package/manifest/components/canvas-split-message.json +62 -0
  314. package/manifest/components/canvas-split-thread.json +54 -0
  315. package/manifest/components/canvas-split.json +60 -0
  316. package/manifest/components/catalogue-icon.json +52 -0
  317. package/manifest/components/channel-beta-icon.json +52 -0
  318. package/manifest/components/channel-released-icon.json +52 -0
  319. package/manifest/components/chart.json +93 -0
  320. package/manifest/components/chat-empty-state.json +55 -0
  321. package/manifest/components/chat-panel-assistant-message.json +51 -0
  322. package/manifest/components/chat-panel-composer.json +66 -0
  323. package/manifest/components/chat-panel-messages.json +51 -0
  324. package/manifest/components/chat-panel-typing.json +51 -0
  325. package/manifest/components/chat-panel-user-message.json +51 -0
  326. package/manifest/components/chat-panel.json +57 -0
  327. package/manifest/components/checkpoint-history.json +80 -0
  328. package/manifest/components/chip.json +24 -12
  329. package/manifest/components/clamp.json +102 -0
  330. package/manifest/components/cli-tool-icon.json +52 -0
  331. package/manifest/components/code-diff.json +87 -0
  332. package/manifest/components/code-runner.json +97 -0
  333. package/manifest/components/compaction-row.json +100 -0
  334. package/manifest/components/comparison-card.json +83 -0
  335. package/manifest/components/composer-actions.json +65 -0
  336. package/manifest/components/composer-attach-button.json +65 -0
  337. package/manifest/components/composer-attachment-chip.json +75 -0
  338. package/manifest/components/composer-attachments.json +60 -0
  339. package/manifest/components/composer-bar.json +73 -0
  340. package/manifest/components/composer-command-item.json +79 -0
  341. package/manifest/components/composer-context.json +67 -0
  342. package/manifest/components/composer-input.json +73 -0
  343. package/manifest/components/composer-menu-item.json +72 -0
  344. package/manifest/components/composer-menu.json +79 -0
  345. package/manifest/components/composer-model-item.json +75 -0
  346. package/manifest/components/composer-model-trigger.json +75 -0
  347. package/manifest/components/composer-person-item.json +79 -0
  348. package/manifest/components/composer-send.json +80 -0
  349. package/manifest/components/composer-toolbar.json +65 -0
  350. package/manifest/components/composer-voice-button.json +68 -0
  351. package/manifest/components/composer-voice.json +75 -0
  352. package/manifest/components/computer-use.json +84 -0
  353. package/manifest/components/confidence-marker.json +74 -0
  354. package/manifest/components/connection-state.json +84 -0
  355. package/manifest/components/context-breakdown.json +65 -0
  356. package/manifest/components/context-usage.json +85 -0
  357. package/manifest/components/conversation-search.json +92 -0
  358. package/manifest/components/cost-meter.json +74 -0
  359. package/manifest/components/cue-portal-frame.json +1 -1
  360. package/manifest/components/day-separator.json +58 -0
  361. package/manifest/components/delegation-card.json +1 -1
  362. package/manifest/components/density.json +1 -1
  363. package/manifest/components/diagram.json +100 -0
  364. package/manifest/components/document-reference.json +90 -0
  365. package/manifest/components/draft-restore.json +82 -0
  366. package/manifest/components/drawer.json +1 -1
  367. package/manifest/components/dropdown-menu.json +1 -1
  368. package/manifest/components/edit-message.json +105 -0
  369. package/manifest/components/elements-command-palette.json +100 -0
  370. package/manifest/components/elements-composer.json +71 -0
  371. package/manifest/components/elements-data-table.json +68 -0
  372. package/manifest/components/elements-timeline.json +69 -0
  373. package/manifest/components/elicitation-form.json +103 -0
  374. package/manifest/components/empty-state-composer.json +64 -0
  375. package/manifest/components/empty-state-greeting.json +49 -0
  376. package/manifest/components/empty-state-suggestion.json +57 -0
  377. package/manifest/components/empty-state-suggestions.json +49 -0
  378. package/manifest/components/end-of-turn-summary.json +77 -0
  379. package/manifest/components/error-state.json +80 -0
  380. package/manifest/components/feedback-dialog.json +107 -0
  381. package/manifest/components/file-tree.json +83 -0
  382. package/manifest/components/flow-graph.json +75 -0
  383. package/manifest/components/folder-icon.json +52 -0
  384. package/manifest/components/frac.json +59 -0
  385. package/manifest/components/generation-loader.json +64 -0
  386. package/manifest/components/generative-ui.json +93 -0
  387. package/manifest/components/guardrail-notice.json +91 -0
  388. package/manifest/components/hover-card.json +1 -1
  389. package/manifest/components/image-generation.json +67 -0
  390. package/manifest/components/info-tip.json +1 -1
  391. package/manifest/components/inline-citation.json +77 -0
  392. package/manifest/components/job-progress.json +96 -0
  393. package/manifest/components/launcher-bubble.json +105 -0
  394. package/manifest/components/live-region-announcer.json +79 -0
  395. package/manifest/components/map-answer.json +83 -0
  396. package/manifest/components/markdown-text.json +94 -0
  397. package/manifest/components/math-block.json +74 -0
  398. package/manifest/components/mcp-server-icon.json +52 -0
  399. package/manifest/components/mcp-server-panel.json +87 -0
  400. package/manifest/components/memory-chips.json +65 -0
  401. package/manifest/components/message-actions.json +99 -0
  402. package/manifest/components/message-attachments.json +63 -0
  403. package/manifest/components/message-branches.json +71 -0
  404. package/manifest/components/message-list.json +1 -1
  405. package/manifest/components/message-pair.json +86 -0
  406. package/manifest/components/message-queue.json +74 -0
  407. package/manifest/components/message-timing.json +62 -0
  408. package/manifest/components/mobile-composer.json +126 -0
  409. package/manifest/components/model-picker.json +76 -0
  410. package/manifest/components/node-card.json +1 -1
  411. package/manifest/components/node-handle.json +1 -1
  412. package/manifest/components/number-ticker.json +61 -0
  413. package/manifest/components/onboarding.json +84 -0
  414. package/manifest/components/otp-field.json +7 -7
  415. package/manifest/components/permission-grant.json +92 -0
  416. package/manifest/components/permission-scopes.json +139 -0
  417. package/manifest/components/popover.json +1 -1
  418. package/manifest/components/prompt-library.json +99 -0
  419. package/manifest/components/queue-dock.json +110 -0
  420. package/manifest/components/quota-banner.json +94 -0
  421. package/manifest/components/quote-reply.json +105 -0
  422. package/manifest/components/read-aloud.json +111 -0
  423. package/manifest/components/reasoning-effort.json +81 -0
  424. package/manifest/components/reasoning-panel.json +108 -0
  425. package/manifest/components/recommendation-card.json +107 -0
  426. package/manifest/components/regenerate-menu.json +89 -0
  427. package/manifest/components/replay-player.json +102 -0
  428. package/manifest/components/research-report.json +76 -0
  429. package/manifest/components/retrieval-chunks.json +84 -0
  430. package/manifest/components/revert-dock.json +150 -0
  431. package/manifest/components/reviewable-diff.json +93 -0
  432. package/manifest/components/risk-badge.json +74 -0
  433. package/manifest/components/schedule-card.json +101 -0
  434. package/manifest/components/score-breakdown.json +91 -0
  435. package/manifest/components/scroll-anchor.json +72 -0
  436. package/manifest/components/scroll-area.json +7 -7
  437. package/manifest/components/search-input.json +7 -7
  438. package/manifest/components/segmented-control.json +21 -21
  439. package/manifest/components/settings-panel.json +118 -0
  440. package/manifest/components/shared-conversation.json +89 -0
  441. package/manifest/components/shimmer-label.json +59 -0
  442. package/manifest/components/skill-icon.json +52 -0
  443. package/manifest/components/sources.json +83 -0
  444. package/manifest/components/speaker-identity.json +61 -0
  445. package/manifest/components/spec-sheet.json +80 -0
  446. package/manifest/components/stack-icon.json +52 -0
  447. package/manifest/components/stacks-matrix-icon.json +52 -0
  448. package/manifest/components/stat.json +1 -1
  449. package/manifest/components/status-dot.json +1 -1
  450. package/manifest/components/stopped-run.json +81 -0
  451. package/manifest/components/streaming-text.json +71 -0
  452. package/manifest/components/sub.json +44 -0
  453. package/manifest/components/subagent-list.json +88 -0
  454. package/manifest/components/suggestions.json +84 -0
  455. package/manifest/components/sup.json +44 -0
  456. package/manifest/components/swap-label.json +71 -0
  457. package/manifest/components/tail-status.json +109 -0
  458. package/manifest/components/terminal-block.json +91 -0
  459. package/manifest/components/theme-provider.json +2 -2
  460. package/manifest/components/thinking-indicator.json +63 -0
  461. package/manifest/components/thread-list.json +76 -0
  462. package/manifest/components/thread-search.json +90 -0
  463. package/manifest/components/threshold-rail.json +2 -2
  464. package/manifest/components/time-boundary.json +62 -0
  465. package/manifest/components/timeline.json +1 -1
  466. package/manifest/components/todo-list.json +69 -0
  467. package/manifest/components/toggle-group.json +7 -7
  468. package/manifest/components/token-editor.json +1 -1
  469. package/manifest/components/tool-call-card.json +200 -0
  470. package/manifest/components/tool-call.json +119 -0
  471. package/manifest/components/tool-error.json +114 -0
  472. package/manifest/components/tool-group.json +83 -0
  473. package/manifest/components/tool-timeline.json +119 -0
  474. package/manifest/components/toolbar.json +7 -7
  475. package/manifest/components/tooltip.json +1 -1
  476. package/manifest/components/trace-waterfall.json +74 -0
  477. package/manifest/components/turn-footer.json +105 -0
  478. package/manifest/components/typing-indicator.json +53 -0
  479. package/manifest/components/unread-divider.json +55 -0
  480. package/manifest/components/usage-chart.json +1 -1
  481. package/manifest/components/verdict-row.json +91 -0
  482. package/manifest/components/voice-conversation.json +109 -0
  483. package/manifest/components/web-preview.json +87 -0
  484. package/manifest/components/web-search.json +92 -0
  485. package/manifest/components/work-collapse.json +102 -0
  486. package/manifest/manifest.json +2670 -33
  487. package/manifest/tokens.json +22 -1
  488. package/package.json +46 -4
@@ -0,0 +1,115 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { mono, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { ChevronRightIcon, PlugIcon } from "lucide-react";
6
+ //#region src/elements/mcp-server-panel.tsx
7
+ const DOT = {
8
+ connected: "bg-ok",
9
+ connecting: "bg-surface-3 animate-pulse",
10
+ "needs-auth": "bg-warn",
11
+ failed: "bg-danger"
12
+ };
13
+ const LABEL = {
14
+ connected: "connected",
15
+ connecting: "connecting",
16
+ "needs-auth": "needs auth",
17
+ failed: "failed"
18
+ };
19
+ /**
20
+ * Which servers are connected, what each one brought, and which is still waiting on
21
+ * you.
22
+ *
23
+ * @example
24
+ * import { McpServerPanel } from "@cueplusplus/ui/elements";
25
+ *
26
+ * <McpServerPanel
27
+ * servers={servers}
28
+ * expandedId={expandedId}
29
+ * onToggle={setExpandedId}
30
+ * onAuthorize={startOAuth}
31
+ * />
32
+ */
33
+ function McpServerPanel({ servers, expandedId, onToggle, onAuthorize, className, ...props }) {
34
+ const connected = servers.filter((server) => server.status === "connected").length;
35
+ return /* @__PURE__ */ jsxs("div", {
36
+ "data-slot": "mcp-server-panel",
37
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-(--radius-overlay) p-3", className),
38
+ ...props,
39
+ children: [/* @__PURE__ */ jsxs("div", {
40
+ className: "flex items-baseline justify-between px-1 pb-1",
41
+ children: [/* @__PURE__ */ jsx("span", {
42
+ className: "text-(length:--cue-text-body) font-medium",
43
+ children: "Servers"
44
+ }), /* @__PURE__ */ jsxs("span", {
45
+ className: cn(mono, "text-fg-subtle tabular-nums"),
46
+ children: [
47
+ connected,
48
+ " of ",
49
+ servers.length,
50
+ " connected"
51
+ ]
52
+ })]
53
+ }), servers.map((server) => {
54
+ const expanded = expandedId === server.id;
55
+ return /* @__PURE__ */ jsxs("div", {
56
+ className: "flex flex-col",
57
+ children: [/* @__PURE__ */ jsxs("button", {
58
+ type: "button",
59
+ "aria-expanded": expanded,
60
+ onClick: () => onToggle?.(server.id),
61
+ className: "hover:bg-surface-1 flex items-center gap-2.5 rounded-(--radius-surface) px-1.5 py-2 text-start transition-colors",
62
+ children: [
63
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn("text-fg-subtle size-3 shrink-0 transition-transform duration-200 motion-reduce:transition-none", expanded && "rotate-90") }),
64
+ /* @__PURE__ */ jsx(PlugIcon, { className: "text-fg-subtle size-3.5 shrink-0" }),
65
+ /* @__PURE__ */ jsx("span", {
66
+ className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
67
+ children: server.name
68
+ }),
69
+ /* @__PURE__ */ jsxs("span", {
70
+ className: cn(mono, "text-fg-subtle shrink-0"),
71
+ children: [server.tools.length, " tools"]
72
+ }),
73
+ /* @__PURE__ */ jsx("span", {
74
+ "aria-hidden": true,
75
+ className: cn("size-1.5 shrink-0 rounded-full", DOT[server.status])
76
+ }),
77
+ /* @__PURE__ */ jsx("span", {
78
+ className: "sr-only",
79
+ children: LABEL[server.status]
80
+ })
81
+ ]
82
+ }), expanded && /* @__PURE__ */ jsxs("div", {
83
+ className: "cue-elements-fade-in cue-elements-slide-in-from-top-1 cue-elements-animate-in flex flex-col gap-1.5 px-1.5 ps-8 pb-2 duration-200",
84
+ children: [/* @__PURE__ */ jsxs("div", {
85
+ className: "flex items-center gap-2",
86
+ children: [
87
+ /* @__PURE__ */ jsx("span", {
88
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle"),
89
+ children: server.transport
90
+ }),
91
+ /* @__PURE__ */ jsxs("span", {
92
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle"),
93
+ children: ["· ", LABEL[server.status]]
94
+ }),
95
+ server.status === "needs-auth" && onAuthorize && /* @__PURE__ */ jsx("button", {
96
+ type: "button",
97
+ onClick: () => onAuthorize?.(server.id),
98
+ className: "ms-auto rounded-full bg-warn/15 px-2 py-0.5 text-(length:--cue-text-label) font-medium text-warn transition-[background-color,scale] duration-150 hover:bg-warn/25 active:scale-[0.96]",
99
+ children: "Authorize"
100
+ })
101
+ ]
102
+ }), /* @__PURE__ */ jsx("div", {
103
+ className: "flex flex-wrap gap-1",
104
+ children: server.tools.map((tool) => /* @__PURE__ */ jsx("span", {
105
+ className: cn("bg-fg/[0.06]", "font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-muted rounded-(--radius-control) px-1.5 py-0.5"),
106
+ children: tool
107
+ }, tool))
108
+ })]
109
+ })]
110
+ }, server.id);
111
+ })]
112
+ });
113
+ }
114
+ //#endregion
115
+ export { McpServerPanel };
@@ -0,0 +1,30 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/memory-chips.d.ts
3
+ type MemoryChange = "added" | "updated" | "existing";
4
+ interface MemoryChip {
5
+ /** Stable identity, reported back by onForget. */
6
+ id: string;
7
+ /** The remembered fact, in the assistant's words. */
8
+ text: string;
9
+ /** existing is neutral; added and updated are tinted and counted in the header. */
10
+ change: MemoryChange;
11
+ }
12
+ /**
13
+ * What it now remembers about you, written during the turn and removable.
14
+ *
15
+ * @example
16
+ * import { MemoryChips } from "@cueplusplus/ui/elements";
17
+ *
18
+ * <MemoryChips chips={chips} onForget={forget} />
19
+ */
20
+ declare function MemoryChips({ chips, onForget, className, ...props }: Omit<ComponentProps<"div">, "children" | "chips" | "onForget"> & {
21
+ /**
22
+ * What is remembered. Anything not marked existing is counted as new this turn and
23
+ * tinted.
24
+ */
25
+ chips: readonly MemoryChip[];
26
+ /** Called to drop a fact. Every chip is removable, including ones it just learned. */
27
+ onForget?: (id: string) => void;
28
+ }): import("react").JSX.Element;
29
+ //#endregion
30
+ export { MemoryChange, MemoryChip, MemoryChips };
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, ghostButton, mono } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { BrainIcon, XIcon } from "lucide-react";
6
+ //#region src/elements/memory-chips.tsx
7
+ /**
8
+ * What it now remembers about you, written during the turn and removable.
9
+ *
10
+ * @example
11
+ * import { MemoryChips } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <MemoryChips chips={chips} onForget={forget} />
14
+ */
15
+ function MemoryChips({ chips, onForget, className, ...props }) {
16
+ const fresh = chips.filter((chip) => chip.change !== "existing").length;
17
+ return /* @__PURE__ */ jsxs("div", {
18
+ "data-slot": "memory-chips",
19
+ className: cn("flex w-full max-w-sm flex-col gap-2", className),
20
+ ...props,
21
+ children: [/* @__PURE__ */ jsxs("div", {
22
+ className: "flex items-center gap-1.5",
23
+ children: [/* @__PURE__ */ jsx(BrainIcon, { className: "text-fg-subtle size-3.5" }), /* @__PURE__ */ jsx("span", {
24
+ className: cn(mono, "text-fg-subtle"),
25
+ children: fresh > 0 ? `remembered ${fresh}` : "memory"
26
+ })]
27
+ }), /* @__PURE__ */ jsx("div", {
28
+ className: "flex flex-wrap gap-1.5",
29
+ children: chips.map((chip) => /* @__PURE__ */ jsxs("span", {
30
+ className: cn("cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-animate-in cue-elements-fill-mode-both group flex items-center gap-1 rounded-full py-1 pr-1 pl-2.5 text-(length:--cue-text-ui) duration-300", chip.change === "existing" ? cn(field, "text-fg-muted") : "bg-stream/15 text-stream"),
31
+ children: [chip.text, /* @__PURE__ */ jsx("button", {
32
+ type: "button",
33
+ "aria-label": `Forget "${chip.text}"`,
34
+ onClick: () => onForget?.(chip.id),
35
+ className: cn(ghostButton, "size-4"),
36
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-2.5" })
37
+ })]
38
+ }, chip.id))
39
+ })]
40
+ });
41
+ }
42
+ //#endregion
43
+ export { MemoryChips };
@@ -0,0 +1,38 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/message-actions.d.ts
3
+ type Reaction = "up" | "down" | null;
4
+ interface MessageActionsProps extends Omit<ComponentProps<"div">, "children"> {
5
+ /** When true the copy button shows a green check confirmation. */
6
+ copied: boolean;
7
+ /** Active thumbs reaction, or null when none is selected. */
8
+ reaction: Reaction;
9
+ /** When true the regenerate icon spins to show work in progress. */
10
+ regenerating: boolean;
11
+ /** Called when the copy control is pressed. */
12
+ onCopy: () => void;
13
+ /** Called when the user toggles thumbs up or thumbs down. */
14
+ onReactionChange: (reaction: Reaction) => void;
15
+ /** Called when the regenerate control is pressed. */
16
+ onRegenerate: () => void;
17
+ /** Called when the overflow menu control is pressed. */
18
+ onMore: () => void;
19
+ }
20
+ /**
21
+ * Copy, rate, and regenerate. Each action confirms itself with a small state change.
22
+ *
23
+ * @example
24
+ * import { MessageActions } from "@cueplusplus/ui/elements";
25
+ *
26
+ * <MessageActions
27
+ * copied={false}
28
+ * reaction={null}
29
+ * regenerating={false}
30
+ * onCopy={() => {}}
31
+ * onReactionChange={setReaction}
32
+ * onRegenerate={() => {}}
33
+ * onMore={() => {}}
34
+ * />
35
+ */
36
+ declare function MessageActions({ copied, reaction, regenerating, onCopy, onReactionChange, onRegenerate, onMore, className, ...props }: MessageActionsProps): import("react").JSX.Element;
37
+ //#endregion
38
+ export { MessageActions, MessageActionsProps, Reaction };
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ghostButton, iconSwap, iconSwapIn, iconSwapOut } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { CheckIcon, CopyIcon, EllipsisIcon, RefreshCwIcon, ThumbsDownIcon, ThumbsUpIcon } from "lucide-react";
6
+ //#region src/elements/message-actions.tsx
7
+ /**
8
+ * Copy, rate, and regenerate. Each action confirms itself with a small state change.
9
+ *
10
+ * @example
11
+ * import { MessageActions } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <MessageActions
14
+ * copied={false}
15
+ * reaction={null}
16
+ * regenerating={false}
17
+ * onCopy={() => {}}
18
+ * onReactionChange={setReaction}
19
+ * onRegenerate={() => {}}
20
+ * onMore={() => {}}
21
+ * />
22
+ */
23
+ function MessageActions({ copied, reaction, regenerating, onCopy, onReactionChange, onRegenerate, onMore, className, ...props }) {
24
+ const buttonClassName = cn(ghostButton, "size-7");
25
+ return /* @__PURE__ */ jsxs("div", {
26
+ "data-slot": "message-actions",
27
+ className: cn("flex items-center gap-1", className),
28
+ ...props,
29
+ children: [
30
+ /* @__PURE__ */ jsxs("button", {
31
+ type: "button",
32
+ "aria-label": copied ? "Copied response" : "Copy response",
33
+ onClick: onCopy,
34
+ className: cn(buttonClassName, "grid place-items-center", copied && "text-ok"),
35
+ children: [/* @__PURE__ */ jsx(CopyIcon, { className: cn(iconSwap, "size-3.5", copied ? iconSwapOut : iconSwapIn) }), /* @__PURE__ */ jsx(CheckIcon, { className: cn(iconSwap, "size-3.5", copied ? iconSwapIn : iconSwapOut) })]
36
+ }),
37
+ /* @__PURE__ */ jsx("button", {
38
+ type: "button",
39
+ "aria-label": "Mark response helpful",
40
+ "aria-pressed": reaction === "up",
41
+ onClick: () => onReactionChange(reaction === "up" ? null : "up"),
42
+ className: cn(buttonClassName, reaction === "up" && "bg-surface-2 text-fg"),
43
+ children: /* @__PURE__ */ jsx(ThumbsUpIcon, { className: "size-3.5" })
44
+ }),
45
+ /* @__PURE__ */ jsx("button", {
46
+ type: "button",
47
+ "aria-label": "Mark response unhelpful",
48
+ "aria-pressed": reaction === "down",
49
+ onClick: () => onReactionChange(reaction === "down" ? null : "down"),
50
+ className: cn(buttonClassName, reaction === "down" && "bg-surface-2 text-fg"),
51
+ children: /* @__PURE__ */ jsx(ThumbsDownIcon, { className: "size-3.5" })
52
+ }),
53
+ /* @__PURE__ */ jsx("button", {
54
+ type: "button",
55
+ "aria-label": "Regenerate response",
56
+ onClick: onRegenerate,
57
+ className: buttonClassName,
58
+ children: /* @__PURE__ */ jsx(RefreshCwIcon, { className: cn("size-3.5", regenerating && "animate-spin motion-reduce:animate-none") })
59
+ }),
60
+ /* @__PURE__ */ jsx("button", {
61
+ type: "button",
62
+ "aria-label": "More response actions",
63
+ onClick: onMore,
64
+ className: buttonClassName,
65
+ children: /* @__PURE__ */ jsx(EllipsisIcon, { className: "size-3.5" })
66
+ })
67
+ ]
68
+ });
69
+ }
70
+ //#endregion
71
+ export { MessageActions };
@@ -0,0 +1,48 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/message-attachment.d.ts
3
+ /**
4
+ * One file that arrived with a turn: what it is, how big, and how to draw it.
5
+ *
6
+ * @example
7
+ * import { MessageAttachments } from "@cueplusplus/ui/elements";
8
+ *
9
+ * <MessageAttachments
10
+ * attachments={[
11
+ * { id: "spec", name: "migration.pdf", size: "1.2 MB", kind: "document", pages: 14 },
12
+ * ]}
13
+ * onOpen={(id) => preview(id)}
14
+ * />
15
+ */
16
+ interface MessageAttachmentItem {
17
+ /** Stable identity for the list key and for the callbacks that report a selection. */
18
+ id: string;
19
+ /** File name as shown. */
20
+ name: string;
21
+ /** Pre-formatted size. The element never converts bytes. */
22
+ size: string;
23
+ /** Chooses the shape: a thumbnail button, a paged document chip, or a plain file chip. */
24
+ kind: "image" | "document" | "file";
25
+ /** Page count appended to the size, for documents. */
26
+ pages?: number;
27
+ /**
28
+ * CSS background-image for the thumbnail, used when kind is image. A gradient stands
29
+ * in for a real preview.
30
+ */
31
+ swatch?: string;
32
+ }
33
+ /**
34
+ * The files a turn carried, as received rather than as staged. An image gets a preview
35
+ * tile that opens; anything else gets a row with its size and, for a document, its
36
+ * page count.
37
+ */
38
+ declare function MessageAttachments({ attachments, onOpen, className, ...props }: Omit<ComponentProps<"div">, "children" | "attachments" | "onOpen"> & {
39
+ /**
40
+ * Files carried by the message. Images render as a thumbnail row, everything else as
41
+ * a chip.
42
+ */
43
+ attachments: readonly MessageAttachmentItem[];
44
+ /** Called when an attachment is opened for preview. */
45
+ onOpen?: (id: string) => void;
46
+ }): import("react").JSX.Element;
47
+ //#endregion
48
+ export { MessageAttachmentItem, MessageAttachments };
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, mono, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { FileTextIcon, ImageIcon, PaperclipIcon } from "lucide-react";
6
+ //#region src/elements/message-attachment.tsx
7
+ /**
8
+ * The files a turn carried, as received rather than as staged. An image gets a preview
9
+ * tile that opens; anything else gets a row with its size and, for a document, its
10
+ * page count.
11
+ */
12
+ function MessageAttachments({ attachments, onOpen, className, ...props }) {
13
+ return /* @__PURE__ */ jsx("div", {
14
+ "data-slot": "message-attachments",
15
+ className: cn("flex w-full max-w-sm flex-col gap-1.5", className),
16
+ ...props,
17
+ children: attachments.map((item) => item.kind === "image" ? /* @__PURE__ */ jsxs("button", {
18
+ type: "button",
19
+ onClick: () => onOpen?.(item.id),
20
+ className: cn(paper, "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both group flex w-full items-center gap-3 overflow-hidden rounded-(--radius-overlay) p-2 text-start duration-300"),
21
+ children: [
22
+ /* @__PURE__ */ jsx("span", {
23
+ "aria-hidden": true,
24
+ className: "size-12 shrink-0 rounded-(--radius-surface) bg-cover bg-center transition-transform duration-300 group-hover:scale-[1.04] motion-reduce:transition-none",
25
+ style: {
26
+ backgroundImage: item.swatch,
27
+ backgroundColor: "var(--cue-fg)"
28
+ }
29
+ }),
30
+ /* @__PURE__ */ jsxs("span", {
31
+ className: "flex min-w-0 flex-1 flex-col gap-0.5 pe-2",
32
+ children: [/* @__PURE__ */ jsx("span", {
33
+ className: "text-fg truncate text-(length:--cue-text-body)",
34
+ children: item.name
35
+ }), /* @__PURE__ */ jsx("span", {
36
+ className: cn(mono, "text-fg-subtle"),
37
+ children: item.size
38
+ })]
39
+ }),
40
+ /* @__PURE__ */ jsx(ImageIcon, { className: "text-fg-subtle me-2 size-3.5 shrink-0" })
41
+ ]
42
+ }, item.id) : /* @__PURE__ */ jsxs("button", {
43
+ type: "button",
44
+ onClick: () => onOpen?.(item.id),
45
+ className: cn(field, "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both hover:bg-surface-2 flex w-full items-center gap-2.5 rounded-(--radius-overlay) px-3 py-2.5 text-start transition-colors duration-300"),
46
+ children: [/* @__PURE__ */ jsx("span", {
47
+ className: "bg-bg text-fg-muted flex size-8 shrink-0 items-center justify-center rounded-(--radius-surface)",
48
+ children: item.kind === "document" ? /* @__PURE__ */ jsx(FileTextIcon, { className: "size-3.5" }) : /* @__PURE__ */ jsx(PaperclipIcon, { className: "size-3.5" })
49
+ }), /* @__PURE__ */ jsxs("span", {
50
+ className: "flex min-w-0 flex-1 flex-col gap-0.5",
51
+ children: [/* @__PURE__ */ jsx("span", {
52
+ className: "text-fg truncate text-(length:--cue-text-body)",
53
+ children: item.name
54
+ }), /* @__PURE__ */ jsxs("span", {
55
+ className: cn(mono, "text-fg-subtle"),
56
+ children: [item.size, item.pages !== void 0 && ` · ${item.pages} pages`]
57
+ })]
58
+ })]
59
+ }, item.id))
60
+ });
61
+ }
62
+ //#endregion
63
+ export { MessageAttachments };
@@ -0,0 +1,25 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/message-branches.d.ts
3
+ interface MessageBranchesProps extends Omit<ComponentProps<"div">, "children"> {
4
+ /** Alternate regenerated answers the user can step through. */
5
+ variants: readonly string[];
6
+ /** Which variant is currently displayed. */
7
+ index: number;
8
+ /** Called when the previous or next branch control is pressed. */
9
+ onIndexChange: (index: number) => void;
10
+ }
11
+ /**
12
+ * Navigate between regenerated versions of the same answer without losing your place.
13
+ *
14
+ * @example
15
+ * import { MessageBranches } from "@cueplusplus/ui/elements";
16
+ *
17
+ * <MessageBranches
18
+ * variants={["First answer.", "Second answer."]}
19
+ * index={0}
20
+ * onIndexChange={setIndex}
21
+ * />
22
+ */
23
+ declare function MessageBranches({ variants, index, onIndexChange, className, ...props }: MessageBranchesProps): import("react").JSX.Element;
24
+ //#endregion
25
+ export { MessageBranches, MessageBranchesProps };
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ghostButton, mono } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
6
+ //#region src/elements/message-branches.tsx
7
+ /**
8
+ * Navigate between regenerated versions of the same answer without losing your place.
9
+ *
10
+ * @example
11
+ * import { MessageBranches } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <MessageBranches
14
+ * variants={["First answer.", "Second answer."]}
15
+ * index={0}
16
+ * onIndexChange={setIndex}
17
+ * />
18
+ */
19
+ function MessageBranches({ variants, index, onIndexChange, className, ...props }) {
20
+ const message = variants[index] ?? variants[0] ?? "";
21
+ const hasNavigation = variants.length > 1;
22
+ const goPrevious = () => {
23
+ if (!hasNavigation) return;
24
+ onIndexChange(index === 0 ? variants.length - 1 : index - 1);
25
+ };
26
+ const goNext = () => {
27
+ if (!hasNavigation) return;
28
+ onIndexChange(index === variants.length - 1 ? 0 : index + 1);
29
+ };
30
+ return /* @__PURE__ */ jsxs("div", {
31
+ "data-slot": "message-branches",
32
+ className: cn("flex max-w-sm flex-col gap-2", className),
33
+ ...props,
34
+ children: [/* @__PURE__ */ jsx("p", {
35
+ className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in text-fg min-h-[4.25rem] text-(length:--cue-text-body) leading-relaxed duration-300 motion-reduce:animate-none",
36
+ children: message
37
+ }, index), /* @__PURE__ */ jsxs("div", {
38
+ className: "flex items-center gap-1",
39
+ children: [
40
+ /* @__PURE__ */ jsx("button", {
41
+ type: "button",
42
+ "aria-label": "Show previous response",
43
+ disabled: !hasNavigation,
44
+ onClick: goPrevious,
45
+ className: cn(ghostButton, "size-6"),
46
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "size-3.5" })
47
+ }),
48
+ /* @__PURE__ */ jsx("span", {
49
+ className: cn(mono, "text-fg-subtle tabular-nums"),
50
+ children: variants.length === 0 ? "0 / 0" : `${index + 1} / ${variants.length}`
51
+ }),
52
+ /* @__PURE__ */ jsx("button", {
53
+ type: "button",
54
+ "aria-label": "Show next response",
55
+ disabled: !hasNavigation,
56
+ onClick: goNext,
57
+ className: cn(ghostButton, "size-6"),
58
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-3.5" })
59
+ })
60
+ ]
61
+ })]
62
+ });
63
+ }
64
+ //#endregion
65
+ export { MessageBranches };
@@ -0,0 +1,33 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/message-pair.d.ts
3
+ interface MessagePairProps extends Omit<ComponentProps<"div">, "children"> {
4
+ /** Text shown in the user bubble on the right. */
5
+ userMessage: string;
6
+ /** Assistant reply broken into words for streaming. */
7
+ words: readonly string[];
8
+ /** How many assistant words are currently visible. */
9
+ visibleWords: number;
10
+ /** When true the newest assistant words tint blue as they arrive. */
11
+ streaming: boolean;
12
+ /**
13
+ * bubble wraps the user message in a surface; flat renders it as plain right-aligned
14
+ * text.
15
+ */
16
+ variant?: "bubble" | "flat";
17
+ }
18
+ /**
19
+ * A user bubble and a streaming assistant reply, with actions that appear on hover.
20
+ *
21
+ * @example
22
+ * import { MessagePair } from "@cueplusplus/ui/elements";
23
+ *
24
+ * <MessagePair
25
+ * userMessage="Explain the composer."
26
+ * words={["Here", "is", "a", "short", "reply."]}
27
+ * visibleWords={5}
28
+ * streaming={false}
29
+ * />
30
+ */
31
+ declare function MessagePair({ userMessage, words, visibleWords, streaming, variant, className, ...props }: MessagePairProps): import("react").JSX.Element;
32
+ //#endregion
33
+ export { MessagePair, MessagePairProps };
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ghostButton, paper } from "./surfaces.js";
4
+ import { take } from "./range.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { CopyIcon, RefreshCwIcon } from "lucide-react";
7
+ //#region src/elements/message-pair.tsx
8
+ /**
9
+ * A user bubble and a streaming assistant reply, with actions that appear on hover.
10
+ *
11
+ * @example
12
+ * import { MessagePair } from "@cueplusplus/ui/elements";
13
+ *
14
+ * <MessagePair
15
+ * userMessage="Explain the composer."
16
+ * words={["Here", "is", "a", "short", "reply."]}
17
+ * visibleWords={5}
18
+ * streaming={false}
19
+ * />
20
+ */
21
+ function MessagePair({ userMessage, words, visibleWords, streaming, variant = "bubble", className, ...props }) {
22
+ const shown = take(words, visibleWords);
23
+ return /* @__PURE__ */ jsxs("div", {
24
+ "data-slot": "message-pair",
25
+ className: cn("flex w-full max-w-sm flex-col gap-5", className),
26
+ ...props,
27
+ children: [/* @__PURE__ */ jsx("p", {
28
+ className: cn("max-w-[85%] self-end text-(length:--cue-text-body)", variant === "bubble" ? cn(paper, "rounded-(--radius-overlay) px-3.5 py-2") : "text-fg text-end"),
29
+ children: userMessage
30
+ }), /* @__PURE__ */ jsxs("div", {
31
+ className: "group/message flex flex-col items-start",
32
+ children: [/* @__PURE__ */ jsxs("p", {
33
+ className: "min-h-[4.25rem] text-(length:--cue-text-body) leading-relaxed",
34
+ children: [shown.map((word, index) => {
35
+ const fresh = streaming && shown.length - 1 - index < 2;
36
+ return /* @__PURE__ */ jsxs("span", {
37
+ className: "cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both duration-500 motion-reduce:animate-none",
38
+ children: [/* @__PURE__ */ jsx("span", {
39
+ className: cn("transition-colors duration-700 motion-reduce:transition-none", fresh && "text-stream"),
40
+ children: word
41
+ }), " "]
42
+ }, `${word}-${index}`);
43
+ }), streaming && shown.length > 0 && /* @__PURE__ */ jsx("span", {
44
+ "aria-hidden": true,
45
+ className: "-mb-0.5 ml-0.5 inline-block h-4 w-0.5 animate-pulse rounded-full bg-stream motion-reduce:animate-none"
46
+ })]
47
+ }), /* @__PURE__ */ jsxs("div", {
48
+ className: "flex items-center gap-1 pt-1 opacity-0 transition-opacity group-focus-within/message:opacity-100 group-hover/message:opacity-100 motion-reduce:transition-none",
49
+ children: [/* @__PURE__ */ jsx("button", {
50
+ type: "button",
51
+ "aria-label": "Copy response",
52
+ className: cn(ghostButton, "size-7"),
53
+ children: /* @__PURE__ */ jsx(CopyIcon, { className: "size-3.5" })
54
+ }), /* @__PURE__ */ jsx("button", {
55
+ type: "button",
56
+ "aria-label": "Regenerate response",
57
+ className: cn(ghostButton, "size-7"),
58
+ children: /* @__PURE__ */ jsx(RefreshCwIcon, { className: "size-3.5" })
59
+ })]
60
+ })]
61
+ })]
62
+ });
63
+ }
64
+ //#endregion
65
+ export { MessagePair };
@@ -0,0 +1,31 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/message-queue.d.ts
3
+ /** A turn the person typed while a run was still out. */
4
+ interface QueuedMessage {
5
+ /** Identifies the entry, and what `onCancel` reports. */
6
+ id: string;
7
+ /** What they typed, truncated to one line in the queue. */
8
+ text: string;
9
+ }
10
+ /**
11
+ * Turns you typed while a run was in flight, stacked and cancelable until it finishes.
12
+ *
13
+ * @example
14
+ * import { MessageQueue } from "@cueplusplus/ui/elements";
15
+ *
16
+ * <MessageQueue
17
+ * running="Fix the converter and add a guard"
18
+ * queued={[{ id: "a", text: "Also add a changeset" }]}
19
+ * onCancel={(id) => drop(id)}
20
+ * />
21
+ */
22
+ declare function MessageQueue({ running, queued, onCancel, className, ...props }: Omit<ComponentProps<"div">, "children" | "running" | "queued" | "onCancel"> & {
23
+ /** The turn currently in flight, shown above the queue. */
24
+ running: string;
25
+ /** Turns waiting to send, in the order they will drain once the run finishes. */
26
+ queued: readonly QueuedMessage[];
27
+ /** Called when a queued turn is removed before it ever sends. */
28
+ onCancel?: (id: string) => void;
29
+ }): import("react").JSX.Element;
30
+ //#endregion
31
+ export { MessageQueue, QueuedMessage };