@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.
- package/CHANGELOG.md +106 -0
- package/dist/themes/crystalski/index.css +4 -0
- package/dist/themes/crystalski/index.css.map +1 -1
- package/dist/themes/firstchoice/index.css +5 -1
- package/dist/themes/firstchoice/index.css.map +1 -1
- package/dist/themes/tui/index.css +5 -1
- package/dist/themes/tui/index.css.map +1 -1
- package/package.json +15 -15
- package/scss/lib/cards/article/_mixins.scss +76 -29
- package/scss/lib/cards/card/_mixins.scss +76 -0
- package/scss/lib/flyout-dropdown/_mixins.scss +2 -0
- package/scss/lib/grid/_column.scss +11 -0
- package/scss/lib/grid/_container.scss +11 -0
- package/scss/lib/grid/_mixins.scss +30 -0
- package/scss/lib/grid/_variables.scss +1 -0
- package/scss/lib/highlight-panel/_mixins.scss +4 -2
- package/scss/lib/icon-button/_mixins.scss +232 -55
- package/scss/lib/icon-button/_variables.scss +1 -0
- package/scss/lib/image/_mixins.scss +56 -28
- package/scss/lib/info-tag/_mixins.scss +7 -1
- package/scss/lib/info-tag/_variables.scss +2 -0
- package/scss/lib/list/_mixins.scss +12 -2
- package/scss/lib/list/_variables.scss +1 -1
- package/scss/lib/modal/_mixins.scss +9 -3
- package/scss/lib/patterns/card-with-list/_index.scss +4 -0
- package/scss/lib/patterns/card-with-list/_mixins.scss +86 -0
- package/scss/lib/patterns/holiday-summary/_index.scss +3 -0
- package/scss/lib/patterns/holiday-summary/_mixins.scss +94 -0
- package/scss/lib/patterns/review-card/_mixins.scss +3 -9
- package/scss/mixins.scss +2 -0
- package/scss/themes/firstchoice/_colors.scss +1 -1
- package/scss/themes/firstchoice/_primitives.scss +1 -0
- package/scss/themes/firstchoice/theme.json +1 -1
- package/scss/variables/_colors.scss +1 -0
- package/scss/variables/_primitives.scss +1 -0
- package/scss/variables/base-theme.json +21 -0
- 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,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:
|
|
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-
|
|
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'),
|
|
@@ -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",
|
package/types/components.ts
CHANGED
|
@@ -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?:
|
|
425
|
-
size?:
|
|
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
|
-
|
|
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
|
-
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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;
|