@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.
Files changed (103) hide show
  1. package/package.json +9 -8
  2. package/src/component-editor/BadgeEditor.svelte +24 -22
  3. package/src/component-editor/CalloutEditor.svelte +3 -3
  4. package/src/component-editor/CardEditor.svelte +25 -21
  5. package/src/component-editor/CollapsibleSectionEditor.svelte +27 -25
  6. package/src/component-editor/CornerBadgeEditor.svelte +37 -35
  7. package/src/component-editor/DialogEditor.svelte +26 -24
  8. package/src/component-editor/ImageEditor.svelte +11 -9
  9. package/src/component-editor/InlineEditActionsEditor.svelte +17 -15
  10. package/src/component-editor/NotificationEditor.svelte +32 -30
  11. package/src/component-editor/ProgressBarEditor.svelte +3 -3
  12. package/src/component-editor/RadioButtonEditor.svelte +31 -29
  13. package/src/component-editor/SectionDividerEditor.svelte +30 -28
  14. package/src/component-editor/SegmentedControlEditor.svelte +29 -25
  15. package/src/component-editor/StandardButtonsEditor.svelte +42 -38
  16. package/src/component-editor/TabBarEditor.svelte +20 -18
  17. package/src/component-editor/TableEditor.svelte +4 -4
  18. package/src/component-editor/TooltipEditor.svelte +11 -9
  19. package/src/component-editor/registry.ts +2 -2
  20. package/src/component-editor/scaffolding/AngleDial.svelte +20 -19
  21. package/src/component-editor/scaffolding/ComponentEditorBase.svelte +44 -20
  22. package/src/component-editor/scaffolding/ComponentFileManager.svelte +260 -37
  23. package/src/component-editor/scaffolding/ComponentFileMenu.svelte +41 -29
  24. package/src/component-editor/scaffolding/ComponentsTab.svelte +7 -3
  25. package/src/component-editor/scaffolding/CopyFromMenu.svelte +21 -12
  26. package/src/component-editor/scaffolding/DemoHeader.svelte +13 -4
  27. package/src/component-editor/scaffolding/DividerEditor.svelte +27 -14
  28. package/src/component-editor/scaffolding/FieldsetWrapper.svelte +10 -4
  29. package/src/component-editor/scaffolding/GradientCard.svelte +25 -20
  30. package/src/component-editor/scaffolding/LinkageChart.svelte +43 -34
  31. package/src/component-editor/scaffolding/LinkedBlock.svelte +24 -21
  32. package/src/component-editor/scaffolding/NonStylableConfig.svelte +6 -1
  33. package/src/component-editor/scaffolding/SaveAsDialog.svelte +39 -35
  34. package/src/component-editor/scaffolding/ShadowBackdrop.svelte +21 -9
  35. package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +8 -3
  36. package/src/component-editor/scaffolding/StateBlock.svelte +30 -13
  37. package/src/component-editor/scaffolding/TokenLayout.svelte +46 -30
  38. package/src/component-editor/scaffolding/TypeEditor.svelte +52 -26
  39. package/src/component-editor/scaffolding/VariantGroup.svelte +81 -48
  40. package/src/component-editor/scaffolding/componentSectionType.ts +2 -2
  41. package/src/components/Badge.svelte +45 -26
  42. package/src/components/Button.svelte +44 -21
  43. package/src/components/Callout.svelte +17 -12
  44. package/src/components/Card.svelte +23 -11
  45. package/src/components/CollapsibleSection.svelte +56 -27
  46. package/src/components/CornerBadge.svelte +32 -18
  47. package/src/components/Dialog.svelte +55 -31
  48. package/src/components/Image.svelte +14 -5
  49. package/src/components/InlineEditActions.svelte +22 -10
  50. package/src/components/Notification.svelte +39 -19
  51. package/src/components/ProgressBar.svelte +27 -17
  52. package/src/components/RadioButton.svelte +27 -10
  53. package/src/components/SectionDivider.svelte +34 -26
  54. package/src/components/SegmentedControl.svelte +23 -9
  55. package/src/components/TabBar.svelte +23 -10
  56. package/src/components/Table.svelte +8 -3
  57. package/src/components/Tooltip.svelte +15 -5
  58. package/src/lib/ColumnsOverlay.svelte +3 -3
  59. package/src/lib/LiveEditorOverlay.svelte +57 -36
  60. package/src/pages/ComponentEditorPage.svelte +17 -13
  61. package/src/pages/EditorShell.svelte +24 -20
  62. package/src/styles/form-controls.css +2 -2
  63. package/src/styles/tokens.css +59 -81
  64. package/src/ui/BezierCurveEditor.svelte +59 -43
  65. package/src/ui/ColorEditPanel.svelte +71 -44
  66. package/src/ui/EditorViewSwitcher.svelte +9 -5
  67. package/src/ui/FontStackEditor.svelte +16 -15
  68. package/src/ui/GradientEditor.svelte +42 -33
  69. package/src/ui/GradientStopPicker.svelte +18 -29
  70. package/src/ui/PaletteEditor.svelte +238 -212
  71. package/src/ui/PresetFileManager.svelte +20 -18
  72. package/src/ui/ProjectFontsSection.svelte +30 -30
  73. package/src/ui/SurfacesTab.svelte +3 -3
  74. package/src/ui/TextTab.svelte +2 -2
  75. package/src/ui/ThemeFileManager.svelte +38 -35
  76. package/src/ui/Toggle.svelte +11 -9
  77. package/src/ui/UICopyPopover.svelte +19 -15
  78. package/src/ui/UIDialog.svelte +48 -30
  79. package/src/ui/UIFontFamilySelector.svelte +104 -78
  80. package/src/ui/UIFontSizeSelector.svelte +38 -20
  81. package/src/ui/UIFontWeightSelector.svelte +33 -13
  82. package/src/ui/UILineHeightSelector.svelte +33 -13
  83. package/src/ui/UILinkToggle.svelte +7 -6
  84. package/src/ui/UIOptionItem.svelte +21 -7
  85. package/src/ui/UIOptionList.svelte +9 -3
  86. package/src/ui/UIPaddingSelector.svelte +108 -82
  87. package/src/ui/UIPaletteSelector.svelte +186 -161
  88. package/src/ui/UIRadio.svelte +23 -8
  89. package/src/ui/UIRadioGroup.svelte +9 -8
  90. package/src/ui/UIRelinkConfirmPopover.svelte +26 -16
  91. package/src/ui/UITokenSelector.svelte +112 -68
  92. package/src/ui/UIVariantSelector.svelte +79 -57
  93. package/src/ui/VariablesTab.svelte +15 -15
  94. package/src/ui/palette/GradientStopEditor.svelte +45 -26
  95. package/src/ui/palette/OverridesPanel.svelte +85 -49
  96. package/src/ui/palette/PaletteBase.svelte +60 -32
  97. package/src/ui/palette/ScaleCurveEditor.svelte +25 -10
  98. package/src/ui/sections/ColumnsSection.svelte +13 -13
  99. package/src/ui/sections/GradientsSection.svelte +12 -9
  100. package/src/ui/sections/OverlaysSection.svelte +50 -47
  101. package/src/ui/sections/ShadowsSection.svelte +110 -104
  102. package/src/ui/sections/TokenScaleTable.svelte +38 -22
  103. package/src/ui/sections/tokenScales.ts +2 -2
@@ -1,10 +1,22 @@
1
1
  <script lang="ts">
2
- export let icon: string = '';
3
- export let iconColor: string = 'var(--text-secondary)';
4
- export let title: string = '';
5
- export let size: 'default' | 'compact' = 'default';
6
- let className: string = '';
7
- export { className as class };
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
- <slot />
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-snug);
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-normal);
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-snug);
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-normal);
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
- export let label: string;
5
- export let expanded: boolean = false;
6
- export let href: string | undefined = undefined;
7
- export let active: boolean = false;
8
- export let variant: 'chromeless' | 'divider' | 'container' = 'container';
9
- let className: string = '';
10
- export { className as class };
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
- dispatch('toggle');
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 on:click={handleHeaderClick}>
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
- <slot name="summary" />
54
+ {@render summary?.()}
32
55
  </a>
33
56
  {:else}
34
- <!-- svelte-ignore a11y-click-events-have-key-events a11y-no-noninteractive-element-interactions -->
35
- <div class="section-header" class:expanded on:click={() => dispatch('toggle')}>
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
- <slot name="summary" />
63
+ {@render summary?.()}
41
64
  </div>
42
65
  {/if}
43
- {#if expanded && $$slots.default}
66
+ {#if expanded && children}
44
67
  <div class="section-content">
45
- <slot />
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-normal);
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-normal);
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-normal);
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-normal);
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-normal);
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-normal);
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-normal);
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-normal);
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-normal);
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, &.force-hover { @include header-paint(chromeless, 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, &.force-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, &.force-hover { @include header-paint(container, 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 context="module" lang="ts">
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
- export let variant: BadgeVariant = 'accent';
9
- export let anchor: CornerAnchor = 'bottom-right';
10
- export let size: 'default' | 'small' = 'default';
11
- export let icon: string | undefined = undefined;
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
- <slot name="icon" slot="icon" />
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-tight);
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-tight);
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-tight);
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-tight);
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-tight);
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-tight);
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-tight);
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-tight);
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-tight);
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-tight);
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
- export let show: boolean = false;
13
- export let title: string = '';
14
- export let width: string = '500px';
15
- /** When true, the dialog renders inline within its parent rather than as a fixed-position overlay. Used by the editor preview. */
16
- export let inline: boolean = false;
17
- /** Right footer button. Undefined hides it. `--dialog-confirm-variant` config drives the variant when `confirm.variant` is unset. */
18
- export let confirm: DialogButtonSpec | undefined = undefined;
19
- /** Left footer button. Undefined hides it. `--dialog-cancel-variant` config drives the variant when `cancel.variant` is unset. */
20
- export let cancel: DialogButtonSpec | undefined = undefined;
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
- $: configuredConfig = $editorState.components.dialog?.config ?? {};
23
- $: effectiveConfirmVariant = confirm?.variant ?? asVariant(configuredConfig['--dialog-confirm-variant'] as string | undefined, 'primary');
24
- $: effectiveCancelVariant = cancel?.variant ?? asVariant(configuredConfig['--dialog-cancel-variant'] as string | undefined, 'outline');
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
- $: if (show && !inline) {
36
- tick().then(() => {
37
- if (confirm && confirmButtonRef && !confirm.disabled) {
38
- confirmButtonRef.focus();
39
- } else if (cancel && cancelButtonRef) {
40
- cancelButtonRef.focus();
41
- } else if (closeButtonRef) {
42
- closeButtonRef.focus();
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
- on:click={handleCancel}
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
- <slot />
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
- <slot name="footer-left" />
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-snug);
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-normal);
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
- export let src: string;
3
- export let alt: string;
4
- export let variant: 'default' | 'banner' | 'medium' | 'compact' = 'default';
5
- export let height: string | undefined = undefined;
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
- $: resolvedHeight = height ?? variantHeights[variant];
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
- export let onSave: () => void | Promise<void>;
8
- export let onCancel: () => void;
9
- export let disabled = false;
10
- export let saveTitle = "Save";
11
- export let cancelTitle = "Cancel";
12
- let className: string = '';
13
- export { className as class };
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
- on:click={onSave}
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
- on:click={onCancel}
41
+ onclick={onCancel}
30
42
  disabled={disabled}
31
43
  title={cancelTitle}
32
44
  >