@papu1337/builder 0.0.5 → 1.0.1

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 (117) hide show
  1. package/dist/builder/BuilderView.svelte +158 -0
  2. package/dist/builder/BuilderView.svelte.d.ts +8 -0
  3. package/dist/builder/builder.vanilla.es.js +6514 -0
  4. package/dist/builder/builder.vanilla.umd.js +89 -0
  5. package/dist/builder/canvas/canvas.svelte +92 -0
  6. package/dist/builder/canvas/canvas.svelte.d.ts +17 -0
  7. package/dist/builder/canvas/styles.css +63 -0
  8. package/dist/builder/createBuilder.svelte.d.ts +9 -0
  9. package/dist/builder/createBuilder.svelte.js +17 -0
  10. package/dist/builder/index.d.ts +8 -0
  11. package/dist/builder/index.js +7 -0
  12. package/dist/builder/leftbar/leftBar.svelte +740 -0
  13. package/dist/builder/leftbar/leftBar.svelte.d.ts +8 -0
  14. package/dist/builder/leftbar/styles.css +152 -0
  15. package/dist/builder/pageMeta.svelte.d.ts +13 -0
  16. package/dist/builder/pageMeta.svelte.js +25 -0
  17. package/dist/builder/rightbar/rightBar.svelte +100 -0
  18. package/dist/builder/rightbar/rightBar.svelte.d.ts +10 -0
  19. package/dist/builder/rightbar/styles.css +167 -0
  20. package/dist/builder/topbar/TopBar.svelte +337 -0
  21. package/dist/builder/topbar/TopBar.svelte.d.ts +12 -0
  22. package/dist/builder/topbar/styles.css +123 -0
  23. package/dist/builder/viewport.svelte.d.ts +9 -0
  24. package/dist/builder/viewport.svelte.js +17 -0
  25. package/dist/elements/_shared/Arrow.svelte +58 -0
  26. package/dist/elements/_shared/Arrow.svelte.d.ts +11 -0
  27. package/dist/elements/_shared/GradientBorder.svelte +55 -0
  28. package/dist/elements/_shared/GradientBorder.svelte.d.ts +10 -0
  29. package/dist/elements/banner/bannerElement.svelte +101 -33
  30. package/dist/elements/banner/settings.d.ts +13 -3
  31. package/dist/elements/banner/settings.js +88 -8
  32. package/dist/elements/button/buttonElement.svelte +27 -21
  33. package/dist/elements/button/settings.d.ts +11 -9
  34. package/dist/elements/button/settings.js +18 -39
  35. package/dist/elements/globalSettings.js +5 -4
  36. package/dist/elements/howItWorks/howItWorksElement.svelte +221 -0
  37. package/dist/elements/howItWorks/howItWorksElement.svelte.d.ts +7 -0
  38. package/dist/elements/howItWorks/settings.d.ts +16 -0
  39. package/dist/elements/howItWorks/settings.js +70 -0
  40. package/dist/elements/steps/settings.d.ts +17 -0
  41. package/dist/elements/steps/settings.js +69 -0
  42. package/dist/elements/steps/stepsElement.svelte +220 -0
  43. package/dist/elements/steps/stepsElement.svelte.d.ts +7 -0
  44. package/dist/elements/terms/settings.d.ts +14 -0
  45. package/dist/elements/terms/settings.js +32 -0
  46. package/dist/elements/terms/termsElement.svelte +209 -0
  47. package/dist/elements/terms/termsElement.svelte.d.ts +7 -0
  48. package/dist/elements/text/settings.d.ts +8 -11
  49. package/dist/elements/text/settings.js +21 -51
  50. package/dist/elements/text/textElement.svelte +23 -23
  51. package/dist/hooks/index.d.ts +1 -0
  52. package/dist/hooks/index.js +1 -0
  53. package/dist/hooks/useTranslation.svelte.d.ts +9 -0
  54. package/dist/hooks/useTranslation.svelte.js +10 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.js +3 -0
  57. package/dist/renderer/BuilderRenderer.svelte +30 -2
  58. package/dist/renderer/registry.js +6 -6
  59. package/dist/renderer/renderer.vanilla.es.js +1547 -1188
  60. package/dist/renderer/renderer.vanilla.umd.js +64 -39
  61. package/dist/renderer/resolve.d.ts +1 -1
  62. package/dist/renderer/resolve.js +28 -14
  63. package/dist/renderer/types.d.ts +2 -0
  64. package/dist/service/element.action.svelte.d.ts +21 -0
  65. package/dist/service/element.action.svelte.js +125 -0
  66. package/dist/service/element.history.svelte.d.ts +8 -0
  67. package/dist/service/element.history.svelte.js +36 -0
  68. package/dist/service/element.io.svelte.d.ts +4 -0
  69. package/dist/service/element.io.svelte.js +232 -0
  70. package/dist/service/element.reader.svelte.d.ts +4 -0
  71. package/dist/service/element.reader.svelte.js +51 -0
  72. package/dist/service/element.translate.svelte.d.ts +12 -0
  73. package/dist/service/element.translate.svelte.js +81 -0
  74. package/dist/service/index.d.ts +5 -0
  75. package/dist/service/index.js +5 -0
  76. package/dist/service/types.d.ts +13 -0
  77. package/dist/service/types.js +1 -0
  78. package/dist/settings/base.svelte.d.ts +6 -1
  79. package/dist/settings/base.svelte.js +61 -17
  80. package/dist/settings/components/ColorSettings.svelte +169 -40
  81. package/dist/settings/components/ColorSettings.svelte.d.ts +3 -2
  82. package/dist/settings/components/ListSettings.svelte +4 -5
  83. package/dist/settings/components/NumberSettings.svelte +117 -20
  84. package/dist/settings/components/RepeaterSettings.svelte +145 -0
  85. package/dist/settings/components/RepeaterSettings.svelte.d.ts +14 -0
  86. package/dist/settings/components/SegmentSettings.svelte +85 -0
  87. package/dist/settings/components/SegmentSettings.svelte.d.ts +5 -0
  88. package/dist/settings/components/SelectSettings.svelte +2 -3
  89. package/dist/settings/components/SettingsGroup.svelte +14 -69
  90. package/dist/settings/components/SettingsRenderer.svelte +76 -0
  91. package/dist/settings/components/SettingsRenderer.svelte.d.ts +8 -0
  92. package/dist/settings/components/TextSettings.svelte +2 -3
  93. package/dist/settings/components/TranslatableSettings.svelte +3 -4
  94. package/dist/settings/components/UploadSettings.svelte +2 -3
  95. package/dist/settings/groups.d.ts +23 -7
  96. package/dist/settings/groups.js +48 -24
  97. package/dist/settings/implementation.svelte.js +4 -0
  98. package/dist/settings/index.d.ts +2 -0
  99. package/dist/settings/index.js +2 -0
  100. package/dist/settings/mode.svelte.d.ts +4 -0
  101. package/dist/settings/mode.svelte.js +4 -0
  102. package/dist/settings/repeater.svelte.d.ts +26 -0
  103. package/dist/settings/repeater.svelte.js +70 -0
  104. package/dist/settings/types.d.ts +28 -2
  105. package/package.json +8 -2
  106. package/dist/elements/accordion/accordionElement.svelte +0 -101
  107. package/dist/elements/accordion/accordionElement.svelte.d.ts +0 -7
  108. package/dist/elements/accordion/settings.d.ts +0 -17
  109. package/dist/elements/accordion/settings.js +0 -54
  110. package/dist/elements/badge/badgeElement.svelte +0 -49
  111. package/dist/elements/badge/badgeElement.svelte.d.ts +0 -7
  112. package/dist/elements/badge/settings.d.ts +0 -14
  113. package/dist/elements/badge/settings.js +0 -47
  114. package/dist/elements/ctaCard/ctaCardElement.svelte +0 -132
  115. package/dist/elements/ctaCard/ctaCardElement.svelte.d.ts +0 -7
  116. package/dist/elements/ctaCard/settings.d.ts +0 -22
  117. package/dist/elements/ctaCard/settings.js +0 -64
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ import type { BaseSettingProps, SegmentExtra } from '../types';
3
+
4
+ let { title, value, onchange, options }: BaseSettingProps<string> & SegmentExtra = $props();
5
+ </script>
6
+
7
+ <div class="setting-item">
8
+ <div class="label-row">
9
+ <label for={title}>{title}</label>
10
+ </div>
11
+ <div class="segment">
12
+ {#each options as opt (opt.value)}
13
+ <button
14
+ type="button"
15
+ class="segment__btn"
16
+ class:segment__btn--active={value === opt.value}
17
+ title={opt.label}
18
+ aria-label={opt.label}
19
+ onclick={() => onchange(opt.value)}
20
+ >
21
+ {#if opt.icon === 'align-left'}
22
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="3" y1="6" x2="15" y2="6" /><line x1="3" y1="12" x2="21" y2="12" /><line x1="3" y1="18" x2="15" y2="18" /></svg>
23
+ {:else if opt.icon === 'align-center'}
24
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="6" x2="18" y2="6" /><line x1="3" y1="12" x2="21" y2="12" /><line x1="6" y1="18" x2="18" y2="18" /></svg>
25
+ {:else if opt.icon === 'align-right'}
26
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="9" y1="6" x2="21" y2="6" /><line x1="3" y1="12" x2="21" y2="12" /><line x1="9" y1="18" x2="21" y2="18" /></svg>
27
+ {:else}
28
+ {opt.label}
29
+ {/if}
30
+ </button>
31
+ {/each}
32
+ </div>
33
+ </div>
34
+
35
+ <style>
36
+ .setting-item {
37
+ display: flex;
38
+ flex-direction: column;
39
+ gap: 8px;
40
+ padding: 12px 0;
41
+ }
42
+
43
+ .label-row {
44
+ display: flex;
45
+ justify-content: space-between;
46
+ align-items: center;
47
+ }
48
+
49
+ label {
50
+ font-size: 0.8rem;
51
+ font-weight: 500;
52
+ color: var(--text-secondary);
53
+ }
54
+
55
+ .segment {
56
+ display: flex;
57
+ gap: 3px;
58
+ padding: 3px;
59
+ background: var(--bg-elevated);
60
+ border: 1px solid var(--border-light);
61
+ border-radius: var(--radius-md);
62
+ }
63
+
64
+ .segment__btn {
65
+ flex: 1;
66
+ height: 32px;
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ border: none;
71
+ background: transparent;
72
+ border-radius: 6px;
73
+ cursor: pointer;
74
+ color: var(--text-secondary);
75
+ font: inherit;
76
+ font-size: 0.8rem;
77
+ transition: background var(--transition), color var(--transition);
78
+ }
79
+
80
+ .segment__btn--active {
81
+ background: var(--bg-surface);
82
+ color: var(--accent);
83
+ box-shadow: var(--shadow-sm);
84
+ }
85
+ </style>
@@ -0,0 +1,5 @@
1
+ import type { BaseSettingProps, SegmentExtra } from '../types';
2
+ type $$ComponentProps = BaseSettingProps<string> & SegmentExtra;
3
+ declare const SegmentSettings: import("svelte").Component<$$ComponentProps, {}, "">;
4
+ type SegmentSettings = ReturnType<typeof SegmentSettings>;
5
+ export default SegmentSettings;
@@ -33,17 +33,16 @@
33
33
  font-size: 0.8rem;
34
34
  font-weight: 500;
35
35
  color: var(--text-secondary);
36
- text-transform: capitalize;
37
36
  }
38
37
 
39
38
  select {
40
39
  width: 100%;
41
- padding: 10px 12px;
40
+ padding: 9px 11px;
42
41
  background: var(--bg-elevated);
43
42
  border: 1px solid var(--border-light);
44
43
  border-radius: var(--radius-md);
45
44
  color: var(--text-primary);
46
- font-size: 0.85rem;
45
+ font-size: 0.8rem;
47
46
  font-family: var(--font);
48
47
  outline: none;
49
48
  cursor: pointer;
@@ -7,88 +7,33 @@
7
7
  children: Snippet;
8
8
  }
9
9
 
10
- let { title, defaultOpen = false, children }: SettingsGroupProps = $props();
11
- // svelte-ignore state_referenced_locally
12
- let isOpen = $state(defaultOpen);
10
+ let { title, children }: SettingsGroupProps = $props();
13
11
  </script>
14
12
 
15
- <div class="settings-group" class:open={isOpen}>
16
- <button class="group-header" onclick={() => (isOpen = !isOpen)}>
17
- <span class="group-title">{title}</span>
18
- <svg
19
- class="chevron"
20
- class:rotated={isOpen}
21
- width="14"
22
- height="14"
23
- viewBox="0 0 24 24"
24
- fill="none"
25
- stroke="currentColor"
26
- stroke-width="2"
27
- stroke-linecap="round"
28
- stroke-linejoin="round"
29
- >
30
- <polyline points="6 9 12 15 18 9" />
31
- </svg>
32
- </button>
33
-
34
- {#if isOpen}
35
- <div class="group-body">
36
- {@render children()}
37
- </div>
38
- {/if}
13
+ <div class="settings-group">
14
+ <div class="group-legend">{title}</div>
15
+ <div class="group-body">
16
+ {@render children()}
17
+ </div>
39
18
  </div>
40
19
 
41
20
  <style>
42
21
  .settings-group {
43
- border: 1px solid var(--border-light);
44
- border-radius: var(--radius-sm);
45
- overflow: hidden;
46
- margin-bottom: 8px;
47
- background: var(--bg-surface);
48
- }
49
-
50
- .settings-group.open {
51
- border-color: var(--border);
52
- }
53
-
54
- .group-header {
55
- display: flex;
56
- align-items: center;
57
- justify-content: space-between;
58
- width: 100%;
59
- padding: 12px 14px;
60
- background: var(--bg-elevated);
61
- border: none;
62
- cursor: pointer;
63
- font-family: inherit;
64
- transition: background var(--transition);
65
- user-select: none;
66
- }
67
-
68
- .group-header:hover {
69
- background: var(--bg-hover, rgba(255, 255, 255, 0.06));
22
+ padding: 14px 0 2px;
23
+ margin-top: 6px;
24
+ border-top: 1px solid var(--border-light);
70
25
  }
71
26
 
72
- .group-title {
73
- font-size: 0.78rem;
27
+ .group-legend {
28
+ font-size: 0.72rem;
74
29
  font-weight: 600;
75
- letter-spacing: 0.06em;
30
+ letter-spacing: 0.1em;
76
31
  text-transform: uppercase;
77
- color: var(--text-secondary);
78
- }
79
-
80
- .chevron {
81
32
  color: var(--text-muted);
82
- transition: transform 0.2s ease;
83
- flex-shrink: 0;
84
- }
85
-
86
- .chevron.rotated {
87
- transform: rotate(180deg);
88
33
  }
89
34
 
90
35
  .group-body {
91
- padding: 6px 14px 10px;
92
- border-top: 1px solid var(--border-light);
36
+ display: flex;
37
+ flex-direction: column;
93
38
  }
94
39
  </style>
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ import type { Component } from 'svelte';
3
+ import { Settings } from '../base.svelte';
4
+ import SettingsGroup from './SettingsGroup.svelte';
5
+ import Self from './SettingsRenderer.svelte';
6
+
7
+ interface FieldLike {
8
+ component: Component<Record<string, unknown>>;
9
+ getProps(): Record<string, unknown>;
10
+ }
11
+
12
+ let { entries, defaultOpen = false }: { entries: Record<string, unknown>; defaultOpen?: boolean } =
13
+ $props();
14
+ </script>
15
+
16
+ {#each Object.entries(entries) as [key, entry] (key)}
17
+ {#if entry instanceof Settings}
18
+ <SettingsGroup title={entry.title} {defaultOpen}>
19
+ <Self entries={entry.entries} />
20
+ </SettingsGroup>
21
+ {:else}
22
+ {@const field = entry as FieldLike}
23
+ {@const props = field.getProps()}
24
+ {@const Field = field.component}
25
+ <div class="setting-item" class:setting-item--override={Boolean(props.overridden)}>
26
+ <Field {...props} />
27
+ {#if props.overridden}
28
+ <button
29
+ class="setting-reset"
30
+ type="button"
31
+ title="Reset to desktop value"
32
+ onclick={props.onreset as () => void}
33
+ aria-label="Reset to desktop value"
34
+ >
35
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 7v6h6" /><path d="M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13" /></svg>
36
+ </button>
37
+ {/if}
38
+ </div>
39
+ {/if}
40
+ {/each}
41
+
42
+ <style>
43
+ .setting-item {
44
+ position: relative;
45
+ }
46
+
47
+ .setting-item--override :global(input),
48
+ .setting-item--override :global(select),
49
+ .setting-item--override :global(.color-row),
50
+ .setting-item--override :global(.segment),
51
+ .setting-item--override :global(.number-box) {
52
+ border-color: var(--accent);
53
+ }
54
+
55
+ .setting-reset {
56
+ position: absolute;
57
+ top: 12px;
58
+ right: 0;
59
+ width: 20px;
60
+ height: 18px;
61
+ display: inline-flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ padding: 0;
65
+ border: none;
66
+ background: transparent;
67
+ color: var(--text-muted);
68
+ cursor: pointer;
69
+ border-radius: 4px;
70
+ }
71
+
72
+ .setting-reset:hover {
73
+ color: var(--accent);
74
+ background: var(--accent-subtle);
75
+ }
76
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { Component } from 'svelte';
2
+ type $$ComponentProps = {
3
+ entries: Record<string, unknown>;
4
+ defaultOpen?: boolean;
5
+ };
6
+ declare const SettingsRenderer: Component<$$ComponentProps, {}, "">;
7
+ type SettingsRenderer = ReturnType<typeof SettingsRenderer>;
8
+ export default SettingsRenderer;
@@ -34,17 +34,16 @@
34
34
  font-size: 0.8rem;
35
35
  font-weight: 500;
36
36
  color: var(--text-secondary);
37
- text-transform: capitalize;
38
37
  }
39
38
 
40
39
  input[type='text'] {
41
40
  width: 100%;
42
- padding: 10px 12px;
41
+ padding: 9px 11px;
43
42
  background: var(--bg-elevated);
44
43
  border: 1px solid var(--border-light);
45
44
  border-radius: var(--radius-md);
46
45
  color: var(--text-primary);
47
- font-size: 0.85rem;
46
+ font-size: 0.8rem;
48
47
  font-family: var(--font);
49
48
  outline: none;
50
49
  transition:
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { languages, locale } from '../../../hooks/useTranslation.svelte.js';
2
+ import { languages, locale } from '../../hooks/useTranslation.svelte.js';
3
3
 
4
4
  interface Props {
5
5
  value: Record<string, string>;
@@ -94,7 +94,6 @@
94
94
  font-size: 0.8rem;
95
95
  font-weight: 500;
96
96
  color: var(--text-secondary);
97
- text-transform: capitalize;
98
97
  pointer-events: none;
99
98
  }
100
99
 
@@ -126,11 +125,11 @@
126
125
  .single-input input {
127
126
  width: 100%;
128
127
  box-sizing: border-box;
129
- padding: 10px 12px;
128
+ padding: 9px 11px;
130
129
  background: var(--bg-elevated);
131
130
  border: 1px solid var(--border-light);
132
131
  border-radius: var(--radius-md);
133
- font-size: 0.85rem;
132
+ font-size: 0.8rem;
134
133
  color: var(--text-primary);
135
134
  font-family: inherit;
136
135
  outline: none;
@@ -59,7 +59,6 @@
59
59
  font-size: 0.8rem;
60
60
  font-weight: 500;
61
61
  color: var(--text-secondary);
62
- text-transform: capitalize;
63
62
  }
64
63
 
65
64
  .upload-zone {
@@ -96,7 +95,7 @@
96
95
  }
97
96
 
98
97
  .upload-text {
99
- font-size: 0.8rem;
98
+ font-size: 0.72rem;
100
99
  font-weight: 500;
101
100
  color: var(--text-secondary);
102
101
  }
@@ -146,7 +145,7 @@
146
145
  background: var(--accent);
147
146
  color: #fff;
148
147
  border-radius: var(--radius-md);
149
- font-size: 0.8rem;
148
+ font-size: 0.72rem;
150
149
  font-weight: 500;
151
150
  cursor: pointer;
152
151
  font-family: var(--font);
@@ -1,14 +1,30 @@
1
- import { ColorSetting, NumberSetting, SelectSetting, TextSetting } from './implementation.svelte';
1
+ import { Settings } from "./base.svelte";
2
+ import { ColorSetting, NumberSetting, SelectSetting, TextSetting, TranslatableSetting } from "./implementation.svelte";
2
3
  type TypographyDefaults = {
4
+ title?: string;
3
5
  color?: string;
4
6
  fontSize?: number;
5
7
  fontFamily?: string;
6
8
  fontWeight?: string;
9
+ text?: string;
10
+ colorGradient?: boolean;
7
11
  };
8
- export declare function createTypographySettings(defaults?: TypographyDefaults): {
9
- readonly color: ColorSetting;
10
- readonly fontSize: NumberSetting;
11
- readonly fontFamily: TextSetting;
12
- readonly fontWeight: SelectSetting;
13
- };
12
+ export declare function TypographySettings(defaults?: TypographyDefaults): Settings<{
13
+ text: TranslatableSetting;
14
+ color: ColorSetting;
15
+ fontSize: NumberSetting;
16
+ fontFamily: TextSetting;
17
+ fontWeight: SelectSetting;
18
+ }>;
19
+ interface BorderDefaults {
20
+ title?: string;
21
+ borderWidth?: number;
22
+ borderColor?: string;
23
+ borderRadius?: number;
24
+ }
25
+ export declare const BorderSettings: (defaults?: BorderDefaults) => Settings<{
26
+ borderWidth: NumberSetting;
27
+ borderColor: ColorSetting;
28
+ borderRadius: NumberSetting;
29
+ }>;
14
30
  export {};
@@ -1,35 +1,59 @@
1
- import { ColorSetting, NumberSetting, SelectSetting, TextSetting } from './implementation.svelte';
2
- export function createTypographySettings(defaults) {
3
- return {
1
+ import { Settings } from "./base.svelte";
2
+ import { ColorSetting, NumberSetting, SelectSetting, TextSetting, TranslatableSetting, } from "./implementation.svelte";
3
+ export function TypographySettings(defaults) {
4
+ return new Settings(defaults?.title ?? "Typography", {
5
+ text: new TranslatableSetting({
6
+ title: "Text",
7
+ defaultValue: { en: defaults?.text ?? "Enter Text" },
8
+ }),
4
9
  color: new ColorSetting({
5
- title: 'Color',
6
- defaultValue: defaults?.color ?? '#000000'
10
+ title: "Color",
11
+ defaultValue: defaults?.color ?? "#000000",
12
+ extra: { allowGradient: defaults?.colorGradient ?? false },
7
13
  }),
8
14
  fontSize: new NumberSetting({
9
- title: 'Font Size',
15
+ title: "Font Size",
10
16
  defaultValue: defaults?.fontSize ?? 16,
11
- extra: { min: 8, max: 120, step: 1 }
17
+ extra: { min: 8, max: 120, step: 1 },
12
18
  }),
13
19
  fontFamily: new TextSetting({
14
- title: 'Font Family',
15
- defaultValue: defaults?.fontFamily ?? 'Arial'
20
+ title: "Font Family",
21
+ defaultValue: defaults?.fontFamily ?? "Arial",
16
22
  }),
17
23
  fontWeight: new SelectSetting({
18
- title: 'Font Weight',
19
- defaultValue: defaults?.fontWeight ?? '400',
24
+ title: "Font Weight",
25
+ defaultValue: defaults?.fontWeight ?? "400",
20
26
  extra: {
21
27
  options: [
22
- { label: 'Thin', value: '100' },
23
- { label: 'Extra Light', value: '200' },
24
- { label: 'Light', value: '300' },
25
- { label: 'Regular', value: '400' },
26
- { label: 'Medium', value: '500' },
27
- { label: 'Semi Bold', value: '600' },
28
- { label: 'Bold', value: '700' },
29
- { label: 'Extra Bold', value: '800' },
30
- { label: 'Black', value: '900' }
31
- ]
32
- }
33
- })
34
- };
28
+ { label: "Thin", value: "100" },
29
+ { label: "Extra Light", value: "200" },
30
+ { label: "Light", value: "300" },
31
+ { label: "Regular", value: "400" },
32
+ { label: "Medium", value: "500" },
33
+ { label: "Semi Bold", value: "600" },
34
+ { label: "Bold", value: "700" },
35
+ { label: "Extra Bold", value: "800" },
36
+ { label: "Black", value: "900" },
37
+ ],
38
+ },
39
+ }),
40
+ });
35
41
  }
42
+ export const BorderSettings = (defaults) => {
43
+ return new Settings(defaults?.title ?? "Border", {
44
+ borderWidth: new NumberSetting({
45
+ title: "Border Width",
46
+ defaultValue: defaults?.borderWidth ?? 0,
47
+ extra: { min: 0, max: 24, step: 1 },
48
+ }),
49
+ borderColor: new ColorSetting({
50
+ title: "Border Color",
51
+ defaultValue: defaults?.borderColor ?? "#000000",
52
+ }),
53
+ borderRadius: new NumberSetting({
54
+ title: "Border Radius",
55
+ defaultValue: defaults?.borderRadius ?? 0,
56
+ extra: { min: 0, max: 24, step: 1 },
57
+ }),
58
+ });
59
+ };
@@ -2,6 +2,7 @@ import TextSettingUI from './components/TextSettings.svelte';
2
2
  import NumberSettingUI from './components/NumberSettings.svelte';
3
3
  import ColorSettingUI from './components/ColorSettings.svelte';
4
4
  import SelectSettingUI from './components/SelectSettings.svelte';
5
+ import SegmentSettingUI from './components/SegmentSettings.svelte';
5
6
  import ListSettingUI from './components/ListSettings.svelte';
6
7
  import UploadSettingUI from './components/UploadSettings.svelte';
7
8
  import TranslatableSettingUI from './components/TranslatableSettings.svelte';
@@ -21,6 +22,9 @@ export class ListSetting extends Setting {
21
22
  export class SelectSetting extends Setting {
22
23
  component = SelectSettingUI;
23
24
  }
25
+ export class SegmentSetting extends Setting {
26
+ component = SegmentSettingUI;
27
+ }
24
28
  export class UploadSetting extends Setting {
25
29
  component = UploadSettingUI;
26
30
  }
@@ -1,4 +1,6 @@
1
1
  export * from './base.svelte';
2
+ export * from './mode.svelte';
2
3
  export * from './implementation.svelte';
4
+ export * from './repeater.svelte';
3
5
  export * from './groups';
4
6
  export * from './types';
@@ -1,4 +1,6 @@
1
1
  export * from './base.svelte';
2
+ export * from './mode.svelte';
2
3
  export * from './implementation.svelte';
4
+ export * from './repeater.svelte';
3
5
  export * from './groups';
4
6
  export * from './types';
@@ -0,0 +1,4 @@
1
+ export declare const settingsMode: {
2
+ device: "desktop" | "mobile";
3
+ };
4
+ export declare function setSettingsDevice(device: 'desktop' | 'mobile'): void;
@@ -0,0 +1,4 @@
1
+ export const settingsMode = $state({ device: 'desktop' });
2
+ export function setSettingsDevice(device) {
3
+ settingsMode.device = device;
4
+ }
@@ -0,0 +1,26 @@
1
+ import type { Component } from 'svelte';
2
+ import { Settings } from './base.svelte';
3
+ import type { SettingMap } from './types';
4
+ export declare class RepeaterSetting<T extends SettingMap = SettingMap> {
5
+ readonly title: string;
6
+ readonly itemLabel: string;
7
+ readonly addButtonText: string;
8
+ readonly factory: (index: number) => Settings<T>;
9
+ readonly component: Component<Record<string, unknown>>;
10
+ items: Settings<T>[];
11
+ onItemsChange: ((oldItems: Settings<T>[]) => void) | null;
12
+ constructor(options: {
13
+ title: string;
14
+ itemLabel?: string;
15
+ addButtonText?: string;
16
+ factory: (index: number) => Settings<T>;
17
+ count?: number;
18
+ });
19
+ addItem(): void;
20
+ removeItem(index: number): void;
21
+ moveItem(from: number, to: number): void;
22
+ getProps(): Record<string, unknown>;
23
+ clone(): RepeaterSetting<T>;
24
+ resolvedValues(): unknown[];
25
+ }
26
+ export declare function isRepeaterSetting(entry: unknown): entry is RepeaterSetting;
@@ -0,0 +1,70 @@
1
+ import { Settings } from './base.svelte';
2
+ import RepeaterSettingUI from './components/RepeaterSettings.svelte';
3
+ export class RepeaterSetting {
4
+ title;
5
+ itemLabel;
6
+ addButtonText;
7
+ factory;
8
+ component = RepeaterSettingUI;
9
+ items = $state([]);
10
+ onItemsChange = null;
11
+ constructor(options) {
12
+ this.title = options.title;
13
+ this.itemLabel = options.itemLabel ?? 'Item';
14
+ this.addButtonText = options.addButtonText ?? `+ Add ${this.itemLabel}`;
15
+ this.factory = options.factory;
16
+ const count = options.count ?? 0;
17
+ const initial = [];
18
+ for (let index = 0; index < count; index++)
19
+ initial.push(options.factory(index));
20
+ this.items = initial;
21
+ }
22
+ addItem() {
23
+ const oldItems = this.items;
24
+ this.items = [...this.items, this.factory(this.items.length)];
25
+ this.onItemsChange?.(oldItems);
26
+ }
27
+ removeItem(index) {
28
+ const oldItems = this.items;
29
+ this.items = this.items.filter((_, i) => i !== index);
30
+ this.onItemsChange?.(oldItems);
31
+ }
32
+ moveItem(from, to) {
33
+ if (to < 0 || to >= this.items.length)
34
+ return;
35
+ const oldItems = this.items;
36
+ const next = [...this.items];
37
+ const [moved] = next.splice(from, 1);
38
+ next.splice(to, 0, moved);
39
+ this.items = next;
40
+ this.onItemsChange?.(oldItems);
41
+ }
42
+ getProps() {
43
+ return {
44
+ title: this.title,
45
+ itemLabel: this.itemLabel,
46
+ addButtonText: this.addButtonText,
47
+ items: this.items,
48
+ onadd: () => this.addItem(),
49
+ onremove: (index) => this.removeItem(index),
50
+ onmove: (from, to) => this.moveItem(from, to)
51
+ };
52
+ }
53
+ clone() {
54
+ const cloned = new RepeaterSetting({
55
+ title: this.title,
56
+ itemLabel: this.itemLabel,
57
+ addButtonText: this.addButtonText,
58
+ factory: this.factory,
59
+ count: 0
60
+ });
61
+ cloned.items = this.items.map((item) => item.clone());
62
+ return cloned;
63
+ }
64
+ resolvedValues() {
65
+ return this.items.map((item) => item.values);
66
+ }
67
+ }
68
+ export function isRepeaterSetting(entry) {
69
+ return entry instanceof RepeaterSetting;
70
+ }