@cueplusplus/ui 0.1.0 → 0.3.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 (246) hide show
  1. package/CHANGELOG.md +705 -0
  2. package/dist/brand/_chassis.d.ts +54 -0
  3. package/dist/brand/_chassis.js +81 -0
  4. package/dist/brand/_geometry.js +41 -0
  5. package/dist/brand/cue-logotype.d.ts +29 -0
  6. package/dist/brand/cue-logotype.js +60 -0
  7. package/dist/brand/cue-mark.d.ts +30 -0
  8. package/dist/brand/cue-mark.js +61 -0
  9. package/dist/brand/index.d.ts +5 -0
  10. package/dist/brand/plussie.d.ts +67 -0
  11. package/dist/brand/plussie.js +125 -0
  12. package/dist/chat/agent-pile.js +1 -1
  13. package/dist/chat/ask-box.js +2 -2
  14. package/dist/chat/delegation-card.js +1 -1
  15. package/dist/chat/message.js +2 -2
  16. package/dist/chrome/_edge-scroller.d.ts +45 -0
  17. package/dist/chrome/_edge-scroller.js +149 -0
  18. package/dist/chrome/_glyphs.js +19 -1
  19. package/dist/chrome/_tabs-scroll.d.ts +13 -8
  20. package/dist/chrome/_tabs-scroll.js +13 -8
  21. package/dist/chrome/app-bar.d.ts +103 -0
  22. package/dist/chrome/app-bar.js +175 -0
  23. package/dist/chrome/app-shell.d.ts +125 -0
  24. package/dist/chrome/app-shell.js +167 -0
  25. package/dist/chrome/footer.d.ts +75 -0
  26. package/dist/chrome/footer.js +68 -0
  27. package/dist/chrome/index.d.ts +5 -1
  28. package/dist/chrome/index.js +4 -1
  29. package/dist/chrome/navigation-menu.js +1 -1
  30. package/dist/chrome/page-shell.d.ts +1 -1
  31. package/dist/chrome/page-shell.js +15 -5
  32. package/dist/chrome/segmented-control.d.ts +19 -0
  33. package/dist/chrome/segmented-control.js +40 -21
  34. package/dist/chrome/tabs.js +21 -65
  35. package/dist/chrome/toolbar.d.ts +22 -0
  36. package/dist/chrome/toolbar.js +26 -5
  37. package/dist/configurator/_overrides.js +22 -8
  38. package/dist/configurator/configurator.js +1 -1
  39. package/dist/configurator/panel-sections.js +10 -4
  40. package/dist/dmx/channel-matrix.js +1 -1
  41. package/dist/forms/otp-field.js +1 -1
  42. package/dist/index.d.ts +18 -9
  43. package/dist/index.js +16 -10
  44. package/dist/instruments/data-table.js +1 -1
  45. package/dist/instruments/index.d.ts +2 -2
  46. package/dist/instruments/index.js +2 -2
  47. package/dist/instruments/table.d.ts +14 -1
  48. package/dist/instruments/table.js +20 -1
  49. package/dist/layout/carousel.js +1 -1
  50. package/dist/layout/container.d.ts +1 -1
  51. package/dist/layout/container.js +6 -3
  52. package/dist/layout/index.d.ts +3 -3
  53. package/dist/layout/index.js +3 -3
  54. package/dist/layout/pagination.js +1 -1
  55. package/dist/layout/sidebar.d.ts +23 -3
  56. package/dist/layout/sidebar.js +18 -7
  57. package/dist/midi/spectrum-visualizer.js +1 -1
  58. package/dist/midi/timeline-ruler.js +1 -1
  59. package/dist/overlays/command-palette.js +1 -1
  60. package/dist/overlays/dialog.js +1 -1
  61. package/dist/overlays/dropdown-menu.js +2 -2
  62. package/dist/overlays/hover-card.js +1 -1
  63. package/dist/overlays/index.js +1 -1
  64. package/dist/overlays/popover.js +1 -1
  65. package/dist/overlays/sheet.js +1 -1
  66. package/dist/overlays/toast.js +1 -1
  67. package/dist/primitives/chip.d.ts +1 -1
  68. package/dist/primitives/index.d.ts +1 -1
  69. package/dist/primitives/index.js +1 -1
  70. package/dist/primitives/status-dot.d.ts +7 -0
  71. package/dist/primitives/status-dot.js +8 -1
  72. package/dist/styles.css +58 -2
  73. package/dist/system/density.d.ts +4 -1
  74. package/dist/system/density.js +12 -4
  75. package/dist/system/index.d.ts +4 -4
  76. package/dist/system/portal.d.ts +5 -5
  77. package/dist/system/portal.js +30 -11
  78. package/dist/system/prepaint.d.ts +34 -9
  79. package/dist/system/prepaint.js +48 -25
  80. package/dist/system/theme-provider.d.ts +48 -11
  81. package/dist/system/theme-provider.js +109 -35
  82. package/dist/system/use-density.d.ts +3 -3
  83. package/dist/system/use-density.js +16 -6
  84. package/dist/system/use-theme.d.ts +4 -2
  85. package/dist/system/use-theme.js +4 -2
  86. package/dist/theming/_presets.js +133 -5
  87. package/dist/theming/create-theme.d.ts +2 -2
  88. package/dist/theming/create-theme.js +37 -19
  89. package/dist/theming/serialize.d.ts +1 -1
  90. package/dist/theming/serialize.js +25 -1
  91. package/manifest/components/accordion.json +154 -0
  92. package/manifest/components/agent-pile.json +116 -0
  93. package/manifest/components/alert-dialog.json +190 -0
  94. package/manifest/components/app-bar.json +244 -0
  95. package/manifest/components/app-shell.json +291 -0
  96. package/manifest/components/app-window-frame.json +102 -0
  97. package/manifest/components/ask-box.json +209 -0
  98. package/manifest/components/autocomplete.json +197 -0
  99. package/manifest/components/avatar-group.json +72 -0
  100. package/manifest/components/avatar.json +95 -0
  101. package/manifest/components/breadcrumb.json +74 -0
  102. package/manifest/components/button-group.json +74 -0
  103. package/manifest/components/button.json +125 -0
  104. package/manifest/components/calendar.json +65 -0
  105. package/manifest/components/card.json +140 -0
  106. package/manifest/components/carousel.json +200 -0
  107. package/manifest/components/channel-matrix.json +173 -0
  108. package/manifest/components/chart-container.json +111 -0
  109. package/manifest/components/chart-ramp.json +72 -0
  110. package/manifest/components/chart-swatch.json +65 -0
  111. package/manifest/components/chart-tooltip-content.json +114 -0
  112. package/manifest/components/checkbox-group.json +68 -0
  113. package/manifest/components/checkbox.json +93 -0
  114. package/manifest/components/chip.json +132 -0
  115. package/manifest/components/collapsible.json +120 -0
  116. package/manifest/components/color-area.json +59 -0
  117. package/manifest/components/color-field.json +79 -0
  118. package/manifest/components/color-picker.json +175 -0
  119. package/manifest/components/color-slider.json +75 -0
  120. package/manifest/components/color-swatch.json +68 -0
  121. package/manifest/components/colors-section.json +66 -0
  122. package/manifest/components/combobox.json +198 -0
  123. package/manifest/components/command-palette.json +177 -0
  124. package/manifest/components/composer.json +176 -0
  125. package/manifest/components/container.json +60 -0
  126. package/manifest/components/context-menu.json +121 -0
  127. package/manifest/components/copy-button.json +93 -0
  128. package/manifest/components/cue-logotype.json +96 -0
  129. package/manifest/components/cue-mark.json +97 -0
  130. package/manifest/components/cue-portal-frame.json +55 -0
  131. package/manifest/components/data-table-pagination.json +83 -0
  132. package/manifest/components/data-table-toolbar.json +104 -0
  133. package/manifest/components/date-field.json +80 -0
  134. package/manifest/components/date-picker.json +191 -0
  135. package/manifest/components/date-range-picker.json +191 -0
  136. package/manifest/components/delegation-card.json +144 -0
  137. package/manifest/components/density.json +58 -0
  138. package/manifest/components/description-list.json +84 -0
  139. package/manifest/components/dialog.json +198 -0
  140. package/manifest/components/disclosure.json +109 -0
  141. package/manifest/components/dmx-bar.json +94 -0
  142. package/manifest/components/dmx-strip.json +101 -0
  143. package/manifest/components/drawer.json +179 -0
  144. package/manifest/components/dropdown-menu.json +229 -0
  145. package/manifest/components/empty-state.json +90 -0
  146. package/manifest/components/env-var-input.json +150 -0
  147. package/manifest/components/export-dialog.json +84 -0
  148. package/manifest/components/eyebrow.json +56 -0
  149. package/manifest/components/field-description.json +63 -0
  150. package/manifest/components/field-error.json +77 -0
  151. package/manifest/components/field-label.json +63 -0
  152. package/manifest/components/field.json +79 -0
  153. package/manifest/components/file-upload.json +159 -0
  154. package/manifest/components/flow-background.json +50 -0
  155. package/manifest/components/flow-controls.json +50 -0
  156. package/manifest/components/footer.json +112 -0
  157. package/manifest/components/grid.json +81 -0
  158. package/manifest/components/group-bar.json +102 -0
  159. package/manifest/components/hover-card.json +151 -0
  160. package/manifest/components/icon-button.json +88 -0
  161. package/manifest/components/info-tip.json +98 -0
  162. package/manifest/components/input-group.json +91 -0
  163. package/manifest/components/input.json +89 -0
  164. package/manifest/components/item.json +129 -0
  165. package/manifest/components/kbd.json +52 -0
  166. package/manifest/components/link.json +81 -0
  167. package/manifest/components/log-viewer.json +139 -0
  168. package/manifest/components/menubar.json +157 -0
  169. package/manifest/components/message-list.json +100 -0
  170. package/manifest/components/message.json +116 -0
  171. package/manifest/components/meter.json +114 -0
  172. package/manifest/components/multi-select.json +190 -0
  173. package/manifest/components/musical-time-input.json +113 -0
  174. package/manifest/components/navigation-menu.json +226 -0
  175. package/manifest/components/node-card.json +109 -0
  176. package/manifest/components/node-handle.json +69 -0
  177. package/manifest/components/number-field.json +107 -0
  178. package/manifest/components/otp-field.json +128 -0
  179. package/manifest/components/page-shell.json +96 -0
  180. package/manifest/components/pagination.json +92 -0
  181. package/manifest/components/panel-header.json +77 -0
  182. package/manifest/components/panel.json +71 -0
  183. package/manifest/components/password-input.json +119 -0
  184. package/manifest/components/piano-keyboard.json +120 -0
  185. package/manifest/components/plussie.json +111 -0
  186. package/manifest/components/popover.json +193 -0
  187. package/manifest/components/preset-section.json +73 -0
  188. package/manifest/components/progress.json +95 -0
  189. package/manifest/components/radio-group.json +73 -0
  190. package/manifest/components/radio.json +80 -0
  191. package/manifest/components/rating.json +141 -0
  192. package/manifest/components/resizable.json +88 -0
  193. package/manifest/components/row.json +109 -0
  194. package/manifest/components/scroll-area.json +91 -0
  195. package/manifest/components/scrollable-tabs-list.json +83 -0
  196. package/manifest/components/scrub-input.json +200 -0
  197. package/manifest/components/seam-cell.json +75 -0
  198. package/manifest/components/seam-grid.json +75 -0
  199. package/manifest/components/seam-list.json +56 -0
  200. package/manifest/components/search-input.json +134 -0
  201. package/manifest/components/section-header.json +112 -0
  202. package/manifest/components/segmented-control.json +138 -0
  203. package/manifest/components/select.json +194 -0
  204. package/manifest/components/separator.json +53 -0
  205. package/manifest/components/shape-section.json +66 -0
  206. package/manifest/components/sheet.json +186 -0
  207. package/manifest/components/sidebar.json +198 -0
  208. package/manifest/components/signal-edge.json +56 -0
  209. package/manifest/components/skeleton.json +46 -0
  210. package/manifest/components/slider.json +89 -0
  211. package/manifest/components/sparkline.json +76 -0
  212. package/manifest/components/spectrum-visualizer.json +115 -0
  213. package/manifest/components/spinner.json +61 -0
  214. package/manifest/components/stack.json +96 -0
  215. package/manifest/components/stat.json +87 -0
  216. package/manifest/components/status-bar.json +58 -0
  217. package/manifest/components/status-dot.json +78 -0
  218. package/manifest/components/stepper.json +89 -0
  219. package/manifest/components/switch.json +87 -0
  220. package/manifest/components/table-scroll-region.json +69 -0
  221. package/manifest/components/table.json +155 -0
  222. package/manifest/components/tabs.json +145 -0
  223. package/manifest/components/tags-input.json +190 -0
  224. package/manifest/components/terminal-frame.json +119 -0
  225. package/manifest/components/textarea.json +76 -0
  226. package/manifest/components/theme-configurator.json +124 -0
  227. package/manifest/components/theme-provider.json +134 -0
  228. package/manifest/components/threshold-rail.json +160 -0
  229. package/manifest/components/time-field.json +80 -0
  230. package/manifest/components/timeline-ruler.json +139 -0
  231. package/manifest/components/timeline.json +115 -0
  232. package/manifest/components/title-bar.json +82 -0
  233. package/manifest/components/toast.json +130 -0
  234. package/manifest/components/toggle-group.json +106 -0
  235. package/manifest/components/toggle.json +109 -0
  236. package/manifest/components/token-editor.json +90 -0
  237. package/manifest/components/toolbar.json +163 -0
  238. package/manifest/components/tooltip.json +164 -0
  239. package/manifest/components/tree-visibility-toggle.json +84 -0
  240. package/manifest/components/tree.json +140 -0
  241. package/manifest/components/two-step-button.json +113 -0
  242. package/manifest/components/universe-grid.json +127 -0
  243. package/manifest/components/usage-chart.json +124 -0
  244. package/manifest/manifest.json +2142 -0
  245. package/manifest/tokens.json +138 -0
  246. package/package.json +13 -5
@@ -0,0 +1,197 @@
1
+ {
2
+ "name": "Autocomplete",
3
+ "slug": "autocomplete",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A text field that suggests as you type — and accepts what you typed anyway.\n\nThe counterpart to {@link Combobox }: there the list *is* the set of legal\nvalues, here it is only a shortcut. Anything the user types survives blur, so\nthis is the right control for a name, a search term or a host — anywhere the\nsuggestions are a convenience rather than a constraint.\n\nSuggestions are plain strings for the same reason: an autocomplete has no\nseparate value/label axis, because the label *is* the value.\n\nThe popup is portalled through {@link useCuePortalProps}, so it carries the\ncaller's `data-theme` / `data-density` / `data-mode`.",
9
+ "props": [
10
+ {
11
+ "name": "items",
12
+ "type": "readonly string[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The suggestions, filtered against what is typed."
16
+ },
17
+ {
18
+ "name": "value",
19
+ "type": "string",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Current text. Use with `onValueChange` for a controlled field."
23
+ },
24
+ {
25
+ "name": "defaultValue",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Initial text for an uncontrolled field."
30
+ },
31
+ {
32
+ "name": "onValueChange",
33
+ "type": "((value: string) => void)",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "Fired on every keystroke and when a suggestion is picked."
37
+ },
38
+ {
39
+ "name": "placeholder",
40
+ "type": "string",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "Shown while the field is empty."
44
+ },
45
+ {
46
+ "name": "emptyMessage",
47
+ "type": "ReactNode",
48
+ "required": false,
49
+ "defaultValue": "No matches",
50
+ "description": "Shown in place of the list when the query matches nothing."
51
+ },
52
+ {
53
+ "name": "size",
54
+ "type": "\"sm\" | \"md\" | \"lg\"",
55
+ "required": false,
56
+ "defaultValue": null,
57
+ "description": "Rung of the control ladder. Defaults to `\"md\"`."
58
+ },
59
+ {
60
+ "name": "autoHighlight",
61
+ "type": "boolean",
62
+ "required": false,
63
+ "defaultValue": "false",
64
+ "description": "Highlight the first match automatically so Enter accepts it."
65
+ },
66
+ {
67
+ "name": "disabled",
68
+ "type": "boolean",
69
+ "required": false,
70
+ "defaultValue": null,
71
+ "description": "Prevent opening and grey the field out."
72
+ },
73
+ {
74
+ "name": "required",
75
+ "type": "boolean",
76
+ "required": false,
77
+ "defaultValue": null,
78
+ "description": "Require text before the owning form submits."
79
+ },
80
+ {
81
+ "name": "name",
82
+ "type": "string",
83
+ "required": false,
84
+ "defaultValue": null,
85
+ "description": "Name for the input, when the field is part of a form."
86
+ },
87
+ {
88
+ "name": "id",
89
+ "type": "string",
90
+ "required": false,
91
+ "defaultValue": null,
92
+ "description": "Id forwarded to the input."
93
+ },
94
+ {
95
+ "name": "aria-label",
96
+ "type": "string",
97
+ "required": false,
98
+ "defaultValue": null,
99
+ "description": "Accessible name for the input, when no {@link FieldLabel } names it."
100
+ },
101
+ {
102
+ "name": "aria-labelledby",
103
+ "type": "string",
104
+ "required": false,
105
+ "defaultValue": null,
106
+ "description": "Id of the element naming the input."
107
+ },
108
+ {
109
+ "name": "clearLabel",
110
+ "type": "string",
111
+ "required": false,
112
+ "defaultValue": "Clear",
113
+ "description": "Accessible name for the clear button. Defaults to `\"Clear\"`."
114
+ },
115
+ {
116
+ "name": "className",
117
+ "type": "string",
118
+ "required": false,
119
+ "defaultValue": null,
120
+ "description": "Extra classes for the field."
121
+ },
122
+ {
123
+ "name": "popupClassName",
124
+ "type": "string",
125
+ "required": false,
126
+ "defaultValue": null,
127
+ "description": "Extra classes for the popup surface."
128
+ },
129
+ {
130
+ "name": "sideOffset",
131
+ "type": "number",
132
+ "required": false,
133
+ "defaultValue": "4",
134
+ "description": "Distance in px between the field and the popup. Defaults to `4`."
135
+ }
136
+ ],
137
+ "typeReferences": [],
138
+ "subcomponents": [],
139
+ "parts": [],
140
+ "variants": {},
141
+ "defaultVariants": {},
142
+ "tokensUsed": [
143
+ "--cue-accent",
144
+ "--cue-accent-soft",
145
+ "--cue-border",
146
+ "--cue-border-overlay",
147
+ "--cue-chip-h",
148
+ "--cue-control-lg",
149
+ "--cue-control-md",
150
+ "--cue-control-sm",
151
+ "--cue-danger",
152
+ "--cue-fg",
153
+ "--cue-fg-muted",
154
+ "--cue-fg-subtle",
155
+ "--cue-font-mono",
156
+ "--cue-icon-sm",
157
+ "--cue-radius-control",
158
+ "--cue-radius-overlay",
159
+ "--cue-scrim",
160
+ "--cue-space-1",
161
+ "--cue-space-2",
162
+ "--cue-space-3",
163
+ "--cue-space-4",
164
+ "--cue-space-5",
165
+ "--cue-sunken",
166
+ "--cue-surface-2",
167
+ "--cue-text-body",
168
+ "--cue-text-emphasis",
169
+ "--cue-text-label",
170
+ "--cue-text-ui"
171
+ ],
172
+ "summary": "A text field that suggests as you type — and accepts what you typed anyway.",
173
+ "examples": [
174
+ {
175
+ "title": "Usage",
176
+ "code": "<Autocomplete aria-label=\"Cue name\" items={recentCues} onValueChange={setName} />",
177
+ "language": "tsx"
178
+ }
179
+ ],
180
+ "status": "todo-docs",
181
+ "url": "/docs/components/autocomplete",
182
+ "mdUrl": "/docs/components/autocomplete.md",
183
+ "jsonUrl": "/r/components/autocomplete.json",
184
+ "specimens": [
185
+ {
186
+ "title": "Autocomplete",
187
+ "group": "forms",
188
+ "components": [
189
+ "Autocomplete"
190
+ ],
191
+ "code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-3\">\n <Autocomplete aria-label=\"Protocol\" items={PROTOCOLS} placeholder=\"Protocol\" />\n <Autocomplete\n aria-label=\"Protocol, highlighted\"\n items={PROTOCOLS}\n defaultValue=\"Art\"\n autoHighlight\n />\n <Autocomplete aria-label=\"Protocol, disabled\" items={PROTOCOLS} defaultValue=\"OSC\" disabled />\n</div>",
192
+ "note": "Suggestions over free text: the field keeps whatever was typed, and the list only offers.",
193
+ "interaction": "the list opens on input, not on focus; `autoHighlight` pre-selects the first match."
194
+ }
195
+ ],
196
+ "todo": true
197
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "AvatarGroup",
3
+ "slug": "avatar-group",
4
+ "group": "primitives",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "An overlapping stack of {@link Avatar}s with a `+N` overflow chip.\n\nEach item after the first is pulled left by a negative inline-start margin\nand ringed in the page background colour, which is what reads as \"stacked\"\nrather than \"crowded\". Logical margins, so the stack flips correctly in RTL.",
9
+ "props": [
10
+ {
11
+ "name": "max",
12
+ "type": "number",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Show at most this many avatars; the rest collapse into a `+N` chip. Omit for no limit."
16
+ },
17
+ {
18
+ "name": "size",
19
+ "type": "\"sm\" | \"md\" | \"lg\"",
20
+ "required": false,
21
+ "defaultValue": "md",
22
+ "description": "Size of the `+N` overflow chip. Match it to the avatars you pass in. Defaults to `\"md\"`."
23
+ }
24
+ ],
25
+ "typeReferences": [
26
+ "React.ComponentPropsWithoutRef<\"div\">"
27
+ ],
28
+ "subcomponents": [],
29
+ "parts": [],
30
+ "variants": {},
31
+ "defaultVariants": {},
32
+ "tokensUsed": [
33
+ "--cue-bg",
34
+ "--cue-border",
35
+ "--cue-control-lg",
36
+ "--cue-control-md",
37
+ "--cue-control-sm",
38
+ "--cue-fg-muted",
39
+ "--cue-font-mono",
40
+ "--cue-space-2",
41
+ "--cue-surface-2",
42
+ "--cue-surface-3",
43
+ "--cue-text-label",
44
+ "--cue-text-micro",
45
+ "--cue-text-ui"
46
+ ],
47
+ "summary": "An overlapping stack of {@link Avatar}s with a `+N` overflow chip.",
48
+ "examples": [
49
+ {
50
+ "title": "Usage",
51
+ "code": "<AvatarGroup max={3}>\n {users.map((u) => <Avatar key={u.id} alt={u.name} src={u.avatar} />)}\n</AvatarGroup>",
52
+ "language": "tsx"
53
+ }
54
+ ],
55
+ "status": "todo-docs",
56
+ "url": "/docs/components/avatar-group",
57
+ "mdUrl": "/docs/components/avatar-group.md",
58
+ "jsonUrl": "/r/components/avatar-group.json",
59
+ "specimens": [
60
+ {
61
+ "title": "AvatarGroup",
62
+ "group": "primitives",
63
+ "components": [
64
+ "AvatarGroup"
65
+ ],
66
+ "code": "<Specimens>\n <Specimen label=\"default\">\n <AvatarGroup>\n <Avatar fallback=\"CR\" />\n <Avatar fallback=\"JM\" />\n <Avatar fallback=\"AP\" />\n </AvatarGroup>\n </Specimen>\n <Specimen label=\"max 2\">\n <AvatarGroup max={2}>\n <Avatar fallback=\"CR\" />\n <Avatar fallback=\"JM\" />\n <Avatar fallback=\"AP\" />\n <Avatar fallback=\"LS\" />\n </AvatarGroup>\n </Specimen>\n</Specimens>",
67
+ "note": "Overlapping faces with an overflow count.",
68
+ "interaction": "none."
69
+ }
70
+ ],
71
+ "todo": true
72
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "Avatar",
3
+ "slug": "avatar",
4
+ "group": "primitives",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A round user/entity avatar sized off the density control ladder, so it lines\nup with the buttons and inputs on the same row.\n\nWraps Base UI's `Avatar`, which owns the image-loading state machine: the\nfallback shows immediately, is replaced when the image decodes, and comes\nback if the image errors.",
9
+ "props": [
10
+ {
11
+ "name": "src",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Image URL. Omit to go straight to the fallback."
16
+ },
17
+ {
18
+ "name": "alt",
19
+ "type": "string",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Alt text for the image, and the name the default initials are derived from."
23
+ },
24
+ {
25
+ "name": "fallback",
26
+ "type": "ReactNode",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "What to show while the image loads or after it fails. Defaults to initials from `alt`."
30
+ },
31
+ {
32
+ "name": "size",
33
+ "type": "\"sm\" | \"md\" | \"lg\"",
34
+ "required": false,
35
+ "defaultValue": "md",
36
+ "description": ""
37
+ }
38
+ ],
39
+ "typeReferences": [
40
+ "Omit<React.ComponentPropsWithoutRef<\"span\">, \"children\">",
41
+ "VariantProps<typeof avatarVariants>"
42
+ ],
43
+ "subcomponents": [],
44
+ "parts": [],
45
+ "variants": {
46
+ "size": [
47
+ "sm",
48
+ "md",
49
+ "lg"
50
+ ]
51
+ },
52
+ "defaultVariants": {
53
+ "size": "md"
54
+ },
55
+ "tokensUsed": [
56
+ "--cue-bg",
57
+ "--cue-border",
58
+ "--cue-control-lg",
59
+ "--cue-control-md",
60
+ "--cue-control-sm",
61
+ "--cue-fg-muted",
62
+ "--cue-font-mono",
63
+ "--cue-space-2",
64
+ "--cue-surface-2",
65
+ "--cue-surface-3",
66
+ "--cue-text-label",
67
+ "--cue-text-micro",
68
+ "--cue-text-ui"
69
+ ],
70
+ "summary": "A round user/entity avatar sized off the density control ladder, so it lines up with the buttons and inputs on the same row.",
71
+ "examples": [
72
+ {
73
+ "title": "Usage",
74
+ "code": "<Avatar alt=\"Ada Lovelace\" src=\"/ada.png\" />\n<Avatar alt=\"Ada Lovelace\" size=\"sm\" />",
75
+ "language": "tsx"
76
+ }
77
+ ],
78
+ "status": "todo-docs",
79
+ "url": "/docs/components/avatar",
80
+ "mdUrl": "/docs/components/avatar.md",
81
+ "jsonUrl": "/r/components/avatar.json",
82
+ "specimens": [
83
+ {
84
+ "title": "Avatar",
85
+ "group": "primitives",
86
+ "components": [
87
+ "Avatar"
88
+ ],
89
+ "code": "<Specimens>\n {SIZES.map((size) => (\n <Specimen key={size} label={size}>\n <Avatar size={size} fallback=\"CR\" />\n </Specimen>\n ))}\n <Specimen label=\"image\">\n <Avatar\n src=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='%23888'/%3E%3C/svg%3E\"\n alt=\"Operator portrait\"\n />\n </Specimen>\n</Specimens>",
90
+ "note": "Initials fall back when there is no image; the ring is drawn in the background colour so a pile reads as separate faces.",
91
+ "interaction": "none."
92
+ }
93
+ ],
94
+ "todo": true
95
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "Breadcrumb",
3
+ "slug": "breadcrumb",
4
+ "group": "layout",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "Where you are, and how to get back.\n\nThe last crumb is never a link: it is the page you are on, marked\n`aria-current=\"page\"` and set in full-strength ink so the trail has one\nvisible end. Separators are `aria-hidden` — a screen reader announcing\n\"console slash patch slash universe 1\" is reading punctuation, not structure.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "items",
12
+ "type": "readonly BreadcrumbItem[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The trail, root first. The last entry is the current page."
16
+ },
17
+ {
18
+ "name": "separator",
19
+ "type": "ReactNode",
20
+ "required": false,
21
+ "defaultValue": "/",
22
+ "description": "What sits between crumbs. Defaults to `\"/\"`."
23
+ },
24
+ {
25
+ "name": "label",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": "Breadcrumb",
29
+ "description": "The nav's accessible name. Defaults to `\"Breadcrumb\"`."
30
+ }
31
+ ],
32
+ "typeReferences": [
33
+ "Omit<React.ComponentPropsWithoutRef<\"nav\">, \"children\">"
34
+ ],
35
+ "subcomponents": [],
36
+ "parts": [],
37
+ "variants": {},
38
+ "defaultVariants": {},
39
+ "tokensUsed": [
40
+ "--cue-accent",
41
+ "--cue-fg",
42
+ "--cue-fg-muted",
43
+ "--cue-fg-subtle",
44
+ "--cue-font-mono",
45
+ "--cue-radius-control",
46
+ "--cue-space-2",
47
+ "--cue-text-label"
48
+ ],
49
+ "summary": "Where you are, and how to get back.",
50
+ "examples": [
51
+ {
52
+ "title": "Usage",
53
+ "code": "<Breadcrumb items={[{ label: \"Console\", href: \"/\" }, { label: \"Patch\" }]} />",
54
+ "language": "tsx"
55
+ }
56
+ ],
57
+ "status": "todo-docs",
58
+ "url": "/docs/components/breadcrumb",
59
+ "mdUrl": "/docs/components/breadcrumb.md",
60
+ "jsonUrl": "/r/components/breadcrumb.json",
61
+ "specimens": [
62
+ {
63
+ "title": "Breadcrumb",
64
+ "group": "layout",
65
+ "components": [
66
+ "Breadcrumb"
67
+ ],
68
+ "code": "<Breadcrumb items={CRUMBS} />",
69
+ "note": "Where you are, with `aria-hidden` punctuation between the crumbs and the last one marked current.",
70
+ "interaction": "every crumb but the last is a link; the last is plain text."
71
+ }
72
+ ],
73
+ "todo": true
74
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "ButtonGroup",
3
+ "slug": "button-group",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Several related actions drawn as one control.\n\nPurely presentational: it owns no state and imposes no roving focus, because\nits members are *actions*, each independently reachable by Tab. When the\nmembers represent a **choice** rather than actions, use {@link ToggleGroup }\n(several or none) or `SegmentedControl` (exactly one) — those carry the\npressed-state ARIA a group of plain buttons must not fake.\n\nThe children keep their own variants, so a `secondary`/`primary` pair reads as\n\"and here is the one you probably want\" without any extra API.",
9
+ "props": [
10
+ {
11
+ "name": "orientation",
12
+ "type": "\"horizontal\" | \"vertical\"",
13
+ "required": false,
14
+ "defaultValue": "horizontal",
15
+ "description": "Which way the children run. Defaults to `\"horizontal\"`."
16
+ },
17
+ {
18
+ "name": "attached",
19
+ "type": "boolean",
20
+ "required": false,
21
+ "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."
23
+ },
24
+ {
25
+ "name": "aria-label",
26
+ "type": "string",
27
+ "required": false,
28
+ "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\"."
30
+ },
31
+ {
32
+ "name": "children",
33
+ "type": "ReactNode",
34
+ "required": true,
35
+ "defaultValue": null,
36
+ "description": "The buttons — {@link Button }, {@link IconButton } or anything button-shaped."
37
+ }
38
+ ],
39
+ "typeReferences": [
40
+ "React.ComponentPropsWithoutRef<\"div\">"
41
+ ],
42
+ "subcomponents": [],
43
+ "parts": [],
44
+ "variants": {},
45
+ "defaultVariants": {},
46
+ "tokensUsed": [
47
+ "--cue-space-2"
48
+ ],
49
+ "summary": "Several related actions drawn as one control.",
50
+ "examples": [
51
+ {
52
+ "title": "Usage",
53
+ "code": "<ButtonGroup aria-label=\"Blend mode\">\n <Button>HTP</Button>\n <Button variant=\"primary\">LTP</Button>\n</ButtonGroup>\n<ButtonGroup aria-label=\"Zoom\" orientation=\"vertical\">\n <IconButton aria-label=\"Zoom in\" icon={Plus} variant=\"outline\" />\n <IconButton aria-label=\"Zoom out\" icon={Minus} variant=\"outline\" />\n</ButtonGroup>",
54
+ "language": "tsx"
55
+ }
56
+ ],
57
+ "status": "todo-docs",
58
+ "url": "/docs/components/button-group",
59
+ "mdUrl": "/docs/components/button-group.md",
60
+ "jsonUrl": "/r/components/button-group.json",
61
+ "specimens": [
62
+ {
63
+ "title": "ButtonGroup",
64
+ "group": "forms",
65
+ "components": [
66
+ "ButtonGroup"
67
+ ],
68
+ "code": "<Specimens>\n <Specimen label=\"attached\">\n <ButtonGroup>\n <Button>Patch</Button>\n <Button>Unpatch</Button>\n <Button>Swap</Button>\n </ButtonGroup>\n </Specimen>\n <Specimen label=\"spaced\">\n <ButtonGroup attached={false}>\n <Button>Patch</Button>\n <Button variant=\"primary\">Apply</Button>\n </ButtonGroup>\n </Specimen>\n <Specimen label=\"vertical\">\n <ButtonGroup orientation=\"vertical\">\n <Button>Up</Button>\n <Button>Down</Button>\n </ButtonGroup>\n </Specimen>\n</Specimens>",
69
+ "note": "Buttons welded into one control, horizontally or vertically.",
70
+ "interaction": "each button keeps its own focus ring; only the outer corners are rounded."
71
+ }
72
+ ],
73
+ "todo": true
74
+ }
@@ -0,0 +1,125 @@
1
+ {
2
+ "name": "Button",
3
+ "slug": "button",
4
+ "group": "primitives",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The system's primary action control.\n\nA real `<button>` by default, restyled entirely from tokens: height comes\nfrom the density control ladder, colour from the theme's accent/surface ramp.\nThe focus ring is an `outline`, never a `box-shadow`, so it survives inside\n`overflow: hidden` panels.",
9
+ "props": [
10
+ {
11
+ "name": "render",
12
+ "type": "RenderProp<Record<string, unknown>>",
13
+ "required": false,
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."
16
+ },
17
+ {
18
+ "name": "icon",
19
+ "type": "ElementType<any, keyof IntrinsicElements>",
20
+ "required": false,
21
+ "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."
23
+ },
24
+ {
25
+ "name": "size",
26
+ "type": "\"sm\" | \"md\" | \"lg\"",
27
+ "required": false,
28
+ "defaultValue": "md",
29
+ "description": ""
30
+ },
31
+ {
32
+ "name": "variant",
33
+ "type": "\"danger\" | \"ghost\" | \"secondary\" | \"primary\" | \"outline\" | \"danger-outline\"",
34
+ "required": false,
35
+ "defaultValue": "secondary",
36
+ "description": ""
37
+ }
38
+ ],
39
+ "typeReferences": [
40
+ "React.ComponentPropsWithoutRef<\"button\">",
41
+ "VariantProps<typeof buttonVariants>"
42
+ ],
43
+ "subcomponents": [],
44
+ "parts": [],
45
+ "variants": {
46
+ "variant": [
47
+ "primary",
48
+ "secondary",
49
+ "ghost",
50
+ "outline",
51
+ "danger",
52
+ "danger-outline"
53
+ ],
54
+ "size": [
55
+ "sm",
56
+ "md",
57
+ "lg"
58
+ ]
59
+ },
60
+ "defaultVariants": {
61
+ "variant": "secondary",
62
+ "size": "md"
63
+ },
64
+ "tokensUsed": [
65
+ "--cue-accent",
66
+ "--cue-accent-fg",
67
+ "--cue-accent-hover",
68
+ "--cue-border",
69
+ "--cue-border-strong",
70
+ "--cue-control-lg",
71
+ "--cue-control-md",
72
+ "--cue-control-sm",
73
+ "--cue-danger",
74
+ "--cue-fg",
75
+ "--cue-fg-muted",
76
+ "--cue-font-mono",
77
+ "--cue-icon-md",
78
+ "--cue-icon-sm",
79
+ "--cue-radius-control",
80
+ "--cue-space-4",
81
+ "--cue-space-5",
82
+ "--cue-space-6",
83
+ "--cue-surface-2",
84
+ "--cue-text-emphasis",
85
+ "--cue-text-ui"
86
+ ],
87
+ "summary": "The action control: six variants across three density-sized heights.",
88
+ "examples": [
89
+ {
90
+ "title": "Usage",
91
+ "code": "<Button variant=\"primary\" size=\"sm\" icon={Play}>Run cue</Button>\n// Compose with a router link instead of a <button>:\n<Button render={<Link href=\"/patch\" />}>Patch</Button>",
92
+ "language": "tsx"
93
+ }
94
+ ],
95
+ "status": "stable",
96
+ "url": "/docs/components/button",
97
+ "mdUrl": "/docs/components/button.md",
98
+ "jsonUrl": "/r/components/button.json",
99
+ "whenToUse": [
100
+ "An action that happens on this page: submit, run, open a dialog.",
101
+ "Something that must look like a button but render as something else. Pass `render={<Link href=\"/patch\" />}`."
102
+ ],
103
+ "whenNotToUse": [
104
+ "Navigation that should behave like a link (middle-click, copy address). Use `Link`.",
105
+ "An icon-only control. Use `IconButton`, which requires the `aria-label` a bare icon needs.",
106
+ "A destructive action that should be confirmed where it stands. Use `TwoStepButton`."
107
+ ],
108
+ "commonMistakes": [
109
+ "Reaching for `variant=\"primary\"` on every button. One primary per view; `secondary` is the default for a reason.",
110
+ "Styling a Base UI trigger directly instead of passing `render={<Button />}`, which drops the variant classes into a tailwind-merge tie-break.",
111
+ "Fixing the height with `h-8 px-3` instead of `size`, which stops tracking density."
112
+ ],
113
+ "specimens": [
114
+ {
115
+ "title": "Button",
116
+ "group": "primitives",
117
+ "components": [
118
+ "Button"
119
+ ],
120
+ "code": "<Specimens>\n {BUTTON_VARIANTS.map((variant) => (\n <Specimen key={variant} label={variant}>\n <Button variant={variant}>Go</Button>\n </Specimen>\n ))}\n <Specimen label=\"disabled\">\n <Button disabled>Go</Button>\n </Specimen>\n <Specimen label=\"with icon\">\n <Button variant=\"primary\" icon={Play}>\n Go\n </Button>\n </Specimen>\n <Specimen label=\"loading\">\n <Button disabled>\n <Spinner size=\"sm\" /> Patching\n </Button>\n </Specimen>\n</Specimens>\n<Specimens>\n {SIZES.map((size) => (\n <Specimen key={size} label={`size ${size}`}>\n <Button size={size}>Go</Button>\n </Specimen>\n ))}\n</Specimens>",
121
+ "note": "Six variants, three sizes. The accent ink is theme-controlled, so `primary` is never a hardcoded white on blue.",
122
+ "interaction": "hover darkens the fill (or tints the ground, for the quiet variants); keyboard focus draws a 2px accent ring outside the border, so the border-colour convention and the ring never fight."
123
+ }
124
+ ]
125
+ }