@cueplusplus/ui 0.13.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/CHANGELOG.md +307 -0
  2. package/README.md +2 -19
  3. package/dist/index.d.ts +2 -2
  4. package/dist/layout/frames.d.ts +19 -1
  5. package/dist/layout/frames.js +21 -7
  6. package/dist/layout/index.d.ts +2 -2
  7. package/dist/primitives/chip.d.ts +1 -1
  8. package/dist/system/theme-provider.d.ts +46 -1
  9. package/dist/system/theme-provider.js +29 -3
  10. package/manifest/components/accordion.json +16 -4
  11. package/manifest/components/activity-graph.json +15 -3
  12. package/manifest/components/agent-card.json +15 -3
  13. package/manifest/components/agent-handoff.json +14 -3
  14. package/manifest/components/agent-mode-badge.json +12 -3
  15. package/manifest/components/agent-pile.json +13 -3
  16. package/manifest/components/agent-plan.json +13 -3
  17. package/manifest/components/agent-status.json +14 -3
  18. package/manifest/components/agent-surface.json +12 -3
  19. package/manifest/components/alert-dialog.json +14 -3
  20. package/manifest/components/animated-number.json +12 -3
  21. package/manifest/components/app-window-frame.json +13 -3
  22. package/manifest/components/approval-card.json +14 -3
  23. package/manifest/components/artifact-card.json +14 -3
  24. package/manifest/components/ask-box.json +13 -3
  25. package/manifest/components/audience-icon.json +11 -3
  26. package/manifest/components/autocomplete.json +15 -3
  27. package/manifest/components/avatar-group.json +15 -4
  28. package/manifest/components/avatar.json +16 -4
  29. package/manifest/components/background-inbox.json +14 -3
  30. package/manifest/components/band.json +14 -4
  31. package/manifest/components/breadcrumb.json +14 -3
  32. package/manifest/components/button-group.json +13 -3
  33. package/manifest/components/calendar.json +15 -4
  34. package/manifest/components/canvas-split-body.json +13 -3
  35. package/manifest/components/canvas-split-document.json +11 -3
  36. package/manifest/components/canvas-split-header.json +13 -3
  37. package/manifest/components/canvas-split-line.json +13 -3
  38. package/manifest/components/canvas-split-message.json +13 -3
  39. package/manifest/components/canvas-split-thread.json +11 -3
  40. package/manifest/components/canvas-split.json +13 -3
  41. package/manifest/components/card.json +14 -3
  42. package/manifest/components/carousel.json +12 -3
  43. package/manifest/components/catalogue-icon.json +11 -3
  44. package/manifest/components/channel-beta-icon.json +11 -3
  45. package/manifest/components/channel-matrix.json +11 -3
  46. package/manifest/components/channel-released-icon.json +11 -3
  47. package/manifest/components/chart-container.json +11 -3
  48. package/manifest/components/chart-ramp.json +12 -3
  49. package/manifest/components/chart-swatch.json +11 -3
  50. package/manifest/components/chart-tooltip-content.json +12 -4
  51. package/manifest/components/chart.json +14 -3
  52. package/manifest/components/chat-empty-state.json +13 -3
  53. package/manifest/components/chat-panel-assistant-message.json +11 -3
  54. package/manifest/components/chat-panel-composer.json +11 -3
  55. package/manifest/components/chat-panel-messages.json +11 -3
  56. package/manifest/components/chat-panel-typing.json +11 -3
  57. package/manifest/components/chat-panel-user-message.json +11 -3
  58. package/manifest/components/chat-panel.json +13 -3
  59. package/manifest/components/checkbox-group.json +15 -4
  60. package/manifest/components/checkpoint-history.json +13 -3
  61. package/manifest/components/clamp.json +12 -3
  62. package/manifest/components/cli-tool-icon.json +11 -3
  63. package/manifest/components/code-diff.json +14 -3
  64. package/manifest/components/code-runner.json +13 -3
  65. package/manifest/components/collapsible.json +13 -3
  66. package/manifest/components/color-area.json +12 -4
  67. package/manifest/components/color-field.json +12 -3
  68. package/manifest/components/color-picker.json +14 -4
  69. package/manifest/components/color-slider.json +12 -3
  70. package/manifest/components/color-swatch.json +13 -3
  71. package/manifest/components/colors-section.json +11 -3
  72. package/manifest/components/combobox.json +15 -4
  73. package/manifest/components/compaction-row.json +12 -3
  74. package/manifest/components/comparison-card.json +12 -3
  75. package/manifest/components/composer-actions.json +11 -3
  76. package/manifest/components/composer-attach-button.json +11 -3
  77. package/manifest/components/composer-attachment-chip.json +13 -3
  78. package/manifest/components/composer-attachments.json +11 -3
  79. package/manifest/components/composer-bar.json +12 -3
  80. package/manifest/components/composer-command-item.json +13 -3
  81. package/manifest/components/composer-context.json +13 -3
  82. package/manifest/components/composer-input.json +11 -3
  83. package/manifest/components/composer-menu-item.json +12 -3
  84. package/manifest/components/composer-menu.json +13 -3
  85. package/manifest/components/composer-model-item.json +13 -3
  86. package/manifest/components/composer-model-trigger.json +13 -3
  87. package/manifest/components/composer-person-item.json +13 -3
  88. package/manifest/components/composer-send.json +13 -3
  89. package/manifest/components/composer-toolbar.json +11 -3
  90. package/manifest/components/composer-voice-button.json +11 -3
  91. package/manifest/components/composer-voice.json +13 -3
  92. package/manifest/components/composer.json +14 -4
  93. package/manifest/components/computer-use.json +13 -3
  94. package/manifest/components/confidence-marker.json +11 -3
  95. package/manifest/components/connection-state.json +12 -3
  96. package/manifest/components/container.json +12 -3
  97. package/manifest/components/context-breakdown.json +12 -4
  98. package/manifest/components/context-menu.json +14 -4
  99. package/manifest/components/context-usage.json +14 -4
  100. package/manifest/components/conversation-search.json +13 -3
  101. package/manifest/components/copy-button.json +14 -3
  102. package/manifest/components/cost-meter.json +12 -3
  103. package/manifest/components/cue-portal-frame.json +12 -3
  104. package/manifest/components/data-table-pagination.json +13 -3
  105. package/manifest/components/data-table-toolbar.json +12 -3
  106. package/manifest/components/date-field.json +12 -3
  107. package/manifest/components/date-picker.json +13 -3
  108. package/manifest/components/date-range-picker.json +11 -3
  109. package/manifest/components/day-separator.json +12 -3
  110. package/manifest/components/delegation-card.json +14 -4
  111. package/manifest/components/density.json +12 -2
  112. package/manifest/components/description-list.json +15 -4
  113. package/manifest/components/diagram.json +13 -3
  114. package/manifest/components/disclosure.json +15 -4
  115. package/manifest/components/dmx-bar.json +12 -3
  116. package/manifest/components/dmx-strip.json +11 -3
  117. package/manifest/components/document-reference.json +13 -3
  118. package/manifest/components/draft-restore.json +13 -3
  119. package/manifest/components/drawer.json +13 -4
  120. package/manifest/components/edit-message.json +13 -3
  121. package/manifest/components/elements-command-palette.json +13 -3
  122. package/manifest/components/elements-composer.json +13 -3
  123. package/manifest/components/elements-data-table.json +11 -3
  124. package/manifest/components/elements-timeline.json +13 -3
  125. package/manifest/components/elicitation-form.json +13 -3
  126. package/manifest/components/empty-state-composer.json +11 -3
  127. package/manifest/components/empty-state-greeting.json +11 -3
  128. package/manifest/components/empty-state-suggestion.json +11 -3
  129. package/manifest/components/empty-state-suggestions.json +11 -3
  130. package/manifest/components/empty-state.json +15 -4
  131. package/manifest/components/end-of-turn-summary.json +14 -3
  132. package/manifest/components/env-var-input.json +15 -4
  133. package/manifest/components/error-state.json +13 -3
  134. package/manifest/components/export-dialog.json +10 -2
  135. package/manifest/components/eyebrow.json +14 -4
  136. package/manifest/components/feedback-dialog.json +13 -3
  137. package/manifest/components/field-description.json +15 -4
  138. package/manifest/components/field-error.json +15 -4
  139. package/manifest/components/field-label.json +15 -4
  140. package/manifest/components/file-tree.json +13 -3
  141. package/manifest/components/file-upload.json +14 -4
  142. package/manifest/components/flow-background.json +11 -3
  143. package/manifest/components/flow-controls.json +11 -3
  144. package/manifest/components/flow-graph.json +13 -3
  145. package/manifest/components/folder-icon.json +12 -3
  146. package/manifest/components/frac.json +11 -3
  147. package/manifest/components/frames.json +14 -0
  148. package/manifest/components/generation-loader.json +13 -3
  149. package/manifest/components/generative-ui.json +16 -4
  150. package/manifest/components/grid.json +14 -3
  151. package/manifest/components/group-bar.json +13 -3
  152. package/manifest/components/guardrail-notice.json +13 -3
  153. package/manifest/components/hover-card.json +14 -4
  154. package/manifest/components/icon-button.json +15 -3
  155. package/manifest/components/image-generation.json +13 -3
  156. package/manifest/components/info-tip.json +15 -4
  157. package/manifest/components/inline-citation.json +13 -3
  158. package/manifest/components/input-group.json +15 -4
  159. package/manifest/components/item.json +15 -4
  160. package/manifest/components/job-progress.json +14 -3
  161. package/manifest/components/kbd.json +14 -3
  162. package/manifest/components/launcher-bubble.json +14 -3
  163. package/manifest/components/link.json +13 -3
  164. package/manifest/components/live-region-announcer.json +16 -4
  165. package/manifest/components/log-viewer.json +15 -3
  166. package/manifest/components/map-answer.json +13 -3
  167. package/manifest/components/markdown-text.json +16 -4
  168. package/manifest/components/math-block.json +13 -3
  169. package/manifest/components/mcp-server-icon.json +12 -3
  170. package/manifest/components/mcp-server-panel.json +13 -3
  171. package/manifest/components/memory-chips.json +12 -3
  172. package/manifest/components/menubar.json +13 -3
  173. package/manifest/components/message-actions.json +14 -4
  174. package/manifest/components/message-attachments.json +12 -3
  175. package/manifest/components/message-branches.json +12 -3
  176. package/manifest/components/message-list.json +12 -3
  177. package/manifest/components/message-pair.json +12 -3
  178. package/manifest/components/message-queue.json +13 -3
  179. package/manifest/components/message-timing.json +13 -3
  180. package/manifest/components/message.json +12 -3
  181. package/manifest/components/mobile-composer.json +14 -3
  182. package/manifest/components/model-picker.json +12 -3
  183. package/manifest/components/multi-select.json +16 -4
  184. package/manifest/components/musical-time-input.json +11 -3
  185. package/manifest/components/navigation-menu.json +13 -3
  186. package/manifest/components/node-card.json +11 -3
  187. package/manifest/components/node-handle.json +11 -3
  188. package/manifest/components/number-field.json +15 -3
  189. package/manifest/components/number-ticker.json +12 -3
  190. package/manifest/components/onboarding.json +12 -3
  191. package/manifest/components/otp-field.json +14 -3
  192. package/manifest/components/page-shell.json +14 -4
  193. package/manifest/components/pagination.json +14 -3
  194. package/manifest/components/panel-header.json +14 -4
  195. package/manifest/components/password-input.json +15 -4
  196. package/manifest/components/permission-grant.json +13 -3
  197. package/manifest/components/permission-scopes.json +14 -3
  198. package/manifest/components/piano-keyboard.json +11 -3
  199. package/manifest/components/preset-section.json +11 -3
  200. package/manifest/components/progress.json +14 -3
  201. package/manifest/components/prompt-library.json +12 -3
  202. package/manifest/components/queue-dock.json +14 -3
  203. package/manifest/components/quota-banner.json +12 -3
  204. package/manifest/components/quote-reply.json +12 -3
  205. package/manifest/components/radio-group.json +15 -4
  206. package/manifest/components/radio.json +15 -4
  207. package/manifest/components/rating.json +15 -4
  208. package/manifest/components/read-aloud.json +13 -3
  209. package/manifest/components/reasoning-effort.json +12 -3
  210. package/manifest/components/reasoning-panel.json +13 -3
  211. package/manifest/components/recommendation-card.json +12 -3
  212. package/manifest/components/regenerate-menu.json +12 -3
  213. package/manifest/components/replay-player.json +14 -3
  214. package/manifest/components/research-report.json +12 -3
  215. package/manifest/components/resizable.json +13 -3
  216. package/manifest/components/retrieval-chunks.json +13 -3
  217. package/manifest/components/revert-dock.json +14 -3
  218. package/manifest/components/reviewable-diff.json +12 -3
  219. package/manifest/components/risk-badge.json +14 -3
  220. package/manifest/components/schedule-card.json +12 -3
  221. package/manifest/components/score-breakdown.json +13 -3
  222. package/manifest/components/scroll-anchor.json +12 -3
  223. package/manifest/components/scroll-area.json +13 -3
  224. package/manifest/components/scrollable-tabs-list.json +14 -4
  225. package/manifest/components/seam-cell.json +13 -4
  226. package/manifest/components/seam-grid.json +14 -3
  227. package/manifest/components/seam-list.json +13 -3
  228. package/manifest/components/search-input.json +15 -4
  229. package/manifest/components/section-header.json +14 -3
  230. package/manifest/components/segmented-control.json +15 -3
  231. package/manifest/components/separator.json +14 -3
  232. package/manifest/components/settings-panel.json +13 -3
  233. package/manifest/components/shape-section.json +11 -3
  234. package/manifest/components/shared-conversation.json +12 -3
  235. package/manifest/components/sheet.json +14 -4
  236. package/manifest/components/shimmer-label.json +12 -3
  237. package/manifest/components/sidebar.json +15 -4
  238. package/manifest/components/signal-edge.json +13 -4
  239. package/manifest/components/skeleton.json +16 -4
  240. package/manifest/components/skill-icon.json +12 -3
  241. package/manifest/components/slider.json +14 -3
  242. package/manifest/components/sources.json +12 -3
  243. package/manifest/components/sparkline.json +14 -4
  244. package/manifest/components/speaker-identity.json +11 -3
  245. package/manifest/components/spec-sheet.json +13 -4
  246. package/manifest/components/spectrum-visualizer.json +11 -3
  247. package/manifest/components/spinner.json +16 -4
  248. package/manifest/components/stack-icon.json +12 -3
  249. package/manifest/components/stack.json +14 -3
  250. package/manifest/components/stacks-matrix-icon.json +11 -3
  251. package/manifest/components/stat.json +14 -3
  252. package/manifest/components/status-dot.json +16 -4
  253. package/manifest/components/stepper.json +15 -4
  254. package/manifest/components/stopped-run.json +13 -4
  255. package/manifest/components/streaming-text.json +12 -3
  256. package/manifest/components/sub.json +11 -3
  257. package/manifest/components/subagent-list.json +13 -3
  258. package/manifest/components/suggestions.json +12 -3
  259. package/manifest/components/sup.json +11 -3
  260. package/manifest/components/swap-label.json +12 -3
  261. package/manifest/components/tags-input.json +15 -4
  262. package/manifest/components/tail-status.json +14 -3
  263. package/manifest/components/terminal-block.json +13 -3
  264. package/manifest/components/terminal-frame.json +14 -3
  265. package/manifest/components/textarea.json +15 -4
  266. package/manifest/components/theme-configurator.json +12 -3
  267. package/manifest/components/theme-provider.json +10 -0
  268. package/manifest/components/thinking-indicator.json +12 -3
  269. package/manifest/components/thread-list.json +12 -3
  270. package/manifest/components/thread-search.json +12 -3
  271. package/manifest/components/threshold-rail.json +13 -3
  272. package/manifest/components/time-boundary.json +13 -3
  273. package/manifest/components/time-field.json +15 -4
  274. package/manifest/components/timeline-ruler.json +13 -3
  275. package/manifest/components/timeline.json +13 -3
  276. package/manifest/components/title-bar.json +13 -3
  277. package/manifest/components/todo-list.json +12 -3
  278. package/manifest/components/toggle-group.json +15 -4
  279. package/manifest/components/toggle.json +15 -4
  280. package/manifest/components/token-editor.json +12 -3
  281. package/manifest/components/tool-call.json +13 -3
  282. package/manifest/components/tool-error.json +14 -4
  283. package/manifest/components/tool-group.json +12 -3
  284. package/manifest/components/tool-timeline.json +14 -4
  285. package/manifest/components/toolbar.json +14 -4
  286. package/manifest/components/trace-waterfall.json +12 -3
  287. package/manifest/components/tree-visibility-toggle.json +13 -3
  288. package/manifest/components/tree.json +14 -3
  289. package/manifest/components/turn-footer.json +14 -3
  290. package/manifest/components/two-step-button.json +14 -3
  291. package/manifest/components/typing-indicator.json +12 -3
  292. package/manifest/components/universe-grid.json +14 -4
  293. package/manifest/components/unread-divider.json +14 -4
  294. package/manifest/components/usage-chart.json +14 -3
  295. package/manifest/components/verdict-row.json +14 -3
  296. package/manifest/components/voice-conversation.json +13 -3
  297. package/manifest/components/web-preview.json +13 -3
  298. package/manifest/components/web-search.json +13 -3
  299. package/manifest/components/work-collapse.json +15 -4
  300. package/manifest/manifest.json +651 -651
  301. package/manifest/tokens.json +1 -1
  302. package/package.json +5 -5
@@ -67,10 +67,20 @@
67
67
  "language": "tsx"
68
68
  }
69
69
  ],
70
- "status": "todo-docs",
70
+ "status": "stable",
71
71
  "url": "/docs/components/model-picker",
72
72
  "mdUrl": "/docs/components/model-picker.md",
73
73
  "jsonUrl": "/r/components/model-picker.json",
74
+ "whenToUse": [
75
+ "A picker over every model on offer, where price and capability are part of the choice."
76
+ ],
77
+ "whenNotToUse": [
78
+ "Two or three models in a settings row. This is the full list, and a family of one is a heading over a single row."
79
+ ],
80
+ "commonMistakes": [
81
+ "Grouping or sorting `models` by family before passing them. Families are derived from the entries and keep their first-seen order, so the order you pass is the order you get.",
82
+ "Passing `selectedId` without `onSelect` on a picker meant to change the model — the id alone only marks which one is active."
83
+ ],
74
84
  "specimens": [
75
85
  {
76
86
  "title": "ModelPicker",
@@ -82,6 +92,5 @@
82
92
  "note": "The full list rather than the rail: grouped by family, priced, and carrying what each one can actually do. This is the screen `ComposerModelTrigger` is a shortcut to, and the split is the point — the toolbar menu is for switching between models you already chose between, and this is where that choosing happens.",
83
93
  "interaction": "each row is `aria-pressed`, which is the honest role for a control that stays chosen rather than performing an action once."
84
94
  }
85
- ],
86
- "todo": true
95
+ ]
87
96
  }
@@ -227,7 +227,7 @@
227
227
  "--cue-text-label",
228
228
  "--cue-text-ui"
229
229
  ],
230
- "summary": "Several values out of a known set, each shown as a removable chip.",
230
+ "summary": "Several values out of a known set, each shown as a removable chip inside the field.",
231
231
  "examples": [
232
232
  {
233
233
  "title": "Usage",
@@ -235,10 +235,23 @@
235
235
  "language": "tsx"
236
236
  }
237
237
  ],
238
- "status": "todo-docs",
238
+ "status": "stable",
239
239
  "url": "/docs/components/multi-select",
240
240
  "mdUrl": "/docs/components/multi-select.md",
241
241
  "jsonUrl": "/r/components/multi-select.json",
242
+ "whenToUse": [
243
+ "A selection the user needs to see in full: assignees, fixtures, channels.",
244
+ "Anywhere the size of the selection is information. Nine trusses render nine chips tall, so the field is honest about how much has been chosen."
245
+ ],
246
+ "whenNotToUse": [
247
+ "Values the product cannot enumerate. Use `TagsInput`, which commits whatever is typed.",
248
+ "Exactly one value. Use `Select` or `Combobox`.",
249
+ "A set small enough to show at once. A `CheckboxGroup` shows every option without an open-close cycle."
250
+ ],
251
+ "commonMistakes": [
252
+ "Giving the field a fixed height. It takes `min-h-control-*` on purpose; a fixed height reintroduces the hidden overflow the chips exist to avoid.",
253
+ "Collapsing the chips behind a `+6 more`. That hides the selection the user came to check."
254
+ ],
242
255
  "specimens": [
243
256
  {
244
257
  "title": "MultiSelect",
@@ -250,6 +263,5 @@
250
263
  "note": "Several values in one control, rendered as removable chips.",
251
264
  "interaction": "each chip's remove button has its own accessible name; Backspace removes the last one."
252
265
  }
253
- ],
254
- "todo": true
266
+ ]
255
267
  }
@@ -121,10 +121,19 @@
121
121
  "language": "tsx"
122
122
  }
123
123
  ],
124
- "status": "todo-docs",
124
+ "status": "stable",
125
125
  "url": "/docs/components/musical-time-input",
126
126
  "mdUrl": "/docs/components/musical-time-input.md",
127
127
  "jsonUrl": "/r/components/musical-time-input.json",
128
+ "whenToUse": [
129
+ "Any position or length in musical time."
130
+ ],
131
+ "whenNotToUse": [
132
+ "Wall-clock time. Use a time field."
133
+ ],
134
+ "commonMistakes": [
135
+ "Using a `NumberField` instead. That asks for 4.25 and means 'bar 2, beat 1, one sixteenth in' — a conversion the musician has to do in their head every time. Three segments, each stepping in its own musical unit, does it instead."
136
+ ],
128
137
  "specimens": [
129
138
  {
130
139
  "title": "MusicalTimeInput",
@@ -136,6 +145,5 @@
136
145
  "note": "`bars.beats.sixteenths` as three segments, time-signature aware, with the total-beats readout beside it.",
137
146
  "interaction": "arrow keys and the scroll wheel step the segment under the caret; Tab moves between segments and overflow carries into the next one."
138
147
  }
139
- ],
140
- "todo": true
148
+ ]
141
149
  }
@@ -249,10 +249,21 @@
249
249
  "language": "tsx"
250
250
  }
251
251
  ],
252
- "status": "todo-docs",
252
+ "status": "stable",
253
253
  "url": "/docs/components/navigation-menu",
254
254
  "mdUrl": "/docs/components/navigation-menu.md",
255
255
  "jsonUrl": "/r/components/navigation-menu.json",
256
+ "whenToUse": [
257
+ "A site header whose sections each hold several destinations.",
258
+ "Anywhere hover intent, a shared resizing popup and the landmark should come from the primitive rather than be rebuilt."
259
+ ],
260
+ "whenNotToUse": [
261
+ "Commands. Use a menu — this is navigation, and its rows are links.",
262
+ "A console's primary navigation. Use `Sidebar` or `AppBar`."
263
+ ],
264
+ "commonMistakes": [
265
+ "Giving it `role=\"menu\"`. A navigation menu is not a menu: that role tells a screen reader to expect commands and swallows the browser's own link affordances."
266
+ ],
256
267
  "specimens": [
257
268
  {
258
269
  "title": "NavigationMenu",
@@ -264,6 +275,5 @@
264
275
  "note": "A menu bar whose panels are portalled through the stamping contract, so they keep the theme and density of the island they were opened from.",
265
276
  "interaction": "hover opens after a short delay; Escape closes and returns focus to the trigger."
266
277
  }
267
- ],
268
- "todo": true
278
+ ]
269
279
  }
@@ -124,10 +124,19 @@
124
124
  "language": "tsx"
125
125
  }
126
126
  ],
127
- "status": "todo-docs",
127
+ "status": "stable",
128
128
  "url": "/docs/components/node-card",
129
129
  "mdUrl": "/docs/components/node-card.md",
130
130
  "jsonUrl": "/r/components/node-card.json",
131
+ "whenToUse": [
132
+ "Any React Flow node that should look like the rest of the console."
133
+ ],
134
+ "whenNotToUse": [
135
+ "A card in normal layout. Use `Card`."
136
+ ],
137
+ "commonMistakes": [
138
+ "Giving it a border. It is framed with an **outline** on purpose: React Flow is told a node's height up front, and a 1px border on each side makes the box 2px taller than the number the layout used — which is how node stacks end up overlapping by a hairline that grows with the stack."
139
+ ],
131
140
  "specimens": [
132
141
  {
133
142
  "title": "NodeCard",
@@ -139,6 +148,5 @@
139
148
  "note": "Framed with an outline rather than a border, so a node's rendered height is exactly the height the layout was told. The frame colour is the state: selected is `fg`, input is `info`, output and live are accent, idle is `fg-subtle`.",
140
149
  "interaction": "the expand toggle is a real button; the frame colour changes with `state`, never with hover alone."
141
150
  }
142
- ],
143
- "todo": true
151
+ ]
144
152
  }
@@ -64,10 +64,19 @@
64
64
  "language": "tsx"
65
65
  }
66
66
  ],
67
- "status": "todo-docs",
67
+ "status": "stable",
68
68
  "url": "/docs/components/node-handle",
69
69
  "mdUrl": "/docs/components/node-handle.md",
70
70
  "jsonUrl": "/r/components/node-handle.json",
71
+ "whenToUse": [
72
+ "Every source and target on a `NodeCard`."
73
+ ],
74
+ "whenNotToUse": [
75
+ "Decoration. A handle advertises a connection that can be made."
76
+ ],
77
+ "commonMistakes": [
78
+ "Restyling it with classes. Everything visual is inline style deliberately: `.react-flow__handle` sets background, border and size from the library's own *unlayered* stylesheet, and any layered Tailwind utility loses to an unlayered rule of the same specificity."
79
+ ],
71
80
  "specimens": [
72
81
  {
73
82
  "title": "NodeHandle",
@@ -79,6 +88,5 @@
79
88
  "note": "A 9px connection pin in the system's tones, painted with inline `var(--cue-*)` references. That is deliberate: the library's own stylesheet is unlayered while Tailwind's utilities are layered, and a layered rule loses to an unlayered one of equal specificity whatever the import order. Shown on a node, because a handle only exists inside a canvas.",
80
89
  "interaction": "the hit area is larger than the dot; the pin resolves its colour from the live custom properties, so a theme switch repaints it."
81
90
  }
82
- ],
83
- "todo": true
91
+ ]
84
92
  }
@@ -111,10 +111,23 @@
111
111
  "language": "tsx"
112
112
  }
113
113
  ],
114
- "status": "todo-docs",
114
+ "status": "stable",
115
115
  "url": "/docs/components/number-field",
116
116
  "mdUrl": "/docs/components/number-field.md",
117
117
  "jsonUrl": "/r/components/number-field.json",
118
+ "whenToUse": [
119
+ "Any number a user types or nudges at console density: a channel, a count, an offset.",
120
+ "Touch. Real buttons are hittable; native spinners are a pair of 4px arrows that only appear on hover."
121
+ ],
122
+ "whenNotToUse": [
123
+ "A value best chosen by feel across a range. Use `Slider`, or `ScrubInput` for a drag-to-change readout.",
124
+ "A code or an identifier that merely looks numeric. Use `Input` — stepping a serial number is meaningless."
125
+ ],
126
+ "commonMistakes": [
127
+ "Reaching for `<input type=\"number\">` for the spinners. They are unusable here, which is the reason this exists.",
128
+ "Validating range only on submit. Values typed out of range are clamped to `min`/`max` on blur, so the field has already moved.",
129
+ "Forgetting the modifier steps: Shift uses `largeStep`, Alt uses `smallStep`."
130
+ ],
118
131
  "specimens": [
119
132
  {
120
133
  "title": "NumberField",
@@ -126,6 +139,5 @@
126
139
  "note": "Stepper buttons on the chassis, with tabular figures so a changing digit does not shift the column.",
127
140
  "interaction": "arrow keys step, shift-arrow steps by ten, the scroll wheel is deliberately inert."
128
141
  }
129
- ],
130
- "todo": true
142
+ ]
131
143
  }
@@ -47,10 +47,20 @@
47
47
  "language": "tsx"
48
48
  }
49
49
  ],
50
- "status": "todo-docs",
50
+ "status": "stable",
51
51
  "url": "/docs/components/number-ticker",
52
52
  "mdUrl": "/docs/components/number-ticker.md",
53
53
  "jsonUrl": "/r/components/number-ticker.json",
54
+ "whenToUse": [
55
+ "A live count that moves while a run goes: tokens per second, rows read, files touched."
56
+ ],
57
+ "whenNotToUse": [
58
+ "A value that does not change. The whole effect is the digits rolling as `value` moves."
59
+ ],
60
+ "commonMistakes": [
61
+ "Passing a pre-formatted string. `value` is a number, and the digits are what roll.",
62
+ "Leaving the caption vague. `label` is required and is the mono line that says what the number counts."
63
+ ],
54
64
  "specimens": [
55
65
  {
56
66
  "title": "NumberTicker",
@@ -62,6 +72,5 @@
62
72
  "note": "A count that rolls rather than jumps: each digit is a column of ten sliding into place, so 47 to 48 moves one wheel and leaves the other alone. The whole figure is announced once as text, which is what keeps ten rolling columns from being read out as ten numbers.",
63
73
  "interaction": "none. The columns translate on a long ease and stop moving entirely under reduced motion."
64
74
  }
65
- ],
66
- "todo": true
75
+ ]
67
76
  }
@@ -80,10 +80,20 @@
80
80
  "language": "tsx"
81
81
  }
82
82
  ],
83
- "status": "todo-docs",
83
+ "status": "stable",
84
84
  "url": "/docs/components/onboarding",
85
85
  "mdUrl": "/docs/components/onboarding.md",
86
86
  "jsonUrl": "/r/components/onboarding.json",
87
+ "whenToUse": [
88
+ "The first run of an assistant, where a reader needs to know what it is for before they type."
89
+ ],
90
+ "whenNotToUse": [
91
+ "A long tour. Three steps is usually the limit before it is skipped, and the final step's action reads Start instead of Next."
92
+ ],
93
+ "commonMistakes": [
94
+ "Leaving `onSkip` off. Always offer the way out — without it the only path is through every step.",
95
+ "Treating `index` as internal state. It is the caller's, and the last step is detected from it."
96
+ ],
87
97
  "specimens": [
88
98
  {
89
99
  "title": "Onboarding",
@@ -95,6 +105,5 @@
95
105
  "note": "First run: three moves that teach what this assistant is actually for, each with a prompt you could send verbatim. Showing beats describing, which is why every step carries an example rather than a screenshot. The dots are the progress and the final step's action reads `Start` instead of `Next`, so the end of the tour is visible from the second step.",
96
106
  "interaction": "skip is always offered and always in the same place — a tour with no way out is a modal wearing a card."
97
107
  }
98
- ],
99
- "todo": true
108
+ ]
100
109
  }
@@ -143,10 +143,22 @@
143
143
  "language": "tsx"
144
144
  }
145
145
  ],
146
- "status": "todo-docs",
146
+ "status": "stable",
147
147
  "url": "/docs/components/otp-field",
148
148
  "mdUrl": "/docs/components/otp-field.md",
149
149
  "jsonUrl": "/r/components/otp-field.json",
150
+ "whenToUse": [
151
+ "A fixed-length code the user copies from somewhere else. The boxes say how long it is before they start typing.",
152
+ "Anywhere `one-time-code` autofill should work — paste, arrow keys and Backspace across slots all come from Base UI."
153
+ ],
154
+ "whenNotToUse": [
155
+ "A code of unknown or variable length. Use `Input`; empty boxes promise a length you cannot keep.",
156
+ "A password. Use `PasswordInput` — these slots are unmasked by design."
157
+ ],
158
+ "commonMistakes": [
159
+ "Rebuilding slot navigation by hand. Backspace across a slot boundary and paste-into-the-middle are the two cases that are always wrong in a hand-rolled version.",
160
+ "Setting `groupSize` without `separator`, so a grouped code reads as one run of digits."
161
+ ],
150
162
  "specimens": [
151
163
  {
152
164
  "title": "OTPField",
@@ -158,6 +170,5 @@
158
170
  "note": "Six slots in two groups. One value, six boxes: paste fills all of them.",
159
171
  "interaction": "Backspace walks back through the slots; arrow keys move without deleting."
160
172
  }
161
- ],
162
- "todo": true
173
+ ]
163
174
  }
@@ -101,7 +101,7 @@
101
101
  "--cue-text-title",
102
102
  "--cue-text-ui"
103
103
  ],
104
- "summary": "A centred content column with a standard page header.",
104
+ "summary": "A centred content column with a standard page header, emitted only when something fills it.",
105
105
  "examples": [
106
106
  {
107
107
  "title": "Usage",
@@ -109,10 +109,21 @@
109
109
  "language": "tsx"
110
110
  }
111
111
  ],
112
- "status": "todo-docs",
112
+ "status": "stable",
113
113
  "url": "/docs/components/page-shell",
114
114
  "mdUrl": "/docs/components/page-shell.md",
115
115
  "jsonUrl": "/r/components/page-shell.json",
116
+ "whenToUse": [
117
+ "A route that wants the measure and a title in one place.",
118
+ "A shell used purely for its measure — pass no header props and it adds no empty box and no stray rhythm."
119
+ ],
120
+ "whenNotToUse": [
121
+ "A page that already has a `TitleBar` or its own heading. Use `Container`."
122
+ ],
123
+ "commonMistakes": [
124
+ "Assuming it is the page's `<main>`. It renders a plain `<div>` on purpose — a split view holds more than one shell, and only one element per document may be `<main>`. Wrap it yourself where the semantics apply.",
125
+ "Passing an empty `title` to get the spacing. The header is conditional; an empty string still fills it."
126
+ ],
116
127
  "specimens": [
117
128
  {
118
129
  "title": "PageShell",
@@ -124,6 +135,5 @@
124
135
  "note": "The page measure: eyebrow, title, subtitle, actions and a body at one of four widths — 42rem, 54rem, 84rem, or uncapped.",
125
136
  "interaction": "none."
126
137
  }
127
- ],
128
- "todo": true
138
+ ]
129
139
  }
@@ -88,10 +88,22 @@
88
88
  "language": "tsx"
89
89
  }
90
90
  ],
91
- "status": "todo-docs",
91
+ "status": "stable",
92
92
  "url": "/docs/components/pagination",
93
93
  "mdUrl": "/docs/components/pagination.md",
94
94
  "jsonUrl": "/r/components/pagination.json",
95
+ "whenToUse": [
96
+ "A result set the user needs to move through by position, and to jump within.",
97
+ "Anywhere `pageCount` may be one: it renders nothing then, on purpose."
98
+ ],
99
+ "whenNotToUse": [
100
+ "A stream with no end. Use infinite scroll or a load-more control.",
101
+ "A set small enough to show at once."
102
+ ],
103
+ "commonMistakes": [
104
+ "Hiding it yourself when there is one page. It already renders nothing — a control offering no choice says 'there is more here' when there is not.",
105
+ "Rebuilding the numbers as bare numerals. Every page number is a real button with a spoken name ('Page 3'), because the numeral alone is meaningless read aloud."
106
+ ],
95
107
  "specimens": [
96
108
  {
97
109
  "title": "Pagination",
@@ -103,6 +115,5 @@
103
115
  "note": "A windowed pager with gaps, generated by the exported `paginationRange`.",
104
116
  "interaction": "the current page is accent-soft and carries `aria-current`; the ends disable rather than disappear."
105
117
  }
106
- ],
107
- "todo": true
118
+ ]
108
119
  }
@@ -60,7 +60,7 @@
60
60
  "--cue-surface-1",
61
61
  "--cue-text-emphasis"
62
62
  ],
63
- "summary": "The top bar of a {@link Panel}: title left, actions right, hairline under.",
63
+ "summary": "The top bar of a panel: title left, actions right, hairline under.",
64
64
  "examples": [
65
65
  {
66
66
  "title": "Usage",
@@ -68,10 +68,21 @@
68
68
  "language": "tsx"
69
69
  }
70
70
  ],
71
- "status": "todo-docs",
71
+ "status": "stable",
72
72
  "url": "/docs/components/panel-header",
73
73
  "mdUrl": "/docs/components/panel-header.md",
74
74
  "jsonUrl": "/r/components/panel-header.json",
75
+ "whenToUse": [
76
+ "Any panel that needs a name, controls, or both.",
77
+ "Anywhere the header must line up horizontally with the rows beneath it — it uses the density row tokens, not its own values."
78
+ ],
79
+ "whenNotToUse": [
80
+ "A group heading inside a panel. Use `SectionHeader`.",
81
+ "The window bar. Use `TitleBar`."
82
+ ],
83
+ "commonMistakes": [
84
+ "Padding it with hand-picked values, which breaks the horizontal alignment with the rows at every density but the one it was tuned for."
85
+ ],
75
86
  "specimens": [
76
87
  {
77
88
  "title": "Panel / PanelHeader",
@@ -84,6 +95,5 @@
84
95
  "note": "The universal container: one hairline rim, no shadow, and a header that owns its own rule.",
85
96
  "interaction": "none. A panel is a box."
86
97
  }
87
- ],
88
- "todo": true
98
+ ]
89
99
  }
@@ -143,7 +143,7 @@
143
143
  "--cue-text-label",
144
144
  "--cue-text-ui"
145
145
  ],
146
- "summary": "A masked text field with a reveal control.",
146
+ "summary": "A masked text field with a reveal control that says what it does and which way it is.",
147
147
  "examples": [
148
148
  {
149
149
  "title": "Usage",
@@ -151,10 +151,22 @@
151
151
  "language": "tsx"
152
152
  }
153
153
  ],
154
- "status": "todo-docs",
154
+ "status": "stable",
155
155
  "url": "/docs/components/password-input",
156
156
  "mdUrl": "/docs/components/password-input.md",
157
157
  "jsonUrl": "/r/components/password-input.json",
158
+ "whenToUse": [
159
+ "Any secret the user types and may need to check: a password, a token, a passphrase.",
160
+ "Anywhere a reveal is a genuine kindness — long generated secrets typed by hand."
161
+ ],
162
+ "whenNotToUse": [
163
+ "A secret that should never be shown. Pass `showReveal={false}`, or do not render one at all.",
164
+ "A config value that may reference an environment variable. Use `EnvVarInput`."
165
+ ],
166
+ "commonMistakes": [
167
+ "Replacing the reveal with a bare icon or a checkbox. It is a toggle button carrying `aria-pressed`, which is the one attribute that announces both what it does and its current state.",
168
+ "Painting the characters out with CSS instead of switching `type`. A password manager and the browser both key off the real type."
169
+ ],
158
170
  "specimens": [
159
171
  {
160
172
  "title": "PasswordInput",
@@ -166,6 +178,5 @@
166
178
  "note": "Input plus a reveal toggle carrying `aria-pressed`, so the state is spoken rather than implied by an icon swap.",
167
179
  "interaction": "the toggle is in the tab order after the field."
168
180
  }
169
- ],
170
- "todo": true
181
+ ]
171
182
  }
@@ -95,10 +95,21 @@
95
95
  "language": "tsx"
96
96
  }
97
97
  ],
98
- "status": "todo-docs",
98
+ "status": "stable",
99
99
  "url": "/docs/components/permission-grant",
100
100
  "mdUrl": "/docs/components/permission-grant.md",
101
101
  "jsonUrl": "/r/components/permission-grant.json",
102
+ "whenToUse": [
103
+ "A capability request from a named requester — filesystem access, network reach — where the answer outlives this one call.",
104
+ "The settled outcome: `scope` takes `session`, `always` or `denied` and the card shows what was decided rather than disappearing."
105
+ ],
106
+ "whenNotToUse": [
107
+ "A grant whose limits you cannot state. `reach` is required, and it is meant to carry what the grant does not cover as well as what it does."
108
+ ],
109
+ "commonMistakes": [
110
+ "Writing `reach` as a list of what is allowed only. Write the limits in too — that is what makes it a reach rather than a feature list.",
111
+ "Naming `capability` after the action rather than the capability. The point of this card, against a per-call approval, is that it grants a capability."
112
+ ],
102
113
  "specimens": [
103
114
  {
104
115
  "title": "PermissionGrant",
@@ -110,6 +121,5 @@
110
121
  "note": "The other half of the loop: granting a capability rather than approving one action. The reach is a list the caller writes, and the limits belong in it, because a grant a reader cannot bound is a grant they cannot give.",
111
122
  "interaction": "the three answers are Deny, this session and Always. Answer any card and it settles into the scope you chose."
112
123
  }
113
- ],
114
- "todo": true
124
+ ]
115
125
  }
@@ -164,10 +164,22 @@
164
164
  "language": "tsx"
165
165
  }
166
166
  ],
167
- "status": "todo-docs",
167
+ "status": "stable",
168
168
  "url": "/docs/components/permission-scopes",
169
169
  "mdUrl": "/docs/components/permission-scopes.md",
170
170
  "jsonUrl": "/r/components/permission-scopes.json",
171
+ "whenToUse": [
172
+ "The approval card for one tool call, where a standing grant would write a rule and the reader deserves to be told which file it lands in.",
173
+ "A product with nowhere to persist a grant: omit `scopes` and the card asks, offering only once and no."
174
+ ],
175
+ "whenNotToUse": [
176
+ "As an overlay. There is no settled state — an answered permission is not a card any more, and every product that modelled approval as an overlay got the bug where the next message hides the answer."
177
+ ],
178
+ "commonMistakes": [
179
+ "Passing `onAlwaysAllow` without `scopes`. No scopes means no always-allow answer: a permanent grant that cannot say where it is saved is not one this element will offer.",
180
+ "Shortening or eliding a long rule before passing it. The label wraps instead, because a cut lands on the part that says how much is being granted — and `and 3 more` is a count, not an account.",
181
+ "Expecting `1`, `2` and `3` to answer from anywhere. The handler is the card's own `onKeyDown`, nothing is bound to the document, and the card never takes focus itself — a card that arrives mid-sentence and starts answering keystrokes is the bug the reference's 500ms delay exists to prevent."
182
+ ],
171
183
  "specimens": [
172
184
  {
173
185
  "title": "PermissionScopes",
@@ -179,6 +191,5 @@
179
191
  "note": "The one control in an agent UI whose label has to be computed, because what it grants is different every time it appears. `Yes, allow Bash(cue patch:*) for this project (just you)` is written from the rules it would add and the reach it would add them to, and the sentence under it names the file — permanently, not on hover. Nothing is shortened: the reference elides a long rule and strips the `:*` off a prefix rule, and both cuts land on the part that says how far the grant reaches, so this one wraps instead. When there are more rules than the sentence can name, every one of them is listed underneath, because `and 3 more` is a count and a count is not an account. The last card is what that costs: one directory of seventy-seven characters that a line breaker reads as a single word — it would take a hyphen if the name had one, and an underscored path has none — so the sentence breaks mid-path rather than running out of the card. It is also the card where the sentence is the whole account, since a grant naming one directory draws no rule list under it. The card after it moves the long word to the other two caller strings that can carry one — the subject beside the question, and the destination naming the file the grant is written into — and draws the destination both ways: the top card cycles it, so it is a button sized to its own text, and the bottom card has one destination and draws a span. Cycle the top one onto the project and the sentence breaks mid-path instead of leaving the card, which is the whole point of drawing where a permission is saved rather than hiding it behind a hover.",
180
192
  "interaction": "tab into the card and the numbers work — 1, 2, 3 fire whichever answers are rendered, built from the same list that drew them, and Escape denies. They are the card's own keys, not the document's: nothing here answers a digit typed into a composer somewhere above it, and a console that wants them to answer from anywhere routes them there itself. Press the dotted line to move the grant to another destination and watch the answer above it change with it: there is one resolved scope behind the label, the sentence and the callback, so they cannot disagree about what is being granted."
181
193
  }
182
- ],
183
- "todo": true
194
+ ]
184
195
  }
@@ -129,10 +129,19 @@
129
129
  "language": "tsx"
130
130
  }
131
131
  ],
132
- "status": "todo-docs",
132
+ "status": "stable",
133
133
  "url": "/docs/components/piano-keyboard",
134
134
  "mdUrl": "/docs/components/piano-keyboard.md",
135
135
  "jsonUrl": "/r/components/piano-keyboard.json",
136
+ "whenToUse": [
137
+ "Choosing a note range, where the keyboard itself is the clearest scale."
138
+ ],
139
+ "whenNotToUse": [
140
+ "A numeric range with no musical meaning. Use `Slider`."
141
+ ],
142
+ "commonMistakes": [
143
+ "Treating it as a display. It is a range control — the markers are draggable and the edges are arrow-key operable."
144
+ ],
136
145
  "specimens": [
137
146
  {
138
147
  "title": "PianoKeyboard",
@@ -144,6 +153,5 @@
144
153
  "note": "Exact key geometry from the shared layout module, in-range tinting, and draggable start and end markers.",
145
154
  "interaction": "each marker is a `role=slider` that announces the note it sits on, so the drag is a fast path rather than the only path."
146
155
  }
147
- ],
148
- "todo": true
156
+ ]
149
157
  }
@@ -64,7 +64,7 @@
64
64
  "--cue-text-micro",
65
65
  "--cue-text-ui"
66
66
  ],
67
- "summary": "Section 1 — the four choices that are not token edits at all.",
67
+ "summary": "Section 1 of the configurator — the four choices that are not token edits at all.",
68
68
  "examples": [
69
69
  {
70
70
  "title": "Usage",
@@ -72,9 +72,17 @@
72
72
  "language": "tsx"
73
73
  }
74
74
  ],
75
- "status": "todo-docs",
75
+ "status": "stable",
76
76
  "url": "/docs/components/preset-section",
77
77
  "mdUrl": "/docs/components/preset-section.md",
78
78
  "jsonUrl": "/r/components/preset-section.json",
79
- "todo": true
79
+ "whenToUse": [
80
+ "Inside `ThemeConfigurator`. Preset, mode and density are *provider* state: picking one restamps the document and every portal under it."
81
+ ],
82
+ "whenNotToUse": [
83
+ "On its own. It edits the configurator's model, not yours."
84
+ ],
85
+ "commonMistakes": [
86
+ "Filing these with the colours. They are not token edits, which is why they live in their own section."
87
+ ]
80
88
  }
@@ -94,10 +94,22 @@
94
94
  "language": "tsx"
95
95
  }
96
96
  ],
97
- "status": "todo-docs",
97
+ "status": "stable",
98
98
  "url": "/docs/components/progress",
99
99
  "mdUrl": "/docs/components/progress.md",
100
100
  "jsonUrl": "/r/components/progress.json",
101
+ "whenToUse": [
102
+ "Work whose completion you can actually measure.",
103
+ "Work whose length you cannot: pass `value={null}` and the fill collapses to an indeterminate state."
104
+ ],
105
+ "whenNotToUse": [
106
+ "A short wait with no structure. Use `Spinner`.",
107
+ "Content arriving whose shape you know. Use `Skeleton`, which holds the layout too."
108
+ ],
109
+ "commonMistakes": [
110
+ "Easing the width transition. It is 120ms linear on purpose — a progress bar that eases is lying about its rate.",
111
+ "Faking determinate progress by animating to 90% and waiting. That is an indeterminate state wearing a number."
112
+ ],
101
113
  "specimens": [
102
114
  {
103
115
  "title": "Progress",
@@ -109,6 +121,5 @@
109
121
  "note": "Determinate and indeterminate, with an optional printed value.",
110
122
  "interaction": "the indeterminate track stills under prefers-reduced-motion."
111
123
  }
112
- ],
113
- "todo": true
124
+ ]
114
125
  }