xv-webcomponents 1.25.1 → 1.25.2

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 (72) hide show
  1. package/dist/cjs/{index-DpLAFt0R.js → index-CsKqwBc1.js} +644 -7
  2. package/dist/cjs/loader.cjs.js +2 -2
  3. package/dist/cjs/xv-accordion-v2_50.cjs.entry.js +59 -41
  4. package/dist/cjs/xv-footer-next.cjs.entry.js +122 -0
  5. package/dist/cjs/xv-header-next.cjs.entry.js +2 -2
  6. package/dist/cjs/xv-mega-menu-next.cjs.entry.js +7 -7
  7. package/dist/cjs/xv-webcomponents.cjs.js +2 -2
  8. package/dist/collection/collection-manifest.json +1 -0
  9. package/dist/collection/components/xv-data-table/xv-data-table-cell/xv-data-table-cell.css +2 -1
  10. package/dist/collection/components/xv-footer-next/xv-footer-next.css +486 -0
  11. package/dist/collection/components/xv-footer-next/xv-footer-next.js +167 -0
  12. package/dist/collection/components/xv-footer-next/xv-footer-next.model.js +17 -0
  13. package/dist/collection/components/xv-geo-map/xv-geo-map.js +41 -1
  14. package/dist/collection/components/xv-header/xv-header.js +1 -1
  15. package/dist/collection/components/xv-header-next/xv-header-next.js +1 -1
  16. package/dist/collection/components/xv-image-viewer/xv-image-viewer.js +1 -1
  17. package/dist/collection/components/xv-link/xv-link.js +1 -1
  18. package/dist/collection/components/xv-mega-menu/xv-mega-menu.css +46 -2
  19. package/dist/collection/components/xv-mega-menu/xv-mega-menu.js +6 -7
  20. package/dist/collection/components/xv-mega-menu-next/xv-mega-menu-next.css +42 -2
  21. package/dist/collection/components/xv-mega-menu-next/xv-mega-menu-next.js +20 -6
  22. package/dist/collection/components/xv-modal/xv-modal.js +1 -1
  23. package/dist/collection/components/xv-notification/xv-notification.js +1 -1
  24. package/dist/collection/components/xv-number-input/xv-number-input.js +2 -2
  25. package/dist/collection/components/xv-pagination/xv-pagination.js +1 -1
  26. package/dist/collection/components/xv-progress-indicator/xv-progress-indicator-item/xv-progress-indicator-item.js +1 -1
  27. package/dist/collection/components/xv-progress-indicator/xv-progress-indicator.js +1 -1
  28. package/dist/collection/components/xv-radio/xv-radio.js +2 -2
  29. package/dist/collection/components/xv-slider/xv-slider.js +1 -1
  30. package/dist/collection/components/xv-table/xv-table-cell/xv-table-cell.js +1 -1
  31. package/dist/collection/components/xv-table/xv-table-expand/xv-table-expand.js +1 -1
  32. package/dist/collection/components/xv-table/xv-table-row/xv-table-row.js +1 -1
  33. package/dist/collection/components/xv-table/xv-table.js +1 -1
  34. package/dist/collection/components/xv-tabs/xv-tab/xv-tab.js +1 -1
  35. package/dist/collection/components/xv-tag/xv-tag.js +1 -1
  36. package/dist/collection/components/xv-tag-combobox/xv-tag-combobox.js +2 -2
  37. package/dist/collection/components/xv-text-input/xv-text-input.js +2 -2
  38. package/dist/collection/components/xv-textarea/xv-textarea.js +2 -2
  39. package/dist/collection/components/xv-tile/xv-tile.js +2 -2
  40. package/dist/collection/components/xv-toggle/xv-toggle.js +1 -1
  41. package/dist/collection/components/xv-toggle-tip/xv-toggle-tip.js +1 -1
  42. package/dist/collection/components/xv-tooltip/xv-tooltip.js +2 -2
  43. package/dist/esm/{index-CQm2sRKT.js → index-D0yFoU2h.js} +1 -1
  44. package/dist/esm/{index-DmxA2ysB.js → index-Owr_mJOX.js} +644 -7
  45. package/dist/esm/index.js +1 -1
  46. package/dist/esm/loader.js +3 -3
  47. package/dist/esm/xv-accordion-v2_50.entry.js +60 -42
  48. package/dist/esm/xv-footer-next.entry.js +120 -0
  49. package/dist/esm/xv-header-next.entry.js +3 -3
  50. package/dist/esm/xv-mega-menu-next.entry.js +8 -8
  51. package/dist/esm/xv-webcomponents.js +3 -3
  52. package/dist/types/components/xv-footer-next/xv-footer-next.d.ts +42 -0
  53. package/dist/types/components/xv-footer-next/xv-footer-next.model.d.ts +43 -0
  54. package/dist/types/components/xv-geo-map/xv-geo-map.d.ts +7 -0
  55. package/dist/types/components/xv-mega-menu-next/xv-mega-menu-next.d.ts +14 -0
  56. package/dist/types/components.d.ts +131 -0
  57. package/dist/xv-webcomponents/index.esm.js +1 -1
  58. package/dist/xv-webcomponents/p-3dd10203.entry.js +1 -0
  59. package/dist/xv-webcomponents/{p-CQm2sRKT.js → p-D0yFoU2h.js} +1 -1
  60. package/dist/xv-webcomponents/p-Owr_mJOX.js +2 -0
  61. package/dist/xv-webcomponents/p-b0fbf402.entry.js +8 -0
  62. package/dist/xv-webcomponents/p-ec19bcc7.entry.js +1 -0
  63. package/dist/xv-webcomponents/{p-f46bb687.entry.js → p-fbd8ca68.entry.js} +1 -1
  64. package/dist/xv-webcomponents/xv-webcomponents.esm.js +1 -1
  65. package/hydrate/index.d.ts +287 -0
  66. package/hydrate/index.js +113808 -0
  67. package/hydrate/index.mjs +113798 -0
  68. package/hydrate/package.json +12 -0
  69. package/package.json +8 -2
  70. package/dist/xv-webcomponents/p-7832549c.entry.js +0 -8
  71. package/dist/xv-webcomponents/p-DmxA2ysB.js +0 -2
  72. package/dist/xv-webcomponents/p-fe9b38f8.entry.js +0 -1
@@ -0,0 +1,486 @@
1
+ .xv-container {
2
+ width: 100%;
3
+ max-width: 1170px;
4
+ margin-inline: auto;
5
+ }
6
+ @media (min-width: 576px) {
7
+ .xv-container {
8
+ max-width: 540px;
9
+ }
10
+ }
11
+ @media (min-width: 768px) {
12
+ .xv-container {
13
+ max-width: 720px;
14
+ }
15
+ }
16
+ @media (min-width: 992px) {
17
+ .xv-container {
18
+ max-width: 960px;
19
+ padding-inline: var(--bs-gutter-x, 0.75rem);
20
+ }
21
+ }
22
+ @media (min-width: 1200px) {
23
+ .xv-container {
24
+ max-width: 1140px;
25
+ }
26
+ }
27
+ @media (min-width: 1400px) {
28
+ .xv-container {
29
+ max-width: 1320px;
30
+ }
31
+ }
32
+
33
+ .svg-assets--src--project--images--svg-sprite--youtube, .svg-assets--src--project--images--svg-sprite--xing, .svg-assets--src--project--images--svg-sprite--vorkasse, .svg-assets--src--project--images--svg-sprite--visa, .svg-assets--src--project--images--svg-sprite--sepa, .svg-assets--src--project--images--svg-sprite--paypal, .svg-assets--src--project--images--svg-sprite--mastercard, .svg-assets--src--project--images--svg-sprite--linkedin, .svg-assets--src--project--images--svg-sprite--kauf-auf-rechnung, .svg-assets--src--project--images--svg-sprite--instagram, .svg-assets--src--project--images--svg-sprite--facebook {
34
+ background: url("https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.svg") no-repeat;
35
+ }
36
+
37
+ .svg-assets--src--project--images--svg-sprite--facebook {
38
+ background-position: 0 100%;
39
+ width: 32px;
40
+ height: 32px;
41
+ }
42
+
43
+ .svg-assets--src--project--images--svg-sprite--instagram {
44
+ background-position: 14.5454545455% 100%;
45
+ width: 32px;
46
+ height: 32px;
47
+ }
48
+
49
+ .svg-assets--src--project--images--svg-sprite--kauf-auf-rechnung {
50
+ background-position: 0 0;
51
+ width: 84px;
52
+ height: 58px;
53
+ }
54
+
55
+ .svg-assets--src--project--images--svg-sprite--linkedin {
56
+ background-position: 29.0909090909% 100%;
57
+ width: 32px;
58
+ height: 32px;
59
+ }
60
+
61
+ .svg-assets--src--project--images--svg-sprite--mastercard {
62
+ background-position: 50% 0;
63
+ width: 84px;
64
+ height: 58px;
65
+ }
66
+
67
+ .svg-assets--src--project--images--svg-sprite--paypal {
68
+ background-position: 0 64.4444444444%;
69
+ width: 84px;
70
+ height: 58px;
71
+ }
72
+
73
+ .svg-assets--src--project--images--svg-sprite--sepa {
74
+ background-position: 50% 64.4444444444%;
75
+ width: 84px;
76
+ height: 58px;
77
+ }
78
+
79
+ .svg-assets--src--project--images--svg-sprite--visa {
80
+ background-position: 100% 0;
81
+ width: 84px;
82
+ height: 58px;
83
+ }
84
+
85
+ .svg-assets--src--project--images--svg-sprite--vorkasse {
86
+ background-position: 100% 64.4444444444%;
87
+ width: 84px;
88
+ height: 58px;
89
+ }
90
+
91
+ .svg-assets--src--project--images--svg-sprite--xing {
92
+ background-position: 43.6363636364% 100%;
93
+ width: 32px;
94
+ height: 32px;
95
+ }
96
+
97
+ .svg-assets--src--project--images--svg-sprite--youtube {
98
+ background-position: 58.1818181818% 100%;
99
+ width: 32px;
100
+ height: 32px;
101
+ }
102
+
103
+ .sprite-icon-beachten {
104
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
105
+ background-position: -90px 0px;
106
+ width: 80px;
107
+ height: 80px;
108
+ }
109
+
110
+ .sprite-icon-buchen {
111
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
112
+ background-position: 0px -82px;
113
+ width: 80px;
114
+ height: 80px;
115
+ }
116
+
117
+ .sprite-icon-direct {
118
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
119
+ background-position: -284px -99px;
120
+ width: 21px;
121
+ height: 21px;
122
+ }
123
+
124
+ .sprite-icon-downloads {
125
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
126
+ background-position: -80px -82px;
127
+ width: 80px;
128
+ height: 80px;
129
+ }
130
+
131
+ .sprite-icon-kino {
132
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
133
+ background-position: -305px -99px;
134
+ width: 21px;
135
+ height: 21px;
136
+ }
137
+
138
+ .sprite-icon-kosten {
139
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
140
+ background-position: -170px 0px;
141
+ width: 80px;
142
+ height: 80px;
143
+ }
144
+
145
+ .sprite-icon-kreation {
146
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
147
+ background-position: -170px -80px;
148
+ width: 80px;
149
+ height: 80px;
150
+ }
151
+
152
+ .sprite-icon-logo-full {
153
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
154
+ background-position: 0px -242px;
155
+ width: 189px;
156
+ height: 32px;
157
+ }
158
+
159
+ .sprite-icon-logo-small {
160
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
161
+ background-position: -250px -99px;
162
+ width: 34px;
163
+ height: 34px;
164
+ }
165
+
166
+ .sprite-icon-mobile {
167
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
168
+ background-position: -326px -99px;
169
+ width: 21px;
170
+ height: 21px;
171
+ }
172
+
173
+ .sprite-icon-online {
174
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
175
+ background-position: -347px -99px;
176
+ width: 21px;
177
+ height: 21px;
178
+ }
179
+
180
+ .sprite-icon-partner-agma {
181
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
182
+ background-position: -250px -66px;
183
+ width: 88px;
184
+ height: 33px;
185
+ }
186
+
187
+ .sprite-icon-partner-bvdw {
188
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
189
+ background-position: -338px -66px;
190
+ width: 88px;
191
+ height: 33px;
192
+ }
193
+
194
+ .sprite-icon-partner-climate {
195
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
196
+ background-position: -250px 0px;
197
+ width: 186px;
198
+ height: 33px;
199
+ }
200
+
201
+ .sprite-icon-partner-google {
202
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
203
+ background-position: 0 0;
204
+ width: 90px;
205
+ height: 82px;
206
+ }
207
+
208
+ .sprite-icon-partner-microsoft {
209
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
210
+ background-position: -250px -33px;
211
+ width: 186px;
212
+ height: 33px;
213
+ }
214
+
215
+ .sprite-icon-plakat {
216
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
217
+ background-position: -368px -99px;
218
+ width: 21px;
219
+ height: 21px;
220
+ }
221
+
222
+ .sprite-icon-print {
223
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
224
+ background-position: -389px -99px;
225
+ width: 21px;
226
+ height: 21px;
227
+ }
228
+
229
+ .sprite-icon-radio {
230
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
231
+ background-position: -410px -99px;
232
+ width: 21px;
233
+ height: 21px;
234
+ }
235
+
236
+ .sprite-icon-services {
237
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
238
+ background-position: -250px -133px;
239
+ width: 21px;
240
+ height: 21px;
241
+ }
242
+
243
+ .sprite-icon-topangebote {
244
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
245
+ background-position: -271px -133px;
246
+ width: 21px;
247
+ height: 21px;
248
+ }
249
+
250
+ .sprite-icon-tv {
251
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
252
+ background-position: -292px -133px;
253
+ width: 21px;
254
+ height: 21px;
255
+ }
256
+
257
+ .sprite-icon-werbeformen {
258
+ background-image: url(https://crossvertise.blob.core.windows.net/assets/images/xv-sprite.png?1739974291120);
259
+ background-position: 0px -162px;
260
+ width: 80px;
261
+ height: 80px;
262
+ }
263
+
264
+ .container-footer {
265
+ min-height: 75px;
266
+ }
267
+
268
+ .footer-static {
269
+ border-top: solid 1px #eaeaea;
270
+ padding-top: 30px;
271
+ }
272
+
273
+ .xv-footer__grid {
274
+ display: grid;
275
+ grid-template-columns: 1fr;
276
+ }
277
+ @media (min-width: 768px) {
278
+ .xv-footer__grid {
279
+ grid-template-columns: 8fr 3fr;
280
+ column-gap: var(--spacing-07, 32px);
281
+ }
282
+ }
283
+
284
+ .xv-footer {
285
+ display: block;
286
+ border-top: 1px solid var(--layer-01, #F7F7F7) !important;
287
+ background: var(--layer-01, #F7F7F7) !important;
288
+ --ff-body: var(--ff-work-sans);
289
+ }
290
+ .xv-footer-advantages {
291
+ border-bottom: 1px solid var(--border-subtle-01, #D1D1D1);
292
+ background: var(--highlight-01, #CEDE94);
293
+ display: block;
294
+ }
295
+ .xv-footer-advantages ul {
296
+ margin: 0;
297
+ padding: var(--spacing-05, 16px);
298
+ gap: var(--spacing-05, 16px);
299
+ display: flex;
300
+ align-items: center;
301
+ justify-content: space-between;
302
+ flex-wrap: wrap;
303
+ list-style: none;
304
+ }
305
+ @media (max-width: 991px) {
306
+ .xv-footer-advantages ul {
307
+ display: grid;
308
+ grid-template-columns: repeat(2, 1fr);
309
+ justify-items: center;
310
+ }
311
+ }
312
+ .xv-footer-advantages ul > li > a {
313
+ display: flex;
314
+ flex-direction: column;
315
+ align-items: center;
316
+ justify-content: center;
317
+ row-gap: var(--spacing-06, 24px);
318
+ min-width: min(182px, 40vw);
319
+ width: min(182px, 40vw);
320
+ text-align: center;
321
+ text-decoration: none;
322
+ }
323
+ .xv-footer-advantages ul > li > a > img, .xv-footer-advantages ul > li > a > i {
324
+ width: 32px;
325
+ font-size: 32px;
326
+ block-size: 32px;
327
+ color: var(--icon-primary);
328
+ object-fit: contain;
329
+ }
330
+ .xv-footer-advantages ul > li > a > img {
331
+ font-size: var(--fz-sm, 12px);
332
+ }
333
+ .xv-footer-advantages ul > li > a > span {
334
+ color: var(--text-primary, #333);
335
+ font-feature-settings: "liga" off, "clig" off;
336
+ }
337
+ .xv-footer-categories {
338
+ list-style: none;
339
+ padding: 0;
340
+ margin: 0 0 var(--spacing-06, 24px);
341
+ display: flex;
342
+ flex: 1;
343
+ justify-content: space-between;
344
+ row-gap: var(--spacing-06, 24px);
345
+ column-gap: var(--spacing-09);
346
+ }
347
+ @media (max-width: 768px) {
348
+ .xv-footer-categories {
349
+ display: grid;
350
+ grid-template-columns: repeat(2, 1fr);
351
+ }
352
+ }
353
+ .xv-footer-categories > li {
354
+ display: flex;
355
+ flex-direction: column;
356
+ row-gap: var(--sapcing-05, 16px);
357
+ max-width: 203px;
358
+ }
359
+ .xv-footer-routes {
360
+ list-style: none;
361
+ margin: 0;
362
+ padding: 0;
363
+ display: flex;
364
+ row-gap: var(--spacing-05, 16px);
365
+ flex-direction: column;
366
+ }
367
+ .xv-footer-routes a {
368
+ color: var(--interactive-01, #273435);
369
+ }
370
+ .xv-footer-legal {
371
+ background: var(--layer-accent-02, #E3E3E3);
372
+ }
373
+ .xv-footer-legal-row {
374
+ display: flex;
375
+ align-items: center;
376
+ text-align: center;
377
+ gap: var(--spacing-05);
378
+ padding: var(--spacing-09) var(--spacing-05);
379
+ }
380
+ @media (max-width: 768px) {
381
+ .xv-footer-legal-row {
382
+ padding-block: var(--spacing-05);
383
+ flex-direction: column;
384
+ justify-content: center;
385
+ }
386
+ }
387
+ .xv-footer-legal-row a.xv-helper-text-02 {
388
+ cursor: pointer;
389
+ }
390
+ .xv-footer-legal-row .xv-footer-logo {
391
+ text-decoration: none;
392
+ display: inline-flex;
393
+ align-items: center;
394
+ gap: var(--spacing-03);
395
+ color: var(--text-primary);
396
+ }
397
+ .xv-footer-legal-row .xv-footer-logo > img {
398
+ width: 160px;
399
+ }
400
+ .xv-footer-legal ul {
401
+ flex: 1;
402
+ padding: 0;
403
+ margin: 0 auto;
404
+ list-style: none;
405
+ display: flex;
406
+ align-items: center;
407
+ justify-content: center;
408
+ flex-wrap: wrap;
409
+ max-width: 600px;
410
+ align-self: center;
411
+ }
412
+ .xv-footer-legal ul > li {
413
+ display: inline-flex;
414
+ align-items: center;
415
+ color: var(--text-secondary, #515151);
416
+ }
417
+ .xv-footer-legal ul > li:not(:last-child):after {
418
+ display: inline-flex;
419
+ margin-inline: var(--spacing-02);
420
+ content: "|";
421
+ }
422
+ .xv-footer-legal ul > li > * {
423
+ color: inherit;
424
+ }
425
+ .xv-footer .footer-grid {
426
+ display: flex;
427
+ flex-direction: column;
428
+ row-gap: var(--spacing-05, 16px);
429
+ }
430
+ .xv-footer .footer-grid:not(:last-child) {
431
+ margin-block-end: var(--spacing-06, 24px);
432
+ }
433
+ .xv-footer .footer-grid > ul {
434
+ list-style: none;
435
+ margin: 0;
436
+ padding: 0;
437
+ display: grid;
438
+ gap: var(--spacing-05);
439
+ grid-template-columns: repeat(3, 1fr);
440
+ justify-items: center;
441
+ }
442
+ .xv-footer .footer-grid > ul > li {
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: center;
446
+ flex-direction: column;
447
+ width: 60px;
448
+ font-size: 60px;
449
+ block-size: 60px;
450
+ }
451
+ .xv-footer .footer-grid > ul > li > a, .xv-footer .footer-grid > ul > li > a > img, .xv-footer .footer-grid > ul > li > a > i, .xv-footer .footer-grid > ul > li > img, .xv-footer .footer-grid > ul > li > i {
452
+ text-decoration: none;
453
+ display: block;
454
+ width: inherit;
455
+ font-size: inherit;
456
+ block-size: inherit;
457
+ color: var(--icon-primary);
458
+ object-fit: contain;
459
+ }
460
+ .xv-footer .footer-grid > ul > li > a > img, .xv-footer .footer-grid > ul > li > img {
461
+ font-size: var(--fz-sm, 12px);
462
+ text-align: center;
463
+ }
464
+ .xv-footer .footer-grid > ul > li > span {
465
+ color: var(--text-primary, #333);
466
+ font-feature-settings: "liga" off, "clig" off;
467
+ }
468
+ .xv-footer .footer-grid--row > ul {
469
+ display: flex;
470
+ flex-direction: row;
471
+ justify-content: space-between;
472
+ flex: 1;
473
+ }
474
+ .xv-footer .footer-grid--row > ul > li {
475
+ width: 24px;
476
+ block-size: 24px;
477
+ font-size: 24px;
478
+ }
479
+ .xv-footer-y-spacing {
480
+ margin-block: var(--spacing-07, 32px) var(--spacing-10, 64px);
481
+ }
482
+ .xv-footer .xv-label-02,
483
+ .xv-footer .xv-heading-compact-02 {
484
+ margin: 0;
485
+ color: var(--text-secondary, #515151);
486
+ }
@@ -0,0 +1,167 @@
1
+ import { h } from "@stencil/core";
2
+ import { DEFAULT_FOOTER_LABELS } from "./xv-footer-next.model";
3
+ import { api, resolveWhitelabel } from "../../utils/utils";
4
+ /**
5
+ * Drop-in successor of `xv-footer` for the new headless CMS.
6
+ *
7
+ * Identical to the original except:
8
+ * 1. Tag is `xv-footer-next`
9
+ * 2. Accepts a `footer-data` prop so the consumer can pre-render the
10
+ * content instead of the component fetching it at runtime. The CMS
11
+ * stores one document per language, which is what makes a translated
12
+ * footer possible at all.
13
+ * 3. The three sidebar headings come from `labels` in that data instead of
14
+ * being hardcoded German strings. Missing keys fall back to the old
15
+ * wording, so a V1 payload renders exactly as before.
16
+ *
17
+ * Without the prop it behaves like V1: it fetches the whitelabel JSON from
18
+ * blob storage on load, so it stays a drop-in replacement.
19
+ */
20
+ export class XvFooterNext {
21
+ constructor() {
22
+ this.openCookieSettings = (e) => {
23
+ var _a;
24
+ e.preventDefault();
25
+ (_a = window.__cmp) === null || _a === void 0 ? void 0 : _a.call(window, 'showScreenAdvanced');
26
+ };
27
+ }
28
+ onFooterDataChange(next) {
29
+ const parsed = this.parseFooterData(next);
30
+ if (parsed)
31
+ this.data = parsed;
32
+ }
33
+ componentWillLoad() {
34
+ const initial = this.parseFooterData(this.footerData);
35
+ if (initial) {
36
+ this.data = initial;
37
+ return;
38
+ }
39
+ void this.handleLoadData();
40
+ }
41
+ parseFooterData(value) {
42
+ if (!value)
43
+ return null;
44
+ if (typeof value !== 'string')
45
+ return value;
46
+ try {
47
+ const parsed = JSON.parse(value);
48
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
49
+ }
50
+ catch (e) {
51
+ console.warn('xv-footer-next: invalid footer-data JSON', e);
52
+ return null;
53
+ }
54
+ }
55
+ /**
56
+ * V1 fetch path, kept for consumers that have no CMS behind them.
57
+ * Skipped entirely once `footerData` is supplied.
58
+ */
59
+ async handleLoadData() {
60
+ if (this.parseFooterData(this.footerData))
61
+ return;
62
+ const baseUrl = 'https://xvsitefinitystorage.blob.core.windows.net/production/components/xv-footer/';
63
+ const brand = resolveWhitelabel() || 'Xv';
64
+ try {
65
+ this.data = await api.get(`${baseUrl}xv-footer.data.${brand}.json`, { raw: true });
66
+ return;
67
+ }
68
+ catch (err) {
69
+ console.warn(`Failed to fetch footer data for ${brand}, using fallback:`, err);
70
+ if (brand === 'Xv')
71
+ return; // No need to fallback if already trying default brand
72
+ }
73
+ try {
74
+ this.data = await api.get(`${baseUrl}xv-footer.data.Xv.json`, { raw: true });
75
+ }
76
+ catch (finalErr) {
77
+ console.error('Fallback footer load failed:', finalErr);
78
+ }
79
+ }
80
+ get labels() {
81
+ var _a, _b;
82
+ return Object.assign(Object.assign({}, DEFAULT_FOOTER_LABELS), ((_b = (_a = this.data) === null || _a === void 0 ? void 0 : _a.labels) !== null && _b !== void 0 ? _b : {}));
83
+ }
84
+ render() {
85
+ const { categories, socials, logo, legalLinks, payments, partners, advantages } = this.data || {};
86
+ const hasDataLength = ((categories === null || categories === void 0 ? void 0 : categories.length) || (partners === null || partners === void 0 ? void 0 : partners.length) || (payments === null || payments === void 0 ? void 0 : payments.length) || (socials === null || socials === void 0 ? void 0 : socials.length));
87
+ const labels = this.labels;
88
+ return (h("footer", { key: '1ea7f6ae925210666aff8e7a7bafba8f5f05a7db', class: "xv-footer" }, (advantages === null || advantages === void 0 ? void 0 : advantages.length) > 0 && (h("div", { key: 'c277df0213caffc9b4a4947fd859244a97abafb7', class: "xv-footer-advantages" }, h("div", { key: 'fc0b0f42df35e9eb708554b12dfd89b03e359f92', class: "xv-container" }, this._renderFooterList(advantages, { itemWithLabel: true })))), hasDataLength && (h("div", { key: 'f3180c517955d4fc49e77b489b3e64c88947772b', class: "xv-container" }, h("div", { key: 'af4029318be8be0aba367eee734208afaff3d081', class: "xv-footer__grid xv-footer-y-spacing" }, h("div", { key: 'd517532894a4a6f4a94814b0bcc5218fb0a7652d', class: "xv-footer__col-main" }, h("ul", { key: '311115f6991c58455e87d571dc280da7e3546a79', class: "xv-footer-categories" }, categories === null || categories === void 0 ? void 0 : categories.map((category) => {
89
+ var _a;
90
+ return (h("li", null, h("p", { class: "xv-label-02" }, category.label), h("ul", { class: "xv-footer-routes" }, (_a = category.routes) === null || _a === void 0 ? void 0 : _a.map((item) => (h("li", null, h("a", { class: "xv-body-compact-02", href: item.href, target: item.target }, item.label)))))));
91
+ }))), h("div", { key: '2993c8863d750877ad4da0506703c00e737bb12b', class: "xv-footer__col-sidebar" }, this._renderFooterList(partners, { label: labels.partners }), this._renderFooterList(payments, { label: labels.payments }), this._renderFooterList(socials, { label: labels.socials, isRow: true }))))), (legalLinks === null || legalLinks === void 0 ? void 0 : legalLinks.length) > 0 && (h("div", { key: 'fa0ca088a3167599bd97b7a0627dfae3f64a3c21', class: "xv-footer-legal" }, h("div", { key: 'cd82873c4cfbaf6e65137c6ccbd029697f4e1bfc', class: "xv-container" }, h("div", { key: '8b0a4353501acafcd3df520ac2c9964f316cd5d0', class: "xv-footer-legal-row" }, logo && (h("a", { key: '080237964fd922700bc70695c120e3ecb22bae68', class: "xv-footer-logo", href: logo.href, target: logo.target }, logo.label && h("span", { key: 'b6278d014c8846318818f85e021130f7675c2503', class: "xv-label-02" }, logo.label), h("img", { key: 'f0a71927ad8ea50da5c6cdfc3ab956b3c867c10a', loading: "lazy", src: logo.image, alt: logo.label }))), h("ul", { key: '527b84cafd5a4c436b41d3c47bb67c1ea875f24e' }, legalLinks.map((item) => {
92
+ // A link with no href is a UI trigger, not navigation —
93
+ // that is how the cookie dialog is wired. V1 matched the
94
+ // German label instead, which broke in any other language.
95
+ if (!item.href) {
96
+ return h("li", null, h("a", { class: "xv-helper-text-02", href: "#", onClick: this.openCookieSettings }, item.label));
97
+ }
98
+ return h("li", null, h("a", { class: "xv-helper-text-02", href: item.href, target: item.target }, item.label));
99
+ }))))))));
100
+ }
101
+ _renderFooterList(items = [], opt) {
102
+ if (!(items === null || items === void 0 ? void 0 : items.length))
103
+ return null;
104
+ const list = (h("ul", null, items.map((item) => (h("li", null, h("a", { href: item === null || item === void 0 ? void 0 : item.href, target: item.target }, item.icon && h("i", { class: { fa: true, [item.icon]: true } }), item.image && h("img", { src: item.image, alt: item.label }), (opt === null || opt === void 0 ? void 0 : opt.itemWithLabel) && item.label && h("span", { class: "xv-body-02" }, item.label)))))));
105
+ return (opt === null || opt === void 0 ? void 0 : opt.label) ? (h("div", { class: { 'footer-grid': true, 'footer-grid--row': !!(opt === null || opt === void 0 ? void 0 : opt.isRow) } }, h("p", { class: "xv-heading-compact-02" }, opt.label), list)) : list;
106
+ }
107
+ static get is() { return "xv-footer-next"; }
108
+ static get originalStyleUrls() {
109
+ return {
110
+ "$": ["xv-footer-next.scss"]
111
+ };
112
+ }
113
+ static get styleUrls() {
114
+ return {
115
+ "$": ["xv-footer-next.css"]
116
+ };
117
+ }
118
+ static get properties() {
119
+ return {
120
+ "footerData": {
121
+ "type": "string",
122
+ "mutable": false,
123
+ "complexType": {
124
+ "original": "string | FooterDataModel",
125
+ "resolved": "FooterDataModel | string",
126
+ "references": {
127
+ "FooterDataModel": {
128
+ "location": "import",
129
+ "path": "./xv-footer-next.model",
130
+ "id": "src/components/xv-footer-next/xv-footer-next.model.ts::FooterDataModel"
131
+ }
132
+ }
133
+ },
134
+ "required": false,
135
+ "optional": true,
136
+ "docs": {
137
+ "tags": [],
138
+ "text": "Footer content, either as a JSON string (HTML attribute) or as an object\n(JS property). When set, no network request is made."
139
+ },
140
+ "getter": false,
141
+ "setter": false,
142
+ "reflect": false,
143
+ "attribute": "footer-data"
144
+ }
145
+ };
146
+ }
147
+ static get states() {
148
+ return {
149
+ "data": {}
150
+ };
151
+ }
152
+ static get watchers() {
153
+ return [{
154
+ "propName": "footerData",
155
+ "methodName": "onFooterDataChange"
156
+ }];
157
+ }
158
+ static get listeners() {
159
+ return [{
160
+ "name": "xv:metaNav-update",
161
+ "method": "handleLoadData",
162
+ "target": "window",
163
+ "capture": false,
164
+ "passive": false
165
+ }];
166
+ }
167
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Data model for `xv-footer-next`.
3
+ *
4
+ * A copy of `xv-footer.model.ts` — deliberately duplicated rather than
5
+ * imported, so the two components can diverge without breaking each other
6
+ * (same approach as `xv-mega-menu-next.model.ts`).
7
+ *
8
+ * Difference from V1: `labels` was added. V1 had the three sidebar headings
9
+ * as hardcoded German strings in its render method, which made it unusable
10
+ * in a second language.
11
+ */
12
+ /** What V1 rendered when no labels were supplied. */
13
+ export const DEFAULT_FOOTER_LABELS = {
14
+ partners: 'crossvertise Partner',
15
+ payments: 'Bequem und sicher bezahlen',
16
+ socials: 'Folgen Sie uns',
17
+ };