@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
@@ -0,0 +1,138 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface Props {
5
+ variant?: 'primary' | 'default' | 'secondary';
6
+ size?: 'default' | 'compact';
7
+ icon?: string;
8
+ href?: string;
9
+ target?: string;
10
+ disabled?: boolean;
11
+ title?: string;
12
+ type?: 'button' | 'submit' | 'reset';
13
+ onclick?: (e: MouseEvent) => void;
14
+ children?: Snippet;
15
+ }
16
+
17
+ let {
18
+ variant = 'default',
19
+ size = 'default',
20
+ icon,
21
+ href,
22
+ target,
23
+ disabled = false,
24
+ title,
25
+ type = 'button',
26
+ onclick,
27
+ children,
28
+ }: Props = $props();
29
+ </script>
30
+
31
+ {#if href}
32
+ <a
33
+ class="ui-pill ui-pill-{variant} ui-pill-{size}"
34
+ {href}
35
+ {target}
36
+ {title}
37
+ {onclick}
38
+ rel={target === '_blank' ? 'noopener noreferrer' : undefined}
39
+ aria-disabled={disabled ? 'true' : undefined}
40
+ >
41
+ {#if icon}<i class="fas {icon}" aria-hidden="true"></i>{/if}
42
+ {#if children}{@render children()}{/if}
43
+ </a>
44
+ {:else}
45
+ <button
46
+ class="ui-pill ui-pill-{variant} ui-pill-{size}"
47
+ {type}
48
+ {disabled}
49
+ {title}
50
+ {onclick}
51
+ >
52
+ {#if icon}<i class="fas {icon}" aria-hidden="true"></i>{/if}
53
+ {#if children}{@render children()}{/if}
54
+ </button>
55
+ {/if}
56
+
57
+ <style>
58
+ .ui-pill {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ gap: var(--ui-space-6, 6px);
62
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.25) 100%);
63
+ border: 1px solid rgba(255, 255, 255, 0.5);
64
+ color: var(--ui-text-primary, #fff);
65
+ font-family: inherit;
66
+ font-size: var(--ui-font-size-md, 16px);
67
+ font-weight: var(--ui-font-weight-medium, 500);
68
+ line-height: 1;
69
+ padding: var(--ui-space-6, 6px) var(--ui-space-16, 16px);
70
+ border-radius: var(--ui-radius-full, 9999px);
71
+ cursor: pointer;
72
+ text-decoration: none;
73
+ transition:
74
+ background var(--ui-transition-fast, 120ms ease),
75
+ border-color var(--ui-transition-fast, 120ms ease);
76
+ }
77
+
78
+ .ui-pill:hover:not(:disabled):not([aria-disabled='true']) {
79
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.25) 0%, rgba(255, 255, 255, 0.45) 100%);
80
+ border-color: rgba(255, 255, 255, 0.75);
81
+ }
82
+
83
+ .ui-pill:disabled,
84
+ .ui-pill[aria-disabled='true'] {
85
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.10) 100%);
86
+ border-color: rgba(255, 255, 255, 0.22);
87
+ color: var(--ui-text-muted, #4d4d4d);
88
+ cursor: not-allowed;
89
+ pointer-events: none;
90
+ }
91
+ .ui-pill:disabled i,
92
+ .ui-pill[aria-disabled='true'] i {
93
+ color: rgba(255, 255, 255, 0.28);
94
+ }
95
+
96
+ .ui-pill-primary:disabled,
97
+ .ui-pill-primary[aria-disabled='true'] {
98
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.07) 0%, rgba(255, 255, 255, 0.03) 100%);
99
+ border-color: rgba(255, 255, 255, 0.24);
100
+ }
101
+
102
+ .ui-pill-secondary:disabled,
103
+ .ui-pill-secondary[aria-disabled='true'] {
104
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.01) 100%);
105
+ border-color: rgba(255, 255, 255, 0.14);
106
+ }
107
+
108
+ .ui-pill i {
109
+ font-size: var(--ui-font-size-xs, 12px);
110
+ color: rgba(255, 255, 255, 0.65);
111
+ }
112
+
113
+ /* Variant: primary — heavier gradient + brighter border for CTAs */
114
+ .ui-pill-primary {
115
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.18) 0%, rgba(255, 255, 255, 0.08) 100%);
116
+ border-color: rgba(255, 255, 255, 0.55);
117
+ }
118
+ .ui-pill-primary:hover:not(:disabled):not([aria-disabled='true']) {
119
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0.12) 100%);
120
+ border-color: rgba(255, 255, 255, 0.7);
121
+ }
122
+
123
+ /* Variant: secondary — lighter, for low-emphasis actions */
124
+ .ui-pill-secondary {
125
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
126
+ border-color: rgba(255, 255, 255, 0.30);
127
+ }
128
+ .ui-pill-secondary:hover:not(:disabled):not([aria-disabled='true']) {
129
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.12) 0%, rgba(255, 255, 255, 0.05) 100%);
130
+ border-color: rgba(255, 255, 255, 0.5);
131
+ }
132
+
133
+ /* Size: compact — for header bars / chrome rails */
134
+ .ui-pill-compact {
135
+ font-size: var(--ui-font-size-sm, 14px);
136
+ padding: var(--ui-space-2, 2px) var(--ui-space-12, 12px);
137
+ }
138
+ </style>
@@ -1,6 +1,6 @@
1
1
  <!--
2
2
  Custom-styled radio that matches the editor's selection language: a quiet ring
3
- in the unselected state (--ui-border-strong stroke, soft black inner fill) and
3
+ in the unselected state (--ui-border-higher stroke, soft black inner fill) and
4
4
  the highlight amber when selected (ring + dot, transparent inside).
5
5
 
6
6
  Usage:
@@ -50,7 +50,7 @@
50
50
  flex-shrink: 0;
51
51
  width: 14px;
52
52
  height: 14px;
53
- border: 1.5px solid var(--ui-border-strong);
53
+ border: 1.5px solid var(--ui-border-higher);
54
54
  border-radius: 50%;
55
55
  background: rgba(0, 0, 0, 0.3);
56
56
  cursor: pointer;
@@ -120,7 +120,7 @@
120
120
  top: calc(100% + var(--ui-space-4));
121
121
  right: 0;
122
122
  background: var(--ui-surface-higher);
123
- border: 1px solid var(--ui-border-medium);
123
+ border: 1px solid var(--ui-border-high);
124
124
  border-radius: var(--ui-radius-md);
125
125
  box-shadow: var(--ui-shadow-lg);
126
126
  z-index: 20;
@@ -138,7 +138,7 @@
138
138
  }
139
139
 
140
140
  .ui-relink-header {
141
- border-bottom: 1px solid var(--ui-border-faint);
141
+ border-bottom: 1px solid var(--ui-border-low);
142
142
  padding-bottom: var(--ui-space-6);
143
143
  }
144
144
 
@@ -205,7 +205,7 @@
205
205
  justify-content: flex-end;
206
206
  gap: var(--ui-space-6);
207
207
  padding-top: var(--ui-space-4);
208
- border-top: 1px solid var(--ui-border-faint);
208
+ border-top: 1px solid var(--ui-border-low);
209
209
  }
210
210
 
211
211
  .ui-relink-btn {
@@ -219,7 +219,7 @@
219
219
 
220
220
  .ui-relink-btn-cancel {
221
221
  background: transparent;
222
- border: 1px solid var(--ui-border-default);
222
+ border: 1px solid var(--ui-border);
223
223
  color: var(--ui-text-secondary);
224
224
  }
225
225
 
@@ -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';
@@ -354,7 +354,7 @@
354
354
  }
355
355
 
356
356
  .ui-token-selector.disabled .ui-ts-trigger:hover {
357
- border-color: var(--ui-border-default);
357
+ border-color: var(--ui-border);
358
358
  background: var(--ui-surface-low);
359
359
  }
360
360
 
@@ -364,7 +364,7 @@
364
364
  gap: var(--ui-space-6);
365
365
  padding: var(--ui-space-2) var(--ui-space-8);
366
366
  background: var(--ui-surface-low);
367
- border: 1px solid var(--ui-border-default);
367
+ border: 1px solid var(--ui-border);
368
368
  border-radius: var(--ui-radius-md);
369
369
  cursor: pointer;
370
370
  transition: all var(--ui-transition-fast);
@@ -409,7 +409,7 @@
409
409
  }
410
410
 
411
411
  .ui-ts-trigger:hover {
412
- border-color: var(--ui-border-strong);
412
+ border-color: var(--ui-border-higher);
413
413
  background: var(--ui-surface-high);
414
414
  }
415
415
 
@@ -499,7 +499,7 @@
499
499
  top: calc(100% + var(--ui-space-4));
500
500
  left: 0;
501
501
  background: var(--ui-surface-higher);
502
- border: 1px solid var(--ui-border-medium);
502
+ border: 1px solid var(--ui-border-high);
503
503
  border-radius: var(--ui-radius-md);
504
504
  box-shadow: var(--ui-shadow-lg);
505
505
  z-index: 10;
@@ -511,7 +511,7 @@
511
511
  justify-content: flex-end;
512
512
  gap: var(--ui-space-6);
513
513
  padding: var(--ui-space-6) var(--ui-space-8);
514
- border-bottom: 1px solid var(--ui-border-faint);
514
+ border-bottom: 1px solid var(--ui-border-low);
515
515
  }
516
516
 
517
517
  .ui-ts-reset {
@@ -521,7 +521,7 @@
521
521
  height: 1.5rem;
522
522
  padding: var(--ui-space-2) var(--ui-space-8);
523
523
  background: none;
524
- border: 1px solid var(--ui-border-default);
524
+ border: 1px solid var(--ui-border);
525
525
  border-radius: var(--ui-radius-sm);
526
526
  color: var(--ui-text-secondary);
527
527
  font-family: inherit;
@@ -537,7 +537,7 @@
537
537
 
538
538
  .ui-ts-reset:hover:not(:disabled) {
539
539
  background: var(--ui-hover);
540
- border-color: var(--ui-border-strong);
540
+ border-color: var(--ui-border-higher);
541
541
  color: var(--ui-text-primary);
542
542
  }
543
543
 
@@ -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';
@@ -8,6 +8,7 @@
8
8
  import OverlaysSection from './sections/OverlaysSection.svelte';
9
9
  import GradientsSection from './sections/GradientsSection.svelte';
10
10
  import ShadowsSection from './sections/ShadowsSection.svelte';
11
+ import UIPillButton from './UIPillButton.svelte';
11
12
  import {
12
13
  SPACING_VARS, BORDER_WIDTH_VARS, RADIUS_VARS, FONT_SIZE_VARS,
13
14
  ICON_SIZE_VARS, FONT_WEIGHT_VARS, LINE_HEIGHT_VARS,
@@ -40,6 +41,9 @@
40
41
  copiedVar = v;
41
42
  setTimeout(() => { copiedVar = null; }, COPIED_FLASH_MS);
42
43
  }
44
+
45
+ type FontAddMode = 'closed' | 'url' | 'fontface';
46
+ let fontAddMode: FontAddMode = $state('closed');
43
47
  </script>
44
48
 
45
49
  <div class="variables-container">
@@ -81,11 +85,18 @@
81
85
 
82
86
  <!-- Typography -->
83
87
  <section class="section" id="typography">
84
- <h2 class="section-title">Typography</h2>
88
+ <div class="typography-header">
89
+ <h2 class="section-title">Typography</h2>
90
+ <UIPillButton
91
+ variant="primary"
92
+ icon="fa-plus"
93
+ onclick={() => { fontAddMode = fontAddMode === 'closed' ? 'url' : 'closed'; }}
94
+ >Add Font</UIPillButton>
95
+ </div>
85
96
 
86
97
  <div class="typography-columns">
87
98
  <div class="typography-group font-families-group">
88
- <ProjectFontsSection />
99
+ <ProjectFontsSection bind:addMode={fontAddMode} />
89
100
  <h3 class="group-title">Font Families</h3>
90
101
  <FontStackEditor />
91
102
  </div>
@@ -160,16 +171,16 @@
160
171
  }
161
172
 
162
173
  .section-title {
163
- font-size: var(--ui-font-size-lg);
174
+ font-size: var(--ui-font-size-2xl);
164
175
  font-weight: var(--ui-font-weight-semibold);
165
176
  color: var(--ui-text-primary);
166
177
  margin: 0;
167
178
  padding-bottom: var(--ui-space-8);
168
- border-bottom: 1px solid var(--ui-border-subtle);
179
+ border-bottom: 2px solid var(--ui-border-high);
169
180
  }
170
181
 
171
182
  .group-title {
172
- font-size: var(--ui-font-size-md);
183
+ font-size: var(--ui-font-size-lg);
173
184
  font-weight: var(--ui-font-weight-semibold);
174
185
  color: var(--ui-text-secondary);
175
186
  margin: 0;
@@ -178,11 +189,11 @@
178
189
  /* Subsection title (used by Spacing & Borders) */
179
190
  .subsection-title {
180
191
  margin: var(--ui-space-16) 0 var(--ui-space-8);
181
- font-size: var(--ui-font-size-sm);
192
+ font-size: var(--ui-font-size-xs);
182
193
  font-weight: var(--ui-font-weight-semibold);
183
- color: var(--ui-text-secondary);
194
+ color: var(--ui-text-tertiary);
184
195
  text-transform: uppercase;
185
- letter-spacing: 0.04em;
196
+ letter-spacing: 0.06em;
186
197
  }
187
198
 
188
199
  .subsection-title:first-child,
@@ -191,6 +202,18 @@
191
202
  }
192
203
 
193
204
  /* Typography */
205
+ .typography-header {
206
+ display: flex;
207
+ align-items: center;
208
+ justify-content: space-between;
209
+ gap: var(--ui-space-12);
210
+ padding-bottom: var(--ui-space-8);
211
+ border-bottom: 2px solid var(--ui-border-high);
212
+ }
213
+ .typography-header .section-title {
214
+ padding-bottom: 0;
215
+ border-bottom: none;
216
+ }
194
217
  .typography-columns {
195
218
  display: grid;
196
219
  grid-template-columns: repeat(auto-fill, minmax(min(22rem, 100%), 1fr));
@@ -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>