@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,99 @@
1
+ {
2
+ "name": "MessageActions",
3
+ "slug": "message-actions",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Copy, rate, and regenerate. Each action confirms itself with a small state change.",
11
+ "props": [
12
+ {
13
+ "name": "copied",
14
+ "type": "boolean",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "When true the copy button shows a green check confirmation."
18
+ },
19
+ {
20
+ "name": "reaction",
21
+ "type": "Reaction",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Active thumbs reaction, or null when none is selected."
25
+ },
26
+ {
27
+ "name": "regenerating",
28
+ "type": "boolean",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "When true the regenerate icon spins to show work in progress."
32
+ },
33
+ {
34
+ "name": "onCopy",
35
+ "type": "() => void",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "Called when the copy control is pressed."
39
+ },
40
+ {
41
+ "name": "onReactionChange",
42
+ "type": "(reaction: Reaction) => void",
43
+ "required": true,
44
+ "defaultValue": null,
45
+ "description": "Called when the user toggles thumbs up or thumbs down."
46
+ },
47
+ {
48
+ "name": "onRegenerate",
49
+ "type": "() => void",
50
+ "required": true,
51
+ "defaultValue": null,
52
+ "description": "Called when the regenerate control is pressed."
53
+ },
54
+ {
55
+ "name": "onMore",
56
+ "type": "() => void",
57
+ "required": true,
58
+ "defaultValue": null,
59
+ "description": "Called when the overflow menu control is pressed."
60
+ }
61
+ ],
62
+ "typeReferences": [
63
+ "Omit<\n ComponentProps<\"div\">,\n \"children\"\n>"
64
+ ],
65
+ "subcomponents": [],
66
+ "parts": [],
67
+ "variants": {},
68
+ "defaultVariants": {},
69
+ "tokensUsed": [
70
+ "--cue-fg",
71
+ "--cue-ok",
72
+ "--cue-surface-2"
73
+ ],
74
+ "summary": "Copy, rate, and regenerate.",
75
+ "examples": [
76
+ {
77
+ "title": "Usage",
78
+ "code": "import { MessageActions } from \"@cueplusplus/ui/elements\";\n\n<MessageActions\n copied={false}\n reaction={null}\n regenerating={false}\n onCopy={() => {}}\n onReactionChange={setReaction}\n onRegenerate={() => {}}\n onMore={() => {}}\n/>",
79
+ "language": "tsx"
80
+ }
81
+ ],
82
+ "status": "todo-docs",
83
+ "url": "/docs/components/message-actions",
84
+ "mdUrl": "/docs/components/message-actions.md",
85
+ "jsonUrl": "/r/components/message-actions.json",
86
+ "specimens": [
87
+ {
88
+ "title": "MessageActions",
89
+ "group": "elements-thread",
90
+ "components": [
91
+ "MessageActions"
92
+ ],
93
+ "code": "<Specimens>\n <Specimen label=\"resting\" wide>\n <MessageActions\n copied={copied}\n reaction={reaction}\n regenerating={regenerating}\n onCopy={() => setCopied((current) => !current)}\n onReactionChange={setReaction}\n onRegenerate={() => setRegenerating((current) => !current)}\n onMore={() => undefined}\n />\n </Specimen>\n <Specimen label=\"copied\" wide>\n <MessageActions\n copied\n reaction={null}\n regenerating={false}\n onCopy={() => undefined}\n onReactionChange={() => undefined}\n onRegenerate={() => undefined}\n onMore={() => undefined}\n />\n </Specimen>\n <Specimen label=\"rated, regenerating\" wide>\n <MessageActions\n copied={false}\n reaction=\"up\"\n regenerating\n onCopy={() => undefined}\n onReactionChange={() => undefined}\n onRegenerate={() => undefined}\n onMore={() => undefined}\n />\n </Specimen>\n</Specimens>",
94
+ "note": "The row under an answer: copy, rate it, run it again, or ask for more. Every action confirms itself in place — copy swaps to a check and turns green, a rating latches, regenerate spins while it is out — so nothing needs a toast to say it worked.",
95
+ "interaction": "all five are named icon buttons; the two ratings carry aria-pressed and toggle off when pressed again. The copy swap is a crossfade between two icons in one cell, not a re-mount."
96
+ }
97
+ ],
98
+ "todo": true
99
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "MessageAttachments",
3
+ "slug": "message-attachments",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "The files a turn carried, as received rather than as staged. An image gets a preview\ntile that opens; anything else gets a row with its size and, for a document, its\npage count.",
11
+ "props": [
12
+ {
13
+ "name": "attachments",
14
+ "type": "readonly MessageAttachmentItem[]",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Files carried by the message. Images render as a thumbnail row, everything else as\na chip."
18
+ },
19
+ {
20
+ "name": "onOpen",
21
+ "type": "((id: string) => void)",
22
+ "required": false,
23
+ "defaultValue": null,
24
+ "description": "Called when an attachment is opened for preview."
25
+ }
26
+ ],
27
+ "typeReferences": [
28
+ "Omit<ComponentProps<\"div\">, \"children\" | \"attachments\" | \"onOpen\"> & {\n /**\n * Files carried by the message. Images render as a thumbnail row, everything else as\n * a chip.\n */\n attachments: readonly MessageAttachmentItem[];\n /** Called when an attachment is opened for preview. */\n onOpen?: (id: string) => void;\n}"
29
+ ],
30
+ "subcomponents": [],
31
+ "parts": [],
32
+ "variants": {},
33
+ "defaultVariants": {},
34
+ "tokensUsed": [
35
+ "--cue-bg",
36
+ "--cue-fg",
37
+ "--cue-fg-muted",
38
+ "--cue-fg-subtle",
39
+ "--cue-radius-overlay",
40
+ "--cue-radius-surface",
41
+ "--cue-surface-2",
42
+ "--cue-text-body"
43
+ ],
44
+ "summary": "The files a turn carried, as received rather than as staged.",
45
+ "examples": [],
46
+ "status": "todo-docs",
47
+ "url": "/docs/components/message-attachments",
48
+ "mdUrl": "/docs/components/message-attachments.md",
49
+ "jsonUrl": "/r/components/message-attachments.json",
50
+ "specimens": [
51
+ {
52
+ "title": "MessageAttachments",
53
+ "group": "elements-thread",
54
+ "components": [
55
+ "MessageAttachments"
56
+ ],
57
+ "code": "<Specimens>\n <Specimen label=\"image, file, document\" wide>\n <MessageAttachments attachments={ATTACHMENTS} onOpen={() => undefined} />\n </Specimen>\n <Specimen label=\"one document\" wide>\n <MessageAttachments attachments={ATTACHMENTS.slice(2)} />\n </Specimen>\n</Specimens>",
58
+ "note": "Files as received, not as staged: an image gets a preview tile that opens, a document gets its page count, anything else gets its size. Upstream's uploader lives in the composer — this is the read-only other end of it.",
59
+ "interaction": "every row is one button with its name as the label; the image tile grows very slightly under the pointer, and holds still under reduced motion."
60
+ }
61
+ ],
62
+ "todo": true
63
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "MessageBranches",
3
+ "slug": "message-branches",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Navigate between regenerated versions of the same answer without losing your place.",
11
+ "props": [
12
+ {
13
+ "name": "variants",
14
+ "type": "readonly string[]",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Alternate regenerated answers the user can step through."
18
+ },
19
+ {
20
+ "name": "index",
21
+ "type": "number",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Which variant is currently displayed."
25
+ },
26
+ {
27
+ "name": "onIndexChange",
28
+ "type": "(index: number) => void",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Called when the previous or next branch control is pressed."
32
+ }
33
+ ],
34
+ "typeReferences": [
35
+ "Omit<\n ComponentProps<\"div\">,\n \"children\"\n>"
36
+ ],
37
+ "subcomponents": [],
38
+ "parts": [],
39
+ "variants": {},
40
+ "defaultVariants": {},
41
+ "tokensUsed": [
42
+ "--cue-fg",
43
+ "--cue-fg-subtle",
44
+ "--cue-text-body"
45
+ ],
46
+ "summary": "Navigate between regenerated versions of the same answer without losing your place.",
47
+ "examples": [
48
+ {
49
+ "title": "Usage",
50
+ "code": "import { MessageBranches } from \"@cueplusplus/ui/elements\";\n\n<MessageBranches\n variants={[\"First answer.\", \"Second answer.\"]}\n index={0}\n onIndexChange={setIndex}\n/>",
51
+ "language": "tsx"
52
+ }
53
+ ],
54
+ "status": "todo-docs",
55
+ "url": "/docs/components/message-branches",
56
+ "mdUrl": "/docs/components/message-branches.md",
57
+ "jsonUrl": "/r/components/message-branches.json",
58
+ "specimens": [
59
+ {
60
+ "title": "MessageBranches",
61
+ "group": "elements-thread",
62
+ "components": [
63
+ "MessageBranches"
64
+ ],
65
+ "code": "<Specimens>\n <Specimen label=\"two versions\" wide>\n <MessageBranches variants={BRANCHES} index={branch} onIndexChange={setBranch} />\n </Specimen>\n <Specimen label=\"one version — nowhere to go\" wide>\n <MessageBranches\n variants={BRANCHES.slice(0, 1)}\n index={0}\n onIndexChange={() => undefined}\n />\n </Specimen>\n</Specimens>",
66
+ "note": "Two answers to the same question, and a way through them that does not lose your place. The counter is the whole affordance — `2 / 2` is what tells you a second version exists at all — and it wraps at both ends rather than dead-ending.",
67
+ "interaction": "both arrows are named and go disabled when there is only one version, which is the honest state for a turn nobody has regenerated."
68
+ }
69
+ ],
70
+ "todo": true
71
+ }
@@ -5,7 +5,7 @@
5
5
  "importPath": "@cueplusplus/ui",
6
6
  "peerDependencies": [],
7
7
  "clientOnly": true,
8
- "description": "The transcript scroller: sticks to the bottom, and stops fighting you the\nmoment you scroll up.\n\nFollowing is a *mode*, not a scroll position. While pinned to the bottom the\nview follows new turns; scroll up to read something and it lets go and offers\na \"jump to latest\" pill instead — because a stream that yanks the viewport\nmid-sentence is the single most common reason people stop reading a chat\npane. Coming back to the bottom re-arms it.\n\nDeliberately **not** virtualised. A virtualiser needs a measurable row height\nand chat turns are variable-height by nature; the cost of getting that wrong\n(jumping scrollbars) is worse than the cost of a few hundred DOM nodes. When\na thread really is unbounded, page it — do not virtualise it.",
8
+ "description": "The transcript scroller: sticks to the bottom, and stops fighting you the\nmoment you scroll up.\n\nFollowing is a *mode*, not a scroll position. While pinned to the bottom the\nview follows new turns; scroll up to read something and it lets go and offers\na \"jump to latest\" pill instead — because a stream that yanks the viewport\nmid-sentence is the single most common reason people stop reading a chat\npane. Coming back to the bottom re-arms it.\n\nIt follows a turn that is still growing, too — the items container is watched\nfor growth, so a streaming bubble keeps the bottom in view without the host\nadding anything, while something merely collapsing leaves the view alone. And\nwhen you have scrolled up, a turn that grows offers the pill instead of\npulling you down.\n\nDeliberately **not** virtualised. A virtualiser needs a measurable row height\nand chat turns are variable-height by nature; the cost of getting that wrong\n(jumping scrollbars) is worse than the cost of a few hundred DOM nodes. When\na thread really is unbounded, page it — do not virtualise it.",
9
9
  "props": [
10
10
  {
11
11
  "name": "children",
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "MessagePair",
3
+ "slug": "message-pair",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "A user bubble and a streaming assistant reply, with actions that appear on hover.",
11
+ "props": [
12
+ {
13
+ "name": "userMessage",
14
+ "type": "string",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Text shown in the user bubble on the right."
18
+ },
19
+ {
20
+ "name": "words",
21
+ "type": "readonly string[]",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Assistant reply broken into words for streaming."
25
+ },
26
+ {
27
+ "name": "visibleWords",
28
+ "type": "number",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "How many assistant words are currently visible."
32
+ },
33
+ {
34
+ "name": "streaming",
35
+ "type": "boolean",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "When true the newest assistant words tint blue as they arrive."
39
+ },
40
+ {
41
+ "name": "variant",
42
+ "type": "\"flat\" | \"bubble\"",
43
+ "required": false,
44
+ "defaultValue": "bubble",
45
+ "description": "bubble wraps the user message in a surface; flat renders it as plain right-aligned\ntext."
46
+ }
47
+ ],
48
+ "typeReferences": [
49
+ "Omit<\n ComponentProps<\"div\">,\n \"children\"\n>"
50
+ ],
51
+ "subcomponents": [],
52
+ "parts": [],
53
+ "variants": {},
54
+ "defaultVariants": {},
55
+ "tokensUsed": [
56
+ "--cue-fg",
57
+ "--cue-radius-overlay",
58
+ "--cue-stream",
59
+ "--cue-text-body"
60
+ ],
61
+ "summary": "A user bubble and a streaming assistant reply, with actions that appear on hover.",
62
+ "examples": [
63
+ {
64
+ "title": "Usage",
65
+ "code": "import { MessagePair } from \"@cueplusplus/ui/elements\";\n\n<MessagePair\n userMessage=\"Explain the composer.\"\n words={[\"Here\", \"is\", \"a\", \"short\", \"reply.\"]}\n visibleWords={5}\n streaming={false}\n/>",
66
+ "language": "tsx"
67
+ }
68
+ ],
69
+ "status": "todo-docs",
70
+ "url": "/docs/components/message-pair",
71
+ "mdUrl": "/docs/components/message-pair.md",
72
+ "jsonUrl": "/r/components/message-pair.json",
73
+ "specimens": [
74
+ {
75
+ "title": "MessagePair",
76
+ "group": "elements-thread",
77
+ "components": [
78
+ "MessagePair"
79
+ ],
80
+ "code": "<Specimens>\n <Specimen label=\"bubble · streaming\" wide>\n <MessagePair\n userMessage=\"Plot's in. Front truss, universe 3.\"\n words={SPOKEN}\n visibleWords={5}\n streaming\n />\n </Specimen>\n <Specimen label=\"flat · settled\" wide>\n <MessagePair\n userMessage=\"Plot's in. Front truss, universe 3.\"\n words={SPOKEN}\n visibleWords={SPOKEN.length}\n streaming={false}\n variant=\"flat\"\n />\n </Specimen>\n</Specimens>",
81
+ "note": "A whole turn in one element: what was asked, and the answer streaming under it with its actions waiting on hover. The two variants are the two house styles for a user turn — a bubble, or right-aligned text with no chrome at all.",
82
+ "interaction": "the action row is invisible until the turn is hovered *or* focused, which is what keeps a keyboard from losing it. Both buttons are named."
83
+ }
84
+ ],
85
+ "todo": true
86
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "MessageQueue",
3
+ "slug": "message-queue",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Turns you typed while a run was in flight, stacked and cancelable until it finishes.",
11
+ "props": [
12
+ {
13
+ "name": "running",
14
+ "type": "string",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "The turn currently in flight, shown above the queue."
18
+ },
19
+ {
20
+ "name": "queued",
21
+ "type": "readonly QueuedMessage[]",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Turns waiting to send, in the order they will drain once the run finishes."
25
+ },
26
+ {
27
+ "name": "onCancel",
28
+ "type": "((id: string) => void)",
29
+ "required": false,
30
+ "defaultValue": null,
31
+ "description": "Called when a queued turn is removed before it ever sends."
32
+ }
33
+ ],
34
+ "typeReferences": [
35
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"running\" | \"queued\" | \"onCancel\"\n> & {\n /** The turn currently in flight, shown above the queue. */\n running: string;\n /** Turns waiting to send, in the order they will drain once the run finishes. */\n queued: readonly QueuedMessage[];\n /** Called when a queued turn is removed before it ever sends. */\n onCancel?: (id: string) => void;\n}"
36
+ ],
37
+ "subcomponents": [],
38
+ "parts": [],
39
+ "variants": {},
40
+ "defaultVariants": {},
41
+ "tokensUsed": [
42
+ "--cue-fg",
43
+ "--cue-fg-muted",
44
+ "--cue-fg-subtle",
45
+ "--cue-radius-overlay",
46
+ "--cue-stream",
47
+ "--cue-text-body"
48
+ ],
49
+ "summary": "Turns you typed while a run was in flight, stacked and cancelable until it finishes.",
50
+ "examples": [
51
+ {
52
+ "title": "Usage",
53
+ "code": "import { MessageQueue } from \"@cueplusplus/ui/elements\";\n\n<MessageQueue\n running=\"Fix the converter and add a guard\"\n queued={[{ id: \"a\", text: \"Also add a changeset\" }]}\n onCancel={(id) => drop(id)}\n/>",
54
+ "language": "tsx"
55
+ }
56
+ ],
57
+ "status": "todo-docs",
58
+ "url": "/docs/components/message-queue",
59
+ "mdUrl": "/docs/components/message-queue.md",
60
+ "jsonUrl": "/r/components/message-queue.json",
61
+ "specimens": [
62
+ {
63
+ "title": "MessageQueue",
64
+ "group": "elements-thread",
65
+ "components": [
66
+ "MessageQueue"
67
+ ],
68
+ "code": "<Specimens>\n <Specimen label=\"one running, two queued\" wide>\n <MessageQueue\n running=\"Patching universe 3\"\n queued={queue}\n onCancel={(id) => setQueue((current) => current.filter((item) => item.id !== id))}\n />\n </Specimen>\n <Specimen label=\"nothing queued\" wide>\n <MessageQueue running=\"Patching universe 3\" queued={[]} />\n </Specimen>\n</Specimens>",
69
+ "note": "What you typed while the last run was still out. The turn in flight pings at the top; everything behind it is numbered, cancellable and explicitly told when it will go. A queue that did not say 'sends when this finishes' would look like a list of failures.",
70
+ "interaction": "each row's × is a named button — the message text is in the label, so five rows do not all read as 'Remove'."
71
+ }
72
+ ],
73
+ "todo": true
74
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "MessageTiming",
3
+ "slug": "message-timing",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "What the turn cost: time to first token, throughput, tokens, money.",
9
+ "props": [
10
+ {
11
+ "name": "stats",
12
+ "type": "readonly TimingStat[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "Label and value pairs, pre-formatted. Show fewer while streaming and the full set\nonce the turn settles."
16
+ },
17
+ {
18
+ "name": "streaming",
19
+ "type": "boolean",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Tints the values blue while they are still moving."
23
+ }
24
+ ],
25
+ "typeReferences": [
26
+ "Omit<ComponentProps<\"div\">, \"children\" | \"stats\" | \"streaming\"> & {\n /**\n * Label and value pairs, pre-formatted. Show fewer while streaming and the full set\n * once the turn settles.\n */\n stats: readonly TimingStat[];\n /** Tints the values blue while they are still moving. */\n streaming?: boolean;\n}"
27
+ ],
28
+ "subcomponents": [],
29
+ "parts": [],
30
+ "variants": {},
31
+ "defaultVariants": {},
32
+ "tokensUsed": [
33
+ "--cue-fg-muted",
34
+ "--cue-fg-subtle",
35
+ "--cue-stream"
36
+ ],
37
+ "summary": "What the turn cost: time to first token, throughput, tokens, money.",
38
+ "examples": [
39
+ {
40
+ "title": "Usage",
41
+ "code": "import { MessageTiming } from \"@cueplusplus/ui/elements\";\n\n<MessageTiming\n stats={[\n { label: \"ttft\", value: \"0.4s\" },\n { label: \"total\", value: \"2.6s\" },\n ]}\n/>",
42
+ "language": "tsx"
43
+ }
44
+ ],
45
+ "status": "todo-docs",
46
+ "url": "/docs/components/message-timing",
47
+ "mdUrl": "/docs/components/message-timing.md",
48
+ "jsonUrl": "/r/components/message-timing.json",
49
+ "specimens": [
50
+ {
51
+ "title": "MessageTiming",
52
+ "group": "elements-thread",
53
+ "components": [
54
+ "MessageTiming"
55
+ ],
56
+ "code": "<Specimens>\n <Specimen label=\"streaming\" wide>\n <MessageTiming stats={TIMING.slice(0, 2)} streaming />\n </Specimen>\n <Specimen label=\"settled\" wide>\n <MessageTiming stats={TIMING} />\n </Specimen>\n</Specimens>",
57
+ "note": "What the turn cost, in the footer where a reader can ignore it. The values are strings the caller already formatted; while the turn is still streaming they sit in the live hue and settle into ink when it lands, so the row doubles as a state.",
58
+ "interaction": "none. It is four label/value pairs in mono, tabular so the numbers do not jitter as they update."
59
+ }
60
+ ],
61
+ "todo": true
62
+ }
@@ -0,0 +1,126 @@
1
+ {
2
+ "name": "MobileComposer",
3
+ "slug": "mobile-composer",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "The bottom sheet: keyboard-aware, quick actions above, thumb-sized targets.",
11
+ "props": [
12
+ {
13
+ "name": "value",
14
+ "type": "string",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Current input. The field is 16px so iOS does not zoom on focus."
18
+ },
19
+ {
20
+ "name": "keyboardOpen",
21
+ "type": "boolean",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Collapses the quick actions and the home indicator inset when the keyboard is up."
25
+ },
26
+ {
27
+ "name": "running",
28
+ "type": "boolean",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Swaps send for stop, and suppresses Return-to-send while a run is in flight."
32
+ },
33
+ {
34
+ "name": "actions",
35
+ "type": "readonly string[]",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "Quick actions above the field, scrolled horizontally."
39
+ },
40
+ {
41
+ "name": "onAction",
42
+ "type": "((action: string) => void)",
43
+ "required": false,
44
+ "defaultValue": null,
45
+ "description": "Called when a quick action is tapped. Omit it and the chips render disabled, since\nactions is required and the row would otherwise be inert."
46
+ },
47
+ {
48
+ "name": "onAttach",
49
+ "type": "(() => void)",
50
+ "required": false,
51
+ "defaultValue": null,
52
+ "description": "Called from the attachment control. Omit it and the control renders disabled."
53
+ },
54
+ {
55
+ "name": "onValueChange",
56
+ "type": "((value: string) => void)",
57
+ "required": false,
58
+ "defaultValue": null,
59
+ "description": "Called as the message is typed."
60
+ },
61
+ {
62
+ "name": "onSend",
63
+ "type": "(() => void)",
64
+ "required": false,
65
+ "defaultValue": null,
66
+ "description": "Called to send."
67
+ },
68
+ {
69
+ "name": "onStop",
70
+ "type": "(() => void)",
71
+ "required": false,
72
+ "defaultValue": null,
73
+ "description": "Called to stop a run in flight."
74
+ },
75
+ {
76
+ "name": "onFocus",
77
+ "type": "(() => void)",
78
+ "required": false,
79
+ "defaultValue": null,
80
+ "description": "Called when the field takes focus; drive keyboardOpen from it."
81
+ }
82
+ ],
83
+ "typeReferences": [
84
+ "Omit<\n ComponentProps<\"div\">,\n | \"children\"\n | \"value\"\n | \"keyboardOpen\"\n | \"running\"\n | \"actions\"\n | \"onAction\"\n | \"onAttach\"\n | \"onValueChange\"\n | \"onSend\"\n | \"onStop\"\n | \"onFocus\"\n> & {\n /** Current input. The field is 16px so iOS does not zoom on focus. */\n value: string;\n /** Collapses the quick actions and the home indicator inset when the keyboard is up. */\n keyboardOpen: boolean;\n /** Swaps send for stop, and suppresses Return-to-send while a run is in flight. */\n running: boolean;\n /** Quick actions above the field, scrolled horizontally. */\n actions: readonly string[];\n /**\n * Called when a quick action is tapped. Omit it and the chips render disabled, since\n * actions is required and the row would otherwise be inert.\n */\n onAction?: (action: string) => void;\n /** Called from the attachment control. Omit it and the control renders disabled. */\n onAttach?: () => void;\n /** Called as the message is typed. */\n onValueChange?: (value: string) => void;\n /** Called to send. */\n onSend?: () => void;\n /** Called to stop a run in flight. */\n onStop?: () => void;\n /** Called when the field takes focus; drive keyboardOpen from it. */\n onFocus?: () => void;\n}"
85
+ ],
86
+ "subcomponents": [],
87
+ "parts": [],
88
+ "variants": {},
89
+ "defaultVariants": {},
90
+ "tokensUsed": [
91
+ "--cue-accent",
92
+ "--cue-bg",
93
+ "--cue-border",
94
+ "--cue-fg-muted",
95
+ "--cue-fg-subtle",
96
+ "--cue-radius-overlay",
97
+ "--cue-surface-3",
98
+ "--cue-text-emphasis",
99
+ "--cue-text-ui"
100
+ ],
101
+ "summary": "The bottom sheet: keyboard-aware, quick actions above, thumb-sized targets.",
102
+ "examples": [
103
+ {
104
+ "title": "Usage",
105
+ "code": "import { MobileComposer } from \"@cueplusplus/ui/elements\";\n\n<MobileComposer\n value={value}\n keyboardOpen={keyboardOpen}\n running={false}\n actions={actions}\n onValueChange={setValue}\n onSend={send}\n/>",
106
+ "language": "tsx"
107
+ }
108
+ ],
109
+ "status": "todo-docs",
110
+ "url": "/docs/components/mobile-composer",
111
+ "mdUrl": "/docs/components/mobile-composer.md",
112
+ "jsonUrl": "/r/components/mobile-composer.json",
113
+ "specimens": [
114
+ {
115
+ "title": "MobileComposer",
116
+ "group": "elements-composer",
117
+ "components": [
118
+ "MobileComposer"
119
+ ],
120
+ "code": "<Specimens>\n <Specimen label=\"keyboard down\" wide>\n <MobileComposer\n value={phone}\n keyboardOpen={false}\n running={false}\n actions={[\"Patch\", \"Plot\", \"Rig check\", \"Render pre-vis\"]}\n onAction={(action) => setPhone(action)}\n onAttach={() => undefined}\n onValueChange={setPhone}\n onSend={() => setPhone(\"\")}\n />\n </Specimen>\n <Specimen label=\"keyboard up\" wide>\n <MobileComposer\n value=\"six ESPRITEs on universe 3\"\n keyboardOpen\n running={false}\n actions={[\"Patch\", \"Plot\"]}\n onValueChange={() => undefined}\n onSend={() => undefined}\n />\n </Specimen>\n <Specimen label=\"running\" wide>\n <MobileComposer\n value=\"\"\n keyboardOpen\n running\n actions={[\"Patch\", \"Plot\"]}\n onStop={() => undefined}\n />\n </Specimen>\n</Specimens>",
121
+ "note": "The same composer on a phone: a bottom sheet with thumb-sized targets, quick actions scrolling above the field, and a 16px input so iOS does not zoom when it takes focus. `keyboardOpen` is the whole layout switch — the quick actions and the home-indicator inset both belong to the state where the keyboard is down.",
122
+ "interaction": "send becomes stop while a run is in flight, and Return stops sending — a second send during a stream is almost always a mistake, so the element refuses it rather than queueing it."
123
+ }
124
+ ],
125
+ "todo": true
126
+ }