@cueplusplus/ui 0.2.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/CHANGELOG.md +2250 -0
  2. package/dist/agent-runtime/_glyphs.js +43 -0
  3. package/dist/agent-runtime/branch-picker.d.ts +45 -0
  4. package/dist/agent-runtime/branch-picker.js +87 -0
  5. package/dist/agent-runtime/index.d.ts +4 -0
  6. package/dist/agent-runtime/index.js +4 -0
  7. package/dist/agent-runtime/tool-call-card.d.ts +69 -0
  8. package/dist/agent-runtime/tool-call-card.js +187 -0
  9. package/dist/agent-runtime/use-agent-thread.d.ts +164 -0
  10. package/dist/agent-runtime/use-agent-thread.js +251 -0
  11. package/dist/brand/_chassis.d.ts +1 -1
  12. package/dist/brand/cue-mark.d.ts +1 -1
  13. package/dist/brand/cue-mark.js +1 -1
  14. package/dist/chat/index.d.ts +2 -2
  15. package/dist/chat/message-list.d.ts +6 -0
  16. package/dist/chat/message-list.js +35 -0
  17. package/dist/chrome/_edge-scroller.js +12 -1
  18. package/dist/chrome/_tabs-scroll.d.ts +1 -1
  19. package/dist/chrome/_tabs-scroll.js +1 -1
  20. package/dist/chrome/app-shell.d.ts +52 -2
  21. package/dist/chrome/app-shell.js +80 -8
  22. package/dist/chrome/index.d.ts +2 -2
  23. package/dist/configurator/_export.js +3 -2
  24. package/dist/configurator/_overrides.d.ts +1 -1
  25. package/dist/configurator/_overrides.js +18 -6
  26. package/dist/configurator/token-editor.js +4 -1
  27. package/dist/date/_segments.js +37 -2
  28. package/dist/elements/activity-graph.d.ts +40 -0
  29. package/dist/elements/activity-graph.js +81 -0
  30. package/dist/elements/agent-card.d.ts +49 -0
  31. package/dist/elements/agent-card.js +91 -0
  32. package/dist/elements/agent-handoff.d.ts +24 -0
  33. package/dist/elements/agent-handoff.js +53 -0
  34. package/dist/elements/agent-mode-badge.d.ts +72 -0
  35. package/dist/elements/agent-mode-badge.js +110 -0
  36. package/dist/elements/agent-plan.d.ts +24 -0
  37. package/dist/elements/agent-plan.js +74 -0
  38. package/dist/elements/agent-status.d.ts +29 -0
  39. package/dist/elements/agent-status.js +46 -0
  40. package/dist/elements/agent-surface.d.ts +65 -0
  41. package/dist/elements/agent-surface.js +68 -0
  42. package/dist/elements/animated-number.d.ts +86 -0
  43. package/dist/elements/animated-number.js +118 -0
  44. package/dist/elements/approval-card.d.ts +40 -0
  45. package/dist/elements/approval-card.js +78 -0
  46. package/dist/elements/artifact-card.d.ts +30 -0
  47. package/dist/elements/artifact-card.js +58 -0
  48. package/dist/elements/background-inbox.d.ts +39 -0
  49. package/dist/elements/background-inbox.js +60 -0
  50. package/dist/elements/canvas-split.d.ts +77 -0
  51. package/dist/elements/canvas-split.js +138 -0
  52. package/dist/elements/chart.d.ts +41 -0
  53. package/dist/elements/chart.js +117 -0
  54. package/dist/elements/chat-panel.d.ts +46 -0
  55. package/dist/elements/chat-panel.js +104 -0
  56. package/dist/elements/checkpoint-history.d.ts +31 -0
  57. package/dist/elements/checkpoint-history.js +65 -0
  58. package/dist/elements/clamp.d.ts +90 -0
  59. package/dist/elements/clamp.js +109 -0
  60. package/dist/elements/code-diff.d.ts +42 -0
  61. package/dist/elements/code-diff.js +69 -0
  62. package/dist/elements/code-runner.d.ts +38 -0
  63. package/dist/elements/code-runner.js +84 -0
  64. package/dist/elements/command-palette.d.ts +48 -0
  65. package/dist/elements/command-palette.js +129 -0
  66. package/dist/elements/compaction-row.d.ts +63 -0
  67. package/dist/elements/compaction-row.js +110 -0
  68. package/dist/elements/comparison-card.d.ts +47 -0
  69. package/dist/elements/comparison-card.js +69 -0
  70. package/dist/elements/composer.d.ts +274 -0
  71. package/dist/elements/composer.js +505 -0
  72. package/dist/elements/computer-use.d.ts +40 -0
  73. package/dist/elements/computer-use.js +92 -0
  74. package/dist/elements/confidence-marker.d.ts +39 -0
  75. package/dist/elements/confidence-marker.js +64 -0
  76. package/dist/elements/connection-state.d.ts +29 -0
  77. package/dist/elements/connection-state.js +66 -0
  78. package/dist/elements/context-breakdown.d.ts +30 -0
  79. package/dist/elements/context-breakdown.js +86 -0
  80. package/dist/elements/context-usage.d.ts +99 -0
  81. package/dist/elements/context-usage.js +225 -0
  82. package/dist/elements/conversation-search.d.ts +48 -0
  83. package/dist/elements/conversation-search.js +88 -0
  84. package/dist/elements/cost-meter.d.ts +33 -0
  85. package/dist/elements/cost-meter.js +75 -0
  86. package/dist/elements/data-table.d.ts +31 -0
  87. package/dist/elements/data-table.js +67 -0
  88. package/dist/elements/day-separator.d.ts +34 -0
  89. package/dist/elements/day-separator.js +50 -0
  90. package/dist/elements/diagram.d.ts +34 -0
  91. package/dist/elements/diagram.js +75 -0
  92. package/dist/elements/document-reference.d.ts +37 -0
  93. package/dist/elements/document-reference.js +66 -0
  94. package/dist/elements/draft-restore.d.ts +27 -0
  95. package/dist/elements/draft-restore.js +54 -0
  96. package/dist/elements/edit-message.d.ts +36 -0
  97. package/dist/elements/edit-message.js +77 -0
  98. package/dist/elements/elements.css +459 -0
  99. package/dist/elements/elicitation-form.d.ts +48 -0
  100. package/dist/elements/elicitation-form.js +106 -0
  101. package/dist/elements/empty-state.d.ts +52 -0
  102. package/dist/elements/empty-state.js +98 -0
  103. package/dist/elements/end-of-turn-summary.d.ts +60 -0
  104. package/dist/elements/end-of-turn-summary.js +75 -0
  105. package/dist/elements/error-state.d.ts +29 -0
  106. package/dist/elements/error-state.js +55 -0
  107. package/dist/elements/feedback-dialog.d.ts +36 -0
  108. package/dist/elements/feedback-dialog.js +81 -0
  109. package/dist/elements/file-tree.d.ts +45 -0
  110. package/dist/elements/file-tree.js +84 -0
  111. package/dist/elements/flow-graph.d.ts +45 -0
  112. package/dist/elements/flow-graph.js +78 -0
  113. package/dist/elements/generative/chart.js +200 -0
  114. package/dist/elements/generative/faults.js +111 -0
  115. package/dist/elements/generative/icons.d.ts +41 -0
  116. package/dist/elements/generative/icons.js +190 -0
  117. package/dist/elements/generative/intrinsics.js +483 -0
  118. package/dist/elements/generative/spec.d.ts +110 -0
  119. package/dist/elements/generative/spec.js +366 -0
  120. package/dist/elements/generative.css +1145 -0
  121. package/dist/elements/generative.d.ts +144 -0
  122. package/dist/elements/generative.js +126 -0
  123. package/dist/elements/guardrail-notice.d.ts +29 -0
  124. package/dist/elements/guardrail-notice.js +63 -0
  125. package/dist/elements/image-generation.d.ts +18 -0
  126. package/dist/elements/image-generation.js +64 -0
  127. package/dist/elements/index.d.ts +116 -0
  128. package/dist/elements/index.js +115 -0
  129. package/dist/elements/inline-citation.d.ts +43 -0
  130. package/dist/elements/inline-citation.js +93 -0
  131. package/dist/elements/job-progress.d.ts +49 -0
  132. package/dist/elements/job-progress.js +74 -0
  133. package/dist/elements/launcher-bubble.d.ts +34 -0
  134. package/dist/elements/launcher-bubble.js +72 -0
  135. package/dist/elements/live-region-announcer.d.ts +130 -0
  136. package/dist/elements/live-region-announcer.js +230 -0
  137. package/dist/elements/loading-state.d.ts +27 -0
  138. package/dist/elements/loading-state.js +36 -0
  139. package/dist/elements/map-answer.d.ts +38 -0
  140. package/dist/elements/map-answer.js +93 -0
  141. package/dist/elements/markdown.d.ts +131 -0
  142. package/dist/elements/markdown.js +528 -0
  143. package/dist/elements/math-block.d.ts +51 -0
  144. package/dist/elements/math-block.js +70 -0
  145. package/dist/elements/mcp-server-panel.d.ts +41 -0
  146. package/dist/elements/mcp-server-panel.js +115 -0
  147. package/dist/elements/memory-chips.d.ts +30 -0
  148. package/dist/elements/memory-chips.js +43 -0
  149. package/dist/elements/message-actions.d.ts +38 -0
  150. package/dist/elements/message-actions.js +71 -0
  151. package/dist/elements/message-attachment.d.ts +48 -0
  152. package/dist/elements/message-attachment.js +63 -0
  153. package/dist/elements/message-branches.d.ts +25 -0
  154. package/dist/elements/message-branches.js +65 -0
  155. package/dist/elements/message-pair.d.ts +33 -0
  156. package/dist/elements/message-pair.js +65 -0
  157. package/dist/elements/message-queue.d.ts +31 -0
  158. package/dist/elements/message-queue.js +80 -0
  159. package/dist/elements/message-timing.d.ts +33 -0
  160. package/dist/elements/message-timing.js +37 -0
  161. package/dist/elements/mobile-composer.d.ts +44 -0
  162. package/dist/elements/mobile-composer.js +88 -0
  163. package/dist/elements/model-picker.d.ts +38 -0
  164. package/dist/elements/model-picker.js +69 -0
  165. package/dist/elements/number-ticker.d.ts +18 -0
  166. package/dist/elements/number-ticker.js +47 -0
  167. package/dist/elements/onboarding.d.ts +30 -0
  168. package/dist/elements/onboarding.js +75 -0
  169. package/dist/elements/permission-grant.d.ts +35 -0
  170. package/dist/elements/permission-grant.js +86 -0
  171. package/dist/elements/permission-scopes.d.ts +215 -0
  172. package/dist/elements/permission-scopes.js +249 -0
  173. package/dist/elements/prompt-library.d.ts +43 -0
  174. package/dist/elements/prompt-library.js +117 -0
  175. package/dist/elements/queue-dock.d.ts +101 -0
  176. package/dist/elements/queue-dock.js +132 -0
  177. package/dist/elements/quota-banner.d.ts +26 -0
  178. package/dist/elements/quota-banner.js +66 -0
  179. package/dist/elements/quote-reply.d.ts +44 -0
  180. package/dist/elements/quote-reply.js +79 -0
  181. package/dist/elements/range.d.ts +29 -0
  182. package/dist/elements/range.js +45 -0
  183. package/dist/elements/read-aloud.d.ts +45 -0
  184. package/dist/elements/read-aloud.js +75 -0
  185. package/dist/elements/reasoning-effort.d.ts +36 -0
  186. package/dist/elements/reasoning-effort.js +67 -0
  187. package/dist/elements/reasoning-panel.d.ts +46 -0
  188. package/dist/elements/reasoning-panel.js +75 -0
  189. package/dist/elements/recommendation-card.d.ts +45 -0
  190. package/dist/elements/recommendation-card.js +83 -0
  191. package/dist/elements/regenerate-menu.d.ts +45 -0
  192. package/dist/elements/regenerate-menu.js +51 -0
  193. package/dist/elements/replay.d.ts +217 -0
  194. package/dist/elements/replay.js +498 -0
  195. package/dist/elements/research-report.d.ts +38 -0
  196. package/dist/elements/research-report.js +69 -0
  197. package/dist/elements/retrieval-chunks.d.ts +43 -0
  198. package/dist/elements/retrieval-chunks.js +81 -0
  199. package/dist/elements/revert-dock.d.ts +159 -0
  200. package/dist/elements/revert-dock.js +327 -0
  201. package/dist/elements/reviewable-diff.d.ts +45 -0
  202. package/dist/elements/reviewable-diff.js +110 -0
  203. package/dist/elements/risk-badge.d.ts +52 -0
  204. package/dist/elements/risk-badge.js +91 -0
  205. package/dist/elements/schedule-card.d.ts +42 -0
  206. package/dist/elements/schedule-card.js +90 -0
  207. package/dist/elements/score-breakdown.d.ts +47 -0
  208. package/dist/elements/score-breakdown.js +82 -0
  209. package/dist/elements/scroll-anchor.d.ts +32 -0
  210. package/dist/elements/scroll-anchor.js +121 -0
  211. package/dist/elements/settings-panel.d.ts +52 -0
  212. package/dist/elements/settings-panel.js +107 -0
  213. package/dist/elements/shared-conversation.d.ts +39 -0
  214. package/dist/elements/shared-conversation.js +68 -0
  215. package/dist/elements/sources.d.ts +33 -0
  216. package/dist/elements/sources.js +61 -0
  217. package/dist/elements/speaker-identity.d.ts +32 -0
  218. package/dist/elements/speaker-identity.js +51 -0
  219. package/dist/elements/spec-sheet.d.ts +31 -0
  220. package/dist/elements/spec-sheet.js +45 -0
  221. package/dist/elements/stopped-run.d.ts +22 -0
  222. package/dist/elements/stopped-run.js +50 -0
  223. package/dist/elements/streaming-text.d.ts +31 -0
  224. package/dist/elements/streaming-text.js +45 -0
  225. package/dist/elements/subagent-list.d.ts +37 -0
  226. package/dist/elements/subagent-list.js +79 -0
  227. package/dist/elements/suggestions.d.ts +30 -0
  228. package/dist/elements/suggestions.js +36 -0
  229. package/dist/elements/surfaces.d.ts +85 -0
  230. package/dist/elements/surfaces.js +107 -0
  231. package/dist/elements/tail-status.d.ts +131 -0
  232. package/dist/elements/tail-status.js +94 -0
  233. package/dist/elements/terminal-block.d.ts +29 -0
  234. package/dist/elements/terminal-block.js +54 -0
  235. package/dist/elements/thinking-indicator.d.ts +18 -0
  236. package/dist/elements/thinking-indicator.js +36 -0
  237. package/dist/elements/thread-list.d.ts +35 -0
  238. package/dist/elements/thread-list.js +68 -0
  239. package/dist/elements/thread-search.d.ts +42 -0
  240. package/dist/elements/thread-search.js +99 -0
  241. package/dist/elements/timeline.d.ts +37 -0
  242. package/dist/elements/timeline.js +46 -0
  243. package/dist/elements/todo-list.d.ts +42 -0
  244. package/dist/elements/todo-list.js +59 -0
  245. package/dist/elements/tool-call.d.ts +41 -0
  246. package/dist/elements/tool-call.js +85 -0
  247. package/dist/elements/tool-error.d.ts +39 -0
  248. package/dist/elements/tool-error.js +76 -0
  249. package/dist/elements/tool-group.d.ts +45 -0
  250. package/dist/elements/tool-group.js +71 -0
  251. package/dist/elements/tool-timeline.d.ts +65 -0
  252. package/dist/elements/tool-timeline.js +88 -0
  253. package/dist/elements/trace-waterfall.d.ts +37 -0
  254. package/dist/elements/trace-waterfall.js +69 -0
  255. package/dist/elements/transcript-rules.d.ts +67 -0
  256. package/dist/elements/transcript-rules.js +95 -0
  257. package/dist/elements/turn-footer.d.ts +74 -0
  258. package/dist/elements/turn-footer.js +101 -0
  259. package/dist/elements/typing-indicator.d.ts +16 -0
  260. package/dist/elements/typing-indicator.js +51 -0
  261. package/dist/elements/verdict-row.d.ts +89 -0
  262. package/dist/elements/verdict-row.js +150 -0
  263. package/dist/elements/vocabulary.d.ts +612 -0
  264. package/dist/elements/vocabulary.js +611 -0
  265. package/dist/elements/voice-conversation.d.ts +49 -0
  266. package/dist/elements/voice-conversation.js +123 -0
  267. package/dist/elements/web-preview.d.ts +32 -0
  268. package/dist/elements/web-preview.js +66 -0
  269. package/dist/elements/web-search.d.ts +37 -0
  270. package/dist/elements/web-search.js +66 -0
  271. package/dist/elements/work-collapse.d.ts +103 -0
  272. package/dist/elements/work-collapse.js +131 -0
  273. package/dist/icons/containers.d.ts +89 -0
  274. package/dist/icons/containers.js +295 -0
  275. package/dist/icons/index.d.ts +2 -0
  276. package/dist/index.d.ts +9 -7
  277. package/dist/index.js +3 -2
  278. package/dist/instruments/index.d.ts +2 -2
  279. package/dist/instruments/index.js +2 -2
  280. package/dist/instruments/table.d.ts +14 -1
  281. package/dist/instruments/table.js +20 -1
  282. package/dist/instruments/two-step-button.js +25 -6
  283. package/dist/layout/sidebar.d.ts +19 -1
  284. package/dist/layout/sidebar.js +19 -1
  285. package/dist/primitives/button.js +11 -1
  286. package/dist/primitives/chip.d.ts +34 -8
  287. package/dist/primitives/chip.js +97 -11
  288. package/dist/styles.css +11 -1
  289. package/dist/system/agent-skin.d.ts +27 -0
  290. package/dist/system/agent-skin.js +20 -0
  291. package/dist/system/index.d.ts +3 -3
  292. package/dist/system/portal.d.ts +5 -3
  293. package/dist/system/portal.js +36 -8
  294. package/dist/system/prepaint.d.ts +20 -2
  295. package/dist/system/prepaint.js +39 -33
  296. package/dist/system/theme-provider.d.ts +13 -2
  297. package/dist/system/theme-provider.js +107 -26
  298. package/dist/system/use-density.d.ts +9 -0
  299. package/dist/system/use-density.js +9 -0
  300. package/dist/system/use-isomorphic-layout-effect.js +19 -1
  301. package/dist/theming/_presets.d.ts +1 -1
  302. package/dist/theming/_presets.js +124 -8
  303. package/dist/theming/contrast.d.ts +16 -4
  304. package/dist/theming/contrast.js +33 -6
  305. package/dist/theming/create-theme.d.ts +8 -4
  306. package/dist/theming/create-theme.js +56 -20
  307. package/dist/theming/serialize.d.ts +11 -2
  308. package/dist/theming/serialize.js +87 -9
  309. package/manifest/components/accordion.json +154 -0
  310. package/manifest/components/activity-graph.json +88 -0
  311. package/manifest/components/agent-card.json +120 -0
  312. package/manifest/components/agent-handoff.json +87 -0
  313. package/manifest/components/agent-mode-badge.json +84 -0
  314. package/manifest/components/agent-pile.json +116 -0
  315. package/manifest/components/agent-plan.json +67 -0
  316. package/manifest/components/agent-status.json +73 -0
  317. package/manifest/components/agent-surface.json +78 -0
  318. package/manifest/components/alert-dialog.json +190 -0
  319. package/manifest/components/animated-number.json +67 -0
  320. package/manifest/components/app-bar.json +244 -0
  321. package/manifest/components/app-shell.json +383 -0
  322. package/manifest/components/app-window-frame.json +102 -0
  323. package/manifest/components/approval-card.json +106 -0
  324. package/manifest/components/artifact-card.json +81 -0
  325. package/manifest/components/ask-box.json +209 -0
  326. package/manifest/components/audience-icon.json +52 -0
  327. package/manifest/components/autocomplete.json +197 -0
  328. package/manifest/components/avatar-group.json +72 -0
  329. package/manifest/components/avatar.json +95 -0
  330. package/manifest/components/background-inbox.json +71 -0
  331. package/manifest/components/branch-picker.json +124 -0
  332. package/manifest/components/breadcrumb.json +74 -0
  333. package/manifest/components/button-group.json +74 -0
  334. package/manifest/components/button.json +126 -0
  335. package/manifest/components/calendar.json +65 -0
  336. package/manifest/components/canvas-split-body.json +62 -0
  337. package/manifest/components/canvas-split-document.json +54 -0
  338. package/manifest/components/canvas-split-header.json +83 -0
  339. package/manifest/components/canvas-split-line.json +62 -0
  340. package/manifest/components/canvas-split-message.json +62 -0
  341. package/manifest/components/canvas-split-thread.json +54 -0
  342. package/manifest/components/canvas-split.json +60 -0
  343. package/manifest/components/card.json +140 -0
  344. package/manifest/components/carousel.json +200 -0
  345. package/manifest/components/catalogue-icon.json +52 -0
  346. package/manifest/components/channel-beta-icon.json +52 -0
  347. package/manifest/components/channel-matrix.json +173 -0
  348. package/manifest/components/channel-released-icon.json +52 -0
  349. package/manifest/components/chart-container.json +111 -0
  350. package/manifest/components/chart-ramp.json +72 -0
  351. package/manifest/components/chart-swatch.json +65 -0
  352. package/manifest/components/chart-tooltip-content.json +114 -0
  353. package/manifest/components/chart.json +93 -0
  354. package/manifest/components/chat-empty-state.json +55 -0
  355. package/manifest/components/chat-panel-assistant-message.json +51 -0
  356. package/manifest/components/chat-panel-composer.json +66 -0
  357. package/manifest/components/chat-panel-messages.json +51 -0
  358. package/manifest/components/chat-panel-typing.json +51 -0
  359. package/manifest/components/chat-panel-user-message.json +51 -0
  360. package/manifest/components/chat-panel.json +57 -0
  361. package/manifest/components/checkbox-group.json +68 -0
  362. package/manifest/components/checkbox.json +93 -0
  363. package/manifest/components/checkpoint-history.json +80 -0
  364. package/manifest/components/chip.json +144 -0
  365. package/manifest/components/clamp.json +102 -0
  366. package/manifest/components/cli-tool-icon.json +52 -0
  367. package/manifest/components/code-diff.json +87 -0
  368. package/manifest/components/code-runner.json +97 -0
  369. package/manifest/components/collapsible.json +120 -0
  370. package/manifest/components/color-area.json +59 -0
  371. package/manifest/components/color-field.json +79 -0
  372. package/manifest/components/color-picker.json +175 -0
  373. package/manifest/components/color-slider.json +75 -0
  374. package/manifest/components/color-swatch.json +68 -0
  375. package/manifest/components/colors-section.json +66 -0
  376. package/manifest/components/combobox.json +198 -0
  377. package/manifest/components/command-palette.json +177 -0
  378. package/manifest/components/compaction-row.json +100 -0
  379. package/manifest/components/comparison-card.json +83 -0
  380. package/manifest/components/composer-actions.json +65 -0
  381. package/manifest/components/composer-attach-button.json +65 -0
  382. package/manifest/components/composer-attachment-chip.json +75 -0
  383. package/manifest/components/composer-attachments.json +60 -0
  384. package/manifest/components/composer-bar.json +73 -0
  385. package/manifest/components/composer-command-item.json +79 -0
  386. package/manifest/components/composer-context.json +67 -0
  387. package/manifest/components/composer-input.json +73 -0
  388. package/manifest/components/composer-menu-item.json +72 -0
  389. package/manifest/components/composer-menu.json +79 -0
  390. package/manifest/components/composer-model-item.json +75 -0
  391. package/manifest/components/composer-model-trigger.json +75 -0
  392. package/manifest/components/composer-person-item.json +79 -0
  393. package/manifest/components/composer-send.json +80 -0
  394. package/manifest/components/composer-toolbar.json +65 -0
  395. package/manifest/components/composer-voice-button.json +68 -0
  396. package/manifest/components/composer-voice.json +75 -0
  397. package/manifest/components/composer.json +176 -0
  398. package/manifest/components/computer-use.json +84 -0
  399. package/manifest/components/confidence-marker.json +74 -0
  400. package/manifest/components/connection-state.json +84 -0
  401. package/manifest/components/container.json +60 -0
  402. package/manifest/components/context-breakdown.json +65 -0
  403. package/manifest/components/context-menu.json +121 -0
  404. package/manifest/components/context-usage.json +85 -0
  405. package/manifest/components/conversation-search.json +92 -0
  406. package/manifest/components/copy-button.json +93 -0
  407. package/manifest/components/cost-meter.json +74 -0
  408. package/manifest/components/cue-logotype.json +96 -0
  409. package/manifest/components/cue-mark.json +97 -0
  410. package/manifest/components/cue-portal-frame.json +55 -0
  411. package/manifest/components/data-table-pagination.json +83 -0
  412. package/manifest/components/data-table-toolbar.json +104 -0
  413. package/manifest/components/date-field.json +80 -0
  414. package/manifest/components/date-picker.json +191 -0
  415. package/manifest/components/date-range-picker.json +191 -0
  416. package/manifest/components/day-separator.json +58 -0
  417. package/manifest/components/delegation-card.json +144 -0
  418. package/manifest/components/density.json +58 -0
  419. package/manifest/components/description-list.json +84 -0
  420. package/manifest/components/diagram.json +100 -0
  421. package/manifest/components/dialog.json +198 -0
  422. package/manifest/components/disclosure.json +109 -0
  423. package/manifest/components/dmx-bar.json +94 -0
  424. package/manifest/components/dmx-strip.json +101 -0
  425. package/manifest/components/document-reference.json +90 -0
  426. package/manifest/components/draft-restore.json +82 -0
  427. package/manifest/components/drawer.json +179 -0
  428. package/manifest/components/dropdown-menu.json +229 -0
  429. package/manifest/components/edit-message.json +105 -0
  430. package/manifest/components/elements-command-palette.json +100 -0
  431. package/manifest/components/elements-composer.json +71 -0
  432. package/manifest/components/elements-data-table.json +68 -0
  433. package/manifest/components/elements-timeline.json +69 -0
  434. package/manifest/components/elicitation-form.json +103 -0
  435. package/manifest/components/empty-state-composer.json +64 -0
  436. package/manifest/components/empty-state-greeting.json +49 -0
  437. package/manifest/components/empty-state-suggestion.json +57 -0
  438. package/manifest/components/empty-state-suggestions.json +49 -0
  439. package/manifest/components/empty-state.json +90 -0
  440. package/manifest/components/end-of-turn-summary.json +77 -0
  441. package/manifest/components/env-var-input.json +150 -0
  442. package/manifest/components/error-state.json +80 -0
  443. package/manifest/components/export-dialog.json +84 -0
  444. package/manifest/components/eyebrow.json +56 -0
  445. package/manifest/components/feedback-dialog.json +107 -0
  446. package/manifest/components/field-description.json +63 -0
  447. package/manifest/components/field-error.json +77 -0
  448. package/manifest/components/field-label.json +63 -0
  449. package/manifest/components/field.json +79 -0
  450. package/manifest/components/file-tree.json +83 -0
  451. package/manifest/components/file-upload.json +159 -0
  452. package/manifest/components/flow-background.json +50 -0
  453. package/manifest/components/flow-controls.json +50 -0
  454. package/manifest/components/flow-graph.json +75 -0
  455. package/manifest/components/folder-icon.json +52 -0
  456. package/manifest/components/footer.json +112 -0
  457. package/manifest/components/frac.json +59 -0
  458. package/manifest/components/generation-loader.json +64 -0
  459. package/manifest/components/generative-ui.json +93 -0
  460. package/manifest/components/grid.json +81 -0
  461. package/manifest/components/group-bar.json +102 -0
  462. package/manifest/components/guardrail-notice.json +91 -0
  463. package/manifest/components/hover-card.json +151 -0
  464. package/manifest/components/icon-button.json +88 -0
  465. package/manifest/components/image-generation.json +67 -0
  466. package/manifest/components/info-tip.json +98 -0
  467. package/manifest/components/inline-citation.json +77 -0
  468. package/manifest/components/input-group.json +91 -0
  469. package/manifest/components/input.json +89 -0
  470. package/manifest/components/item.json +129 -0
  471. package/manifest/components/job-progress.json +96 -0
  472. package/manifest/components/kbd.json +52 -0
  473. package/manifest/components/launcher-bubble.json +105 -0
  474. package/manifest/components/link.json +81 -0
  475. package/manifest/components/live-region-announcer.json +79 -0
  476. package/manifest/components/log-viewer.json +139 -0
  477. package/manifest/components/map-answer.json +83 -0
  478. package/manifest/components/markdown-text.json +94 -0
  479. package/manifest/components/math-block.json +74 -0
  480. package/manifest/components/mcp-server-icon.json +52 -0
  481. package/manifest/components/mcp-server-panel.json +87 -0
  482. package/manifest/components/memory-chips.json +65 -0
  483. package/manifest/components/menubar.json +157 -0
  484. package/manifest/components/message-actions.json +99 -0
  485. package/manifest/components/message-attachments.json +63 -0
  486. package/manifest/components/message-branches.json +71 -0
  487. package/manifest/components/message-list.json +100 -0
  488. package/manifest/components/message-pair.json +86 -0
  489. package/manifest/components/message-queue.json +74 -0
  490. package/manifest/components/message-timing.json +62 -0
  491. package/manifest/components/message.json +116 -0
  492. package/manifest/components/meter.json +114 -0
  493. package/manifest/components/mobile-composer.json +126 -0
  494. package/manifest/components/model-picker.json +76 -0
  495. package/manifest/components/multi-select.json +190 -0
  496. package/manifest/components/musical-time-input.json +113 -0
  497. package/manifest/components/navigation-menu.json +226 -0
  498. package/manifest/components/node-card.json +109 -0
  499. package/manifest/components/node-handle.json +69 -0
  500. package/manifest/components/number-field.json +107 -0
  501. package/manifest/components/number-ticker.json +61 -0
  502. package/manifest/components/onboarding.json +84 -0
  503. package/manifest/components/otp-field.json +128 -0
  504. package/manifest/components/page-shell.json +96 -0
  505. package/manifest/components/pagination.json +92 -0
  506. package/manifest/components/panel-header.json +77 -0
  507. package/manifest/components/panel.json +71 -0
  508. package/manifest/components/password-input.json +119 -0
  509. package/manifest/components/permission-grant.json +92 -0
  510. package/manifest/components/permission-scopes.json +139 -0
  511. package/manifest/components/piano-keyboard.json +120 -0
  512. package/manifest/components/plussie.json +111 -0
  513. package/manifest/components/popover.json +193 -0
  514. package/manifest/components/preset-section.json +73 -0
  515. package/manifest/components/progress.json +95 -0
  516. package/manifest/components/prompt-library.json +99 -0
  517. package/manifest/components/queue-dock.json +110 -0
  518. package/manifest/components/quota-banner.json +94 -0
  519. package/manifest/components/quote-reply.json +105 -0
  520. package/manifest/components/radio-group.json +73 -0
  521. package/manifest/components/radio.json +80 -0
  522. package/manifest/components/rating.json +141 -0
  523. package/manifest/components/read-aloud.json +111 -0
  524. package/manifest/components/reasoning-effort.json +81 -0
  525. package/manifest/components/reasoning-panel.json +108 -0
  526. package/manifest/components/recommendation-card.json +107 -0
  527. package/manifest/components/regenerate-menu.json +89 -0
  528. package/manifest/components/replay-player.json +102 -0
  529. package/manifest/components/research-report.json +76 -0
  530. package/manifest/components/resizable.json +88 -0
  531. package/manifest/components/retrieval-chunks.json +84 -0
  532. package/manifest/components/revert-dock.json +150 -0
  533. package/manifest/components/reviewable-diff.json +93 -0
  534. package/manifest/components/risk-badge.json +74 -0
  535. package/manifest/components/row.json +109 -0
  536. package/manifest/components/schedule-card.json +101 -0
  537. package/manifest/components/score-breakdown.json +91 -0
  538. package/manifest/components/scroll-anchor.json +72 -0
  539. package/manifest/components/scroll-area.json +91 -0
  540. package/manifest/components/scrollable-tabs-list.json +83 -0
  541. package/manifest/components/scrub-input.json +200 -0
  542. package/manifest/components/seam-cell.json +75 -0
  543. package/manifest/components/seam-grid.json +75 -0
  544. package/manifest/components/seam-list.json +56 -0
  545. package/manifest/components/search-input.json +134 -0
  546. package/manifest/components/section-header.json +112 -0
  547. package/manifest/components/segmented-control.json +138 -0
  548. package/manifest/components/select.json +194 -0
  549. package/manifest/components/separator.json +53 -0
  550. package/manifest/components/settings-panel.json +118 -0
  551. package/manifest/components/shape-section.json +66 -0
  552. package/manifest/components/shared-conversation.json +89 -0
  553. package/manifest/components/sheet.json +186 -0
  554. package/manifest/components/shimmer-label.json +59 -0
  555. package/manifest/components/sidebar.json +198 -0
  556. package/manifest/components/signal-edge.json +56 -0
  557. package/manifest/components/skeleton.json +46 -0
  558. package/manifest/components/skill-icon.json +52 -0
  559. package/manifest/components/slider.json +89 -0
  560. package/manifest/components/sources.json +83 -0
  561. package/manifest/components/sparkline.json +76 -0
  562. package/manifest/components/speaker-identity.json +61 -0
  563. package/manifest/components/spec-sheet.json +80 -0
  564. package/manifest/components/spectrum-visualizer.json +115 -0
  565. package/manifest/components/spinner.json +61 -0
  566. package/manifest/components/stack-icon.json +52 -0
  567. package/manifest/components/stack.json +96 -0
  568. package/manifest/components/stacks-matrix-icon.json +52 -0
  569. package/manifest/components/stat.json +87 -0
  570. package/manifest/components/status-bar.json +58 -0
  571. package/manifest/components/status-dot.json +78 -0
  572. package/manifest/components/stepper.json +89 -0
  573. package/manifest/components/stopped-run.json +81 -0
  574. package/manifest/components/streaming-text.json +71 -0
  575. package/manifest/components/sub.json +44 -0
  576. package/manifest/components/subagent-list.json +88 -0
  577. package/manifest/components/suggestions.json +84 -0
  578. package/manifest/components/sup.json +44 -0
  579. package/manifest/components/swap-label.json +71 -0
  580. package/manifest/components/switch.json +87 -0
  581. package/manifest/components/table-scroll-region.json +69 -0
  582. package/manifest/components/table.json +155 -0
  583. package/manifest/components/tabs.json +145 -0
  584. package/manifest/components/tags-input.json +190 -0
  585. package/manifest/components/tail-status.json +109 -0
  586. package/manifest/components/terminal-block.json +91 -0
  587. package/manifest/components/terminal-frame.json +119 -0
  588. package/manifest/components/textarea.json +76 -0
  589. package/manifest/components/theme-configurator.json +124 -0
  590. package/manifest/components/theme-provider.json +134 -0
  591. package/manifest/components/thinking-indicator.json +63 -0
  592. package/manifest/components/thread-list.json +76 -0
  593. package/manifest/components/thread-search.json +90 -0
  594. package/manifest/components/threshold-rail.json +160 -0
  595. package/manifest/components/time-boundary.json +62 -0
  596. package/manifest/components/time-field.json +80 -0
  597. package/manifest/components/timeline-ruler.json +139 -0
  598. package/manifest/components/timeline.json +115 -0
  599. package/manifest/components/title-bar.json +82 -0
  600. package/manifest/components/toast.json +130 -0
  601. package/manifest/components/todo-list.json +69 -0
  602. package/manifest/components/toggle-group.json +106 -0
  603. package/manifest/components/toggle.json +109 -0
  604. package/manifest/components/token-editor.json +90 -0
  605. package/manifest/components/tool-call-card.json +200 -0
  606. package/manifest/components/tool-call.json +119 -0
  607. package/manifest/components/tool-error.json +114 -0
  608. package/manifest/components/tool-group.json +83 -0
  609. package/manifest/components/tool-timeline.json +119 -0
  610. package/manifest/components/toolbar.json +163 -0
  611. package/manifest/components/tooltip.json +164 -0
  612. package/manifest/components/trace-waterfall.json +74 -0
  613. package/manifest/components/tree-visibility-toggle.json +84 -0
  614. package/manifest/components/tree.json +140 -0
  615. package/manifest/components/turn-footer.json +105 -0
  616. package/manifest/components/two-step-button.json +113 -0
  617. package/manifest/components/typing-indicator.json +53 -0
  618. package/manifest/components/universe-grid.json +127 -0
  619. package/manifest/components/unread-divider.json +55 -0
  620. package/manifest/components/usage-chart.json +124 -0
  621. package/manifest/components/verdict-row.json +91 -0
  622. package/manifest/components/voice-conversation.json +109 -0
  623. package/manifest/components/web-preview.json +87 -0
  624. package/manifest/components/web-search.json +92 -0
  625. package/manifest/components/work-collapse.json +102 -0
  626. package/manifest/manifest.json +4779 -0
  627. package/manifest/tokens.json +159 -0
  628. package/package.json +54 -5
@@ -0,0 +1,48 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/command-palette.d.ts
3
+ interface PaletteCommand {
4
+ /** Stable identity, compared against activeId and reported by onRun. */
5
+ id: string;
6
+ /** Command text, and the field the query filters on. */
7
+ label: string;
8
+ /** Heading the command sits under. */
9
+ group: string;
10
+ /** Shortcut, one chip per key. */
11
+ keys: readonly string[];
12
+ }
13
+ /**
14
+ * Everything the app can do, one keystroke away and grouped by where it acts.
15
+ *
16
+ * @example
17
+ * import { CommandPalette } from "@cueplusplus/ui/elements";
18
+ *
19
+ * <CommandPalette
20
+ * commands={commands}
21
+ * query={query}
22
+ * activeId={activeId}
23
+ * onQueryChange={setQuery}
24
+ * onRun={run}
25
+ * />
26
+ */
27
+ declare function ElementsCommandPalette({ commands, query, activeId, onQueryChange, onActiveChange, onRun, className, ...props }: Omit<ComponentProps<"div">, "children" | "commands" | "query" | "activeId" | "onQueryChange" | "onActiveChange" | "onRun"> & {
28
+ /** Everything runnable. Groups are derived from the entries and keep first-seen order. */
29
+ commands: readonly PaletteCommand[];
30
+ /** Current filter text. */
31
+ query: string;
32
+ /**
33
+ * Which row is highlighted. Arrow keys move it and Enter runs it, both handled by
34
+ * the element; it reports the move through onActiveChange.
35
+ */
36
+ activeId: string;
37
+ /** Called as the filter is typed. */
38
+ onQueryChange?: (query: string) => void;
39
+ /**
40
+ * Called as the arrow keys walk the list. The element owns the key handling and
41
+ * reports where it landed, so activeId stays yours to hold.
42
+ */
43
+ onActiveChange?: (id: string) => void;
44
+ /** Called when a command is chosen. */
45
+ onRun?: (id: string) => void;
46
+ }): import("react").JSX.Element;
47
+ //#endregion
48
+ export { ElementsCommandPalette, PaletteCommand };
@@ -0,0 +1,129 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, floating, mono } from "./surfaces.js";
4
+ import { useEffect, useId } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { SearchIcon } from "lucide-react";
7
+ //#region src/elements/command-palette.tsx
8
+ /**
9
+ * Everything the app can do, one keystroke away and grouped by where it acts.
10
+ *
11
+ * @example
12
+ * import { CommandPalette } from "@cueplusplus/ui/elements";
13
+ *
14
+ * <CommandPalette
15
+ * commands={commands}
16
+ * query={query}
17
+ * activeId={activeId}
18
+ * onQueryChange={setQuery}
19
+ * onRun={run}
20
+ * />
21
+ */
22
+ function ElementsCommandPalette({ commands, query, activeId, onQueryChange, onActiveChange, onRun, className, ...props }) {
23
+ const listId = useId();
24
+ const optionId = (id) => `${listId}-${id}`;
25
+ const matches = commands.filter((command) => command.label.toLowerCase().includes(query.toLowerCase()));
26
+ const groups = [...new Set(matches.map((command) => command.group))];
27
+ const ordered = groups.flatMap((group) => matches.filter((command) => command.group === group));
28
+ const move = (delta) => {
29
+ if (ordered.length === 0) return;
30
+ const at = ordered.findIndex((command) => command.id === activeId);
31
+ const next = ordered[((at === -1 ? delta > 0 ? -1 : 0 : at) + delta + ordered.length) % ordered.length];
32
+ if (next) onActiveChange?.(next.id);
33
+ };
34
+ useEffect(() => {
35
+ document.getElementById(optionId(activeId))?.scrollIntoView({ block: "nearest" });
36
+ }, [activeId, listId]);
37
+ const onKeyDown = (event) => {
38
+ if (event.nativeEvent.isComposing) return;
39
+ if (event.key === "ArrowDown") {
40
+ event.preventDefault();
41
+ move(1);
42
+ } else if (event.key === "ArrowUp") {
43
+ event.preventDefault();
44
+ move(-1);
45
+ } else if (event.key === "Enter") {
46
+ event.preventDefault();
47
+ const active = ordered.find((command) => command.id === activeId);
48
+ if (active) onRun?.(active.id);
49
+ }
50
+ };
51
+ return /* @__PURE__ */ jsxs("div", {
52
+ "data-slot": "command-palette",
53
+ className: cn(floating, "flex w-full max-w-sm flex-col overflow-hidden rounded-(--radius-overlay)", className),
54
+ ...props,
55
+ children: [
56
+ /* @__PURE__ */ jsxs("div", {
57
+ className: "flex items-center gap-2.5 px-3.5 py-3",
58
+ children: [
59
+ /* @__PURE__ */ jsx(SearchIcon, { className: "text-fg-subtle size-3.5 shrink-0" }),
60
+ /* @__PURE__ */ jsx("input", {
61
+ value: query,
62
+ onChange: (event) => onQueryChange?.(event.target.value),
63
+ onKeyDown,
64
+ placeholder: "Type a command",
65
+ "aria-label": "Type a command",
66
+ role: "combobox",
67
+ "aria-expanded": ordered.length > 0,
68
+ "aria-controls": listId,
69
+ "aria-autocomplete": "list",
70
+ "aria-activedescendant": ordered.some((command) => command.id === activeId) ? optionId(activeId) : void 0,
71
+ className: "text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-body) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
72
+ }),
73
+ /* @__PURE__ */ jsx("span", {
74
+ className: cn(field, mono, "text-fg-subtle rounded-(--radius-control) px-1.5 py-0.5"),
75
+ children: "esc"
76
+ })
77
+ ]
78
+ }),
79
+ /* @__PURE__ */ jsx("div", {
80
+ id: listId,
81
+ role: "listbox",
82
+ "aria-label": "Commands",
83
+ className: "border-border flex max-h-72 flex-col overflow-y-auto border-t p-1.5",
84
+ children: groups.map((group) => /* @__PURE__ */ jsxs("div", {
85
+ role: "group",
86
+ "aria-label": group,
87
+ className: "flex flex-col",
88
+ children: [/* @__PURE__ */ jsx("span", {
89
+ "aria-hidden": true,
90
+ className: cn(mono, "text-fg-subtle px-2 pt-2 pb-1"),
91
+ children: group
92
+ }), matches.filter((command) => command.group === group).map((command) => /* @__PURE__ */ jsxs("button", {
93
+ id: optionId(command.id),
94
+ type: "button",
95
+ role: "option",
96
+ tabIndex: -1,
97
+ "aria-selected": command.id === activeId,
98
+ onMouseDown: (event) => event.preventDefault(),
99
+ onClick: () => onRun?.(command.id),
100
+ className: cn("flex items-center gap-2 rounded-(--radius-surface) px-2 py-1.5 text-start transition-colors", command.id === activeId ? "bg-surface-2" : "hover:bg-surface-1"),
101
+ children: [/* @__PURE__ */ jsx("span", {
102
+ className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
103
+ children: command.label
104
+ }), /* @__PURE__ */ jsx("span", {
105
+ className: "flex shrink-0 gap-1",
106
+ children: command.keys.map((key) => /* @__PURE__ */ jsx("span", {
107
+ className: cn(field, mono, "text-fg-subtle rounded-(--radius-control) px-1.5 py-0.5"),
108
+ children: key
109
+ }, key))
110
+ })]
111
+ }, command.id))]
112
+ }, group))
113
+ }),
114
+ matches.length === 0 && /* @__PURE__ */ jsx("div", {
115
+ className: "border-border border-t p-1.5",
116
+ children: /* @__PURE__ */ jsxs("span", {
117
+ className: "text-fg-subtle block px-2 py-4 text-center text-(length:--cue-text-ui) break-words",
118
+ children: [
119
+ "No command matches “",
120
+ query,
121
+ "”"
122
+ ]
123
+ })
124
+ })
125
+ ]
126
+ });
127
+ }
128
+ //#endregion
129
+ export { ElementsCommandPalette };
@@ -0,0 +1,63 @@
1
+ import { CompactionState } from "./vocabulary.js";
2
+ import * as React from "react";
3
+ //#region src/elements/compaction-row.d.ts
4
+ interface CompactionRowProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children"> {
5
+ /** Where the compaction got to. See `COMPACTION_STATES`. */
6
+ state: CompactionState;
7
+ /** Tokens in the window before it ran. */
8
+ tokensBefore?: number;
9
+ /** Tokens after. Omit while it is running, or when it did not finish. */
10
+ tokensAfter?: number;
11
+ /** Messages in the window before it ran. */
12
+ messagesBefore?: number;
13
+ /** Messages after. Omit while it is running, or when it did not finish. */
14
+ messagesAfter?: number;
15
+ /**
16
+ * What the rule says, replacing the one `COMPACTION_LABELS` supplies for this
17
+ * state.
18
+ */
19
+ label?: string;
20
+ /**
21
+ * Why, for the two states that owe an answer: `context window still under
22
+ * 60%`, `the summariser refused`. Roo's rule — a compaction that did not
23
+ * happen, or that lost something, should say so in words rather than leave a
24
+ * reader to infer it from a number that did not move.
25
+ */
26
+ reason?: string;
27
+ }
28
+ /**
29
+ * The rule that says the conversation was compacted, and by how much.
30
+ *
31
+ * A `role="separator"` like {@link TimeBoundary}, because that is what it is:
32
+ * the transcript above it is not the transcript below it any more. What makes
33
+ * it worth a component rather than a line of prose is the pair of numbers —
34
+ * before and after, on both axes — since "compacted" alone tells a reader
35
+ * nothing they can act on, while `128k → 24k tokens · 214 → 31 messages` tells
36
+ * them why the model stopped remembering the thing they mentioned an hour ago.
37
+ *
38
+ * Five states, which is two more than most implementations have and exactly the
39
+ * two that matter: a compaction that **failed** leaves the window full, and one
40
+ * that was **skipped** leaves it full on purpose. Both are the states a reader
41
+ * meets when something is about to go wrong, and both are the states a UI that
42
+ * only draws the happy path renders as nothing at all.
43
+ *
44
+ * The numbers render as far as they are known. While `started`, pass the before
45
+ * figures and no after ones and the row reads `128k tokens · 214 messages`; the
46
+ * arrows arrive with the answer.
47
+ *
48
+ * @example
49
+ * import { CompactionRow } from "@cueplusplus/ui/elements";
50
+ *
51
+ * <CompactionRow
52
+ * state="completed"
53
+ * tokensBefore={128_000}
54
+ * tokensAfter={24_000}
55
+ * messagesBefore={214}
56
+ * messagesAfter={31}
57
+ * />
58
+ * @example
59
+ * <CompactionRow state="skipped" reason="context window still under 60%" />
60
+ */
61
+ declare const CompactionRow: React.ForwardRefExoticComponent<CompactionRowProps & React.RefAttributes<HTMLDivElement>>;
62
+ //#endregion
63
+ export { CompactionRow, CompactionRowProps };
@@ -0,0 +1,110 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { mono } from "./surfaces.js";
4
+ import { COMPACTION_LABELS } from "./vocabulary.js";
5
+ import * as React from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { CircleAlertIcon, FoldVerticalIcon, Loader2Icon, MinusIcon, XIcon } from "lucide-react";
8
+ //#region src/elements/compaction-row.tsx
9
+ /**
10
+ * A count as a compaction rule says it: `214`, `1.5k`, `128k`.
11
+ *
12
+ * Thousands from four figures up, one decimal below ten thousand and none above
13
+ * it — `128000` is `128k` and `1500` is `1.5k`, because the first number is
14
+ * about a budget and the second is about a change. Anything that is not a
15
+ * finite, positive number is `0`.
16
+ */
17
+ function formatCount(value) {
18
+ if (!Number.isFinite(value) || value <= 0) return "0";
19
+ if (value < 1e3) return String(Math.round(value));
20
+ const thousands = value / 1e3;
21
+ return thousands < 10 ? `${Math.round(thousands * 10) / 10}k` : `${Math.round(thousands)}k`;
22
+ }
23
+ /** `128k → 24k tokens`, or `128k tokens` when there is no after yet. */
24
+ function figures(before, after, unit) {
25
+ if (before === void 0) return null;
26
+ if (after === void 0) return `${formatCount(before)} ${unit}`;
27
+ return `${formatCount(before)} → ${formatCount(after)} ${unit}`;
28
+ }
29
+ /**
30
+ * The rule that says the conversation was compacted, and by how much.
31
+ *
32
+ * A `role="separator"` like {@link TimeBoundary}, because that is what it is:
33
+ * the transcript above it is not the transcript below it any more. What makes
34
+ * it worth a component rather than a line of prose is the pair of numbers —
35
+ * before and after, on both axes — since "compacted" alone tells a reader
36
+ * nothing they can act on, while `128k → 24k tokens · 214 → 31 messages` tells
37
+ * them why the model stopped remembering the thing they mentioned an hour ago.
38
+ *
39
+ * Five states, which is two more than most implementations have and exactly the
40
+ * two that matter: a compaction that **failed** leaves the window full, and one
41
+ * that was **skipped** leaves it full on purpose. Both are the states a reader
42
+ * meets when something is about to go wrong, and both are the states a UI that
43
+ * only draws the happy path renders as nothing at all.
44
+ *
45
+ * The numbers render as far as they are known. While `started`, pass the before
46
+ * figures and no after ones and the row reads `128k tokens · 214 messages`; the
47
+ * arrows arrive with the answer.
48
+ *
49
+ * @example
50
+ * import { CompactionRow } from "@cueplusplus/ui/elements";
51
+ *
52
+ * <CompactionRow
53
+ * state="completed"
54
+ * tokensBefore={128_000}
55
+ * tokensAfter={24_000}
56
+ * messagesBefore={214}
57
+ * messagesAfter={31}
58
+ * />
59
+ * @example
60
+ * <CompactionRow state="skipped" reason="context window still under 60%" />
61
+ */
62
+ const CompactionRow = React.forwardRef(function CompactionRow({ state, tokensBefore, tokensAfter, messagesBefore, messagesAfter, label, reason, className, ...elementProps }, ref) {
63
+ const said = label ?? COMPACTION_LABELS[state];
64
+ const counts = [figures(tokensBefore, tokensAfter, "tokens"), figures(messagesBefore, messagesAfter, "messages")].filter((part) => part !== null);
65
+ const spoken = [
66
+ said,
67
+ ...counts,
68
+ reason
69
+ ].filter(Boolean).join(" · ");
70
+ return /* @__PURE__ */ jsxs("div", {
71
+ ref,
72
+ role: "separator",
73
+ "aria-label": spoken,
74
+ "data-slot": "compaction-row",
75
+ "data-state": state,
76
+ className: cn("flex w-full items-center gap-2.5 py-1", className),
77
+ ...elementProps,
78
+ children: [
79
+ /* @__PURE__ */ jsx("span", {
80
+ "aria-hidden": true,
81
+ className: "bg-border h-px flex-1"
82
+ }),
83
+ /* @__PURE__ */ jsxs("span", {
84
+ "aria-hidden": true,
85
+ className: "flex min-w-0 shrink items-center gap-2",
86
+ children: [
87
+ state === "started" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3 shrink-0 animate-spin text-stream motion-reduce:animate-none" }) : state === "failed" ? /* @__PURE__ */ jsx(CircleAlertIcon, { className: "size-3 shrink-0 text-danger" }) : state === "cancelled" ? /* @__PURE__ */ jsx(XIcon, { className: "text-fg-subtle size-3 shrink-0" }) : state === "skipped" ? /* @__PURE__ */ jsx(MinusIcon, { className: "text-fg-subtle size-3 shrink-0" }) : /* @__PURE__ */ jsx(FoldVerticalIcon, { className: "text-fg-subtle size-3 shrink-0" }),
88
+ /* @__PURE__ */ jsx("span", {
89
+ className: cn(mono, "shrink-0", state === "failed" ? "text-danger" : "text-fg-subtle"),
90
+ children: said
91
+ }),
92
+ counts.length === 0 ? null : /* @__PURE__ */ jsx("span", {
93
+ className: cn(mono, "text-fg-subtle min-w-0 truncate tabular-nums"),
94
+ children: counts.join(" · ")
95
+ }),
96
+ reason === void 0 ? null : /* @__PURE__ */ jsx("span", {
97
+ className: cn(mono, "text-fg-subtle min-w-0 truncate"),
98
+ children: reason
99
+ })
100
+ ]
101
+ }),
102
+ /* @__PURE__ */ jsx("span", {
103
+ "aria-hidden": true,
104
+ className: "bg-border h-px flex-1"
105
+ })
106
+ ]
107
+ });
108
+ });
109
+ //#endregion
110
+ export { CompactionRow };
@@ -0,0 +1,47 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/comparison-card.d.ts
3
+ /** One of the options being weighed, and how it answers each trait. */
4
+ interface ComparisonOption {
5
+ /** Stable identity, compared against recommendedId. */
6
+ id: string;
7
+ /** Option name. */
8
+ name: string;
9
+ /** One-line summary under the name. */
10
+ headline: string;
11
+ /**
12
+ * Positional against traitLabels. A string is what the option does; false means it
13
+ * lacks the trait and shows the label struck back.
14
+ */
15
+ traits: readonly (string | false)[];
16
+ }
17
+ /**
18
+ * Two options weighed side by side, with the pick named and argued.
19
+ *
20
+ * @example
21
+ * import { ComparisonCard } from "@cueplusplus/ui/elements";
22
+ *
23
+ * <ComparisonCard
24
+ * traitLabels={traits}
25
+ * options={options}
26
+ * recommendedId="local"
27
+ * reason="You already hold messages in your own store."
28
+ * />
29
+ */
30
+ declare function ComparisonCard({ traitLabels, options, recommendedId, reason, className, ...props }: Omit<ComponentProps<"div">, "children" | "traitLabels" | "options" | "recommendedId" | "reason"> & {
31
+ /**
32
+ * The dimensions compared, in order. Used as the fallback label when an option lacks
33
+ * a trait.
34
+ */
35
+ traitLabels: readonly string[];
36
+ /** Two or three options. More than that wants a table, not a comparison. */
37
+ options: readonly ComparisonOption[];
38
+ /** Which option is the pick. It is tinted and labelled rather than merely ordered first. */
39
+ recommendedId: string;
40
+ /**
41
+ * Why that one, in the user's terms. A comparison without a recommendation is an
42
+ * unanswered question.
43
+ */
44
+ reason: string;
45
+ }): import("react").JSX.Element;
46
+ //#endregion
47
+ export { ComparisonCard, ComparisonOption };
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { CheckIcon, MinusIcon } from "lucide-react";
6
+ //#region src/elements/comparison-card.tsx
7
+ /**
8
+ * Two options weighed side by side, with the pick named and argued.
9
+ *
10
+ * @example
11
+ * import { ComparisonCard } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <ComparisonCard
14
+ * traitLabels={traits}
15
+ * options={options}
16
+ * recommendedId="local"
17
+ * reason="You already hold messages in your own store."
18
+ * />
19
+ */
20
+ function ComparisonCard({ traitLabels, options, recommendedId, reason, className, ...props }) {
21
+ return /* @__PURE__ */ jsxs("div", {
22
+ "data-slot": "comparison-card",
23
+ className: cn(paper, "flex w-full max-w-md flex-col gap-3 rounded-(--radius-overlay) p-4", className),
24
+ ...props,
25
+ children: [/* @__PURE__ */ jsx("div", {
26
+ className: "flex gap-2",
27
+ children: options.map((option) => {
28
+ const recommended = option.id === recommendedId;
29
+ return /* @__PURE__ */ jsxs("div", {
30
+ className: cn("flex min-w-0 flex-1 flex-col gap-2 rounded-(--radius-surface) p-3 transition-colors", recommended ? "bg-stream/10" : field),
31
+ children: [/* @__PURE__ */ jsxs("div", {
32
+ className: "flex flex-col gap-0.5",
33
+ children: [/* @__PURE__ */ jsxs("span", {
34
+ className: "flex items-baseline gap-1.5",
35
+ children: [/* @__PURE__ */ jsx("span", {
36
+ className: "truncate text-(length:--cue-text-body) font-medium",
37
+ children: option.name
38
+ }), recommended && /* @__PURE__ */ jsx("span", {
39
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "shrink-0 text-stream"),
40
+ children: "pick"
41
+ })]
42
+ }), /* @__PURE__ */ jsx("span", {
43
+ className: "text-fg-muted truncate text-(length:--cue-text-ui)",
44
+ children: option.headline
45
+ })]
46
+ }), /* @__PURE__ */ jsx("div", {
47
+ className: "flex flex-col gap-1",
48
+ children: traitLabels.map((label, i) => {
49
+ const trait = option.traits[i];
50
+ const absent = !trait;
51
+ return /* @__PURE__ */ jsxs("span", {
52
+ className: "flex items-center gap-1.5 text-(length:--cue-text-ui)",
53
+ children: [absent ? /* @__PURE__ */ jsx(MinusIcon, { className: "text-fg-subtle size-3 shrink-0" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3 shrink-0 text-ok" }), /* @__PURE__ */ jsx("span", {
54
+ className: cn("min-w-0 truncate", absent ? "text-fg-subtle" : "text-fg-muted"),
55
+ children: absent ? label : trait
56
+ })]
57
+ }, `${i}-${label}`);
58
+ })
59
+ })]
60
+ }, option.id);
61
+ })
62
+ }), /* @__PURE__ */ jsx("p", {
63
+ className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed",
64
+ children: reason
65
+ })]
66
+ });
67
+ }
68
+ //#endregion
69
+ export { ComparisonCard };