@tui/design-system 1.11.0 → 1.12.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 +11 -2
- package/package.json +2 -2
- package/types/components.ts +308 -196
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.12.0
|
|
4
|
+
|
|
5
|
+
### Updated
|
|
6
|
+
|
|
7
|
+
#### [Date picker](https://mwa.tui.com/browse/mwa/uilib-production/storybook/index.html?path=/docs/components-forms-date-picker--docs) and [Date range](https://mwa.tui.com/browse/mwa/uilib-production/storybook/index.html?path=/docs/components-forms-date-range--docs)
|
|
8
|
+
|
|
9
|
+
- Added `allowed-dates` attribute. Accepts a comma-separated list of ISO dates (e.g. `"2026-08-06,2026-08-10,2026-08-20"`). When set, only the listed
|
|
10
|
+
dates are selectable — all other dates are disabled. If the attribute is absent or empty, all dates within the min/max range remain selectable.
|
|
11
|
+
|
|
3
12
|
## v1.11.0
|
|
4
13
|
|
|
5
14
|
### Added
|
|
@@ -52,8 +61,8 @@
|
|
|
52
61
|
|
|
53
62
|
#### [Search card](https://mwa.tui.com/browse/mwa/uilib-production/storybook/index.html?path=/docs/components-cards-search-card--docs)
|
|
54
63
|
|
|
55
|
-
- Search card has been deprecated and replaced by Product card, a more flexible component that
|
|
56
|
-
content structure and layout.
|
|
64
|
+
- Search card has been deprecated and replaced by [Product card](?path=/docs/components-cards-product-card--docs), a more flexible component that
|
|
65
|
+
gives consuming teams greater control over the card's content structure and layout.
|
|
57
66
|
|
|
58
67
|
#### [Skeleton](https://mwa.tui.com/browse/mwa/uilib-production/storybook/index.html?path=/docs/components-skeleton--docs)
|
|
59
68
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tui/design-system",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "TUI Design System",
|
|
5
5
|
"author": "TUI Group",
|
|
6
6
|
"//dependencies": {
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"@storybook/addon-themes": "~10.4.5",
|
|
86
86
|
"@storybook/html-vite": "~10.4.5",
|
|
87
87
|
"@stylistic/eslint-plugin": "^3.1.0",
|
|
88
|
-
"@tui/cally": "1.
|
|
88
|
+
"@tui/cally": "1.1.0",
|
|
89
89
|
"@types/js-beautify": "^1.14.3",
|
|
90
90
|
"@types/node": "^24.0.0",
|
|
91
91
|
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
package/types/components.ts
CHANGED
|
@@ -7,6 +7,10 @@ export type IconPosition = 'none' | 'leading' | 'trailing';
|
|
|
7
7
|
export type ButtonVariantBase = 'primary' | 'secondary' | 'promotion' | 'search';
|
|
8
8
|
export type HeadingLevel = '2' | '3' | '4' | '5' | '6';
|
|
9
9
|
|
|
10
|
+
// ═══════════════════════════════════════════════════════════
|
|
11
|
+
// COMPONENTS
|
|
12
|
+
// ═══════════════════════════════════════════════════════════
|
|
13
|
+
|
|
10
14
|
// ─── Accordion ─────────────────────────────────────────
|
|
11
15
|
export interface AccordionProps {
|
|
12
16
|
hasImage?: 'none' | 'logo' | 'icon';
|
|
@@ -55,25 +59,6 @@ export interface AlertProps {
|
|
|
55
59
|
theme?: Theme;
|
|
56
60
|
}
|
|
57
61
|
|
|
58
|
-
// ─── Anchor Tabs ───────────────────────────────────────
|
|
59
|
-
export interface AnchorTab {
|
|
60
|
-
label: string;
|
|
61
|
-
href: string;
|
|
62
|
-
icon?: string;
|
|
63
|
-
disabled?: boolean;
|
|
64
|
-
sectionContent?: string;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export interface AnchorTabsProps {
|
|
68
|
-
icon?: string;
|
|
69
|
-
tabsLabelledby?: string;
|
|
70
|
-
tabsLabel?: string;
|
|
71
|
-
/** @deprecated Use `tabsLabelledby` instead */
|
|
72
|
-
ariaLabelledby?: string;
|
|
73
|
-
tabs?: AnchorTab[];
|
|
74
|
-
sticky?: boolean;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
62
|
// ─── Breadcrumb ────────────────────────────────────────
|
|
78
63
|
export interface BreadcrumbItem {
|
|
79
64
|
label: string;
|
|
@@ -100,6 +85,8 @@ export interface ButtonProps {
|
|
|
100
85
|
theme?: Theme;
|
|
101
86
|
}
|
|
102
87
|
|
|
88
|
+
// ─── Cards ─────────────────────────────────────────────
|
|
89
|
+
|
|
103
90
|
// ─── Card Article ──────────────────────────────────────
|
|
104
91
|
export interface CardArticleProps {
|
|
105
92
|
type?: 'static' | 'link' | 'multi-link';
|
|
@@ -118,6 +105,26 @@ export interface CardIconProps {
|
|
|
118
105
|
cardText?: string;
|
|
119
106
|
}
|
|
120
107
|
|
|
108
|
+
// ─── Card Promotion ───────────────────────────────────────
|
|
109
|
+
export interface CardPromotionProps {
|
|
110
|
+
type?: 'default' | 'promo-code';
|
|
111
|
+
condensed?: boolean;
|
|
112
|
+
headingLevel?: HeadingLevel;
|
|
113
|
+
headline?: string;
|
|
114
|
+
scarcityLabel?: string;
|
|
115
|
+
conditions?: string;
|
|
116
|
+
linkLabel?: string;
|
|
117
|
+
icon?: string;
|
|
118
|
+
code?: string;
|
|
119
|
+
copied?: boolean;
|
|
120
|
+
copyLabel?: string;
|
|
121
|
+
copiedLabel?: string;
|
|
122
|
+
expired?: boolean;
|
|
123
|
+
expiredLabel?: string;
|
|
124
|
+
announcementLabel?: string;
|
|
125
|
+
theme?: Theme;
|
|
126
|
+
}
|
|
127
|
+
|
|
121
128
|
// ─── Card Selectable ───────────────────────────────────
|
|
122
129
|
export interface CardSelectableProps {
|
|
123
130
|
disabled?: boolean;
|
|
@@ -135,25 +142,42 @@ export interface CardSelectableProps {
|
|
|
135
142
|
includeTag?: boolean;
|
|
136
143
|
}
|
|
137
144
|
|
|
138
|
-
// ───
|
|
139
|
-
export interface
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
weekLabel?: string;
|
|
145
|
-
weekLabelFull?: string;
|
|
146
|
-
hideInput?: boolean;
|
|
147
|
-
separateCal?: boolean;
|
|
148
|
-
value?: string;
|
|
149
|
-
minDate?: string;
|
|
150
|
-
maxDate?: string;
|
|
151
|
-
previousLabel?: string;
|
|
145
|
+
// ─── Carousel ──────────────────────────────────────────
|
|
146
|
+
export interface CarouselProps {
|
|
147
|
+
variant?: 'page' | 'item';
|
|
148
|
+
itemsPerSlide?: string;
|
|
149
|
+
carouselLabel?: string;
|
|
150
|
+
prevLabel?: string;
|
|
152
151
|
nextLabel?: string;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
152
|
+
announcementLabel?: string;
|
|
153
|
+
secondaryButtonLabel?: string;
|
|
154
|
+
linkLabel?: string;
|
|
155
|
+
items?: string[];
|
|
156
|
+
theme?: Theme;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ─── Product Card ──────────────────────────────────────
|
|
160
|
+
export interface ProductCardProps {
|
|
161
|
+
flagship?: boolean;
|
|
162
|
+
productLabel?: boolean;
|
|
163
|
+
gallery?: boolean;
|
|
164
|
+
quickview?: boolean;
|
|
165
|
+
promoArea?: boolean;
|
|
166
|
+
highlightsArea?: boolean;
|
|
167
|
+
toggleOpen?: string;
|
|
168
|
+
toggleClose?: string;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ─── Search Card ───────────────────────────────────────
|
|
172
|
+
export interface SearchCardProps {
|
|
173
|
+
flagship?: boolean;
|
|
174
|
+
productLabel?: boolean;
|
|
175
|
+
gallery?: boolean;
|
|
176
|
+
quickview?: boolean;
|
|
177
|
+
promoArea?: boolean;
|
|
178
|
+
highlightsArea?: boolean;
|
|
179
|
+
toggleOpen?: string;
|
|
180
|
+
toggleClose?: string;
|
|
157
181
|
}
|
|
158
182
|
|
|
159
183
|
// ─── Divider ───────────────────────────────────────────
|
|
@@ -165,6 +189,43 @@ export interface DividerProps {
|
|
|
165
189
|
theme?: Theme;
|
|
166
190
|
}
|
|
167
191
|
|
|
192
|
+
// ─── Flight Details ────────────────────────────────────
|
|
193
|
+
export interface FlightDetailsLegProps {
|
|
194
|
+
variant?: 'direct' | 'indirect' | 'indirect-concise';
|
|
195
|
+
airline?: string;
|
|
196
|
+
departureDate?: string;
|
|
197
|
+
departureDateLong?: string;
|
|
198
|
+
arrivalDate?: string;
|
|
199
|
+
arrivalDateLong?: string;
|
|
200
|
+
type?: string;
|
|
201
|
+
duration?: string;
|
|
202
|
+
durationLong?: string;
|
|
203
|
+
originTime: string;
|
|
204
|
+
originName: string;
|
|
205
|
+
originCode: string;
|
|
206
|
+
destinationTime: string;
|
|
207
|
+
destinationName: string;
|
|
208
|
+
destinationCode: string;
|
|
209
|
+
connectionTime?: string;
|
|
210
|
+
connectionTimeLong?: string;
|
|
211
|
+
connectionDetails?: string;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export interface FlightDetailsExtendedLegProps extends FlightDetailsLegProps {
|
|
215
|
+
extraLegs?: FlightDetailsLegProps[];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export interface FlightDetailsGroupProps {
|
|
219
|
+
outboundLeg: FlightDetailsExtendedLegProps;
|
|
220
|
+
returnLeg: FlightDetailsExtendedLegProps;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export interface FlightDetailsProps {
|
|
224
|
+
variant?: 'direct' | 'indirect';
|
|
225
|
+
open?: string;
|
|
226
|
+
close?: string;
|
|
227
|
+
}
|
|
228
|
+
|
|
168
229
|
// ─── Flyout Dropdown ───────────────────────────────────
|
|
169
230
|
export interface FlyoutDropdownProps {
|
|
170
231
|
variant?: 'default' | 'menu-flyout';
|
|
@@ -175,6 +236,30 @@ export interface FlyoutDropdownProps {
|
|
|
175
236
|
scrollerAriaLabel?: string;
|
|
176
237
|
}
|
|
177
238
|
|
|
239
|
+
// ─── Forms ─────────────────────────────────────────────
|
|
240
|
+
|
|
241
|
+
// ─── Datepicker ────────────────────────────────────────
|
|
242
|
+
export interface DatepickerProps {
|
|
243
|
+
rangeSelection?: boolean;
|
|
244
|
+
dualView?: boolean;
|
|
245
|
+
scrollableMobile?: boolean;
|
|
246
|
+
weekNumbers?: boolean;
|
|
247
|
+
weekLabel?: string;
|
|
248
|
+
weekLabelFull?: string;
|
|
249
|
+
hideInput?: boolean;
|
|
250
|
+
separateCal?: boolean;
|
|
251
|
+
value?: string;
|
|
252
|
+
minDate?: string;
|
|
253
|
+
maxDate?: string;
|
|
254
|
+
previousLabel?: string;
|
|
255
|
+
nextLabel?: string;
|
|
256
|
+
announceStart?: string;
|
|
257
|
+
announceRange?: string;
|
|
258
|
+
instructions?: string;
|
|
259
|
+
locale?: string;
|
|
260
|
+
allowedDates?: string;
|
|
261
|
+
}
|
|
262
|
+
|
|
178
263
|
// ─── Form Row ────────────────────────────────────────────
|
|
179
264
|
export interface FormRowProps {
|
|
180
265
|
labelText?: string;
|
|
@@ -187,90 +272,6 @@ export interface FormRowProps {
|
|
|
187
272
|
theme?: Theme;
|
|
188
273
|
}
|
|
189
274
|
|
|
190
|
-
// ─── Hero ──────────────────────────────────────────────
|
|
191
|
-
export interface HeroProps {
|
|
192
|
-
alignment?: 'left' | 'right' | 'center';
|
|
193
|
-
reduced?: boolean;
|
|
194
|
-
variant?: 'default' | 'default slim' | 'flagship' | 'flagship slim' | 'illustration';
|
|
195
|
-
heading?: string;
|
|
196
|
-
content?: string;
|
|
197
|
-
hideButton?: boolean;
|
|
198
|
-
buttonLabel?: string;
|
|
199
|
-
caveat?: string;
|
|
200
|
-
imageUrl?: string;
|
|
201
|
-
altText?: string;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// ─── Icon ────────────────────────────────────────────────
|
|
205
|
-
export interface IconProps {
|
|
206
|
-
type?: 'standard' | 'color' | 'bullet';
|
|
207
|
-
nameStandard?: string;
|
|
208
|
-
nameColor?: string;
|
|
209
|
-
nameBullet?: string;
|
|
210
|
-
size?: IconSize;
|
|
211
|
-
color?: string;
|
|
212
|
-
theme?: Theme;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// ─── Icon Button ─────────────────────────────────────────
|
|
216
|
-
export interface IconButtonProps {
|
|
217
|
-
element?: 'a' | 'button';
|
|
218
|
-
variant?: ButtonVariantBase | 'ghost' | 'control' | 'shortlist';
|
|
219
|
-
size?: 'small' | 'medium' | 'large';
|
|
220
|
-
isDisabled?: boolean;
|
|
221
|
-
label?: string;
|
|
222
|
-
iconAsset?: string;
|
|
223
|
-
selected?: boolean;
|
|
224
|
-
theme?: Theme;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// ─── Image ─────────────────────────────────────────────
|
|
228
|
-
export interface ImageSrcItem {
|
|
229
|
-
url: string;
|
|
230
|
-
size: string;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export type ImageFocalPoint =
|
|
234
|
-
'top-left' | 'top-center' | 'top-right' | 'center-left' | 'center' | 'center-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
235
|
-
|
|
236
|
-
export interface ImageProps {
|
|
237
|
-
altText: string;
|
|
238
|
-
imageUrl: string;
|
|
239
|
-
srcset?: ImageSrcItem[];
|
|
240
|
-
ratio?: 'landscape' | 'panoramic' | 'portrait' | 'square' | 'wide';
|
|
241
|
-
shape?: 'rectangle' | 'rounded';
|
|
242
|
-
focalPoint?: ImageFocalPoint;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// ─── In-Page Tabs ──────────────────────────────────────
|
|
246
|
-
export interface InPageTab {
|
|
247
|
-
label: string;
|
|
248
|
-
content?: string;
|
|
249
|
-
icon?: string;
|
|
250
|
-
disabled?: boolean;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
export interface InPageTabsProps {
|
|
254
|
-
variant?: 'left-aligned' | 'full-width';
|
|
255
|
-
icon?: string;
|
|
256
|
-
active?: string;
|
|
257
|
-
tabsLabelledby?: string;
|
|
258
|
-
tabsLabel?: string;
|
|
259
|
-
/** @deprecated Use `tabsLabelledby` instead */
|
|
260
|
-
ariaLabelledby?: string;
|
|
261
|
-
tabs?: InPageTab[];
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// ─── Info Tag ───────────────────────────────────────────
|
|
265
|
-
export interface InfoTagProps {
|
|
266
|
-
variant?: 'info' | 'neutral' | 'scarcity' | 'local-product';
|
|
267
|
-
size?: 'small' | 'medium';
|
|
268
|
-
label?: string;
|
|
269
|
-
leadingIcon?: boolean;
|
|
270
|
-
leadingIconAsset?: string;
|
|
271
|
-
theme?: Theme;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
275
|
// ─── Input Checkbox ────────────────────────────────────
|
|
275
276
|
export interface InputCheckboxProps {
|
|
276
277
|
isIndividual?: boolean;
|
|
@@ -370,6 +371,93 @@ export interface InputTextProps {
|
|
|
370
371
|
theme?: Theme;
|
|
371
372
|
}
|
|
372
373
|
|
|
374
|
+
// ─── Textarea ──────────────────────────────────────────
|
|
375
|
+
export interface TextareaProps {
|
|
376
|
+
textareaValue?: string;
|
|
377
|
+
charCount?: number;
|
|
378
|
+
disabled?: boolean;
|
|
379
|
+
theme?: Theme;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// ─── Hero ──────────────────────────────────────────────
|
|
383
|
+
export interface HeroProps {
|
|
384
|
+
alignment?: 'left' | 'right' | 'center';
|
|
385
|
+
reduced?: boolean;
|
|
386
|
+
variant?: 'default' | 'default slim' | 'flagship' | 'flagship slim' | 'illustration';
|
|
387
|
+
heading?: string;
|
|
388
|
+
content?: string;
|
|
389
|
+
hideButton?: boolean;
|
|
390
|
+
buttonLabel?: string;
|
|
391
|
+
caveat?: string;
|
|
392
|
+
imageUrl?: string;
|
|
393
|
+
altText?: string;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// ─── Highlight Panel ───────────────────────────────────
|
|
397
|
+
export interface HighlightPanelProps {
|
|
398
|
+
variant?: 'no heading' | 'default' | 'strong' | 'brand';
|
|
399
|
+
title?: string;
|
|
400
|
+
subtitle?: string;
|
|
401
|
+
icon?: string;
|
|
402
|
+
collapsible?: boolean;
|
|
403
|
+
open?: boolean;
|
|
404
|
+
content?: string;
|
|
405
|
+
footer?: string;
|
|
406
|
+
divider?: boolean;
|
|
407
|
+
theme?: Theme;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// ─── Icon ────────────────────────────────────────────────
|
|
411
|
+
export interface IconProps {
|
|
412
|
+
type?: 'standard' | 'color' | 'bullet';
|
|
413
|
+
nameStandard?: string;
|
|
414
|
+
nameColor?: string;
|
|
415
|
+
nameBullet?: string;
|
|
416
|
+
size?: IconSize;
|
|
417
|
+
color?: string;
|
|
418
|
+
theme?: Theme;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// ─── Icon Button ─────────────────────────────────────────
|
|
422
|
+
export interface IconButtonProps {
|
|
423
|
+
element?: 'a' | 'button';
|
|
424
|
+
variant?: ButtonVariantBase | 'ghost' | 'control' | 'shortlist';
|
|
425
|
+
size?: 'small' | 'medium' | 'large';
|
|
426
|
+
isDisabled?: boolean;
|
|
427
|
+
label?: string;
|
|
428
|
+
iconAsset?: string;
|
|
429
|
+
selected?: boolean;
|
|
430
|
+
theme?: Theme;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// ─── Image ─────────────────────────────────────────────
|
|
434
|
+
export interface ImageSrcItem {
|
|
435
|
+
url: string;
|
|
436
|
+
size: string;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
export type ImageFocalPoint =
|
|
440
|
+
'top-left' | 'top-center' | 'top-right' | 'center-left' | 'center' | 'center-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
441
|
+
|
|
442
|
+
export interface ImageProps {
|
|
443
|
+
altText: string;
|
|
444
|
+
imageUrl: string;
|
|
445
|
+
srcset?: ImageSrcItem[];
|
|
446
|
+
ratio?: 'landscape' | 'panoramic' | 'portrait' | 'square' | 'wide';
|
|
447
|
+
shape?: 'rectangle' | 'rounded';
|
|
448
|
+
focalPoint?: ImageFocalPoint;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// ─── Info Tag ───────────────────────────────────────────
|
|
452
|
+
export interface InfoTagProps {
|
|
453
|
+
variant?: 'info' | 'neutral' | 'scarcity' | 'local-product';
|
|
454
|
+
size?: 'small' | 'medium';
|
|
455
|
+
label?: string;
|
|
456
|
+
leadingIcon?: boolean;
|
|
457
|
+
leadingIconAsset?: string;
|
|
458
|
+
theme?: Theme;
|
|
459
|
+
}
|
|
460
|
+
|
|
373
461
|
// ─── Link ────────────────────────────────────────────────
|
|
374
462
|
export interface LinkProps {
|
|
375
463
|
href?: string;
|
|
@@ -482,26 +570,6 @@ export interface PriceBoxProps {
|
|
|
482
570
|
footerHtml?: string;
|
|
483
571
|
}
|
|
484
572
|
|
|
485
|
-
// ─── Card Promotion ───────────────────────────────────────
|
|
486
|
-
export interface CardPromotionProps {
|
|
487
|
-
type?: 'default' | 'promo-code';
|
|
488
|
-
condensed?: boolean;
|
|
489
|
-
headingLevel?: HeadingLevel;
|
|
490
|
-
headline?: string;
|
|
491
|
-
scarcityLabel?: string;
|
|
492
|
-
conditions?: string;
|
|
493
|
-
linkLabel?: string;
|
|
494
|
-
icon?: string;
|
|
495
|
-
code?: string;
|
|
496
|
-
copied?: boolean;
|
|
497
|
-
copyLabel?: string;
|
|
498
|
-
copiedLabel?: string;
|
|
499
|
-
expired?: boolean;
|
|
500
|
-
expiredLabel?: string;
|
|
501
|
-
announcementLabel?: string;
|
|
502
|
-
theme?: Theme;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
573
|
// ─── Promo Tag ──────────────────────────────────────────
|
|
506
574
|
export const PromoTagSizes = ['xsmall', 'small', 'medium', 'large', 'xlarge', 'xxlarge'] as const;
|
|
507
575
|
export type PromoTagSize = (typeof PromoTagSizes)[number];
|
|
@@ -515,7 +583,22 @@ export interface PromoTagProps {
|
|
|
515
583
|
theme?: Theme;
|
|
516
584
|
}
|
|
517
585
|
|
|
586
|
+
// ─── Ratings & Reviews ─────────────────────────────────
|
|
587
|
+
|
|
588
|
+
// ─── Ratings: shared ───────────────────────────────────
|
|
589
|
+
export type RangeIconsVariant = 'sun' | 'star' | 'tripadvisor' | 'tui-t' | 'customer' | 'holidaycheck';
|
|
590
|
+
export type RangeIconsSize = 'medium' | 'large';
|
|
591
|
+
|
|
592
|
+
export interface SchemaProps {
|
|
593
|
+
reviewCount?: number;
|
|
594
|
+
itemName?: string;
|
|
595
|
+
author?: string;
|
|
596
|
+
reviewAspect?: string;
|
|
597
|
+
}
|
|
598
|
+
|
|
518
599
|
// ─── Ratings: Customer review ─────────────────────────
|
|
600
|
+
export type NumericalType = 'rating' | 'filter';
|
|
601
|
+
|
|
519
602
|
export interface CustomerReviewProps {
|
|
520
603
|
type?: NumericalType;
|
|
521
604
|
variant?: 'brand' | 'tripadvisor';
|
|
@@ -530,7 +613,6 @@ export interface CustomerReviewProps {
|
|
|
530
613
|
}
|
|
531
614
|
|
|
532
615
|
// ─── Ratings: Numerical (9/10) ─────────────────────────
|
|
533
|
-
export type NumericalType = 'rating' | 'filter';
|
|
534
616
|
export type NumericalVariant = 'brand' | 'alt';
|
|
535
617
|
|
|
536
618
|
export interface NumericalProps {
|
|
@@ -575,7 +657,7 @@ export interface RangeBarProps {
|
|
|
575
657
|
items?: { label: string; score: number; accessibleLabel?: string }[];
|
|
576
658
|
}
|
|
577
659
|
|
|
578
|
-
// ─── Ratings: Range icons
|
|
660
|
+
// ─── Ratings: Range icons ──────────────────────────────
|
|
579
661
|
export interface RangeIconsProps {
|
|
580
662
|
variant?: RangeIconsVariant;
|
|
581
663
|
size?: RangeIconsSize;
|
|
@@ -615,17 +697,6 @@ export interface RangeIconsGroupProps {
|
|
|
615
697
|
theme?: Theme;
|
|
616
698
|
}
|
|
617
699
|
|
|
618
|
-
// ─── Ratings: shared ───────────────────────────────────
|
|
619
|
-
export type RangeIconsVariant = 'sun' | 'star' | 'tripadvisor' | 'tui-t' | 'customer' | 'holidaycheck';
|
|
620
|
-
export type RangeIconsSize = 'medium' | 'large';
|
|
621
|
-
|
|
622
|
-
export interface SchemaProps {
|
|
623
|
-
reviewCount?: number;
|
|
624
|
-
itemName?: string;
|
|
625
|
-
author?: string;
|
|
626
|
-
reviewAspect?: string;
|
|
627
|
-
}
|
|
628
|
-
|
|
629
700
|
// ─── Rich Text ─────────────────────────────────────────
|
|
630
701
|
export interface RichTextProps {
|
|
631
702
|
content?: string;
|
|
@@ -641,30 +712,6 @@ export interface ScrollerProps {
|
|
|
641
712
|
label?: string;
|
|
642
713
|
}
|
|
643
714
|
|
|
644
|
-
// ─── Search Card ───────────────────────────────────────
|
|
645
|
-
export interface SearchCardProps {
|
|
646
|
-
flagship?: boolean;
|
|
647
|
-
productLabel?: boolean;
|
|
648
|
-
gallery?: boolean;
|
|
649
|
-
quickview?: boolean;
|
|
650
|
-
promoArea?: boolean;
|
|
651
|
-
highlightsArea?: boolean;
|
|
652
|
-
toggleOpen?: string;
|
|
653
|
-
toggleClose?: string;
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
// ─── Product Card ──────────────────────────────────────
|
|
657
|
-
export interface ProductCardProps {
|
|
658
|
-
flagship?: boolean;
|
|
659
|
-
productLabel?: boolean;
|
|
660
|
-
gallery?: boolean;
|
|
661
|
-
quickview?: boolean;
|
|
662
|
-
promoArea?: boolean;
|
|
663
|
-
highlightsArea?: boolean;
|
|
664
|
-
toggleOpen?: string;
|
|
665
|
-
toggleClose?: string;
|
|
666
|
-
}
|
|
667
|
-
|
|
668
715
|
// ─── Show More Or Less ──────────────────────────────────
|
|
669
716
|
export interface ShowMoreOrLessProps {
|
|
670
717
|
isOpen?: boolean;
|
|
@@ -703,11 +750,66 @@ export interface SkeletonLayoutProps {
|
|
|
703
750
|
theme?: Theme;
|
|
704
751
|
}
|
|
705
752
|
|
|
706
|
-
// ───
|
|
707
|
-
export interface
|
|
708
|
-
|
|
709
|
-
|
|
753
|
+
// ─── Social Proofing ───────────────────────────────────
|
|
754
|
+
export interface SocialProofingProps {
|
|
755
|
+
theme?: Theme;
|
|
756
|
+
iconAsset?: string;
|
|
757
|
+
iconSize?: 'small';
|
|
758
|
+
hasIcon?: boolean;
|
|
759
|
+
closeLabel?: string;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
// ─── Tabs ──────────────────────────────────────────────
|
|
763
|
+
|
|
764
|
+
// ─── Anchor Tabs ───────────────────────────────────────
|
|
765
|
+
export interface AnchorTab {
|
|
766
|
+
label: string;
|
|
767
|
+
href: string;
|
|
768
|
+
icon?: string;
|
|
710
769
|
disabled?: boolean;
|
|
770
|
+
sectionContent?: string;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
export interface AnchorTabsProps {
|
|
774
|
+
icon?: string;
|
|
775
|
+
tabsLabelledby?: string;
|
|
776
|
+
tabsLabel?: string;
|
|
777
|
+
/** @deprecated Use `tabsLabelledby` instead */
|
|
778
|
+
ariaLabelledby?: string;
|
|
779
|
+
tabs?: AnchorTab[];
|
|
780
|
+
sticky?: boolean;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
// ─── In-Page Tabs ──────────────────────────────────────
|
|
784
|
+
export interface InPageTab {
|
|
785
|
+
label: string;
|
|
786
|
+
content?: string;
|
|
787
|
+
icon?: string;
|
|
788
|
+
disabled?: boolean;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
export interface InPageTabsProps {
|
|
792
|
+
variant?: 'left-aligned' | 'full-width';
|
|
793
|
+
icon?: string;
|
|
794
|
+
active?: string;
|
|
795
|
+
tabsLabelledby?: string;
|
|
796
|
+
tabsLabel?: string;
|
|
797
|
+
/** @deprecated Use `tabsLabelledby` instead */
|
|
798
|
+
ariaLabelledby?: string;
|
|
799
|
+
tabs?: InPageTab[];
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// ─── Timeline ───────────────────────────────────────────
|
|
803
|
+
export interface TimelineItemProps {
|
|
804
|
+
icon?: string;
|
|
805
|
+
content?: string;
|
|
806
|
+
gap?: boolean;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
export interface TimelineProps {
|
|
810
|
+
items?: TimelineItemProps[];
|
|
811
|
+
itemCount?: number;
|
|
812
|
+
gap?: boolean;
|
|
711
813
|
theme?: Theme;
|
|
712
814
|
}
|
|
713
815
|
|
|
@@ -721,7 +823,7 @@ export interface TooltipProps {
|
|
|
721
823
|
theme?: Theme;
|
|
722
824
|
}
|
|
723
825
|
|
|
724
|
-
// ─── Travel Aware Banner
|
|
826
|
+
// ─── Travel Aware Banner ────────────────────────────────
|
|
725
827
|
export interface TravelAwareBannerProps {
|
|
726
828
|
imageUrl?: string;
|
|
727
829
|
imageText?: string;
|
|
@@ -732,18 +834,11 @@ export interface TravelAwareBannerProps {
|
|
|
732
834
|
isExternal?: boolean;
|
|
733
835
|
}
|
|
734
836
|
|
|
735
|
-
//
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
iconAsset?: string;
|
|
739
|
-
iconSize?: 'small';
|
|
740
|
-
hasIcon?: boolean;
|
|
741
|
-
closeLabel?: string;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
// ─── PATTERNS ────────────────────────────────────────────
|
|
745
|
-
// ─── Edit search ────────────────────────────────────────────
|
|
837
|
+
// ═══════════════════════════════════════════════════════════
|
|
838
|
+
// PATTERNS
|
|
839
|
+
// ═══════════════════════════════════════════════════════════
|
|
746
840
|
|
|
841
|
+
// ─── Edit Search ────────────────────────────────────────
|
|
747
842
|
export interface EditSearchProps {
|
|
748
843
|
variant?: 'back' | 'list';
|
|
749
844
|
heading?: string;
|
|
@@ -751,7 +846,24 @@ export interface EditSearchProps {
|
|
|
751
846
|
uniqueId?: string;
|
|
752
847
|
}
|
|
753
848
|
|
|
754
|
-
// ───
|
|
849
|
+
// ─── Reasons To Book ───────────────────────────────────
|
|
850
|
+
export interface ReasonToBookItem {
|
|
851
|
+
pictogram: string;
|
|
852
|
+
text: string;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
export interface ReasonsToBookProps {
|
|
856
|
+
heading?: string;
|
|
857
|
+
items?: ReasonToBookItem[];
|
|
858
|
+
linkLabel?: string;
|
|
859
|
+
carouselLabel?: string;
|
|
860
|
+
prevLabel?: string;
|
|
861
|
+
nextLabel?: string;
|
|
862
|
+
announcementLabel?: string;
|
|
863
|
+
theme?: Theme;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
// ─── Review Card ───────────────────────────────────────
|
|
755
867
|
export interface ReviewCardProps {
|
|
756
868
|
layout?: 'default' | 'compact' | 'dual';
|
|
757
869
|
switchLayout?: boolean;
|
|
@@ -759,7 +871,7 @@ export interface ReviewCardProps {
|
|
|
759
871
|
brand?: 'tripadvisor' | 'customer' | 'holidaycheck';
|
|
760
872
|
}
|
|
761
873
|
|
|
762
|
-
// ─── Review Summary
|
|
874
|
+
// ─── Review Summary ────────────────────────────────────
|
|
763
875
|
export interface ReviewSummaryProps {
|
|
764
876
|
brand?: 'tripadvisor' | 'customer';
|
|
765
877
|
}
|