@cueplusplus/ui 0.3.0 → 0.6.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 (541) hide show
  1. package/CHANGELOG.md +2263 -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/_drag.js +59 -0
  15. package/dist/chrome/_status-bar-item.js +85 -0
  16. package/dist/chrome/_status-bar.d.ts +15 -0
  17. package/dist/chrome/_status-bar.js +171 -0
  18. package/dist/chrome/app-shell.d.ts +120 -2
  19. package/dist/chrome/app-shell.js +107 -8
  20. package/dist/chrome/index.d.ts +4 -3
  21. package/dist/chrome/status-bar.d.ts +87 -4
  22. package/dist/chrome/status-bar.js +80 -16
  23. package/dist/chrome/title-bar.d.ts +11 -1
  24. package/dist/chrome/title-bar.js +1 -3
  25. package/dist/configurator/_export.js +3 -2
  26. package/dist/configurator/_overrides.d.ts +1 -1
  27. package/dist/configurator/token-editor.js +4 -1
  28. package/dist/date/_segments.js +52 -6
  29. package/dist/elements/activity-graph.d.ts +40 -0
  30. package/dist/elements/activity-graph.js +81 -0
  31. package/dist/elements/agent-card.d.ts +49 -0
  32. package/dist/elements/agent-card.js +91 -0
  33. package/dist/elements/agent-handoff.d.ts +24 -0
  34. package/dist/elements/agent-handoff.js +53 -0
  35. package/dist/elements/agent-mode-badge.d.ts +72 -0
  36. package/dist/elements/agent-mode-badge.js +110 -0
  37. package/dist/elements/agent-plan.d.ts +24 -0
  38. package/dist/elements/agent-plan.js +74 -0
  39. package/dist/elements/agent-status.d.ts +29 -0
  40. package/dist/elements/agent-status.js +46 -0
  41. package/dist/elements/agent-surface.d.ts +65 -0
  42. package/dist/elements/agent-surface.js +68 -0
  43. package/dist/elements/animated-number.d.ts +86 -0
  44. package/dist/elements/animated-number.js +118 -0
  45. package/dist/elements/approval-card.d.ts +40 -0
  46. package/dist/elements/approval-card.js +78 -0
  47. package/dist/elements/artifact-card.d.ts +30 -0
  48. package/dist/elements/artifact-card.js +58 -0
  49. package/dist/elements/background-inbox.d.ts +39 -0
  50. package/dist/elements/background-inbox.js +60 -0
  51. package/dist/elements/canvas-split.d.ts +77 -0
  52. package/dist/elements/canvas-split.js +138 -0
  53. package/dist/elements/chart.d.ts +41 -0
  54. package/dist/elements/chart.js +117 -0
  55. package/dist/elements/chat-panel.d.ts +46 -0
  56. package/dist/elements/chat-panel.js +104 -0
  57. package/dist/elements/checkpoint-history.d.ts +31 -0
  58. package/dist/elements/checkpoint-history.js +65 -0
  59. package/dist/elements/clamp.d.ts +90 -0
  60. package/dist/elements/clamp.js +109 -0
  61. package/dist/elements/code-diff.d.ts +42 -0
  62. package/dist/elements/code-diff.js +69 -0
  63. package/dist/elements/code-runner.d.ts +38 -0
  64. package/dist/elements/code-runner.js +84 -0
  65. package/dist/elements/command-palette.d.ts +48 -0
  66. package/dist/elements/command-palette.js +129 -0
  67. package/dist/elements/compaction-row.d.ts +63 -0
  68. package/dist/elements/compaction-row.js +110 -0
  69. package/dist/elements/comparison-card.d.ts +47 -0
  70. package/dist/elements/comparison-card.js +69 -0
  71. package/dist/elements/composer.d.ts +274 -0
  72. package/dist/elements/composer.js +505 -0
  73. package/dist/elements/computer-use.d.ts +40 -0
  74. package/dist/elements/computer-use.js +92 -0
  75. package/dist/elements/confidence-marker.d.ts +39 -0
  76. package/dist/elements/confidence-marker.js +64 -0
  77. package/dist/elements/connection-state.d.ts +29 -0
  78. package/dist/elements/connection-state.js +66 -0
  79. package/dist/elements/context-breakdown.d.ts +30 -0
  80. package/dist/elements/context-breakdown.js +86 -0
  81. package/dist/elements/context-usage.d.ts +99 -0
  82. package/dist/elements/context-usage.js +225 -0
  83. package/dist/elements/conversation-search.d.ts +48 -0
  84. package/dist/elements/conversation-search.js +88 -0
  85. package/dist/elements/cost-meter.d.ts +33 -0
  86. package/dist/elements/cost-meter.js +75 -0
  87. package/dist/elements/data-table.d.ts +31 -0
  88. package/dist/elements/data-table.js +67 -0
  89. package/dist/elements/day-separator.d.ts +34 -0
  90. package/dist/elements/day-separator.js +50 -0
  91. package/dist/elements/diagram.d.ts +34 -0
  92. package/dist/elements/diagram.js +75 -0
  93. package/dist/elements/document-reference.d.ts +37 -0
  94. package/dist/elements/document-reference.js +66 -0
  95. package/dist/elements/draft-restore.d.ts +27 -0
  96. package/dist/elements/draft-restore.js +54 -0
  97. package/dist/elements/edit-message.d.ts +36 -0
  98. package/dist/elements/edit-message.js +77 -0
  99. package/dist/elements/elements.css +459 -0
  100. package/dist/elements/elicitation-form.d.ts +48 -0
  101. package/dist/elements/elicitation-form.js +106 -0
  102. package/dist/elements/empty-state.d.ts +52 -0
  103. package/dist/elements/empty-state.js +98 -0
  104. package/dist/elements/end-of-turn-summary.d.ts +60 -0
  105. package/dist/elements/end-of-turn-summary.js +75 -0
  106. package/dist/elements/error-state.d.ts +29 -0
  107. package/dist/elements/error-state.js +55 -0
  108. package/dist/elements/feedback-dialog.d.ts +36 -0
  109. package/dist/elements/feedback-dialog.js +81 -0
  110. package/dist/elements/file-tree.d.ts +45 -0
  111. package/dist/elements/file-tree.js +84 -0
  112. package/dist/elements/flow-graph.d.ts +45 -0
  113. package/dist/elements/flow-graph.js +78 -0
  114. package/dist/elements/generative/chart.js +200 -0
  115. package/dist/elements/generative/faults.js +111 -0
  116. package/dist/elements/generative/icons.d.ts +41 -0
  117. package/dist/elements/generative/icons.js +190 -0
  118. package/dist/elements/generative/intrinsics.js +483 -0
  119. package/dist/elements/generative/spec.d.ts +110 -0
  120. package/dist/elements/generative/spec.js +366 -0
  121. package/dist/elements/generative.css +1145 -0
  122. package/dist/elements/generative.d.ts +144 -0
  123. package/dist/elements/generative.js +126 -0
  124. package/dist/elements/guardrail-notice.d.ts +29 -0
  125. package/dist/elements/guardrail-notice.js +63 -0
  126. package/dist/elements/image-generation.d.ts +18 -0
  127. package/dist/elements/image-generation.js +64 -0
  128. package/dist/elements/index.d.ts +116 -0
  129. package/dist/elements/index.js +115 -0
  130. package/dist/elements/inline-citation.d.ts +43 -0
  131. package/dist/elements/inline-citation.js +93 -0
  132. package/dist/elements/job-progress.d.ts +49 -0
  133. package/dist/elements/job-progress.js +74 -0
  134. package/dist/elements/launcher-bubble.d.ts +34 -0
  135. package/dist/elements/launcher-bubble.js +72 -0
  136. package/dist/elements/live-region-announcer.d.ts +130 -0
  137. package/dist/elements/live-region-announcer.js +230 -0
  138. package/dist/elements/loading-state.d.ts +27 -0
  139. package/dist/elements/loading-state.js +36 -0
  140. package/dist/elements/map-answer.d.ts +38 -0
  141. package/dist/elements/map-answer.js +93 -0
  142. package/dist/elements/markdown.d.ts +131 -0
  143. package/dist/elements/markdown.js +528 -0
  144. package/dist/elements/math-block.d.ts +51 -0
  145. package/dist/elements/math-block.js +70 -0
  146. package/dist/elements/mcp-server-panel.d.ts +41 -0
  147. package/dist/elements/mcp-server-panel.js +115 -0
  148. package/dist/elements/memory-chips.d.ts +30 -0
  149. package/dist/elements/memory-chips.js +43 -0
  150. package/dist/elements/message-actions.d.ts +38 -0
  151. package/dist/elements/message-actions.js +71 -0
  152. package/dist/elements/message-attachment.d.ts +48 -0
  153. package/dist/elements/message-attachment.js +63 -0
  154. package/dist/elements/message-branches.d.ts +25 -0
  155. package/dist/elements/message-branches.js +65 -0
  156. package/dist/elements/message-pair.d.ts +33 -0
  157. package/dist/elements/message-pair.js +65 -0
  158. package/dist/elements/message-queue.d.ts +31 -0
  159. package/dist/elements/message-queue.js +80 -0
  160. package/dist/elements/message-timing.d.ts +33 -0
  161. package/dist/elements/message-timing.js +37 -0
  162. package/dist/elements/mobile-composer.d.ts +44 -0
  163. package/dist/elements/mobile-composer.js +88 -0
  164. package/dist/elements/model-picker.d.ts +38 -0
  165. package/dist/elements/model-picker.js +69 -0
  166. package/dist/elements/number-ticker.d.ts +18 -0
  167. package/dist/elements/number-ticker.js +47 -0
  168. package/dist/elements/onboarding.d.ts +30 -0
  169. package/dist/elements/onboarding.js +75 -0
  170. package/dist/elements/permission-grant.d.ts +35 -0
  171. package/dist/elements/permission-grant.js +86 -0
  172. package/dist/elements/permission-scopes.d.ts +215 -0
  173. package/dist/elements/permission-scopes.js +249 -0
  174. package/dist/elements/prompt-library.d.ts +43 -0
  175. package/dist/elements/prompt-library.js +117 -0
  176. package/dist/elements/queue-dock.d.ts +101 -0
  177. package/dist/elements/queue-dock.js +132 -0
  178. package/dist/elements/quota-banner.d.ts +26 -0
  179. package/dist/elements/quota-banner.js +66 -0
  180. package/dist/elements/quote-reply.d.ts +44 -0
  181. package/dist/elements/quote-reply.js +79 -0
  182. package/dist/elements/range.d.ts +29 -0
  183. package/dist/elements/range.js +45 -0
  184. package/dist/elements/read-aloud.d.ts +45 -0
  185. package/dist/elements/read-aloud.js +75 -0
  186. package/dist/elements/reasoning-effort.d.ts +36 -0
  187. package/dist/elements/reasoning-effort.js +67 -0
  188. package/dist/elements/reasoning-panel.d.ts +46 -0
  189. package/dist/elements/reasoning-panel.js +75 -0
  190. package/dist/elements/recommendation-card.d.ts +45 -0
  191. package/dist/elements/recommendation-card.js +83 -0
  192. package/dist/elements/regenerate-menu.d.ts +45 -0
  193. package/dist/elements/regenerate-menu.js +51 -0
  194. package/dist/elements/replay.d.ts +217 -0
  195. package/dist/elements/replay.js +498 -0
  196. package/dist/elements/research-report.d.ts +38 -0
  197. package/dist/elements/research-report.js +69 -0
  198. package/dist/elements/retrieval-chunks.d.ts +43 -0
  199. package/dist/elements/retrieval-chunks.js +81 -0
  200. package/dist/elements/revert-dock.d.ts +159 -0
  201. package/dist/elements/revert-dock.js +327 -0
  202. package/dist/elements/reviewable-diff.d.ts +45 -0
  203. package/dist/elements/reviewable-diff.js +110 -0
  204. package/dist/elements/risk-badge.d.ts +52 -0
  205. package/dist/elements/risk-badge.js +91 -0
  206. package/dist/elements/schedule-card.d.ts +42 -0
  207. package/dist/elements/schedule-card.js +90 -0
  208. package/dist/elements/score-breakdown.d.ts +47 -0
  209. package/dist/elements/score-breakdown.js +82 -0
  210. package/dist/elements/scroll-anchor.d.ts +32 -0
  211. package/dist/elements/scroll-anchor.js +121 -0
  212. package/dist/elements/settings-panel.d.ts +52 -0
  213. package/dist/elements/settings-panel.js +107 -0
  214. package/dist/elements/shared-conversation.d.ts +39 -0
  215. package/dist/elements/shared-conversation.js +68 -0
  216. package/dist/elements/sources.d.ts +33 -0
  217. package/dist/elements/sources.js +61 -0
  218. package/dist/elements/speaker-identity.d.ts +32 -0
  219. package/dist/elements/speaker-identity.js +51 -0
  220. package/dist/elements/spec-sheet.d.ts +31 -0
  221. package/dist/elements/spec-sheet.js +45 -0
  222. package/dist/elements/stopped-run.d.ts +22 -0
  223. package/dist/elements/stopped-run.js +50 -0
  224. package/dist/elements/streaming-text.d.ts +31 -0
  225. package/dist/elements/streaming-text.js +45 -0
  226. package/dist/elements/subagent-list.d.ts +37 -0
  227. package/dist/elements/subagent-list.js +79 -0
  228. package/dist/elements/suggestions.d.ts +30 -0
  229. package/dist/elements/suggestions.js +36 -0
  230. package/dist/elements/surfaces.d.ts +85 -0
  231. package/dist/elements/surfaces.js +107 -0
  232. package/dist/elements/tail-status.d.ts +131 -0
  233. package/dist/elements/tail-status.js +94 -0
  234. package/dist/elements/terminal-block.d.ts +29 -0
  235. package/dist/elements/terminal-block.js +54 -0
  236. package/dist/elements/thinking-indicator.d.ts +18 -0
  237. package/dist/elements/thinking-indicator.js +36 -0
  238. package/dist/elements/thread-list.d.ts +35 -0
  239. package/dist/elements/thread-list.js +68 -0
  240. package/dist/elements/thread-search.d.ts +42 -0
  241. package/dist/elements/thread-search.js +99 -0
  242. package/dist/elements/timeline.d.ts +37 -0
  243. package/dist/elements/timeline.js +46 -0
  244. package/dist/elements/todo-list.d.ts +42 -0
  245. package/dist/elements/todo-list.js +59 -0
  246. package/dist/elements/tool-call.d.ts +41 -0
  247. package/dist/elements/tool-call.js +85 -0
  248. package/dist/elements/tool-error.d.ts +39 -0
  249. package/dist/elements/tool-error.js +76 -0
  250. package/dist/elements/tool-group.d.ts +45 -0
  251. package/dist/elements/tool-group.js +71 -0
  252. package/dist/elements/tool-timeline.d.ts +65 -0
  253. package/dist/elements/tool-timeline.js +88 -0
  254. package/dist/elements/trace-waterfall.d.ts +37 -0
  255. package/dist/elements/trace-waterfall.js +69 -0
  256. package/dist/elements/transcript-rules.d.ts +67 -0
  257. package/dist/elements/transcript-rules.js +95 -0
  258. package/dist/elements/turn-footer.d.ts +74 -0
  259. package/dist/elements/turn-footer.js +101 -0
  260. package/dist/elements/typing-indicator.d.ts +16 -0
  261. package/dist/elements/typing-indicator.js +51 -0
  262. package/dist/elements/verdict-row.d.ts +89 -0
  263. package/dist/elements/verdict-row.js +150 -0
  264. package/dist/elements/vocabulary.d.ts +612 -0
  265. package/dist/elements/vocabulary.js +611 -0
  266. package/dist/elements/voice-conversation.d.ts +49 -0
  267. package/dist/elements/voice-conversation.js +123 -0
  268. package/dist/elements/web-preview.d.ts +32 -0
  269. package/dist/elements/web-preview.js +66 -0
  270. package/dist/elements/web-search.d.ts +37 -0
  271. package/dist/elements/web-search.js +66 -0
  272. package/dist/elements/work-collapse.d.ts +103 -0
  273. package/dist/elements/work-collapse.js +131 -0
  274. package/dist/forms/_chassis.d.ts +104 -4
  275. package/dist/forms/_chassis.js +104 -4
  276. package/dist/forms/input-group.d.ts +8 -3
  277. package/dist/forms/input-group.js +8 -3
  278. package/dist/forms/number-field.d.ts +3 -2
  279. package/dist/forms/number-field.js +3 -2
  280. package/dist/icons/containers.d.ts +89 -0
  281. package/dist/icons/containers.js +295 -0
  282. package/dist/icons/index.d.ts +2 -0
  283. package/dist/index.d.ts +12 -6
  284. package/dist/index.js +5 -1
  285. package/dist/instruments/_data-row.js +118 -0
  286. package/dist/instruments/data-row.d.ts +94 -0
  287. package/dist/instruments/data-row.js +151 -0
  288. package/dist/instruments/data-tree.d.ts +126 -0
  289. package/dist/instruments/data-tree.js +303 -0
  290. package/dist/instruments/index.d.ts +5 -2
  291. package/dist/instruments/index.js +4 -1
  292. package/dist/instruments/ledger.d.ts +105 -0
  293. package/dist/instruments/ledger.js +114 -0
  294. package/dist/instruments/table.d.ts +70 -2
  295. package/dist/instruments/table.js +133 -39
  296. package/dist/instruments/two-step-button.js +25 -6
  297. package/dist/layout/sidebar.d.ts +19 -1
  298. package/dist/layout/sidebar.js +19 -1
  299. package/dist/primitives/button.js +11 -1
  300. package/dist/primitives/chip.d.ts +35 -9
  301. package/dist/primitives/chip.js +97 -11
  302. package/dist/system/agent-skin.d.ts +27 -0
  303. package/dist/system/agent-skin.js +20 -0
  304. package/dist/system/portal.d.ts +5 -3
  305. package/dist/system/portal.js +19 -5
  306. package/dist/system/theme-provider.js +54 -9
  307. package/dist/system/use-density.d.ts +9 -0
  308. package/dist/system/use-density.js +9 -0
  309. package/dist/system/use-isomorphic-layout-effect.js +19 -1
  310. package/dist/theming/_presets.d.ts +1 -1
  311. package/dist/theming/_presets.js +74 -11
  312. package/dist/theming/contrast.d.ts +16 -4
  313. package/dist/theming/contrast.js +33 -6
  314. package/dist/theming/create-theme.d.ts +6 -2
  315. package/dist/theming/create-theme.js +32 -5
  316. package/dist/theming/serialize.d.ts +10 -1
  317. package/dist/theming/serialize.js +62 -8
  318. package/manifest/components/activity-graph.json +88 -0
  319. package/manifest/components/agent-card.json +120 -0
  320. package/manifest/components/agent-handoff.json +87 -0
  321. package/manifest/components/agent-mode-badge.json +84 -0
  322. package/manifest/components/agent-plan.json +67 -0
  323. package/manifest/components/agent-status.json +73 -0
  324. package/manifest/components/agent-surface.json +78 -0
  325. package/manifest/components/alert-dialog.json +1 -1
  326. package/manifest/components/animated-number.json +67 -0
  327. package/manifest/components/app-shell.json +142 -9
  328. package/manifest/components/approval-card.json +106 -0
  329. package/manifest/components/artifact-card.json +81 -0
  330. package/manifest/components/audience-icon.json +52 -0
  331. package/manifest/components/autocomplete.json +2 -0
  332. package/manifest/components/background-inbox.json +71 -0
  333. package/manifest/components/branch-picker.json +124 -0
  334. package/manifest/components/button.json +1 -0
  335. package/manifest/components/canvas-split-body.json +62 -0
  336. package/manifest/components/canvas-split-document.json +54 -0
  337. package/manifest/components/canvas-split-header.json +83 -0
  338. package/manifest/components/canvas-split-line.json +62 -0
  339. package/manifest/components/canvas-split-message.json +62 -0
  340. package/manifest/components/canvas-split-thread.json +54 -0
  341. package/manifest/components/canvas-split.json +60 -0
  342. package/manifest/components/catalogue-icon.json +52 -0
  343. package/manifest/components/channel-beta-icon.json +52 -0
  344. package/manifest/components/channel-released-icon.json +52 -0
  345. package/manifest/components/chart.json +93 -0
  346. package/manifest/components/chat-empty-state.json +55 -0
  347. package/manifest/components/chat-panel-assistant-message.json +51 -0
  348. package/manifest/components/chat-panel-composer.json +66 -0
  349. package/manifest/components/chat-panel-messages.json +51 -0
  350. package/manifest/components/chat-panel-typing.json +51 -0
  351. package/manifest/components/chat-panel-user-message.json +51 -0
  352. package/manifest/components/chat-panel.json +57 -0
  353. package/manifest/components/checkpoint-history.json +80 -0
  354. package/manifest/components/chip.json +24 -12
  355. package/manifest/components/clamp.json +102 -0
  356. package/manifest/components/cli-tool-icon.json +52 -0
  357. package/manifest/components/code-diff.json +87 -0
  358. package/manifest/components/code-runner.json +97 -0
  359. package/manifest/components/color-field.json +2 -0
  360. package/manifest/components/color-picker.json +2 -0
  361. package/manifest/components/combobox.json +2 -0
  362. package/manifest/components/compaction-row.json +100 -0
  363. package/manifest/components/comparison-card.json +83 -0
  364. package/manifest/components/composer-actions.json +65 -0
  365. package/manifest/components/composer-attach-button.json +65 -0
  366. package/manifest/components/composer-attachment-chip.json +75 -0
  367. package/manifest/components/composer-attachments.json +60 -0
  368. package/manifest/components/composer-bar.json +73 -0
  369. package/manifest/components/composer-command-item.json +79 -0
  370. package/manifest/components/composer-context.json +67 -0
  371. package/manifest/components/composer-input.json +73 -0
  372. package/manifest/components/composer-menu-item.json +72 -0
  373. package/manifest/components/composer-menu.json +79 -0
  374. package/manifest/components/composer-model-item.json +75 -0
  375. package/manifest/components/composer-model-trigger.json +75 -0
  376. package/manifest/components/composer-person-item.json +79 -0
  377. package/manifest/components/composer-send.json +80 -0
  378. package/manifest/components/composer-toolbar.json +65 -0
  379. package/manifest/components/composer-voice-button.json +68 -0
  380. package/manifest/components/composer-voice.json +75 -0
  381. package/manifest/components/composer.json +2 -0
  382. package/manifest/components/computer-use.json +84 -0
  383. package/manifest/components/confidence-marker.json +74 -0
  384. package/manifest/components/connection-state.json +84 -0
  385. package/manifest/components/context-breakdown.json +65 -0
  386. package/manifest/components/context-usage.json +85 -0
  387. package/manifest/components/conversation-search.json +92 -0
  388. package/manifest/components/cost-meter.json +74 -0
  389. package/manifest/components/cue-portal-frame.json +1 -1
  390. package/manifest/components/data-row.json +203 -0
  391. package/manifest/components/data-tree.json +151 -0
  392. package/manifest/components/date-field.json +2 -0
  393. package/manifest/components/date-picker.json +2 -0
  394. package/manifest/components/date-range-picker.json +2 -0
  395. package/manifest/components/day-separator.json +58 -0
  396. package/manifest/components/delegation-card.json +1 -1
  397. package/manifest/components/density.json +1 -1
  398. package/manifest/components/diagram.json +100 -0
  399. package/manifest/components/document-reference.json +90 -0
  400. package/manifest/components/draft-restore.json +82 -0
  401. package/manifest/components/drawer.json +1 -1
  402. package/manifest/components/dropdown-menu.json +1 -1
  403. package/manifest/components/edit-message.json +105 -0
  404. package/manifest/components/elements-command-palette.json +100 -0
  405. package/manifest/components/elements-composer.json +71 -0
  406. package/manifest/components/elements-data-table.json +68 -0
  407. package/manifest/components/elements-timeline.json +69 -0
  408. package/manifest/components/elicitation-form.json +103 -0
  409. package/manifest/components/empty-state-composer.json +64 -0
  410. package/manifest/components/empty-state-greeting.json +49 -0
  411. package/manifest/components/empty-state-suggestion.json +57 -0
  412. package/manifest/components/empty-state-suggestions.json +49 -0
  413. package/manifest/components/end-of-turn-summary.json +77 -0
  414. package/manifest/components/env-var-input.json +2 -0
  415. package/manifest/components/error-state.json +80 -0
  416. package/manifest/components/feedback-dialog.json +107 -0
  417. package/manifest/components/file-tree.json +83 -0
  418. package/manifest/components/flow-graph.json +75 -0
  419. package/manifest/components/folder-icon.json +52 -0
  420. package/manifest/components/frac.json +59 -0
  421. package/manifest/components/generation-loader.json +64 -0
  422. package/manifest/components/generative-ui.json +93 -0
  423. package/manifest/components/guardrail-notice.json +91 -0
  424. package/manifest/components/hover-card.json +1 -1
  425. package/manifest/components/image-generation.json +67 -0
  426. package/manifest/components/info-tip.json +1 -1
  427. package/manifest/components/inline-citation.json +77 -0
  428. package/manifest/components/input-group.json +4 -2
  429. package/manifest/components/input.json +3 -1
  430. package/manifest/components/job-progress.json +96 -0
  431. package/manifest/components/launcher-bubble.json +105 -0
  432. package/manifest/components/ledger.json +187 -0
  433. package/manifest/components/live-region-announcer.json +79 -0
  434. package/manifest/components/map-answer.json +83 -0
  435. package/manifest/components/markdown-text.json +94 -0
  436. package/manifest/components/math-block.json +74 -0
  437. package/manifest/components/mcp-server-icon.json +52 -0
  438. package/manifest/components/mcp-server-panel.json +87 -0
  439. package/manifest/components/memory-chips.json +65 -0
  440. package/manifest/components/message-actions.json +99 -0
  441. package/manifest/components/message-attachments.json +63 -0
  442. package/manifest/components/message-branches.json +71 -0
  443. package/manifest/components/message-list.json +1 -1
  444. package/manifest/components/message-pair.json +86 -0
  445. package/manifest/components/message-queue.json +74 -0
  446. package/manifest/components/message-timing.json +62 -0
  447. package/manifest/components/mobile-composer.json +126 -0
  448. package/manifest/components/model-picker.json +76 -0
  449. package/manifest/components/multi-select.json +2 -0
  450. package/manifest/components/musical-time-input.json +2 -0
  451. package/manifest/components/node-card.json +1 -1
  452. package/manifest/components/node-handle.json +1 -1
  453. package/manifest/components/number-field.json +3 -1
  454. package/manifest/components/number-ticker.json +61 -0
  455. package/manifest/components/onboarding.json +84 -0
  456. package/manifest/components/otp-field.json +9 -7
  457. package/manifest/components/password-input.json +2 -0
  458. package/manifest/components/permission-grant.json +92 -0
  459. package/manifest/components/permission-scopes.json +139 -0
  460. package/manifest/components/popover.json +1 -1
  461. package/manifest/components/prompt-library.json +99 -0
  462. package/manifest/components/queue-dock.json +110 -0
  463. package/manifest/components/quota-banner.json +94 -0
  464. package/manifest/components/quote-reply.json +105 -0
  465. package/manifest/components/read-aloud.json +111 -0
  466. package/manifest/components/reasoning-effort.json +81 -0
  467. package/manifest/components/reasoning-panel.json +108 -0
  468. package/manifest/components/recommendation-card.json +107 -0
  469. package/manifest/components/regenerate-menu.json +89 -0
  470. package/manifest/components/replay-player.json +102 -0
  471. package/manifest/components/research-report.json +76 -0
  472. package/manifest/components/retrieval-chunks.json +84 -0
  473. package/manifest/components/revert-dock.json +150 -0
  474. package/manifest/components/reviewable-diff.json +93 -0
  475. package/manifest/components/risk-badge.json +74 -0
  476. package/manifest/components/schedule-card.json +101 -0
  477. package/manifest/components/score-breakdown.json +91 -0
  478. package/manifest/components/scroll-anchor.json +72 -0
  479. package/manifest/components/scroll-area.json +7 -7
  480. package/manifest/components/scrub-input.json +2 -0
  481. package/manifest/components/search-input.json +9 -7
  482. package/manifest/components/segmented-control.json +21 -21
  483. package/manifest/components/select.json +1 -0
  484. package/manifest/components/settings-panel.json +118 -0
  485. package/manifest/components/shared-conversation.json +89 -0
  486. package/manifest/components/shimmer-label.json +59 -0
  487. package/manifest/components/skill-icon.json +52 -0
  488. package/manifest/components/sources.json +83 -0
  489. package/manifest/components/speaker-identity.json +61 -0
  490. package/manifest/components/spec-sheet.json +80 -0
  491. package/manifest/components/stack-icon.json +52 -0
  492. package/manifest/components/stacks-matrix-icon.json +52 -0
  493. package/manifest/components/stat.json +1 -1
  494. package/manifest/components/status-bar.json +146 -12
  495. package/manifest/components/status-dot.json +1 -1
  496. package/manifest/components/stopped-run.json +81 -0
  497. package/manifest/components/streaming-text.json +71 -0
  498. package/manifest/components/sub.json +44 -0
  499. package/manifest/components/subagent-list.json +88 -0
  500. package/manifest/components/suggestions.json +84 -0
  501. package/manifest/components/sup.json +44 -0
  502. package/manifest/components/swap-label.json +71 -0
  503. package/manifest/components/table-scroll-region.json +6 -0
  504. package/manifest/components/table.json +88 -4
  505. package/manifest/components/tags-input.json +2 -0
  506. package/manifest/components/tail-status.json +109 -0
  507. package/manifest/components/terminal-block.json +91 -0
  508. package/manifest/components/textarea.json +3 -1
  509. package/manifest/components/theme-provider.json +2 -2
  510. package/manifest/components/thinking-indicator.json +63 -0
  511. package/manifest/components/thread-list.json +76 -0
  512. package/manifest/components/thread-search.json +90 -0
  513. package/manifest/components/threshold-rail.json +2 -2
  514. package/manifest/components/time-boundary.json +62 -0
  515. package/manifest/components/time-field.json +2 -0
  516. package/manifest/components/timeline.json +1 -1
  517. package/manifest/components/title-bar.json +1 -1
  518. package/manifest/components/todo-list.json +69 -0
  519. package/manifest/components/toggle-group.json +9 -7
  520. package/manifest/components/toggle.json +2 -0
  521. package/manifest/components/token-editor.json +1 -1
  522. package/manifest/components/tool-call-card.json +200 -0
  523. package/manifest/components/tool-call.json +119 -0
  524. package/manifest/components/tool-error.json +114 -0
  525. package/manifest/components/tool-group.json +83 -0
  526. package/manifest/components/tool-timeline.json +119 -0
  527. package/manifest/components/toolbar.json +7 -7
  528. package/manifest/components/tooltip.json +1 -1
  529. package/manifest/components/trace-waterfall.json +74 -0
  530. package/manifest/components/turn-footer.json +105 -0
  531. package/manifest/components/typing-indicator.json +53 -0
  532. package/manifest/components/unread-divider.json +55 -0
  533. package/manifest/components/usage-chart.json +1 -1
  534. package/manifest/components/verdict-row.json +91 -0
  535. package/manifest/components/voice-conversation.json +109 -0
  536. package/manifest/components/web-preview.json +87 -0
  537. package/manifest/components/web-search.json +92 -0
  538. package/manifest/components/work-collapse.json +102 -0
  539. package/manifest/manifest.json +2736 -60
  540. package/manifest/tokens.json +22 -1
  541. package/package.json +44 -2
@@ -0,0 +1,104 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, inkButton, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { ArrowUpIcon } from "lucide-react";
6
+ //#region src/elements/chat-panel.tsx
7
+ /**
8
+ * The whole family working together: a message, a pause, a streamed reply.
9
+ *
10
+ * @example
11
+ * import {
12
+ * ChatPanel,
13
+ * ChatPanelComposer,
14
+ * ChatPanelMessages,
15
+ * ChatPanelTyping,
16
+ * ChatPanelUserMessage,
17
+ * } from "@cueplusplus/ui/elements";
18
+ *
19
+ * <ChatPanel>
20
+ * <ChatPanelMessages>
21
+ * <ChatPanelUserMessage>Why did my draft disappear?</ChatPanelUserMessage>
22
+ * <ChatPanelTyping />
23
+ * </ChatPanelMessages>
24
+ * <ChatPanelComposer placeholder="Message" onSend={send} />
25
+ * </ChatPanel>
26
+ */
27
+ function ChatPanel({ className, ...props }) {
28
+ return /* @__PURE__ */ jsx("div", {
29
+ "data-slot": "chat-panel",
30
+ className: cn(paper, "flex h-[270px] w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
31
+ ...props
32
+ });
33
+ }
34
+ /**
35
+ * The scrolling transcript inside a `ChatPanel`. Bottom-aligned, so a short
36
+ * conversation sits on the composer rather than floating at the top of the panel.
37
+ */
38
+ function ChatPanelMessages({ className, ...props }) {
39
+ return /* @__PURE__ */ jsx("div", {
40
+ "data-slot": "chat-panel-messages",
41
+ className: cn("flex flex-1 flex-col justify-end gap-2.5 overflow-y-auto p-4", className),
42
+ ...props
43
+ });
44
+ }
45
+ /** One message from the person, drawn as a filled bubble on the trailing edge. */
46
+ function ChatPanelUserMessage({ className, ...props }) {
47
+ return /* @__PURE__ */ jsx("div", {
48
+ "data-slot": "chat-panel-user-message",
49
+ className: cn(field, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in self-end rounded-(--radius-overlay) px-3 py-1.5 text-(length:--cue-text-ui) duration-300", className),
50
+ ...props
51
+ });
52
+ }
53
+ /** One message from the model: plain text on the leading edge, no bubble. */
54
+ function ChatPanelAssistantMessage({ className, ...props }) {
55
+ return /* @__PURE__ */ jsx("p", {
56
+ "data-slot": "chat-panel-assistant-message",
57
+ className: cn("text-fg-muted max-w-[85%] self-start text-(length:--cue-text-ui) leading-relaxed", className),
58
+ ...props
59
+ });
60
+ }
61
+ /** The three-dot rest state, for the gap between sending and the first token. */
62
+ function ChatPanelTyping({ className, ...props }) {
63
+ return /* @__PURE__ */ jsx("div", {
64
+ "data-slot": "chat-panel-typing",
65
+ className: cn("cue-elements-fade-in cue-elements-animate-in flex gap-1 self-start px-1 duration-300", className),
66
+ ...props,
67
+ children: [
68
+ "-0.32s",
69
+ "-0.16s",
70
+ "0s"
71
+ ].map((delay) => /* @__PURE__ */ jsx("span", {
72
+ "aria-hidden": true,
73
+ className: "bg-surface-3 size-1 animate-bounce rounded-full motion-reduce:animate-none",
74
+ style: {
75
+ animationDelay: delay,
76
+ animationDuration: "1.1s"
77
+ }
78
+ }, delay))
79
+ });
80
+ }
81
+ /**
82
+ * The panel's composer row. It is a display of a composer rather than a working one —
83
+ * the placeholder is a string and the send button takes a handler.
84
+ */
85
+ function ChatPanelComposer({ placeholder, onSend, className, ...props }) {
86
+ return /* @__PURE__ */ jsxs("div", {
87
+ "data-slot": "chat-panel-composer",
88
+ className: cn(field, "mx-3 mb-3 flex h-10 shrink-0 items-center justify-between rounded-full py-1.5 ps-4 pe-1.5", className),
89
+ ...props,
90
+ children: [/* @__PURE__ */ jsx("span", {
91
+ className: "text-fg-subtle text-(length:--cue-text-body)",
92
+ children: placeholder
93
+ }), /* @__PURE__ */ jsx("button", {
94
+ type: "button",
95
+ "aria-label": "Send",
96
+ onClick: onSend,
97
+ disabled: !onSend,
98
+ className: cn(inkButton, "flex size-7 items-center justify-center rounded-full disabled:pointer-events-none disabled:opacity-30"),
99
+ children: /* @__PURE__ */ jsx(ArrowUpIcon, { className: "size-3.5" })
100
+ })]
101
+ });
102
+ }
103
+ //#endregion
104
+ export { ChatPanel, ChatPanelAssistantMessage, ChatPanelComposer, ChatPanelMessages, ChatPanelTyping, ChatPanelUserMessage };
@@ -0,0 +1,31 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/checkpoint-history.d.ts
3
+ /** One point the conversation can fall back to, and how much a fallback would undo. */
4
+ interface Checkpoint {
5
+ /** Stable identity, compared against currentId and reported by onRestore. */
6
+ id: string;
7
+ /** What the checkpoint captured. */
8
+ label: string;
9
+ /** Pre-formatted time. */
10
+ at: string;
11
+ /** How many files that checkpoint touched. */
12
+ files: number;
13
+ }
14
+ /**
15
+ * Points you can fall back to, with what each one would give back.
16
+ *
17
+ * @example
18
+ * import { CheckpointHistory } from "@cueplusplus/ui/elements";
19
+ *
20
+ * <CheckpointHistory checkpoints={checkpoints} currentId="3" onRestore={restore} />
21
+ */
22
+ declare function CheckpointHistory({ checkpoints, currentId, onRestore, className, ...props }: Omit<ComponentProps<"div">, "children" | "checkpoints" | "currentId" | "onRestore"> & {
23
+ /** Points in the run you can fall back to, oldest first. */
24
+ checkpoints: readonly Checkpoint[];
25
+ /** Where the run stands. Everything after it dims, since restoring would discard it. */
26
+ currentId: string;
27
+ /** Called with the checkpoint to return to. */
28
+ onRestore?: (id: string) => void;
29
+ }): import("react").JSX.Element;
30
+ //#endregion
31
+ export { Checkpoint, CheckpointHistory };
@@ -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 };