@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,110 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { codeScroll, codeSurface, inkButton, mono, paper } from "./surfaces.js";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { CheckIcon, XIcon } from "lucide-react";
6
+ //#region src/elements/reviewable-diff.tsx
7
+ const GUTTER = {
8
+ context: "",
9
+ added: "+",
10
+ removed: "−"
11
+ };
12
+ /**
13
+ * The same diff, but each hunk is a decision: keep it, discard it, apply what
14
+ * survived.
15
+ *
16
+ * @example
17
+ * import { ReviewableDiff } from "@cueplusplus/ui/elements";
18
+ *
19
+ * <ReviewableDiff
20
+ * filename="composer.tsx"
21
+ * hunks={hunks}
22
+ * onKeep={(id) => decide(id, "kept")}
23
+ * onDiscard={(id) => decide(id, "discarded")}
24
+ * onApply={commit}
25
+ * />
26
+ */
27
+ function ReviewableDiff({ filename, hunks, onKeep, onDiscard, onApply, className, ...props }) {
28
+ const kept = hunks.filter((hunk) => hunk.decision === "kept").length;
29
+ const pending = hunks.filter((hunk) => hunk.decision === "pending").length;
30
+ return /* @__PURE__ */ jsxs("div", {
31
+ "data-slot": "reviewable-diff",
32
+ className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
33
+ ...props,
34
+ children: [
35
+ /* @__PURE__ */ jsxs("div", {
36
+ className: "flex items-center justify-between px-4 pt-3 pb-2",
37
+ children: [/* @__PURE__ */ jsx("span", {
38
+ className: "font-mono text-(length:--cue-text-ui)",
39
+ children: filename
40
+ }), /* @__PURE__ */ jsxs("span", {
41
+ className: cn(mono, "text-fg-subtle tabular-nums"),
42
+ children: [
43
+ kept,
44
+ " of ",
45
+ hunks.length,
46
+ " kept"
47
+ ]
48
+ })]
49
+ }),
50
+ /* @__PURE__ */ jsx("div", {
51
+ className: "flex flex-col",
52
+ children: hunks.map((hunk) => /* @__PURE__ */ jsxs("div", {
53
+ className: cn("border-border border-t transition-opacity duration-300", hunk.decision === "discarded" && "opacity-40"),
54
+ children: [/* @__PURE__ */ jsxs("div", {
55
+ className: "flex items-center gap-2 px-4 py-1.5",
56
+ children: [/* @__PURE__ */ jsx("span", {
57
+ className: cn(mono, "text-fg-subtle"),
58
+ children: hunk.range
59
+ }), /* @__PURE__ */ jsx("span", {
60
+ className: "ms-auto flex items-center gap-1",
61
+ children: hunk.decision === "pending" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("button", {
62
+ type: "button",
63
+ "aria-label": `Discard hunk ${hunk.range}`,
64
+ onClick: () => onDiscard?.(hunk.id),
65
+ className: "text-fg-muted hover:bg-surface-2 hover:text-fg flex h-6 items-center gap-1 rounded-full px-2 text-(length:--cue-text-label) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.96]",
66
+ children: [/* @__PURE__ */ jsx(XIcon, { className: "size-3" }), "Discard"]
67
+ }), /* @__PURE__ */ jsxs("button", {
68
+ type: "button",
69
+ "aria-label": `Keep hunk ${hunk.range}`,
70
+ onClick: () => onKeep?.(hunk.id),
71
+ className: "flex h-6 items-center gap-1 rounded-full bg-ok/12 px-2 text-(length:--cue-text-label) font-medium text-ok transition-[background-color,scale] duration-150 hover:bg-ok/20 active:scale-[0.96]",
72
+ children: [/* @__PURE__ */ jsx(CheckIcon, { className: "size-3" }), "Keep"]
73
+ })] }) : /* @__PURE__ */ jsx("span", {
74
+ className: cn(mono, "cue-elements-fade-in cue-elements-animate-in duration-300", hunk.decision === "kept" ? "text-ok" : "text-fg-subtle"),
75
+ children: hunk.decision
76
+ })
77
+ })]
78
+ }), /* @__PURE__ */ jsx("div", {
79
+ className: cn(codeScroll, "pb-1.5 font-mono text-(length:--cue-text-ui)"),
80
+ children: /* @__PURE__ */ jsx("div", {
81
+ className: codeSurface,
82
+ children: hunk.lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
83
+ className: cn("flex px-4 py-0.5 leading-relaxed whitespace-pre", line.kind === "context" && "text-fg-subtle", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
84
+ children: [/* @__PURE__ */ jsx("span", {
85
+ className: "w-4 shrink-0 select-none",
86
+ children: GUTTER[line.kind]
87
+ }), /* @__PURE__ */ jsx("span", { children: line.text })]
88
+ }, `${hunk.id}-${i}`))
89
+ })
90
+ })]
91
+ }, hunk.id))
92
+ }),
93
+ /* @__PURE__ */ jsxs("div", {
94
+ className: "border-border flex items-center justify-between border-t px-4 py-2.5",
95
+ children: [/* @__PURE__ */ jsx("span", {
96
+ className: cn(mono, "text-fg-subtle"),
97
+ children: pending > 0 ? `${pending} left to review` : "All reviewed"
98
+ }), /* @__PURE__ */ jsxs("button", {
99
+ type: "button",
100
+ disabled: pending > 0,
101
+ onClick: onApply,
102
+ className: cn(inkButton, "flex h-7 items-center rounded-full px-3 text-(length:--cue-text-ui) font-medium disabled:pointer-events-none disabled:opacity-30"),
103
+ children: ["Apply ", kept]
104
+ })]
105
+ })
106
+ ]
107
+ });
108
+ }
109
+ //#endregion
110
+ export { ReviewableDiff };
@@ -0,0 +1,52 @@
1
+ import { SecurityRisk } from "./vocabulary.js";
2
+ import * as React from "react";
3
+ //#region src/elements/risk-badge.d.ts
4
+ interface RiskBadgeProps extends Omit<React.ComponentPropsWithoutRef<"span">, "children"> {
5
+ /**
6
+ * What the runtime says this call could do: `unknown`, `low`, `medium` or
7
+ * `high`. Stamped as `data-risk`, and as `data-color` for the tone, so a
8
+ * console can restyle the row from the attribute rather than from a prop.
9
+ */
10
+ risk: SecurityRisk;
11
+ /**
12
+ * What it is called. Defaults to `RISK_LABELS[risk]` — `High risk`, not
13
+ * `HIGH`, because the badge sits inline beside a duration and a diff stat and
14
+ * a bare adjective there is a number about something.
15
+ */
16
+ label?: string;
17
+ /**
18
+ * Why, in the words the products that guess at risk already use: `outside
19
+ * your workspace`, `protected file`, `arbitrary network access`. Drawn beside
20
+ * the label, truncating before the label does.
21
+ */
22
+ reason?: string;
23
+ }
24
+ /**
25
+ * How dangerous this call is, said out loud instead of implied.
26
+ *
27
+ * One of the two elements the field study found nobody shipping. Every agent UI
28
+ * knows which of its tools are frightening — that is what the approval buckets
29
+ * are — but the knowledge lives in the taxonomy rather than on the row, so a
30
+ * `curl` to an arbitrary host and a `cat` of a local file look alike until you
31
+ * read them. A runtime that scores its own actions can put the score on the
32
+ * row, and one element renders it for every tool that will ever exist.
33
+ *
34
+ * `unknown` is a first-class value and it is the default answer for a runtime
35
+ * with no scorer. The alternative — omitting the badge, or falling back to
36
+ * `low` — is how a UI ends up implying that unscored means safe.
37
+ *
38
+ * Colour is never alone: each risk has its own glyph and its own words, so the
39
+ * badge survives a colour-blind reader, a monochrome screenshot and a theme
40
+ * whose danger hue is somebody's brand red.
41
+ *
42
+ * @example
43
+ * import { RiskBadge } from "@cueplusplus/ui/elements";
44
+ *
45
+ * <RiskBadge risk="high" reason="arbitrary network access" />
46
+ * @example
47
+ * // The honest answer from a runtime that does not score its actions.
48
+ * <RiskBadge risk="unknown" />
49
+ */
50
+ declare const RiskBadge: React.ForwardRefExoticComponent<RiskBadgeProps & React.RefAttributes<HTMLSpanElement>>;
51
+ //#endregion
52
+ export { RiskBadge, RiskBadgeProps };
@@ -0,0 +1,91 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { RISK_LABELS } from "./vocabulary.js";
4
+ import * as React from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { CircleHelpIcon, OctagonAlertIcon, ShieldAlertIcon, ShieldCheckIcon } from "lucide-react";
7
+ //#region src/elements/risk-badge.tsx
8
+ /**
9
+ * What each risk paints, and the glyph that carries it without colour.
10
+ *
11
+ * Four rows rather than three: `unknown` is a real answer, and it is drawn in
12
+ * the family's neutral rather than in the low-risk green, because a runtime
13
+ * that does not score its actions must not be made to look like one that scored
14
+ * them all safe.
15
+ *
16
+ * The paint is written in the alpha form the whole group uses — `bg-danger/10`,
17
+ * not `bg-danger-soft` — so it composites at the point of use and follows an
18
+ * `AgentSurface` island. The derived `*-soft` tokens cannot.
19
+ */
20
+ const RISK_PAINT = {
21
+ unknown: {
22
+ tone: "border-border bg-fg/[0.06] text-fg-subtle",
23
+ glyph: CircleHelpIcon
24
+ },
25
+ low: {
26
+ tone: "border-ok/30 bg-ok/10 text-ok",
27
+ glyph: ShieldCheckIcon
28
+ },
29
+ medium: {
30
+ tone: "border-warn/30 bg-warn/10 text-warn",
31
+ glyph: ShieldAlertIcon
32
+ },
33
+ high: {
34
+ tone: "border-danger/40 bg-danger/15 text-danger",
35
+ glyph: OctagonAlertIcon
36
+ }
37
+ };
38
+ /**
39
+ * How dangerous this call is, said out loud instead of implied.
40
+ *
41
+ * One of the two elements the field study found nobody shipping. Every agent UI
42
+ * knows which of its tools are frightening — that is what the approval buckets
43
+ * are — but the knowledge lives in the taxonomy rather than on the row, so a
44
+ * `curl` to an arbitrary host and a `cat` of a local file look alike until you
45
+ * read them. A runtime that scores its own actions can put the score on the
46
+ * row, and one element renders it for every tool that will ever exist.
47
+ *
48
+ * `unknown` is a first-class value and it is the default answer for a runtime
49
+ * with no scorer. The alternative — omitting the badge, or falling back to
50
+ * `low` — is how a UI ends up implying that unscored means safe.
51
+ *
52
+ * Colour is never alone: each risk has its own glyph and its own words, so the
53
+ * badge survives a colour-blind reader, a monochrome screenshot and a theme
54
+ * whose danger hue is somebody's brand red.
55
+ *
56
+ * @example
57
+ * import { RiskBadge } from "@cueplusplus/ui/elements";
58
+ *
59
+ * <RiskBadge risk="high" reason="arbitrary network access" />
60
+ * @example
61
+ * // The honest answer from a runtime that does not score its actions.
62
+ * <RiskBadge risk="unknown" />
63
+ */
64
+ const RiskBadge = React.forwardRef(function RiskBadge({ risk, label, reason, className, ...elementProps }, ref) {
65
+ const { tone, glyph: Glyph } = RISK_PAINT[risk];
66
+ return /* @__PURE__ */ jsxs("span", {
67
+ ref,
68
+ "data-slot": "risk-badge",
69
+ "data-risk": risk,
70
+ "data-color": risk,
71
+ className: cn("inline-flex min-w-0 shrink items-center gap-1.5 rounded-full border px-2 py-0.5 text-(length:--cue-text-ui)", tone, className),
72
+ ...elementProps,
73
+ children: [
74
+ /* @__PURE__ */ jsx(Glyph, {
75
+ "aria-hidden": true,
76
+ className: "size-3.5 shrink-0"
77
+ }),
78
+ /* @__PURE__ */ jsx("span", {
79
+ className: "shrink-0 font-medium",
80
+ children: label ?? RISK_LABELS[risk]
81
+ }),
82
+ reason === void 0 ? null : /* @__PURE__ */ jsxs("span", {
83
+ "data-slot": "risk-badge-reason",
84
+ className: "min-w-0 truncate opacity-80",
85
+ children: ["· ", reason]
86
+ })
87
+ ]
88
+ });
89
+ });
90
+ //#endregion
91
+ export { RiskBadge };
@@ -0,0 +1,42 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/schedule-card.d.ts
3
+ /** One past run of a schedule: when it went, and whether it worked. */
4
+ interface ScheduleRun {
5
+ /** Identifies the run, and keys its row. */
6
+ id: string;
7
+ /** When it ran, already phrased — `Today 09:00`, `2h ago`. This element parses no dates. */
8
+ at: string;
9
+ /** Whether it succeeded, which decides the row's glyph and the word that ends it. */
10
+ ok: boolean;
11
+ }
12
+ /**
13
+ * A run that repeats on its own, with its cadence and how it has been doing.
14
+ *
15
+ * @example
16
+ * import { ScheduleCard } from "@cueplusplus/ui/elements";
17
+ *
18
+ * <ScheduleCard
19
+ * name="Triage the issue queue"
20
+ * cadence="every day at 06:00"
21
+ * nextRun="Tomorrow, 06:00"
22
+ * enabled
23
+ * history={history}
24
+ * onToggle={toggle}
25
+ * />
26
+ */
27
+ declare function ScheduleCard({ name, cadence, nextRun, enabled, history, onToggle, className, ...props }: Omit<ComponentProps<"div">, "children" | "name" | "cadence" | "nextRun" | "enabled" | "history" | "onToggle"> & {
28
+ /** What the scheduled run does. */
29
+ name: string;
30
+ /** Human-readable recurrence, not a cron string. */
31
+ cadence: string;
32
+ /** When it fires next. Replaced by paused when disabled. */
33
+ nextRun: string;
34
+ /** Whether the schedule is live. */
35
+ enabled: boolean;
36
+ /** Recent runs, so a silently failing schedule is visible. */
37
+ history: readonly ScheduleRun[];
38
+ /** Called when the schedule is paused or resumed. */
39
+ onToggle?: () => void;
40
+ }): import("react").JSX.Element;
41
+ //#endregion
42
+ export { ScheduleCard, ScheduleRun };
@@ -0,0 +1,90 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, mono, paper } from "./surfaces.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { CheckIcon, ClockIcon, XIcon } from "lucide-react";
6
+ //#region src/elements/schedule-card.tsx
7
+ /**
8
+ * A run that repeats on its own, with its cadence and how it has been doing.
9
+ *
10
+ * @example
11
+ * import { ScheduleCard } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <ScheduleCard
14
+ * name="Triage the issue queue"
15
+ * cadence="every day at 06:00"
16
+ * nextRun="Tomorrow, 06:00"
17
+ * enabled
18
+ * history={history}
19
+ * onToggle={toggle}
20
+ * />
21
+ */
22
+ function ScheduleCard({ name, cadence, nextRun, enabled, history, onToggle, className, ...props }) {
23
+ return /* @__PURE__ */ jsxs("div", {
24
+ "data-slot": "schedule-card",
25
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
26
+ ...props,
27
+ children: [
28
+ /* @__PURE__ */ jsxs("div", {
29
+ className: "flex items-center gap-2.5",
30
+ children: [
31
+ /* @__PURE__ */ jsx("span", {
32
+ className: "bg-surface-1 text-fg-muted flex size-7 shrink-0 items-center justify-center rounded-(--radius-surface)",
33
+ children: /* @__PURE__ */ jsx(ClockIcon, { className: "size-3.5" })
34
+ }),
35
+ /* @__PURE__ */ jsxs("div", {
36
+ className: "flex min-w-0 flex-1 flex-col",
37
+ children: [/* @__PURE__ */ jsx("span", {
38
+ className: "truncate text-(length:--cue-text-body) font-medium",
39
+ children: name
40
+ }), /* @__PURE__ */ jsx("span", {
41
+ className: cn(mono, "text-fg-subtle"),
42
+ children: cadence
43
+ })]
44
+ }),
45
+ /* @__PURE__ */ jsx("button", {
46
+ type: "button",
47
+ role: "switch",
48
+ "aria-checked": enabled,
49
+ "aria-label": `${enabled ? "Pause" : "Resume"} ${name}`,
50
+ onClick: onToggle,
51
+ className: cn("flex h-5 w-9 shrink-0 items-center rounded-full p-0.5 transition-colors duration-200", enabled ? "bg-accent" : "bg-surface-3"),
52
+ children: /* @__PURE__ */ jsx("span", { className: cn("bg-bg size-4 rounded-full transition-transform duration-200 motion-reduce:transition-none", enabled && "translate-x-4") })
53
+ })
54
+ ]
55
+ }),
56
+ /* @__PURE__ */ jsxs("div", {
57
+ className: cn(field, "flex items-baseline gap-2 rounded-(--radius-surface) px-3 py-2", !enabled && "opacity-45"),
58
+ children: [/* @__PURE__ */ jsx("span", {
59
+ className: cn(mono, "text-fg-subtle"),
60
+ children: "next"
61
+ }), /* @__PURE__ */ jsx("span", {
62
+ className: "text-fg-muted text-(length:--cue-text-body)",
63
+ children: enabled ? nextRun : "paused"
64
+ })]
65
+ }),
66
+ /* @__PURE__ */ jsxs("div", {
67
+ className: "flex flex-col gap-1",
68
+ children: [/* @__PURE__ */ jsx("span", {
69
+ className: cn(mono, "text-fg-subtle"),
70
+ children: "recent runs"
71
+ }), history.map((run) => /* @__PURE__ */ jsxs("div", {
72
+ className: "flex items-baseline gap-2",
73
+ children: [
74
+ run.ok ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-3 shrink-0 translate-y-0.5 text-ok" }) : /* @__PURE__ */ jsx(XIcon, { className: "size-3 shrink-0 translate-y-0.5 text-danger" }),
75
+ /* @__PURE__ */ jsx("span", {
76
+ className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-ui)",
77
+ children: run.at
78
+ }),
79
+ /* @__PURE__ */ jsx("span", {
80
+ className: cn(mono, "text-fg-subtle shrink-0"),
81
+ children: run.ok ? "ok" : "failed"
82
+ })
83
+ ]
84
+ }, run.id))]
85
+ })
86
+ ]
87
+ });
88
+ }
89
+ //#endregion
90
+ export { ScheduleCard };
@@ -0,0 +1,47 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/score-breakdown.d.ts
3
+ /**
4
+ * One line of the arithmetic behind a verdict: what was judged, how well, and how much
5
+ * it counted.
6
+ */
7
+ interface ScoreCriterion {
8
+ /** What is being scored. Truncates rather than wraps. */
9
+ label: string;
10
+ /**
11
+ * Score for this criterion, on the same scale as outOf. Its bar is drawn against
12
+ * outOf, so the two cannot drift apart.
13
+ */
14
+ score: number;
15
+ /** How much it counted toward the total. */
16
+ weight: number;
17
+ /** Why it scored that way. Worth writing for anything below full marks. */
18
+ note?: string;
19
+ }
20
+ /**
21
+ * A verdict with its arithmetic shown: criteria, weights, and what pulled it down.
22
+ *
23
+ * @example
24
+ * import { ScoreBreakdown } from "@cueplusplus/ui/elements";
25
+ *
26
+ * <ScoreBreakdown
27
+ * verdict="approve"
28
+ * total={4.2}
29
+ * outOf={5}
30
+ * criteria={criteria}
31
+ * visibleCount={3}
32
+ * />
33
+ */
34
+ declare function ScoreBreakdown({ verdict, total, outOf, criteria, visibleCount, className, ...props }: Omit<ComponentProps<"div">, "children" | "verdict" | "total" | "outOf" | "criteria" | "visibleCount"> & {
35
+ /** The decision in a word. Its tint follows total over outOf. */
36
+ verdict: string;
37
+ /** The composite score. */
38
+ total: number;
39
+ /** Maximum possible, for the headline and for every criterion bar. */
40
+ outOf: number;
41
+ /** What produced the number, so the verdict can be argued with. */
42
+ criteria: readonly ScoreCriterion[];
43
+ /** How many criteria have been scored. */
44
+ visibleCount: number;
45
+ }): import("react").JSX.Element;
46
+ //#endregion
47
+ export { ScoreBreakdown, ScoreCriterion };
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { mono, paper } from "./surfaces.js";
4
+ import { pct, take } from "./range.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/elements/score-breakdown.tsx
7
+ /**
8
+ * A verdict with its arithmetic shown: criteria, weights, and what pulled it down.
9
+ *
10
+ * @example
11
+ * import { ScoreBreakdown } from "@cueplusplus/ui/elements";
12
+ *
13
+ * <ScoreBreakdown
14
+ * verdict="approve"
15
+ * total={4.2}
16
+ * outOf={5}
17
+ * criteria={criteria}
18
+ * visibleCount={3}
19
+ * />
20
+ */
21
+ function ScoreBreakdown({ verdict, total, outOf, criteria, visibleCount, className, ...props }) {
22
+ const ratio = outOf === 0 ? 0 : total / outOf;
23
+ return /* @__PURE__ */ jsxs("div", {
24
+ "data-slot": "score-breakdown",
25
+ className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
26
+ ...props,
27
+ children: [/* @__PURE__ */ jsxs("div", {
28
+ className: "flex items-baseline gap-2",
29
+ children: [
30
+ /* @__PURE__ */ jsx("span", {
31
+ className: "text-(length:--cue-text-title) font-medium tracking-tight tabular-nums",
32
+ children: total.toFixed(1)
33
+ }),
34
+ /* @__PURE__ */ jsxs("span", {
35
+ className: cn(mono, "text-fg-subtle tabular-nums"),
36
+ children: ["/ ", outOf]
37
+ }),
38
+ /* @__PURE__ */ jsx("span", {
39
+ className: cn("ms-auto rounded-full px-2 py-0.5 text-(length:--cue-text-ui) font-medium", ratio >= .75 ? "bg-ok/12 text-ok" : ratio >= .5 ? "bg-warn/12 text-warn" : "bg-danger/12 text-danger"),
40
+ children: verdict
41
+ })
42
+ ]
43
+ }), /* @__PURE__ */ jsx("div", {
44
+ className: "flex flex-col gap-2",
45
+ children: take(criteria, visibleCount).map((criterion) => /* @__PURE__ */ jsxs("div", {
46
+ className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex flex-col gap-1 duration-300",
47
+ children: [
48
+ /* @__PURE__ */ jsxs("div", {
49
+ className: "flex items-baseline gap-2",
50
+ children: [
51
+ /* @__PURE__ */ jsx("span", {
52
+ className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-body)",
53
+ children: criterion.label
54
+ }),
55
+ /* @__PURE__ */ jsxs("span", {
56
+ className: cn(mono, "text-fg-subtle shrink-0"),
57
+ children: ["×", criterion.weight]
58
+ }),
59
+ /* @__PURE__ */ jsx("span", {
60
+ className: cn(mono, "text-fg-muted shrink-0 tabular-nums"),
61
+ children: criterion.score.toFixed(1)
62
+ })
63
+ ]
64
+ }),
65
+ /* @__PURE__ */ jsx("span", {
66
+ className: "bg-surface-2 h-[3px] w-full overflow-hidden rounded-full",
67
+ children: /* @__PURE__ */ jsx("span", {
68
+ className: "block h-full rounded-full bg-stream transition-[width] duration-500 motion-reduce:transition-none",
69
+ style: { width: `${pct(criterion.score, outOf)}%` }
70
+ })
71
+ }),
72
+ criterion.note && /* @__PURE__ */ jsx("span", {
73
+ className: "text-fg-subtle text-(length:--cue-text-ui) leading-relaxed break-words",
74
+ children: criterion.note
75
+ })
76
+ ]
77
+ }, criterion.label))
78
+ })]
79
+ });
80
+ }
81
+ //#endregion
82
+ export { ScoreBreakdown };
@@ -0,0 +1,32 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/scroll-anchor.d.ts
3
+ /** One turn in the transcript this element scrolls: who said it, and what. */
4
+ interface ScrollAnchorMessage {
5
+ /** Who is speaking. The user's turns take the recessed field ground and sit right. */
6
+ role: "user" | "assistant";
7
+ /** The turn itself, as plain text. */
8
+ text: string;
9
+ }
10
+ /**
11
+ * Streaming never steals your scroll position; a pill offers the way back down.
12
+ *
13
+ * @example
14
+ * import { ScrollAnchor } from "@cueplusplus/ui/elements";
15
+ *
16
+ * <ScrollAnchor
17
+ * messages={[
18
+ * { role: "user", text: "Keep scrolling pinned?" },
19
+ * { role: "assistant", text: "Only when you are already at the bottom." },
20
+ * ]}
21
+ * />
22
+ */
23
+ declare function ScrollAnchor({ messages, paused, onSettled, className, ...props }: Omit<ComponentProps<"div">, "children" | "messages" | "paused" | "onSettled"> & {
24
+ /** Conversation messages appended over time inside the scroll viewport. */
25
+ messages: ScrollAnchorMessage[];
26
+ /** Freezes the scene where it is; replay happens by remounting. */
27
+ paused?: boolean;
28
+ /** Called once every message has landed and the viewport is pinned. */
29
+ onSettled?: () => void;
30
+ }): import("react").JSX.Element;
31
+ //#endregion
32
+ export { ScrollAnchor, ScrollAnchorMessage };
@@ -0,0 +1,121 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { usePrefersReducedMotion } from "../instruments/_motion.js";
4
+ import { field, paper } from "./surfaces.js";
5
+ import { useCallback, useEffect, useRef, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { ArrowDownIcon } from "lucide-react";
8
+ //#region src/elements/scroll-anchor.tsx
9
+ const INITIAL_COUNT = 3;
10
+ const APPEND_MS = 1300;
11
+ /**
12
+ * Streaming never steals your scroll position; a pill offers the way back down.
13
+ *
14
+ * @example
15
+ * import { ScrollAnchor } from "@cueplusplus/ui/elements";
16
+ *
17
+ * <ScrollAnchor
18
+ * messages={[
19
+ * { role: "user", text: "Keep scrolling pinned?" },
20
+ * { role: "assistant", text: "Only when you are already at the bottom." },
21
+ * ]}
22
+ * />
23
+ */
24
+ function ScrollAnchor({ messages, paused = false, onSettled, className, ...props }) {
25
+ const reduced = usePrefersReducedMotion();
26
+ const viewportRef = useRef(null);
27
+ const [count, setCount] = useState(INITIAL_COUNT);
28
+ const [pinned, setPinned] = useState(true);
29
+ const [seenCount, setSeenCount] = useState(INITIAL_COUNT);
30
+ useEffect(() => {
31
+ if (paused) return;
32
+ if (reduced) {
33
+ setCount(messages.length);
34
+ return;
35
+ }
36
+ const id = setInterval(() => {
37
+ setCount((current) => {
38
+ if (current >= messages.length) return current;
39
+ return current + 1;
40
+ });
41
+ }, APPEND_MS);
42
+ return () => clearInterval(id);
43
+ }, [
44
+ messages.length,
45
+ paused,
46
+ reduced
47
+ ]);
48
+ useEffect(() => {
49
+ if (count >= messages.length && pinned) onSettled?.();
50
+ }, [
51
+ count,
52
+ pinned,
53
+ messages.length,
54
+ onSettled
55
+ ]);
56
+ useEffect(() => {
57
+ if (count === 4) {
58
+ setPinned(false);
59
+ const viewport = viewportRef.current;
60
+ if (viewport) viewport.scrollTo({ top: 0 });
61
+ }
62
+ }, [count]);
63
+ useEffect(() => {
64
+ const viewport = viewportRef.current;
65
+ if (!viewport) return;
66
+ if (pinned) {
67
+ viewport.scrollTo({ top: viewport.scrollHeight });
68
+ setSeenCount(count);
69
+ }
70
+ }, [count, pinned]);
71
+ const jump = useCallback(() => {
72
+ const viewport = viewportRef.current;
73
+ if (viewport) viewport.scrollTo({ top: viewport.scrollHeight });
74
+ setPinned(true);
75
+ setSeenCount(count);
76
+ }, [count]);
77
+ useEffect(() => {
78
+ if (paused || pinned || count - seenCount < 2) return;
79
+ const id = setTimeout(jump, 2400);
80
+ return () => clearTimeout(id);
81
+ }, [
82
+ paused,
83
+ pinned,
84
+ count,
85
+ seenCount,
86
+ jump
87
+ ]);
88
+ const newCount = count - seenCount;
89
+ return /* @__PURE__ */ jsxs("div", {
90
+ "data-slot": "scroll-anchor",
91
+ className: cn(paper, "relative h-64 w-full max-w-sm overflow-hidden rounded-(--radius-overlay)", className),
92
+ ...props,
93
+ children: [
94
+ /* @__PURE__ */ jsx("div", {
95
+ ref: viewportRef,
96
+ className: "flex h-full flex-col gap-2.5 overflow-y-hidden scroll-smooth motion-reduce:scroll-auto p-4",
97
+ children: messages.slice(0, count).map((message, i) => /* @__PURE__ */ jsx("div", {
98
+ className: cn("cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in max-w-[85%] text-(length:--cue-text-ui) leading-relaxed duration-300 motion-reduce:animate-none", message.role === "user" ? cn(field, "self-end rounded-(--radius-overlay) px-3 py-1.5") : "text-fg-muted self-start"),
99
+ children: message.text
100
+ }, i))
101
+ }),
102
+ /* @__PURE__ */ jsx("div", {
103
+ "aria-hidden": true,
104
+ className: "from-surface-1 pointer-events-none absolute inset-x-0 top-0 h-6 bg-gradient-to-b to-transparent"
105
+ }),
106
+ !pinned && newCount > 0 && /* @__PURE__ */ jsxs("button", {
107
+ type: "button",
108
+ onClick: jump,
109
+ className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in absolute inset-x-0 bottom-3 mx-auto flex w-fit items-center gap-1.5 rounded-full px-3.5 py-1.5 text-(length:--cue-text-ui) transition-transform duration-200 hover:-translate-y-px"),
110
+ children: [
111
+ /* @__PURE__ */ jsx(ArrowDownIcon, { className: "size-3 opacity-60" }),
112
+ newCount,
113
+ " new ",
114
+ newCount === 1 ? "message" : "messages"
115
+ ]
116
+ })
117
+ ]
118
+ });
119
+ }
120
+ //#endregion
121
+ export { ScrollAnchor };