@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.
- package/dist/charts/_token.js +39 -0
- package/dist/charts/container.d.ts +58 -0
- package/dist/charts/container.js +77 -0
- package/dist/charts/index.d.ts +5 -0
- package/dist/charts/index.js +5 -0
- package/dist/charts/ramps.d.ts +140 -0
- package/dist/charts/ramps.js +615 -0
- package/dist/charts/theme.d.ts +112 -0
- package/dist/charts/theme.js +165 -0
- package/dist/charts/tones.d.ts +111 -0
- package/dist/charts/tones.js +127 -0
- package/dist/chat/_glyphs.js +55 -0
- package/dist/chat/agent-color.d.ts +84 -0
- package/dist/chat/agent-color.js +101 -0
- package/dist/chat/agent-pile.d.ts +55 -0
- package/dist/chat/agent-pile.js +121 -0
- package/dist/chat/ask-box.d.ts +88 -0
- package/dist/chat/ask-box.js +341 -0
- package/dist/chat/composer.d.ts +66 -0
- package/dist/chat/composer.js +144 -0
- package/dist/chat/delegation-card.d.ts +60 -0
- package/dist/chat/delegation-card.js +129 -0
- package/dist/chat/index.d.ts +8 -0
- package/dist/chat/index.js +8 -0
- package/dist/chat/message-list.d.ts +39 -0
- package/dist/chat/message-list.js +105 -0
- package/dist/chat/message.d.ts +47 -0
- package/dist/chat/message.js +108 -0
- package/dist/chrome/_glyphs.js +101 -0
- package/dist/chrome/_tabs-scroll.d.ts +62 -0
- package/dist/chrome/_tabs-scroll.js +68 -0
- package/dist/chrome/_tree.d.ts +75 -0
- package/dist/chrome/_tree.js +49 -0
- package/dist/chrome/empty-state.d.ts +37 -0
- package/dist/chrome/empty-state.js +57 -0
- package/dist/chrome/eyebrow.d.ts +29 -0
- package/dist/chrome/eyebrow.js +36 -0
- package/dist/chrome/index.d.ts +17 -0
- package/dist/chrome/index.js +17 -0
- package/dist/chrome/navigation-menu.d.ts +80 -0
- package/dist/chrome/navigation-menu.js +121 -0
- package/dist/chrome/page-shell.d.ts +38 -0
- package/dist/chrome/page-shell.js +66 -0
- package/dist/chrome/panel.d.ts +55 -0
- package/dist/chrome/panel.js +67 -0
- package/dist/chrome/row.d.ts +82 -0
- package/dist/chrome/row.js +106 -0
- package/dist/chrome/scroll-area.d.ts +39 -0
- package/dist/chrome/scroll-area.js +70 -0
- package/dist/chrome/section-header.d.ts +42 -0
- package/dist/chrome/section-header.js +79 -0
- package/dist/chrome/segmented-control.d.ts +58 -0
- package/dist/chrome/segmented-control.js +76 -0
- package/dist/chrome/status-bar.d.ts +46 -0
- package/dist/chrome/status-bar.js +56 -0
- package/dist/chrome/tabs.d.ts +80 -0
- package/dist/chrome/tabs.js +176 -0
- package/dist/chrome/title-bar.d.ts +37 -0
- package/dist/chrome/title-bar.js +45 -0
- package/dist/chrome/toolbar.d.ts +46 -0
- package/dist/chrome/toolbar.js +62 -0
- package/dist/chrome/tree.d.ts +98 -0
- package/dist/chrome/tree.js +248 -0
- package/dist/color/_checker.js +14 -0
- package/dist/color/_convert.d.ts +52 -0
- package/dist/color/_convert.js +66 -0
- package/dist/color/_glyphs.js +28 -0
- package/dist/color/_thumb.js +15 -0
- package/dist/color/_value.js +28 -0
- package/dist/color/color-area.d.ts +27 -0
- package/dist/color/color-area.js +40 -0
- package/dist/color/color-field.d.ts +32 -0
- package/dist/color/color-field.js +43 -0
- package/dist/color/color-picker.d.ts +71 -0
- package/dist/color/color-picker.js +178 -0
- package/dist/color/color-slider.d.ts +31 -0
- package/dist/color/color-slider.js +51 -0
- package/dist/color/color-swatch.d.ts +32 -0
- package/dist/color/color-swatch.js +44 -0
- package/dist/color/index.d.ts +7 -0
- package/dist/color/index.js +7 -0
- package/dist/configurator/_export.d.ts +78 -0
- package/dist/configurator/_export.js +261 -0
- package/dist/configurator/_glyphs.js +92 -0
- package/dist/configurator/_overrides.d.ts +247 -0
- package/dist/configurator/_overrides.js +514 -0
- package/dist/configurator/configurator.d.ts +71 -0
- package/dist/configurator/configurator.js +279 -0
- package/dist/configurator/export-dialog.d.ts +30 -0
- package/dist/configurator/export-dialog.js +121 -0
- package/dist/configurator/index.d.ts +8 -0
- package/dist/configurator/index.js +8 -0
- package/dist/configurator/panel-sections.d.ts +86 -0
- package/dist/configurator/panel-sections.js +316 -0
- package/dist/configurator/token-editor.d.ts +74 -0
- package/dist/configurator/token-editor.js +149 -0
- package/dist/configurator/use-zoom.d.ts +87 -0
- package/dist/configurator/use-zoom.js +113 -0
- package/dist/date/_glyphs.js +34 -0
- package/dist/date/_segments.js +55 -0
- package/dist/date/_trigger.js +31 -0
- package/dist/date/calendar.d.ts +25 -0
- package/dist/date/calendar.js +125 -0
- package/dist/date/date-field.d.ts +34 -0
- package/dist/date/date-field.js +41 -0
- package/dist/date/date-picker.d.ts +69 -0
- package/dist/date/date-picker.js +89 -0
- package/dist/date/date-range-picker.d.ts +65 -0
- package/dist/date/date-range-picker.js +92 -0
- package/dist/date/index.d.ts +6 -0
- package/dist/date/index.js +6 -0
- package/dist/date/time-field.d.ts +29 -0
- package/dist/date/time-field.js +36 -0
- package/dist/dmx/_ramp.d.ts +77 -0
- package/dist/dmx/_ramp.js +169 -0
- package/dist/dmx/_readout.js +53 -0
- package/dist/dmx/_universe.d.ts +105 -0
- package/dist/dmx/_universe.js +112 -0
- package/dist/dmx/channel-matrix.d.ts +81 -0
- package/dist/dmx/channel-matrix.js +285 -0
- package/dist/dmx/dmx-bar.d.ts +50 -0
- package/dist/dmx/dmx-bar.js +107 -0
- package/dist/dmx/dmx-strip.d.ts +41 -0
- package/dist/dmx/dmx-strip.js +196 -0
- package/dist/dmx/index.d.ts +7 -0
- package/dist/dmx/index.js +7 -0
- package/dist/dmx/universe-grid.d.ts +61 -0
- package/dist/dmx/universe-grid.js +182 -0
- package/dist/flow/_frame.d.ts +52 -0
- package/dist/flow/_frame.js +38 -0
- package/dist/flow/controls.d.ts +41 -0
- package/dist/flow/controls.js +53 -0
- package/dist/flow/flow.css +121 -0
- package/dist/flow/handles.d.ts +40 -0
- package/dist/flow/handles.js +61 -0
- package/dist/flow/index.d.ts +7 -0
- package/dist/flow/index.js +7 -0
- package/dist/flow/node-card.d.ts +71 -0
- package/dist/flow/node-card.js +102 -0
- package/dist/flow/signal-edge.d.ts +60 -0
- package/dist/flow/signal-edge.js +108 -0
- package/dist/flow/use-flow-theme.d.ts +69 -0
- package/dist/flow/use-flow-theme.js +109 -0
- package/dist/forms/_chassis.d.ts +64 -0
- package/dist/forms/_chassis.js +59 -0
- package/dist/forms/_glyphs.js +143 -0
- package/dist/forms/_listbox.js +55 -0
- package/dist/forms/autocomplete.d.ts +61 -0
- package/dist/forms/autocomplete.js +88 -0
- package/dist/forms/button-group.d.ts +47 -0
- package/dist/forms/button-group.js +52 -0
- package/dist/forms/checkbox.d.ts +51 -0
- package/dist/forms/checkbox.js +98 -0
- package/dist/forms/combobox.d.ts +73 -0
- package/dist/forms/combobox.js +108 -0
- package/dist/forms/env-var-input.d.ts +74 -0
- package/dist/forms/env-var-input.js +116 -0
- package/dist/forms/field.d.ts +89 -0
- package/dist/forms/field.js +102 -0
- package/dist/forms/file-upload.d.ts +113 -0
- package/dist/forms/file-upload.js +232 -0
- package/dist/forms/index.d.ts +26 -0
- package/dist/forms/index.js +26 -0
- package/dist/forms/input-group.d.ts +31 -0
- package/dist/forms/input-group.js +54 -0
- package/dist/forms/input.d.ts +33 -0
- package/dist/forms/input.js +36 -0
- package/dist/forms/multi-select.d.ts +62 -0
- package/dist/forms/multi-select.js +107 -0
- package/dist/forms/number-field.d.ts +38 -0
- package/dist/forms/number-field.js +64 -0
- package/dist/forms/otp-field.d.ts +54 -0
- package/dist/forms/otp-field.js +59 -0
- package/dist/forms/password-input.d.ts +46 -0
- package/dist/forms/password-input.js +62 -0
- package/dist/forms/radio-group.d.ts +50 -0
- package/dist/forms/radio-group.js +64 -0
- package/dist/forms/rating.d.ts +69 -0
- package/dist/forms/rating.js +103 -0
- package/dist/forms/scrub-input.d.ts +81 -0
- package/dist/forms/scrub-input.js +249 -0
- package/dist/forms/search-input.d.ts +54 -0
- package/dist/forms/search-input.js +112 -0
- package/dist/forms/select.d.ts +75 -0
- package/dist/forms/select.js +91 -0
- package/dist/forms/slider.d.ts +44 -0
- package/dist/forms/slider.js +65 -0
- package/dist/forms/switch.d.ts +36 -0
- package/dist/forms/switch.js +71 -0
- package/dist/forms/tags-input.d.ts +69 -0
- package/dist/forms/tags-input.js +148 -0
- package/dist/forms/textarea.d.ts +27 -0
- package/dist/forms/textarea.js +37 -0
- package/dist/forms/toggle-group.d.ts +41 -0
- package/dist/forms/toggle-group.js +56 -0
- package/dist/forms/toggle.d.ts +41 -0
- package/dist/forms/toggle.js +100 -0
- package/dist/index.d.ts +112 -0
- package/dist/index.js +104 -0
- package/dist/instruments/_ansi.js +116 -0
- package/dist/instruments/_glyphs.js +90 -0
- package/dist/instruments/_motion.js +56 -0
- package/dist/instruments/_rem.js +21 -0
- package/dist/instruments/app-window-frame.d.ts +48 -0
- package/dist/instruments/app-window-frame.js +76 -0
- package/dist/instruments/copy-button.d.ts +41 -0
- package/dist/instruments/copy-button.js +112 -0
- package/dist/instruments/data-table.d.ts +168 -0
- package/dist/instruments/data-table.js +212 -0
- package/dist/instruments/group-bar.d.ts +63 -0
- package/dist/instruments/group-bar.js +122 -0
- package/dist/instruments/index.d.ts +13 -0
- package/dist/instruments/index.js +13 -0
- package/dist/instruments/log-viewer.d.ts +74 -0
- package/dist/instruments/log-viewer.js +215 -0
- package/dist/instruments/meter.d.ts +77 -0
- package/dist/instruments/meter.js +96 -0
- package/dist/instruments/progress.d.ts +45 -0
- package/dist/instruments/progress.js +61 -0
- package/dist/instruments/seam-grid.d.ts +66 -0
- package/dist/instruments/seam-grid.js +78 -0
- package/dist/instruments/sparkline.d.ts +39 -0
- package/dist/instruments/sparkline.js +85 -0
- package/dist/instruments/stat.d.ts +35 -0
- package/dist/instruments/stat.js +59 -0
- package/dist/instruments/table.d.ts +51 -0
- package/dist/instruments/table.js +92 -0
- package/dist/instruments/terminal-frame.d.ts +89 -0
- package/dist/instruments/terminal-frame.js +256 -0
- package/dist/instruments/two-step-button.d.ts +47 -0
- package/dist/instruments/two-step-button.js +147 -0
- package/dist/instruments/usage-chart.d.ts +55 -0
- package/dist/instruments/usage-chart.js +235 -0
- package/dist/layout/_collapse.js +46 -0
- package/dist/layout/_glyphs.js +45 -0
- package/dist/layout/accordion.d.ts +52 -0
- package/dist/layout/accordion.js +81 -0
- package/dist/layout/breadcrumb.d.ts +35 -0
- package/dist/layout/breadcrumb.js +67 -0
- package/dist/layout/card.d.ts +51 -0
- package/dist/layout/card.js +76 -0
- package/dist/layout/carousel.d.ts +96 -0
- package/dist/layout/carousel.js +211 -0
- package/dist/layout/collapsible.d.ts +74 -0
- package/dist/layout/collapsible.js +126 -0
- package/dist/layout/container.d.ts +27 -0
- package/dist/layout/container.js +40 -0
- package/dist/layout/description-list.d.ts +24 -0
- package/dist/layout/description-list.js +37 -0
- package/dist/layout/grid.d.ts +40 -0
- package/dist/layout/grid.js +48 -0
- package/dist/layout/index.d.ts +15 -0
- package/dist/layout/index.js +15 -0
- package/dist/layout/item.d.ts +65 -0
- package/dist/layout/item.js +100 -0
- package/dist/layout/link.d.ts +48 -0
- package/dist/layout/link.js +63 -0
- package/dist/layout/pagination.d.ts +54 -0
- package/dist/layout/pagination.js +121 -0
- package/dist/layout/resizable.d.ts +38 -0
- package/dist/layout/resizable.js +68 -0
- package/dist/layout/sidebar.d.ts +67 -0
- package/dist/layout/sidebar.js +129 -0
- package/dist/layout/stack.d.ts +46 -0
- package/dist/layout/stack.js +62 -0
- package/dist/layout/stepper.d.ts +49 -0
- package/dist/layout/stepper.js +81 -0
- package/dist/layout/timeline.d.ts +43 -0
- package/dist/layout/timeline.js +63 -0
- package/dist/lib/aria-class.js +24 -0
- package/dist/lib/cn.js +18 -0
- package/dist/lib/compose.js +38 -0
- package/dist/lib/cva.d.ts +18 -0
- package/dist/lib/cva.js +65 -0
- package/dist/midi/_notes.d.ts +101 -0
- package/dist/midi/_notes.js +183 -0
- package/dist/midi/_ruler.d.ts +100 -0
- package/dist/midi/_ruler.js +105 -0
- package/dist/midi/_time.d.ts +107 -0
- package/dist/midi/_time.js +130 -0
- package/dist/midi/index.d.ts +9 -0
- package/dist/midi/index.js +9 -0
- package/dist/midi/musical-time-input.d.ts +48 -0
- package/dist/midi/musical-time-input.js +154 -0
- package/dist/midi/piano-keyboard.d.ts +50 -0
- package/dist/midi/piano-keyboard.js +193 -0
- package/dist/midi/spectrum-visualizer.d.ts +65 -0
- package/dist/midi/spectrum-visualizer.js +213 -0
- package/dist/midi/threshold-rail.d.ts +72 -0
- package/dist/midi/threshold-rail.js +214 -0
- package/dist/midi/timeline-ruler.d.ts +83 -0
- package/dist/midi/timeline-ruler.js +152 -0
- package/dist/overlays/_debounce.js +34 -0
- package/dist/overlays/_glyphs.js +59 -0
- package/dist/overlays/_surface.d.ts +70 -0
- package/dist/overlays/_surface.js +70 -0
- package/dist/overlays/_wheel.js +42 -0
- package/dist/overlays/alert-dialog.d.ts +67 -0
- package/dist/overlays/alert-dialog.js +117 -0
- package/dist/overlays/command-palette.d.ts +93 -0
- package/dist/overlays/command-palette.js +193 -0
- package/dist/overlays/context-menu.d.ts +64 -0
- package/dist/overlays/context-menu.js +78 -0
- package/dist/overlays/dialog.d.ts +72 -0
- package/dist/overlays/dialog.js +124 -0
- package/dist/overlays/drawer.d.ts +75 -0
- package/dist/overlays/drawer.js +151 -0
- package/dist/overlays/dropdown-menu.d.ts +79 -0
- package/dist/overlays/dropdown-menu.js +156 -0
- package/dist/overlays/hover-card.d.ts +58 -0
- package/dist/overlays/hover-card.js +91 -0
- package/dist/overlays/index.d.ts +15 -0
- package/dist/overlays/index.js +15 -0
- package/dist/overlays/info-tip.d.ts +41 -0
- package/dist/overlays/info-tip.js +45 -0
- package/dist/overlays/menubar.d.ts +72 -0
- package/dist/overlays/menubar.js +100 -0
- package/dist/overlays/popover.d.ts +66 -0
- package/dist/overlays/popover.js +114 -0
- package/dist/overlays/sheet.d.ts +78 -0
- package/dist/overlays/sheet.js +131 -0
- package/dist/overlays/toast.d.ts +106 -0
- package/dist/overlays/toast.js +146 -0
- package/dist/overlays/tooltip.d.ts +57 -0
- package/dist/overlays/tooltip.js +95 -0
- package/dist/primitives/avatar.d.ts +51 -0
- package/dist/primitives/avatar.js +93 -0
- package/dist/primitives/button.d.ts +46 -0
- package/dist/primitives/button.js +94 -0
- package/dist/primitives/chip.d.ts +47 -0
- package/dist/primitives/chip.js +152 -0
- package/dist/primitives/icon-button.d.ts +41 -0
- package/dist/primitives/icon-button.js +59 -0
- package/dist/primitives/index.d.ts +10 -0
- package/dist/primitives/index.js +10 -0
- package/dist/primitives/kbd.d.ts +17 -0
- package/dist/primitives/kbd.js +24 -0
- package/dist/primitives/separator.d.ts +25 -0
- package/dist/primitives/separator.js +30 -0
- package/dist/primitives/skeleton.d.ts +20 -0
- package/dist/primitives/skeleton.js +27 -0
- package/dist/primitives/spinner.d.ts +26 -0
- package/dist/primitives/spinner.js +31 -0
- package/dist/primitives/status-dot.d.ts +44 -0
- package/dist/primitives/status-dot.js +50 -0
- package/dist/styles.css +19 -0
- package/dist/system/density.d.ts +33 -0
- package/dist/system/density.js +49 -0
- package/dist/system/index.d.ts +8 -0
- package/dist/system/index.js +7 -0
- package/dist/system/portal.d.ts +51 -0
- package/dist/system/portal.js +122 -0
- package/dist/system/prepaint.d.ts +38 -0
- package/dist/system/prepaint.js +37 -0
- package/dist/system/theme-provider.d.ts +72 -0
- package/dist/system/theme-provider.js +252 -0
- package/dist/system/use-density.d.ts +33 -0
- package/dist/system/use-density.js +84 -0
- package/dist/system/use-isomorphic-layout-effect.js +15 -0
- package/dist/system/use-theme.d.ts +19 -0
- package/dist/system/use-theme.js +25 -0
- package/dist/theming/_presets.d.ts +11 -0
- package/dist/theming/_presets.js +487 -0
- package/dist/theming/contrast.d.ts +110 -0
- package/dist/theming/contrast.js +167 -0
- package/dist/theming/create-theme.d.ts +165 -0
- package/dist/theming/create-theme.js +442 -0
- package/dist/theming/index.d.ts +5 -0
- package/dist/theming/index.js +5 -0
- package/dist/theming/serialize.d.ts +145 -0
- package/dist/theming/serialize.js +165 -0
- 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 };
|