@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.
- package/README.md +47 -4
- package/package.json +18 -12
- 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 +262 -38
- 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 +25 -14
- package/src/pages/Editor.svelte +8 -2
- package/src/pages/EditorShell.svelte +24 -20
- package/src/styles/site.css +138 -0
- package/src/styles/tokens.css +78 -76
- package/src/styles/ui-form-controls.css +186 -0
- 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 +17 -16
- 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 +34 -34
- 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
- package/src/styles/form-controls.css +0 -188
|
@@ -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
|
>
|