@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
@@ -34,7 +34,7 @@
34
34
  "--cue-fg",
35
35
  "--cue-radius-control"
36
36
  ],
37
- "summary": "The two-axis colour field — saturation against brightness, by default.",
37
+ "summary": "The two-axis colour field — saturation against brightness by default.",
38
38
  "examples": [
39
39
  {
40
40
  "title": "Usage",
@@ -42,10 +42,19 @@
42
42
  "language": "tsx"
43
43
  }
44
44
  ],
45
- "status": "todo-docs",
45
+ "status": "stable",
46
46
  "url": "/docs/components/color-area",
47
47
  "mdUrl": "/docs/components/color-area.md",
48
48
  "jsonUrl": "/r/components/color-area.json",
49
+ "whenToUse": [
50
+ "Inside a colour picker, for the coarse visual pick."
51
+ ],
52
+ "whenNotToUse": [
53
+ "On its own without a hue control, which leaves two of three dimensions unreachable."
54
+ ],
55
+ "commonMistakes": [
56
+ "Rebuilding the pointer maths. The two hidden range inputs are what make it keyboard- and screen-reader-operable, and they come from the library."
57
+ ],
49
58
  "specimens": [
50
59
  {
51
60
  "title": "ColorArea",
@@ -57,6 +66,5 @@
57
66
  "note": "The two-axis plane. Saturation across, brightness down, with a thumb that reports both.",
58
67
  "interaction": "arrow keys move one axis at a time; the thumb keeps a ring in the background colour so it stays visible on any hue."
59
68
  }
60
- ],
61
- "todo": true
69
+ ]
62
70
  }
@@ -71,10 +71,20 @@
71
71
  "language": "tsx"
72
72
  }
73
73
  ],
74
- "status": "todo-docs",
74
+ "status": "stable",
75
75
  "url": "/docs/components/color-field",
76
76
  "mdUrl": "/docs/components/color-field.md",
77
77
  "jsonUrl": "/r/components/color-field.json",
78
+ "whenToUse": [
79
+ "An exact value the user knows or must paste.",
80
+ "Beside other text controls: it rides the same recessed chassis."
81
+ ],
82
+ "whenNotToUse": [
83
+ "A visual pick. Use `ColorArea` or `ColorPicker`."
84
+ ],
85
+ "commonMistakes": [
86
+ "Parsing the input yourself. Parsing, arrow-key stepping and commit-on-blur are the library's."
87
+ ],
78
88
  "specimens": [
79
89
  {
80
90
  "title": "ColorField",
@@ -86,6 +96,5 @@
86
96
  "note": "The text half of the suite, on the form chassis. Invalid input is rejected rather than silently coerced.",
87
97
  "interaction": "same rim and ring as Input; arrow keys step the channel under the caret."
88
98
  }
89
- ],
90
- "todo": true
99
+ ]
91
100
  }
@@ -207,7 +207,7 @@
207
207
  "--cue-text-label",
208
208
  "--cue-text-ui"
209
209
  ],
210
- "summary": "A colour, edited in a popover: two-axis area, hue rail, optional alpha rail, a text field that speaks hex *and* oklch, and an eyedropper where the browser has one.",
210
+ "summary": "A colour, edited in a popover: area, hue rail, optional alpha, a hex/oklch field and an eyedropper where the browser has one.",
211
211
  "examples": [
212
212
  {
213
213
  "title": "Usage",
@@ -215,10 +215,21 @@
215
215
  "language": "tsx"
216
216
  }
217
217
  ],
218
- "status": "todo-docs",
218
+ "status": "stable",
219
219
  "url": "/docs/components/color-picker",
220
220
  "mdUrl": "/docs/components/color-picker.md",
221
221
  "jsonUrl": "/r/components/color-picker.json",
222
+ "whenToUse": [
223
+ "Any full colour edit where the user needs both a visual pick and an exact value."
224
+ ],
225
+ "whenNotToUse": [
226
+ "One channel. Use `ColorSlider`.",
227
+ "A typed value only. Use `ColorField`.",
228
+ "Showing a colour. Use `ColorSwatch`."
229
+ ],
230
+ "commonMistakes": [
231
+ "Looking for a single primitive to wrap. It is composed from the React Aria colour parts because no primitive owns the combination."
232
+ ],
222
233
  "specimens": [
223
234
  {
224
235
  "title": "ColorPicker",
@@ -230,6 +241,5 @@
230
241
  "note": "Swatch, popover, area, hue slider and a text field, in one control. Reads and writes hex or oklch, so a token authored in oklch survives a round trip unchanged.",
231
242
  "interaction": "the swatch is the trigger; inside the popup, the area takes both arrow axes and the slider takes one."
232
243
  }
233
- ],
234
- "todo": true
244
+ ]
235
245
  }
@@ -64,10 +64,20 @@
64
64
  "language": "tsx"
65
65
  }
66
66
  ],
67
- "status": "todo-docs",
67
+ "status": "stable",
68
68
  "url": "/docs/components/color-slider",
69
69
  "mdUrl": "/docs/components/color-slider.md",
70
70
  "jsonUrl": "/r/components/color-slider.json",
71
+ "whenToUse": [
72
+ "A single channel the user adjusts directly.",
73
+ "Alpha — it gets the transparency checkerboard, without which 'half transparent' and 'half grey' look identical."
74
+ ],
75
+ "whenNotToUse": [
76
+ "A whole colour. Use `ColorPicker`."
77
+ ],
78
+ "commonMistakes": [
79
+ "Painting the gradient yourself. The library owns it along with the keyboard and pointer behaviour."
80
+ ],
71
81
  "specimens": [
72
82
  {
73
83
  "title": "ColorSlider",
@@ -79,6 +89,5 @@
79
89
  "note": "One channel at a time. The track paints the gradient for the channel it controls.",
80
90
  "interaction": "arrow keys step, Home and End jump to the channel bounds; the value is spoken as a colour, not a number."
81
91
  }
82
- ],
83
- "todo": true
92
+ ]
84
93
  }
@@ -59,10 +59,21 @@
59
59
  "language": "tsx"
60
60
  }
61
61
  ],
62
- "status": "todo-docs",
62
+ "status": "stable",
63
63
  "url": "/docs/components/color-swatch",
64
64
  "mdUrl": "/docs/components/color-swatch.md",
65
65
  "jsonUrl": "/r/components/color-swatch.json",
66
+ "whenToUse": [
67
+ "Displaying a colour — a legend, a palette row, a token value.",
68
+ "Anywhere transparency must read as transparency: the frame carries the checkerboard."
69
+ ],
70
+ "whenNotToUse": [
71
+ "Editing. Use `ColorPicker`.",
72
+ "A chart legend. Use `ChartSwatch`, which pairs the colour with a label."
73
+ ],
74
+ "commonMistakes": [
75
+ "Collapsing it to one element. It is two on purpose: the library writes the colour into inline `background-color`, which paints *behind* a background image, so one element cannot carry both the colour and the checkerboard."
76
+ ],
66
77
  "specimens": [
67
78
  {
68
79
  "title": "ColorSwatch",
@@ -74,6 +85,5 @@
74
85
  "note": "A colour as a readable object: three sizes, a checkerboard behind anything translucent, and a spoken description of the colour.",
75
86
  "interaction": "none. A swatch is a readout unless a picker wraps it."
76
87
  }
77
- ],
78
- "todo": true
88
+ ]
79
89
  }
@@ -54,7 +54,7 @@
54
54
  "--cue-text-micro",
55
55
  "--cue-text-ui"
56
56
  ],
57
- "summary": "Section 2 — every colour the active theme declares, one row each.",
57
+ "summary": "Section 2 of the configurator — every colour the active theme declares, one row each.",
58
58
  "examples": [
59
59
  {
60
60
  "title": "Usage",
@@ -62,9 +62,17 @@
62
62
  "language": "tsx"
63
63
  }
64
64
  ],
65
- "status": "todo-docs",
65
+ "status": "stable",
66
66
  "url": "/docs/components/colors-section",
67
67
  "mdUrl": "/docs/components/colors-section.md",
68
68
  "jsonUrl": "/r/components/colors-section.json",
69
- "todo": true
69
+ "whenToUse": [
70
+ "Inside `ThemeConfigurator`, where the rows are grouped by what each colour does."
71
+ ],
72
+ "whenNotToUse": [
73
+ "As a colour picker of your own. Use `TokenEditor`, which is the stateless, reusable half."
74
+ ],
75
+ "commonMistakes": [
76
+ "Reimplementing the rows. The editing lives in `TokenEditor` precisely so anything else can reuse it."
77
+ ]
70
78
  }
@@ -237,7 +237,7 @@
237
237
  "--cue-text-label",
238
238
  "--cue-text-ui"
239
239
  ],
240
- "summary": "A {@link Select } you can type into: one value out of a known, filterable set.",
240
+ "summary": "A `Select` you can type into: one value out of a known, filterable set.",
241
241
  "examples": [
242
242
  {
243
243
  "title": "Usage",
@@ -245,10 +245,22 @@
245
245
  "language": "tsx"
246
246
  }
247
247
  ],
248
- "status": "todo-docs",
248
+ "status": "stable",
249
249
  "url": "/docs/components/combobox",
250
250
  "mdUrl": "/docs/components/combobox.md",
251
251
  "jsonUrl": "/r/components/combobox.json",
252
+ "whenToUse": [
253
+ "A list too long to scroll comfortably — timezones, fixtures, users — where the value must still be one of the list.",
254
+ "Anywhere `Select` is right in contract but wrong in ergonomics."
255
+ ],
256
+ "whenNotToUse": [
257
+ "A value the user may invent. Use `Autocomplete`; anything not in `items` cannot be chosen here.",
258
+ "A short list that fits on screen. `Select` costs the user nothing to open and nothing to learn."
259
+ ],
260
+ "commonMistakes": [
261
+ "Treating the typed text as the value. It is a filter; the value is always an item.",
262
+ "Choosing between this and `Autocomplete` on appearance. They differ in what a value is allowed to be, which is the thing downstream code depends on."
263
+ ],
252
264
  "specimens": [
253
265
  {
254
266
  "title": "Combobox",
@@ -260,6 +272,5 @@
260
272
  "note": "A filtered list with a committed value. An item can be disabled; the empty message is a real string, not a blank popup.",
261
273
  "interaction": "arrow keys move the highlight, Enter commits, Escape reverts to the committed value."
262
274
  }
263
- ],
264
- "todo": true
275
+ ]
265
276
  }
@@ -108,10 +108,20 @@
108
108
  "language": "tsx"
109
109
  }
110
110
  ],
111
- "status": "todo-docs",
111
+ "status": "stable",
112
112
  "url": "/docs/components/compaction-row",
113
113
  "mdUrl": "/docs/components/compaction-row.md",
114
114
  "jsonUrl": "/r/components/compaction-row.json",
115
+ "whenToUse": [
116
+ "Marking a compaction in a transcript — the text above it is not the text below it any more.",
117
+ "Anywhere the reader needs to act on it: `128k → 24k tokens · 214 → 31 messages` explains why the model stopped remembering something."
118
+ ],
119
+ "whenNotToUse": [
120
+ "A time gap. Use `TimeBoundary`, which is the same `role=\"separator\"` for a different break."
121
+ ],
122
+ "commonMistakes": [
123
+ "Writing 'compacted' as prose. Alone it tells a reader nothing they can act on — the pair of numbers on both axes is the whole point."
124
+ ],
115
125
  "specimens": [
116
126
  {
117
127
  "title": "CompactionRow",
@@ -123,6 +133,5 @@
123
133
  "note": "A rule like TimeBoundary, because that is what it is: the transcript above it is not the transcript below it any more. What makes it a component is the pair of numbers on both axes — 'compacted' alone tells a reader nothing they can act on, while 128k → 24k tokens · 214 → 31 messages tells them why the model stopped remembering the thing they mentioned an hour ago. Five states, which is two more than most implementations have and exactly the two that matter: failed leaves the window full, and skipped leaves it full on purpose.",
124
134
  "interaction": "none. The whole rule is one accessible name, because a separator announces its label and never its children."
125
135
  }
126
- ],
127
- "todo": true
136
+ ]
128
137
  }
@@ -78,10 +78,20 @@
78
78
  "language": "tsx"
79
79
  }
80
80
  ],
81
- "status": "todo-docs",
81
+ "status": "stable",
82
82
  "url": "/docs/components/comparison-card",
83
83
  "mdUrl": "/docs/components/comparison-card.md",
84
84
  "jsonUrl": "/r/components/comparison-card.json",
85
+ "whenToUse": [
86
+ "A recommendation the reader may overrule — `recommendedId` names the pick and `reason` argues it."
87
+ ],
88
+ "whenNotToUse": [
89
+ "More than two options. Use a table.",
90
+ "A choice with no recommendation. Then it is just a comparison."
91
+ ],
92
+ "commonMistakes": [
93
+ "Naming a pick with no reason, which asks for trust instead of offering an argument."
94
+ ],
85
95
  "specimens": [
86
96
  {
87
97
  "title": "ComparisonCard",
@@ -93,6 +103,5 @@
93
103
  "note": "Two options side by side with the pick named, argued, and tinted in the streaming hue — not left for the reader to infer from a longer column. A trait that is `false` collapses to the label in grey with a minus, so the absence lines up with the presences instead of leaving a hole.",
94
104
  "interaction": "none. It is a read-only comparison; choosing is `RecommendationCard`'s job, one bench along."
95
105
  }
96
- ],
97
- "todo": true
106
+ ]
98
107
  }
@@ -39,10 +39,19 @@
39
39
  ],
40
40
  "summary": "One cluster of controls in the toolbar.",
41
41
  "examples": [],
42
- "status": "todo-docs",
42
+ "status": "stable",
43
43
  "url": "/docs/components/composer-actions",
44
44
  "mdUrl": "/docs/components/composer-actions.md",
45
45
  "jsonUrl": "/r/components/composer-actions.json",
46
+ "whenToUse": [
47
+ "Grouping the controls at one end of the composer toolbar."
48
+ ],
49
+ "whenNotToUse": [
50
+ "A third cluster in the middle. There are two of them, one at each end."
51
+ ],
52
+ "commonMistakes": [
53
+ "Putting every control into one cluster, which collapses the two-ended layout the toolbar is built around."
54
+ ],
46
55
  "specimens": [
47
56
  {
48
57
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -60,6 +69,5 @@
60
69
  "note": "The composer assembled from its parts, which is the only way it exists — there is no root that configures it. `ElementsComposer` positions, `ComposerBar` is the paper, and everything between the input and the send button is a facet you either compose in or leave out, so a composer with no attachments carries no attachment code. `ComposerSend` is dim while the input is empty and becomes a stop square while the model is streaming; it is the same button either way, because there is never a moment when both are wanted.",
61
70
  "interaction": "`ComposerAttachButton` disables itself when no handler is given rather than rendering a control that does nothing. The send button is labelled by state — `Send message` or `Stop generating` — so the swap is announced and not just drawn."
62
71
  }
63
- ],
64
- "todo": true
72
+ ]
65
73
  }
@@ -39,10 +39,19 @@
39
39
  ],
40
40
  "summary": "The paperclip, as a plus.",
41
41
  "examples": [],
42
- "status": "todo-docs",
42
+ "status": "stable",
43
43
  "url": "/docs/components/composer-attach-button",
44
44
  "mdUrl": "/docs/components/composer-attach-button.md",
45
45
  "jsonUrl": "/r/components/composer-attach-button.json",
46
+ "whenToUse": [
47
+ "Opening a file picker from the composer toolbar."
48
+ ],
49
+ "whenNotToUse": [
50
+ "An affordance with nothing behind it. With no handler it renders disabled."
51
+ ],
52
+ "commonMistakes": [
53
+ "Rendering it without a handler and expecting it to stay live. It disables itself rather than rendering a control that does nothing."
54
+ ],
46
55
  "specimens": [
47
56
  {
48
57
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -60,6 +69,5 @@
60
69
  "note": "The composer assembled from its parts, which is the only way it exists — there is no root that configures it. `ElementsComposer` positions, `ComposerBar` is the paper, and everything between the input and the send button is a facet you either compose in or leave out, so a composer with no attachments carries no attachment code. `ComposerSend` is dim while the input is empty and becomes a stop square while the model is streaming; it is the same button either way, because there is never a moment when both are wanted.",
61
70
  "interaction": "`ComposerAttachButton` disables itself when no handler is given rather than rendering a control that does nothing. The send button is labelled by state — `Send message` or `Stop generating` — so the swap is announced and not just drawn."
62
71
  }
63
- ],
64
- "todo": true
72
+ ]
65
73
  }
@@ -62,10 +62,21 @@
62
62
  ],
63
63
  "summary": "One attached file as a chip: an icon for its kind, its name and size, and — while it uploads — a progress hairline along the bottom edge.",
64
64
  "examples": [],
65
- "status": "todo-docs",
65
+ "status": "stable",
66
66
  "url": "/docs/components/composer-attachment-chip",
67
67
  "mdUrl": "/docs/components/composer-attachment-chip.md",
68
68
  "jsonUrl": "/r/components/composer-attachment-chip.json",
69
+ "whenToUse": [
70
+ "Each file attached to a message, including while it is still uploading.",
71
+ "A failed upload, which says so in its own meta line."
72
+ ],
73
+ "whenNotToUse": [
74
+ "A file the model produced rather than one the person attached."
75
+ ],
76
+ "commonMistakes": [
77
+ "Omitting `onRemove` and expecting a remove button. Without it a finished chip shows a tick instead.",
78
+ "Drawing your own progress bar. The hairline along the bottom edge is the upload progress."
79
+ ],
69
80
  "specimens": [
70
81
  {
71
82
  "title": "ComposerAttachments / ComposerAttachmentChip",
@@ -78,6 +89,5 @@
78
89
  "note": "The rail above the input, and one chip per file. A chip carries its own state: uploading draws a hairline of progress along its bottom edge, done offers a remove button, and a failure says why in the line that would otherwise hold a size. The icon is the file's kind, not its extension, so an unknown type still lands on something.",
79
90
  "interaction": "remove is a labelled icon button (`Remove front-truss.pdf`) and only exists on a finished chip — there is nothing to remove from an upload that has not landed, and a failed one is removed by fixing it."
80
91
  }
81
- ],
82
- "todo": true
92
+ ]
83
93
  }
@@ -39,10 +39,19 @@
39
39
  ],
40
40
  "summary": "The rail the attachment chips wrap in, above the input.",
41
41
  "examples": [],
42
- "status": "todo-docs",
42
+ "status": "stable",
43
43
  "url": "/docs/components/composer-attachments",
44
44
  "mdUrl": "/docs/components/composer-attachments.md",
45
45
  "jsonUrl": "/r/components/composer-attachments.json",
46
+ "whenToUse": [
47
+ "Holding the attachment chips above the composer input."
48
+ ],
49
+ "whenNotToUse": [
50
+ "Controls that belong in the toolbar under the input."
51
+ ],
52
+ "commonMistakes": [
53
+ "Laying the chips out with a flex row of your own, which drops the wrapping the rail already provides."
54
+ ],
46
55
  "specimens": [
47
56
  {
48
57
  "title": "ComposerAttachments / ComposerAttachmentChip",
@@ -55,6 +64,5 @@
55
64
  "note": "The rail above the input, and one chip per file. A chip carries its own state: uploading draws a hairline of progress along its bottom edge, done offers a remove button, and a failure says why in the line that would otherwise hold a size. The icon is the file's kind, not its extension, so an unknown type still lands on something.",
56
65
  "interaction": "remove is a labelled icon button (`Remove front-truss.pdf`) and only exists on a finished chip — there is nothing to remove from an upload that has not landed, and a failed one is removed by fixing it."
57
66
  }
58
- ],
59
- "todo": true
67
+ ]
60
68
  }
@@ -50,10 +50,20 @@
50
50
  ],
51
51
  "summary": "The bar itself: the paper the input, the attachments and the toolbar sit on.",
52
52
  "examples": [],
53
- "status": "todo-docs",
53
+ "status": "stable",
54
54
  "url": "/docs/components/composer-bar",
55
55
  "mdUrl": "/docs/components/composer-bar.md",
56
56
  "jsonUrl": "/r/components/composer-bar.json",
57
+ "whenToUse": [
58
+ "Wrapping the input, the attachment rail and the toolbar into one surface.",
59
+ "Signalling a drop target: `dragActive` tints the bar while a file is over it."
60
+ ],
61
+ "whenNotToUse": [
62
+ "A control meant to sit outside the composer surface."
63
+ ],
64
+ "commonMistakes": [
65
+ "Leaving `dragActive` unwired. The tint is the only feedback a drop target gets before the drop."
66
+ ],
57
67
  "specimens": [
58
68
  {
59
69
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -71,6 +81,5 @@
71
81
  "note": "The composer assembled from its parts, which is the only way it exists — there is no root that configures it. `ElementsComposer` positions, `ComposerBar` is the paper, and everything between the input and the send button is a facet you either compose in or leave out, so a composer with no attachments carries no attachment code. `ComposerSend` is dim while the input is empty and becomes a stop square while the model is streaming; it is the same button either way, because there is never a moment when both are wanted.",
72
82
  "interaction": "`ComposerAttachButton` disables itself when no handler is given rather than rendering a control that does nothing. The send button is labelled by state — `Send message` or `Stop generating` — so the swap is announced and not just drawn."
73
83
  }
74
- ],
75
- "todo": true
84
+ ]
76
85
  }
@@ -60,10 +60,21 @@
60
60
  ],
61
61
  "summary": "A slash command in the menu: its icon, `/name`, what it does, and the return key on the active row.",
62
62
  "examples": [],
63
- "status": "todo-docs",
63
+ "status": "stable",
64
64
  "url": "/docs/components/composer-command-item",
65
65
  "mdUrl": "/docs/components/composer-command-item.md",
66
66
  "jsonUrl": "/r/components/composer-command-item.json",
67
+ "whenToUse": [
68
+ "Each slash command offered in the composer menu.",
69
+ "The row Enter would run, which is the one that carries the return key."
70
+ ],
71
+ "whenNotToUse": [
72
+ "An entry that is not a runnable command. `command` takes a `ComposerCommand`."
73
+ ],
74
+ "commonMistakes": [
75
+ "Marking more than one row `active`. It is the row Enter would run, so exactly one carries it.",
76
+ "Drawing the return key hint yourself. It already appears on the active row."
77
+ ],
67
78
  "specimens": [
68
79
  {
69
80
  "title": "ComposerMenu / useSlashMatches / useMentionMatches",
@@ -80,6 +91,5 @@
80
91
  "note": "One input, two menus, and two hooks that decide which of them has anything to say. `useSlashMatches` answers only while the value starts with a slash; `useMentionMatches` only while the caret is inside a trailing @word — so an empty result is the menu's own instruction to stay shut. `applyMention` writes the choice back into the value, which is the one piece of text editing the family does for you. Type in either field below and the menu above it follows.",
81
92
  "interaction": "the menu animates rather than mounting, so the caret never moves under it. A row is a button and takes cue's focus ring; the active one shows the return key it would answer to."
82
93
  }
83
- ],
84
- "todo": true
94
+ ]
85
95
  }
@@ -51,10 +51,21 @@
51
51
  ],
52
52
  "summary": "The context-window dial in the toolbar, with the breakdown on hover or focus.",
53
53
  "examples": [],
54
- "status": "todo-docs",
54
+ "status": "stable",
55
55
  "url": "/docs/components/composer-context",
56
56
  "mdUrl": "/docs/components/composer-context.md",
57
57
  "jsonUrl": "/r/components/composer-context.json",
58
+ "whenToUse": [
59
+ "Showing how much of the context window has gone, and where, from the composer toolbar.",
60
+ "A usage readout that has to stay reachable by keyboard, since the breakdown opens on hover or focus."
61
+ ],
62
+ "whenNotToUse": [
63
+ "A generic progress meter. It is shaped around a `ComposerUsage` breakdown."
64
+ ],
65
+ "commonMistakes": [
66
+ "Adding a warning threshold of your own. It turns danger-coloured past 85%, which is the point where the next long tool result starts costing the conversation its own history.",
67
+ "Treating the dial as decoration and putting the breakdown out of keyboard reach. It opens on hover or focus."
68
+ ],
58
69
  "specimens": [
59
70
  {
60
71
  "title": "ComposerContext",
@@ -66,6 +77,5 @@
66
77
  "note": "The context window as a dial small enough to leave in the toolbar, with the arithmetic behind it on hover or focus. It turns the danger hue past 85% — the point where the next long tool result starts costing the conversation its own history rather than its headroom. Everything is in thousands of tokens and nothing is rounded here: the element divides, the caller counts.",
67
78
  "interaction": "the dial is a labelled button (`Context usage`) and the breakdown opens on hover *or* focus-within, so it is reachable from the keyboard without a click target that does nothing."
68
79
  }
69
- ],
70
- "todo": true
80
+ ]
71
81
  }
@@ -51,10 +51,19 @@
51
51
  ],
52
52
  "summary": "The text field.",
53
53
  "examples": [],
54
- "status": "todo-docs",
54
+ "status": "stable",
55
55
  "url": "/docs/components/composer-input",
56
56
  "mdUrl": "/docs/components/composer-input.md",
57
57
  "jsonUrl": "/r/components/composer-input.json",
58
+ "whenToUse": [
59
+ "The message field of a composer, where Enter submits."
60
+ ],
61
+ "whenNotToUse": [
62
+ "A field inside a multi-step form. Enter here sends the message."
63
+ ],
64
+ "commonMistakes": [
65
+ "Adding your own Enter handler on top of it. Submission is already guarded against IME composition, so accepting a candidate does not send — a hand-rolled handler loses that."
66
+ ],
58
67
  "specimens": [
59
68
  {
60
69
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -72,6 +81,5 @@
72
81
  "note": "The composer assembled from its parts, which is the only way it exists — there is no root that configures it. `ElementsComposer` positions, `ComposerBar` is the paper, and everything between the input and the send button is a facet you either compose in or leave out, so a composer with no attachments carries no attachment code. `ComposerSend` is dim while the input is empty and becomes a stop square while the model is streaming; it is the same button either way, because there is never a moment when both are wanted.",
73
82
  "interaction": "`ComposerAttachButton` disables itself when no handler is given rather than rendering a control that does nothing. The send button is labelled by state — `Send message` or `Stop generating` — so the swap is announced and not just drawn."
74
83
  }
75
- ],
76
- "todo": true
84
+ ]
77
85
  }
@@ -50,10 +50,20 @@
50
50
  ],
51
51
  "summary": "One row of a `ComposerMenu`, and the chassis the command, person and model rows are built on.",
52
52
  "examples": [],
53
- "status": "todo-docs",
53
+ "status": "stable",
54
54
  "url": "/docs/components/composer-menu-item",
55
55
  "mdUrl": "/docs/components/composer-menu-item.md",
56
56
  "jsonUrl": "/r/components/composer-menu-item.json",
57
+ "whenToUse": [
58
+ "A row in a `ComposerMenu` that none of the built rows already covers."
59
+ ],
60
+ "whenNotToUse": [
61
+ "A command, a person or a model row, which are already built on this chassis."
62
+ ],
63
+ "commonMistakes": [
64
+ "Using `active` for selection. It says where the keyboard is, not what has been chosen.",
65
+ "Rebuilding the command, person or model rows from scratch. They are already built on this chassis."
66
+ ],
57
67
  "specimens": [
58
68
  {
59
69
  "title": "ComposerMenu / useSlashMatches / useMentionMatches",
@@ -70,6 +80,5 @@
70
80
  "note": "One input, two menus, and two hooks that decide which of them has anything to say. `useSlashMatches` answers only while the value starts with a slash; `useMentionMatches` only while the caret is inside a trailing @word — so an empty result is the menu's own instruction to stay shut. `applyMention` writes the choice back into the value, which is the one piece of text editing the family does for you. Type in either field below and the menu above it follows.",
71
81
  "interaction": "the menu animates rather than mounting, so the caret never moves under it. A row is a button and takes cue's focus ring; the active one shows the return key it would answer to."
72
82
  }
73
- ],
74
- "todo": true
83
+ ]
75
84
  }
@@ -64,10 +64,21 @@
64
64
  ],
65
65
  "summary": "The popover the slash and mention menus are drawn in, anchored above the bar.",
66
66
  "examples": [],
67
- "status": "todo-docs",
67
+ "status": "stable",
68
68
  "url": "/docs/components/composer-menu",
69
69
  "mdUrl": "/docs/components/composer-menu.md",
70
70
  "jsonUrl": "/r/components/composer-menu.json",
71
+ "whenToUse": [
72
+ "Drawing the slash or mention menu over the composer.",
73
+ "Hanging the menu from either edge, with `align`."
74
+ ],
75
+ "whenNotToUse": [
76
+ "A menu that must unmount when closed. Closed is animated out, not unmounted.",
77
+ "A menu that should hang below the input. It is anchored above the bar."
78
+ ],
79
+ "commonMistakes": [
80
+ "Conditionally rendering it instead of toggling `open`. It animates open rather than mounting, so the caret never moves under it."
81
+ ],
71
82
  "specimens": [
72
83
  {
73
84
  "title": "ComposerMenu / useSlashMatches / useMentionMatches",
@@ -84,6 +95,5 @@
84
95
  "note": "One input, two menus, and two hooks that decide which of them has anything to say. `useSlashMatches` answers only while the value starts with a slash; `useMentionMatches` only while the caret is inside a trailing @word — so an empty result is the menu's own instruction to stay shut. `applyMention` writes the choice back into the value, which is the one piece of text editing the family does for you. Type in either field below and the menu above it follows.",
85
96
  "interaction": "the menu animates rather than mounting, so the caret never moves under it. A row is a button and takes cue's focus ring; the active one shows the return key it would answer to."
86
97
  }
87
- ],
88
- "todo": true
98
+ ]
89
99
  }
@@ -61,10 +61,21 @@
61
61
  ],
62
62
  "summary": "One model in the menu, with its metadata and a tick on the chosen one.",
63
63
  "examples": [],
64
- "status": "todo-docs",
64
+ "status": "stable",
65
65
  "url": "/docs/components/composer-model-item",
66
66
  "mdUrl": "/docs/components/composer-model-item.md",
67
67
  "jsonUrl": "/r/components/composer-model-item.json",
68
+ "whenToUse": [
69
+ "Each model offered in the composer's model menu.",
70
+ "Showing each model's metadata beside its name, rather than in a second column."
71
+ ],
72
+ "whenNotToUse": [
73
+ "A row whose entry is not a `ComposerModel`."
74
+ ],
75
+ "commonMistakes": [
76
+ "Drawing your own tick beside the current model. `selected` draws it.",
77
+ "Using `selected` as the keyboard cursor. It marks the model in use."
78
+ ],
68
79
  "specimens": [
69
80
  {
70
81
  "title": "ComposerModelTrigger / ComposerModelItem",
@@ -77,6 +88,5 @@
77
88
  "note": "The model as a word in the toolbar rather than a settings page. The trigger shows what is in use and carries `aria-expanded` for the menu it opens; each row shows the model and its one line of metadata, with a tick on the chosen one. Three rows is the point at which this stops being right and `ModelPicker` starts.",
78
89
  "interaction": "the trigger is a plain button and the menu is the same `ComposerMenu` the slash and mention lists use — nothing here portals, so an island's values reach it without any carriage."
79
90
  }
80
- ],
81
- "todo": true
91
+ ]
82
92
  }