@cueplusplus/ui 0.1.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 (372) hide show
  1. package/dist/charts/_token.js +39 -0
  2. package/dist/charts/container.d.ts +58 -0
  3. package/dist/charts/container.js +77 -0
  4. package/dist/charts/index.d.ts +5 -0
  5. package/dist/charts/index.js +5 -0
  6. package/dist/charts/ramps.d.ts +140 -0
  7. package/dist/charts/ramps.js +615 -0
  8. package/dist/charts/theme.d.ts +112 -0
  9. package/dist/charts/theme.js +165 -0
  10. package/dist/charts/tones.d.ts +111 -0
  11. package/dist/charts/tones.js +127 -0
  12. package/dist/chat/_glyphs.js +55 -0
  13. package/dist/chat/agent-color.d.ts +84 -0
  14. package/dist/chat/agent-color.js +101 -0
  15. package/dist/chat/agent-pile.d.ts +55 -0
  16. package/dist/chat/agent-pile.js +121 -0
  17. package/dist/chat/ask-box.d.ts +88 -0
  18. package/dist/chat/ask-box.js +341 -0
  19. package/dist/chat/composer.d.ts +66 -0
  20. package/dist/chat/composer.js +144 -0
  21. package/dist/chat/delegation-card.d.ts +60 -0
  22. package/dist/chat/delegation-card.js +129 -0
  23. package/dist/chat/index.d.ts +8 -0
  24. package/dist/chat/index.js +8 -0
  25. package/dist/chat/message-list.d.ts +39 -0
  26. package/dist/chat/message-list.js +105 -0
  27. package/dist/chat/message.d.ts +47 -0
  28. package/dist/chat/message.js +108 -0
  29. package/dist/chrome/_glyphs.js +101 -0
  30. package/dist/chrome/_tabs-scroll.d.ts +62 -0
  31. package/dist/chrome/_tabs-scroll.js +68 -0
  32. package/dist/chrome/_tree.d.ts +75 -0
  33. package/dist/chrome/_tree.js +49 -0
  34. package/dist/chrome/empty-state.d.ts +37 -0
  35. package/dist/chrome/empty-state.js +57 -0
  36. package/dist/chrome/eyebrow.d.ts +29 -0
  37. package/dist/chrome/eyebrow.js +36 -0
  38. package/dist/chrome/index.d.ts +17 -0
  39. package/dist/chrome/index.js +17 -0
  40. package/dist/chrome/navigation-menu.d.ts +80 -0
  41. package/dist/chrome/navigation-menu.js +121 -0
  42. package/dist/chrome/page-shell.d.ts +38 -0
  43. package/dist/chrome/page-shell.js +66 -0
  44. package/dist/chrome/panel.d.ts +55 -0
  45. package/dist/chrome/panel.js +67 -0
  46. package/dist/chrome/row.d.ts +82 -0
  47. package/dist/chrome/row.js +106 -0
  48. package/dist/chrome/scroll-area.d.ts +39 -0
  49. package/dist/chrome/scroll-area.js +70 -0
  50. package/dist/chrome/section-header.d.ts +42 -0
  51. package/dist/chrome/section-header.js +79 -0
  52. package/dist/chrome/segmented-control.d.ts +58 -0
  53. package/dist/chrome/segmented-control.js +76 -0
  54. package/dist/chrome/status-bar.d.ts +46 -0
  55. package/dist/chrome/status-bar.js +56 -0
  56. package/dist/chrome/tabs.d.ts +80 -0
  57. package/dist/chrome/tabs.js +176 -0
  58. package/dist/chrome/title-bar.d.ts +37 -0
  59. package/dist/chrome/title-bar.js +45 -0
  60. package/dist/chrome/toolbar.d.ts +46 -0
  61. package/dist/chrome/toolbar.js +62 -0
  62. package/dist/chrome/tree.d.ts +98 -0
  63. package/dist/chrome/tree.js +248 -0
  64. package/dist/color/_checker.js +14 -0
  65. package/dist/color/_convert.d.ts +52 -0
  66. package/dist/color/_convert.js +66 -0
  67. package/dist/color/_glyphs.js +28 -0
  68. package/dist/color/_thumb.js +15 -0
  69. package/dist/color/_value.js +28 -0
  70. package/dist/color/color-area.d.ts +27 -0
  71. package/dist/color/color-area.js +40 -0
  72. package/dist/color/color-field.d.ts +32 -0
  73. package/dist/color/color-field.js +43 -0
  74. package/dist/color/color-picker.d.ts +71 -0
  75. package/dist/color/color-picker.js +178 -0
  76. package/dist/color/color-slider.d.ts +31 -0
  77. package/dist/color/color-slider.js +51 -0
  78. package/dist/color/color-swatch.d.ts +32 -0
  79. package/dist/color/color-swatch.js +44 -0
  80. package/dist/color/index.d.ts +7 -0
  81. package/dist/color/index.js +7 -0
  82. package/dist/configurator/_export.d.ts +78 -0
  83. package/dist/configurator/_export.js +261 -0
  84. package/dist/configurator/_glyphs.js +92 -0
  85. package/dist/configurator/_overrides.d.ts +247 -0
  86. package/dist/configurator/_overrides.js +514 -0
  87. package/dist/configurator/configurator.d.ts +71 -0
  88. package/dist/configurator/configurator.js +279 -0
  89. package/dist/configurator/export-dialog.d.ts +30 -0
  90. package/dist/configurator/export-dialog.js +121 -0
  91. package/dist/configurator/index.d.ts +8 -0
  92. package/dist/configurator/index.js +8 -0
  93. package/dist/configurator/panel-sections.d.ts +86 -0
  94. package/dist/configurator/panel-sections.js +316 -0
  95. package/dist/configurator/token-editor.d.ts +74 -0
  96. package/dist/configurator/token-editor.js +149 -0
  97. package/dist/configurator/use-zoom.d.ts +87 -0
  98. package/dist/configurator/use-zoom.js +113 -0
  99. package/dist/date/_glyphs.js +34 -0
  100. package/dist/date/_segments.js +55 -0
  101. package/dist/date/_trigger.js +31 -0
  102. package/dist/date/calendar.d.ts +25 -0
  103. package/dist/date/calendar.js +125 -0
  104. package/dist/date/date-field.d.ts +34 -0
  105. package/dist/date/date-field.js +41 -0
  106. package/dist/date/date-picker.d.ts +69 -0
  107. package/dist/date/date-picker.js +89 -0
  108. package/dist/date/date-range-picker.d.ts +65 -0
  109. package/dist/date/date-range-picker.js +92 -0
  110. package/dist/date/index.d.ts +6 -0
  111. package/dist/date/index.js +6 -0
  112. package/dist/date/time-field.d.ts +29 -0
  113. package/dist/date/time-field.js +36 -0
  114. package/dist/dmx/_ramp.d.ts +77 -0
  115. package/dist/dmx/_ramp.js +169 -0
  116. package/dist/dmx/_readout.js +53 -0
  117. package/dist/dmx/_universe.d.ts +105 -0
  118. package/dist/dmx/_universe.js +112 -0
  119. package/dist/dmx/channel-matrix.d.ts +81 -0
  120. package/dist/dmx/channel-matrix.js +285 -0
  121. package/dist/dmx/dmx-bar.d.ts +50 -0
  122. package/dist/dmx/dmx-bar.js +107 -0
  123. package/dist/dmx/dmx-strip.d.ts +41 -0
  124. package/dist/dmx/dmx-strip.js +196 -0
  125. package/dist/dmx/index.d.ts +7 -0
  126. package/dist/dmx/index.js +7 -0
  127. package/dist/dmx/universe-grid.d.ts +61 -0
  128. package/dist/dmx/universe-grid.js +182 -0
  129. package/dist/flow/_frame.d.ts +52 -0
  130. package/dist/flow/_frame.js +38 -0
  131. package/dist/flow/controls.d.ts +41 -0
  132. package/dist/flow/controls.js +53 -0
  133. package/dist/flow/flow.css +121 -0
  134. package/dist/flow/handles.d.ts +40 -0
  135. package/dist/flow/handles.js +61 -0
  136. package/dist/flow/index.d.ts +7 -0
  137. package/dist/flow/index.js +7 -0
  138. package/dist/flow/node-card.d.ts +71 -0
  139. package/dist/flow/node-card.js +102 -0
  140. package/dist/flow/signal-edge.d.ts +60 -0
  141. package/dist/flow/signal-edge.js +108 -0
  142. package/dist/flow/use-flow-theme.d.ts +69 -0
  143. package/dist/flow/use-flow-theme.js +109 -0
  144. package/dist/forms/_chassis.d.ts +64 -0
  145. package/dist/forms/_chassis.js +59 -0
  146. package/dist/forms/_glyphs.js +143 -0
  147. package/dist/forms/_listbox.js +55 -0
  148. package/dist/forms/autocomplete.d.ts +61 -0
  149. package/dist/forms/autocomplete.js +88 -0
  150. package/dist/forms/button-group.d.ts +47 -0
  151. package/dist/forms/button-group.js +52 -0
  152. package/dist/forms/checkbox.d.ts +51 -0
  153. package/dist/forms/checkbox.js +98 -0
  154. package/dist/forms/combobox.d.ts +73 -0
  155. package/dist/forms/combobox.js +108 -0
  156. package/dist/forms/env-var-input.d.ts +74 -0
  157. package/dist/forms/env-var-input.js +116 -0
  158. package/dist/forms/field.d.ts +89 -0
  159. package/dist/forms/field.js +102 -0
  160. package/dist/forms/file-upload.d.ts +113 -0
  161. package/dist/forms/file-upload.js +232 -0
  162. package/dist/forms/index.d.ts +26 -0
  163. package/dist/forms/index.js +26 -0
  164. package/dist/forms/input-group.d.ts +31 -0
  165. package/dist/forms/input-group.js +54 -0
  166. package/dist/forms/input.d.ts +33 -0
  167. package/dist/forms/input.js +36 -0
  168. package/dist/forms/multi-select.d.ts +62 -0
  169. package/dist/forms/multi-select.js +107 -0
  170. package/dist/forms/number-field.d.ts +38 -0
  171. package/dist/forms/number-field.js +64 -0
  172. package/dist/forms/otp-field.d.ts +54 -0
  173. package/dist/forms/otp-field.js +59 -0
  174. package/dist/forms/password-input.d.ts +46 -0
  175. package/dist/forms/password-input.js +62 -0
  176. package/dist/forms/radio-group.d.ts +50 -0
  177. package/dist/forms/radio-group.js +64 -0
  178. package/dist/forms/rating.d.ts +69 -0
  179. package/dist/forms/rating.js +103 -0
  180. package/dist/forms/scrub-input.d.ts +81 -0
  181. package/dist/forms/scrub-input.js +249 -0
  182. package/dist/forms/search-input.d.ts +54 -0
  183. package/dist/forms/search-input.js +112 -0
  184. package/dist/forms/select.d.ts +75 -0
  185. package/dist/forms/select.js +91 -0
  186. package/dist/forms/slider.d.ts +44 -0
  187. package/dist/forms/slider.js +65 -0
  188. package/dist/forms/switch.d.ts +36 -0
  189. package/dist/forms/switch.js +71 -0
  190. package/dist/forms/tags-input.d.ts +69 -0
  191. package/dist/forms/tags-input.js +148 -0
  192. package/dist/forms/textarea.d.ts +27 -0
  193. package/dist/forms/textarea.js +37 -0
  194. package/dist/forms/toggle-group.d.ts +41 -0
  195. package/dist/forms/toggle-group.js +56 -0
  196. package/dist/forms/toggle.d.ts +41 -0
  197. package/dist/forms/toggle.js +100 -0
  198. package/dist/index.d.ts +112 -0
  199. package/dist/index.js +104 -0
  200. package/dist/instruments/_ansi.js +116 -0
  201. package/dist/instruments/_glyphs.js +90 -0
  202. package/dist/instruments/_motion.js +56 -0
  203. package/dist/instruments/_rem.js +21 -0
  204. package/dist/instruments/app-window-frame.d.ts +48 -0
  205. package/dist/instruments/app-window-frame.js +76 -0
  206. package/dist/instruments/copy-button.d.ts +41 -0
  207. package/dist/instruments/copy-button.js +112 -0
  208. package/dist/instruments/data-table.d.ts +168 -0
  209. package/dist/instruments/data-table.js +212 -0
  210. package/dist/instruments/group-bar.d.ts +63 -0
  211. package/dist/instruments/group-bar.js +122 -0
  212. package/dist/instruments/index.d.ts +13 -0
  213. package/dist/instruments/index.js +13 -0
  214. package/dist/instruments/log-viewer.d.ts +74 -0
  215. package/dist/instruments/log-viewer.js +215 -0
  216. package/dist/instruments/meter.d.ts +77 -0
  217. package/dist/instruments/meter.js +96 -0
  218. package/dist/instruments/progress.d.ts +45 -0
  219. package/dist/instruments/progress.js +61 -0
  220. package/dist/instruments/seam-grid.d.ts +66 -0
  221. package/dist/instruments/seam-grid.js +78 -0
  222. package/dist/instruments/sparkline.d.ts +39 -0
  223. package/dist/instruments/sparkline.js +85 -0
  224. package/dist/instruments/stat.d.ts +35 -0
  225. package/dist/instruments/stat.js +59 -0
  226. package/dist/instruments/table.d.ts +51 -0
  227. package/dist/instruments/table.js +92 -0
  228. package/dist/instruments/terminal-frame.d.ts +89 -0
  229. package/dist/instruments/terminal-frame.js +256 -0
  230. package/dist/instruments/two-step-button.d.ts +47 -0
  231. package/dist/instruments/two-step-button.js +147 -0
  232. package/dist/instruments/usage-chart.d.ts +55 -0
  233. package/dist/instruments/usage-chart.js +235 -0
  234. package/dist/layout/_collapse.js +46 -0
  235. package/dist/layout/_glyphs.js +45 -0
  236. package/dist/layout/accordion.d.ts +52 -0
  237. package/dist/layout/accordion.js +81 -0
  238. package/dist/layout/breadcrumb.d.ts +35 -0
  239. package/dist/layout/breadcrumb.js +67 -0
  240. package/dist/layout/card.d.ts +51 -0
  241. package/dist/layout/card.js +76 -0
  242. package/dist/layout/carousel.d.ts +96 -0
  243. package/dist/layout/carousel.js +211 -0
  244. package/dist/layout/collapsible.d.ts +74 -0
  245. package/dist/layout/collapsible.js +126 -0
  246. package/dist/layout/container.d.ts +27 -0
  247. package/dist/layout/container.js +40 -0
  248. package/dist/layout/description-list.d.ts +24 -0
  249. package/dist/layout/description-list.js +37 -0
  250. package/dist/layout/grid.d.ts +40 -0
  251. package/dist/layout/grid.js +48 -0
  252. package/dist/layout/index.d.ts +15 -0
  253. package/dist/layout/index.js +15 -0
  254. package/dist/layout/item.d.ts +65 -0
  255. package/dist/layout/item.js +100 -0
  256. package/dist/layout/link.d.ts +48 -0
  257. package/dist/layout/link.js +63 -0
  258. package/dist/layout/pagination.d.ts +54 -0
  259. package/dist/layout/pagination.js +121 -0
  260. package/dist/layout/resizable.d.ts +38 -0
  261. package/dist/layout/resizable.js +68 -0
  262. package/dist/layout/sidebar.d.ts +67 -0
  263. package/dist/layout/sidebar.js +129 -0
  264. package/dist/layout/stack.d.ts +46 -0
  265. package/dist/layout/stack.js +62 -0
  266. package/dist/layout/stepper.d.ts +49 -0
  267. package/dist/layout/stepper.js +81 -0
  268. package/dist/layout/timeline.d.ts +43 -0
  269. package/dist/layout/timeline.js +63 -0
  270. package/dist/lib/aria-class.js +24 -0
  271. package/dist/lib/cn.js +18 -0
  272. package/dist/lib/compose.js +38 -0
  273. package/dist/lib/cva.d.ts +18 -0
  274. package/dist/lib/cva.js +65 -0
  275. package/dist/midi/_notes.d.ts +101 -0
  276. package/dist/midi/_notes.js +183 -0
  277. package/dist/midi/_ruler.d.ts +100 -0
  278. package/dist/midi/_ruler.js +105 -0
  279. package/dist/midi/_time.d.ts +107 -0
  280. package/dist/midi/_time.js +130 -0
  281. package/dist/midi/index.d.ts +9 -0
  282. package/dist/midi/index.js +9 -0
  283. package/dist/midi/musical-time-input.d.ts +48 -0
  284. package/dist/midi/musical-time-input.js +154 -0
  285. package/dist/midi/piano-keyboard.d.ts +50 -0
  286. package/dist/midi/piano-keyboard.js +193 -0
  287. package/dist/midi/spectrum-visualizer.d.ts +65 -0
  288. package/dist/midi/spectrum-visualizer.js +213 -0
  289. package/dist/midi/threshold-rail.d.ts +72 -0
  290. package/dist/midi/threshold-rail.js +214 -0
  291. package/dist/midi/timeline-ruler.d.ts +83 -0
  292. package/dist/midi/timeline-ruler.js +152 -0
  293. package/dist/overlays/_debounce.js +34 -0
  294. package/dist/overlays/_glyphs.js +59 -0
  295. package/dist/overlays/_surface.d.ts +70 -0
  296. package/dist/overlays/_surface.js +70 -0
  297. package/dist/overlays/_wheel.js +42 -0
  298. package/dist/overlays/alert-dialog.d.ts +67 -0
  299. package/dist/overlays/alert-dialog.js +117 -0
  300. package/dist/overlays/command-palette.d.ts +93 -0
  301. package/dist/overlays/command-palette.js +193 -0
  302. package/dist/overlays/context-menu.d.ts +64 -0
  303. package/dist/overlays/context-menu.js +78 -0
  304. package/dist/overlays/dialog.d.ts +72 -0
  305. package/dist/overlays/dialog.js +124 -0
  306. package/dist/overlays/drawer.d.ts +75 -0
  307. package/dist/overlays/drawer.js +151 -0
  308. package/dist/overlays/dropdown-menu.d.ts +79 -0
  309. package/dist/overlays/dropdown-menu.js +156 -0
  310. package/dist/overlays/hover-card.d.ts +58 -0
  311. package/dist/overlays/hover-card.js +91 -0
  312. package/dist/overlays/index.d.ts +15 -0
  313. package/dist/overlays/index.js +15 -0
  314. package/dist/overlays/info-tip.d.ts +41 -0
  315. package/dist/overlays/info-tip.js +45 -0
  316. package/dist/overlays/menubar.d.ts +72 -0
  317. package/dist/overlays/menubar.js +100 -0
  318. package/dist/overlays/popover.d.ts +66 -0
  319. package/dist/overlays/popover.js +114 -0
  320. package/dist/overlays/sheet.d.ts +78 -0
  321. package/dist/overlays/sheet.js +131 -0
  322. package/dist/overlays/toast.d.ts +106 -0
  323. package/dist/overlays/toast.js +146 -0
  324. package/dist/overlays/tooltip.d.ts +57 -0
  325. package/dist/overlays/tooltip.js +95 -0
  326. package/dist/primitives/avatar.d.ts +51 -0
  327. package/dist/primitives/avatar.js +93 -0
  328. package/dist/primitives/button.d.ts +46 -0
  329. package/dist/primitives/button.js +94 -0
  330. package/dist/primitives/chip.d.ts +47 -0
  331. package/dist/primitives/chip.js +152 -0
  332. package/dist/primitives/icon-button.d.ts +41 -0
  333. package/dist/primitives/icon-button.js +59 -0
  334. package/dist/primitives/index.d.ts +10 -0
  335. package/dist/primitives/index.js +10 -0
  336. package/dist/primitives/kbd.d.ts +17 -0
  337. package/dist/primitives/kbd.js +24 -0
  338. package/dist/primitives/separator.d.ts +25 -0
  339. package/dist/primitives/separator.js +30 -0
  340. package/dist/primitives/skeleton.d.ts +20 -0
  341. package/dist/primitives/skeleton.js +27 -0
  342. package/dist/primitives/spinner.d.ts +26 -0
  343. package/dist/primitives/spinner.js +31 -0
  344. package/dist/primitives/status-dot.d.ts +44 -0
  345. package/dist/primitives/status-dot.js +50 -0
  346. package/dist/styles.css +19 -0
  347. package/dist/system/density.d.ts +33 -0
  348. package/dist/system/density.js +49 -0
  349. package/dist/system/index.d.ts +8 -0
  350. package/dist/system/index.js +7 -0
  351. package/dist/system/portal.d.ts +51 -0
  352. package/dist/system/portal.js +122 -0
  353. package/dist/system/prepaint.d.ts +38 -0
  354. package/dist/system/prepaint.js +37 -0
  355. package/dist/system/theme-provider.d.ts +72 -0
  356. package/dist/system/theme-provider.js +252 -0
  357. package/dist/system/use-density.d.ts +33 -0
  358. package/dist/system/use-density.js +84 -0
  359. package/dist/system/use-isomorphic-layout-effect.js +15 -0
  360. package/dist/system/use-theme.d.ts +19 -0
  361. package/dist/system/use-theme.js +25 -0
  362. package/dist/theming/_presets.d.ts +11 -0
  363. package/dist/theming/_presets.js +487 -0
  364. package/dist/theming/contrast.d.ts +110 -0
  365. package/dist/theming/contrast.js +167 -0
  366. package/dist/theming/create-theme.d.ts +165 -0
  367. package/dist/theming/create-theme.js +442 -0
  368. package/dist/theming/index.d.ts +5 -0
  369. package/dist/theming/index.js +5 -0
  370. package/dist/theming/serialize.d.ts +145 -0
  371. package/dist/theming/serialize.js +165 -0
  372. package/package.json +216 -0
@@ -0,0 +1,279 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { Button } from "../primitives/button.js";
4
+ import { Chip } from "../primitives/chip.js";
5
+ import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
6
+ import { overlaySurfaceClasses } from "../overlays/_surface.js";
7
+ import { TwoStepButton } from "../instruments/two-step-button.js";
8
+ import { IconButton } from "../primitives/icon-button.js";
9
+ import { useTheme } from "../system/use-theme.js";
10
+ import { DEFAULT_CONFIGURATOR_STORAGE_KEY, EMPTY_OVERRIDES, applyOverrideCss, clearOverride, configuratorCss, defaultSnapshot, isOverridden, overrideCount, readSnapshot, removeOverrideStyles, resolveValue, resolvedTokens, setOverride, writeSnapshot } from "./_overrides.js";
11
+ import { ChevronGlyph, DockGlyph, GripGlyph } from "./_glyphs.js";
12
+ import { ExportDialog } from "./export-dialog.js";
13
+ import { ColorsSection, PresetSection, ShapeSection } from "./panel-sections.js";
14
+ import { useZoom } from "./use-zoom.js";
15
+ import * as React from "react";
16
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
+ //#region src/configurator/configurator.tsx
18
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
19
+ /**
20
+ * The floating theme configurator: the panel that edits the design system it is
21
+ * drawn with.
22
+ *
23
+ * It is a **component**, not a devtool bolted onto the kitchensink — mount it in
24
+ * any app behind a flag and a designer can retune that app's theme in place. The
25
+ * whole thing rests on one rule, and the rule is what keeps it from being a toy:
26
+ * *everything it does is a `--cue-*` declaration in one stylesheet.* No inline
27
+ * styles on the root, no parallel token vocabulary, no runtime theme engine. The
28
+ * CSS it exports is byte for byte the CSS the page is wearing, which is the only
29
+ * reason the export dialog can promise a round trip at all.
30
+ *
31
+ * What it owns:
32
+ *
33
+ * - **Preset, mode and density** are the provider's, driven through `useTheme()`
34
+ * so a switch restamps `<html>`, every portal, and the persisted preference.
35
+ * - **Colour, type and geometry overrides** go into
36
+ * `<style id="cue-configurator-overrides">`, scoped so they win where they
37
+ * have to and lose where they should — the cascade reasoning is in
38
+ * `_overrides.ts`, and it is the interesting part of this group.
39
+ * - **Text scale and root zoom**, the two relief valves the density ladder is
40
+ * paired with.
41
+ * - **Its own placement**, furled state and every override, in `localStorage`
42
+ * under one key.
43
+ *
44
+ * Renders in place as a `position: fixed` region, so mount it inside the
45
+ * provider — it needs the theme context — but outside any transformed ancestor,
46
+ * which would turn `fixed` into `absolute` and take the panel with the page.
47
+ *
48
+ * @throws If rendered outside a `<ThemeProvider>`: there is no theme to
49
+ * configure, which is a wiring bug rather than a fallback situation.
50
+ * @example
51
+ * <ThemeProvider>
52
+ * <App />
53
+ * {devMode ? <ThemeConfigurator /> : null}
54
+ * </ThemeProvider>
55
+ * @example
56
+ * <ThemeConfigurator position="docked-right" onChange={(tokens) => report(tokens)} />
57
+ */
58
+ function ThemeConfigurator({ position: positionProp, defaultPosition = "floating", onPositionChange, defaultCollapsed = false, storageKey = DEFAULT_CONFIGURATOR_STORAGE_KEY, onChange, zoomShortcuts = true, title = "Theme", className }) {
59
+ const { theme, resolvedMode } = useTheme();
60
+ const scope = React.useMemo(() => ({
61
+ theme,
62
+ mode: resolvedMode
63
+ }), [theme, resolvedMode]);
64
+ const [snapshot, setSnapshot] = React.useState(() => {
65
+ const initial = defaultSnapshot();
66
+ return {
67
+ ...initial,
68
+ panel: {
69
+ ...initial.panel,
70
+ position: defaultPosition,
71
+ collapsed: defaultCollapsed
72
+ }
73
+ };
74
+ });
75
+ const restoredKey = React.useRef(null);
76
+ useIsomorphicLayoutEffect(() => {
77
+ if (restoredKey.current === storageKey) return;
78
+ restoredKey.current = storageKey;
79
+ const stored = readSnapshot(storageKey);
80
+ if (stored !== null) setSnapshot(stored);
81
+ }, [storageKey]);
82
+ const snapshotRef = React.useRef(snapshot);
83
+ useIsomorphicLayoutEffect(() => {
84
+ snapshotRef.current = snapshot;
85
+ });
86
+ const [commits, setCommits] = React.useState(0);
87
+ React.useEffect(() => {
88
+ if (commits === 0) return;
89
+ writeSnapshot(storageKey, snapshotRef.current);
90
+ }, [commits, storageKey]);
91
+ const commit = React.useCallback(() => setCommits((count) => count + 1), []);
92
+ const css = React.useMemo(() => configuratorCss(snapshot.overrides), [snapshot.overrides]);
93
+ useIsomorphicLayoutEffect(() => {
94
+ applyOverrideCss(css);
95
+ }, [css]);
96
+ React.useEffect(() => () => removeOverrideStyles(), []);
97
+ const tokens = React.useMemo(() => resolvedTokens(snapshot.overrides, scope), [snapshot.overrides, scope]);
98
+ const onChangeRef = React.useRef(onChange);
99
+ useIsomorphicLayoutEffect(() => {
100
+ onChangeRef.current = onChange;
101
+ });
102
+ React.useEffect(() => {
103
+ onChangeRef.current?.(tokens);
104
+ }, [tokens]);
105
+ const edits = React.useMemo(() => ({
106
+ value: (token) => resolveValue(snapshot.overrides, scope, token),
107
+ overridden: (token) => isOverridden(snapshot.overrides, scope, token),
108
+ set: (token, value) => setSnapshot((current) => ({
109
+ ...current,
110
+ overrides: setOverride(current.overrides, scope, token, value)
111
+ })),
112
+ reset: (token) => setSnapshot((current) => ({
113
+ ...current,
114
+ overrides: clearOverride(current.overrides, scope, token)
115
+ })),
116
+ commit
117
+ }), [
118
+ commit,
119
+ scope,
120
+ snapshot.overrides
121
+ ]);
122
+ const zoom = useZoom({
123
+ zoom: snapshot.zoom,
124
+ shortcuts: zoomShortcuts,
125
+ onZoomChange: (next) => {
126
+ setSnapshot((current) => ({
127
+ ...current,
128
+ zoom: next
129
+ }));
130
+ commit();
131
+ }
132
+ });
133
+ const position = positionProp ?? snapshot.panel.position;
134
+ const { x, y, collapsed } = snapshot.panel;
135
+ const setPanel = React.useCallback((patch, persist = true) => {
136
+ setSnapshot((current) => ({
137
+ ...current,
138
+ panel: {
139
+ ...current.panel,
140
+ ...patch
141
+ }
142
+ }));
143
+ if (persist) commit();
144
+ }, [commit]);
145
+ const togglePosition = () => {
146
+ const next = position === "floating" ? "docked-right" : "floating";
147
+ onPositionChange?.(next);
148
+ if (positionProp === void 0) setPanel({ position: next });
149
+ };
150
+ const resetAll = () => {
151
+ setSnapshot((current) => ({
152
+ ...current,
153
+ overrides: EMPTY_OVERRIDES
154
+ }));
155
+ commit();
156
+ };
157
+ const panelRef = React.useRef(null);
158
+ const drag = React.useRef(null);
159
+ const handlePointerDown = (event) => {
160
+ if (position !== "floating" || event.button !== 0) return;
161
+ if (event.target.closest("button") !== null) return;
162
+ drag.current = {
163
+ pointerId: event.pointerId,
164
+ startX: event.clientX,
165
+ startY: event.clientY,
166
+ originX: x,
167
+ originY: y
168
+ };
169
+ event.currentTarget.setPointerCapture?.(event.pointerId);
170
+ };
171
+ const handlePointerMove = (event) => {
172
+ const active = drag.current;
173
+ if (active === null || active.pointerId !== event.pointerId) return;
174
+ const box = panelRef.current;
175
+ const maxX = Math.max(0, (globalThis.innerWidth ?? 0) - (box?.offsetWidth ?? 0));
176
+ const maxY = Math.max(0, (globalThis.innerHeight ?? 0) - (box?.offsetHeight ?? 0));
177
+ setPanel({
178
+ x: clamp(active.originX + (event.clientX - active.startX), 0, maxX),
179
+ y: clamp(active.originY + (event.clientY - active.startY), 0, maxY)
180
+ }, false);
181
+ };
182
+ const endDrag = (event) => {
183
+ const active = drag.current;
184
+ if (active === null || active.pointerId !== event.pointerId) return;
185
+ drag.current = null;
186
+ event.currentTarget.releasePointerCapture?.(event.pointerId);
187
+ commit();
188
+ };
189
+ const [exporting, setExporting] = React.useState(false);
190
+ const moved = overrideCount(snapshot.overrides);
191
+ const titleId = React.useId();
192
+ return /* @__PURE__ */ jsxs("div", {
193
+ ref: panelRef,
194
+ role: "region",
195
+ "aria-labelledby": titleId,
196
+ "data-slot": "theme-configurator",
197
+ "data-position": position,
198
+ "data-collapsed": collapsed ? "true" : void 0,
199
+ className: cn(overlaySurfaceClasses, "fixed z-50 flex w-[19rem] max-w-[calc(100vw-2rem)] flex-col", position === "docked-right" ? "top-0 right-0 bottom-0 h-full max-w-[90vw] rounded-none border-y-0 border-r-0" : null, className),
200
+ style: position === "floating" ? {
201
+ left: x,
202
+ top: y
203
+ } : void 0,
204
+ children: [
205
+ /* @__PURE__ */ jsxs("div", {
206
+ "data-slot": "theme-configurator-handle",
207
+ onPointerDown: handlePointerDown,
208
+ onPointerMove: handlePointerMove,
209
+ onPointerUp: endDrag,
210
+ onPointerCancel: endDrag,
211
+ className: cn("flex h-control-lg shrink-0 touch-none items-center gap-(--cue-space-2) border-b border-border px-(--cue-space-3)", position === "floating" ? "cursor-grab" : null),
212
+ children: [
213
+ /* @__PURE__ */ jsx(GripGlyph, {
214
+ "aria-hidden": "true",
215
+ className: "size-icon-sm shrink-0 text-fg-subtle"
216
+ }),
217
+ /* @__PURE__ */ jsx("span", {
218
+ id: titleId,
219
+ className: "flex-1 truncate font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-muted uppercase",
220
+ children: title
221
+ }),
222
+ moved === 0 ? null : /* @__PURE__ */ jsx(Chip, {
223
+ tone: "accent",
224
+ "data-slot": "configurator-count",
225
+ children: moved
226
+ }),
227
+ /* @__PURE__ */ jsx(IconButton, {
228
+ "aria-label": position === "floating" ? "Dock to the right" : "Float the panel",
229
+ "aria-pressed": position === "docked-right",
230
+ icon: DockGlyph,
231
+ size: "sm",
232
+ onClick: togglePosition
233
+ }),
234
+ /* @__PURE__ */ jsx(IconButton, {
235
+ "aria-label": collapsed ? "Expand panel" : "Collapse panel",
236
+ "aria-expanded": !collapsed,
237
+ icon: ChevronGlyph,
238
+ size: "sm",
239
+ className: collapsed ? "-rotate-90" : void 0,
240
+ onClick: () => setPanel({ collapsed: !collapsed })
241
+ })
242
+ ]
243
+ }),
244
+ collapsed ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
245
+ className: "flex max-h-[60vh] flex-col gap-(--cue-space-5) overflow-y-auto p-(--cue-space-4)",
246
+ children: [
247
+ /* @__PURE__ */ jsx(PresetSection, {
248
+ edits,
249
+ zoom
250
+ }),
251
+ /* @__PURE__ */ jsx(ColorsSection, { edits }),
252
+ /* @__PURE__ */ jsx(ShapeSection, { edits })
253
+ ]
254
+ }), /* @__PURE__ */ jsxs("div", {
255
+ className: "flex shrink-0 items-center justify-between gap-(--cue-space-3) border-t border-border px-(--cue-space-3) py-(--cue-space-2)",
256
+ children: [/* @__PURE__ */ jsx(Button, {
257
+ size: "sm",
258
+ variant: "outline",
259
+ onClick: () => setExporting(true),
260
+ children: "Export"
261
+ }), /* @__PURE__ */ jsx(TwoStepButton, {
262
+ size: "sm",
263
+ tone: "danger",
264
+ onConfirm: resetAll,
265
+ disabled: moved === 0,
266
+ children: "Reset all"
267
+ })]
268
+ })] }),
269
+ /* @__PURE__ */ jsx(ExportDialog, {
270
+ open: exporting,
271
+ onOpenChange: setExporting,
272
+ overrides: snapshot.overrides,
273
+ scope
274
+ })
275
+ ]
276
+ });
277
+ }
278
+ //#endregion
279
+ export { ThemeConfigurator };
@@ -0,0 +1,30 @@
1
+ import { ThemeOverrides, ThemeScope } from "./_overrides.js";
2
+ import { ExportFormatId } from "./_export.js";
3
+ import * as React from "react";
4
+ //#region src/configurator/export-dialog.d.ts
5
+ interface ExportDialogProps {
6
+ /** Whether the dialog is showing. */
7
+ open: boolean;
8
+ /** Called when it should open or close. */
9
+ onOpenChange: (open: boolean) => void;
10
+ /** The overrides to export. */
11
+ overrides: ThemeOverrides;
12
+ /** The theme and mode they were made in. */
13
+ scope: ThemeScope;
14
+ /** Format shown first. Defaults to `"css"`. */
15
+ defaultFormat?: ExportFormatId;
16
+ }
17
+ /**
18
+ * The export dialog: CSS, DTCG tokens, a `createTheme()` call and a shadcn
19
+ * `registry:theme` item.
20
+ *
21
+ * All four are generated from the overrides the panel is applying, so the CSS
22
+ * one is *literally* the stylesheet on the page. Nothing here re-derives a
23
+ * value.
24
+ *
25
+ * @example
26
+ * <ExportDialog open={open} onOpenChange={setOpen} overrides={overrides} scope={scope} />
27
+ */
28
+ declare function ExportDialog({ open, onOpenChange, overrides, scope, defaultFormat }: ExportDialogProps): React.JSX.Element;
29
+ //#endregion
30
+ export { ExportDialog, ExportDialogProps };
@@ -0,0 +1,121 @@
1
+ "use client";
2
+ import { Input } from "../forms/input.js";
3
+ import { Button } from "../primitives/button.js";
4
+ import { Tabs } from "../chrome/tabs.js";
5
+ import { Field, FieldLabel } from "../forms/field.js";
6
+ import { CopyButton } from "../instruments/copy-button.js";
7
+ import { Dialog } from "../overlays/dialog.js";
8
+ import { buildExports, exportName } from "./_export.js";
9
+ import { DownloadGlyph } from "./_glyphs.js";
10
+ import * as React from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ //#region src/configurator/export-dialog.tsx
13
+ /**
14
+ * The way out of the panel: four renderings of the same edits, each with a copy
15
+ * button and a download.
16
+ *
17
+ * The name field is at the top rather than per-format because all four exports
18
+ * carry it — a stylesheet's selector, a token file's description, the
19
+ * `createTheme()` call and the registry item's id — and typing it four times
20
+ * would be four chances to disagree. Anything that is not a CSS identifier falls
21
+ * back to `<preset>-custom` rather than being escaped, because the name lands
22
+ * inside an attribute selector.
23
+ */
24
+ /** Hand a string to the browser as a file. Silent where the API is missing. */
25
+ function downloadText(entry) {
26
+ if (typeof document === "undefined" || typeof URL.createObjectURL !== "function") return;
27
+ const url = URL.createObjectURL(new Blob([entry.text], { type: entry.mediaType }));
28
+ const link = document.createElement("a");
29
+ link.href = url;
30
+ link.download = entry.filename;
31
+ document.body.appendChild(link);
32
+ link.click();
33
+ link.remove();
34
+ URL.revokeObjectURL(url);
35
+ }
36
+ /**
37
+ * The export dialog: CSS, DTCG tokens, a `createTheme()` call and a shadcn
38
+ * `registry:theme` item.
39
+ *
40
+ * All four are generated from the overrides the panel is applying, so the CSS
41
+ * one is *literally* the stylesheet on the page. Nothing here re-derives a
42
+ * value.
43
+ *
44
+ * @example
45
+ * <ExportDialog open={open} onOpenChange={setOpen} overrides={overrides} scope={scope} />
46
+ */
47
+ function ExportDialog({ open, onOpenChange, overrides, scope, defaultFormat = "css" }) {
48
+ const [name, setName] = React.useState("");
49
+ const [format, setFormat] = React.useState(defaultFormat);
50
+ const fallback = exportName(scope);
51
+ const exports = React.useMemo(() => buildExports({
52
+ overrides,
53
+ scope,
54
+ name
55
+ }), [
56
+ name,
57
+ overrides,
58
+ scope
59
+ ]);
60
+ const active = exports.find((entry) => entry.id === format) ?? exports[0];
61
+ return /* @__PURE__ */ jsx(Dialog.Root, {
62
+ open,
63
+ onOpenChange,
64
+ children: /* @__PURE__ */ jsxs(Dialog.Content, {
65
+ width: "lg",
66
+ "data-slot": "configurator-export",
67
+ children: [
68
+ /* @__PURE__ */ jsx(Dialog.Title, { children: "Export theme" }),
69
+ /* @__PURE__ */ jsx(Dialog.Description, { children: "The same edits, four ways. The CSS block is the stylesheet this page is wearing." }),
70
+ /* @__PURE__ */ jsxs(Field, {
71
+ className: "gap-(--cue-space-1)",
72
+ children: [/* @__PURE__ */ jsx(FieldLabel, {
73
+ className: "font-mono text-(length:--cue-text-micro) tracking-[0.15em] uppercase",
74
+ children: "Theme name"
75
+ }), /* @__PURE__ */ jsx(Input, {
76
+ size: "sm",
77
+ value: name,
78
+ placeholder: fallback,
79
+ spellCheck: false,
80
+ autoComplete: "off",
81
+ onValueChange: setName
82
+ })]
83
+ }),
84
+ /* @__PURE__ */ jsxs(Tabs.Root, {
85
+ value: format,
86
+ onValueChange: (next) => setFormat(next),
87
+ children: [/* @__PURE__ */ jsx(Tabs.List, { children: exports.map((entry) => /* @__PURE__ */ jsx(Tabs.Tab, {
88
+ value: entry.id,
89
+ children: entry.label
90
+ }, entry.id)) }), exports.map((entry) => /* @__PURE__ */ jsxs(Tabs.Panel, {
91
+ value: entry.id,
92
+ className: "flex flex-col gap-(--cue-space-3) pt-(--cue-space-4)",
93
+ children: [/* @__PURE__ */ jsx("p", {
94
+ className: "font-mono text-(length:--cue-text-label) text-fg-muted",
95
+ children: entry.description
96
+ }), /* @__PURE__ */ jsx("pre", {
97
+ "data-testid": "configurator-export-text",
98
+ "data-slot": "configurator-export-text",
99
+ className: "max-h-[38vh] overflow-auto rounded-(--radius-control) border border-border bg-sunken p-(--cue-space-3) font-mono text-(length:--cue-text-label) leading-relaxed whitespace-pre text-fg",
100
+ children: entry.text
101
+ })]
102
+ }, entry.id))]
103
+ }),
104
+ /* @__PURE__ */ jsxs(Dialog.Footer, { children: [/* @__PURE__ */ jsxs(CopyButton, {
105
+ value: active.text,
106
+ size: "sm",
107
+ variant: "ghost",
108
+ children: ["Copy ", active.label]
109
+ }), /* @__PURE__ */ jsxs(Button, {
110
+ size: "sm",
111
+ variant: "outline",
112
+ icon: DownloadGlyph,
113
+ onClick: () => downloadText(active),
114
+ children: ["Download ", active.filename]
115
+ })] })
116
+ ]
117
+ })
118
+ });
119
+ }
120
+ //#endregion
121
+ export { ExportDialog };
@@ -0,0 +1,8 @@
1
+ import { BASE_TRACKING_LABEL, COLOR_TOKENS, CONFIGURATOR_VERSION, ConfiguratorPosition, ConfiguratorSnapshot, DEFAULT_CONFIGURATOR_STORAGE_KEY, EMPTY_OVERRIDES, FONT_TOKENS, MANAGED_TOKENS, OVERRIDE_BANNER, OVERRIDE_STYLE_ID, SerializeOverrideOptions, ThemeOverrides, ThemeScope, TokenKind, applyOverrideCss, baseValue, clearOverride, configuratorCss, defaultSnapshot, isOverridden, isSafeCssValue, overrideCount, readSnapshot, removeOverrideStyles, resolveValue, resolvedTokens, scopeKey, serializeOverrideCss, setOverride, tokenKind, writeSnapshot } from "./_overrides.js";
2
+ import { BuildExportsOptions, ExportFormatId, ThemeExport, buildExports, exportName } from "./_export.js";
3
+ import { ThemeConfigurator, ThemeConfiguratorProps } from "./configurator.js";
4
+ import { ExportDialog, ExportDialogProps } from "./export-dialog.js";
5
+ import { MAX_ZOOM, MIN_ZOOM, UseZoomOptions, ZOOM_STEP, ZoomValve, useZoom } from "./use-zoom.js";
6
+ import { ColorsSection, ColorsSectionProps, PresetSection, PresetSectionProps, ShapeSection, ShapeSectionProps, TokenEdits } from "./panel-sections.js";
7
+ import { COLOR_TOKEN_GROUPS, TokenEditor, TokenEditorProps, TokenGroup } from "./token-editor.js";
8
+ export { BASE_TRACKING_LABEL, type BuildExportsOptions, COLOR_TOKENS, COLOR_TOKEN_GROUPS, CONFIGURATOR_VERSION, ColorsSection, type ColorsSectionProps, type ConfiguratorPosition, type ConfiguratorSnapshot, DEFAULT_CONFIGURATOR_STORAGE_KEY, EMPTY_OVERRIDES, ExportDialog, type ExportDialogProps, type ExportFormatId, FONT_TOKENS, MANAGED_TOKENS, MAX_ZOOM, MIN_ZOOM, OVERRIDE_BANNER, OVERRIDE_STYLE_ID, PresetSection, type PresetSectionProps, type SerializeOverrideOptions, ShapeSection, type ShapeSectionProps, ThemeConfigurator, type ThemeConfiguratorProps, type ThemeExport, type ThemeOverrides, type ThemeScope, TokenEditor, type TokenEditorProps, type TokenEdits, type TokenGroup, type TokenKind, type UseZoomOptions, ZOOM_STEP, type ZoomValve, applyOverrideCss, baseValue, buildExports, clearOverride, configuratorCss, defaultSnapshot, exportName, isOverridden, isSafeCssValue, overrideCount, readSnapshot, removeOverrideStyles, resolveValue, resolvedTokens, scopeKey, serializeOverrideCss, setOverride, tokenKind, useZoom, writeSnapshot };
@@ -0,0 +1,8 @@
1
+ import { BASE_TRACKING_LABEL, COLOR_TOKENS, CONFIGURATOR_VERSION, DEFAULT_CONFIGURATOR_STORAGE_KEY, EMPTY_OVERRIDES, FONT_TOKENS, MANAGED_TOKENS, OVERRIDE_BANNER, OVERRIDE_STYLE_ID, applyOverrideCss, baseValue, clearOverride, configuratorCss, defaultSnapshot, isOverridden, isSafeCssValue, overrideCount, readSnapshot, removeOverrideStyles, resolveValue, resolvedTokens, scopeKey, serializeOverrideCss, setOverride, tokenKind, writeSnapshot } from "./_overrides.js";
2
+ import { buildExports, exportName } from "./_export.js";
3
+ import { ExportDialog } from "./export-dialog.js";
4
+ import { COLOR_TOKEN_GROUPS, TokenEditor } from "./token-editor.js";
5
+ import { ColorsSection, PresetSection, ShapeSection } from "./panel-sections.js";
6
+ import { MAX_ZOOM, MIN_ZOOM, ZOOM_STEP, useZoom } from "./use-zoom.js";
7
+ import { ThemeConfigurator } from "./configurator.js";
8
+ export { BASE_TRACKING_LABEL, COLOR_TOKENS, COLOR_TOKEN_GROUPS, CONFIGURATOR_VERSION, ColorsSection, DEFAULT_CONFIGURATOR_STORAGE_KEY, EMPTY_OVERRIDES, ExportDialog, FONT_TOKENS, MANAGED_TOKENS, MAX_ZOOM, MIN_ZOOM, OVERRIDE_BANNER, OVERRIDE_STYLE_ID, PresetSection, ShapeSection, ThemeConfigurator, TokenEditor, ZOOM_STEP, applyOverrideCss, baseValue, buildExports, clearOverride, configuratorCss, defaultSnapshot, exportName, isOverridden, isSafeCssValue, overrideCount, readSnapshot, removeOverrideStyles, resolveValue, resolvedTokens, scopeKey, serializeOverrideCss, setOverride, tokenKind, useZoom, writeSnapshot };
@@ -0,0 +1,86 @@
1
+ import { ZoomValve } from "./use-zoom.js";
2
+ import * as React from "react";
3
+ //#region src/configurator/panel-sections.d.ts
4
+ /**
5
+ * The three sections of the panel, split out from the panel itself so each one
6
+ * is a component a host app can reuse — a settings screen that only wants the
7
+ * preset picker should not have to take the floating chrome with it.
8
+ *
9
+ * All three talk to the same {@link TokenEdits} surface: read a value, say a
10
+ * value moved, say the gesture ended. That last one is the change/commit split
11
+ * the `Slider` contract asks for — a drag emits dozens of values and exactly one
12
+ * commit, and only the commit is worth a `localStorage` write.
13
+ */
14
+ /** How a section reads and writes the panel's overrides. */
15
+ interface TokenEdits {
16
+ /** The value a token has right now: the override, else the preset's. */
17
+ value: (token: string) => string;
18
+ /** Whether the token carries an override. */
19
+ overridden: (token: string) => boolean;
20
+ /** Move a token. Applies immediately; does not persist. */
21
+ set: (token: string, value: string) => void;
22
+ /** Put a token back to the preset's value. Applies immediately; does not persist. */
23
+ reset: (token: string) => void;
24
+ /** The gesture ended — persist what is on screen. */
25
+ commit: () => void;
26
+ }
27
+ interface PresetSectionProps {
28
+ /** The panel's edit surface. */
29
+ edits: TokenEdits;
30
+ /** The root zoom valve the panel owns. */
31
+ zoom: ZoomValve;
32
+ /** Extra classes for the section. */
33
+ className?: string;
34
+ }
35
+ /**
36
+ * Section 1 — the four choices that are not token edits at all.
37
+ *
38
+ * Preset, mode and density are *provider* state: picking one restamps the
39
+ * document and every portal under it, which is why they live here rather than
40
+ * in the colour list. Text scale and zoom are the two relief valves the spec
41
+ * pairs with the density ladder — one scales the type ramp inside the layout,
42
+ * the other scales the finished layout itself.
43
+ *
44
+ * @example
45
+ * <PresetSection edits={edits} zoom={zoom} />
46
+ */
47
+ declare function PresetSection({ edits, zoom, className }: PresetSectionProps): React.JSX.Element;
48
+ interface ColorsSectionProps {
49
+ /** The panel's edit surface. */
50
+ edits: TokenEdits;
51
+ /** Extra classes for the section. */
52
+ className?: string;
53
+ }
54
+ /**
55
+ * Section 2 — every colour the active theme declares, one row each.
56
+ *
57
+ * The rows are grouped by what the colour does; the editing itself lives in
58
+ * {@link TokenEditor}, which is stateless and reusable.
59
+ *
60
+ * @example
61
+ * <ColorsSection edits={edits} />
62
+ */
63
+ declare function ColorsSection({ edits, className }: ColorsSectionProps): React.JSX.Element;
64
+ interface ShapeSectionProps {
65
+ /** The panel's edit surface. */
66
+ edits: TokenEdits;
67
+ /** Extra classes for the section. */
68
+ className?: string;
69
+ }
70
+ /**
71
+ * Section 3 — the geometry and type knobs, which belong to the *density* axis
72
+ * rather than to the theme.
73
+ *
74
+ * Both multipliers are crossed with the density ladder when they are written, so
75
+ * nudging the radius keeps `ultra-compact` tighter than `large` instead of
76
+ * flattening the two. The density knob is the published `--cue-density` escape
77
+ * hatch (spec §6): the shipped control ladder is three hand-authored blocks, not
78
+ * a multiplier, so this scales bespoke app geometry — `calc(200px *
79
+ * var(--cue-density))` — and the picker above is what moves the controls.
80
+ *
81
+ * @example
82
+ * <ShapeSection edits={edits} />
83
+ */
84
+ declare function ShapeSection({ edits, className }: ShapeSectionProps): React.JSX.Element;
85
+ //#endregion
86
+ export { ColorsSection, ColorsSectionProps, PresetSection, PresetSectionProps, ShapeSection, ShapeSectionProps, TokenEdits };