@papu1337/builder 0.0.4 → 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 (124) 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 +120 -24
  30. package/dist/elements/banner/settings.d.ts +15 -3
  31. package/dist/elements/banner/settings.js +93 -8
  32. package/dist/elements/button/buttonElement.svelte +31 -21
  33. package/dist/elements/button/settings.d.ts +12 -9
  34. package/dist/elements/button/settings.js +21 -38
  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 +8 -5
  45. package/dist/elements/terms/settings.js +26 -33
  46. package/dist/elements/terms/termsElement.svelte +164 -79
  47. package/dist/elements/text/settings.d.ts +5 -3
  48. package/dist/elements/text/settings.js +22 -8
  49. package/dist/elements/text/textElement.svelte +25 -20
  50. package/dist/hooks/index.d.ts +1 -0
  51. package/dist/hooks/index.js +1 -0
  52. package/dist/hooks/useTranslation.svelte.d.ts +9 -0
  53. package/dist/hooks/useTranslation.svelte.js +10 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.js +3 -0
  56. package/dist/renderer/BuilderRenderer.svelte +30 -2
  57. package/dist/renderer/registry.js +7 -13
  58. package/dist/renderer/renderer.vanilla.es.js +1395 -1218
  59. package/dist/renderer/renderer.vanilla.umd.js +64 -31
  60. package/dist/renderer/resolve.d.ts +1 -1
  61. package/dist/renderer/resolve.js +28 -14
  62. package/dist/renderer/types.d.ts +2 -0
  63. package/dist/service/element.action.svelte.d.ts +21 -0
  64. package/dist/service/element.action.svelte.js +125 -0
  65. package/dist/service/element.history.svelte.d.ts +8 -0
  66. package/dist/service/element.history.svelte.js +36 -0
  67. package/dist/service/element.io.svelte.d.ts +4 -0
  68. package/dist/service/element.io.svelte.js +232 -0
  69. package/dist/service/element.reader.svelte.d.ts +4 -0
  70. package/dist/service/element.reader.svelte.js +51 -0
  71. package/dist/service/element.translate.svelte.d.ts +12 -0
  72. package/dist/service/element.translate.svelte.js +81 -0
  73. package/dist/service/index.d.ts +5 -0
  74. package/dist/service/index.js +5 -0
  75. package/dist/service/types.d.ts +13 -0
  76. package/dist/service/types.js +1 -0
  77. package/dist/settings/base.svelte.d.ts +6 -1
  78. package/dist/settings/base.svelte.js +64 -22
  79. package/dist/settings/components/ColorSettings.svelte +174 -45
  80. package/dist/settings/components/ColorSettings.svelte.d.ts +3 -2
  81. package/dist/settings/components/ListSettings.svelte +11 -12
  82. package/dist/settings/components/NumberSettings.svelte +121 -24
  83. package/dist/settings/components/RepeaterSettings.svelte +145 -0
  84. package/dist/settings/components/RepeaterSettings.svelte.d.ts +14 -0
  85. package/dist/settings/components/SegmentSettings.svelte +85 -0
  86. package/dist/settings/components/SegmentSettings.svelte.d.ts +5 -0
  87. package/dist/settings/components/SelectSettings.svelte +6 -7
  88. package/dist/settings/components/SettingsGroup.svelte +13 -68
  89. package/dist/settings/components/SettingsRenderer.svelte +76 -0
  90. package/dist/settings/components/SettingsRenderer.svelte.d.ts +8 -0
  91. package/dist/settings/components/TextSettings.svelte +52 -2
  92. package/dist/settings/components/TranslatableSettings.svelte +16 -17
  93. package/dist/settings/components/UploadSettings.svelte +7 -8
  94. package/dist/settings/groups.d.ts +23 -7
  95. package/dist/settings/groups.js +48 -24
  96. package/dist/settings/implementation.svelte.js +4 -0
  97. package/dist/settings/index.d.ts +2 -0
  98. package/dist/settings/index.js +2 -0
  99. package/dist/settings/mode.svelte.d.ts +4 -0
  100. package/dist/settings/mode.svelte.js +4 -0
  101. package/dist/settings/repeater.svelte.d.ts +26 -0
  102. package/dist/settings/repeater.svelte.js +70 -0
  103. package/dist/settings/types.d.ts +28 -2
  104. package/package.json +11 -5
  105. package/dist/elements/auth/authElement.svelte +0 -115
  106. package/dist/elements/auth/authElement.svelte.d.ts +0 -7
  107. package/dist/elements/auth/settings.d.ts +0 -25
  108. package/dist/elements/auth/settings.js +0 -63
  109. package/dist/elements/badge/badgeElement.svelte +0 -48
  110. package/dist/elements/badge/badgeElement.svelte.d.ts +0 -7
  111. package/dist/elements/badge/settings.d.ts +0 -13
  112. package/dist/elements/badge/settings.js +0 -57
  113. package/dist/elements/cards/cardsElement.svelte +0 -136
  114. package/dist/elements/cards/cardsElement.svelte.d.ts +0 -7
  115. package/dist/elements/cards/settings.d.ts +0 -14
  116. package/dist/elements/cards/settings.js +0 -52
  117. package/dist/elements/divider/dividerElement.svelte +0 -34
  118. package/dist/elements/divider/dividerElement.svelte.d.ts +0 -7
  119. package/dist/elements/divider/settings.d.ts +0 -7
  120. package/dist/elements/divider/settings.js +0 -15
  121. package/dist/elements/products/productsElement.svelte +0 -283
  122. package/dist/elements/products/productsElement.svelte.d.ts +0 -7
  123. package/dist/elements/products/settings.d.ts +0 -16
  124. package/dist/elements/products/settings.js +0 -56
@@ -1,39 +1,32 @@
1
- import { ColorSetting, NumberSetting, TextSetting, ListSetting, Settings } from '../../settings';
1
+ import { Settings, NumberSetting, ColorSetting, SelectSetting, TranslatableSetting, RepeaterSetting } from '../../settings';
2
+ const sectionFactory = () => new Settings('Section', {
3
+ title: new TranslatableSetting({ title: 'Title', defaultValue: { en: 'Eligibility' } }),
4
+ lines: new TranslatableSetting({
5
+ title: 'Lines (one per row)',
6
+ defaultValue: { en: 'Promotion is available to verified accounts only.' }
7
+ })
8
+ });
2
9
  export const termsSettings = new Settings('Terms', {
3
- marginTop: new NumberSetting({
4
- title: 'Margin Top',
5
- defaultValue: 0
6
- }),
7
- title: new TextSetting({
8
- title: 'Title',
9
- defaultValue: 'Terms & Conditions'
10
- }),
11
- sections: new ListSetting({
12
- title: 'Sections',
13
- defaultValue: [
14
- { title: 'About the Promotion', content: 'Enter promotion details here.' },
15
- { title: 'Bonus Game Rules and Prizes', content: 'Enter bonus game rules here.' }
16
- ],
10
+ marginTop: new NumberSetting({ title: 'Margin Top', defaultValue: 0, extra: { min: 0, max: 200 } }),
11
+ title: new TranslatableSetting({ title: 'Title', defaultValue: { en: 'Terms and conditions' } }),
12
+ panelBgColor: new ColorSetting({ title: 'Panel Background', defaultValue: '#162D3F' }),
13
+ borderColor: new ColorSetting({ title: 'Border', defaultValue: 'rgba(177,202,223,0.05)' }),
14
+ textColor: new ColorSetting({ title: 'Text Color', defaultValue: '#B1CADF' }),
15
+ openByDefault: new SelectSetting({
16
+ title: 'Open by default',
17
+ defaultValue: 'true',
17
18
  extra: {
18
- addButtonText: '+ Add Section',
19
- titlePlaceholder: 'Section title',
20
- contentPlaceholder: 'Section content'
19
+ options: [
20
+ { label: 'Closed', value: 'false' },
21
+ { label: 'Open', value: 'true' }
22
+ ]
21
23
  }
22
24
  }),
23
- backgroundColor: new ColorSetting({
24
- title: 'Background Color',
25
- defaultValue: '#162D3F'
26
- }),
27
- borderColor: new ColorSetting({
28
- title: 'Border Color',
29
- defaultValue: 'rgba(177,202,223,0.1)'
30
- }),
31
- textColor: new ColorSetting({
32
- title: 'Text Color',
33
- defaultValue: '#ffffff'
34
- }),
35
- arrowBackground: new ColorSetting({
36
- title: 'Arrow Background',
37
- defaultValue: '#33475b'
25
+ sections: new RepeaterSetting({
26
+ title: 'Sections',
27
+ itemLabel: 'Section',
28
+ addButtonText: '+ Add section',
29
+ factory: sectionFactory,
30
+ count: 2
38
31
  })
39
32
  });
@@ -1,124 +1,209 @@
1
1
  <script lang="ts">
2
2
  import type { TermsSettingsMap } from './settings';
3
+ import GradientBorder from '../_shared/GradientBorder.svelte';
4
+ import Arrow from '../_shared/Arrow.svelte';
3
5
 
4
6
  let { settings }: { settings: TermsSettingsMap } = $props();
5
7
 
6
- let expandedSet = $state<Set<number>>(new Set());
8
+ let activeMain = $state(false);
9
+ let activeSection = $state<number | null>(null);
7
10
 
8
- function toggle(index: number) {
9
- if (expandedSet.has(index)) {
10
- expandedSet.delete(index);
11
- } else {
12
- expandedSet.add(index);
13
- }
14
- expandedSet = new Set(expandedSet);
15
- }
16
- </script>
11
+ $effect(() => {
12
+ activeMain = settings.openByDefault === 'true';
13
+ });
17
14
 
18
- <div class="terms-wrapper" style="margin-top: {settings.marginTop}px;">
19
- <div
20
- class="terms-container"
21
- style="background-color: {settings.backgroundColor}; border: 1px solid {settings.borderColor};"
22
- >
23
- <div class="terms-main-header" style="color: {settings.textColor};">
24
- <span class="terms-main-title">{settings.title}</span>
25
- </div>
15
+ const toggleMain = (): void => {
16
+ activeMain = !activeMain;
17
+ };
18
+
19
+ const toggleSection = (index: number): void => {
20
+ activeSection = activeSection === index ? null : index;
21
+ };
22
+
23
+ const linesOf = (raw: string): string[] => raw.split('\n').filter((line) => line.length > 0);
24
+ </script>
26
25
 
27
- {#each settings.sections as section, i}
28
- <div class="terms-section" style="border-color: {settings.borderColor};">
29
- <button class="terms-header" onclick={() => toggle(i)} style="color: {settings.textColor};">
30
- <span class="terms-title">{section.title}</span>
31
- <div
32
- class="terms-arrow"
33
- class:rotated={expandedSet.has(i)}
34
- style="background: {settings.arrowBackground};"
35
- >
36
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
37
- <path d="M8 11L3 5.5h10L8 11z" fill="currentColor" />
38
- </svg>
39
- </div>
26
+ <div
27
+ class="terms-root"
28
+ style="margin-top: {settings.marginTop}px; --terms-text-color: {settings.textColor};"
29
+ >
30
+ <GradientBorder className="terms-border" backgroundGradient={settings.borderColor}>
31
+ <div class="terms-panel" style="background: {settings.panelBgColor};">
32
+ <div class="terms-toggle">
33
+ <span class="terms-toggle-label">{settings.title}</span>
34
+ <button
35
+ type="button"
36
+ class="terms-toggle-icon"
37
+ aria-label={activeMain ? 'Collapse terms' : 'Expand terms'}
38
+ onclick={toggleMain}
39
+ >
40
+ <Arrow stroke={settings.textColor} width={19} height={17} direction={activeMain ? 'up' : 'down'} />
40
41
  </button>
41
- {#if expandedSet.has(i)}
42
- <div class="terms-content" style="color: {settings.textColor};">
43
- <p>{section.content}</p>
44
- </div>
45
- {/if}
46
42
  </div>
47
- {/each}
48
- </div>
43
+
44
+ {#if activeMain}
45
+ <div class="terms-list">
46
+ {#each settings.sections as section, index (index)}
47
+ <div class="terms-section">
48
+ <div class="section-toggle">
49
+ <span class="section-title">{section.title}</span>
50
+ <button
51
+ type="button"
52
+ class="section-icon"
53
+ class:section-icon--active={activeSection === index}
54
+ aria-label={activeSection === index ? 'Collapse section' : 'Expand section'}
55
+ onclick={() => toggleSection(index)}
56
+ >
57
+ <Arrow
58
+ stroke={settings.textColor}
59
+ width={19}
60
+ height={17}
61
+ direction={activeSection === index ? 'up' : 'down'}
62
+ />
63
+ </button>
64
+ </div>
65
+ {#if activeSection === index}
66
+ <div class="section-body">
67
+ {#each linesOf(section.lines) as line, lineIndex (lineIndex)}
68
+ <p class="section-line">{line}</p>
69
+ {/each}
70
+ </div>
71
+ {/if}
72
+ </div>
73
+ {/each}
74
+ </div>
75
+ {/if}
76
+ </div>
77
+ </GradientBorder>
49
78
  </div>
50
79
 
51
80
  <style>
52
- .terms-wrapper {
53
- max-width: 750px;
81
+ .terms-root {
82
+ margin-left: auto;
83
+ margin-right: auto;
54
84
  width: 100%;
55
- margin: 0 auto;
85
+ max-width: 56rem;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 0.5rem;
56
89
  }
57
90
 
58
- .terms-container {
59
- border-radius: 8px;
91
+ :global(.terms-border) {
60
92
  overflow: hidden;
93
+ border-radius: 8px;
61
94
  }
62
95
 
63
- .terms-main-header {
64
- padding: 18px 20px;
65
- border-bottom: 1px solid rgba(177, 202, 223, 0.1);
96
+ .terms-panel {
97
+ padding: 0 16px;
98
+ border-radius: inherit;
66
99
  }
67
100
 
68
- .terms-main-title {
69
- font-size: 1.15rem;
70
- font-weight: 600;
101
+ .terms-toggle {
102
+ width: 100%;
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: space-between;
106
+ background: transparent;
107
+ border: none;
108
+ padding: 12px 0;
109
+ border-radius: 8px;
110
+ color: var(--terms-text-color, #b1cadf);
71
111
  }
72
112
 
73
- .terms-section {
74
- border-top: 1px solid;
113
+ .terms-toggle-label {
114
+ font-size: 1.125rem;
115
+ font-weight: 800;
116
+ line-height: 125%;
117
+ color: var(--terms-text-color, #b1cadf);
118
+ }
119
+
120
+ .terms-toggle-icon {
121
+ min-width: 30px;
122
+ min-height: 30px;
123
+ padding: 0;
124
+ margin: 0;
125
+ font: inherit;
126
+ color: inherit;
127
+ appearance: none;
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ border-radius: 9999px;
132
+ background: rgba(228, 246, 255, 0.1);
133
+ border: 1px solid rgba(177, 202, 223, 0.1);
134
+ cursor: pointer;
135
+ transition: background 0.15s ease;
75
136
  }
76
137
 
77
- .terms-section:first-of-type {
78
- border-top: none;
138
+ .terms-toggle-icon:hover {
139
+ background: rgba(228, 246, 255, 0.2);
79
140
  }
80
141
 
81
- .terms-header {
82
- display: flex;
142
+ .terms-list {
143
+ margin-top: 1px;
144
+ padding: 1rem 0;
145
+ color: var(--terms-text-color, #fff);
146
+ border-radius: 0 0 8px 8px;
147
+ }
148
+
149
+ .terms-section {
150
+ overflow: hidden;
151
+ border-top: 1px solid rgba(177, 202, 223, 0.2);
152
+ }
153
+
154
+ .section-toggle {
83
155
  width: 100%;
84
- align-items: center;
156
+ display: flex;
85
157
  justify-content: space-between;
86
- padding: 16px 20px;
87
- background: none;
158
+ align-items: center;
159
+ background: transparent;
88
160
  border: none;
89
- cursor: pointer;
161
+ padding: 12px 0;
162
+ border-radius: 8px;
163
+ color: var(--terms-text-color, #fff);
90
164
  }
91
165
 
92
- .terms-title {
93
- font-size: 1rem;
94
- font-weight: 500;
95
- text-align: start;
166
+ .section-title {
167
+ text-align: left;
168
+ color: var(--terms-text-color, #b1cadf);
169
+ font-size: 0.95rem;
170
+ font-weight: 600;
96
171
  }
97
172
 
98
- .terms-arrow {
173
+ .section-icon {
174
+ height: 30px;
175
+ min-width: 30px;
176
+ padding: 0;
177
+ margin: 0;
178
+ font: inherit;
179
+ appearance: none;
99
180
  display: flex;
100
181
  align-items: center;
101
182
  justify-content: center;
102
- width: 30px;
103
- height: 30px;
104
- border-radius: 50%;
105
- padding: 4px;
106
- transition: transform 0.2s ease;
107
- flex-shrink: 0;
183
+ border-radius: 100%;
184
+ background: transparent;
185
+ border: 1px solid transparent;
186
+ color: inherit;
187
+ cursor: pointer;
188
+ transition: background 0.2s ease, border 0.2s ease;
108
189
  }
109
190
 
110
- .terms-arrow.rotated {
111
- transform: rotate(180deg);
191
+ .section-icon--active {
192
+ background: #1a364c;
193
+ border-top: 0.5px solid rgba(94, 131, 161, 0.1);
194
+ backdrop-filter: blur(15px);
112
195
  }
113
196
 
114
- .terms-content {
115
- padding: 0 20px 20px;
116
- font-size: 0.875rem;
117
- line-height: 1.6;
118
- opacity: 0.8;
197
+ .section-body {
198
+ margin-top: 1px;
199
+ padding: 0 0 12px;
200
+ color: var(--terms-text-color, #fff);
119
201
  }
120
202
 
121
- .terms-content p {
122
- margin: 0;
203
+ .section-line {
204
+ margin: 0 0 4px;
205
+ font-size: 14px;
206
+ color: var(--terms-text-color, #b1cadf);
207
+ line-height: 1.5;
123
208
  }
124
209
  </style>
@@ -1,9 +1,11 @@
1
- import { TranslatableSetting, Settings, type InferSettingsMapType } from '../../settings';
1
+ import { Settings, NumberSetting, SegmentSetting, type InferSettingsMapType } from '../../settings';
2
2
  export declare const textSettings: Settings<{
3
- text: TranslatableSetting;
3
+ marginTop: NumberSetting;
4
+ align: SegmentSetting;
4
5
  typography: Settings<{
6
+ text: import("../../settings").TranslatableSetting;
5
7
  color: import("../../settings").ColorSetting;
6
- fontSize: import("../../settings").NumberSetting;
8
+ fontSize: NumberSetting;
7
9
  fontFamily: import("../../settings").TextSetting;
8
10
  fontWeight: import("../../settings").SelectSetting;
9
11
  }>;
@@ -1,12 +1,26 @@
1
- import { TranslatableSetting, Settings, createTypographySettings } from '../../settings';
1
+ import { Settings, NumberSetting, SegmentSetting, TypographySettings } from '../../settings';
2
2
  export const textSettings = new Settings('Text', {
3
- text: new TranslatableSetting({
4
- title: 'Text',
5
- defaultValue: { en: 'Enter your text here' }
3
+ marginTop: new NumberSetting({
4
+ title: 'Margin Top',
5
+ defaultValue: 0,
6
+ extra: { min: 0, max: 200 }
6
7
  }),
7
- typography: new Settings('Typography', {
8
- ...createTypographySettings({
9
- fontFamily: 'Arial'
10
- })
8
+ align: new SegmentSetting({
9
+ title: 'Align',
10
+ defaultValue: 'center',
11
+ extra: {
12
+ options: [
13
+ { label: 'Left', value: 'left', icon: 'align-left' },
14
+ { label: 'Center', value: 'center', icon: 'align-center' },
15
+ { label: 'Right', value: 'right', icon: 'align-right' }
16
+ ]
17
+ }
18
+ }),
19
+ typography: TypographySettings({
20
+ text: 'UEFA Champions League',
21
+ color: '#FFFFFF',
22
+ fontSize: 24,
23
+ fontWeight: '700',
24
+ colorGradient: true
11
25
  })
12
26
  });
@@ -2,31 +2,36 @@
2
2
  import type { TextSettingsMap } from './settings';
3
3
 
4
4
  let { settings }: { settings: TextSettingsMap } = $props();
5
+
6
+ const isGradient = $derived(/gradient\(/i.test(settings.typography.color));
7
+
8
+ const colorStyle = $derived(
9
+ isGradient
10
+ ? `background-image: ${settings.typography.color}; -webkit-background-clip: text; background-clip: text; color: transparent; -webkit-text-fill-color: transparent;`
11
+ : `color: ${settings.typography.color};`
12
+ );
5
13
  </script>
6
14
 
7
- <div class="text-wrapper">
8
- <p
9
- class="text-element"
10
- style="
11
- font-size: {settings.fontSize}px;
12
- font-weight: {settings.fontWeight};
13
- line-height: {settings.lineHeight};
14
- letter-spacing: {settings.letterSpacing}px;
15
- "
16
- >
17
- {settings.text}
18
- </p>
19
- </div>
15
+ <p
16
+ class="text-element"
17
+ style="
18
+ margin-top: {settings.marginTop}px;
19
+ text-align: {settings.align};
20
+ font-size: {settings.typography.fontSize}px;
21
+ font-weight: {settings.typography.fontWeight};
22
+ font-family: {settings.typography.fontFamily};
23
+ {colorStyle}
24
+ "
25
+ >
26
+ {settings.typography.text}
27
+ </p>
20
28
 
21
29
  <style>
22
- .text-wrapper {
23
- width: 100%;
24
- margin-left: auto;
25
- margin-right: auto;
26
- }
27
-
28
30
  .text-element {
29
- margin: 0;
31
+ margin: 0 auto;
32
+ width: 100%;
33
+ max-width: 750px;
34
+ line-height: 1.4;
30
35
  word-wrap: break-word;
31
36
  white-space: pre-wrap;
32
37
  }
@@ -0,0 +1 @@
1
+ export * from './useTranslation.svelte';
@@ -0,0 +1 @@
1
+ export * from './useTranslation.svelte';
@@ -0,0 +1,9 @@
1
+ export declare const languages: {
2
+ code: string;
3
+ label: string;
4
+ }[];
5
+ export type LanguageCode = (typeof languages)[number]['code'];
6
+ export declare const locale: {
7
+ current: LanguageCode;
8
+ };
9
+ export declare function resolve(translations: Record<string, string>): string;
@@ -0,0 +1,10 @@
1
+ export const languages = [
2
+ { code: 'en', label: 'English' },
3
+ { code: 'es', label: 'Español' },
4
+ { code: 'fr', label: 'Français' },
5
+ { code: 'de', label: 'Deutsch' }
6
+ ];
7
+ export const locale = $state({ current: 'en' });
8
+ export function resolve(translations) {
9
+ return translations[locale.current] ?? translations['en'] ?? '';
10
+ }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,6 @@
1
1
  export * from './settings/base.svelte';
2
+ export * from './settings/mode.svelte';
2
3
  export * from './settings/implementation.svelte';
4
+ export * from './settings/repeater.svelte';
5
+ export * from './settings/groups';
3
6
  export * from './settings/types';
package/dist/index.js CHANGED
@@ -1,3 +1,6 @@
1
1
  export * from './settings/base.svelte';
2
+ export * from './settings/mode.svelte';
2
3
  export * from './settings/implementation.svelte';
4
+ export * from './settings/repeater.svelte';
5
+ export * from './settings/groups';
3
6
  export * from './settings/types';
@@ -3,7 +3,26 @@
3
3
  import { componentRegistry } from './registry.js';
4
4
  import { resolveSettings } from './resolve.js';
5
5
 
6
- let { data, locale = 'en', containerClass = '', containerStyle = '' }: RendererProps = $props();
6
+ let {
7
+ data,
8
+ locale = 'en',
9
+ containerClass = '',
10
+ containerStyle = '',
11
+ mobileBreakpoint = 768
12
+ }: RendererProps = $props();
13
+
14
+ let isMobile = $state(false);
15
+
16
+ $effect(() => {
17
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;
18
+ const query = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`);
19
+ const update = () => {
20
+ isMobile = query.matches;
21
+ };
22
+ update();
23
+ query.addEventListener('change', update);
24
+ return () => query.removeEventListener('change', update);
25
+ });
7
26
 
8
27
  const globalStyle = $derived(() => {
9
28
  const g = data.global;
@@ -13,6 +32,11 @@
13
32
  `padding-bottom: ${g.paddingBottom ?? 0}px`,
14
33
  `padding-left: ${g.paddingLeft ?? 0}px`,
15
34
  `padding-right: ${g.paddingRight ?? 0}px`,
35
+ 'display: flex',
36
+ 'flex-direction: column',
37
+ 'align-items: stretch',
38
+ 'container-type: inline-size',
39
+ 'container-name: page',
16
40
  containerStyle
17
41
  ]
18
42
  .filter(Boolean)
@@ -23,7 +47,11 @@
23
47
  data.components
24
48
  .map((entry) => ({
25
49
  component: componentRegistry[entry.name],
26
- settings: resolveSettings(entry.settings, locale),
50
+ settings: resolveSettings(
51
+ entry.settings,
52
+ locale,
53
+ isMobile ? entry.mobileSettings : undefined
54
+ ),
27
55
  name: entry.name
28
56
  }))
29
57
  .filter((c) => c.component !== undefined)
@@ -1,20 +1,14 @@
1
+ import BannerElement from '../elements/banner/bannerElement.svelte';
1
2
  import TextElement from '../elements/text/textElement.svelte';
2
3
  import ButtonElement from '../elements/button/buttonElement.svelte';
3
- import AuthElement from '../elements/auth/authElement.svelte';
4
- import BannerElement from '../elements/banner/bannerElement.svelte';
5
- import BadgeElement from '../elements/badge/badgeElement.svelte';
6
- import CardsElement from '../elements/cards/cardsElement.svelte';
7
- import DividerElement from '../elements/divider/dividerElement.svelte';
4
+ import HowItWorksElement from '../elements/howItWorks/howItWorksElement.svelte';
5
+ import StepsElement from '../elements/steps/stepsElement.svelte';
8
6
  import TermsElement from '../elements/terms/termsElement.svelte';
9
- import ProductsElement from '../elements/products/productsElement.svelte';
10
7
  export const componentRegistry = {
8
+ banner: BannerElement,
11
9
  text: TextElement,
12
10
  button: ButtonElement,
13
- auth: AuthElement,
14
- banner: BannerElement,
15
- badge: BadgeElement,
16
- cards: CardsElement,
17
- divider: DividerElement,
18
- terms: TermsElement,
19
- products: ProductsElement
11
+ howItWorks: HowItWorksElement,
12
+ steps: StepsElement,
13
+ terms: TermsElement
20
14
  };