@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,45 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/read-aloud.d.ts
3
+ /**
4
+ * An answer played back, the spoken word lit as it goes, speed under your thumb.
5
+ *
6
+ * @example
7
+ * import { ReadAloud } from "@cueplusplus/ui/elements";
8
+ *
9
+ * <ReadAloud
10
+ * words={words}
11
+ * spokenIndex={12}
12
+ * playing
13
+ * rate={1}
14
+ * elapsed="0:04"
15
+ * duration="0:11"
16
+ * onToggle={toggle}
17
+ * onRateChange={cycleRate}
18
+ * />
19
+ */
20
+ declare function ReadAloud({ words, spokenIndex, playing, rate, elapsed, duration, onToggle, onRateChange, className, ...props }: Omit<ComponentProps<"div">, "children" | "words" | "spokenIndex" | "playing" | "rate" | "elapsed" | "duration" | "onToggle" | "onRateChange"> & {
21
+ /**
22
+ * The answer split into words, so the spoken one can be lit without re-parsing the
23
+ * text.
24
+ */
25
+ words: readonly string[];
26
+ /**
27
+ * Index of the word being spoken. Everything before it dims, everything after stays
28
+ * waiting, and an index outside the text speaks none of it.
29
+ */
30
+ spokenIndex: number;
31
+ /** Swaps the transport button between play and pause. */
32
+ playing: boolean;
33
+ /** Playback speed, printed on the rate control. */
34
+ rate: number;
35
+ /** Pre-formatted elapsed time. */
36
+ elapsed: string;
37
+ /** Pre-formatted total duration. */
38
+ duration: string;
39
+ /** Called when playback is started or paused. */
40
+ onToggle?: () => void;
41
+ /** Called when the rate control is tapped; cycle the rate yourself. */
42
+ onRateChange?: () => void;
43
+ }): import("react").JSX.Element;
44
+ //#endregion
45
+ export { ReadAloud };
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, ghostButton, mono, paper } from "./surfaces.js";
4
+ import { pct } from "./range.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { PauseIcon, PlayIcon, Volume2Icon } from "lucide-react";
7
+ //#region src/elements/read-aloud.tsx
8
+ /**
9
+ * An answer played back, the spoken word lit as it goes, speed under your thumb.
10
+ *
11
+ * @example
12
+ * import { ReadAloud } from "@cueplusplus/ui/elements";
13
+ *
14
+ * <ReadAloud
15
+ * words={words}
16
+ * spokenIndex={12}
17
+ * playing
18
+ * rate={1}
19
+ * elapsed="0:04"
20
+ * duration="0:11"
21
+ * onToggle={toggle}
22
+ * onRateChange={cycleRate}
23
+ * />
24
+ */
25
+ function ReadAloud({ words, spokenIndex, playing, rate, elapsed, duration, onToggle, onRateChange, className, ...props }) {
26
+ const progress = pct(spokenIndex, words.length);
27
+ return /* @__PURE__ */ jsxs("div", {
28
+ "data-slot": "read-aloud",
29
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
30
+ ...props,
31
+ children: [/* @__PURE__ */ jsx("p", {
32
+ className: "text-(length:--cue-text-body) leading-relaxed",
33
+ children: words.map((word, i) => /* @__PURE__ */ jsxs("span", {
34
+ className: cn("transition-colors duration-200 motion-reduce:transition-none", i < spokenIndex ? "text-fg-subtle" : i === spokenIndex ? "text-fg rounded-(--radius-control) bg-stream/15" : "text-fg-muted"),
35
+ children: [word, " "]
36
+ }, `${i}-${word}`))
37
+ }), /* @__PURE__ */ jsxs("div", {
38
+ className: "flex items-center gap-2.5",
39
+ children: [
40
+ /* @__PURE__ */ jsx("button", {
41
+ type: "button",
42
+ "aria-label": playing ? "Pause" : "Play",
43
+ onClick: onToggle,
44
+ className: cn(ghostButton, "bg-surface-2 size-8 shrink-0"),
45
+ children: playing ? /* @__PURE__ */ jsx(PauseIcon, { className: "size-3.5" }) : /* @__PURE__ */ jsx(PlayIcon, { className: "size-3.5 translate-x-px" })
46
+ }),
47
+ /* @__PURE__ */ jsx("span", {
48
+ className: "bg-surface-2 h-[3px] min-w-0 flex-1 overflow-hidden rounded-full",
49
+ children: /* @__PURE__ */ jsx("span", {
50
+ className: "block h-full rounded-full bg-stream transition-[width] duration-200 ease-linear motion-reduce:transition-none",
51
+ style: { width: `${progress}%` }
52
+ })
53
+ }),
54
+ /* @__PURE__ */ jsxs("span", {
55
+ className: cn(mono, "text-fg-subtle shrink-0 tabular-nums"),
56
+ children: [
57
+ elapsed,
58
+ " / ",
59
+ duration
60
+ ]
61
+ }),
62
+ /* @__PURE__ */ jsxs("button", {
63
+ type: "button",
64
+ "aria-label": `Playback speed, currently ${rate} times`,
65
+ onClick: onRateChange,
66
+ className: cn(field, mono, "text-fg-muted hover:text-fg shrink-0 rounded-full px-2 py-1 tabular-nums transition-colors"),
67
+ children: [rate, "×"]
68
+ }),
69
+ /* @__PURE__ */ jsx(Volume2Icon, { className: "text-fg-subtle size-3.5 shrink-0" })
70
+ ]
71
+ })]
72
+ });
73
+ }
74
+ //#endregion
75
+ export { ReadAloud };
@@ -0,0 +1,36 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/reasoning-effort.d.ts
3
+ /** One rung of the thinking budget: what it is called, and how many tokens it buys. */
4
+ interface EffortLevel {
5
+ /** Identifies the rung, and what `onSelect` reports. */
6
+ key: string;
7
+ /** The word on the segment — `Low`, `Medium`, `High`. */
8
+ label: string;
9
+ /** Tokens this rung allows, which is what the meter underneath is a fraction of. */
10
+ budget: number;
11
+ }
12
+ /**
13
+ * How hard to think, and how much of that budget the run actually spent.
14
+ *
15
+ * @example
16
+ * import { ReasoningEffort } from "@cueplusplus/ui/elements";
17
+ *
18
+ * <ReasoningEffort
19
+ * levels={levels}
20
+ * selectedKey="high"
21
+ * spent={5200}
22
+ * onSelect={setLevel}
23
+ * />
24
+ */
25
+ declare function ReasoningEffort({ levels, selectedKey, spent, onSelect, className, ...props }: Omit<ComponentProps<"div">, "children" | "levels" | "selectedKey" | "spent" | "onSelect"> & {
26
+ /** Every tier on offer, each carrying its own token budget. */
27
+ levels: readonly EffortLevel[];
28
+ /** Which tier is active. Its budget becomes the denominator. */
29
+ selectedKey: string;
30
+ /** Thinking tokens used so far, filling the bar against the selected budget. */
31
+ spent: number;
32
+ /** Called when a tier is picked. */
33
+ onSelect?: (key: string) => void;
34
+ }): import("react").JSX.Element;
35
+ //#endregion
36
+ export { EffortLevel, ReasoningEffort };
@@ -0,0 +1,67 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, mono } from "./surfaces.js";
4
+ import { pct } from "./range.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/elements/reasoning-effort.tsx
7
+ const fmt = (n) => n.toLocaleString("en-US");
8
+ /**
9
+ * How hard to think, and how much of that budget the run actually spent.
10
+ *
11
+ * @example
12
+ * import { ReasoningEffort } from "@cueplusplus/ui/elements";
13
+ *
14
+ * <ReasoningEffort
15
+ * levels={levels}
16
+ * selectedKey="high"
17
+ * spent={5200}
18
+ * onSelect={setLevel}
19
+ * />
20
+ */
21
+ function ReasoningEffort({ levels, selectedKey, spent, onSelect, className, ...props }) {
22
+ const budget = levels.find((level) => level.key === selectedKey)?.budget ?? 0;
23
+ const used = pct(spent, budget);
24
+ return /* @__PURE__ */ jsxs("div", {
25
+ "data-slot": "reasoning-effort",
26
+ className: cn("flex w-full max-w-sm flex-col gap-2.5", className),
27
+ ...props,
28
+ children: [
29
+ /* @__PURE__ */ jsxs("div", {
30
+ className: "flex items-baseline justify-between",
31
+ children: [/* @__PURE__ */ jsx("span", {
32
+ className: "text-(length:--cue-text-body) font-medium",
33
+ children: "Thinking"
34
+ }), /* @__PURE__ */ jsxs("span", {
35
+ className: cn(mono, "text-fg-subtle tabular-nums"),
36
+ children: [
37
+ fmt(spent),
38
+ " / ",
39
+ fmt(budget)
40
+ ]
41
+ })]
42
+ }),
43
+ /* @__PURE__ */ jsx("div", {
44
+ className: cn(field, "flex gap-0.5 rounded-full p-0.5"),
45
+ children: levels.map((level) => {
46
+ const active = level.key === selectedKey;
47
+ return /* @__PURE__ */ jsx("button", {
48
+ type: "button",
49
+ "aria-pressed": active,
50
+ onClick: () => onSelect?.(level.key),
51
+ className: cn("flex-1 rounded-full py-1 text-(length:--cue-text-ui) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.97]", active ? "bg-bg text-fg" : "text-fg-muted hover:text-fg-muted"),
52
+ children: level.label
53
+ }, level.key);
54
+ })
55
+ }),
56
+ /* @__PURE__ */ jsx("span", {
57
+ className: "bg-surface-2 h-[3px] w-full overflow-hidden rounded-full",
58
+ children: /* @__PURE__ */ jsx("span", {
59
+ className: "block h-full rounded-full bg-stream transition-[width] duration-500 motion-reduce:transition-none",
60
+ style: { width: `${used}%` }
61
+ })
62
+ })
63
+ ]
64
+ });
65
+ }
66
+ //#endregion
67
+ export { ReasoningEffort };
@@ -0,0 +1,46 @@
1
+ //#region src/elements/reasoning-panel.d.ts
2
+ /** One beat of the model's thinking: what it turned to, and what it made of it. */
3
+ interface ReasoningStep {
4
+ /** What this beat is about, in a few words. Also the row's key, so keep it unique. */
5
+ title: string;
6
+ /** The thought itself, in full. Wraps and breaks; nothing truncates it. */
7
+ body: string;
8
+ }
9
+ interface ReasoningPanelProps {
10
+ /** Full list of reasoning steps available to reveal. */
11
+ steps: ReasoningStep[];
12
+ /** How many steps from the start are currently shown on the timeline. */
13
+ visibleSteps: number;
14
+ /** When true the trigger shows a shimmering Thinking label and the active step pulses. */
15
+ streaming: boolean;
16
+ /** Whether the collapsible step list is expanded. */
17
+ open: boolean;
18
+ /** Called when the user expands or collapses the panel. */
19
+ onOpenChange: (open: boolean) => void;
20
+ /** Trigger label once streaming finishes, for example a summary of how long it thought. */
21
+ restingLabel: string;
22
+ /** Elapsed timer shown next to Thinking while streaming. Omit to hide it. */
23
+ elapsed?: string;
24
+ /** Extra classes merged onto the root. */
25
+ className?: string;
26
+ }
27
+ /**
28
+ * A collapsible trace that streams reasoning steps along a timeline, then settles into
29
+ * a summary.
30
+ *
31
+ * @example
32
+ * import { ReasoningPanel } from "@cueplusplus/ui/elements";
33
+ *
34
+ * <ReasoningPanel
35
+ * steps={[{ title: "Scope", body: "Find the failing path." }]}
36
+ * visibleSteps={1}
37
+ * streaming
38
+ * open
39
+ * onOpenChange={setOpen}
40
+ * restingLabel="Reasoned for 4s"
41
+ * elapsed="2s"
42
+ * />
43
+ */
44
+ declare function ReasoningPanel({ steps, visibleSteps, streaming, open, onOpenChange, restingLabel, elapsed, className }: ReasoningPanelProps): import("react").JSX.Element;
45
+ //#endregion
46
+ export { ReasoningPanel, ReasoningPanelProps, ReasoningStep };
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ShimmerLabel, SwapLabel, collapsePanel } from "./surfaces.js";
4
+ import { take } from "./range.js";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { Collapsible } from "@base-ui/react/collapsible";
7
+ import { ChevronDownIcon } from "lucide-react";
8
+ //#region src/elements/reasoning-panel.tsx
9
+ /**
10
+ * A collapsible trace that streams reasoning steps along a timeline, then settles into
11
+ * a summary.
12
+ *
13
+ * @example
14
+ * import { ReasoningPanel } from "@cueplusplus/ui/elements";
15
+ *
16
+ * <ReasoningPanel
17
+ * steps={[{ title: "Scope", body: "Find the failing path." }]}
18
+ * visibleSteps={1}
19
+ * streaming
20
+ * open
21
+ * onOpenChange={setOpen}
22
+ * restingLabel="Reasoned for 4s"
23
+ * elapsed="2s"
24
+ * />
25
+ */
26
+ function ReasoningPanel({ steps, visibleSteps, streaming, open, onOpenChange, restingLabel, elapsed, className }) {
27
+ const shown = take(steps, visibleSteps);
28
+ return /* @__PURE__ */ jsxs(Collapsible.Root, {
29
+ "data-slot": "reasoning-panel",
30
+ open,
31
+ onOpenChange,
32
+ className: cn("w-full max-w-sm", className),
33
+ children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
34
+ className: "group/trigger text-fg-muted hover:text-fg flex items-center gap-1.5 py-1 text-(length:--cue-text-body) transition-[color,scale] outline-none active:scale-[0.98] focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent",
35
+ children: [/* @__PURE__ */ jsxs(SwapLabel, {
36
+ active: streaming ? 0 : 1,
37
+ className: "text-start",
38
+ children: [/* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ShimmerLabel, {
39
+ active: streaming,
40
+ className: "relative inline-block leading-none",
41
+ children: "Thinking"
42
+ }), elapsed !== void 0 && /* @__PURE__ */ jsx("span", {
43
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle tabular-nums"),
44
+ children: elapsed
45
+ })] }), /* @__PURE__ */ jsx(Fragment, { children: restingLabel })]
46
+ }), /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-3.5 shrink-0 opacity-60 transition-transform duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] group-data-[panel-open]/trigger:rotate-180 motion-reduce:transition-none" })]
47
+ }), /* @__PURE__ */ jsx(Collapsible.Panel, {
48
+ className: cn(collapsePanel, "outline-none"),
49
+ children: /* @__PURE__ */ jsx("ol", {
50
+ className: "flex flex-col gap-4 pt-3 pb-1",
51
+ children: shown.map((step, i) => {
52
+ const active = streaming && i === shown.length - 1;
53
+ return /* @__PURE__ */ jsxs("li", {
54
+ className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex gap-3 duration-300",
55
+ children: [/* @__PURE__ */ jsx("span", {
56
+ "aria-hidden": true,
57
+ className: cn("mt-[7px] size-[5px] shrink-0 rounded-full transition-colors duration-300", active ? "animate-pulse bg-stream" : "bg-surface-3")
58
+ }), /* @__PURE__ */ jsxs("span", {
59
+ className: "flex min-w-0 flex-1 flex-col",
60
+ children: [/* @__PURE__ */ jsx("p", {
61
+ className: "text-fg text-(length:--cue-text-body) font-medium",
62
+ children: step.title
63
+ }), /* @__PURE__ */ jsx("p", {
64
+ className: "text-fg-muted mt-0.5 text-(length:--cue-text-body) leading-relaxed break-words",
65
+ children: step.body
66
+ })]
67
+ })]
68
+ }, step.title);
69
+ })
70
+ })
71
+ })]
72
+ });
73
+ }
74
+ //#endregion
75
+ export { ReasoningPanel };
@@ -0,0 +1,45 @@
1
+ import { ComponentProps, ReactNode } from "react";
2
+ //#region src/elements/recommendation-card.d.ts
3
+ /**
4
+ * Whether the proposal is still standing (`idle`) or the person has taken it
5
+ * (`accepted`). The card swaps its whole action row rather than disabling it.
6
+ */
7
+ type RecommendationState = "idle" | "accepted";
8
+ /**
9
+ * The agent proposes a change with its confidence, and waits for a yes.
10
+ *
11
+ * @example
12
+ * import { RecommendationCard } from "@cueplusplus/ui/elements";
13
+ *
14
+ * <RecommendationCard
15
+ * state="idle"
16
+ * question="Enable draft autosave?"
17
+ * confidenceLabel="high confidence"
18
+ * acceptedLabel="Enabled for every thread"
19
+ * onAccept={() => accept()}
20
+ * >
21
+ * Wire{" "}
22
+ * <span className="bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
23
+ * runtime.drafts
24
+ * </span>{" "}
25
+ * with three lines.
26
+ * </RecommendationCard>
27
+ */
28
+ declare function RecommendationCard({ state, question, children, confidenceLabel, acceptedLabel, onAccept, onAlternatives, className, ...props }: Omit<ComponentProps<"div">, "state" | "question" | "children" | "confidenceLabel" | "acceptedLabel" | "onAccept" | "onAlternatives"> & {
29
+ /** idle shows accept controls; accepted swaps in a confirmation row. */
30
+ state: RecommendationState;
31
+ /** Proposal headline the agent is asking the user about. */
32
+ question: string;
33
+ /** Supporting body explaining the recommendation. */
34
+ children: ReactNode;
35
+ /** Confidence copy shown next to the bar meter while idle. */
36
+ confidenceLabel: string;
37
+ /** Confirmation copy shown once the proposal is accepted. */
38
+ acceptedLabel: string;
39
+ /** Called when the user clicks Accept. */
40
+ onAccept?: () => void;
41
+ /** Called when the user clicks Alternatives. */
42
+ onAlternatives?: () => void;
43
+ }): import("react").JSX.Element;
44
+ //#endregion
45
+ export { RecommendationCard, RecommendationState };
@@ -0,0 +1,83 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { inkButton, mono, paper } from "./surfaces.js";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { CheckIcon } from "lucide-react";
6
+ //#region src/elements/recommendation-card.tsx
7
+ const CONFIDENCE_BARS = [
8
+ 0,
9
+ 1,
10
+ 2
11
+ ];
12
+ /**
13
+ * The agent proposes a change with its confidence, and waits for a yes.
14
+ *
15
+ * @example
16
+ * import { RecommendationCard } from "@cueplusplus/ui/elements";
17
+ *
18
+ * <RecommendationCard
19
+ * state="idle"
20
+ * question="Enable draft autosave?"
21
+ * confidenceLabel="high confidence"
22
+ * acceptedLabel="Enabled for every thread"
23
+ * onAccept={() => accept()}
24
+ * >
25
+ * Wire{" "}
26
+ * <span className="bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
27
+ * runtime.drafts
28
+ * </span>{" "}
29
+ * with three lines.
30
+ * </RecommendationCard>
31
+ */
32
+ function RecommendationCard({ state, question, children, confidenceLabel, acceptedLabel, onAccept, onAlternatives, className, ...props }) {
33
+ return /* @__PURE__ */ jsxs("div", {
34
+ "data-slot": "recommendation-card",
35
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
36
+ ...props,
37
+ children: [
38
+ /* @__PURE__ */ jsx("p", {
39
+ className: "text-(length:--cue-text-body) font-medium",
40
+ children: question
41
+ }),
42
+ /* @__PURE__ */ jsx("p", {
43
+ className: "text-fg-muted text-(length:--cue-text-body) leading-relaxed",
44
+ children
45
+ }),
46
+ /* @__PURE__ */ jsx("div", {
47
+ className: "flex h-8 items-center justify-between",
48
+ children: state === "idle" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
49
+ className: "flex items-center gap-2",
50
+ children: [/* @__PURE__ */ jsx("span", {
51
+ className: "flex items-end gap-0.5",
52
+ "aria-hidden": true,
53
+ children: CONFIDENCE_BARS.map((bar) => /* @__PURE__ */ jsx("span", {
54
+ className: "w-1 rounded-full bg-ok/70",
55
+ style: { height: 6 + bar * 3 }
56
+ }, bar))
57
+ }), /* @__PURE__ */ jsx("span", {
58
+ className: cn(mono, "text-fg-subtle"),
59
+ children: confidenceLabel
60
+ })]
61
+ }), /* @__PURE__ */ jsxs("div", {
62
+ className: "flex items-center gap-2",
63
+ children: [/* @__PURE__ */ jsx("button", {
64
+ type: "button",
65
+ onClick: onAlternatives,
66
+ className: "text-fg-muted hover:bg-surface-2 hover:text-fg h-8 rounded-full px-3.5 text-(length:--cue-text-ui) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.96]",
67
+ children: "Alternatives"
68
+ }), /* @__PURE__ */ jsx("button", {
69
+ type: "button",
70
+ onClick: onAccept,
71
+ className: cn(inkButton, "flex h-8 items-center rounded-full px-3.5 text-(length:--cue-text-ui) font-medium"),
72
+ children: "Accept"
73
+ })]
74
+ })] }) : /* @__PURE__ */ jsxs("div", {
75
+ className: "cue-elements-fade-in cue-elements-animate-in text-fg-muted flex items-center gap-2 text-(length:--cue-text-ui) duration-300",
76
+ children: [/* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5 text-ok" }), acceptedLabel]
77
+ }, "accepted")
78
+ })
79
+ ]
80
+ });
81
+ }
82
+ //#endregion
83
+ export { RecommendationCard };
@@ -0,0 +1,45 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/regenerate-menu.d.ts
3
+ /** One model the same turn could be run again on. */
4
+ interface RegenerateOption {
5
+ /** Identifies the model, and what `onPick` reports. Matching `currentId` marks the row. */
6
+ id: string;
7
+ /** The model's name. */
8
+ label: string;
9
+ /**
10
+ * What distinguishes it — `faster`, `deeper`, a price. Replaced by `current` on the
11
+ * row in use.
12
+ */
13
+ detail: string;
14
+ }
15
+ /**
16
+ * Fork the same turn to a different model instead of rolling the same dice.
17
+ *
18
+ * @example
19
+ * import { RegenerateMenu } from "@cueplusplus/ui/elements";
20
+ *
21
+ * <RegenerateMenu
22
+ * options={options}
23
+ * open={open}
24
+ * currentId="sonnet"
25
+ * onOpenChange={setOpen}
26
+ * onPick={regenerate}
27
+ * />
28
+ */
29
+ declare function RegenerateMenu({ options, open, currentId, onOpenChange, onPick, className, ...props }: Omit<ComponentProps<"div">, "children" | "options" | "open" | "currentId" | "onOpenChange" | "onPick"> & {
30
+ /** What the turn can be re-run with. */
31
+ options: readonly RegenerateOption[];
32
+ /** Whether the menu is showing. */
33
+ open: boolean;
34
+ /**
35
+ * Which option produced the answer on screen; it is labelled current instead of
36
+ * showing its detail.
37
+ */
38
+ currentId: string;
39
+ /** Called when the trigger is toggled. */
40
+ onOpenChange?: (open: boolean) => void;
41
+ /** Called with the chosen option. */
42
+ onPick?: (id: string) => void;
43
+ }): import("react").JSX.Element;
44
+ //#endregion
45
+ export { RegenerateMenu, RegenerateOption };
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ghostButton } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { RefreshCwIcon } from "lucide-react";
6
+ //#region src/elements/regenerate-menu.tsx
7
+ /**
8
+ * Fork the same turn to a different model instead of rolling the same dice.
9
+ *
10
+ * @example
11
+ * import { RegenerateMenu } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <RegenerateMenu
14
+ * options={options}
15
+ * open={open}
16
+ * currentId="sonnet"
17
+ * onOpenChange={setOpen}
18
+ * onPick={regenerate}
19
+ * />
20
+ */
21
+ function RegenerateMenu({ options, open, currentId, onOpenChange, onPick, className, ...props }) {
22
+ return /* @__PURE__ */ jsxs("div", {
23
+ "data-slot": "regenerate-menu",
24
+ className: cn("flex w-full max-w-sm flex-col gap-2", className),
25
+ ...props,
26
+ children: [/* @__PURE__ */ jsx("button", {
27
+ type: "button",
28
+ "aria-expanded": open,
29
+ "aria-label": "Regenerate with a different model",
30
+ onClick: () => onOpenChange?.(!open),
31
+ className: cn(ghostButton, "size-7 self-start", open && "bg-surface-2 text-fg"),
32
+ children: /* @__PURE__ */ jsx(RefreshCwIcon, { className: "size-3.5" })
33
+ }), open && /* @__PURE__ */ jsx("div", {
34
+ className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-slide-in-from-top-1 cue-elements-animate-in flex flex-col gap-0.5 rounded-(--radius-overlay) p-1.5 duration-200"),
35
+ children: options.map((option) => /* @__PURE__ */ jsxs("button", {
36
+ type: "button",
37
+ onClick: () => onPick?.(option.id),
38
+ className: "hover:bg-surface-1 flex items-baseline gap-2 rounded-(--radius-surface) px-2.5 py-1.5 text-start transition-colors",
39
+ children: [/* @__PURE__ */ jsx("span", {
40
+ className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
41
+ children: option.label
42
+ }), /* @__PURE__ */ jsx("span", {
43
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle shrink-0"),
44
+ children: option.id === currentId ? "current" : option.detail
45
+ })]
46
+ }, option.id))
47
+ })]
48
+ });
49
+ }
50
+ //#endregion
51
+ export { RegenerateMenu };