@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.
Files changed (232) hide show
  1. package/README.md +14 -13
  2. package/dist-plugin/index.cjs +854 -226
  3. package/dist-plugin/index.d.cts +2 -1
  4. package/dist-plugin/index.d.ts +2 -1
  5. package/dist-plugin/index.js +852 -225
  6. package/package.json +26 -40
  7. package/src/{styles → app}/site.css +1 -1
  8. package/src/{component-editor → editor/component-editor}/BadgeEditor.svelte +8 -82
  9. package/src/{component-editor → editor/component-editor}/CalloutEditor.svelte +4 -4
  10. package/src/{component-editor → editor/component-editor}/CardEditor.svelte +28 -76
  11. package/src/{component-editor → editor/component-editor}/CollapsibleSectionEditor.svelte +37 -30
  12. package/src/{component-editor → editor/component-editor}/CornerBadgeEditor.svelte +31 -93
  13. package/src/{component-editor → editor/component-editor}/DialogEditor.svelte +60 -57
  14. package/src/editor/component-editor/ImageEditor.svelte +30 -0
  15. package/src/{component-editor → editor/component-editor}/InlineEditActionsEditor.svelte +6 -4
  16. package/src/editor/component-editor/MenuSelectEditor.svelte +160 -0
  17. package/src/{component-editor → editor/component-editor}/NotificationEditor.svelte +67 -38
  18. package/src/{component-editor → editor/component-editor}/ProgressBarEditor.svelte +5 -4
  19. package/src/{component-editor → editor/component-editor}/RadioButtonEditor.svelte +3 -3
  20. package/src/editor/component-editor/SectionDividerEditor.svelte +565 -0
  21. package/src/{component-editor → editor/component-editor}/SegmentedControlEditor.svelte +2 -2
  22. package/src/{component-editor → editor/component-editor}/StandardButtonsEditor.svelte +29 -21
  23. package/src/{component-editor → editor/component-editor}/TabBarEditor.svelte +9 -14
  24. package/src/{component-editor → editor/component-editor}/TableEditor.svelte +9 -18
  25. package/src/{component-editor → editor/component-editor}/TooltipEditor.svelte +11 -47
  26. package/src/editor/component-editor/editors.d.ts +10 -0
  27. package/src/{component-editor → editor/component-editor}/registry.ts +28 -18
  28. package/src/{component-editor → editor/component-editor}/scaffolding/AngleDial.svelte +54 -15
  29. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentEditorBase.svelte +3 -51
  30. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileManager.svelte +151 -424
  31. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileMenu.svelte +18 -170
  32. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentsTab.svelte +2 -2
  33. package/src/{component-editor → editor/component-editor}/scaffolding/CopyFromMenu.svelte +44 -4
  34. package/src/{component-editor → editor/component-editor}/scaffolding/FieldsetWrapper.svelte +1 -1
  35. package/src/{component-editor → editor/component-editor}/scaffolding/LinkageChart.svelte +6 -6
  36. package/src/{component-editor → editor/component-editor}/scaffolding/LinkedBlock.svelte +6 -12
  37. package/src/editor/component-editor/scaffolding/NonStylableConfig.svelte +38 -0
  38. package/src/editor/component-editor/scaffolding/RadialShapePad.svelte +483 -0
  39. package/src/{component-editor → editor/component-editor}/scaffolding/SaveAsDialog.svelte +66 -12
  40. package/src/editor/component-editor/scaffolding/ShadowBackdrop.svelte +85 -0
  41. package/src/editor/component-editor/scaffolding/ShadowBackdropControls.svelte +132 -0
  42. package/src/editor/component-editor/scaffolding/StateBlock.svelte +345 -0
  43. package/src/{component-editor → editor/component-editor}/scaffolding/TokenLayout.svelte +17 -12
  44. package/src/{component-editor → editor/component-editor}/scaffolding/TypeEditor.svelte +13 -1
  45. package/src/editor/component-editor/scaffolding/VariantGroup.svelte +858 -0
  46. package/src/{component-editor → editor/component-editor}/scaffolding/buildTypeGroupTokens.ts +1 -0
  47. package/src/{component-editor → editor/component-editor}/scaffolding/editorContext.ts +19 -9
  48. package/src/{component-editor → editor/component-editor}/scaffolding/linkedBlock.ts +2 -2
  49. package/src/{component-editor → editor/component-editor}/scaffolding/types.ts +25 -0
  50. package/src/{lib → editor/core/components}/componentConfigKeys.ts +8 -0
  51. package/src/{lib → editor/core/components}/componentConfigService.ts +3 -3
  52. package/src/{lib → editor/core/components}/componentPersist.ts +11 -9
  53. package/src/editor/core/flashStatus.ts +30 -0
  54. package/src/{lib → editor/core/fonts}/fontLoader.ts +2 -2
  55. package/src/{lib → editor/core/fonts}/fontMigration.ts +4 -4
  56. package/src/{lib → editor/core/fonts}/fontParse.ts +1 -1
  57. package/src/editor/core/manifests/manifestService.ts +171 -0
  58. package/src/editor/core/palettes/familySwap.ts +99 -0
  59. package/src/{lib → editor/core/palettes}/paletteDerivation.ts +71 -2
  60. package/src/{lib → editor/core/palettes}/tokenRegistry.ts +9 -6
  61. package/src/editor/core/productionPulse.ts +37 -0
  62. package/src/{lib → editor/core/routing}/router.ts +1 -1
  63. package/src/{lib/files/versionedFileResource.ts → editor/core/storage/files/versionedFileResourceClient.ts} +8 -1
  64. package/src/{lib → editor/core/store}/editorCore.ts +24 -8
  65. package/src/{lib → editor/core/store}/editorPersistence.ts +3 -3
  66. package/src/{lib → editor/core/store}/editorRenderer.ts +2 -2
  67. package/src/{lib → editor/core/store}/editorStore.ts +222 -28
  68. package/src/{lib → editor/core/store}/editorTypes.ts +56 -13
  69. package/src/editor/core/store/gradientSource.ts +192 -0
  70. package/src/editor/core/themes/migrations/2026-05-19-collapsiblesection-drop-frame-surface.ts +28 -0
  71. package/src/editor/core/themes/migrations/2026-05-19-sectiondivider-rich-gradient.ts +35 -0
  72. package/src/editor/core/themes/migrations/2026-05-20-sectiondivider-slim-variants.ts +82 -0
  73. package/src/editor/core/themes/migrations/2026-05-21-sectiondivider-spacing-to-padding.ts +24 -0
  74. package/src/editor/core/themes/migrations/2026-05-22-sectiondivider-intrinsics-to-css.ts +81 -0
  75. package/src/{lib → editor/core/themes}/migrations/index.ts +10 -0
  76. package/src/{lib → editor/core/themes}/slices/columns.ts +2 -2
  77. package/src/{lib → editor/core/themes}/slices/components.ts +20 -6
  78. package/src/{lib → editor/core/themes}/slices/fonts.ts +1 -1
  79. package/src/{lib → editor/core/themes}/slices/gradients.ts +89 -14
  80. package/src/{lib → editor/core/themes}/slices/overlays.ts +1 -1
  81. package/src/{lib → editor/core/themes}/slices/palettes.ts +1 -1
  82. package/src/{lib → editor/core/themes}/slices/shadows.ts +3 -3
  83. package/src/{lib → editor/core/themes}/themeInit.ts +8 -8
  84. package/src/{lib → editor/core/themes}/themeService.ts +6 -6
  85. package/src/{lib → editor/core/themes}/themeTypes.ts +67 -8
  86. package/src/editor/index.ts +69 -0
  87. package/src/{lib → editor/overlay}/ColumnsOverlay.svelte +0 -1
  88. package/src/{lib → editor/overlay}/LiveEditorOverlay.svelte +80 -129
  89. package/src/{lib → editor/overlay}/columnsOverlay.ts +2 -2
  90. package/src/{pages → editor/pages}/ComponentEditorPage.svelte +12 -12
  91. package/src/{pages → editor/pages}/Editor.svelte +4 -4
  92. package/src/{pages → editor/pages}/EditorShell.svelte +18 -36
  93. package/src/{styles → editor/styles}/ui-editor.css +43 -22
  94. package/src/{styles → editor/styles}/ui-form-controls.css +23 -24
  95. package/src/{ui → editor/ui}/BezierCurveEditor.svelte +119 -68
  96. package/src/{ui → editor/ui}/ColorEditPanel.svelte +13 -13
  97. package/src/{ui → editor/ui}/EditorViewSwitcher.svelte +7 -6
  98. package/src/editor/ui/FileLoadList.svelte +367 -0
  99. package/src/editor/ui/FilePill.svelte +80 -0
  100. package/src/editor/ui/FontStackEditor.svelte +499 -0
  101. package/src/editor/ui/GradientEditor.svelte +690 -0
  102. package/src/{ui → editor/ui}/GradientStopPicker.svelte +12 -4
  103. package/src/editor/ui/ManifestFileManager.svelte +438 -0
  104. package/src/{ui → editor/ui}/PaletteEditor.svelte +180 -673
  105. package/src/editor/ui/ProjectFontsSection.svelte +638 -0
  106. package/src/{ui → editor/ui}/SurfacesTab.svelte +3 -3
  107. package/src/{ui → editor/ui}/TextTab.svelte +3 -3
  108. package/src/editor/ui/ThemeFileManager.svelte +783 -0
  109. package/src/{ui → editor/ui}/UICopyPopover.svelte +4 -4
  110. package/src/{ui → editor/ui}/UIFontFamilySelector.svelte +6 -7
  111. package/src/{ui → editor/ui}/UIFontSizeSelector.svelte +4 -1
  112. package/src/editor/ui/UIInfoPopover.svelte +243 -0
  113. package/src/editor/ui/UILetterSpacingSelector.svelte +65 -0
  114. package/src/{ui → editor/ui}/UILineHeightSelector.svelte +5 -5
  115. package/src/{ui → editor/ui}/UILinkToggle.svelte +2 -2
  116. package/src/{ui → editor/ui}/UIPaddingSelector.svelte +6 -6
  117. package/src/{ui → editor/ui}/UIPaletteSelector.svelte +57 -30
  118. package/src/editor/ui/UIPillButton.svelte +168 -0
  119. package/src/{ui → editor/ui}/UIRadio.svelte +2 -2
  120. package/src/{ui → editor/ui}/UIRelinkConfirmPopover.svelte +4 -4
  121. package/src/editor/ui/UISegmentedControl.svelte +114 -0
  122. package/src/editor/ui/UISquareButton.svelte +172 -0
  123. package/src/{ui → editor/ui}/UITokenSelector.svelte +14 -11
  124. package/src/{ui → editor/ui}/UIVariantSelector.svelte +1 -1
  125. package/src/{ui → editor/ui}/VariablesTab.svelte +46 -17
  126. package/src/{ui → editor/ui}/palette/GradientStopEditor.svelte +13 -13
  127. package/src/{ui → editor/ui}/palette/OverridesPanel.svelte +24 -47
  128. package/src/{ui → editor/ui}/palette/PaletteBase.svelte +11 -8
  129. package/src/{ui → editor/ui}/palette/paletteEditorState.ts +1 -1
  130. package/src/editor/ui/palette/paletteMath.ts +275 -0
  131. package/src/{ui → editor/ui}/sections/ColumnsSection.svelte +137 -18
  132. package/src/{ui → editor/ui}/sections/GradientsSection.svelte +8 -8
  133. package/src/{ui → editor/ui}/sections/OverlaysSection.svelte +18 -18
  134. package/src/{ui → editor/ui}/sections/ShadowsSection.svelte +23 -23
  135. package/src/{ui → editor/ui}/sections/TokenScaleTable.svelte +3 -3
  136. package/src/{components → system/components}/Badge.svelte +0 -36
  137. package/src/{components → system/components}/Button.svelte +2 -2
  138. package/src/{components → system/components}/Card.svelte +34 -60
  139. package/src/{components → system/components}/CollapsibleSection.svelte +25 -2
  140. package/src/{components → system/components}/CornerBadge.svelte +8 -24
  141. package/src/{components → system/components}/Dialog.svelte +1 -1
  142. package/src/system/components/FloatingTokenTags.css +275 -0
  143. package/src/system/components/FloatingTokenTags.svelte +543 -0
  144. package/src/{components → system/components}/InlineEditActions.svelte +6 -4
  145. package/src/system/components/MenuSelect.svelte +229 -0
  146. package/src/{components → system/components}/Notification.svelte +8 -1
  147. package/src/{components → system/components}/ProgressBar.svelte +29 -11
  148. package/src/system/components/SectionDivider.svelte +560 -0
  149. package/src/{components → system/components}/SegmentedControl.svelte +49 -43
  150. package/src/{components → system/components}/TabBar.svelte +81 -65
  151. package/src/{components → system/components}/Table.svelte +17 -3
  152. package/src/{components → system/components}/Tooltip.svelte +6 -4
  153. package/src/system/styles/CONVENTIONS.md +178 -0
  154. package/src/system/styles/fonts.css +20 -0
  155. package/src/system/styles/tokens.css +601 -0
  156. package/src/system/styles/tokens.generated.css +544 -0
  157. package/src/component-editor/ImageEditor.svelte +0 -74
  158. package/src/component-editor/SectionDividerEditor.svelte +0 -265
  159. package/src/component-editor/scaffolding/DividerEditor.svelte +0 -94
  160. package/src/component-editor/scaffolding/GradientCard.svelte +0 -296
  161. package/src/component-editor/scaffolding/NonStylableConfig.svelte +0 -62
  162. package/src/component-editor/scaffolding/ShadowBackdrop.svelte +0 -37
  163. package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +0 -61
  164. package/src/component-editor/scaffolding/StateBlock.svelte +0 -132
  165. package/src/component-editor/scaffolding/VariantGroup.svelte +0 -310
  166. package/src/components/SectionDivider.svelte +0 -483
  167. package/src/data/google-fonts.json +0 -75
  168. package/src/lib/index.ts +0 -68
  169. package/src/lib/presetService.ts +0 -214
  170. package/src/lib/productionPulse.ts +0 -32
  171. package/src/styles/fonts.css +0 -30
  172. package/src/styles/tokens.css +0 -1324
  173. package/src/ui/FontStackEditor.svelte +0 -361
  174. package/src/ui/GradientEditor.svelte +0 -470
  175. package/src/ui/PresetFileManager.svelte +0 -1116
  176. package/src/ui/ProjectFontsSection.svelte +0 -645
  177. package/src/ui/ThemeFileManager.svelte +0 -1020
  178. package/src/ui/UnsavedComponentsDialog.svelte +0 -315
  179. /package/src/{component-editor → editor/component-editor}/index.ts +0 -0
  180. /package/src/{component-editor → editor/component-editor}/scaffolding/DemoHeader.svelte +0 -0
  181. /package/src/{component-editor → editor/component-editor}/scaffolding/componentSectionType.ts +0 -0
  182. /package/src/{component-editor → editor/component-editor}/scaffolding/componentSources.ts +0 -0
  183. /package/src/{component-editor → editor/component-editor}/scaffolding/defaultSections.ts +0 -0
  184. /package/src/{component-editor → editor/component-editor}/scaffolding/siblings.ts +0 -0
  185. /package/src/{lib → editor/core}/cssVarSync.ts +0 -0
  186. /package/src/{lib → editor/core/palettes}/oklch.ts +0 -0
  187. /package/src/{lib → editor/core/routing}/navLinkTypes.ts +0 -0
  188. /package/src/{lib → editor/core/routing}/parentRouteStore.ts +0 -0
  189. /package/src/{lib → editor/core/storage}/storage.ts +0 -0
  190. /package/src/{lib → editor/core/store}/editorConfig.ts +0 -0
  191. /package/src/{lib → editor/core/store}/editorConfigStore.ts +0 -0
  192. /package/src/{lib → editor/core/store}/editorKeybindings.ts +0 -0
  193. /package/src/{lib → editor/core/store}/editorViewStore.ts +0 -0
  194. /package/src/{lib → editor/core/themes}/migrations/2026-04-24-component-prefix-and-suffix-renames.ts +0 -0
  195. /package/src/{lib → editor/core/themes}/migrations/2026-04-24-legacy-keys-and-bg-to-canvas.ts +0 -0
  196. /package/src/{lib → editor/core/themes}/migrations/2026-04-27-segmentedcontrol-disabled-flatten.ts +0 -0
  197. /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-frame-and-cleanup.ts +0 -0
  198. /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-variant-namespace.ts +0 -0
  199. /package/src/{lib → editor/core/themes}/migrations/2026-05-10-sectiondivider-gradient-stops.ts +0 -0
  200. /package/src/{lib → editor/core/themes}/migrations/2026-05-13-primary-to-brand.ts +0 -0
  201. /package/src/{lib → editor/core/themes}/parsers/globalRootBlock.ts +0 -0
  202. /package/src/{lib → editor/core/themes}/slices/domainVars.ts +0 -0
  203. /package/src/{lib → editor/overlay}/overlayState.ts +0 -0
  204. /package/src/{pages → editor/pages}/ComponentEditorPage.svelte.d.ts +0 -0
  205. /package/src/{pages → editor/pages}/Editor.svelte.d.ts +0 -0
  206. /package/src/{ui → editor/ui}/Toggle.svelte +0 -0
  207. /package/src/{ui → editor/ui}/UIDialog.svelte +0 -0
  208. /package/src/{ui → editor/ui}/UIFontWeightSelector.svelte +0 -0
  209. /package/src/{ui → editor/ui}/UIOptionItem.svelte +0 -0
  210. /package/src/{ui → editor/ui}/UIOptionList.svelte +0 -0
  211. /package/src/{ui → editor/ui}/UIRadioGroup.svelte +0 -0
  212. /package/src/{lib → editor/ui}/copyPopover.ts +0 -0
  213. /package/src/{ui → editor/ui}/curveEngine.ts +0 -0
  214. /package/src/{ui → editor/ui}/index.ts +0 -0
  215. /package/src/{ui → editor/ui}/keepInViewport.ts +0 -0
  216. /package/src/{ui → editor/ui}/palette/ScaleCurveEditor.svelte +0 -0
  217. /package/src/{lib → editor/ui}/scrollSection.ts +0 -0
  218. /package/src/{ui → editor/ui}/sections/tokenScales.ts +0 -0
  219. /package/src/{ui → editor/ui}/variantScales.ts +0 -0
  220. /package/src/{assets → system/assets}/newspaper.webp +0 -0
  221. /package/src/{assets → system/assets}/offering.webp +0 -0
  222. /package/src/{components → system/components}/Callout.svelte +0 -0
  223. /package/src/{components → system/components}/Image.svelte +0 -0
  224. /package/src/{components → system/components}/RadioButton.svelte +0 -0
  225. /package/src/{components → system/components}/types.ts +0 -0
  226. /package/src/{styles → system/styles}/_padding.scss +0 -0
  227. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin-ext.woff2 +0 -0
  228. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin.woff2 +0 -0
  229. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin-ext.woff2 +0 -0
  230. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin.woff2 +0 -0
  231. /package/src/{styles → system/styles}/fonts/Manrope/Manrope-latin-ext.woff2 +0 -0
  232. /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__ is injected by the themeFileApi Vite plugin as a `define`.
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 './router';
17
+ import { route, navigate } from '../core/routing/router';
21
18
  import { columnsVisible, toggleColumns } from './columnsOverlay';
22
- import { storageKey } from './editorConfig';
19
+ import { storageKey } from '../core/store/editorConfig';
23
20
  import { overlayOpen } from './overlayState';
24
- import { quietGet, quietSet } from './storage';
25
- import { postParentRoute } from './parentRouteStore';
26
- import type { NavLink } from './navLinkTypes';
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
- // Self-gate: only render in dev, and never inside an iframe (the /editor
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
- // Self-manage `open` when the consumer doesn't bind it. When they do, their
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
- // Hide the overlay entirely when the user is already on the editor route
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 the iframe the first time the editor is shown, then keep it mounted
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
- // Approximate natural size of the collapsed pill (Editor title + columns toggle).
138
- // A few pixels of overshoot is fine — the panel has overflow:hidden.
139
- const COLLAPSED_WIDTH = 184;
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 timing for the buttons that only render when open (float toggle, spacer,
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 and mode swaps so dragging doesn't
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
- // Gesture state a transparent scrim covers the iframe while any gesture is active
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
- // Dragging left increases width (panel is anchored to the right edge)
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
- // Snap the floating rect back inside the viewport if it drifted off-screen since last use
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
- // Ignore double-clicks on buttons so toggling mode/fullscreen/show-hide
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
- <a
331
- class="hdr-btn text source"
332
- href="vscode://file/{projectRoot}/{sourceFile}"
333
- title="Open {sourceFile} in VS Code"
334
- transition:fade={BTN_FADE}
335
- >
336
- <i class="fas fa-code"></i>
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. bar = panel grow/shrink, pane = iframe fade.
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
- /* Hidden state: the editor panel is collapsed to just the header bar,
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 !important;
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: 13px;
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: 10px;
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
- letter-spacing: 0.02em;
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 0.1s, color 0.1s;
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
- width: 26px;
509
- height: 26px;
510
- font-size: 11px;
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
- height: 26px;
515
- padding: 0 10px;
516
- font-size: 12px;
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
- a.hdr-btn.source:hover {
531
- background: rgba(255, 255, 255, 0.14);
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
- height: 26px;
541
- padding: 0 9px;
542
- gap: 5px;
543
- font-size: 11px;
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: 11px;
568
- font-weight: 600;
569
- letter-spacing: 0.02em;
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: 5px;
589
- height: 22px;
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: 11px;
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: background 0.1s, color 0.1s, border-color 0.1s;
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: 10px;
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 active quieter than the iframe's filled switcher, so the two
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.3);
625
- background: rgba(255, 255, 255, 0.1);
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 './editorConfig';
3
- import { quietGet, quietSet } from './storage';
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 PresetFileManager from '../ui/PresetFileManager.svelte';
7
- import { navigate } from '../lib/router';
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 '../lib/componentConfigService';
10
- import { selectedComponent } from '../lib/editorViewStore';
11
- import { componentDirty } from '../lib/editorStore';
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
- <PresetFileManager />
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-faint);
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-faint);
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-default);
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-faint);
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: 0 var(--ui-space-32);
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-default);
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 '../lib/editorKeybindings';
6
- import { initializeEditorStore } from '../lib/editorStore';
7
- import { storageKey } from '../lib/editorConfig';
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-faint);
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, onDestroy } from 'svelte';
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 PresetFileManager from '../ui/PresetFileManager.svelte';
11
- import { persistTheme, hydrateTheme } from '../lib/themeService';
12
- import { scrollSectionIntoView } from '../lib/scrollSection';
13
- import { editorState } from '../lib/editorStore';
14
- import { editorView, sidebarCondensed, selectedComponent } from '../lib/editorViewStore';
15
- import { componentDirty } from '../lib/editorStore';
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 '../lib/componentConfigService';
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
- let shellEl: HTMLElement | null = $state(null);
38
- let shellWidth = $state(1024);
39
- const CONDENSE_BELOW = 520;
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 bind:this={shellEl}>
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
- <PresetFileManager />
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-faint);
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-faint);
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-faint);
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-default);
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);