@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.
Files changed (74) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/resources/components/nuxt/site-source/app/assets/css/site-shell.css +124 -56
  4. package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/android.svg +10 -0
  5. package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/apple.svg +3 -0
  6. package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/whatsapp.svg +5 -0
  7. package/dist/resources/components/nuxt/site-source/app/components/app/Sidebar.vue +1 -1
  8. package/dist/resources/components/nuxt/site-source/app/components/checkout/Status.vue +3 -3
  9. package/dist/resources/components/nuxt/site-source/app/components/consent/Banner.vue +23 -8
  10. package/dist/resources/components/nuxt/site-source/app/components/content/CallToAction.vue +61 -0
  11. package/dist/resources/components/nuxt/site-source/app/components/content/Card.vue +35 -0
  12. package/dist/resources/components/nuxt/site-source/app/components/content/Compatibility.vue +10 -0
  13. package/dist/resources/components/nuxt/site-source/app/components/content/Faq.vue +56 -0
  14. package/dist/resources/components/nuxt/site-source/app/components/content/Features.vue +8 -0
  15. package/dist/resources/components/nuxt/site-source/app/components/content/List.vue +1 -8
  16. package/dist/resources/components/nuxt/site-source/app/components/content/Reviews.vue +93 -0
  17. package/dist/resources/components/nuxt/site-source/app/components/countdown/Timer.vue +112 -0
  18. package/dist/resources/components/nuxt/site-source/app/components/locale/Menu.vue +3 -3
  19. package/dist/resources/components/nuxt/site-source/app/components/site/BackToTop.vue +30 -23
  20. package/dist/resources/components/nuxt/site-source/app/components/site/Header.vue +2 -2
  21. package/dist/resources/components/nuxt/site-source/app/components/steps/Progress.vue +36 -0
  22. package/dist/resources/components/nuxt/site-source/app/components/steps/Showcase.vue +340 -0
  23. package/dist/resources/components/nuxt/site-source/app/components/theme/Menu.vue +4 -4
  24. package/dist/resources/components/nuxt/site-source/app/components/ui/Button.vue +28 -2
  25. package/dist/resources/components/nuxt/site-source/app/components/ui/GradientBorder.vue +5 -5
  26. package/dist/resources/components/nuxt/site-source/app/components/ui/Icon.vue +14 -0
  27. package/dist/resources/components/nuxt/site-source/app/components/ui/Image.vue +126 -0
  28. package/dist/resources/components/nuxt/site-source/app/components/ui/Marquee.vue +99 -0
  29. package/dist/resources/components/nuxt/site-source/app/components/ui/Modal.vue +26 -88
  30. package/dist/resources/components/nuxt/site-source/app/components/ui/Popover.vue +87 -93
  31. package/dist/resources/components/nuxt/site-source/app/components/ui/Text.vue +84 -12
  32. package/dist/resources/components/nuxt/site-source/app/components/ui/Video.vue +105 -0
  33. package/dist/resources/components/nuxt/site-source/app/components/whatsapp/Chat.vue +126 -0
  34. package/dist/resources/components/nuxt/site-source/app/components/youtube/Embed.vue +286 -73
  35. package/dist/resources/components/nuxt/site-source/app/composables/useFloatingBottomStack.ts +44 -0
  36. package/dist/resources/components/nuxt/site-source/app/composables/useNavigation.ts +6 -8
  37. package/dist/resources/components/nuxt/site-source/app/consent/types.ts +1 -4
  38. package/dist/resources/components/nuxt/site-source/app/content/types.ts +3 -0
  39. package/dist/resources/components/nuxt/site-source/app/theme/accordion.ts +5 -4
  40. package/dist/resources/components/nuxt/site-source/app/theme/breadcrumb.ts +14 -4
  41. package/dist/resources/components/nuxt/site-source/app/theme/button.ts +133 -27
  42. package/dist/resources/components/nuxt/site-source/app/theme/carousel.ts +11 -7
  43. package/dist/resources/components/nuxt/site-source/app/theme/checkbox.ts +9 -3
  44. package/dist/resources/components/nuxt/site-source/app/theme/drawer.ts +6 -0
  45. package/dist/resources/components/nuxt/site-source/app/theme/form-field.ts +8 -0
  46. package/dist/resources/components/nuxt/site-source/app/theme/icon.ts +6 -0
  47. package/dist/resources/components/nuxt/site-source/app/theme/index.ts +32 -1
  48. package/dist/resources/components/nuxt/site-source/app/theme/input.ts +49 -18
  49. package/dist/resources/components/nuxt/site-source/app/theme/modal.ts +9 -5
  50. package/dist/resources/components/nuxt/site-source/app/theme/pagination.ts +9 -2
  51. package/dist/resources/components/nuxt/site-source/app/theme/radio-group.ts +7 -0
  52. package/dist/resources/components/nuxt/site-source/app/theme/select.ts +62 -6
  53. package/dist/resources/components/nuxt/site-source/app/theme/stepper.ts +15 -6
  54. package/dist/resources/components/nuxt/site-source/app/theme/textarea.ts +78 -0
  55. package/dist/resources/components/nuxt/site-source/app/theme/toast.ts +1 -4
  56. package/dist/resources/components/nuxt/site-source/app/theme/tooltip.ts +5 -1
  57. package/dist/resources/components/registry.json +133 -45
  58. package/dist/resources/components/vue/ui/BottomSheet.vue +5 -1
  59. package/dist/resources/components/vue/ui/ScrollArea.vue +2 -1
  60. package/dist/resources/registry.json +1 -1
  61. package/dist/resources/templates/base/.claude/docs/architecture-template.md +2 -1
  62. package/dist/resources/templates/base/AGENTS.md +7 -0
  63. package/dist/resources/templates/base/CLAUDE.md +7 -0
  64. package/dist/resources/templates/nuxt/.claude/docs/stack.md +20 -1
  65. package/dist/resources/templates/nuxt/DESIGN.md +191 -0
  66. package/dist/resources/templates/nuxt/app/app.config.ts +2 -0
  67. package/dist/resources/templates/nuxt/app/pages/app/index.vue +9 -7
  68. package/dist/resources/templates/nuxt/app/pages/index.vue +12 -27
  69. package/dist/resources/templates/nuxt/app/pages/ui/index.vue +219 -3
  70. package/dist/resources/templates/nuxt/nuxt.config.ts +2 -4
  71. package/dist/resources/templates/nuxt/package.json +2 -1
  72. package/dist/resources/templates/nuxt/stylelint.config.mjs +12 -0
  73. package/package.json +3 -3
  74. 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-primary: #a86550;
11
- --color-primary-hover: #945541;
12
- --color-primary-active: #7f4635;
13
- --color-primary-contrast: #fff;
14
- --color-secondary: #2f6f68;
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: #16a34a;
31
+ --color-success: var(--site-color-success);
18
32
  --color-info: #2563eb;
19
- --color-warning: #b7791f;
20
- --color-error: #ff6b5f;
33
+ --color-warning: var(--site-color-warning);
34
+ --color-error: var(--site-color-danger);
21
35
  --color-neutral: #111827;
22
- --color-bg: #fbfaf7;
23
- --color-surface: #fff;
24
- --color-surface-muted: #f4f0eb;
25
- --color-surface-elevated: #efe7df;
26
- --color-text: #111827;
27
- --color-muted: #52616b;
28
- --color-dimmed: #7a8790;
29
- --color-border: #dbe3e8;
30
- --color-border-strong: #c4d2da;
31
- --radius-ml: 8px;
32
- --radius-2ml: 10px;
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: 8px;
62
- --site-radius-lg: 10px;
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(180deg, rgb(168 101 80 / 4.5%), transparent 360px),
127
- linear-gradient(180deg, rgb(168 101 80 / 2.5%), transparent 520px), var(--site-color-bg);
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
- a {
132
- color: inherit;
133
- text-decoration: none;
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
- font: inherit;
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
- :focus-visible {
150
- outline: 2px solid var(--site-color-primary);
151
- outline-offset: 3px;
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 rgb(168 101 80 / 18%);
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: rgb(168 101 80 / 34%);
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: rgb(168 101 80 / 48%);
223
- background: rgb(168 101 80 / 6%);
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: rgb(168 101 80 / 22%);
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: rgb(168 101 80 / 34%);
238
- background: rgb(168 101 80 / 6%);
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 rgb(168 101 80 / 18%);
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 rgb(168 101 80 / 16%);
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(180deg, rgb(168 101 80 / 4.5%), transparent 340px),
277
- linear-gradient(180deg, rgb(168 101 80 / 2.5%), transparent 520px), var(--site-color-bg);
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: rgb(168 101 80 / 18%);
330
- background: rgb(168 101 80 / 7%);
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: rgb(168 101 80 / 7%);
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: linear-gradient(180deg, rgb(168 101 80 / 4%), transparent), var(--site-color-surface);
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: rgb(168 101 80 / 20%);
886
- background: rgb(168 101 80 / 7%);
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: linear-gradient(180deg, rgb(168 101 80 / 4%), transparent), var(--site-color-surface);
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: rgb(168 101 80 / 32%);
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: rgb(168 101 80 / 7%);
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>
@@ -23,7 +23,7 @@ defineEmits<{
23
23
  class="application-sidebar__link"
24
24
  @click="$emit('navigate')"
25
25
  >
26
- <UIcon
26
+ <UiIcon
27
27
  v-if="item.icon?.startsWith('i-')"
28
28
  :name="item.icon"
29
29
  class="application-sidebar__icon"
@@ -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
- <UIcon :name="statusMeta.icon" class="checkout-status__icon" />
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: 28px;
97
- height: 28px;
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
- <button
48
+ <UiButton
37
49
  v-if="consent.state.value.decision"
38
- type="button"
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
- <UIcon name="i-lucide-x" aria-hidden="true" />
44
- </button>
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
- <button type="button" class="base-button base-button--secondary" @click="consent.reject">
69
+ <UiButton color="neutral" variant="outline" size="sm" @click="consent.reject">
55
70
  {{ t("consent.decline") }}
56
- </button>
57
- <button type="button" class="base-button base-button--primary" @click="consent.accept">
71
+ </UiButton>
72
+ <UiButton size="sm" @click="consent.accept">
58
73
  {{ t("consent.allow") }}
59
- </button>
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
- <NuxtLinkLocale v-for="item in items" :key="item.to" :to="item.to" class="content-card">
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>