@cueplusplus/ui 0.14.0 → 0.15.0

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 (352) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/dist/agent-runtime/tool-call-card.js +1 -1
  3. package/dist/chat/message.js +1 -1
  4. package/dist/chrome/band.js +10 -4
  5. package/dist/chrome/eyebrow.js +1 -1
  6. package/dist/chrome/footer.js +1 -1
  7. package/dist/chrome/section-header.js +1 -1
  8. package/dist/configurator/configurator.js +1 -1
  9. package/dist/configurator/export-dialog.js +1 -1
  10. package/dist/configurator/panel-sections.js +1 -1
  11. package/dist/configurator/token-editor.js +1 -1
  12. package/dist/date/calendar.js +2 -2
  13. package/dist/elements/context-usage.js +3 -3
  14. package/dist/elements/transcript-rules.js +1 -1
  15. package/dist/forms/field.js +1 -1
  16. package/dist/forms/slider.js +1 -1
  17. package/dist/instruments/code-block.js +1 -1
  18. package/dist/instruments/ledger.js +1 -1
  19. package/dist/instruments/progress.js +1 -1
  20. package/dist/instruments/stat.js +1 -1
  21. package/dist/instruments/table.js +2 -2
  22. package/dist/instruments/terminal-frame.js +1 -1
  23. package/dist/layout/_ground.js +1 -1
  24. package/dist/layout/collapsible.js +1 -1
  25. package/dist/layout/description-list.js +1 -1
  26. package/dist/layout/preview.d.ts +13 -1
  27. package/dist/layout/preview.js +16 -9
  28. package/dist/layout/sidebar.js +1 -1
  29. package/dist/layout/stepper.js +1 -1
  30. package/dist/overlays/_surface.d.ts +1 -1
  31. package/dist/overlays/_surface.js +1 -1
  32. package/dist/overlays/command-palette.js +1 -1
  33. package/dist/overlays/toast.js +1 -1
  34. package/dist/primitives/chip.d.ts +1 -1
  35. package/dist/primitives/chip.js +2 -2
  36. package/dist/system/density.d.ts +11 -2
  37. package/dist/system/density.js +29 -9
  38. package/dist/system/portal.js +8 -2
  39. package/dist/system/prepaint.d.ts +18 -1
  40. package/dist/system/prepaint.js +8 -2
  41. package/dist/system/theme-provider.d.ts +42 -5
  42. package/dist/system/theme-provider.js +84 -19
  43. package/dist/system/vocabulary.d.ts +1 -1
  44. package/dist/system/vocabulary.js +14 -2
  45. package/manifest/components/accordion.json +16 -4
  46. package/manifest/components/activity-graph.json +15 -3
  47. package/manifest/components/agent-card.json +15 -3
  48. package/manifest/components/agent-handoff.json +14 -3
  49. package/manifest/components/agent-mode-badge.json +12 -3
  50. package/manifest/components/agent-pile.json +13 -3
  51. package/manifest/components/agent-plan.json +13 -3
  52. package/manifest/components/agent-status.json +14 -3
  53. package/manifest/components/agent-surface.json +12 -3
  54. package/manifest/components/alert-dialog.json +16 -4
  55. package/manifest/components/animated-number.json +12 -3
  56. package/manifest/components/app-window-frame.json +13 -3
  57. package/manifest/components/approval-card.json +14 -3
  58. package/manifest/components/artifact-card.json +14 -3
  59. package/manifest/components/ask-box.json +13 -3
  60. package/manifest/components/audience-icon.json +11 -3
  61. package/manifest/components/autocomplete.json +17 -4
  62. package/manifest/components/avatar-group.json +15 -4
  63. package/manifest/components/avatar.json +16 -4
  64. package/manifest/components/background-inbox.json +14 -3
  65. package/manifest/components/band.json +15 -5
  66. package/manifest/components/breadcrumb.json +14 -3
  67. package/manifest/components/button-group.json +13 -3
  68. package/manifest/components/calendar.json +18 -5
  69. package/manifest/components/canvas-split-body.json +13 -3
  70. package/manifest/components/canvas-split-document.json +11 -3
  71. package/manifest/components/canvas-split-header.json +13 -3
  72. package/manifest/components/canvas-split-line.json +13 -3
  73. package/manifest/components/canvas-split-message.json +13 -3
  74. package/manifest/components/canvas-split-thread.json +11 -3
  75. package/manifest/components/canvas-split.json +13 -3
  76. package/manifest/components/card.json +14 -3
  77. package/manifest/components/carousel.json +12 -3
  78. package/manifest/components/catalogue-icon.json +11 -3
  79. package/manifest/components/channel-beta-icon.json +11 -3
  80. package/manifest/components/channel-matrix.json +13 -4
  81. package/manifest/components/channel-released-icon.json +11 -3
  82. package/manifest/components/chart-container.json +11 -3
  83. package/manifest/components/chart-ramp.json +12 -3
  84. package/manifest/components/chart-swatch.json +11 -3
  85. package/manifest/components/chart-tooltip-content.json +14 -5
  86. package/manifest/components/chart.json +14 -3
  87. package/manifest/components/chat-empty-state.json +13 -3
  88. package/manifest/components/chat-panel-assistant-message.json +11 -3
  89. package/manifest/components/chat-panel-composer.json +11 -3
  90. package/manifest/components/chat-panel-messages.json +11 -3
  91. package/manifest/components/chat-panel-typing.json +11 -3
  92. package/manifest/components/chat-panel-user-message.json +11 -3
  93. package/manifest/components/chat-panel.json +13 -3
  94. package/manifest/components/checkbox-group.json +15 -4
  95. package/manifest/components/checkpoint-history.json +13 -3
  96. package/manifest/components/chip.json +1 -0
  97. package/manifest/components/clamp.json +12 -3
  98. package/manifest/components/cli-tool-icon.json +11 -3
  99. package/manifest/components/code-block.json +2 -1
  100. package/manifest/components/code-diff.json +14 -3
  101. package/manifest/components/code-runner.json +13 -3
  102. package/manifest/components/collapsible.json +15 -4
  103. package/manifest/components/color-area.json +12 -4
  104. package/manifest/components/color-field.json +12 -3
  105. package/manifest/components/color-picker.json +14 -4
  106. package/manifest/components/color-slider.json +12 -3
  107. package/manifest/components/color-swatch.json +13 -3
  108. package/manifest/components/colors-section.json +13 -4
  109. package/manifest/components/combobox.json +17 -5
  110. package/manifest/components/command-palette.json +2 -1
  111. package/manifest/components/compaction-row.json +12 -3
  112. package/manifest/components/comparison-card.json +12 -3
  113. package/manifest/components/composer-actions.json +11 -3
  114. package/manifest/components/composer-attach-button.json +11 -3
  115. package/manifest/components/composer-attachment-chip.json +13 -3
  116. package/manifest/components/composer-attachments.json +11 -3
  117. package/manifest/components/composer-bar.json +12 -3
  118. package/manifest/components/composer-command-item.json +13 -3
  119. package/manifest/components/composer-context.json +13 -3
  120. package/manifest/components/composer-input.json +11 -3
  121. package/manifest/components/composer-menu-item.json +12 -3
  122. package/manifest/components/composer-menu.json +13 -3
  123. package/manifest/components/composer-model-item.json +13 -3
  124. package/manifest/components/composer-model-trigger.json +13 -3
  125. package/manifest/components/composer-person-item.json +13 -3
  126. package/manifest/components/composer-send.json +13 -3
  127. package/manifest/components/composer-toolbar.json +11 -3
  128. package/manifest/components/composer-voice-button.json +11 -3
  129. package/manifest/components/composer-voice.json +13 -3
  130. package/manifest/components/composer.json +14 -4
  131. package/manifest/components/computer-use.json +13 -3
  132. package/manifest/components/confidence-marker.json +11 -3
  133. package/manifest/components/connection-state.json +12 -3
  134. package/manifest/components/container.json +12 -3
  135. package/manifest/components/context-breakdown.json +12 -4
  136. package/manifest/components/context-menu.json +16 -5
  137. package/manifest/components/context-usage.json +15 -4
  138. package/manifest/components/conversation-search.json +13 -3
  139. package/manifest/components/copy-button.json +14 -3
  140. package/manifest/components/cost-meter.json +12 -3
  141. package/manifest/components/cue-portal-frame.json +12 -3
  142. package/manifest/components/data-table-pagination.json +13 -3
  143. package/manifest/components/data-table-toolbar.json +12 -3
  144. package/manifest/components/date-field.json +12 -3
  145. package/manifest/components/date-picker.json +13 -3
  146. package/manifest/components/date-range-picker.json +11 -3
  147. package/manifest/components/day-separator.json +12 -3
  148. package/manifest/components/delegation-card.json +14 -4
  149. package/manifest/components/density.json +25 -2
  150. package/manifest/components/description-list.json +17 -5
  151. package/manifest/components/diagram.json +13 -3
  152. package/manifest/components/dialog.json +2 -1
  153. package/manifest/components/disclosure.json +17 -5
  154. package/manifest/components/dmx-bar.json +14 -4
  155. package/manifest/components/dmx-strip.json +13 -4
  156. package/manifest/components/document-reference.json +13 -3
  157. package/manifest/components/draft-restore.json +13 -3
  158. package/manifest/components/drawer.json +15 -5
  159. package/manifest/components/dropdown-menu.json +2 -1
  160. package/manifest/components/edit-message.json +13 -3
  161. package/manifest/components/elements-command-palette.json +13 -3
  162. package/manifest/components/elements-composer.json +13 -3
  163. package/manifest/components/elements-data-table.json +11 -3
  164. package/manifest/components/elements-timeline.json +13 -3
  165. package/manifest/components/elicitation-form.json +13 -3
  166. package/manifest/components/empty-state-composer.json +11 -3
  167. package/manifest/components/empty-state-greeting.json +11 -3
  168. package/manifest/components/empty-state-suggestion.json +11 -3
  169. package/manifest/components/empty-state-suggestions.json +11 -3
  170. package/manifest/components/empty-state.json +15 -4
  171. package/manifest/components/end-of-turn-summary.json +14 -3
  172. package/manifest/components/env-var-input.json +15 -4
  173. package/manifest/components/error-state.json +13 -3
  174. package/manifest/components/export-dialog.json +12 -3
  175. package/manifest/components/eyebrow.json +16 -5
  176. package/manifest/components/feedback-dialog.json +13 -3
  177. package/manifest/components/field-description.json +17 -5
  178. package/manifest/components/field-error.json +17 -5
  179. package/manifest/components/field-label.json +17 -5
  180. package/manifest/components/field.json +2 -1
  181. package/manifest/components/file-tree.json +13 -3
  182. package/manifest/components/file-upload.json +14 -4
  183. package/manifest/components/flow-background.json +11 -3
  184. package/manifest/components/flow-controls.json +11 -3
  185. package/manifest/components/flow-graph.json +13 -3
  186. package/manifest/components/folder-icon.json +12 -3
  187. package/manifest/components/footer.json +1 -0
  188. package/manifest/components/frac.json +11 -3
  189. package/manifest/components/frames.json +2 -1
  190. package/manifest/components/generation-loader.json +13 -3
  191. package/manifest/components/generative-ui.json +16 -4
  192. package/manifest/components/grid.json +14 -3
  193. package/manifest/components/group-bar.json +13 -3
  194. package/manifest/components/guardrail-notice.json +13 -3
  195. package/manifest/components/hover-card.json +16 -5
  196. package/manifest/components/icon-button.json +15 -3
  197. package/manifest/components/image-generation.json +13 -3
  198. package/manifest/components/info-tip.json +15 -4
  199. package/manifest/components/inline-citation.json +13 -3
  200. package/manifest/components/input-group.json +15 -4
  201. package/manifest/components/item.json +15 -4
  202. package/manifest/components/job-progress.json +14 -3
  203. package/manifest/components/kbd.json +14 -3
  204. package/manifest/components/launcher-bubble.json +14 -3
  205. package/manifest/components/ledger.json +2 -1
  206. package/manifest/components/link.json +13 -3
  207. package/manifest/components/live-region-announcer.json +16 -4
  208. package/manifest/components/log-viewer.json +15 -3
  209. package/manifest/components/map-answer.json +13 -3
  210. package/manifest/components/markdown-text.json +16 -4
  211. package/manifest/components/math-block.json +13 -3
  212. package/manifest/components/mcp-server-icon.json +12 -3
  213. package/manifest/components/mcp-server-panel.json +13 -3
  214. package/manifest/components/memory-chips.json +12 -3
  215. package/manifest/components/menubar.json +15 -4
  216. package/manifest/components/message-actions.json +14 -4
  217. package/manifest/components/message-attachments.json +12 -3
  218. package/manifest/components/message-branches.json +12 -3
  219. package/manifest/components/message-list.json +12 -3
  220. package/manifest/components/message-pair.json +12 -3
  221. package/manifest/components/message-queue.json +13 -3
  222. package/manifest/components/message-timing.json +13 -3
  223. package/manifest/components/message.json +14 -4
  224. package/manifest/components/mobile-composer.json +14 -3
  225. package/manifest/components/model-picker.json +12 -3
  226. package/manifest/components/multi-select.json +18 -5
  227. package/manifest/components/musical-time-input.json +11 -3
  228. package/manifest/components/navigation-menu.json +15 -4
  229. package/manifest/components/node-card.json +11 -3
  230. package/manifest/components/node-handle.json +11 -3
  231. package/manifest/components/number-field.json +15 -3
  232. package/manifest/components/number-ticker.json +12 -3
  233. package/manifest/components/onboarding.json +12 -3
  234. package/manifest/components/otp-field.json +14 -3
  235. package/manifest/components/page-shell.json +14 -4
  236. package/manifest/components/pagination.json +14 -3
  237. package/manifest/components/panel-header.json +14 -4
  238. package/manifest/components/password-input.json +15 -4
  239. package/manifest/components/permission-grant.json +13 -3
  240. package/manifest/components/permission-scopes.json +14 -3
  241. package/manifest/components/piano-keyboard.json +11 -3
  242. package/manifest/components/popover.json +2 -1
  243. package/manifest/components/preset-section.json +13 -4
  244. package/manifest/components/preview.json +15 -1
  245. package/manifest/components/progress.json +16 -4
  246. package/manifest/components/prompt-library.json +12 -3
  247. package/manifest/components/queue-dock.json +14 -3
  248. package/manifest/components/quota-banner.json +12 -3
  249. package/manifest/components/quote-reply.json +12 -3
  250. package/manifest/components/radio-group.json +15 -4
  251. package/manifest/components/radio.json +15 -4
  252. package/manifest/components/rating.json +15 -4
  253. package/manifest/components/read-aloud.json +13 -3
  254. package/manifest/components/reasoning-effort.json +12 -3
  255. package/manifest/components/reasoning-panel.json +13 -3
  256. package/manifest/components/recommendation-card.json +12 -3
  257. package/manifest/components/regenerate-menu.json +12 -3
  258. package/manifest/components/replay-player.json +14 -3
  259. package/manifest/components/research-report.json +12 -3
  260. package/manifest/components/resizable.json +13 -3
  261. package/manifest/components/retrieval-chunks.json +13 -3
  262. package/manifest/components/revert-dock.json +14 -3
  263. package/manifest/components/reviewable-diff.json +12 -3
  264. package/manifest/components/risk-badge.json +14 -3
  265. package/manifest/components/schedule-card.json +12 -3
  266. package/manifest/components/score-breakdown.json +13 -3
  267. package/manifest/components/scroll-anchor.json +12 -3
  268. package/manifest/components/scroll-area.json +13 -3
  269. package/manifest/components/scrollable-tabs-list.json +14 -4
  270. package/manifest/components/seam-cell.json +13 -4
  271. package/manifest/components/seam-grid.json +14 -3
  272. package/manifest/components/seam-list.json +13 -3
  273. package/manifest/components/search-input.json +15 -4
  274. package/manifest/components/section-header.json +16 -4
  275. package/manifest/components/segmented-control.json +15 -3
  276. package/manifest/components/separator.json +14 -3
  277. package/manifest/components/settings-panel.json +13 -3
  278. package/manifest/components/shape-section.json +13 -4
  279. package/manifest/components/shared-conversation.json +12 -3
  280. package/manifest/components/sheet.json +16 -5
  281. package/manifest/components/shimmer-label.json +12 -3
  282. package/manifest/components/sidebar.json +17 -5
  283. package/manifest/components/signal-edge.json +13 -4
  284. package/manifest/components/skeleton.json +16 -4
  285. package/manifest/components/skill-icon.json +12 -3
  286. package/manifest/components/slider.json +16 -4
  287. package/manifest/components/sources.json +12 -3
  288. package/manifest/components/sparkline.json +14 -4
  289. package/manifest/components/speaker-identity.json +11 -3
  290. package/manifest/components/spec-sheet.json +13 -4
  291. package/manifest/components/spectrum-visualizer.json +11 -3
  292. package/manifest/components/spinner.json +16 -4
  293. package/manifest/components/stack-icon.json +12 -3
  294. package/manifest/components/stack.json +14 -3
  295. package/manifest/components/stacks-matrix-icon.json +11 -3
  296. package/manifest/components/stat.json +15 -3
  297. package/manifest/components/status-dot.json +16 -4
  298. package/manifest/components/stepper.json +17 -5
  299. package/manifest/components/stopped-run.json +13 -4
  300. package/manifest/components/streaming-text.json +12 -3
  301. package/manifest/components/sub.json +11 -3
  302. package/manifest/components/subagent-list.json +13 -3
  303. package/manifest/components/suggestions.json +12 -3
  304. package/manifest/components/sup.json +11 -3
  305. package/manifest/components/swap-label.json +12 -3
  306. package/manifest/components/table-scroll-region.json +2 -1
  307. package/manifest/components/table.json +2 -1
  308. package/manifest/components/tags-input.json +17 -5
  309. package/manifest/components/tail-status.json +14 -3
  310. package/manifest/components/terminal-block.json +13 -3
  311. package/manifest/components/terminal-frame.json +15 -3
  312. package/manifest/components/textarea.json +15 -4
  313. package/manifest/components/theme-configurator.json +14 -4
  314. package/manifest/components/theme-provider.json +14 -1
  315. package/manifest/components/thinking-indicator.json +12 -3
  316. package/manifest/components/thread-list.json +12 -3
  317. package/manifest/components/thread-search.json +12 -3
  318. package/manifest/components/threshold-rail.json +13 -3
  319. package/manifest/components/time-boundary.json +15 -4
  320. package/manifest/components/time-field.json +15 -4
  321. package/manifest/components/timeline-ruler.json +13 -3
  322. package/manifest/components/timeline.json +13 -3
  323. package/manifest/components/title-bar.json +13 -3
  324. package/manifest/components/toast.json +2 -0
  325. package/manifest/components/todo-list.json +12 -3
  326. package/manifest/components/toggle-group.json +15 -4
  327. package/manifest/components/toggle.json +15 -4
  328. package/manifest/components/token-editor.json +14 -4
  329. package/manifest/components/tool-call-card.json +2 -1
  330. package/manifest/components/tool-call.json +13 -3
  331. package/manifest/components/tool-error.json +14 -4
  332. package/manifest/components/tool-group.json +12 -3
  333. package/manifest/components/tool-timeline.json +14 -4
  334. package/manifest/components/toolbar.json +14 -4
  335. package/manifest/components/tooltip.json +2 -1
  336. package/manifest/components/trace-waterfall.json +12 -3
  337. package/manifest/components/tree-visibility-toggle.json +13 -3
  338. package/manifest/components/tree.json +14 -3
  339. package/manifest/components/turn-footer.json +14 -3
  340. package/manifest/components/two-step-button.json +14 -3
  341. package/manifest/components/typing-indicator.json +12 -3
  342. package/manifest/components/universe-grid.json +14 -4
  343. package/manifest/components/unread-divider.json +16 -5
  344. package/manifest/components/usage-chart.json +14 -3
  345. package/manifest/components/verdict-row.json +14 -3
  346. package/manifest/components/voice-conversation.json +13 -3
  347. package/manifest/components/web-preview.json +13 -3
  348. package/manifest/components/web-search.json +13 -3
  349. package/manifest/components/work-collapse.json +15 -4
  350. package/manifest/manifest.json +667 -667
  351. package/manifest/tokens.json +29 -2
  352. package/package.json +2 -2
@@ -86,10 +86,21 @@
86
86
  "language": "tsx"
87
87
  }
88
88
  ],
89
- "status": "todo-docs",
89
+ "status": "stable",
90
90
  "url": "/docs/components/subagent-list",
91
91
  "mdUrl": "/docs/components/subagent-list.md",
92
92
  "jsonUrl": "/r/components/subagent-list.json",
93
+ "whenToUse": [
94
+ "A fan-out of parallel workers, each card naming its agent and model, with a summariser underneath."
95
+ ],
96
+ "whenNotToUse": [
97
+ "One agent's steps over time. This draws a card per worker and a progress width per worker."
98
+ ],
99
+ "commonMistakes": [
100
+ "Letting `progress` and `agents` fall out of step. The array is positional, per agent, and used while a worker is still running.",
101
+ "Marking individual agents complete. `completedCount` is how many from the start are complete, so completion is prefix-shaped.",
102
+ "Passing `summaryAgent` and expecting it to appear. It shows only when `showSummary` is true."
103
+ ],
93
104
  "specimens": [
94
105
  {
95
106
  "title": "SubagentList",
@@ -101,6 +112,5 @@
101
112
  "note": "Parallel workers, each with its own model and its own progress. `completedCount` marks the finished ones from the start of the list, and the summary card appears under them when the agent that folds their answers together starts work.",
102
113
  "interaction": "none. Delegation is something to watch, not something to steer from here."
103
114
  }
104
- ],
105
- "todo": true
115
+ ]
106
116
  }
@@ -86,10 +86,20 @@
86
86
  "language": "tsx"
87
87
  }
88
88
  ],
89
- "status": "todo-docs",
89
+ "status": "stable",
90
90
  "url": "/docs/components/suggestions",
91
91
  "mdUrl": "/docs/components/suggestions.md",
92
92
  "jsonUrl": "/r/components/suggestions.json",
93
+ "whenToUse": [
94
+ "Follow-up prompts after an answer, as a centred row of pills or as full-width stacked rows with `variant=\"list\"`."
95
+ ],
96
+ "whenNotToUse": [
97
+ "A set you mean to change in place. The stagger entrance replays by remounting on `cycle`, not by swapping the array."
98
+ ],
99
+ "commonMistakes": [
100
+ "Leaving `cycle` constant and wondering why the entrance never replays. It is the identity key that remounts the row.",
101
+ "Treating `selectedSuggestion` as optional. It is required, and `null` is how you say none is pressed."
102
+ ],
93
103
  "specimens": [
94
104
  {
95
105
  "title": "Suggestions",
@@ -101,6 +111,5 @@
101
111
  "note": "Where the conversation could go next, staggered in after a reply. Pills for a centred empty state, a list for a side panel; either way `cycle` is the key that re-runs the entrance when a new set replaces the old one.",
102
112
  "interaction": "each pill is a button carrying aria-pressed, lifts a pixel on hover and presses in on click. The selected one inverts."
103
113
  }
104
- ],
105
- "todo": true
114
+ ]
106
115
  }
@@ -22,10 +22,19 @@
22
22
  ],
23
23
  "summary": "A superscript inside an expression: an exponent or an index, set upright inside the italic.",
24
24
  "examples": [],
25
- "status": "todo-docs",
25
+ "status": "stable",
26
26
  "url": "/docs/components/sup",
27
27
  "mdUrl": "/docs/components/sup.md",
28
28
  "jsonUrl": "/r/components/sup.json",
29
+ "whenToUse": [
30
+ "An exponent or an index above a term inside a rendered expression."
31
+ ],
32
+ "whenNotToUse": [
33
+ "Body prose that happens to need a superscript. This one is shaped to sit upright inside an expression's italic."
34
+ ],
35
+ "commonMistakes": [
36
+ "Reaching for it outside an expression, where the upright-inside-the-italic setting has nothing to sit inside."
37
+ ],
29
38
  "specimens": [
30
39
  {
31
40
  "title": "MathBlock",
@@ -40,6 +49,5 @@
40
49
  "note": "Maths with the working shown, a step at a time. The expressions are nodes rather than a string, so there is no parser and no KaTeX in the bundle — `Frac` stacks a numerator over a rule, `Sup` and `Sub` set an index upright inside the serif italic, and anything else is text.",
41
50
  "interaction": "none. Each step's note says what justified it, which is what turns three lines of algebra into an explanation."
42
51
  }
43
- ],
44
- "todo": true
52
+ ]
45
53
  }
@@ -66,10 +66,20 @@
66
66
  ],
67
67
  "summary": "Two labels stacked in one cell, with the box's width animating between them.",
68
68
  "examples": [],
69
- "status": "todo-docs",
69
+ "status": "stable",
70
70
  "url": "/docs/components/swap-label",
71
71
  "mdUrl": "/docs/components/swap-label.md",
72
72
  "jsonUrl": "/r/components/swap-label.json",
73
+ "whenToUse": [
74
+ "A label that changes and must take its new width with it: `Searching...` becoming `Searched` has to make the row shrink."
75
+ ],
76
+ "whenNotToUse": [
77
+ "More than two states. `children` is exactly two labels — the resting one and the active one."
78
+ ],
79
+ "commonMistakes": [
80
+ "Expecting the outgoing text to be announced or copied into a selection. The leaving layer is `aria-hidden`, deliberately.",
81
+ "Fixing the width with a class. A `ResizeObserver` measures the layer that is showing, because neither layer can size the box while both are in it."
82
+ ],
73
83
  "specimens": [
74
84
  {
75
85
  "title": "SwapLabel",
@@ -81,6 +91,5 @@
81
91
  "note": "Two labels in one cell, crossfading, with the box measuring itself to whichever is showing. The width is half the effect: 'Patching universe 3' becoming 'Patched' has to make the row shrink, and the outgoing layer is aria-hidden so it is neither announced nor copied.",
82
92
  "interaction": "swap it and watch the box, not the text. Everything after the label on that row moves with it."
83
93
  }
84
- ],
85
- "todo": true
94
+ ]
86
95
  }
@@ -42,7 +42,8 @@
42
42
  "--cue-surface-1",
43
43
  "--cue-table-group-top",
44
44
  "--cue-text-label",
45
- "--cue-text-ui"
45
+ "--cue-text-ui",
46
+ "--cue-tracking-caps"
46
47
  ],
47
48
  "summary": "A named keyboard-focusable horizontal viewport for wide semantic tables.",
48
49
  "examples": [],
@@ -235,7 +235,8 @@
235
235
  "--cue-surface-1",
236
236
  "--cue-table-group-top",
237
237
  "--cue-text-label",
238
- "--cue-text-ui"
238
+ "--cue-text-ui",
239
+ "--cue-tracking-caps"
239
240
  ],
240
241
  "summary": "The semantic table: mono uppercase headers, hairline rows, tabular numerals.",
241
242
  "examples": [
@@ -225,9 +225,10 @@
225
225
  "--cue-text-body",
226
226
  "--cue-text-emphasis",
227
227
  "--cue-text-label",
228
- "--cue-text-ui"
228
+ "--cue-text-ui",
229
+ "--cue-tracking-caps"
229
230
  ],
230
- "summary": "Free-form tags, each a removable chip.",
231
+ "summary": "Free-form tags, each a removable chip. Enter or a separator key commits what is in the box.",
231
232
  "examples": [
232
233
  {
233
234
  "title": "Usage",
@@ -235,10 +236,22 @@
235
236
  "language": "tsx"
236
237
  }
237
238
  ],
238
- "status": "todo-docs",
239
+ "status": "stable",
239
240
  "url": "/docs/components/tags-input",
240
241
  "mdUrl": "/docs/components/tags-input.md",
241
242
  "jsonUrl": "/r/components/tags-input.json",
243
+ "whenToUse": [
244
+ "Labels, hostnames, arbitrary keys — anything the product cannot enumerate in advance.",
245
+ "A known subset you still want to offer: pass `suggestions` without constraining the value to them."
246
+ ],
247
+ "whenNotToUse": [
248
+ "A closed set. Use `MultiSelect`, so an unlisted value cannot be committed at all.",
249
+ "One value. Use `Input`, or `Autocomplete` if suggestions help."
250
+ ],
251
+ "commonMistakes": [
252
+ "Rebuilding the commit rules by hand. Separator keys, `max` and duplicate handling are all here; a hand-rolled version misses at least one.",
253
+ "Forgetting `max`. Without it a paste can commit a hundred tags into a field sized for five."
254
+ ],
242
255
  "specimens": [
243
256
  {
244
257
  "title": "TagsInput",
@@ -250,6 +263,5 @@
250
263
  "note": "A combobox in multiple mode, rendering its values as chips. Comma and Enter both commit.",
251
264
  "interaction": "Backspace on an empty field removes the last chip; each chip's remove button has its own name."
252
265
  }
253
- ],
254
- "todo": true
266
+ ]
255
267
  }
@@ -118,10 +118,22 @@
118
118
  "language": "tsx"
119
119
  }
120
120
  ],
121
- "status": "todo-docs",
121
+ "status": "stable",
122
122
  "url": "/docs/components/tail-status",
123
123
  "mdUrl": "/docs/components/tail-status.md",
124
124
  "jsonUrl": "/r/components/tail-status.json",
125
+ "whenToUse": [
126
+ "One per transcript, at the foot. It is a `role=\"status\"` row, and so the only element in this family a screen reader is told about without being asked.",
127
+ "A settled run: `active={false}` stops the sweep and empties the spinner's slot without moving the text."
128
+ ],
129
+ "whenNotToUse": [
130
+ "Anywhere but the foot of a transcript, and never twice. It announces itself each time the action changes — the behaviour a person who cannot see the spinner needs, and unbearable used for anything else."
131
+ ],
132
+ "commonMistakes": [
133
+ "Composing `action` and `detail` into one string. They are separate because they truncate differently: the action is short and must survive, the detail is a path and must not push it off a 280px sidebar row.",
134
+ "Setting `announce` beside a `LiveRegionAnnouncer`. Mounting the announcer takes the speech away automatically; an explicit answer always wins, so `true` gets every state read out twice.",
135
+ "Offering `onCancel` that cannot cancel. The inline control exists only when the handler is given, because a Cancel that cannot cancel is worse than no Cancel."
136
+ ],
125
137
  "specimens": [
126
138
  {
127
139
  "title": "TailStatus",
@@ -133,6 +145,5 @@
133
145
  "note": "The live row at the foot of the transcript, and the only element in this family a screen reader is told about without being asked: it is a role=status, so each new action is announced politely as it lands — unless a LiveRegionAnnouncer is mounted, in which case it hands the speaking over and draws the state without saying it, because two polite regions narrating the same run is the transcript read out twice. Two props rather than one string — the action is short and must survive, the detail is a path and must not push it off a 280px sidebar — and an inline Cancel that exists only when there is something to cancel. The copy is TAIL_ACTIONS, a table, not ten strings baked into the markup.",
134
146
  "interaction": "press Cancel and the row settles: the sweep stops, the spinner leaves its slot without the words moving, and the last thing it says is what stopped it. updatesInPlace goes off with it, because 'Interrupted' is a different sentence rather than the next frame of the same one."
135
147
  }
136
- ],
137
- "todo": true
148
+ ]
138
149
  }
@@ -91,10 +91,21 @@
91
91
  "language": "tsx"
92
92
  }
93
93
  ],
94
- "status": "todo-docs",
94
+ "status": "stable",
95
95
  "url": "/docs/components/terminal-block",
96
96
  "mdUrl": "/docs/components/terminal-block.md",
97
97
  "jsonUrl": "/r/components/terminal-block.json",
98
+ "whenToUse": [
99
+ "A command an agent ran, its output landing line by line as `visibleCount` moves.",
100
+ "The classic dark terminal slab inside a light surface: `variant=\"ink\"`, where `paper` matches the surrounding surfaces."
101
+ ],
102
+ "whenNotToUse": [
103
+ "A command that failed. `done` shows exit 0 and nothing else; until it is true a spinner keeps spinning."
104
+ ],
105
+ "commonMistakes": [
106
+ "Appending to `lines` as output arrives instead of moving `visibleCount`. `lines` is everything available to stream.",
107
+ "Leaving `done` false on a finished run, so the header spins forever."
108
+ ],
98
109
  "specimens": [
99
110
  {
100
111
  "title": "TerminalBlock",
@@ -106,6 +117,5 @@
106
117
  "note": "Command output as it arrives: `visibleCount` says how many of the lines have landed, so the caller owns the clock and the block owns nothing. Two grounds — paper sits in the transcript, ink is the recessed slab a terminal is expected to be.",
107
118
  "interaction": "none. It is a transcript of something that already happened."
108
119
  }
109
- ],
110
- "todo": true
120
+ ]
111
121
  }
@@ -116,6 +116,7 @@
116
116
  "--cue-sunken",
117
117
  "--cue-text-label",
118
118
  "--cue-text-ui",
119
+ "--cue-tracking-caps",
119
120
  "--cue-warn"
120
121
  ],
121
122
  "summary": "A recessed terminal: mono, `$`-prefixed commands, optional typed playback.",
@@ -126,10 +127,22 @@
126
127
  "language": "tsx"
127
128
  }
128
129
  ],
129
- "status": "todo-docs",
130
+ "status": "stable",
130
131
  "url": "/docs/components/terminal-frame",
131
132
  "mdUrl": "/docs/components/terminal-frame.md",
132
133
  "jsonUrl": "/r/components/terminal-frame.json",
134
+ "whenToUse": [
135
+ "Showing commands and their output as text the reader can copy.",
136
+ "A demo that should play: `simulate` types it out, and it is still text."
137
+ ],
138
+ "whenNotToUse": [
139
+ "A live shell. This is a depiction, not a terminal.",
140
+ "A code sample. Use a code block; the `$` prefix says 'run this'."
141
+ ],
142
+ "commonMistakes": [
143
+ "Recording a GIF or a video instead. Text copies, scales with the type ramp, re-themes, and costs nothing to ship.",
144
+ "Raising it like a card. It is `bg-sunken` on purpose — the transcript sits *into* the page the way a real console does."
145
+ ],
133
146
  "specimens": [
134
147
  {
135
148
  "title": "TerminalFrame",
@@ -141,6 +154,5 @@
141
154
  "note": "A sunken mono frame with `$`-prefixed command lines and a copy affordance. `simulate` turns it into a typing player with jittered keystrokes.",
142
155
  "interaction": "the reduced-motion path renders the finished transcript instantly rather than typing it."
143
156
  }
144
- ],
145
- "todo": true
157
+ ]
146
158
  }
@@ -76,7 +76,7 @@
76
76
  "--cue-text-label",
77
77
  "--cue-text-ui"
78
78
  ],
79
- "summary": "The multi-line text control.",
79
+ "summary": "The multi-line text control, on the same `Field` terms as `Input`.",
80
80
  "examples": [
81
81
  {
82
82
  "title": "Usage",
@@ -84,10 +84,22 @@
84
84
  "language": "tsx"
85
85
  }
86
86
  ],
87
- "status": "todo-docs",
87
+ "status": "stable",
88
88
  "url": "/docs/components/textarea",
89
89
  "mdUrl": "/docs/components/textarea.md",
90
90
  "jsonUrl": "/r/components/textarea.json",
91
+ "whenToUse": [
92
+ "Text with its own line breaks: a note, a description, a cue list comment.",
93
+ "Inside a `Field` — it renders through Base UI's `Field.Control`, so label wiring, `aria-describedby` and `data-invalid` all work."
94
+ ],
95
+ "whenNotToUse": [
96
+ "One line. Use `Input`; a one-row textarea invites a newline the form does not want.",
97
+ "Code. A code editor needs a monospace gutter and its own key handling."
98
+ ],
99
+ "commonMistakes": [
100
+ "Setting a height in `className` instead of `rows`. It deliberately drops the fixed control height because a textarea's job is to be taller than one rung.",
101
+ "Enabling `resize` in both directions. It is `resize-y` on purpose — horizontal drag breaks the panel grid."
102
+ ],
91
103
  "specimens": [
92
104
  {
93
105
  "title": "Textarea",
@@ -99,6 +111,5 @@
99
111
  "note": "The same chassis, grown to a block.",
100
112
  "interaction": "same rim and ring as Input: one flush focus-colour ring, no outer halo."
101
113
  }
102
- ],
103
- "todo": true
114
+ ]
104
115
  }
@@ -140,9 +140,10 @@
140
140
  "--cue-surface-2",
141
141
  "--cue-text-emphasis",
142
142
  "--cue-text-label",
143
- "--cue-text-ui"
143
+ "--cue-text-ui",
144
+ "--cue-tracking-caps"
144
145
  ],
145
- "summary": "The floating theme configurator: the panel that edits the design system it is drawn with.",
146
+ "summary": "The floating panel that edits the design system it is drawn with.",
146
147
  "examples": [
147
148
  {
148
149
  "title": "Usage",
@@ -150,9 +151,18 @@
150
151
  "language": "tsx"
151
152
  }
152
153
  ],
153
- "status": "todo-docs",
154
+ "status": "stable",
154
155
  "url": "/docs/components/theme-configurator",
155
156
  "mdUrl": "/docs/components/theme-configurator.md",
156
157
  "jsonUrl": "/r/components/theme-configurator.json",
157
- "todo": true
158
+ "whenToUse": [
159
+ "Any app where a designer should retune the theme in place — mount it behind a flag.",
160
+ "Anywhere the output must be real: everything it does is a `--cue-*` declaration in one stylesheet."
161
+ ],
162
+ "whenNotToUse": [
163
+ "Production for end users. It is a design surface, not a settings page."
164
+ ],
165
+ "commonMistakes": [
166
+ "Treating it as a devtool bolted onto the kitchen sink. It is a component, and the rule that keeps it from being a toy is that it writes declarations rather than inline styles."
167
+ ]
158
168
  }
@@ -94,6 +94,19 @@
94
94
  ]
95
95
  }
96
96
  },
97
+ {
98
+ "name": "paint",
99
+ "type": "\"none\"",
100
+ "required": false,
101
+ "defaultValue": null,
102
+ "description": "A look pack for this subtree. Opt-in: a provider that names none stamps no\n`data-paint`, and a nested one inherits the pack stamped around it.",
103
+ "control": {
104
+ "kind": "enum",
105
+ "members": [
106
+ "none"
107
+ ]
108
+ }
109
+ },
97
110
  {
98
111
  "name": "fontScale",
99
112
  "type": "number",
@@ -149,7 +162,7 @@
149
162
  "type": "string",
150
163
  "required": false,
151
164
  "defaultValue": null,
152
- "description": "The Content-Security-Policy nonce for the density override layer.\n\nWhen `overrides.densities` is set this provider emits one `<style>`\nelement (see {@link ThemeProviderProps.overrides}). Under a policy of\n`style-src-elem 'self' 'nonce-<per-request>'` the browser refuses that\nelement on every page load, because an element React renders on the client\ncannot pick up a server nonce by itself. Pass the request's nonce here and\nit is set on the element.\n\nNothing else in this library emits a `<style>` element, and\n`prepaintScript()` returns a *string* the application renders in a\n`<script>` of its own — so the application already controls that element's\nnonce, and this prop is the whole of what a strict policy needs from here.\n\n**A nonce cannot rescue a style ATTRIBUTE**, and this provider always sets\none on its root: `color-scheme` and `--cue-font-scale`, plus the font\nfamilies and overrides where they are given. CSP has no nonce form for\n`style-src-attr` — it is `'unsafe-inline'` or `'none'` — so an application\nserving `style-src-attr 'none'` loses those declarations, silently. That is\na policy decision rather than something this prop can change.",
165
+ "description": "The Content-Security-Policy nonce for every `<style>` element this tree\nrenders — this library's and Base UI's.\n\nWhen `overrides.densities` is set this provider emits one `<style>`\nelement (see {@link ThemeProviderProps.overrides}). Under a policy of\n`style-src-elem 'self' 'nonce-<per-request>'` the browser refuses that\nelement on every page load, because an element React renders on the client\ncannot pick up a server nonce by itself. Pass the request's nonce here and\nit is set on the element.\n\nIt also reaches **Base UI**. Given a nonce, this provider renders\n`@base-ui/react`'s own `CSPProvider` around the tree, so the hoisted\n`<style>` that `ScrollAreaRoot` and `SelectPopup` emit carries it too.\nWithout that, a strict policy refuses it by content hash on every page\nrendering a Select, a Popover or a ScrollArea — and a consumer has no way\nto guess the remedy lives in a peer dependency's provider. An outer\n`CSPProvider` a consumer renders itself is left alone: no nonce here means\nno provider here, rather than one that overwrites theirs with `undefined`.\n\n`prepaintScript()` returns a *string* the application renders in a\n`<script>` of its own — so the application already controls that element's\nnonce, and between it and this prop a strict policy needs nothing else\nfrom here.\n\n**Pass this OR render your own `CSPProvider` — not both.** Base UI's\ncontext carries a second value beside the nonce, `disableStyleElements`,\nand its provider is the only public way to set either: the package exports\n`CSPProvider` and no hook, so a provider rendered here *replaces* an outer\none rather than extending it. Given a nonce this provider therefore sets\n`disableStyleElements` back to its default, and a consumer who had turned\nit on outside loses it silently — Base UI resumes emitting the very style\nelement they suppressed. An application already rendering its own\n`CSPProvider` needs nothing from this prop: leave it unset and the outer\ncontext survives untouched, which is the case\n`base-ui-nonce-outer-provider.test.tsx` pins.\n\n**A nonce cannot rescue a style ATTRIBUTE**, and this provider always sets\none on its root: `color-scheme` and `--cue-font-scale`, plus the font\nfamilies and overrides where they are given. CSP has no nonce form for\n`style-src-attr` — it is `'unsafe-inline'` or `'none'` — so an application\nserving `style-src-attr 'none'` loses those declarations, silently. That is\na policy decision rather than something this prop can change.",
153
166
  "control": {
154
167
  "kind": "string"
155
168
  }
@@ -49,10 +49,20 @@
49
49
  "language": "tsx"
50
50
  }
51
51
  ],
52
- "status": "todo-docs",
52
+ "status": "stable",
53
53
  "url": "/docs/components/thinking-indicator",
54
54
  "mdUrl": "/docs/components/thinking-indicator.md",
55
55
  "jsonUrl": "/r/components/thinking-indicator.json",
56
+ "whenToUse": [
57
+ "A short live label naming the current action, with an optional mono timer beside it."
58
+ ],
59
+ "whenNotToUse": [
60
+ "A line updated several times a second. Swapping `label` replays the entrance animation each time."
61
+ ],
62
+ "commonMistakes": [
63
+ "Rewriting `label` on every tick and wondering why it keeps re-animating — the entrance replays on the swap.",
64
+ "Passing a number to `elapsed`. It is pre-formatted text, and omitting it hides the timer."
65
+ ],
56
66
  "specimens": [
57
67
  {
58
68
  "title": "ThinkingIndicator",
@@ -64,6 +74,5 @@
64
74
  "note": "One line that says what is happening right now, with the elapsed clock beside it. The label is keyed, so replacing it re-runs the entrance and the change reads as a change rather than as a re-render.",
65
75
  "interaction": "none. It is a status line, not a control — the dot pulses and the label sweeps, and both stop for a reduced-motion reader."
66
76
  }
67
- ],
68
- "todo": true
77
+ ]
69
78
  }
@@ -67,10 +67,20 @@
67
67
  "language": "tsx"
68
68
  }
69
69
  ],
70
- "status": "todo-docs",
70
+ "status": "stable",
71
71
  "url": "/docs/components/thread-list",
72
72
  "mdUrl": "/docs/components/thread-list.md",
73
73
  "jsonUrl": "/r/components/thread-list.json",
74
+ "whenToUse": [
75
+ "A sidebar of conversations, each row carrying a title, a time and an optional unread mark."
76
+ ],
77
+ "whenNotToUse": [
78
+ "A history big enough to need searching or grouping. This takes a flat list and an index."
79
+ ],
80
+ "commonMistakes": [
81
+ "Clamping `activeIndex` defensively. An index outside the list selects nothing, which is how you render a list with no selection.",
82
+ "Passing `activeIndex` without `onActiveIndexChange` on a list meant to be clicked — the index alone only marks the row."
83
+ ],
74
84
  "specimens": [
75
85
  {
76
86
  "title": "ThreadList",
@@ -82,6 +92,5 @@
82
92
  "note": "Conversation history at its smallest: a title, how long ago, and an unread dot. The row's actions replace the timestamp on hover rather than sitting beside it, which is what keeps a 240px rail from becoming a toolbar — and the active row never shows an unread mark, because reading it is what cleared it.",
83
93
  "interaction": "the selected row carries `aria-current`; the rename and delete affordances appear on hover in the space the time was using, so nothing moves when they arrive."
84
94
  }
85
- ],
86
- "todo": true
95
+ ]
87
96
  }
@@ -88,10 +88,20 @@
88
88
  "language": "tsx"
89
89
  }
90
90
  ],
91
- "status": "todo-docs",
91
+ "status": "stable",
92
92
  "url": "/docs/components/thread-search",
93
93
  "mdUrl": "/docs/components/thread-search.md",
94
94
  "jsonUrl": "/r/components/thread-search.json",
95
+ "whenToUse": [
96
+ "A history surface with enough threads that finding one matters — pinned rows first, then grouped by when."
97
+ ],
98
+ "whenNotToUse": [
99
+ "A list you filter yourself. Filtering happens inside, matching title and preview together."
100
+ ],
101
+ "commonMistakes": [
102
+ "Passing pre-filtered `threads`. Pass all of them; `query` is the search text and the match runs over title and preview.",
103
+ "Confusing `activeId` with a search result. It is which thread is open, and `onSelect` reports the one just opened."
104
+ ],
95
105
  "specimens": [
96
106
  {
97
107
  "title": "ThreadSearch",
@@ -103,6 +113,5 @@
103
113
  "note": "History you can actually get back into: pinned first, then grouped by when. Filtering matches the title and the preview together, so a thread found by something said inside it still shows the line that found it. The pinned section is a lift out of the date groups rather than a copy — a pinned thread appears once.",
104
114
  "interaction": "arrows walk the flattened order across group boundaries, which is the order the eye reads rather than the order the data is in."
105
115
  }
106
- ],
107
- "todo": true
116
+ ]
108
117
  }
@@ -203,10 +203,21 @@
203
203
  "language": "tsx"
204
204
  }
205
205
  ],
206
- "status": "todo-docs",
206
+ "status": "stable",
207
207
  "url": "/docs/components/threshold-rail",
208
208
  "mdUrl": "/docs/components/threshold-rail.md",
209
209
  "jsonUrl": "/r/components/threshold-rail.json",
210
+ "whenToUse": [
211
+ "Any threshold chosen *relative to a signal* — this is the one control where the level, the peak-hold needle and the trigger point are visible at once.",
212
+ "A band rather than a point: `lower` gives the second handle, and `minGap` keeps them apart."
213
+ ],
214
+ "whenNotToUse": [
215
+ "A number with no signal behind it. A `NumberField` holds it perfectly well."
216
+ ],
217
+ "commonMistakes": [
218
+ "Writing every drag to the model. Use `onCommit` for the settled value, the way `Slider` splits change from commit.",
219
+ "Rebuilding it per panel. It exists because three near-identical threshold editors did."
220
+ ],
210
221
  "specimens": [
211
222
  {
212
223
  "title": "ThresholdRail",
@@ -218,6 +229,5 @@
218
229
  "note": "A dual-handle rail with tone zones below and above, a level bar and a peak-hold needle.",
219
230
  "interaction": "each handle is a slider with its own name; both scale up while dragging, and `onCommit` fires once on release."
220
231
  }
221
- ],
222
- "todo": true
232
+ ]
223
233
  }
@@ -38,7 +38,8 @@
38
38
  "tokensUsed": [
39
39
  "--cue-accent",
40
40
  "--cue-border",
41
- "--cue-fg-subtle"
41
+ "--cue-fg-subtle",
42
+ "--cue-tracking-caps"
42
43
  ],
43
44
  "summary": "The rule that says the day changed: a label centred between two hairlines.",
44
45
  "examples": [
@@ -48,10 +49,21 @@
48
49
  "language": "tsx"
49
50
  }
50
51
  ],
51
- "status": "todo-docs",
52
+ "status": "stable",
52
53
  "url": "/docs/components/time-boundary",
53
54
  "mdUrl": "/docs/components/time-boundary.md",
54
55
  "jsonUrl": "/r/components/time-boundary.json",
56
+ "whenToUse": [
57
+ "A transcript assembled from a row union, where the boundary has to be a member of that union — one row, placed by the caller."
58
+ ],
59
+ "whenNotToUse": [
60
+ "A message list you want to insert its own rules into. That is `DaySeparator`, which takes the whole list and places the rules itself."
61
+ ],
62
+ "commonMistakes": [
63
+ "Expecting date arithmetic. `label` is pre-formatted — `Today`, `Yesterday`, `14 March` — because this family owns no locale.",
64
+ "Skipping `dateTime`. It renders the label inside a `time` element, which is what lets a test, a scraper or a deep link find the boundary without parsing the words a human reads.",
65
+ "Worrying that the label will be read twice. It is a `role=\"separator\"` carrying the label as its accessible name, with the visible text `aria-hidden`."
66
+ ],
55
67
  "specimens": [
56
68
  {
57
69
  "title": "TimeBoundary",
@@ -63,6 +75,5 @@
63
75
  "note": "One row, placed by the caller — which is the difference between this and DaySeparator, which takes a whole message list and inserts its own. A transcript assembled from a row union needs the boundary as a member of that union. It is a role=separator carrying its label as its name, with the text inside aria-hidden so a reader hears 'Today' once rather than twice, and the caller pre-formats the words because this family owns no locale.",
64
76
  "interaction": "none. It is a rule with a word on it, and nothing here takes focus."
65
77
  }
66
- ],
67
- "todo": true
78
+ ]
68
79
  }
@@ -65,7 +65,7 @@
65
65
  "--cue-text-label",
66
66
  "--cue-text-ui"
67
67
  ],
68
- "summary": "A typed time of day, segment by segment.",
68
+ "summary": "A typed time of day, segment by segment — the sibling of `DateField`.",
69
69
  "examples": [
70
70
  {
71
71
  "title": "Usage",
@@ -73,10 +73,22 @@
73
73
  "language": "tsx"
74
74
  }
75
75
  ],
76
- "status": "todo-docs",
76
+ "status": "stable",
77
77
  "url": "/docs/components/time-field",
78
78
  "mdUrl": "/docs/components/time-field.md",
79
79
  "jsonUrl": "/r/components/time-field.json",
80
+ "whenToUse": [
81
+ "The half of a schedule a calendar cannot express.",
82
+ "A control room: pass `hourCycle={24}` for a show clock, so the AM/PM segment is not one more thing to tab through."
83
+ ],
84
+ "whenNotToUse": [
85
+ "A date. Use `DateField`.",
86
+ "A duration. A time of day and a length are different quantities."
87
+ ],
88
+ "commonMistakes": [
89
+ "Passing a string. Values are `@internationalized/date` `Time` objects.",
90
+ "Leaving the 12-hour cycle in a 24-hour room, which adds a segment nobody there reads."
91
+ ],
80
92
  "specimens": [
81
93
  {
82
94
  "title": "TimeField",
@@ -88,6 +100,5 @@
88
100
  "note": "The same field, for a clock time. Granularity decides how many segments there are.",
89
101
  "interaction": "same segment stepping; 24-hour or 12-hour follows the locale, not a prop."
90
102
  }
91
- ],
92
- "todo": true
103
+ ]
93
104
  }
@@ -158,10 +158,21 @@
158
158
  "language": "tsx"
159
159
  }
160
160
  ],
161
- "status": "todo-docs",
161
+ "status": "stable",
162
162
  "url": "/docs/components/timeline-ruler",
163
163
  "mdUrl": "/docs/components/timeline-ruler.md",
164
164
  "jsonUrl": "/r/components/timeline-ruler.json",
165
+ "whenToUse": [
166
+ "Above any arrangement or timeline the user scrolls and zooms.",
167
+ "Anywhere the tick density must stay readable across zoom levels — `targetPx` is the spacing it aims for."
168
+ ],
169
+ "whenNotToUse": [
170
+ "A fixed, short timeline. Ticks you can hard-code need no ladder."
171
+ ],
172
+ "commonMistakes": [
173
+ "Multiplying the chosen interval after picking it from the ladder, which is what made the original four times sparser than the spacing it aimed for.",
174
+ "Setting the cull margin in beats. At a tight zoom fifty beats is an enormous overdraw — `bufferPx` is in pixels for that reason."
175
+ ],
165
176
  "specimens": [
166
177
  {
167
178
  "title": "TimelineRuler",
@@ -173,6 +184,5 @@
173
184
  "note": "Zoom-adaptive tick density, targeting roughly one tick per centimetre. The interval choice is a pure exported function, so it can be tested without a DOM.",
174
185
  "interaction": "none itself; it is the coordinate system a track editor draws under. `pxPerBeat` stays in pixels on purpose."
175
186
  }
176
- ],
177
- "todo": true
187
+ ]
178
188
  }