@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
@@ -84,7 +84,7 @@
84
84
  "--cue-text-label",
85
85
  "--cue-text-ui"
86
86
  ],
87
- "summary": "A control and its adornments, drawn as a single field.",
87
+ "summary": "A control and its adornments, drawn as a single field — one rim, one fill, however many affordances.",
88
88
  "examples": [
89
89
  {
90
90
  "title": "Usage",
@@ -92,10 +92,22 @@
92
92
  "language": "tsx"
93
93
  }
94
94
  ],
95
- "status": "todo-docs",
95
+ "status": "stable",
96
96
  "url": "/docs/components/input-group",
97
97
  "mdUrl": "/docs/components/input-group.md",
98
98
  "jsonUrl": "/r/components/input-group.json",
99
+ "whenToUse": [
100
+ "A prefix or suffix that belongs to the field: a unit, a currency, a copy button, a scheme.",
101
+ "Anywhere two controls must read as one: the group owns the chassis and publishes that through context."
102
+ ],
103
+ "whenNotToUse": [
104
+ "Two independent fields. Give them their own rims; a shared one says they are one value.",
105
+ "A label. Use `FieldLabel`; `leading` is part of the control, not its name."
106
+ ],
107
+ "commonMistakes": [
108
+ "Styling the `Input` inside. It strips its own border, background, height and padding by design and inherits the group's font size — restyling it puts the rim back and breaks the single-field illusion.",
109
+ "Assuming focus styling comes free. A `<div>` matches neither `:focus` nor `:focus-visible`, which is why the group handles it; do not reimplement it with `:focus-within`."
110
+ ],
99
111
  "specimens": [
100
112
  {
101
113
  "title": "InputGroup",
@@ -107,6 +119,5 @@
107
119
  "note": "One rim around a control and its adornments, so the group focuses as a unit.",
108
120
  "interaction": "any focus inside strengthens the whole rim; the ring waits for a keyboard-visible descendant, so a click on an adornment does not light the cluster up. The inner control never rings — the group owns the rim."
109
121
  }
110
- ],
111
- "todo": true
122
+ ]
112
123
  }
@@ -135,7 +135,7 @@
135
135
  "--cue-text-label",
136
136
  "--cue-text-ui"
137
137
  ],
138
- "summary": "One thing in a list, with room for a glyph, a name, a line of detail and a control — the shape a settings entry, a search hit and a device row all want.",
138
+ "summary": "One thing in a list, with room for a glyph, a name, a line of detail and a control.",
139
139
  "examples": [
140
140
  {
141
141
  "title": "Usage",
@@ -143,10 +143,22 @@
143
143
  "language": "tsx"
144
144
  }
145
145
  ],
146
- "status": "todo-docs",
146
+ "status": "stable",
147
147
  "url": "/docs/components/item",
148
148
  "mdUrl": "/docs/components/item.md",
149
149
  "jsonUrl": "/r/components/item.json",
150
+ "whenToUse": [
151
+ "A settings entry, a search hit, a device row — a self-contained object that can stand alone, sit in a `Stack` or fill a `Grid` cell.",
152
+ "Anything clickable: it renders a real `<button>` when interactive, so keyboard users get it for free."
153
+ ],
154
+ "whenNotToUse": [
155
+ "A line of a hairline table. Use `Row` — that is a row of a grid, this is an object.",
156
+ "A whole summary surface. Use `Card`."
157
+ ],
158
+ "commonMistakes": [
159
+ "Wrapping a non-interactive `Item` in a `<div onClick>`. Pass `interactive` and let it be a button.",
160
+ "Putting the control inside `children` instead of `actions`, which loses the reserved slot and the alignment with every other row."
161
+ ],
150
162
  "specimens": [
151
163
  {
152
164
  "title": "Item",
@@ -158,6 +170,5 @@
158
170
  "note": "A media, title, description and actions row. Three variants, plus interactive and disabled.",
159
171
  "interaction": "the interactive variant takes a hover ground and a focus ring; it is a button, so Enter and Space activate it."
160
172
  }
161
- ],
162
- "todo": true
173
+ ]
163
174
  }
@@ -96,10 +96,22 @@
96
96
  "language": "tsx"
97
97
  }
98
98
  ],
99
- "status": "todo-docs",
99
+ "status": "stable",
100
100
  "url": "/docs/components/job-progress",
101
101
  "mdUrl": "/docs/components/job-progress.md",
102
102
  "jsonUrl": "/r/components/job-progress.json",
103
+ "whenToUse": [
104
+ "Long work with named stages, where a long install should not read the same as a fast clone.",
105
+ "Anything a person may need to abandon — `onCancel` is the way out, and it hides once the job finishes."
106
+ ],
107
+ "whenNotToUse": [
108
+ "A wait short enough that stages and an estimate are noise."
109
+ ],
110
+ "commonMistakes": [
111
+ "Giving every stage the same weight, which is exactly what the relative weights exist to avoid.",
112
+ "Special-casing the finished state. Passing `stages.length` as `stageIndex` marks the job finished, and the bar never runs past its track.",
113
+ "Passing a duration object to `eta`. It is a pre-formatted estimate, replaced by done once finished."
114
+ ],
103
115
  "specimens": [
104
116
  {
105
117
  "title": "JobProgress",
@@ -111,6 +123,5 @@
111
123
  "note": "Work measured in minutes rather than steps. The stages are weighted, so a six-minute render does not read the same length as a one-second export, and the bar is filled from those weights plus the fraction of the current stage — which is why it never jumps backwards when a short stage ends.",
112
124
  "interaction": "cancel is a labelled icon button and disappears once the job finishes: there is nothing left to stop, and a dead X beside a green tick reads as an error."
113
125
  }
114
- ],
115
- "todo": true
126
+ ]
116
127
  }
@@ -32,10 +32,22 @@
32
32
  "language": "tsx"
33
33
  }
34
34
  ],
35
- "status": "todo-docs",
35
+ "status": "stable",
36
36
  "url": "/docs/components/kbd",
37
37
  "mdUrl": "/docs/components/kbd.md",
38
38
  "jsonUrl": "/r/components/kbd.json",
39
+ "whenToUse": [
40
+ "Naming a shortcut in prose, a menu row or an empty state — reference material the reader's eye can skip.",
41
+ "Anywhere a `Chip` sits on the same row. It is sized off the chip height so the two line up."
42
+ ],
43
+ "whenNotToUse": [
44
+ "A button. This is static markup that renders on the server and has no press behaviour.",
45
+ "A code fragment or a token name. Use inline code; a key cap says 'press this'."
46
+ ],
47
+ "commonMistakes": [
48
+ "Building a chord out of one `Kbd` containing `⌘ + K`. Emit one per key and put the separator between them, so each cap reads as a key.",
49
+ "Reaching for it as a small badge. It is set in the micro type step on purpose; `Chip` is the badge."
50
+ ],
39
51
  "specimens": [
40
52
  {
41
53
  "title": "Kbd",
@@ -47,6 +59,5 @@
47
59
  "note": "A key cap, in the mono face. Static markup, so it renders on the server.",
48
60
  "interaction": "none."
49
61
  }
50
- ],
51
- "todo": true
62
+ ]
52
63
  }
@@ -110,10 +110,22 @@
110
110
  "language": "tsx"
111
111
  }
112
112
  ],
113
- "status": "todo-docs",
113
+ "status": "stable",
114
114
  "url": "/docs/components/launcher-bubble",
115
115
  "mdUrl": "/docs/components/launcher-bubble.md",
116
116
  "jsonUrl": "/r/components/launcher-bubble.json",
117
+ "whenToUse": [
118
+ "An assistant that lives in the corner of a product rather than owning the page: a bubble that opens into a greeting and a few ways in.",
119
+ "A first run with nothing typed yet — `prompts` exists so the first message does not have to be invented."
120
+ ],
121
+ "whenNotToUse": [
122
+ "A launcher with no starters to offer. `prompts` is required, and an empty panel is the case the component is shaped against.",
123
+ "A panel whose open state lives inside it. `open` is required and the bubble only reports the press through `onToggle`."
124
+ ],
125
+ "commonMistakes": [
126
+ "Driving `unread` to zero and expecting a `0` badge. It is hidden at zero, and hidden again the whole time the panel is open.",
127
+ "Wiring the panel's Start a conversation action to `onPick`. That callback fires only for a starter prompt; the empty thread is `onStart`."
128
+ ],
117
129
  "specimens": [
118
130
  {
119
131
  "title": "LauncherBubble",
@@ -125,6 +137,5 @@
125
137
  "note": "The floating entry point and the panel it opens into — the shape an assistant takes on somebody else's site. The badge counts unread and disappears the moment the panel is open, because a count of things you are currently looking at is noise. The starter prompts exist so the first message does not have to be invented by a visitor who has no idea what this thing knows.",
126
138
  "interaction": "the bubble carries `aria-expanded` and its label changes with it (`Open the assistant` / `Close the assistant`); the two icons cross-fade in one grid cell so nothing reflows."
127
139
  }
128
- ],
129
- "todo": true
140
+ ]
130
141
  }
@@ -74,10 +74,21 @@
74
74
  "language": "tsx"
75
75
  }
76
76
  ],
77
- "status": "todo-docs",
77
+ "status": "stable",
78
78
  "url": "/docs/components/link",
79
79
  "mdUrl": "/docs/components/link.md",
80
80
  "jsonUrl": "/r/components/link.json",
81
+ "whenToUse": [
82
+ "Navigation — somewhere the user can middle-click, copy the address of, or open in a new tab.",
83
+ "An outbound destination: `external` marks it as leaving."
84
+ ],
85
+ "whenNotToUse": [
86
+ "An action that happens on this page. Use `Button`, or `Button` with `render={<NextLink/>}` when it must look like one but navigate."
87
+ ],
88
+ "commonMistakes": [
89
+ "Using a `Button` with an `onClick` that navigates, which takes away middle-click and copy-address.",
90
+ "Marking an in-app route `external`, which promises a new context the click does not deliver."
91
+ ],
81
92
  "specimens": [
82
93
  {
83
94
  "title": "Link",
@@ -89,6 +100,5 @@
89
100
  "note": "Two variants. Links do not underline by default; the underline variant offsets by 4px so descenders survive.",
90
101
  "interaction": "hover moves the ink to the accent."
91
102
  }
92
- ],
93
- "todo": true
103
+ ]
94
104
  }
@@ -67,7 +67,7 @@
67
67
  "variants": {},
68
68
  "defaultVariants": {},
69
69
  "tokensUsed": [],
70
- "summary": "One polite region, and a queue that makes it audible.",
70
+ "summary": "One polite region with a queue behind it, so a run's state changes are actually spoken.",
71
71
  "examples": [
72
72
  {
73
73
  "title": "Usage",
@@ -75,10 +75,23 @@
75
75
  "language": "tsx"
76
76
  }
77
77
  ],
78
- "status": "todo-docs",
78
+ "status": "stable",
79
79
  "url": "/docs/components/live-region-announcer",
80
80
  "mdUrl": "/docs/components/live-region-announcer.md",
81
81
  "jsonUrl": "/r/components/live-region-announcer.json",
82
+ "whenToUse": [
83
+ "Any agent console that has to be usable without a screen: it spaces announcements so each is spoken instead of overwritten.",
84
+ "One per surface, mounted for the life of the transcript — the region is mounted empty and stays mounted, which is the only way a live region is reliably announced."
85
+ ],
86
+ "whenNotToUse": [
87
+ "Alongside a second speaker. Mounting this takes the speech away from `TailStatus` automatically; two live regions read every state out twice, out of step.",
88
+ "Deciding what to say. The words are the caller's — `ANNOUNCEMENTS` carries the nine transitions the study found announced, and this only queues and speaks them."
89
+ ],
90
+ "commonMistakes": [
91
+ "Trimming `messages` at the head. It is append-only and the announcer remembers how far it has read, so trimmed entries are lost — keep the log growing, or remount with a new `key` for a new run.",
92
+ "Dropping `spacing` towards zero to keep up. A polite announcement that arrives while another is being spoken replaces it; the `400` default is roughly how long a short phrase takes to speak.",
93
+ "Expecting a restored session to be read out. `announceOnMount` is `false` by default, and the pause rules hold over it — a backlog handed to a hidden tab waits rather than spending its first line."
94
+ ],
82
95
  "specimens": [
83
96
  {
84
97
  "title": "LiveRegionAnnouncer",
@@ -90,6 +103,5 @@
90
103
  "note": "The element with no visual design at all, and the one that decides whether the rest of this family can be used without a screen. An agent transcript is a stream of state changes, and a live region wired straight to it announces almost none of them: polite announcements replace each other, so a region updated four times a second speaks once and swallows the rest. So it is a queue — 400ms of spacing, five deep with the oldest dropped, held while the page is hidden or a modal has the reader, and an identical sentence re-announced by appending a space, which changes the string without changing a word of it.",
91
104
  "interaction": "press the button and nothing visible happens, which is the point — the list below is a mirror of what the region said, drawn only so the bench has something to look at. Press it twice quickly and the second announcement waits its 400ms rather than replacing the first; press it faster than five times and the oldest waiting one is dropped, because five deep behind a busy run the newest is the true one. The second specimen is the composition with TailStatus: that row is a role=status too, so mounting this takes the speaking off it — inspect the row and it carries data-announces=false and no role, which is how a console gets one voice instead of two."
92
105
  }
93
- ],
94
- "todo": true
106
+ ]
95
107
  }
@@ -152,10 +152,23 @@
152
152
  "language": "tsx"
153
153
  }
154
154
  ],
155
- "status": "todo-docs",
155
+ "status": "stable",
156
156
  "url": "/docs/components/log-viewer",
157
157
  "mdUrl": "/docs/components/log-viewer.md",
158
158
  "jsonUrl": "/r/components/log-viewer.json",
159
+ "whenToUse": [
160
+ "Streaming output of any length — build logs, run output, a device trace.",
161
+ "Anywhere the reader needs to follow the tail and still be able to scroll back without being yanked forward."
162
+ ],
163
+ "whenNotToUse": [
164
+ "A handful of static lines. A `<pre>` is simpler and costs nothing.",
165
+ "Structured records the reader filters and sorts. Use a data table."
166
+ ],
167
+ "commonMistakes": [
168
+ "Rendering the lines yourself. Five thousand DOM rows is a frozen tab, which is why this is virtualised.",
169
+ "Overriding `rowHeight` to something variable. Rows are fixed at the short control rung so the virtualiser never has to measure, which is also what keeps the scrollbar honest while lines stream in.",
170
+ "Omitting `height`. It is required because a virtualiser cannot work without a viewport."
171
+ ],
159
172
  "specimens": [
160
173
  {
161
174
  "title": "LogViewer",
@@ -167,6 +180,5 @@
167
180
  "note": "Virtualised rows at the small control height, ANSI decoded to text nodes (never innerHTML), level filter chips, and a stick-to-bottom scroller that offers a `N new lines` pill once you scroll away.",
168
181
  "interaction": "the filter chips are toggles; the new-lines pill is a button that returns you to the tail."
169
182
  }
170
- ],
171
- "todo": true
183
+ ]
172
184
  }
@@ -77,10 +77,21 @@
77
77
  "language": "tsx"
78
78
  }
79
79
  ],
80
- "status": "todo-docs",
80
+ "status": "stable",
81
81
  "url": "/docs/components/map-answer",
82
82
  "mdUrl": "/docs/components/map-answer.md",
83
83
  "jsonUrl": "/r/components/map-answer.json",
84
+ "whenToUse": [
85
+ "A model answer that is a set of places, where the plot and the list beside it must stay in step.",
86
+ "An ordered itinerary — `route` draws a dashed path through the pins in the order they were given."
87
+ ],
88
+ "whenNotToUse": [
89
+ "A real map. Pins are positioned as percentages precisely so the element needs no tiles, and it knows nothing about geography."
90
+ ],
91
+ "commonMistakes": [
92
+ "Keeping two selections, one for the plot and one for the list. Both surfaces report the same id through `onSelect`, and `activeId` selects in both.",
93
+ "Expecting `route` to work out an order. It follows the order of `pins`, which is the caller's."
94
+ ],
84
95
  "specimens": [
85
96
  {
86
97
  "title": "MapAnswer",
@@ -92,6 +103,5 @@
92
103
  "note": "A location answer as a plan and a list at once: pins on a ruled ground, the same pins as rows underneath, and one selection driving both. The grid is drawn, not tiled — there is no map provider here, and `x`/`y` are percentages the caller decides.",
93
104
  "interaction": "pin and row are both buttons for the same id, and both carry `aria-current`; the pin's own label is what a screen reader gets, since the plan itself is aria-hidden."
94
105
  }
95
- ],
96
- "todo": true
106
+ ]
97
107
  }
@@ -98,7 +98,7 @@
98
98
  "--cue-text-title",
99
99
  "--cue-text-ui"
100
100
  ],
101
- "summary": "Model output, rendered.",
101
+ "summary": "Model output, rendered — the one component in this library that turns a string into markup.",
102
102
  "examples": [
103
103
  {
104
104
  "title": "Usage",
@@ -106,10 +106,23 @@
106
106
  "language": "tsx"
107
107
  }
108
108
  ],
109
- "status": "todo-docs",
109
+ "status": "stable",
110
110
  "url": "/docs/components/markdown-text",
111
111
  "mdUrl": "/docs/components/markdown-text.md",
112
112
  "jsonUrl": "/r/components/markdown-text.json",
113
+ "whenToUse": [
114
+ "An assistant turn that is genuinely markdown. The input is assumed hostile, and the element subset, the attributes and the URL schemes are all enumerated rather than filtered.",
115
+ "The tail of a stream: `streaming` hides the token being typed, so no asterisks flicker through a bold run and no fence opens a code block for one frame."
116
+ ],
117
+ "whenNotToUse": [
118
+ "Any other text in the library. `Message`, `AskBox` and every other element place a string in the DOM as characters, because a component that quietly parsed would put every consumer one prompt away from an injection.",
119
+ "A console that renders transcripts without markdown. This lives at `@cueplusplus/ui/elements/markdown` and is deliberately not re-exported from `@cueplusplus/ui/elements`, so neither optional peer has to be installed."
120
+ ],
121
+ "commonMistakes": [
122
+ "Expecting tables, task lists or footnotes. No GFM plugin is enabled — an explicit autolink still works, the rest do not.",
123
+ "Reaching for raw HTML, or for control over `rel`. Markup in the source has no parser to reach it, and every link carries `noopener noreferrer nofollow` whatever `target` says.",
124
+ "Dropping a highlighter into `renderCodeBlock` without thinking. It is a second parser over the same untrusted string, usually one that emits HTML, which is why the default is a bare `pre`/`code` and opting in is a line somebody wrote."
125
+ ],
113
126
  "specimens": [
114
127
  {
115
128
  "title": "MarkdownText",
@@ -121,6 +134,5 @@
121
134
  "note": "The one component in the library that turns a string into markup, and the only one that has to be argued for. No raw HTML reaches the DOM — not filtered out, but never parsed: the img tag on the last line of the settled specimen is a real injection shape and renders as nothing. Links are http/https/mailto only and always carry rel='noopener noreferrer nofollow'; code blocks are plain text until a highlighter is passed. It ships from @cueplusplus/ui/elements/markdown so its parser and sanitizer stay off the elements barrel.",
122
135
  "interaction": "none — it is a document, and it stays selectable, copyable text. Headings start at h2 by default so a turn never claims a page's title, and links are keyboard-reachable with the house focus ring."
123
136
  }
124
- ],
125
- "todo": true
137
+ ]
126
138
  }
@@ -61,10 +61,21 @@
61
61
  "language": "tsx"
62
62
  }
63
63
  ],
64
- "status": "todo-docs",
64
+ "status": "stable",
65
65
  "url": "/docs/components/math-block",
66
66
  "mdUrl": "/docs/components/math-block.md",
67
67
  "jsonUrl": "/r/components/math-block.json",
68
+ "whenToUse": [
69
+ "A derivation an agent produces step by step, where `visibleSteps` says how much has been shown.",
70
+ "Working that needs an eyebrow above it — that is `label`, and it is optional."
71
+ ],
72
+ "whenNotToUse": [
73
+ "A string of TeX or any other notation to be parsed. Each step is a node, composed from the exported `Frac`, `Sup` and `Sub` helpers."
74
+ ],
75
+ "commonMistakes": [
76
+ "Appending to `steps` as the derivation lands. `steps` is the whole working and `visibleSteps` is the caller's counter over it.",
77
+ "Building exponents and bounds out of raw markup instead of the exported `Sup` and `Sub` helpers the component is designed around."
78
+ ],
68
79
  "specimens": [
69
80
  {
70
81
  "title": "MathBlock",
@@ -79,6 +90,5 @@
79
90
  "note": "Maths with the working shown, a step at a time. The expressions are nodes rather than a string, so there is no parser and no KaTeX in the bundle — `Frac` stacks a numerator over a rule, `Sup` and `Sub` set an index upright inside the serif italic, and anything else is text.",
80
91
  "interaction": "none. Each step's note says what justified it, which is what turns three lines of algebra into an explanation."
81
92
  }
82
- ],
83
- "todo": true
93
+ ]
84
94
  }
@@ -17,10 +17,20 @@
17
17
  "tokensUsed": [],
18
18
  "summary": "An MCP server in the registry: a thing an agent connects *to*.",
19
19
  "examples": [],
20
- "status": "todo-docs",
20
+ "status": "stable",
21
21
  "url": "/docs/components/mcp-server-icon",
22
22
  "mdUrl": "/docs/components/mcp-server-icon.md",
23
23
  "jsonUrl": "/r/components/mcp-server-icon.json",
24
+ "whenToUse": [
25
+ "A catalogue row that is a running process somewhere, with an address and a session."
26
+ ],
27
+ "whenNotToUse": [
28
+ "Something installed and run locally. Use `CliToolIcon`.",
29
+ "A capability. Use `SkillIcon`."
30
+ ],
31
+ "commonMistakes": [
32
+ "Drawing it as a document. It is hardware — two rack units with a status lamp — because a row that looked like a file would hide the only fact about it that matters operationally."
33
+ ],
24
34
  "specimens": [
25
35
  {
26
36
  "title": "The container icon set",
@@ -41,6 +51,5 @@
41
51
  "note": "One grid and one weight across all ten, at size-icon-md — the size a navigation row draws them at. Each is a plain <svg> that takes every SVG prop.",
42
52
  "interaction": "none. They are decorative by default: aria-hidden, announced by nothing, because the row they mark already carries its name."
43
53
  }
44
- ],
45
- "todo": true
54
+ ]
46
55
  }
@@ -82,10 +82,21 @@
82
82
  "language": "tsx"
83
83
  }
84
84
  ],
85
- "status": "todo-docs",
85
+ "status": "stable",
86
86
  "url": "/docs/components/mcp-server-panel",
87
87
  "mdUrl": "/docs/components/mcp-server-panel.md",
88
88
  "jsonUrl": "/r/components/mcp-server-panel.json",
89
+ "whenToUse": [
90
+ "A status surface listing every configured MCP server, connected or not — the header counts how many are live.",
91
+ "A server stuck on authorisation: `onAuthorize` is what puts the Authorize button on that row, and it is shown only while a server needs auth."
92
+ ],
93
+ "whenNotToUse": [
94
+ "A layout where several servers must be open at once. Only one expands at a time — `expandedId` is a single id, not a set."
95
+ ],
96
+ "commonMistakes": [
97
+ "Filtering `servers` down to the connected ones. The list is every configured server, and the header's live count is derived from the whole of it.",
98
+ "Holding a set of expanded ids in state. `onToggle` reports one id, and omitting `expandedId` entirely gives an all-collapsed list."
99
+ ],
89
100
  "specimens": [
90
101
  {
91
102
  "title": "McpServerPanel",
@@ -97,6 +108,5 @@
97
108
  "note": "Which servers are connected, what each one brought, and which is still waiting on you. The header counts the live ones against the configured ones, and the status dot has a `sr-only` word beside it — a colour is not a status for everybody. Authorize only exists on a server that needs it, so the row that wants something from you is the only one offering an action.",
98
109
  "interaction": "each server row carries `aria-expanded`; one expands at a time, and `expandedId` undefined is a legitimate all-collapsed state rather than a missing value."
99
110
  }
100
- ],
101
- "todo": true
111
+ ]
102
112
  }
@@ -53,10 +53,20 @@
53
53
  "language": "tsx"
54
54
  }
55
55
  ],
56
- "status": "todo-docs",
56
+ "status": "stable",
57
57
  "url": "/docs/components/memory-chips",
58
58
  "mdUrl": "/docs/components/memory-chips.md",
59
59
  "jsonUrl": "/r/components/memory-chips.json",
60
+ "whenToUse": [
61
+ "Showing the facts a turn just wrote to memory, with the new ones tinted apart from what was already known."
62
+ ],
63
+ "whenNotToUse": [
64
+ "A settings screen for everything stored across all threads. These chips are what the turn wrote, marked new or existing."
65
+ ],
66
+ "commonMistakes": [
67
+ "Leaving the existing mark off chips that were already remembered. Anything not marked existing is counted as new this turn and tinted, so a restored list lights up entirely.",
68
+ "Offering removal only for old facts. Every chip is removable through `onForget`, including the ones it just learned."
69
+ ],
60
70
  "specimens": [
61
71
  {
62
72
  "title": "MemoryChips",
@@ -68,6 +78,5 @@
68
78
  "note": "What it now remembers about you, written during the turn it learned it. The header counts what is new rather than what is stored — `remembered 2` is the fact worth showing — and anything not marked `existing` takes the streaming hue so a new memory is visibly new. Every chip is removable, including the one it just learned, which is the only version of this control that is honest.",
69
79
  "interaction": "each chip's remove button is labelled with the fact it would forget — `Forget ESPRITEs run in mode 8` — so the control names its consequence rather than saying 'remove'."
70
80
  }
71
- ],
72
- "todo": true
81
+ ]
73
82
  }
@@ -164,10 +164,21 @@
164
164
  "language": "tsx"
165
165
  }
166
166
  ],
167
- "status": "todo-docs",
167
+ "status": "stable",
168
168
  "url": "/docs/components/menubar",
169
169
  "mdUrl": "/docs/components/menubar.md",
170
170
  "jsonUrl": "/r/components/menubar.json",
171
+ "whenToUse": [
172
+ "A desktop-shaped app with more commands than a toolbar can hold.",
173
+ "Anywhere the bar behaviour — hover to switch once one is open, arrow keys across, typeahead inside — should come from the primitive."
174
+ ],
175
+ "whenNotToUse": [
176
+ "Site navigation. Use `NavigationMenu`; its rows are links, not commands.",
177
+ "A handful of actions. Use `Toolbar`."
178
+ ],
179
+ "commonMistakes": [
180
+ "Building it from separate `DropdownMenu`s, which loses the bar-level behaviour that makes a menubar feel native."
181
+ ],
171
182
  "specimens": [
172
183
  {
173
184
  "title": "Menubar",
@@ -179,6 +190,5 @@
179
190
  "note": "The desktop bar: once one menu is open, hovering the next one opens it.",
180
191
  "interaction": "left and right arrows move between menus, up and down move inside one."
181
192
  }
182
- ],
183
- "todo": true
193
+ ]
184
194
  }
@@ -97,7 +97,7 @@
97
97
  "--cue-ok",
98
98
  "--cue-surface-2"
99
99
  ],
100
- "summary": "Copy, rate, and regenerate.",
100
+ "summary": "Copy, rate and regenerate, each confirming itself with a small state change.",
101
101
  "examples": [
102
102
  {
103
103
  "title": "Usage",
@@ -105,10 +105,21 @@
105
105
  "language": "tsx"
106
106
  }
107
107
  ],
108
- "status": "todo-docs",
108
+ "status": "stable",
109
109
  "url": "/docs/components/message-actions",
110
110
  "mdUrl": "/docs/components/message-actions.md",
111
111
  "jsonUrl": "/r/components/message-actions.json",
112
+ "whenToUse": [
113
+ "The action row under an assistant turn in a product that has all four: copy, thumbs, regenerate and an overflow menu."
114
+ ],
115
+ "whenNotToUse": [
116
+ "A row where only some of the actions apply. Every callback here is required, so a product without rating or regeneration would still draw those controls."
117
+ ],
118
+ "commonMistakes": [
119
+ "Setting `copied` on the press and never clearing it. The green check is caller state, so it stays until you reset it.",
120
+ "Treating `reaction` as a boolean. It is the active thumbs reaction or `null`, and `onReactionChange` reports the toggle.",
121
+ "Driving `regenerating` from a timer rather than the run. The icon spins to show work in progress and knows nothing about when it ends."
122
+ ],
112
123
  "specimens": [
113
124
  {
114
125
  "title": "MessageActions",
@@ -120,6 +131,5 @@
120
131
  "note": "The row under an answer: copy, rate it, run it again, or ask for more. Every action confirms itself in place — copy swaps to a check and turns green, a rating latches, regenerate spins while it is out — so nothing needs a toast to say it worked.",
121
132
  "interaction": "all five are named icon buttons; the two ratings carry aria-pressed and toggle off when pressed again. The copy swap is a crossfade between two icons in one cell, not a re-mount."
122
133
  }
123
- ],
124
- "todo": true
134
+ ]
125
135
  }
@@ -51,10 +51,20 @@
51
51
  ],
52
52
  "summary": "The files a turn carried, as received rather than as staged.",
53
53
  "examples": [],
54
- "status": "todo-docs",
54
+ "status": "stable",
55
55
  "url": "/docs/components/message-attachments",
56
56
  "mdUrl": "/docs/components/message-attachments.md",
57
57
  "jsonUrl": "/r/components/message-attachments.json",
58
+ "whenToUse": [
59
+ "Attachments on a turn that has already been sent: images render as a thumbnail row, everything else as a chip."
60
+ ],
61
+ "whenNotToUse": [
62
+ "The staging area in a composer. These are files as received, not files being picked."
63
+ ],
64
+ "commonMistakes": [
65
+ "Expecting the size or a document's page count to be computed. The row draws what each attachment item carries.",
66
+ "Omitting `onOpen` and expecting a preview tile to open. Opening an attachment for preview is the caller's."
67
+ ],
58
68
  "specimens": [
59
69
  {
60
70
  "title": "MessageAttachments",
@@ -66,6 +76,5 @@
66
76
  "note": "Files as received, not as staged: an image gets a preview tile that opens, a document gets its page count, anything else gets its size. Upstream's uploader lives in the composer — this is the read-only other end of it.",
67
77
  "interaction": "every row is one button with its name as the label; the image tile grows very slightly under the pointer, and holds still under reduced motion."
68
78
  }
69
- ],
70
- "todo": true
79
+ ]
71
80
  }
@@ -63,10 +63,20 @@
63
63
  "language": "tsx"
64
64
  }
65
65
  ],
66
- "status": "todo-docs",
66
+ "status": "stable",
67
67
  "url": "/docs/components/message-branches",
68
68
  "mdUrl": "/docs/components/message-branches.md",
69
69
  "jsonUrl": "/r/components/message-branches.json",
70
+ "whenToUse": [
71
+ "A turn that has been regenerated more than once, where the reader should be able to step back to the answer they preferred."
72
+ ],
73
+ "whenNotToUse": [
74
+ "Choosing what to re-run the turn with. This steps through answers that already exist; it produces nothing."
75
+ ],
76
+ "commonMistakes": [
77
+ "Keeping only the current answer in state. `variants` is the whole set of alternates — dropping the earlier ones is exactly the losing-your-place this row exists to prevent.",
78
+ "Letting `index` run past the end of `variants`. The component is controlled: `onIndexChange` only reports which control was pressed."
79
+ ],
70
80
  "specimens": [
71
81
  {
72
82
  "title": "MessageBranches",
@@ -78,6 +88,5 @@
78
88
  "note": "Two answers to the same question, and a way through them that does not lose your place. The counter is the whole affordance — `2 / 2` is what tells you a second version exists at all — and it wraps at both ends rather than dead-ending.",
79
89
  "interaction": "both arrows are named and go disabled when there is only one version, which is the honest state for a turn nobody has regenerated."
80
90
  }
81
- ],
82
- "todo": true
91
+ ]
83
92
  }