@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,80 @@
1
+ {
2
+ "name": "TimeField",
3
+ "slug": "time-field",
4
+ "group": "date",
5
+ "importPath": "@cueplusplus/ui/date",
6
+ "peerDependencies": [
7
+ "react-aria-components"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "A typed time of day, segment by segment.\n\nThe sibling of {@link DateField } on the same React Aria part, for the half of\na schedule a calendar cannot express. Pass `hourCycle={24}` for a show clock —\na control room runs on 24-hour time, and the AM/PM segment is one more thing\nto tab through.\n\nValues are `@internationalized/date` `Time` objects.\n\n`react-aria-components` is an **optional peer**: import this from\n`@cueplusplus/ui/date`.",
11
+ "props": [
12
+ {
13
+ "name": "size",
14
+ "type": "\"sm\" | \"md\" | \"lg\"",
15
+ "required": false,
16
+ "defaultValue": null,
17
+ "description": "Rung of the control ladder. Defaults to `\"md\"`."
18
+ },
19
+ {
20
+ "name": "inputClassName",
21
+ "type": "ClassNameOrFunction<DateInputRenderProps>",
22
+ "required": false,
23
+ "defaultValue": null,
24
+ "description": "Extra classes for the segment group itself."
25
+ }
26
+ ],
27
+ "typeReferences": [
28
+ "Omit<AriaTimeFieldProps<T>, \"children\">"
29
+ ],
30
+ "subcomponents": [],
31
+ "parts": [],
32
+ "variants": {},
33
+ "defaultVariants": {},
34
+ "tokensUsed": [
35
+ "--cue-accent",
36
+ "--cue-accent-fg",
37
+ "--cue-border",
38
+ "--cue-control-lg",
39
+ "--cue-control-md",
40
+ "--cue-control-sm",
41
+ "--cue-danger",
42
+ "--cue-fg",
43
+ "--cue-fg-subtle",
44
+ "--cue-font-mono",
45
+ "--cue-radius-control",
46
+ "--cue-space-1",
47
+ "--cue-space-3",
48
+ "--cue-space-4",
49
+ "--cue-space-5",
50
+ "--cue-sunken",
51
+ "--cue-text-body",
52
+ "--cue-text-label",
53
+ "--cue-text-ui"
54
+ ],
55
+ "summary": "A typed time of day, segment by segment.",
56
+ "examples": [
57
+ {
58
+ "title": "Usage",
59
+ "code": "<TimeField aria-label=\"Go time\" hourCycle={24} value={time} onChange={setTime} />",
60
+ "language": "tsx"
61
+ }
62
+ ],
63
+ "status": "todo-docs",
64
+ "url": "/docs/components/time-field",
65
+ "mdUrl": "/docs/components/time-field.md",
66
+ "jsonUrl": "/r/components/time-field.json",
67
+ "specimens": [
68
+ {
69
+ "title": "TimeField",
70
+ "group": "date",
71
+ "components": [
72
+ "TimeField"
73
+ ],
74
+ "code": "<Specimens>\n <Specimen label=\"minutes\">\n <TimeField aria-label=\"House open\" defaultValue={new Time(19, 30)} />\n </Specimen>\n <Specimen label=\"seconds\">\n <TimeField\n aria-label=\"Timecode start\"\n granularity=\"second\"\n defaultValue={new Time(19, 30, 5)}\n />\n </Specimen>\n <Specimen label=\"disabled\">\n <TimeField aria-label=\"House open, disabled\" isDisabled defaultValue={new Time(19, 30)} />\n </Specimen>\n</Specimens>",
75
+ "note": "The same field, for a clock time. Granularity decides how many segments there are.",
76
+ "interaction": "same segment stepping; 24-hour or 12-hour follows the locale, not a prop."
77
+ }
78
+ ],
79
+ "todo": true
80
+ }
@@ -0,0 +1,139 @@
1
+ {
2
+ "name": "TimelineRuler",
3
+ "slug": "timeline-ruler",
4
+ "group": "midi",
5
+ "importPath": "@cueplusplus/ui/midi",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The bar ruler over an arrangement: zoom-adaptive, culled, and deliberately\nfaint.\n\nPorted from ableton-sync's arrangement view, with its two performance\nproblems fixed. The first is density: the original picked from a ladder of\nmusical intervals and then multiplied by four, so its ruler was four times\nsparser than the one centimetre it aimed for. The second is culling: it kept\nfifty *beats* of margin either side of the viewport, which at a tight zoom is\na thousand pixels of hidden DOM and at a loose zoom is nothing. Both now live\nin `_ruler.ts`, are pure, and are tested without a DOM.\n\n**The horizontal axis is in CSS pixels, not `rem`** — the one place in this\nsystem that is true. `pxPerBeat` is not a size, it is a coordinate system the\nruler shares with whatever the caller draws underneath it: clips, automation,\na playhead overlay. Converting it to `rem` here would silently shear the\nruler away from the tracks at any root font size other than 16. The ruler's\n*height* is a size, and is in `rem` like everything else.\n\nThe ticks are painted at 10–15% opacity on purpose. A ruler is read by\nglancing, and the material under it — the clips — is what the eye is actually\non; a ruler drawn at full contrast becomes a fence across the arrangement.",
9
+ "props": [
10
+ {
11
+ "name": "totalBeats",
12
+ "type": "number",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "Length of the song, in quarter-note beats."
16
+ },
17
+ {
18
+ "name": "pxPerBeat",
19
+ "type": "number",
20
+ "required": false,
21
+ "defaultValue": "20",
22
+ "description": "Zoom, in px per quarter-note beat. Defaults to `20`."
23
+ },
24
+ {
25
+ "name": "viewport",
26
+ "type": "RulerViewport",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "What is on screen, in the same pixel coordinates.\n\nSupply it when the host already tracks its own scroll — a timeline usually\ndoes, and one source of truth scrolls in step. Omitted, the ruler watches\nits own scroll parent instead."
30
+ },
31
+ {
32
+ "name": "timeSignature",
33
+ "type": "TimeSignature",
34
+ "required": false,
35
+ "defaultValue": "{ numerator: 4, denominator: 4 }",
36
+ "description": "The signature the bars are counted in. Defaults to 4/4."
37
+ },
38
+ {
39
+ "name": "tempo",
40
+ "type": "number | null",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "Tempo in BPM. Only used for the readout and the accessible name."
44
+ },
45
+ {
46
+ "name": "playhead",
47
+ "type": "number | null",
48
+ "required": false,
49
+ "defaultValue": null,
50
+ "description": "Transport position in quarter-note beats. `null` or absent draws no playhead."
51
+ },
52
+ {
53
+ "name": "loop",
54
+ "type": "LoopRegion | null",
55
+ "required": false,
56
+ "defaultValue": null,
57
+ "description": "The loop bracket, if there is one."
58
+ },
59
+ {
60
+ "name": "markers",
61
+ "type": "readonly RulerMarker[]",
62
+ "required": false,
63
+ "defaultValue": null,
64
+ "description": "Cue points to pin along the ruler."
65
+ },
66
+ {
67
+ "name": "height",
68
+ "type": "number",
69
+ "required": false,
70
+ "defaultValue": "40",
71
+ "description": "Ruler height in px at the 16px root, emitted as `rem`. Defaults to `40`."
72
+ },
73
+ {
74
+ "name": "targetPx",
75
+ "type": "number",
76
+ "required": false,
77
+ "defaultValue": null,
78
+ "description": "Pixel spacing the ticks aim for. Defaults to one centimetre."
79
+ },
80
+ {
81
+ "name": "bufferPx",
82
+ "type": "number",
83
+ "required": false,
84
+ "defaultValue": null,
85
+ "description": "How far past the viewport to keep ruling, in px. Defaults to `120`."
86
+ },
87
+ {
88
+ "name": "label",
89
+ "type": "string",
90
+ "required": false,
91
+ "defaultValue": "Timeline",
92
+ "description": "What this timeline is. Defaults to `\"Timeline\"`."
93
+ }
94
+ ],
95
+ "typeReferences": [
96
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
97
+ ],
98
+ "subcomponents": [],
99
+ "parts": [],
100
+ "variants": {},
101
+ "defaultVariants": {},
102
+ "tokensUsed": [
103
+ "--cue-accent",
104
+ "--cue-fg",
105
+ "--cue-fg-muted",
106
+ "--cue-fg-subtle",
107
+ "--cue-font-mono",
108
+ "--cue-radius-control",
109
+ "--cue-space-1",
110
+ "--cue-surface-1",
111
+ "--cue-text-micro",
112
+ "--cue-warn"
113
+ ],
114
+ "summary": "The bar ruler over an arrangement: zoom-adaptive, culled, and deliberately faint.",
115
+ "examples": [
116
+ {
117
+ "title": "Usage",
118
+ "code": "<TimelineRuler totalBeats={512} pxPerBeat={zoom} viewport={viewport} playhead={position} />",
119
+ "language": "tsx"
120
+ }
121
+ ],
122
+ "status": "todo-docs",
123
+ "url": "/docs/components/timeline-ruler",
124
+ "mdUrl": "/docs/components/timeline-ruler.md",
125
+ "jsonUrl": "/r/components/timeline-ruler.json",
126
+ "specimens": [
127
+ {
128
+ "title": "TimelineRuler",
129
+ "group": "midi",
130
+ "components": [
131
+ "TimelineRuler"
132
+ ],
133
+ "code": "<div className=\"flex w-full flex-col gap-(--cue-space-4)\">\n {[6, 16, 44].map((pxPerBeat) => (\n <Panel key={pxPerBeat} className=\"overflow-hidden\">\n <PanelHeader\n title={`${pxPerBeat} px per beat`}\n actions={\n <Chip tone=\"neutral\">interval {chooseInterval(pxPerBeat, 4)} beats</Chip>\n }\n />\n <TimelineRuler\n totalBeats={128}\n pxPerBeat={pxPerBeat}\n viewport={{ offset: 0, width: 720 }}\n playhead={37.5}\n loop={{ start: 32, length: 16, enabled: true }}\n markers={MARKERS}\n tempo={124}\n label={`Ruler at ${pxPerBeat} pixels per beat`}\n />\n </Panel>\n ))}\n</div>",
134
+ "note": "Zoom-adaptive tick density, targeting roughly one tick per centimetre. The interval choice is a pure exported function, so it can be tested without a DOM.",
135
+ "interaction": "none itself; it is the coordinate system a track editor draws under. `pxPerBeat` stays in pixels on purpose."
136
+ }
137
+ ],
138
+ "todo": true
139
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "name": "Timeline",
3
+ "slug": "timeline",
4
+ "group": "layout",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "A vertical run of events on one rail: a run log, a cue history, a deploy\ntrail.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [],
10
+ "typeReferences": [],
11
+ "subcomponents": [
12
+ "Root",
13
+ "Item",
14
+ "Marker",
15
+ "Content"
16
+ ],
17
+ "parts": [
18
+ {
19
+ "name": "Root",
20
+ "usage": "Timeline.Root",
21
+ "description": "The list of events. A real `<ol>` — a timeline is ordered by definition, and\na screen reader should say \"list, 4 items\" rather than read four loose divs.",
22
+ "props": [],
23
+ "typeReferences": [
24
+ "React.ComponentPropsWithoutRef<\"ol\">"
25
+ ]
26
+ },
27
+ {
28
+ "name": "Item",
29
+ "usage": "Timeline.Item",
30
+ "description": "One event: marker on the rail, content beside it.\n\nThe rail is a pseudo-element on the item rather than a line drawn by the\nroot, so it stops exactly where the last entry begins — a full-height rule\nwould hang below the final marker with nothing under it. Its offset is\ncomputed from `--cue-icon-sm`, the same token the marker is sized from, so\nthe line stays centred under the dot at every density.",
31
+ "props": [],
32
+ "typeReferences": [
33
+ "React.ComponentPropsWithoutRef<\"li\">"
34
+ ]
35
+ },
36
+ {
37
+ "name": "Marker",
38
+ "usage": "Timeline.Marker",
39
+ "description": "The dot on the rail.\n\nA `StatusDot` in a ground-coloured disc: the disc punches the rail out behind\nthe marker so the line reads as *interrupted by* the event rather than as\npassing through it. Tones are the shared status vocabulary, and `StatusDot`\nalways emits its own `sr-only` label — the state is never colour-only.",
40
+ "props": [
41
+ {
42
+ "name": "tone",
43
+ "type": "\"idle\" | \"danger\" | \"busy\" | \"ok\" | \"warn\"",
44
+ "required": true,
45
+ "defaultValue": null,
46
+ "description": "Which state this event is in. The shared `StatusDot` vocabulary."
47
+ },
48
+ {
49
+ "name": "label",
50
+ "type": "string",
51
+ "required": false,
52
+ "defaultValue": null,
53
+ "description": "Screen-reader text for the dot. Defaults to the tone name."
54
+ },
55
+ {
56
+ "name": "pulse",
57
+ "type": "boolean",
58
+ "required": false,
59
+ "defaultValue": null,
60
+ "description": "Pulse the dot for an event still in progress."
61
+ }
62
+ ],
63
+ "typeReferences": [
64
+ "Omit<React.ComponentPropsWithoutRef<\"span\">, \"children\">"
65
+ ]
66
+ },
67
+ {
68
+ "name": "Content",
69
+ "usage": "Timeline.Content",
70
+ "description": "What happened: a line of text, a timestamp, a nested panel.",
71
+ "props": [],
72
+ "typeReferences": [
73
+ "React.ComponentPropsWithoutRef<\"div\">"
74
+ ]
75
+ }
76
+ ],
77
+ "variants": {},
78
+ "defaultVariants": {},
79
+ "tokensUsed": [
80
+ "--cue-bg",
81
+ "--cue-border",
82
+ "--cue-fg",
83
+ "--cue-font-mono",
84
+ "--cue-icon-sm",
85
+ "--cue-space-1",
86
+ "--cue-space-4",
87
+ "--cue-space-5",
88
+ "--cue-text-ui"
89
+ ],
90
+ "summary": "A vertical run of events on one rail: a run log, a cue history, a deploy trail.",
91
+ "examples": [
92
+ {
93
+ "title": "Usage",
94
+ "code": "<Timeline.Root>\n <Timeline.Item>\n <Timeline.Marker tone=\"ok\" label=\"Patched\" />\n <Timeline.Content>Patched universe 1</Timeline.Content>\n </Timeline.Item>\n <Timeline.Item>\n <Timeline.Marker tone=\"busy\" label=\"Focusing\" pulse />\n <Timeline.Content>Focusing front truss</Timeline.Content>\n </Timeline.Item>\n</Timeline.Root>",
95
+ "language": "tsx"
96
+ }
97
+ ],
98
+ "status": "todo-docs",
99
+ "url": "/docs/components/timeline",
100
+ "mdUrl": "/docs/components/timeline.md",
101
+ "jsonUrl": "/r/components/timeline.json",
102
+ "specimens": [
103
+ {
104
+ "title": "Timeline",
105
+ "group": "layout",
106
+ "components": [
107
+ "Timeline"
108
+ ],
109
+ "code": "<Timeline.Root className=\"w-full max-w-[36rem]\">\n {CUES.slice(0, 4).map((cue, index) => (\n <Timeline.Item key={cue.id}>\n <Timeline.Marker\n tone={index === 0 ? \"ok\" : index === 1 ? \"busy\" : index === 2 ? \"warn\" : \"idle\"}\n pulse={index === 1}\n label={index === 1 ? \"Running\" : undefined}\n />\n <Timeline.Content>\n <span className=\"font-mono text-(length:--cue-text-ui) text-fg\">{cue.label}</span>\n <span className=\"font-mono text-(length:--cue-text-micro) text-fg-subtle\">\n {cue.time} fade\n </span>\n </Timeline.Content>\n </Timeline.Item>\n ))}\n</Timeline.Root>",
110
+ "note": "An ordered list with tone markers taken from `StatusDot`, so a timeline and a status row agree on what amber means.",
111
+ "interaction": "none. A timeline is a record."
112
+ }
113
+ ],
114
+ "todo": true
115
+ }
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "TitleBar",
3
+ "slug": "title-bar",
4
+ "group": "chrome",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The window's own bar: app mark left, document name centred, controls right.",
9
+ "props": [
10
+ {
11
+ "name": "platformDrag",
12
+ "type": "boolean",
13
+ "required": false,
14
+ "defaultValue": "false",
15
+ "description": "Make the bar a window drag handle.\n\nEmits `data-tauri-drag-region` (Tauri reads the attribute) *and* the\n`app-region: drag` CSS property (Electron and Chromium read that), because\nthe same component ships into both shells and neither one recognises the\nother's contract. The interactive clusters are carved back out with\n`app-region: no-drag`, or the buttons in the bar would only ever move the\nwindow instead of firing."
16
+ },
17
+ {
18
+ "name": "center",
19
+ "type": "ReactNode",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Centre slot: the document name. Absolutely centred on the *bar*, not\nbetween the two clusters, so it does not shift sideways when a button\nappears on one side. `pointer-events-none`, so the dead space around a\nshort title stays draggable."
23
+ },
24
+ {
25
+ "name": "actions",
26
+ "type": "ReactNode",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Trailing slot: window controls, connection state, an overflow menu."
30
+ },
31
+ {
32
+ "name": "children",
33
+ "type": "ReactNode",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "Leading slot: the app mark, a back button, the file menu."
37
+ }
38
+ ],
39
+ "typeReferences": [
40
+ "React.ComponentPropsWithoutRef<\"div\">"
41
+ ],
42
+ "subcomponents": [],
43
+ "parts": [],
44
+ "variants": {},
45
+ "defaultVariants": {},
46
+ "tokensUsed": [
47
+ "--cue-border",
48
+ "--cue-chrome-titlebar",
49
+ "--cue-fg-muted",
50
+ "--cue-font-mono",
51
+ "--cue-pad-row-x",
52
+ "--cue-space-2",
53
+ "--cue-space-3",
54
+ "--cue-surface-1",
55
+ "--cue-text-label"
56
+ ],
57
+ "summary": "The window's own bar: app mark left, document name centred, controls right.",
58
+ "examples": [
59
+ {
60
+ "title": "Usage",
61
+ "code": "<TitleBar platformDrag center=\"untitled.cue\" actions={<WindowControls />}>\n <Eyebrow>CUE++</Eyebrow>\n</TitleBar>",
62
+ "language": "tsx"
63
+ }
64
+ ],
65
+ "status": "todo-docs",
66
+ "url": "/docs/components/title-bar",
67
+ "mdUrl": "/docs/components/title-bar.md",
68
+ "jsonUrl": "/r/components/title-bar.json",
69
+ "specimens": [
70
+ {
71
+ "title": "TitleBar",
72
+ "group": "chrome",
73
+ "components": [
74
+ "TitleBar"
75
+ ],
76
+ "code": "<div className=\"w-full overflow-hidden rounded-(--radius-surface) border border-border\">\n <TitleBar center=\"dmxhub — universe 1\" actions={<Chip tone=\"ok\">connected</Chip>}>\n <Eyebrow>cue++</Eyebrow>\n </TitleBar>\n</div>",
77
+ "note": "Window furniture, sized from the chrome rung rather than the control ladder.",
78
+ "interaction": "the drag region is inert in a browser; `platformDrag` turns it on for Electron and Tauri."
79
+ }
80
+ ],
81
+ "todo": true
82
+ }
@@ -0,0 +1,130 @@
1
+ {
2
+ "name": "Toast",
3
+ "slug": "toast",
4
+ "group": "overlays",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Transient confirmations and failures: \"patched\", \"export finished\",\n\"Art-Net node went away\".\n\nWraps Base UI's `Toast`, which owns the queue, the auto-dismiss timers, the\nlive-region announcements, swipe-to-dismiss and the F6 focus hotkey. This\nlayer supplies the surface, the tone rail and the portal theme stamp.",
9
+ "props": [],
10
+ "typeReferences": [],
11
+ "subcomponents": [
12
+ "Provider",
13
+ "Viewport"
14
+ ],
15
+ "parts": [
16
+ {
17
+ "name": "Provider",
18
+ "usage": "Toast.Provider",
19
+ "description": "Holds the toast queue. Mount it once, high in the tree, around everything\nthat might raise a toast — and render exactly one {@link ToastViewport}\ninside it.\n\n`limit` defaults to `3`: beyond that the oldest toasts are marked\n`data-limited` and hidden rather than dropped, so they reappear as the stack\ndrains.",
20
+ "props": [],
21
+ "typeReferences": [
22
+ "BaseToast.Provider.Props"
23
+ ]
24
+ },
25
+ {
26
+ "name": "Viewport",
27
+ "usage": "Toast.Viewport",
28
+ "description": "Where the stack appears: bottom-right, newest nearest the corner.\n\nPortalled through {@link useCuePortalProps} so the cards render in the app's\ntheme and density regardless of which subtree raised them. Render exactly one\nper {@link ToastProvider}.",
29
+ "props": [
30
+ {
31
+ "name": "className",
32
+ "type": "string",
33
+ "required": false,
34
+ "defaultValue": null,
35
+ "description": "Extra classes for the viewport (move the corner, change the width)."
36
+ },
37
+ {
38
+ "name": "toastClassName",
39
+ "type": "string",
40
+ "required": false,
41
+ "defaultValue": null,
42
+ "description": "Extra classes for every toast card."
43
+ },
44
+ {
45
+ "name": "closeLabel",
46
+ "type": "string",
47
+ "required": false,
48
+ "defaultValue": "Dismiss",
49
+ "description": "Accessible name for each card's close affordance. Defaults to `\"Dismiss\"`."
50
+ }
51
+ ],
52
+ "typeReferences": []
53
+ }
54
+ ],
55
+ "variants": {},
56
+ "defaultVariants": {},
57
+ "tokensUsed": [
58
+ "--cue-accent",
59
+ "--cue-accent-soft",
60
+ "--cue-border",
61
+ "--cue-border-overlay",
62
+ "--cue-border-strong",
63
+ "--cue-busy",
64
+ "--cue-control-sm",
65
+ "--cue-danger",
66
+ "--cue-fg",
67
+ "--cue-fg-muted",
68
+ "--cue-fg-subtle",
69
+ "--cue-font-mono",
70
+ "--cue-icon-md",
71
+ "--cue-icon-sm",
72
+ "--cue-info",
73
+ "--cue-ok",
74
+ "--cue-radius-control",
75
+ "--cue-radius-overlay",
76
+ "--cue-scrim",
77
+ "--cue-space-1",
78
+ "--cue-space-2",
79
+ "--cue-space-3",
80
+ "--cue-space-4",
81
+ "--cue-space-6",
82
+ "--cue-surface-2",
83
+ "--cue-text-emphasis",
84
+ "--cue-text-label",
85
+ "--cue-text-ui",
86
+ "--cue-warn"
87
+ ],
88
+ "summary": "A short, dismissible note about something that just happened.",
89
+ "examples": [
90
+ {
91
+ "title": "Raising one",
92
+ "code": "const { add } = useToast();\n\nadd({\n title: \"Patch saved\",\n description: \"12 fixtures written to universe 1.\",\n tone: \"ok\",\n actionProps: { children: \"Undo\", onClick: undo },\n});",
93
+ "language": "tsx"
94
+ },
95
+ {
96
+ "title": "Usage",
97
+ "code": "<Toast.Provider>\n <App />\n <Toast.Viewport />\n</Toast.Provider>",
98
+ "language": "tsx"
99
+ }
100
+ ],
101
+ "status": "stable",
102
+ "url": "/docs/components/toast",
103
+ "mdUrl": "/docs/components/toast.md",
104
+ "jsonUrl": "/r/components/toast.json",
105
+ "whenToUse": [
106
+ "Confirming an action that finished away from the user's attention, or reporting a failure with nowhere inline to put it.",
107
+ "One `Toast.Provider` high in the tree, with exactly one `Toast.Viewport` inside it."
108
+ ],
109
+ "whenNotToUse": [
110
+ "Validating a field the user is editing. Use `FieldError`, which stays with the control.",
111
+ "Anything that must be acknowledged before continuing. Use `AlertDialog`.",
112
+ "Long text. A toast leaves on its own."
113
+ ],
114
+ "commonMistakes": [
115
+ "Mounting a second viewport, which splits the queue across two corners of the screen.",
116
+ "Raising one toast per item in a batch. Reuse the id and call `update`, so the count changes in place."
117
+ ],
118
+ "specimens": [
119
+ {
120
+ "title": "Toast",
121
+ "group": "overlays",
122
+ "components": [
123
+ "Toast"
124
+ ],
125
+ "code": "<Toast.Provider>\n <ToastBench />\n</Toast.Provider>",
126
+ "note": "Seven tones and an optional action, in a viewport that stacks from the corner.",
127
+ "interaction": "a hovered stack stops its timers; Escape moves focus into the stack so a toast action is reachable."
128
+ }
129
+ ]
130
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "ToggleGroup",
3
+ "slug": "toggle-group",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A cluster of {@link Toggle }s sharing one pressed state.\n\nThe difference from {@link SegmentedControl } is not cosmetic: a toggle group\ncan be **empty**. Pressing the pressed item unpresses it, so \"no filter\" is a\nreachable state — which is what a filter bar needs and what a view switcher\nmust never offer. Reach for `SegmentedControl` when the answer is always one\nof N, and for this when the answer may be none, or several (`multiple`).\n\nArrow-key roving focus and the pressed-state ARIA come from Base UI; this\nlayer supplies the density rung (published to the children through context)\nand the flat frame-less layout — a group of toggles is a row of controls, not\na boxed widget.",
9
+ "props": [
10
+ {
11
+ "name": "className",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Extra classes for the group frame."
16
+ },
17
+ {
18
+ "name": "children",
19
+ "type": "ReactNode",
20
+ "required": true,
21
+ "defaultValue": null,
22
+ "description": "The {@link Toggle }s, each carrying a `value`."
23
+ },
24
+ {
25
+ "name": "size",
26
+ "type": "\"sm\" | \"md\" | \"lg\"",
27
+ "required": false,
28
+ "defaultValue": "md",
29
+ "description": "Rung of the control ladder for every toggle inside. Defaults to `\"md\"`."
30
+ },
31
+ {
32
+ "name": "defaultValue",
33
+ "type": "readonly string[]",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "The initially pressed values when uncontrolled."
37
+ },
38
+ {
39
+ "name": "value",
40
+ "type": "readonly string[]",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "The pressed values when controlled. Pass with `onValueChange`."
44
+ },
45
+ {
46
+ "name": "onValueChange",
47
+ "type": "((value: string[]) => void)",
48
+ "required": false,
49
+ "defaultValue": null,
50
+ "description": "Called with every pressed value, in the order the toggles are declared."
51
+ }
52
+ ],
53
+ "typeReferences": [
54
+ "Omit<\n BaseToggleGroup.Props,\n \"className\" | \"value\" | \"defaultValue\" | \"onValueChange\" | \"children\"\n >"
55
+ ],
56
+ "subcomponents": [],
57
+ "parts": [],
58
+ "variants": {},
59
+ "defaultVariants": {},
60
+ "tokensUsed": [
61
+ "--cue-accent",
62
+ "--cue-border",
63
+ "--cue-control-lg",
64
+ "--cue-control-md",
65
+ "--cue-control-sm",
66
+ "--cue-danger",
67
+ "--cue-fg",
68
+ "--cue-fg-subtle",
69
+ "--cue-font-mono",
70
+ "--cue-radius-control",
71
+ "--cue-space-1",
72
+ "--cue-space-3",
73
+ "--cue-space-4",
74
+ "--cue-space-5",
75
+ "--cue-sunken",
76
+ "--cue-text-body",
77
+ "--cue-text-label",
78
+ "--cue-text-ui"
79
+ ],
80
+ "summary": "A cluster of {@link Toggle }s sharing one pressed state.",
81
+ "examples": [
82
+ {
83
+ "title": "Usage",
84
+ "code": "<ToggleGroup aria-label=\"Layers\" multiple value={layers} onValueChange={setLayers}>\n <Toggle value=\"beams\">Beams</Toggle>\n <Toggle value=\"haze\">Haze</Toggle>\n</ToggleGroup>",
85
+ "language": "tsx"
86
+ }
87
+ ],
88
+ "status": "todo-docs",
89
+ "url": "/docs/components/toggle-group",
90
+ "mdUrl": "/docs/components/toggle-group.md",
91
+ "jsonUrl": "/r/components/toggle-group.json",
92
+ "specimens": [
93
+ {
94
+ "title": "Toggle / ToggleGroup",
95
+ "group": "forms",
96
+ "components": [
97
+ "Toggle",
98
+ "ToggleGroup"
99
+ ],
100
+ "code": "<Specimens>\n <Specimen label=\"off\">\n <Toggle aria-label=\"Highlight\" icon={Lightbulb} />\n </Specimen>\n <Specimen label=\"on\">\n <Toggle aria-label=\"Highlight, on\" icon={Lightbulb} defaultPressed />\n </Specimen>\n <Specimen label=\"with label\">\n <Toggle icon={Lightbulb}>Highlight</Toggle>\n </Specimen>\n <Specimen label=\"disabled\">\n <Toggle aria-label=\"Highlight, disabled\" icon={Lightbulb} disabled />\n </Specimen>\n <Specimen label=\"group\">\n <ToggleGroup aria-label=\"Text style\" defaultValue={[\"bold\"]}>\n <Toggle value=\"bold\" aria-label=\"Bold\" icon={Bold} />\n <Toggle value=\"italic\" aria-label=\"Italic\" icon={Italic} />\n <Toggle value=\"underline\" aria-label=\"Underline\" icon={Underline} />\n </ToggleGroup>\n </Specimen>\n</Specimens>",
101
+ "note": "A button that stays pressed, and a set of them. `aria-pressed` carries the state.",
102
+ "interaction": "hover tints the ground; pressed is accent-soft, on the same ruling as the active tab."
103
+ }
104
+ ],
105
+ "todo": true
106
+ }