@tui/design-system 1.12.0 → 1.14.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 (37) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/dist/themes/crystalski/index.css +4 -0
  3. package/dist/themes/crystalski/index.css.map +1 -1
  4. package/dist/themes/firstchoice/index.css +5 -1
  5. package/dist/themes/firstchoice/index.css.map +1 -1
  6. package/dist/themes/tui/index.css +5 -1
  7. package/dist/themes/tui/index.css.map +1 -1
  8. package/package.json +15 -15
  9. package/scss/lib/cards/article/_mixins.scss +76 -29
  10. package/scss/lib/cards/card/_mixins.scss +76 -0
  11. package/scss/lib/flyout-dropdown/_mixins.scss +2 -0
  12. package/scss/lib/grid/_column.scss +11 -0
  13. package/scss/lib/grid/_container.scss +11 -0
  14. package/scss/lib/grid/_mixins.scss +30 -0
  15. package/scss/lib/grid/_variables.scss +1 -0
  16. package/scss/lib/highlight-panel/_mixins.scss +4 -2
  17. package/scss/lib/icon-button/_mixins.scss +232 -55
  18. package/scss/lib/icon-button/_variables.scss +1 -0
  19. package/scss/lib/image/_mixins.scss +56 -28
  20. package/scss/lib/info-tag/_mixins.scss +7 -1
  21. package/scss/lib/info-tag/_variables.scss +2 -0
  22. package/scss/lib/list/_mixins.scss +12 -2
  23. package/scss/lib/list/_variables.scss +1 -1
  24. package/scss/lib/modal/_mixins.scss +9 -3
  25. package/scss/lib/patterns/card-with-list/_index.scss +4 -0
  26. package/scss/lib/patterns/card-with-list/_mixins.scss +86 -0
  27. package/scss/lib/patterns/holiday-summary/_index.scss +3 -0
  28. package/scss/lib/patterns/holiday-summary/_mixins.scss +94 -0
  29. package/scss/lib/patterns/review-card/_mixins.scss +3 -9
  30. package/scss/mixins.scss +2 -0
  31. package/scss/themes/firstchoice/_colors.scss +1 -1
  32. package/scss/themes/firstchoice/_primitives.scss +1 -0
  33. package/scss/themes/firstchoice/theme.json +1 -1
  34. package/scss/variables/_colors.scss +1 -0
  35. package/scss/variables/_primitives.scss +1 -0
  36. package/scss/variables/base-theme.json +21 -0
  37. package/types/components.ts +129 -9
@@ -0,0 +1,86 @@
1
+ // Card with list / _mixins
2
+ @use '../../cards/card/mixins' as *;
3
+ @use '../../highlight-panel/mixins' as *;
4
+ @use '../../list/mixins' as *;
5
+
6
+ $uilib-card-with-list-included: false !default;
7
+ $uilib-card-with-list-highlight-included: false !default;
8
+ $uilib-card-with-list-master-included: false !default;
9
+
10
+ // Builds card with list
11
+ @mixin uilib-card-with-list() {
12
+ @if not $uilib-card-with-list-included {
13
+ $uilib-card-with-list-included: true !global;
14
+
15
+ @include uilib-card;
16
+ @include uilib-list;
17
+ @include uilib-card-with-list-master;
18
+ }
19
+ }
20
+
21
+ @mixin uilib-card-with-list-highlight() {
22
+ @if not $uilib-card-with-list-highlight-included {
23
+ $uilib-card-with-list-highlight-included: true !global;
24
+
25
+ @include uilib-highlight-panel;
26
+ @include uilib-list;
27
+ @include uilib-card-with-list-master;
28
+ }
29
+ }
30
+
31
+ @mixin uilib-card-with-list-master() {
32
+ @if not $uilib-card-with-list-master-included {
33
+ $uilib-card-with-list-master-included: true !global;
34
+
35
+ .uilib-card-with-list {
36
+ container-name: uilib-card-with-list;
37
+ container-type: inline-size;
38
+
39
+ &__content {
40
+ display: flex;
41
+ flex-direction: column;
42
+ gap: var(--uilib-spacing-600);
43
+ }
44
+
45
+ &__heading {
46
+ margin: 0;
47
+
48
+ color: var(--uilib-color-text-strong);
49
+ font: var(--uilib-typography-component-heading-xlarge-strong);
50
+ }
51
+
52
+ &__description {
53
+ margin: 0 0 var(--uilib-spacing-200);
54
+ padding-bottom: var(--uilib-spacing-200);
55
+
56
+ border-bottom: var(--uilib-stroke-size-025) var(--uilib-stroke-style-solid) var(--uilib-color-border-divider);
57
+ }
58
+
59
+ &__value {
60
+ font: var(--uilib-typography-body-medium-strong);
61
+ }
62
+
63
+ &__list {
64
+ margin-bottom: 0;
65
+
66
+ @container uilib-card-with-list (min-width: 36.25rem) {
67
+ display: block;
68
+ column-gap: calc(var(--uilib-grid-gutter-width) * 2);
69
+
70
+ column-count: 2;
71
+ column-rule: var(--uilib-stroke-size-025) var(--uilib-stroke-style-solid) var(--uilib-color-border-divider);
72
+
73
+ > li {
74
+ margin-bottom: var(--uilib-list-row-gap);
75
+
76
+ break-inside: avoid;
77
+
78
+ &:last-child {
79
+ margin-bottom: 0;
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,3 @@
1
+ // Holiday summary / index
2
+ @use 'mixins' as *;
3
+ @include uilib-holiday-summary;
@@ -0,0 +1,94 @@
1
+ // Holiday summary / _mixins
2
+ @use '../../utility/mixins' as *;
3
+ @use '../../alert/mixins' as *;
4
+ @use '../../button/mixins' as *;
5
+ @use '../../highlight-panel/mixins' as *;
6
+ @use '../../link/mixins' as *;
7
+ @use '../../list/mixins' as *;
8
+ @use '../../price-box/mixins' as *;
9
+ @use '../../skeleton/mixins' as *;
10
+
11
+ $uilib-holiday-summary-included: false !default;
12
+ $uilib-holiday-summary-skeleton-included: false !default;
13
+
14
+ @mixin uilib-holiday-summary() {
15
+ @if not $uilib-holiday-summary-included {
16
+ $uilib-holiday-summary-included: true !global;
17
+
18
+ @include uilib-alert;
19
+ @include uilib-button;
20
+ @include uilib-highlight-panel;
21
+ @include uilib-link;
22
+ @include uilib-list;
23
+ @include uilib-price-box;
24
+ @include uilib-holiday-summary-master;
25
+ }
26
+ }
27
+
28
+ @mixin uilib-holiday-summary-skeleton() {
29
+ @if not $uilib-holiday-summary-skeleton-included {
30
+ $uilib-holiday-summary-skeleton-included: true !global;
31
+
32
+ @include uilib-skeleton;
33
+ @include uilib-holiday-summary-skeleton-master;
34
+ }
35
+ }
36
+
37
+ @mixin uilib-holiday-summary-master() {
38
+ .uilib-holiday-summary {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: var(--uilib-spacing-300);
42
+
43
+ .uilib-list,
44
+ .uilib-alert {
45
+ margin: 0;
46
+ }
47
+
48
+ &__extras-link {
49
+ display: block;
50
+
51
+ width: max-content;
52
+ max-width: 100%;
53
+ }
54
+
55
+ &__footer {
56
+ padding-top: var(--uilib-spacing-200);
57
+
58
+ &:not(.uilib-price-box) .uilib-button {
59
+ width: 100%;
60
+ }
61
+ }
62
+ }
63
+
64
+ .uilib-highlight-panel:has(.uilib-holiday-summary) .uilib-highlight-panel__content--divider::after {
65
+ margin-top: var(--uilib-spacing-400);
66
+ }
67
+ }
68
+
69
+ @mixin uilib-holiday-summary-skeleton-master() {
70
+ .uilib-holiday-summary {
71
+ &__loading {
72
+ @include uilib-visually-hidden;
73
+ }
74
+
75
+ &__skeleton-header {
76
+ width: calc(100% + var(--uilib-spacing-400) * 2);
77
+ height: var(--uilib-spacing-1000);
78
+ margin: calc(var(--uilib-spacing-400) * -1) calc(var(--uilib-spacing-400) * -1) 0;
79
+
80
+ border-radius: 0;
81
+ }
82
+
83
+ &__skeleton-indent {
84
+ padding-left: calc(var(--uilib-icon-size-xsmall) + var(--uilib-spacing-200));
85
+ }
86
+ }
87
+
88
+ // Clips the bled header placeholder to the panel's own top corners instead of duplicating
89
+ // Highlight panel's radius token on a skeleton-owned element — stays correct even if that
90
+ // radius ever changes, since the panel's `__content` already carries it when there's no header.
91
+ .uilib-highlight-panel:has(.uilib-holiday-summary__skeleton-header) .uilib-highlight-panel__content {
92
+ overflow: hidden;
93
+ }
94
+ }
@@ -235,6 +235,8 @@ $uilib-review-card-included: false !default;
235
235
 
236
236
  .uilib-ratings-range-icons__details {
237
237
  grid-column: unset;
238
+
239
+ flex-basis: unset;
238
240
  }
239
241
 
240
242
  .uilib-card__content-container {
@@ -245,12 +247,8 @@ $uilib-review-card-included: false !default;
245
247
  }
246
248
  }
247
249
 
248
- .uilib-ratings-range-icons__details {
249
- flex-basis: unset;
250
- }
251
-
252
250
  .uilib-ratings-range-icons-group {
253
- display: none;
251
+ display: flex;
254
252
  }
255
253
 
256
254
  .uilib-ratings-range-icons__description {
@@ -259,10 +257,6 @@ $uilib-review-card-included: false !default;
259
257
  display: block;
260
258
  flex-basis: unset;
261
259
  }
262
-
263
- .uilib-ratings-range-icons-group {
264
- display: flex;
265
- }
266
260
  }
267
261
  }
268
262
  }
package/scss/mixins.scss CHANGED
@@ -62,7 +62,9 @@
62
62
  @forward 'lib/utility/mixins';
63
63
 
64
64
  // Pattern mixins
65
+ @forward 'lib/patterns/card-with-list/mixins';
65
66
  @forward 'lib/patterns/edit-search/mixins';
67
+ @forward 'lib/patterns/holiday-summary/mixins';
66
68
  @forward 'lib/patterns/reasons-to-book/mixins';
67
69
  @forward 'lib/patterns/review-card/mixins';
68
70
  @forward 'lib/patterns/review-summary/mixins';
@@ -11,7 +11,7 @@ $uilib-color-semantic-firstchoice: (
11
11
  core-neutral: map.get($uilib-firstchoice-primitives, 'color-neutral-10'),
12
12
  text-strong: map.get($uilib-firstchoice-primitives, 'color-greenpalm-100'),
13
13
  text-body: map.get($uilib-firstchoice-primitives, 'color-greenpalm-100'),
14
- text-link: map.get($uilib-firstchoice-primitives, 'color-pink-70'),
14
+ text-link: map.get($uilib-firstchoice-primitives, 'color-pink-75'),
15
15
  text-link-visited: map.get($uilib-firstchoice-primitives, 'color-purple-60'),
16
16
  text-link-visited-inverse: map.get($uilib-firstchoice-primitives, 'color-purple-30'),
17
17
  text-inverse: map.get($uilib-firstchoice-primitives, 'color-sand-10'),
@@ -7,6 +7,7 @@ $uilib-firstchoice-primitives: map.merge(
7
7
  color-pink-100: #55031b,
8
8
  color-pink-90: #770a2a,
9
9
  color-pink-80: #99143b,
10
+ color-pink-75: #b8194d,
10
11
  color-pink-70: #d61d5f,
11
12
  color-pink-60: #ff467c,
12
13
  color-pink-50: #ff7ea3,
@@ -28,7 +28,7 @@
28
28
  "primitive": "color-greenpalm-100"
29
29
  },
30
30
  "color-text-link": {
31
- "primitive": "color-pink-70"
31
+ "primitive": "color-pink-75"
32
32
  },
33
33
  "color-text-link-visited": {
34
34
  "primitive": "color-purple-60"
@@ -51,6 +51,7 @@ $uilib-color-semantic: (
51
51
  brand-tripadvisor-pine-green: map.get($uilib-primitives, 'color-brand-tripadvisor-pine-green'),
52
52
  brand-tripadvisor-inverse: map.get($uilib-primitives, 'color-brand-tripadvisor-trip-green'),
53
53
  brand-paypal: map.get($uilib-primitives, 'color-brand-paypal-blue'),
54
+ brand-platinum: map.get($uilib-primitives, 'color-brand-platinum-grey'),
54
55
  other-scroll-handle: map.get($uilib-primitives, 'color-neutral-50'),
55
56
  /* Deprecated */ brand-trip-advisor: map.get($uilib-primitives, 'color-brand-tripadvisor-green-60'),
56
57
  );
@@ -80,6 +80,7 @@ $uilib-primitives: (
80
80
  color-brand-tripadvisor-green-60: #00b747,
81
81
  color-brand-tripadvisor-pine-green: #002b11,
82
82
  color-brand-paypal-blue: #253b80,
83
+ color-brand-platinum-grey: #4b5560,
83
84
  color-brand-holidaycheck-blue: #0e55cd,
84
85
  color-brand-holidaycheck-yellow: #ffca3a,
85
86
  color-brand-holidaycheck-lightblue: #c7d5ed,
@@ -246,6 +246,11 @@
246
246
  "primitive": "color-brand-paypal-blue",
247
247
  "title": "PayPal",
248
248
  "darkColor": true
249
+ },
250
+ "color-brand-platinum": {
251
+ "primitive": "color-brand-platinum-grey",
252
+ "title": "Platinum",
253
+ "darkColor": true
249
254
  }
250
255
  }
251
256
  }
@@ -1464,6 +1469,12 @@
1464
1469
  "title": "Button radius",
1465
1470
  "description": "Button radius"
1466
1471
  },
1472
+ "icon-button-text-color": {
1473
+ "primitive": "uilib-color-core-interaction",
1474
+ "displayType": "color",
1475
+ "title": "Label text colour",
1476
+ "description": "Label text colour"
1477
+ },
1467
1478
  "icon-button-ghost-color": {
1468
1479
  "primitive": "uilib-color-core-interaction",
1469
1480
  "title": "Ghost text colour",
@@ -1672,6 +1683,16 @@
1672
1683
  "title": "Local product background colour",
1673
1684
  "description": "Local product background colour"
1674
1685
  },
1686
+ "info-tag-platinum-bg-color": {
1687
+ "primitive": "uilib-color-brand-platinum",
1688
+ "title": "Platinum background colour",
1689
+ "description": "Platinum background colour"
1690
+ },
1691
+ "info-tag-platinum-text-color": {
1692
+ "primitive": "uilib-color-core-neutral",
1693
+ "title": "Platinum text colour",
1694
+ "description": "Platinum text colour"
1695
+ },
1675
1696
  "info-tag-neutral-bg-color": {
1676
1697
  "primitive": "uilib-color-core-neutral",
1677
1698
  "title": "Neutral background colour",
@@ -3,8 +3,10 @@
3
3
 
4
4
  export type Theme = 'tui' | 'firstchoice' | 'crystalski';
5
5
  export type IconSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | 'xxxlarge';
6
+ export type Size = 'small' | 'medium' | 'large';
6
7
  export type IconPosition = 'none' | 'leading' | 'trailing';
7
8
  export type ButtonVariantBase = 'primary' | 'secondary' | 'promotion' | 'search';
9
+ export type IconButtonVariant = ButtonVariantBase | 'ghost' | 'control' | 'shortlist';
8
10
  export type HeadingLevel = '2' | '3' | '4' | '5' | '6';
9
11
 
10
12
  // ═══════════════════════════════════════════════════════════
@@ -87,12 +89,32 @@ export interface ButtonProps {
87
89
 
88
90
  // ─── Cards ─────────────────────────────────────────────
89
91
 
92
+ // ─── Card ──────────────────────────────────────
93
+ export interface CardProps {
94
+ extraClasses?: string[];
95
+ extraAttributes?: string[];
96
+ link?: boolean;
97
+ iconButton?: boolean;
98
+ iconButtonLabel?: boolean;
99
+ iconButtonLabelText?: string;
100
+ linkText?: string;
101
+ linkHref?: string;
102
+ supplementaryContainer?: boolean;
103
+ cardContent?: string;
104
+ supplementaryContent?: string;
105
+ theme?: Theme;
106
+ }
107
+
90
108
  // ─── Card Article ──────────────────────────────────────
91
109
  export interface CardArticleProps {
92
110
  type?: 'static' | 'link' | 'multi-link';
111
+ iconButton?: boolean;
112
+ iconButtonLabel?: boolean;
113
+ iconButtonLabelText?: string;
93
114
  elementType?: 'anchor' | 'button';
94
115
  content?: 'short' | 'medium' | 'long' | 'rich';
95
116
  headingText?: string;
117
+ theme?: Theme;
96
118
  }
97
119
 
98
120
  // ─── Card Icon ─────────────────────────────────────────
@@ -339,6 +361,7 @@ export interface InputSliderProps {
339
361
  value?: number | null;
340
362
  minLabel?: string;
341
363
  maxLabel?: string;
364
+ valueTextTemplate?: string;
342
365
  disabled?: boolean;
343
366
  }
344
367
 
@@ -420,10 +443,12 @@ export interface IconProps {
420
443
 
421
444
  // ─── Icon Button ─────────────────────────────────────────
422
445
  export interface IconButtonProps {
423
- element?: 'a' | 'button';
424
- variant?: ButtonVariantBase | 'ghost' | 'control' | 'shortlist';
425
- size?: 'small' | 'medium' | 'large';
446
+ element?: 'a' | 'button' | 'div';
447
+ variant?: IconButtonVariant;
448
+ size?: Size;
426
449
  isDisabled?: boolean;
450
+ visibleLabel?: boolean;
451
+ labelRight?: boolean;
427
452
  label?: string;
428
453
  iconAsset?: string;
429
454
  selected?: boolean;
@@ -436,8 +461,31 @@ export interface ImageSrcItem {
436
461
  size: string;
437
462
  }
438
463
 
464
+ // prettier-ignore
439
465
  export type ImageFocalPoint =
440
- 'top-left' | 'top-center' | 'top-right' | 'center-left' | 'center' | 'center-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
466
+ | 'top-left'
467
+ | 'top-center'
468
+ | 'top-right'
469
+ | 'center-left'
470
+ | 'center'
471
+ | 'center-right'
472
+ | 'bottom-left'
473
+ | 'bottom-center'
474
+ | 'bottom-right';
475
+
476
+ /**
477
+ * Responsive focal points, keyed by breakpoint (matching the library's
478
+ * breakpoint scale). `base` applies below the `xs` breakpoint; any breakpoint
479
+ * may be omitted — omitted breakpoints inherit the next smallest defined value
480
+ * (base → xs → sm → md → lg), falling back to `center`.
481
+ */
482
+ export interface ImageResponsiveFocalPoint {
483
+ base?: ImageFocalPoint;
484
+ xs?: ImageFocalPoint;
485
+ sm?: ImageFocalPoint;
486
+ md?: ImageFocalPoint;
487
+ lg?: ImageFocalPoint;
488
+ }
441
489
 
442
490
  export interface ImageProps {
443
491
  altText: string;
@@ -445,12 +493,16 @@ export interface ImageProps {
445
493
  srcset?: ImageSrcItem[];
446
494
  ratio?: 'landscape' | 'panoramic' | 'portrait' | 'square' | 'wide';
447
495
  shape?: 'rectangle' | 'rounded';
448
- focalPoint?: ImageFocalPoint;
496
+ /**
497
+ * Focal point for the image. Accepts a single value applied at all breakpoints,
498
+ * or an object with per-breakpoint values for responsive focal points.
499
+ */
500
+ focalPoint?: ImageFocalPoint | ImageResponsiveFocalPoint;
449
501
  }
450
502
 
451
503
  // ─── Info Tag ───────────────────────────────────────────
452
504
  export interface InfoTagProps {
453
- variant?: 'info' | 'neutral' | 'scarcity' | 'local-product';
505
+ variant?: 'info' | 'neutral' | 'scarcity' | 'local-product' | 'platinum';
454
506
  size?: 'small' | 'medium';
455
507
  label?: string;
456
508
  leadingIcon?: boolean;
@@ -477,6 +529,7 @@ export type ListVariant = 'bulleted' | 'numbered' | 'icon' | 'image' | 'plain';
477
529
  export type ListTextVariant = 'default' | 'strong' | 'label';
478
530
  export type ListIconSize = 'small' | 'medium' | 'large';
479
531
  export type ListLayout = 'default' | 'columns' | 'horizontal';
532
+ export type ListDensity = 'compact' | 'default' | 'spacious';
480
533
 
481
534
  export interface ListItem {
482
535
  label?: string;
@@ -490,6 +543,7 @@ export interface ListProps {
490
543
  textVariant?: ListTextVariant;
491
544
  iconSize?: ListIconSize;
492
545
  layout?: ListLayout;
546
+ density?: ListDensity;
493
547
  /** @deprecated Use `layout: 'columns'` instead. */
494
548
  columns?: boolean;
495
549
  hint?: boolean;
@@ -504,7 +558,7 @@ export interface ListProps {
504
558
 
505
559
  // ─── Loader ────────────────────────────────────────────
506
560
  export interface LoaderProps {
507
- size?: 'small' | 'medium' | 'large';
561
+ size?: Size;
508
562
  message?: string;
509
563
  messageVisible?: boolean;
510
564
  theme?: Theme;
@@ -523,7 +577,7 @@ export interface MediaButtonProps {
523
577
  // ─── Modal ─────────────────────────────────────────────
524
578
  export interface ModalProps {
525
579
  header?: string;
526
- size?: 'small' | 'medium' | 'large';
580
+ size?: Size;
527
581
  primaryButtonLabel?: string;
528
582
  secondaryButtonLabel?: string;
529
583
  closeButtonLabel?: string;
@@ -544,7 +598,7 @@ export const Currencies = ['GBP', 'EUR', 'USD', 'SEK', 'NOK', 'DKK', 'CHF'] as c
544
598
  export type Currency = (typeof Currencies)[number];
545
599
 
546
600
  export interface PriceProps {
547
- size?: 'small' | 'medium' | 'large';
601
+ size?: Size;
548
602
  currency?: Currency;
549
603
  mainUnit?: string;
550
604
  subUnit?: string;
@@ -568,6 +622,9 @@ export interface PriceBoxProps {
568
622
  divider?: boolean;
569
623
  footer?: boolean;
570
624
  footerHtml?: string;
625
+ ctaLabel?: string;
626
+ price?: Partial<PriceProps>;
627
+ extraClasses?: string[];
571
628
  }
572
629
 
573
630
  // ─── Promo Tag ──────────────────────────────────────────
@@ -838,6 +895,26 @@ export interface TravelAwareBannerProps {
838
895
  // PATTERNS
839
896
  // ═══════════════════════════════════════════════════════════
840
897
 
898
+ // ─── Card With List ────────────────────────────────────
899
+ export interface CardWithListItem {
900
+ label?: string;
901
+ hint?: string;
902
+ hintHref?: string;
903
+ }
904
+
905
+ export interface CardWithListProps {
906
+ variant?: 'basic' | 'highlight';
907
+ heading?: string;
908
+ headingLevel?: HeadingLevel;
909
+ description?: string;
910
+ density?: ListDensity;
911
+ items?: CardWithListItem[];
912
+ collapsible?: boolean;
913
+ open?: boolean;
914
+ icon?: string;
915
+ theme?: Theme;
916
+ }
917
+
841
918
  // ─── Edit Search ────────────────────────────────────────
842
919
  export interface EditSearchProps {
843
920
  variant?: 'back' | 'list';
@@ -846,6 +923,49 @@ export interface EditSearchProps {
846
923
  uniqueId?: string;
847
924
  }
848
925
 
926
+ // ─── Holiday Summary ────────────────────────────────────
927
+ export interface HolidaySummaryRow {
928
+ icon: string;
929
+ label: string;
930
+ detail?: string | string[];
931
+ editable?: boolean;
932
+ extrasLink?: boolean;
933
+ }
934
+
935
+ export interface HolidaySummaryNote {
936
+ text: string;
937
+ strong?: boolean;
938
+ }
939
+
940
+ export interface HolidaySummaryProps {
941
+ title?: string;
942
+ open?: boolean;
943
+ collapsible?: boolean;
944
+ rows?: HolidaySummaryRow[];
945
+ extrasCount?: number;
946
+ extrasHref?: string;
947
+ extrasLabel?: string;
948
+ promoTags?: boolean;
949
+ currency?: Currency;
950
+ pricePrefix?: boolean;
951
+ priceMainUnit?: string;
952
+ priceSubUnit?: string;
953
+ priceSuffix?: string;
954
+ totalPriceValue?: string;
955
+ showPrice?: boolean;
956
+ supportingText?: HolidaySummaryNote[];
957
+ ctaLabel?: string;
958
+ footerText?: string;
959
+ footerLinkLabel?: string;
960
+ footerLinkHref?: string;
961
+ editLabel?: string;
962
+ state?: 'default' | 'skeleton';
963
+ content?: string;
964
+ loadingLabel?: string;
965
+ skeletonRows?: number;
966
+ theme?: Theme;
967
+ }
968
+
849
969
  // ─── Reasons To Book ───────────────────────────────────
850
970
  export interface ReasonToBookItem {
851
971
  pictogram: string;