@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,119 @@
1
+ {
2
+ "name": "PasswordInput",
3
+ "slug": "password-input",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A masked text field with a reveal control.\n\nThe reveal is a **toggle button carrying `aria-pressed`**, not a checkbox and\nnot a bare icon: a screen-reader user needs to know both what it does and\nwhich way it currently is, and `aria-pressed` is the one attribute that says\nboth. The label swaps with the state for the same reason.\n\nRevealing switches `type` between `password` and `text` rather than painting\nover the characters, so the browser's own autofill and password managers keep\nworking.",
9
+ "props": [
10
+ {
11
+ "name": "className",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Extra classes for the group that wraps the input and the reveal button."
16
+ },
17
+ {
18
+ "name": "size",
19
+ "type": "\"sm\" | \"md\" | \"lg\"",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Rung of the control ladder. Defaults to `\"md\"`."
23
+ },
24
+ {
25
+ "name": "hideLabel",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": "Hide password",
29
+ "description": "Accessible name while revealed. Defaults to `\"Hide password\"`."
30
+ },
31
+ {
32
+ "name": "revealed",
33
+ "type": "boolean",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "Reveal the value. Use with `onRevealedChange` for a controlled toggle."
37
+ },
38
+ {
39
+ "name": "defaultRevealed",
40
+ "type": "boolean",
41
+ "required": false,
42
+ "defaultValue": "false",
43
+ "description": "Initially revealed, for an uncontrolled toggle. Defaults to `false`."
44
+ },
45
+ {
46
+ "name": "onRevealedChange",
47
+ "type": "((revealed: boolean) => void)",
48
+ "required": false,
49
+ "defaultValue": null,
50
+ "description": "Called with the new reveal state."
51
+ },
52
+ {
53
+ "name": "showReveal",
54
+ "type": "boolean",
55
+ "required": false,
56
+ "defaultValue": "true",
57
+ "description": "Offer the reveal affordance at all. Defaults to `true`. Switch it off for a\nvalue the product must never re-display — a stored secret the user is\nreplacing rather than reading."
58
+ },
59
+ {
60
+ "name": "revealLabel",
61
+ "type": "string",
62
+ "required": false,
63
+ "defaultValue": "Show password",
64
+ "description": "Accessible name while masked. Defaults to `\"Show password\"`."
65
+ }
66
+ ],
67
+ "typeReferences": [
68
+ "Omit<InputProps, \"type\" | \"size\">"
69
+ ],
70
+ "subcomponents": [],
71
+ "parts": [],
72
+ "variants": {},
73
+ "defaultVariants": {},
74
+ "tokensUsed": [
75
+ "--cue-accent",
76
+ "--cue-border",
77
+ "--cue-control-lg",
78
+ "--cue-control-md",
79
+ "--cue-control-sm",
80
+ "--cue-danger",
81
+ "--cue-fg",
82
+ "--cue-fg-subtle",
83
+ "--cue-font-mono",
84
+ "--cue-icon-md",
85
+ "--cue-radius-control",
86
+ "--cue-space-3",
87
+ "--cue-space-4",
88
+ "--cue-space-5",
89
+ "--cue-sunken",
90
+ "--cue-text-body",
91
+ "--cue-text-label",
92
+ "--cue-text-ui"
93
+ ],
94
+ "summary": "A masked text field with a reveal control.",
95
+ "examples": [
96
+ {
97
+ "title": "Usage",
98
+ "code": "<PasswordInput aria-label=\"Service key\" value={key} onValueChange={setKey} />\n<Field><FieldLabel>Token</FieldLabel><PasswordInput showReveal={false} /></Field>",
99
+ "language": "tsx"
100
+ }
101
+ ],
102
+ "status": "todo-docs",
103
+ "url": "/docs/components/password-input",
104
+ "mdUrl": "/docs/components/password-input.md",
105
+ "jsonUrl": "/r/components/password-input.json",
106
+ "specimens": [
107
+ {
108
+ "title": "PasswordInput",
109
+ "group": "forms",
110
+ "components": [
111
+ "PasswordInput"
112
+ ],
113
+ "code": "<Specimens>\n <Specimen label=\"hidden\">\n <PasswordInput aria-label=\"Console password\" defaultValue=\"hunter2\" />\n </Specimen>\n <Specimen label=\"revealed\">\n <PasswordInput aria-label=\"Console password, revealed\" defaultValue=\"hunter2\" defaultRevealed />\n </Specimen>\n <Specimen label=\"no toggle\">\n <PasswordInput aria-label=\"Password, no reveal\" defaultValue=\"hunter2\" showReveal={false} />\n </Specimen>\n <Specimen label=\"disabled\">\n <PasswordInput aria-label=\"Password, disabled\" defaultValue=\"hunter2\" disabled />\n </Specimen>\n</Specimens>",
114
+ "note": "Input plus a reveal toggle carrying `aria-pressed`, so the state is spoken rather than implied by an icon swap.",
115
+ "interaction": "the toggle is in the tab order after the field."
116
+ }
117
+ ],
118
+ "todo": true
119
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "PianoKeyboard",
3
+ "slug": "piano-keyboard",
4
+ "group": "midi",
5
+ "importPath": "@cueplusplus/ui/midi",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A piano keyboard as a range control: drag the markers, or arrow the edges.\n\nPorted from ableton-sync's note-range picker, geometry intact — 16px whites,\n10px blacks over the seams — and rebuilt around three things the original did\nnot have:\n\n1. **The edges are sliders.** The port moved its markers with `mousedown` and\n a window listener, which means no keyboard, no screen reader and no touch.\n Here each marker is a `role=\"slider\"` announcing its note by name, so\n \"set the low end to C2\" is reachable without a pointer.\n2. **The board holds still while you drag.** The window is centred on the\n selection, so moving an edge moves the window, which moves the note under\n the cursor — the port's markers slid away from the pointer mid-drag. The\n window is frozen for the length of a gesture instead.\n3. **It is drawn in console materials, not in white and black.** A photo of a\n piano inverts in a light theme; a `surface-3` white key and a\n `--cue-data-ground` black key read the same in both. The information — what\n is in range, what is sounding — is carried by the accent, which is the only\n thing here that a theme is allowed to move.",
9
+ "props": [
10
+ {
11
+ "name": "range",
12
+ "type": "NoteRange",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "The selected range. Use with `onRangeChange` for a controlled widget."
16
+ },
17
+ {
18
+ "name": "defaultRange",
19
+ "type": "NoteRange",
20
+ "required": false,
21
+ "defaultValue": "{ start: 48, end: 72 }",
22
+ "description": "Initial range for an uncontrolled widget. Defaults to C2–C4."
23
+ },
24
+ {
25
+ "name": "onRangeChange",
26
+ "type": "((range: NoteRange) => void)",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Called with the range each edit produces."
30
+ },
31
+ {
32
+ "name": "octaves",
33
+ "type": "number",
34
+ "required": false,
35
+ "defaultValue": "3",
36
+ "description": "How many octaves to draw. Defaults to `3`."
37
+ },
38
+ {
39
+ "name": "highlight",
40
+ "type": "readonly number[]",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "Notes sounding right now, painted solid."
44
+ },
45
+ {
46
+ "name": "keyHeight",
47
+ "type": "number",
48
+ "required": false,
49
+ "defaultValue": "48",
50
+ "description": "White-key height in px at the 16px root, emitted as `rem`. Defaults to `48`."
51
+ },
52
+ {
53
+ "name": "label",
54
+ "type": "string",
55
+ "required": false,
56
+ "defaultValue": "Note range",
57
+ "description": "What the range is *of*. Names the group and both markers. Defaults to `\"Note range\"`."
58
+ },
59
+ {
60
+ "name": "readout",
61
+ "type": "boolean",
62
+ "required": false,
63
+ "defaultValue": "true",
64
+ "description": "Print the range and its size under the board. Defaults to `true`."
65
+ },
66
+ {
67
+ "name": "disabled",
68
+ "type": "boolean",
69
+ "required": false,
70
+ "defaultValue": "false",
71
+ "description": "Refuse every edit. The board still draws."
72
+ }
73
+ ],
74
+ "typeReferences": [
75
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\" | \"onChange\">"
76
+ ],
77
+ "subcomponents": [],
78
+ "parts": [],
79
+ "variants": {},
80
+ "defaultVariants": {},
81
+ "tokensUsed": [
82
+ "--cue-accent",
83
+ "--cue-accent-soft",
84
+ "--cue-border",
85
+ "--cue-border-strong",
86
+ "--cue-data-ground",
87
+ "--cue-fg-subtle",
88
+ "--cue-font-mono",
89
+ "--cue-radius-control",
90
+ "--cue-space-1",
91
+ "--cue-sunken",
92
+ "--cue-surface-3",
93
+ "--cue-text-micro"
94
+ ],
95
+ "summary": "A piano keyboard as a range control: drag the markers, or arrow the edges.",
96
+ "examples": [
97
+ {
98
+ "title": "Usage",
99
+ "code": "<PianoKeyboard range={range} onRangeChange={setRange} highlight={sounding} />",
100
+ "language": "tsx"
101
+ }
102
+ ],
103
+ "status": "todo-docs",
104
+ "url": "/docs/components/piano-keyboard",
105
+ "mdUrl": "/docs/components/piano-keyboard.md",
106
+ "jsonUrl": "/r/components/piano-keyboard.json",
107
+ "specimens": [
108
+ {
109
+ "title": "PianoKeyboard",
110
+ "group": "midi",
111
+ "components": [
112
+ "PianoKeyboard"
113
+ ],
114
+ "code": "<div className=\"flex w-full flex-col gap-(--cue-space-4)\">\n <PianoKeyboard\n range={range}\n onRangeChange={setRange}\n octaves={4}\n label=\"Trigger range\"\n />\n <span className=\"font-mono text-(length:--cue-text-micro) text-fg-subtle\">\n {noteName(range.start)} to {noteName(range.end)}\n </span>\n <PianoKeyboard\n octaves={2}\n highlight={[60, 64, 67]}\n keyHeight={56}\n readout={false}\n label=\"Chord highlight\"\n />\n <PianoKeyboard octaves={2} disabled label=\"Keyboard, disabled\" />\n</div>",
115
+ "note": "Exact key geometry from the shared layout module, in-range tinting, and draggable start and end markers.",
116
+ "interaction": "each marker is a `role=slider` that announces the note it sits on, so the drag is a fast path rather than the only path."
117
+ }
118
+ ],
119
+ "todo": true
120
+ }
@@ -0,0 +1,111 @@
1
+ {
2
+ "name": "Plussie",
3
+ "slug": "plussie",
4
+ "group": "brand",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "Plussie, the CUE++ character — the mark, with its eyes free to move.\n\nThe same circle and the same two \"+\" glyphs {@link CueMark } draws, out of the\nsame geometry module, because they are the same drawing: the mark's glyphs\n*are* the character's eyes. What this adds is that the eyes are their own\ngroups, so an `expression` can slide or shut them.\n\nStatic-first. The eight Remotion animations this character was rigged for\nstay in the site that renders video; a heavy, video-oriented peer has no\nbusiness in a component library, so what is ported here is the geometry and\nthe poses. Everything else a caller wants — a look that follows the cursor, a\nblink on a timer of their own — is a `expression` prop away, driven by their\nown runtime.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "expression",
12
+ "type": "\"default\" | \"blink\" | \"wink\" | \"look-left\" | \"look-right\" | \"look-up\" | \"look-down\"",
13
+ "required": false,
14
+ "defaultValue": "default",
15
+ "description": "Which pose to hold. Defaults to `\"default\"`, eyes open and level.\n\nEvery pose is a still from the character's own animations rather than a\nnew drawing, so a screen that holds one and a video that plays through it\nagree."
16
+ },
17
+ {
18
+ "name": "idle",
19
+ "type": "boolean",
20
+ "required": false,
21
+ "defaultValue": "false",
22
+ "description": "Blink every few seconds, on a CSS keyframe. Defaults to `false`.\n\nOff by default because a mark that moves in the corner of the eye is a\ndistraction on a console screen, and off again for a reader who has asked\nfor reduced motion — the rule that drives it is inside a\n`prefers-reduced-motion` guard, so there is no state to keep and nothing to\nturn off a second time.\n\nIt composes with `expression`: a winking Plussie blinks its open eye."
23
+ },
24
+ {
25
+ "name": "size",
26
+ "type": "number | BrandSize",
27
+ "required": false,
28
+ "defaultValue": "md",
29
+ "description": "Rung of the density control ladder to draw at, or an explicit height in px.\nDefaults to `\"md\"`.\n\nHeight, always — every asset here keeps its own aspect ratio, so the width\nfollows from the artwork rather than from the caller."
30
+ },
31
+ {
32
+ "name": "tone",
33
+ "type": "\"inherit\" | \"fg\" | \"accent\"",
34
+ "required": false,
35
+ "defaultValue": "inherit",
36
+ "description": "Where the ink comes from: `currentColor`, the foreground token, or the\naccent. Defaults to `\"inherit\"`."
37
+ },
38
+ {
39
+ "name": "title",
40
+ "type": "string",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "The accessible name.\n\nOmit it and the asset is decorative — `aria-hidden`, announced by nothing.\nPass one only when the mark is the *only* thing naming what it sits on: a\nbare logo link, a splash screen with no heading."
44
+ }
45
+ ],
46
+ "typeReferences": [
47
+ "BrandAssetProps"
48
+ ],
49
+ "subcomponents": [],
50
+ "parts": [],
51
+ "variants": {},
52
+ "defaultVariants": {},
53
+ "tokensUsed": [
54
+ "--cue-accent",
55
+ "--cue-accent-fg",
56
+ "--cue-bg",
57
+ "--cue-control-lg",
58
+ "--cue-control-md",
59
+ "--cue-control-sm",
60
+ "--cue-fg"
61
+ ],
62
+ "summary": "Plussie, the CUE++ character: the mark with its eyes free to move.",
63
+ "examples": [
64
+ {
65
+ "title": "An empty state",
66
+ "code": "import { Plussie } from \"@cueplusplus/ui\";\n\n<div className=\"flex flex-col items-center gap-(--cue-space-4)\">\n <Plussie size={96} expression=\"look-down\" />\n <p>No cues yet.</p>\n</div>;",
67
+ "language": "tsx"
68
+ },
69
+ {
70
+ "title": "With the optional idle blink",
71
+ "code": "<Plussie size={96} idle title=\"Plussie\" />;",
72
+ "language": "tsx"
73
+ },
74
+ {
75
+ "title": "Usage",
76
+ "code": "<Plussie size=\"lg\" title=\"Plussie\" />\n<Plussie expression=\"wink\" tone=\"accent\" />\n<Plussie size={96} idle />",
77
+ "language": "tsx"
78
+ }
79
+ ],
80
+ "status": "stable",
81
+ "url": "/docs/components/plussie",
82
+ "mdUrl": "/docs/components/plussie.md",
83
+ "jsonUrl": "/r/components/plussie.json",
84
+ "whenToUse": [
85
+ "An empty state, an onboarding step, an error page — somewhere a screen has room for a face.",
86
+ "A long-running job's companion, where `expression` says what the job is doing without a second sentence.",
87
+ "Anywhere you would have embedded the character's video and only needed one frame of it."
88
+ ],
89
+ "whenNotToUse": [
90
+ "In dense console chrome. A face in a toolbar is a distraction; use `CueMark`.",
91
+ "As a loading indicator. Use `Spinner` or `Progress`, which announce themselves.",
92
+ "For an animation with a script. The eight rigged animations live in the site that renders video, and this library will not take Remotion as a peer."
93
+ ],
94
+ "commonMistakes": [
95
+ "Inventing a pose by nudging the eyes with CSS. Every value `expression` holds is a still from a real animation, and a hand-tuned one will not match the video.",
96
+ "Turning `idle` on across a page. It is off by default because a mark moving in the corner of the eye is a distraction, and it is off again under `prefers-reduced-motion`.",
97
+ "Expecting `expression` to animate between poses. It sets a pose; transitions belong to the caller."
98
+ ],
99
+ "specimens": [
100
+ {
101
+ "title": "Plussie",
102
+ "group": "brand",
103
+ "components": [
104
+ "Plussie"
105
+ ],
106
+ "code": "<Specimens>\n {EXPRESSIONS.map((expression) => (\n <Specimen key={expression} label={expression}>\n <Plussie size={56} expression={expression} />\n </Specimen>\n ))}\n</Specimens>\n<Specimens>\n {SIZES.map((size) => (\n <Specimen key={size} label={`size ${size}`}>\n <Plussie size={size} />\n </Specimen>\n ))}\n <Specimen label=\"tone accent\">\n <Plussie size={56} tone=\"accent\" expression=\"wink\" />\n </Specimen>\n <Specimen label=\"idle\">\n <Plussie size={56} idle title=\"Plussie\" />\n </Specimen>\n</Specimens>",
107
+ "note": "The same circle and the same two '+' the mark draws, out of the same geometry module, with the eyes in their own groups so a pose can move them. Every pose is a still from one of the character's own animations.",
108
+ "interaction": "none by default. Pass `idle` for a CSS-only blink, which stops for a reader who has asked for reduced motion."
109
+ }
110
+ ]
111
+ }
@@ -0,0 +1,193 @@
1
+ {
2
+ "name": "Popover",
3
+ "slug": "popover",
4
+ "group": "overlays",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A small floating surface anchored to a control — a filter form, an inspector,\na colour picker.\n\nWraps Base UI's `Popover`, so anchoring, collision flipping, Escape and\noutside-press dismissal are the primitive's. This layer adds the token skin,\nthe portal theme stamp and the canvas-safe wheel dismissal.",
9
+ "props": [],
10
+ "typeReferences": [],
11
+ "subcomponents": [
12
+ "Root",
13
+ "Trigger",
14
+ "Content",
15
+ "Title",
16
+ "Description",
17
+ "Close"
18
+ ],
19
+ "parts": [
20
+ {
21
+ "name": "Root",
22
+ "usage": "Popover.Root",
23
+ "description": "Groups the parts of a popover and owns its open state. Renders no element.",
24
+ "props": [
25
+ {
26
+ "name": "closeOnWheel",
27
+ "type": "boolean",
28
+ "required": false,
29
+ "defaultValue": "true",
30
+ "description": "Close the popover when the viewport moves under it — a wheel anywhere\noutside the popup, or a window resize. Defaults to `true`.\n\nAn anchored popup is positioned from its trigger's rect. A canvas that pans\nby mutating a CSS transform fires no `scroll` event, so without this the\npopup silently detaches from the thing it belongs to. Set `false` when the\npopover must survive page scrolling (a pinned inspector, say)."
31
+ }
32
+ ],
33
+ "typeReferences": [
34
+ "BasePopover.Root.Props"
35
+ ]
36
+ },
37
+ {
38
+ "name": "Trigger",
39
+ "usage": "Popover.Trigger",
40
+ "description": "The control the popover is anchored to. Unstyled — pass\n`render={<Button />}` or `render={<IconButton …/>}` so the button's own\nvariant classes stay the last word on how it looks.",
41
+ "props": [],
42
+ "typeReferences": [
43
+ "BasePopover.Trigger.Props"
44
+ ]
45
+ },
46
+ {
47
+ "name": "Content",
48
+ "usage": "Popover.Content",
49
+ "description": "The popover's portal, positioner and popup.\n\nPortalled through {@link useCuePortalProps}, so the surface carries the\ncaller's theme, density and mode even though it mounts at the end of\n`<body>`. Flipping and shifting to stay on screen is Base UI's; the wheel\ndismissal is ours (see {@link PopoverRootProps.closeOnWheel}).",
50
+ "props": [
51
+ {
52
+ "name": "className",
53
+ "type": "string",
54
+ "required": false,
55
+ "defaultValue": null,
56
+ "description": "Extra classes for the popup surface."
57
+ },
58
+ {
59
+ "name": "align",
60
+ "type": "\"center\" | \"end\" | \"start\"",
61
+ "required": false,
62
+ "defaultValue": null,
63
+ "description": "Alignment along that side. Defaults to `\"center\"`."
64
+ },
65
+ {
66
+ "name": "keepMounted",
67
+ "type": "boolean",
68
+ "required": false,
69
+ "defaultValue": null,
70
+ "description": "Keep the popup mounted while closed."
71
+ },
72
+ {
73
+ "name": "positionerClassName",
74
+ "type": "string",
75
+ "required": false,
76
+ "defaultValue": null,
77
+ "description": "Extra classes for the positioner that places the popup."
78
+ },
79
+ {
80
+ "name": "sideOffset",
81
+ "type": "number | OffsetFunction",
82
+ "required": false,
83
+ "defaultValue": "4",
84
+ "description": "Gap in px between trigger and popup. Defaults to `4`."
85
+ },
86
+ {
87
+ "name": "side",
88
+ "type": "\"left\" | \"right\" | \"top\" | \"bottom\" | \"inline-end\" | \"inline-start\"",
89
+ "required": false,
90
+ "defaultValue": null,
91
+ "description": "Preferred side of the trigger. Defaults to `\"bottom\"`."
92
+ },
93
+ {
94
+ "name": "alignOffset",
95
+ "type": "number | OffsetFunction",
96
+ "required": false,
97
+ "defaultValue": null,
98
+ "description": "Nudge along the alignment axis, in px."
99
+ }
100
+ ],
101
+ "typeReferences": [
102
+ "Omit<BasePopover.Popup.Props, \"className\">"
103
+ ]
104
+ },
105
+ {
106
+ "name": "Title",
107
+ "usage": "Popover.Title",
108
+ "description": "The popover's heading, wired to the popup's `aria-labelledby`.",
109
+ "props": [],
110
+ "typeReferences": [
111
+ "BasePopover.Title.Props"
112
+ ]
113
+ },
114
+ {
115
+ "name": "Description",
116
+ "usage": "Popover.Description",
117
+ "description": "The supporting line under the title, published as `aria-describedby`.",
118
+ "props": [],
119
+ "typeReferences": [
120
+ "BasePopover.Description.Props"
121
+ ]
122
+ },
123
+ {
124
+ "name": "Close",
125
+ "usage": "Popover.Close",
126
+ "description": "A control that closes the popover. Unstyled — wrap it in a `Button`.",
127
+ "props": [],
128
+ "typeReferences": [
129
+ "BasePopover.Close.Props"
130
+ ]
131
+ }
132
+ ],
133
+ "variants": {},
134
+ "defaultVariants": {},
135
+ "tokensUsed": [
136
+ "--cue-accent-soft",
137
+ "--cue-border",
138
+ "--cue-border-overlay",
139
+ "--cue-control-sm",
140
+ "--cue-fg",
141
+ "--cue-fg-muted",
142
+ "--cue-fg-subtle",
143
+ "--cue-font-mono",
144
+ "--cue-radius-control",
145
+ "--cue-radius-overlay",
146
+ "--cue-scrim",
147
+ "--cue-space-1",
148
+ "--cue-space-2",
149
+ "--cue-space-3",
150
+ "--cue-space-4",
151
+ "--cue-surface-2",
152
+ "--cue-text-emphasis",
153
+ "--cue-text-label",
154
+ "--cue-text-ui"
155
+ ],
156
+ "summary": "A panel anchored to the control that opened it.",
157
+ "examples": [
158
+ {
159
+ "title": "Usage",
160
+ "code": "<Popover.Root>\n <Popover.Trigger render={<IconButton aria-label=\"Filter\" icon={Filter} />} />\n <Popover.Content side=\"bottom\" align=\"end\">\n <Popover.Title>Filter cues</Popover.Title>\n <SearchInput aria-label=\"Query\" />\n </Popover.Content>\n</Popover.Root>",
161
+ "language": "tsx"
162
+ }
163
+ ],
164
+ "status": "stable",
165
+ "url": "/docs/components/popover",
166
+ "mdUrl": "/docs/components/popover.md",
167
+ "jsonUrl": "/r/components/popover.json",
168
+ "whenToUse": [
169
+ "Secondary controls that belong to one trigger: a filter set, a colour picker, a row's properties.",
170
+ "When the page behind has to stay readable while the panel is open."
171
+ ],
172
+ "whenNotToUse": [
173
+ "A list of commands. Use `DropdownMenu`, which brings roving focus, typeahead and the menu roles.",
174
+ "Text that only describes the trigger. Use `Tooltip`, or `InfoTip` for the question-mark affordance.",
175
+ "Anything that must be answered before the user moves on. Use `Dialog`."
176
+ ],
177
+ "commonMistakes": [
178
+ "Turning `closeOnWheel` off on a canvas that pans by CSS transform. No scroll event fires there, so the popup silently detaches from its trigger.",
179
+ "Filling it with a form whose first control cannot take focus, which strands keyboard users on the trigger."
180
+ ],
181
+ "specimens": [
182
+ {
183
+ "title": "Popover",
184
+ "group": "overlays",
185
+ "components": [
186
+ "Popover"
187
+ ],
188
+ "code": "<Specimens>\n <Specimen label=\"default\">\n <Popover.Root>\n <Popover.Trigger render={<Button>Fixture</Button>} />\n <Popover.Content>\n <Popover.Title>Source Four 26°</Popover.Title>\n <Popover.Description>Universe 1, channels 12 to 19.</Popover.Description>\n <Popover.Close render={<Button size=\"sm\">Close</Button>} />\n </Popover.Content>\n </Popover.Root>\n </Specimen>\n <Specimen label=\"side right\">\n <Popover.Root>\n <Popover.Trigger render={<Button>Right</Button>} />\n <Popover.Content side=\"right\" align=\"start\">\n <Popover.Title>Anchored right</Popover.Title>\n <Popover.Description>Flips when there is no room.</Popover.Description>\n </Popover.Content>\n </Popover.Root>\n </Specimen>\n</Specimens>",
189
+ "note": "An anchored surface with a title, a description and arbitrary content.",
190
+ "interaction": "closes on outside mousedown, on scroll, on wheel and on Escape. The wheel case is the one a canvas that pans by CSS transform needs."
191
+ }
192
+ ]
193
+ }
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "PresetSection",
3
+ "slug": "preset-section",
4
+ "group": "configurator",
5
+ "importPath": "@cueplusplus/ui/configurator",
6
+ "peerDependencies": [
7
+ "react-aria-components"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Section 1 — the four choices that are not token edits at all.\n\nPreset, mode and density are *provider* state: picking one restamps the\ndocument and every portal under it, which is why they live here rather than\nin the colour list. Text scale and zoom are the two relief valves the spec\npairs with the density ladder — one scales the type ramp inside the layout,\nthe other scales the finished layout itself.",
11
+ "props": [
12
+ {
13
+ "name": "edits",
14
+ "type": "TokenEdits",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "The panel's edit surface."
18
+ },
19
+ {
20
+ "name": "zoom",
21
+ "type": "ZoomValve",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "The root zoom valve the panel owns."
25
+ },
26
+ {
27
+ "name": "className",
28
+ "type": "string",
29
+ "required": false,
30
+ "defaultValue": null,
31
+ "description": "Extra classes for the section."
32
+ }
33
+ ],
34
+ "typeReferences": [],
35
+ "subcomponents": [],
36
+ "parts": [],
37
+ "variants": {},
38
+ "defaultVariants": {},
39
+ "tokensUsed": [
40
+ "--cue-accent",
41
+ "--cue-border",
42
+ "--cue-border-strong",
43
+ "--cue-density",
44
+ "--cue-fg",
45
+ "--cue-fg-muted",
46
+ "--cue-fg-subtle",
47
+ "--cue-font-mono",
48
+ "--cue-font-pairing-mono",
49
+ "--cue-font-sans",
50
+ "--cue-font-scale",
51
+ "--cue-font-theme-mono",
52
+ "--cue-radius-control",
53
+ "--cue-radius-scale",
54
+ "--cue-space-1",
55
+ "--cue-space-2",
56
+ "--cue-space-4",
57
+ "--cue-text-label",
58
+ "--cue-text-micro"
59
+ ],
60
+ "summary": "Section 1 — the four choices that are not token edits at all.",
61
+ "examples": [
62
+ {
63
+ "title": "Usage",
64
+ "code": "<PresetSection edits={edits} zoom={zoom} />",
65
+ "language": "tsx"
66
+ }
67
+ ],
68
+ "status": "todo-docs",
69
+ "url": "/docs/components/preset-section",
70
+ "mdUrl": "/docs/components/preset-section.md",
71
+ "jsonUrl": "/r/components/preset-section.json",
72
+ "todo": true
73
+ }