@cueplusplus/ui 0.9.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 (314) hide show
  1. package/CHANGELOG.md +195 -0
  2. package/README.md +91 -9
  3. package/dist/index.d.ts +4 -3
  4. package/dist/index.js +4 -2
  5. package/dist/instruments/meter.d.ts +5 -1
  6. package/dist/layout/bento.d.ts +144 -0
  7. package/dist/layout/bento.js +266 -0
  8. package/dist/layout/index.d.ts +3 -2
  9. package/dist/layout/index.js +3 -2
  10. package/dist/primitives/button.d.ts +12 -0
  11. package/dist/primitives/chip.d.ts +1 -1
  12. package/dist/system/index.d.ts +2 -2
  13. package/dist/system/index.js +2 -1
  14. package/dist/system/overrides.d.ts +38 -1
  15. package/dist/system/overrides.js +40 -1
  16. package/manifest/components/accordion.json +24 -6
  17. package/manifest/components/activity-graph.json +20 -5
  18. package/manifest/components/agent-card.json +37 -9
  19. package/manifest/components/agent-handoff.json +21 -5
  20. package/manifest/components/agent-mode-badge.json +22 -4
  21. package/manifest/components/agent-pile.json +38 -8
  22. package/manifest/components/agent-plan.json +9 -2
  23. package/manifest/components/agent-status.json +17 -3
  24. package/manifest/components/agent-surface.json +26 -11
  25. package/manifest/components/alert-dialog.json +29 -5
  26. package/manifest/components/animated-number.json +14 -6
  27. package/manifest/components/app-bar.json +66 -13
  28. package/manifest/components/app-shell.json +133 -31
  29. package/manifest/components/app-window-frame.json +28 -6
  30. package/manifest/components/approval-card.json +37 -7
  31. package/manifest/components/artifact-card.json +16 -4
  32. package/manifest/components/ask-box.json +99 -21
  33. package/manifest/components/audience-icon.json +1 -7
  34. package/manifest/components/autocomplete.json +80 -18
  35. package/manifest/components/avatar-group.json +13 -2
  36. package/manifest/components/avatar.json +22 -4
  37. package/manifest/components/background-inbox.json +9 -2
  38. package/manifest/components/bento.json +306 -0
  39. package/manifest/components/branch-picker.json +29 -7
  40. package/manifest/components/breadcrumb.json +13 -3
  41. package/manifest/components/button-group.json +21 -4
  42. package/manifest/components/button.json +41 -4
  43. package/manifest/components/canvas-split-body.json +4 -1
  44. package/manifest/components/canvas-split-header.json +17 -4
  45. package/manifest/components/canvas-split-line.json +4 -1
  46. package/manifest/components/canvas-split-message.json +8 -1
  47. package/manifest/components/card.json +14 -3
  48. package/manifest/components/carousel.json +54 -12
  49. package/manifest/components/catalogue-icon.json +1 -7
  50. package/manifest/components/channel-beta-icon.json +1 -7
  51. package/manifest/components/channel-matrix.json +80 -15
  52. package/manifest/components/channel-released-icon.json +1 -7
  53. package/manifest/components/chart-container.json +26 -10
  54. package/manifest/components/chart-ramp.json +13 -3
  55. package/manifest/components/chart-swatch.json +9 -2
  56. package/manifest/components/chart-tooltip-content.json +31 -7
  57. package/manifest/components/chart.json +30 -6
  58. package/manifest/components/chat-panel-composer.json +9 -2
  59. package/manifest/components/checkbox-group.json +4 -2
  60. package/manifest/components/checkbox.json +17 -4
  61. package/manifest/components/checkpoint-history.json +13 -3
  62. package/manifest/components/chip.json +35 -5
  63. package/manifest/components/clamp.json +30 -7
  64. package/manifest/components/cli-tool-icon.json +1 -7
  65. package/manifest/components/code-diff.json +20 -5
  66. package/manifest/components/code-runner.json +32 -6
  67. package/manifest/components/collapsible.json +16 -4
  68. package/manifest/components/color-area.json +4 -1
  69. package/manifest/components/color-field.json +13 -3
  70. package/manifest/components/color-picker.json +75 -17
  71. package/manifest/components/color-slider.json +12 -3
  72. package/manifest/components/color-swatch.json +13 -2
  73. package/manifest/components/colors-section.json +8 -4
  74. package/manifest/components/combobox.json +81 -18
  75. package/manifest/components/command-palette.json +57 -13
  76. package/manifest/components/compaction-row.json +35 -7
  77. package/manifest/components/comparison-card.json +17 -4
  78. package/manifest/components/composer-attachment-chip.json +9 -2
  79. package/manifest/components/composer-bar.json +4 -1
  80. package/manifest/components/composer-command-item.json +8 -2
  81. package/manifest/components/composer-context.json +4 -1
  82. package/manifest/components/composer-input.json +5 -1
  83. package/manifest/components/composer-menu-item.json +4 -1
  84. package/manifest/components/composer-menu.json +12 -2
  85. package/manifest/components/composer-model-item.json +8 -2
  86. package/manifest/components/composer-model-trigger.json +8 -2
  87. package/manifest/components/composer-person-item.json +8 -2
  88. package/manifest/components/composer-send.json +8 -2
  89. package/manifest/components/composer-voice-button.json +4 -1
  90. package/manifest/components/composer-voice.json +8 -2
  91. package/manifest/components/composer.json +76 -17
  92. package/manifest/components/computer-use.json +17 -4
  93. package/manifest/components/confidence-marker.json +13 -3
  94. package/manifest/components/connection-state.json +23 -4
  95. package/manifest/components/container.json +14 -2
  96. package/manifest/components/context-breakdown.json +8 -2
  97. package/manifest/components/context-menu.json +16 -4
  98. package/manifest/components/context-usage.json +16 -4
  99. package/manifest/components/conversation-search.json +22 -5
  100. package/manifest/components/copy-button.json +32 -7
  101. package/manifest/components/cost-meter.json +12 -3
  102. package/manifest/components/cue-logotype.json +17 -3
  103. package/manifest/components/cue-mark.json +17 -3
  104. package/manifest/components/cue-portal-frame.json +13 -3
  105. package/manifest/components/data-row.json +21 -7
  106. package/manifest/components/data-table-pagination.json +18 -4
  107. package/manifest/components/data-table-toolbar.json +30 -7
  108. package/manifest/components/data-tree.json +42 -9
  109. package/manifest/components/date-field.json +13 -2
  110. package/manifest/components/date-picker.json +81 -19
  111. package/manifest/components/date-range-picker.json +81 -19
  112. package/manifest/components/day-separator.json +4 -1
  113. package/manifest/components/delegation-card.json +64 -12
  114. package/manifest/components/density.json +24 -4
  115. package/manifest/components/description-list.json +8 -1
  116. package/manifest/components/diagram.json +33 -7
  117. package/manifest/components/dialog.json +29 -6
  118. package/manifest/components/disclosure.json +31 -7
  119. package/manifest/components/dmx-bar.json +16 -4
  120. package/manifest/components/dmx-strip.json +20 -5
  121. package/manifest/components/document-reference.json +21 -5
  122. package/manifest/components/draft-restore.json +18 -4
  123. package/manifest/components/drawer.json +30 -6
  124. package/manifest/components/dropdown-menu.json +55 -10
  125. package/manifest/components/edit-message.json +32 -7
  126. package/manifest/components/elements-command-palette.json +27 -6
  127. package/manifest/components/elements-data-table.json +9 -2
  128. package/manifest/components/elements-timeline.json +8 -2
  129. package/manifest/components/elicitation-form.json +31 -6
  130. package/manifest/components/empty-state-composer.json +9 -2
  131. package/manifest/components/empty-state-suggestion.json +4 -1
  132. package/manifest/components/empty-state.json +25 -5
  133. package/manifest/components/end-of-turn-summary.json +16 -4
  134. package/manifest/components/env-var-input.json +54 -12
  135. package/manifest/components/error-state.json +17 -4
  136. package/manifest/components/export-dialog.json +27 -8
  137. package/manifest/components/eyebrow.json +4 -1
  138. package/manifest/components/feedback-dialog.json +33 -7
  139. package/manifest/components/field-description.json +4 -1
  140. package/manifest/components/field-error.json +13 -3
  141. package/manifest/components/field-label.json +4 -1
  142. package/manifest/components/field.json +4 -1
  143. package/manifest/components/file-tree.json +16 -4
  144. package/manifest/components/file-upload.json +58 -13
  145. package/manifest/components/flow-graph.json +12 -3
  146. package/manifest/components/folder-icon.json +1 -7
  147. package/manifest/components/footer.json +24 -4
  148. package/manifest/components/frac.json +10 -2
  149. package/manifest/components/generation-loader.json +17 -3
  150. package/manifest/components/generative-ui.json +39 -7
  151. package/manifest/components/grid.json +56 -5
  152. package/manifest/components/group-bar.json +25 -6
  153. package/manifest/components/guardrail-notice.json +22 -5
  154. package/manifest/components/hover-card.json +45 -8
  155. package/manifest/components/icon-button.json +22 -4
  156. package/manifest/components/image-generation.json +8 -2
  157. package/manifest/components/info-tip.json +42 -7
  158. package/manifest/components/inline-citation.json +14 -3
  159. package/manifest/components/input-group.json +24 -5
  160. package/manifest/components/input.json +13 -3
  161. package/manifest/components/item.json +42 -8
  162. package/manifest/components/job-progress.json +25 -6
  163. package/manifest/components/launcher-bubble.json +32 -7
  164. package/manifest/components/ledger.json +87 -19
  165. package/manifest/components/link.json +16 -3
  166. package/manifest/components/live-region-announcer.json +21 -5
  167. package/manifest/components/log-viewer.json +42 -10
  168. package/manifest/components/map-answer.json +17 -4
  169. package/manifest/components/markdown-text.json +36 -5
  170. package/manifest/components/math-block.json +12 -3
  171. package/manifest/components/mcp-server-icon.json +1 -7
  172. package/manifest/components/mcp-server-panel.json +18 -4
  173. package/manifest/components/memory-chips.json +9 -2
  174. package/manifest/components/menubar.json +33 -7
  175. package/manifest/components/message-actions.json +32 -7
  176. package/manifest/components/message-attachments.json +9 -2
  177. package/manifest/components/message-branches.json +14 -3
  178. package/manifest/components/message-list.json +27 -6
  179. package/manifest/components/message-pair.json +25 -5
  180. package/manifest/components/message-queue.json +13 -3
  181. package/manifest/components/message-timing.json +8 -2
  182. package/manifest/components/message.json +41 -9
  183. package/manifest/components/meter.json +43 -7
  184. package/manifest/components/mobile-composer.json +47 -10
  185. package/manifest/components/model-picker.json +13 -3
  186. package/manifest/components/multi-select.json +78 -17
  187. package/manifest/components/musical-time-input.json +34 -8
  188. package/manifest/components/navigation-menu.json +54 -12
  189. package/manifest/components/node-card.json +42 -7
  190. package/manifest/components/node-handle.json +17 -2
  191. package/manifest/components/number-field.json +28 -6
  192. package/manifest/components/number-ticker.json +8 -2
  193. package/manifest/components/onboarding.json +18 -4
  194. package/manifest/components/otp-field.json +43 -10
  195. package/manifest/components/page-shell.json +35 -6
  196. package/manifest/components/pagination.json +21 -5
  197. package/manifest/components/panel-header.json +15 -3
  198. package/manifest/components/password-input.json +38 -8
  199. package/manifest/components/permission-grant.json +28 -5
  200. package/manifest/components/permission-scopes.json +57 -12
  201. package/manifest/components/piano-keyboard.json +38 -9
  202. package/manifest/components/plussie.json +34 -5
  203. package/manifest/components/popover.json +45 -8
  204. package/manifest/components/preset-section.json +12 -5
  205. package/manifest/components/progress.json +25 -6
  206. package/manifest/components/prompt-library.json +27 -6
  207. package/manifest/components/queue-dock.json +36 -8
  208. package/manifest/components/quota-banner.json +25 -6
  209. package/manifest/components/quote-reply.json +29 -7
  210. package/manifest/components/radio-group.json +12 -2
  211. package/manifest/components/radio.json +17 -3
  212. package/manifest/components/rating.json +60 -13
  213. package/manifest/components/read-aloud.json +35 -8
  214. package/manifest/components/reasoning-effort.json +17 -4
  215. package/manifest/components/reasoning-panel.json +33 -8
  216. package/manifest/components/recommendation-card.json +35 -10
  217. package/manifest/components/regenerate-menu.json +22 -5
  218. package/manifest/components/replay-player.json +29 -7
  219. package/manifest/components/research-report.json +12 -3
  220. package/manifest/components/resizable.json +4 -1
  221. package/manifest/components/retrieval-chunks.json +16 -4
  222. package/manifest/components/revert-dock.json +61 -14
  223. package/manifest/components/reviewable-diff.json +23 -5
  224. package/manifest/components/risk-badge.json +18 -3
  225. package/manifest/components/row.json +17 -4
  226. package/manifest/components/schedule-card.json +25 -6
  227. package/manifest/components/score-breakdown.json +20 -5
  228. package/manifest/components/scroll-anchor.json +13 -3
  229. package/manifest/components/scroll-area.json +31 -8
  230. package/manifest/components/scrollable-tabs-list.json +12 -4
  231. package/manifest/components/scrub-input.json +84 -18
  232. package/manifest/components/seam-cell.json +19 -3
  233. package/manifest/components/seam-grid.json +12 -3
  234. package/manifest/components/search-input.json +49 -10
  235. package/manifest/components/section-header.json +36 -8
  236. package/manifest/components/segmented-control.json +50 -11
  237. package/manifest/components/select.json +74 -16
  238. package/manifest/components/separator.json +4 -1
  239. package/manifest/components/settings-panel.json +41 -9
  240. package/manifest/components/shape-section.json +8 -4
  241. package/manifest/components/shared-conversation.json +21 -5
  242. package/manifest/components/sheet.json +29 -6
  243. package/manifest/components/shimmer-label.json +4 -2
  244. package/manifest/components/sidebar.json +60 -13
  245. package/manifest/components/skill-icon.json +1 -7
  246. package/manifest/components/slider.json +22 -5
  247. package/manifest/components/sources.json +17 -4
  248. package/manifest/components/sparkline.json +17 -4
  249. package/manifest/components/speaker-identity.json +4 -1
  250. package/manifest/components/spec-sheet.json +16 -4
  251. package/manifest/components/spectrum-visualizer.json +41 -10
  252. package/manifest/components/spinner.json +12 -2
  253. package/manifest/components/stack-icon.json +1 -7
  254. package/manifest/components/stack.json +54 -7
  255. package/manifest/components/stacks-matrix-icon.json +1 -7
  256. package/manifest/components/stat.json +28 -4
  257. package/manifest/components/status-bar.json +50 -9
  258. package/manifest/components/status-dot.json +23 -4
  259. package/manifest/components/stepper.json +22 -5
  260. package/manifest/components/stopped-run.json +19 -4
  261. package/manifest/components/streaming-text.json +12 -3
  262. package/manifest/components/subagent-list.json +21 -5
  263. package/manifest/components/suggestions.json +27 -5
  264. package/manifest/components/swap-label.json +18 -4
  265. package/manifest/components/switch.json +18 -3
  266. package/manifest/components/table-scroll-region.json +4 -1
  267. package/manifest/components/table.json +54 -11
  268. package/manifest/components/tabs.json +16 -5
  269. package/manifest/components/tags-input.json +79 -17
  270. package/manifest/components/tail-status.json +37 -8
  271. package/manifest/components/terminal-block.json +25 -5
  272. package/manifest/components/terminal-frame.json +34 -8
  273. package/manifest/components/textarea.json +8 -3
  274. package/manifest/components/theme-configurator.json +47 -11
  275. package/manifest/components/theme-provider.json +79 -15
  276. package/manifest/components/thinking-indicator.json +8 -2
  277. package/manifest/components/thread-list.json +13 -3
  278. package/manifest/components/thread-search.json +22 -5
  279. package/manifest/components/threshold-rail.json +77 -14
  280. package/manifest/components/time-boundary.json +8 -2
  281. package/manifest/components/time-field.json +13 -2
  282. package/manifest/components/timeline-ruler.json +51 -12
  283. package/manifest/components/timeline.json +19 -3
  284. package/manifest/components/title-bar.json +19 -4
  285. package/manifest/components/toast.json +12 -3
  286. package/manifest/components/todo-list.json +8 -2
  287. package/manifest/components/toggle-group.json +33 -7
  288. package/manifest/components/toggle.json +23 -4
  289. package/manifest/components/token-editor.json +26 -7
  290. package/manifest/components/tool-call-card.json +83 -16
  291. package/manifest/components/tool-call.json +37 -9
  292. package/manifest/components/tool-error.json +34 -8
  293. package/manifest/components/tool-group.json +17 -4
  294. package/manifest/components/tool-timeline.json +37 -9
  295. package/manifest/components/toolbar.json +37 -8
  296. package/manifest/components/tooltip.json +41 -7
  297. package/manifest/components/trace-waterfall.json +12 -3
  298. package/manifest/components/tree-visibility-toggle.json +18 -3
  299. package/manifest/components/tree.json +52 -11
  300. package/manifest/components/turn-footer.json +36 -8
  301. package/manifest/components/two-step-button.json +46 -9
  302. package/manifest/components/typing-indicator.json +8 -1
  303. package/manifest/components/universe-grid.json +37 -10
  304. package/manifest/components/unread-divider.json +4 -1
  305. package/manifest/components/usage-chart.json +46 -9
  306. package/manifest/components/verdict-row.json +20 -5
  307. package/manifest/components/voice-conversation.json +37 -7
  308. package/manifest/components/web-preview.json +23 -5
  309. package/manifest/components/web-search.json +20 -5
  310. package/manifest/components/work-collapse.json +30 -7
  311. package/manifest/fixtures.json +106 -0
  312. package/manifest/manifest.json +315 -297
  313. package/manifest/tokens.json +2 -2
  314. package/package.json +7 -6
@@ -12,28 +12,46 @@
12
12
  "type": "string",
13
13
  "required": false,
14
14
  "defaultValue": null,
15
- "description": "Image URL. Omit to go straight to the fallback."
15
+ "description": "Image URL. Omit to go straight to the fallback.",
16
+ "control": {
17
+ "kind": "string"
18
+ }
16
19
  },
17
20
  {
18
21
  "name": "alt",
19
22
  "type": "string",
20
23
  "required": false,
21
24
  "defaultValue": null,
22
- "description": "Alt text for the image, and the name the default initials are derived from."
25
+ "description": "Alt text for the image, and the name the default initials are derived from.",
26
+ "control": {
27
+ "kind": "string"
28
+ }
23
29
  },
24
30
  {
25
31
  "name": "fallback",
26
32
  "type": "ReactNode",
27
33
  "required": false,
28
34
  "defaultValue": null,
29
- "description": "What to show while the image loads or after it fails. Defaults to initials from `alt`."
35
+ "description": "What to show while the image loads or after it fails. Defaults to initials from `alt`.",
36
+ "control": {
37
+ "kind": "node",
38
+ "fixture": "children.text"
39
+ }
30
40
  },
31
41
  {
32
42
  "name": "size",
33
43
  "type": "\"sm\" | \"md\" | \"lg\"",
34
44
  "required": false,
35
45
  "defaultValue": "md",
36
- "description": ""
46
+ "description": "",
47
+ "control": {
48
+ "kind": "enum",
49
+ "members": [
50
+ "sm",
51
+ "md",
52
+ "lg"
53
+ ]
54
+ }
37
55
  }
38
56
  ],
39
57
  "typeReferences": [
@@ -14,14 +14,21 @@
14
14
  "type": "readonly BackgroundRun[]",
15
15
  "required": true,
16
16
  "defaultValue": null,
17
- "description": "Detached runs. The header counts what is ready rather than what is in flight,\nbecause ready is the thing that needs you."
17
+ "description": "Detached runs. The header counts what is ready rather than what is in flight,\nbecause ready is the thing that needs you.",
18
+ "control": {
19
+ "kind": "array"
20
+ }
18
21
  },
19
22
  {
20
23
  "name": "onCollect",
21
24
  "type": "((id: string) => void)",
22
25
  "required": false,
23
26
  "defaultValue": null,
24
- "description": "Called to pull a finished run back into the thread. Running rows are not clickable."
27
+ "description": "Called to pull a finished run back into the thread. Running rows are not clickable.",
28
+ "control": {
29
+ "kind": "callback",
30
+ "fixture": "callback.log"
31
+ }
25
32
  }
26
33
  ],
27
34
  "typeReferences": [
@@ -0,0 +1,306 @@
1
+ {
2
+ "name": "Bento",
3
+ "slug": "bento",
4
+ "group": "layout",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "A grid of unequal tiles: per-item spans, clamped to the container's columns.\n\nWhere `Grid` lays out cells it never touches, a bento's whole content is\nper-item — so the span is a prop on the tile, from a closed set, and the\ncontainer clamps it on the way past. One column below `sm`, two from `sm`,\nthe asked-for count from `lg`; the clamp is per breakpoint and not per\n`cols`, because every container is two tracks wide in between whatever it\nwas asked for.\n\n**Static markup — no hooks, no `\"use client\"`, and it must stay that way.**\nA directive is per *module*, so a `Bento` built on `useRender` would open a\nclient boundary in every server page that draws one. That is why the router\nescape hatch is `render`, an *element* that is cloned, rather than a render\nfunction; and why {@link Bento.Tile} is a discriminated union rather than a\ntile that decides at runtime what it is.\n\n`BentoTileProps` omits the native `title` from its `<div>` props, the same\nomission `PanelHeader` and `Item` make: `React.ComponentPropsWithoutRef<\"div\">`\nalready declares `title?: string`, and narrowing it to a `ReactNode` without\nthe `Omit` is TS2430.",
9
+ "props": [],
10
+ "typeReferences": [],
11
+ "subcomponents": [
12
+ "Root",
13
+ "Tile"
14
+ ],
15
+ "parts": [
16
+ {
17
+ "name": "Root",
18
+ "usage": "Bento.Root",
19
+ "description": "The bento container: a responsive grid that clamps the spans of its tiles.\n\nIt maps `React.Children` and clones every child whose type is the tile,\nnarrowing that tile's `span` to its own `cols`; anything else passes through\nwith its props untouched, so a `<section>` or a bare `<div>` may sit in a\nband beside the tiles.\n\n**The clamp reaches direct children only, and that is a contract rather than\nan oversight.** `React.Children` does not descend into a component element,\nso a tile rendered by a child — `<Bento.Root><MyTiles /></Bento.Root>` — is\nwhatever `span` it declared, and an over-wide one grows an implicit column\nexactly as an unclamped tile would. Reading through a component would mean\nrendering it, which a container may not do. So: **keep a tile a child\ncomponent renders at `span={1}`, or clamp it in that component.** The same\nhazard in fragment form is why an authored `node` fixture of tiles is an\narray and not a `<>…</>`.\n\nStatic markup — no `\"use client\"`.",
20
+ "props": [
21
+ {
22
+ "name": "cols",
23
+ "type": "4 | 2 | 3",
24
+ "required": false,
25
+ "defaultValue": "3",
26
+ "description": "How many columns at `lg`. Defaults to `3`. Two from `sm`, one below it.",
27
+ "control": {
28
+ "kind": "enum",
29
+ "members": [
30
+ 4,
31
+ 2,
32
+ 3
33
+ ],
34
+ "min": 2,
35
+ "max": 4
36
+ }
37
+ },
38
+ {
39
+ "name": "rows",
40
+ "type": "4 | 1 | 2 | 3",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "How many rows to declare from `sm` up.\n\nOnly worth setting where a tile spans rows: a `rowSpan` over implicit\ntracks sizes itself to the tile's own content, which is not a span.",
44
+ "control": {
45
+ "kind": "enum",
46
+ "members": [
47
+ 4,
48
+ 1,
49
+ 2,
50
+ 3
51
+ ],
52
+ "min": 1,
53
+ "max": 4
54
+ }
55
+ },
56
+ {
57
+ "name": "dense",
58
+ "type": "boolean",
59
+ "required": false,
60
+ "defaultValue": "false",
61
+ "description": "Pack later tiles into earlier holes instead of leaving them empty.",
62
+ "control": {
63
+ "kind": "boolean"
64
+ }
65
+ },
66
+ {
67
+ "name": "gap",
68
+ "type": "0 | 4 | 8 | 1 | 2 | 3 | 5 | 6 | 7",
69
+ "required": false,
70
+ "defaultValue": "4",
71
+ "description": "Which rung of the density space ladder to spend between tiles. Defaults to `4`.",
72
+ "control": {
73
+ "kind": "enum",
74
+ "members": [
75
+ 0,
76
+ 4,
77
+ 8,
78
+ 1,
79
+ 2,
80
+ 3,
81
+ 5,
82
+ 6,
83
+ 7
84
+ ],
85
+ "min": 0,
86
+ "max": 8
87
+ }
88
+ },
89
+ {
90
+ "name": "children",
91
+ "type": "ReactNode",
92
+ "required": false,
93
+ "defaultValue": null,
94
+ "description": "The tiles. Declared, so the manifest files it as a documented prop.",
95
+ "control": {
96
+ "kind": "node",
97
+ "fixture": "children.text"
98
+ }
99
+ }
100
+ ],
101
+ "typeReferences": [
102
+ "React.ComponentPropsWithoutRef<\"div\">"
103
+ ]
104
+ },
105
+ {
106
+ "name": "Tile",
107
+ "usage": "Bento.Tile",
108
+ "description": "One cell of a bento: a link, or a surface with an `action`.\n\nThe two are a discriminated union rather than one shape with a runtime\nbranch, because half of the rule is something a compiler can hold: `href`\nand `action` are mutually exclusive in the type. The other half — that a\nlink tile's content is static — is held by a dev-time check here and by a\nDOM assertion in each grid that draws one.\n\nStatic markup — no `\"use client\"`.",
109
+ "props": [
110
+ {
111
+ "name": "span",
112
+ "type": "4 | 1 | 2 | 3",
113
+ "required": false,
114
+ "defaultValue": null,
115
+ "description": "How many columns to cover. Clamped by the container to its own `cols`.",
116
+ "control": {
117
+ "kind": "enum",
118
+ "members": [
119
+ 4,
120
+ 1,
121
+ 2,
122
+ 3
123
+ ],
124
+ "min": 1,
125
+ "max": 4
126
+ }
127
+ },
128
+ {
129
+ "name": "rowSpan",
130
+ "type": "1 | 2",
131
+ "required": false,
132
+ "defaultValue": null,
133
+ "description": "How many rows to cover. Needs a container that declares them.",
134
+ "control": {
135
+ "kind": "enum",
136
+ "members": [
137
+ 1,
138
+ 2
139
+ ],
140
+ "min": 1,
141
+ "max": 2
142
+ }
143
+ },
144
+ {
145
+ "name": "minHeight",
146
+ "type": "\"none\" | \"half\" | \"hero\"",
147
+ "required": false,
148
+ "defaultValue": null,
149
+ "description": "How much height to hold before the content arrives. Defaults to `\"none\"`.",
150
+ "control": {
151
+ "kind": "enum",
152
+ "members": [
153
+ "none",
154
+ "half",
155
+ "hero"
156
+ ]
157
+ }
158
+ },
159
+ {
160
+ "name": "eyebrow",
161
+ "type": "ReactNode",
162
+ "required": false,
163
+ "defaultValue": null,
164
+ "description": "The qualifier above the name: an import specifier, a family, a device.",
165
+ "control": {
166
+ "kind": "node",
167
+ "fixture": "children.text"
168
+ }
169
+ },
170
+ {
171
+ "name": "title",
172
+ "type": "ReactNode",
173
+ "required": false,
174
+ "defaultValue": null,
175
+ "description": "The tile's name. Rendered as a `<span>`, never as a heading.",
176
+ "control": {
177
+ "kind": "node",
178
+ "fixture": "children.text"
179
+ }
180
+ },
181
+ {
182
+ "name": "meta",
183
+ "type": "ReactNode",
184
+ "required": false,
185
+ "defaultValue": null,
186
+ "description": "The count beside the name — by convention a `<Chip variant=\"outline\">`.",
187
+ "control": {
188
+ "kind": "node",
189
+ "fixture": "children.text"
190
+ }
191
+ },
192
+ {
193
+ "name": "children",
194
+ "type": "ReactNode",
195
+ "required": false,
196
+ "defaultValue": null,
197
+ "description": "The summary and anything below it.",
198
+ "control": {
199
+ "kind": "node",
200
+ "fixture": "children.text"
201
+ }
202
+ },
203
+ {
204
+ "name": "href",
205
+ "type": "string",
206
+ "required": false,
207
+ "defaultValue": null,
208
+ "description": "Where the tile goes. Its presence is what makes the tile a link.\nNever on a panel tile: `href` is what selects the link variant.",
209
+ "control": {
210
+ "kind": "string"
211
+ }
212
+ },
213
+ {
214
+ "name": "render",
215
+ "type": "ReactElement<unknown, string | JSXElementConstructor<any>>",
216
+ "required": false,
217
+ "defaultValue": null,
218
+ "description": "A router's own link element, cloned to carry the tile's classes and slots.\n\nThe **element** form only, and never a render function: a function would\nbuy a second calling convention at the price of this component's\nserver-safety, because the hook that reads one is a hook. The element keeps\nits own `href` — `next/link` declares that prop required, so passing the\ntile's would make the tile the silent owner of a value the element has to\ndeclare anyway. Its own `className` is **merged** with the tile's rather\nthan replaced by it, which is the other half of the same bargain: `href` is\na value the element owns outright, and a class is one it adds to.\nNever on a panel tile: `render` belongs to the link variant.",
219
+ "control": {
220
+ "kind": "opaque"
221
+ }
222
+ },
223
+ {
224
+ "name": "action",
225
+ "type": "ReactNode",
226
+ "required": false,
227
+ "defaultValue": null,
228
+ "description": "Never on a link tile: an `<a>` may not contain a control.\nThe tile's own link or control, rendered beside the count rather than around it.",
229
+ "control": {
230
+ "kind": "node",
231
+ "fixture": "children.text"
232
+ }
233
+ }
234
+ ],
235
+ "typeReferences": [
236
+ "BentoLinkTileProps | BentoPanelTileProps"
237
+ ]
238
+ }
239
+ ],
240
+ "variants": {},
241
+ "defaultVariants": {},
242
+ "tokensUsed": [
243
+ "--cue-accent",
244
+ "--cue-border",
245
+ "--cue-fg",
246
+ "--cue-fg-muted",
247
+ "--cue-font-mono",
248
+ "--cue-radius-surface",
249
+ "--cue-space-1",
250
+ "--cue-space-2",
251
+ "--cue-space-3",
252
+ "--cue-space-5",
253
+ "--cue-space-8",
254
+ "--cue-surface-1",
255
+ "--cue-surface-2",
256
+ "--cue-text-emphasis",
257
+ "--cue-text-meta"
258
+ ],
259
+ "summary": "The unequal grid: tiles of different sizes on one set of tracks, from a closed set of spans.",
260
+ "examples": [
261
+ {
262
+ "title": "A link tile",
263
+ "code": "<Bento.Root cols={3} gap={5}>\n <Bento.Tile\n href=\"/docs/components/grid\"\n render={<NextLink href=\"/docs/components/grid\" />}\n eyebrow=\"@cueplusplus/ui\"\n title=\"Grid\"\n meta={<Chip variant=\"outline\">17</Chip>}\n >\n Equal columns, or as many as fit.\n </Bento.Tile>\n</Bento.Root>",
264
+ "language": "tsx"
265
+ },
266
+ {
267
+ "title": "A panel tile, whose control is a sibling",
268
+ "code": "<Bento.Root cols={2} rows={2} gap={5}>\n <Bento.Tile\n span={2}\n rowSpan={2}\n minHeight=\"hero\"\n title=\"Signal\"\n action={<Button onClick={() => setTheme(\"signal\")}>Apply</Button>}\n >\n <ThemeSwatches theme=\"signal\" />\n </Bento.Tile>\n</Bento.Root>",
269
+ "language": "tsx"
270
+ },
271
+ {
272
+ "title": "Usage",
273
+ "code": "<Bento.Root cols={3} rows={2} gap={5}>\n <Bento.Tile span={2} rowSpan={2} minHeight=\"hero\" title=\"Kitchen sink\">\n Every component, on one page.\n </Bento.Tile>\n <Bento.Tile title=\"Themes\" meta={<Chip variant=\"outline\">10</Chip>} />\n <Bento.Tile title=\"Density\" meta={<Chip variant=\"outline\">5</Chip>} />\n</Bento.Root>\n<Bento.Tile\n href=\"/docs/components/grid\"\n render={<NextLink href=\"/docs/components/grid\" />}\n eyebrow=\"@cueplusplus/ui\"\n title=\"Grid\"\n>\n Equal columns, or as many as fit.\n</Bento.Tile>\n<Bento.Tile title=\"Signal\" action={<Button onClick={apply}>Apply</Button>}>\n <ThemeSwatches theme=\"signal\" />\n</Bento.Tile>",
274
+ "language": "tsx"
275
+ }
276
+ ],
277
+ "status": "stable",
278
+ "url": "/docs/components/bento",
279
+ "mdUrl": "/docs/components/bento.md",
280
+ "jsonUrl": "/r/components/bento.json",
281
+ "whenToUse": [
282
+ "A landing surface where some things matter more than others: one hero tile, a run of ordinary ones, and the difference visible without a heading.",
283
+ "A dashboard of unlike cards — a chart beside a count beside a link — where a uniform cell would make the biggest thing look the same size as the smallest."
284
+ ],
285
+ "whenNotToUse": [
286
+ "Equal cards. That is `Grid`, and a bento of equal tiles is a grid that costs a reader a scan: they look for the emphasis the layout is promising and there is none.",
287
+ "A list of rows. That is `Panel` with `Row` — a bento of one-column tiles is a list wearing nine rims."
288
+ ],
289
+ "commonMistakes": [
290
+ "Interpolating a span. `col-span-${n}` is invisible to Tailwind's scanner, which reads source text and not computed strings — which is exactly why `span` is a closed set of literals with a static class each.",
291
+ "Putting a control or a second link inside a tile that has an `href`. An `<a>` admits no interactive descendant, so the whole tile stops being one thing; use a panel tile and put the control in `action`, which is what that variant is for.",
292
+ "Spanning rows in a container that declares none. `rowSpan` over implicit tracks sizes itself to the tile's own content, so set `rows` on the container and the span is over tracks that exist."
293
+ ],
294
+ "specimens": [
295
+ {
296
+ "title": "Bento",
297
+ "group": "layout",
298
+ "components": [
299
+ "Bento"
300
+ ],
301
+ "code": "<Specimens>\n <Specimen label=\"three columns, one wide tile\" wide>\n <Bento.Root cols={3} rows={2} gap={4} className=\"w-full\">\n <Bento.Tile\n span={2}\n rowSpan={2}\n minHeight=\"half\"\n eyebrow=\"universe 1\"\n title=\"Front truss\"\n meta={<Chip variant=\"outline\">24</Chip>}\n >\n Twenty-four Source Four 26° on channels 12 to 35.\n </Bento.Tile>\n <Bento.Tile title=\"Movers\" meta={<Chip variant=\"outline\">8</Chip>} />\n <Bento.Tile title=\"Cyc\" meta={<Chip variant=\"outline\">6</Chip>} />\n <Bento.Tile title=\"Haze\" meta={<Chip variant=\"outline\">2</Chip>} />\n <Bento.Tile title=\"House\" meta={<Chip variant=\"outline\">4</Chip>} />\n <Bento.Tile title=\"Spare\" meta={<Chip variant=\"outline\">1</Chip>} />\n </Bento.Root>\n </Specimen>\n <Specimen label=\"link tiles\" wide>\n <Bento.Root cols={3} gap={4} className=\"w-full\">\n <Bento.Tile href=\"#bento\" eyebrow=\"@cueplusplus/ui\" title=\"Grid\">\n Equal columns, or as many as fit.\n </Bento.Tile>\n <Bento.Tile href=\"#bento\" eyebrow=\"@cueplusplus/ui\" title=\"Stack\">\n One axis, spaced off a rung of the density ladder.\n </Bento.Tile>\n <Bento.Tile href=\"#bento\" eyebrow=\"@cueplusplus/ui\" title=\"Container\">\n A measure, centred.\n </Bento.Tile>\n </Bento.Root>\n </Specimen>\n</Specimens>",
302
+ "note": "An unequal grid: every tile carries its own span from a closed set, and the container clamps it to its own columns — per breakpoint, because a bento is two tracks wide between `sm` and `lg` whatever its `cols`.",
303
+ "interaction": "the first specimen is panel tiles and takes no focus of its own; every tile in the second is one anchor, so Tab reaches three links and never anything inside one."
304
+ }
305
+ ]
306
+ }
@@ -12,49 +12,71 @@
12
12
  "type": "number",
13
13
  "required": true,
14
14
  "defaultValue": null,
15
- "description": "1-based position of the branch on show — what the readout prints."
15
+ "description": "1-based position of the branch on show — what the readout prints.",
16
+ "control": {
17
+ "kind": "number"
18
+ }
16
19
  },
17
20
  {
18
21
  "name": "count",
19
22
  "type": "number",
20
23
  "required": true,
21
24
  "defaultValue": null,
22
- "description": "How many sibling branches exist. Below 2 the picker renders nothing."
25
+ "description": "How many sibling branches exist. Below 2 the picker renders nothing.",
26
+ "control": {
27
+ "kind": "number"
28
+ }
23
29
  },
24
30
  {
25
31
  "name": "onNavigate",
26
32
  "type": "(direction: BranchDirection) => void",
27
33
  "required": true,
28
34
  "defaultValue": null,
29
- "description": "Called with the direction to move in. Never called past either end."
35
+ "description": "Called with the direction to move in. Never called past either end.",
36
+ "control": {
37
+ "kind": "callback",
38
+ "fixture": "callback.log"
39
+ }
30
40
  },
31
41
  {
32
42
  "name": "previousLabel",
33
43
  "type": "string",
34
44
  "required": false,
35
45
  "defaultValue": "Previous branch",
36
- "description": "Accessible name of the previous button. Defaults to `\"Previous branch\"`."
46
+ "description": "Accessible name of the previous button. Defaults to `\"Previous branch\"`.",
47
+ "control": {
48
+ "kind": "string"
49
+ }
37
50
  },
38
51
  {
39
52
  "name": "nextLabel",
40
53
  "type": "string",
41
54
  "required": false,
42
55
  "defaultValue": "Next branch",
43
- "description": "Accessible name of the next button. Defaults to `\"Next branch\"`."
56
+ "description": "Accessible name of the next button. Defaults to `\"Next branch\"`.",
57
+ "control": {
58
+ "kind": "string"
59
+ }
44
60
  },
45
61
  {
46
62
  "name": "disabled",
47
63
  "type": "boolean",
48
64
  "required": false,
49
65
  "defaultValue": null,
50
- "description": "Block both buttons — a run is in flight and the runtime cannot switch mid-run."
66
+ "description": "Block both buttons — a run is in flight and the runtime cannot switch mid-run.",
67
+ "control": {
68
+ "kind": "boolean"
69
+ }
51
70
  },
52
71
  {
53
72
  "name": "aria-label",
54
73
  "type": "string",
55
74
  "required": false,
56
75
  "defaultValue": "Branches",
57
- "description": "Accessible name for the group. Defaults to `\"Branches\"`."
76
+ "description": "Accessible name for the group. Defaults to `\"Branches\"`.",
77
+ "control": {
78
+ "kind": "string"
79
+ }
58
80
  }
59
81
  ],
60
82
  "typeReferences": [
@@ -12,21 +12,31 @@
12
12
  "type": "readonly BreadcrumbItem[]",
13
13
  "required": true,
14
14
  "defaultValue": null,
15
- "description": "The trail, root first. The last entry is the current page."
15
+ "description": "The trail, root first. The last entry is the current page.",
16
+ "control": {
17
+ "kind": "array"
18
+ }
16
19
  },
17
20
  {
18
21
  "name": "separator",
19
22
  "type": "ReactNode",
20
23
  "required": false,
21
24
  "defaultValue": "/",
22
- "description": "What sits between crumbs. Defaults to `\"/\"`."
25
+ "description": "What sits between crumbs. Defaults to `\"/\"`.",
26
+ "control": {
27
+ "kind": "node",
28
+ "fixture": "children.text"
29
+ }
23
30
  },
24
31
  {
25
32
  "name": "label",
26
33
  "type": "string",
27
34
  "required": false,
28
35
  "defaultValue": "Breadcrumb",
29
- "description": "The nav's accessible name. Defaults to `\"Breadcrumb\"`."
36
+ "description": "The nav's accessible name. Defaults to `\"Breadcrumb\"`.",
37
+ "control": {
38
+ "kind": "string"
39
+ }
30
40
  }
31
41
  ],
32
42
  "typeReferences": [
@@ -12,28 +12,45 @@
12
12
  "type": "\"horizontal\" | \"vertical\"",
13
13
  "required": false,
14
14
  "defaultValue": "horizontal",
15
- "description": "Which way the children run. Defaults to `\"horizontal\"`."
15
+ "description": "Which way the children run. Defaults to `\"horizontal\"`.",
16
+ "control": {
17
+ "kind": "enum",
18
+ "members": [
19
+ "horizontal",
20
+ "vertical"
21
+ ]
22
+ }
16
23
  },
17
24
  {
18
25
  "name": "attached",
19
26
  "type": "boolean",
20
27
  "required": false,
21
28
  "defaultValue": "true",
22
- "description": "Join the children into one control (shared rims, outer corners only).\nDefaults to `true`; pass `false` for a merely-adjacent row of buttons that\nshould still be announced as one group."
29
+ "description": "Join the children into one control (shared rims, outer corners only).\nDefaults to `true`; pass `false` for a merely-adjacent row of buttons that\nshould still be announced as one group.",
30
+ "control": {
31
+ "kind": "boolean"
32
+ }
23
33
  },
24
34
  {
25
35
  "name": "aria-label",
26
36
  "type": "string",
27
37
  "required": false,
28
38
  "defaultValue": null,
29
- "description": "Accessible name for the cluster. A group of buttons with no name is a group\nof buttons; with one it is \"Blend mode\"."
39
+ "description": "Accessible name for the cluster. A group of buttons with no name is a group\nof buttons; with one it is \"Blend mode\".",
40
+ "control": {
41
+ "kind": "string"
42
+ }
30
43
  },
31
44
  {
32
45
  "name": "children",
33
46
  "type": "ReactNode",
34
47
  "required": true,
35
48
  "defaultValue": null,
36
- "description": "The buttons — {@link Button }, {@link IconButton } or anything button-shaped."
49
+ "description": "The buttons — {@link Button }, {@link IconButton } or anything button-shaped.",
50
+ "control": {
51
+ "kind": "node",
52
+ "fixture": "children.text"
53
+ }
37
54
  }
38
55
  ],
39
56
  "typeReferences": [
@@ -12,28 +12,65 @@
12
12
  "type": "RenderProp<Record<string, unknown>>",
13
13
  "required": false,
14
14
  "defaultValue": null,
15
- "description": "Replace the rendered element (Base UI render prop). Accepts an element —\n`render={<a href=\"/x\" />}` — or a function returning one. When set, the\ndefault `type=\"button\"` is dropped so non-button elements stay valid."
15
+ "description": "Replace the rendered element (Base UI render prop). Accepts an element —\n`render={<a href=\"/x\" />}` — or a function returning one. When set, the\ndefault `type=\"button\"` is dropped so non-button elements stay valid.",
16
+ "control": {
17
+ "kind": "opaque"
18
+ }
16
19
  },
17
20
  {
18
21
  "name": "icon",
19
22
  "type": "ElementType<any, keyof IntrinsicElements>",
20
23
  "required": false,
21
24
  "defaultValue": null,
22
- "description": "Optional leading icon component (e.g. a lucide icon). Rendered\n`aria-hidden` and sized to the density icon token, so it tracks the density\nlevel without the caller passing a pixel size."
25
+ "description": "Optional leading icon component (e.g. a lucide icon). Rendered\n`aria-hidden` and sized to the density icon token, so it tracks the density\nlevel without the caller passing a pixel size.",
26
+ "control": {
27
+ "kind": "opaque",
28
+ "fixture": "icon.play"
29
+ }
30
+ },
31
+ {
32
+ "name": "children",
33
+ "type": "ReactNode",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "The label. A button with no children and no other accessible name is a\ncontrol a screen reader announces as nothing.\n\nDeclared explicitly, although `React.ComponentPropsWithoutRef<\"button\">`\nalready carries it, for the reason `Card.Header` and `Bento.Tile` declare\ntheirs: docgen documents a prop only where the library *declares* it, so\nwithout this line the manifest files no `children` for the system's most\nused control — the props table omits it, and a propSet cannot name it,\nwhich is how `/play/button` came to preview an unlabelled `<button>`.",
37
+ "control": {
38
+ "kind": "node",
39
+ "fixture": "children.text"
40
+ }
23
41
  },
24
42
  {
25
43
  "name": "size",
26
44
  "type": "\"sm\" | \"md\" | \"lg\"",
27
45
  "required": false,
28
46
  "defaultValue": "md",
29
- "description": ""
47
+ "description": "",
48
+ "control": {
49
+ "kind": "enum",
50
+ "members": [
51
+ "sm",
52
+ "md",
53
+ "lg"
54
+ ]
55
+ }
30
56
  },
31
57
  {
32
58
  "name": "variant",
33
59
  "type": "\"danger\" | \"ghost\" | \"secondary\" | \"primary\" | \"outline\" | \"danger-outline\"",
34
60
  "required": false,
35
61
  "defaultValue": "secondary",
36
- "description": ""
62
+ "description": "",
63
+ "control": {
64
+ "kind": "enum",
65
+ "members": [
66
+ "primary",
67
+ "secondary",
68
+ "ghost",
69
+ "outline",
70
+ "danger",
71
+ "danger-outline"
72
+ ]
73
+ }
37
74
  }
38
75
  ],
39
76
  "typeReferences": [
@@ -14,7 +14,10 @@
14
14
  "type": "boolean",
15
15
  "required": false,
16
16
  "defaultValue": null,
17
- "description": "Trails a caret after the last line while the document is still being written."
17
+ "description": "Trails a caret after the last line while the document is still being written.",
18
+ "control": {
19
+ "kind": "boolean"
20
+ }
18
21
  }
19
22
  ],
20
23
  "typeReferences": [