@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,88 @@
1
+ {
2
+ "name": "SubagentList",
3
+ "slug": "subagent-list",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Parallel workers with their own progress, models, and completions.",
11
+ "props": [
12
+ {
13
+ "name": "agents",
14
+ "type": "readonly SubagentItem[]",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Parallel workers shown as cards with name and model."
18
+ },
19
+ {
20
+ "name": "completedCount",
21
+ "type": "number",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "How many agents from the start are marked complete."
25
+ },
26
+ {
27
+ "name": "progress",
28
+ "type": "readonly number[]",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Per-agent progress widths used while a worker is still running."
32
+ },
33
+ {
34
+ "name": "showSummary",
35
+ "type": "boolean",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "When true the summary agent card is revealed under the list."
39
+ },
40
+ {
41
+ "name": "summaryAgent",
42
+ "type": "SubagentItem",
43
+ "required": true,
44
+ "defaultValue": null,
45
+ "description": "Agent shown in the summary card once showSummary is true."
46
+ }
47
+ ],
48
+ "typeReferences": [
49
+ "Omit<\n ComponentProps<\"div\">,\n | \"children\"\n | \"agents\"\n | \"completedCount\"\n | \"progress\"\n | \"showSummary\"\n | \"summaryAgent\"\n> & {\n /** Parallel workers shown as cards with name and model. */\n agents: readonly SubagentItem[];\n /** How many agents from the start are marked complete. */\n completedCount: number;\n /** Per-agent progress widths used while a worker is still running. */\n progress: readonly number[];\n /** When true the summary agent card is revealed under the list. */\n showSummary: boolean;\n /** Agent shown in the summary card once showSummary is true. */\n summaryAgent: SubagentItem;\n}"
50
+ ],
51
+ "subcomponents": [],
52
+ "parts": [],
53
+ "variants": {},
54
+ "defaultVariants": {},
55
+ "tokensUsed": [
56
+ "--cue-accent",
57
+ "--cue-fg-subtle",
58
+ "--cue-ok",
59
+ "--cue-radius-overlay",
60
+ "--cue-surface-2",
61
+ "--cue-text-body"
62
+ ],
63
+ "summary": "Parallel workers with their own progress, models, and completions.",
64
+ "examples": [
65
+ {
66
+ "title": "Usage",
67
+ "code": "import { SubagentList } from \"@cueplusplus/ui/elements\";\n\n<SubagentList\n agents={[{ name: \"Researcher\", model: \"Sonnet\" }]}\n completedCount={0}\n progress={[40]}\n showSummary={false}\n summaryAgent={{ name: \"Summarizer\", model: \"Haiku\" }}\n/>",
68
+ "language": "tsx"
69
+ }
70
+ ],
71
+ "status": "todo-docs",
72
+ "url": "/docs/components/subagent-list",
73
+ "mdUrl": "/docs/components/subagent-list.md",
74
+ "jsonUrl": "/r/components/subagent-list.json",
75
+ "specimens": [
76
+ {
77
+ "title": "SubagentList",
78
+ "group": "elements",
79
+ "components": [
80
+ "SubagentList"
81
+ ],
82
+ "code": "<Specimens>\n <Specimen label=\"two running\" wide>\n <SubagentList\n agents={WORKERS}\n completedCount={1}\n progress={[100, 62, 24]}\n showSummary={false}\n summaryAgent={SUMMARISER}\n />\n </Specimen>\n <Specimen label=\"summarising\" wide>\n <SubagentList\n agents={WORKERS}\n completedCount={WORKERS.length}\n progress={[100, 100, 100]}\n showSummary\n summaryAgent={SUMMARISER}\n />\n </Specimen>\n</Specimens>",
83
+ "note": "Parallel workers, each with its own model and its own progress. `completedCount` marks the finished ones from the start of the list, and the summary card appears under them when the agent that folds their answers together starts work.",
84
+ "interaction": "none. Delegation is something to watch, not something to steer from here."
85
+ }
86
+ ],
87
+ "todo": true
88
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "Suggestions",
3
+ "slug": "suggestions",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Prompt pills that stagger in after a reply and invite the next turn.",
9
+ "props": [
10
+ {
11
+ "name": "suggestions",
12
+ "type": "readonly string[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "Follow-up prompt pills rendered in order."
16
+ },
17
+ {
18
+ "name": "selectedSuggestion",
19
+ "type": "string | null",
20
+ "required": true,
21
+ "defaultValue": null,
22
+ "description": "The pill currently pressed, or null when none is selected."
23
+ },
24
+ {
25
+ "name": "cycle",
26
+ "type": "number",
27
+ "required": true,
28
+ "defaultValue": null,
29
+ "description": "Identity key that remounts the row so the stagger entrance can replay."
30
+ },
31
+ {
32
+ "name": "onSuggestion",
33
+ "type": "(suggestion: string) => void",
34
+ "required": true,
35
+ "defaultValue": null,
36
+ "description": "Called when a suggestion pill is pressed."
37
+ },
38
+ {
39
+ "name": "variant",
40
+ "type": "\"list\" | \"pills\"",
41
+ "required": false,
42
+ "defaultValue": "pills",
43
+ "description": "pills wraps suggestions into a centered row; list stacks them as full-width rows."
44
+ }
45
+ ],
46
+ "typeReferences": [
47
+ "Omit<\n ComponentProps<\"div\">,\n \"children\"\n>"
48
+ ],
49
+ "subcomponents": [],
50
+ "parts": [],
51
+ "variants": {},
52
+ "defaultVariants": {},
53
+ "tokensUsed": [
54
+ "--cue-accent",
55
+ "--cue-accent-fg",
56
+ "--cue-radius-overlay",
57
+ "--cue-text-body"
58
+ ],
59
+ "summary": "Prompt pills that stagger in after a reply and invite the next turn.",
60
+ "examples": [
61
+ {
62
+ "title": "Usage",
63
+ "code": "import { Suggestions } from \"@cueplusplus/ui/elements\";\n\n<Suggestions\n suggestions={[\"Explain more\", \"Show an example\"]}\n selectedSuggestion={null}\n cycle={0}\n onSuggestion={setSelected}\n/>",
64
+ "language": "tsx"
65
+ }
66
+ ],
67
+ "status": "todo-docs",
68
+ "url": "/docs/components/suggestions",
69
+ "mdUrl": "/docs/components/suggestions.md",
70
+ "jsonUrl": "/r/components/suggestions.json",
71
+ "specimens": [
72
+ {
73
+ "title": "Suggestions",
74
+ "group": "elements-thread",
75
+ "components": [
76
+ "Suggestions"
77
+ ],
78
+ "code": "<Specimens>\n <Specimen label=\"pills\" wide>\n <Suggestions\n suggestions={FOLLOW_UPS}\n selectedSuggestion={suggestion}\n cycle={0}\n onSuggestion={setSuggestion}\n />\n </Specimen>\n <Specimen label=\"list\" wide>\n <Suggestions\n suggestions={FOLLOW_UPS}\n selectedSuggestion={FOLLOW_UPS[0] ?? null}\n cycle={1}\n onSuggestion={setSuggestion}\n variant=\"list\"\n />\n </Specimen>\n</Specimens>",
79
+ "note": "Where the conversation could go next, staggered in after a reply. Pills for a centred empty state, a list for a side panel; either way `cycle` is the key that re-runs the entrance when a new set replaces the old one.",
80
+ "interaction": "each pill is a button carrying aria-pressed, lifts a pixel on hover and presses in on click. The selected one inverts."
81
+ }
82
+ ],
83
+ "todo": true
84
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "Sup",
3
+ "slug": "sup",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A superscript inside an expression: an exponent or an index, set upright inside the\nitalic.",
9
+ "props": [],
10
+ "typeReferences": [],
11
+ "subcomponents": [],
12
+ "parts": [],
13
+ "variants": {},
14
+ "defaultVariants": {},
15
+ "tokensUsed": [
16
+ "--cue-border-strong",
17
+ "--cue-fg",
18
+ "--cue-fg-subtle",
19
+ "--cue-radius-overlay",
20
+ "--cue-text-emphasis"
21
+ ],
22
+ "summary": "A superscript inside an expression: an exponent or an index, set upright inside the italic.",
23
+ "examples": [],
24
+ "status": "todo-docs",
25
+ "url": "/docs/components/sup",
26
+ "mdUrl": "/docs/components/sup.md",
27
+ "jsonUrl": "/r/components/sup.json",
28
+ "specimens": [
29
+ {
30
+ "title": "MathBlock",
31
+ "group": "elements-knowledge",
32
+ "components": [
33
+ "MathBlock",
34
+ "Frac",
35
+ "Sub",
36
+ "Sup"
37
+ ],
38
+ "code": "<Specimens>\n <Specimen label=\"worked through\" wide>\n <MathBlock label=\"illuminance at the deck\" steps={MATH} visibleSteps={MATH.length} />\n </Specimen>\n <Specimen label=\"first step only\" wide>\n <MathBlock steps={MATH} visibleSteps={1} />\n </Specimen>\n</Specimens>",
39
+ "note": "Maths with the working shown, a step at a time. The expressions are nodes rather than a string, so there is no parser and no KaTeX in the bundle — `Frac` stacks a numerator over a rule, `Sup` and `Sub` set an index upright inside the serif italic, and anything else is text.",
40
+ "interaction": "none. Each step's note says what justified it, which is what turns three lines of algebra into an explanation."
41
+ }
42
+ ],
43
+ "todo": true
44
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "SwapLabel",
3
+ "slug": "swap-label",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Two labels stacked in one cell, with the box's width animating between them.\n\nA `ResizeObserver` measures the layer that is showing, because the crossfade\nis only half the effect — a \"Searching…\" that becomes \"Searched\" has to make\nthe row shrink, and neither layer can size the box while both are in it.\n\nThe layer that is leaving is `aria-hidden`, so the outgoing text is neither\nannounced nor copied into a selection.",
9
+ "props": [
10
+ {
11
+ "name": "active",
12
+ "type": "0 | 1",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "Which of the two children is showing."
16
+ },
17
+ {
18
+ "name": "children",
19
+ "type": "[ReactNode, ReactNode]",
20
+ "required": true,
21
+ "defaultValue": null,
22
+ "description": "Exactly two labels: the resting one and the active one."
23
+ },
24
+ {
25
+ "name": "className",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Extra classes for the measured box."
30
+ }
31
+ ],
32
+ "typeReferences": [],
33
+ "subcomponents": [],
34
+ "parts": [],
35
+ "variants": {},
36
+ "defaultVariants": {},
37
+ "tokensUsed": [
38
+ "--cue-accent",
39
+ "--cue-accent-fg",
40
+ "--cue-accent-hover",
41
+ "--cue-border",
42
+ "--cue-border-overlay",
43
+ "--cue-fg",
44
+ "--cue-fg-muted",
45
+ "--cue-font-mono",
46
+ "--cue-stream",
47
+ "--cue-sunken",
48
+ "--cue-surface-1",
49
+ "--cue-surface-2",
50
+ "--cue-text-label"
51
+ ],
52
+ "summary": "Two labels stacked in one cell, with the box's width animating between them.",
53
+ "examples": [],
54
+ "status": "todo-docs",
55
+ "url": "/docs/components/swap-label",
56
+ "mdUrl": "/docs/components/swap-label.md",
57
+ "jsonUrl": "/r/components/swap-label.json",
58
+ "specimens": [
59
+ {
60
+ "title": "SwapLabel",
61
+ "group": "elements",
62
+ "components": [
63
+ "SwapLabel"
64
+ ],
65
+ "code": "<Specimens>\n <Specimen label={swapped === 0 ? \"active 0\" : \"active 1\"}>\n <span className=\"flex items-center gap-(--cue-space-3)\">\n <SwapLabel active={swapped}>\n <ShimmerLabel className=\"relative inline-block leading-none\">\n Patching universe 3\n </ShimmerLabel>\n <>Patched</>\n </SwapLabel>\n <Button size=\"sm\" onClick={() => setSwapped((current) => (current === 0 ? 1 : 0))}>\n Swap\n </Button>\n </span>\n </Specimen>\n</Specimens>",
66
+ "note": "Two labels in one cell, crossfading, with the box measuring itself to whichever is showing. The width is half the effect: 'Patching universe 3' becoming 'Patched' has to make the row shrink, and the outgoing layer is aria-hidden so it is neither announced nor copied.",
67
+ "interaction": "swap it and watch the box, not the text. Everything after the label on that row moves with it."
68
+ }
69
+ ],
70
+ "todo": true
71
+ }
@@ -24,14 +24,20 @@
24
24
  "defaultVariants": {},
25
25
  "tokensUsed": [
26
26
  "--cue-accent",
27
+ "--cue-accent-soft",
28
+ "--cue-bg",
27
29
  "--cue-border",
28
30
  "--cue-fg",
29
31
  "--cue-fg-subtle",
30
32
  "--cue-font-mono",
33
+ "--cue-hair-strong",
31
34
  "--cue-pad-row-x",
32
35
  "--cue-pad-row-y",
36
+ "--cue-row-hover",
37
+ "--cue-space-2",
33
38
  "--cue-space-3",
34
39
  "--cue-surface-1",
40
+ "--cue-table-group-top",
35
41
  "--cue-text-label",
36
42
  "--cue-text-ui"
37
43
  ],
@@ -5,7 +5,7 @@
5
5
  "importPath": "@cueplusplus/ui",
6
6
  "peerDependencies": [],
7
7
  "clientOnly": false,
8
- "description": "The canonical console table: hairlines, mono figures, no zebra striping.\n\nSemantic `<table>` markup throughout — a grid of divs loses row/column\nannouncement, and a console table is exactly the place a screen reader user\nneeds it. Zebra rows are deliberately absent: at console density the stripes\nare thicker than the data.\n\nStatic markup — no `\"use client\"`. Compose it with `Panel` for the rim.\nUse {@link TableScrollRegion} only when the table can exceed its container.",
8
+ "description": "The canonical console table: hairlines, mono figures, no zebra striping.\n\nSemantic `<table>` markup throughout — a grid of divs loses row/column\nannouncement, and a console table is exactly the place a screen reader user\nneeds it. Zebra rows are deliberately absent: at console density the stripes\nare thicker than the data.\n\nStatic markup — no `\"use client\"`. Compose it with `Panel` for the rim.\nUse {@link TableScrollRegion} only when the table can exceed its container.\n\nFor a grouped list, the table stays *one* table: `Table.Head sticky` docks the\ncolumn names, and one `Table.Body` per group opens with a `Table.GroupRow`\ndivider — so the columns are named once and scan straight through every group\nboundary. Rows may hold `DataRow` slots, and `DataRow.Actions` reveals inside\na cell on hover and on selection exactly as it does in a `Ledger` row — on\nfocus too, once the row holds something focusable outside the track, which a\n`<tr>` never is by itself. See {@link TableRowProps.interactive}.",
9
9
  "props": [],
10
10
  "typeReferences": [],
11
11
  "subcomponents": [
@@ -13,6 +13,7 @@
13
13
  "Header",
14
14
  "Body",
15
15
  "Row",
16
+ "GroupRow",
16
17
  "Head",
17
18
  "Cell",
18
19
  "Caption"
@@ -48,16 +49,76 @@
48
49
  {
49
50
  "name": "Row",
50
51
  "usage": "Table.Row",
51
- "description": "One row, separated by a hairline underneath — dropped on the last row so the\ntable never draws a rule against the panel rim it sits in. In a `<thead>` the\n\"last row\" is the header row itself, so the header's own bottom border (on\nthe cells) is the only rule there and the two can never stack into 2px.",
52
- "props": [],
52
+ "description": "One row, separated by a hairline underneath — dropped on the last row so the\ntable never draws a rule against the panel rim it sits in. In a `<thead>` the\n\"last row\" is the header row itself, so the header's own bottom border (on\nthe cells) is the only rule there and the two can never stack into 2px.\n\nEvery row carries the `group/data-row` name unconditionally. It paints\nnothing by itself, and it is what lets a `DataRow.Actions` cluster inside a\n`Table.Cell` reveal on hover, on focus and on selection with no second\nimplementation of that idiom for the table — the whole point of the three\nidioms sharing one row anatomy.\n\n**The focus half of that reveal is the caller's to supply here.** A `<tr>` is\nnot focusable and this component does not make it one — a tab stop on every\nrow of a long table is a tab stop a keyboard user has to walk past hundreds\nof times, which is the reason `Ledger` rows opt in individually. So the\nreveal-on-focus only happens if the row *contains* something focusable\noutside the hidden track: a link on the row's name, a checkbox in the leading\ncell, any real control. Without one, `:focus-within` can never fire — content\ninside a `visibility: hidden` subtree cannot be focused, so the track cannot\nbootstrap its own reveal — and a hidden action cluster is then reachable by\npointer only, which is a WCAG 2.1.1 failure the screen gives no sign of. A\ntable whose only per-row controls live in a hidden track wants either a\nfocusable cell beside it or an always-visible cluster.\n\nThe selected tint is the row's, not the cell's: a `background` on the `<tr>`\nshows through every cell in it, so the fill cannot end up ragged where one\ncell sets a ground of its own.",
53
+ "props": [
54
+ {
55
+ "name": "interactive",
56
+ "type": "boolean",
57
+ "required": false,
58
+ "defaultValue": "false",
59
+ "description": "The row responds to a pointer: the row-hover wash and a pointer cursor\nacross the whole row. Defaults to `false`.\n\nOpt-in rather than automatic, because a table of figures nobody can click\nthat lit up under the pointer would be promising an interaction it does not\nhave. Wiring the row up to actually do something — a click handler, a\nkeyboard path to the same thing — stays the caller's job; this is the paint."
60
+ },
61
+ {
62
+ "name": "selected",
63
+ "type": "boolean",
64
+ "required": false,
65
+ "defaultValue": "false",
66
+ "description": "Draw the row as picked out of the table. Defaults to `false`.\n\nSets `data-selected`, which is what the tint and the hover-revealed\n`DataRow.Actions` inside the row both key off — so a hand-written\n`<tr data-selected>` in a data-driven body gets exactly the same treatment."
67
+ }
68
+ ],
53
69
  "typeReferences": [
54
70
  "React.ComponentPropsWithoutRef<\"tr\">"
55
71
  ]
56
72
  },
73
+ {
74
+ "name": "GroupRow",
75
+ "usage": "Table.GroupRow",
76
+ "description": "A group divider inside one continuous table.\n\nThe whole point is that it is *inside*: a grouped list drawn as one table per\ngroup names its columns once per group, so a reader scanning a column\ntop-to-bottom crosses a fresh header band at every boundary and a screen\nreader announces four tables where there is one dataset. So the table stays\none `<table>` with one `<thead>`, and each group is its own `<tbody>` — which\nis valid HTML, keeps the group's rows together, and gives the divider a row\ngroup to be the header of.\n\nThat last part is why the cell is a `<th scope=\"rowgroup\">` rather than a\nstyled `<td>`: `rowgroup` scope is exactly the statement \"this heading names\nthe rows of this `<tbody>`\", and it leaves the column headers' associations\nuntouched. A `<td colSpan>` divider is invisible to assistive technology as a\nheading, and a `<th scope=\"col\">` one would quietly re-scope the columns.\n\nNo `aria-expanded` here, and no toggle: groups in a table divide, they do not\nfold. A hierarchy that folds is `DataTree`, whose treeitem rows own their own\nexpansion — and if a table genuinely needs to fold rows, the pattern is a real\n`<button aria-expanded aria-controls>` inside this cell, never the row itself.",
77
+ "props": [
78
+ {
79
+ "name": "span",
80
+ "type": "number",
81
+ "required": true,
82
+ "defaultValue": null,
83
+ "description": "How many columns the divider spans. Required: it must equal the table's\ncolumn count, or the group's cell stops covering the row and the columns\nbelow it shift by one."
84
+ },
85
+ {
86
+ "name": "label",
87
+ "type": "ReactNode",
88
+ "required": true,
89
+ "defaultValue": null,
90
+ "description": "What the group is called."
91
+ },
92
+ {
93
+ "name": "count",
94
+ "type": "number",
95
+ "required": false,
96
+ "defaultValue": null,
97
+ "description": "How many rows the group holds, printed beside its name."
98
+ },
99
+ {
100
+ "name": "sticky",
101
+ "type": "boolean",
102
+ "required": false,
103
+ "defaultValue": "false",
104
+ "description": "Dock the divider under the header band while the group's rows scroll past.\nDefaults to `false`.\n\nThe offset is the custom property `--cue-table-group-top` (default `0`):\nhow far down the divider docks is the rendered height of the sticky header\nabove it, which depends on the density and type the caller configured. Set\nit on the table — `className=\"[--cue-table-group-top:2rem]\"` — rather than\nmeasuring at runtime."
105
+ },
106
+ {
107
+ "name": "className",
108
+ "type": "string",
109
+ "required": false,
110
+ "defaultValue": null,
111
+ "description": "Classes for the divider's *cell*, not its row.\n\nThe `<tr>` paints nothing — the ground, the type and the sticky offset all\nlive on the `<th>` that spans it, and a background on the row would sit\nbehind the cell's own. Every other prop, and the ref, go to the row."
112
+ }
113
+ ],
114
+ "typeReferences": [
115
+ "Omit<React.ComponentPropsWithoutRef<\"tr\">, \"children\">"
116
+ ]
117
+ },
57
118
  {
58
119
  "name": "Head",
59
120
  "usage": "Table.Head",
60
- "description": "A column heading: the same mono uppercase label as `SectionHeader` and\n`Eyebrow`, on the raised surface so the band reads as chrome rather than as\nthe first row of data.",
121
+ "description": "A column heading: the same mono uppercase label as `SectionHeader` and\n`Eyebrow`, on the raised surface so the band reads as chrome rather than as\nthe first row of data.\n\n**Sticky swaps the bottom border for an inset shadow.** `Table.Root` collapses\nits borders, and a collapsed border belongs to the table's shared grid rather\nthan to the cell — so when a cell detaches to stay at the top of the scroll\ncontainer, its rule stays behind with the rows and the stuck band appears to\nlose its edge. An inset `box-shadow` is a paint effect on the cell itself, so\nit travels with it. The alternative — putting the whole table on\n`border-separate` — would change the geometry of every table in the library\nto fix one that scrolls.\n\nThe opaque `bg-surface-1` is not decoration either: a transparent sticky cell\nis a sticky cell you read the rows through. A caller who wants the header on\nthe page's own ground can pass `className=\"bg-bg\"` — what it must not pass is\nnothing.",
61
122
  "props": [
62
123
  {
63
124
  "name": "numeric",
@@ -65,6 +126,13 @@
65
126
  "required": false,
66
127
  "defaultValue": "false",
67
128
  "description": "Right-align this column and set it in tabular figures."
129
+ },
130
+ {
131
+ "name": "sticky",
132
+ "type": "boolean",
133
+ "required": false,
134
+ "defaultValue": "false",
135
+ "description": "Dock the header band to the top of the scroll container while the rows\nscroll under it. Defaults to `false`.\n\nSet it on the cells, not on the `<tr>`: sticky on a table row is honoured\ninconsistently across engines, and the cell is the reliable baseline\neverywhere."
68
136
  }
69
137
  ],
70
138
  "typeReferences": [
@@ -102,14 +170,20 @@
102
170
  "defaultVariants": {},
103
171
  "tokensUsed": [
104
172
  "--cue-accent",
173
+ "--cue-accent-soft",
174
+ "--cue-bg",
105
175
  "--cue-border",
106
176
  "--cue-fg",
107
177
  "--cue-fg-subtle",
108
178
  "--cue-font-mono",
179
+ "--cue-hair-strong",
109
180
  "--cue-pad-row-x",
110
181
  "--cue-pad-row-y",
182
+ "--cue-row-hover",
183
+ "--cue-space-2",
111
184
  "--cue-space-3",
112
185
  "--cue-surface-1",
186
+ "--cue-table-group-top",
113
187
  "--cue-text-label",
114
188
  "--cue-text-ui"
115
189
  ],
@@ -150,6 +224,16 @@
150
224
  "code": "<Panel className=\"w-full\">\n <TableScrollRegion aria-label=\"Cue list table\">\n <Table.Root>\n <Table.Caption>Cue list</Table.Caption>\n <Table.Header>\n <Table.Row>\n <Table.Head numeric>#</Table.Head>\n <Table.Head>Label</Table.Head>\n <Table.Head numeric>Fade</Table.Head>\n <Table.Head>Follow</Table.Head>\n <Table.Head numeric>Level</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {CUES.map((cue) => (\n <Table.Row key={cue.id}>\n <Table.Cell numeric>{cue.id}</Table.Cell>\n <Table.Cell>{cue.label}</Table.Cell>\n <Table.Cell numeric>{cue.time}</Table.Cell>\n <Table.Cell>{cue.follow}</Table.Cell>\n <Table.Cell numeric>{cue.level}%</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Root>\n </TableScrollRegion>\n</Panel>",
151
225
  "note": "The canonical console table inside its named horizontal scroll region: hairline rows, mono headers, and `numeric` cells that are right-aligned and tabular.",
152
226
  "interaction": "the scroll region is keyboard-focusable. Sorting, filtering and paging come from the DataTable recipe below."
227
+ },
228
+ {
229
+ "title": "Table — grouped",
230
+ "group": "instruments",
231
+ "components": [
232
+ "Table"
233
+ ],
234
+ "code": "<Panel className=\"w-full\">\n <div className=\"max-h-[18rem] overflow-y-auto [--cue-table-group-top:1.75rem]\">\n <Table.Root>\n <Table.Caption>Patch, one table, two row groups.</Table.Caption>\n <Table.Header>\n <Table.Row>\n <Table.Head sticky>Device</Table.Head>\n <Table.Head sticky>Detail</Table.Head>\n <Table.Head sticky numeric>\n Latency\n </Table.Head>\n <Table.Head sticky className=\"sr-only\">\n Actions\n </Table.Head>\n </Table.Row>\n </Table.Header>\n {PATCH_GROUPS.map((group) => (\n <Table.Body key={group.id}>\n <Table.GroupRow\n span={4}\n label={group.label}\n count={group.rows.length}\n sticky\n />\n {group.rows.map((device) => (\n <Table.Row key={device.id} interactive>\n {/* The name is a link, and that is load-bearing rather\n than decorative. A `<tr>` is not focusable, so\n without a real control somewhere outside the hidden\n action track nothing in the row can take focus,\n `:focus-within` never fires, and the Copy and\n Actions buttons are reachable by pointer only —\n visible to a mouse user, invisible to Tab. The\n ledger and the tree get this for free because their\n rows are focusable themselves; the table has to be\n given it. */}\n <Table.Cell>\n <Link href={`#patch-${device.id}`}>{device.name}</Link>\n </Table.Cell>\n <Table.Cell className=\"text-fg-muted\">{device.detail}</Table.Cell>\n <Table.Cell numeric>{device.latency}</Table.Cell>\n {/* The action column's width is a sum of the tokens it\n holds — two small controls, the gap between them and\n the cell's own padding on each side — so it stays\n right whatever the density does to any of them. */}\n <Table.Cell className=\"w-[calc(2_*_var(--cue-control-sm)_+_var(--cue-space-1)_+_2_*_var(--cue-pad-row-x))]\">\n <DataRow.Actions>\n <CopyButton\n value={device.id}\n size=\"sm\"\n className=\"w-control-sm px-0\"\n />\n <IconButton\n icon={MoreVertical}\n size=\"sm\"\n aria-label={`Actions for ${device.name}`}\n />\n </DataRow.Actions>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n ))}\n </Table.Root>\n </div>\n</Panel>",
235
+ "note": "The same rows as one continuous table: `Table.Head sticky` docks the column names, and one `Table.Body` per group opens with a `Table.GroupRow` divider — a `th` with `scope='rowgroup'`, so the columns are named once and scan straight through every boundary.",
236
+ "interaction": "rows marked `interactive` take the row-hover wash across the whole row; `selected` tints it and reveals the action track. Tab reaches each row through its name link, which is what lets `:focus-within` reveal the track at all — a `tr` cannot take focus, so a table row whose only controls are in the hidden cluster would be pointer-only."
153
237
  }
154
238
  ]
155
239
  }
@@ -137,6 +137,7 @@
137
137
  "--cue-accent-soft",
138
138
  "--cue-border",
139
139
  "--cue-border-overlay",
140
+ "--cue-border-strong",
140
141
  "--cue-chip-h",
141
142
  "--cue-control-lg",
142
143
  "--cue-control-md",
@@ -145,6 +146,7 @@
145
146
  "--cue-fg",
146
147
  "--cue-fg-muted",
147
148
  "--cue-fg-subtle",
149
+ "--cue-focus",
148
150
  "--cue-font-mono",
149
151
  "--cue-icon-sm",
150
152
  "--cue-radius-control",
@@ -0,0 +1,109 @@
1
+ {
2
+ "name": "TailStatus",
3
+ "slug": "tail-status",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "The live row at the foot of a transcript: what the run is doing, right now.\n\nThe one row every shipping agent UI has and no component catalogue ships. It\nis not a spinner and not a toast — it is a transcript row with\n`role=\"status\"`, which is what makes it the *only* element in this family a\nscreen reader is told about without being asked. Everything else here is\ndrawn and left alone; this one announces itself politely each time the action\nchanges, which is exactly the behaviour a person who cannot see the spinner\nneeds and exactly the behaviour that becomes unbearable if it is used for\nanything else. One per transcript, at the foot, and nowhere else.\n\n**Unless something better is speaking.** {@link LiveRegionAnnouncer } is this\nfamily's other live region, and its table of transitions covers what this row\nnarrates; a console that mounts both would have the run read out twice. So\nmounting an announcer takes the speech away from this row automatically — the\nwords stay on the screen, the `role=\"status\"` goes, and `data-announces` says\nwhich of the two it is doing. {@link TailStatusProps.announce} overrules it in\neither direction.\n\nThe action and the detail are separate props rather than one composed string\nbecause they truncate differently: the action is short and must survive, the\ndetail is a path and must not push it off the row.\n\nState is a prop, as everywhere in this family. The row holds no timer, counts\nnothing, and does not know whether the run is healthy — `active` says whether\nthe sweep runs, `action` says what it says, and the caller changes both.",
11
+ "props": [
12
+ {
13
+ "name": "action",
14
+ "type": "string",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "What is happening, in two or three words: `Running commands`,\n`Searching the codebase`. `TAIL_ACTIONS` is the shipped vocabulary and this\nprop is a plain string, so a product with its own verbs is not stuck with\nthese ten."
18
+ },
19
+ {
20
+ "name": "detail",
21
+ "type": "string",
22
+ "required": false,
23
+ "defaultValue": null,
24
+ "description": "The thing the action is happening to — a path, a query, a topic. Truncates\non its own so the action never has to; a sidebar transcript is 280px wide\nand a status line that elides its verb has said nothing."
25
+ },
26
+ {
27
+ "name": "active",
28
+ "type": "boolean",
29
+ "required": false,
30
+ "defaultValue": "true",
31
+ "description": "Whether the action is still going. `true` by default, because this row is\nthe live one; turn it off for `Idle`, `Interrupted` and `Aborted`, which\nstops the sweep and empties the spinner's slot without moving the text."
32
+ },
33
+ {
34
+ "name": "updatesInPlace",
35
+ "type": "boolean",
36
+ "required": false,
37
+ "defaultValue": "true",
38
+ "description": "Whether a new `action` animates into the row that is already there, or\nsimply replaces the text.\n\nCursor's flag, and the reason it needs one: a narration line that changes\nevery few hundred milliseconds should read as one row being updated, while\na line that means something *different* should read as a new row. `true`\n(the default) keys the label on its own text so each new action fades in\nwhere the last one was; `false` leaves it unkeyed, and the words change\nwith no motion at all. A reduced-motion reader gets the second behaviour\neither way."
39
+ },
40
+ {
41
+ "name": "priority",
42
+ "type": "\"normal\" | \"attention\"",
43
+ "required": false,
44
+ "defaultValue": "normal",
45
+ "description": "How loudly this row is speaking. See {@link TailPriority}."
46
+ },
47
+ {
48
+ "name": "onCancel",
49
+ "type": "(() => void)",
50
+ "required": false,
51
+ "defaultValue": null,
52
+ "description": "Stop the run. The inline control exists only when this is given — Cursor's\nrule, and the right one: a Cancel that cannot cancel is worse than no\nCancel."
53
+ },
54
+ {
55
+ "name": "cancelLabel",
56
+ "type": "string",
57
+ "required": false,
58
+ "defaultValue": "Cancel",
59
+ "description": "What the stop control is called. `Cancel` is Cursor's word; opencode uses\n`Interrupt` and `Stop` for the same button."
60
+ },
61
+ {
62
+ "name": "announce",
63
+ "type": "boolean",
64
+ "required": false,
65
+ "defaultValue": null,
66
+ "description": "Whether this row is a live region — whether a screen reader is told each\ntime the action changes.\n\n**Answers itself by default, and that default is the interesting part.**\nLeft alone the row speaks when it is the only thing that can, and goes\nquiet the moment a {@link LiveRegionAnnouncer } is mounted anywhere on the\npage: the announcer's table covers the same transitions this row narrates,\nso a console with both — the ordinary composition — would otherwise have\nevery state read out twice, out of step, because the two regions update at\ndifferent moments.\n\nThe row is the one that defers because the announcer is the better speaker:\nit is a queue, spaced and depth-limited and paused while the page is hidden\nor a modal has the reader, and it is mounted empty and left mounted, which\nis the only way a live region is reliably announced. This row changes\nseveral times a second and comes and goes with the run.\n\nSet it explicitly to overrule that — `true` for a console whose announcer\nis fed something other than these actions, `false` for one that narrates\nthe foot of the transcript some other way. An explicit answer always wins."
67
+ }
68
+ ],
69
+ "typeReferences": [
70
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
71
+ ],
72
+ "subcomponents": [],
73
+ "parts": [],
74
+ "variants": {},
75
+ "defaultVariants": {},
76
+ "tokensUsed": [
77
+ "--cue-fg",
78
+ "--cue-fg-muted",
79
+ "--cue-fg-subtle",
80
+ "--cue-radius-control",
81
+ "--cue-stream",
82
+ "--cue-text-ui"
83
+ ],
84
+ "summary": "The live row at the foot of a transcript: what the run is doing, right now.",
85
+ "examples": [
86
+ {
87
+ "title": "Usage",
88
+ "code": "import { TailStatus, TAIL_ACTIONS } from \"@cueplusplus/ui/elements\";\n\n<TailStatus\n action={TAIL_ACTIONS.searchingCode}\n detail=\"composer.tsx\"\n onCancel={stop}\n/>\n// Settled: no sweep, no spinner, and the text changes without motion.\n<TailStatus action={TAIL_ACTIONS.interrupted} active={false} updatesInPlace={false} />\n// Composed with the announcer: this row draws the state, the queue speaks it.\n<>\n <TailStatus action={TAIL_ACTIONS.running} detail=\"pnpm test\" />\n <LiveRegionAnnouncer messages={log} />\n</>",
89
+ "language": "tsx"
90
+ }
91
+ ],
92
+ "status": "todo-docs",
93
+ "url": "/docs/components/tail-status",
94
+ "mdUrl": "/docs/components/tail-status.md",
95
+ "jsonUrl": "/r/components/tail-status.json",
96
+ "specimens": [
97
+ {
98
+ "title": "TailStatus",
99
+ "group": "elements-thread",
100
+ "components": [
101
+ "TailStatus"
102
+ ],
103
+ "code": "<Specimens>\n <Specimen label={stopped ? \"settled\" : \"live, cancellable\"} wide>\n <div className=\"w-full max-w-md\">\n <TailStatus\n action={stopped ? TAIL_ACTIONS.interrupted : TAIL_ACTIONS.running}\n detail={stopped ? undefined : \"ola-patch --universe 3\"}\n active={!stopped}\n updatesInPlace={!stopped}\n onCancel={stopped ? undefined : () => setStopped(true)}\n />\n </div>\n </Specimen>\n <Specimen label=\"thinking, with a topic\" wide>\n <div className=\"w-full max-w-md\">\n <TailStatus action={TAIL_ACTIONS.thinking} detail=\"which universe has room\" />\n </div>\n </Specimen>\n <Specimen label=\"attention\" wide>\n <div className=\"w-full max-w-md\">\n <TailStatus\n action=\"Waiting for you\"\n detail=\"approve the shell command\"\n priority=\"attention\"\n />\n </div>\n </Specimen>\n</Specimens>",
104
+ "note": "The live row at the foot of the transcript, and the only element in this family a screen reader is told about without being asked: it is a role=status, so each new action is announced politely as it lands — unless a LiveRegionAnnouncer is mounted, in which case it hands the speaking over and draws the state without saying it, because two polite regions narrating the same run is the transcript read out twice. Two props rather than one string — the action is short and must survive, the detail is a path and must not push it off a 280px sidebar — and an inline Cancel that exists only when there is something to cancel. The copy is TAIL_ACTIONS, a table, not ten strings baked into the markup.",
105
+ "interaction": "press Cancel and the row settles: the sweep stops, the spinner leaves its slot without the words moving, and the last thing it says is what stopped it. updatesInPlace goes off with it, because 'Interrupted' is a different sentence rather than the next frame of the same one."
106
+ }
107
+ ],
108
+ "todo": true
109
+ }