@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
@@ -18,7 +18,7 @@
18
18
  "--cue-radius-control",
19
19
  "--cue-surface-2"
20
20
  ],
21
- "summary": "A loading placeholder block.",
21
+ "summary": "A loading placeholder block. It carries no intrinsic size — give it the shape of what is arriving.",
22
22
  "examples": [
23
23
  {
24
24
  "title": "Usage",
@@ -26,10 +26,23 @@
26
26
  "language": "tsx"
27
27
  }
28
28
  ],
29
- "status": "todo-docs",
29
+ "status": "stable",
30
30
  "url": "/docs/components/skeleton",
31
31
  "mdUrl": "/docs/components/skeleton.md",
32
32
  "jsonUrl": "/r/components/skeleton.json",
33
+ "whenToUse": [
34
+ "Content whose layout you already know, so the page does not jump when it lands: a row of cells, an avatar and two lines of text.",
35
+ "Waits long enough to notice but short enough that a spinner would feel heavier than the content itself."
36
+ ],
37
+ "whenNotToUse": [
38
+ "An indeterminate wait with no known shape. Use `Spinner`.",
39
+ "An empty result. Nothing is arriving, so say so — a skeleton promises content that never comes."
40
+ ],
41
+ "commonMistakes": [
42
+ "Rendering one with no `className`. It has no size of its own and collapses to nothing.",
43
+ "Sizing it differently from the real content, which turns the skeleton into the layout shift it exists to prevent.",
44
+ "Adding your own `aria-label`. It is `aria-hidden` on purpose — the surrounding live region should say 'loading', not a fleet of empty boxes."
45
+ ],
33
46
  "specimens": [
34
47
  {
35
48
  "title": "Skeleton",
@@ -41,6 +54,5 @@
41
54
  "note": "The shape of content that has not arrived. Sized by the caller, because only the caller knows the shape.",
42
55
  "interaction": "the shimmer stills under prefers-reduced-motion."
43
56
  }
44
- ],
45
- "todo": true
57
+ ]
46
58
  }
@@ -17,10 +17,20 @@
17
17
  "tokensUsed": [],
18
18
  "summary": "A skill: the thing every other container in this set holds.",
19
19
  "examples": [],
20
- "status": "todo-docs",
20
+ "status": "stable",
21
21
  "url": "/docs/components/skill-icon",
22
22
  "mdUrl": "/docs/components/skill-icon.md",
23
23
  "jsonUrl": "/r/components/skill-icon.json",
24
+ "whenToUse": [
25
+ "Marking a capability an agent gains — in a catalogue row, a stack, a search result."
26
+ ],
27
+ "whenNotToUse": [
28
+ "The file a skill travels in. That is an implementation detail, not the thing.",
29
+ "A container of skills. Use `FolderIcon`, `StackIcon` or `CatalogueIcon`."
30
+ ],
31
+ "commonMistakes": [
32
+ "Substituting a page or document glyph, which makes the catalogue look like a folder of documents rather than a list of things an agent can now do."
33
+ ],
24
34
  "specimens": [
25
35
  {
26
36
  "title": "The container icon set",
@@ -41,6 +51,5 @@
41
51
  "note": "One grid and one weight across all ten, at size-icon-md — the size a navigation row draws them at. Each is a plain <svg> that takes every SVG prop.",
42
52
  "interaction": "none. They are decorative by default: aria-hidden, announced by nothing, because the row they mark already carries its name."
43
53
  }
44
- ],
45
- "todo": true
54
+ ]
46
55
  }
@@ -86,10 +86,22 @@
86
86
  "language": "tsx"
87
87
  }
88
88
  ],
89
- "status": "todo-docs",
89
+ "status": "stable",
90
90
  "url": "/docs/components/slider",
91
91
  "mdUrl": "/docs/components/slider.md",
92
92
  "jsonUrl": "/r/components/slider.json",
93
+ "whenToUse": [
94
+ "A value judged by feel against its range — intensity, a fade time, a threshold.",
95
+ "Anywhere the shape of the range matters as much as the number."
96
+ ],
97
+ "whenNotToUse": [
98
+ "A number that must be exact. Use `NumberField`; a 2px rail is a readout first and a grab target second.",
99
+ "A value with no meaningful minimum or maximum."
100
+ ],
101
+ "commonMistakes": [
102
+ "Writing every `onValueChange` into undo history. `onCommit` is the important half of this API — it is what lets a whole drag coalesce into one undo entry instead of hundreds.",
103
+ "Adding a separate number readout instead of `showValue`."
104
+ ],
93
105
  "specimens": [
94
106
  {
95
107
  "title": "Slider / RangeSlider",
@@ -101,6 +113,5 @@
101
113
  "note": "One thumb or two. `onCommit` fires once at the end of a drag, which is the undo-coalescing contract the consoles need.",
102
114
  "interaction": "the thumb grows while dragging; arrow keys step, Page Up and Page Down jump."
103
115
  }
104
- ],
105
- "todo": true
116
+ ]
106
117
  }
@@ -77,10 +77,20 @@
77
77
  "language": "tsx"
78
78
  }
79
79
  ],
80
- "status": "todo-docs",
80
+ "status": "stable",
81
81
  "url": "/docs/components/sources",
82
82
  "mdUrl": "/docs/components/sources.md",
83
83
  "jsonUrl": "/r/components/sources.json",
84
+ "whenToUse": [
85
+ "Citations under an answer, out of the way until the reader wants them."
86
+ ],
87
+ "whenNotToUse": [
88
+ "A component expected to own its own disclosure. `open` and `onOpenChange` are both required."
89
+ ],
90
+ "commonMistakes": [
91
+ "Passing `open` and no `onOpenChange`, or the reverse. Both are required and the pill does not toggle itself.",
92
+ "Rendering the source cards separately and using this only for the pill. The cards are the expanded state of the same component."
93
+ ],
84
94
  "specimens": [
85
95
  {
86
96
  "title": "Sources",
@@ -92,6 +102,5 @@
92
102
  "note": "Citations folded into a pill until somebody wants them. Collapsed it is a count — four sources, no argument; open it is a scannable grid of cards, one per site, each lifting a pixel under the pointer. The count is the whole affordance: it says provenance exists without spending a paragraph on it.",
93
103
  "interaction": "the pill is the trigger and takes cue's focus ring; the chevron turns with the panel, which animates its own height through Base UI rather than a max-height guess."
94
104
  }
95
- ],
96
- "todo": true
105
+ ]
97
106
  }
@@ -61,7 +61,7 @@
61
61
  "--cue-danger",
62
62
  "--cue-warn"
63
63
  ],
64
- "summary": "A tiny unlabelled trace: \"is this climbing, or did it just reset?\".",
64
+ "summary": "A tiny unlabelled trace: 'is this climbing, or did it just reset?'",
65
65
  "examples": [
66
66
  {
67
67
  "title": "Usage",
@@ -69,10 +69,21 @@
69
69
  "language": "tsx"
70
70
  }
71
71
  ],
72
- "status": "todo-docs",
72
+ "status": "stable",
73
73
  "url": "/docs/components/sparkline",
74
74
  "mdUrl": "/docs/components/sparkline.md",
75
75
  "jsonUrl": "/r/components/sparkline.json",
76
+ "whenToUse": [
77
+ "Direction and shape beside a number that already carries the magnitude.",
78
+ "A dense row or tile where a real chart would not fit and would not be read."
79
+ ],
80
+ "whenNotToUse": [
81
+ "A value the reader must quantify. It answers nothing but shape — the numbers belong to the `Stat` or the row above it.",
82
+ "A series with a meaningful ceiling other than 100."
83
+ ],
84
+ "commonMistakes": [
85
+ "Auto-scaling it to its own range. The scale is always 0–100 on purpose: a trace scaled to itself makes a flat 3% look identical to a flat 95%, which is the exact misreading a sparkline exists to prevent."
86
+ ],
76
87
  "specimens": [
77
88
  {
78
89
  "title": "Sparkline",
@@ -84,6 +95,5 @@
84
95
  "note": "A trend at row height, drawn as one path with no axes and no tooltip. When it needs either, reach for UsageChart.",
85
96
  "interaction": "none."
86
97
  }
87
- ],
88
- "todo": true
98
+ ]
89
99
  }
@@ -46,10 +46,19 @@
46
46
  "language": "tsx"
47
47
  }
48
48
  ],
49
- "status": "todo-docs",
49
+ "status": "stable",
50
50
  "url": "/docs/components/speaker-identity",
51
51
  "mdUrl": "/docs/components/speaker-identity.md",
52
52
  "jsonUrl": "/r/components/speaker-identity.json",
53
+ "whenToUse": [
54
+ "A transcript with more than two participants — several models, several agents — where each turn has to name who produced it."
55
+ ],
56
+ "whenNotToUse": [
57
+ "A plain user-and-assistant exchange, where naming every turn is noise."
58
+ ],
59
+ "commonMistakes": [
60
+ "Passing turns out of order. The prop is turns in order, each naming its own speaker, and the component derives nothing else."
61
+ ],
53
62
  "specimens": [
54
63
  {
55
64
  "title": "SpeakerIdentity",
@@ -61,6 +70,5 @@
61
70
  "note": "Who is talking, once a thread holds more than a user and one model. Four kinds — you, the agent, a subagent it delegated to, and a tool that answered — with the subagent's badge rounded so a delegated turn reads as delegated at a glance. `detail` is the second fact the name needs: which model spoke, or how long the tool took.",
62
71
  "interaction": "none. It is a transcript, not a control; the badges are the only thing distinguishing four voices that would otherwise be four paragraphs."
63
72
  }
64
- ],
65
- "todo": true
73
+ ]
66
74
  }
@@ -65,7 +65,7 @@
65
65
  "--cue-text-body",
66
66
  "--cue-text-ui"
67
67
  ],
68
- "summary": "The most common structured answer after a table: one object, labeled.",
68
+ "summary": "The most common structured answer after a table: one object, labelled.",
69
69
  "examples": [
70
70
  {
71
71
  "title": "Usage",
@@ -73,10 +73,20 @@
73
73
  "language": "tsx"
74
74
  }
75
75
  ],
76
- "status": "todo-docs",
76
+ "status": "stable",
77
77
  "url": "/docs/components/spec-sheet",
78
78
  "mdUrl": "/docs/components/spec-sheet.md",
79
79
  "jsonUrl": "/r/components/spec-sheet.json",
80
+ "whenToUse": [
81
+ "One object's attributes as an answer — a model, a SKU, a version — with `subtitle` carrying the identifier."
82
+ ],
83
+ "whenNotToUse": [
84
+ "Several objects compared side by side. This is one object, as label and value pairs."
85
+ ],
86
+ "commonMistakes": [
87
+ "Passing raw numbers and expecting formatting. Values are pre-formatted and right-aligned on tabular figures.",
88
+ "Slicing `rows` to what has landed. `visibleCount` is that, and `rows` is the whole sheet."
89
+ ],
80
90
  "specimens": [
81
91
  {
82
92
  "title": "SpecSheet",
@@ -88,6 +98,5 @@
88
98
  "note": "One object, labelled — the commonest structured answer after a table. Labels sit in mono on the leading edge and values in tabular figures on the trailing one, so a column of numbers lines up even though nothing here is a table. `emphasis` promotes the one row that answers the question.",
89
99
  "interaction": "none. `visibleCount` is what makes it arrive a row at a time instead of appearing whole."
90
100
  }
91
- ],
92
- "todo": true
101
+ ]
93
102
  }
@@ -127,10 +127,19 @@
127
127
  "language": "tsx"
128
128
  }
129
129
  ],
130
- "status": "todo-docs",
130
+ "status": "stable",
131
131
  "url": "/docs/components/spectrum-visualizer",
132
132
  "mdUrl": "/docs/components/spectrum-visualizer.md",
133
133
  "jsonUrl": "/r/components/spectrum-visualizer.json",
134
+ "whenToUse": [
135
+ "Any live audio analyser."
136
+ ],
137
+ "whenNotToUse": [
138
+ "A waveform or a level meter — a spectrum answers frequency, not amplitude over time."
139
+ ],
140
+ "commonMistakes": [
141
+ "Passing a colour per band. Colours are deliberately off the caller's hands: the original API asked for one and defaulted to `#00FF00` when it did not get one, which is how an audio tool ends up with two different greens for the same band in two different panels."
142
+ ],
134
143
  "specimens": [
135
144
  {
136
145
  "title": "SpectrumVisualizer",
@@ -142,6 +151,5 @@
142
151
  "note": "Bars or line, with band colours taken from the /charts ramps. Those are literals on purpose: a listener who has learnt `bass is red` must not relearn it because the console switched accent.",
143
152
  "interaction": "a selection dims the bands outside it rather than hiding them; thresholds are dashed rules per band."
144
153
  }
145
- ],
146
- "todo": true
154
+ ]
147
155
  }
@@ -43,7 +43,7 @@
43
43
  "--cue-icon-md",
44
44
  "--cue-icon-sm"
45
45
  ],
46
- "summary": "An indeterminate progress ring, drawn in CSS only — no SVG, no animation library, one element.",
46
+ "summary": "An indeterminate progress ring, drawn in CSS only — one element, no SVG, no animation library.",
47
47
  "examples": [
48
48
  {
49
49
  "title": "Usage",
@@ -51,10 +51,23 @@
51
51
  "language": "tsx"
52
52
  }
53
53
  ],
54
- "status": "todo-docs",
54
+ "status": "stable",
55
55
  "url": "/docs/components/spinner",
56
56
  "mdUrl": "/docs/components/spinner.md",
57
57
  "jsonUrl": "/r/components/spinner.json",
58
+ "whenToUse": [
59
+ "A wait whose length and shape you cannot predict: a request in flight, a job whose progress is not reported.",
60
+ "Inside another control. It inks with `currentColor`, so a spinner in a `danger` button is red without being told."
61
+ ],
62
+ "whenNotToUse": [
63
+ "A wait with known structure. Use `Skeleton`, which holds the layout as well as the attention.",
64
+ "Progress you can actually measure. A ring that spins forever tells a reader less than a bar that moves."
65
+ ],
66
+ "commonMistakes": [
67
+ "Colouring it directly instead of letting it inherit. `currentColor` is the whole reason it works in every context.",
68
+ "Overriding `label` with something the surrounding live region already says, which announces the wait twice.",
69
+ "Assuming reduced motion hides it. The rotation stops and the ring stays as a static arc — the wait is still visible."
70
+ ],
58
71
  "specimens": [
59
72
  {
60
73
  "title": "Spinner",
@@ -66,6 +79,5 @@
66
79
  "note": "Two sizes. Carries a visually hidden label so a screen reader is told the wait, not left with a spinning div.",
67
80
  "interaction": "stills under prefers-reduced-motion."
68
81
  }
69
- ],
70
- "todo": true
82
+ ]
71
83
  }
@@ -17,10 +17,20 @@
17
17
  "tokensUsed": [],
18
18
  "summary": "One person's stack: the set of things they have actually installed.",
19
19
  "examples": [],
20
- "status": "todo-docs",
20
+ "status": "stable",
21
21
  "url": "/docs/components/stack-icon",
22
22
  "mdUrl": "/docs/components/stack-icon.md",
23
23
  "jsonUrl": "/r/components/stack-icon.json",
24
+ "whenToUse": [
25
+ "An accumulation — where the order things went in is part of what it is."
26
+ ],
27
+ "whenNotToUse": [
28
+ "A container things are filed into. Use `FolderIcon`.",
29
+ "Every stack at once. Use `StacksMatrixIcon`."
30
+ ],
31
+ "commonMistakes": [
32
+ "Drawing it as a box. The plates seen edge-on are the layers idiom, and a stack is an accumulation rather than a container."
33
+ ],
24
34
  "specimens": [
25
35
  {
26
36
  "title": "The container icon set",
@@ -41,6 +51,5 @@
41
51
  "note": "One grid and one weight across all ten, at size-icon-md — the size a navigation row draws them at. Each is a plain <svg> that takes every SVG prop.",
42
52
  "interaction": "none. They are decorative by default: aria-hidden, announced by nothing, because the row they mark already carries its name."
43
53
  }
44
- ],
45
- "todo": true
54
+ ]
46
55
  }
@@ -123,10 +123,22 @@
123
123
  "language": "tsx"
124
124
  }
125
125
  ],
126
- "status": "todo-docs",
126
+ "status": "stable",
127
127
  "url": "/docs/components/stack",
128
128
  "mdUrl": "/docs/components/stack.md",
129
129
  "jsonUrl": "/r/components/stack.json",
130
+ "whenToUse": [
131
+ "Any run of siblings that needs consistent spacing — which is almost every layout in the system.",
132
+ "Anywhere spacing should track density: `gap={4}` is 8px at normal and 6px at ultra-compact without touching the markup."
133
+ ],
134
+ "whenNotToUse": [
135
+ "Two-dimensional layout. Use `Grid`.",
136
+ "A single child. The wrapper buys nothing."
137
+ ],
138
+ "commonMistakes": [
139
+ "Writing `flex gap-2` by hand instead. That is the exact opt-out this exists to prevent — it pins the spacing to a pixel value and stops tracking the density ladder.",
140
+ "Reaching for `gap` values outside the ladder, which reintroduces the per-call-site guess."
141
+ ],
130
142
  "specimens": [
131
143
  {
132
144
  "title": "Stack",
@@ -138,6 +150,5 @@
138
150
  "note": "Flex with the gap taken from a rung of the density ladder, never a length. That is what makes a layout tighten with the rest of the console.",
139
151
  "interaction": "none."
140
152
  }
141
- ],
142
- "todo": true
153
+ ]
143
154
  }
@@ -17,10 +17,19 @@
17
17
  "tokensUsed": [],
18
18
  "summary": "Every stack at once, one column each: who has what, read across.",
19
19
  "examples": [],
20
- "status": "todo-docs",
20
+ "status": "stable",
21
21
  "url": "/docs/components/stacks-matrix-icon",
22
22
  "mdUrl": "/docs/components/stacks-matrix-icon.md",
23
23
  "jsonUrl": "/r/components/stacks-matrix-icon.json",
24
+ "whenToUse": [
25
+ "A two-axis question — 'which of these does that person not have'."
26
+ ],
27
+ "whenNotToUse": [
28
+ "One stack. Use `StackIcon`."
29
+ ],
30
+ "commonMistakes": [
31
+ "Drawing more plates instead. The head rule and the name column are what make it a matrix rather than a grid, and the question it answers has two axes."
32
+ ],
24
33
  "specimens": [
25
34
  {
26
35
  "title": "The container icon set",
@@ -41,6 +50,5 @@
41
50
  "note": "One grid and one weight across all ten, at size-icon-md — the size a navigation row draws them at. Each is a plain <svg> that takes every SVG prop.",
42
51
  "interaction": "none. They are decorative by default: aria-hidden, announced by nothing, because the row they mark already carries its name."
43
52
  }
44
- ],
45
- "todo": true
53
+ ]
46
54
  }
@@ -91,10 +91,22 @@
91
91
  "language": "tsx"
92
92
  }
93
93
  ],
94
- "status": "todo-docs",
94
+ "status": "stable",
95
95
  "url": "/docs/components/stat",
96
96
  "mdUrl": "/docs/components/stat.md",
97
97
  "jsonUrl": "/r/components/stat.json",
98
+ "whenToUse": [
99
+ "A reading that deserves its own tile, in a row that scans as a list of captions with values underneath.",
100
+ "Numbers that change in place — the value is `tabular-nums` mono, so a ticking figure does not shuffle the layout."
101
+ ],
102
+ "whenNotToUse": [
103
+ "A table of numbers. Use a data table; a wall of tiles is harder to compare than a column.",
104
+ "A trend. Pair it with `Sparkline`, which answers direction, not magnitude."
105
+ ],
106
+ "commonMistakes": [
107
+ "Tinting the caption as well as the value. Only the value takes the tone — tinting both turns a red tile into an alarm rather than a reading.",
108
+ "Leading with the number. It reads label-first on purpose."
109
+ ],
98
110
  "specimens": [
99
111
  {
100
112
  "title": "Stat",
@@ -106,6 +118,5 @@
106
118
  "note": "A label, a figure and a detail line. Figures are mono `tabular-nums`, so a changing digit never shifts the column.",
107
119
  "interaction": "none."
108
120
  }
109
- ],
110
- "todo": true
121
+ ]
111
122
  }
@@ -69,7 +69,7 @@
69
69
  "--cue-ok",
70
70
  "--cue-warn"
71
71
  ],
72
- "summary": "A 6px state dot — the densest possible status indicator.",
72
+ "summary": "A 6px state dot — the densest possible status indicator, announced as well as shown.",
73
73
  "examples": [
74
74
  {
75
75
  "title": "Usage",
@@ -77,10 +77,23 @@
77
77
  "language": "tsx"
78
78
  }
79
79
  ],
80
- "status": "todo-docs",
80
+ "status": "stable",
81
81
  "url": "/docs/components/status-dot",
82
82
  "mdUrl": "/docs/components/status-dot.md",
83
83
  "jsonUrl": "/r/components/status-dot.json",
84
+ "whenToUse": [
85
+ "State on a row where a `Chip` would not fit: a table of connections, a device list, a queue.",
86
+ "Live activity. `pulse` signals it, and stills itself under `prefers-reduced-motion`."
87
+ ],
88
+ "whenNotToUse": [
89
+ "State that needs a word to be understood. Use `Chip`, which shows the same tone vocabulary with its label visible.",
90
+ "A decorative bullet. Every dot emits an `sr-only` label inside a `role=\"status\"` wrapper, so a decorative one is noise in the accessibility tree."
91
+ ],
92
+ "commonMistakes": [
93
+ "Relying on the colour and adding a visible label beside it too, which announces the state twice. Pass `label` instead, or use a `Chip`.",
94
+ "Stripping the `relative` wrapper as redundant. It is the containing block for the `sr-only` label; without it that absolutely-positioned text escapes to `<html>`, and two thousand rows make the document thousands of pixels taller than anything on screen.",
95
+ "Passing a tone outside the shared vocabulary. `tone` is required and `idle` is the hollow ring, not a missing value."
96
+ ],
84
97
  "specimens": [
85
98
  {
86
99
  "title": "StatusDot",
@@ -92,6 +105,5 @@
92
105
  "note": "Five states, and the pulse that means work is in flight. The label is the accessible name, not decoration.",
93
106
  "interaction": "none. A dot is a readout."
94
107
  }
95
- ],
96
- "todo": true
108
+ ]
97
109
  }
@@ -79,7 +79,7 @@
79
79
  "--cue-space-3",
80
80
  "--cue-text-label"
81
81
  ],
82
- "summary": "The step trail: `1 target · 2 preview · 3 apply`.",
82
+ "summary": "The step trail: `1 target · 2 preview · 3 apply`, as one line of mono text.",
83
83
  "examples": [
84
84
  {
85
85
  "title": "Usage",
@@ -87,10 +87,22 @@
87
87
  "language": "tsx"
88
88
  }
89
89
  ],
90
- "status": "todo-docs",
90
+ "status": "stable",
91
91
  "url": "/docs/components/stepper",
92
92
  "mdUrl": "/docs/components/stepper.md",
93
93
  "jsonUrl": "/r/components/stepper.json",
94
+ "whenToUse": [
95
+ "A wizard where the user needs to know how far along they are and what is left.",
96
+ "Anywhere vertical space belongs to the thing being configured rather than the chrome around it."
97
+ ],
98
+ "whenNotToUse": [
99
+ "Navigation. Use `Breadcrumb` — a stepper is progress through a task, not a location in a tree.",
100
+ "Two steps. A trail of two is a heading with extra parts."
101
+ ],
102
+ "commonMistakes": [
103
+ "Replacing it with numbered discs joined by rules. That is 60px tall and says exactly as much as one line of 9px type.",
104
+ "Accenting the whole trail. Only the numbers carry the accent, so it reads as one sentence with the position marked."
105
+ ],
94
106
  "specimens": [
95
107
  {
96
108
  "title": "Stepper",
@@ -102,6 +114,5 @@
102
114
  "note": "The step trail: `1 target · 2 preview · 3 apply`, with reached steps tinted rather than filled.",
103
115
  "interaction": "a reached step is a button; an upcoming one is not."
104
116
  }
105
- ],
106
- "todo": true
117
+ ]
107
118
  }
@@ -69,7 +69,7 @@
69
69
  "--cue-text-body",
70
70
  "--cue-text-ui"
71
71
  ],
72
- "summary": "You pressed stop.",
72
+ "summary": "You pressed stop: the half-written answer stays, and continuing is one tap away.",
73
73
  "examples": [
74
74
  {
75
75
  "title": "Usage",
@@ -77,10 +77,20 @@
77
77
  "language": "tsx"
78
78
  }
79
79
  ],
80
- "status": "todo-docs",
80
+ "status": "stable",
81
81
  "url": "/docs/components/stopped-run",
82
82
  "mdUrl": "/docs/components/stopped-run.md",
83
83
  "jsonUrl": "/r/components/stopped-run.json",
84
+ "whenToUse": [
85
+ "Any early end to a run — stopped by you, the token limit, a timeout — with `reason` saying which."
86
+ ],
87
+ "whenNotToUse": [
88
+ "A run that finished. The component is built around a partial answer that stays on screen."
89
+ ],
90
+ "commonMistakes": [
91
+ "Clearing the words when the run stops. The partial answer staying is what makes continuing possible.",
92
+ "Wiring `onContinue` to restart the turn. It resumes from where the answer left off."
93
+ ],
84
94
  "specimens": [
85
95
  {
86
96
  "title": "StoppedRun",
@@ -92,6 +102,5 @@
92
102
  "note": "You pressed stop. The half-written answer stays exactly where it stopped, with a caret to say so, and the run gives its reason on a chip. Continuing is one tap; discarding is the quieter of the two, which is the right ranking.",
93
103
  "interaction": "Continue leads and carries the arrow; Discard is a ghost. Both are ordinary buttons — nothing here is a destructive-action dialog."
94
104
  }
95
- ],
96
- "todo": true
105
+ ]
97
106
  }
@@ -62,10 +62,20 @@
62
62
  "language": "tsx"
63
63
  }
64
64
  ],
65
- "status": "todo-docs",
65
+ "status": "stable",
66
66
  "url": "/docs/components/streaming-text",
67
67
  "mdUrl": "/docs/components/streaming-text.md",
68
68
  "jsonUrl": "/r/components/streaming-text.json",
69
+ "whenToUse": [
70
+ "An assistant turn arriving word by word, with inline code chips marked mono on their segment."
71
+ ],
72
+ "whenNotToUse": [
73
+ "Markdown. Segments are text chunks with an optional mono flag; nothing here parses."
74
+ ],
75
+ "commonMistakes": [
76
+ "Counting characters. `count` is how many words from the flattened segments are visible.",
77
+ "Leaving `streaming` true once the turn lands, so the newest words stay blue and the caret keeps blinking at the end."
78
+ ],
69
79
  "specimens": [
70
80
  {
71
81
  "title": "StreamingText",
@@ -77,6 +87,5 @@
77
87
  "note": "Tokens landing a word at a time: the newest two are lit in the streaming hue and cool into ink behind them, and a caret sits at the end while more is coming. A segment marked mono becomes a chip, which is how a path or a channel range survives being read aloud in prose.",
78
88
  "interaction": "none, and deliberately: it is a paragraph, and it stays selectable, copyable text at every count."
79
89
  }
80
- ],
81
- "todo": true
90
+ ]
82
91
  }
@@ -22,10 +22,19 @@
22
22
  ],
23
23
  "summary": "A subscript inside an expression: a bound or a label, set upright inside the italic.",
24
24
  "examples": [],
25
- "status": "todo-docs",
25
+ "status": "stable",
26
26
  "url": "/docs/components/sub",
27
27
  "mdUrl": "/docs/components/sub.md",
28
28
  "jsonUrl": "/r/components/sub.json",
29
+ "whenToUse": [
30
+ "A bound or a label under a variable inside a rendered expression."
31
+ ],
32
+ "whenNotToUse": [
33
+ "Body prose that happens to need a subscript. This one is shaped to sit upright inside an expression's italic."
34
+ ],
35
+ "commonMistakes": [
36
+ "Reaching for it outside an expression, where the upright-inside-the-italic setting has nothing to sit inside."
37
+ ],
29
38
  "specimens": [
30
39
  {
31
40
  "title": "MathBlock",
@@ -40,6 +49,5 @@
40
49
  "note": "Maths with the working shown, a step at a time. The expressions are nodes rather than a string, so there is no parser and no KaTeX in the bundle — `Frac` stacks a numerator over a rule, `Sup` and `Sub` set an index upright inside the serif italic, and anything else is text.",
41
50
  "interaction": "none. Each step's note says what justified it, which is what turns three lines of algebra into an explanation."
42
51
  }
43
- ],
44
- "todo": true
52
+ ]
45
53
  }
@@ -86,10 +86,21 @@
86
86
  "language": "tsx"
87
87
  }
88
88
  ],
89
- "status": "todo-docs",
89
+ "status": "stable",
90
90
  "url": "/docs/components/subagent-list",
91
91
  "mdUrl": "/docs/components/subagent-list.md",
92
92
  "jsonUrl": "/r/components/subagent-list.json",
93
+ "whenToUse": [
94
+ "A fan-out of parallel workers, each card naming its agent and model, with a summariser underneath."
95
+ ],
96
+ "whenNotToUse": [
97
+ "One agent's steps over time. This draws a card per worker and a progress width per worker."
98
+ ],
99
+ "commonMistakes": [
100
+ "Letting `progress` and `agents` fall out of step. The array is positional, per agent, and used while a worker is still running.",
101
+ "Marking individual agents complete. `completedCount` is how many from the start are complete, so completion is prefix-shaped.",
102
+ "Passing `summaryAgent` and expecting it to appear. It shows only when `showSummary` is true."
103
+ ],
93
104
  "specimens": [
94
105
  {
95
106
  "title": "SubagentList",
@@ -101,6 +112,5 @@
101
112
  "note": "Parallel workers, each with its own model and its own progress. `completedCount` marks the finished ones from the start of the list, and the summary card appears under them when the agent that folds their answers together starts work.",
102
113
  "interaction": "none. Delegation is something to watch, not something to steer from here."
103
114
  }
104
- ],
105
- "todo": true
115
+ ]
106
116
  }