@motion-proto/live-tokens 0.6.2 → 0.7.1

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 (212) hide show
  1. package/README.md +14 -13
  2. package/dist-plugin/index.cjs +147 -136
  3. package/dist-plugin/index.d.cts +1 -1
  4. package/dist-plugin/index.d.ts +1 -1
  5. package/dist-plugin/index.js +145 -135
  6. package/package.json +25 -40
  7. package/src/{component-editor → editor/component-editor}/BadgeEditor.svelte +8 -82
  8. package/src/{component-editor → editor/component-editor}/CalloutEditor.svelte +4 -4
  9. package/src/{component-editor → editor/component-editor}/CardEditor.svelte +28 -76
  10. package/src/{component-editor → editor/component-editor}/CollapsibleSectionEditor.svelte +3 -3
  11. package/src/{component-editor → editor/component-editor}/CornerBadgeEditor.svelte +31 -93
  12. package/src/{component-editor → editor/component-editor}/DialogEditor.svelte +60 -57
  13. package/src/editor/component-editor/ImageEditor.svelte +30 -0
  14. package/src/{component-editor → editor/component-editor}/InlineEditActionsEditor.svelte +6 -4
  15. package/src/editor/component-editor/MenuSelectEditor.svelte +160 -0
  16. package/src/{component-editor → editor/component-editor}/NotificationEditor.svelte +64 -37
  17. package/src/{component-editor → editor/component-editor}/ProgressBarEditor.svelte +5 -4
  18. package/src/{component-editor → editor/component-editor}/RadioButtonEditor.svelte +3 -3
  19. package/src/{component-editor → editor/component-editor}/SectionDividerEditor.svelte +57 -84
  20. package/src/{component-editor → editor/component-editor}/SegmentedControlEditor.svelte +2 -2
  21. package/src/{component-editor → editor/component-editor}/StandardButtonsEditor.svelte +16 -20
  22. package/src/{component-editor → editor/component-editor}/TabBarEditor.svelte +9 -14
  23. package/src/{component-editor → editor/component-editor}/TableEditor.svelte +9 -18
  24. package/src/{component-editor → editor/component-editor}/TooltipEditor.svelte +11 -47
  25. package/src/{component-editor → editor/component-editor}/registry.ts +28 -18
  26. package/src/{component-editor → editor/component-editor}/scaffolding/AngleDial.svelte +2 -2
  27. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentEditorBase.svelte +3 -51
  28. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileManager.svelte +144 -416
  29. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileMenu.svelte +18 -170
  30. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentsTab.svelte +2 -2
  31. package/src/{component-editor → editor/component-editor}/scaffolding/CopyFromMenu.svelte +44 -4
  32. package/src/{component-editor → editor/component-editor}/scaffolding/DividerEditor.svelte +1 -1
  33. package/src/{component-editor → editor/component-editor}/scaffolding/FieldsetWrapper.svelte +1 -1
  34. package/src/{component-editor → editor/component-editor}/scaffolding/GradientCard.svelte +6 -6
  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 -11
  37. package/src/editor/component-editor/scaffolding/NonStylableConfig.svelte +38 -0
  38. package/src/{component-editor → editor/component-editor}/scaffolding/SaveAsDialog.svelte +66 -12
  39. package/src/editor/component-editor/scaffolding/ShadowBackdrop.svelte +72 -0
  40. package/src/editor/component-editor/scaffolding/ShadowBackdropControls.svelte +132 -0
  41. package/src/editor/component-editor/scaffolding/StateBlock.svelte +257 -0
  42. package/src/{component-editor → editor/component-editor}/scaffolding/TokenLayout.svelte +9 -7
  43. package/src/editor/component-editor/scaffolding/VariantGroup.svelte +644 -0
  44. package/src/{component-editor → editor/component-editor}/scaffolding/editorContext.ts +19 -9
  45. package/src/{component-editor → editor/component-editor}/scaffolding/linkedBlock.ts +2 -2
  46. package/src/{component-editor → editor/component-editor}/scaffolding/types.ts +14 -0
  47. package/src/{lib → editor/core/components}/componentConfigService.ts +2 -2
  48. package/src/{lib → editor/core/components}/componentPersist.ts +5 -5
  49. package/src/editor/core/flashStatus.ts +30 -0
  50. package/src/{lib → editor/core/fonts}/fontLoader.ts +2 -2
  51. package/src/{lib → editor/core/fonts}/fontMigration.ts +4 -4
  52. package/src/{lib → editor/core/fonts}/fontParse.ts +1 -1
  53. package/src/editor/core/manifests/manifestService.ts +116 -0
  54. package/src/{lib → editor/core/palettes}/paletteDerivation.ts +2 -2
  55. package/src/{lib → editor/core/palettes}/tokenRegistry.ts +5 -5
  56. package/src/editor/core/productionPulse.ts +37 -0
  57. package/src/{lib → editor/core/routing}/router.ts +1 -1
  58. package/src/{lib/files/versionedFileResource.ts → editor/core/storage/files/versionedFileResourceClient.ts} +8 -1
  59. package/src/{lib → editor/core/store}/editorCore.ts +24 -8
  60. package/src/{lib → editor/core/store}/editorPersistence.ts +3 -3
  61. package/src/{lib → editor/core/store}/editorRenderer.ts +2 -2
  62. package/src/{lib → editor/core/store}/editorStore.ts +17 -17
  63. package/src/{lib → editor/core/store}/editorTypes.ts +1 -1
  64. package/src/{lib → editor/core/themes}/slices/columns.ts +2 -2
  65. package/src/{lib → editor/core/themes}/slices/components.ts +2 -2
  66. package/src/{lib → editor/core/themes}/slices/fonts.ts +1 -1
  67. package/src/{lib → editor/core/themes}/slices/gradients.ts +2 -2
  68. package/src/{lib → editor/core/themes}/slices/overlays.ts +1 -1
  69. package/src/{lib → editor/core/themes}/slices/palettes.ts +1 -1
  70. package/src/{lib → editor/core/themes}/slices/shadows.ts +3 -3
  71. package/src/{lib → editor/core/themes}/themeInit.ts +6 -6
  72. package/src/{lib → editor/core/themes}/themeService.ts +6 -6
  73. package/src/{lib → editor/core/themes}/themeTypes.ts +11 -7
  74. package/src/editor/index.ts +69 -0
  75. package/src/{lib → editor/overlay}/LiveEditorOverlay.svelte +79 -125
  76. package/src/{lib → editor/overlay}/columnsOverlay.ts +2 -2
  77. package/src/{pages → editor/pages}/ComponentEditorPage.svelte +12 -12
  78. package/src/{pages → editor/pages}/Editor.svelte +4 -4
  79. package/src/{pages → editor/pages}/EditorShell.svelte +18 -36
  80. package/src/{styles → editor/styles}/ui-editor.css +41 -21
  81. package/src/{styles → editor/styles}/ui-form-controls.css +8 -8
  82. package/src/{ui → editor/ui}/BezierCurveEditor.svelte +8 -8
  83. package/src/{ui → editor/ui}/ColorEditPanel.svelte +13 -13
  84. package/src/{ui → editor/ui}/EditorViewSwitcher.svelte +8 -6
  85. package/src/editor/ui/FileLoadList.svelte +350 -0
  86. package/src/editor/ui/FilePill.svelte +80 -0
  87. package/src/{ui → editor/ui}/FontStackEditor.svelte +7 -7
  88. package/src/{ui → editor/ui}/GradientEditor.svelte +11 -11
  89. package/src/{ui → editor/ui}/GradientStopPicker.svelte +1 -1
  90. package/src/editor/ui/ManifestFileManager.svelte +371 -0
  91. package/src/{ui → editor/ui}/PaletteEditor.svelte +132 -598
  92. package/src/{ui → editor/ui}/ProjectFontsSection.svelte +102 -144
  93. package/src/{ui → editor/ui}/SurfacesTab.svelte +3 -3
  94. package/src/{ui → editor/ui}/TextTab.svelte +3 -3
  95. package/src/{ui → editor/ui}/ThemeFileManager.svelte +286 -519
  96. package/src/{ui → editor/ui}/UICopyPopover.svelte +4 -4
  97. package/src/{ui → editor/ui}/UIFontFamilySelector.svelte +6 -6
  98. package/src/{ui → editor/ui}/UIFontSizeSelector.svelte +1 -1
  99. package/src/editor/ui/UIInfoPopover.svelte +244 -0
  100. package/src/{ui → editor/ui}/UILineHeightSelector.svelte +5 -5
  101. package/src/{ui → editor/ui}/UILinkToggle.svelte +2 -2
  102. package/src/{ui → editor/ui}/UIPaddingSelector.svelte +6 -6
  103. package/src/{ui → editor/ui}/UIPaletteSelector.svelte +26 -26
  104. package/src/editor/ui/UIPillButton.svelte +138 -0
  105. package/src/{ui → editor/ui}/UIRadio.svelte +2 -2
  106. package/src/{ui → editor/ui}/UIRelinkConfirmPopover.svelte +4 -4
  107. package/src/editor/ui/UISquareButton.svelte +172 -0
  108. package/src/{ui → editor/ui}/UITokenSelector.svelte +10 -10
  109. package/src/{ui → editor/ui}/UIVariantSelector.svelte +1 -1
  110. package/src/{ui → editor/ui}/VariablesTab.svelte +31 -8
  111. package/src/{ui → editor/ui}/palette/GradientStopEditor.svelte +13 -13
  112. package/src/{ui → editor/ui}/palette/OverridesPanel.svelte +13 -13
  113. package/src/{ui → editor/ui}/palette/PaletteBase.svelte +8 -5
  114. package/src/{ui → editor/ui}/palette/paletteEditorState.ts +1 -1
  115. package/src/editor/ui/palette/paletteMath.ts +275 -0
  116. package/src/{ui → editor/ui}/sections/ColumnsSection.svelte +137 -17
  117. package/src/{ui → editor/ui}/sections/GradientsSection.svelte +7 -7
  118. package/src/{ui → editor/ui}/sections/OverlaysSection.svelte +17 -17
  119. package/src/{ui → editor/ui}/sections/ShadowsSection.svelte +22 -22
  120. package/src/{ui → editor/ui}/sections/TokenScaleTable.svelte +3 -3
  121. package/src/{components → system/components}/Badge.svelte +0 -36
  122. package/src/{components → system/components}/Card.svelte +8 -62
  123. package/src/{components → system/components}/CornerBadge.svelte +8 -24
  124. package/src/{components → system/components}/Dialog.svelte +1 -1
  125. package/src/system/components/FloatingTokenTags.css +256 -0
  126. package/src/system/components/FloatingTokenTags.svelte +592 -0
  127. package/src/{components → system/components}/InlineEditActions.svelte +6 -4
  128. package/src/system/components/MenuSelect.svelte +229 -0
  129. package/src/{components → system/components}/ProgressBar.svelte +29 -11
  130. package/src/{components → system/components}/SegmentedControl.svelte +49 -43
  131. package/src/{components → system/components}/TabBar.svelte +81 -65
  132. package/src/{components → system/components}/Table.svelte +17 -3
  133. package/src/{components → system/components}/Tooltip.svelte +6 -4
  134. package/src/system/styles/CONVENTIONS.md +178 -0
  135. package/src/{styles → system/styles}/fonts.css +6 -3
  136. package/src/{styles → system/styles}/tokens.css +149 -29
  137. package/src/component-editor/ImageEditor.svelte +0 -74
  138. package/src/component-editor/scaffolding/NonStylableConfig.svelte +0 -62
  139. package/src/component-editor/scaffolding/ShadowBackdrop.svelte +0 -37
  140. package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +0 -61
  141. package/src/component-editor/scaffolding/StateBlock.svelte +0 -132
  142. package/src/component-editor/scaffolding/VariantGroup.svelte +0 -310
  143. package/src/data/google-fonts.json +0 -75
  144. package/src/lib/index.ts +0 -68
  145. package/src/lib/presetService.ts +0 -214
  146. package/src/lib/productionPulse.ts +0 -32
  147. package/src/ui/PresetFileManager.svelte +0 -1116
  148. package/src/ui/UnsavedComponentsDialog.svelte +0 -315
  149. /package/src/{styles → app}/site.css +0 -0
  150. /package/src/{component-editor → editor/component-editor}/index.ts +0 -0
  151. /package/src/{component-editor → editor/component-editor}/scaffolding/DemoHeader.svelte +0 -0
  152. /package/src/{component-editor → editor/component-editor}/scaffolding/TypeEditor.svelte +0 -0
  153. /package/src/{component-editor → editor/component-editor}/scaffolding/buildTypeGroupTokens.ts +0 -0
  154. /package/src/{component-editor → editor/component-editor}/scaffolding/componentSectionType.ts +0 -0
  155. /package/src/{component-editor → editor/component-editor}/scaffolding/componentSources.ts +0 -0
  156. /package/src/{component-editor → editor/component-editor}/scaffolding/defaultSections.ts +0 -0
  157. /package/src/{component-editor → editor/component-editor}/scaffolding/siblings.ts +0 -0
  158. /package/src/{lib → editor/core/components}/componentConfigKeys.ts +0 -0
  159. /package/src/{lib → editor/core}/cssVarSync.ts +0 -0
  160. /package/src/{lib → editor/core/palettes}/oklch.ts +0 -0
  161. /package/src/{lib → editor/core/routing}/navLinkTypes.ts +0 -0
  162. /package/src/{lib → editor/core/routing}/parentRouteStore.ts +0 -0
  163. /package/src/{lib → editor/core/storage}/storage.ts +0 -0
  164. /package/src/{lib → editor/core/store}/editorConfig.ts +0 -0
  165. /package/src/{lib → editor/core/store}/editorConfigStore.ts +0 -0
  166. /package/src/{lib → editor/core/store}/editorKeybindings.ts +0 -0
  167. /package/src/{lib → editor/core/store}/editorViewStore.ts +0 -0
  168. /package/src/{lib → editor/core/themes}/migrations/2026-04-24-component-prefix-and-suffix-renames.ts +0 -0
  169. /package/src/{lib → editor/core/themes}/migrations/2026-04-24-legacy-keys-and-bg-to-canvas.ts +0 -0
  170. /package/src/{lib → editor/core/themes}/migrations/2026-04-27-segmentedcontrol-disabled-flatten.ts +0 -0
  171. /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-frame-and-cleanup.ts +0 -0
  172. /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-variant-namespace.ts +0 -0
  173. /package/src/{lib → editor/core/themes}/migrations/2026-05-10-sectiondivider-gradient-stops.ts +0 -0
  174. /package/src/{lib → editor/core/themes}/migrations/2026-05-13-primary-to-brand.ts +0 -0
  175. /package/src/{lib → editor/core/themes}/migrations/index.ts +0 -0
  176. /package/src/{lib → editor/core/themes}/parsers/globalRootBlock.ts +0 -0
  177. /package/src/{lib → editor/core/themes}/slices/domainVars.ts +0 -0
  178. /package/src/{lib → editor/overlay}/ColumnsOverlay.svelte +0 -0
  179. /package/src/{lib → editor/overlay}/overlayState.ts +0 -0
  180. /package/src/{pages → editor/pages}/ComponentEditorPage.svelte.d.ts +0 -0
  181. /package/src/{pages → editor/pages}/Editor.svelte.d.ts +0 -0
  182. /package/src/{ui → editor/ui}/Toggle.svelte +0 -0
  183. /package/src/{ui → editor/ui}/UIDialog.svelte +0 -0
  184. /package/src/{ui → editor/ui}/UIFontWeightSelector.svelte +0 -0
  185. /package/src/{ui → editor/ui}/UIOptionItem.svelte +0 -0
  186. /package/src/{ui → editor/ui}/UIOptionList.svelte +0 -0
  187. /package/src/{ui → editor/ui}/UIRadioGroup.svelte +0 -0
  188. /package/src/{lib → editor/ui}/copyPopover.ts +0 -0
  189. /package/src/{ui → editor/ui}/curveEngine.ts +0 -0
  190. /package/src/{ui → editor/ui}/index.ts +0 -0
  191. /package/src/{ui → editor/ui}/keepInViewport.ts +0 -0
  192. /package/src/{ui → editor/ui}/palette/ScaleCurveEditor.svelte +0 -0
  193. /package/src/{lib → editor/ui}/scrollSection.ts +0 -0
  194. /package/src/{ui → editor/ui}/sections/tokenScales.ts +0 -0
  195. /package/src/{ui → editor/ui}/variantScales.ts +0 -0
  196. /package/src/{assets → system/assets}/newspaper.webp +0 -0
  197. /package/src/{assets → system/assets}/offering.webp +0 -0
  198. /package/src/{components → system/components}/Button.svelte +0 -0
  199. /package/src/{components → system/components}/Callout.svelte +0 -0
  200. /package/src/{components → system/components}/CollapsibleSection.svelte +0 -0
  201. /package/src/{components → system/components}/Image.svelte +0 -0
  202. /package/src/{components → system/components}/Notification.svelte +0 -0
  203. /package/src/{components → system/components}/RadioButton.svelte +0 -0
  204. /package/src/{components → system/components}/SectionDivider.svelte +0 -0
  205. /package/src/{components → system/components}/types.ts +0 -0
  206. /package/src/{styles → system/styles}/_padding.scss +0 -0
  207. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin-ext.woff2 +0 -0
  208. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin.woff2 +0 -0
  209. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin-ext.woff2 +0 -0
  210. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin.woff2 +0 -0
  211. /package/src/{styles → system/styles}/fonts/Manrope/Manrope-latin-ext.woff2 +0 -0
  212. /package/src/{styles → system/styles}/fonts/Manrope/Manrope-latin.woff2 +0 -0
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { run } from 'svelte/legacy';
3
3
 
4
- import { copyPopover } from '../lib/copyPopover';
4
+ import { copyPopover } from './copyPopover';
5
5
 
6
6
  let bubbleEl: HTMLDivElement | null = $state(null);
7
7
  let bubbleW = $state(0);
@@ -49,7 +49,7 @@
49
49
  padding: var(--ui-space-6) var(--ui-space-10);
50
50
  background: var(--ui-surface-highest);
51
51
  color: var(--ui-text-primary);
52
- border: 1px solid var(--ui-border-medium);
52
+ border: 1px solid var(--ui-border-high);
53
53
  border-radius: var(--ui-radius-lg);
54
54
  box-shadow: var(--ui-shadow-lg);
55
55
  font-family: var(--ui-font-mono);
@@ -70,8 +70,8 @@
70
70
  width: 8px;
71
71
  height: 8px;
72
72
  background: var(--ui-surface-highest);
73
- border-right: 1px solid var(--ui-border-medium);
74
- border-bottom: 1px solid var(--ui-border-medium);
73
+ border-right: 1px solid var(--ui-border-high);
74
+ border-bottom: 1px solid var(--ui-border-high);
75
75
  transform: translateX(-50%) rotate(45deg);
76
76
  }
77
77
 
@@ -2,10 +2,10 @@
2
2
  import { run } from 'svelte/legacy';
3
3
 
4
4
  import { onMount, onDestroy } from 'svelte';
5
- import { resolveAliasChain } from '../lib/tokenRegistry';
6
- import { editorState } from '../lib/editorStore';
7
- import { CSS_VAR_CHANGE_EVENT } from '../lib/cssVarSync';
8
- import type { FontFamily, FontSource } from '../lib/themeTypes';
5
+ import { resolveAliasChain } from '../core/palettes/tokenRegistry';
6
+ import { editorState } from '../core/store/editorStore';
7
+ import { CSS_VAR_CHANGE_EVENT } from '../core/cssVarSync';
8
+ import type { FontFamily, FontSource } from '../core/themes/themeTypes';
9
9
  import UITokenSelector from './UITokenSelector.svelte';
10
10
  import UIOptionList from './UIOptionList.svelte';
11
11
  import UIOptionItem from './UIOptionItem.svelte';
@@ -260,7 +260,7 @@
260
260
 
261
261
  .pfs-divider {
262
262
  height: 1px;
263
- background: var(--ui-border-faint);
263
+ background: var(--ui-border-low);
264
264
  margin: var(--ui-space-4) 0;
265
265
  }
266
266
 
@@ -312,7 +312,7 @@
312
312
  overflow-y: auto;
313
313
  padding: var(--ui-space-4);
314
314
  background: var(--ui-surface-higher);
315
- border: 1px solid var(--ui-border-medium);
315
+ border: 1px solid var(--ui-border-high);
316
316
  border-radius: var(--ui-radius-md);
317
317
  box-shadow: var(--ui-shadow-lg);
318
318
  z-index: 1;
@@ -2,7 +2,7 @@
2
2
  import { run } from 'svelte/legacy';
3
3
 
4
4
  import { onMount, onDestroy } from 'svelte';
5
- import { CSS_VAR_CHANGE_EVENT } from '../lib/cssVarSync';
5
+ import { CSS_VAR_CHANGE_EVENT } from '../core/cssVarSync';
6
6
  import UIVariantSelector from './UIVariantSelector.svelte';
7
7
 
8
8
  interface Props {
@@ -0,0 +1,244 @@
1
+ <script lang="ts">
2
+ import { onMount, onDestroy } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ interface Props {
6
+ title: string;
7
+ ariaLabel?: string;
8
+ children?: Snippet;
9
+ }
10
+
11
+ let { title, ariaLabel, children }: Props = $props();
12
+
13
+ let open = $state(false);
14
+ let btnEl = $state<HTMLButtonElement | undefined>(undefined);
15
+ let popoverEl = $state<HTMLDivElement | undefined>(undefined);
16
+ let ready = $state(false);
17
+
18
+ function handleKeydown(e: KeyboardEvent) {
19
+ if (e.key === 'Escape' && open) open = false;
20
+ }
21
+
22
+ function handleDocumentMousedown(e: MouseEvent) {
23
+ if (!open) return;
24
+ const target = e.target as Element | null;
25
+ if (target && !target.closest('[data-info-popover-root]')) {
26
+ open = false;
27
+ }
28
+ }
29
+
30
+ onMount(() => {
31
+ window.addEventListener('keydown', handleKeydown);
32
+ document.addEventListener('mousedown', handleDocumentMousedown, true);
33
+ });
34
+
35
+ onDestroy(() => {
36
+ window.removeEventListener('keydown', handleKeydown);
37
+ document.removeEventListener('mousedown', handleDocumentMousedown, true);
38
+ });
39
+
40
+ function position(): void {
41
+ const btn = btnEl;
42
+ const pop = popoverEl;
43
+ if (!btn || !pop) return;
44
+ const br = btn.getBoundingClientRect();
45
+ const pr = pop.getBoundingClientRect();
46
+ const margin = 8;
47
+ const vw = window.innerWidth;
48
+ const vh = window.innerHeight;
49
+ let left = br.right + margin;
50
+ if (left + pr.width > vw - margin) {
51
+ left = br.left + br.width / 2 - pr.width / 2;
52
+ if (left < margin) left = margin;
53
+ if (left + pr.width > vw - margin) left = vw - margin - pr.width;
54
+ }
55
+ let top = br.bottom + margin;
56
+ if (top + pr.height > vh - margin) {
57
+ top = br.top - margin - pr.height;
58
+ if (top < margin) top = margin;
59
+ }
60
+ pop.style.left = `${left}px`;
61
+ pop.style.top = `${top}px`;
62
+ ready = true;
63
+ }
64
+
65
+ $effect(() => {
66
+ if (!open) {
67
+ ready = false;
68
+ return;
69
+ }
70
+ let raf1 = requestAnimationFrame(() => {
71
+ raf1 = requestAnimationFrame(position);
72
+ });
73
+ window.addEventListener('scroll', position, true);
74
+ window.addEventListener('resize', position);
75
+ return () => {
76
+ cancelAnimationFrame(raf1);
77
+ window.removeEventListener('scroll', position, true);
78
+ window.removeEventListener('resize', position);
79
+ };
80
+ });
81
+ </script>
82
+
83
+ <button
84
+ type="button"
85
+ class="info-btn"
86
+ aria-label={ariaLabel ?? `About ${title}`}
87
+ aria-expanded={open}
88
+ bind:this={btnEl}
89
+ data-info-popover-root
90
+ onclick={() => (open = !open)}
91
+ >
92
+ <i class="fas fa-circle-info"></i>
93
+ </button>
94
+
95
+ {#if open}
96
+ <div
97
+ class="info-popover"
98
+ class:ready
99
+ role="dialog"
100
+ aria-label={ariaLabel ?? `About ${title}`}
101
+ bind:this={popoverEl}
102
+ data-info-popover-root
103
+ >
104
+ <header class="info-header">
105
+ <span class="info-title">{title}</span>
106
+ <button
107
+ type="button"
108
+ class="info-close"
109
+ aria-label="Close"
110
+ onclick={() => (open = false)}
111
+ >
112
+ <i class="fas fa-xmark"></i>
113
+ </button>
114
+ </header>
115
+ <div class="info-body">
116
+ {@render children?.()}
117
+ </div>
118
+ </div>
119
+ {/if}
120
+
121
+ <style>
122
+ .info-btn {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ width: 22px;
127
+ height: 22px;
128
+ padding: 0;
129
+ background: transparent;
130
+ border: 0;
131
+ color: var(--ui-text-tertiary);
132
+ font-size: 0.95rem;
133
+ line-height: 1;
134
+ cursor: pointer;
135
+ transition: color var(--ui-transition-fast);
136
+ }
137
+
138
+ .info-btn:hover,
139
+ .info-btn[aria-expanded='true'] {
140
+ color: var(--ui-text-primary);
141
+ }
142
+
143
+ /* Fixed positioning escapes any parent overflow/stacking context. JS
144
+ anchors it to the right of the trigger; falls back to centered-below
145
+ then flips up near the viewport bottom. */
146
+ .info-popover {
147
+ position: fixed;
148
+ top: 0;
149
+ left: 0;
150
+ width: 22rem;
151
+ max-width: calc(100vw - var(--ui-space-24));
152
+ padding: 0;
153
+ background: var(--ui-surface-higher);
154
+ border: 1px solid var(--ui-border-high);
155
+ border-radius: var(--ui-radius-lg);
156
+ box-shadow: var(--ui-shadow-lg);
157
+ z-index: 1000;
158
+ color: var(--ui-text-secondary);
159
+ font-family: var(--ui-font-family, system-ui, sans-serif);
160
+ overflow: hidden;
161
+ visibility: hidden;
162
+ animation: info-popover-in 140ms ease-out;
163
+ }
164
+
165
+ .info-popover.ready {
166
+ visibility: visible;
167
+ }
168
+
169
+ .info-header {
170
+ display: flex;
171
+ align-items: center;
172
+ justify-content: space-between;
173
+ gap: var(--ui-space-8);
174
+ padding: var(--ui-space-8) var(--ui-space-10) var(--ui-space-8) var(--ui-space-12);
175
+ border-bottom: 1px solid var(--ui-border-low);
176
+ }
177
+
178
+ /* Header sized to the body text (xs) so the title reads as a label, not
179
+ a heading that dwarfs the prose. Weight + color carry the hierarchy. */
180
+ .info-title {
181
+ color: var(--ui-text-primary);
182
+ font-size: var(--ui-font-size-xs);
183
+ font-weight: var(--ui-font-weight-semibold);
184
+ letter-spacing: 0.02em;
185
+ line-height: 1.2;
186
+ }
187
+
188
+ .info-close {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ justify-content: center;
192
+ width: var(--ui-space-24);
193
+ height: var(--ui-space-24);
194
+ padding: 0;
195
+ background: transparent;
196
+ border: 0;
197
+ border-radius: var(--ui-radius-sm);
198
+ color: var(--ui-text-tertiary);
199
+ font-size: var(--ui-font-size-xs);
200
+ line-height: 1;
201
+ cursor: pointer;
202
+ transition: color var(--ui-transition-fast), background var(--ui-transition-fast);
203
+ }
204
+
205
+ .info-close:hover {
206
+ color: var(--ui-text-primary);
207
+ background: var(--ui-hover);
208
+ }
209
+
210
+ .info-body {
211
+ padding: var(--ui-space-12) var(--ui-space-16);
212
+ }
213
+
214
+ .info-popover :global(p) {
215
+ margin: 0 0 var(--ui-space-12) 0;
216
+ font-size: var(--ui-font-size-xs);
217
+ line-height: 1.55;
218
+ }
219
+
220
+ .info-popover :global(p:last-child) {
221
+ margin-bottom: 0;
222
+ }
223
+
224
+ .info-popover :global(strong) {
225
+ color: var(--ui-text-primary);
226
+ font-weight: var(--ui-font-weight-semibold);
227
+ }
228
+
229
+ .info-popover :global(em) {
230
+ font-style: italic;
231
+ color: var(--ui-text-primary);
232
+ }
233
+
234
+ .info-popover :global(code) {
235
+ font-family: var(--ui-font-family-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
236
+ font-size: 0.92em;
237
+ color: var(--ui-text-primary);
238
+ }
239
+
240
+ @keyframes info-popover-in {
241
+ from { opacity: 0; transform: translateY(-3px); }
242
+ to { opacity: 1; transform: translateY(0); }
243
+ }
244
+ </style>
@@ -21,11 +21,11 @@
21
21
  }: Props = $props();
22
22
 
23
23
  const options = [
24
- { key: 'tight', label: 'Tight', value: '1' },
25
- { key: 'snug', label: 'Snug', value: '1.2' },
26
- { key: 'normal', label: 'Normal', value: '1.4' },
27
- { key: 'relaxed', label: 'Relaxed', value: '1.5' },
28
- { key: 'loose', label: 'Loose', value: '2' },
24
+ { key: 'xs', label: 'Extra Small', value: '1' },
25
+ { key: 'sm', label: 'Small', value: '1.25' },
26
+ { key: 'md', label: 'Medium', value: '1.5' },
27
+ { key: 'lg', label: 'Large', value: '1.75' },
28
+ { key: 'xl', label: 'Extra Large', value: '2' },
29
29
  ] as const;
30
30
  </script>
31
31
 
@@ -31,7 +31,7 @@
31
31
  padding: var(--ui-space-2) var(--ui-space-8);
32
32
  height: 1.5rem;
33
33
  background: none;
34
- border: 1px solid var(--ui-border-default);
34
+ border: 1px solid var(--ui-border);
35
35
  border-radius: var(--ui-radius-sm);
36
36
  color: var(--ui-text-secondary);
37
37
  font-family: inherit;
@@ -47,7 +47,7 @@
47
47
  .ui-link-toggle:hover {
48
48
  color: var(--ui-text-primary);
49
49
  background: var(--ui-hover);
50
- border-color: var(--ui-border-strong);
50
+ border-color: var(--ui-border-higher);
51
51
  }
52
52
 
53
53
  .ui-link-toggle.linked {
@@ -7,7 +7,7 @@
7
7
  import UITokenSelector from './UITokenSelector.svelte';
8
8
  import UIOptionList from './UIOptionList.svelte';
9
9
  import UIOptionItem from './UIOptionItem.svelte';
10
- import { setCssVar, removeCssVar, CSS_VAR_CHANGE_EVENT } from '../lib/cssVarSync';
10
+ import { setCssVar, removeCssVar, CSS_VAR_CHANGE_EVENT } from '../core/cssVarSync';
11
11
  import {
12
12
  editorState,
13
13
  setComponentAlias,
@@ -17,7 +17,7 @@
17
17
  setComponentAliasLinked,
18
18
  unlinkComponentProperty,
19
19
  relinkComponentProperty,
20
- } from '../lib/editorStore';
20
+ } from '../core/store/editorStore';
21
21
  import UIRelinkConfirmPopover from './UIRelinkConfirmPopover.svelte';
22
22
  import UILinkToggle from './UILinkToggle.svelte';
23
23
 
@@ -555,7 +555,7 @@
555
555
  height: 1.75rem;
556
556
  padding: 0;
557
557
  background: var(--ui-surface-low);
558
- border: 1px solid var(--ui-border-default);
558
+ border: 1px solid var(--ui-border);
559
559
  border-radius: var(--ui-radius-sm);
560
560
  color: var(--ui-text-secondary);
561
561
  font-size: var(--ui-font-size-sm);
@@ -565,7 +565,7 @@
565
565
  }
566
566
 
567
567
  .split-btn:hover:not(:disabled) {
568
- border-color: var(--ui-border-strong);
568
+ border-color: var(--ui-border-higher);
569
569
  background: var(--ui-surface-high);
570
570
  color: var(--ui-text-primary);
571
571
  }
@@ -601,7 +601,7 @@
601
601
  padding: var(--ui-space-4) var(--ui-space-8);
602
602
  height: 1.5rem;
603
603
  background: none;
604
- border: 1px solid var(--ui-border-subtle);
604
+ border: 1px solid var(--ui-border-low);
605
605
  border-radius: var(--ui-radius-sm);
606
606
  color: var(--ui-text-muted);
607
607
  font-family: inherit;
@@ -613,7 +613,7 @@
613
613
  .merge-btn:hover:not(:disabled) {
614
614
  background: var(--ui-hover);
615
615
  color: var(--ui-text-primary);
616
- border-color: var(--ui-border-default);
616
+ border-color: var(--ui-border);
617
617
  }
618
618
 
619
619
  .merge-btn:disabled {
@@ -3,10 +3,10 @@
3
3
 
4
4
  import { slide } from 'svelte/transition';
5
5
  import { cubicOut, cubicIn } from 'svelte/easing';
6
- import { resolveAliasChain } from '../lib/tokenRegistry';
7
- import { editorState } from '../lib/editorStore';
8
- import { formatGradientStops } from '../lib/slices/gradients';
9
- import type { GradientToken } from '../lib/editorTypes';
6
+ import { resolveAliasChain } from '../core/palettes/tokenRegistry';
7
+ import { editorState } from '../core/store/editorStore';
8
+ import { formatGradientStops } from '../core/themes/slices/gradients';
9
+ import type { GradientToken } from '../core/store/editorTypes';
10
10
  import UITokenSelector from './UITokenSelector.svelte';
11
11
 
12
12
  /** Honor prefers-reduced-motion: `t()` zeroes durations when the OS asks for
@@ -698,11 +698,11 @@
698
698
  align-self: stretch;
699
699
  flex: 1;
700
700
  border-radius: var(--ui-radius-sm);
701
- border: 1px solid var(--ui-border-faint);
702
- background-image: linear-gradient(45deg, var(--ui-border-subtle) 25%, transparent 25%),
703
- linear-gradient(-45deg, var(--ui-border-subtle) 25%, transparent 25%),
704
- linear-gradient(45deg, transparent 75%, var(--ui-border-subtle) 75%),
705
- linear-gradient(-45deg, transparent 75%, var(--ui-border-subtle) 75%);
701
+ border: 1px solid var(--ui-border-low);
702
+ background-image: linear-gradient(45deg, var(--ui-border-low) 25%, transparent 25%),
703
+ linear-gradient(-45deg, var(--ui-border-low) 25%, transparent 25%),
704
+ linear-gradient(45deg, transparent 75%, var(--ui-border-low) 75%),
705
+ linear-gradient(-45deg, transparent 75%, var(--ui-border-low) 75%);
706
706
  background-size: 8px 8px;
707
707
  background-position: 0 0, 0 4px, 4px -4px, -4px 0;
708
708
  overflow: hidden;
@@ -718,7 +718,7 @@
718
718
  align-items: center;
719
719
  gap: var(--ui-space-6);
720
720
  padding: var(--ui-space-6) var(--ui-space-8);
721
- border-bottom: 1px solid var(--ui-border-faint);
721
+ border-bottom: 1px solid var(--ui-border-low);
722
722
  }
723
723
 
724
724
  .opacity-control.hidden {
@@ -736,7 +736,7 @@
736
736
  height: 4px;
737
737
  -webkit-appearance: none;
738
738
  appearance: none;
739
- background: var(--ui-border-default);
739
+ background: var(--ui-border);
740
740
  border-radius: 2px;
741
741
  outline: none;
742
742
  cursor: pointer;
@@ -755,7 +755,7 @@
755
755
  width: 3rem;
756
756
  padding: var(--ui-space-2) var(--ui-space-4);
757
757
  background: var(--ui-surface-lowest);
758
- border: 1px solid var(--ui-border-subtle);
758
+ border: 1px solid var(--ui-border-low);
759
759
  border-radius: var(--ui-radius-sm);
760
760
  color: var(--ui-text-primary);
761
761
  font-size: var(--ui-font-size-xs);
@@ -784,7 +784,7 @@
784
784
  padding: var(--ui-space-8) var(--ui-space-10);
785
785
  background: none;
786
786
  border: none;
787
- border-bottom: 1px solid var(--ui-border-faint);
787
+ border-bottom: 1px solid var(--ui-border-low);
788
788
  color: var(--ui-text-secondary);
789
789
  font-size: var(--ui-font-size-sm);
790
790
  font-weight: var(--ui-font-weight-medium);
@@ -802,7 +802,7 @@
802
802
 
803
803
  .tab-bar {
804
804
  display: flex;
805
- border-bottom: 1px solid var(--ui-border-faint);
805
+ border-bottom: 1px solid var(--ui-border-low);
806
806
  }
807
807
 
808
808
  .tab-btn {
@@ -825,7 +825,7 @@
825
825
  }
826
826
 
827
827
  .tab-btn.assigned {
828
- border-color: var(--ui-border-default);
828
+ border-color: var(--ui-border);
829
829
  }
830
830
 
831
831
  .tab-btn.selected {
@@ -881,7 +881,7 @@
881
881
  width: 2.5rem;
882
882
  height: 0.75rem;
883
883
  border-radius: 2px;
884
- border: 1px solid var(--ui-border-subtle);
884
+ border: 1px solid var(--ui-border-low);
885
885
  position: relative;
886
886
  overflow: hidden;
887
887
  }
@@ -890,7 +890,7 @@
890
890
  width: 2.5rem;
891
891
  height: 0.75rem;
892
892
  border-radius: 2px;
893
- border: 1px solid var(--ui-border-subtle);
893
+ border: 1px solid var(--ui-border-low);
894
894
  }
895
895
 
896
896
  .family-divider {
@@ -901,7 +901,7 @@
901
901
  color: var(--ui-text-tertiary);
902
902
  text-transform: uppercase;
903
903
  letter-spacing: 0.04em;
904
- border-top: 1px solid var(--ui-border-faint);
904
+ border-top: 1px solid var(--ui-border-low);
905
905
  }
906
906
 
907
907
  .none-swatch::after {
@@ -915,8 +915,8 @@
915
915
  -45deg,
916
916
  transparent,
917
917
  transparent 3px,
918
- var(--ui-border-subtle) 3px,
919
- var(--ui-border-subtle) 4px
918
+ var(--ui-border-low) 3px,
919
+ var(--ui-border-low) 4px
920
920
  );
921
921
  }
922
922
 
@@ -954,7 +954,7 @@
954
954
 
955
955
  .step-item:hover {
956
956
  background: var(--ui-hover);
957
- border-color: var(--ui-border-default);
957
+ border-color: var(--ui-border);
958
958
  }
959
959
 
960
960
  .step-item.active {
@@ -973,7 +973,7 @@
973
973
  width: 2rem;
974
974
  height: 1.5rem;
975
975
  border-radius: var(--ui-radius-sm);
976
- border: 1px solid var(--ui-border-faint);
976
+ border: 1px solid var(--ui-border-low);
977
977
  }
978
978
 
979
979
  .step-label {
@@ -1020,7 +1020,7 @@
1020
1020
 
1021
1021
  .orientation-reset.active {
1022
1022
  color: var(--ui-link-broken, var(--ui-text-secondary));
1023
- border-color: var(--ui-border-subtle);
1023
+ border-color: var(--ui-border-low);
1024
1024
  }
1025
1025
 
1026
1026
  .orientation-reset:hover:not(:disabled) {
@@ -1055,7 +1055,7 @@
1055
1055
  justify-content: center;
1056
1056
  padding: 0;
1057
1057
  background: var(--ui-surface-lowest);
1058
- border: 1px solid var(--ui-border-subtle);
1058
+ border: 1px solid var(--ui-border-low);
1059
1059
  border-radius: var(--ui-radius-sm);
1060
1060
  color: var(--ui-text-secondary);
1061
1061
  font-size: 0.875rem;
@@ -1066,7 +1066,7 @@
1066
1066
 
1067
1067
  .dir-btn:hover {
1068
1068
  background: var(--ui-hover);
1069
- border-color: var(--ui-border-default);
1069
+ border-color: var(--ui-border);
1070
1070
  color: var(--ui-text-primary);
1071
1071
  }
1072
1072
 
@@ -1086,7 +1086,7 @@
1086
1086
  width: 3rem;
1087
1087
  padding: var(--ui-space-2) var(--ui-space-4);
1088
1088
  background: var(--ui-surface-lowest);
1089
- border: 1px solid var(--ui-border-subtle);
1089
+ border: 1px solid var(--ui-border-low);
1090
1090
  border-radius: var(--ui-radius-sm);
1091
1091
  color: var(--ui-text-primary);
1092
1092
  font-size: var(--ui-font-size-xs);