@stackonward/cli 1.5.3 → 1.7.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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/components/nuxt/site-source/app/assets/css/site-shell.css +124 -56
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/android.svg +10 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/apple.svg +3 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/whatsapp.svg +5 -0
- package/dist/resources/components/nuxt/site-source/app/components/app/Sidebar.vue +1 -1
- package/dist/resources/components/nuxt/site-source/app/components/checkout/Status.vue +3 -3
- package/dist/resources/components/nuxt/site-source/app/components/consent/Banner.vue +23 -8
- package/dist/resources/components/nuxt/site-source/app/components/content/CallToAction.vue +61 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Card.vue +35 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Compatibility.vue +10 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Faq.vue +56 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Features.vue +8 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/List.vue +1 -8
- package/dist/resources/components/nuxt/site-source/app/components/content/Reviews.vue +93 -0
- package/dist/resources/components/nuxt/site-source/app/components/countdown/Timer.vue +112 -0
- package/dist/resources/components/nuxt/site-source/app/components/locale/Menu.vue +3 -3
- package/dist/resources/components/nuxt/site-source/app/components/site/BackToTop.vue +30 -23
- package/dist/resources/components/nuxt/site-source/app/components/site/Header.vue +2 -2
- package/dist/resources/components/nuxt/site-source/app/components/steps/Progress.vue +36 -0
- package/dist/resources/components/nuxt/site-source/app/components/steps/Showcase.vue +340 -0
- package/dist/resources/components/nuxt/site-source/app/components/theme/Menu.vue +4 -4
- package/dist/resources/components/nuxt/site-source/app/components/ui/Button.vue +28 -2
- package/dist/resources/components/nuxt/site-source/app/components/ui/GradientBorder.vue +5 -5
- package/dist/resources/components/nuxt/site-source/app/components/ui/Icon.vue +14 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/Image.vue +126 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/Marquee.vue +99 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/Modal.vue +26 -88
- package/dist/resources/components/nuxt/site-source/app/components/ui/Popover.vue +87 -93
- package/dist/resources/components/nuxt/site-source/app/components/ui/Text.vue +84 -12
- package/dist/resources/components/nuxt/site-source/app/components/ui/Video.vue +105 -0
- package/dist/resources/components/nuxt/site-source/app/components/whatsapp/Chat.vue +126 -0
- package/dist/resources/components/nuxt/site-source/app/components/youtube/Embed.vue +286 -73
- package/dist/resources/components/nuxt/site-source/app/composables/useFloatingBottomStack.ts +44 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useNavigation.ts +6 -8
- package/dist/resources/components/nuxt/site-source/app/consent/types.ts +1 -4
- package/dist/resources/components/nuxt/site-source/app/content/types.ts +3 -0
- package/dist/resources/components/nuxt/site-source/app/theme/accordion.ts +5 -4
- package/dist/resources/components/nuxt/site-source/app/theme/breadcrumb.ts +14 -4
- package/dist/resources/components/nuxt/site-source/app/theme/button.ts +133 -27
- package/dist/resources/components/nuxt/site-source/app/theme/carousel.ts +11 -7
- package/dist/resources/components/nuxt/site-source/app/theme/checkbox.ts +9 -3
- package/dist/resources/components/nuxt/site-source/app/theme/drawer.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/theme/form-field.ts +8 -0
- package/dist/resources/components/nuxt/site-source/app/theme/icon.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/theme/index.ts +32 -1
- package/dist/resources/components/nuxt/site-source/app/theme/input.ts +49 -18
- package/dist/resources/components/nuxt/site-source/app/theme/modal.ts +9 -5
- package/dist/resources/components/nuxt/site-source/app/theme/pagination.ts +9 -2
- package/dist/resources/components/nuxt/site-source/app/theme/radio-group.ts +7 -0
- package/dist/resources/components/nuxt/site-source/app/theme/select.ts +62 -6
- package/dist/resources/components/nuxt/site-source/app/theme/stepper.ts +15 -6
- package/dist/resources/components/nuxt/site-source/app/theme/textarea.ts +78 -0
- package/dist/resources/components/nuxt/site-source/app/theme/toast.ts +1 -4
- package/dist/resources/components/nuxt/site-source/app/theme/tooltip.ts +5 -1
- package/dist/resources/components/registry.json +133 -45
- package/dist/resources/components/vue/ui/BottomSheet.vue +5 -1
- package/dist/resources/components/vue/ui/ScrollArea.vue +2 -1
- package/dist/resources/registry.json +1 -1
- package/dist/resources/templates/base/.claude/docs/architecture-template.md +2 -1
- package/dist/resources/templates/base/AGENTS.md +7 -0
- package/dist/resources/templates/base/CLAUDE.md +7 -0
- package/dist/resources/templates/nuxt/.claude/docs/stack.md +20 -1
- package/dist/resources/templates/nuxt/DESIGN.md +191 -0
- package/dist/resources/templates/nuxt/app/app.config.ts +2 -0
- package/dist/resources/templates/nuxt/app/pages/app/index.vue +9 -7
- package/dist/resources/templates/nuxt/app/pages/index.vue +12 -27
- package/dist/resources/templates/nuxt/app/pages/ui/index.vue +219 -3
- package/dist/resources/templates/nuxt/nuxt.config.ts +2 -4
- package/dist/resources/templates/nuxt/package.json +2 -1
- package/dist/resources/templates/nuxt/stylelint.config.mjs +12 -0
- package/package.json +3 -3
- package/dist/resources/components/nuxt/site-source/app/assets/icons/common/.gitkeep +0 -0
|
@@ -1,40 +1,73 @@
|
|
|
1
1
|
@import "tailwindcss";
|
|
2
2
|
@import "@nuxt/ui";
|
|
3
3
|
|
|
4
|
-
@theme {
|
|
4
|
+
@theme inline {
|
|
5
|
+
--spacing-control-xs: var(--site-control-height-xs);
|
|
6
|
+
--spacing-control-sm: var(--site-control-height-sm);
|
|
7
|
+
--spacing-control-md: var(--site-control-height-md);
|
|
8
|
+
--spacing-control-lg: var(--site-control-height-lg);
|
|
9
|
+
--spacing-control-xl: var(--site-control-height-xl);
|
|
10
|
+
--spacing-control-2xl: var(--site-control-height-2xl);
|
|
11
|
+
--spacing-icon-xs: var(--site-icon-xs);
|
|
12
|
+
--spacing-icon-sm: var(--site-icon-sm);
|
|
13
|
+
--spacing-icon-md: var(--site-icon-md);
|
|
14
|
+
--spacing-icon-lg: var(--site-icon-lg);
|
|
15
|
+
--spacing-icon-xl: var(--site-icon-xl);
|
|
16
|
+
--spacing-icon-2xl: var(--site-icon-2xl);
|
|
17
|
+
--spacing-icon-3xl: var(--site-icon-3xl);
|
|
5
18
|
--font-sans:
|
|
6
19
|
"Inter", "SF Pro Display", "SF Pro Text", ui-sans-serif, system-ui, -apple-system,
|
|
7
20
|
"BlinkMacSystemFont", "Segoe UI", sans-serif;
|
|
8
21
|
--ease-fluid: cubic-bezier(0.3, 0, 0, 1);
|
|
9
22
|
--ease-snappy: cubic-bezier(0.2, 0, 0, 1);
|
|
10
|
-
--color-
|
|
11
|
-
--color-primary
|
|
12
|
-
--color-primary-
|
|
13
|
-
--color-primary-
|
|
14
|
-
--color-
|
|
23
|
+
--color-brand: var(--site-color-brand);
|
|
24
|
+
--color-primary: var(--site-color-primary);
|
|
25
|
+
--color-primary-hover: var(--site-color-primary-hover);
|
|
26
|
+
--color-primary-active: var(--site-color-primary-active);
|
|
27
|
+
--color-primary-contrast: var(--site-color-primary-contrast);
|
|
28
|
+
--color-secondary: var(--site-color-accent);
|
|
15
29
|
--color-secondary-hover: #285f59;
|
|
16
30
|
--color-secondary-active: #214f4a;
|
|
17
|
-
--color-success:
|
|
31
|
+
--color-success: var(--site-color-success);
|
|
18
32
|
--color-info: #2563eb;
|
|
19
|
-
--color-warning:
|
|
20
|
-
--color-error:
|
|
33
|
+
--color-warning: var(--site-color-warning);
|
|
34
|
+
--color-error: var(--site-color-danger);
|
|
21
35
|
--color-neutral: #111827;
|
|
22
|
-
--color-bg:
|
|
23
|
-
--color-surface:
|
|
24
|
-
--color-surface-muted:
|
|
25
|
-
--color-surface-elevated:
|
|
26
|
-
--color-text:
|
|
27
|
-
--color-muted:
|
|
28
|
-
--color-dimmed:
|
|
29
|
-
--color-border:
|
|
30
|
-
--color-border-strong:
|
|
31
|
-
--radius-ml:
|
|
32
|
-
--radius-2ml:
|
|
36
|
+
--color-bg: var(--site-color-bg);
|
|
37
|
+
--color-surface: var(--site-color-surface);
|
|
38
|
+
--color-surface-muted: var(--site-color-surface-muted);
|
|
39
|
+
--color-surface-elevated: var(--site-color-surface-elevated);
|
|
40
|
+
--color-text: var(--site-color-text);
|
|
41
|
+
--color-muted: var(--site-color-muted);
|
|
42
|
+
--color-dimmed: var(--site-color-dimmed);
|
|
43
|
+
--color-border: var(--site-color-border);
|
|
44
|
+
--color-border-strong: var(--site-color-border-strong);
|
|
45
|
+
--radius-ml: var(--site-radius-md);
|
|
46
|
+
--radius-2ml: var(--site-radius-lg);
|
|
47
|
+
--shadow-accordion:
|
|
48
|
+
0 4px 16px color-mix(in srgb, var(--site-color-border) 40%, transparent),
|
|
49
|
+
0 11px 24px color-mix(in srgb, var(--site-color-border) 20%, transparent);
|
|
50
|
+
--color-success-hover: color-mix(in srgb, var(--site-color-success) 80%, black);
|
|
51
|
+
--color-success-active: color-mix(in srgb, var(--site-color-success) 60%, black);
|
|
52
|
+
--color-success-contrast: #fff;
|
|
33
53
|
--breakpoint-xs: 480px;
|
|
34
54
|
--breakpoint-3xl: 1760px;
|
|
35
55
|
}
|
|
36
56
|
|
|
37
57
|
:root {
|
|
58
|
+
--site-control-height-xs: 2rem;
|
|
59
|
+
--site-control-height-sm: 2.25rem;
|
|
60
|
+
--site-control-height-md: 2.625rem;
|
|
61
|
+
--site-control-height-lg: 3rem;
|
|
62
|
+
--site-control-height-xl: 3.25rem;
|
|
63
|
+
--site-control-height-2xl: 3.5rem;
|
|
64
|
+
--site-icon-xs: 0.75rem;
|
|
65
|
+
--site-icon-sm: 1rem;
|
|
66
|
+
--site-icon-md: 1.25rem;
|
|
67
|
+
--site-icon-lg: 1.5rem;
|
|
68
|
+
--site-icon-xl: 2rem;
|
|
69
|
+
--site-icon-2xl: 2.5rem;
|
|
70
|
+
--site-icon-3xl: 3rem;
|
|
38
71
|
--site-font-sans:
|
|
39
72
|
"Inter", "SF Pro Display", "SF Pro Text", ui-sans-serif, system-ui, -apple-system,
|
|
40
73
|
"BlinkMacSystemFont", "Segoe UI", sans-serif;
|
|
@@ -48,6 +81,7 @@
|
|
|
48
81
|
--site-color-dimmed: #7a8790;
|
|
49
82
|
--site-color-border: #dbe3e8;
|
|
50
83
|
--site-color-border-strong: #c4d2da;
|
|
84
|
+
--site-color-brand: var(--site-color-primary);
|
|
51
85
|
--site-color-primary: #a86550;
|
|
52
86
|
--site-color-primary-hover: #945541;
|
|
53
87
|
--site-color-primary-active: #7f4635;
|
|
@@ -58,8 +92,8 @@
|
|
|
58
92
|
--site-color-danger: #ff6b5f;
|
|
59
93
|
--site-color-success: #16a34a;
|
|
60
94
|
--site-radius-sm: 4px;
|
|
61
|
-
--site-radius-md:
|
|
62
|
-
--site-radius-lg:
|
|
95
|
+
--site-radius-md: 10px;
|
|
96
|
+
--site-radius-lg: 20px;
|
|
63
97
|
--site-shadow-soft: 0 18px 44px rgb(17 24 39 / 10%);
|
|
64
98
|
--site-shadow-strong: 0 30px 70px rgb(17 24 39 / 16%);
|
|
65
99
|
--site-shell-header-height: 68px;
|
|
@@ -123,21 +157,32 @@ html {
|
|
|
123
157
|
body {
|
|
124
158
|
margin: 0;
|
|
125
159
|
background:
|
|
126
|
-
linear-gradient(
|
|
127
|
-
|
|
160
|
+
linear-gradient(
|
|
161
|
+
180deg,
|
|
162
|
+
color-mix(in srgb, var(--site-color-primary) 4.5%, transparent),
|
|
163
|
+
transparent 360px
|
|
164
|
+
),
|
|
165
|
+
linear-gradient(
|
|
166
|
+
180deg,
|
|
167
|
+
color-mix(in srgb, var(--site-color-primary) 2.5%, transparent),
|
|
168
|
+
transparent 520px
|
|
169
|
+
),
|
|
170
|
+
var(--site-color-bg);
|
|
128
171
|
overflow-x: clip;
|
|
129
172
|
}
|
|
130
173
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
174
|
+
@layer base {
|
|
175
|
+
a {
|
|
176
|
+
color: inherit;
|
|
177
|
+
text-decoration: none;
|
|
178
|
+
}
|
|
135
179
|
|
|
136
|
-
button,
|
|
137
|
-
input,
|
|
138
|
-
textarea,
|
|
139
|
-
select {
|
|
140
|
-
|
|
180
|
+
button,
|
|
181
|
+
input,
|
|
182
|
+
textarea,
|
|
183
|
+
select {
|
|
184
|
+
font: inherit;
|
|
185
|
+
}
|
|
141
186
|
}
|
|
142
187
|
|
|
143
188
|
button,
|
|
@@ -146,9 +191,11 @@ summary {
|
|
|
146
191
|
-webkit-tap-highlight-color: transparent;
|
|
147
192
|
}
|
|
148
193
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
194
|
+
@layer base {
|
|
195
|
+
:focus-visible {
|
|
196
|
+
outline: 2px solid var(--site-color-primary);
|
|
197
|
+
outline-offset: 3px;
|
|
198
|
+
}
|
|
152
199
|
}
|
|
153
200
|
|
|
154
201
|
.site-root {
|
|
@@ -205,7 +252,7 @@ summary {
|
|
|
205
252
|
border-color: var(--site-color-primary);
|
|
206
253
|
background: var(--site-color-primary);
|
|
207
254
|
color: var(--site-color-primary-contrast);
|
|
208
|
-
box-shadow: 0 10px 24px
|
|
255
|
+
box-shadow: 0 10px 24px color-mix(in srgb, var(--site-color-primary) 18%, transparent);
|
|
209
256
|
}
|
|
210
257
|
|
|
211
258
|
.base-button--primary:hover {
|
|
@@ -213,29 +260,29 @@ summary {
|
|
|
213
260
|
}
|
|
214
261
|
|
|
215
262
|
.base-button--secondary {
|
|
216
|
-
border-color:
|
|
263
|
+
border-color: color-mix(in srgb, var(--site-color-primary) 34%, transparent);
|
|
217
264
|
background: color-mix(in srgb, var(--site-color-surface) 82%, transparent);
|
|
218
265
|
color: var(--site-color-primary);
|
|
219
266
|
}
|
|
220
267
|
|
|
221
268
|
.base-button--secondary:hover {
|
|
222
|
-
border-color:
|
|
223
|
-
background:
|
|
269
|
+
border-color: color-mix(in srgb, var(--site-color-primary) 48%, transparent);
|
|
270
|
+
background: color-mix(in srgb, var(--site-color-primary) 6%, transparent);
|
|
224
271
|
color: var(--site-color-primary-hover);
|
|
225
272
|
}
|
|
226
273
|
|
|
227
274
|
.icon-button {
|
|
228
275
|
width: 44px;
|
|
229
276
|
height: 44px;
|
|
230
|
-
border-color:
|
|
277
|
+
border-color: color-mix(in srgb, var(--site-color-primary) 22%, transparent);
|
|
231
278
|
border-radius: var(--site-radius-md);
|
|
232
279
|
background: color-mix(in srgb, var(--site-color-surface) 78%, transparent);
|
|
233
280
|
color: var(--site-color-primary);
|
|
234
281
|
}
|
|
235
282
|
|
|
236
283
|
.icon-button:hover {
|
|
237
|
-
border-color:
|
|
238
|
-
background:
|
|
284
|
+
border-color: color-mix(in srgb, var(--site-color-primary) 34%, transparent);
|
|
285
|
+
background: color-mix(in srgb, var(--site-color-primary) 6%, transparent);
|
|
239
286
|
color: var(--site-color-primary-hover);
|
|
240
287
|
}
|
|
241
288
|
|
|
@@ -252,13 +299,13 @@ summary {
|
|
|
252
299
|
width: 34px;
|
|
253
300
|
height: 34px;
|
|
254
301
|
place-items: center;
|
|
255
|
-
border: 1px solid
|
|
302
|
+
border: 1px solid color-mix(in srgb, var(--site-color-primary) 18%, transparent);
|
|
256
303
|
border-radius: var(--site-radius-md);
|
|
257
304
|
background:
|
|
258
305
|
linear-gradient(135deg, rgb(255 255 255 / 22%), transparent 52%), var(--site-color-primary);
|
|
259
306
|
color: var(--site-color-primary-contrast);
|
|
260
307
|
text-transform: uppercase;
|
|
261
|
-
box-shadow: 0 10px 22px
|
|
308
|
+
box-shadow: 0 10px 22px color-mix(in srgb, var(--site-color-primary) 16%, transparent);
|
|
262
309
|
}
|
|
263
310
|
|
|
264
311
|
.site-brand__text {
|
|
@@ -273,8 +320,17 @@ summary {
|
|
|
273
320
|
display: flex;
|
|
274
321
|
flex-direction: column;
|
|
275
322
|
background:
|
|
276
|
-
linear-gradient(
|
|
277
|
-
|
|
323
|
+
linear-gradient(
|
|
324
|
+
180deg,
|
|
325
|
+
color-mix(in srgb, var(--site-color-primary) 4.5%, transparent),
|
|
326
|
+
transparent 340px
|
|
327
|
+
),
|
|
328
|
+
linear-gradient(
|
|
329
|
+
180deg,
|
|
330
|
+
color-mix(in srgb, var(--site-color-primary) 2.5%, transparent),
|
|
331
|
+
transparent 520px
|
|
332
|
+
),
|
|
333
|
+
var(--site-color-bg);
|
|
278
334
|
}
|
|
279
335
|
|
|
280
336
|
.site-shell__main {
|
|
@@ -326,8 +382,8 @@ summary {
|
|
|
326
382
|
|
|
327
383
|
.site-nav-link:hover,
|
|
328
384
|
.site-nav-menu > summary:hover {
|
|
329
|
-
border-color:
|
|
330
|
-
background:
|
|
385
|
+
border-color: color-mix(in srgb, var(--site-color-primary) 18%, transparent);
|
|
386
|
+
background: color-mix(in srgb, var(--site-color-primary) 7%, transparent);
|
|
331
387
|
color: var(--site-color-text);
|
|
332
388
|
}
|
|
333
389
|
|
|
@@ -366,7 +422,7 @@ summary {
|
|
|
366
422
|
}
|
|
367
423
|
|
|
368
424
|
.site-nav-menu__item:hover {
|
|
369
|
-
background:
|
|
425
|
+
background: color-mix(in srgb, var(--site-color-primary) 7%, transparent);
|
|
370
426
|
}
|
|
371
427
|
|
|
372
428
|
.site-nav-menu__item small {
|
|
@@ -837,7 +893,13 @@ summary {
|
|
|
837
893
|
.application-shell__sidebar {
|
|
838
894
|
min-height: 0;
|
|
839
895
|
border-right: 1px solid var(--site-color-border);
|
|
840
|
-
background:
|
|
896
|
+
background:
|
|
897
|
+
linear-gradient(
|
|
898
|
+
180deg,
|
|
899
|
+
color-mix(in srgb, var(--site-color-primary) 4%, transparent),
|
|
900
|
+
transparent
|
|
901
|
+
),
|
|
902
|
+
var(--site-color-surface);
|
|
841
903
|
overflow-y: auto;
|
|
842
904
|
}
|
|
843
905
|
|
|
@@ -882,8 +944,8 @@ summary {
|
|
|
882
944
|
|
|
883
945
|
.application-sidebar__link:hover,
|
|
884
946
|
.application-sidebar__link.router-link-active {
|
|
885
|
-
border-color:
|
|
886
|
-
background:
|
|
947
|
+
border-color: color-mix(in srgb, var(--site-color-primary) 20%, transparent);
|
|
948
|
+
background: color-mix(in srgb, var(--site-color-primary) 7%, transparent);
|
|
887
949
|
color: var(--site-color-text);
|
|
888
950
|
}
|
|
889
951
|
|
|
@@ -951,13 +1013,19 @@ summary {
|
|
|
951
1013
|
min-height: 200px;
|
|
952
1014
|
border: 1px solid var(--site-color-border);
|
|
953
1015
|
border-radius: var(--site-radius-lg);
|
|
954
|
-
background:
|
|
1016
|
+
background:
|
|
1017
|
+
linear-gradient(
|
|
1018
|
+
180deg,
|
|
1019
|
+
color-mix(in srgb, var(--site-color-primary) 4%, transparent),
|
|
1020
|
+
transparent
|
|
1021
|
+
),
|
|
1022
|
+
var(--site-color-surface);
|
|
955
1023
|
padding: 20px;
|
|
956
1024
|
box-shadow: 0 1px 0 rgb(17 24 39 / 4%);
|
|
957
1025
|
}
|
|
958
1026
|
|
|
959
1027
|
.content-card:hover {
|
|
960
|
-
border-color:
|
|
1028
|
+
border-color: color-mix(in srgb, var(--site-color-primary) 32%, transparent);
|
|
961
1029
|
box-shadow: var(--site-shadow-soft);
|
|
962
1030
|
}
|
|
963
1031
|
|
|
@@ -1118,7 +1186,7 @@ summary {
|
|
|
1118
1186
|
|
|
1119
1187
|
.mobile-nav__link:hover,
|
|
1120
1188
|
.mobile-nav__group > summary:hover {
|
|
1121
|
-
background:
|
|
1189
|
+
background: color-mix(in srgb, var(--site-color-primary) 7%, transparent);
|
|
1122
1190
|
}
|
|
1123
1191
|
|
|
1124
1192
|
.mobile-nav__group > summary {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g clip-path="url(#clip0_72_1104)">
|
|
3
|
+
<path d="M3.33234 4.85879C3.07397 4.85879 2.85444 4.94887 2.67421 5.12925C2.49398 5.30957 2.40381 5.52589 2.40381 5.77826V9.65469C2.40381 9.91294 2.49395 10.1323 2.67421 10.3126C2.85444 10.493 3.07385 10.5829 3.33225 10.5829C3.59072 10.5829 3.80855 10.4929 3.9858 10.3126C4.16319 10.1323 4.25182 9.91294 4.25182 9.65469V5.77826C4.25182 5.52579 4.16161 5.30948 3.98138 5.12925C3.80113 4.94896 3.58468 4.85879 3.33234 4.85879ZM4.61258 11.0339C4.61258 11.3103 4.70876 11.5446 4.90105 11.737C5.09336 11.9291 5.32768 12.0253 5.6042 12.0253H6.2713L6.2804 14.0716C6.2804 14.33 6.37054 14.5493 6.5508 14.7296C6.73102 14.9099 6.94743 15.0001 7.19981 15.0001C7.45834 15.0001 7.67762 14.9099 7.85794 14.7296C8.03826 14.5493 8.12834 14.33 8.12834 14.0716V12.0253H9.37227V14.0716C9.37227 14.33 9.46238 14.5493 9.64261 14.7296C9.82306 14.9099 10.0424 15.0001 10.3009 15.0001C10.5591 15.0001 10.7785 14.9099 10.9587 14.7296C11.1389 14.5493 11.2289 14.33 11.2289 14.0716V12.0253H11.9051C12.1754 12.0253 12.4068 11.9293 12.5991 11.737C12.7915 11.5446 12.8877 11.3103 12.8877 11.0339V5.03005H4.61258V11.0339ZM10.7964 1.37925L11.4363 0.198274C11.4784 0.12016 11.4633 0.0600741 11.3913 0.0180488C11.3131 -0.0180406 11.253 -1.16908e-05 11.2111 0.072167L10.5619 1.26204C9.991 1.00964 9.38721 0.883435 8.75007 0.883435C8.11309 0.883435 7.50908 1.00964 6.93812 1.26204L6.28908 0.0721986C6.24715 1.98811e-05 6.18697 -0.018009 6.10885 0.0180803C6.03671 0.0601056 6.02177 0.120191 6.06383 0.198306L6.70387 1.37925C6.05474 1.70973 5.53806 2.171 5.15332 2.76295C4.76872 3.35494 4.57637 4.00253 4.57637 4.70556H12.915C12.915 4.00253 12.7226 3.35491 12.338 2.76295C11.9532 2.171 11.4397 1.7097 10.7964 1.37925ZM7.0959 3.09644C7.02684 3.16559 6.94425 3.20013 6.84807 3.20013C6.7519 3.20013 6.67081 3.16562 6.60463 3.09644C6.53861 3.02739 6.50549 2.94473 6.50549 2.84858C6.50549 2.75241 6.53861 2.66975 6.60463 2.6006C6.67072 2.53145 6.75193 2.49697 6.84807 2.49697C6.94412 2.49697 7.02675 2.53142 7.0959 2.6006C7.16504 2.66975 7.19959 2.75241 7.19959 2.84858C7.19959 2.94476 7.16504 3.02729 7.0959 3.09644ZM10.8957 3.09644C10.8295 3.16559 10.7483 3.20013 10.6522 3.20013C10.556 3.20013 10.4735 3.16562 10.4044 3.09644C10.3352 3.02739 10.3008 2.94473 10.3008 2.84858C10.3008 2.75241 10.3352 2.66975 10.4044 2.6006C10.4735 2.53145 10.556 2.49697 10.6522 2.49697C10.7483 2.49697 10.8295 2.53142 10.8957 2.6006C10.9616 2.66975 10.9948 2.75241 10.9948 2.84858C10.9948 2.94476 10.9617 3.02729 10.8957 3.09644ZM14.8259 5.12471C14.6457 4.94745 14.4263 4.85879 14.1679 4.85879C13.9156 4.85879 13.6992 4.94745 13.519 5.12471C13.3387 5.30203 13.2485 5.51992 13.2485 5.77826V9.65469C13.2485 9.91294 13.3387 10.1323 13.519 10.3126C13.6992 10.493 13.9156 10.5829 14.1679 10.5829C14.4263 10.5829 14.6457 10.4929 14.8259 10.3126C15.0063 10.1323 15.0964 9.91294 15.0964 9.65469V5.77826C15.0964 5.51989 15.0063 5.302 14.8259 5.12471Z" fill="currentColor"/>
|
|
4
|
+
</g>
|
|
5
|
+
<defs>
|
|
6
|
+
<clipPath id="clip0_72_1104">
|
|
7
|
+
<rect width="16" height="15" fill="white" transform="translate(0.75)"/>
|
|
8
|
+
</clipPath>
|
|
9
|
+
</defs>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M9.38281 1.30664C10.3672 0.00585929 11.7383 0 11.7383 0C11.7383 0 11.9434 1.22168 10.9619 2.39648C9.91602 3.65332 8.72949 3.44824 8.72949 3.44824C8.72949 3.44824 8.50684 2.46094 9.38281 1.30664ZM8.85547 4.30371C9.3623 4.30371 10.3027 3.60645 11.5273 3.60645C13.6367 3.60645 14.4658 5.10645 14.4658 5.10645C14.4658 5.10645 12.8428 5.93555 12.8428 7.94824C12.8428 10.2188 14.8643 11.001 14.8643 11.001C14.8643 11.001 13.4521 14.9766 11.5449 14.9766C10.6689 14.9766 9.98633 14.3848 9.06348 14.3848C8.12305 14.3848 7.18848 14.9971 6.5791 14.9971C4.83594 14.9971 2.63574 11.2266 2.63574 8.19434C2.63574 5.21191 4.49902 3.64746 6.24512 3.64746C7.38184 3.64746 8.26367 4.30371 8.85547 4.30371Z" fill="currentColor"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<circle cx="27" cy="27" r="27" fill="#3AC34C"/>
|
|
3
|
+
<path d="M10 44L12.402 35.2698C10.918 32.7088 10.1386 29.8036 10.1423 26.847C10.1459 17.5572 17.7405 10 27.0711 10C31.5998 10.0021 35.8496 11.7567 39.0457 14.9406C40.6222 16.5026 41.8718 18.3604 42.7222 20.4065C43.5726 22.4525 44.0069 24.6462 43.9999 26.8605C43.9957 36.1495 36.4011 43.7082 27.0711 43.7082H27.064C24.2308 43.7068 21.4467 42.9998 18.9742 41.6575L10 44Z" fill="white"/>
|
|
4
|
+
<path d="M22.3214 19.742C21.9823 18.9158 21.6375 19.0278 21.3807 19.0143C21.1366 19.0021 20.8579 19 20.5786 19C20.2993 19 19.8469 19.1056 19.4634 19.5301C19.08 19.9547 18 20.9807 18 23.0677C18 25.1554 19.4986 27.1717 19.7076 27.4543C19.9166 27.7375 22.657 32.0207 26.8531 33.8572C27.8508 34.2939 28.6297 34.555 29.2376 34.7505C30.2395 35.073 31.1513 35.0281 31.8718 34.9189C32.6753 34.7969 34.3463 33.8929 34.6952 32.9025C35.0435 31.9115 35.0435 31.0624 34.9394 30.8855C34.8346 30.7092 34.5559 30.6029 34.1373 30.3903C33.7194 30.1784 31.6628 29.1524 31.2794 29.0111C30.8959 28.8691 30.6173 28.7985 30.338 29.223C30.0594 29.6476 29.258 30.6029 29.0138 30.8855C28.7697 31.1687 28.5256 31.2044 28.1076 30.9925C27.689 30.7799 26.3416 30.3318 24.7445 28.8877C23.5006 27.7632 22.6612 26.374 22.4171 25.9495C22.1729 25.525 22.391 25.2959 22.6 25.084C22.7886 24.8942 23.0186 24.5888 23.2276 24.342C23.4373 24.0937 23.5069 23.9167 23.6462 23.6342C23.7855 23.3509 23.7159 23.1033 23.6111 22.8907C23.5069 22.6788 22.6704 20.5918 22.3214 19.7428V19.742Z" fill="#3AC34C"/>
|
|
5
|
+
</svg>
|
|
@@ -72,7 +72,7 @@ const statusMeta = computed(() => {
|
|
|
72
72
|
|
|
73
73
|
<template>
|
|
74
74
|
<section v-if="visible" class="checkout-status" :data-tone="statusMeta.tone" role="status">
|
|
75
|
-
<
|
|
75
|
+
<UiIcon :name="statusMeta.icon" class="checkout-status__icon" />
|
|
76
76
|
<div>
|
|
77
77
|
<UiText as="h3" size="lg" weight="bold">{{ statusMeta.title }}</UiText>
|
|
78
78
|
<UiText as="p" tone="muted">{{ statusMeta.description }}</UiText>
|
|
@@ -93,8 +93,8 @@ const statusMeta = computed(() => {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
.checkout-status__icon {
|
|
96
|
-
width:
|
|
97
|
-
height:
|
|
96
|
+
width: var(--site-icon-xl);
|
|
97
|
+
height: var(--site-icon-xl);
|
|
98
98
|
margin-top: 2px;
|
|
99
99
|
color: var(--site-color-muted);
|
|
100
100
|
}
|
|
@@ -4,6 +4,17 @@ defineOptions({ inheritAttrs: false });
|
|
|
4
4
|
const site = useSiteShell();
|
|
5
5
|
const consent = useConsent();
|
|
6
6
|
const { t } = useI18n();
|
|
7
|
+
const element = ref<HTMLElement | null>(null);
|
|
8
|
+
const { height } = useElementSize(element, undefined, { box: "border-box" });
|
|
9
|
+
const { setLayer, clearLayer } = useFloatingBottomStack();
|
|
10
|
+
watch(
|
|
11
|
+
[consent.visible, height],
|
|
12
|
+
([visible, height]) => {
|
|
13
|
+
setLayer("consent", { visible, height, order: 0 });
|
|
14
|
+
},
|
|
15
|
+
{ immediate: true },
|
|
16
|
+
);
|
|
17
|
+
onBeforeUnmount(() => clearLayer("consent"));
|
|
7
18
|
|
|
8
19
|
const storageMessage = computed(() => {
|
|
9
20
|
if (consent.state.value.error === "read-failed") {
|
|
@@ -26,6 +37,7 @@ const storageMessage = computed(() => {
|
|
|
26
37
|
<ClientOnly>
|
|
27
38
|
<section
|
|
28
39
|
v-if="consent.visible.value"
|
|
40
|
+
ref="element"
|
|
29
41
|
v-bind="$attrs"
|
|
30
42
|
class="site-consent"
|
|
31
43
|
role="region"
|
|
@@ -33,15 +45,18 @@ const storageMessage = computed(() => {
|
|
|
33
45
|
>
|
|
34
46
|
<div class="site-consent__header">
|
|
35
47
|
<h2>{{ t("consent.title") }}</h2>
|
|
36
|
-
<
|
|
48
|
+
<UiButton
|
|
37
49
|
v-if="consent.state.value.decision"
|
|
38
|
-
|
|
50
|
+
color="neutral"
|
|
51
|
+
variant="ghost"
|
|
52
|
+
size="xs"
|
|
53
|
+
square
|
|
39
54
|
class="site-consent__close"
|
|
40
55
|
:aria-label="t('consent.close')"
|
|
41
56
|
@click="consent.closeSettings"
|
|
42
57
|
>
|
|
43
|
-
<
|
|
44
|
-
</
|
|
58
|
+
<UiIcon name="i-lucide-x" aria-hidden="true" />
|
|
59
|
+
</UiButton>
|
|
45
60
|
</div>
|
|
46
61
|
<p class="site-consent__message">{{ t("consent.message") }}</p>
|
|
47
62
|
<NuxtLink class="site-consent__policy" :to="site.consent.policyPath">
|
|
@@ -51,12 +66,12 @@ const storageMessage = computed(() => {
|
|
|
51
66
|
{{ storageMessage }}
|
|
52
67
|
</p>
|
|
53
68
|
<div class="site-consent__actions">
|
|
54
|
-
<
|
|
69
|
+
<UiButton color="neutral" variant="outline" size="sm" @click="consent.reject">
|
|
55
70
|
{{ t("consent.decline") }}
|
|
56
|
-
</
|
|
57
|
-
<
|
|
71
|
+
</UiButton>
|
|
72
|
+
<UiButton size="sm" @click="consent.accept">
|
|
58
73
|
{{ t("consent.allow") }}
|
|
59
|
-
</
|
|
74
|
+
</UiButton>
|
|
60
75
|
</div>
|
|
61
76
|
</section>
|
|
62
77
|
</ClientOnly>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
defineProps<{
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
buttonLabel: string;
|
|
6
|
+
to: string;
|
|
7
|
+
logo?: { src: string; alt: string };
|
|
8
|
+
decoration?: string;
|
|
9
|
+
}>();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<section class="call-to-action relative overflow-hidden px-4 py-15">
|
|
14
|
+
<UiImage
|
|
15
|
+
v-if="decoration"
|
|
16
|
+
:src="decoration"
|
|
17
|
+
alt=""
|
|
18
|
+
class="absolute start-0 top-0 h-[166px] w-[223px] rotate-180 max-md:h-[83px] max-md:w-[110px]"
|
|
19
|
+
/>
|
|
20
|
+
<div class="relative z-10 mx-auto flex max-w-7xl flex-col items-center text-center">
|
|
21
|
+
<UiImage
|
|
22
|
+
v-if="logo"
|
|
23
|
+
:src="logo.src"
|
|
24
|
+
:alt="logo.alt"
|
|
25
|
+
:width="164"
|
|
26
|
+
:height="62"
|
|
27
|
+
fit="contain"
|
|
28
|
+
class="mb-10 h-[62px] w-auto max-lg:h-12"
|
|
29
|
+
/>
|
|
30
|
+
<h2 class="mb-5 max-w-[882px] text-[40px] leading-none font-bold max-md:text-[26px]/[34px]">
|
|
31
|
+
{{ title }}
|
|
32
|
+
</h2>
|
|
33
|
+
<p class="mb-10 max-w-[900px] text-base leading-6 font-medium text-muted max-md:mb-7.5">
|
|
34
|
+
{{ description }}
|
|
35
|
+
</p>
|
|
36
|
+
<slot name="action"
|
|
37
|
+
><UiButton :to="to" size="2xl" class="min-w-[200px] max-w-full">{{
|
|
38
|
+
buttonLabel
|
|
39
|
+
}}</UiButton></slot
|
|
40
|
+
>
|
|
41
|
+
</div>
|
|
42
|
+
<UiImage
|
|
43
|
+
v-if="decoration"
|
|
44
|
+
:src="decoration"
|
|
45
|
+
alt=""
|
|
46
|
+
class="absolute end-0 bottom-0 h-[166px] w-[223px] max-md:h-[83px] max-md:w-[110px]"
|
|
47
|
+
/>
|
|
48
|
+
</section>
|
|
49
|
+
</template>
|
|
50
|
+
|
|
51
|
+
<style scoped>
|
|
52
|
+
.call-to-action {
|
|
53
|
+
background: linear-gradient(
|
|
54
|
+
270.88deg,
|
|
55
|
+
color-mix(in srgb, var(--site-color-primary) 28%, var(--site-color-surface)) 0.75%,
|
|
56
|
+
color-mix(in srgb, var(--site-color-primary) 12%, var(--site-color-surface)) 28.3%,
|
|
57
|
+
color-mix(in srgb, var(--site-color-primary) 6%, var(--site-color-surface)) 67.73%,
|
|
58
|
+
color-mix(in srgb, var(--site-color-primary) 18%, var(--site-color-surface)) 99.99%
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { ListItem } from "~/content/types";
|
|
3
|
+
withDefaults(defineProps<{ item: ListItem; preload?: boolean }>(), { preload: false });
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<article
|
|
8
|
+
class="flex h-full flex-col gap-5 overflow-hidden rounded-ml bg-surface/60 px-2.5 pt-3.5 pb-7.5 transition duration-300 hover:-translate-y-1 hover:shadow-lg"
|
|
9
|
+
>
|
|
10
|
+
<NuxtLinkLocale v-if="item.image" :to="item.to" tabindex="-1" aria-hidden="true">
|
|
11
|
+
<UiImage
|
|
12
|
+
:src="item.image.src"
|
|
13
|
+
:alt="item.image.alt"
|
|
14
|
+
:preload="preload"
|
|
15
|
+
:width="323"
|
|
16
|
+
:height="198"
|
|
17
|
+
class="aspect-[323/198] h-60 w-full rounded-lg object-cover max-lg:h-auto"
|
|
18
|
+
/>
|
|
19
|
+
</NuxtLinkLocale>
|
|
20
|
+
<div class="flex flex-1 flex-col text-sm">
|
|
21
|
+
<NuxtLinkLocale :to="item.to"
|
|
22
|
+
><h3 class="mb-2.5 line-clamp-2 text-lg font-bold">{{ item.title }}</h3></NuxtLinkLocale
|
|
23
|
+
>
|
|
24
|
+
<p v-if="item.description" class="mb-5 line-clamp-3 text-dimmed">{{ item.description }}</p>
|
|
25
|
+
<p v-if="item.author || item.category" class="mt-auto flex flex-wrap gap-2">
|
|
26
|
+
<span v-if="item.author">{{ item.author }}</span>
|
|
27
|
+
<NuxtLinkLocale v-if="item.categoryTo" :to="item.categoryTo" class="text-primary">{{
|
|
28
|
+
item.category
|
|
29
|
+
}}</NuxtLinkLocale>
|
|
30
|
+
<span v-else-if="item.category" class="text-primary">{{ item.category }}</span>
|
|
31
|
+
</p>
|
|
32
|
+
<time v-if="item.date" :datetime="item.dateTime" class="mt-2.5">{{ item.date }}</time>
|
|
33
|
+
</div>
|
|
34
|
+
</article>
|
|
35
|
+
</template>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
defineProps<{ icons: string[]; label: string }>();
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<div class="flex items-center gap-2.5">
|
|
7
|
+
<UiIcon v-for="icon in icons" :key="icon" :name="icon" class="size-icon-sm text-dimmed" />
|
|
8
|
+
<span class="text-[10px] font-medium">{{ label }}</span>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
interface FaqItem {
|
|
3
|
+
question: string;
|
|
4
|
+
answer: string;
|
|
5
|
+
}
|
|
6
|
+
const props = defineProps<{ title: string; items: FaqItem[]; buttonLabel?: string; to?: string }>();
|
|
7
|
+
const emit = defineEmits<{ "button-click": [event: MouseEvent] }>();
|
|
8
|
+
const columns = computed(() =>
|
|
9
|
+
[0, 1].map((column) =>
|
|
10
|
+
props.items
|
|
11
|
+
.map((item, index) => ({
|
|
12
|
+
...item,
|
|
13
|
+
label: item.question,
|
|
14
|
+
content: item.answer,
|
|
15
|
+
value: String(index),
|
|
16
|
+
index,
|
|
17
|
+
}))
|
|
18
|
+
.filter((item) => item.index % 2 === column),
|
|
19
|
+
),
|
|
20
|
+
);
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<template>
|
|
24
|
+
<section class="bg-gradient-to-b from-primary/10 to-surface px-4 py-15">
|
|
25
|
+
<div class="mx-auto w-full max-w-7xl">
|
|
26
|
+
<h2 class="mb-10 text-center text-3xl font-bold">{{ title }}</h2>
|
|
27
|
+
<div
|
|
28
|
+
class="grid grid-cols-2 items-start gap-7.5 max-xl:gap-4.5 max-md:grid-cols-1 max-md:gap-2.5"
|
|
29
|
+
>
|
|
30
|
+
<UAccordion
|
|
31
|
+
v-for="(columnItems, column) in columns"
|
|
32
|
+
:key="column"
|
|
33
|
+
type="multiple"
|
|
34
|
+
:items="columnItems"
|
|
35
|
+
trailing-icon="i-lucide-plus"
|
|
36
|
+
:ui="{
|
|
37
|
+
root: 'space-y-7.5 max-xl:space-y-4.5 max-md:space-y-2.5',
|
|
38
|
+
trailingIcon: 'text-primary group-data-[state=open]:rotate-45',
|
|
39
|
+
}"
|
|
40
|
+
>
|
|
41
|
+
<template #body="{ item }"
|
|
42
|
+
><slot name="answer" :item="item" :index="item.index">{{ item.answer }}</slot></template
|
|
43
|
+
>
|
|
44
|
+
</UAccordion>
|
|
45
|
+
</div>
|
|
46
|
+
<UiButton
|
|
47
|
+
v-if="buttonLabel"
|
|
48
|
+
:to="to"
|
|
49
|
+
size="2xl"
|
|
50
|
+
class="w-fit min-w-[200px] max-w-full mx-auto mt-12.5 flex max-md:mt-7.5"
|
|
51
|
+
@click="emit('button-click', $event)"
|
|
52
|
+
>{{ buttonLabel }}</UiButton
|
|
53
|
+
>
|
|
54
|
+
</div>
|
|
55
|
+
</section>
|
|
56
|
+
</template>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps<{ title: string; description: string }>();
|
|
3
|
+
useSeoMeta({ title: () => props.title, description: () => props.description });
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<div class="relative w-full"><slot name="banner" /><slot /></div>
|
|
8
|
+
</template>
|
|
@@ -17,14 +17,7 @@ defineProps<{
|
|
|
17
17
|
</header>
|
|
18
18
|
|
|
19
19
|
<div class="content-list__grid">
|
|
20
|
-
<
|
|
21
|
-
<small v-if="item.category">{{ item.category }}</small>
|
|
22
|
-
<h2>{{ item.title }}</h2>
|
|
23
|
-
<p v-if="item.description">{{ item.description }}</p>
|
|
24
|
-
<span v-if="item.date || item.author">
|
|
25
|
-
{{ [item.author, item.date].filter(Boolean).join(" · ") }}
|
|
26
|
-
</span>
|
|
27
|
-
</NuxtLinkLocale>
|
|
20
|
+
<ContentCard v-for="item in items" :key="item.to" :item="item" />
|
|
28
21
|
</div>
|
|
29
22
|
</section>
|
|
30
23
|
</template>
|