@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,84 @@
1
+ {
2
+ "name": "ExportDialog",
3
+ "slug": "export-dialog",
4
+ "group": "configurator",
5
+ "importPath": "@cueplusplus/ui/configurator",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The export dialog: CSS, DTCG tokens, a `createTheme()` call and a shadcn\n`registry:theme` item.\n\nAll four are generated from the overrides the panel is applying, so the CSS\none is *literally* the stylesheet on the page. Nothing here re-derives a\nvalue.",
9
+ "props": [
10
+ {
11
+ "name": "open",
12
+ "type": "boolean",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "Whether the dialog is showing."
16
+ },
17
+ {
18
+ "name": "onOpenChange",
19
+ "type": "(open: boolean) => void",
20
+ "required": true,
21
+ "defaultValue": null,
22
+ "description": "Called when it should open or close."
23
+ },
24
+ {
25
+ "name": "overrides",
26
+ "type": "ThemeOverrides",
27
+ "required": true,
28
+ "defaultValue": null,
29
+ "description": "The overrides to export."
30
+ },
31
+ {
32
+ "name": "scope",
33
+ "type": "ThemeScope",
34
+ "required": true,
35
+ "defaultValue": null,
36
+ "description": "The theme and mode they were made in."
37
+ },
38
+ {
39
+ "name": "defaultFormat",
40
+ "type": "\"css\" | \"dtcg\" | \"create-theme\" | \"registry\"",
41
+ "required": false,
42
+ "defaultValue": "css",
43
+ "description": "Format shown first. Defaults to `\"css\"`."
44
+ }
45
+ ],
46
+ "typeReferences": [],
47
+ "subcomponents": [],
48
+ "parts": [],
49
+ "variants": {},
50
+ "defaultVariants": {},
51
+ "tokensUsed": [
52
+ "--cue-accent",
53
+ "--cue-border",
54
+ "--cue-density",
55
+ "--cue-fg",
56
+ "--cue-fg-muted",
57
+ "--cue-font-mono",
58
+ "--cue-font-pairing-mono",
59
+ "--cue-font-sans",
60
+ "--cue-font-scale",
61
+ "--cue-font-theme-mono",
62
+ "--cue-radius-control",
63
+ "--cue-radius-scale",
64
+ "--cue-space-1",
65
+ "--cue-space-3",
66
+ "--cue-space-4",
67
+ "--cue-sunken",
68
+ "--cue-text-label",
69
+ "--cue-text-micro"
70
+ ],
71
+ "summary": "The export dialog: CSS, DTCG tokens, a `createTheme()` call and a shadcn `registry:theme` item.",
72
+ "examples": [
73
+ {
74
+ "title": "Usage",
75
+ "code": "<ExportDialog open={open} onOpenChange={setOpen} overrides={overrides} scope={scope} />",
76
+ "language": "tsx"
77
+ }
78
+ ],
79
+ "status": "todo-docs",
80
+ "url": "/docs/components/export-dialog",
81
+ "mdUrl": "/docs/components/export-dialog.md",
82
+ "jsonUrl": "/r/components/export-dialog.json",
83
+ "todo": true
84
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "Eyebrow",
3
+ "slug": "eyebrow",
4
+ "group": "chrome",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "The small accent kicker that sits above a title: `// PATCH`.\n\nMono, uppercase and widely tracked, in the theme's accent — the one place\nwhere the accent is used for pure typography rather than for a control. The\nslashes are marked `aria-hidden` and `select-none`, so a screen reader reads\n\"patch\" and a copy-paste of the page does not carry punctuation that was only\never decoration.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "slashes",
12
+ "type": "boolean",
13
+ "required": false,
14
+ "defaultValue": "true",
15
+ "description": "Print the `//` motif ahead of the label. Defaults to `true` — the slashes\nare the brand mark of this system, and an eyebrow without them is just\nsmall uppercase text. Pass `false` for a plain kicker."
16
+ }
17
+ ],
18
+ "typeReferences": [
19
+ "React.ComponentPropsWithoutRef<\"span\">"
20
+ ],
21
+ "subcomponents": [],
22
+ "parts": [],
23
+ "variants": {},
24
+ "defaultVariants": {},
25
+ "tokensUsed": [
26
+ "--cue-accent",
27
+ "--cue-font-mono",
28
+ "--cue-space-2",
29
+ "--cue-text-label"
30
+ ],
31
+ "summary": "The small accent kicker that sits above a title: `// PATCH`.",
32
+ "examples": [
33
+ {
34
+ "title": "Usage",
35
+ "code": "<Eyebrow>Patch</Eyebrow>\n<Eyebrow slashes={false}>Beta</Eyebrow>",
36
+ "language": "tsx"
37
+ }
38
+ ],
39
+ "status": "todo-docs",
40
+ "url": "/docs/components/eyebrow",
41
+ "mdUrl": "/docs/components/eyebrow.md",
42
+ "jsonUrl": "/r/components/eyebrow.json",
43
+ "specimens": [
44
+ {
45
+ "title": "Eyebrow",
46
+ "group": "chrome",
47
+ "components": [
48
+ "Eyebrow"
49
+ ],
50
+ "code": "<Specimens>\n <Specimen label=\"default\">\n <Eyebrow>smoke matrix</Eyebrow>\n </Specimen>\n <Specimen label=\"no slashes\">\n <Eyebrow slashes={false}>smoke matrix</Eyebrow>\n </Specimen>\n</Specimens>",
51
+ "note": "The `//` motif from the brand site, in mono micro.",
52
+ "interaction": "none."
53
+ }
54
+ ],
55
+ "todo": true
56
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "FieldDescription",
3
+ "slug": "field-description",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Quiet helper text under a control, published to assistive tech as the\ncontrol's `aria-describedby` target.",
9
+ "props": [
10
+ {
11
+ "name": "className",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Extra classes, merged over the helper-text defaults."
16
+ }
17
+ ],
18
+ "typeReferences": [
19
+ "Omit<BaseField.Description.Props, \"className\">"
20
+ ],
21
+ "subcomponents": [],
22
+ "parts": [],
23
+ "variants": {},
24
+ "defaultVariants": {},
25
+ "tokensUsed": [
26
+ "--cue-danger",
27
+ "--cue-fg-muted",
28
+ "--cue-fg-subtle",
29
+ "--cue-font-mono",
30
+ "--cue-space-1",
31
+ "--cue-space-2",
32
+ "--cue-text-label",
33
+ "--cue-text-micro"
34
+ ],
35
+ "summary": "Quiet helper text under a control, published to assistive tech as the control's `aria-describedby` target.",
36
+ "examples": [
37
+ {
38
+ "title": "Usage",
39
+ "code": "<FieldDescription>1–512</FieldDescription>",
40
+ "language": "tsx"
41
+ }
42
+ ],
43
+ "status": "todo-docs",
44
+ "url": "/docs/components/field-description",
45
+ "mdUrl": "/docs/components/field-description.md",
46
+ "jsonUrl": "/r/components/field-description.json",
47
+ "specimens": [
48
+ {
49
+ "title": "Field / FieldLabel / FieldDescription / FieldError",
50
+ "group": "forms",
51
+ "components": [
52
+ "Field",
53
+ "FieldLabel",
54
+ "FieldDescription",
55
+ "FieldError"
56
+ ],
57
+ "code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-3\">\n <Field name=\"cue\">\n <FieldLabel>Cue name</FieldLabel>\n <Input placeholder=\"e.g. Blackout\" />\n <FieldDescription>Shown in the cue list.</FieldDescription>\n </Field>\n <Field name=\"universe\" invalid>\n <FieldLabel>Universe</FieldLabel>\n <Input defaultValue=\"9\" />\n <FieldError issues={INVALID_ISSUE} />\n </Field>\n <Field name=\"locked\" disabled>\n <FieldLabel>Locked</FieldLabel>\n <Input defaultValue=\"Read-only\" />\n <FieldDescription>Set by the show file.</FieldDescription>\n </Field>\n</div>",
58
+ "note": "The labelling wrapper. Base UI generates the ids, so the label names the control with no htmlFor bookkeeping, and `invalid` stamps the whole subtree.",
59
+ "interaction": "clicking the label focuses the control; the error line is announced when it appears."
60
+ }
61
+ ],
62
+ "todo": true
63
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "FieldError",
3
+ "slug": "field-error",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The error line under a control.\n\nTwo ways to drive it, and they are mutually exclusive by design:\npass `issues` from a Standard Schema parse (`schema.safeParse(x).issues`) and\nthe component owns visibility, or pass `match` + `children` and let Base UI\nkey off the native `ValidityState`.",
9
+ "props": [
10
+ {
11
+ "name": "className",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Extra classes, merged over the danger-text defaults."
16
+ },
17
+ {
18
+ "name": "children",
19
+ "type": "ReactNode",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Message to show when driving visibility from `match` instead of `issues`."
23
+ },
24
+ {
25
+ "name": "issues",
26
+ "type": "readonly FieldIssue[]",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Standard Schema issues for this field. When supplied, the component shows\nexactly these messages and stops consulting native `ValidityState`: an\nempty array renders nothing, one issue renders inline, several render as a\nlist. Leave it `undefined` to fall back to `match` + `children`."
30
+ }
31
+ ],
32
+ "typeReferences": [
33
+ "Omit<BaseField.Error.Props, \"className\" | \"children\">"
34
+ ],
35
+ "subcomponents": [],
36
+ "parts": [],
37
+ "variants": {},
38
+ "defaultVariants": {},
39
+ "tokensUsed": [
40
+ "--cue-danger",
41
+ "--cue-fg-muted",
42
+ "--cue-fg-subtle",
43
+ "--cue-font-mono",
44
+ "--cue-space-1",
45
+ "--cue-space-2",
46
+ "--cue-text-label",
47
+ "--cue-text-micro"
48
+ ],
49
+ "summary": "The error line under a control.",
50
+ "examples": [
51
+ {
52
+ "title": "Usage",
53
+ "code": "<FieldError issues={result.issues} />\n<FieldError match=\"valueMissing\">Please name the cue</FieldError>",
54
+ "language": "tsx"
55
+ }
56
+ ],
57
+ "status": "todo-docs",
58
+ "url": "/docs/components/field-error",
59
+ "mdUrl": "/docs/components/field-error.md",
60
+ "jsonUrl": "/r/components/field-error.json",
61
+ "specimens": [
62
+ {
63
+ "title": "Field / FieldLabel / FieldDescription / FieldError",
64
+ "group": "forms",
65
+ "components": [
66
+ "Field",
67
+ "FieldLabel",
68
+ "FieldDescription",
69
+ "FieldError"
70
+ ],
71
+ "code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-3\">\n <Field name=\"cue\">\n <FieldLabel>Cue name</FieldLabel>\n <Input placeholder=\"e.g. Blackout\" />\n <FieldDescription>Shown in the cue list.</FieldDescription>\n </Field>\n <Field name=\"universe\" invalid>\n <FieldLabel>Universe</FieldLabel>\n <Input defaultValue=\"9\" />\n <FieldError issues={INVALID_ISSUE} />\n </Field>\n <Field name=\"locked\" disabled>\n <FieldLabel>Locked</FieldLabel>\n <Input defaultValue=\"Read-only\" />\n <FieldDescription>Set by the show file.</FieldDescription>\n </Field>\n</div>",
72
+ "note": "The labelling wrapper. Base UI generates the ids, so the label names the control with no htmlFor bookkeeping, and `invalid` stamps the whole subtree.",
73
+ "interaction": "clicking the label focuses the control; the error line is announced when it appears."
74
+ }
75
+ ],
76
+ "todo": true
77
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "FieldLabel",
3
+ "slug": "field-label",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The name of a field: mono, uppercase, tracked out, one rung below body text.\n\nRenders a real `<label>` wired to the field's control, so clicking it focuses\n(or toggles) that control.",
9
+ "props": [
10
+ {
11
+ "name": "className",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Extra classes, merged over the label typography."
16
+ }
17
+ ],
18
+ "typeReferences": [
19
+ "Omit<BaseField.Label.Props, \"className\">"
20
+ ],
21
+ "subcomponents": [],
22
+ "parts": [],
23
+ "variants": {},
24
+ "defaultVariants": {},
25
+ "tokensUsed": [
26
+ "--cue-danger",
27
+ "--cue-fg-muted",
28
+ "--cue-fg-subtle",
29
+ "--cue-font-mono",
30
+ "--cue-space-1",
31
+ "--cue-space-2",
32
+ "--cue-text-label",
33
+ "--cue-text-micro"
34
+ ],
35
+ "summary": "The name of a field: mono, uppercase, tracked out, one rung below body text.",
36
+ "examples": [
37
+ {
38
+ "title": "Usage",
39
+ "code": "<FieldLabel>Universe</FieldLabel>",
40
+ "language": "tsx"
41
+ }
42
+ ],
43
+ "status": "todo-docs",
44
+ "url": "/docs/components/field-label",
45
+ "mdUrl": "/docs/components/field-label.md",
46
+ "jsonUrl": "/r/components/field-label.json",
47
+ "specimens": [
48
+ {
49
+ "title": "Field / FieldLabel / FieldDescription / FieldError",
50
+ "group": "forms",
51
+ "components": [
52
+ "Field",
53
+ "FieldLabel",
54
+ "FieldDescription",
55
+ "FieldError"
56
+ ],
57
+ "code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-3\">\n <Field name=\"cue\">\n <FieldLabel>Cue name</FieldLabel>\n <Input placeholder=\"e.g. Blackout\" />\n <FieldDescription>Shown in the cue list.</FieldDescription>\n </Field>\n <Field name=\"universe\" invalid>\n <FieldLabel>Universe</FieldLabel>\n <Input defaultValue=\"9\" />\n <FieldError issues={INVALID_ISSUE} />\n </Field>\n <Field name=\"locked\" disabled>\n <FieldLabel>Locked</FieldLabel>\n <Input defaultValue=\"Read-only\" />\n <FieldDescription>Set by the show file.</FieldDescription>\n </Field>\n</div>",
58
+ "note": "The labelling wrapper. Base UI generates the ids, so the label names the control with no htmlFor bookkeeping, and `invalid` stamps the whole subtree.",
59
+ "interaction": "clicking the label focuses the control; the error line is announced when it appears."
60
+ }
61
+ ],
62
+ "todo": true
63
+ }
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "Field",
3
+ "slug": "field",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The labelling and validation wrapper every form control belongs in.\n\nWraps Base UI's `Field.Root`, which generates the ids that tie\n{@link FieldLabel}, {@link FieldDescription} and {@link FieldError} to the\ncontrol inside it — so `<FieldLabel>Cue name</FieldLabel>` names an\n{@link Input } with no `htmlFor`/`id` bookkeeping from the caller. Base UI also\nstamps `data-invalid` / `data-disabled` down the subtree, which is what the\nchassis' danger rim keys off.",
9
+ "props": [
10
+ {
11
+ "name": "className",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Extra classes, merged over the vertical stack defaults."
16
+ }
17
+ ],
18
+ "typeReferences": [
19
+ "Omit<BaseField.Root.Props, \"className\">"
20
+ ],
21
+ "subcomponents": [],
22
+ "parts": [],
23
+ "variants": {},
24
+ "defaultVariants": {},
25
+ "tokensUsed": [
26
+ "--cue-danger",
27
+ "--cue-fg-muted",
28
+ "--cue-fg-subtle",
29
+ "--cue-font-mono",
30
+ "--cue-space-1",
31
+ "--cue-space-2",
32
+ "--cue-text-label",
33
+ "--cue-text-micro"
34
+ ],
35
+ "summary": "The label, description and validation wrapper a form control belongs in.",
36
+ "examples": [
37
+ {
38
+ "title": "A field with validation",
39
+ "code": "<Field name=\"cue\">\n <FieldLabel>Cue name</FieldLabel>\n <Input placeholder=\"e.g. Blackout\" />\n <FieldDescription>Shown in the cue list.</FieldDescription>\n <FieldError issues={result.issues} />\n</Field>",
40
+ "language": "tsx"
41
+ },
42
+ {
43
+ "title": "Usage",
44
+ "code": "<Field name=\"cue\">\n <FieldLabel>Cue name</FieldLabel>\n <Input placeholder=\"e.g. Blackout\" />\n <FieldDescription>Shown in the cue list.</FieldDescription>\n <FieldError issues={result.issues} />\n</Field>",
45
+ "language": "tsx"
46
+ }
47
+ ],
48
+ "status": "stable",
49
+ "url": "/docs/components/field",
50
+ "mdUrl": "/docs/components/field.md",
51
+ "jsonUrl": "/r/components/field.json",
52
+ "whenToUse": [
53
+ "Any control that needs a visible label, helper text, or validation output.",
54
+ "Rendering Standard Schema issues (Zod, Valibot, ArkType) through `FieldError`."
55
+ ],
56
+ "whenNotToUse": [
57
+ "A control in a table row or a toolbar, where the column heading is already the label. Give the control an `aria-label` instead.",
58
+ "Grouping controls that share one value. Use `CheckboxGroup` or `RadioGroup`, which own the value and the group name."
59
+ ],
60
+ "commonMistakes": [
61
+ "Writing `htmlFor` and `id` by hand. `Field` generates them, and hand-written ids collide as soon as the form repeats.",
62
+ "Putting two controls in one `Field`, which points the generated description at the wrong one."
63
+ ],
64
+ "specimens": [
65
+ {
66
+ "title": "Field / FieldLabel / FieldDescription / FieldError",
67
+ "group": "forms",
68
+ "components": [
69
+ "Field",
70
+ "FieldLabel",
71
+ "FieldDescription",
72
+ "FieldError"
73
+ ],
74
+ "code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-3\">\n <Field name=\"cue\">\n <FieldLabel>Cue name</FieldLabel>\n <Input placeholder=\"e.g. Blackout\" />\n <FieldDescription>Shown in the cue list.</FieldDescription>\n </Field>\n <Field name=\"universe\" invalid>\n <FieldLabel>Universe</FieldLabel>\n <Input defaultValue=\"9\" />\n <FieldError issues={INVALID_ISSUE} />\n </Field>\n <Field name=\"locked\" disabled>\n <FieldLabel>Locked</FieldLabel>\n <Input defaultValue=\"Read-only\" />\n <FieldDescription>Set by the show file.</FieldDescription>\n </Field>\n</div>",
75
+ "note": "The labelling wrapper. Base UI generates the ids, so the label names the control with no htmlFor bookkeeping, and `invalid` stamps the whole subtree.",
76
+ "interaction": "clicking the label focuses the control; the error line is announced when it appears."
77
+ }
78
+ ]
79
+ }
@@ -0,0 +1,159 @@
1
+ {
2
+ "name": "FileUpload",
3
+ "slug": "file-upload",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A drop zone with a file list under it.\n\nThe zone is a real `<button>`, not a div with a drop handler: dropping is the\nmouse affordance, and pressing Enter on a focused button to open the file\ndialog is the keyboard one. A zone that only accepts drops is unusable\nwithout a pointer (WCAG 2.1.1), and it is the single most common defect in\nhand-rolled uploaders.\n\nState is the caller's. This component turns drops into `File[]` (plus\nreasoned rejections, via {@link partitionFiles}) and renders whatever rows it\nis handed — it never holds an upload queue, because the transport, the\nretries and the progress belong to the app.",
9
+ "props": [
10
+ {
11
+ "name": "label",
12
+ "type": "ReactNode",
13
+ "required": false,
14
+ "defaultValue": "Drop files",
15
+ "description": "The zone's own copy, and its accessible name. Defaults to `\"Drop files\"`."
16
+ },
17
+ {
18
+ "name": "hint",
19
+ "type": "ReactNode",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "A second line under the label — the rules, in plain words."
23
+ },
24
+ {
25
+ "name": "accept",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "`accept` string forwarded to the input and used for rejection."
30
+ },
31
+ {
32
+ "name": "multiple",
33
+ "type": "boolean",
34
+ "required": false,
35
+ "defaultValue": "false",
36
+ "description": "Allow more than one file per drop."
37
+ },
38
+ {
39
+ "name": "maxSize",
40
+ "type": "number",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "Largest accepted file, in bytes."
44
+ },
45
+ {
46
+ "name": "maxFiles",
47
+ "type": "number",
48
+ "required": false,
49
+ "defaultValue": null,
50
+ "description": "How many files may be accepted per drop."
51
+ },
52
+ {
53
+ "name": "disabled",
54
+ "type": "boolean",
55
+ "required": false,
56
+ "defaultValue": "false",
57
+ "description": "Refuse drops and grey the zone out."
58
+ },
59
+ {
60
+ "name": "files",
61
+ "type": "readonly UploadFile[]",
62
+ "required": false,
63
+ "defaultValue": null,
64
+ "description": "Rows to render under the zone. The caller owns upload state."
65
+ },
66
+ {
67
+ "name": "onFilesAccepted",
68
+ "type": "((files: File[]) => void)",
69
+ "required": false,
70
+ "defaultValue": null,
71
+ "description": "Called with the files that passed the rules."
72
+ },
73
+ {
74
+ "name": "onFilesRejected",
75
+ "type": "((rejections: FileRejection[]) => void)",
76
+ "required": false,
77
+ "defaultValue": null,
78
+ "description": "Called with the files that did not, each with its reason."
79
+ },
80
+ {
81
+ "name": "onRemove",
82
+ "type": "((id: string) => void)",
83
+ "required": false,
84
+ "defaultValue": null,
85
+ "description": "Called with a row's `id` when its remove control is pressed."
86
+ },
87
+ {
88
+ "name": "removeLabel",
89
+ "type": "((file: UploadFile) => string)",
90
+ "required": false,
91
+ "defaultValue": "(file) => `Remove ${file.name}`",
92
+ "description": "Spoken name of a row's remove control. Defaults to `Remove <name>`."
93
+ },
94
+ {
95
+ "name": "zoneClassName",
96
+ "type": "string",
97
+ "required": false,
98
+ "defaultValue": null,
99
+ "description": "Extra classes for the drop zone."
100
+ }
101
+ ],
102
+ "typeReferences": [
103
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"onDrop\" | \"children\">"
104
+ ],
105
+ "subcomponents": [],
106
+ "parts": [],
107
+ "variants": {},
108
+ "defaultVariants": {},
109
+ "tokensUsed": [
110
+ "--cue-accent",
111
+ "--cue-accent-soft",
112
+ "--cue-border",
113
+ "--cue-border-strong",
114
+ "--cue-control-sm",
115
+ "--cue-danger",
116
+ "--cue-fg",
117
+ "--cue-fg-muted",
118
+ "--cue-fg-subtle",
119
+ "--cue-font-mono",
120
+ "--cue-icon-sm",
121
+ "--cue-ok",
122
+ "--cue-radius-control",
123
+ "--cue-space-1",
124
+ "--cue-space-2",
125
+ "--cue-space-3",
126
+ "--cue-space-4",
127
+ "--cue-space-5",
128
+ "--cue-sunken",
129
+ "--cue-surface-2",
130
+ "--cue-surface-3",
131
+ "--cue-text-label",
132
+ "--cue-text-ui"
133
+ ],
134
+ "summary": "A drop zone with a file list under it.",
135
+ "examples": [
136
+ {
137
+ "title": "Usage",
138
+ "code": "<FileUpload\n label=\"Drop show files\"\n hint=\"CSV or QLab bundle, up to 20 MB\"\n accept=\".csv,.qlab\"\n maxSize={20_000_000}\n files={rows}\n onFilesAccepted={enqueue}\n onFilesRejected={explain}\n onRemove={cancel}\n/>",
139
+ "language": "tsx"
140
+ }
141
+ ],
142
+ "status": "todo-docs",
143
+ "url": "/docs/components/file-upload",
144
+ "mdUrl": "/docs/components/file-upload.md",
145
+ "jsonUrl": "/r/components/file-upload.json",
146
+ "specimens": [
147
+ {
148
+ "title": "FileUpload",
149
+ "group": "forms",
150
+ "components": [
151
+ "FileUpload"
152
+ ],
153
+ "code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-2\">\n <FileUpload\n label=\"Drop a show file\"\n hint=\"One .cue file, up to 5 MB.\"\n accept=\".cue\"\n maxSize={5_000_000}\n files={uploads.map((file) => ({ ...file, status: \"done\" as const, progress: 100 }))}\n onRemove={(id) => setUploads((current) => current.filter((file) => file.id !== id))}\n />\n <FileUpload\n label=\"Drop fixture profiles\"\n hint=\"Several .gdtf files.\"\n multiple\n files={[\n { id: \"a\", name: \"mac-viper.gdtf\", size: 240_000, status: \"uploading\", progress: 62 },\n { id: \"b\", name: \"sharpy.gdtf\", size: 180_000, status: \"error\", error: \"Unsupported revision\" },\n ]}\n />\n</div>",
154
+ "note": "A drop zone that is also a button, so a keyboard can reach it. Rejections say which rule they broke.",
155
+ "interaction": "the zone lights on drag-over; Enter or Space opens the file dialog."
156
+ }
157
+ ],
158
+ "todo": true
159
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "FlowBackground",
3
+ "slug": "flow-background",
4
+ "group": "flow",
5
+ "importPath": "@cueplusplus/ui/flow",
6
+ "peerDependencies": [
7
+ "@xyflow/react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "The canvas grid: dots one rung off the ground, at the system's own spacing.\n\nLeave `color` unset. It writes `--xy-background-pattern-color-props`, which\noutranks the theme map — passing a colour is how you opt *out* of theming, not\nhow you theme it.",
11
+ "props": [],
12
+ "typeReferences": [
13
+ "React.ComponentProps<typeof Background>"
14
+ ],
15
+ "subcomponents": [],
16
+ "parts": [],
17
+ "variants": {},
18
+ "defaultVariants": {},
19
+ "tokensUsed": [
20
+ "--cue-border-overlay",
21
+ "--cue-radius-overlay"
22
+ ],
23
+ "summary": "The canvas grid: dots one rung off the ground, at the system's own spacing.",
24
+ "examples": [
25
+ {
26
+ "title": "Usage",
27
+ "code": "<ReactFlow …><FlowBackground /></ReactFlow>",
28
+ "language": "tsx"
29
+ }
30
+ ],
31
+ "status": "todo-docs",
32
+ "url": "/docs/components/flow-background",
33
+ "mdUrl": "/docs/components/flow-background.md",
34
+ "jsonUrl": "/r/components/flow-background.json",
35
+ "specimens": [
36
+ {
37
+ "title": "useFlowTheme / FlowControls / FlowBackground / SignalEdge",
38
+ "group": "flow",
39
+ "components": [
40
+ "FlowControls",
41
+ "FlowBackground",
42
+ "SignalEdge"
43
+ ],
44
+ "code": "<div className=\"h-[24rem] w-full overflow-hidden rounded-(--radius-surface) border border-border\">\n <ReactFlow\n nodes={NODES}\n edges={EDGES}\n nodeTypes={NODE_TYPES}\n edgeTypes={theme.edgeTypes}\n defaultEdgeOptions={theme.defaultEdgeOptions}\n colorMode={theme.colorMode}\n style={theme.style}\n fitView\n proOptions={{ hideAttribution: true }}\n >\n <FlowBackground />\n <FlowControls />\n </ReactFlow>\n</div>",
45
+ "note": "The hook returns the `--xy-*` token map plus stable `edgeTypes` and `defaultEdgeOptions` identities. Every part also publishes the map on its own root, so the group is correct before flow.css is imported and correct again after.",
46
+ "interaction": "the controls capsule is an overlay surface; a live wire animates its dash overlay and stops under prefers-reduced-motion."
47
+ }
48
+ ],
49
+ "todo": true
50
+ }