@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
@@ -0,0 +1,172 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface Props {
5
+ variant?: 'primary' | 'default' | 'secondary' | 'success';
6
+ size?: 'default' | 'compact';
7
+ icon?: string;
8
+ href?: string;
9
+ target?: string;
10
+ disabled?: boolean;
11
+ active?: boolean;
12
+ title?: string;
13
+ type?: 'button' | 'submit' | 'reset';
14
+ onclick?: (e: MouseEvent) => void;
15
+ children?: Snippet;
16
+ }
17
+
18
+ let {
19
+ variant = 'default',
20
+ size = 'default',
21
+ icon,
22
+ href,
23
+ target,
24
+ disabled = false,
25
+ active = false,
26
+ title,
27
+ type = 'button',
28
+ onclick,
29
+ children,
30
+ }: Props = $props();
31
+ </script>
32
+
33
+ {#if href}
34
+ <a
35
+ class="ui-sq ui-sq-{variant} ui-sq-{size}"
36
+ class:active
37
+ {href}
38
+ {target}
39
+ {title}
40
+ {onclick}
41
+ rel={target === '_blank' ? 'noopener noreferrer' : undefined}
42
+ aria-disabled={disabled ? 'true' : undefined}
43
+ >
44
+ {#if icon}<i class="fas {icon}" aria-hidden="true"></i>{/if}
45
+ {#if children}{@render children()}{/if}
46
+ </a>
47
+ {:else}
48
+ <button
49
+ class="ui-sq ui-sq-{variant} ui-sq-{size}"
50
+ class:active
51
+ {type}
52
+ {disabled}
53
+ {title}
54
+ {onclick}
55
+ >
56
+ {#if icon}<i class="fas {icon}" aria-hidden="true"></i>{/if}
57
+ {#if children}{@render children()}{/if}
58
+ </button>
59
+ {/if}
60
+
61
+ <style>
62
+ .ui-sq {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ gap: var(--ui-space-6);
66
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.25) 100%);
67
+ border: 1px solid rgba(255, 255, 255, 0.5);
68
+ color: var(--ui-text-primary);
69
+ font-family: inherit;
70
+ font-size: var(--ui-font-size-md);
71
+ font-weight: var(--ui-font-weight-medium);
72
+ line-height: 1;
73
+ padding: var(--ui-space-6) var(--ui-space-16);
74
+ border-radius: var(--ui-radius-md);
75
+ cursor: pointer;
76
+ text-decoration: none;
77
+ white-space: nowrap;
78
+ transition: background var(--ui-transition-fast), border-color var(--ui-transition-fast);
79
+ }
80
+
81
+ .ui-sq:hover:not(:disabled):not([aria-disabled='true']) {
82
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.25) 0%, rgba(255, 255, 255, 0.45) 100%);
83
+ border-color: rgba(255, 255, 255, 0.75);
84
+ }
85
+
86
+ .ui-sq.active {
87
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.28) 0%, rgba(255, 255, 255, 0.42) 100%);
88
+ border-color: rgba(255, 255, 255, 0.7);
89
+ }
90
+
91
+ .ui-sq:disabled,
92
+ .ui-sq[aria-disabled='true'] {
93
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.10) 100%);
94
+ border-color: rgba(255, 255, 255, 0.22);
95
+ color: var(--ui-text-muted);
96
+ cursor: not-allowed;
97
+ pointer-events: none;
98
+ }
99
+ .ui-sq:disabled i,
100
+ .ui-sq[aria-disabled='true'] i {
101
+ color: rgba(255, 255, 255, 0.28);
102
+ }
103
+
104
+ .ui-sq i {
105
+ font-size: var(--ui-font-size-xs);
106
+ color: rgba(255, 255, 255, 0.65);
107
+ }
108
+
109
+ .ui-sq i.fa-spinner {
110
+ animation: ui-sq-spin 1s linear infinite;
111
+ }
112
+
113
+ @keyframes ui-sq-spin {
114
+ to { transform: rotate(360deg); }
115
+ }
116
+
117
+ /* Variant: primary — heavier gradient + brighter border for CTAs */
118
+ .ui-sq-primary {
119
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.18) 0%, rgba(255, 255, 255, 0.08) 100%);
120
+ border-color: rgba(255, 255, 255, 0.55);
121
+ }
122
+ .ui-sq-primary:hover:not(:disabled):not([aria-disabled='true']) {
123
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0.12) 100%);
124
+ border-color: rgba(255, 255, 255, 0.7);
125
+ }
126
+ .ui-sq-primary:disabled,
127
+ .ui-sq-primary[aria-disabled='true'] {
128
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.07) 0%, rgba(255, 255, 255, 0.03) 100%);
129
+ border-color: rgba(255, 255, 255, 0.24);
130
+ }
131
+
132
+ /* Variant: secondary — lighter, for low-emphasis actions */
133
+ .ui-sq-secondary {
134
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
135
+ border-color: rgba(255, 255, 255, 0.30);
136
+ }
137
+ .ui-sq-secondary:hover:not(:disabled):not([aria-disabled='true']) {
138
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.12) 0%, rgba(255, 255, 255, 0.05) 100%);
139
+ border-color: rgba(255, 255, 255, 0.5);
140
+ }
141
+ .ui-sq-secondary:disabled,
142
+ .ui-sq-secondary[aria-disabled='true'] {
143
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.01) 100%);
144
+ border-color: rgba(255, 255, 255, 0.14);
145
+ }
146
+
147
+ /* Variant: success — green gradient for adopt/apply CTAs. Same gradient
148
+ shape as primary, swapping white for the success hue. */
149
+ .ui-sq-success {
150
+ background: linear-gradient(180deg, rgba(90, 168, 94, 0.35) 0%, rgba(90, 168, 94, 0.18) 100%);
151
+ border-color: rgba(90, 168, 94, 0.60);
152
+ }
153
+ .ui-sq-success:hover:not(:disabled):not([aria-disabled='true']) {
154
+ background: linear-gradient(180deg, rgba(90, 168, 94, 0.48) 0%, rgba(90, 168, 94, 0.26) 100%);
155
+ border-color: rgba(90, 168, 94, 0.78);
156
+ }
157
+ .ui-sq-success:disabled,
158
+ .ui-sq-success[aria-disabled='true'] {
159
+ background: linear-gradient(180deg, rgba(90, 168, 94, 0.10) 0%, rgba(90, 168, 94, 0.04) 100%);
160
+ border-color: rgba(90, 168, 94, 0.25);
161
+ }
162
+
163
+ .ui-sq-compact {
164
+ font-size: var(--ui-font-size-sm);
165
+ padding: var(--ui-space-2) var(--ui-space-12);
166
+ }
167
+
168
+ @media (max-width: 640px) {
169
+ .ui-sq :global(span:not(.chevron)) { display: none; }
170
+ .ui-sq { padding: var(--ui-space-6) var(--ui-space-10); }
171
+ }
172
+ </style>
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { onMount, onDestroy } from 'svelte';
3
3
  import type { Snippet } from 'svelte';
4
- import { setCssVar, removeCssVar, CSS_VAR_CHANGE_EVENT } from '../lib/cssVarSync';
5
- import type { CssVarRef } from '../lib/editorTypes';
4
+ import { setCssVar, removeCssVar, CSS_VAR_CHANGE_EVENT } from '../core/cssVarSync';
5
+ import type { CssVarRef } from '../core/store/editorTypes';
6
6
  import {
7
7
  editorState,
8
8
  setComponentAlias,
@@ -13,7 +13,7 @@
13
13
  unlinkComponentProperty,
14
14
  relinkComponentProperty,
15
15
  getComponentPropertySiblings,
16
- } from '../lib/editorStore';
16
+ } from '../core/store/editorStore';
17
17
  import UILinkToggle from './UILinkToggle.svelte';
18
18
  import UIRelinkConfirmPopover from './UIRelinkConfirmPopover.svelte';
19
19
  import { keepInViewport } from './keepInViewport';
@@ -325,7 +325,10 @@
325
325
  </div>
326
326
 
327
327
  {#if triggerMeta}
328
- <span class="ui-ts-meta-text">{@render triggerMeta()}</span>
328
+ <span
329
+ class="ui-ts-meta-text"
330
+ onmouseenter={(e) => { e.currentTarget.title = e.currentTarget.textContent ?? ''; }}
331
+ >{@render triggerMeta()}</span>
329
332
  {/if}
330
333
  </div>
331
334
 
@@ -354,7 +357,7 @@
354
357
  }
355
358
 
356
359
  .ui-token-selector.disabled .ui-ts-trigger:hover {
357
- border-color: var(--ui-border-default);
360
+ border-color: var(--ui-border);
358
361
  background: var(--ui-surface-low);
359
362
  }
360
363
 
@@ -364,7 +367,7 @@
364
367
  gap: var(--ui-space-6);
365
368
  padding: var(--ui-space-2) var(--ui-space-8);
366
369
  background: var(--ui-surface-low);
367
- border: 1px solid var(--ui-border-default);
370
+ border: 1px solid var(--ui-border);
368
371
  border-radius: var(--ui-radius-md);
369
372
  cursor: pointer;
370
373
  transition: all var(--ui-transition-fast);
@@ -409,7 +412,7 @@
409
412
  }
410
413
 
411
414
  .ui-ts-trigger:hover {
412
- border-color: var(--ui-border-strong);
415
+ border-color: var(--ui-border-higher);
413
416
  background: var(--ui-surface-high);
414
417
  }
415
418
 
@@ -499,7 +502,7 @@
499
502
  top: calc(100% + var(--ui-space-4));
500
503
  left: 0;
501
504
  background: var(--ui-surface-higher);
502
- border: 1px solid var(--ui-border-medium);
505
+ border: 1px solid var(--ui-border-high);
503
506
  border-radius: var(--ui-radius-md);
504
507
  box-shadow: var(--ui-shadow-lg);
505
508
  z-index: 10;
@@ -511,7 +514,7 @@
511
514
  justify-content: flex-end;
512
515
  gap: var(--ui-space-6);
513
516
  padding: var(--ui-space-6) var(--ui-space-8);
514
- border-bottom: 1px solid var(--ui-border-faint);
517
+ border-bottom: 1px solid var(--ui-border-low);
515
518
  }
516
519
 
517
520
  .ui-ts-reset {
@@ -521,7 +524,7 @@
521
524
  height: 1.5rem;
522
525
  padding: var(--ui-space-2) var(--ui-space-8);
523
526
  background: none;
524
- border: 1px solid var(--ui-border-default);
527
+ border: 1px solid var(--ui-border);
525
528
  border-radius: var(--ui-radius-sm);
526
529
  color: var(--ui-text-secondary);
527
530
  font-family: inherit;
@@ -537,7 +540,7 @@
537
540
 
538
541
  .ui-ts-reset:hover:not(:disabled) {
539
542
  background: var(--ui-hover);
540
- border-color: var(--ui-border-strong);
543
+ border-color: var(--ui-border-higher);
541
544
  color: var(--ui-text-primary);
542
545
  }
543
546
 
@@ -1,6 +1,6 @@
1
1
  <script lang="ts" generics="T extends { key: string; label?: string; value?: string }">
2
2
  import type { Snippet } from 'svelte';
3
- import { resolveAliasChain } from '../lib/tokenRegistry';
3
+ import { resolveAliasChain } from '../core/palettes/tokenRegistry';
4
4
  import UITokenSelector from './UITokenSelector.svelte';
5
5
  import UIOptionList from './UIOptionList.svelte';
6
6
  import UIOptionItem from './UIOptionItem.svelte';
@@ -40,6 +40,7 @@
40
40
  copiedVar = v;
41
41
  setTimeout(() => { copiedVar = null; }, COPIED_FLASH_MS);
42
42
  }
43
+
43
44
  </script>
44
45
 
45
46
  <div class="variables-container">
@@ -64,10 +65,16 @@
64
65
  <!-- Spacing & Borders -->
65
66
  <section class="section" id="spacing">
66
67
  <h2 class="section-title">Spacing &amp; Borders</h2>
67
- <h3 class="subsection-title">Spacing</h3>
68
- <TokenScaleTable kind="spacing" vars={SPACING_VARS} {liveVersion} {copiedVar} oncopy={copyVariable} />
69
- <h3 class="subsection-title">Borders</h3>
70
- <TokenScaleTable kind="border" vars={BORDER_WIDTH_VARS} {liveVersion} {copiedVar} oncopy={copyVariable} />
68
+ <div class="spacing-borders-columns">
69
+ <div class="spacing-borders-group">
70
+ <h3 class="subsection-title">Spacing</h3>
71
+ <TokenScaleTable kind="spacing" vars={SPACING_VARS} {liveVersion} {copiedVar} oncopy={copyVariable} />
72
+ </div>
73
+ <div class="spacing-borders-group">
74
+ <h3 class="subsection-title">Borders</h3>
75
+ <TokenScaleTable kind="border" vars={BORDER_WIDTH_VARS} {liveVersion} {copiedVar} oncopy={copyVariable} />
76
+ </div>
77
+ </div>
71
78
  </section>
72
79
 
73
80
  <!-- Columns -->
@@ -150,46 +157,65 @@
150
157
  .variables-container {
151
158
  display: flex;
152
159
  flex-direction: column;
153
- gap: var(--ui-space-32);
160
+ gap: var(--ui-space-48);
154
161
  }
155
162
 
156
163
  .section {
157
164
  display: flex;
158
165
  flex-direction: column;
159
- gap: var(--ui-space-16);
166
+ gap: var(--ui-space-24);
160
167
  }
161
168
 
162
169
  .section-title {
163
- font-size: var(--ui-font-size-lg);
170
+ font-size: var(--ui-font-size-2xl);
164
171
  font-weight: var(--ui-font-weight-semibold);
165
172
  color: var(--ui-text-primary);
166
173
  margin: 0;
167
174
  padding-bottom: var(--ui-space-8);
168
- border-bottom: 1px solid var(--ui-border-subtle);
175
+ border-bottom: 2px solid var(--ui-border-high);
169
176
  }
170
177
 
178
+ /* Tier-2 group header: xl bold white. No divider — vertical rhythm carries the
179
+ separation, matching the palette section's title style at a smaller size. */
171
180
  .group-title {
172
- font-size: var(--ui-font-size-md);
173
- font-weight: var(--ui-font-weight-semibold);
174
- color: var(--ui-text-secondary);
181
+ font-size: var(--ui-font-size-xl);
182
+ font-weight: var(--ui-font-weight-bold);
183
+ color: var(--ui-text-primary);
175
184
  margin: 0;
176
185
  }
177
186
 
178
187
  /* Subsection title (used by Spacing & Borders) */
179
188
  .subsection-title {
180
189
  margin: var(--ui-space-16) 0 var(--ui-space-8);
181
- font-size: var(--ui-font-size-sm);
190
+ font-size: var(--ui-font-size-xs);
182
191
  font-weight: var(--ui-font-weight-semibold);
183
- color: var(--ui-text-secondary);
192
+ color: var(--ui-text-tertiary);
184
193
  text-transform: uppercase;
185
- letter-spacing: 0.04em;
186
194
  }
187
195
 
188
- .subsection-title:first-child,
189
- .section-title + .subsection-title {
196
+ .subsection-title:first-child {
190
197
  margin-top: 0;
191
198
  }
192
199
 
200
+ /* Spacing & Borders columns */
201
+ .spacing-borders-columns {
202
+ display: grid;
203
+ grid-template-columns: repeat(auto-fill, minmax(min(20rem, 100%), 1fr));
204
+ gap: var(--ui-space-24);
205
+ align-items: start;
206
+ }
207
+
208
+ .spacing-borders-group {
209
+ display: flex;
210
+ flex-direction: column;
211
+ gap: var(--ui-space-8);
212
+ min-width: 0;
213
+ }
214
+
215
+ .spacing-borders-group .subsection-title {
216
+ margin: 0;
217
+ }
218
+
193
219
  /* Typography */
194
220
  .typography-columns {
195
221
  display: grid;
@@ -201,12 +227,15 @@
201
227
  .typography-group {
202
228
  display: flex;
203
229
  flex-direction: column;
204
- gap: var(--ui-space-8);
230
+ gap: var(--ui-space-12);
205
231
  min-width: 0;
206
232
  }
207
233
 
208
234
  .font-families-group {
209
235
  grid-column: 1 / -1;
236
+ /* Two logical groups stacked here (Project Fonts + Font Families); space them
237
+ further apart than peers inside a single group. */
238
+ gap: var(--ui-space-32);
210
239
  }
211
240
 
212
241
  /* Utility Tokens */
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { stopPropagation } from 'svelte/legacy';
3
3
 
4
- import type { GradientStyle, GradientStop } from '../../lib/themeTypes';
5
- import { beginSliderGesture } from '../../lib/editorStore';
4
+ import type { GradientStyle, GradientStop } from '../../core/themes/themeTypes';
5
+ import { beginSliderGesture } from '../../core/store/editorStore';
6
6
 
7
7
  /**
8
8
  * Gradient style + stop editor (the bar, draggable handles, and selected-
@@ -296,7 +296,7 @@
296
296
  margin-top: var(--ui-space-8);
297
297
  padding: var(--ui-space-12);
298
298
  background: var(--ui-surface-low);
299
- border: 1px solid var(--ui-border-faint);
299
+ border: 1px solid var(--ui-border-low);
300
300
  border-radius: var(--ui-radius-lg);
301
301
  display: flex;
302
302
  flex-direction: column;
@@ -324,7 +324,7 @@
324
324
  .style-btn {
325
325
  width: 28px;
326
326
  height: 28px;
327
- border: 1px solid var(--ui-border-subtle);
327
+ border: 1px solid var(--ui-border-low);
328
328
  border-radius: var(--ui-radius-md);
329
329
  background: var(--ui-surface-lowest);
330
330
  color: var(--ui-text-secondary);
@@ -343,7 +343,7 @@
343
343
  }
344
344
 
345
345
  .style-btn:hover {
346
- border-color: var(--ui-border-medium);
346
+ border-color: var(--ui-border-high);
347
347
  }
348
348
 
349
349
  .size-btn {
@@ -357,7 +357,7 @@
357
357
  padding: 2px 6px;
358
358
  font-size: var(--ui-font-size-md);
359
359
  background: var(--ui-surface-lowest);
360
- border: 1px solid var(--ui-border-subtle);
360
+ border: 1px solid var(--ui-border-low);
361
361
  border-radius: var(--ui-radius-md);
362
362
  color: var(--ui-text-primary);
363
363
  text-align: center;
@@ -394,7 +394,7 @@
394
394
  padding: 2px 6px;
395
395
  font-size: var(--ui-font-size-md);
396
396
  background: var(--ui-surface-lowest);
397
- border: 1px solid var(--ui-border-subtle);
397
+ border: 1px solid var(--ui-border-low);
398
398
  border-radius: var(--ui-radius-md);
399
399
  color: var(--ui-text-primary);
400
400
  }
@@ -403,7 +403,7 @@
403
403
  width: 20px;
404
404
  height: 20px;
405
405
  border-radius: var(--ui-radius-sm);
406
- border: 1px solid var(--ui-border-subtle);
406
+ border: 1px solid var(--ui-border-low);
407
407
  flex-shrink: 0;
408
408
  }
409
409
 
@@ -423,7 +423,7 @@
423
423
  position: relative;
424
424
  height: 24px;
425
425
  border-radius: var(--ui-radius-md);
426
- border: 1px solid var(--ui-border-subtle);
426
+ border: 1px solid var(--ui-border-low);
427
427
  cursor: crosshair;
428
428
  }
429
429
 
@@ -446,7 +446,7 @@
446
446
  width: 16px;
447
447
  height: 16px;
448
448
  border-radius: var(--ui-radius-sm);
449
- border: 2px solid var(--ui-border-medium);
449
+ border: 2px solid var(--ui-border-high);
450
450
  flex-shrink: 0;
451
451
  }
452
452
 
@@ -463,7 +463,7 @@
463
463
  height: 0;
464
464
  border-left: 4px solid transparent;
465
465
  border-right: 4px solid transparent;
466
- border-top: 6px solid var(--ui-border-medium);
466
+ border-top: 6px solid var(--ui-border-high);
467
467
  }
468
468
 
469
469
  .gradient-stop-handle.selected .stop-arrow {
@@ -481,7 +481,7 @@
481
481
  .stop-remove-btn {
482
482
  width: 20px;
483
483
  height: 20px;
484
- border: 1px solid var(--ui-border-subtle);
484
+ border: 1px solid var(--ui-border-low);
485
485
  border-radius: var(--ui-radius-md);
486
486
  background: var(--ui-surface-lowest);
487
487
  color: var(--ui-text-tertiary);
@@ -495,7 +495,7 @@
495
495
  }
496
496
 
497
497
  .stop-remove-btn:hover {
498
- border-color: var(--ui-border-strong);
498
+ border-color: var(--ui-border-higher);
499
499
  color: var(--ui-text-primary);
500
500
  }
501
501
  </style>
@@ -1,7 +1,8 @@
1
1
  <script lang="ts">
2
2
  import ScaleCurveEditor from './ScaleCurveEditor.svelte';
3
+ import UIPillButton from '../UIPillButton.svelte';
3
4
  import { type CurveAnchor, lightnessCurveConfig, saturationCurveConfig, textLightnessCurveConfig } from '../curveEngine';
4
- import { scaleToCssVar } from '../../lib/paletteDerivation';
5
+ import { scaleToCssVar } from '../../core/palettes/paletteDerivation';
5
6
 
6
7
  /**
7
8
  * Per-scale derived swatch section used for Text, Surfaces, and Borders
@@ -126,19 +127,16 @@
126
127
  <div class="scale-header">
127
128
  <h4 class="scale-title">{scale.title}</h4>
128
129
  {#if supportsSnap}
129
- <button
130
- class="edit-toggle"
131
- class:active={snapped}
132
- type="button"
130
+ <UIPillButton
131
+ size="compact"
132
+ variant={snapped ? 'primary' : 'outline'}
133
133
  onclick={() => onToggleSnap(scale)}
134
- >{snapped ? 'Unsnap' : 'Snap All'}</button>
134
+ >{snapped ? 'Unsnap' : 'Snap All'}</UIPillButton>
135
135
  {/if}
136
- <button class="edit-toggle" type="button" onclick={() => onClearScaleOverrides(scale)}>Clear Overrides</button>
137
- <button
138
- class="edit-toggle"
139
- type="button"
140
- onclick={() => onToggleEditor(scale.title)}
141
- >{editorOpen ? 'Close' : 'Edit'}</button>
136
+ <UIPillButton size="compact" variant="outline" onclick={() => onClearScaleOverrides(scale)}>Clear Overrides</UIPillButton>
137
+ <UIPillButton size="compact" variant="outline" onclick={() => onToggleEditor(scale.title)}>
138
+ {editorOpen ? 'Close' : 'Edit'}
139
+ </UIPillButton>
142
140
  </div>
143
141
  <div class="swatch-grid" style="--swatch-cols: {scale.steps.length}; --swatch-gap: var(--ui-space-8)">
144
142
  {#each scale.steps as step}
@@ -276,36 +274,15 @@
276
274
  display: flex;
277
275
  align-items: center;
278
276
  gap: var(--ui-space-8);
277
+ padding-bottom: 0.5rem;
279
278
  }
280
279
 
281
280
  .scale-title {
282
- font-size: var(--ui-font-size-md);
283
- font-weight: var(--ui-font-weight-semibold);
284
- color: var(--ui-text-tertiary);
285
- margin: 0;
286
- text-transform: uppercase;
287
- letter-spacing: 0.05em;
288
- }
289
-
290
- .edit-toggle {
291
- font-size: var(--ui-font-size-md);
292
- color: var(--ui-text-tertiary);
293
- background: none;
294
- border: 1px solid var(--ui-border-subtle);
295
- border-radius: var(--ui-radius-sm);
296
- padding: var(--ui-space-2) var(--ui-space-6);
297
- cursor: pointer;
298
- }
299
-
300
- .edit-toggle:hover {
301
- color: var(--ui-text-primary);
302
- border-color: var(--ui-border-medium);
303
- }
304
-
305
- .edit-toggle.active {
281
+ font-size: var(--ui-font-size-lg);
282
+ font-weight: var(--ui-font-weight-bold);
306
283
  color: var(--ui-text-primary);
307
- border-color: var(--ui-border-medium);
308
- background: var(--ui-surface-high);
284
+ margin: 0;
285
+ padding-right: 1rem;
309
286
  }
310
287
 
311
288
  .swatch-grid {
@@ -368,7 +345,7 @@
368
345
  width: 100%;
369
346
  height: 2rem;
370
347
  border-radius: var(--ui-radius-sm);
371
- border: 1px solid var(--ui-border-faint);
348
+ border: 1px solid var(--ui-border-low);
372
349
  }
373
350
 
374
351
  .swatch.text-swatch {
@@ -395,7 +372,7 @@
395
372
  }
396
373
 
397
374
  .swatch.derived.clickable:hover {
398
- outline: 2px solid var(--ui-border-medium);
375
+ outline: 2px solid var(--ui-border-high);
399
376
  outline-offset: 1px;
400
377
  }
401
378
 
@@ -419,24 +396,24 @@
419
396
 
420
397
  .override-slot {
421
398
  border-style: dashed;
422
- border-color: var(--ui-border-subtle);
399
+ border-color: var(--ui-border-low);
423
400
  cursor: pointer;
424
401
  position: relative;
425
402
  overflow: hidden;
426
403
  }
427
404
 
428
405
  .override-slot:hover {
429
- border-color: var(--ui-border-medium);
406
+ border-color: var(--ui-border-high);
430
407
  }
431
408
 
432
409
  .override-slot.active {
433
- border-color: var(--ui-border-strong);
434
- outline: 1px solid var(--ui-border-medium);
410
+ border-color: var(--ui-border-higher);
411
+ outline: 1px solid var(--ui-border-high);
435
412
  outline-offset: 1px;
436
413
  }
437
414
 
438
415
  .override-slot.populated {
439
- border-color: var(--ui-border-medium);
416
+ border-color: var(--ui-border-high);
440
417
  }
441
418
 
442
419
  .override-slot.matching::after {
@@ -486,7 +463,7 @@
486
463
  z-index: 10;
487
464
  margin-top: var(--ui-space-4);
488
465
  background: var(--ui-surface-lowest);
489
- border: 1px solid var(--ui-border-medium);
466
+ border: 1px solid var(--ui-border-high);
490
467
  border-radius: var(--ui-radius-md);
491
468
  padding: var(--ui-space-4);
492
469
  display: flex;
@@ -527,7 +504,7 @@
527
504
  width: 1rem;
528
505
  height: 1rem;
529
506
  border-radius: var(--ui-radius-sm);
530
- border: 1px solid var(--ui-border-faint);
507
+ border: 1px solid var(--ui-border-low);
531
508
  flex-shrink: 0;
532
509
  }
533
510