@motion-proto/live-tokens 0.3.9 → 0.5.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.
- package/package.json +9 -8
- package/src/component-editor/BadgeEditor.svelte +24 -22
- package/src/component-editor/CalloutEditor.svelte +3 -3
- package/src/component-editor/CardEditor.svelte +25 -21
- package/src/component-editor/CollapsibleSectionEditor.svelte +27 -25
- package/src/component-editor/CornerBadgeEditor.svelte +37 -35
- package/src/component-editor/DialogEditor.svelte +26 -24
- package/src/component-editor/ImageEditor.svelte +11 -9
- package/src/component-editor/InlineEditActionsEditor.svelte +17 -15
- package/src/component-editor/NotificationEditor.svelte +32 -30
- package/src/component-editor/ProgressBarEditor.svelte +3 -3
- package/src/component-editor/RadioButtonEditor.svelte +31 -29
- package/src/component-editor/SectionDividerEditor.svelte +30 -28
- package/src/component-editor/SegmentedControlEditor.svelte +29 -25
- package/src/component-editor/StandardButtonsEditor.svelte +42 -38
- package/src/component-editor/TabBarEditor.svelte +20 -18
- package/src/component-editor/TableEditor.svelte +4 -4
- package/src/component-editor/TooltipEditor.svelte +11 -9
- package/src/component-editor/registry.ts +2 -2
- package/src/component-editor/scaffolding/AngleDial.svelte +20 -19
- package/src/component-editor/scaffolding/ComponentEditorBase.svelte +44 -20
- package/src/component-editor/scaffolding/ComponentFileManager.svelte +260 -37
- package/src/component-editor/scaffolding/ComponentFileMenu.svelte +41 -29
- package/src/component-editor/scaffolding/ComponentsTab.svelte +7 -3
- package/src/component-editor/scaffolding/CopyFromMenu.svelte +21 -12
- package/src/component-editor/scaffolding/DemoHeader.svelte +13 -4
- package/src/component-editor/scaffolding/DividerEditor.svelte +27 -14
- package/src/component-editor/scaffolding/FieldsetWrapper.svelte +10 -4
- package/src/component-editor/scaffolding/GradientCard.svelte +25 -20
- package/src/component-editor/scaffolding/LinkageChart.svelte +43 -34
- package/src/component-editor/scaffolding/LinkedBlock.svelte +24 -21
- package/src/component-editor/scaffolding/NonStylableConfig.svelte +6 -1
- package/src/component-editor/scaffolding/SaveAsDialog.svelte +39 -35
- package/src/component-editor/scaffolding/ShadowBackdrop.svelte +21 -9
- package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +8 -3
- package/src/component-editor/scaffolding/StateBlock.svelte +30 -13
- package/src/component-editor/scaffolding/TokenLayout.svelte +46 -30
- package/src/component-editor/scaffolding/TypeEditor.svelte +52 -26
- package/src/component-editor/scaffolding/VariantGroup.svelte +81 -48
- package/src/component-editor/scaffolding/componentSectionType.ts +2 -2
- package/src/components/Badge.svelte +45 -26
- package/src/components/Button.svelte +44 -21
- package/src/components/Callout.svelte +17 -12
- package/src/components/Card.svelte +23 -11
- package/src/components/CollapsibleSection.svelte +56 -27
- package/src/components/CornerBadge.svelte +32 -18
- package/src/components/Dialog.svelte +55 -31
- package/src/components/Image.svelte +14 -5
- package/src/components/InlineEditActions.svelte +22 -10
- package/src/components/Notification.svelte +39 -19
- package/src/components/ProgressBar.svelte +27 -17
- package/src/components/RadioButton.svelte +27 -10
- package/src/components/SectionDivider.svelte +34 -26
- package/src/components/SegmentedControl.svelte +23 -9
- package/src/components/TabBar.svelte +23 -10
- package/src/components/Table.svelte +8 -3
- package/src/components/Tooltip.svelte +15 -5
- package/src/lib/ColumnsOverlay.svelte +3 -3
- package/src/lib/LiveEditorOverlay.svelte +57 -36
- package/src/pages/ComponentEditorPage.svelte +17 -13
- package/src/pages/EditorShell.svelte +24 -20
- package/src/styles/form-controls.css +2 -2
- package/src/styles/tokens.css +59 -81
- package/src/ui/BezierCurveEditor.svelte +59 -43
- package/src/ui/ColorEditPanel.svelte +71 -44
- package/src/ui/EditorViewSwitcher.svelte +9 -5
- package/src/ui/FontStackEditor.svelte +16 -15
- package/src/ui/GradientEditor.svelte +42 -33
- package/src/ui/GradientStopPicker.svelte +18 -29
- package/src/ui/PaletteEditor.svelte +238 -212
- package/src/ui/PresetFileManager.svelte +20 -18
- package/src/ui/ProjectFontsSection.svelte +30 -30
- package/src/ui/SurfacesTab.svelte +3 -3
- package/src/ui/TextTab.svelte +2 -2
- package/src/ui/ThemeFileManager.svelte +38 -35
- package/src/ui/Toggle.svelte +11 -9
- package/src/ui/UICopyPopover.svelte +19 -15
- package/src/ui/UIDialog.svelte +48 -30
- package/src/ui/UIFontFamilySelector.svelte +104 -78
- package/src/ui/UIFontSizeSelector.svelte +38 -20
- package/src/ui/UIFontWeightSelector.svelte +33 -13
- package/src/ui/UILineHeightSelector.svelte +33 -13
- package/src/ui/UILinkToggle.svelte +7 -6
- package/src/ui/UIOptionItem.svelte +21 -7
- package/src/ui/UIOptionList.svelte +9 -3
- package/src/ui/UIPaddingSelector.svelte +108 -82
- package/src/ui/UIPaletteSelector.svelte +186 -161
- package/src/ui/UIRadio.svelte +23 -8
- package/src/ui/UIRadioGroup.svelte +9 -8
- package/src/ui/UIRelinkConfirmPopover.svelte +26 -16
- package/src/ui/UITokenSelector.svelte +112 -68
- package/src/ui/UIVariantSelector.svelte +79 -57
- package/src/ui/VariablesTab.svelte +15 -15
- package/src/ui/palette/GradientStopEditor.svelte +45 -26
- package/src/ui/palette/OverridesPanel.svelte +85 -49
- package/src/ui/palette/PaletteBase.svelte +60 -32
- package/src/ui/palette/ScaleCurveEditor.svelte +25 -10
- package/src/ui/sections/ColumnsSection.svelte +13 -13
- package/src/ui/sections/GradientsSection.svelte +12 -9
- package/src/ui/sections/OverlaysSection.svelte +50 -47
- package/src/ui/sections/ShadowsSection.svelte +110 -104
- package/src/ui/sections/TokenScaleTable.svelte +38 -22
- package/src/ui/sections/tokenScales.ts +2 -2
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
icon?: string;
|
|
4
|
+
iconColor?: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
size?: 'default' | 'compact';
|
|
7
|
+
class?: string;
|
|
8
|
+
children?: import('svelte').Snippet;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
icon = '',
|
|
13
|
+
iconColor = 'var(--text-secondary)',
|
|
14
|
+
title = '',
|
|
15
|
+
size = 'default',
|
|
16
|
+
class: className = '',
|
|
17
|
+
children
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
8
20
|
</script>
|
|
9
21
|
|
|
10
22
|
<div
|
|
@@ -23,7 +35,7 @@
|
|
|
23
35
|
</div>
|
|
24
36
|
{/if}
|
|
25
37
|
<div class="card-body">
|
|
26
|
-
|
|
38
|
+
{@render children?.()}
|
|
27
39
|
</div>
|
|
28
40
|
</div>
|
|
29
41
|
|
|
@@ -44,7 +56,7 @@
|
|
|
44
56
|
--card-default-title-font-family: var(--font-sans);
|
|
45
57
|
--card-default-title-font-size: var(--font-size-lg);
|
|
46
58
|
--card-default-title-font-weight: var(--font-weight-normal);
|
|
47
|
-
--card-default-title-line-height: var(--line-height-
|
|
59
|
+
--card-default-title-line-height: var(--line-height-sm);
|
|
48
60
|
|
|
49
61
|
--card-default-icon-size: var(--icon-size-lg);
|
|
50
62
|
|
|
@@ -52,7 +64,7 @@
|
|
|
52
64
|
--card-default-body-font-family: var(--font-sans);
|
|
53
65
|
--card-default-body-font-size: var(--font-size-md);
|
|
54
66
|
--card-default-body-font-weight: var(--font-weight-normal);
|
|
55
|
-
--card-default-body-line-height: var(--line-height-
|
|
67
|
+
--card-default-body-line-height: var(--line-height-md);
|
|
56
68
|
|
|
57
69
|
/* Hover */
|
|
58
70
|
--card-hover-surface: var(--surface-neutral-high);
|
|
@@ -69,7 +81,7 @@
|
|
|
69
81
|
--card-hover-title-font-family: var(--font-sans);
|
|
70
82
|
--card-hover-title-font-size: var(--font-size-lg);
|
|
71
83
|
--card-hover-title-font-weight: var(--font-weight-normal);
|
|
72
|
-
--card-hover-title-line-height: var(--line-height-
|
|
84
|
+
--card-hover-title-line-height: var(--line-height-sm);
|
|
73
85
|
|
|
74
86
|
--card-hover-icon-size: var(--icon-size-lg);
|
|
75
87
|
|
|
@@ -77,7 +89,7 @@
|
|
|
77
89
|
--card-hover-body-font-family: var(--font-sans);
|
|
78
90
|
--card-hover-body-font-size: var(--font-size-md);
|
|
79
91
|
--card-hover-body-font-weight: var(--font-weight-normal);
|
|
80
|
-
--card-hover-body-line-height: var(--line-height-
|
|
92
|
+
--card-hover-body-line-height: var(--line-height-md);
|
|
81
93
|
}
|
|
82
94
|
|
|
83
95
|
.card {
|
|
@@ -1,48 +1,71 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { createEventDispatcher } from 'svelte';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
interface Props {
|
|
5
|
+
label: string;
|
|
6
|
+
expanded?: boolean;
|
|
7
|
+
href?: string | undefined;
|
|
8
|
+
active?: boolean;
|
|
9
|
+
variant?: 'chromeless' | 'divider' | 'container';
|
|
10
|
+
class?: string;
|
|
11
|
+
/** Toggle callback. Preferred over `on:toggle` from 0.5.0 onward. */
|
|
12
|
+
ontoggle?: () => void;
|
|
13
|
+
summary?: import('svelte').Snippet;
|
|
14
|
+
children?: import('svelte').Snippet;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
label,
|
|
19
|
+
expanded = false,
|
|
20
|
+
href = undefined,
|
|
21
|
+
active = false,
|
|
22
|
+
variant = 'container',
|
|
23
|
+
class: className = '',
|
|
24
|
+
ontoggle,
|
|
25
|
+
summary,
|
|
26
|
+
children
|
|
27
|
+
}: Props = $props();
|
|
11
28
|
|
|
29
|
+
// Dual-fire bridge — see Button.svelte for the deprecation timeline.
|
|
12
30
|
const dispatch = createEventDispatcher<{
|
|
13
31
|
toggle: void;
|
|
14
32
|
}>();
|
|
15
33
|
|
|
34
|
+
function fireToggle() {
|
|
35
|
+
ontoggle?.();
|
|
36
|
+
dispatch('toggle');
|
|
37
|
+
}
|
|
38
|
+
|
|
16
39
|
function handleHeaderClick(e: MouseEvent) {
|
|
17
40
|
if (href && active) {
|
|
18
41
|
e.preventDefault();
|
|
19
|
-
|
|
42
|
+
fireToggle();
|
|
20
43
|
}
|
|
21
44
|
}
|
|
22
45
|
</script>
|
|
23
46
|
|
|
24
47
|
<section class="es-root variant-{variant} {className}">
|
|
25
48
|
{#if href}
|
|
26
|
-
<a {href} class="section-header" class:expanded class:active
|
|
49
|
+
<a {href} class="section-header" class:expanded class:active onclick={handleHeaderClick}>
|
|
27
50
|
<div class="section-toggle">
|
|
28
51
|
<i class="fas fa-chevron-right toggle-icon"></i>
|
|
29
52
|
<span class="section-label">{label}</span>
|
|
30
53
|
</div>
|
|
31
|
-
|
|
54
|
+
{@render summary?.()}
|
|
32
55
|
</a>
|
|
33
56
|
{:else}
|
|
34
|
-
<!-- svelte-ignore
|
|
35
|
-
<div class="section-header" class:expanded
|
|
57
|
+
<!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_noninteractive_element_interactions, a11y_no_static_element_interactions -->
|
|
58
|
+
<div class="section-header" class:expanded onclick={fireToggle}>
|
|
36
59
|
<div class="section-toggle">
|
|
37
60
|
<i class="fas fa-chevron-right toggle-icon"></i>
|
|
38
61
|
<span class="section-label">{label}</span>
|
|
39
62
|
</div>
|
|
40
|
-
|
|
63
|
+
{@render summary?.()}
|
|
41
64
|
</div>
|
|
42
65
|
{/if}
|
|
43
|
-
{#if expanded &&
|
|
66
|
+
{#if expanded && children}
|
|
44
67
|
<div class="section-content">
|
|
45
|
-
|
|
68
|
+
{@render children?.()}
|
|
46
69
|
</div>
|
|
47
70
|
{/if}
|
|
48
71
|
</section>
|
|
@@ -58,7 +81,7 @@
|
|
|
58
81
|
--collapsiblesection-chromeless-default-label-font-family: var(--font-sans);
|
|
59
82
|
--collapsiblesection-chromeless-default-label-font-size: var(--font-size-md);
|
|
60
83
|
--collapsiblesection-chromeless-default-label-font-weight: var(--font-weight-normal);
|
|
61
|
-
--collapsiblesection-chromeless-default-label-line-height: var(--line-height-
|
|
84
|
+
--collapsiblesection-chromeless-default-label-line-height: var(--line-height-md);
|
|
62
85
|
--collapsiblesection-chromeless-default-icon: var(--text-muted);
|
|
63
86
|
--collapsiblesection-chromeless-default-icon-size: var(--icon-size-xs);
|
|
64
87
|
/* Chromeless — hover */
|
|
@@ -68,7 +91,7 @@
|
|
|
68
91
|
--collapsiblesection-chromeless-hover-label-font-family: var(--font-sans);
|
|
69
92
|
--collapsiblesection-chromeless-hover-label-font-size: var(--font-size-md);
|
|
70
93
|
--collapsiblesection-chromeless-hover-label-font-weight: var(--font-weight-normal);
|
|
71
|
-
--collapsiblesection-chromeless-hover-label-line-height: var(--line-height-
|
|
94
|
+
--collapsiblesection-chromeless-hover-label-line-height: var(--line-height-md);
|
|
72
95
|
--collapsiblesection-chromeless-hover-icon: var(--text-primary);
|
|
73
96
|
--collapsiblesection-chromeless-hover-icon-size: var(--icon-size-xs);
|
|
74
97
|
/* Chromeless — active */
|
|
@@ -78,7 +101,7 @@
|
|
|
78
101
|
--collapsiblesection-chromeless-active-label-font-family: var(--font-sans);
|
|
79
102
|
--collapsiblesection-chromeless-active-label-font-size: var(--font-size-md);
|
|
80
103
|
--collapsiblesection-chromeless-active-label-font-weight: var(--font-weight-normal);
|
|
81
|
-
--collapsiblesection-chromeless-active-label-line-height: var(--line-height-
|
|
104
|
+
--collapsiblesection-chromeless-active-label-line-height: var(--line-height-md);
|
|
82
105
|
--collapsiblesection-chromeless-active-icon: var(--text-muted);
|
|
83
106
|
--collapsiblesection-chromeless-active-icon-size: var(--icon-size-xs);
|
|
84
107
|
/* Chromeless — expanded */
|
|
@@ -93,7 +116,7 @@
|
|
|
93
116
|
--collapsiblesection-divider-default-label-font-family: var(--font-sans);
|
|
94
117
|
--collapsiblesection-divider-default-label-font-size: var(--font-size-md);
|
|
95
118
|
--collapsiblesection-divider-default-label-font-weight: var(--font-weight-normal);
|
|
96
|
-
--collapsiblesection-divider-default-label-line-height: var(--line-height-
|
|
119
|
+
--collapsiblesection-divider-default-label-line-height: var(--line-height-md);
|
|
97
120
|
--collapsiblesection-divider-default-icon: var(--text-muted);
|
|
98
121
|
--collapsiblesection-divider-default-icon-size: var(--icon-size-xs);
|
|
99
122
|
/* Divider — hover */
|
|
@@ -105,7 +128,7 @@
|
|
|
105
128
|
--collapsiblesection-divider-hover-label-font-family: var(--font-sans);
|
|
106
129
|
--collapsiblesection-divider-hover-label-font-size: var(--font-size-md);
|
|
107
130
|
--collapsiblesection-divider-hover-label-font-weight: var(--font-weight-normal);
|
|
108
|
-
--collapsiblesection-divider-hover-label-line-height: var(--line-height-
|
|
131
|
+
--collapsiblesection-divider-hover-label-line-height: var(--line-height-md);
|
|
109
132
|
--collapsiblesection-divider-hover-icon: var(--text-primary);
|
|
110
133
|
--collapsiblesection-divider-hover-icon-size: var(--icon-size-xs);
|
|
111
134
|
/* Divider — active */
|
|
@@ -117,7 +140,7 @@
|
|
|
117
140
|
--collapsiblesection-divider-active-label-font-family: var(--font-sans);
|
|
118
141
|
--collapsiblesection-divider-active-label-font-size: var(--font-size-md);
|
|
119
142
|
--collapsiblesection-divider-active-label-font-weight: var(--font-weight-normal);
|
|
120
|
-
--collapsiblesection-divider-active-label-line-height: var(--line-height-
|
|
143
|
+
--collapsiblesection-divider-active-label-line-height: var(--line-height-md);
|
|
121
144
|
--collapsiblesection-divider-active-icon: var(--text-muted);
|
|
122
145
|
--collapsiblesection-divider-active-icon-size: var(--icon-size-xs);
|
|
123
146
|
/* Divider — expanded */
|
|
@@ -135,7 +158,7 @@
|
|
|
135
158
|
--collapsiblesection-container-default-label-font-family: var(--font-sans);
|
|
136
159
|
--collapsiblesection-container-default-label-font-size: var(--font-size-md);
|
|
137
160
|
--collapsiblesection-container-default-label-font-weight: var(--font-weight-normal);
|
|
138
|
-
--collapsiblesection-container-default-label-line-height: var(--line-height-
|
|
161
|
+
--collapsiblesection-container-default-label-line-height: var(--line-height-md);
|
|
139
162
|
--collapsiblesection-container-default-icon: var(--text-muted);
|
|
140
163
|
--collapsiblesection-container-default-icon-size: var(--icon-size-xs);
|
|
141
164
|
/* Container — hover header strip */
|
|
@@ -145,7 +168,7 @@
|
|
|
145
168
|
--collapsiblesection-container-hover-label-font-family: var(--font-sans);
|
|
146
169
|
--collapsiblesection-container-hover-label-font-size: var(--font-size-md);
|
|
147
170
|
--collapsiblesection-container-hover-label-font-weight: var(--font-weight-normal);
|
|
148
|
-
--collapsiblesection-container-hover-label-line-height: var(--line-height-
|
|
171
|
+
--collapsiblesection-container-hover-label-line-height: var(--line-height-md);
|
|
149
172
|
--collapsiblesection-container-hover-icon: var(--text-muted);
|
|
150
173
|
--collapsiblesection-container-hover-icon-size: var(--icon-size-xs);
|
|
151
174
|
/* Container — active header strip */
|
|
@@ -155,7 +178,7 @@
|
|
|
155
178
|
--collapsiblesection-container-active-label-font-family: var(--font-sans);
|
|
156
179
|
--collapsiblesection-container-active-label-font-size: var(--font-size-md);
|
|
157
180
|
--collapsiblesection-container-active-label-font-weight: var(--font-weight-normal);
|
|
158
|
-
--collapsiblesection-container-active-label-line-height: var(--line-height-
|
|
181
|
+
--collapsiblesection-container-active-label-line-height: var(--line-height-md);
|
|
159
182
|
--collapsiblesection-container-active-icon: var(--text-muted);
|
|
160
183
|
--collapsiblesection-container-active-icon-size: var(--icon-size-xs);
|
|
161
184
|
/* Container — expanded content area */
|
|
@@ -215,9 +238,10 @@
|
|
|
215
238
|
.es-root.variant-chromeless {
|
|
216
239
|
> .section-header {
|
|
217
240
|
@include header-paint(chromeless, default);
|
|
218
|
-
&:hover
|
|
241
|
+
&:hover { @include header-paint(chromeless, hover); }
|
|
219
242
|
&.active { @include header-paint(chromeless, active); }
|
|
220
243
|
}
|
|
244
|
+
&.force-hover > .section-header { @include header-paint(chromeless, hover); }
|
|
221
245
|
> .section-content {
|
|
222
246
|
@include themed-padding(--collapsiblesection-chromeless-expanded-padding, $h: 2);
|
|
223
247
|
}
|
|
@@ -227,7 +251,7 @@
|
|
|
227
251
|
> .section-header {
|
|
228
252
|
@include header-paint(divider, default);
|
|
229
253
|
@include divider-bottom(default);
|
|
230
|
-
&:hover
|
|
254
|
+
&:hover {
|
|
231
255
|
@include header-paint(divider, hover);
|
|
232
256
|
@include divider-bottom(hover);
|
|
233
257
|
}
|
|
@@ -236,6 +260,10 @@
|
|
|
236
260
|
@include divider-bottom(active);
|
|
237
261
|
}
|
|
238
262
|
}
|
|
263
|
+
&.force-hover > .section-header {
|
|
264
|
+
@include header-paint(divider, hover);
|
|
265
|
+
@include divider-bottom(hover);
|
|
266
|
+
}
|
|
239
267
|
> .section-content {
|
|
240
268
|
@include themed-padding(--collapsiblesection-divider-expanded-padding, $h: 2);
|
|
241
269
|
}
|
|
@@ -249,9 +277,10 @@
|
|
|
249
277
|
|
|
250
278
|
> .section-header {
|
|
251
279
|
@include header-paint(container, default);
|
|
252
|
-
&:hover
|
|
280
|
+
&:hover { @include header-paint(container, hover); }
|
|
253
281
|
&.active { @include header-paint(container, active); }
|
|
254
282
|
}
|
|
283
|
+
&.force-hover > .section-header { @include header-paint(container, hover); }
|
|
255
284
|
> .section-content {
|
|
256
285
|
background: var(--collapsiblesection-container-expanded-surface);
|
|
257
286
|
@include themed-padding(--collapsiblesection-container-expanded-padding, $h: 2);
|
|
@@ -1,20 +1,34 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export type CornerAnchor = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
6
7
|
import Badge, { type BadgeVariant } from './Badge.svelte';
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
interface Props {
|
|
10
|
+
variant?: BadgeVariant;
|
|
11
|
+
anchor?: CornerAnchor;
|
|
12
|
+
size?: 'default' | 'small';
|
|
13
|
+
icon?: string | undefined;
|
|
14
|
+
/** Custom icon content. Falls back to `icon` prop's font-icon class. Renamed from `slot="icon"` in 0.5.0. */
|
|
15
|
+
iconSlot?: Snippet;
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
variant = 'accent',
|
|
21
|
+
anchor = 'bottom-right',
|
|
22
|
+
size = 'default',
|
|
23
|
+
icon = undefined,
|
|
24
|
+
iconSlot,
|
|
25
|
+
children,
|
|
26
|
+
}: Props = $props();
|
|
12
27
|
</script>
|
|
13
28
|
|
|
14
29
|
<span class="corner-badge corner-badge-{anchor} corner-badge-{variant}">
|
|
15
|
-
<Badge {variant} {size} {icon}>
|
|
16
|
-
|
|
17
|
-
<slot />
|
|
30
|
+
<Badge {variant} {size} {icon} {iconSlot}>
|
|
31
|
+
{@render children?.()}
|
|
18
32
|
</Badge>
|
|
19
33
|
</span>
|
|
20
34
|
|
|
@@ -51,7 +65,7 @@
|
|
|
51
65
|
--corner-badge-primary-text-font-family: var(--font-sans);
|
|
52
66
|
--corner-badge-primary-text-font-size: var(--font-size-sm);
|
|
53
67
|
--corner-badge-primary-text-font-weight: var(--font-weight-light);
|
|
54
|
-
--corner-badge-primary-text-line-height: var(--line-height-
|
|
68
|
+
--corner-badge-primary-text-line-height: var(--line-height-xs);
|
|
55
69
|
|
|
56
70
|
/* Accent */
|
|
57
71
|
--corner-badge-accent-margin: var(--space-0);
|
|
@@ -63,7 +77,7 @@
|
|
|
63
77
|
--corner-badge-accent-text-font-family: var(--font-sans);
|
|
64
78
|
--corner-badge-accent-text-font-size: var(--font-size-sm);
|
|
65
79
|
--corner-badge-accent-text-font-weight: var(--font-weight-light);
|
|
66
|
-
--corner-badge-accent-text-line-height: var(--line-height-
|
|
80
|
+
--corner-badge-accent-text-line-height: var(--line-height-xs);
|
|
67
81
|
|
|
68
82
|
/* Neutral */
|
|
69
83
|
--corner-badge-neutral-margin: var(--space-0);
|
|
@@ -75,7 +89,7 @@
|
|
|
75
89
|
--corner-badge-neutral-text-font-family: var(--font-sans);
|
|
76
90
|
--corner-badge-neutral-text-font-size: var(--font-size-sm);
|
|
77
91
|
--corner-badge-neutral-text-font-weight: var(--font-weight-light);
|
|
78
|
-
--corner-badge-neutral-text-line-height: var(--line-height-
|
|
92
|
+
--corner-badge-neutral-text-line-height: var(--line-height-xs);
|
|
79
93
|
|
|
80
94
|
/* Alternate */
|
|
81
95
|
--corner-badge-alternate-margin: var(--space-0);
|
|
@@ -87,7 +101,7 @@
|
|
|
87
101
|
--corner-badge-alternate-text-font-family: var(--font-sans);
|
|
88
102
|
--corner-badge-alternate-text-font-size: var(--font-size-sm);
|
|
89
103
|
--corner-badge-alternate-text-font-weight: var(--font-weight-light);
|
|
90
|
-
--corner-badge-alternate-text-line-height: var(--line-height-
|
|
104
|
+
--corner-badge-alternate-text-line-height: var(--line-height-xs);
|
|
91
105
|
|
|
92
106
|
/* Canvas */
|
|
93
107
|
--corner-badge-canvas-margin: var(--space-0);
|
|
@@ -99,7 +113,7 @@
|
|
|
99
113
|
--corner-badge-canvas-text-font-family: var(--font-sans);
|
|
100
114
|
--corner-badge-canvas-text-font-size: var(--font-size-sm);
|
|
101
115
|
--corner-badge-canvas-text-font-weight: var(--font-weight-light);
|
|
102
|
-
--corner-badge-canvas-text-line-height: var(--line-height-
|
|
116
|
+
--corner-badge-canvas-text-line-height: var(--line-height-xs);
|
|
103
117
|
|
|
104
118
|
/* Special */
|
|
105
119
|
--corner-badge-special-margin: var(--space-0);
|
|
@@ -111,7 +125,7 @@
|
|
|
111
125
|
--corner-badge-special-text-font-family: var(--font-sans);
|
|
112
126
|
--corner-badge-special-text-font-size: var(--font-size-sm);
|
|
113
127
|
--corner-badge-special-text-font-weight: var(--font-weight-light);
|
|
114
|
-
--corner-badge-special-text-line-height: var(--line-height-
|
|
128
|
+
--corner-badge-special-text-line-height: var(--line-height-xs);
|
|
115
129
|
|
|
116
130
|
/* Success */
|
|
117
131
|
--corner-badge-success-margin: var(--space-0);
|
|
@@ -123,7 +137,7 @@
|
|
|
123
137
|
--corner-badge-success-text-font-family: var(--font-sans);
|
|
124
138
|
--corner-badge-success-text-font-size: var(--font-size-sm);
|
|
125
139
|
--corner-badge-success-text-font-weight: var(--font-weight-light);
|
|
126
|
-
--corner-badge-success-text-line-height: var(--line-height-
|
|
140
|
+
--corner-badge-success-text-line-height: var(--line-height-xs);
|
|
127
141
|
|
|
128
142
|
/* Warning */
|
|
129
143
|
--corner-badge-warning-margin: var(--space-0);
|
|
@@ -135,7 +149,7 @@
|
|
|
135
149
|
--corner-badge-warning-text-font-family: var(--font-sans);
|
|
136
150
|
--corner-badge-warning-text-font-size: var(--font-size-sm);
|
|
137
151
|
--corner-badge-warning-text-font-weight: var(--font-weight-light);
|
|
138
|
-
--corner-badge-warning-text-line-height: var(--line-height-
|
|
152
|
+
--corner-badge-warning-text-line-height: var(--line-height-xs);
|
|
139
153
|
|
|
140
154
|
/* Danger */
|
|
141
155
|
--corner-badge-danger-margin: var(--space-0);
|
|
@@ -147,7 +161,7 @@
|
|
|
147
161
|
--corner-badge-danger-text-font-family: var(--font-sans);
|
|
148
162
|
--corner-badge-danger-text-font-size: var(--font-size-sm);
|
|
149
163
|
--corner-badge-danger-text-font-weight: var(--font-weight-light);
|
|
150
|
-
--corner-badge-danger-text-line-height: var(--line-height-
|
|
164
|
+
--corner-badge-danger-text-line-height: var(--line-height-xs);
|
|
151
165
|
|
|
152
166
|
/* Info */
|
|
153
167
|
--corner-badge-info-margin: var(--space-0);
|
|
@@ -159,7 +173,7 @@
|
|
|
159
173
|
--corner-badge-info-text-font-family: var(--font-sans);
|
|
160
174
|
--corner-badge-info-text-font-size: var(--font-size-sm);
|
|
161
175
|
--corner-badge-info-text-font-weight: var(--font-weight-light);
|
|
162
|
-
--corner-badge-info-text-line-height: var(--line-height-
|
|
176
|
+
--corner-badge-info-text-line-height: var(--line-height-xs);
|
|
163
177
|
}
|
|
164
178
|
|
|
165
179
|
.corner-badge {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { createEventDispatcher, tick } from 'svelte';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
3
4
|
import Button from './Button.svelte';
|
|
4
5
|
import { editorState } from '../lib/editorStore';
|
|
5
6
|
import type { ButtonVariant, DialogButtonSpec } from './types';
|
|
@@ -9,40 +10,62 @@
|
|
|
9
10
|
return v && (BUTTON_VARIANTS as readonly string[]).includes(v) ? (v as ButtonVariant) : fallback;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
interface Props {
|
|
14
|
+
show?: boolean;
|
|
15
|
+
title?: string;
|
|
16
|
+
width?: string;
|
|
17
|
+
/** When true, the dialog renders inline within its parent rather than as a fixed-position overlay. Used by the editor preview. */
|
|
18
|
+
inline?: boolean;
|
|
19
|
+
/** Right footer button. Undefined hides it. `--dialog-confirm-variant` config drives the variant when `confirm.variant` is unset. */
|
|
20
|
+
confirm?: DialogButtonSpec | undefined;
|
|
21
|
+
/** Left footer button. Undefined hides it. `--dialog-cancel-variant` config drives the variant when `cancel.variant` is unset. */
|
|
22
|
+
cancel?: DialogButtonSpec | undefined;
|
|
23
|
+
/** Close callback. Preferred over `on:close` from 0.5.0 onward. */
|
|
24
|
+
onclose?: () => void;
|
|
25
|
+
/** Left-aligned footer content. Renamed from `slot="footer-left"` in 0.5.0. */
|
|
26
|
+
footerLeft?: Snippet;
|
|
27
|
+
children?: Snippet;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let {
|
|
31
|
+
show = $bindable(false),
|
|
32
|
+
title = '',
|
|
33
|
+
width = '500px',
|
|
34
|
+
inline = false,
|
|
35
|
+
confirm = undefined,
|
|
36
|
+
cancel = undefined,
|
|
37
|
+
onclose,
|
|
38
|
+
footerLeft,
|
|
39
|
+
children,
|
|
40
|
+
}: Props = $props();
|
|
21
41
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
42
|
+
let configuredConfig = $derived($editorState.components.dialog?.config ?? {});
|
|
43
|
+
let effectiveConfirmVariant = $derived(confirm?.variant ?? asVariant(configuredConfig['--dialog-confirm-variant'] as string | undefined, 'primary'));
|
|
44
|
+
let effectiveCancelVariant = $derived(cancel?.variant ?? asVariant(configuredConfig['--dialog-cancel-variant'] as string | undefined, 'outline'));
|
|
25
45
|
|
|
46
|
+
// Dual-fire bridge — see Button.svelte for the deprecation timeline.
|
|
26
47
|
const dispatch = createEventDispatcher<{
|
|
27
48
|
close: void;
|
|
28
49
|
}>();
|
|
29
50
|
|
|
30
|
-
let confirmButtonRef: HTMLButtonElement
|
|
31
|
-
let cancelButtonRef: HTMLButtonElement
|
|
32
|
-
let closeButtonRef: HTMLButtonElement
|
|
51
|
+
let confirmButtonRef: HTMLButtonElement = $state()!;
|
|
52
|
+
let cancelButtonRef: HTMLButtonElement = $state()!;
|
|
53
|
+
let closeButtonRef: HTMLButtonElement = $state()!;
|
|
33
54
|
|
|
34
55
|
// Focus the primary button when dialog opens (skip in inline mode so the editor doesn't steal focus).
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
confirmButtonRef.
|
|
39
|
-
|
|
40
|
-
cancelButtonRef
|
|
41
|
-
|
|
42
|
-
closeButtonRef
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
56
|
+
$effect(() => {
|
|
57
|
+
if (show && !inline) {
|
|
58
|
+
tick().then(() => {
|
|
59
|
+
if (confirm && confirmButtonRef && !confirm.disabled) {
|
|
60
|
+
confirmButtonRef.focus();
|
|
61
|
+
} else if (cancel && cancelButtonRef) {
|
|
62
|
+
cancelButtonRef.focus();
|
|
63
|
+
} else if (closeButtonRef) {
|
|
64
|
+
closeButtonRef.focus();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
46
69
|
|
|
47
70
|
function handleConfirm() {
|
|
48
71
|
if (confirm && !confirm.disabled) {
|
|
@@ -54,6 +77,7 @@
|
|
|
54
77
|
if (cancel) {
|
|
55
78
|
cancel.onClick();
|
|
56
79
|
} else {
|
|
80
|
+
onclose?.();
|
|
57
81
|
dispatch('close');
|
|
58
82
|
show = false;
|
|
59
83
|
}
|
|
@@ -70,7 +94,7 @@
|
|
|
70
94
|
<button
|
|
71
95
|
bind:this={closeButtonRef}
|
|
72
96
|
class="dialog-close"
|
|
73
|
-
|
|
97
|
+
onclick={handleCancel}
|
|
74
98
|
aria-label="Close"
|
|
75
99
|
tabindex="0"
|
|
76
100
|
>
|
|
@@ -80,13 +104,13 @@
|
|
|
80
104
|
{/if}
|
|
81
105
|
|
|
82
106
|
<div class="dialog-body">
|
|
83
|
-
|
|
107
|
+
{@render children?.()}
|
|
84
108
|
</div>
|
|
85
109
|
|
|
86
110
|
{#if confirm || cancel}
|
|
87
111
|
<div class="dialog-footer">
|
|
88
112
|
<div class="dialog-footer-left">
|
|
89
|
-
|
|
113
|
+
{@render footerLeft?.()}
|
|
90
114
|
</div>
|
|
91
115
|
<div class="dialog-footer-buttons">
|
|
92
116
|
{#if cancel}
|
|
@@ -141,7 +165,7 @@
|
|
|
141
165
|
--dialog-title-font-family: var(--font-sans);
|
|
142
166
|
--dialog-title-font-size: var(--font-size-2xl);
|
|
143
167
|
--dialog-title-font-weight: var(--font-weight-normal);
|
|
144
|
-
--dialog-title-line-height: var(--line-height-
|
|
168
|
+
--dialog-title-line-height: var(--line-height-sm);
|
|
145
169
|
|
|
146
170
|
/* Close icon */
|
|
147
171
|
--dialog-close-icon: var(--text-secondary);
|
|
@@ -153,7 +177,7 @@
|
|
|
153
177
|
--dialog-body-font-family: var(--font-sans);
|
|
154
178
|
--dialog-body-font-size: var(--font-size-md);
|
|
155
179
|
--dialog-body-font-weight: var(--font-weight-normal);
|
|
156
|
-
--dialog-body-line-height: var(--line-height-
|
|
180
|
+
--dialog-body-line-height: var(--line-height-md);
|
|
157
181
|
|
|
158
182
|
/* Footer */
|
|
159
183
|
--dialog-footer-border: var(--border-neutral-subtle);
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
src: string;
|
|
4
|
+
alt: string;
|
|
5
|
+
variant?: 'default' | 'banner' | 'medium' | 'compact';
|
|
6
|
+
height?: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
src,
|
|
11
|
+
alt,
|
|
12
|
+
variant = 'default',
|
|
13
|
+
height = undefined
|
|
14
|
+
}: Props = $props();
|
|
6
15
|
|
|
7
16
|
const variantHeights: Record<string, string | undefined> = {
|
|
8
17
|
default: undefined,
|
|
@@ -11,7 +20,7 @@
|
|
|
11
20
|
compact: '180px',
|
|
12
21
|
};
|
|
13
22
|
|
|
14
|
-
|
|
23
|
+
let resolvedHeight = $derived(height ?? variantHeights[variant]);
|
|
15
24
|
</script>
|
|
16
25
|
|
|
17
26
|
<div class="image" style:height={resolvedHeight}>
|
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/**
|
|
3
6
|
* Reusable inline edit action buttons (confirm/cancel)
|
|
4
7
|
* Used for inline editing throughout the app
|
|
5
8
|
*/
|
|
9
|
+
onSave: () => void | Promise<void>;
|
|
10
|
+
onCancel: () => void;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
saveTitle?: string;
|
|
13
|
+
cancelTitle?: string;
|
|
14
|
+
class?: string;
|
|
15
|
+
}
|
|
6
16
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
let {
|
|
18
|
+
onSave,
|
|
19
|
+
onCancel,
|
|
20
|
+
disabled = false,
|
|
21
|
+
saveTitle = "Save",
|
|
22
|
+
cancelTitle = "Cancel",
|
|
23
|
+
class: className = ''
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
14
26
|
</script>
|
|
15
27
|
|
|
16
28
|
<div class="inline-actions {className}">
|
|
17
29
|
<button
|
|
18
30
|
class="save-btn"
|
|
19
31
|
type="button"
|
|
20
|
-
|
|
32
|
+
onclick={onSave}
|
|
21
33
|
{disabled}
|
|
22
34
|
title={saveTitle}
|
|
23
35
|
>
|
|
@@ -26,7 +38,7 @@
|
|
|
26
38
|
<button
|
|
27
39
|
class="cancel-btn"
|
|
28
40
|
type="button"
|
|
29
|
-
|
|
41
|
+
onclick={onCancel}
|
|
30
42
|
disabled={disabled}
|
|
31
43
|
title={cancelTitle}
|
|
32
44
|
>
|