@cueplusplus/ui 0.8.0 → 0.10.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 +457 -0
  2. package/README.md +131 -0
  3. package/dist/chat/message-list.js +2 -1
  4. package/dist/configurator/_export.d.ts +1 -1
  5. package/dist/configurator/_export.js +53 -13
  6. package/dist/configurator/_overrides.d.ts +25 -6
  7. package/dist/configurator/_overrides.js +30 -17
  8. package/dist/configurator/configurator.js +8 -3
  9. package/dist/configurator/panel-sections.js +43 -13
  10. package/dist/elements/command-palette.js +1 -1
  11. package/dist/elements/flow-graph.js +2 -2
  12. package/dist/elements/markdown.js +1 -1
  13. package/dist/elements/surfaces.js +4 -3
  14. package/dist/index.d.ts +7 -3
  15. package/dist/index.js +5 -2
  16. package/dist/instruments/meter.d.ts +5 -1
  17. package/dist/layout/bento.d.ts +144 -0
  18. package/dist/layout/bento.js +266 -0
  19. package/dist/layout/index.d.ts +3 -2
  20. package/dist/layout/index.js +3 -2
  21. package/dist/midi/piano-keyboard.js +5 -1
  22. package/dist/primitives/button.d.ts +12 -0
  23. package/dist/styles.css +23 -1
  24. package/dist/system/density.d.ts +17 -8
  25. package/dist/system/density.js +39 -16
  26. package/dist/system/index.d.ts +5 -2
  27. package/dist/system/index.js +3 -1
  28. package/dist/system/overrides.d.ts +80 -0
  29. package/dist/system/overrides.js +277 -0
  30. package/dist/system/portal.d.ts +4 -2
  31. package/dist/system/portal.js +34 -3
  32. package/dist/system/prepaint.d.ts +58 -7
  33. package/dist/system/prepaint.js +72 -20
  34. package/dist/system/theme-provider.d.ts +133 -8
  35. package/dist/system/theme-provider.js +203 -72
  36. package/dist/system/theme-registry.d.ts +53 -0
  37. package/dist/system/theme-registry.js +66 -0
  38. package/dist/system/use-density.d.ts +13 -5
  39. package/dist/system/use-density.js +142 -13
  40. package/dist/system/use-theme.d.ts +5 -3
  41. package/dist/system/use-theme.js +5 -3
  42. package/dist/system/vocabulary.d.ts +15 -0
  43. package/dist/system/vocabulary.js +111 -0
  44. package/dist/theming/contrast.d.ts +2 -122
  45. package/dist/theming/contrast.js +2 -194
  46. package/dist/theming/create-theme.d.ts +37 -11
  47. package/dist/theming/create-theme.js +54 -17
  48. package/dist/theming/index.d.ts +3 -4
  49. package/dist/theming/index.js +3 -4
  50. package/dist/theming/serialize.d.ts +24 -11
  51. package/dist/theming/serialize.js +16 -18
  52. package/manifest/components/accordion.json +24 -6
  53. package/manifest/components/activity-graph.json +20 -5
  54. package/manifest/components/agent-card.json +37 -9
  55. package/manifest/components/agent-handoff.json +21 -5
  56. package/manifest/components/agent-mode-badge.json +22 -4
  57. package/manifest/components/agent-pile.json +38 -8
  58. package/manifest/components/agent-plan.json +9 -2
  59. package/manifest/components/agent-status.json +17 -3
  60. package/manifest/components/agent-surface.json +26 -11
  61. package/manifest/components/alert-dialog.json +29 -5
  62. package/manifest/components/animated-number.json +14 -6
  63. package/manifest/components/app-bar.json +66 -13
  64. package/manifest/components/app-shell.json +133 -31
  65. package/manifest/components/app-window-frame.json +28 -6
  66. package/manifest/components/approval-card.json +37 -7
  67. package/manifest/components/artifact-card.json +16 -4
  68. package/manifest/components/ask-box.json +99 -21
  69. package/manifest/components/audience-icon.json +1 -7
  70. package/manifest/components/autocomplete.json +80 -18
  71. package/manifest/components/avatar-group.json +13 -2
  72. package/manifest/components/avatar.json +22 -4
  73. package/manifest/components/background-inbox.json +9 -2
  74. package/manifest/components/bento.json +306 -0
  75. package/manifest/components/branch-picker.json +29 -7
  76. package/manifest/components/breadcrumb.json +13 -3
  77. package/manifest/components/button-group.json +21 -4
  78. package/manifest/components/button.json +41 -4
  79. package/manifest/components/canvas-split-body.json +4 -1
  80. package/manifest/components/canvas-split-header.json +17 -4
  81. package/manifest/components/canvas-split-line.json +4 -1
  82. package/manifest/components/canvas-split-message.json +8 -1
  83. package/manifest/components/card.json +14 -3
  84. package/manifest/components/carousel.json +54 -12
  85. package/manifest/components/catalogue-icon.json +1 -7
  86. package/manifest/components/channel-beta-icon.json +1 -7
  87. package/manifest/components/channel-matrix.json +80 -15
  88. package/manifest/components/channel-released-icon.json +1 -7
  89. package/manifest/components/chart-container.json +26 -10
  90. package/manifest/components/chart-ramp.json +13 -3
  91. package/manifest/components/chart-swatch.json +9 -2
  92. package/manifest/components/chart-tooltip-content.json +31 -7
  93. package/manifest/components/chart.json +30 -6
  94. package/manifest/components/chat-panel-composer.json +9 -2
  95. package/manifest/components/checkbox-group.json +4 -2
  96. package/manifest/components/checkbox.json +17 -4
  97. package/manifest/components/checkpoint-history.json +13 -3
  98. package/manifest/components/chip.json +35 -5
  99. package/manifest/components/clamp.json +30 -7
  100. package/manifest/components/cli-tool-icon.json +1 -7
  101. package/manifest/components/code-diff.json +20 -5
  102. package/manifest/components/code-runner.json +32 -6
  103. package/manifest/components/collapsible.json +16 -4
  104. package/manifest/components/color-area.json +4 -1
  105. package/manifest/components/color-field.json +13 -3
  106. package/manifest/components/color-picker.json +75 -17
  107. package/manifest/components/color-slider.json +12 -3
  108. package/manifest/components/color-swatch.json +13 -2
  109. package/manifest/components/colors-section.json +10 -7
  110. package/manifest/components/combobox.json +81 -18
  111. package/manifest/components/command-palette.json +57 -13
  112. package/manifest/components/compaction-row.json +35 -7
  113. package/manifest/components/comparison-card.json +17 -4
  114. package/manifest/components/composer-attachment-chip.json +9 -2
  115. package/manifest/components/composer-bar.json +4 -1
  116. package/manifest/components/composer-command-item.json +8 -2
  117. package/manifest/components/composer-context.json +4 -1
  118. package/manifest/components/composer-input.json +5 -1
  119. package/manifest/components/composer-menu-item.json +4 -1
  120. package/manifest/components/composer-menu.json +12 -2
  121. package/manifest/components/composer-model-item.json +8 -2
  122. package/manifest/components/composer-model-trigger.json +8 -2
  123. package/manifest/components/composer-person-item.json +8 -2
  124. package/manifest/components/composer-send.json +8 -2
  125. package/manifest/components/composer-voice-button.json +4 -1
  126. package/manifest/components/composer-voice.json +8 -2
  127. package/manifest/components/composer.json +76 -17
  128. package/manifest/components/computer-use.json +17 -4
  129. package/manifest/components/confidence-marker.json +13 -3
  130. package/manifest/components/connection-state.json +23 -4
  131. package/manifest/components/container.json +14 -2
  132. package/manifest/components/context-breakdown.json +8 -2
  133. package/manifest/components/context-menu.json +16 -4
  134. package/manifest/components/context-usage.json +16 -4
  135. package/manifest/components/conversation-search.json +22 -5
  136. package/manifest/components/copy-button.json +32 -7
  137. package/manifest/components/cost-meter.json +12 -3
  138. package/manifest/components/cue-logotype.json +17 -3
  139. package/manifest/components/cue-mark.json +17 -3
  140. package/manifest/components/cue-portal-frame.json +14 -4
  141. package/manifest/components/data-row.json +21 -7
  142. package/manifest/components/data-table-pagination.json +18 -4
  143. package/manifest/components/data-table-toolbar.json +30 -7
  144. package/manifest/components/data-tree.json +42 -9
  145. package/manifest/components/date-field.json +13 -2
  146. package/manifest/components/date-picker.json +81 -19
  147. package/manifest/components/date-range-picker.json +81 -19
  148. package/manifest/components/day-separator.json +4 -1
  149. package/manifest/components/delegation-card.json +64 -12
  150. package/manifest/components/density.json +25 -5
  151. package/manifest/components/description-list.json +8 -1
  152. package/manifest/components/diagram.json +33 -7
  153. package/manifest/components/dialog.json +29 -6
  154. package/manifest/components/disclosure.json +31 -7
  155. package/manifest/components/dmx-bar.json +16 -4
  156. package/manifest/components/dmx-strip.json +20 -5
  157. package/manifest/components/document-reference.json +21 -5
  158. package/manifest/components/draft-restore.json +18 -4
  159. package/manifest/components/drawer.json +30 -6
  160. package/manifest/components/dropdown-menu.json +55 -10
  161. package/manifest/components/edit-message.json +32 -7
  162. package/manifest/components/elements-command-palette.json +27 -6
  163. package/manifest/components/elements-data-table.json +9 -2
  164. package/manifest/components/elements-timeline.json +8 -2
  165. package/manifest/components/elicitation-form.json +31 -6
  166. package/manifest/components/empty-state-composer.json +9 -2
  167. package/manifest/components/empty-state-suggestion.json +4 -1
  168. package/manifest/components/empty-state.json +25 -5
  169. package/manifest/components/end-of-turn-summary.json +16 -4
  170. package/manifest/components/env-var-input.json +54 -12
  171. package/manifest/components/error-state.json +17 -4
  172. package/manifest/components/export-dialog.json +27 -11
  173. package/manifest/components/eyebrow.json +4 -1
  174. package/manifest/components/feedback-dialog.json +33 -7
  175. package/manifest/components/field-description.json +4 -1
  176. package/manifest/components/field-error.json +13 -3
  177. package/manifest/components/field-label.json +4 -1
  178. package/manifest/components/field.json +4 -1
  179. package/manifest/components/file-tree.json +16 -4
  180. package/manifest/components/file-upload.json +58 -13
  181. package/manifest/components/flow-graph.json +12 -3
  182. package/manifest/components/folder-icon.json +1 -7
  183. package/manifest/components/footer.json +24 -4
  184. package/manifest/components/frac.json +10 -2
  185. package/manifest/components/generation-loader.json +17 -3
  186. package/manifest/components/generative-ui.json +39 -7
  187. package/manifest/components/grid.json +56 -5
  188. package/manifest/components/group-bar.json +25 -6
  189. package/manifest/components/guardrail-notice.json +22 -5
  190. package/manifest/components/hover-card.json +45 -8
  191. package/manifest/components/icon-button.json +22 -4
  192. package/manifest/components/image-generation.json +8 -2
  193. package/manifest/components/info-tip.json +42 -7
  194. package/manifest/components/inline-citation.json +14 -3
  195. package/manifest/components/input-group.json +24 -5
  196. package/manifest/components/input.json +13 -3
  197. package/manifest/components/item.json +42 -8
  198. package/manifest/components/job-progress.json +25 -6
  199. package/manifest/components/launcher-bubble.json +32 -7
  200. package/manifest/components/ledger.json +87 -19
  201. package/manifest/components/link.json +16 -3
  202. package/manifest/components/live-region-announcer.json +21 -5
  203. package/manifest/components/log-viewer.json +42 -10
  204. package/manifest/components/map-answer.json +17 -4
  205. package/manifest/components/markdown-text.json +36 -5
  206. package/manifest/components/math-block.json +12 -3
  207. package/manifest/components/mcp-server-icon.json +1 -7
  208. package/manifest/components/mcp-server-panel.json +18 -4
  209. package/manifest/components/memory-chips.json +9 -2
  210. package/manifest/components/menubar.json +33 -7
  211. package/manifest/components/message-actions.json +32 -7
  212. package/manifest/components/message-attachments.json +9 -2
  213. package/manifest/components/message-branches.json +14 -3
  214. package/manifest/components/message-list.json +27 -6
  215. package/manifest/components/message-pair.json +25 -5
  216. package/manifest/components/message-queue.json +13 -3
  217. package/manifest/components/message-timing.json +8 -2
  218. package/manifest/components/message.json +41 -9
  219. package/manifest/components/meter.json +43 -7
  220. package/manifest/components/mobile-composer.json +47 -10
  221. package/manifest/components/model-picker.json +13 -3
  222. package/manifest/components/multi-select.json +78 -17
  223. package/manifest/components/musical-time-input.json +34 -8
  224. package/manifest/components/navigation-menu.json +54 -12
  225. package/manifest/components/node-card.json +42 -7
  226. package/manifest/components/node-handle.json +17 -2
  227. package/manifest/components/number-field.json +28 -6
  228. package/manifest/components/number-ticker.json +8 -2
  229. package/manifest/components/onboarding.json +18 -4
  230. package/manifest/components/otp-field.json +43 -10
  231. package/manifest/components/page-shell.json +35 -6
  232. package/manifest/components/pagination.json +21 -5
  233. package/manifest/components/panel-header.json +15 -3
  234. package/manifest/components/password-input.json +38 -8
  235. package/manifest/components/permission-grant.json +28 -5
  236. package/manifest/components/permission-scopes.json +57 -12
  237. package/manifest/components/piano-keyboard.json +38 -9
  238. package/manifest/components/plussie.json +34 -5
  239. package/manifest/components/popover.json +45 -8
  240. package/manifest/components/preset-section.json +14 -8
  241. package/manifest/components/progress.json +25 -6
  242. package/manifest/components/prompt-library.json +27 -6
  243. package/manifest/components/queue-dock.json +36 -8
  244. package/manifest/components/quota-banner.json +25 -6
  245. package/manifest/components/quote-reply.json +29 -7
  246. package/manifest/components/radio-group.json +12 -2
  247. package/manifest/components/radio.json +17 -3
  248. package/manifest/components/rating.json +60 -13
  249. package/manifest/components/read-aloud.json +35 -8
  250. package/manifest/components/reasoning-effort.json +17 -4
  251. package/manifest/components/reasoning-panel.json +33 -8
  252. package/manifest/components/recommendation-card.json +35 -10
  253. package/manifest/components/regenerate-menu.json +22 -5
  254. package/manifest/components/replay-player.json +29 -7
  255. package/manifest/components/research-report.json +12 -3
  256. package/manifest/components/resizable.json +4 -1
  257. package/manifest/components/retrieval-chunks.json +16 -4
  258. package/manifest/components/revert-dock.json +61 -14
  259. package/manifest/components/reviewable-diff.json +23 -5
  260. package/manifest/components/risk-badge.json +18 -3
  261. package/manifest/components/row.json +17 -4
  262. package/manifest/components/schedule-card.json +25 -6
  263. package/manifest/components/score-breakdown.json +20 -5
  264. package/manifest/components/scroll-anchor.json +13 -3
  265. package/manifest/components/scroll-area.json +31 -8
  266. package/manifest/components/scrollable-tabs-list.json +12 -4
  267. package/manifest/components/scrub-input.json +84 -18
  268. package/manifest/components/seam-cell.json +19 -3
  269. package/manifest/components/seam-grid.json +12 -3
  270. package/manifest/components/search-input.json +49 -10
  271. package/manifest/components/section-header.json +36 -8
  272. package/manifest/components/segmented-control.json +50 -11
  273. package/manifest/components/select.json +74 -16
  274. package/manifest/components/separator.json +4 -1
  275. package/manifest/components/settings-panel.json +41 -9
  276. package/manifest/components/shape-section.json +10 -7
  277. package/manifest/components/shared-conversation.json +21 -5
  278. package/manifest/components/sheet.json +29 -6
  279. package/manifest/components/shimmer-label.json +4 -2
  280. package/manifest/components/sidebar.json +60 -13
  281. package/manifest/components/skill-icon.json +1 -7
  282. package/manifest/components/slider.json +22 -5
  283. package/manifest/components/sources.json +17 -4
  284. package/manifest/components/sparkline.json +17 -4
  285. package/manifest/components/speaker-identity.json +4 -1
  286. package/manifest/components/spec-sheet.json +16 -4
  287. package/manifest/components/spectrum-visualizer.json +41 -10
  288. package/manifest/components/spinner.json +12 -2
  289. package/manifest/components/stack-icon.json +1 -7
  290. package/manifest/components/stack.json +54 -7
  291. package/manifest/components/stacks-matrix-icon.json +1 -7
  292. package/manifest/components/stat.json +28 -4
  293. package/manifest/components/status-bar.json +50 -9
  294. package/manifest/components/status-dot.json +23 -4
  295. package/manifest/components/stepper.json +22 -5
  296. package/manifest/components/stopped-run.json +19 -4
  297. package/manifest/components/streaming-text.json +12 -3
  298. package/manifest/components/subagent-list.json +21 -5
  299. package/manifest/components/suggestions.json +27 -5
  300. package/manifest/components/swap-label.json +18 -4
  301. package/manifest/components/switch.json +18 -3
  302. package/manifest/components/table-scroll-region.json +4 -1
  303. package/manifest/components/table.json +54 -11
  304. package/manifest/components/tabs.json +16 -5
  305. package/manifest/components/tags-input.json +79 -17
  306. package/manifest/components/tail-status.json +37 -8
  307. package/manifest/components/terminal-block.json +25 -5
  308. package/manifest/components/terminal-frame.json +34 -8
  309. package/manifest/components/textarea.json +8 -3
  310. package/manifest/components/theme-configurator.json +47 -14
  311. package/manifest/components/theme-provider.json +97 -18
  312. package/manifest/components/thinking-indicator.json +8 -2
  313. package/manifest/components/thread-list.json +13 -3
  314. package/manifest/components/thread-search.json +22 -5
  315. package/manifest/components/threshold-rail.json +77 -14
  316. package/manifest/components/time-boundary.json +8 -2
  317. package/manifest/components/time-field.json +13 -2
  318. package/manifest/components/timeline-ruler.json +51 -12
  319. package/manifest/components/timeline.json +19 -3
  320. package/manifest/components/title-bar.json +19 -4
  321. package/manifest/components/toast.json +12 -3
  322. package/manifest/components/todo-list.json +8 -2
  323. package/manifest/components/toggle-group.json +33 -7
  324. package/manifest/components/toggle.json +23 -4
  325. package/manifest/components/token-editor.json +26 -10
  326. package/manifest/components/tool-call-card.json +83 -16
  327. package/manifest/components/tool-call.json +37 -9
  328. package/manifest/components/tool-error.json +34 -8
  329. package/manifest/components/tool-group.json +17 -4
  330. package/manifest/components/tool-timeline.json +37 -9
  331. package/manifest/components/toolbar.json +37 -8
  332. package/manifest/components/tooltip.json +41 -7
  333. package/manifest/components/trace-waterfall.json +12 -3
  334. package/manifest/components/tree-visibility-toggle.json +18 -3
  335. package/manifest/components/tree.json +52 -11
  336. package/manifest/components/turn-footer.json +36 -8
  337. package/manifest/components/two-step-button.json +46 -9
  338. package/manifest/components/typing-indicator.json +8 -1
  339. package/manifest/components/universe-grid.json +37 -10
  340. package/manifest/components/unread-divider.json +4 -1
  341. package/manifest/components/usage-chart.json +46 -9
  342. package/manifest/components/verdict-row.json +20 -5
  343. package/manifest/components/voice-conversation.json +37 -7
  344. package/manifest/components/web-preview.json +23 -5
  345. package/manifest/components/web-search.json +20 -5
  346. package/manifest/components/work-collapse.json +30 -7
  347. package/manifest/fixtures.json +106 -0
  348. package/manifest/manifest.json +449 -310
  349. package/manifest/tokens.json +122 -12
  350. package/package.json +16 -6
  351. package/dist/theming/_presets.d.ts +0 -11
  352. package/dist/theming/_presets.js +0 -678
@@ -12,14 +12,20 @@
12
12
  "type": "string",
13
13
  "required": false,
14
14
  "defaultValue": null,
15
- "description": "Extra classes, merged over the chassis."
15
+ "description": "Extra classes, merged over the chassis.",
16
+ "control": {
17
+ "kind": "string"
18
+ }
16
19
  },
17
20
  {
18
21
  "name": "rows",
19
22
  "type": "number",
20
23
  "required": false,
21
24
  "defaultValue": "3",
22
- "description": "Visible rows before the box starts scrolling. Defaults to `3`."
25
+ "description": "Visible rows before the box starts scrolling. Defaults to `3`.",
26
+ "control": {
27
+ "kind": "number"
28
+ }
23
29
  }
24
30
  ],
25
31
  "typeReferences": [
@@ -30,7 +36,6 @@
30
36
  "variants": {},
31
37
  "defaultVariants": {},
32
38
  "tokensUsed": [
33
- "--cue-accent",
34
39
  "--cue-border",
35
40
  "--cue-border-strong",
36
41
  "--cue-control-lg",
@@ -14,63 +14,101 @@
14
14
  "type": "\"floating\" | \"docked-right\"",
15
15
  "required": false,
16
16
  "defaultValue": null,
17
- "description": "Placement, controlled. Pair with `onPositionChange`."
17
+ "description": "Placement, controlled. Pair with `onPositionChange`.",
18
+ "control": {
19
+ "kind": "enum",
20
+ "members": [
21
+ "floating",
22
+ "docked-right"
23
+ ]
24
+ }
18
25
  },
19
26
  {
20
27
  "name": "defaultPosition",
21
28
  "type": "\"floating\" | \"docked-right\"",
22
29
  "required": false,
23
30
  "defaultValue": "floating",
24
- "description": "Initial placement. A stored one wins. Defaults to `\"floating\"`."
31
+ "description": "Initial placement. A stored one wins. Defaults to `\"floating\"`.",
32
+ "control": {
33
+ "kind": "enum",
34
+ "members": [
35
+ "floating",
36
+ "docked-right"
37
+ ]
38
+ }
25
39
  },
26
40
  {
27
41
  "name": "onPositionChange",
28
42
  "type": "((position: ConfiguratorPosition) => void)",
29
43
  "required": false,
30
44
  "defaultValue": null,
31
- "description": "Called when the user docks or floats the panel."
45
+ "description": "Called when the user docks or floats the panel.",
46
+ "control": {
47
+ "kind": "callback",
48
+ "fixture": "callback.log"
49
+ }
32
50
  },
33
51
  {
34
52
  "name": "defaultCollapsed",
35
53
  "type": "boolean",
36
54
  "required": false,
37
55
  "defaultValue": "false",
38
- "description": "Start furled to the title bar. A stored value wins. Defaults to `false`."
56
+ "description": "Start furled to the title bar. A stored value wins. Defaults to `false`.",
57
+ "control": {
58
+ "kind": "boolean"
59
+ }
39
60
  },
40
61
  {
41
62
  "name": "storageKey",
42
63
  "type": "string",
43
64
  "required": false,
44
65
  "defaultValue": "cue-configurator",
45
- "description": "`localStorage` key holding the overrides, the placement and the zoom.\nDefaults to `\"cue-configurator\"`."
66
+ "description": "`localStorage` key holding the overrides, the placement and the zoom.\nDefaults to `\"cue-configurator\"`.",
67
+ "control": {
68
+ "kind": "string"
69
+ }
46
70
  },
47
71
  {
48
72
  "name": "onChange",
49
73
  "type": "((tokens: Record<string, string>) => void)",
50
74
  "required": false,
51
75
  "defaultValue": null,
52
- "description": "Called with the full resolved `--cue-*` map — never a diff — whenever the\noverrides, the theme or the mode change, and once on mount."
76
+ "description": "Called with the full resolved `--cue-*` map — never a diff — whenever the\noverrides, the theme or the mode change, and once on mount.",
77
+ "control": {
78
+ "kind": "callback",
79
+ "fixture": "callback.log"
80
+ }
53
81
  },
54
82
  {
55
83
  "name": "zoomShortcuts",
56
84
  "type": "boolean",
57
85
  "required": false,
58
86
  "defaultValue": "true",
59
- "description": "Bind ⌘/Ctrl with `+`, `-` and `0` to the zoom valve. Defaults to `true`."
87
+ "description": "Bind ⌘/Ctrl with `+`, `-` and `0` to the zoom valve. Defaults to `true`.",
88
+ "control": {
89
+ "kind": "boolean"
90
+ }
60
91
  },
61
92
  {
62
93
  "name": "title",
63
94
  "type": "ReactNode",
64
95
  "required": false,
65
96
  "defaultValue": "Theme",
66
- "description": "Panel heading. Defaults to `\"Theme\"`."
97
+ "description": "Panel heading. Defaults to `\"Theme\"`.",
98
+ "control": {
99
+ "kind": "node",
100
+ "fixture": "children.text"
101
+ }
67
102
  },
68
103
  {
69
104
  "name": "className",
70
105
  "type": "string",
71
106
  "required": false,
72
107
  "defaultValue": null,
73
- "description": "Extra classes for the panel."
108
+ "description": "Extra classes for the panel.",
109
+ "control": {
110
+ "kind": "string"
111
+ }
74
112
  }
75
113
  ],
76
114
  "typeReferences": [],
@@ -79,7 +117,6 @@
79
117
  "variants": {},
80
118
  "defaultVariants": {},
81
119
  "tokensUsed": [
82
- "--cue-accent",
83
120
  "--cue-accent-soft",
84
121
  "--cue-border",
85
122
  "--cue-border-overlay",
@@ -89,14 +126,10 @@
89
126
  "--cue-fg-muted",
90
127
  "--cue-fg-subtle",
91
128
  "--cue-font-mono",
92
- "--cue-font-pairing-mono",
93
129
  "--cue-font-sans",
94
- "--cue-font-scale",
95
- "--cue-font-theme-mono",
96
130
  "--cue-icon-sm",
97
131
  "--cue-radius-control",
98
132
  "--cue-radius-overlay",
99
- "--cue-radius-scale",
100
133
  "--cue-scrim",
101
134
  "--cue-space-1",
102
135
  "--cue-space-2",
@@ -5,91 +5,170 @@
5
5
  "importPath": "@cueplusplus/ui",
6
6
  "peerDependencies": [],
7
7
  "clientOnly": true,
8
- "description": "Root of the theme system: stamps `data-theme`, `data-density` and `data-mode`\nso the token layer resolves, puts `data-font` on `<html>`, publishes\n`--cue-font-scale`, and owns the persisted user preference.\n\nRendering: `<div data-cue-root data-theme data-density data-mode style={{ colorScheme, --cue-font-scale }}>`\n(or the single child when `asChild`). The `theme`/`density`/`font`/`mode` props are\n*initial* values — the provider holds the state so `setTheme` and friends can\ndrive it — but a changed prop is adopted after mount, so a controlling parent\nstill works.\n\nThe font pairing is the one axis that never lands on this element: it has no\nisland form, `<html>` is its only home, and restating it here would shadow the\npre-paint stamp for the whole page on the first frame. See the `stamp` object\nbelow.\n\nPersistence and the pre-paint contract: setters write\n`{ theme, density, font, mode }` to `localStorage[storageKey]`, which is exactly what\n{@link prepaintScript } reads to stamp `<html>` before the first paint. The\noutermost provider keeps `<html>` in sync while the app runs (and restores the\nprevious stamp on unmount) so the page ground, UA scrollbars and form controls\nfollow the theme; nested providers never touch `<html>`, and never own the\nfont pairing — `useTheme().font` and `setFont` inside one are the root's.",
8
+ "description": "Root of the theme system: stamps `data-theme`, `data-density` and `data-mode`\nso the token layer resolves, puts `data-font` on `<html>`, publishes\n`--cue-font-scale`, owns the persisted user preference, and publishes the\nregistry the three axis hooks read.\n\nRendering: `<div data-cue-root data-theme data-density data-mode style={{ colorScheme, --cue-font-scale }}>`\n(or the single child when `asChild`). The `theme`/`density`/`font`/`mode` props are\n*initial* values — the provider holds the state so `setTheme` and friends can\ndrive it — but a changed prop is adopted after mount, so a controlling parent\nstill works.\n\nThe font pairing is the one axis that never lands on this element: it has no\nisland form, `<html>` is its only home, and restating it here would shadow the\npre-paint stamp for the whole page on the first frame. See the `stamp` object\nbelow.\n\nPersistence and the pre-paint contract: setters write\n`{ theme, density, font, mode }` to `localStorage[storageKey]`, which is exactly what\n{@link prepaintScript } reads to stamp `<html>` before the first paint. The\noutermost provider keeps `<html>` in sync while the app runs (and restores the\nprevious stamp on unmount) so the page ground, UA scrollbars and form controls\nfollow the theme; nested providers never touch `<html>`, and never own the\nfont pairing — `useTheme().font` and `setFont` inside one are the root's.",
9
9
  "props": [
10
+ {
11
+ "name": "themes",
12
+ "type": "readonly ThemeManifest[]",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "The registry: an ordered array of theme manifests, the first of which is\nthe default theme.\n\nA prop rather than a side effect, so the server render and the client\nrender are handed the same array and nothing depends on which module an app\nhappened to import first. Each entry is a `manifest.json` from a\n`@cueplusplus/theme-<name>` package; this library never discovers a theme by\nitself, because which themes a product ships is an application decision.\n\nOptional for one release, defaulting to `[]` with a development warning. An\napp that registers nothing gets the base axes and no registry: any\nwell-formed name is accepted as a theme (so a visitor's stored preference\nstill restores on first paint), density and font validate against the base\nladder and pairings, and `useTheme().manifest` is `null`. What it *paints*\nis a separate question with a separate answer — whichever `[data-theme]`\nblocks its stylesheets declare, which is the blank base only when none of\nthem declares the stamped name.\n\nA nested provider that passes none inherits the ambient registry.\n\nOne disclosure to be aware of: {@link prepaintScript } inlines the\nregistered **names** — and each theme's `supportsLight` flag, and the names\nof any rung or pairing it adds — into the blocking script in every page's\nHTML, because first paint has to judge a stored preference before any\nmodule loads. No colours, no geometry, no package names, and only what an\napp passes here. But an app that registers\na per-customer theme is publishing that customer's name to every visitor\nwho views source, so register per-customer themes per response rather than\nglobally.",
16
+ "control": {
17
+ "kind": "array"
18
+ }
19
+ },
10
20
  {
11
21
  "name": "theme",
12
- "type": "\"terminal\" | \"cue\" | \"signal\" | \"venu\" | \"hivehub\" | \"dusk\" | \"luma\" | \"snuffle\" | \"requestport\" | \"quotamate\"",
22
+ "type": "string",
13
23
  "required": false,
14
- "defaultValue": "cue",
15
- "description": "Initial theme preset. Defaults to `\"cue\"`. Changing it after mount adopts the new value."
24
+ "defaultValue": null,
25
+ "description": "Initial theme preset. Defaults to the first registered manifest's name, or\n`\"cue\"` with nothing registered. Changing it after mount adopts the new value.",
26
+ "control": {
27
+ "kind": "string"
28
+ }
16
29
  },
17
30
  {
18
31
  "name": "density",
19
32
  "type": "\"normal\" | \"large\" | \"compact\" | \"ultra-compact\" | \"ultra-large\"",
20
33
  "required": false,
21
- "defaultValue": "compact",
22
- "description": "Initial density level. Defaults to `\"compact\"`."
34
+ "defaultValue": null,
35
+ "description": "Initial density level.\n\nDefaults to the rung the active theme's manifest names in\n`densities.default`, and to `\"compact\"` when it names none — spec §5's\nrule, and the same one `resolve()` applies when no rung is wanted, so a\ntheme opens on the rung it prefers whether it is read from JS or painted\nby its own stylesheet. Naming a rung here overrides that for every theme:\na consumer who named one named it deliberately.\n\nChanging it after mount adopts the new value; dropping it does not — a\nparent that stops naming a rung is not asking to move back to the theme's.",
36
+ "control": {
37
+ "kind": "enum",
38
+ "members": [
39
+ "normal",
40
+ "large",
41
+ "compact",
42
+ "ultra-compact",
43
+ "ultra-large"
44
+ ]
45
+ }
23
46
  },
24
47
  {
25
48
  "name": "mode",
26
49
  "type": "\"system\" | \"dark\" | \"light\"",
27
50
  "required": false,
28
51
  "defaultValue": "dark",
29
- "description": "Initial mode. Defaults to `\"dark\"`; `\"system\"` tracks `prefers-color-scheme`."
52
+ "description": "Initial mode. Defaults to `\"dark\"`; `\"system\"` tracks `prefers-color-scheme`.",
53
+ "control": {
54
+ "kind": "enum",
55
+ "members": [
56
+ "system",
57
+ "dark",
58
+ "light"
59
+ ]
60
+ }
30
61
  },
31
62
  {
32
63
  "name": "font",
33
64
  "type": "\"source\" | \"system\" | \"geist\" | \"inter\" | \"plex\" | \"roboto\" | \"apple\" | \"office\"",
34
65
  "required": false,
35
- "defaultValue": "DEFAULT_FONT",
36
- "description": "Initial font pairing. Defaults to `\"system\"` — the platform's own faces,\nnothing downloaded, and the theme keeps whatever monospace it authored.\n\nA pairing that needs delivering is a set of *names*: this library ships no\nfont files, and a pairing nobody delivers falls through its stack to the\nplatform rather than failing. See `FONT_PAIRINGS[font].faces` for the\ncustom properties an app assigns to make one resolve.\n\n**Root-level only.** There is no font island: a nested provider forwards\nthis axis to the root, ignores this prop, and its `setFont` drives the root.\nA page that changed face halfway down is a page with a bug, and a specimen\nthat genuinely wants one — a picker row, a docs page showing all eight —\nneeds nothing from this library but `data-font` on a `<div>`."
66
+ "defaultValue": null,
67
+ "description": "Initial font pairing.\n\nDefaults to the pairing the active theme's manifest names in\n`fontPairings.default` — §5's rule, the density prop's rule one axis over\n— and to `\"system\"` when it names none: the platform's own faces, nothing\ndownloaded, and the theme keeps whatever monospace it authored.\n\nA pairing that needs delivering is a set of *names*: this library ships no\nfont files, and a pairing nobody delivers falls through its stack to the\nplatform rather than failing. See `FONT_PAIRINGS[font].faces` for the\ncustom properties an app assigns to make one resolve.\n\n**Root-level only.** There is no font island: a nested provider forwards\nthis axis to the root, ignores this prop, and its `setFont` drives the root.\nA page that changed face halfway down is a page with a bug, and a specimen\nthat genuinely wants one — a picker row, a docs page showing all eight —\nneeds nothing from this library but `data-font` on a `<div>`.",
68
+ "control": {
69
+ "kind": "enum",
70
+ "members": [
71
+ "source",
72
+ "system",
73
+ "geist",
74
+ "inter",
75
+ "plex",
76
+ "roboto",
77
+ "apple",
78
+ "office"
79
+ ]
80
+ }
37
81
  },
38
82
  {
39
83
  "name": "fontScale",
40
84
  "type": "number",
41
85
  "required": false,
42
86
  "defaultValue": "1",
43
- "description": "Multiplier on every text token, published as `--cue-font-scale`. Defaults to `1`."
87
+ "description": "Multiplier on every text token, published as `--cue-font-scale`. Defaults to `1`.",
88
+ "control": {
89
+ "kind": "number"
90
+ }
44
91
  },
45
92
  {
46
93
  "name": "fontFamilies",
47
94
  "type": "FontFamilies",
48
95
  "required": false,
49
96
  "defaultValue": null,
50
- "description": "Optional app-owned font stacks, published as inline CUE font custom properties."
97
+ "description": "Optional app-owned font stacks, published as inline CUE font custom properties.",
98
+ "control": {
99
+ "kind": "opaque"
100
+ }
101
+ },
102
+ {
103
+ "name": "overrides",
104
+ "type": "TokenOverrides",
105
+ "required": false,
106
+ "defaultValue": null,
107
+ "description": "Typed token edits layered over the active theme: colours per mode, geometry\nper rung, and the three font stacks.\n\nFor the band of edits that sit below \"publish a theme package\": one accent\nfor a tenant, a stack the app already loads, a rung with two more pixels in\na touch build. Anything larger belongs in a `@cueplusplus/theme-<name>`\npackage, where a build measures it; anything smaller than this is a\n`!important` in a stray stylesheet, which outranks the token layer\neverywhere at once.\n\n**Colours and fonts are inline on this element**, so they inherit down the\nsubtree, beat every stylesheet without `!important`, and are re-stamped\nonto portal containers — which mount on `<body>` and inherit nothing from\nhere. They do not leak *out* of this provider: a nested provider's colour\nedit is scoped to its own subtree, and to portals opened from inside it.\n\n**Densities are one document-scoped `<style>` element**, because a rung is\nselected by attribute rather than inherited, and because\n`useControlHeight()`'s measuring probe hangs off `document.body`, where\na subtree-scoped rule would not reach it — leaving the measured height and\nthe painted control disagreeing by exactly the override. The consequence is\nworth knowing before you nest one: a nested provider's `densities` edit\nreaches the whole page, exactly as a theme's own rung rules do. Colours and\nfonts in the same object do not.\n\nAnd it cuts the other way as well, which is the half that surprises: two\nproviders editing the same rung produce two document-scoped rules of equal\nspecificity, so the **later** one in document order wins everywhere — and\nthe later one is the outer provider's, because a nested provider renders\ninside it. A nested `densities` edit does not merely leak out; an ancestor\nthat edits the same rung overrules it *inside the nested subtree too*. If\nan island needs geometry of its own, it needs a rung of its own — a name no\nancestor is editing — not the same rung with different numbers.\n\nIts rules are `[data-density=\"x\"][data-density=\"x\"]` — (0,2,0), tying a\ntheme's own `[data-theme=\"t\"] [data-density=\"x\"]` and winning on source\norder — so the precedence is: **`overrides`, then the configurator's\npersisted snapshot, then the theme, then base.**\n\n**A font override shadows the pairing for this subtree.** `data-font` is\nthe document's axis and this element deliberately never restates it (see\nthe note by `stamp` below), but `overrides.fonts` writes the resolved\n`--cue-font-*` properties directly, which is a stronger claim than the\nattribute and is the point: this is how an app says \"this product's face,\nwhatever pairing the visitor picked\".\n\nIn development the resulting palette is measured, and any required contrast\npair the edit broke — or made worse — is named on the console.",
108
+ "control": {
109
+ "kind": "opaque"
110
+ }
51
111
  },
52
112
  {
53
113
  "name": "storageKey",
54
114
  "type": "string",
55
115
  "required": false,
56
116
  "defaultValue": "cue-ui",
57
- "description": "localStorage key holding `{ theme, density, font, mode }`. Defaults to `\"cue-ui\"`.\nOnly the outermost provider reads or writes it — a nested provider is an\nisland whose explicit props are the point, not a second preference store."
117
+ "description": "localStorage key holding `{ theme, density, font, mode }`. Defaults to `\"cue-ui\"`.\nOnly the outermost provider reads or writes it — a nested provider is an\nisland whose explicit props are the point, not a second preference store.",
118
+ "control": {
119
+ "kind": "string"
120
+ }
58
121
  },
59
122
  {
60
123
  "name": "persistPreferences",
61
124
  "type": "boolean",
62
125
  "required": false,
63
126
  "defaultValue": "true",
64
- "description": "Restore and write root preferences in localStorage. Defaults to `true`."
127
+ "description": "Restore and write root preferences in localStorage. Defaults to `true`.",
128
+ "control": {
129
+ "kind": "boolean"
130
+ }
65
131
  },
66
132
  {
67
133
  "name": "asChild",
68
134
  "type": "boolean",
69
135
  "required": false,
70
136
  "defaultValue": "false",
71
- "description": "Stamp the single child element instead of rendering a wrapper `<div>`."
137
+ "description": "Stamp the single child element instead of rendering a wrapper `<div>`.",
138
+ "control": {
139
+ "kind": "boolean"
140
+ }
72
141
  },
73
142
  {
74
143
  "name": "className",
75
144
  "type": "string",
76
145
  "required": false,
77
146
  "defaultValue": null,
78
- "description": "Extra classes for the provider root."
147
+ "description": "Extra classes for the provider root.",
148
+ "control": {
149
+ "kind": "string"
150
+ }
79
151
  },
80
152
  {
81
153
  "name": "style",
82
154
  "type": "CSSProperties",
83
155
  "required": false,
84
156
  "defaultValue": null,
85
- "description": "Inline styles for the provider root, merged after the token style."
157
+ "description": "Inline styles for the provider root, merged after the token style.",
158
+ "control": {
159
+ "kind": "opaque"
160
+ }
86
161
  },
87
162
  {
88
163
  "name": "children",
89
164
  "type": "ReactNode",
90
165
  "required": false,
91
166
  "defaultValue": null,
92
- "description": "The application subtree."
167
+ "description": "The application subtree.",
168
+ "control": {
169
+ "kind": "node",
170
+ "fixture": "children.text"
171
+ }
93
172
  }
94
173
  ],
95
174
  "typeReferences": [],
@@ -111,7 +190,7 @@
111
190
  },
112
191
  {
113
192
  "title": "Usage",
114
- "code": "<ThemeProvider theme=\"terminal\" density=\"ultra-compact\" font=\"plex\" mode=\"system\">\n <App />\n</ThemeProvider>",
193
+ "code": "// `cue` and `terminal` are the `manifest.json` each theme package ships, read\n// from the `…/manifest.json` subpath of `@cueplusplus/theme-cue` and\n// `@cueplusplus/theme-terminal`. Written that way round on purpose: a literal\n// import statement in this comment reads, to every import-graph gate in this\n// repository, as `ui` depending on a theme package — which is the one thing\n// it may not do.\n<ThemeProvider themes={[cue, terminal]} theme=\"terminal\" density=\"ultra-compact\" font=\"plex\" mode=\"system\">\n <App />\n</ThemeProvider>",
115
194
  "language": "tsx"
116
195
  }
117
196
  ],
@@ -12,14 +12,20 @@
12
12
  "type": "string",
13
13
  "required": true,
14
14
  "defaultValue": null,
15
- "description": "What the agent is doing right now. Swapping it replays the entrance animation."
15
+ "description": "What the agent is doing right now. Swapping it replays the entrance animation.",
16
+ "control": {
17
+ "kind": "string"
18
+ }
16
19
  },
17
20
  {
18
21
  "name": "elapsed",
19
22
  "type": "string",
20
23
  "required": false,
21
24
  "defaultValue": null,
22
- "description": "Elapsed time rendered in mono next to the label. Omit to hide the timer."
25
+ "description": "Elapsed time rendered in mono next to the label. Omit to hide the timer.",
26
+ "control": {
27
+ "kind": "string"
28
+ }
23
29
  }
24
30
  ],
25
31
  "typeReferences": [
@@ -14,21 +14,31 @@
14
14
  "type": "readonly ThreadItem[]",
15
15
  "required": true,
16
16
  "defaultValue": null,
17
- "description": "Conversation rows with title, time, and optional unread mark."
17
+ "description": "Conversation rows with title, time, and optional unread mark.",
18
+ "control": {
19
+ "kind": "array"
20
+ }
18
21
  },
19
22
  {
20
23
  "name": "activeIndex",
21
24
  "type": "number",
22
25
  "required": true,
23
26
  "defaultValue": null,
24
- "description": "Index of the currently selected thread. An index outside the list selects nothing."
27
+ "description": "Index of the currently selected thread. An index outside the list selects nothing.",
28
+ "control": {
29
+ "kind": "number"
30
+ }
25
31
  },
26
32
  {
27
33
  "name": "onActiveIndexChange",
28
34
  "type": "((index: number) => void)",
29
35
  "required": false,
30
36
  "defaultValue": null,
31
- "description": "Called when the user clicks a thread row."
37
+ "description": "Called when the user clicks a thread row.",
38
+ "control": {
39
+ "kind": "callback",
40
+ "fixture": "callback.log"
41
+ }
32
42
  }
33
43
  ],
34
44
  "typeReferences": [
@@ -14,35 +14,52 @@
14
14
  "type": "readonly SearchableThread[]",
15
15
  "required": true,
16
16
  "defaultValue": null,
17
- "description": "All threads. Filtering matches title and preview together."
17
+ "description": "All threads. Filtering matches title and preview together.",
18
+ "control": {
19
+ "kind": "array"
20
+ }
18
21
  },
19
22
  {
20
23
  "name": "query",
21
24
  "type": "string",
22
25
  "required": true,
23
26
  "defaultValue": null,
24
- "description": "Current search text."
27
+ "description": "Current search text.",
28
+ "control": {
29
+ "kind": "string"
30
+ }
25
31
  },
26
32
  {
27
33
  "name": "activeId",
28
34
  "type": "string",
29
35
  "required": true,
30
36
  "defaultValue": null,
31
- "description": "Which thread is open."
37
+ "description": "Which thread is open.",
38
+ "control": {
39
+ "kind": "string"
40
+ }
32
41
  },
33
42
  {
34
43
  "name": "onQueryChange",
35
44
  "type": "((query: string) => void)",
36
45
  "required": false,
37
46
  "defaultValue": null,
38
- "description": "Called as the search is typed."
47
+ "description": "Called as the search is typed.",
48
+ "control": {
49
+ "kind": "callback",
50
+ "fixture": "callback.log"
51
+ }
39
52
  },
40
53
  {
41
54
  "name": "onSelect",
42
55
  "type": "((id: string) => void)",
43
56
  "required": false,
44
57
  "defaultValue": null,
45
- "description": "Called when a thread is opened."
58
+ "description": "Called when a thread is opened.",
59
+ "control": {
60
+ "kind": "callback",
61
+ "fixture": "callback.log"
62
+ }
46
63
  }
47
64
  ],
48
65
  "typeReferences": [