@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,9 +1,8 @@
1
1
  <script lang="ts">
2
- import { stopPropagation } from 'svelte/legacy';
3
-
4
2
  import { onMount, onDestroy } from 'svelte';
5
- import type { ComponentConfigMeta } from '../../lib/themeTypes';
6
- import UIDialog from '../../ui/UIDialog.svelte';
3
+ import type { ComponentConfigMeta } from '../../core/themes/themeTypes';
4
+ import FileLoadList from '../../ui/FileLoadList.svelte';
5
+ import UISquareButton from '../../ui/UISquareButton.svelte';
7
6
 
8
7
  interface Props {
9
8
  /** Component slug used in the load-dialog title (e.g. "button"). */
@@ -72,22 +71,20 @@
72
71
  }
73
72
 
74
73
  function handleDelete(file: ComponentConfigMeta) {
75
- if (file.fileName === 'default') return;
76
74
  ondelete?.(file);
77
75
  }
78
76
  </script>
79
77
 
80
78
  <div class="file-menu" bind:this={fileMenuRoot}>
81
- <button
82
- class="cfm-btn"
83
- class:active={fileMenuOpen}
79
+ <UISquareButton
80
+ icon="fa-file"
81
+ active={fileMenuOpen}
84
82
  onclick={() => (fileMenuOpen = !fileMenuOpen)}
85
83
  title="File menu"
86
84
  >
87
- <i class="fas fa-file"></i>
88
85
  <span>File</span>
89
86
  <i class="fas fa-chevron-down chevron" class:open={fileMenuOpen}></i>
90
- </button>
87
+ </UISquareButton>
91
88
  {#if fileMenuOpen}
92
89
  <div class="file-menu-dropdown" role="menu">
93
90
  <button class="file-menu-item" onclick={handleSave} role="menuitem">
@@ -106,89 +103,24 @@
106
103
  {/if}
107
104
  </div>
108
105
 
109
- <UIDialog
106
+ <FileLoadList
110
107
  bind:show={showFileList}
111
108
  title="Load {component} Config"
112
- cancelLabel="Close"
113
- width="420px"
114
- >
115
- <div class="load-list">
116
- {#each files as file}
117
- <div class="load-item" class:active={file.fileName === activeFileName}>
118
- <button class="load-name-btn" onclick={() => handleLoad(file)}>
119
- {file.name}
120
- </button>
121
- {#if file.fileName === activeFileName}
122
- <span class="active-badge">active</span>
123
- {/if}
124
- {#if file.fileName !== 'default'}
125
- <button
126
- class="file-delete-btn"
127
- onclick={stopPropagation(() => handleDelete(file))}
128
- title="Delete {file.name}"
129
- >
130
- <i class="fas fa-trash-alt"></i>
131
- </button>
132
- {/if}
133
- </div>
134
- {/each}
135
- {#if files.length === 0}
136
- <div class="load-item empty">No saved files</div>
137
- {/if}
138
- </div>
139
- </UIDialog>
109
+ {files}
110
+ {activeFileName}
111
+ systemBadge={{ label: 'system', title: 'Protected system config' }}
112
+ emptyMessage="No saved files"
113
+ onload={handleLoad}
114
+ ondelete={handleDelete}
115
+ />
140
116
 
141
117
  <style>
142
- .cfm-btn {
143
- display: inline-flex;
144
- align-items: center;
145
- gap: var(--ui-space-6);
146
- padding: var(--ui-space-6) var(--ui-space-12);
147
- background: var(--ui-surface);
148
- border: 1px solid var(--ui-border-subtle);
149
- border-radius: var(--ui-radius-md);
150
- color: var(--ui-text-secondary);
151
- font-size: var(--ui-font-size-md);
152
- font-weight: var(--ui-font-weight-medium);
153
- cursor: pointer;
154
- transition: all var(--ui-transition-fast);
155
- white-space: nowrap;
156
- }
157
-
158
- .cfm-btn i {
159
- width: 1rem;
160
- text-align: center;
161
- font-size: 0.85em;
162
- }
163
-
164
- .cfm-btn:hover:not(:disabled) {
165
- background: var(--ui-surface-high);
166
- color: var(--ui-text-primary);
167
- border-color: var(--ui-border-default);
168
- }
169
-
170
- .cfm-btn:disabled {
171
- opacity: 0.45;
172
- cursor: not-allowed;
173
- }
174
-
175
- .cfm-btn.active {
176
- background: var(--ui-surface-high);
177
- border-color: var(--ui-border-default);
178
- color: var(--ui-text-primary);
179
- }
180
-
181
- @media (max-width: 640px) {
182
- .cfm-btn > span:not(.chevron) { display: none; }
183
- .cfm-btn { padding: var(--ui-space-6) var(--ui-space-10); }
184
- }
185
-
186
- .chevron {
118
+ :global(.file-menu .chevron) {
187
119
  font-size: 0.7em;
188
120
  transition: transform var(--ui-transition-fast);
189
121
  }
190
122
 
191
- .chevron.open {
123
+ :global(.file-menu .chevron.open) {
192
124
  transform: rotate(180deg);
193
125
  }
194
126
 
@@ -202,7 +134,7 @@
202
134
  left: 0;
203
135
  min-width: 160px;
204
136
  background: var(--ui-surface-low);
205
- border: 1px solid var(--ui-border-default);
137
+ border: 1px solid var(--ui-border);
206
138
  border-radius: var(--ui-radius-md);
207
139
  box-shadow: var(--shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.4));
208
140
  padding: var(--ui-space-4);
@@ -237,88 +169,4 @@
237
169
  background: var(--ui-hover);
238
170
  color: var(--ui-text-primary);
239
171
  }
240
-
241
- .load-list {
242
- display: flex;
243
- flex-direction: column;
244
- max-height: 60vh;
245
- overflow-y: auto;
246
- }
247
-
248
- .load-item {
249
- display: flex;
250
- align-items: center;
251
- gap: 6px;
252
- padding: 4px 6px;
253
- border-bottom: 1px solid #2a2a2a;
254
- }
255
-
256
- .load-item:last-child {
257
- border-bottom: none;
258
- }
259
-
260
- .load-item.empty {
261
- padding: 16px;
262
- color: #888;
263
- font-size: 14px;
264
- text-align: center;
265
- }
266
-
267
- .load-name-btn {
268
- flex: 1;
269
- min-width: 0;
270
- overflow: hidden;
271
- text-overflow: ellipsis;
272
- white-space: nowrap;
273
- padding: 6px 4px;
274
- background: none;
275
- border: none;
276
- color: #aaa;
277
- font-size: 14px;
278
- cursor: pointer;
279
- text-align: left;
280
- border-radius: 3px;
281
- }
282
-
283
- .load-name-btn:hover {
284
- color: #e0e0e0;
285
- }
286
-
287
- .load-item.active .load-name-btn {
288
- color: #e0e0e0;
289
- font-weight: 600;
290
- }
291
-
292
- .active-badge {
293
- flex-shrink: 0;
294
- font-size: 12px;
295
- padding: 1px 6px;
296
- border-radius: 3px;
297
- background: #333;
298
- color: #ccc;
299
- }
300
-
301
- .file-delete-btn {
302
- flex-shrink: 0;
303
- display: flex;
304
- align-items: center;
305
- justify-content: center;
306
- width: 24px;
307
- height: 24px;
308
- padding: 0;
309
- background: none;
310
- border: none;
311
- color: #555;
312
- font-size: 12px;
313
- cursor: pointer;
314
- opacity: 0;
315
- }
316
-
317
- .load-item:hover .file-delete-btn {
318
- opacity: 1;
319
- }
320
-
321
- .file-delete-btn:hover {
322
- color: #ccc;
323
- }
324
172
  </style>
@@ -40,11 +40,11 @@
40
40
  color: var(--ui-text-primary);
41
41
  margin: 0;
42
42
  padding-bottom: var(--ui-space-8);
43
- border-bottom: 1px solid var(--ui-border-subtle);
43
+ border-bottom: 1px solid var(--ui-border-low);
44
44
  }
45
45
 
46
46
  :global(.components-container .demo-description) {
47
- font-size: var(--ui-font-size-sm);
47
+ font-size: var(--ui-font-size-md);
48
48
  color: var(--ui-text-tertiary);
49
49
  margin: 0;
50
50
  }
@@ -1,5 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { onMount, onDestroy } from 'svelte';
3
+ import { writable } from 'svelte/store';
4
+ import { getEditorContext } from './editorContext';
3
5
 
4
6
  type Source = { name: string; label: string; states: string[] };
5
7
 
@@ -21,6 +23,13 @@
21
23
 
22
24
  let open = $state(false);
23
25
  let root: HTMLElement | undefined = $state();
26
+ /** When true, copy rewrites the source variant segment in palette aliases
27
+ (e.g. `--surface-accent-high` → `--surface-primary-high`) so cross-variant
28
+ copies preserve color identity while picking up shape/typography choices.
29
+ Lifted to editor context so the toggle persists across VariantGroup
30
+ remounts (focus-mode swaps unmount the previous group). */
31
+ const editorCtx = getEditorContext();
32
+ const preserveColorFamilyStore = editorCtx?.preserveColorFamily ?? writable(false);
24
33
 
25
34
  function toggle() {
26
35
  open = !open;
@@ -64,6 +73,11 @@
64
73
  </button>
65
74
  {#if open}
66
75
  <div class="copy-menu" role="menu">
76
+ <label class="copy-menu-toggle">
77
+ <input type="checkbox" bind:checked={$preserveColorFamilyStore} />
78
+ <span>Preserve color families</span>
79
+ </label>
80
+ <div class="copy-menu-divider" aria-hidden="true"></div>
67
81
  {#each copySources as src}
68
82
  {#if src.states.length === 1}
69
83
  {@const onlyState = src.states[0]}
@@ -147,7 +161,7 @@
147
161
  left: 0;
148
162
  min-width: 12rem;
149
163
  background: var(--ui-surface-low);
150
- border: 1px solid var(--ui-border-default);
164
+ border: 1px solid var(--ui-border);
151
165
  border-radius: var(--ui-radius-md);
152
166
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
153
167
  padding: var(--ui-space-4);
@@ -183,7 +197,7 @@
183
197
  .copy-menu-item:hover:not(:disabled) {
184
198
  background: var(--ui-surface-high);
185
199
  color: var(--ui-text-primary);
186
- box-shadow: inset 0 0 0 1px var(--ui-border-faint);
200
+ box-shadow: inset 0 0 0 1px var(--ui-border-low);
187
201
  }
188
202
 
189
203
  .copy-menu-item:disabled {
@@ -209,7 +223,7 @@
209
223
  .copy-menu-item-parent:hover > .copy-menu-item-trigger {
210
224
  background: var(--ui-surface-high);
211
225
  color: var(--ui-text-primary);
212
- box-shadow: inset 0 0 0 1px var(--ui-border-faint);
226
+ box-shadow: inset 0 0 0 1px var(--ui-border-low);
213
227
  }
214
228
 
215
229
  .copy-submenu {
@@ -219,7 +233,7 @@
219
233
  left: 100%;
220
234
  min-width: 10rem;
221
235
  background: var(--ui-surface-low);
222
- border: 1px solid var(--ui-border-default);
236
+ border: 1px solid var(--ui-border);
223
237
  border-radius: var(--ui-radius-md);
224
238
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
225
239
  padding: var(--ui-space-4);
@@ -252,4 +266,30 @@
252
266
  .copy-menu-item-parent:hover > .copy-submenu {
253
267
  display: flex;
254
268
  }
269
+
270
+ .copy-menu-toggle {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: var(--ui-space-8);
274
+ padding: var(--ui-space-6) var(--ui-space-10);
275
+ font-size: var(--ui-font-size-sm);
276
+ color: var(--ui-text-secondary);
277
+ cursor: pointer;
278
+ user-select: none;
279
+ }
280
+
281
+ .copy-menu-toggle:hover {
282
+ color: var(--ui-text-primary);
283
+ }
284
+
285
+ .copy-menu-toggle input {
286
+ margin: 0;
287
+ cursor: pointer;
288
+ }
289
+
290
+ .copy-menu-divider {
291
+ height: 1px;
292
+ background: var(--ui-border-low);
293
+ margin: 2px 0;
294
+ }
255
295
  </style>
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { onMount, onDestroy } from 'svelte';
3
- import { CSS_VAR_CHANGE_EVENT } from '../../lib/cssVarSync';
3
+ import { CSS_VAR_CHANGE_EVENT } from '../../core/cssVarSync';
4
4
  import UIPaletteSelector from '../../ui/UIPaletteSelector.svelte';
5
5
  import UIVariantSelector from '../../ui/UIVariantSelector.svelte';
6
6
  import { BORDER_WIDTH, DIVIDER_HEIGHT } from '../../ui/variantScales';
@@ -21,7 +21,7 @@
21
21
 
22
22
  <style>
23
23
  .fieldset-wrapper {
24
- border: 1px solid var(--ui-border-faint);
24
+ border: 1px solid var(--ui-border-low);
25
25
  border-radius: var(--ui-radius-lg);
26
26
  padding: 0 var(--ui-space-8) var(--ui-space-8);
27
27
  margin: 0;
@@ -11,8 +11,8 @@
11
11
  * UIPaletteSelector. Reads resolve through `tokenRegistry$` so values
12
12
  * authored as `var(--gradient-angle-diagonal)` show their resolved degrees.
13
13
  */
14
- import { setComponentAlias } from '../../lib/editorStore';
15
- import { tokenRegistry$ } from '../../lib/tokenRegistry';
14
+ import { setComponentAlias } from '../../core/store/editorStore';
15
+ import { tokenRegistry$ } from '../../core/palettes/tokenRegistry';
16
16
  import UIPaletteSelector from '../../ui/UIPaletteSelector.svelte';
17
17
  import AngleDial from './AngleDial.svelte';
18
18
 
@@ -173,7 +173,7 @@
173
173
  gap: var(--ui-space-12);
174
174
  padding: var(--ui-space-12);
175
175
  background: var(--ui-surface-lowest);
176
- border: 1px solid var(--ui-border-faint);
176
+ border: 1px solid var(--ui-border-low);
177
177
  border-radius: var(--ui-radius-md);
178
178
  }
179
179
 
@@ -187,7 +187,7 @@
187
187
  position: relative;
188
188
  height: 2.25rem;
189
189
  border-radius: var(--ui-radius-sm);
190
- border: 1px solid var(--ui-border-default);
190
+ border: 1px solid var(--ui-border);
191
191
  }
192
192
 
193
193
  .handles {
@@ -218,7 +218,7 @@
218
218
  width: 0.7rem;
219
219
  height: 0.7rem;
220
220
  background: var(--stop-color, var(--ui-surface-high));
221
- border: 1px solid var(--ui-border-default);
221
+ border: 1px solid var(--ui-border);
222
222
  transform: rotate(45deg);
223
223
  border-radius: 1px;
224
224
  transition: border-color var(--ui-transition-fast), box-shadow var(--ui-transition-fast);
@@ -274,7 +274,7 @@
274
274
  width: 4rem;
275
275
  padding: var(--ui-space-2) var(--ui-space-6);
276
276
  background: var(--ui-surface-low);
277
- border: 1px solid var(--ui-border-faint);
277
+ border: 1px solid var(--ui-border-low);
278
278
  border-radius: var(--ui-radius-sm);
279
279
  color: var(--ui-text-primary);
280
280
  font-family: var(--ui-font-mono);
@@ -206,8 +206,8 @@
206
206
  .grid {
207
207
  display: grid;
208
208
  gap: 1px;
209
- background: var(--ui-border-faint);
210
- border: 1px solid var(--ui-border-faint);
209
+ background: var(--ui-border-low);
210
+ border: 1px solid var(--ui-border-low);
211
211
  border-radius: var(--ui-radius-sm);
212
212
  overflow: hidden;
213
213
  }
@@ -242,7 +242,7 @@
242
242
  text-align: center;
243
243
  }
244
244
  button.row-target:focus-visible {
245
- outline: 1px solid var(--ui-border-default, var(--ui-gray-700));
245
+ outline: 1px solid var(--ui-border, var(--ui-gray-700));
246
246
  outline-offset: -2px;
247
247
  }
248
248
 
@@ -265,7 +265,7 @@
265
265
  .grid .row-h.row-target.selected {
266
266
  background: var(--ui-surface-high);
267
267
  color: var(--ui-text-primary);
268
- box-shadow: inset 0 0 0 1px var(--ui-border-default);
268
+ box-shadow: inset 0 0 0 1px var(--ui-border);
269
269
  z-index: 1;
270
270
  }
271
271
  .grid .cell.row-target.in-selected-row,
@@ -273,7 +273,7 @@
273
273
  background: var(--ui-surface-high);
274
274
  }
275
275
  .grid .cell.row-target.selected {
276
- box-shadow: inset 0 0 0 1px var(--ui-border-default);
276
+ box-shadow: inset 0 0 0 1px var(--ui-border);
277
277
  z-index: 1;
278
278
  }
279
279
  .grid .cell.broken.row-target.in-selected-row,
@@ -300,7 +300,7 @@
300
300
  .absent {
301
301
  width: 5px;
302
302
  height: 1px;
303
- background: var(--ui-border-subtle);
303
+ background: var(--ui-border-low);
304
304
  opacity: 0.6;
305
305
  }
306
306
  </style>
@@ -127,7 +127,7 @@
127
127
  onclick={toggleSection}
128
128
  >
129
129
  <i class="fas fa-chevron-right chevron"></i>
130
- <span class="section-title">Linked properties</span>
130
+ <span class="editor-section-title">Linked properties</span>
131
131
  <span class="section-summary">
132
132
  <span class="section-summary-sep">·</span>
133
133
  <span class="section-summary-count">{cards.length}</span>
@@ -203,7 +203,7 @@
203
203
  .linked-block {
204
204
  margin-top: var(--ui-space-12);
205
205
  padding: var(--ui-space-12);
206
- border: 1px solid var(--ui-border-faint);
206
+ border: 1px solid var(--ui-border-low);
207
207
  border-radius: var(--ui-radius-md);
208
208
  background: var(--ui-surface-low);
209
209
  }
@@ -235,11 +235,6 @@
235
235
  .section-header.expanded .chevron {
236
236
  transform: rotate(90deg);
237
237
  }
238
- .section-title {
239
- font-size: var(--ui-font-size-md);
240
- font-weight: 500;
241
- color: var(--ui-text-primary);
242
- }
243
238
  .section-summary {
244
239
  display: inline-flex;
245
240
  align-items: center;
@@ -248,7 +243,7 @@
248
243
  color: var(--ui-text-tertiary);
249
244
  }
250
245
  .section-summary-sep {
251
- color: var(--ui-border-default);
246
+ color: var(--ui-border);
252
247
  }
253
248
  .section-summary-count {
254
249
  font-family: var(--ui-font-mono);
@@ -268,7 +263,7 @@
268
263
  flex-wrap: wrap;
269
264
  align-items: flex-start;
270
265
  gap: var(--ui-space-12);
271
- margin-top: var(--ui-space-16);
266
+ margin-top: var(--ui-space-20);
272
267
  }
273
268
 
274
269
  /* Card — vertical stack: label heading · control row · drill-down · chart.
@@ -279,7 +274,7 @@
279
274
  display: flex;
280
275
  flex-direction: column;
281
276
  gap: var(--ui-space-8);
282
- border: 1px solid var(--ui-border-faint);
277
+ border: 1px solid var(--ui-border-low);
283
278
  border-radius: var(--ui-radius-lg);
284
279
  padding: var(--ui-space-12) var(--ui-space-16);
285
280
  min-width: 14rem;
@@ -299,7 +294,7 @@
299
294
  }
300
295
  .linked-card.hovered {
301
296
  background: var(--ui-hover-lowest);
302
- border-color: var(--ui-border-default);
297
+ border-color: var(--ui-border);
303
298
  }
304
299
  .linked-card.hovered.broken {
305
300
  border-color: var(--ui-link-broken);
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+
6
+ let { children }: Props = $props();
7
+ /** Section that gathers render-time toggles a component accepts as props
8
+ (e.g. dismissible, action buttons, hover shimmer, show icons). */
9
+ </script>
10
+
11
+ <section class="editor-section-card config-block">
12
+ <h3 class="editor-section-title config-title">Editor Configuration</h3>
13
+ <div class="config-controls">
14
+ {@render children?.()}
15
+ </div>
16
+ </section>
17
+
18
+ <style>
19
+ .config-title {
20
+ margin-bottom: var(--ui-space-20);
21
+ }
22
+
23
+ .config-controls {
24
+ display: flex;
25
+ flex-wrap: wrap;
26
+ gap: var(--ui-space-16);
27
+ align-items: center;
28
+ }
29
+
30
+ .config-controls :global(label) {
31
+ display: inline-flex;
32
+ align-items: center;
33
+ gap: var(--ui-space-6);
34
+ font-size: var(--ui-font-size-sm);
35
+ color: var(--ui-text-secondary);
36
+ cursor: pointer;
37
+ }
38
+ </style>