@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,350 @@
1
+ <script lang="ts" generics="F extends { fileName: string; name: string; updatedAt?: string; isProtected?: boolean }">
2
+ import { stopPropagation } from 'svelte/legacy';
3
+ import UIDialog from './UIDialog.svelte';
4
+
5
+ interface Props {
6
+ show: boolean;
7
+ title: string;
8
+ files: F[];
9
+ activeFileName: string;
10
+ /** Show name/date sort headers above the list. */
11
+ sortable?: boolean;
12
+ /** Render the updatedAt column on each row. */
13
+ showUpdatedAt?: boolean;
14
+ /** Identify the protected/system file. Default: `file.isProtected ?? file.fileName === 'default'`. */
15
+ isProtected?: (file: F) => boolean;
16
+ /** Whether the delete button should appear for a row. Default: `!isProtected(file)`. */
17
+ canDelete?: (file: F) => boolean;
18
+ /** Render a "system" badge next to protected rows. Null hides it. */
19
+ systemBadge?: { label: string; title: string } | null;
20
+ /** Shown when `files` is empty. Omit to render no row at all. */
21
+ emptyMessage?: string;
22
+ width?: string;
23
+ onload: (file: F) => void;
24
+ ondelete?: (file: F) => void;
25
+ }
26
+
27
+ let {
28
+ show = $bindable(false),
29
+ title,
30
+ files,
31
+ activeFileName,
32
+ sortable = false,
33
+ showUpdatedAt = false,
34
+ isProtected = (f) => f.isProtected ?? f.fileName === 'default',
35
+ canDelete,
36
+ systemBadge = null,
37
+ emptyMessage,
38
+ width = '420px',
39
+ onload,
40
+ ondelete,
41
+ }: Props = $props();
42
+
43
+ type SortKey = 'name' | 'updatedAt';
44
+ let sortKey: SortKey = $state('updatedAt');
45
+ let sortDir: 'asc' | 'desc' = $state('desc');
46
+
47
+ function toggleSort(key: SortKey) {
48
+ if (sortKey === key) {
49
+ sortDir = sortDir === 'asc' ? 'desc' : 'asc';
50
+ } else {
51
+ sortKey = key;
52
+ sortDir = key === 'name' ? 'asc' : 'desc';
53
+ }
54
+ }
55
+
56
+ const dateFormatter = new Intl.DateTimeFormat(undefined, {
57
+ month: 'short',
58
+ day: 'numeric',
59
+ hour: 'numeric',
60
+ minute: '2-digit',
61
+ });
62
+
63
+ function formatUpdatedAt(iso: string | undefined): string {
64
+ if (!iso) return '';
65
+ const d = new Date(iso);
66
+ if (Number.isNaN(d.getTime())) return '';
67
+ return dateFormatter.format(d);
68
+ }
69
+
70
+ let sortedFiles = $derived(
71
+ sortable
72
+ ? [...files].sort((a, b) => {
73
+ let cmp = 0;
74
+ if (sortKey === 'name') {
75
+ cmp = a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });
76
+ } else {
77
+ cmp = (a.updatedAt || '').localeCompare(b.updatedAt || '');
78
+ }
79
+ return sortDir === 'asc' ? cmp : -cmp;
80
+ })
81
+ : files,
82
+ );
83
+
84
+ function handleLoad(file: F) {
85
+ onload(file);
86
+ }
87
+
88
+ function handleDelete(file: F) {
89
+ ondelete?.(file);
90
+ }
91
+
92
+ function shouldShowDelete(file: F): boolean {
93
+ if (!ondelete) return false;
94
+ if (canDelete) return canDelete(file);
95
+ return !isProtected(file);
96
+ }
97
+ </script>
98
+
99
+ <UIDialog bind:show {title} cancelLabel="Close" {width}>
100
+ <div class="load-list">
101
+ {#if sortable}
102
+ <div class="load-header">
103
+ <button
104
+ class="sort-btn name-col"
105
+ class:active-sort={sortKey === 'name'}
106
+ onclick={() => toggleSort('name')}
107
+ >
108
+ <span>Name</span>
109
+ {#if sortKey === 'name'}
110
+ <i class="fas {sortDir === 'asc' ? 'fa-caret-up' : 'fa-caret-down'}"></i>
111
+ {/if}
112
+ </button>
113
+ {#if showUpdatedAt}
114
+ <button
115
+ class="sort-btn date-col"
116
+ class:active-sort={sortKey === 'updatedAt'}
117
+ onclick={() => toggleSort('updatedAt')}
118
+ >
119
+ <span>Date</span>
120
+ {#if sortKey === 'updatedAt'}
121
+ <i class="fas {sortDir === 'asc' ? 'fa-caret-up' : 'fa-caret-down'}"></i>
122
+ {/if}
123
+ </button>
124
+ {/if}
125
+ <span class="header-spacer"></span>
126
+ </div>
127
+ {/if}
128
+ {#each sortedFiles as file (file.fileName)}
129
+ {@const protectedRow = isProtected(file)}
130
+ <div
131
+ class="load-item"
132
+ class:active={file.fileName === activeFileName}
133
+ class:protected={protectedRow}
134
+ >
135
+ <button class="load-name-btn" onclick={() => handleLoad(file)}>
136
+ {#if protectedRow}
137
+ <i class="fas fa-lock system-glyph" aria-hidden="true"></i>
138
+ {/if}
139
+ <span class="load-name-text">{file.name}</span>
140
+ </button>
141
+ {#if protectedRow && systemBadge}
142
+ <span class="system-badge" title={systemBadge.title}>{systemBadge.label}</span>
143
+ {/if}
144
+ {#if showUpdatedAt}
145
+ <span class="updated-at" title={file.updatedAt}>{formatUpdatedAt(file.updatedAt)}</span>
146
+ {/if}
147
+ {#if file.fileName === activeFileName}
148
+ <span class="active-badge">active</span>
149
+ {/if}
150
+ {#if shouldShowDelete(file)}
151
+ <button
152
+ class="file-delete-btn"
153
+ onclick={stopPropagation(() => handleDelete(file))}
154
+ title="Delete {file.name}"
155
+ >
156
+ <i class="fas fa-trash-alt"></i>
157
+ </button>
158
+ {/if}
159
+ </div>
160
+ {/each}
161
+ {#if files.length === 0 && emptyMessage}
162
+ <div class="load-item empty">{emptyMessage}</div>
163
+ {/if}
164
+ </div>
165
+ </UIDialog>
166
+
167
+ <style>
168
+ .load-list {
169
+ display: flex;
170
+ flex-direction: column;
171
+ max-height: 60vh;
172
+ overflow-y: auto;
173
+ }
174
+
175
+ .load-header {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 6px;
179
+ padding: 4px 6px;
180
+ border-bottom: 1px solid #3a3a3a;
181
+ position: sticky;
182
+ top: 0;
183
+ background: var(--ui-surface, #1a1a1a);
184
+ z-index: 1;
185
+ }
186
+
187
+ .sort-btn {
188
+ display: inline-flex;
189
+ align-items: center;
190
+ gap: 4px;
191
+ padding: 4px 0;
192
+ background: none;
193
+ border: none;
194
+ color: #888;
195
+ font-size: 11px;
196
+ font-weight: 600;
197
+ text-transform: uppercase;
198
+ letter-spacing: 0.04em;
199
+ cursor: pointer;
200
+ text-align: left;
201
+ }
202
+
203
+ .sort-btn:hover {
204
+ color: #ccc;
205
+ }
206
+
207
+ .sort-btn.active-sort {
208
+ color: #e0e0e0;
209
+ }
210
+
211
+ .sort-btn i {
212
+ font-size: 10px;
213
+ opacity: 0.85;
214
+ }
215
+
216
+ .sort-btn.name-col {
217
+ flex: 1;
218
+ min-width: 0;
219
+ padding-left: 4px;
220
+ }
221
+
222
+ .sort-btn.date-col {
223
+ flex-shrink: 0;
224
+ }
225
+
226
+ .header-spacer {
227
+ flex-shrink: 0;
228
+ width: 24px;
229
+ }
230
+
231
+ .load-item {
232
+ display: flex;
233
+ align-items: center;
234
+ gap: 6px;
235
+ padding: 4px 6px;
236
+ border-bottom: 1px solid #2a2a2a;
237
+ }
238
+
239
+ .load-item:last-child {
240
+ border-bottom: none;
241
+ }
242
+
243
+ .load-item.empty {
244
+ padding: 16px;
245
+ color: #888;
246
+ font-size: 14px;
247
+ text-align: center;
248
+ }
249
+
250
+ .load-name-btn {
251
+ flex: 1;
252
+ min-width: 0;
253
+ display: inline-flex;
254
+ align-items: center;
255
+ gap: 6px;
256
+ padding: 6px 4px;
257
+ background: none;
258
+ border: none;
259
+ color: #aaa;
260
+ font-size: 14px;
261
+ cursor: pointer;
262
+ text-align: left;
263
+ border-radius: 3px;
264
+ }
265
+
266
+ .load-name-text {
267
+ flex: 1;
268
+ min-width: 0;
269
+ overflow: hidden;
270
+ text-overflow: ellipsis;
271
+ white-space: nowrap;
272
+ }
273
+
274
+ .load-name-btn:hover {
275
+ color: #e0e0e0;
276
+ }
277
+
278
+ .load-item.active .load-name-btn {
279
+ color: #e0e0e0;
280
+ font-weight: 600;
281
+ }
282
+
283
+ .load-item.protected .load-name-btn {
284
+ font-style: italic;
285
+ color: #888;
286
+ }
287
+
288
+ .load-item.protected.active .load-name-btn {
289
+ color: #c0c0c0;
290
+ }
291
+
292
+ .system-glyph {
293
+ flex: 0 0 auto;
294
+ font-size: 0.78em;
295
+ color: #666;
296
+ }
297
+
298
+ .system-badge {
299
+ flex-shrink: 0;
300
+ font-size: 11px;
301
+ padding: 1px 6px;
302
+ border-radius: 3px;
303
+ background: transparent;
304
+ border: 1px solid #3a3a3a;
305
+ color: #888;
306
+ text-transform: uppercase;
307
+ letter-spacing: 0.04em;
308
+ }
309
+
310
+ .updated-at {
311
+ flex-shrink: 0;
312
+ font-size: 12px;
313
+ color: #777;
314
+ font-variant-numeric: tabular-nums;
315
+ white-space: nowrap;
316
+ }
317
+
318
+ .active-badge {
319
+ flex-shrink: 0;
320
+ font-size: 12px;
321
+ padding: 1px 6px;
322
+ border-radius: 3px;
323
+ background: #333;
324
+ color: #ccc;
325
+ }
326
+
327
+ .file-delete-btn {
328
+ flex-shrink: 0;
329
+ display: flex;
330
+ align-items: center;
331
+ justify-content: center;
332
+ width: 24px;
333
+ height: 24px;
334
+ padding: 0;
335
+ background: none;
336
+ border: none;
337
+ color: #555;
338
+ font-size: 12px;
339
+ cursor: pointer;
340
+ opacity: 0;
341
+ }
342
+
343
+ .load-item:hover .file-delete-btn {
344
+ opacity: 1;
345
+ }
346
+
347
+ .file-delete-btn:hover {
348
+ color: #ccc;
349
+ }
350
+ </style>
@@ -0,0 +1,80 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ /** Display label shown in the pill. */
4
+ name: string;
5
+ /** Render a lock glyph and italicize the label for the protected default. */
6
+ isProtected?: boolean;
7
+ /** Highlight border + inner glow for unsaved/dirty state. */
8
+ dirty?: boolean;
9
+ /** Green border for editor-matches-production / live state. */
10
+ applied?: boolean;
11
+ /** Tooltip text for the lock glyph. */
12
+ protectedTitle?: string;
13
+ /** Tooltip for the whole pill (typically the full display name). */
14
+ title?: string;
15
+ /** Inline style passthrough — for fixed-width layouts driven by the parent row. */
16
+ style?: string;
17
+ }
18
+ let {
19
+ name,
20
+ isProtected = false,
21
+ dirty = false,
22
+ applied = false,
23
+ protectedTitle = '',
24
+ title = '',
25
+ style = '',
26
+ }: Props = $props();
27
+ </script>
28
+
29
+ <span class="file-pill" class:dirty class:applied class:protected={isProtected} {title} {style}>
30
+ {#if isProtected}
31
+ <i class="fas fa-lock pill-glyph" aria-hidden="true" title={protectedTitle}></i>
32
+ {/if}
33
+ <span class="pill-name">{name}</span>
34
+ </span>
35
+
36
+ <style>
37
+ .file-pill {
38
+ --filepill-applied: #5aa85e;
39
+ display: inline-flex;
40
+ align-items: center;
41
+ gap: var(--ui-space-6);
42
+ padding: var(--ui-space-6) var(--ui-space-10);
43
+ background: var(--ui-surface-lowest);
44
+ border: 1px solid var(--ui-border-low);
45
+ border-radius: var(--ui-radius-md);
46
+ transition: border-color var(--ui-transition-fast), box-shadow var(--ui-transition-fast);
47
+ }
48
+
49
+ .file-pill.dirty {
50
+ border-color: color-mix(in srgb, var(--ui-highlight) 60%, var(--ui-border-low));
51
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ui-highlight) 35%, transparent);
52
+ }
53
+
54
+ .file-pill.applied {
55
+ border-color: color-mix(in srgb, var(--filepill-applied) 50%, var(--ui-border-low));
56
+ }
57
+
58
+ .pill-name {
59
+ flex: 1;
60
+ min-width: 0;
61
+ font-size: var(--ui-font-size-md);
62
+ font-weight: var(--ui-font-weight-semibold);
63
+ color: var(--ui-text-primary);
64
+ white-space: nowrap;
65
+ overflow: hidden;
66
+ text-overflow: ellipsis;
67
+ }
68
+
69
+ .file-pill.protected .pill-name {
70
+ font-style: italic;
71
+ font-weight: var(--ui-font-weight-medium);
72
+ color: var(--ui-text-secondary);
73
+ }
74
+
75
+ .pill-glyph {
76
+ flex: 0 0 auto;
77
+ font-size: 0.75em;
78
+ color: var(--ui-text-muted);
79
+ }
80
+ </style>
@@ -7,9 +7,9 @@
7
7
  FontStackVariable,
8
8
  GenericFamily,
9
9
  SystemCascadePreset,
10
- } from '../lib/themeTypes';
11
- import { editorState, setFontStacks } from '../lib/editorStore';
12
- import { applyFontStacks, SYSTEM_CASCADES } from '../lib/fontLoader';
10
+ } from '../core/themes/themeTypes';
11
+ import { editorState, setFontStacks } from '../core/store/editorStore';
12
+ import { applyFontStacks, SYSTEM_CASCADES } from '../core/fonts/fontLoader';
13
13
 
14
14
  const SYSTEM_PRESETS: SystemCascadePreset[] = ['system-ui-sans', 'system-ui-serif', 'system-ui-mono'];
15
15
  const GENERIC_VALUES: GenericFamily[] = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];
@@ -243,7 +243,7 @@
243
243
  gap: var(--ui-space-6);
244
244
  padding: var(--ui-space-12);
245
245
  background: none;
246
- border: 1px solid var(--ui-border-faint);
246
+ border: 1px solid var(--ui-border-low);
247
247
  border-radius: var(--ui-radius-md);
248
248
  }
249
249
 
@@ -270,7 +270,7 @@
270
270
  align-items: center;
271
271
  gap: var(--ui-space-6);
272
272
  padding: var(--ui-space-4) 0;
273
- border-bottom: 1px solid var(--ui-border-faint);
273
+ border-bottom: 1px solid var(--ui-border-low);
274
274
  position: relative;
275
275
  }
276
276
  .slot-row:last-child { border-bottom: none; }
@@ -329,7 +329,7 @@
329
329
 
330
330
  .slot-remove {
331
331
  background: none;
332
- border: 1px solid var(--ui-border-faint);
332
+ border: 1px solid var(--ui-border-low);
333
333
  color: var(--ui-text-muted);
334
334
  font-size: var(--ui-font-size-md);
335
335
  line-height: 1;
@@ -347,7 +347,7 @@
347
347
  .add-fallback {
348
348
  align-self: flex-start;
349
349
  background: none;
350
- border: 1px dashed var(--ui-border-faint);
350
+ border: 1px dashed var(--ui-border-low);
351
351
  color: var(--ui-text-muted);
352
352
  font-size: var(--ui-font-size-sm);
353
353
  padding: var(--ui-space-4) var(--ui-space-8);
@@ -16,8 +16,8 @@
16
16
  setGradientStop,
17
17
  addGradientStop,
18
18
  removeGradientStop,
19
- } from '../lib/editorStore';
20
- import type { GradientType, GradientTokenStop } from '../lib/editorTypes';
19
+ } from '../core/store/editorStore';
20
+ import type { GradientType, GradientTokenStop } from '../core/store/editorTypes';
21
21
  import GradientStopPicker from './GradientStopPicker.svelte';
22
22
  import AngleDial from '../component-editor/scaffolding/AngleDial.svelte';
23
23
 
@@ -283,7 +283,7 @@
283
283
  position: relative;
284
284
  height: 3rem;
285
285
  border-radius: var(--ui-radius-md);
286
- border: 1px solid var(--ui-border-faint);
286
+ border: 1px solid var(--ui-border-low);
287
287
  cursor: copy;
288
288
  }
289
289
 
@@ -314,7 +314,7 @@
314
314
  width: 0.7rem;
315
315
  height: 0.7rem;
316
316
  background: var(--stop-color, var(--ui-surface-high));
317
- border: 1px solid var(--ui-border-default);
317
+ border: 1px solid var(--ui-border);
318
318
  transform: rotate(45deg);
319
319
  border-radius: 1px;
320
320
  transition: border-color var(--ui-transition-fast), box-shadow var(--ui-transition-fast);
@@ -348,7 +348,7 @@
348
348
 
349
349
  .type-toggle {
350
350
  display: inline-flex;
351
- border: 1px solid var(--ui-border-faint);
351
+ border: 1px solid var(--ui-border-low);
352
352
  border-radius: var(--ui-radius-md);
353
353
  overflow: hidden;
354
354
  }
@@ -369,7 +369,7 @@
369
369
  }
370
370
 
371
371
  .type-toggle button + button {
372
- border-left: 1px solid var(--ui-border-faint);
372
+ border-left: 1px solid var(--ui-border-low);
373
373
  }
374
374
 
375
375
  .ghost-btn {
@@ -378,7 +378,7 @@
378
378
  gap: var(--ui-space-6);
379
379
  padding: var(--ui-space-4) var(--ui-space-10);
380
380
  background: var(--ui-surface-low);
381
- border: 1px solid var(--ui-border-faint);
381
+ border: 1px solid var(--ui-border-low);
382
382
  border-radius: var(--ui-radius-sm);
383
383
  color: var(--ui-text-secondary);
384
384
  font-size: var(--ui-font-size-sm);
@@ -388,7 +388,7 @@
388
388
 
389
389
  .ghost-btn:hover:not(:disabled) {
390
390
  color: var(--ui-text-primary);
391
- border-color: var(--ui-border-default);
391
+ border-color: var(--ui-border);
392
392
  }
393
393
 
394
394
  .ghost-btn:disabled {
@@ -421,7 +421,7 @@
421
421
  width: 4.5rem;
422
422
  padding: var(--ui-space-2) var(--ui-space-6);
423
423
  background: var(--ui-surface-lowest);
424
- border: 1px solid var(--ui-border-faint);
424
+ border: 1px solid var(--ui-border-low);
425
425
  border-radius: var(--ui-radius-sm);
426
426
  color: var(--ui-text-primary);
427
427
  font-family: var(--ui-font-mono);
@@ -455,7 +455,7 @@
455
455
  gap: var(--ui-space-6);
456
456
  padding: var(--ui-space-4) var(--ui-space-12);
457
457
  background: var(--ui-surface-high);
458
- border: 1px solid var(--ui-border-medium);
458
+ border: 1px solid var(--ui-border-high);
459
459
  border-radius: var(--ui-radius-sm);
460
460
  color: var(--ui-text-primary);
461
461
  font-size: var(--ui-font-size-sm);
@@ -465,6 +465,6 @@
465
465
 
466
466
  .primary-btn:hover {
467
467
  background: var(--ui-surface-higher);
468
- border-color: var(--ui-border-strong);
468
+ border-color: var(--ui-border-higher);
469
469
  }
470
470
  </style>
@@ -6,7 +6,7 @@
6
6
  * to gradient state, so we don't have to refactor UIPaletteSelector itself.
7
7
  */
8
8
  import UIPaletteSelector from './UIPaletteSelector.svelte';
9
- import { setCssVar, removeCssVar } from '../lib/cssVarSync';
9
+ import { setCssVar, removeCssVar } from '../core/cssVarSync';
10
10
 
11
11
  interface Props {
12
12
  stopId: string; // unique key (e.g. gradient-var + stop index)