@motion-proto/live-tokens 0.1.1 → 0.3.2

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 (224) hide show
  1. package/README.md +168 -21
  2. package/dist-plugin/index.cjs +823 -336
  3. package/dist-plugin/index.d.cts +9 -7
  4. package/dist-plugin/index.d.ts +9 -7
  5. package/dist-plugin/index.js +822 -335
  6. package/package.json +46 -20
  7. package/src/assets/newspaper.webp +0 -0
  8. package/src/assets/offering.webp +0 -0
  9. package/src/component-editor/BadgeEditor.svelte +170 -0
  10. package/src/component-editor/CalloutEditor.svelte +103 -0
  11. package/src/component-editor/CardEditor.svelte +184 -0
  12. package/src/component-editor/CollapsibleSectionEditor.svelte +167 -0
  13. package/src/component-editor/CornerBadgeEditor.svelte +207 -0
  14. package/src/component-editor/DialogEditor.svelte +172 -0
  15. package/src/component-editor/ImageEditor.svelte +72 -0
  16. package/src/component-editor/InlineEditActionsEditor.svelte +83 -0
  17. package/src/component-editor/NotificationEditor.svelte +160 -0
  18. package/src/component-editor/ProgressBarEditor.svelte +124 -0
  19. package/src/component-editor/RadioButtonEditor.svelte +140 -0
  20. package/src/component-editor/SectionDividerEditor.svelte +263 -0
  21. package/src/component-editor/SegmentedControlEditor.svelte +154 -0
  22. package/src/component-editor/StandardButtonsEditor.svelte +178 -0
  23. package/src/component-editor/TabBarEditor.svelte +137 -0
  24. package/src/component-editor/TableEditor.svelte +128 -0
  25. package/src/component-editor/TooltipEditor.svelte +122 -0
  26. package/src/component-editor/editorTokens.test.ts +93 -0
  27. package/src/component-editor/groupKeySlots.test.ts +67 -0
  28. package/src/component-editor/groupKeySnapshot.test.ts +52 -0
  29. package/src/component-editor/index.ts +5 -0
  30. package/src/component-editor/registry.ts +246 -0
  31. package/src/component-editor/scaffolding/AngleDial.svelte +185 -0
  32. package/src/component-editor/scaffolding/ComponentEditorBase.svelte +96 -0
  33. package/src/component-editor/scaffolding/ComponentFileManager.svelte +682 -0
  34. package/src/component-editor/scaffolding/ComponentFileMenu.svelte +312 -0
  35. package/src/component-editor/scaffolding/ComponentsTab.svelte +69 -0
  36. package/src/component-editor/scaffolding/CopyFromMenu.svelte +246 -0
  37. package/src/component-editor/scaffolding/DemoHeader.svelte +21 -0
  38. package/src/component-editor/scaffolding/DividerEditor.svelte +81 -0
  39. package/src/component-editor/scaffolding/FieldsetWrapper.svelte +46 -0
  40. package/src/component-editor/scaffolding/GradientCard.svelte +291 -0
  41. package/src/component-editor/scaffolding/LinkageChart.svelte +297 -0
  42. package/src/component-editor/scaffolding/LinkedBlock.svelte +418 -0
  43. package/src/component-editor/scaffolding/NonStylableConfig.svelte +57 -0
  44. package/src/component-editor/scaffolding/SaveAsDialog.svelte +177 -0
  45. package/src/component-editor/scaffolding/ShadowBackdrop.svelte +25 -0
  46. package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +56 -0
  47. package/src/component-editor/scaffolding/StateBlock.svelte +115 -0
  48. package/src/component-editor/scaffolding/TokenLayout.svelte +511 -0
  49. package/src/component-editor/scaffolding/TypeEditor.svelte +82 -0
  50. package/src/component-editor/scaffolding/VariantGroup.svelte +277 -0
  51. package/src/component-editor/scaffolding/buildTypeGroupTokens.ts +97 -0
  52. package/src/component-editor/scaffolding/componentSectionType.ts +8 -0
  53. package/src/component-editor/scaffolding/componentSources.ts +9 -0
  54. package/src/component-editor/scaffolding/defaultSections.ts +16 -0
  55. package/src/component-editor/scaffolding/editorContext.ts +44 -0
  56. package/src/component-editor/scaffolding/linkedBlock.ts +226 -0
  57. package/src/component-editor/scaffolding/siblings.ts +33 -0
  58. package/src/component-editor/scaffolding/types.ts +39 -0
  59. package/src/components/Badge.svelte +231 -42
  60. package/src/components/Button.svelte +324 -124
  61. package/src/components/Callout.svelte +145 -0
  62. package/src/components/Card.svelte +123 -25
  63. package/src/components/CollapsibleSection.svelte +213 -35
  64. package/src/components/CornerBadge.svelte +224 -0
  65. package/src/components/Dialog.svelte +137 -114
  66. package/src/components/Image.svelte +43 -0
  67. package/src/components/InlineEditActions.svelte +74 -14
  68. package/src/components/Notification.svelte +184 -163
  69. package/src/components/ProgressBar.svelte +216 -22
  70. package/src/components/RadioButton.svelte +110 -40
  71. package/src/components/SectionDivider.svelte +428 -74
  72. package/src/components/SegmentedControl.svelte +203 -0
  73. package/src/components/TabBar.svelte +146 -21
  74. package/src/components/Table.svelte +102 -0
  75. package/src/components/Tooltip.svelte +45 -19
  76. package/src/components/types.ts +51 -0
  77. package/src/data/google-fonts.json +75 -0
  78. package/src/lib/ColumnsOverlay.svelte +20 -7
  79. package/src/lib/LiveEditorOverlay.svelte +257 -78
  80. package/src/lib/columnsOverlay.ts +21 -17
  81. package/src/lib/componentConfig.test.ts +204 -0
  82. package/src/lib/componentConfigKeys.ts +19 -0
  83. package/src/lib/componentConfigService.ts +88 -0
  84. package/src/lib/copyPopover.ts +30 -0
  85. package/src/lib/cssVarSync.ts +59 -7
  86. package/src/lib/editorConfigStore.ts +0 -10
  87. package/src/lib/editorCore.ts +402 -0
  88. package/src/lib/editorKeybindings.ts +52 -0
  89. package/src/lib/editorPersistence.ts +106 -0
  90. package/src/lib/editorRenderer.ts +74 -0
  91. package/src/lib/editorStore.test.ts +328 -0
  92. package/src/lib/editorStore.ts +412 -0
  93. package/src/lib/editorTypes.ts +100 -0
  94. package/src/lib/editorViewStore.ts +55 -0
  95. package/src/lib/files/versionedFileResource.ts +140 -0
  96. package/src/lib/fontLoader.ts +130 -0
  97. package/src/lib/fontMigration.ts +140 -0
  98. package/src/lib/fontParse.ts +168 -0
  99. package/src/lib/index.ts +48 -30
  100. package/src/lib/lazyConfig.test.ts +54 -0
  101. package/src/lib/migrations/2026-04-24-component-prefix-and-suffix-renames.ts +64 -0
  102. package/src/lib/migrations/2026-04-24-legacy-keys-and-bg-to-canvas.ts +71 -0
  103. package/src/lib/migrations/2026-04-27-segmentedcontrol-disabled-flatten.ts +43 -0
  104. package/src/lib/migrations/2026-05-08-collapsiblesection-frame-and-cleanup.ts +68 -0
  105. package/src/lib/migrations/2026-05-08-collapsiblesection-variant-namespace.ts +35 -0
  106. package/src/lib/migrations/2026-05-10-sectiondivider-gradient-stops.ts +50 -0
  107. package/src/lib/migrations/2026-05-13-primary-to-brand.ts +90 -0
  108. package/src/lib/migrations/index.ts +93 -0
  109. package/src/lib/migrations/migrations.test.ts +341 -0
  110. package/src/lib/navLinkTypes.ts +1 -0
  111. package/src/lib/overlayState.ts +3 -0
  112. package/src/lib/paletteDerivation.ts +300 -0
  113. package/src/lib/parentRouteStore.ts +42 -0
  114. package/src/lib/parsers/globalRootBlock.ts +32 -0
  115. package/src/lib/presetService.ts +94 -0
  116. package/src/lib/router.ts +42 -10
  117. package/src/lib/scrollSection.ts +45 -0
  118. package/src/lib/slices/columns.ts +59 -0
  119. package/src/lib/slices/components.ts +362 -0
  120. package/src/lib/slices/domainVars.ts +15 -0
  121. package/src/lib/slices/fonts.ts +30 -0
  122. package/src/lib/slices/gradients.ts +153 -0
  123. package/src/lib/slices/overlays.ts +132 -0
  124. package/src/lib/slices/palettes.ts +26 -0
  125. package/src/lib/slices/shadows.ts +123 -0
  126. package/src/lib/storage.ts +88 -0
  127. package/src/lib/themeInit.ts +74 -0
  128. package/src/lib/themeService.ts +101 -0
  129. package/src/lib/themeTypes.ts +146 -0
  130. package/src/lib/tokenRegistry.ts +148 -0
  131. package/src/pages/ComponentEditorPage.svelte +384 -0
  132. package/src/pages/ComponentEditorPage.svelte.d.ts +2 -0
  133. package/src/pages/Editor.svelte +98 -0
  134. package/src/pages/Editor.svelte.d.ts +2 -0
  135. package/src/pages/EditorShell.svelte +348 -0
  136. package/src/styles/_padding.scss +34 -0
  137. package/src/styles/fonts/Fraunces/Fraunces-italic-latin-ext.woff2 +0 -0
  138. package/src/styles/fonts/Fraunces/Fraunces-italic-latin.woff2 +0 -0
  139. package/src/styles/fonts/Fraunces/Fraunces-roman-latin-ext.woff2 +0 -0
  140. package/src/styles/fonts/Fraunces/Fraunces-roman-latin.woff2 +0 -0
  141. package/src/styles/fonts/Manrope/Manrope-latin-ext.woff2 +0 -0
  142. package/src/styles/fonts/Manrope/Manrope-latin.woff2 +0 -0
  143. package/src/styles/fonts.css +22 -10
  144. package/src/styles/form-controls.css +14 -16
  145. package/src/styles/tokens.css +1322 -0
  146. package/src/styles/ui-editor.css +126 -0
  147. package/src/{showcase → ui}/BezierCurveEditor.svelte +14 -14
  148. package/src/{showcase → ui}/ColorEditPanel.svelte +42 -36
  149. package/src/ui/EditorViewSwitcher.svelte +180 -0
  150. package/src/ui/FontStackEditor.svelte +360 -0
  151. package/src/ui/GradientEditor.svelte +461 -0
  152. package/src/ui/GradientStopPicker.svelte +74 -0
  153. package/src/ui/PaletteEditor.svelte +1590 -0
  154. package/src/ui/PaletteEditor.test.ts +108 -0
  155. package/src/ui/PresetFileManager.svelte +567 -0
  156. package/src/ui/ProjectFontsSection.svelte +645 -0
  157. package/src/{showcase → ui}/SurfacesTab.svelte +39 -39
  158. package/src/{showcase → ui}/TextTab.svelte +27 -27
  159. package/src/{showcase/TokenFileManager.svelte → ui/ThemeFileManager.svelte} +196 -112
  160. package/src/ui/Toggle.svelte +108 -0
  161. package/src/ui/UICopyPopover.svelte +78 -0
  162. package/src/{showcase/EditorDialog.svelte → ui/UIDialog.svelte} +66 -25
  163. package/src/ui/UIFontFamilySelector.svelte +309 -0
  164. package/src/ui/UIFontSizeSelector.svelte +165 -0
  165. package/src/ui/UIFontWeightSelector.svelte +52 -0
  166. package/src/ui/UILineHeightSelector.svelte +47 -0
  167. package/src/ui/UILinkToggle.svelte +60 -0
  168. package/src/ui/UIOptionItem.svelte +74 -0
  169. package/src/ui/UIOptionList.svelte +27 -0
  170. package/src/ui/UIPaddingSelector.svelte +661 -0
  171. package/src/ui/UIPaletteSelector.svelte +1084 -0
  172. package/src/ui/UIRadio.svelte +72 -0
  173. package/src/ui/UIRadioGroup.svelte +59 -0
  174. package/src/ui/UIRelinkConfirmPopover.svelte +235 -0
  175. package/src/ui/UITokenSelector.svelte +509 -0
  176. package/src/ui/UIVariantSelector.svelte +145 -0
  177. package/src/ui/VariablesTab.svelte +252 -0
  178. package/src/ui/index.ts +31 -0
  179. package/src/ui/keepInViewport.ts +84 -0
  180. package/src/ui/palette/GradientStopEditor.svelte +482 -0
  181. package/src/ui/palette/OverridesPanel.svelte +526 -0
  182. package/src/ui/palette/PaletteBase.svelte +165 -0
  183. package/src/ui/palette/ScaleCurveEditor.svelte +38 -0
  184. package/src/ui/palette/paletteEditorState.ts +89 -0
  185. package/src/ui/sections/ColumnsSection.svelte +273 -0
  186. package/src/ui/sections/GradientsSection.svelte +147 -0
  187. package/src/ui/sections/OverlaysSection.svelte +670 -0
  188. package/src/ui/sections/ShadowsSection.svelte +1250 -0
  189. package/src/ui/sections/TokenScaleTable.svelte +332 -0
  190. package/src/ui/sections/tokenScales.ts +81 -0
  191. package/src/ui/variantScales.ts +108 -0
  192. package/src/components/DetailNav.svelte +0 -78
  193. package/src/components/Toggle.svelte +0 -86
  194. package/src/lib/tokenInit.ts +0 -29
  195. package/src/lib/tokenService.ts +0 -144
  196. package/src/lib/tokenTypes.ts +0 -45
  197. package/src/pages/Admin.svelte +0 -100
  198. package/src/pages/ShowcasePage.svelte +0 -144
  199. package/src/showcase/BackupBrowser.svelte +0 -617
  200. package/src/showcase/ComponentsTab.svelte +0 -105
  201. package/src/showcase/PaletteEditor.svelte +0 -2579
  202. package/src/showcase/PaletteSelector.svelte +0 -627
  203. package/src/showcase/TokenMap.svelte +0 -54
  204. package/src/showcase/VariablesTab.svelte +0 -2655
  205. package/src/showcase/VisualsTab.svelte +0 -231
  206. package/src/showcase/demos/BadgeDemo.svelte +0 -56
  207. package/src/showcase/demos/CardDemo.svelte +0 -50
  208. package/src/showcase/demos/ChoiceButtonsDemo.svelte +0 -192
  209. package/src/showcase/demos/CollapsibleSectionDemo.svelte +0 -54
  210. package/src/showcase/demos/DialogDemo.svelte +0 -42
  211. package/src/showcase/demos/InlineEditActionsDemo.svelte +0 -25
  212. package/src/showcase/demos/NotificationDemo.svelte +0 -147
  213. package/src/showcase/demos/ProgressBarDemo.svelte +0 -54
  214. package/src/showcase/demos/RadioButtonDemo.svelte +0 -56
  215. package/src/showcase/demos/SectionDividerDemo.svelte +0 -77
  216. package/src/showcase/demos/StandardButtonsDemo.svelte +0 -455
  217. package/src/showcase/demos/TabBarDemo.svelte +0 -58
  218. package/src/showcase/demos/TooltipDemo.svelte +0 -52
  219. package/src/showcase/editor.css +0 -93
  220. package/src/showcase/index.ts +0 -17
  221. package/src/styles/fonts/Domine/Domine-VariableFont_wght.ttf +0 -0
  222. package/src/styles/fonts/Domine/OFL.txt +0 -97
  223. package/src/styles/fonts/Domine/README.txt +0 -66
  224. /package/src/{showcase → ui}/curveEngine.ts +0 -0
@@ -1,627 +0,0 @@
1
- <script lang="ts">
2
- import { onMount, onDestroy, createEventDispatcher } from 'svelte';
3
- import { setCssVar, removeCssVar } from '../lib/cssVarSync';
4
-
5
- const dispatch = createEventDispatcher();
6
-
7
- export let variable: string;
8
- export let label: string;
9
-
10
- type Category = 'palette' | 'surface' | 'border' | 'text';
11
-
12
- const families = [
13
- { name: 'neutral', label: 'Neutral' },
14
- { name: 'alternate', label: 'Alternate' },
15
- { name: 'bg', label: 'Background' },
16
- { name: 'primary', label: 'Primary' },
17
- { name: 'accent', label: 'Accent' },
18
- { name: 'special', label: 'Special' },
19
- { name: 'success', label: 'Success' },
20
- { name: 'warning', label: 'Warning' },
21
- { name: 'info', label: 'Info' },
22
- { name: 'danger', label: 'Danger' },
23
- ];
24
-
25
- const familyNames = families.map(f => f.name);
26
-
27
- const paletteSteps = ['100', '200', '300', '400', '500', '600', '700', '800', '850', '900', '950'];
28
-
29
- const surfaceSteps = [
30
- { key: 'lowest', label: 'Lowest' },
31
- { key: 'lower', label: 'Lower' },
32
- { key: 'low', label: 'Low' },
33
- { key: '', label: 'Default' },
34
- { key: 'high', label: 'High' },
35
- { key: 'higher', label: 'Higher' },
36
- { key: 'highest', label: 'Highest' },
37
- ];
38
-
39
- const borderSteps = [
40
- { key: 'faint', label: 'Faint' },
41
- { key: 'subtle', label: 'Subtle' },
42
- { key: '', label: 'Default' },
43
- { key: 'medium', label: 'Medium' },
44
- { key: 'strong', label: 'Strong' },
45
- ];
46
-
47
- const textSteps = [
48
- { key: 'primary', label: 'Primary' },
49
- { key: 'secondary', label: 'Secondary' },
50
- { key: 'tertiary', label: 'Tertiary' },
51
- { key: 'muted', label: 'Muted' },
52
- { key: 'disabled', label: 'Disabled' },
53
- ];
54
-
55
- const surfaceStepKeys = surfaceSteps.map(s => s.key);
56
- const borderStepKeys = borderSteps.map(s => s.key);
57
- const textStepKeys = textSteps.map(s => s.key);
58
-
59
- const familiesWithText = ['neutral', 'bg', 'primary', 'accent', 'special', 'success', 'warning', 'info', 'danger'];
60
-
61
- const allCategories: { id: Category; label: string }[] = [
62
- { id: 'palette', label: 'Palette' },
63
- { id: 'surface', label: 'Surface' },
64
- { id: 'border', label: 'Border' },
65
- { id: 'text', label: 'Text' },
66
- ];
67
-
68
- let open = false;
69
- let selectedFamily: string | null = null;
70
- let selectedTab: Category = 'palette';
71
- let container: HTMLElement;
72
-
73
- let chosenCategory: Category | null = null;
74
- let chosenFamily: string | null = null;
75
- let chosenStep: string | null = null;
76
- let chosenHex: string | null = null;
77
-
78
- /** Get the CSS variable name for a category/family/step combination */
79
- function getVarName(category: Category, family: string, stepKey: string): string {
80
- switch (category) {
81
- case 'palette':
82
- return `--color-${family}-${stepKey}`;
83
- case 'surface':
84
- return stepKey ? `--surface-${family}-${stepKey}` : `--surface-${family}`;
85
- case 'border':
86
- if (!stepKey) {
87
- return family === 'neutral' ? `--border-${family}-default` : `--border-${family}`;
88
- }
89
- return `--border-${family}-${stepKey}`;
90
- case 'text':
91
- if (family === 'neutral') return `--text-${stepKey}`;
92
- if (family === 'primary' && stepKey === 'primary') return '--text-primary-color';
93
- if (stepKey === 'primary') return `--text-${family}`;
94
- return `--text-${family}-${stepKey}`;
95
- }
96
- }
97
-
98
- function parseTextVarName(varName: string): { family: string; step: string } | null {
99
- if (varName === '--text-primary') return { family: 'neutral', step: 'primary' };
100
- if (varName === '--text-secondary') return { family: 'neutral', step: 'secondary' };
101
- if (varName === '--text-tertiary') return { family: 'neutral', step: 'tertiary' };
102
- if (varName === '--text-muted') return { family: 'neutral', step: 'muted' };
103
- if (varName === '--text-disabled') return { family: 'neutral', step: 'disabled' };
104
- if (varName === '--text-primary-color') return { family: 'primary', step: 'primary' };
105
- const m = varName.match(/^--text-([a-z]+)(?:-([a-z]+))?$/);
106
- if (m) {
107
- const fam = m[1];
108
- const hier = m[2] || 'primary';
109
- if (familiesWithText.includes(fam) && fam !== 'neutral' && textStepKeys.includes(hier)) {
110
- return { family: fam, step: hier };
111
- }
112
- }
113
- return null;
114
- }
115
-
116
- /** Parse a var(...) reference into category/family/step */
117
- function parseRef(value: string): { category: Category; family: string; step: string } | null {
118
- const varMatch = value.match(/var\((--[a-z0-9-]+)\)/);
119
- if (!varMatch) return null;
120
- const varName = varMatch[1];
121
-
122
- const paletteM = varName.match(/^--color-([a-z]+)-(\d{3})$/);
123
- if (paletteM && familyNames.includes(paletteM[1]) && paletteSteps.includes(paletteM[2])) {
124
- return { category: 'palette', family: paletteM[1], step: paletteM[2] };
125
- }
126
-
127
- const surfaceM = varName.match(/^--surface-([a-z]+)(?:-([a-z]+))?$/);
128
- if (surfaceM && familyNames.includes(surfaceM[1])) {
129
- const step = surfaceM[2] || '';
130
- if (surfaceStepKeys.includes(step)) {
131
- return { category: 'surface', family: surfaceM[1], step };
132
- }
133
- }
134
-
135
- const borderM = varName.match(/^--border-([a-z]+)(?:-([a-z]+))?$/);
136
- if (borderM && familyNames.includes(borderM[1])) {
137
- let step = borderM[2] || '';
138
- if (step === 'default') step = '';
139
- if (borderStepKeys.includes(step)) {
140
- return { category: 'border', family: borderM[1], step };
141
- }
142
- }
143
-
144
- const textResult = parseTextVarName(varName);
145
- if (textResult) {
146
- return { category: 'text', ...textResult };
147
- }
148
-
149
- return null;
150
- }
151
-
152
- function initFromCurrent() {
153
- const raw = document.documentElement.style.getPropertyValue(variable).trim();
154
- if (!raw) return;
155
- const parsed = parseRef(raw);
156
- if (parsed) {
157
- chosenCategory = parsed.category;
158
- chosenFamily = parsed.family;
159
- chosenStep = parsed.step;
160
- chosenHex = null;
161
- } else if (/^#[0-9a-f]{3,8}$/i.test(raw)) {
162
- chosenHex = raw;
163
- chosenCategory = null;
164
- chosenFamily = null;
165
- chosenStep = null;
166
- }
167
- }
168
-
169
- function resetVariable() {
170
- removeCssVar(variable);
171
- chosenCategory = null;
172
- chosenFamily = null;
173
- chosenStep = null;
174
- chosenHex = null;
175
- open = false;
176
- selectedFamily = null;
177
- dispatch('change');
178
- }
179
-
180
- function toggle() {
181
- open = !open;
182
- if (!open) selectedFamily = null;
183
- }
184
-
185
- function selectFamily(name: string) {
186
- selectedFamily = name;
187
- if (name === chosenFamily && chosenCategory) {
188
- selectedTab = chosenCategory;
189
- }
190
- }
191
-
192
- function backToFamilies() {
193
- selectedFamily = null;
194
- }
195
-
196
- function selectSwatch(category: Category, step: string) {
197
- const varName = getVarName(category, selectedFamily!, step);
198
- if (varName === variable) {
199
- removeCssVar(variable);
200
- } else {
201
- setCssVar(variable, `var(${varName})`);
202
- }
203
- chosenCategory = category;
204
- chosenFamily = selectedFamily;
205
- chosenStep = step;
206
- chosenHex = null;
207
- open = false;
208
- selectedFamily = null;
209
- dispatch('change');
210
- }
211
-
212
- function handleClickOutside(e: MouseEvent) {
213
- if (container && !container.contains(e.target as Node)) {
214
- open = false;
215
- selectedFamily = null;
216
- }
217
- }
218
-
219
- onMount(() => {
220
- initFromCurrent();
221
- document.addEventListener('click', handleClickOutside, true);
222
- });
223
-
224
- onDestroy(() => {
225
- document.removeEventListener('click', handleClickOutside, true);
226
- });
227
-
228
- $: displayValue = chosenHex
229
- ? chosenHex
230
- : (chosenCategory === 'palette' && chosenFamily && chosenStep)
231
- ? `${chosenFamily}-${chosenStep}`
232
- : (chosenCategory && chosenFamily)
233
- ? getVarName(chosenCategory, chosenFamily, chosenStep || '').replace(/^--/, '')
234
- : '';
235
-
236
- $: availableTabs = selectedFamily
237
- ? allCategories.filter(c => c.id !== 'text' || familiesWithText.includes(selectedFamily!))
238
- : allCategories;
239
-
240
- $: if (selectedFamily && !availableTabs.find(t => t.id === selectedTab)) {
241
- selectedTab = 'palette';
242
- }
243
- </script>
244
-
245
- <div class="palette-selector" bind:this={container}>
246
- <button class="selector-trigger" on:click={toggle}>
247
- <div class="trigger-swatch" style="background: var({variable});"></div>
248
- <div class="trigger-text">
249
- <span class="trigger-label">{label}</span>
250
- {#if displayValue}
251
- <span class="trigger-value">{displayValue}</span>
252
- {/if}
253
- </div>
254
- <i class="fas fa-chevron-down trigger-chevron" class:open></i>
255
- </button>
256
-
257
- {#if open}
258
- <div class="selector-dropdown">
259
- {#if selectedFamily === null}
260
- <div class="dropdown-header">
261
- <code class="variable-name">{variable}</code>
262
- <button class="reset-btn" on:click={resetVariable} title="Reset to default">
263
- <i class="fas fa-undo"></i>
264
- </button>
265
- </div>
266
- <div class="family-list">
267
- {#each families as fam}
268
- <button class="family-item" class:active={chosenFamily === fam.name} on:click={() => selectFamily(fam.name)}>
269
- <div class="family-swatches">
270
- <div class="mini-swatch" style="background: var(--color-{fam.name}-300);"></div>
271
- <div class="mini-swatch" style="background: var(--color-{fam.name}-500);"></div>
272
- <div class="mini-swatch" style="background: var(--color-{fam.name}-700);"></div>
273
- </div>
274
- <span class="family-label">{fam.label}</span>
275
- <i class="fas fa-chevron-right family-arrow"></i>
276
- </button>
277
- {/each}
278
- </div>
279
- {:else}
280
- <button class="dropdown-back" on:click={backToFamilies}>
281
- <i class="fas fa-chevron-left"></i>
282
- <span>{families.find(f => f.name === selectedFamily)?.label}</span>
283
- </button>
284
-
285
- <div class="tab-bar">
286
- {#each availableTabs as tab}
287
- <button
288
- class="tab-btn"
289
- class:selected={selectedTab === tab.id}
290
- class:assigned={chosenCategory === tab.id && chosenFamily === selectedFamily}
291
- on:click={() => selectedTab = tab.id}
292
- >{tab.label}</button>
293
- {/each}
294
- </div>
295
-
296
- {#if selectedTab === 'palette'}
297
- <div class="step-grid">
298
- {#each paletteSteps as step}
299
- <button
300
- class="step-item"
301
- class:active={chosenCategory === 'palette' && chosenFamily === selectedFamily && chosenStep === step}
302
- on:click={() => selectSwatch('palette', step)}
303
- >
304
- <div class="step-swatch" style="background: var(--color-{selectedFamily}-{step});"></div>
305
- <span class="step-label">{step}</span>
306
- </button>
307
- {/each}
308
- </div>
309
- {:else if selectedTab === 'surface'}
310
- <div class="step-grid">
311
- {#each surfaceSteps as step}
312
- <button
313
- class="step-item"
314
- class:active={chosenCategory === 'surface' && chosenFamily === selectedFamily && chosenStep === step.key}
315
- on:click={() => selectSwatch('surface', step.key)}
316
- >
317
- <div class="step-swatch" style="background: var({getVarName('surface', selectedFamily, step.key)});"></div>
318
- <span class="step-label">{step.label}</span>
319
- </button>
320
- {/each}
321
- </div>
322
- {:else if selectedTab === 'border'}
323
- <div class="step-grid">
324
- {#each borderSteps as step}
325
- <button
326
- class="step-item"
327
- class:active={chosenCategory === 'border' && chosenFamily === selectedFamily && chosenStep === step.key}
328
- on:click={() => selectSwatch('border', step.key)}
329
- >
330
- <div class="step-swatch" style="background: var({getVarName('border', selectedFamily, step.key)});"></div>
331
- <span class="step-label">{step.label}</span>
332
- </button>
333
- {/each}
334
- </div>
335
- {:else if selectedTab === 'text'}
336
- <div class="step-grid">
337
- {#each textSteps as step}
338
- <button
339
- class="step-item"
340
- class:active={chosenCategory === 'text' && chosenFamily === selectedFamily && chosenStep === step.key}
341
- on:click={() => selectSwatch('text', step.key)}
342
- >
343
- <div class="step-swatch" style="background: var({getVarName('text', selectedFamily, step.key)});"></div>
344
- <span class="step-label">{step.label}</span>
345
- </button>
346
- {/each}
347
- </div>
348
- {/if}
349
- {/if}
350
- </div>
351
- {/if}
352
- </div>
353
-
354
- <style>
355
- .palette-selector {
356
- position: relative;
357
- }
358
-
359
- .selector-trigger {
360
- display: flex;
361
- align-items: center;
362
- gap: var(--space-8);
363
- padding: var(--space-6) var(--space-10);
364
- background: var(--ui-surface-low);
365
- border: 1px solid var(--ui-border-default);
366
- border-radius: var(--radius-md);
367
- cursor: pointer;
368
- transition: all var(--transition-fast);
369
- min-width: 10rem;
370
- }
371
-
372
- .selector-trigger:hover {
373
- border-color: var(--ui-border-strong);
374
- background: var(--ui-surface-high);
375
- }
376
-
377
- .trigger-swatch {
378
- width: 1.5rem;
379
- height: 1.5rem;
380
- border-radius: var(--radius-sm);
381
- border: 1px solid var(--ui-border-faint);
382
- flex-shrink: 0;
383
- }
384
-
385
- .trigger-text {
386
- display: flex;
387
- flex-direction: column;
388
- gap: 1px;
389
- flex: 1;
390
- text-align: left;
391
- }
392
-
393
- .trigger-label {
394
- font-size: var(--font-xs);
395
- color: var(--ui-text-secondary);
396
- font-weight: var(--font-weight-medium);
397
- }
398
-
399
- .trigger-value {
400
- font-size: 0.625rem;
401
- color: var(--ui-text-muted);
402
- font-family: var(--ui-font-mono);
403
- }
404
-
405
- .trigger-chevron {
406
- font-size: 0.5rem;
407
- color: var(--ui-text-muted);
408
- transition: transform var(--transition-fast);
409
- }
410
-
411
- .trigger-chevron.open {
412
- transform: rotate(180deg);
413
- }
414
-
415
- .selector-dropdown {
416
- position: absolute;
417
- top: calc(100% + var(--space-4));
418
- left: 0;
419
- min-width: 14rem;
420
- max-width: calc(100vw - 2rem);
421
- background: var(--ui-surface-higher);
422
- border: 1px solid var(--ui-border-medium);
423
- border-radius: var(--radius-md);
424
- box-shadow: var(--shadow-lg);
425
- z-index: 10;
426
- overflow: hidden;
427
- }
428
-
429
- .dropdown-header {
430
- display: flex;
431
- align-items: center;
432
- gap: var(--space-6);
433
- padding: var(--space-6) var(--space-8);
434
- border-bottom: 1px solid var(--ui-border-faint);
435
- }
436
-
437
- .variable-name {
438
- flex: 1;
439
- font-size: 0.625rem;
440
- color: var(--ui-text-muted);
441
- font-family: var(--ui-font-mono);
442
- overflow: hidden;
443
- text-overflow: ellipsis;
444
- white-space: nowrap;
445
- }
446
-
447
- .reset-btn {
448
- display: flex;
449
- align-items: center;
450
- justify-content: center;
451
- width: 1.5rem;
452
- height: 1.5rem;
453
- padding: 0;
454
- background: none;
455
- border: 1px solid var(--ui-border-default);
456
- border-radius: var(--radius-sm);
457
- color: var(--ui-text-secondary);
458
- font-size: 0.625rem;
459
- cursor: pointer;
460
- flex-shrink: 0;
461
- transition: all var(--transition-fast);
462
- }
463
-
464
- .reset-btn:hover {
465
- background: var(--ui-hover);
466
- border-color: var(--ui-border-strong);
467
- color: var(--ui-text-primary);
468
- }
469
-
470
- .dropdown-back {
471
- display: flex;
472
- align-items: center;
473
- gap: var(--space-6);
474
- width: 100%;
475
- padding: var(--space-8) var(--space-10);
476
- background: none;
477
- border: none;
478
- border-bottom: 1px solid var(--ui-border-faint);
479
- color: var(--ui-text-secondary);
480
- font-size: var(--font-sm);
481
- font-weight: var(--font-weight-medium);
482
- cursor: pointer;
483
- transition: background var(--transition-fast);
484
- }
485
-
486
- .dropdown-back:hover {
487
- background: var(--ui-hover);
488
- }
489
-
490
- .dropdown-back i {
491
- font-size: 0.5rem;
492
- }
493
-
494
- .tab-bar {
495
- display: flex;
496
- border-bottom: 1px solid var(--ui-border-faint);
497
- }
498
-
499
- .tab-btn {
500
- flex: 1;
501
- padding: var(--space-4) var(--space-4);
502
- background: none;
503
- border: 1px solid transparent;
504
- border-radius: 0;
505
- color: var(--ui-text-muted);
506
- font-size: 0.625rem;
507
- font-weight: var(--font-weight-medium);
508
- cursor: pointer;
509
- transition: all var(--transition-fast);
510
- text-align: center;
511
- }
512
-
513
- .tab-btn:hover {
514
- color: var(--ui-text-secondary);
515
- background: var(--ui-hover);
516
- }
517
-
518
- .tab-btn.assigned {
519
- border-color: var(--ui-border-default);
520
- }
521
-
522
- .tab-btn.selected {
523
- color: var(--ui-text-primary);
524
- box-shadow: inset 0 -2px 0 var(--ui-text-accent);
525
- background: var(--ui-hover);
526
- }
527
-
528
- .family-list {
529
- display: flex;
530
- flex-direction: column;
531
- max-height: 20rem;
532
- overflow-y: auto;
533
- }
534
-
535
- .family-item {
536
- display: flex;
537
- align-items: center;
538
- gap: var(--space-8);
539
- width: 100%;
540
- padding: var(--space-6) var(--space-10);
541
- background: none;
542
- border: none;
543
- cursor: pointer;
544
- transition: background var(--transition-fast);
545
- }
546
-
547
- .family-item:hover {
548
- background: var(--ui-hover);
549
- }
550
-
551
- .family-item.active {
552
- background: var(--ui-hover-high);
553
- box-shadow: inset 3px 0 0 var(--ui-text-accent);
554
- }
555
-
556
- .family-item.active .family-label {
557
- color: var(--ui-text-accent);
558
- }
559
-
560
- .family-swatches {
561
- display: flex;
562
- gap: 2px;
563
- }
564
-
565
- .mini-swatch {
566
- width: 0.75rem;
567
- height: 0.75rem;
568
- border-radius: 2px;
569
- }
570
-
571
- .family-label {
572
- flex: 1;
573
- font-size: var(--font-sm);
574
- color: var(--ui-text-primary);
575
- text-align: left;
576
- }
577
-
578
- .family-arrow {
579
- font-size: 0.5rem;
580
- color: var(--ui-text-muted);
581
- }
582
-
583
- .step-grid {
584
- display: grid;
585
- grid-template-columns: repeat(4, 1fr);
586
- gap: var(--space-4);
587
- padding: var(--space-8);
588
- }
589
-
590
- .step-item {
591
- display: flex;
592
- flex-direction: column;
593
- align-items: center;
594
- gap: var(--space-2);
595
- padding: var(--space-4);
596
- background: none;
597
- border: 1px solid transparent;
598
- border-radius: var(--radius-sm);
599
- cursor: pointer;
600
- transition: all var(--transition-fast);
601
- }
602
-
603
- .step-item:hover {
604
- background: var(--ui-hover);
605
- border-color: var(--ui-border-default);
606
- }
607
-
608
- .step-item.active {
609
- border-color: var(--ui-text-accent);
610
- border-width: 2px;
611
- background: var(--ui-hover-high);
612
- padding: 3px;
613
- }
614
-
615
- .step-swatch {
616
- width: 2rem;
617
- height: 1.5rem;
618
- border-radius: var(--radius-sm);
619
- border: 1px solid var(--ui-border-faint);
620
- }
621
-
622
- .step-label {
623
- font-size: 0.5625rem;
624
- color: var(--ui-text-tertiary);
625
- font-family: var(--ui-font-mono);
626
- }
627
- </style>
@@ -1,54 +0,0 @@
1
- <script lang="ts">
2
- import PaletteSelector from './PaletteSelector.svelte';
3
-
4
- export let title: string = '';
5
- export let tokens: { label: string; variable: string }[];
6
- </script>
7
-
8
- <div class="token-group">
9
- {#if title}
10
- <span class="token-group-title">{title}</span>
11
- {/if}
12
- <div class="token-grid">
13
- {#each tokens as token}
14
- <div class="token-entry">
15
- <PaletteSelector variable={token.variable} label={token.label} on:change />
16
- <code class="token-var">{token.variable}</code>
17
- </div>
18
- {/each}
19
- </div>
20
- </div>
21
-
22
- <style>
23
- .token-group {
24
- display: flex;
25
- flex-direction: column;
26
- gap: var(--space-6);
27
- }
28
-
29
- .token-group-title {
30
- font-size: var(--font-xs);
31
- font-weight: var(--font-weight-semibold);
32
- color: var(--ui-text-tertiary);
33
- font-family: var(--ui-font-mono);
34
- }
35
-
36
- .token-grid {
37
- display: flex;
38
- flex-wrap: wrap;
39
- gap: var(--space-8);
40
- }
41
-
42
- .token-entry {
43
- display: flex;
44
- flex-direction: column;
45
- gap: var(--space-2);
46
- }
47
-
48
- .token-var {
49
- font-size: 0.5625rem;
50
- color: var(--ui-text-muted);
51
- font-family: var(--ui-font-mono);
52
- padding-left: var(--space-2);
53
- }
54
- </style>