@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
@@ -55,7 +55,7 @@
55
55
  "--cue-text-micro",
56
56
  "--cue-text-ui"
57
57
  ],
58
- "summary": "An overlapping stack of {@link Avatar}s with a `+N` overflow chip.",
58
+ "summary": "An overlapping stack of avatars with a `+N` overflow chip.",
59
59
  "examples": [
60
60
  {
61
61
  "title": "Usage",
@@ -63,10 +63,22 @@
63
63
  "language": "tsx"
64
64
  }
65
65
  ],
66
- "status": "todo-docs",
66
+ "status": "stable",
67
67
  "url": "/docs/components/avatar-group",
68
68
  "mdUrl": "/docs/components/avatar-group.md",
69
69
  "jsonUrl": "/r/components/avatar-group.json",
70
+ "whenToUse": [
71
+ "Several participants where the count matters more than any one face: attendees, reviewers, a thread's contributors.",
72
+ "A fixed-width slot. `max` caps the faces and collapses the rest into `+N`, so the stack cannot grow past what you budgeted."
73
+ ],
74
+ "whenNotToUse": [
75
+ "One person. Use `Avatar` — the overlap ring is a visual cost with nothing to overlap.",
76
+ "A list people need to read or act on. A stack is a summary; give them a real list."
77
+ ],
78
+ "commonMistakes": [
79
+ "Setting `size` here and a different `size` on the `Avatar`s passed in. This prop sizes only the `+N` chip; match it to the avatars yourself.",
80
+ "Expecting `max` to default to something. Omit it and every avatar renders, however many arrive."
81
+ ],
70
82
  "specimens": [
71
83
  {
72
84
  "title": "AvatarGroup",
@@ -78,6 +90,5 @@
78
90
  "note": "Overlapping faces with an overflow count.",
79
91
  "interaction": "none."
80
92
  }
81
- ],
82
- "todo": true
93
+ ]
83
94
  }
@@ -85,7 +85,7 @@
85
85
  "--cue-text-micro",
86
86
  "--cue-text-ui"
87
87
  ],
88
- "summary": "A round user/entity avatar sized off the density control ladder, so it lines up with the buttons and inputs on the same row.",
88
+ "summary": "A round user or entity avatar, sized off the density control ladder so it lines up with the buttons beside it.",
89
89
  "examples": [
90
90
  {
91
91
  "title": "Usage",
@@ -93,10 +93,23 @@
93
93
  "language": "tsx"
94
94
  }
95
95
  ],
96
- "status": "todo-docs",
96
+ "status": "stable",
97
97
  "url": "/docs/components/avatar",
98
98
  "mdUrl": "/docs/components/avatar.md",
99
99
  "jsonUrl": "/r/components/avatar.json",
100
+ "whenToUse": [
101
+ "Identifying a person or an entity beside their name: a message author, an assignee, an audit row.",
102
+ "A slot that must hold something even when there is no image. `fallback` shows immediately and returns if the image errors, so the row never reflows."
103
+ ],
104
+ "whenNotToUse": [
105
+ "Several people at once. Use `AvatarGroup`, which handles the overlap and the `+N` overflow.",
106
+ "A state or a category rather than an identity. Use `StatusDot` or `Chip`."
107
+ ],
108
+ "commonMistakes": [
109
+ "Leaving `alt` empty. It is both the image's alt text and the source of the default initials, so an empty one costs the fallback as well as the screen reader.",
110
+ "Sizing with `className=\"h-8 w-8\"` instead of `size`, which stops the avatar tracking density and breaks its alignment with the controls on its row.",
111
+ "Assuming a missing `src` is an error case. Omit it deliberately and the fallback is the whole design."
112
+ ],
100
113
  "specimens": [
101
114
  {
102
115
  "title": "Avatar",
@@ -108,6 +121,5 @@
108
121
  "note": "Initials fall back when there is no image; the ring is drawn in the background colour so a pile reads as separate faces.",
109
122
  "interaction": "none."
110
123
  }
111
- ],
112
- "todo": true
124
+ ]
113
125
  }
@@ -59,10 +59,22 @@
59
59
  "language": "tsx"
60
60
  }
61
61
  ],
62
- "status": "todo-docs",
62
+ "status": "stable",
63
63
  "url": "/docs/components/background-inbox",
64
64
  "mdUrl": "/docs/components/background-inbox.md",
65
65
  "jsonUrl": "/r/components/background-inbox.json",
66
+ "whenToUse": [
67
+ "Detached runs that finished away from the thread and now need pulling back into it.",
68
+ "A header count of what is ready, which is what needs the user rather than what is still in flight."
69
+ ],
70
+ "whenNotToUse": [
71
+ "A run happening in the thread you are already looking at.",
72
+ "A list where every row should be pressable. Running rows are not clickable."
73
+ ],
74
+ "commonMistakes": [
75
+ "Expecting the header to count everything. It counts what is ready, deliberately, not what is running.",
76
+ "Omitting `onCollect`, which leaves finished runs with no way back into the thread."
77
+ ],
66
78
  "specimens": [
67
79
  {
68
80
  "title": "BackgroundInbox",
@@ -74,6 +86,5 @@
74
86
  "note": "Work that left the conversation and is still going somewhere else. The header counts what is *ready* rather than what is in flight, because ready is the half that needs a person; a running row is not clickable at all, so there is nothing to press before there is something to collect.",
75
87
  "interaction": "a ready or failed row is a button and takes cue's focus ring; a running one is `disabled`, which is what makes the spinner mean wait rather than try again."
76
88
  }
77
- ],
78
- "todo": true
89
+ ]
79
90
  }
@@ -76,7 +76,7 @@
76
76
  "--cue-border",
77
77
  "--cue-measure-prose"
78
78
  ],
79
- "summary": "A full-bleed horizontal section: the page's rhythm, its separation, and a column at the measure.",
79
+ "summary": "A full-bleed horizontal section: a rule to the window's edge, a column at the measure.",
80
80
  "examples": [
81
81
  {
82
82
  "title": "Usage",
@@ -84,10 +84,21 @@
84
84
  "language": "tsx"
85
85
  }
86
86
  ],
87
- "status": "todo-docs",
87
+ "status": "stable",
88
88
  "url": "/docs/components/band",
89
89
  "mdUrl": "/docs/components/band.md",
90
90
  "jsonUrl": "/r/components/band.json",
91
+ "whenToUse": [
92
+ "A page section that needs separation running edge to edge while its words stop at the reading measure.",
93
+ "Anywhere the page's vertical rhythm should come from one recipe rather than a per-section guess."
94
+ ],
95
+ "whenNotToUse": [
96
+ "Content inside an existing column. Use `Container` or `Stack`; a band inside a measure has no edge to reach.",
97
+ "A footer. Use `Footer`, which is built on this — the recipe exists once, and reimplementing it forks it."
98
+ ],
99
+ "commonMistakes": [
100
+ "Putting the separation on the inner column, which stops the rule at the measure and leaves the page looking unfinished at both margins."
101
+ ],
91
102
  "specimens": [
92
103
  {
93
104
  "title": "Band",
@@ -99,6 +110,5 @@
99
110
  "note": "A page's horizontal section: the rhythm, the separation and the column, all three off the style axis. Four separations — a rule, a ground, a full bleed with no column, and rhythm alone. Under no style set this is exactly what Footer draws above its links.",
100
111
  "interaction": "none; what changes it is the [data-style] attribute above it, not a pointer."
101
112
  }
102
- ],
103
- "todo": true
113
+ ]
104
114
  }
@@ -65,10 +65,22 @@
65
65
  "language": "tsx"
66
66
  }
67
67
  ],
68
- "status": "todo-docs",
68
+ "status": "stable",
69
69
  "url": "/docs/components/breadcrumb",
70
70
  "mdUrl": "/docs/components/breadcrumb.md",
71
71
  "jsonUrl": "/r/components/breadcrumb.json",
72
+ "whenToUse": [
73
+ "A route nested deep enough that the path is not obvious from the page itself.",
74
+ "Anywhere the trail should have one visible end: the last crumb is the page you are on, never a link."
75
+ ],
76
+ "whenNotToUse": [
77
+ "A flat site, where every crumb but the last is the same one link.",
78
+ "A sequence of steps. Use `Stepper` — a breadcrumb is a location, not a progress."
79
+ ],
80
+ "commonMistakes": [
81
+ "Making the last crumb a link to the current page. It carries `aria-current=\"page\"` and full-strength ink precisely because it is not one.",
82
+ "Giving the separators text a screen reader will read. They are `aria-hidden`: announcing 'console slash patch slash universe 1' reads punctuation, not structure."
83
+ ],
72
84
  "specimens": [
73
85
  {
74
86
  "title": "Breadcrumb",
@@ -80,6 +92,5 @@
80
92
  "note": "Where you are, with `aria-hidden` punctuation between the crumbs and the last one marked current.",
81
93
  "interaction": "every crumb but the last is a link; the last is plain text."
82
94
  }
83
- ],
84
- "todo": true
95
+ ]
85
96
  }
@@ -71,10 +71,21 @@
71
71
  "language": "tsx"
72
72
  }
73
73
  ],
74
- "status": "todo-docs",
74
+ "status": "stable",
75
75
  "url": "/docs/components/button-group",
76
76
  "mdUrl": "/docs/components/button-group.md",
77
77
  "jsonUrl": "/r/components/button-group.json",
78
+ "whenToUse": [
79
+ "Actions that belong together: save and save-as, run and run-to-here.",
80
+ "Anywhere the shared rim is presentational only — each member stays independently reachable by Tab."
81
+ ],
82
+ "whenNotToUse": [
83
+ "A choice rather than actions. Use `ToggleGroup` (several or none) or `SegmentedControl` (exactly one), which carry the pressed-state ARIA a row of plain buttons must not fake."
84
+ ],
85
+ "commonMistakes": [
86
+ "Expecting roving focus. It owns no state and imposes none, because its members are actions.",
87
+ "Using it to show which option is selected, which is the case it explicitly does not handle."
88
+ ],
78
89
  "specimens": [
79
90
  {
80
91
  "title": "ButtonGroup",
@@ -86,6 +97,5 @@
86
97
  "note": "Buttons welded into one control, horizontally or vertically.",
87
98
  "interaction": "each button keeps its own focus ring; only the outer corners are rounded."
88
99
  }
89
- ],
90
- "todo": true
100
+ ]
91
101
  }
@@ -37,7 +37,7 @@
37
37
  "--cue-text-micro",
38
38
  "--cue-text-ui"
39
39
  ],
40
- "summary": "A month grid, on react-day-picker v10.",
40
+ "summary": "A month grid, on react-day-picker.",
41
41
  "examples": [
42
42
  {
43
43
  "title": "Usage",
@@ -45,10 +45,22 @@
45
45
  "language": "tsx"
46
46
  }
47
47
  ],
48
- "status": "todo-docs",
48
+ "status": "stable",
49
49
  "url": "/docs/components/calendar",
50
50
  "mdUrl": "/docs/components/calendar.md",
51
51
  "jsonUrl": "/r/components/calendar.json",
52
+ "whenToUse": [
53
+ "Picking a day from a month the user wants to see — a schedule, a show date.",
54
+ "Inline, where a popover would be an extra click."
55
+ ],
56
+ "whenNotToUse": [
57
+ "A date the user already knows. Use `DateField`: typing `08172026` beats three clicks.",
58
+ "A range. Use `DateRangePicker`."
59
+ ],
60
+ "commonMistakes": [
61
+ "Re-deriving behaviour when upgrading. Selection modes, keyboard navigation, the ARIA grid wiring and the date maths are the library's; this layer supplies the token skin and nothing else.",
62
+ "Replacing a `classNames` slot rather than adding to it. Caller slots merge *over* the defaults."
63
+ ],
52
64
  "specimens": [
53
65
  {
54
66
  "title": "Calendar",
@@ -60,6 +72,5 @@
60
72
  "note": "react-day-picker's month grid, restyled from tokens. Speaks plain `Date`, because that is what a show file holds.",
61
73
  "interaction": "arrow keys walk the grid, Page Up and Page Down change month; the selected day is accent-soft, today is ringed."
62
74
  }
63
- ],
64
- "todo": true
75
+ ]
65
76
  }
@@ -40,10 +40,21 @@
40
40
  ],
41
41
  "summary": "The document's text, scrolling on its own, with a caret while it is still being written.",
42
42
  "examples": [],
43
- "status": "todo-docs",
43
+ "status": "stable",
44
44
  "url": "/docs/components/canvas-split-body",
45
45
  "mdUrl": "/docs/components/canvas-split-body.md",
46
46
  "jsonUrl": "/r/components/canvas-split-body.json",
47
+ "whenToUse": [
48
+ "The scrolling text of the document half, under its header.",
49
+ "A document still streaming, where `writing` trails a caret after the last line."
50
+ ],
51
+ "whenNotToUse": [
52
+ "The document's title, version or save state, which sit in the header above it."
53
+ ],
54
+ "commonMistakes": [
55
+ "Leaving `writing` true after the last line has landed, so a finished document keeps a caret at the end of it.",
56
+ "Adding your own scroll container around it. It scrolls on its own."
57
+ ],
47
58
  "specimens": [
48
59
  {
49
60
  "title": "CanvasSplit",
@@ -61,6 +72,5 @@
61
72
  "note": "The thread steps aside and the document takes the room. Seven parts: the split itself, a narrowed conversation rail, and a document half with its own header, body and lines — still being written while you read it, which is what the caret at the end of the body is for. On a narrow viewport the two halves stack instead of shrinking.",
62
73
  "interaction": "copy and close are named buttons and disable themselves without a handler. `saved` is the only state the header animates, and it swaps a word for a check rather than moving anything."
63
74
  }
64
- ],
65
- "todo": true
75
+ ]
66
76
  }
@@ -29,10 +29,19 @@
29
29
  ],
30
30
  "summary": "The document half of the split: the header, and the body under it.",
31
31
  "examples": [],
32
- "status": "todo-docs",
32
+ "status": "stable",
33
33
  "url": "/docs/components/canvas-split-document",
34
34
  "mdUrl": "/docs/components/canvas-split-document.md",
35
35
  "jsonUrl": "/r/components/canvas-split-document.json",
36
+ "whenToUse": [
37
+ "Wrapping the header and the body so the document sits opposite the conversation rail."
38
+ ],
39
+ "whenNotToUse": [
40
+ "Anything on the conversation side of the split."
41
+ ],
42
+ "commonMistakes": [
43
+ "Making it the scroll container. The body scrolls on its own beneath the header."
44
+ ],
36
45
  "specimens": [
37
46
  {
38
47
  "title": "CanvasSplit",
@@ -50,6 +59,5 @@
50
59
  "note": "The thread steps aside and the document takes the room. Seven parts: the split itself, a narrowed conversation rail, and a document half with its own header, body and lines — still being written while you read it, which is what the caret at the end of the body is for. On a narrow viewport the two halves stack instead of shrinking.",
51
60
  "interaction": "copy and close are named buttons and disable themselves without a handler. `saved` is the only state the header animates, and it swaps a word for a check rather than moving anything."
52
61
  }
53
- ],
54
- "todo": true
62
+ ]
55
63
  }
@@ -71,10 +71,21 @@
71
71
  ],
72
72
  "summary": "What the document is, which version this is, and whether it has been written down yet — with copy and close beside them.",
73
73
  "examples": [],
74
- "status": "todo-docs",
74
+ "status": "stable",
75
75
  "url": "/docs/components/canvas-split-header",
76
76
  "mdUrl": "/docs/components/canvas-split-header.md",
77
77
  "jsonUrl": "/r/components/canvas-split-header.json",
78
+ "whenToUse": [
79
+ "Naming the document on screen and stating which revision is showing.",
80
+ "Giving the canvas a dismiss path, through `onClose`."
81
+ ],
82
+ "whenNotToUse": [
83
+ "Document text, which belongs in the body under it."
84
+ ],
85
+ "commonMistakes": [
86
+ "Rendering your own saved indicator. `saved` already swaps the status between editing and saved.",
87
+ "Passing `version` as a string. It is a number — which revision is on screen."
88
+ ],
78
89
  "specimens": [
79
90
  {
80
91
  "title": "CanvasSplit",
@@ -92,6 +103,5 @@
92
103
  "note": "The thread steps aside and the document takes the room. Seven parts: the split itself, a narrowed conversation rail, and a document half with its own header, body and lines — still being written while you read it, which is what the caret at the end of the body is for. On a narrow viewport the two halves stack instead of shrinking.",
93
104
  "interaction": "copy and close are named buttons and disable themselves without a handler. `saved` is the only state the header animates, and it swaps a word for a check rather than moving anything."
94
105
  }
95
- ],
96
- "todo": true
106
+ ]
97
107
  }
@@ -40,10 +40,21 @@
40
40
  ],
41
41
  "summary": "One line of the document, arriving as it is written.",
42
42
  "examples": [],
43
- "status": "todo-docs",
43
+ "status": "stable",
44
44
  "url": "/docs/components/canvas-split-line",
45
45
  "mdUrl": "/docs/components/canvas-split-line.md",
46
46
  "jsonUrl": "/r/components/canvas-split-line.json",
47
+ "whenToUse": [
48
+ "Each line of a streamed document, so lines arrive one at a time rather than as one block.",
49
+ "A section title inside the document, with `heading`."
50
+ ],
51
+ "whenNotToUse": [
52
+ "A block of prose you want reflowed as one unit. This is one line."
53
+ ],
54
+ "commonMistakes": [
55
+ "Styling a line to look like a heading by hand instead of setting `heading`, which is what sets it apart.",
56
+ "Pushing a whole block of text through one line, which loses the line-by-line arrival the element exists for."
57
+ ],
47
58
  "specimens": [
48
59
  {
49
60
  "title": "CanvasSplit",
@@ -61,6 +72,5 @@
61
72
  "note": "The thread steps aside and the document takes the room. Seven parts: the split itself, a narrowed conversation rail, and a document half with its own header, body and lines — still being written while you read it, which is what the caret at the end of the body is for. On a narrow viewport the two halves stack instead of shrinking.",
62
73
  "interaction": "copy and close are named buttons and disable themselves without a handler. `saved` is the only state the header animates, and it swaps a word for a check rather than moving anything."
63
74
  }
64
- ],
65
- "todo": true
75
+ ]
66
76
  }
@@ -44,10 +44,21 @@
44
44
  ],
45
45
  "summary": "One turn inside the rail — a filled bubble for the person, plain text for the model.",
46
46
  "examples": [],
47
- "status": "todo-docs",
47
+ "status": "stable",
48
48
  "url": "/docs/components/canvas-split-message",
49
49
  "mdUrl": "/docs/components/canvas-split-message.md",
50
50
  "jsonUrl": "/r/components/canvas-split-message.json",
51
+ "whenToUse": [
52
+ "Each conversation turn in the narrowed rail beside the document.",
53
+ "Styling turns from outside, using the `data-speaker` attribute it emits."
54
+ ],
55
+ "whenNotToUse": [
56
+ "Content on the document side of the split."
57
+ ],
58
+ "commonMistakes": [
59
+ "Looking for a `role` prop. It is deliberately called `speaker` so the ARIA attribute stays yours to set.",
60
+ "Drawing your own bubble around a user turn. `speaker=\"user\"` already sits right in a bubble, and assistant turns run flush left."
61
+ ],
51
62
  "specimens": [
52
63
  {
53
64
  "title": "CanvasSplit",
@@ -65,6 +76,5 @@
65
76
  "note": "The thread steps aside and the document takes the room. Seven parts: the split itself, a narrowed conversation rail, and a document half with its own header, body and lines — still being written while you read it, which is what the caret at the end of the body is for. On a narrow viewport the two halves stack instead of shrinking.",
66
77
  "interaction": "copy and close are named buttons and disable themselves without a handler. `saved` is the only state the header animates, and it swaps a word for a check rather than moving anything."
67
78
  }
68
- ],
69
- "todo": true
79
+ ]
70
80
  }
@@ -29,10 +29,19 @@
29
29
  ],
30
30
  "summary": "The conversation, narrowed to a rail beside the document.",
31
31
  "examples": [],
32
- "status": "todo-docs",
32
+ "status": "stable",
33
33
  "url": "/docs/components/canvas-split-thread",
34
34
  "mdUrl": "/docs/components/canvas-split-thread.md",
35
35
  "jsonUrl": "/r/components/canvas-split-thread.json",
36
+ "whenToUse": [
37
+ "Holding the turns while the document is written, so the turn that asked for the artifact stays in view."
38
+ ],
39
+ "whenNotToUse": [
40
+ "A full-width transcript. This is the narrowed rail, not the main conversation surface."
41
+ ],
42
+ "commonMistakes": [
43
+ "Freezing its scroll while the document streams. It keeps scrolling, which is what keeps the requesting turn visible."
44
+ ],
36
45
  "specimens": [
37
46
  {
38
47
  "title": "CanvasSplit",
@@ -50,6 +59,5 @@
50
59
  "note": "The thread steps aside and the document takes the room. Seven parts: the split itself, a narrowed conversation rail, and a document half with its own header, body and lines — still being written while you read it, which is what the caret at the end of the body is for. On a narrow viewport the two halves stack instead of shrinking.",
51
60
  "interaction": "copy and close are named buttons and disable themselves without a handler. `saved` is the only state the header animates, and it swaps a word for a check rather than moving anything."
52
61
  }
53
- ],
54
- "todo": true
62
+ ]
55
63
  }
@@ -35,10 +35,21 @@
35
35
  "language": "tsx"
36
36
  }
37
37
  ],
38
- "status": "todo-docs",
38
+ "status": "stable",
39
39
  "url": "/docs/components/canvas-split",
40
40
  "mdUrl": "/docs/components/canvas-split.md",
41
41
  "jsonUrl": "/r/components/canvas-split.json",
42
+ "whenToUse": [
43
+ "A generated document long enough to deserve its own column beside a narrowed conversation.",
44
+ "A document that keeps being written while the person reads it."
45
+ ],
46
+ "whenNotToUse": [
47
+ "A short artifact that belongs inline in the transcript."
48
+ ],
49
+ "commonMistakes": [
50
+ "Putting the header inside `CanvasSplitBody`. `CanvasSplitHeader` and `CanvasSplitBody` are siblings inside `CanvasSplitDocument`.",
51
+ "Rendering turns outside `CanvasSplitThread`, which is the rail the conversation narrows into beside the document."
52
+ ],
42
53
  "specimens": [
43
54
  {
44
55
  "title": "CanvasSplit",
@@ -56,6 +67,5 @@
56
67
  "note": "The thread steps aside and the document takes the room. Seven parts: the split itself, a narrowed conversation rail, and a document half with its own header, body and lines — still being written while you read it, which is what the caret at the end of the body is for. On a narrow viewport the two halves stack instead of shrinking.",
57
68
  "interaction": "copy and close are named buttons and disable themselves without a handler. `saved` is the only state the header animates, and it swaps a word for a check rather than moving anything."
58
69
  }
59
- ],
60
- "todo": true
70
+ ]
61
71
  }
@@ -132,10 +132,22 @@
132
132
  "language": "tsx"
133
133
  }
134
134
  ],
135
- "status": "todo-docs",
135
+ "status": "stable",
136
136
  "url": "/docs/components/card",
137
137
  "mdUrl": "/docs/components/card.md",
138
138
  "jsonUrl": "/r/components/card.json",
139
+ "whenToUse": [
140
+ "One coherent object that deserves its own ground and edge.",
141
+ "Anywhere the root may later switch to the seam idiom — every section paints its own `surface-1`, so the parts need not know."
142
+ ],
143
+ "whenNotToUse": [
144
+ "Every block on the page. Border, fill and radius each say 'separate object'; stamping them everywhere flattens the hierarchy they exist to create.",
145
+ "A list row. Use `Item`, or `Row` inside a hairline table."
146
+ ],
147
+ "commonMistakes": [
148
+ "Nesting cards, which gives two competing grounds and no hierarchy.",
149
+ "Repainting a section's ground by hand instead of letting it paint its own, which is what breaks the seam switch."
150
+ ],
139
151
  "specimens": [
140
152
  {
141
153
  "title": "Card",
@@ -147,6 +159,5 @@
147
159
  "note": "A panel with body padding and a title family. `seam` swaps the hairline separation for the 1px-gap idiom.",
148
160
  "interaction": "none by default; wrap the header in a button if the card is a link."
149
161
  }
150
- ],
151
- "todo": true
162
+ ]
152
163
  }
@@ -222,10 +222,20 @@
222
222
  "language": "tsx"
223
223
  }
224
224
  ],
225
- "status": "todo-docs",
225
+ "status": "stable",
226
226
  "url": "/docs/components/carousel",
227
227
  "mdUrl": "/docs/components/carousel.md",
228
228
  "jsonUrl": "/r/components/carousel.json",
229
+ "whenToUse": [
230
+ "Peer items in a horizontal run the user browses rather than compares — screenshots, presets, a gallery."
231
+ ],
232
+ "whenNotToUse": [
233
+ "Content the user must not miss. Anything off-screen in a carousel is content most readers never see.",
234
+ "Two or three items that would fit side by side. Use `Grid`."
235
+ ],
236
+ "commonMistakes": [
237
+ "Importing it from the core barrel. `embla-carousel-react` is an **optional peer** — import from `@cueplusplus/ui/layout/carousel` so an app that ships no carousel never installs one."
238
+ ],
229
239
  "specimens": [
230
240
  {
231
241
  "title": "Carousel",
@@ -237,6 +247,5 @@
237
247
  "note": "Embla, wearing the tokens. An optional peer, so it ships from @cueplusplus/ui/layout/carousel rather than the core barrel.",
238
248
  "interaction": "drag or use the two controls; the dots are buttons and each says which slide it goes to."
239
249
  }
240
- ],
241
- "todo": true
250
+ ]
242
251
  }
@@ -17,10 +17,19 @@
17
17
  "tokensUsed": [],
18
18
  "summary": "The catalogue itself: everything there is, before anything has been narrowed.",
19
19
  "examples": [],
20
- "status": "todo-docs",
20
+ "status": "stable",
21
21
  "url": "/docs/components/catalogue-icon",
22
22
  "mdUrl": "/docs/components/catalogue-icon.md",
23
23
  "jsonUrl": "/r/components/catalogue-icon.json",
24
+ "whenToUse": [
25
+ "The row that *undoes* a filter — 'all of it'."
26
+ ],
27
+ "whenNotToUse": [
28
+ "A filtered view or a curated set. Use `FolderIcon`."
29
+ ],
30
+ "commonMistakes": [
31
+ "Using a list glyph, which promises an ordering the row does not have. The 2×2 of one repeated tile says 'all of it' is a shape, not a sequence."
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
  }
@@ -17,10 +17,19 @@
17
17
  "tokensUsed": [],
18
18
  "summary": "The beta channel: the same things, one merge earlier.",
19
19
  "examples": [],
20
- "status": "todo-docs",
20
+ "status": "stable",
21
21
  "url": "/docs/components/channel-beta-icon",
22
22
  "mdUrl": "/docs/components/channel-beta-icon.md",
23
23
  "jsonUrl": "/r/components/channel-beta-icon.json",
24
+ "whenToUse": [
25
+ "Marking a pre-release channel beside its released pair."
26
+ ],
27
+ "whenNotToUse": [
28
+ "An empty or unpopulated channel."
29
+ ],
30
+ "commonMistakes": [
31
+ "Drawing the ring empty. Half rather than empty because a beta is not an absence of a release — it is a release that has not finished happening, and an empty ring reads as 'nothing here yet'."
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
  }
@@ -219,10 +219,19 @@
219
219
  "language": "tsx"
220
220
  }
221
221
  ],
222
- "status": "todo-docs",
222
+ "status": "stable",
223
223
  "url": "/docs/components/channel-matrix",
224
224
  "mdUrl": "/docs/components/channel-matrix.md",
225
225
  "jsonUrl": "/r/components/channel-matrix.json",
226
+ "whenToUse": [
227
+ "Inspecting individual channels while a universe is running."
228
+ ],
229
+ "whenNotToUse": [
230
+ "An overview. Use `DmxBar`."
231
+ ],
232
+ "commonMistakes": [
233
+ "Rendering the cells from React state. Five hundred and twelve elements re-rendered forty times a second is a locked tab — the grid renders once and never re-renders, and an animation loop repaints it."
234
+ ],
226
235
  "specimens": [
227
236
  {
228
237
  "title": "ChannelMatrix",
@@ -234,6 +243,5 @@
234
243
  "note": "A 32×16 grid repainted inside an animation frame against a previous-value cache, with the colour ramps precomputed to a Uint8Array. Two ramps, and an overview mode that drills into one universe.",
235
244
  "interaction": "the controls switch universe, mode and ramp; the grid itself reports its occupancy in words."
236
245
  }
237
- ],
238
- "todo": true
246
+ ]
239
247
  }