@cueplusplus/ui 0.13.0 → 0.14.1

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 (302) hide show
  1. package/CHANGELOG.md +307 -0
  2. package/README.md +2 -19
  3. package/dist/index.d.ts +2 -2
  4. package/dist/layout/frames.d.ts +19 -1
  5. package/dist/layout/frames.js +21 -7
  6. package/dist/layout/index.d.ts +2 -2
  7. package/dist/primitives/chip.d.ts +1 -1
  8. package/dist/system/theme-provider.d.ts +46 -1
  9. package/dist/system/theme-provider.js +29 -3
  10. package/manifest/components/accordion.json +16 -4
  11. package/manifest/components/activity-graph.json +15 -3
  12. package/manifest/components/agent-card.json +15 -3
  13. package/manifest/components/agent-handoff.json +14 -3
  14. package/manifest/components/agent-mode-badge.json +12 -3
  15. package/manifest/components/agent-pile.json +13 -3
  16. package/manifest/components/agent-plan.json +13 -3
  17. package/manifest/components/agent-status.json +14 -3
  18. package/manifest/components/agent-surface.json +12 -3
  19. package/manifest/components/alert-dialog.json +14 -3
  20. package/manifest/components/animated-number.json +12 -3
  21. package/manifest/components/app-window-frame.json +13 -3
  22. package/manifest/components/approval-card.json +14 -3
  23. package/manifest/components/artifact-card.json +14 -3
  24. package/manifest/components/ask-box.json +13 -3
  25. package/manifest/components/audience-icon.json +11 -3
  26. package/manifest/components/autocomplete.json +15 -3
  27. package/manifest/components/avatar-group.json +15 -4
  28. package/manifest/components/avatar.json +16 -4
  29. package/manifest/components/background-inbox.json +14 -3
  30. package/manifest/components/band.json +14 -4
  31. package/manifest/components/breadcrumb.json +14 -3
  32. package/manifest/components/button-group.json +13 -3
  33. package/manifest/components/calendar.json +15 -4
  34. package/manifest/components/canvas-split-body.json +13 -3
  35. package/manifest/components/canvas-split-document.json +11 -3
  36. package/manifest/components/canvas-split-header.json +13 -3
  37. package/manifest/components/canvas-split-line.json +13 -3
  38. package/manifest/components/canvas-split-message.json +13 -3
  39. package/manifest/components/canvas-split-thread.json +11 -3
  40. package/manifest/components/canvas-split.json +13 -3
  41. package/manifest/components/card.json +14 -3
  42. package/manifest/components/carousel.json +12 -3
  43. package/manifest/components/catalogue-icon.json +11 -3
  44. package/manifest/components/channel-beta-icon.json +11 -3
  45. package/manifest/components/channel-matrix.json +11 -3
  46. package/manifest/components/channel-released-icon.json +11 -3
  47. package/manifest/components/chart-container.json +11 -3
  48. package/manifest/components/chart-ramp.json +12 -3
  49. package/manifest/components/chart-swatch.json +11 -3
  50. package/manifest/components/chart-tooltip-content.json +12 -4
  51. package/manifest/components/chart.json +14 -3
  52. package/manifest/components/chat-empty-state.json +13 -3
  53. package/manifest/components/chat-panel-assistant-message.json +11 -3
  54. package/manifest/components/chat-panel-composer.json +11 -3
  55. package/manifest/components/chat-panel-messages.json +11 -3
  56. package/manifest/components/chat-panel-typing.json +11 -3
  57. package/manifest/components/chat-panel-user-message.json +11 -3
  58. package/manifest/components/chat-panel.json +13 -3
  59. package/manifest/components/checkbox-group.json +15 -4
  60. package/manifest/components/checkpoint-history.json +13 -3
  61. package/manifest/components/clamp.json +12 -3
  62. package/manifest/components/cli-tool-icon.json +11 -3
  63. package/manifest/components/code-diff.json +14 -3
  64. package/manifest/components/code-runner.json +13 -3
  65. package/manifest/components/collapsible.json +13 -3
  66. package/manifest/components/color-area.json +12 -4
  67. package/manifest/components/color-field.json +12 -3
  68. package/manifest/components/color-picker.json +14 -4
  69. package/manifest/components/color-slider.json +12 -3
  70. package/manifest/components/color-swatch.json +13 -3
  71. package/manifest/components/colors-section.json +11 -3
  72. package/manifest/components/combobox.json +15 -4
  73. package/manifest/components/compaction-row.json +12 -3
  74. package/manifest/components/comparison-card.json +12 -3
  75. package/manifest/components/composer-actions.json +11 -3
  76. package/manifest/components/composer-attach-button.json +11 -3
  77. package/manifest/components/composer-attachment-chip.json +13 -3
  78. package/manifest/components/composer-attachments.json +11 -3
  79. package/manifest/components/composer-bar.json +12 -3
  80. package/manifest/components/composer-command-item.json +13 -3
  81. package/manifest/components/composer-context.json +13 -3
  82. package/manifest/components/composer-input.json +11 -3
  83. package/manifest/components/composer-menu-item.json +12 -3
  84. package/manifest/components/composer-menu.json +13 -3
  85. package/manifest/components/composer-model-item.json +13 -3
  86. package/manifest/components/composer-model-trigger.json +13 -3
  87. package/manifest/components/composer-person-item.json +13 -3
  88. package/manifest/components/composer-send.json +13 -3
  89. package/manifest/components/composer-toolbar.json +11 -3
  90. package/manifest/components/composer-voice-button.json +11 -3
  91. package/manifest/components/composer-voice.json +13 -3
  92. package/manifest/components/composer.json +14 -4
  93. package/manifest/components/computer-use.json +13 -3
  94. package/manifest/components/confidence-marker.json +11 -3
  95. package/manifest/components/connection-state.json +12 -3
  96. package/manifest/components/container.json +12 -3
  97. package/manifest/components/context-breakdown.json +12 -4
  98. package/manifest/components/context-menu.json +14 -4
  99. package/manifest/components/context-usage.json +14 -4
  100. package/manifest/components/conversation-search.json +13 -3
  101. package/manifest/components/copy-button.json +14 -3
  102. package/manifest/components/cost-meter.json +12 -3
  103. package/manifest/components/cue-portal-frame.json +12 -3
  104. package/manifest/components/data-table-pagination.json +13 -3
  105. package/manifest/components/data-table-toolbar.json +12 -3
  106. package/manifest/components/date-field.json +12 -3
  107. package/manifest/components/date-picker.json +13 -3
  108. package/manifest/components/date-range-picker.json +11 -3
  109. package/manifest/components/day-separator.json +12 -3
  110. package/manifest/components/delegation-card.json +14 -4
  111. package/manifest/components/density.json +12 -2
  112. package/manifest/components/description-list.json +15 -4
  113. package/manifest/components/diagram.json +13 -3
  114. package/manifest/components/disclosure.json +15 -4
  115. package/manifest/components/dmx-bar.json +12 -3
  116. package/manifest/components/dmx-strip.json +11 -3
  117. package/manifest/components/document-reference.json +13 -3
  118. package/manifest/components/draft-restore.json +13 -3
  119. package/manifest/components/drawer.json +13 -4
  120. package/manifest/components/edit-message.json +13 -3
  121. package/manifest/components/elements-command-palette.json +13 -3
  122. package/manifest/components/elements-composer.json +13 -3
  123. package/manifest/components/elements-data-table.json +11 -3
  124. package/manifest/components/elements-timeline.json +13 -3
  125. package/manifest/components/elicitation-form.json +13 -3
  126. package/manifest/components/empty-state-composer.json +11 -3
  127. package/manifest/components/empty-state-greeting.json +11 -3
  128. package/manifest/components/empty-state-suggestion.json +11 -3
  129. package/manifest/components/empty-state-suggestions.json +11 -3
  130. package/manifest/components/empty-state.json +15 -4
  131. package/manifest/components/end-of-turn-summary.json +14 -3
  132. package/manifest/components/env-var-input.json +15 -4
  133. package/manifest/components/error-state.json +13 -3
  134. package/manifest/components/export-dialog.json +10 -2
  135. package/manifest/components/eyebrow.json +14 -4
  136. package/manifest/components/feedback-dialog.json +13 -3
  137. package/manifest/components/field-description.json +15 -4
  138. package/manifest/components/field-error.json +15 -4
  139. package/manifest/components/field-label.json +15 -4
  140. package/manifest/components/file-tree.json +13 -3
  141. package/manifest/components/file-upload.json +14 -4
  142. package/manifest/components/flow-background.json +11 -3
  143. package/manifest/components/flow-controls.json +11 -3
  144. package/manifest/components/flow-graph.json +13 -3
  145. package/manifest/components/folder-icon.json +12 -3
  146. package/manifest/components/frac.json +11 -3
  147. package/manifest/components/frames.json +14 -0
  148. package/manifest/components/generation-loader.json +13 -3
  149. package/manifest/components/generative-ui.json +16 -4
  150. package/manifest/components/grid.json +14 -3
  151. package/manifest/components/group-bar.json +13 -3
  152. package/manifest/components/guardrail-notice.json +13 -3
  153. package/manifest/components/hover-card.json +14 -4
  154. package/manifest/components/icon-button.json +15 -3
  155. package/manifest/components/image-generation.json +13 -3
  156. package/manifest/components/info-tip.json +15 -4
  157. package/manifest/components/inline-citation.json +13 -3
  158. package/manifest/components/input-group.json +15 -4
  159. package/manifest/components/item.json +15 -4
  160. package/manifest/components/job-progress.json +14 -3
  161. package/manifest/components/kbd.json +14 -3
  162. package/manifest/components/launcher-bubble.json +14 -3
  163. package/manifest/components/link.json +13 -3
  164. package/manifest/components/live-region-announcer.json +16 -4
  165. package/manifest/components/log-viewer.json +15 -3
  166. package/manifest/components/map-answer.json +13 -3
  167. package/manifest/components/markdown-text.json +16 -4
  168. package/manifest/components/math-block.json +13 -3
  169. package/manifest/components/mcp-server-icon.json +12 -3
  170. package/manifest/components/mcp-server-panel.json +13 -3
  171. package/manifest/components/memory-chips.json +12 -3
  172. package/manifest/components/menubar.json +13 -3
  173. package/manifest/components/message-actions.json +14 -4
  174. package/manifest/components/message-attachments.json +12 -3
  175. package/manifest/components/message-branches.json +12 -3
  176. package/manifest/components/message-list.json +12 -3
  177. package/manifest/components/message-pair.json +12 -3
  178. package/manifest/components/message-queue.json +13 -3
  179. package/manifest/components/message-timing.json +13 -3
  180. package/manifest/components/message.json +12 -3
  181. package/manifest/components/mobile-composer.json +14 -3
  182. package/manifest/components/model-picker.json +12 -3
  183. package/manifest/components/multi-select.json +16 -4
  184. package/manifest/components/musical-time-input.json +11 -3
  185. package/manifest/components/navigation-menu.json +13 -3
  186. package/manifest/components/node-card.json +11 -3
  187. package/manifest/components/node-handle.json +11 -3
  188. package/manifest/components/number-field.json +15 -3
  189. package/manifest/components/number-ticker.json +12 -3
  190. package/manifest/components/onboarding.json +12 -3
  191. package/manifest/components/otp-field.json +14 -3
  192. package/manifest/components/page-shell.json +14 -4
  193. package/manifest/components/pagination.json +14 -3
  194. package/manifest/components/panel-header.json +14 -4
  195. package/manifest/components/password-input.json +15 -4
  196. package/manifest/components/permission-grant.json +13 -3
  197. package/manifest/components/permission-scopes.json +14 -3
  198. package/manifest/components/piano-keyboard.json +11 -3
  199. package/manifest/components/preset-section.json +11 -3
  200. package/manifest/components/progress.json +14 -3
  201. package/manifest/components/prompt-library.json +12 -3
  202. package/manifest/components/queue-dock.json +14 -3
  203. package/manifest/components/quota-banner.json +12 -3
  204. package/manifest/components/quote-reply.json +12 -3
  205. package/manifest/components/radio-group.json +15 -4
  206. package/manifest/components/radio.json +15 -4
  207. package/manifest/components/rating.json +15 -4
  208. package/manifest/components/read-aloud.json +13 -3
  209. package/manifest/components/reasoning-effort.json +12 -3
  210. package/manifest/components/reasoning-panel.json +13 -3
  211. package/manifest/components/recommendation-card.json +12 -3
  212. package/manifest/components/regenerate-menu.json +12 -3
  213. package/manifest/components/replay-player.json +14 -3
  214. package/manifest/components/research-report.json +12 -3
  215. package/manifest/components/resizable.json +13 -3
  216. package/manifest/components/retrieval-chunks.json +13 -3
  217. package/manifest/components/revert-dock.json +14 -3
  218. package/manifest/components/reviewable-diff.json +12 -3
  219. package/manifest/components/risk-badge.json +14 -3
  220. package/manifest/components/schedule-card.json +12 -3
  221. package/manifest/components/score-breakdown.json +13 -3
  222. package/manifest/components/scroll-anchor.json +12 -3
  223. package/manifest/components/scroll-area.json +13 -3
  224. package/manifest/components/scrollable-tabs-list.json +14 -4
  225. package/manifest/components/seam-cell.json +13 -4
  226. package/manifest/components/seam-grid.json +14 -3
  227. package/manifest/components/seam-list.json +13 -3
  228. package/manifest/components/search-input.json +15 -4
  229. package/manifest/components/section-header.json +14 -3
  230. package/manifest/components/segmented-control.json +15 -3
  231. package/manifest/components/separator.json +14 -3
  232. package/manifest/components/settings-panel.json +13 -3
  233. package/manifest/components/shape-section.json +11 -3
  234. package/manifest/components/shared-conversation.json +12 -3
  235. package/manifest/components/sheet.json +14 -4
  236. package/manifest/components/shimmer-label.json +12 -3
  237. package/manifest/components/sidebar.json +15 -4
  238. package/manifest/components/signal-edge.json +13 -4
  239. package/manifest/components/skeleton.json +16 -4
  240. package/manifest/components/skill-icon.json +12 -3
  241. package/manifest/components/slider.json +14 -3
  242. package/manifest/components/sources.json +12 -3
  243. package/manifest/components/sparkline.json +14 -4
  244. package/manifest/components/speaker-identity.json +11 -3
  245. package/manifest/components/spec-sheet.json +13 -4
  246. package/manifest/components/spectrum-visualizer.json +11 -3
  247. package/manifest/components/spinner.json +16 -4
  248. package/manifest/components/stack-icon.json +12 -3
  249. package/manifest/components/stack.json +14 -3
  250. package/manifest/components/stacks-matrix-icon.json +11 -3
  251. package/manifest/components/stat.json +14 -3
  252. package/manifest/components/status-dot.json +16 -4
  253. package/manifest/components/stepper.json +15 -4
  254. package/manifest/components/stopped-run.json +13 -4
  255. package/manifest/components/streaming-text.json +12 -3
  256. package/manifest/components/sub.json +11 -3
  257. package/manifest/components/subagent-list.json +13 -3
  258. package/manifest/components/suggestions.json +12 -3
  259. package/manifest/components/sup.json +11 -3
  260. package/manifest/components/swap-label.json +12 -3
  261. package/manifest/components/tags-input.json +15 -4
  262. package/manifest/components/tail-status.json +14 -3
  263. package/manifest/components/terminal-block.json +13 -3
  264. package/manifest/components/terminal-frame.json +14 -3
  265. package/manifest/components/textarea.json +15 -4
  266. package/manifest/components/theme-configurator.json +12 -3
  267. package/manifest/components/theme-provider.json +10 -0
  268. package/manifest/components/thinking-indicator.json +12 -3
  269. package/manifest/components/thread-list.json +12 -3
  270. package/manifest/components/thread-search.json +12 -3
  271. package/manifest/components/threshold-rail.json +13 -3
  272. package/manifest/components/time-boundary.json +13 -3
  273. package/manifest/components/time-field.json +15 -4
  274. package/manifest/components/timeline-ruler.json +13 -3
  275. package/manifest/components/timeline.json +13 -3
  276. package/manifest/components/title-bar.json +13 -3
  277. package/manifest/components/todo-list.json +12 -3
  278. package/manifest/components/toggle-group.json +15 -4
  279. package/manifest/components/toggle.json +15 -4
  280. package/manifest/components/token-editor.json +12 -3
  281. package/manifest/components/tool-call.json +13 -3
  282. package/manifest/components/tool-error.json +14 -4
  283. package/manifest/components/tool-group.json +12 -3
  284. package/manifest/components/tool-timeline.json +14 -4
  285. package/manifest/components/toolbar.json +14 -4
  286. package/manifest/components/trace-waterfall.json +12 -3
  287. package/manifest/components/tree-visibility-toggle.json +13 -3
  288. package/manifest/components/tree.json +14 -3
  289. package/manifest/components/turn-footer.json +14 -3
  290. package/manifest/components/two-step-button.json +14 -3
  291. package/manifest/components/typing-indicator.json +12 -3
  292. package/manifest/components/universe-grid.json +14 -4
  293. package/manifest/components/unread-divider.json +14 -4
  294. package/manifest/components/usage-chart.json +14 -3
  295. package/manifest/components/verdict-row.json +14 -3
  296. package/manifest/components/voice-conversation.json +13 -3
  297. package/manifest/components/web-preview.json +13 -3
  298. package/manifest/components/web-search.json +13 -3
  299. package/manifest/components/work-collapse.json +15 -4
  300. package/manifest/manifest.json +651 -651
  301. package/manifest/tokens.json +1 -1
  302. package/package.json +5 -5
@@ -60,10 +60,21 @@
60
60
  ],
61
61
  "summary": "The model name in the toolbar, which opens the model menu.",
62
62
  "examples": [],
63
- "status": "todo-docs",
63
+ "status": "stable",
64
64
  "url": "/docs/components/composer-model-trigger",
65
65
  "mdUrl": "/docs/components/composer-model-trigger.md",
66
66
  "jsonUrl": "/r/components/composer-model-trigger.json",
67
+ "whenToUse": [
68
+ "The toolbar control that opens the model menu, labelled with the selected model.",
69
+ "A trigger that has to be announced correctly, since it carries `aria-expanded` from `open`."
70
+ ],
71
+ "whenNotToUse": [
72
+ "A control that opens nothing. It carries `aria-expanded` for the menu it opens."
73
+ ],
74
+ "commonMistakes": [
75
+ "Leaving `open` stale. It is announced as `aria-expanded`, so a wrong value lies to a screen reader.",
76
+ "Setting `aria-expanded` yourself. The trigger already carries it, from `open`."
77
+ ],
67
78
  "specimens": [
68
79
  {
69
80
  "title": "ComposerModelTrigger / ComposerModelItem",
@@ -76,6 +87,5 @@
76
87
  "note": "The model as a word in the toolbar rather than a settings page. The trigger shows what is in use and carries `aria-expanded` for the menu it opens; each row shows the model and its one line of metadata, with a tick on the chosen one. Three rows is the point at which this stops being right and `ModelPicker` starts.",
77
88
  "interaction": "the trigger is a plain button and the menu is the same `ComposerMenu` the slash and mention lists use — nothing here portals, so an island's values reach it without any carriage."
78
89
  }
79
- ],
80
- "todo": true
90
+ ]
81
91
  }
@@ -61,10 +61,21 @@
61
61
  ],
62
62
  "summary": "A mentionable person in the menu: their initial, their name, and whether they are an agent or a human.",
63
63
  "examples": [],
64
- "status": "todo-docs",
64
+ "status": "stable",
65
65
  "url": "/docs/components/composer-person-item",
66
66
  "mdUrl": "/docs/components/composer-person-item.md",
67
67
  "jsonUrl": "/r/components/composer-person-item.json",
68
+ "whenToUse": [
69
+ "Each mentionable person or agent offered in the composer menu.",
70
+ "A mention list that mixes agents and humans, since the row says which one it is."
71
+ ],
72
+ "whenNotToUse": [
73
+ "An entry that is not a `ComposerPerson`."
74
+ ],
75
+ "commonMistakes": [
76
+ "Marking several rows `active`. It is the row Enter would pick, so only one has it.",
77
+ "Rendering your own initial beside the name. The row already draws one."
78
+ ],
68
79
  "specimens": [
69
80
  {
70
81
  "title": "ComposerMenu / useSlashMatches / useMentionMatches",
@@ -81,6 +92,5 @@
81
92
  "note": "One input, two menus, and two hooks that decide which of them has anything to say. `useSlashMatches` answers only while the value starts with a slash; `useMentionMatches` only while the caret is inside a trailing @word — so an empty result is the menu's own instruction to stay shut. `applyMention` writes the choice back into the value, which is the one piece of text editing the family does for you. Type in either field below and the menu above it follows.",
82
93
  "interaction": "the menu animates rather than mounting, so the caret never moves under it. A row is a button and takes cue's focus ring; the active one shows the return key it would answer to."
83
94
  }
84
- ],
85
- "todo": true
95
+ ]
86
96
  }
@@ -60,10 +60,21 @@
60
60
  ],
61
61
  "summary": "Send, which becomes stop while the model is streaming.",
62
62
  "examples": [],
63
- "status": "todo-docs",
63
+ "status": "stable",
64
64
  "url": "/docs/components/composer-send",
65
65
  "mdUrl": "/docs/components/composer-send.md",
66
66
  "jsonUrl": "/r/components/composer-send.json",
67
+ "whenToUse": [
68
+ "The send control of a composer, which doubles as stop while a reply streams.",
69
+ "An empty input, where `idle` dims the control because there is nothing to send."
70
+ ],
71
+ "whenNotToUse": [
72
+ "A second, separate stop button. The arrow and the square are the same control."
73
+ ],
74
+ "commonMistakes": [
75
+ "Swapping in your own stop button when streaming starts. The arrow and the square cross-fade rather than swap.",
76
+ "Leaving `idle` false on an empty input, which keeps the button bright when there is nothing to send."
77
+ ],
67
78
  "specimens": [
68
79
  {
69
80
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -81,6 +92,5 @@
81
92
  "note": "The composer assembled from its parts, which is the only way it exists — there is no root that configures it. `ElementsComposer` positions, `ComposerBar` is the paper, and everything between the input and the send button is a facet you either compose in or leave out, so a composer with no attachments carries no attachment code. `ComposerSend` is dim while the input is empty and becomes a stop square while the model is streaming; it is the same button either way, because there is never a moment when both are wanted.",
82
93
  "interaction": "`ComposerAttachButton` disables itself when no handler is given rather than rendering a control that does nothing. The send button is labelled by state — `Send message` or `Stop generating` — so the swap is announced and not just drawn."
83
94
  }
84
- ],
85
- "todo": true
95
+ ]
86
96
  }
@@ -39,10 +39,19 @@
39
39
  ],
40
40
  "summary": "The row under the input, which holds the two `ComposerActions` clusters.",
41
41
  "examples": [],
42
- "status": "todo-docs",
42
+ "status": "stable",
43
43
  "url": "/docs/components/composer-toolbar",
44
44
  "mdUrl": "/docs/components/composer-toolbar.md",
45
45
  "jsonUrl": "/r/components/composer-toolbar.json",
46
+ "whenToUse": [
47
+ "The control row beneath the composer input."
48
+ ],
49
+ "whenNotToUse": [
50
+ "Anything above the input, such as the attachment rail."
51
+ ],
52
+ "commonMistakes": [
53
+ "Putting controls straight into the toolbar. It holds two `ComposerActions` clusters, and the controls go inside them."
54
+ ],
46
55
  "specimens": [
47
56
  {
48
57
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -60,6 +69,5 @@
60
69
  "note": "The composer assembled from its parts, which is the only way it exists — there is no root that configures it. `ElementsComposer` positions, `ComposerBar` is the paper, and everything between the input and the send button is a facet you either compose in or leave out, so a composer with no attachments carries no attachment code. `ComposerSend` is dim while the input is empty and becomes a stop square while the model is streaming; it is the same button either way, because there is never a moment when both are wanted.",
61
70
  "interaction": "`ComposerAttachButton` disables itself when no handler is given rather than rendering a control that does nothing. The send button is labelled by state — `Send message` or `Stop generating` — so the swap is announced and not just drawn."
62
71
  }
63
- ],
64
- "todo": true
72
+ ]
65
73
  }
@@ -50,10 +50,19 @@
50
50
  ],
51
51
  "summary": "The microphone, which becomes a filled stop while recording.",
52
52
  "examples": [],
53
- "status": "todo-docs",
53
+ "status": "stable",
54
54
  "url": "/docs/components/composer-voice-button",
55
55
  "mdUrl": "/docs/components/composer-voice-button.md",
56
56
  "jsonUrl": "/r/components/composer-voice-button.json",
57
+ "whenToUse": [
58
+ "The toolbar control that opens and closes the microphone."
59
+ ],
60
+ "whenNotToUse": [
61
+ "A separate stop control. The same button becomes a filled stop while `active`."
62
+ ],
63
+ "commonMistakes": [
64
+ "Swapping the icon yourself when recording starts. `active` already turns the microphone into a filled stop."
65
+ ],
57
66
  "specimens": [
58
67
  {
59
68
  "title": "ComposerVoice / ComposerVoiceButton",
@@ -66,6 +75,5 @@
66
75
  "note": "What replaces the input while the microphone is open. Recording gives a level meter and a running clock; stopping leaves the same row with a shimmering `Transcribing` where the clock was, because the microphone closing is not the end of the work. The meter is drawn from `seconds` — the caller owns the tick, so this bench holds it still and a real one animates.",
67
76
  "interaction": "the button is labelled by state (`Start voice input` / `Stop recording`) and fills in while live, so the control that stops a recording never looks like the one that starts it."
68
77
  }
69
- ],
70
- "todo": true
78
+ ]
71
79
  }
@@ -60,10 +60,21 @@
60
60
  ],
61
61
  "summary": "What replaces the input while the microphone is open: a level meter, a running clock while recording, and a shimmering `Transcribing` once it stops.",
62
62
  "examples": [],
63
- "status": "todo-docs",
63
+ "status": "stable",
64
64
  "url": "/docs/components/composer-voice",
65
65
  "mdUrl": "/docs/components/composer-voice.md",
66
66
  "jsonUrl": "/r/components/composer-voice.json",
67
+ "whenToUse": [
68
+ "The recording state of a voice composer, in place of the text input.",
69
+ "The transcribing state after recording stops, which is `recording={false}`."
70
+ ],
71
+ "whenNotToUse": [
72
+ "The resting composer. `recording={false}` is the transcribing state, not the resting one — unmount it instead."
73
+ ],
74
+ "commonMistakes": [
75
+ "Expecting it to keep its own time. `seconds` drives both the clock and the meter, so the caller owns the tick.",
76
+ "Reading `recording={false}` as idle, which leaves a shimmering Transcribing on screen with nothing to transcribe."
77
+ ],
67
78
  "specimens": [
68
79
  {
69
80
  "title": "ComposerVoice / ComposerVoiceButton",
@@ -76,6 +87,5 @@
76
87
  "note": "What replaces the input while the microphone is open. Recording gives a level meter and a running clock; stopping leaves the same row with a shimmering `Transcribing` where the clock was, because the microphone closing is not the end of the work. The meter is drawn from `seconds` — the caller owns the tick, so this bench holds it still and a real one animates.",
77
88
  "interaction": "the button is labelled by state (`Start voice input` / `Stop recording`) and fills in while live, so the control that stops a recording never looks like the one that starts it."
78
89
  }
79
- ],
80
- "todo": true
90
+ ]
81
91
  }
@@ -210,7 +210,7 @@
210
210
  "--cue-text-micro",
211
211
  "--cue-text-ui"
212
212
  ],
213
- "summary": "The thing you type into: an auto-growing textarea, a send affordance, and slots for everything a host wants to hang off them.",
213
+ "summary": "The thing you type into: an auto-growing textarea, a send affordance, and slots to hang things off.",
214
214
  "examples": [
215
215
  {
216
216
  "title": "Usage",
@@ -218,10 +218,21 @@
218
218
  "language": "tsx"
219
219
  }
220
220
  ],
221
- "status": "todo-docs",
221
+ "status": "stable",
222
222
  "url": "/docs/components/composer",
223
223
  "mdUrl": "/docs/components/composer.md",
224
224
  "jsonUrl": "/r/components/composer.json",
225
+ "whenToUse": [
226
+ "Any chat or prompt input.",
227
+ "Anywhere a running request must be interruptible: `busy` plus `onStop` turns send into stop."
228
+ ],
229
+ "whenNotToUse": [
230
+ "A form field. Use `Textarea` inside a `Field`."
231
+ ],
232
+ "commonMistakes": [
233
+ "Capping it to one line. It grows rather than scrolls on purpose — a box that hides the second half of what you wrote is the most-complained-about part of every chat UI.",
234
+ "Leaving `onStop` unwired while passing `busy`, which shows a stop affordance that does nothing."
235
+ ],
225
236
  "specimens": [
226
237
  {
227
238
  "title": "Composer",
@@ -233,6 +244,5 @@
233
244
  "note": "An auto-growing textarea at the large control height, with an attachment slot, a toolbar slot and a Stop that reports rather than decides.",
234
245
  "interaction": "Enter sends by default, mod+Enter when configured the other way; Shift+Enter always inserts a newline."
235
246
  }
236
- ],
237
- "todo": true
247
+ ]
238
248
  }
@@ -78,10 +78,21 @@
78
78
  "language": "tsx"
79
79
  }
80
80
  ],
81
- "status": "todo-docs",
81
+ "status": "stable",
82
82
  "url": "/docs/components/computer-use",
83
83
  "mdUrl": "/docs/components/computer-use.md",
84
84
  "jsonUrl": "/r/components/computer-use.json",
85
+ "whenToUse": [
86
+ "A live session an agent is operating, wrapped around whatever you use for the viewport.",
87
+ "Showing the ordered actions taken, with the current one called out."
88
+ ],
89
+ "whenNotToUse": [
90
+ "A session with no viewport to show. `children` is required, and it is the thing being driven."
91
+ ],
92
+ "commonMistakes": [
93
+ "Trimming `steps` down to the current one. The two before `activeIndex` stay as a fading trail.",
94
+ "Expecting the element to supply the stream. You hand it the viewport yourself — a video stream, a screenshot, an iframe."
95
+ ],
85
96
  "specimens": [
86
97
  {
87
98
  "title": "ComputerUse",
@@ -93,6 +104,5 @@
93
104
  "note": "The screen the agent is driving, with a cursor trail behind it and the current action named underneath. The two steps before the live one stay as fading dots, which is what turns a jumping pointer into a path you can follow. The viewport is `children` — a screenshot, a video stream, a sandboxed iframe — so the element frames it and isolates nothing of its own.",
94
105
  "interaction": "none, and deliberately: this is a view of a session, not a remote control. The cursor and its trail are `aria-hidden`; the action row underneath is what a screen reader gets."
95
106
  }
96
- ],
97
- "todo": true
107
+ ]
98
108
  }
@@ -66,10 +66,19 @@
66
66
  "language": "tsx"
67
67
  }
68
68
  ],
69
- "status": "todo-docs",
69
+ "status": "stable",
70
70
  "url": "/docs/components/confidence-marker",
71
71
  "mdUrl": "/docs/components/confidence-marker.md",
72
72
  "jsonUrl": "/r/components/confidence-marker.json",
73
+ "whenToUse": [
74
+ "Generated prose where the reader must know which sentences are grounded."
75
+ ],
76
+ "whenNotToUse": [
77
+ "Citations. Use `InlineCitation` — where a claim came from and how confident it is are different questions."
78
+ ],
79
+ "commonMistakes": [
80
+ "Marking only the guesses, which leaves the reader unable to tell an unmarked sourced claim from an unmarked unchecked one."
81
+ ],
73
82
  "specimens": [
74
83
  {
75
84
  "title": "ConfidenceMarker",
@@ -81,6 +90,5 @@
81
90
  "note": "Which clause came from a source, which was worked out, and which is a guess — drawn as three underlines rather than three colours of text, so the sentence still reads as a sentence. The basis appears under it on hover, in a row that is always reserved so nothing below moves.",
82
91
  "interaction": "each clause is a button that responds to hover *and* focus, so the basis is reachable from a keyboard. The chip carries role='status' and is referenced by `aria-describedby`."
83
92
  }
84
- ],
85
- "todo": true
93
+ ]
86
94
  }
@@ -83,10 +83,20 @@
83
83
  "language": "tsx"
84
84
  }
85
85
  ],
86
- "status": "todo-docs",
86
+ "status": "stable",
87
87
  "url": "/docs/components/connection-state",
88
88
  "mdUrl": "/docs/components/connection-state.md",
89
89
  "jsonUrl": "/r/components/connection-state.json",
90
+ "whenToUse": [
91
+ "Any streamed run, so a dropped socket does not read as a dead run.",
92
+ "Anywhere the user should know work continued — `resumedTokens` is what proves it."
93
+ ],
94
+ "whenNotToUse": [
95
+ "A failed request with nothing to resume. That is an error, not a reconnection."
96
+ ],
97
+ "commonMistakes": [
98
+ "Showing a generic 'disconnected' state. The point is that the run did not stop; a message that implies it did makes people start over."
99
+ ],
90
100
  "specimens": [
91
101
  {
92
102
  "title": "ConnectionState",
@@ -98,6 +108,5 @@
98
108
  "note": "The socket drops; the run does not. Four phases, and the useful one is `online` — it renders nothing at all, so the element can stay mounted at the top of a transcript and simply have nothing to say most of the time. `dropped` offers a reconnect, `reconnecting` counts attempts, and `resumed` says how much of the stream was recovered.",
99
109
  "interaction": "Reconnect is a plain named button. Nothing here retries on its own — the phase is the caller's, so a page can back off however it likes."
100
110
  }
101
- ],
102
- "todo": true
111
+ ]
103
112
  }
@@ -55,10 +55,20 @@
55
55
  "language": "tsx"
56
56
  }
57
57
  ],
58
- "status": "todo-docs",
58
+ "status": "stable",
59
59
  "url": "/docs/components/container",
60
60
  "mdUrl": "/docs/components/container.md",
61
61
  "jsonUrl": "/r/components/container.json",
62
+ "whenToUse": [
63
+ "A page that already has its own heading — a route opening with a `TitleBar`, or a section inside a shell — where all you need is the measure."
64
+ ],
65
+ "whenNotToUse": [
66
+ "A page that needs a header too. Use `PageShell`, which is this plus one.",
67
+ "A full-bleed surface. The gutters are the point; wrapping and then cancelling them is a sign the shell is wrong."
68
+ ],
69
+ "commonMistakes": [
70
+ "Nesting one inside another, which applies the gutters twice and narrows the measure without anyone choosing to."
71
+ ],
62
72
  "specimens": [
63
73
  {
64
74
  "title": "Container",
@@ -70,6 +80,5 @@
70
80
  "note": "Three measures. The one place a max-width is allowed to be hardcoded, because a measure is typographic, not thematic.",
71
81
  "interaction": "none."
72
82
  }
73
- ],
74
- "todo": true
83
+ ]
75
84
  }
@@ -44,7 +44,7 @@
44
44
  "--cue-text-body",
45
45
  "--cue-warn"
46
46
  ],
47
- "summary": "Where the window actually went: prompt, tools, files, conversation, and what's left.",
47
+ "summary": "Where the window actually went: prompt, tools, files, conversation, and what is left.",
48
48
  "examples": [
49
49
  {
50
50
  "title": "Usage",
@@ -52,10 +52,19 @@
52
52
  "language": "tsx"
53
53
  }
54
54
  ],
55
- "status": "todo-docs",
55
+ "status": "stable",
56
56
  "url": "/docs/components/context-breakdown",
57
57
  "mdUrl": "/docs/components/context-breakdown.md",
58
58
  "jsonUrl": "/r/components/context-breakdown.json",
59
+ "whenToUse": [
60
+ "Showing the shape of context use without the cost argument around it."
61
+ ],
62
+ "whenNotToUse": [
63
+ "A full accounting with cost. Use `ContextUsage`."
64
+ ],
65
+ "commonMistakes": [
66
+ "Omitting `limit`, which leaves the segments with nothing to be a share of."
67
+ ],
59
68
  "specimens": [
60
69
  {
61
70
  "title": "ContextBreakdown",
@@ -67,6 +76,5 @@
67
76
  "note": "Where the window actually went, which is the question a context limit never answers on its own. Headroom is derived rather than passed — it is whatever the segments left — and the header turns warn once they pass 85 per cent of the limit. The tint is the caller's: the same class paints the bar slice and its legend dot, so the two cannot drift apart.",
68
77
  "interaction": "none. The legend dots are `aria-hidden`; the label beside each one carries the meaning."
69
78
  }
70
- ],
71
- "todo": true
79
+ ]
72
80
  }
@@ -106,7 +106,7 @@
106
106
  "--cue-text-label",
107
107
  "--cue-text-ui"
108
108
  ],
109
- "summary": "The menu a right click raises: row actions on a cue list, fixture actions on the patch grid, node actions on a canvas.",
109
+ "summary": "The menu a right click raises: row actions on a cue list, node actions on a canvas.",
110
110
  "examples": [
111
111
  {
112
112
  "title": "Usage",
@@ -114,10 +114,21 @@
114
114
  "language": "tsx"
115
115
  }
116
116
  ],
117
- "status": "todo-docs",
117
+ "status": "stable",
118
118
  "url": "/docs/components/context-menu",
119
119
  "mdUrl": "/docs/components/context-menu.md",
120
120
  "jsonUrl": "/r/components/context-menu.json",
121
+ "whenToUse": [
122
+ "Actions that belong to the thing under the pointer.",
123
+ "Anywhere the same actions should also be reachable another way — a right click is not discoverable on its own."
124
+ ],
125
+ "whenNotToUse": [
126
+ "The only path to an action. Keyboard users never right-click.",
127
+ "Navigation. Use links."
128
+ ],
129
+ "commonMistakes": [
130
+ "Restyling the rows. They *are* `DropdownMenu`'s rows, re-exported rather than re-skinned — a user should never be able to tell from a row how they got to it."
131
+ ],
121
132
  "specimens": [
122
133
  {
123
134
  "title": "ContextMenu",
@@ -129,6 +140,5 @@
129
140
  "note": "The same menu surface, opened by a right-click on a region rather than by a button.",
130
141
  "interaction": "the Menu key and Shift+F10 open it from the keyboard, which is the part most implementations forget."
131
142
  }
132
- ],
133
- "todo": true
143
+ ]
134
144
  }
@@ -70,7 +70,7 @@
70
70
  "--cue-text-body",
71
71
  "--cue-warn"
72
72
  ],
73
- "summary": "Where the window went, what share each part of it took, and what that cost.",
73
+ "summary": "Where the window went, what share each part took, and what that cost.",
74
74
  "examples": [
75
75
  {
76
76
  "title": "Usage",
@@ -78,10 +78,21 @@
78
78
  "language": "tsx"
79
79
  }
80
80
  ],
81
- "status": "todo-docs",
81
+ "status": "stable",
82
82
  "url": "/docs/components/context-usage",
83
83
  "mdUrl": "/docs/components/context-usage.md",
84
84
  "jsonUrl": "/r/components/context-usage.json",
85
+ "whenToUse": [
86
+ "Answering 'why did it forget the thing I said an hour ago' with *the venue's documents are 38k of it* rather than a number going up.",
87
+ "Anywhere the cost belongs beside the shape — the bar, the table and the stat rows are three readings of one thing."
88
+ ],
89
+ "whenNotToUse": [
90
+ "A limit alone. A context limit tells a reader nothing they can act on.",
91
+ "The breakdown without the bill. Use `ContextBreakdown`."
92
+ ],
93
+ "commonMistakes": [
94
+ "Rebuilding the breakdown as a grid of divs. It is a real table with real column headers, because three columns of numbers whose meaning is carried by the header is exactly what a table is for."
95
+ ],
85
96
  "specimens": [
86
97
  {
87
98
  "title": "ContextUsage",
@@ -93,6 +104,5 @@
93
104
  "note": "Where the window went, what share each part took, and what that cost — Cursor's tray, opencode's labels and Claude Code's table, which between them are a complete spec. The breakdown is a real table with real column headers because three columns of numbers whose meaning lives in the heading above them is exactly what a table is for. A category that names no tone takes the next hue in the family's rotation, so five rows are legible without the caller choosing five colours that fight.",
94
105
  "interaction": "none. The bar is aria-hidden — every figure in it is written out in the table under it — and pressure is stated on the element as `data-pressure`, so a console can style the whole card from one attribute rather than from a threshold of its own."
95
106
  }
96
- ],
97
- "todo": true
107
+ ]
98
108
  }
@@ -91,10 +91,21 @@
91
91
  "language": "tsx"
92
92
  }
93
93
  ],
94
- "status": "todo-docs",
94
+ "status": "stable",
95
95
  "url": "/docs/components/conversation-search",
96
96
  "mdUrl": "/docs/components/conversation-search.md",
97
97
  "jsonUrl": "/r/components/conversation-search.json",
98
+ "whenToUse": [
99
+ "Searching a long transcript, where the hits should be visible on the scroll rail and not only in a list."
100
+ ],
101
+ "whenNotToUse": [
102
+ "Searching across threads rather than inside one."
103
+ ],
104
+ "commonMistakes": [
105
+ "Looking up surrounding text per hit. Each `SearchHit` carries its own, so nothing needs fetching to render the preview.",
106
+ "Expecting `onStep` to hand you a new index. It is called with -1 or 1 and you wrap the index yourself.",
107
+ "Re-clamping `activeIndex` when the results narrow. It is already clamped to the current hit set, so narrowing cannot strand it out of range."
108
+ ],
98
109
  "specimens": [
99
110
  {
100
111
  "title": "ConversationSearch",
@@ -106,6 +117,5 @@
106
117
  "note": "Find inside one long thread, with every hit marked down the scrollbar so the shape of the answer is visible before you walk it. Each hit carries its own surrounding text, so the preview needs no lookup back into the transcript — which is what lets a search box render before the thread it is searching has loaded.",
107
118
  "interaction": "the counter and the rail agree because `activeIndex` is clamped to the current hit set: narrowing the results cannot strand the marker out of range. Stepping is `-1` and `1`; wrapping is the caller's."
108
119
  }
109
- ],
110
- "todo": true
120
+ ]
111
121
  }
@@ -98,10 +98,22 @@
98
98
  "language": "tsx"
99
99
  }
100
100
  ],
101
- "status": "todo-docs",
101
+ "status": "stable",
102
102
  "url": "/docs/components/copy-button",
103
103
  "mdUrl": "/docs/components/copy-button.md",
104
104
  "jsonUrl": "/r/components/copy-button.json",
105
+ "whenToUse": [
106
+ "Any value the reader is meant to take elsewhere: an id, a token, a command.",
107
+ "Anywhere the confirmation must be heard as well as seen — the label lives in an `aria-live` region."
108
+ ],
109
+ "whenNotToUse": [
110
+ "A whole document or a selection. That is the browser's copy, not a button."
111
+ ],
112
+ "commonMistakes": [
113
+ "Replacing the label swap with a toast. At console density a toast for 'copied an id' is heavier than the action itself.",
114
+ "Confirming on a colour change alone, which is never announced (WCAG 1.4.1).",
115
+ "Treating a failed copy as success. Both the async clipboard and the fallback can fail, and `onCopyError` is how you find out."
116
+ ],
105
117
  "specimens": [
106
118
  {
107
119
  "title": "CopyButton",
@@ -113,6 +125,5 @@
113
125
  "note": "Copies, then says so for a beat. The confirmation is text, not a colour change.",
114
126
  "interaction": "the label swaps to the copied state and reverts after the timeout; the accessible name swaps with it."
115
127
  }
116
- ],
117
- "todo": true
128
+ ]
118
129
  }
@@ -64,10 +64,20 @@
64
64
  "language": "tsx"
65
65
  }
66
66
  ],
67
- "status": "todo-docs",
67
+ "status": "stable",
68
68
  "url": "/docs/components/cost-meter",
69
69
  "mdUrl": "/docs/components/cost-meter.md",
70
70
  "jsonUrl": "/r/components/cost-meter.json",
71
+ "whenToUse": [
72
+ "Any surface where spend is a fact the user acts on.",
73
+ "Multi-model runs, where the split is the interesting part."
74
+ ],
75
+ "whenNotToUse": [
76
+ "Context pressure. Use `ContextUsage` — tokens held and money spent are different questions."
77
+ ],
78
+ "commonMistakes": [
79
+ "Showing the run cost with no session total, which removes the only context that makes it mean anything."
80
+ ],
71
81
  "specimens": [
72
82
  {
73
83
  "title": "CostMeter",
@@ -79,6 +89,5 @@
79
89
  "note": "What the run spent, against what the session has spent — two numbers, then the arithmetic under them. Every figure arrives pre-formatted: the element does no currency maths and no rounding, so a bench and a billing page cannot disagree about what `$3.12` means.",
80
90
  "interaction": "none. `share` drives the bar and the lines are given largest-first, so the bar reads left to right in the same order as the rows."
81
91
  }
82
- ],
83
- "todo": true
92
+ ]
84
93
  }
@@ -49,7 +49,7 @@
49
49
  "--cue-font-sans",
50
50
  "--cue-font-scale"
51
51
  ],
52
- "summary": "Inline version of the portal contract, for portals whose container cannot be chosen (a third-party overlay, or content already portaled by something else).",
52
+ "summary": "Inline version of the portal contract, for portals whose container you cannot choose.",
53
53
  "examples": [
54
54
  {
55
55
  "title": "Usage",
@@ -57,9 +57,18 @@
57
57
  "language": "tsx"
58
58
  }
59
59
  ],
60
- "status": "todo-docs",
60
+ "status": "stable",
61
61
  "url": "/docs/components/cue-portal-frame",
62
62
  "mdUrl": "/docs/components/cue-portal-frame.md",
63
63
  "jsonUrl": "/r/components/cue-portal-frame.json",
64
- "todo": true
64
+ "whenToUse": [
65
+ "A third-party overlay, or content already portalled by something else, that must still carry the theme, density, font, mode and style stamps."
66
+ ],
67
+ "whenNotToUse": [
68
+ "A portal you control. Prefer the `useCuePortalProps` hook — this exists for the case where you cannot reach the container."
69
+ ],
70
+ "commonMistakes": [
71
+ "Reaching for it first. It is the fallback, not the default, and wrapping in `display: contents` where the hook would do is one more element for nothing.",
72
+ "Stamping only `data-theme`. The contract is the whole set — theme, density, font, mode, style, skin, fidelity, font scale and overrides — or a portal renders half-themed."
73
+ ]
65
74
  }
@@ -76,10 +76,21 @@
76
76
  "language": "tsx"
77
77
  }
78
78
  ],
79
- "status": "todo-docs",
79
+ "status": "stable",
80
80
  "url": "/docs/components/data-table-pagination",
81
81
  "mdUrl": "/docs/components/data-table-pagination.md",
82
82
  "jsonUrl": "/r/components/data-table-pagination.json",
83
+ "whenToUse": [
84
+ "Any paged table.",
85
+ "Tables that get sorted to put the interesting row at one end — first and last exist because stepping there one page at a time is not a navigation strategy."
86
+ ],
87
+ "whenNotToUse": [
88
+ "A table short enough to scroll.",
89
+ "A non-table list. Use `Pagination`."
90
+ ],
91
+ "commonMistakes": [
92
+ "Rebuilding the buttons as bare glyphs. Every one is an `IconButton` with a real accessible name — an arrow alone announces as nothing."
93
+ ],
83
94
  "specimens": [
84
95
  {
85
96
  "title": "DataTable recipe",
@@ -92,6 +103,5 @@
92
103
  "note": "Not a component: `useCueTable` wires four TanStack v9 features, `DataTableToolbar` and `DataTablePagination` supply the chrome, and the markup stays at the call site. Rendered through the same Table above.",
93
104
  "interaction": "the header cells are buttons that toggle sorting; the pager disables at the ends rather than hiding."
94
105
  }
95
- ],
96
- "todo": true
106
+ ]
97
107
  }