@motion-proto/live-tokens 0.6.2 → 0.8.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/README.md +14 -13
- package/dist-plugin/index.cjs +854 -226
- package/dist-plugin/index.d.cts +2 -1
- package/dist-plugin/index.d.ts +2 -1
- package/dist-plugin/index.js +852 -225
- package/package.json +26 -40
- package/src/{styles → app}/site.css +1 -1
- package/src/{component-editor → editor/component-editor}/BadgeEditor.svelte +8 -82
- package/src/{component-editor → editor/component-editor}/CalloutEditor.svelte +4 -4
- package/src/{component-editor → editor/component-editor}/CardEditor.svelte +28 -76
- package/src/{component-editor → editor/component-editor}/CollapsibleSectionEditor.svelte +37 -30
- package/src/{component-editor → editor/component-editor}/CornerBadgeEditor.svelte +31 -93
- package/src/{component-editor → editor/component-editor}/DialogEditor.svelte +60 -57
- package/src/editor/component-editor/ImageEditor.svelte +30 -0
- package/src/{component-editor → editor/component-editor}/InlineEditActionsEditor.svelte +6 -4
- package/src/editor/component-editor/MenuSelectEditor.svelte +160 -0
- package/src/{component-editor → editor/component-editor}/NotificationEditor.svelte +67 -38
- package/src/{component-editor → editor/component-editor}/ProgressBarEditor.svelte +5 -4
- package/src/{component-editor → editor/component-editor}/RadioButtonEditor.svelte +3 -3
- package/src/editor/component-editor/SectionDividerEditor.svelte +565 -0
- package/src/{component-editor → editor/component-editor}/SegmentedControlEditor.svelte +2 -2
- package/src/{component-editor → editor/component-editor}/StandardButtonsEditor.svelte +29 -21
- package/src/{component-editor → editor/component-editor}/TabBarEditor.svelte +9 -14
- package/src/{component-editor → editor/component-editor}/TableEditor.svelte +9 -18
- package/src/{component-editor → editor/component-editor}/TooltipEditor.svelte +11 -47
- package/src/editor/component-editor/editors.d.ts +10 -0
- package/src/{component-editor → editor/component-editor}/registry.ts +28 -18
- package/src/{component-editor → editor/component-editor}/scaffolding/AngleDial.svelte +54 -15
- package/src/{component-editor → editor/component-editor}/scaffolding/ComponentEditorBase.svelte +3 -51
- package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileManager.svelte +151 -424
- package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileMenu.svelte +18 -170
- package/src/{component-editor → editor/component-editor}/scaffolding/ComponentsTab.svelte +2 -2
- package/src/{component-editor → editor/component-editor}/scaffolding/CopyFromMenu.svelte +44 -4
- package/src/{component-editor → editor/component-editor}/scaffolding/FieldsetWrapper.svelte +1 -1
- package/src/{component-editor → editor/component-editor}/scaffolding/LinkageChart.svelte +6 -6
- package/src/{component-editor → editor/component-editor}/scaffolding/LinkedBlock.svelte +6 -12
- package/src/editor/component-editor/scaffolding/NonStylableConfig.svelte +38 -0
- package/src/editor/component-editor/scaffolding/RadialShapePad.svelte +483 -0
- package/src/{component-editor → editor/component-editor}/scaffolding/SaveAsDialog.svelte +66 -12
- package/src/editor/component-editor/scaffolding/ShadowBackdrop.svelte +85 -0
- package/src/editor/component-editor/scaffolding/ShadowBackdropControls.svelte +132 -0
- package/src/editor/component-editor/scaffolding/StateBlock.svelte +345 -0
- package/src/{component-editor → editor/component-editor}/scaffolding/TokenLayout.svelte +17 -12
- package/src/{component-editor → editor/component-editor}/scaffolding/TypeEditor.svelte +13 -1
- package/src/editor/component-editor/scaffolding/VariantGroup.svelte +858 -0
- package/src/{component-editor → editor/component-editor}/scaffolding/buildTypeGroupTokens.ts +1 -0
- package/src/{component-editor → editor/component-editor}/scaffolding/editorContext.ts +19 -9
- package/src/{component-editor → editor/component-editor}/scaffolding/linkedBlock.ts +2 -2
- package/src/{component-editor → editor/component-editor}/scaffolding/types.ts +25 -0
- package/src/{lib → editor/core/components}/componentConfigKeys.ts +8 -0
- package/src/{lib → editor/core/components}/componentConfigService.ts +3 -3
- package/src/{lib → editor/core/components}/componentPersist.ts +11 -9
- package/src/editor/core/flashStatus.ts +30 -0
- package/src/{lib → editor/core/fonts}/fontLoader.ts +2 -2
- package/src/{lib → editor/core/fonts}/fontMigration.ts +4 -4
- package/src/{lib → editor/core/fonts}/fontParse.ts +1 -1
- package/src/editor/core/manifests/manifestService.ts +171 -0
- package/src/editor/core/palettes/familySwap.ts +99 -0
- package/src/{lib → editor/core/palettes}/paletteDerivation.ts +71 -2
- package/src/{lib → editor/core/palettes}/tokenRegistry.ts +9 -6
- package/src/editor/core/productionPulse.ts +37 -0
- package/src/{lib → editor/core/routing}/router.ts +1 -1
- package/src/{lib/files/versionedFileResource.ts → editor/core/storage/files/versionedFileResourceClient.ts} +8 -1
- package/src/{lib → editor/core/store}/editorCore.ts +24 -8
- package/src/{lib → editor/core/store}/editorPersistence.ts +3 -3
- package/src/{lib → editor/core/store}/editorRenderer.ts +2 -2
- package/src/{lib → editor/core/store}/editorStore.ts +222 -28
- package/src/{lib → editor/core/store}/editorTypes.ts +56 -13
- package/src/editor/core/store/gradientSource.ts +192 -0
- package/src/editor/core/themes/migrations/2026-05-19-collapsiblesection-drop-frame-surface.ts +28 -0
- package/src/editor/core/themes/migrations/2026-05-19-sectiondivider-rich-gradient.ts +35 -0
- package/src/editor/core/themes/migrations/2026-05-20-sectiondivider-slim-variants.ts +82 -0
- package/src/editor/core/themes/migrations/2026-05-21-sectiondivider-spacing-to-padding.ts +24 -0
- package/src/editor/core/themes/migrations/2026-05-22-sectiondivider-intrinsics-to-css.ts +81 -0
- package/src/{lib → editor/core/themes}/migrations/index.ts +10 -0
- package/src/{lib → editor/core/themes}/slices/columns.ts +2 -2
- package/src/{lib → editor/core/themes}/slices/components.ts +20 -6
- package/src/{lib → editor/core/themes}/slices/fonts.ts +1 -1
- package/src/{lib → editor/core/themes}/slices/gradients.ts +89 -14
- package/src/{lib → editor/core/themes}/slices/overlays.ts +1 -1
- package/src/{lib → editor/core/themes}/slices/palettes.ts +1 -1
- package/src/{lib → editor/core/themes}/slices/shadows.ts +3 -3
- package/src/{lib → editor/core/themes}/themeInit.ts +8 -8
- package/src/{lib → editor/core/themes}/themeService.ts +6 -6
- package/src/{lib → editor/core/themes}/themeTypes.ts +67 -8
- package/src/editor/index.ts +69 -0
- package/src/{lib → editor/overlay}/ColumnsOverlay.svelte +0 -1
- package/src/{lib → editor/overlay}/LiveEditorOverlay.svelte +80 -129
- package/src/{lib → editor/overlay}/columnsOverlay.ts +2 -2
- package/src/{pages → editor/pages}/ComponentEditorPage.svelte +12 -12
- package/src/{pages → editor/pages}/Editor.svelte +4 -4
- package/src/{pages → editor/pages}/EditorShell.svelte +18 -36
- package/src/{styles → editor/styles}/ui-editor.css +43 -22
- package/src/{styles → editor/styles}/ui-form-controls.css +23 -24
- package/src/{ui → editor/ui}/BezierCurveEditor.svelte +119 -68
- package/src/{ui → editor/ui}/ColorEditPanel.svelte +13 -13
- package/src/{ui → editor/ui}/EditorViewSwitcher.svelte +7 -6
- package/src/editor/ui/FileLoadList.svelte +367 -0
- package/src/editor/ui/FilePill.svelte +80 -0
- package/src/editor/ui/FontStackEditor.svelte +499 -0
- package/src/editor/ui/GradientEditor.svelte +690 -0
- package/src/{ui → editor/ui}/GradientStopPicker.svelte +12 -4
- package/src/editor/ui/ManifestFileManager.svelte +438 -0
- package/src/{ui → editor/ui}/PaletteEditor.svelte +180 -673
- package/src/editor/ui/ProjectFontsSection.svelte +638 -0
- package/src/{ui → editor/ui}/SurfacesTab.svelte +3 -3
- package/src/{ui → editor/ui}/TextTab.svelte +3 -3
- package/src/editor/ui/ThemeFileManager.svelte +783 -0
- package/src/{ui → editor/ui}/UICopyPopover.svelte +4 -4
- package/src/{ui → editor/ui}/UIFontFamilySelector.svelte +6 -7
- package/src/{ui → editor/ui}/UIFontSizeSelector.svelte +4 -1
- package/src/editor/ui/UIInfoPopover.svelte +243 -0
- package/src/editor/ui/UILetterSpacingSelector.svelte +65 -0
- package/src/{ui → editor/ui}/UILineHeightSelector.svelte +5 -5
- package/src/{ui → editor/ui}/UILinkToggle.svelte +2 -2
- package/src/{ui → editor/ui}/UIPaddingSelector.svelte +6 -6
- package/src/{ui → editor/ui}/UIPaletteSelector.svelte +57 -30
- package/src/editor/ui/UIPillButton.svelte +168 -0
- package/src/{ui → editor/ui}/UIRadio.svelte +2 -2
- package/src/{ui → editor/ui}/UIRelinkConfirmPopover.svelte +4 -4
- package/src/editor/ui/UISegmentedControl.svelte +114 -0
- package/src/editor/ui/UISquareButton.svelte +172 -0
- package/src/{ui → editor/ui}/UITokenSelector.svelte +14 -11
- package/src/{ui → editor/ui}/UIVariantSelector.svelte +1 -1
- package/src/{ui → editor/ui}/VariablesTab.svelte +46 -17
- package/src/{ui → editor/ui}/palette/GradientStopEditor.svelte +13 -13
- package/src/{ui → editor/ui}/palette/OverridesPanel.svelte +24 -47
- package/src/{ui → editor/ui}/palette/PaletteBase.svelte +11 -8
- package/src/{ui → editor/ui}/palette/paletteEditorState.ts +1 -1
- package/src/editor/ui/palette/paletteMath.ts +275 -0
- package/src/{ui → editor/ui}/sections/ColumnsSection.svelte +137 -18
- package/src/{ui → editor/ui}/sections/GradientsSection.svelte +8 -8
- package/src/{ui → editor/ui}/sections/OverlaysSection.svelte +18 -18
- package/src/{ui → editor/ui}/sections/ShadowsSection.svelte +23 -23
- package/src/{ui → editor/ui}/sections/TokenScaleTable.svelte +3 -3
- package/src/{components → system/components}/Badge.svelte +0 -36
- package/src/{components → system/components}/Button.svelte +2 -2
- package/src/{components → system/components}/Card.svelte +34 -60
- package/src/{components → system/components}/CollapsibleSection.svelte +25 -2
- package/src/{components → system/components}/CornerBadge.svelte +8 -24
- package/src/{components → system/components}/Dialog.svelte +1 -1
- package/src/system/components/FloatingTokenTags.css +275 -0
- package/src/system/components/FloatingTokenTags.svelte +543 -0
- package/src/{components → system/components}/InlineEditActions.svelte +6 -4
- package/src/system/components/MenuSelect.svelte +229 -0
- package/src/{components → system/components}/Notification.svelte +8 -1
- package/src/{components → system/components}/ProgressBar.svelte +29 -11
- package/src/system/components/SectionDivider.svelte +560 -0
- package/src/{components → system/components}/SegmentedControl.svelte +49 -43
- package/src/{components → system/components}/TabBar.svelte +81 -65
- package/src/{components → system/components}/Table.svelte +17 -3
- package/src/{components → system/components}/Tooltip.svelte +6 -4
- package/src/system/styles/CONVENTIONS.md +178 -0
- package/src/system/styles/fonts.css +20 -0
- package/src/system/styles/tokens.css +601 -0
- package/src/system/styles/tokens.generated.css +544 -0
- package/src/component-editor/ImageEditor.svelte +0 -74
- package/src/component-editor/SectionDividerEditor.svelte +0 -265
- package/src/component-editor/scaffolding/DividerEditor.svelte +0 -94
- package/src/component-editor/scaffolding/GradientCard.svelte +0 -296
- package/src/component-editor/scaffolding/NonStylableConfig.svelte +0 -62
- package/src/component-editor/scaffolding/ShadowBackdrop.svelte +0 -37
- package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +0 -61
- package/src/component-editor/scaffolding/StateBlock.svelte +0 -132
- package/src/component-editor/scaffolding/VariantGroup.svelte +0 -310
- package/src/components/SectionDivider.svelte +0 -483
- package/src/data/google-fonts.json +0 -75
- package/src/lib/index.ts +0 -68
- package/src/lib/presetService.ts +0 -214
- package/src/lib/productionPulse.ts +0 -32
- package/src/styles/fonts.css +0 -30
- package/src/styles/tokens.css +0 -1324
- package/src/ui/FontStackEditor.svelte +0 -361
- package/src/ui/GradientEditor.svelte +0 -470
- package/src/ui/PresetFileManager.svelte +0 -1116
- package/src/ui/ProjectFontsSection.svelte +0 -645
- package/src/ui/ThemeFileManager.svelte +0 -1020
- package/src/ui/UnsavedComponentsDialog.svelte +0 -315
- /package/src/{component-editor → editor/component-editor}/index.ts +0 -0
- /package/src/{component-editor → editor/component-editor}/scaffolding/DemoHeader.svelte +0 -0
- /package/src/{component-editor → editor/component-editor}/scaffolding/componentSectionType.ts +0 -0
- /package/src/{component-editor → editor/component-editor}/scaffolding/componentSources.ts +0 -0
- /package/src/{component-editor → editor/component-editor}/scaffolding/defaultSections.ts +0 -0
- /package/src/{component-editor → editor/component-editor}/scaffolding/siblings.ts +0 -0
- /package/src/{lib → editor/core}/cssVarSync.ts +0 -0
- /package/src/{lib → editor/core/palettes}/oklch.ts +0 -0
- /package/src/{lib → editor/core/routing}/navLinkTypes.ts +0 -0
- /package/src/{lib → editor/core/routing}/parentRouteStore.ts +0 -0
- /package/src/{lib → editor/core/storage}/storage.ts +0 -0
- /package/src/{lib → editor/core/store}/editorConfig.ts +0 -0
- /package/src/{lib → editor/core/store}/editorConfigStore.ts +0 -0
- /package/src/{lib → editor/core/store}/editorKeybindings.ts +0 -0
- /package/src/{lib → editor/core/store}/editorViewStore.ts +0 -0
- /package/src/{lib → editor/core/themes}/migrations/2026-04-24-component-prefix-and-suffix-renames.ts +0 -0
- /package/src/{lib → editor/core/themes}/migrations/2026-04-24-legacy-keys-and-bg-to-canvas.ts +0 -0
- /package/src/{lib → editor/core/themes}/migrations/2026-04-27-segmentedcontrol-disabled-flatten.ts +0 -0
- /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-frame-and-cleanup.ts +0 -0
- /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-variant-namespace.ts +0 -0
- /package/src/{lib → editor/core/themes}/migrations/2026-05-10-sectiondivider-gradient-stops.ts +0 -0
- /package/src/{lib → editor/core/themes}/migrations/2026-05-13-primary-to-brand.ts +0 -0
- /package/src/{lib → editor/core/themes}/parsers/globalRootBlock.ts +0 -0
- /package/src/{lib → editor/core/themes}/slices/domainVars.ts +0 -0
- /package/src/{lib → editor/overlay}/overlayState.ts +0 -0
- /package/src/{pages → editor/pages}/ComponentEditorPage.svelte.d.ts +0 -0
- /package/src/{pages → editor/pages}/Editor.svelte.d.ts +0 -0
- /package/src/{ui → editor/ui}/Toggle.svelte +0 -0
- /package/src/{ui → editor/ui}/UIDialog.svelte +0 -0
- /package/src/{ui → editor/ui}/UIFontWeightSelector.svelte +0 -0
- /package/src/{ui → editor/ui}/UIOptionItem.svelte +0 -0
- /package/src/{ui → editor/ui}/UIOptionList.svelte +0 -0
- /package/src/{ui → editor/ui}/UIRadioGroup.svelte +0 -0
- /package/src/{lib → editor/ui}/copyPopover.ts +0 -0
- /package/src/{ui → editor/ui}/curveEngine.ts +0 -0
- /package/src/{ui → editor/ui}/index.ts +0 -0
- /package/src/{ui → editor/ui}/keepInViewport.ts +0 -0
- /package/src/{ui → editor/ui}/palette/ScaleCurveEditor.svelte +0 -0
- /package/src/{lib → editor/ui}/scrollSection.ts +0 -0
- /package/src/{ui → editor/ui}/sections/tokenScales.ts +0 -0
- /package/src/{ui → editor/ui}/variantScales.ts +0 -0
- /package/src/{assets → system/assets}/newspaper.webp +0 -0
- /package/src/{assets → system/assets}/offering.webp +0 -0
- /package/src/{components → system/components}/Callout.svelte +0 -0
- /package/src/{components → system/components}/Image.svelte +0 -0
- /package/src/{components → system/components}/RadioButton.svelte +0 -0
- /package/src/{components → system/components}/types.ts +0 -0
- /package/src/{styles → system/styles}/_padding.scss +0 -0
- /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin-ext.woff2 +0 -0
- /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin.woff2 +0 -0
- /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin-ext.woff2 +0 -0
- /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin.woff2 +0 -0
- /package/src/{styles → system/styles}/fonts/Manrope/Manrope-latin-ext.woff2 +0 -0
- /package/src/{styles → system/styles}/fonts/Manrope/Manrope-latin.woff2 +0 -0
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
|
-
// __PROJECT_ROOT__
|
|
3
|
-
// Consumers don't need to configure it themselves. We declare it locally so
|
|
4
|
-
// this component's type-check passes in consumer projects that haven't added
|
|
5
|
-
// the ambient global to their tsconfig.
|
|
2
|
+
// __PROJECT_ROOT__ / __APP_VERSION__ are Vite-injected defines.
|
|
6
3
|
declare const __PROJECT_ROOT__: string | undefined;
|
|
7
4
|
declare const __APP_VERSION__: string | undefined;
|
|
8
5
|
const INJECTED_PROJECT_ROOT: string =
|
|
@@ -17,13 +14,14 @@
|
|
|
17
14
|
import { onMount, onDestroy } from 'svelte';
|
|
18
15
|
import { fade } from 'svelte/transition';
|
|
19
16
|
import { cubicInOut } from 'svelte/easing';
|
|
20
|
-
import { route, navigate } from '
|
|
17
|
+
import { route, navigate } from '../core/routing/router';
|
|
21
18
|
import { columnsVisible, toggleColumns } from './columnsOverlay';
|
|
22
|
-
import { storageKey } from '
|
|
19
|
+
import { storageKey } from '../core/store/editorConfig';
|
|
23
20
|
import { overlayOpen } from './overlayState';
|
|
24
|
-
import { quietGet, quietSet } from '
|
|
25
|
-
import { postParentRoute } from '
|
|
26
|
-
import
|
|
21
|
+
import { quietGet, quietSet } from '../core/storage/storage';
|
|
22
|
+
import { postParentRoute } from '../core/routing/parentRouteStore';
|
|
23
|
+
import UIPillButton from '../ui/UIPillButton.svelte';
|
|
24
|
+
import type { NavLink } from '../core/routing/navLinkTypes';
|
|
27
25
|
|
|
28
26
|
interface Props {
|
|
29
27
|
open?: boolean | undefined;
|
|
@@ -43,15 +41,12 @@
|
|
|
43
41
|
projectRoot = INJECTED_PROJECT_ROOT
|
|
44
42
|
}: Props = $props();
|
|
45
43
|
|
|
46
|
-
//
|
|
47
|
-
// page embeds this same app in an iframe and would otherwise recursively
|
|
48
|
-
// mount another overlay).
|
|
44
|
+
// Dev-only; skip inside iframe (editor route embeds this app).
|
|
49
45
|
const isDev = import.meta.env.DEV;
|
|
50
46
|
const isInIframe = typeof window !== 'undefined' && window.parent !== window;
|
|
51
47
|
const enabled = isDev && !isInIframe;
|
|
52
48
|
|
|
53
|
-
//
|
|
54
|
-
// binding wins and we skip our own persistence.
|
|
49
|
+
// Persist `open` only when consumer doesn't bind it.
|
|
55
50
|
const OPEN_KEY = storageKey('overlay-open');
|
|
56
51
|
const consumerControlsOpen = open !== undefined;
|
|
57
52
|
if (!consumerControlsOpen) {
|
|
@@ -66,15 +61,12 @@
|
|
|
66
61
|
overlayOpen.set(!!open);
|
|
67
62
|
});
|
|
68
63
|
|
|
69
|
-
//
|
|
70
|
-
// (the editor page has its own chrome).
|
|
64
|
+
// Editor route has its own chrome — hide overlay there.
|
|
71
65
|
let onEditorPath = $derived($route === editorPath);
|
|
72
66
|
let sourceFile = $derived(pageSources[$route]);
|
|
73
67
|
let showSource = $derived(!!sourceFile && !!projectRoot && !hidePageSourceOn.includes($route));
|
|
74
68
|
|
|
75
|
-
// Mount
|
|
76
|
-
// across hide/show cycles so editor state (unsaved slider values, scroll
|
|
77
|
-
// position, expanded sections) survives.
|
|
69
|
+
// Mount iframe on first open, then keep it to preserve editor state across hide/show.
|
|
78
70
|
let hasBeenOpen: boolean = $state(!!open);
|
|
79
71
|
run(() => {
|
|
80
72
|
if (open) hasBeenOpen = true;
|
|
@@ -134,22 +126,17 @@
|
|
|
134
126
|
let dockedWidth: number = $state(Math.max(MIN_WIDTH, initial.dockedWidth));
|
|
135
127
|
let floating = $state({ ...initial.floating });
|
|
136
128
|
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
const COLLAPSED_HEIGHT = 38;
|
|
129
|
+
// Collapsed-pill size; slight overshoot is fine (overflow:hidden).
|
|
130
|
+
const COLLAPSED_WIDTH = 200;
|
|
131
|
+
const COLLAPSED_HEIGHT = 44;
|
|
141
132
|
|
|
142
|
-
// Fade
|
|
143
|
-
// nav links, page-source). The bar's grow/shrink + iframe fade live in CSS vars
|
|
144
|
-
// at the top of the style block.
|
|
133
|
+
// Fade for open-only buttons (bar timing lives in CSS vars below).
|
|
145
134
|
const BTN_FADE = { duration: 130, easing: cubicInOut };
|
|
146
135
|
|
|
147
|
-
// Suppress CSS transitions during gestures
|
|
148
|
-
// re-animate every frame, and floating↔docked swaps snap cleanly.
|
|
136
|
+
// Suppress CSS transitions during gestures + mode swaps.
|
|
149
137
|
let suppressTransition = $state(false);
|
|
150
138
|
|
|
151
|
-
//
|
|
152
|
-
// so pointer events land on the panel, not on content inside the iframe.
|
|
139
|
+
// Scrim catches pointer events during gestures so they hit the panel, not the iframe.
|
|
153
140
|
let gesturing: 'drag' | 'resize-left' | 'resize-se' | null = $state(null);
|
|
154
141
|
|
|
155
142
|
function startDrag(e: PointerEvent) {
|
|
@@ -185,7 +172,7 @@
|
|
|
185
172
|
const startX = e.clientX;
|
|
186
173
|
const origWidth = dockedWidth;
|
|
187
174
|
function move(ev: PointerEvent) {
|
|
188
|
-
//
|
|
175
|
+
// Panel anchored right — drag left grows width.
|
|
189
176
|
dockedWidth = clamp(origWidth + (startX - ev.clientX), MIN_WIDTH, window.innerWidth - 120);
|
|
190
177
|
}
|
|
191
178
|
function up() {
|
|
@@ -230,7 +217,7 @@
|
|
|
230
217
|
function toggleMode() {
|
|
231
218
|
suppressTransition = true;
|
|
232
219
|
mode = mode === 'docked' ? 'floating' : 'docked';
|
|
233
|
-
//
|
|
220
|
+
// Re-clamp floating rect into viewport in case it drifted off-screen.
|
|
234
221
|
if (mode === 'floating') {
|
|
235
222
|
floating = {
|
|
236
223
|
x: clamp(floating.x, 0, window.innerWidth - MIN_WIDTH),
|
|
@@ -248,8 +235,7 @@
|
|
|
248
235
|
}
|
|
249
236
|
|
|
250
237
|
function handleHeaderDblClick(e: MouseEvent) {
|
|
251
|
-
//
|
|
252
|
-
// doesn't also fire the dblclick handler.
|
|
238
|
+
// Skip dblclick on buttons so their handlers don't double-fire.
|
|
253
239
|
if ((e.target as HTMLElement).closest('button')) return;
|
|
254
240
|
toggleOpen();
|
|
255
241
|
}
|
|
@@ -327,15 +313,13 @@
|
|
|
327
313
|
{/if}
|
|
328
314
|
|
|
329
315
|
{#if open && showSource}
|
|
330
|
-
<
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
Show page source
|
|
338
|
-
</a>
|
|
316
|
+
<span class="source-pill" transition:fade={BTN_FADE}>
|
|
317
|
+
<UIPillButton
|
|
318
|
+
icon="fa-code"
|
|
319
|
+
href="vscode://file/{projectRoot}/{sourceFile}"
|
|
320
|
+
title="Open {sourceFile} in VS Code"
|
|
321
|
+
>Show page source</UIPillButton>
|
|
322
|
+
</span>
|
|
339
323
|
{/if}
|
|
340
324
|
|
|
341
325
|
{#if open && navLinks.length > 0}
|
|
@@ -386,8 +370,7 @@
|
|
|
386
370
|
|
|
387
371
|
<style>
|
|
388
372
|
.lt-overlay {
|
|
389
|
-
/* Animation knobs
|
|
390
|
-
open = collapsed to expanded, close = expanded to collapsed. */
|
|
373
|
+
/* Animation knobs: bar = panel grow/shrink. */
|
|
391
374
|
--bar-open-dur: 240ms;
|
|
392
375
|
--bar-open-ease: cubic-bezier(0.65, 0, 0.35, 1);
|
|
393
376
|
--bar-open-delay: 0ms;
|
|
@@ -395,22 +378,15 @@
|
|
|
395
378
|
--bar-close-ease: cubic-bezier(0.65, 0, 0.35, 1);
|
|
396
379
|
--bar-close-delay: 70ms;
|
|
397
380
|
|
|
398
|
-
--pane-open-dur: 140ms;
|
|
399
|
-
--pane-open-ease: cubic-bezier(0.65, 0, 0.35, 1);
|
|
400
|
-
--pane-open-delay: 140ms;
|
|
401
|
-
--pane-close-dur: 80ms;
|
|
402
|
-
--pane-close-ease: cubic-bezier(0.65, 0, 0.35, 1);
|
|
403
|
-
--pane-close-delay: 0ms;
|
|
404
|
-
|
|
405
381
|
display: flex;
|
|
406
382
|
flex-direction: column;
|
|
407
|
-
background: #0a0a0a;
|
|
383
|
+
background: var(--ui-surface-lower, #0a0a0a);
|
|
408
384
|
border: 1px solid rgba(255, 255, 255, 0.12);
|
|
409
385
|
box-shadow: 0 18px 60px rgba(0, 0, 0, 0.6);
|
|
410
386
|
z-index: 2000;
|
|
411
387
|
overflow: hidden;
|
|
412
|
-
font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
413
|
-
color: #fff;
|
|
388
|
+
font-family: var(--ui-font-sans, system-ui, -apple-system, BlinkMacSystemFont, sans-serif);
|
|
389
|
+
color: var(--ui-text-primary, #fff);
|
|
414
390
|
transition:
|
|
415
391
|
width var(--bar-open-dur) var(--bar-open-ease) var(--bar-open-delay),
|
|
416
392
|
height var(--bar-open-dur) var(--bar-open-ease) var(--bar-open-delay),
|
|
@@ -425,14 +401,12 @@
|
|
|
425
401
|
}
|
|
426
402
|
|
|
427
403
|
.lt-overlay.floating {
|
|
428
|
-
border-radius: 8px;
|
|
404
|
+
border-radius: var(--ui-radius-xl, 8px);
|
|
429
405
|
}
|
|
430
406
|
|
|
431
|
-
/*
|
|
432
|
-
pinned to the top-right. The iframe stays mounted; its container fades
|
|
433
|
-
to opacity 0 and the panel shrinks around it. */
|
|
407
|
+
/* Collapsed state: pinned top-right; iframe stays mounted, clipped by overflow:hidden. */
|
|
434
408
|
.lt-overlay.hidden {
|
|
435
|
-
border-radius: 6px;
|
|
409
|
+
border-radius: var(--ui-radius-lg, 6px);
|
|
436
410
|
transition:
|
|
437
411
|
width var(--bar-close-dur) var(--bar-close-ease) var(--bar-close-delay),
|
|
438
412
|
height var(--bar-close-dur) var(--bar-close-ease) var(--bar-close-delay),
|
|
@@ -448,15 +422,15 @@
|
|
|
448
422
|
|
|
449
423
|
.lt-overlay.no-transition,
|
|
450
424
|
.lt-overlay.no-transition .frame-wrap {
|
|
451
|
-
transition: none
|
|
425
|
+
transition: none;
|
|
452
426
|
}
|
|
453
427
|
|
|
454
428
|
.header {
|
|
455
429
|
display: flex;
|
|
456
430
|
align-items: center;
|
|
457
|
-
gap: 6px;
|
|
458
|
-
padding: 6px 10px;
|
|
459
|
-
background: #111;
|
|
431
|
+
gap: var(--ui-space-6, 6px);
|
|
432
|
+
padding: var(--ui-space-6, 6px) var(--ui-space-10, 10px);
|
|
433
|
+
background: var(--ui-surface-low, #111);
|
|
460
434
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
|
461
435
|
cursor: default;
|
|
462
436
|
flex-shrink: 0;
|
|
@@ -465,7 +439,7 @@
|
|
|
465
439
|
|
|
466
440
|
.lt-overlay.hidden .header {
|
|
467
441
|
border-bottom: none;
|
|
468
|
-
padding: 5px 8px;
|
|
442
|
+
padding: 5px var(--ui-space-8, 8px);
|
|
469
443
|
}
|
|
470
444
|
|
|
471
445
|
.lt-overlay.floating .header {
|
|
@@ -474,20 +448,18 @@
|
|
|
474
448
|
|
|
475
449
|
.hdr-btn.title {
|
|
476
450
|
gap: 7px;
|
|
477
|
-
font-size:
|
|
478
|
-
font-weight: 600;
|
|
451
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
452
|
+
font-weight: var(--ui-font-weight-semibold, 600);
|
|
479
453
|
color: rgba(255, 255, 255, 0.85);
|
|
480
|
-
letter-spacing: 0.02em;
|
|
481
454
|
}
|
|
482
455
|
|
|
483
456
|
.spacer { flex: 1; }
|
|
484
457
|
|
|
485
458
|
.version {
|
|
486
|
-
font-size:
|
|
487
|
-
font-weight: 500;
|
|
459
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
460
|
+
font-weight: var(--ui-font-weight-medium, 500);
|
|
488
461
|
color: rgba(255, 255, 255, 0.4);
|
|
489
|
-
|
|
490
|
-
margin-left: 2px;
|
|
462
|
+
margin-left: var(--ui-space-2, 2px);
|
|
491
463
|
user-select: none;
|
|
492
464
|
}
|
|
493
465
|
|
|
@@ -497,86 +469,69 @@
|
|
|
497
469
|
justify-content: center;
|
|
498
470
|
background: transparent;
|
|
499
471
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
500
|
-
border-radius: 4px;
|
|
472
|
+
border-radius: var(--ui-radius-md, 4px);
|
|
501
473
|
color: rgba(255, 255, 255, 0.75);
|
|
502
474
|
cursor: pointer;
|
|
503
|
-
transition: background
|
|
475
|
+
transition: background var(--ui-transition-fast, 120ms ease), color var(--ui-transition-fast, 120ms ease);
|
|
504
476
|
font-family: inherit;
|
|
505
477
|
}
|
|
506
478
|
|
|
507
479
|
.hdr-btn.icon {
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
font-size:
|
|
480
|
+
padding: var(--ui-space-6, 6px);
|
|
481
|
+
aspect-ratio: 1;
|
|
482
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
511
483
|
}
|
|
512
484
|
|
|
513
485
|
.hdr-btn.text {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
font-
|
|
517
|
-
font-weight: 500;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
a.hdr-btn.source {
|
|
521
|
-
gap: 6px;
|
|
522
|
-
text-decoration: none;
|
|
523
|
-
background: rgba(255, 255, 255, 0.06);
|
|
524
|
-
border-color: rgba(255, 255, 255, 0.45);
|
|
525
|
-
border-radius: 999px;
|
|
526
|
-
padding: 0 14px;
|
|
527
|
-
color: rgba(255, 255, 255, 0.92);
|
|
486
|
+
padding: var(--ui-space-6, 6px) var(--ui-space-10, 10px);
|
|
487
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
488
|
+
font-weight: var(--ui-font-weight-medium, 500);
|
|
528
489
|
}
|
|
529
490
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
border-color: rgba(255, 255, 255, 0.6);
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
a.hdr-btn.source i {
|
|
536
|
-
color: rgba(255, 255, 255, 0.6);
|
|
491
|
+
.source-pill {
|
|
492
|
+
display: inline-flex;
|
|
537
493
|
}
|
|
538
494
|
|
|
539
495
|
.hdr-btn.nav {
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
font-
|
|
544
|
-
font-weight: 500;
|
|
496
|
+
padding: var(--ui-space-6, 6px) var(--ui-space-8, 8px);
|
|
497
|
+
gap: var(--ui-space-4, 4px);
|
|
498
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
499
|
+
font-weight: var(--ui-font-weight-medium, 500);
|
|
545
500
|
}
|
|
546
501
|
|
|
547
502
|
.hdr-btn:hover {
|
|
548
503
|
background: rgba(255, 255, 255, 0.08);
|
|
549
|
-
color: #fff;
|
|
504
|
+
color: var(--ui-text-primary, #fff);
|
|
550
505
|
}
|
|
551
506
|
|
|
552
507
|
.hdr-btn.active {
|
|
553
508
|
background: rgba(255, 255, 255, 0.12);
|
|
554
|
-
color: #fff;
|
|
509
|
+
color: var(--ui-text-primary, #fff);
|
|
555
510
|
border-color: rgba(255, 255, 255, 0.18);
|
|
556
511
|
}
|
|
557
512
|
|
|
558
513
|
.seg-group {
|
|
559
514
|
display: inline-flex;
|
|
560
515
|
align-items: center;
|
|
561
|
-
gap: 8px;
|
|
516
|
+
gap: var(--ui-space-8, 8px);
|
|
562
517
|
margin-left: 18px;
|
|
563
|
-
margin-right: 4px;
|
|
518
|
+
margin-right: var(--ui-space-4, 4px);
|
|
564
519
|
}
|
|
565
520
|
|
|
566
521
|
.seg-label {
|
|
567
|
-
font-size:
|
|
568
|
-
font-weight: 600;
|
|
569
|
-
|
|
570
|
-
color: #fff;
|
|
522
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
523
|
+
font-weight: var(--ui-font-weight-semibold, 600);
|
|
524
|
+
color: var(--ui-text-primary, #fff);
|
|
571
525
|
}
|
|
572
526
|
|
|
573
527
|
.seg-bar {
|
|
574
528
|
display: inline-flex;
|
|
575
529
|
align-items: center;
|
|
530
|
+
gap: var(--ui-space-4, 4px);
|
|
576
531
|
padding: 3px;
|
|
577
532
|
background: rgba(0, 0, 0, 0.55);
|
|
578
533
|
border: 1px solid rgba(255, 255, 255, 0.28);
|
|
579
|
-
border-radius: 6px;
|
|
534
|
+
border-radius: var(--ui-radius-lg, 6px);
|
|
580
535
|
box-shadow:
|
|
581
536
|
inset 0 1px 0 rgba(0, 0, 0, 0.5),
|
|
582
537
|
0 0 0 1px rgba(0, 0, 0, 0.4);
|
|
@@ -585,22 +540,24 @@
|
|
|
585
540
|
.seg-pill {
|
|
586
541
|
display: inline-flex;
|
|
587
542
|
align-items: center;
|
|
588
|
-
gap:
|
|
589
|
-
|
|
590
|
-
padding: 0 9px;
|
|
543
|
+
gap: var(--ui-space-4, 4px);
|
|
544
|
+
padding: var(--ui-space-4, 4px) var(--ui-space-8, 8px);
|
|
591
545
|
background: transparent;
|
|
592
546
|
border: 1px solid transparent;
|
|
593
547
|
border-radius: 3px;
|
|
594
548
|
color: rgba(255, 255, 255, 0.6);
|
|
595
549
|
font-family: inherit;
|
|
596
|
-
font-size:
|
|
597
|
-
font-weight: 500;
|
|
550
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
551
|
+
font-weight: var(--ui-font-weight-medium, 500);
|
|
598
552
|
cursor: pointer;
|
|
599
|
-
transition:
|
|
553
|
+
transition:
|
|
554
|
+
background var(--ui-transition-fast, 120ms ease),
|
|
555
|
+
color var(--ui-transition-fast, 120ms ease),
|
|
556
|
+
border-color var(--ui-transition-fast, 120ms ease);
|
|
600
557
|
}
|
|
601
558
|
|
|
602
559
|
.seg-pill i {
|
|
603
|
-
font-size:
|
|
560
|
+
font-size: var(--ui-font-size-md, 16px);
|
|
604
561
|
opacity: 0.85;
|
|
605
562
|
}
|
|
606
563
|
|
|
@@ -617,13 +574,11 @@
|
|
|
617
574
|
opacity: 0.5;
|
|
618
575
|
}
|
|
619
576
|
|
|
620
|
-
/* Outlined
|
|
621
|
-
segmented controls read as siblings, not twins. */
|
|
577
|
+
/* Outlined (not filled) so this reads as sibling to iframe's switcher, not a twin. */
|
|
622
578
|
.seg-pill.active {
|
|
623
|
-
color: #fff;
|
|
624
|
-
border-color: rgba(255, 255, 255, 0.
|
|
625
|
-
background: rgba(255, 255, 255, 0.
|
|
626
|
-
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.3);
|
|
579
|
+
color: var(--ui-text-primary, #fff);
|
|
580
|
+
border-color: rgba(255, 255, 255, 0.5);
|
|
581
|
+
background: linear-gradient(180deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.25) 100%);
|
|
627
582
|
}
|
|
628
583
|
|
|
629
584
|
.frame-wrap {
|
|
@@ -631,14 +586,10 @@
|
|
|
631
586
|
flex: 1;
|
|
632
587
|
min-height: 0;
|
|
633
588
|
background: #000;
|
|
634
|
-
transition: opacity var(--pane-open-dur) var(--pane-open-ease) var(--pane-open-delay);
|
|
635
|
-
opacity: 1;
|
|
636
589
|
}
|
|
637
590
|
|
|
638
591
|
.lt-overlay.hidden .frame-wrap {
|
|
639
|
-
opacity: 0;
|
|
640
592
|
pointer-events: none;
|
|
641
|
-
transition: opacity var(--pane-close-dur) var(--pane-close-ease) var(--pane-close-delay);
|
|
642
593
|
}
|
|
643
594
|
|
|
644
595
|
.editor-frame {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { writable } from 'svelte/store';
|
|
2
|
-
import { storageKey } from '
|
|
3
|
-
import { quietGet, quietSet } from '
|
|
2
|
+
import { storageKey } from '../core/store/editorConfig';
|
|
3
|
+
import { quietGet, quietSet } from '../core/storage/storage';
|
|
4
4
|
|
|
5
5
|
function getStorageKey(): string {
|
|
6
6
|
return storageKey('columns-visible');
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
import { onMount, onDestroy } from 'svelte';
|
|
5
5
|
import ComponentsTab from '../component-editor/scaffolding/ComponentsTab.svelte';
|
|
6
|
-
import
|
|
7
|
-
import { navigate } from '../
|
|
6
|
+
import ManifestFileManager from '../ui/ManifestFileManager.svelte';
|
|
7
|
+
import { navigate } from '../core/routing/router';
|
|
8
8
|
import { componentRegistryEntries, validateRegistryAgainstServerScan } from '../component-editor/registry';
|
|
9
|
-
import { listComponents } from '../
|
|
10
|
-
import { selectedComponent } from '../
|
|
11
|
-
import { componentDirty } from '../
|
|
9
|
+
import { listComponents } from '../core/components/componentConfigService';
|
|
10
|
+
import { selectedComponent } from '../core/store/editorViewStore';
|
|
11
|
+
import { componentDirty } from '../core/store/editorStore';
|
|
12
12
|
// Editor chrome + form controls + icon font must be JS imports (not @import
|
|
13
13
|
// inside the style block) so Vite resolves them via the module graph
|
|
14
14
|
// regardless of how the consumer compiles Svelte CSS (external ?lang.css vs
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
</div>
|
|
166
166
|
{#if drawerOpen}
|
|
167
167
|
<div class="sidebar-footer">
|
|
168
|
-
<
|
|
168
|
+
<ManifestFileManager />
|
|
169
169
|
</div>
|
|
170
170
|
{/if}
|
|
171
171
|
</nav>
|
|
@@ -201,7 +201,7 @@
|
|
|
201
201
|
overflow-y: auto;
|
|
202
202
|
overflow-x: hidden;
|
|
203
203
|
background: black;
|
|
204
|
-
border-right: 1px solid var(--ui-border-
|
|
204
|
+
border-right: 1px solid var(--ui-border-low);
|
|
205
205
|
display: flex;
|
|
206
206
|
flex-direction: column;
|
|
207
207
|
min-width: 0;
|
|
@@ -213,7 +213,7 @@
|
|
|
213
213
|
grid-template-columns: 48px 1fr;
|
|
214
214
|
align-items: center;
|
|
215
215
|
padding: var(--ui-space-12) 0 var(--ui-space-12) 0;
|
|
216
|
-
border-bottom: 1px solid var(--ui-border-
|
|
216
|
+
border-bottom: 1px solid var(--ui-border-low);
|
|
217
217
|
}
|
|
218
218
|
|
|
219
219
|
.rail-toggle {
|
|
@@ -286,7 +286,7 @@
|
|
|
286
286
|
left: 48px;
|
|
287
287
|
right: var(--ui-space-8);
|
|
288
288
|
background: var(--ui-surface-low);
|
|
289
|
-
border: 1px solid var(--ui-border
|
|
289
|
+
border: 1px solid var(--ui-border);
|
|
290
290
|
border-radius: var(--ui-radius-md);
|
|
291
291
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
292
292
|
padding: var(--ui-space-4);
|
|
@@ -335,7 +335,7 @@
|
|
|
335
335
|
flex-shrink: 0;
|
|
336
336
|
margin-top: auto;
|
|
337
337
|
padding: var(--ui-space-12) var(--ui-space-8) var(--ui-space-16);
|
|
338
|
-
border-top: 1px solid var(--ui-border-
|
|
338
|
+
border-top: 1px solid var(--ui-border-low);
|
|
339
339
|
}
|
|
340
340
|
|
|
341
341
|
.nav-item {
|
|
@@ -395,7 +395,7 @@
|
|
|
395
395
|
}
|
|
396
396
|
|
|
397
397
|
.content {
|
|
398
|
-
padding:
|
|
398
|
+
padding: 1rem var(--ui-space-32) 0;
|
|
399
399
|
background: black;
|
|
400
400
|
min-width: 0;
|
|
401
401
|
height: 100vh;
|
|
@@ -409,7 +409,7 @@
|
|
|
409
409
|
z-index: 50;
|
|
410
410
|
padding: var(--ui-space-4) var(--ui-space-8);
|
|
411
411
|
background: var(--ui-surface-low);
|
|
412
|
-
border: 1px solid var(--ui-border
|
|
412
|
+
border: 1px solid var(--ui-border);
|
|
413
413
|
border-radius: var(--ui-radius-sm);
|
|
414
414
|
color: var(--ui-text-primary);
|
|
415
415
|
font-size: var(--ui-font-size-sm);
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import { onMount } from 'svelte';
|
|
3
3
|
import EditorShell from './EditorShell.svelte';
|
|
4
4
|
import UICopyPopover from '../ui/UICopyPopover.svelte';
|
|
5
|
-
import { installEditorKeybindings } from '../
|
|
6
|
-
import { initializeEditorStore } from '../
|
|
7
|
-
import { storageKey } from '../
|
|
5
|
+
import { installEditorKeybindings } from '../core/store/editorKeybindings';
|
|
6
|
+
import { initializeEditorStore } from '../core/store/editorStore';
|
|
7
|
+
import { storageKey } from '../core/store/editorConfig';
|
|
8
8
|
// Editor chrome + form controls + icon font must be JS imports (not @import
|
|
9
9
|
// inside the style block) so Vite resolves them via the module graph
|
|
10
10
|
// regardless of how the consumer compiles Svelte CSS (external ?lang.css vs
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
gap: var(--ui-space-16);
|
|
66
66
|
padding: var(--ui-space-10) var(--ui-space-16);
|
|
67
67
|
background: black;
|
|
68
|
-
border-bottom: 1px solid var(--ui-border-
|
|
68
|
+
border-bottom: 1px solid var(--ui-border-low);
|
|
69
69
|
min-height: 52px;
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { run } from 'svelte/legacy';
|
|
3
3
|
|
|
4
|
-
import { onMount
|
|
4
|
+
import { onMount } from 'svelte';
|
|
5
5
|
import { get } from 'svelte/store';
|
|
6
6
|
import VariablesTab from '../ui/VariablesTab.svelte';
|
|
7
7
|
import ThemeFileManager from '../ui/ThemeFileManager.svelte';
|
|
8
8
|
import EditorViewSwitcher from '../ui/EditorViewSwitcher.svelte';
|
|
9
9
|
import ComponentsTab from '../component-editor/scaffolding/ComponentsTab.svelte';
|
|
10
|
-
import
|
|
11
|
-
import { persistTheme, hydrateTheme } from '../
|
|
12
|
-
import { scrollSectionIntoView } from '../
|
|
13
|
-
import { editorState } from '../
|
|
14
|
-
import { editorView, sidebarCondensed, selectedComponent } from '../
|
|
15
|
-
import { componentDirty } from '../
|
|
10
|
+
import ManifestFileManager from '../ui/ManifestFileManager.svelte';
|
|
11
|
+
import { persistTheme, hydrateTheme } from '../core/themes/themeService';
|
|
12
|
+
import { scrollSectionIntoView } from '../ui/scrollSection';
|
|
13
|
+
import { editorState } from '../core/store/editorStore';
|
|
14
|
+
import { editorView, sidebarCondensed, selectedComponent } from '../core/store/editorViewStore';
|
|
15
|
+
import { componentDirty } from '../core/store/editorStore';
|
|
16
16
|
import { componentRegistryEntries, validateRegistryAgainstServerScan } from '../component-editor/registry';
|
|
17
|
-
import { listComponents } from '../
|
|
17
|
+
import { listComponents } from '../core/components/componentConfigService';
|
|
18
18
|
|
|
19
19
|
const tokenNavItems = [
|
|
20
20
|
{ id: 'palette-editor', label: 'Palette Editor', icon: 'fas fa-palette' },
|
|
@@ -34,11 +34,9 @@
|
|
|
34
34
|
let selectedTokenSection: string | null = $state(null);
|
|
35
35
|
let saveStatus: 'idle' | 'saving' | 'saved' | 'error' = $state('idle');
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
let condensed = $derived($sidebarCondensed === 'auto' ? shellWidth < CONDENSE_BELOW : $sidebarCondensed);
|
|
37
|
+
// 'auto' = open by default. Auto-condensing on shellWidth caused a bounce
|
|
38
|
+
// as the overlay panel grew past the threshold mid-animation.
|
|
39
|
+
let condensed = $derived($sidebarCondensed === 'auto' ? false : $sidebarCondensed);
|
|
42
40
|
|
|
43
41
|
const HINT_DELAY_MS = 80;
|
|
44
42
|
let hintLabel: string | null = $state(null);
|
|
@@ -79,10 +77,7 @@
|
|
|
79
77
|
}
|
|
80
78
|
|
|
81
79
|
function toggleCondensed() {
|
|
82
|
-
sidebarCondensed.update((v) =>
|
|
83
|
-
const isCondensedNow = v === 'auto' ? shellWidth < CONDENSE_BELOW : v;
|
|
84
|
-
return !isCondensedNow;
|
|
85
|
-
});
|
|
80
|
+
sidebarCondensed.update((v) => !(v === true));
|
|
86
81
|
}
|
|
87
82
|
|
|
88
83
|
async function handleSave(detail: { fileName: string; displayName: string }) {
|
|
@@ -106,16 +101,7 @@
|
|
|
106
101
|
}
|
|
107
102
|
}
|
|
108
103
|
|
|
109
|
-
let ro: ResizeObserver | null = null;
|
|
110
104
|
onMount(async () => {
|
|
111
|
-
if (shellEl && typeof ResizeObserver !== 'undefined') {
|
|
112
|
-
ro = new ResizeObserver((entries) => {
|
|
113
|
-
const w = entries[0]?.contentRect.width;
|
|
114
|
-
if (typeof w === 'number') shellWidth = w;
|
|
115
|
-
});
|
|
116
|
-
ro.observe(shellEl);
|
|
117
|
-
shellWidth = shellEl.clientWidth;
|
|
118
|
-
}
|
|
119
105
|
try {
|
|
120
106
|
const summaries = await listComponents();
|
|
121
107
|
validateRegistryAgainstServerScan(summaries.map((s) => s.name));
|
|
@@ -123,13 +109,9 @@
|
|
|
123
109
|
// server unreachable — skip validation
|
|
124
110
|
}
|
|
125
111
|
});
|
|
126
|
-
|
|
127
|
-
onDestroy(() => {
|
|
128
|
-
ro?.disconnect();
|
|
129
|
-
});
|
|
130
112
|
</script>
|
|
131
113
|
|
|
132
|
-
<div class="layout" class:condensed
|
|
114
|
+
<div class="layout" class:condensed>
|
|
133
115
|
<nav class="sidebar" class:condensed>
|
|
134
116
|
<div class="rail-toggle-row">
|
|
135
117
|
<button
|
|
@@ -186,7 +168,7 @@
|
|
|
186
168
|
</div>
|
|
187
169
|
{#if !condensed}
|
|
188
170
|
<div class="sidebar-footer">
|
|
189
|
-
<
|
|
171
|
+
<ManifestFileManager />
|
|
190
172
|
</div>
|
|
191
173
|
{/if}
|
|
192
174
|
{/if}
|
|
@@ -228,7 +210,7 @@
|
|
|
228
210
|
overflow-y: auto;
|
|
229
211
|
overflow-x: hidden;
|
|
230
212
|
background: black;
|
|
231
|
-
border-right: 1px solid var(--ui-border-
|
|
213
|
+
border-right: 1px solid var(--ui-border-low);
|
|
232
214
|
display: flex;
|
|
233
215
|
z-index: 1;
|
|
234
216
|
flex-direction: column;
|
|
@@ -238,7 +220,7 @@
|
|
|
238
220
|
.rail-toggle-row {
|
|
239
221
|
display: flex;
|
|
240
222
|
justify-content: flex-end;
|
|
241
|
-
border-bottom: 1px solid var(--ui-border-
|
|
223
|
+
border-bottom: 1px solid var(--ui-border-low);
|
|
242
224
|
}
|
|
243
225
|
|
|
244
226
|
.rail-toggle {
|
|
@@ -356,7 +338,7 @@
|
|
|
356
338
|
flex-shrink: 0;
|
|
357
339
|
margin-top: auto;
|
|
358
340
|
padding: var(--ui-space-12) var(--ui-space-8) var(--ui-space-16);
|
|
359
|
-
border-top: 1px solid var(--ui-border-
|
|
341
|
+
border-top: 1px solid var(--ui-border-low);
|
|
360
342
|
}
|
|
361
343
|
|
|
362
344
|
.rail-hint {
|
|
@@ -366,7 +348,7 @@
|
|
|
366
348
|
z-index: 50;
|
|
367
349
|
padding: var(--ui-space-4) var(--ui-space-8);
|
|
368
350
|
background: var(--ui-surface-low);
|
|
369
|
-
border: 1px solid var(--ui-border
|
|
351
|
+
border: 1px solid var(--ui-border);
|
|
370
352
|
border-radius: var(--ui-radius-sm);
|
|
371
353
|
color: var(--ui-text-primary);
|
|
372
354
|
font-size: var(--ui-font-size-sm);
|