@motion-proto/live-tokens 0.3.9 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +47 -4
  2. package/package.json +18 -12
  3. package/src/component-editor/BadgeEditor.svelte +24 -22
  4. package/src/component-editor/CalloutEditor.svelte +3 -3
  5. package/src/component-editor/CardEditor.svelte +25 -21
  6. package/src/component-editor/CollapsibleSectionEditor.svelte +27 -25
  7. package/src/component-editor/CornerBadgeEditor.svelte +37 -35
  8. package/src/component-editor/DialogEditor.svelte +26 -24
  9. package/src/component-editor/ImageEditor.svelte +11 -9
  10. package/src/component-editor/InlineEditActionsEditor.svelte +17 -15
  11. package/src/component-editor/NotificationEditor.svelte +32 -30
  12. package/src/component-editor/ProgressBarEditor.svelte +3 -3
  13. package/src/component-editor/RadioButtonEditor.svelte +31 -29
  14. package/src/component-editor/SectionDividerEditor.svelte +30 -28
  15. package/src/component-editor/SegmentedControlEditor.svelte +29 -25
  16. package/src/component-editor/StandardButtonsEditor.svelte +42 -38
  17. package/src/component-editor/TabBarEditor.svelte +20 -18
  18. package/src/component-editor/TableEditor.svelte +4 -4
  19. package/src/component-editor/TooltipEditor.svelte +11 -9
  20. package/src/component-editor/registry.ts +2 -2
  21. package/src/component-editor/scaffolding/AngleDial.svelte +20 -19
  22. package/src/component-editor/scaffolding/ComponentEditorBase.svelte +44 -20
  23. package/src/component-editor/scaffolding/ComponentFileManager.svelte +262 -38
  24. package/src/component-editor/scaffolding/ComponentFileMenu.svelte +41 -29
  25. package/src/component-editor/scaffolding/ComponentsTab.svelte +7 -3
  26. package/src/component-editor/scaffolding/CopyFromMenu.svelte +21 -12
  27. package/src/component-editor/scaffolding/DemoHeader.svelte +13 -4
  28. package/src/component-editor/scaffolding/DividerEditor.svelte +27 -14
  29. package/src/component-editor/scaffolding/FieldsetWrapper.svelte +10 -4
  30. package/src/component-editor/scaffolding/GradientCard.svelte +25 -20
  31. package/src/component-editor/scaffolding/LinkageChart.svelte +43 -34
  32. package/src/component-editor/scaffolding/LinkedBlock.svelte +24 -21
  33. package/src/component-editor/scaffolding/NonStylableConfig.svelte +6 -1
  34. package/src/component-editor/scaffolding/SaveAsDialog.svelte +39 -35
  35. package/src/component-editor/scaffolding/ShadowBackdrop.svelte +21 -9
  36. package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +8 -3
  37. package/src/component-editor/scaffolding/StateBlock.svelte +30 -13
  38. package/src/component-editor/scaffolding/TokenLayout.svelte +46 -30
  39. package/src/component-editor/scaffolding/TypeEditor.svelte +52 -26
  40. package/src/component-editor/scaffolding/VariantGroup.svelte +81 -48
  41. package/src/component-editor/scaffolding/componentSectionType.ts +2 -2
  42. package/src/components/Badge.svelte +45 -26
  43. package/src/components/Button.svelte +44 -21
  44. package/src/components/Callout.svelte +17 -12
  45. package/src/components/Card.svelte +23 -11
  46. package/src/components/CollapsibleSection.svelte +56 -27
  47. package/src/components/CornerBadge.svelte +32 -18
  48. package/src/components/Dialog.svelte +55 -31
  49. package/src/components/Image.svelte +14 -5
  50. package/src/components/InlineEditActions.svelte +22 -10
  51. package/src/components/Notification.svelte +39 -19
  52. package/src/components/ProgressBar.svelte +27 -17
  53. package/src/components/RadioButton.svelte +27 -10
  54. package/src/components/SectionDivider.svelte +34 -26
  55. package/src/components/SegmentedControl.svelte +23 -9
  56. package/src/components/TabBar.svelte +23 -10
  57. package/src/components/Table.svelte +8 -3
  58. package/src/components/Tooltip.svelte +15 -5
  59. package/src/lib/ColumnsOverlay.svelte +3 -3
  60. package/src/lib/LiveEditorOverlay.svelte +57 -36
  61. package/src/pages/ComponentEditorPage.svelte +25 -14
  62. package/src/pages/Editor.svelte +8 -2
  63. package/src/pages/EditorShell.svelte +24 -20
  64. package/src/styles/site.css +138 -0
  65. package/src/styles/tokens.css +78 -76
  66. package/src/styles/ui-form-controls.css +186 -0
  67. package/src/ui/BezierCurveEditor.svelte +59 -43
  68. package/src/ui/ColorEditPanel.svelte +71 -44
  69. package/src/ui/EditorViewSwitcher.svelte +9 -5
  70. package/src/ui/FontStackEditor.svelte +17 -16
  71. package/src/ui/GradientEditor.svelte +42 -33
  72. package/src/ui/GradientStopPicker.svelte +18 -29
  73. package/src/ui/PaletteEditor.svelte +238 -212
  74. package/src/ui/PresetFileManager.svelte +20 -18
  75. package/src/ui/ProjectFontsSection.svelte +34 -34
  76. package/src/ui/SurfacesTab.svelte +3 -3
  77. package/src/ui/TextTab.svelte +2 -2
  78. package/src/ui/ThemeFileManager.svelte +38 -35
  79. package/src/ui/Toggle.svelte +11 -9
  80. package/src/ui/UICopyPopover.svelte +19 -15
  81. package/src/ui/UIDialog.svelte +48 -30
  82. package/src/ui/UIFontFamilySelector.svelte +104 -78
  83. package/src/ui/UIFontSizeSelector.svelte +38 -20
  84. package/src/ui/UIFontWeightSelector.svelte +33 -13
  85. package/src/ui/UILineHeightSelector.svelte +33 -13
  86. package/src/ui/UILinkToggle.svelte +7 -6
  87. package/src/ui/UIOptionItem.svelte +21 -7
  88. package/src/ui/UIOptionList.svelte +9 -3
  89. package/src/ui/UIPaddingSelector.svelte +108 -82
  90. package/src/ui/UIPaletteSelector.svelte +186 -161
  91. package/src/ui/UIRadio.svelte +23 -8
  92. package/src/ui/UIRadioGroup.svelte +9 -8
  93. package/src/ui/UIRelinkConfirmPopover.svelte +26 -16
  94. package/src/ui/UITokenSelector.svelte +112 -68
  95. package/src/ui/UIVariantSelector.svelte +79 -57
  96. package/src/ui/VariablesTab.svelte +15 -15
  97. package/src/ui/palette/GradientStopEditor.svelte +45 -26
  98. package/src/ui/palette/OverridesPanel.svelte +85 -49
  99. package/src/ui/palette/PaletteBase.svelte +60 -32
  100. package/src/ui/palette/ScaleCurveEditor.svelte +25 -10
  101. package/src/ui/sections/ColumnsSection.svelte +13 -13
  102. package/src/ui/sections/GradientsSection.svelte +12 -9
  103. package/src/ui/sections/OverlaysSection.svelte +50 -47
  104. package/src/ui/sections/ShadowsSection.svelte +110 -104
  105. package/src/ui/sections/TokenScaleTable.svelte +38 -22
  106. package/src/ui/sections/tokenScales.ts +2 -2
  107. package/src/styles/form-controls.css +0 -188
@@ -2,7 +2,10 @@
2
2
  import BezierCurveEditor from '../BezierCurveEditor.svelte';
3
3
  import type { CurveAnchor, CurveConfig } from '../curveEngine';
4
4
 
5
- /**
5
+
6
+
7
+ interface Props {
8
+ /**
6
9
  * Single-channel curve editor — one Bezier curve for one channel
7
10
  * (lightness or saturation) of one scale (palette / gray-palette /
8
11
  * Surfaces / Borders / Text). Instantiated 6+ times across PaletteEditor:
@@ -14,16 +17,28 @@
14
17
  * parent only needs to know how to wire `(key, value)` once (via a
15
18
  * closure passed in).
16
19
  */
20
+ curveKey: string;
21
+ anchors: CurveAnchor[];
22
+ cfg: CurveConfig;
23
+ stepCount: number;
24
+ defaults: CurveAnchor[];
25
+ offset?: number;
26
+ lockedAnchorIndex?: number | null;
27
+ onAnchorsChange: (anchors: CurveAnchor[]) => void;
28
+ onOffsetChange: (key: string, value: number) => void;
29
+ }
17
30
 
18
- export let curveKey: string;
19
- export let anchors: CurveAnchor[];
20
- export let cfg: CurveConfig;
21
- export let stepCount: number;
22
- export let defaults: CurveAnchor[];
23
- export let offset: number = 0;
24
- export let lockedAnchorIndex: number | null = null;
25
- export let onAnchorsChange: (anchors: CurveAnchor[]) => void;
26
- export let onOffsetChange: (key: string, value: number) => void;
31
+ let {
32
+ curveKey,
33
+ anchors,
34
+ cfg,
35
+ stepCount,
36
+ defaults,
37
+ offset = 0,
38
+ lockedAnchorIndex = null,
39
+ onAnchorsChange,
40
+ onOffsetChange
41
+ }: Props = $props();
27
42
  </script>
28
43
 
29
44
  <BezierCurveEditor
@@ -44,46 +44,46 @@
44
44
  <div class="global-shadow-row">
45
45
  <span class="shadow-slider-label" title="Number of columns">Cols</span>
46
46
  <input type="range" min="1" max="24" value={$editorState.columns.count}
47
- on:pointerdown={() => beginSliderGesture('drag columns count')}
48
- on:input={(e) => setColumnsCount(+e.currentTarget.value)} />
47
+ onpointerdown={() => beginSliderGesture('drag columns count')}
48
+ oninput={(e) => setColumnsCount(+e.currentTarget.value)} />
49
49
  <input class="shadow-slider-input" type="number" min="1" max="24"
50
50
  value={$editorState.columns.count}
51
- on:change={(e) => setColumnsCount(+e.currentTarget.value)} />
51
+ onchange={(e) => setColumnsCount(+e.currentTarget.value)} />
52
52
  <span class="shadow-slider-unit"></span>
53
53
  </div>
54
54
  <div class="global-shadow-row">
55
55
  <span class="shadow-slider-label" title="Maximum content width">Max-Width</span>
56
56
  <input type="range" min="480" max="2560" step="10" value={$editorState.columns.maxWidth}
57
- on:pointerdown={() => beginSliderGesture('drag columns max-width')}
58
- on:input={(e) => setColumnsMaxWidth(+e.currentTarget.value)} />
57
+ onpointerdown={() => beginSliderGesture('drag columns max-width')}
58
+ oninput={(e) => setColumnsMaxWidth(+e.currentTarget.value)} />
59
59
  <input class="shadow-slider-input columns-input-wide" type="number" min="320" max="2560"
60
60
  value={$editorState.columns.maxWidth}
61
- on:change={(e) => setColumnsMaxWidth(+e.currentTarget.value)} />
61
+ onchange={(e) => setColumnsMaxWidth(+e.currentTarget.value)} />
62
62
  <span class="shadow-slider-unit">px</span>
63
63
  </div>
64
64
  <div class="global-shadow-row">
65
65
  <span class="shadow-slider-label" title="Space between columns">Gutter</span>
66
66
  <input type="range" min="0" max="80" value={$editorState.columns.gutter}
67
- on:pointerdown={() => beginSliderGesture('drag columns gutter')}
68
- on:input={(e) => setColumnsGutter(+e.currentTarget.value)} />
67
+ onpointerdown={() => beginSliderGesture('drag columns gutter')}
68
+ oninput={(e) => setColumnsGutter(+e.currentTarget.value)} />
69
69
  <input class="shadow-slider-input" type="number" min="0" max="200"
70
70
  value={$editorState.columns.gutter}
71
- on:change={(e) => setColumnsGutter(+e.currentTarget.value)} />
71
+ onchange={(e) => setColumnsGutter(+e.currentTarget.value)} />
72
72
  <span class="shadow-slider-unit">px</span>
73
73
  </div>
74
74
  <div class="global-shadow-row">
75
75
  <span class="shadow-slider-label" title="Outer page margin (side gutters)">Margin</span>
76
76
  <input type="range" min="0" max="200" value={$editorState.columns.margin}
77
- on:pointerdown={() => beginSliderGesture('drag columns margin')}
78
- on:input={(e) => setColumnsMargin(+e.currentTarget.value)} />
77
+ onpointerdown={() => beginSliderGesture('drag columns margin')}
78
+ oninput={(e) => setColumnsMargin(+e.currentTarget.value)} />
79
79
  <input class="shadow-slider-input columns-input-wide" type="number" min="0" max="400"
80
80
  value={$editorState.columns.margin}
81
- on:change={(e) => setColumnsMargin(+e.currentTarget.value)} />
81
+ onchange={(e) => setColumnsMargin(+e.currentTarget.value)} />
82
82
  <span class="shadow-slider-unit">px</span>
83
83
  </div>
84
84
 
85
85
  <div class="columns-controls-footer">
86
- <button class="columns-reset" on:click={resetColumns} title="Restore values from when this editor session opened">
86
+ <button class="columns-reset" onclick={resetColumns} title="Restore values from when this editor session opened">
87
87
  <i class="fas fa-rotate-left"></i>
88
88
  Reset to initial
89
89
  </button>
@@ -7,16 +7,19 @@
7
7
  * direction, kind switch) lives in <GradientEditor>; this section is a
8
8
  * thin grid that toggles which gradient is being edited.
9
9
  */
10
- import { createEventDispatcher } from 'svelte';
11
10
  import { editorState } from '../../lib/editorStore';
12
11
  import GradientEditor from '../GradientEditor.svelte';
13
12
 
14
- export let copiedVar: string | null = null;
13
+ interface Props {
14
+ copiedVar?: string | null;
15
+ oncopy?: (variable: string) => void;
16
+ }
17
+
18
+ let { copiedVar = null, oncopy }: Props = $props();
15
19
 
16
- const dispatch = createEventDispatcher<{ copy: string }>();
17
- function copy(v: string) { dispatch('copy', v); }
20
+ function copy(v: string) { oncopy?.(v); }
18
21
 
19
- let editingGradient: string | null = null;
22
+ let editingGradient: string | null = $state(null);
20
23
  </script>
21
24
 
22
25
  <section class="section" id="gradients">
@@ -30,17 +33,17 @@
30
33
  <div class="gradient-box" style="background: var({token.variable});"></div>
31
34
  {/if}
32
35
  <div class="token-info">
33
- <button class="token-variable copyable" class:copied={copiedVar === token.variable} on:click={() => copy(token.variable)}>{copiedVar === token.variable ? 'copied!' : token.variable}</button>
36
+ <button class="token-variable copyable" class:copied={copiedVar === token.variable} onclick={() => copy(token.variable)}>{copiedVar === token.variable ? 'copied!' : token.variable}</button>
34
37
  {#if !isEditing}
35
- <button class="gradient-edit-btn" on:click={() => editingGradient = token.variable}>Edit</button>
38
+ <button class="gradient-edit-btn" onclick={() => editingGradient = token.variable}>Edit</button>
36
39
  {/if}
37
40
  </div>
38
41
  {#if isEditing}
39
42
  <div class="gradient-editor-host">
40
43
  <GradientEditor
41
44
  variable={token.variable}
42
- on:save={() => editingGradient = null}
43
- on:cancel={() => editingGradient = null}
45
+ onsave={() => editingGradient = null}
46
+ oncancel={() => editingGradient = null}
44
47
  />
45
48
  </div>
46
49
  {/if}
@@ -6,16 +6,19 @@
6
6
  * rgba values out to :root, so this component only orchestrates mutations
7
7
  * and reads derived display state.
8
8
  */
9
- import { createEventDispatcher } from 'svelte';
10
9
  import { editorState, mutate, beginSliderGesture } from '../../lib/editorStore';
11
10
  import type { OverlayToken, OverlayChannelGlobals, EditorState } from '../../lib/editorTypes';
12
11
 
13
- export let copiedVar: string | null = null;
12
+ interface Props {
13
+ copiedVar?: string | null;
14
+ oncopy?: (variable: string) => void;
15
+ }
16
+
17
+ let { copiedVar = null, oncopy }: Props = $props();
14
18
 
15
- const dispatch = createEventDispatcher<{ copy: string }>();
16
- function copy(v: string) { dispatch('copy', v); }
19
+ function copy(v: string) { oncopy?.(v); }
17
20
 
18
- let editingOverlay: string | null = null;
21
+ let editingOverlay: string | null = $state(null);
19
22
 
20
23
  function clampNum(v: number, lo: number, hi: number): number {
21
24
  return Math.max(lo, Math.min(hi, Math.round(v)));
@@ -117,10 +120,10 @@
117
120
  <div class="overlay-swatch" style="background: {getOverlayCss(token)};"></div>
118
121
  </div>
119
122
  <div class="token-info">
120
- <button class="token-variable copyable" class:copied={copiedVar === token.variable} on:click={() => copy(token.variable)}>{copiedVar === token.variable ? 'copied!' : token.variable}</button>
123
+ <button class="token-variable copyable" class:copied={copiedVar === token.variable} onclick={() => copy(token.variable)}>{copiedVar === token.variable ? 'copied!' : token.variable}</button>
121
124
  <span class="token-value">{token.label} — {Math.round(token.opacity * 100)}%</span>
122
125
  </div>
123
- <button class="shadow-edit-btn" on:click={() => editingOverlay = editingOverlay === token.variable ? null : token.variable}>
126
+ <button class="shadow-edit-btn" onclick={() => editingOverlay = editingOverlay === token.variable ? null : token.variable}>
124
127
  {editingOverlay === token.variable ? 'Close' : 'Edit'}
125
128
  </button>
126
129
  {#if editingOverlay === token.variable}
@@ -128,16 +131,16 @@
128
131
  <div class="shadow-slider-row">
129
132
  <span class="shadow-slider-label">Opacity</span>
130
133
  <input type="range" min="0" max="100" value={Math.round(token.opacity * 100)}
131
- on:pointerdown={() => beginSliderGesture(`edit ${token.variable} opacity`)}
132
- on:input={(e) => setOverlayTokenOpacity('overlay', i, +e.currentTarget.value / 100)} />
134
+ onpointerdown={() => beginSliderGesture(`edit ${token.variable} opacity`)}
135
+ oninput={(e) => setOverlayTokenOpacity('overlay', i, +e.currentTarget.value / 100)} />
133
136
  <input class="shadow-slider-input" type="number" min="0" max="100"
134
137
  value={Math.round(token.opacity * 100)}
135
- on:change={(e) => setOverlayTokenOpacity('overlay', i, Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
138
+ onchange={(e) => setOverlayTokenOpacity('overlay', i, Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
136
139
  <span class="shadow-slider-unit">%</span>
137
140
  </div>
138
141
  <div class="shadow-css-output">
139
142
  <code>{getOverlayCss(token)}</code>
140
- <button class="shadow-copy-btn" on:click={() => copy(getOverlayCss(token))}>
143
+ <button class="shadow-copy-btn" onclick={() => copy(getOverlayCss(token))}>
141
144
  {copiedVar === getOverlayCss(token) ? 'Copied!' : 'Copy CSS'}
142
145
  </button>
143
146
  </div>
@@ -159,36 +162,36 @@
159
162
  <span class="shadow-slider-label">H</span>
160
163
  <div class="slider-track" style="background: {overlayHueGrad($editorState.overlays.globals.overlay)}">
161
164
  <input type="range" min="0" max="360" value={$editorState.overlays.globals.overlay.hue}
162
- on:pointerdown={() => beginSliderGesture('overlay hue')}
163
- on:input={(e) => setOverlayColor('overlay', 'hue', +e.currentTarget.value)} />
165
+ onpointerdown={() => beginSliderGesture('overlay hue')}
166
+ oninput={(e) => setOverlayColor('overlay', 'hue', +e.currentTarget.value)} />
164
167
  </div>
165
168
  <input class="shadow-slider-input" type="number" min="0" max="360"
166
169
  value={$editorState.overlays.globals.overlay.hue}
167
- on:change={(e) => setOverlayColor('overlay', 'hue', +e.currentTarget.value)} />
170
+ onchange={(e) => setOverlayColor('overlay', 'hue', +e.currentTarget.value)} />
168
171
  <span class="shadow-slider-unit">&deg;</span>
169
172
  </div>
170
173
  <div class="global-shadow-row">
171
174
  <span class="shadow-slider-label">S</span>
172
175
  <div class="slider-track" style="background: {overlaySatGrad($editorState.overlays.globals.overlay)}">
173
176
  <input type="range" min="0" max="100" value={$editorState.overlays.globals.overlay.saturation}
174
- on:pointerdown={() => beginSliderGesture('overlay saturation')}
175
- on:input={(e) => setOverlayColor('overlay', 'saturation', +e.currentTarget.value)} />
177
+ onpointerdown={() => beginSliderGesture('overlay saturation')}
178
+ oninput={(e) => setOverlayColor('overlay', 'saturation', +e.currentTarget.value)} />
176
179
  </div>
177
180
  <input class="shadow-slider-input" type="number" min="0" max="100"
178
181
  value={$editorState.overlays.globals.overlay.saturation}
179
- on:change={(e) => setOverlayColor('overlay', 'saturation', +e.currentTarget.value)} />
182
+ onchange={(e) => setOverlayColor('overlay', 'saturation', +e.currentTarget.value)} />
180
183
  <span class="shadow-slider-unit">%</span>
181
184
  </div>
182
185
  <div class="global-shadow-row">
183
186
  <span class="shadow-slider-label">L</span>
184
187
  <div class="slider-track" style="background: {overlayLightGrad($editorState.overlays.globals.overlay)}">
185
188
  <input type="range" min="0" max="100" value={$editorState.overlays.globals.overlay.lightness}
186
- on:pointerdown={() => beginSliderGesture('overlay lightness')}
187
- on:input={(e) => setOverlayColor('overlay', 'lightness', +e.currentTarget.value)} />
189
+ onpointerdown={() => beginSliderGesture('overlay lightness')}
190
+ oninput={(e) => setOverlayColor('overlay', 'lightness', +e.currentTarget.value)} />
188
191
  </div>
189
192
  <input class="shadow-slider-input" type="number" min="0" max="100"
190
193
  value={$editorState.overlays.globals.overlay.lightness}
191
- on:change={(e) => setOverlayColor('overlay', 'lightness', +e.currentTarget.value)} />
194
+ onchange={(e) => setOverlayColor('overlay', 'lightness', +e.currentTarget.value)} />
192
195
  <span class="shadow-slider-unit">%</span>
193
196
  </div>
194
197
  </div>
@@ -198,21 +201,21 @@
198
201
  <div class="global-shadow-row">
199
202
  <span class="shadow-slider-label">Op. Min</span>
200
203
  <input type="range" min="0" max="100" value={Math.round($editorState.overlays.globals.overlay.opacityMin * 100)}
201
- on:pointerdown={() => beginSliderGesture('overlay opacity min')}
202
- on:input={(e) => setOverlayOpacity('overlay', 'opacityMin', +e.currentTarget.value / 100)} />
204
+ onpointerdown={() => beginSliderGesture('overlay opacity min')}
205
+ oninput={(e) => setOverlayOpacity('overlay', 'opacityMin', +e.currentTarget.value / 100)} />
203
206
  <input class="shadow-slider-input" type="number" min="0" max="100"
204
207
  value={Math.round($editorState.overlays.globals.overlay.opacityMin * 100)}
205
- on:change={(e) => setOverlayOpacity('overlay', 'opacityMin', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
208
+ onchange={(e) => setOverlayOpacity('overlay', 'opacityMin', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
206
209
  <span class="shadow-slider-unit">%</span>
207
210
  </div>
208
211
  <div class="global-shadow-row">
209
212
  <span class="shadow-slider-label">Op. Max</span>
210
213
  <input type="range" min="0" max="100" value={Math.round($editorState.overlays.globals.overlay.opacityMax * 100)}
211
- on:pointerdown={() => beginSliderGesture('overlay opacity max')}
212
- on:input={(e) => setOverlayOpacity('overlay', 'opacityMax', +e.currentTarget.value / 100)} />
214
+ onpointerdown={() => beginSliderGesture('overlay opacity max')}
215
+ oninput={(e) => setOverlayOpacity('overlay', 'opacityMax', +e.currentTarget.value / 100)} />
213
216
  <input class="shadow-slider-input" type="number" min="0" max="100"
214
217
  value={Math.round($editorState.overlays.globals.overlay.opacityMax * 100)}
215
- on:change={(e) => setOverlayOpacity('overlay', 'opacityMax', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
218
+ onchange={(e) => setOverlayOpacity('overlay', 'opacityMax', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
216
219
  <span class="shadow-slider-unit">%</span>
217
220
  </div>
218
221
  </div>
@@ -227,10 +230,10 @@
227
230
  <div class="overlay-swatch" style="background: {getOverlayCss(token)};"></div>
228
231
  </div>
229
232
  <div class="token-info">
230
- <button class="token-variable copyable" class:copied={copiedVar === token.variable} on:click={() => copy(token.variable)}>{copiedVar === token.variable ? 'copied!' : token.variable}</button>
233
+ <button class="token-variable copyable" class:copied={copiedVar === token.variable} onclick={() => copy(token.variable)}>{copiedVar === token.variable ? 'copied!' : token.variable}</button>
231
234
  <span class="token-value">{token.label} — {Math.round(token.opacity * 100)}%</span>
232
235
  </div>
233
- <button class="shadow-edit-btn" on:click={() => editingOverlay = editingOverlay === token.variable ? null : token.variable}>
236
+ <button class="shadow-edit-btn" onclick={() => editingOverlay = editingOverlay === token.variable ? null : token.variable}>
234
237
  {editingOverlay === token.variable ? 'Close' : 'Edit'}
235
238
  </button>
236
239
  {#if editingOverlay === token.variable}
@@ -238,16 +241,16 @@
238
241
  <div class="shadow-slider-row">
239
242
  <span class="shadow-slider-label">Opacity</span>
240
243
  <input type="range" min="0" max="100" value={Math.round(token.opacity * 100)}
241
- on:pointerdown={() => beginSliderGesture(`edit ${token.variable} opacity`)}
242
- on:input={(e) => setOverlayTokenOpacity('hover', i, +e.currentTarget.value / 100)} />
244
+ onpointerdown={() => beginSliderGesture(`edit ${token.variable} opacity`)}
245
+ oninput={(e) => setOverlayTokenOpacity('hover', i, +e.currentTarget.value / 100)} />
243
246
  <input class="shadow-slider-input" type="number" min="0" max="100"
244
247
  value={Math.round(token.opacity * 100)}
245
- on:change={(e) => setOverlayTokenOpacity('hover', i, Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
248
+ onchange={(e) => setOverlayTokenOpacity('hover', i, Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
246
249
  <span class="shadow-slider-unit">%</span>
247
250
  </div>
248
251
  <div class="shadow-css-output">
249
252
  <code>{getOverlayCss(token)}</code>
250
- <button class="shadow-copy-btn" on:click={() => copy(getOverlayCss(token))}>
253
+ <button class="shadow-copy-btn" onclick={() => copy(getOverlayCss(token))}>
251
254
  {copiedVar === getOverlayCss(token) ? 'Copied!' : 'Copy CSS'}
252
255
  </button>
253
256
  </div>
@@ -269,36 +272,36 @@
269
272
  <span class="shadow-slider-label">H</span>
270
273
  <div class="slider-track" style="background: {overlayHueGrad($editorState.overlays.globals.hover)}">
271
274
  <input type="range" min="0" max="360" value={$editorState.overlays.globals.hover.hue}
272
- on:pointerdown={() => beginSliderGesture('hover hue')}
273
- on:input={(e) => setOverlayColor('hover', 'hue', +e.currentTarget.value)} />
275
+ onpointerdown={() => beginSliderGesture('hover hue')}
276
+ oninput={(e) => setOverlayColor('hover', 'hue', +e.currentTarget.value)} />
274
277
  </div>
275
278
  <input class="shadow-slider-input" type="number" min="0" max="360"
276
279
  value={$editorState.overlays.globals.hover.hue}
277
- on:change={(e) => setOverlayColor('hover', 'hue', +e.currentTarget.value)} />
280
+ onchange={(e) => setOverlayColor('hover', 'hue', +e.currentTarget.value)} />
278
281
  <span class="shadow-slider-unit">&deg;</span>
279
282
  </div>
280
283
  <div class="global-shadow-row">
281
284
  <span class="shadow-slider-label">S</span>
282
285
  <div class="slider-track" style="background: {overlaySatGrad($editorState.overlays.globals.hover)}">
283
286
  <input type="range" min="0" max="100" value={$editorState.overlays.globals.hover.saturation}
284
- on:pointerdown={() => beginSliderGesture('hover saturation')}
285
- on:input={(e) => setOverlayColor('hover', 'saturation', +e.currentTarget.value)} />
287
+ onpointerdown={() => beginSliderGesture('hover saturation')}
288
+ oninput={(e) => setOverlayColor('hover', 'saturation', +e.currentTarget.value)} />
286
289
  </div>
287
290
  <input class="shadow-slider-input" type="number" min="0" max="100"
288
291
  value={$editorState.overlays.globals.hover.saturation}
289
- on:change={(e) => setOverlayColor('hover', 'saturation', +e.currentTarget.value)} />
292
+ onchange={(e) => setOverlayColor('hover', 'saturation', +e.currentTarget.value)} />
290
293
  <span class="shadow-slider-unit">%</span>
291
294
  </div>
292
295
  <div class="global-shadow-row">
293
296
  <span class="shadow-slider-label">L</span>
294
297
  <div class="slider-track" style="background: {overlayLightGrad($editorState.overlays.globals.hover)}">
295
298
  <input type="range" min="0" max="100" value={$editorState.overlays.globals.hover.lightness}
296
- on:pointerdown={() => beginSliderGesture('hover lightness')}
297
- on:input={(e) => setOverlayColor('hover', 'lightness', +e.currentTarget.value)} />
299
+ onpointerdown={() => beginSliderGesture('hover lightness')}
300
+ oninput={(e) => setOverlayColor('hover', 'lightness', +e.currentTarget.value)} />
298
301
  </div>
299
302
  <input class="shadow-slider-input" type="number" min="0" max="100"
300
303
  value={$editorState.overlays.globals.hover.lightness}
301
- on:change={(e) => setOverlayColor('hover', 'lightness', +e.currentTarget.value)} />
304
+ onchange={(e) => setOverlayColor('hover', 'lightness', +e.currentTarget.value)} />
302
305
  <span class="shadow-slider-unit">%</span>
303
306
  </div>
304
307
  </div>
@@ -308,21 +311,21 @@
308
311
  <div class="global-shadow-row">
309
312
  <span class="shadow-slider-label">Op. Min</span>
310
313
  <input type="range" min="0" max="100" value={Math.round($editorState.overlays.globals.hover.opacityMin * 100)}
311
- on:pointerdown={() => beginSliderGesture('hover opacity min')}
312
- on:input={(e) => setOverlayOpacity('hover', 'opacityMin', +e.currentTarget.value / 100)} />
314
+ onpointerdown={() => beginSliderGesture('hover opacity min')}
315
+ oninput={(e) => setOverlayOpacity('hover', 'opacityMin', +e.currentTarget.value / 100)} />
313
316
  <input class="shadow-slider-input" type="number" min="0" max="100"
314
317
  value={Math.round($editorState.overlays.globals.hover.opacityMin * 100)}
315
- on:change={(e) => setOverlayOpacity('hover', 'opacityMin', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
318
+ onchange={(e) => setOverlayOpacity('hover', 'opacityMin', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
316
319
  <span class="shadow-slider-unit">%</span>
317
320
  </div>
318
321
  <div class="global-shadow-row">
319
322
  <span class="shadow-slider-label">Op. Max</span>
320
323
  <input type="range" min="0" max="100" value={Math.round($editorState.overlays.globals.hover.opacityMax * 100)}
321
- on:pointerdown={() => beginSliderGesture('hover opacity max')}
322
- on:input={(e) => setOverlayOpacity('hover', 'opacityMax', +e.currentTarget.value / 100)} />
324
+ onpointerdown={() => beginSliderGesture('hover opacity max')}
325
+ oninput={(e) => setOverlayOpacity('hover', 'opacityMax', +e.currentTarget.value / 100)} />
323
326
  <input class="shadow-slider-input" type="number" min="0" max="100"
324
327
  value={Math.round($editorState.overlays.globals.hover.opacityMax * 100)}
325
- on:change={(e) => setOverlayOpacity('hover', 'opacityMax', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
328
+ onchange={(e) => setOverlayOpacity('hover', 'opacityMax', Math.min(100, Math.max(0, +e.currentTarget.value)) / 100)} />
326
329
  <span class="shadow-slider-unit">%</span>
327
330
  </div>
328
331
  </div>