@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
@@ -104,9 +104,10 @@
104
104
  "--cue-space-4",
105
105
  "--cue-text-label",
106
106
  "--cue-text-micro",
107
- "--cue-text-ui"
107
+ "--cue-text-ui",
108
+ "--cue-tracking-caps"
108
109
  ],
109
- "summary": "The \"advanced\" idiom: a chromeless `▸ advanced` toggle over the fields most users never touch.",
110
+ "summary": "The 'advanced' idiom: a chromeless `▸ advanced` toggle over the fields most users never touch.",
110
111
  "examples": [
111
112
  {
112
113
  "title": "Usage",
@@ -114,10 +115,22 @@
114
115
  "language": "tsx"
115
116
  }
116
117
  ],
117
- "status": "todo-docs",
118
+ "status": "stable",
118
119
  "url": "/docs/components/disclosure",
119
120
  "mdUrl": "/docs/components/disclosure.md",
120
121
  "jsonUrl": "/r/components/disclosure.json",
122
+ "whenToUse": [
123
+ "Optional fields inside a form — the ones that matter to a few people and would otherwise lengthen the page for everyone.",
124
+ "Anywhere the toggle should read as an annotation on the form rather than a division of it."
125
+ ],
126
+ "whenNotToUse": [
127
+ "A section that peers with the sections around it. Use `Collapsible`.",
128
+ "Content the user is expected to read. Progressive disclosure hides it; if it matters, show it."
129
+ ],
130
+ "commonMistakes": [
131
+ "Reaching for `Collapsible` instead. It is deliberately not one: giving these fields a summary row that looks like a section header is what makes forms read as twice as long as they are.",
132
+ "Dressing it up with a rim or a fill. It is drawn as quietly as the system can draw anything — one triangle and micro caption ink."
133
+ ],
121
134
  "specimens": [
122
135
  {
123
136
  "title": "Disclosure",
@@ -129,6 +142,5 @@
129
142
  "note": "The `advanced` idiom: a chromeless mono `▸ label` toggle for the settings most people never open.",
130
143
  "interaction": "the caret rotates; nothing else moves."
131
144
  }
132
- ],
133
- "todo": true
145
+ ]
134
146
  }
@@ -77,7 +77,8 @@
77
77
  "--cue-text-emphasis",
78
78
  "--cue-text-label",
79
79
  "--cue-text-micro",
80
- "--cue-text-ui"
80
+ "--cue-text-ui",
81
+ "--cue-tracking-caps"
81
82
  ],
82
83
  "summary": "The whole universe as one strip: 512 columns, black at 0, white at 255.",
83
84
  "examples": [
@@ -87,10 +88,20 @@
87
88
  "language": "tsx"
88
89
  }
89
90
  ],
90
- "status": "todo-docs",
91
+ "status": "stable",
91
92
  "url": "/docs/components/dmx-bar",
92
93
  "mdUrl": "/docs/components/dmx-bar.md",
93
94
  "jsonUrl": "/r/components/dmx-bar.json",
95
+ "whenToUse": [
96
+ "A live universe readout that must stay cheap enough to leave running at wire rate.",
97
+ "Under a node in a routing graph, where the shape of the output is the reading."
98
+ ],
99
+ "whenNotToUse": [
100
+ "Per-channel inspection. Use `ChannelMatrix`."
101
+ ],
102
+ "commonMistakes": [
103
+ "Re-rendering it from React state per frame. The whole design is about what happens *between* frames."
104
+ ],
94
105
  "specimens": [
95
106
  {
96
107
  "title": "DmxBar",
@@ -102,6 +113,5 @@
102
113
  "note": "The whole universe as one 512×1 texture, scaled up with `image-rendering: pixelated` on a true-black ground. Interpolating between two channels would draw levels nobody sent.",
103
114
  "interaction": "hovering reports `CH n · v` through a portaled readout, positioned by percentage so it survives a scaled container; the number is written to a span through a ref rather than re-rendering at 40 Hz."
104
115
  }
105
- ],
106
- "todo": true
116
+ ]
107
117
  }
@@ -87,7 +87,8 @@
87
87
  "--cue-text-emphasis",
88
88
  "--cue-text-label",
89
89
  "--cue-text-micro",
90
- "--cue-text-ui"
90
+ "--cue-text-ui",
91
+ "--cue-tracking-caps"
91
92
  ],
92
93
  "summary": "`DmxBar`'s picture with no console behind it — a lighting rig, simulated.",
93
94
  "examples": [
@@ -97,10 +98,19 @@
97
98
  "language": "tsx"
98
99
  }
99
100
  ],
100
- "status": "todo-docs",
101
+ "status": "stable",
101
102
  "url": "/docs/components/dmx-strip",
102
103
  "mdUrl": "/docs/components/dmx-strip.md",
103
104
  "jsonUrl": "/r/components/dmx-strip.json",
105
+ "whenToUse": [
106
+ "Marketing and docs, where the device should look alive without a wire behind it."
107
+ ],
108
+ "whenNotToUse": [
109
+ "Real output. Use `DmxBar`, which draws actual channel data."
110
+ ],
111
+ "commonMistakes": [
112
+ "Presenting it as live data. It is a model of a plausible rig — the same canvas the bridge uses, driven by a simulation."
113
+ ],
104
114
  "specimens": [
105
115
  {
106
116
  "title": "DmxStrip",
@@ -112,6 +122,5 @@
112
122
  "note": "A seeded fixture simulation: mulberry32 from the `seed` prop, so the same seed draws the same rig every time. Values ramp rather than jump.",
113
123
  "interaction": "the readout updates through a ref; under prefers-reduced-motion the strip paints one static frame instead of animating."
114
124
  }
115
- ],
116
- "todo": true
125
+ ]
117
126
  }
@@ -88,10 +88,21 @@
88
88
  "language": "tsx"
89
89
  }
90
90
  ],
91
- "status": "todo-docs",
91
+ "status": "stable",
92
92
  "url": "/docs/components/document-reference",
93
93
  "mdUrl": "/docs/components/document-reference.md",
94
94
  "jsonUrl": "/r/components/document-reference.json",
95
+ "whenToUse": [
96
+ "Showing which passages of a source the answer drew on, each pinned to a page.",
97
+ "Sending the reader to the page an anchor sits on, through `onJump`."
98
+ ],
99
+ "whenNotToUse": [
100
+ "A source with no page structure. `pages` and per-page anchors are the shape of the element."
101
+ ],
102
+ "commonMistakes": [
103
+ "Assuming every page highlights something. A page with no anchor highlights nothing.",
104
+ "Expecting `onJump` to move `activePage` for you. It reports the page to open; the state stays yours."
105
+ ],
95
106
  "specimens": [
96
107
  {
97
108
  "title": "DocumentReference",
@@ -103,6 +114,5 @@
103
114
  "note": "One document the answer leans on, with the passages it quoted and the page each is on. Several anchors can cite one page — two of these are both page 31 — so the current one is marked by `aria-current` rather than by matching the number, which is what stops the wrong row lighting up.",
104
115
  "interaction": "every quote is a button that reports its page to `onJump`; the active row takes the recessed field ground, the others only on hover."
105
116
  }
106
- ],
107
- "todo": true
117
+ ]
108
118
  }
@@ -76,10 +76,21 @@
76
76
  "language": "tsx"
77
77
  }
78
78
  ],
79
- "status": "todo-docs",
79
+ "status": "stable",
80
80
  "url": "/docs/components/draft-restore",
81
81
  "mdUrl": "/docs/components/draft-restore.md",
82
82
  "jsonUrl": "/r/components/draft-restore.json",
83
+ "whenToUse": [
84
+ "Returning to a thread that has unsent composer text saved against it.",
85
+ "A one-line preview of that text with when it was last touched beside it."
86
+ ],
87
+ "whenNotToUse": [
88
+ "A long draft you want shown in full. `draft` is truncated to one line."
89
+ ],
90
+ "commonMistakes": [
91
+ "Passing a timestamp to `savedAt`. It is printed as given, so pre-format it.",
92
+ "Wiring only `onRestore`. Without `onDiscard` the prompt has no way to go away for good."
93
+ ],
83
94
  "specimens": [
84
95
  {
85
96
  "title": "DraftRestore",
@@ -91,6 +102,5 @@
91
102
  "note": "Come back to a thread and the sentence you never sent is still sitting there. One line of what it was, when it was saved, and the two answers anybody ever has for it. `savedAt` is pre-formatted like every other time in this family — the element does no date maths, so a server-rendered draft and a client-rendered one cannot disagree.",
92
103
  "interaction": "restore is a worded button and discard is a labelled icon (`Discard the draft`): the destructive one is the one that has to be aimed at."
93
104
  }
94
- ],
95
- "todo": true
105
+ ]
96
106
  }
@@ -174,9 +174,10 @@
174
174
  "--cue-surface-2",
175
175
  "--cue-text-emphasis",
176
176
  "--cue-text-label",
177
- "--cue-text-ui"
177
+ "--cue-text-ui",
178
+ "--cue-tracking-caps"
178
179
  ],
179
- "summary": "A swipe-dismissable edge panel — the touch-first cousin of {@link Sheet }.",
180
+ "summary": "A swipe-dismissable edge panel — the touch-first cousin of `Sheet`.",
180
181
  "examples": [
181
182
  {
182
183
  "title": "Usage",
@@ -184,10 +185,20 @@
184
185
  "language": "tsx"
185
186
  }
186
187
  ],
187
- "status": "todo-docs",
188
+ "status": "stable",
188
189
  "url": "/docs/components/drawer",
189
190
  "mdUrl": "/docs/components/drawer.md",
190
191
  "jsonUrl": "/r/components/drawer.json",
192
+ "whenToUse": [
193
+ "Touch surfaces, where dragging a panel away is the natural dismissal.",
194
+ "Stacked panels: nested-drawer stacking comes from the primitive."
195
+ ],
196
+ "whenNotToUse": [
197
+ "Pointer-first consoles. Use `Sheet`."
198
+ ],
199
+ "commonMistakes": [
200
+ "Setting the edge and the gesture separately. `swipeDirection` picks both together on purpose, so a drawer can never be dragged in a direction that does not dismiss it."
201
+ ],
191
202
  "specimens": [
192
203
  {
193
204
  "title": "Drawer",
@@ -199,6 +210,5 @@
199
210
  "note": "The touch-first sheet: a grab handle and a swipe direction.",
200
211
  "interaction": "drag the handle to dismiss; on a pointer device it behaves as an ordinary sheet."
201
212
  }
202
- ],
203
- "todo": true
213
+ ]
204
214
  }
@@ -233,7 +233,8 @@
233
233
  "--cue-surface-2",
234
234
  "--cue-text-emphasis",
235
235
  "--cue-text-label",
236
- "--cue-text-ui"
236
+ "--cue-text-ui",
237
+ "--cue-tracking-caps"
237
238
  ],
238
239
  "summary": "A command list hung off a button.",
239
240
  "examples": [
@@ -111,10 +111,21 @@
111
111
  "language": "tsx"
112
112
  }
113
113
  ],
114
- "status": "todo-docs",
114
+ "status": "stable",
115
115
  "url": "/docs/components/edit-message",
116
116
  "mdUrl": "/docs/components/edit-message.md",
117
117
  "jsonUrl": "/r/components/edit-message.json",
118
+ "whenToUse": [
119
+ "Editing a message already in the transcript, where the cost — the replies after it — should be stated before sending.",
120
+ "A turn that reads as a plain bubble until it is clicked, with `onStartEdit` opening the composer."
121
+ ],
122
+ "whenNotToUse": [
123
+ "Composing a new message. This swaps between a resting bubble and an edit composer for a turn that already exists."
124
+ ],
125
+ "commonMistakes": [
126
+ "Expecting `onCancel` to put the old text back. Restore the original yourself.",
127
+ "Passing `discardedReplies={0}` while replies exist. The warning hides at zero, which silently removes the one thing the element is for."
128
+ ],
118
129
  "specimens": [
119
130
  {
120
131
  "title": "EditMessage",
@@ -126,6 +137,5 @@
126
137
  "note": "Rewriting a turn you already sent, told up front what it throws away. The count is the point: editing the third message of a thread discards everything after it, and a control that hid that would be a data-loss trap wearing a pencil icon.",
127
138
  "interaction": "resting, the whole bubble is the button that starts an edit. Editing, the textarea is labelled and takes cue's focus ring; Send leads and Cancel is a ghost."
128
139
  }
129
- ],
130
- "todo": true
140
+ ]
131
141
  }
@@ -102,10 +102,21 @@
102
102
  "language": "tsx"
103
103
  }
104
104
  ],
105
- "status": "todo-docs",
105
+ "status": "stable",
106
106
  "url": "/docs/components/elements-command-palette",
107
107
  "mdUrl": "/docs/components/elements-command-palette.md",
108
108
  "jsonUrl": "/r/components/elements-command-palette.json",
109
+ "whenToUse": [
110
+ "A keystroke-away list of every runnable command in the app.",
111
+ "A list where the arrow keys and Enter should already work, because the element owns the key handling."
112
+ ],
113
+ "whenNotToUse": [
114
+ "A menu whose grouping you want to control. Groups are derived from the entries and keep first-seen order."
115
+ ],
116
+ "commonMistakes": [
117
+ "Adding your own arrow-key and Enter handling. The element owns the key handling and reports where it landed through `onActiveChange`.",
118
+ "Treating `activeId` as the element's own state. It stays yours to hold; the element only reports the move."
119
+ ],
109
120
  "specimens": [
110
121
  {
111
122
  "title": "ElementsCommandPalette",
@@ -117,6 +128,5 @@
117
128
  "note": "Everything the console can do, one keystroke away and grouped by where it acts. The element owns the arrow keys and reports where they landed, so the highlighted row stays the caller's state — and `aria-activedescendant` moves the highlight without moving focus, which is what keeps typing and walking the list the same gesture. Groups are derived from the commands and keep first-seen order, so the palette cannot be re-ordered by accident.",
118
129
  "interaction": "the input is a combobox over a listbox; arrows walk, Enter runs, and a query that filters the active row out drops the descendant reference rather than pointing at nothing."
119
130
  }
120
- ],
121
- "todo": true
131
+ ]
122
132
  }
@@ -45,10 +45,21 @@
45
45
  "language": "tsx"
46
46
  }
47
47
  ],
48
- "status": "todo-docs",
48
+ "status": "stable",
49
49
  "url": "/docs/components/elements-composer",
50
50
  "mdUrl": "/docs/components/elements-composer.md",
51
51
  "jsonUrl": "/r/components/elements-composer.json",
52
+ "whenToUse": [
53
+ "A full message input that needs attachments, slash commands, mentions, a model picker, voice and context usage together.",
54
+ "A composer that has to show how much of the context window is gone alongside the input itself."
55
+ ],
56
+ "whenNotToUse": [
57
+ "A screen that only needs the shape of a composer rather than a working one."
58
+ ],
59
+ "commonMistakes": [
60
+ "Putting `ComposerInput` outside `ComposerBar`. The bar is the surface the input, the attachments and the toolbar sit on.",
61
+ "Hanging controls straight off `ComposerToolbar`. They go in `ComposerActions` clusters, one at each end."
62
+ ],
52
63
  "specimens": [
53
64
  {
54
65
  "title": "ElementsComposer / ComposerBar / ComposerInput / ComposerToolbar",
@@ -66,6 +77,5 @@
66
77
  "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.",
67
78
  "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."
68
79
  }
69
- ],
70
- "todo": true
80
+ ]
71
81
  }
@@ -55,10 +55,19 @@
55
55
  "language": "tsx"
56
56
  }
57
57
  ],
58
- "status": "todo-docs",
58
+ "status": "stable",
59
59
  "url": "/docs/components/elements-data-table",
60
60
  "mdUrl": "/docs/components/elements-data-table.md",
61
61
  "jsonUrl": "/r/components/elements-data-table.json",
62
+ "whenToUse": [
63
+ "A short comparison the model produced as part of an answer — model name, context window and cost."
64
+ ],
65
+ "whenNotToUse": [
66
+ "A sortable, paginated dataset. `rows` is a small `ModelUsage[]` shaped for an answer."
67
+ ],
68
+ "commonMistakes": [
69
+ "Holding `cycle` constant and expecting the row entrance to replay. It is an identity key that remounts the body."
70
+ ],
62
71
  "specimens": [
63
72
  {
64
73
  "title": "ElementsDataTable",
@@ -70,6 +79,5 @@
70
79
  "note": "A small table the model can answer with directly — three columns, no sorting, no virtualisation, no header menu. It is `ElementsDataTable` because the package already sells a real one at `@cueplusplus/ui/instruments`: that one is a data grid, this one is a paragraph shaped like a grid, and the rename keeps a consumer from reaching for the wrong one.",
71
80
  "interaction": "none. `cycle` remounts the body, so a new answer's rows stagger in rather than mutating in place."
72
81
  }
73
- ],
74
- "todo": true
82
+ ]
75
83
  }
@@ -57,10 +57,21 @@
57
57
  "language": "tsx"
58
58
  }
59
59
  ],
60
- "status": "todo-docs",
60
+ "status": "stable",
61
61
  "url": "/docs/components/elements-timeline",
62
62
  "mdUrl": "/docs/components/elements-timeline.md",
63
63
  "jsonUrl": "/r/components/elements-timeline.json",
64
+ "whenToUse": [
65
+ "Past and scheduled events shown together on one axis.",
66
+ "A run where the scheduled events should be visible before they resolve, with `visibleCount` moving as they do."
67
+ ],
68
+ "whenNotToUse": [
69
+ "Work that branches and rejoins rather than running along a single axis."
70
+ ],
71
+ "commonMistakes": [
72
+ "Passing only the resolved events. `events` holds past and scheduled together, and `visibleCount` says how many have resolved.",
73
+ "Ordering by resolution rather than chronologically. The events are expected in chronological order."
74
+ ],
64
75
  "specimens": [
65
76
  {
66
77
  "title": "ElementsTimeline",
@@ -72,6 +83,5 @@
72
83
  "note": "Events on one axis, with what already happened and what is still coming in the same list — `past`, `now` and `future` are one union, so a schedule and a history are the same component. It publishes as `ElementsTimeline` because cue already sells a `Timeline`; the spec asked for `ToolTimeline`, which turned out to be the next bench's name.",
73
84
  "interaction": "none. The now marker is the only one that pulses, and it holds still for a reader who asked for less motion."
74
85
  }
75
- ],
76
- "todo": true
86
+ ]
77
87
  }
@@ -110,10 +110,21 @@
110
110
  "language": "tsx"
111
111
  }
112
112
  ],
113
- "status": "todo-docs",
113
+ "status": "stable",
114
114
  "url": "/docs/components/elicitation-form",
115
115
  "mdUrl": "/docs/components/elicitation-form.md",
116
116
  "jsonUrl": "/r/components/elicitation-form.json",
117
+ "whenToUse": [
118
+ "A server that stopped part-way through a tool call and needs fields filled before it can continue."
119
+ ],
120
+ "whenNotToUse": [
121
+ "A form of your own design. `fields` is the schema the server sent, already resolved to display values.",
122
+ "A request for permission to run something rather than for data."
123
+ ],
124
+ "commonMistakes": [
125
+ "Leaving `state=\"request\"` after the user answered. Accepted and declined swap the action row for the outcome.",
126
+ "Rewriting `message` in your own voice. It is why the input is needed, in the server's words."
127
+ ],
117
128
  "specimens": [
118
129
  {
119
130
  "title": "ElicitationForm",
@@ -125,6 +136,5 @@
125
136
  "note": "A server pausing mid-tool-call to ask for the fields it still needs — MCP's elicitation, drawn. The fields arrive already resolved to display values, so the element renders a schema without ever having parsed one, and `state` swaps the two buttons for the outcome the moment the user answers. Declining is a first-class answer here, not a dismissal.",
126
137
  "interaction": "each field's control is chosen by its `kind` — a value chip, a row of options, or a switch — and the required ones are marked on the label rather than announced only on failure."
127
138
  }
128
- ],
129
- "todo": true
139
+ ]
130
140
  }
@@ -47,10 +47,19 @@
47
47
  ],
48
48
  "summary": "A composer-shaped invitation under the suggestions.",
49
49
  "examples": [],
50
- "status": "todo-docs",
50
+ "status": "stable",
51
51
  "url": "/docs/components/empty-state-composer",
52
52
  "mdUrl": "/docs/components/empty-state-composer.md",
53
53
  "jsonUrl": "/r/components/empty-state-composer.json",
54
+ "whenToUse": [
55
+ "The blank-thread screen whose real composer lives somewhere else."
56
+ ],
57
+ "whenNotToUse": [
58
+ "A working input. It is a display rather than one — `placeholder` is a string and send takes a handler."
59
+ ],
60
+ "commonMistakes": [
61
+ "Omitting `onSend` and expecting a live control. Without a handler the send control renders disabled."
62
+ ],
54
63
  "specimens": [
55
64
  {
56
65
  "title": "ChatEmptyState",
@@ -66,6 +75,5 @@
66
75
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
67
76
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
68
77
  }
69
- ],
70
- "todo": true
78
+ ]
71
79
  }
@@ -25,10 +25,19 @@
25
25
  ],
26
26
  "summary": "The one line at the top of a blank thread.",
27
27
  "examples": [],
28
- "status": "todo-docs",
28
+ "status": "stable",
29
29
  "url": "/docs/components/empty-state-greeting",
30
30
  "mdUrl": "/docs/components/empty-state-greeting.md",
31
31
  "jsonUrl": "/r/components/empty-state-greeting.json",
32
+ "whenToUse": [
33
+ "The single opening line on an empty thread."
34
+ ],
35
+ "whenNotToUse": [
36
+ "A second line of copy beneath it. This is the one a screen reader lands on."
37
+ ],
38
+ "commonMistakes": [
39
+ "Wrapping it in a heading of your own, which nests a heading inside a heading."
40
+ ],
32
41
  "specimens": [
33
42
  {
34
43
  "title": "ChatEmptyState",
@@ -44,6 +53,5 @@
44
53
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
45
54
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
46
55
  }
47
- ],
48
- "todo": true
56
+ ]
49
57
  }
@@ -36,10 +36,19 @@
36
36
  ],
37
37
  "summary": "One thing worth asking, as a pill.",
38
38
  "examples": [],
39
- "status": "todo-docs",
39
+ "status": "stable",
40
40
  "url": "/docs/components/empty-state-suggestion",
41
41
  "mdUrl": "/docs/components/empty-state-suggestion.md",
42
42
  "jsonUrl": "/r/components/empty-state-suggestion.json",
43
+ "whenToUse": [
44
+ "Each starter prompt offered on a blank thread."
45
+ ],
46
+ "whenNotToUse": [
47
+ "A standing control. It is a suggestion pill for the blank-thread screen."
48
+ ],
49
+ "commonMistakes": [
50
+ "Omitting `index`. It staggers the entrance so the pills arrive left to right rather than all at once."
51
+ ],
43
52
  "specimens": [
44
53
  {
45
54
  "title": "ChatEmptyState",
@@ -55,6 +64,5 @@
55
64
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
56
65
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
57
66
  }
58
- ],
59
- "todo": true
67
+ ]
60
68
  }
@@ -25,10 +25,19 @@
25
25
  ],
26
26
  "summary": "The row the suggestion pills wrap in.",
27
27
  "examples": [],
28
- "status": "todo-docs",
28
+ "status": "stable",
29
29
  "url": "/docs/components/empty-state-suggestions",
30
30
  "mdUrl": "/docs/components/empty-state-suggestions.md",
31
31
  "jsonUrl": "/r/components/empty-state-suggestions.json",
32
+ "whenToUse": [
33
+ "Holding the suggestion pills so they wrap as one row."
34
+ ],
35
+ "whenNotToUse": [
36
+ "Anything other than the suggestion pills."
37
+ ],
38
+ "commonMistakes": [
39
+ "Laying the pills out with a flex row of your own, which drops the wrapping the element already provides."
40
+ ],
32
41
  "specimens": [
33
42
  {
34
43
  "title": "ChatEmptyState",
@@ -44,6 +53,5 @@
44
53
  "note": "The first screen, composed rather than configured: a greeting, some ways in, and a composer-shaped invitation. `EmptyStateComposer` is a display and not a working input — the placeholder is a string and send takes a handler — for the screen whose real composer is somewhere else. The suggestions stagger their entrance from `index`, so the row arrives left to right instead of all at once. Named `ChatEmptyState` because cue already publishes a layout `EmptyState`.",
45
54
  "interaction": "each suggestion is a button with cue's focus ring; the greeting is an `h2`, so a screen reader lands on the sentence rather than the pills."
46
55
  }
47
- ],
48
- "todo": true
56
+ ]
49
57
  }
@@ -83,7 +83,7 @@
83
83
  "--cue-text-emphasis",
84
84
  "--cue-text-ui"
85
85
  ],
86
- "summary": "The \"there is nothing here\" panel body.",
86
+ "summary": "The 'there is nothing here' panel body — a report, not an alarm.",
87
87
  "examples": [
88
88
  {
89
89
  "title": "Usage",
@@ -91,10 +91,22 @@
91
91
  "language": "tsx"
92
92
  }
93
93
  ],
94
- "status": "todo-docs",
94
+ "status": "stable",
95
95
  "url": "/docs/components/empty-state",
96
96
  "mdUrl": "/docs/components/empty-state.md",
97
97
  "jsonUrl": "/r/components/empty-state.json",
98
+ "whenToUse": [
99
+ "A list, table or panel with no rows, where the reader needs to know why and what to do next.",
100
+ "Anywhere an action would help: `action` is the slot for the one thing that fills the emptiness."
101
+ ],
102
+ "whenNotToUse": [
103
+ "An error. Emptiness is a state; a failure needs its own tone and a way to retry.",
104
+ "Loading. Use `Skeleton` or `Spinner` — an empty state says nothing is coming."
105
+ ],
106
+ "commonMistakes": [
107
+ "Colouring it to draw attention. It uses the muted ramp throughout and takes its emphasis from position; an alarming empty state reports a problem that is not there.",
108
+ "Putting the meaning in the icon. The icon is decorative — the title carries it, so a screen reader hears one sentence instead of a shrug."
109
+ ],
98
110
  "specimens": [
99
111
  {
100
112
  "title": "EmptyState",
@@ -106,6 +118,5 @@
106
118
  "note": "The standard empty copy, from lib/samples.tsx. Same words everywhere in the app.",
107
119
  "interaction": "the action is an ordinary Button and behaves like one."
108
120
  }
109
- ],
110
- "todo": true
121
+ ]
111
122
  }
@@ -69,10 +69,22 @@
69
69
  "language": "tsx"
70
70
  }
71
71
  ],
72
- "status": "todo-docs",
72
+ "status": "stable",
73
73
  "url": "/docs/components/end-of-turn-summary",
74
74
  "mdUrl": "/docs/components/end-of-turn-summary.md",
75
75
  "jsonUrl": "/r/components/end-of-turn-summary.json",
76
+ "whenToUse": [
77
+ "The closing line of a turn, saying what it came to.",
78
+ "A turn whose result is not a diff at all, using `label` to replace the built line: `2 cues written`, `Nothing to change`."
79
+ ],
80
+ "whenNotToUse": [
81
+ "Anywhere you want review, keep or reject buttons. It is a rollup, not a control — those belong to a bar above the composer that acts on the whole run.",
82
+ "A turn that read files and wrote nothing but which you want reported as two zeroes. It says `No files changed` and stops."
83
+ ],
84
+ "commonMistakes": [
85
+ "Adding per-turn action buttons beside it. A per-turn row with those buttons on it is a row that can be pressed after the next turn has already changed the same files.",
86
+ "Passing `additions={0}` and `deletions={0}` to force the counts out. The counts are drawn only when there are some."
87
+ ],
76
88
  "specimens": [
77
89
  {
78
90
  "title": "EndOfTurnSummary",
@@ -84,6 +96,5 @@
84
96
  "note": "What the turn came to, in one line. A rollup and not a control: review, keep and reject act on the whole run and belong above the composer, where they cannot be pressed after the next turn has already changed the same files. The + and − are CodeDiff's glyphs, so one transcript never shows two conventions for the same number, and a turn that changed nothing says so instead of saying it with two zeroes.",
85
97
  "interaction": "none. It is a sentence with two tinted numbers in it."
86
98
  }
87
- ],
88
- "todo": true
99
+ ]
89
100
  }