@cueplusplus/ui 0.14.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 (296) hide show
  1. package/CHANGELOG.md +183 -0
  2. package/dist/primitives/chip.d.ts +1 -1
  3. package/dist/system/theme-provider.d.ts +25 -3
  4. package/dist/system/theme-provider.js +27 -2
  5. package/manifest/components/accordion.json +16 -4
  6. package/manifest/components/activity-graph.json +15 -3
  7. package/manifest/components/agent-card.json +15 -3
  8. package/manifest/components/agent-handoff.json +14 -3
  9. package/manifest/components/agent-mode-badge.json +12 -3
  10. package/manifest/components/agent-pile.json +13 -3
  11. package/manifest/components/agent-plan.json +13 -3
  12. package/manifest/components/agent-status.json +14 -3
  13. package/manifest/components/agent-surface.json +12 -3
  14. package/manifest/components/alert-dialog.json +14 -3
  15. package/manifest/components/animated-number.json +12 -3
  16. package/manifest/components/app-window-frame.json +13 -3
  17. package/manifest/components/approval-card.json +14 -3
  18. package/manifest/components/artifact-card.json +14 -3
  19. package/manifest/components/ask-box.json +13 -3
  20. package/manifest/components/audience-icon.json +11 -3
  21. package/manifest/components/autocomplete.json +15 -3
  22. package/manifest/components/avatar-group.json +15 -4
  23. package/manifest/components/avatar.json +16 -4
  24. package/manifest/components/background-inbox.json +14 -3
  25. package/manifest/components/band.json +14 -4
  26. package/manifest/components/breadcrumb.json +14 -3
  27. package/manifest/components/button-group.json +13 -3
  28. package/manifest/components/calendar.json +15 -4
  29. package/manifest/components/canvas-split-body.json +13 -3
  30. package/manifest/components/canvas-split-document.json +11 -3
  31. package/manifest/components/canvas-split-header.json +13 -3
  32. package/manifest/components/canvas-split-line.json +13 -3
  33. package/manifest/components/canvas-split-message.json +13 -3
  34. package/manifest/components/canvas-split-thread.json +11 -3
  35. package/manifest/components/canvas-split.json +13 -3
  36. package/manifest/components/card.json +14 -3
  37. package/manifest/components/carousel.json +12 -3
  38. package/manifest/components/catalogue-icon.json +11 -3
  39. package/manifest/components/channel-beta-icon.json +11 -3
  40. package/manifest/components/channel-matrix.json +11 -3
  41. package/manifest/components/channel-released-icon.json +11 -3
  42. package/manifest/components/chart-container.json +11 -3
  43. package/manifest/components/chart-ramp.json +12 -3
  44. package/manifest/components/chart-swatch.json +11 -3
  45. package/manifest/components/chart-tooltip-content.json +12 -4
  46. package/manifest/components/chart.json +14 -3
  47. package/manifest/components/chat-empty-state.json +13 -3
  48. package/manifest/components/chat-panel-assistant-message.json +11 -3
  49. package/manifest/components/chat-panel-composer.json +11 -3
  50. package/manifest/components/chat-panel-messages.json +11 -3
  51. package/manifest/components/chat-panel-typing.json +11 -3
  52. package/manifest/components/chat-panel-user-message.json +11 -3
  53. package/manifest/components/chat-panel.json +13 -3
  54. package/manifest/components/checkbox-group.json +15 -4
  55. package/manifest/components/checkpoint-history.json +13 -3
  56. package/manifest/components/clamp.json +12 -3
  57. package/manifest/components/cli-tool-icon.json +11 -3
  58. package/manifest/components/code-diff.json +14 -3
  59. package/manifest/components/code-runner.json +13 -3
  60. package/manifest/components/collapsible.json +13 -3
  61. package/manifest/components/color-area.json +12 -4
  62. package/manifest/components/color-field.json +12 -3
  63. package/manifest/components/color-picker.json +14 -4
  64. package/manifest/components/color-slider.json +12 -3
  65. package/manifest/components/color-swatch.json +13 -3
  66. package/manifest/components/colors-section.json +11 -3
  67. package/manifest/components/combobox.json +15 -4
  68. package/manifest/components/compaction-row.json +12 -3
  69. package/manifest/components/comparison-card.json +12 -3
  70. package/manifest/components/composer-actions.json +11 -3
  71. package/manifest/components/composer-attach-button.json +11 -3
  72. package/manifest/components/composer-attachment-chip.json +13 -3
  73. package/manifest/components/composer-attachments.json +11 -3
  74. package/manifest/components/composer-bar.json +12 -3
  75. package/manifest/components/composer-command-item.json +13 -3
  76. package/manifest/components/composer-context.json +13 -3
  77. package/manifest/components/composer-input.json +11 -3
  78. package/manifest/components/composer-menu-item.json +12 -3
  79. package/manifest/components/composer-menu.json +13 -3
  80. package/manifest/components/composer-model-item.json +13 -3
  81. package/manifest/components/composer-model-trigger.json +13 -3
  82. package/manifest/components/composer-person-item.json +13 -3
  83. package/manifest/components/composer-send.json +13 -3
  84. package/manifest/components/composer-toolbar.json +11 -3
  85. package/manifest/components/composer-voice-button.json +11 -3
  86. package/manifest/components/composer-voice.json +13 -3
  87. package/manifest/components/composer.json +14 -4
  88. package/manifest/components/computer-use.json +13 -3
  89. package/manifest/components/confidence-marker.json +11 -3
  90. package/manifest/components/connection-state.json +12 -3
  91. package/manifest/components/container.json +12 -3
  92. package/manifest/components/context-breakdown.json +12 -4
  93. package/manifest/components/context-menu.json +14 -4
  94. package/manifest/components/context-usage.json +14 -4
  95. package/manifest/components/conversation-search.json +13 -3
  96. package/manifest/components/copy-button.json +14 -3
  97. package/manifest/components/cost-meter.json +12 -3
  98. package/manifest/components/cue-portal-frame.json +12 -3
  99. package/manifest/components/data-table-pagination.json +13 -3
  100. package/manifest/components/data-table-toolbar.json +12 -3
  101. package/manifest/components/date-field.json +12 -3
  102. package/manifest/components/date-picker.json +13 -3
  103. package/manifest/components/date-range-picker.json +11 -3
  104. package/manifest/components/day-separator.json +12 -3
  105. package/manifest/components/delegation-card.json +14 -4
  106. package/manifest/components/density.json +12 -2
  107. package/manifest/components/description-list.json +15 -4
  108. package/manifest/components/diagram.json +13 -3
  109. package/manifest/components/disclosure.json +15 -4
  110. package/manifest/components/dmx-bar.json +12 -3
  111. package/manifest/components/dmx-strip.json +11 -3
  112. package/manifest/components/document-reference.json +13 -3
  113. package/manifest/components/draft-restore.json +13 -3
  114. package/manifest/components/drawer.json +13 -4
  115. package/manifest/components/edit-message.json +13 -3
  116. package/manifest/components/elements-command-palette.json +13 -3
  117. package/manifest/components/elements-composer.json +13 -3
  118. package/manifest/components/elements-data-table.json +11 -3
  119. package/manifest/components/elements-timeline.json +13 -3
  120. package/manifest/components/elicitation-form.json +13 -3
  121. package/manifest/components/empty-state-composer.json +11 -3
  122. package/manifest/components/empty-state-greeting.json +11 -3
  123. package/manifest/components/empty-state-suggestion.json +11 -3
  124. package/manifest/components/empty-state-suggestions.json +11 -3
  125. package/manifest/components/empty-state.json +15 -4
  126. package/manifest/components/end-of-turn-summary.json +14 -3
  127. package/manifest/components/env-var-input.json +15 -4
  128. package/manifest/components/error-state.json +13 -3
  129. package/manifest/components/export-dialog.json +10 -2
  130. package/manifest/components/eyebrow.json +14 -4
  131. package/manifest/components/feedback-dialog.json +13 -3
  132. package/manifest/components/field-description.json +15 -4
  133. package/manifest/components/field-error.json +15 -4
  134. package/manifest/components/field-label.json +15 -4
  135. package/manifest/components/file-tree.json +13 -3
  136. package/manifest/components/file-upload.json +14 -4
  137. package/manifest/components/flow-background.json +11 -3
  138. package/manifest/components/flow-controls.json +11 -3
  139. package/manifest/components/flow-graph.json +13 -3
  140. package/manifest/components/folder-icon.json +12 -3
  141. package/manifest/components/frac.json +11 -3
  142. package/manifest/components/generation-loader.json +13 -3
  143. package/manifest/components/generative-ui.json +16 -4
  144. package/manifest/components/grid.json +14 -3
  145. package/manifest/components/group-bar.json +13 -3
  146. package/manifest/components/guardrail-notice.json +13 -3
  147. package/manifest/components/hover-card.json +14 -4
  148. package/manifest/components/icon-button.json +15 -3
  149. package/manifest/components/image-generation.json +13 -3
  150. package/manifest/components/info-tip.json +15 -4
  151. package/manifest/components/inline-citation.json +13 -3
  152. package/manifest/components/input-group.json +15 -4
  153. package/manifest/components/item.json +15 -4
  154. package/manifest/components/job-progress.json +14 -3
  155. package/manifest/components/kbd.json +14 -3
  156. package/manifest/components/launcher-bubble.json +14 -3
  157. package/manifest/components/link.json +13 -3
  158. package/manifest/components/live-region-announcer.json +16 -4
  159. package/manifest/components/log-viewer.json +15 -3
  160. package/manifest/components/map-answer.json +13 -3
  161. package/manifest/components/markdown-text.json +16 -4
  162. package/manifest/components/math-block.json +13 -3
  163. package/manifest/components/mcp-server-icon.json +12 -3
  164. package/manifest/components/mcp-server-panel.json +13 -3
  165. package/manifest/components/memory-chips.json +12 -3
  166. package/manifest/components/menubar.json +13 -3
  167. package/manifest/components/message-actions.json +14 -4
  168. package/manifest/components/message-attachments.json +12 -3
  169. package/manifest/components/message-branches.json +12 -3
  170. package/manifest/components/message-list.json +12 -3
  171. package/manifest/components/message-pair.json +12 -3
  172. package/manifest/components/message-queue.json +13 -3
  173. package/manifest/components/message-timing.json +13 -3
  174. package/manifest/components/message.json +12 -3
  175. package/manifest/components/mobile-composer.json +14 -3
  176. package/manifest/components/model-picker.json +12 -3
  177. package/manifest/components/multi-select.json +16 -4
  178. package/manifest/components/musical-time-input.json +11 -3
  179. package/manifest/components/navigation-menu.json +13 -3
  180. package/manifest/components/node-card.json +11 -3
  181. package/manifest/components/node-handle.json +11 -3
  182. package/manifest/components/number-field.json +15 -3
  183. package/manifest/components/number-ticker.json +12 -3
  184. package/manifest/components/onboarding.json +12 -3
  185. package/manifest/components/otp-field.json +14 -3
  186. package/manifest/components/page-shell.json +14 -4
  187. package/manifest/components/pagination.json +14 -3
  188. package/manifest/components/panel-header.json +14 -4
  189. package/manifest/components/password-input.json +15 -4
  190. package/manifest/components/permission-grant.json +13 -3
  191. package/manifest/components/permission-scopes.json +14 -3
  192. package/manifest/components/piano-keyboard.json +11 -3
  193. package/manifest/components/preset-section.json +11 -3
  194. package/manifest/components/progress.json +14 -3
  195. package/manifest/components/prompt-library.json +12 -3
  196. package/manifest/components/queue-dock.json +14 -3
  197. package/manifest/components/quota-banner.json +12 -3
  198. package/manifest/components/quote-reply.json +12 -3
  199. package/manifest/components/radio-group.json +15 -4
  200. package/manifest/components/radio.json +15 -4
  201. package/manifest/components/rating.json +15 -4
  202. package/manifest/components/read-aloud.json +13 -3
  203. package/manifest/components/reasoning-effort.json +12 -3
  204. package/manifest/components/reasoning-panel.json +13 -3
  205. package/manifest/components/recommendation-card.json +12 -3
  206. package/manifest/components/regenerate-menu.json +12 -3
  207. package/manifest/components/replay-player.json +14 -3
  208. package/manifest/components/research-report.json +12 -3
  209. package/manifest/components/resizable.json +13 -3
  210. package/manifest/components/retrieval-chunks.json +13 -3
  211. package/manifest/components/revert-dock.json +14 -3
  212. package/manifest/components/reviewable-diff.json +12 -3
  213. package/manifest/components/risk-badge.json +14 -3
  214. package/manifest/components/schedule-card.json +12 -3
  215. package/manifest/components/score-breakdown.json +13 -3
  216. package/manifest/components/scroll-anchor.json +12 -3
  217. package/manifest/components/scroll-area.json +13 -3
  218. package/manifest/components/scrollable-tabs-list.json +14 -4
  219. package/manifest/components/seam-cell.json +13 -4
  220. package/manifest/components/seam-grid.json +14 -3
  221. package/manifest/components/seam-list.json +13 -3
  222. package/manifest/components/search-input.json +15 -4
  223. package/manifest/components/section-header.json +14 -3
  224. package/manifest/components/segmented-control.json +15 -3
  225. package/manifest/components/separator.json +14 -3
  226. package/manifest/components/settings-panel.json +13 -3
  227. package/manifest/components/shape-section.json +11 -3
  228. package/manifest/components/shared-conversation.json +12 -3
  229. package/manifest/components/sheet.json +14 -4
  230. package/manifest/components/shimmer-label.json +12 -3
  231. package/manifest/components/sidebar.json +15 -4
  232. package/manifest/components/signal-edge.json +13 -4
  233. package/manifest/components/skeleton.json +16 -4
  234. package/manifest/components/skill-icon.json +12 -3
  235. package/manifest/components/slider.json +14 -3
  236. package/manifest/components/sources.json +12 -3
  237. package/manifest/components/sparkline.json +14 -4
  238. package/manifest/components/speaker-identity.json +11 -3
  239. package/manifest/components/spec-sheet.json +13 -4
  240. package/manifest/components/spectrum-visualizer.json +11 -3
  241. package/manifest/components/spinner.json +16 -4
  242. package/manifest/components/stack-icon.json +12 -3
  243. package/manifest/components/stack.json +14 -3
  244. package/manifest/components/stacks-matrix-icon.json +11 -3
  245. package/manifest/components/stat.json +14 -3
  246. package/manifest/components/status-dot.json +16 -4
  247. package/manifest/components/stepper.json +15 -4
  248. package/manifest/components/stopped-run.json +13 -4
  249. package/manifest/components/streaming-text.json +12 -3
  250. package/manifest/components/sub.json +11 -3
  251. package/manifest/components/subagent-list.json +13 -3
  252. package/manifest/components/suggestions.json +12 -3
  253. package/manifest/components/sup.json +11 -3
  254. package/manifest/components/swap-label.json +12 -3
  255. package/manifest/components/tags-input.json +15 -4
  256. package/manifest/components/tail-status.json +14 -3
  257. package/manifest/components/terminal-block.json +13 -3
  258. package/manifest/components/terminal-frame.json +14 -3
  259. package/manifest/components/textarea.json +15 -4
  260. package/manifest/components/theme-configurator.json +12 -3
  261. package/manifest/components/theme-provider.json +1 -1
  262. package/manifest/components/thinking-indicator.json +12 -3
  263. package/manifest/components/thread-list.json +12 -3
  264. package/manifest/components/thread-search.json +12 -3
  265. package/manifest/components/threshold-rail.json +13 -3
  266. package/manifest/components/time-boundary.json +13 -3
  267. package/manifest/components/time-field.json +15 -4
  268. package/manifest/components/timeline-ruler.json +13 -3
  269. package/manifest/components/timeline.json +13 -3
  270. package/manifest/components/title-bar.json +13 -3
  271. package/manifest/components/todo-list.json +12 -3
  272. package/manifest/components/toggle-group.json +15 -4
  273. package/manifest/components/toggle.json +15 -4
  274. package/manifest/components/token-editor.json +12 -3
  275. package/manifest/components/tool-call.json +13 -3
  276. package/manifest/components/tool-error.json +14 -4
  277. package/manifest/components/tool-group.json +12 -3
  278. package/manifest/components/tool-timeline.json +14 -4
  279. package/manifest/components/toolbar.json +14 -4
  280. package/manifest/components/trace-waterfall.json +12 -3
  281. package/manifest/components/tree-visibility-toggle.json +13 -3
  282. package/manifest/components/tree.json +14 -3
  283. package/manifest/components/turn-footer.json +14 -3
  284. package/manifest/components/two-step-button.json +14 -3
  285. package/manifest/components/typing-indicator.json +12 -3
  286. package/manifest/components/universe-grid.json +14 -4
  287. package/manifest/components/unread-divider.json +14 -4
  288. package/manifest/components/usage-chart.json +14 -3
  289. package/manifest/components/verdict-row.json +14 -3
  290. package/manifest/components/voice-conversation.json +13 -3
  291. package/manifest/components/web-preview.json +13 -3
  292. package/manifest/components/web-search.json +13 -3
  293. package/manifest/components/work-collapse.json +15 -4
  294. package/manifest/manifest.json +649 -649
  295. package/manifest/tokens.json +1 -1
  296. package/package.json +4 -4
@@ -176,7 +176,7 @@
176
176
  "--cue-text-label",
177
177
  "--cue-text-ui"
178
178
  ],
179
- "summary": "A swipe-dismissable edge panel — the touch-first cousin of {@link Sheet }.",
179
+ "summary": "A swipe-dismissable edge panel — the touch-first cousin of `Sheet`.",
180
180
  "examples": [
181
181
  {
182
182
  "title": "Usage",
@@ -184,10 +184,20 @@
184
184
  "language": "tsx"
185
185
  }
186
186
  ],
187
- "status": "todo-docs",
187
+ "status": "stable",
188
188
  "url": "/docs/components/drawer",
189
189
  "mdUrl": "/docs/components/drawer.md",
190
190
  "jsonUrl": "/r/components/drawer.json",
191
+ "whenToUse": [
192
+ "Touch surfaces, where dragging a panel away is the natural dismissal.",
193
+ "Stacked panels: nested-drawer stacking comes from the primitive."
194
+ ],
195
+ "whenNotToUse": [
196
+ "Pointer-first consoles. Use `Sheet`."
197
+ ],
198
+ "commonMistakes": [
199
+ "Setting the edge and the gesture separately. `swipeDirection` picks both together on purpose, so a drawer can never be dragged in a direction that does not dismiss it."
200
+ ],
191
201
  "specimens": [
192
202
  {
193
203
  "title": "Drawer",
@@ -199,6 +209,5 @@
199
209
  "note": "The touch-first sheet: a grab handle and a swipe direction.",
200
210
  "interaction": "drag the handle to dismiss; on a pointer device it behaves as an ordinary sheet."
201
211
  }
202
- ],
203
- "todo": true
212
+ ]
204
213
  }
@@ -111,10 +111,21 @@
111
111
  "language": "tsx"
112
112
  }
113
113
  ],
114
- "status": "todo-docs",
114
+ "status": "stable",
115
115
  "url": "/docs/components/edit-message",
116
116
  "mdUrl": "/docs/components/edit-message.md",
117
117
  "jsonUrl": "/r/components/edit-message.json",
118
+ "whenToUse": [
119
+ "Editing a message already in the transcript, where the cost — the replies after it — should be stated before sending.",
120
+ "A turn that reads as a plain bubble until it is clicked, with `onStartEdit` opening the composer."
121
+ ],
122
+ "whenNotToUse": [
123
+ "Composing a new message. This swaps between a resting bubble and an edit composer for a turn that already exists."
124
+ ],
125
+ "commonMistakes": [
126
+ "Expecting `onCancel` to put the old text back. Restore the original yourself.",
127
+ "Passing `discardedReplies={0}` while replies exist. The warning hides at zero, which silently removes the one thing the element is for."
128
+ ],
118
129
  "specimens": [
119
130
  {
120
131
  "title": "EditMessage",
@@ -126,6 +137,5 @@
126
137
  "note": "Rewriting a turn you already sent, told up front what it throws away. The count is the point: editing the third message of a thread discards everything after it, and a control that hid that would be a data-loss trap wearing a pencil icon.",
127
138
  "interaction": "resting, the whole bubble is the button that starts an edit. Editing, the textarea is labelled and takes cue's focus ring; Send leads and Cancel is a ghost."
128
139
  }
129
- ],
130
- "todo": true
140
+ ]
131
141
  }
@@ -102,10 +102,21 @@
102
102
  "language": "tsx"
103
103
  }
104
104
  ],
105
- "status": "todo-docs",
105
+ "status": "stable",
106
106
  "url": "/docs/components/elements-command-palette",
107
107
  "mdUrl": "/docs/components/elements-command-palette.md",
108
108
  "jsonUrl": "/r/components/elements-command-palette.json",
109
+ "whenToUse": [
110
+ "A keystroke-away list of every runnable command in the app.",
111
+ "A list where the arrow keys and Enter should already work, because the element owns the key handling."
112
+ ],
113
+ "whenNotToUse": [
114
+ "A menu whose grouping you want to control. Groups are derived from the entries and keep first-seen order."
115
+ ],
116
+ "commonMistakes": [
117
+ "Adding your own arrow-key and Enter handling. The element owns the key handling and reports where it landed through `onActiveChange`.",
118
+ "Treating `activeId` as the element's own state. It stays yours to hold; the element only reports the move."
119
+ ],
109
120
  "specimens": [
110
121
  {
111
122
  "title": "ElementsCommandPalette",
@@ -117,6 +128,5 @@
117
128
  "note": "Everything the console can do, one keystroke away and grouped by where it acts. The element owns the arrow keys and reports where they landed, so the highlighted row stays the caller's state — and `aria-activedescendant` moves the highlight without moving focus, which is what keeps typing and walking the list the same gesture. Groups are derived from the commands and keep first-seen order, so the palette cannot be re-ordered by accident.",
118
129
  "interaction": "the input is a combobox over a listbox; arrows walk, Enter runs, and a query that filters the active row out drops the descendant reference rather than pointing at nothing."
119
130
  }
120
- ],
121
- "todo": true
131
+ ]
122
132
  }
@@ -45,10 +45,21 @@
45
45
  "language": "tsx"
46
46
  }
47
47
  ],
48
- "status": "todo-docs",
48
+ "status": "stable",
49
49
  "url": "/docs/components/elements-composer",
50
50
  "mdUrl": "/docs/components/elements-composer.md",
51
51
  "jsonUrl": "/r/components/elements-composer.json",
52
+ "whenToUse": [
53
+ "A full message input that needs attachments, slash commands, mentions, a model picker, voice and context usage together.",
54
+ "A composer that has to show how much of the context window is gone alongside the input itself."
55
+ ],
56
+ "whenNotToUse": [
57
+ "A screen that only needs the shape of a composer rather than a working one."
58
+ ],
59
+ "commonMistakes": [
60
+ "Putting `ComposerInput` outside `ComposerBar`. The bar is the surface the input, the attachments and the toolbar sit on.",
61
+ "Hanging controls straight off `ComposerToolbar`. They go in `ComposerActions` clusters, one at each end."
62
+ ],
52
63
  "specimens": [
53
64
  {
54
65
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -66,6 +77,5 @@
66
77
  "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.",
67
78
  "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."
68
79
  }
69
- ],
70
- "todo": true
80
+ ]
71
81
  }
@@ -55,10 +55,19 @@
55
55
  "language": "tsx"
56
56
  }
57
57
  ],
58
- "status": "todo-docs",
58
+ "status": "stable",
59
59
  "url": "/docs/components/elements-data-table",
60
60
  "mdUrl": "/docs/components/elements-data-table.md",
61
61
  "jsonUrl": "/r/components/elements-data-table.json",
62
+ "whenToUse": [
63
+ "A short comparison the model produced as part of an answer — model name, context window and cost."
64
+ ],
65
+ "whenNotToUse": [
66
+ "A sortable, paginated dataset. `rows` is a small `ModelUsage[]` shaped for an answer."
67
+ ],
68
+ "commonMistakes": [
69
+ "Holding `cycle` constant and expecting the row entrance to replay. It is an identity key that remounts the body."
70
+ ],
62
71
  "specimens": [
63
72
  {
64
73
  "title": "ElementsDataTable",
@@ -70,6 +79,5 @@
70
79
  "note": "A small table the model can answer with directly — three columns, no sorting, no virtualisation, no header menu. It is `ElementsDataTable` because the package already sells a real one at `@cueplusplus/ui/instruments`: that one is a data grid, this one is a paragraph shaped like a grid, and the rename keeps a consumer from reaching for the wrong one.",
71
80
  "interaction": "none. `cycle` remounts the body, so a new answer's rows stagger in rather than mutating in place."
72
81
  }
73
- ],
74
- "todo": true
82
+ ]
75
83
  }
@@ -57,10 +57,21 @@
57
57
  "language": "tsx"
58
58
  }
59
59
  ],
60
- "status": "todo-docs",
60
+ "status": "stable",
61
61
  "url": "/docs/components/elements-timeline",
62
62
  "mdUrl": "/docs/components/elements-timeline.md",
63
63
  "jsonUrl": "/r/components/elements-timeline.json",
64
+ "whenToUse": [
65
+ "Past and scheduled events shown together on one axis.",
66
+ "A run where the scheduled events should be visible before they resolve, with `visibleCount` moving as they do."
67
+ ],
68
+ "whenNotToUse": [
69
+ "Work that branches and rejoins rather than running along a single axis."
70
+ ],
71
+ "commonMistakes": [
72
+ "Passing only the resolved events. `events` holds past and scheduled together, and `visibleCount` says how many have resolved.",
73
+ "Ordering by resolution rather than chronologically. The events are expected in chronological order."
74
+ ],
64
75
  "specimens": [
65
76
  {
66
77
  "title": "ElementsTimeline",
@@ -72,6 +83,5 @@
72
83
  "note": "Events on one axis, with what already happened and what is still coming in the same list — `past`, `now` and `future` are one union, so a schedule and a history are the same component. It publishes as `ElementsTimeline` because cue already sells a `Timeline`; the spec asked for `ToolTimeline`, which turned out to be the next bench's name.",
73
84
  "interaction": "none. The now marker is the only one that pulses, and it holds still for a reader who asked for less motion."
74
85
  }
75
- ],
76
- "todo": true
86
+ ]
77
87
  }
@@ -110,10 +110,21 @@
110
110
  "language": "tsx"
111
111
  }
112
112
  ],
113
- "status": "todo-docs",
113
+ "status": "stable",
114
114
  "url": "/docs/components/elicitation-form",
115
115
  "mdUrl": "/docs/components/elicitation-form.md",
116
116
  "jsonUrl": "/r/components/elicitation-form.json",
117
+ "whenToUse": [
118
+ "A server that stopped part-way through a tool call and needs fields filled before it can continue."
119
+ ],
120
+ "whenNotToUse": [
121
+ "A form of your own design. `fields` is the schema the server sent, already resolved to display values.",
122
+ "A request for permission to run something rather than for data."
123
+ ],
124
+ "commonMistakes": [
125
+ "Leaving `state=\"request\"` after the user answered. Accepted and declined swap the action row for the outcome.",
126
+ "Rewriting `message` in your own voice. It is why the input is needed, in the server's words."
127
+ ],
117
128
  "specimens": [
118
129
  {
119
130
  "title": "ElicitationForm",
@@ -125,6 +136,5 @@
125
136
  "note": "A server pausing mid-tool-call to ask for the fields it still needs — MCP's elicitation, drawn. The fields arrive already resolved to display values, so the element renders a schema without ever having parsed one, and `state` swaps the two buttons for the outcome the moment the user answers. Declining is a first-class answer here, not a dismissal.",
126
137
  "interaction": "each field's control is chosen by its `kind` — a value chip, a row of options, or a switch — and the required ones are marked on the label rather than announced only on failure."
127
138
  }
128
- ],
129
- "todo": true
139
+ ]
130
140
  }
@@ -47,10 +47,19 @@
47
47
  ],
48
48
  "summary": "A composer-shaped invitation under the suggestions.",
49
49
  "examples": [],
50
- "status": "todo-docs",
50
+ "status": "stable",
51
51
  "url": "/docs/components/empty-state-composer",
52
52
  "mdUrl": "/docs/components/empty-state-composer.md",
53
53
  "jsonUrl": "/r/components/empty-state-composer.json",
54
+ "whenToUse": [
55
+ "The blank-thread screen whose real composer lives somewhere else."
56
+ ],
57
+ "whenNotToUse": [
58
+ "A working input. It is a display rather than one — `placeholder` is a string and send takes a handler."
59
+ ],
60
+ "commonMistakes": [
61
+ "Omitting `onSend` and expecting a live control. Without a handler the send control renders disabled."
62
+ ],
54
63
  "specimens": [
55
64
  {
56
65
  "title": "ChatEmptyState",
@@ -66,6 +75,5 @@
66
75
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
67
76
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
68
77
  }
69
- ],
70
- "todo": true
78
+ ]
71
79
  }
@@ -25,10 +25,19 @@
25
25
  ],
26
26
  "summary": "The one line at the top of a blank thread.",
27
27
  "examples": [],
28
- "status": "todo-docs",
28
+ "status": "stable",
29
29
  "url": "/docs/components/empty-state-greeting",
30
30
  "mdUrl": "/docs/components/empty-state-greeting.md",
31
31
  "jsonUrl": "/r/components/empty-state-greeting.json",
32
+ "whenToUse": [
33
+ "The single opening line on an empty thread."
34
+ ],
35
+ "whenNotToUse": [
36
+ "A second line of copy beneath it. This is the one a screen reader lands on."
37
+ ],
38
+ "commonMistakes": [
39
+ "Wrapping it in a heading of your own, which nests a heading inside a heading."
40
+ ],
32
41
  "specimens": [
33
42
  {
34
43
  "title": "ChatEmptyState",
@@ -44,6 +53,5 @@
44
53
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
45
54
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
46
55
  }
47
- ],
48
- "todo": true
56
+ ]
49
57
  }
@@ -36,10 +36,19 @@
36
36
  ],
37
37
  "summary": "One thing worth asking, as a pill.",
38
38
  "examples": [],
39
- "status": "todo-docs",
39
+ "status": "stable",
40
40
  "url": "/docs/components/empty-state-suggestion",
41
41
  "mdUrl": "/docs/components/empty-state-suggestion.md",
42
42
  "jsonUrl": "/r/components/empty-state-suggestion.json",
43
+ "whenToUse": [
44
+ "Each starter prompt offered on a blank thread."
45
+ ],
46
+ "whenNotToUse": [
47
+ "A standing control. It is a suggestion pill for the blank-thread screen."
48
+ ],
49
+ "commonMistakes": [
50
+ "Omitting `index`. It staggers the entrance so the pills arrive left to right rather than all at once."
51
+ ],
43
52
  "specimens": [
44
53
  {
45
54
  "title": "ChatEmptyState",
@@ -55,6 +64,5 @@
55
64
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
56
65
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
57
66
  }
58
- ],
59
- "todo": true
67
+ ]
60
68
  }
@@ -25,10 +25,19 @@
25
25
  ],
26
26
  "summary": "The row the suggestion pills wrap in.",
27
27
  "examples": [],
28
- "status": "todo-docs",
28
+ "status": "stable",
29
29
  "url": "/docs/components/empty-state-suggestions",
30
30
  "mdUrl": "/docs/components/empty-state-suggestions.md",
31
31
  "jsonUrl": "/r/components/empty-state-suggestions.json",
32
+ "whenToUse": [
33
+ "Holding the suggestion pills so they wrap as one row."
34
+ ],
35
+ "whenNotToUse": [
36
+ "Anything other than the suggestion pills."
37
+ ],
38
+ "commonMistakes": [
39
+ "Laying the pills out with a flex row of your own, which drops the wrapping the element already provides."
40
+ ],
32
41
  "specimens": [
33
42
  {
34
43
  "title": "ChatEmptyState",
@@ -44,6 +53,5 @@
44
53
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
45
54
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
46
55
  }
47
- ],
48
- "todo": true
56
+ ]
49
57
  }
@@ -83,7 +83,7 @@
83
83
  "--cue-text-emphasis",
84
84
  "--cue-text-ui"
85
85
  ],
86
- "summary": "The \"there is nothing here\" panel body.",
86
+ "summary": "The 'there is nothing here' panel body — a report, not an alarm.",
87
87
  "examples": [
88
88
  {
89
89
  "title": "Usage",
@@ -91,10 +91,22 @@
91
91
  "language": "tsx"
92
92
  }
93
93
  ],
94
- "status": "todo-docs",
94
+ "status": "stable",
95
95
  "url": "/docs/components/empty-state",
96
96
  "mdUrl": "/docs/components/empty-state.md",
97
97
  "jsonUrl": "/r/components/empty-state.json",
98
+ "whenToUse": [
99
+ "A list, table or panel with no rows, where the reader needs to know why and what to do next.",
100
+ "Anywhere an action would help: `action` is the slot for the one thing that fills the emptiness."
101
+ ],
102
+ "whenNotToUse": [
103
+ "An error. Emptiness is a state; a failure needs its own tone and a way to retry.",
104
+ "Loading. Use `Skeleton` or `Spinner` — an empty state says nothing is coming."
105
+ ],
106
+ "commonMistakes": [
107
+ "Colouring it to draw attention. It uses the muted ramp throughout and takes its emphasis from position; an alarming empty state reports a problem that is not there.",
108
+ "Putting the meaning in the icon. The icon is decorative — the title carries it, so a screen reader hears one sentence instead of a shrug."
109
+ ],
98
110
  "specimens": [
99
111
  {
100
112
  "title": "EmptyState",
@@ -106,6 +118,5 @@
106
118
  "note": "The standard empty copy, from lib/samples.tsx. Same words everywhere in the app.",
107
119
  "interaction": "the action is an ordinary Button and behaves like one."
108
120
  }
109
- ],
110
- "todo": true
121
+ ]
111
122
  }
@@ -69,10 +69,22 @@
69
69
  "language": "tsx"
70
70
  }
71
71
  ],
72
- "status": "todo-docs",
72
+ "status": "stable",
73
73
  "url": "/docs/components/end-of-turn-summary",
74
74
  "mdUrl": "/docs/components/end-of-turn-summary.md",
75
75
  "jsonUrl": "/r/components/end-of-turn-summary.json",
76
+ "whenToUse": [
77
+ "The closing line of a turn, saying what it came to.",
78
+ "A turn whose result is not a diff at all, using `label` to replace the built line: `2 cues written`, `Nothing to change`."
79
+ ],
80
+ "whenNotToUse": [
81
+ "Anywhere you want review, keep or reject buttons. It is a rollup, not a control — those belong to a bar above the composer that acts on the whole run.",
82
+ "A turn that read files and wrote nothing but which you want reported as two zeroes. It says `No files changed` and stops."
83
+ ],
84
+ "commonMistakes": [
85
+ "Adding per-turn action buttons beside it. A per-turn row with those buttons on it is a row that can be pressed after the next turn has already changed the same files.",
86
+ "Passing `additions={0}` and `deletions={0}` to force the counts out. The counts are drawn only when there are some."
87
+ ],
76
88
  "specimens": [
77
89
  {
78
90
  "title": "EndOfTurnSummary",
@@ -84,6 +96,5 @@
84
96
  "note": "What the turn came to, in one line. A rollup and not a control: review, keep and reject act on the whole run and belong above the composer, where they cannot be pressed after the next turn has already changed the same files. The + and − are CodeDiff's glyphs, so one transcript never shows two conventions for the same number, and a turn that changed nothing says so instead of saying it with two zeroes.",
85
97
  "interaction": "none. It is a sentence with two tinted numbers in it."
86
98
  }
87
- ],
88
- "todo": true
99
+ ]
89
100
  }
@@ -166,7 +166,7 @@
166
166
  "--cue-text-ui",
167
167
  "--cue-warn"
168
168
  ],
169
- "summary": "A config value that may be a literal *or* a reference to an environment variable — and looks unmistakably different in each case.",
169
+ "summary": "A config value that may be a literal or an `env(NAME)` reference — and looks unmistakably different in each case.",
170
170
  "examples": [
171
171
  {
172
172
  "title": "Usage",
@@ -174,10 +174,22 @@
174
174
  "language": "tsx"
175
175
  }
176
176
  ],
177
- "status": "todo-docs",
177
+ "status": "stable",
178
178
  "url": "/docs/components/env-var-input",
179
179
  "mdUrl": "/docs/components/env-var-input.md",
180
180
  "jsonUrl": "/r/components/env-var-input.json",
181
+ "whenToUse": [
182
+ "Any config screen where some values are secrets and some name where a secret comes from.",
183
+ "Anywhere the difference decides whether a value is safe to screenshot, commit or paste into a ticket."
184
+ ],
185
+ "whenNotToUse": [
186
+ "A secret typed directly with no indirection. Use `PasswordInput`.",
187
+ "Ordinary configuration with no environment indirection. Use `Input`."
188
+ ],
189
+ "commonMistakes": [
190
+ "Rendering references as ordinary text. The warn-toned pill is the entire point: a screen of identical text boxes gives no way to tell the key from the pointer to the key.",
191
+ "Treating `secret` as encryption. It masks a literal on screen; it does nothing to how the value is stored or sent."
192
+ ],
181
193
  "specimens": [
182
194
  {
183
195
  "title": "EnvVarInput",
@@ -189,6 +201,5 @@
189
201
  "note": "A literal value and an `env(NAME)` reference are different things, so they do not look the same: the reference swaps to an amber token pill.",
190
202
  "interaction": "the mode switch is a button; typing `env(` in the field is enough to flip it."
191
203
  }
192
- ],
193
- "todo": true
204
+ ]
194
205
  }
@@ -73,10 +73,21 @@
73
73
  "language": "tsx"
74
74
  }
75
75
  ],
76
- "status": "todo-docs",
76
+ "status": "stable",
77
77
  "url": "/docs/components/error-state",
78
78
  "mdUrl": "/docs/components/error-state.md",
79
79
  "jsonUrl": "/r/components/error-state.json",
80
+ "whenToUse": [
81
+ "A failed request inside a surface, where the retry should sit with the failure rather than interrupt."
82
+ ],
83
+ "whenNotToUse": [
84
+ "A failure with nothing to try again. `onRetry` is required.",
85
+ "A decision that must block everything until it is answered. This is deliberately not a modal."
86
+ ],
87
+ "commonMistakes": [
88
+ "Rendering your own spinner while retrying. `retrying` swaps the banner to a spinning Retrying status instead of the error.",
89
+ "Putting the whole message in `title`. `detail` is the supporting line that explains what went wrong."
90
+ ],
80
91
  "specimens": [
81
92
  {
82
93
  "title": "ErrorState",
@@ -88,6 +99,5 @@
88
99
  "note": "A failure banner, not a modal: it sits in the flow where the answer would have been, says what broke and what to do, and leaves the rest of the page alone. Retrying is a different element entirely rather than a disabled button — `role='alert'` while it is a failure, `role='status'` while it is trying again, which is the difference between interrupting a screen reader and not.",
89
100
  "interaction": "Retry is a named button that tints on hover. The retrying state has no control at all, because there is nothing to press while it works."
90
101
  }
91
- ],
92
- "todo": true
102
+ ]
93
103
  }
@@ -93,9 +93,17 @@
93
93
  "language": "tsx"
94
94
  }
95
95
  ],
96
- "status": "todo-docs",
96
+ "status": "stable",
97
97
  "url": "/docs/components/export-dialog",
98
98
  "mdUrl": "/docs/components/export-dialog.md",
99
99
  "jsonUrl": "/r/components/export-dialog.json",
100
- "todo": true
100
+ "whenToUse": [
101
+ "Handing a tuned theme to code, in whichever of the four shapes the consumer needs."
102
+ ],
103
+ "whenNotToUse": [
104
+ "Exporting anything but the configurator's overrides. All four outputs are generated from them."
105
+ ],
106
+ "commonMistakes": [
107
+ "Re-deriving a value before export. Nothing here re-derives: the CSS output is literally the stylesheet on the page, which is what makes it trustworthy."
108
+ ]
101
109
  }
@@ -31,7 +31,7 @@
31
31
  "--cue-space-2",
32
32
  "--cue-text-label"
33
33
  ],
34
- "summary": "The small accent kicker that sits above a title: `// PATCH`.",
34
+ "summary": "The small accent kicker above a title: `// PATCH`.",
35
35
  "examples": [
36
36
  {
37
37
  "title": "Usage",
@@ -39,10 +39,21 @@
39
39
  "language": "tsx"
40
40
  }
41
41
  ],
42
- "status": "todo-docs",
42
+ "status": "stable",
43
43
  "url": "/docs/components/eyebrow",
44
44
  "mdUrl": "/docs/components/eyebrow.md",
45
45
  "jsonUrl": "/r/components/eyebrow.json",
46
+ "whenToUse": [
47
+ "Naming the category a title belongs to, where the title alone would not say it.",
48
+ "Anywhere the accent should carry pure typography — this is the one place the system spends it that way."
49
+ ],
50
+ "whenNotToUse": [
51
+ "A status. Use `Chip`, which carries the tone vocabulary.",
52
+ "A second heading. An eyebrow is a kicker, not a level in the outline."
53
+ ],
54
+ "commonMistakes": [
55
+ "Typing the slashes into the text. They are `aria-hidden` and `select-none` for a reason — a screen reader should read \"patch\", and a copy-paste of the page should not carry punctuation that was only ever decoration."
56
+ ],
46
57
  "specimens": [
47
58
  {
48
59
  "title": "Eyebrow",
@@ -54,6 +65,5 @@
54
65
  "note": "The `//` motif from the brand site, in mono micro.",
55
66
  "interaction": "none."
56
67
  }
57
- ],
58
- "todo": true
68
+ ]
59
69
  }
@@ -113,10 +113,21 @@
113
113
  "language": "tsx"
114
114
  }
115
115
  ],
116
- "status": "todo-docs",
116
+ "status": "stable",
117
117
  "url": "/docs/components/feedback-dialog",
118
118
  "mdUrl": "/docs/components/feedback-dialog.md",
119
119
  "jsonUrl": "/r/components/feedback-dialog.json",
120
+ "whenToUse": [
121
+ "Collecting the reason behind a negative rating, with optional free text alongside it."
122
+ ],
123
+ "whenNotToUse": [
124
+ "A single-choice survey. More than one reason may be picked at once."
125
+ ],
126
+ "commonMistakes": [
127
+ "Writing long reason strings. Keep them short enough to scan in one line.",
128
+ "Rendering your own thank-you. `sent` replaces the whole form with an acknowledgement once the report is filed.",
129
+ "Requiring `note` before submit. The free-text detail is always optional."
130
+ ],
120
131
  "specimens": [
121
132
  {
122
133
  "title": "FeedbackDialog",
@@ -128,6 +139,5 @@
128
139
  "note": "A thumbs-down that asks why, so the signal arrives with a reason attached. The reasons are chips rather than a select because more than one is usually true, and the note is marked optional in the header — a feedback form that demands prose collects nothing. Sending replaces the whole form with an acknowledgement.",
129
140
  "interaction": "each chip is `aria-pressed`. The acknowledgement lives in a `status` live region mounted from the start and empty until it is not — a region created together with its text is the case a screen reader is free to miss."
130
141
  }
131
- ],
132
- "todo": true
142
+ ]
133
143
  }
@@ -35,7 +35,7 @@
35
35
  "--cue-text-label",
36
36
  "--cue-text-micro"
37
37
  ],
38
- "summary": "Quiet helper text under a control, published to assistive tech as the control's `aria-describedby` target.",
38
+ "summary": "Quiet helper text under a control, published as the control's `aria-describedby` target.",
39
39
  "examples": [
40
40
  {
41
41
  "title": "Usage",
@@ -43,10 +43,22 @@
43
43
  "language": "tsx"
44
44
  }
45
45
  ],
46
- "status": "todo-docs",
46
+ "status": "stable",
47
47
  "url": "/docs/components/field-description",
48
48
  "mdUrl": "/docs/components/field-description.md",
49
49
  "jsonUrl": "/r/components/field-description.json",
50
+ "whenToUse": [
51
+ "A constraint or a consequence the label cannot carry: the format expected, what the value affects.",
52
+ "Text that should be read out after the control's name rather than as part of it."
53
+ ],
54
+ "whenNotToUse": [
55
+ "An error. Use `FieldError` — a description is permanent and an error is a state.",
56
+ "A whole paragraph. If it needs that much, the field needs a different design."
57
+ ],
58
+ "commonMistakes": [
59
+ "Putting the requirement only here and not in validation, so a screen reader hears the rule but nothing enforces it.",
60
+ "Repeating the label in other words, which makes every field announce twice."
61
+ ],
50
62
  "specimens": [
51
63
  {
52
64
  "title": "Field / FieldLabel / FieldDescription / FieldError",
@@ -61,6 +73,5 @@
61
73
  "note": "The labelling wrapper. Base UI generates the ids, so the label names the control with no htmlFor bookkeeping, and `invalid` stamps the whole subtree.",
62
74
  "interaction": "clicking the label focuses the control; the error line is announced when it appears."
63
75
  }
64
- ],
65
- "todo": true
76
+ ]
66
77
  }