@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,65 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { mono, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { RotateCcwIcon } from "lucide-react";
6
+ //#region src/elements/checkpoint-history.tsx
7
+ /**
8
+ * Points you can fall back to, with what each one would give back.
9
+ *
10
+ * @example
11
+ * import { CheckpointHistory } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <CheckpointHistory checkpoints={checkpoints} currentId="3" onRestore={restore} />
14
+ */
15
+ function CheckpointHistory({ checkpoints, currentId, onRestore, className, ...props }) {
16
+ const currentIndex = checkpoints.findIndex((checkpoint) => checkpoint.id === currentId);
17
+ return /* @__PURE__ */ jsxs("div", {
18
+ "data-slot": "checkpoint-history",
19
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-(--radius-overlay) p-3", className),
20
+ ...props,
21
+ children: [/* @__PURE__ */ jsx("span", {
22
+ className: "px-1.5 pb-1 text-(length:--cue-text-body) font-medium",
23
+ children: "Checkpoints"
24
+ }), checkpoints.map((checkpoint, i) => {
25
+ const ahead = currentIndex >= 0 && i > currentIndex;
26
+ const current = checkpoint.id === currentId;
27
+ return /* @__PURE__ */ jsxs("div", {
28
+ className: cn("group flex items-center gap-2.5 rounded-(--radius-surface) px-1.5 py-1.5 transition-colors", current ? "bg-surface-1" : "hover:bg-surface-1", ahead && "opacity-40"),
29
+ children: [
30
+ /* @__PURE__ */ jsx("span", {
31
+ "aria-hidden": true,
32
+ className: cn("size-1.5 shrink-0 rounded-full", current ? "bg-stream" : ahead ? "border-border-strong border" : "bg-surface-3")
33
+ }),
34
+ /* @__PURE__ */ jsxs("span", {
35
+ className: "flex min-w-0 flex-1 flex-col",
36
+ children: [/* @__PURE__ */ jsx("span", {
37
+ className: "truncate text-(length:--cue-text-body)",
38
+ children: checkpoint.label
39
+ }), /* @__PURE__ */ jsxs("span", {
40
+ className: cn(mono, "text-fg-subtle"),
41
+ children: [
42
+ checkpoint.at,
43
+ " · ",
44
+ checkpoint.files,
45
+ " files"
46
+ ]
47
+ })]
48
+ }),
49
+ current ? /* @__PURE__ */ jsx("span", {
50
+ className: cn(mono, "text-fg-subtle shrink-0"),
51
+ children: "current"
52
+ }) : /* @__PURE__ */ jsxs("button", {
53
+ type: "button",
54
+ "aria-label": `Restore to ${checkpoint.label}`,
55
+ onClick: () => onRestore?.(checkpoint.id),
56
+ className: "text-fg-muted hover:bg-surface-2 hover:text-fg flex h-6 shrink-0 items-center gap-1 rounded-full px-2 text-(length:--cue-text-label) font-medium opacity-0 transition-[background-color,color,opacity,scale] duration-150 group-hover:opacity-100 focus-visible:opacity-100 active:scale-[0.96]",
57
+ children: [/* @__PURE__ */ jsx(RotateCcwIcon, { className: "size-2.5" }), "Restore"]
58
+ })
59
+ ]
60
+ }, checkpoint.id);
61
+ })]
62
+ });
63
+ }
64
+ //#endregion
65
+ export { CheckpointHistory };
@@ -0,0 +1,90 @@
1
+ import { ClampLabels } from "./vocabulary.js";
2
+ import * as React from "react";
3
+ //#region src/elements/clamp.d.ts
4
+ interface ClampProps extends Omit<React.ComponentPropsWithoutRef<"div">, "onToggle"> {
5
+ /**
6
+ * How tall the content may be before it is cut, as a number of pixels or any
7
+ * CSS length. Defaults to `250` — the reference's own default, with `60` the
8
+ * value it uses for a quoted user message.
9
+ *
10
+ * Published as `--cue-elements-clamp-height` on the root, so a console can
11
+ * retune one clamp from a stylesheet without a prop.
12
+ */
13
+ height?: number | string;
14
+ /**
15
+ * How deep the dissolve at the cut is, in pixels. Defaults to `50`, the
16
+ * reference's most-used depth.
17
+ *
18
+ * Fixed pixels rather than a fraction, deliberately: a percentage fade is a
19
+ * different effect on a short row than on a long one. Published as
20
+ * `--cue-elements-clamp-fade`.
21
+ */
22
+ fade?: number;
23
+ /** Whether the content is showing in full. */
24
+ open: boolean;
25
+ /**
26
+ * Called when the reveal is used. Omit it and the clamp is a hard cut with a
27
+ * fade and no promise of more — which is the reference's own tool-result row,
28
+ * where the full text opens somewhere else entirely.
29
+ */
30
+ onOpenChange?: (open: boolean) => void;
31
+ /**
32
+ * Whether the content is taller than `height`, when the caller already knows.
33
+ * Left out, the clamp measures itself and re-measures as the content and the
34
+ * box change.
35
+ *
36
+ * The measurement is the right default and the override is for the cases it
37
+ * cannot serve: a virtualised row that knows its own text, a replay frame
38
+ * that must paint the same way on every mount, a server render.
39
+ */
40
+ overflows?: boolean;
41
+ /**
42
+ * The two words on the reveal. Defaults to {@link CLAMP_LABELS} — `Show more`
43
+ * and `Show less`, which is the reference's copy verbatim.
44
+ */
45
+ labels?: Partial<ClampLabels>;
46
+ /** The content being clamped. */
47
+ children?: React.ReactNode;
48
+ }
49
+ /**
50
+ * Long content, cut to a height, dissolving at the cut, with a way back.
51
+ *
52
+ * The truncation trio as one element. Everything a transcript truncates —
53
+ * command output, a pasted file, a reasoning trace, a quoted message — wants
54
+ * exactly these three things, and a family that leaves them to each component
55
+ * gets five slightly different cuts and one of them hard-coded to a colour that
56
+ * breaks in light mode.
57
+ *
58
+ * The fade is a **mask**, not an overlay: it fades the content rather than
59
+ * painting a gradient of the surface colour over it, so it needs no idea of
60
+ * what is behind it and cannot drift when the theme changes. The height and the
61
+ * depth are published as custom properties on the root, so a console can retune
62
+ * a clamp from CSS — and because the mask is expressed in terms of them, a
63
+ * height overridden in a stylesheet moves the fade with it.
64
+ *
65
+ * The reveal is the part this element does not copy exactly. The reference
66
+ * shows its `Show more` chip on hover only, which is unreachable for anyone
67
+ * who is not holding a mouse; here the control is always in the DOM and always
68
+ * focusable, and hover and focus only decide how loudly it is drawn. Once the
69
+ * content is open, `Show less` is drawn at full strength — a long expansion you
70
+ * cannot close without hunting for the control is a real defect.
71
+ *
72
+ * Open state is a prop, like everything else in this family: a scripted replay
73
+ * of this component is a caller changing `open`.
74
+ *
75
+ * @example
76
+ * import { Clamp } from "@cueplusplus/ui/elements";
77
+ *
78
+ * <Clamp open={open} onOpenChange={setOpen}>
79
+ * <pre>{output}</pre>
80
+ * </Clamp>
81
+ * @example
82
+ * // The reference's tool-result row: 60px of output, a 10px dissolve, and no
83
+ * // reveal at all — the full text opens in an editor tab instead.
84
+ * <Clamp height={60} fade={10} open={false} overflows onClick={openInEditor}>
85
+ * {result}
86
+ * </Clamp>
87
+ */
88
+ declare const Clamp: React.ForwardRefExoticComponent<ClampProps & React.RefAttributes<HTMLDivElement>>;
89
+ //#endregion
90
+ export { Clamp, ClampProps };
@@ -0,0 +1,109 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
4
+ import { CLAMP_LABELS } from "./vocabulary.js";
5
+ import * as React from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/elements/clamp.tsx
8
+ /** A height as CSS: a bare number is pixels, a string is whatever it says. */
9
+ const asLength = (value) => typeof value === "number" ? `${value}px` : value;
10
+ /**
11
+ * Long content, cut to a height, dissolving at the cut, with a way back.
12
+ *
13
+ * The truncation trio as one element. Everything a transcript truncates —
14
+ * command output, a pasted file, a reasoning trace, a quoted message — wants
15
+ * exactly these three things, and a family that leaves them to each component
16
+ * gets five slightly different cuts and one of them hard-coded to a colour that
17
+ * breaks in light mode.
18
+ *
19
+ * The fade is a **mask**, not an overlay: it fades the content rather than
20
+ * painting a gradient of the surface colour over it, so it needs no idea of
21
+ * what is behind it and cannot drift when the theme changes. The height and the
22
+ * depth are published as custom properties on the root, so a console can retune
23
+ * a clamp from CSS — and because the mask is expressed in terms of them, a
24
+ * height overridden in a stylesheet moves the fade with it.
25
+ *
26
+ * The reveal is the part this element does not copy exactly. The reference
27
+ * shows its `Show more` chip on hover only, which is unreachable for anyone
28
+ * who is not holding a mouse; here the control is always in the DOM and always
29
+ * focusable, and hover and focus only decide how loudly it is drawn. Once the
30
+ * content is open, `Show less` is drawn at full strength — a long expansion you
31
+ * cannot close without hunting for the control is a real defect.
32
+ *
33
+ * Open state is a prop, like everything else in this family: a scripted replay
34
+ * of this component is a caller changing `open`.
35
+ *
36
+ * @example
37
+ * import { Clamp } from "@cueplusplus/ui/elements";
38
+ *
39
+ * <Clamp open={open} onOpenChange={setOpen}>
40
+ * <pre>{output}</pre>
41
+ * </Clamp>
42
+ * @example
43
+ * // The reference's tool-result row: 60px of output, a 10px dissolve, and no
44
+ * // reveal at all — the full text opens in an editor tab instead.
45
+ * <Clamp height={60} fade={10} open={false} overflows onClick={openInEditor}>
46
+ * {result}
47
+ * </Clamp>
48
+ */
49
+ const Clamp = React.forwardRef(function Clamp({ height = 250, fade = 50, open, onOpenChange, overflows, labels, children, className, style, ...elementProps }, ref) {
50
+ const [measured, setMeasured] = React.useState(false);
51
+ const box = React.useRef(null);
52
+ const inner = React.useRef(null);
53
+ const said = {
54
+ ...CLAMP_LABELS,
55
+ ...labels
56
+ };
57
+ useIsomorphicLayoutEffect(() => {
58
+ if (overflows !== void 0 || open) return;
59
+ const element = box.current;
60
+ const content = inner.current;
61
+ if (element === null || content === null) return;
62
+ const read = () => setMeasured(element.scrollHeight > element.clientHeight + 1);
63
+ read();
64
+ if (typeof ResizeObserver === "undefined") return;
65
+ const observer = new ResizeObserver(read);
66
+ observer.observe(content);
67
+ return () => observer.disconnect();
68
+ }, [
69
+ height,
70
+ open,
71
+ overflows
72
+ ]);
73
+ const over = overflows ?? measured;
74
+ const clamped = !open && over;
75
+ const revealable = onOpenChange !== void 0 && (open || over);
76
+ return /* @__PURE__ */ jsxs("div", {
77
+ ref,
78
+ "data-slot": "clamp",
79
+ "data-open": String(open),
80
+ "data-clamped": String(clamped),
81
+ className: cn("group/clamp relative flex w-full min-w-0 flex-col", className),
82
+ style: {
83
+ "--cue-elements-clamp-height": asLength(height),
84
+ "--cue-elements-clamp-fade": `${fade}px`,
85
+ "--cue-elements-clamp-mask": "linear-gradient(to bottom, black calc(var(--cue-elements-clamp-height) - var(--cue-elements-clamp-fade)), transparent var(--cue-elements-clamp-height))",
86
+ ...style
87
+ },
88
+ ...elementProps,
89
+ children: [/* @__PURE__ */ jsx("div", {
90
+ ref: box,
91
+ "data-slot": "clamp-content",
92
+ className: cn("min-w-0", !open && "overflow-hidden [max-height:var(--cue-elements-clamp-height)]", clamped && "[mask-image:var(--cue-elements-clamp-mask)] [-webkit-mask-image:var(--cue-elements-clamp-mask)]"),
93
+ children: /* @__PURE__ */ jsx("div", {
94
+ ref: inner,
95
+ className: "min-w-0",
96
+ children
97
+ })
98
+ }), revealable ? /* @__PURE__ */ jsx("button", {
99
+ type: "button",
100
+ "data-slot": "clamp-reveal",
101
+ "aria-expanded": open,
102
+ onClick: () => onOpenChange?.(!open),
103
+ className: cn("text-fg-muted hover:text-fg self-start rounded-(--radius-control) py-0.5 text-(length:--cue-text-ui) transition-opacity focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent motion-reduce:transition-none", !open && "opacity-60 group-hover/clamp:opacity-100 focus-visible:opacity-100"),
104
+ children: open ? said.less : said.more
105
+ }) : null]
106
+ });
107
+ });
108
+ //#endregion
109
+ export { Clamp };
@@ -0,0 +1,42 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/code-diff.d.ts
3
+ /** What a diff row is — unchanged context, an addition, or a deletion. */
4
+ type DiffKind = "context" | "added" | "removed";
5
+ /** One row of a diff: its kind, which decides its gutter mark and its ink, and its text. */
6
+ interface DiffLine {
7
+ /** Whether the row is context, an addition or a deletion. */
8
+ kind: DiffKind;
9
+ /** The line itself, rendered with its own whitespace kept. */
10
+ text: string;
11
+ }
12
+ /**
13
+ * A unified diff with tinted additions and removals, sized for chat.
14
+ *
15
+ * @example
16
+ * import { CodeDiff } from "@cueplusplus/ui/elements";
17
+ *
18
+ * <CodeDiff
19
+ * filename="thread.tsx"
20
+ * additions={2}
21
+ * deletions={1}
22
+ * lines={[
23
+ * { kind: "removed", text: "const x = 1" },
24
+ * { kind: "added", text: "const x = 2" },
25
+ * ]}
26
+ * cycle={0}
27
+ * />
28
+ */
29
+ declare function CodeDiff({ filename, additions, deletions, lines, cycle, className, ...props }: Omit<ComponentProps<"div">, "children" | "filename" | "additions" | "deletions" | "lines" | "cycle"> & {
30
+ /** File path shown in the diff header. */
31
+ filename: string;
32
+ /** Addition count rendered in green next to the filename. */
33
+ additions: number;
34
+ /** Deletion count rendered in red next to the filename. */
35
+ deletions: number;
36
+ /** Unified diff lines with context, added, or removed kind. */
37
+ lines: readonly DiffLine[];
38
+ /** Identity key that remounts the body so entrance animation can replay. */
39
+ cycle: number;
40
+ }): import("react").JSX.Element;
41
+ //#endregion
42
+ export { CodeDiff, DiffKind, DiffLine };
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { codeScroll, codeSurface, mono, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/elements/code-diff.tsx
6
+ const GUTTER = {
7
+ context: "",
8
+ added: "+",
9
+ removed: "−"
10
+ };
11
+ /**
12
+ * A unified diff with tinted additions and removals, sized for chat.
13
+ *
14
+ * @example
15
+ * import { CodeDiff } from "@cueplusplus/ui/elements";
16
+ *
17
+ * <CodeDiff
18
+ * filename="thread.tsx"
19
+ * additions={2}
20
+ * deletions={1}
21
+ * lines={[
22
+ * { kind: "removed", text: "const x = 1" },
23
+ * { kind: "added", text: "const x = 2" },
24
+ * ]}
25
+ * cycle={0}
26
+ * />
27
+ */
28
+ function CodeDiff({ filename, additions, deletions, lines, cycle, className, ...props }) {
29
+ return /* @__PURE__ */ jsxs("div", {
30
+ "data-slot": "code-diff",
31
+ className: cn(paper, "w-full max-w-md overflow-hidden rounded-(--radius-overlay) font-mono text-(length:--cue-text-ui)", className),
32
+ ...props,
33
+ children: [/* @__PURE__ */ jsxs("div", {
34
+ className: "flex items-center justify-between px-4 pt-3 pb-2",
35
+ children: [/* @__PURE__ */ jsx("span", {
36
+ className: "text-fg",
37
+ children: filename
38
+ }), /* @__PURE__ */ jsxs("span", {
39
+ className: cn(mono, "tabular-nums"),
40
+ children: [
41
+ /* @__PURE__ */ jsxs("span", {
42
+ className: "text-ok",
43
+ children: ["+", additions]
44
+ }),
45
+ " ",
46
+ /* @__PURE__ */ jsxs("span", {
47
+ className: "text-danger",
48
+ children: ["−", deletions]
49
+ })
50
+ ]
51
+ })]
52
+ }), /* @__PURE__ */ jsx("div", {
53
+ className: codeScroll,
54
+ children: /* @__PURE__ */ jsx("div", {
55
+ className: codeSurface,
56
+ children: lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
57
+ className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both flex px-4 py-0.5 leading-relaxed whitespace-pre duration-300", line.kind === "context" && "text-fg-muted", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
58
+ style: { animationDelay: `${i * 60}ms` },
59
+ children: [/* @__PURE__ */ jsx("span", {
60
+ className: "w-4 shrink-0 select-none",
61
+ children: GUTTER[line.kind]
62
+ }), /* @__PURE__ */ jsx("span", { children: line.text })]
63
+ }, `${cycle}-${i}-${line.text}`))
64
+ })
65
+ })]
66
+ });
67
+ }
68
+ //#endregion
69
+ export { CodeDiff };
@@ -0,0 +1,38 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/code-runner.d.ts
3
+ /**
4
+ * Where the snippet is: `idle` before anybody asks, `running`, then `ok` or `error`.
5
+ * The last two both show output — a failure is a result, not an absence.
6
+ */
7
+ type RunState = "idle" | "running" | "ok" | "error";
8
+ /**
9
+ * A snippet with a run button, and the output it produced attached below it.
10
+ *
11
+ * @example
12
+ * import { CodeRunner } from "@cueplusplus/ui/elements";
13
+ *
14
+ * <CodeRunner
15
+ * language="typescript"
16
+ * code={code}
17
+ * state="ok"
18
+ * output={["1"]}
19
+ * durationMs={38}
20
+ * onRun={run}
21
+ * />
22
+ */
23
+ declare function CodeRunner({ language, code, state, output, durationMs, onRun, className, ...props }: Omit<ComponentProps<"div">, "children" | "language" | "code" | "state" | "output" | "durationMs" | "onRun"> & {
24
+ /** Language label above the snippet. */
25
+ language: string;
26
+ /** The snippet. Rendered as plain mono; wrap it yourself for highlighting. */
27
+ code: string;
28
+ /** idle hides the output pane entirely; error tints the output red. */
29
+ state: RunState;
30
+ /** Output lines, revealed in sequence. */
31
+ output: readonly string[];
32
+ /** How long the run took, printed once it settles. */
33
+ durationMs?: number;
34
+ /** Called when the run control is pressed. */
35
+ onRun?: () => void;
36
+ }): import("react").JSX.Element;
37
+ //#endregion
38
+ export { CodeRunner, RunState };
@@ -0,0 +1,84 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ghostButton, mono, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Loader2Icon, PlayIcon } from "lucide-react";
6
+ //#region src/elements/code-runner.tsx
7
+ /**
8
+ * A snippet with a run button, and the output it produced attached below it.
9
+ *
10
+ * @example
11
+ * import { CodeRunner } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <CodeRunner
14
+ * language="typescript"
15
+ * code={code}
16
+ * state="ok"
17
+ * output={["1"]}
18
+ * durationMs={38}
19
+ * onRun={run}
20
+ * />
21
+ */
22
+ function CodeRunner({ language, code, state, output, durationMs, onRun, className, ...props }) {
23
+ return /* @__PURE__ */ jsxs("div", {
24
+ "data-slot": "code-runner",
25
+ className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
26
+ ...props,
27
+ children: [
28
+ /* @__PURE__ */ jsxs("div", {
29
+ className: "flex items-center gap-2 px-3.5 py-2",
30
+ children: [
31
+ /* @__PURE__ */ jsx("span", {
32
+ className: cn(mono, "text-fg-subtle min-w-0 flex-1"),
33
+ children: language
34
+ }),
35
+ durationMs !== void 0 && state !== "running" && /* @__PURE__ */ jsxs("span", {
36
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle shrink-0 tabular-nums"),
37
+ children: [durationMs, "ms"]
38
+ }),
39
+ /* @__PURE__ */ jsx("button", {
40
+ type: "button",
41
+ "aria-label": "Run this snippet",
42
+ onClick: onRun,
43
+ disabled: state === "running",
44
+ className: cn(ghostButton, "size-7 shrink-0 disabled:pointer-events-none"),
45
+ children: state === "running" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3.5 animate-spin motion-reduce:animate-none" }) : /* @__PURE__ */ jsx(PlayIcon, { className: "size-3.5 translate-x-px" })
46
+ })
47
+ ]
48
+ }),
49
+ /* @__PURE__ */ jsx("pre", {
50
+ className: "border-border overflow-x-auto border-t px-3.5 py-2.5 font-mono text-(length:--cue-text-ui) leading-relaxed",
51
+ children: /* @__PURE__ */ jsx("code", {
52
+ className: "text-fg-muted",
53
+ children: code
54
+ })
55
+ }),
56
+ state !== "idle" && /* @__PURE__ */ jsxs("div", {
57
+ className: "border-border cue-elements-fade-in cue-elements-animate-in flex flex-col border-t px-3.5 py-2.5 duration-300",
58
+ children: [
59
+ /* @__PURE__ */ jsx("span", {
60
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle pb-1"),
61
+ children: "output"
62
+ }),
63
+ /* @__PURE__ */ jsx("div", {
64
+ className: "overflow-x-auto",
65
+ children: /* @__PURE__ */ jsx("div", {
66
+ className: cn("w-max min-w-full", "flex flex-col"),
67
+ children: output.map((line, i) => /* @__PURE__ */ jsx("span", {
68
+ className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both font-mono text-(length:--cue-text-ui) leading-relaxed whitespace-pre", state === "error" ? "text-danger" : "text-fg-muted"),
69
+ style: { animationDelay: `${i * 80}ms` },
70
+ children: line
71
+ }, `${i}-${line}`))
72
+ })
73
+ }),
74
+ state === "running" && /* @__PURE__ */ jsx("span", {
75
+ "aria-hidden": true,
76
+ className: "bg-surface-3 h-[1em] w-[2px] animate-pulse rounded-full motion-reduce:animate-none"
77
+ })
78
+ ]
79
+ })
80
+ ]
81
+ });
82
+ }
83
+ //#endregion
84
+ export { CodeRunner };
@@ -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 };