@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
@@ -101,10 +101,20 @@
101
101
  "language": "tsx"
102
102
  }
103
103
  ],
104
- "status": "todo-docs",
104
+ "status": "stable",
105
105
  "url": "/docs/components/message-list",
106
106
  "mdUrl": "/docs/components/message-list.md",
107
107
  "jsonUrl": "/r/components/message-list.json",
108
+ "whenToUse": [
109
+ "Any streaming transcript.",
110
+ "Anywhere the reader must be able to scroll back mid-stream without being yanked forward."
111
+ ],
112
+ "whenNotToUse": [
113
+ "A static conversation. A `Stack` of `Message`s is enough."
114
+ ],
115
+ "commonMistakes": [
116
+ "Treating following as a scroll position rather than a mode. It is a mode: pinned to the bottom it follows, and scrolling up hands control back and offers a 'jump to latest' pill — because a stream that yanks the viewport mid-sentence is the single most common reason people stop reading a chat."
117
+ ],
108
118
  "specimens": [
109
119
  {
110
120
  "title": "MessageList",
@@ -116,6 +126,5 @@
116
126
  "note": "A stick-to-bottom scroller. Scroll away and it offers to jump back to the latest rather than yanking you there.",
117
127
  "interaction": "the jump control is a button, and it appears only once you have actually scrolled off the tail."
118
128
  }
119
- ],
120
- "todo": true
129
+ ]
121
130
  }
@@ -87,10 +87,20 @@
87
87
  "language": "tsx"
88
88
  }
89
89
  ],
90
- "status": "todo-docs",
90
+ "status": "stable",
91
91
  "url": "/docs/components/message-pair",
92
92
  "mdUrl": "/docs/components/message-pair.md",
93
93
  "jsonUrl": "/r/components/message-pair.json",
94
+ "whenToUse": [
95
+ "A single exchange rendered as one unit — a preview tile, a demo, a bench frame — where the reply arrives word by word."
96
+ ],
97
+ "whenNotToUse": [
98
+ "A transcript of many turns. This is one pair, and the assistant side is a `words` array with a `visibleWords` counter rather than children you compose."
99
+ ],
100
+ "commonMistakes": [
101
+ "Leaving `streaming` true once `visibleWords` reaches the end, so a settled reply keeps its newest words tinted blue.",
102
+ "Restyling the user bubble away with classes instead of `variant=\"flat\"`, which renders it as plain right-aligned text."
103
+ ],
94
104
  "specimens": [
95
105
  {
96
106
  "title": "MessagePair",
@@ -102,6 +112,5 @@
102
112
  "note": "A whole turn in one element: what was asked, and the answer streaming under it with its actions waiting on hover. The two variants are the two house styles for a user turn — a bubble, or right-aligned text with no chrome at all.",
103
113
  "interaction": "the action row is invisible until the turn is hovered *or* focused, which is what keeps a keyboard from losing it. Both buttons are named."
104
114
  }
105
- ],
106
- "todo": true
115
+ ]
107
116
  }
@@ -65,10 +65,21 @@
65
65
  "language": "tsx"
66
66
  }
67
67
  ],
68
- "status": "todo-docs",
68
+ "status": "stable",
69
69
  "url": "/docs/components/message-queue",
70
70
  "mdUrl": "/docs/components/message-queue.md",
71
71
  "jsonUrl": "/r/components/message-queue.json",
72
+ "whenToUse": [
73
+ "Showing what will send once the current run finishes, with the in-flight turn above the queue."
74
+ ],
75
+ "whenNotToUse": [
76
+ "A queue with nothing running. `running` is required, and the component is built around a turn in flight.",
77
+ "A queue whose entries should be rewritten or jumped before they send. The only thing this offers is `onCancel`."
78
+ ],
79
+ "commonMistakes": [
80
+ "Re-sorting `queued` before passing it. The order is the order the turns will drain in.",
81
+ "Wiring `onCancel` to stop the run. It removes a queued turn before it ever sends; the turn shown above is not cancellable from here."
82
+ ],
72
83
  "specimens": [
73
84
  {
74
85
  "title": "MessageQueue",
@@ -80,6 +91,5 @@
80
91
  "note": "What you typed while the last run was still out. The turn in flight pings at the top; everything behind it is numbered, cancellable and explicitly told when it will go. A queue that did not say 'sends when this finishes' would look like a list of failures.",
81
92
  "interaction": "each row's × is a named button — the message text is in the label, so five rows do not all read as 'Remove'."
82
93
  }
83
- ],
84
- "todo": true
94
+ ]
85
95
  }
@@ -49,10 +49,21 @@
49
49
  "language": "tsx"
50
50
  }
51
51
  ],
52
- "status": "todo-docs",
52
+ "status": "stable",
53
53
  "url": "/docs/components/message-timing",
54
54
  "mdUrl": "/docs/components/message-timing.md",
55
55
  "jsonUrl": "/r/components/message-timing.json",
56
+ "whenToUse": [
57
+ "Under a finished turn, where the reader should be able to see what it cost.",
58
+ "During a stream: show fewer stats and set `streaming`, which tints the values while they are still moving."
59
+ ],
60
+ "whenNotToUse": [
61
+ "Raw numbers. `stats` are label and value pairs, pre-formatted — there is no rounding, no unit and no currency here."
62
+ ],
63
+ "commonMistakes": [
64
+ "Passing the full set of stats while the turn is still streaming. The intended shape is fewer during, the full set once it settles.",
65
+ "Leaving `streaming` on after the turn lands, so settled values stay tinted as if they were still moving."
66
+ ],
56
67
  "specimens": [
57
68
  {
58
69
  "title": "MessageTiming",
@@ -64,6 +75,5 @@
64
75
  "note": "What the turn cost, in the footer where a reader can ignore it. The values are strings the caller already formatted; while the turn is still streaming they sit in the live hue and settle into ink when it lands, so the row doubles as a state.",
65
76
  "interaction": "none. It is four label/value pairs in mono, tabular so the numbers do not jitter as they update."
66
77
  }
67
- ],
68
- "todo": true
78
+ ]
69
79
  }
@@ -129,10 +129,20 @@
129
129
  "language": "tsx"
130
130
  }
131
131
  ],
132
- "status": "todo-docs",
132
+ "status": "stable",
133
133
  "url": "/docs/components/message",
134
134
  "mdUrl": "/docs/components/message.md",
135
135
  "jsonUrl": "/r/components/message.json",
136
+ "whenToUse": [
137
+ "Any transcript turn — a user's, an agent's, a tool's.",
138
+ "Anywhere authorship, timestamp and pending state should be drawn consistently."
139
+ ],
140
+ "whenNotToUse": [
141
+ "A delegated sub-run. Use `DelegationCard`, which folds it."
142
+ ],
143
+ "commonMistakes": [
144
+ "Expecting it to render markdown. Content is React nodes, verbatim, on purpose: model output is untrusted text, and a component that quietly parsed it would make every consumer one prompt away from an injection. Pass your own renderer and own that decision."
145
+ ],
136
146
  "specimens": [
137
147
  {
138
148
  "title": "Message",
@@ -144,6 +154,5 @@
144
154
  "note": "Three roles. The bubble radii are asymmetric and mirrored by role, and the author line is mono micro. Nothing here parses markdown: model output is an untrusted string, and a component that rendered it as markup would make every consumer one prompt away from an injection.",
145
155
  "interaction": "none. A message is a record."
146
156
  }
147
- ],
148
- "todo": true
157
+ ]
149
158
  }
@@ -143,10 +143,22 @@
143
143
  "language": "tsx"
144
144
  }
145
145
  ],
146
- "status": "todo-docs",
146
+ "status": "stable",
147
147
  "url": "/docs/components/mobile-composer",
148
148
  "mdUrl": "/docs/components/mobile-composer.md",
149
149
  "jsonUrl": "/r/components/mobile-composer.json",
150
+ "whenToUse": [
151
+ "A composer on a phone — the field is 16px so iOS does not zoom on focus, and the quick actions scroll horizontally above it.",
152
+ "A run in flight: `running` swaps send for stop and suppresses Return-to-send."
153
+ ],
154
+ "whenNotToUse": [
155
+ "A desktop composer. The layout carries a home-indicator inset and collapses its quick actions when the keyboard is up."
156
+ ],
157
+ "commonMistakes": [
158
+ "Passing `actions` without `onAction`. The chips render disabled, because `actions` is required and the row would otherwise be inert — the same is true of `onAttach` and its control.",
159
+ "Guessing at the keyboard from the viewport instead of driving `keyboardOpen` from `onFocus`, which is the callback given for exactly that.",
160
+ "Leaving `running` false during a run, so Return still sends and the stop control never appears."
161
+ ],
150
162
  "specimens": [
151
163
  {
152
164
  "title": "MobileComposer",
@@ -158,6 +170,5 @@
158
170
  "note": "The same composer on a phone: a bottom sheet with thumb-sized targets, quick actions scrolling above the field, and a 16px input so iOS does not zoom when it takes focus. `keyboardOpen` is the whole layout switch — the quick actions and the home-indicator inset both belong to the state where the keyboard is down.",
159
171
  "interaction": "send becomes stop while a run is in flight, and Return stops sending — a second send during a stream is almost always a mistake, so the element refuses it rather than queueing it."
160
172
  }
161
- ],
162
- "todo": true
173
+ ]
163
174
  }
@@ -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
  }