@tui/design-system 1.9.0 → 1.11.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 (40) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/dist/themes/crystalski/index.css +37 -33
  3. package/dist/themes/crystalski/index.css.map +1 -1
  4. package/dist/themes/firstchoice/index.css +36 -33
  5. package/dist/themes/firstchoice/index.css.map +1 -1
  6. package/dist/themes/tui/index.css +45 -41
  7. package/dist/themes/tui/index.css.map +1 -1
  8. package/package.json +7 -1
  9. package/scss/lib/accordion/_mixins.scss +17 -1
  10. package/scss/lib/cards/product/_index.scss +3 -0
  11. package/scss/lib/cards/product/_mixins.scss +351 -0
  12. package/scss/lib/cards/product/_variables.scss +9 -0
  13. package/scss/lib/cards/search/_mixins.scss +15 -2
  14. package/scss/lib/cards/selectable/_mixins.scss +34 -11
  15. package/scss/lib/forms/input-checkbox/_mixins.scss +7 -7
  16. package/scss/lib/forms/input-radio/_mixins.scss +7 -7
  17. package/scss/lib/forms/input-select/_mixins.scss +21 -2
  18. package/scss/lib/grid/_column.scss +21 -0
  19. package/scss/lib/grid/_mixins.scss +89 -0
  20. package/scss/lib/highlight-panel/_mixins.scss +16 -2
  21. package/scss/lib/info-tag/_mixins.scss +2 -0
  22. package/scss/lib/patterns/reasons-to-book/_index.scss +3 -0
  23. package/scss/lib/patterns/reasons-to-book/_mixins.scss +86 -0
  24. package/scss/lib/patterns/reasons-to-book/_variables.scss +3 -0
  25. package/scss/lib/show-more-less/_mixins.scss +15 -4
  26. package/scss/lib/skeleton/_mixins.scss +33 -12
  27. package/scss/lib/timeline/_index.scss +2 -0
  28. package/scss/lib/timeline/_mixins.scss +87 -0
  29. package/scss/mixins.scss +6 -2
  30. package/scss/reset.scss +4 -0
  31. package/scss/themes/crystalski/_overrides.scss +25 -26
  32. package/scss/themes/crystalski/index.scss +13 -10
  33. package/scss/themes/firstchoice/_overrides.scss +33 -28
  34. package/scss/themes/firstchoice/index.scss +9 -6
  35. package/scss/themes/firstchoice/theme.json +7 -0
  36. package/scss/themes/tui/_overrides.scss +8 -3
  37. package/scss/themes/tui/index.scss +12 -9
  38. package/scss/variables/base-theme.json +30 -8
  39. package/scss/variables.scss +5 -2
  40. package/types/components.ts +14 -1
@@ -83,6 +83,12 @@
83
83
  // Card - icon
84
84
  @include util.uilib-build-css-vars('card-icon', $uilib-crystalski-card-icon-variables);
85
85
 
86
+ // Card - product
87
+ @include util.uilib-build-css-vars('card-product', $uilib-crystalski-card-product-variables);
88
+
89
+ // Card - promotion
90
+ @include util.uilib-build-css-vars('card-promotion', $uilib-crystalski-card-promotion-variables);
91
+
86
92
  // Card - search
87
93
  @include util.uilib-build-css-vars('card-search', $uilib-crystalski-card-search-variables);
88
94
 
@@ -119,12 +125,12 @@
119
125
  // Form input select
120
126
  @include util.uilib-build-css-vars('input-select', $uilib-crystalski-input-select-variables);
121
127
 
122
- // Form input stepper
123
- @include util.uilib-build-css-vars('input-stepper', $uilib-crystalski-input-stepper-variables);
124
-
125
128
  // Form input slider
126
129
  @include util.uilib-build-css-vars('input-slider', $uilib-input-slider-variables);
127
130
 
131
+ // Form input stepper
132
+ @include util.uilib-build-css-vars('input-stepper', $uilib-crystalski-input-stepper-variables);
133
+
128
134
  // Form input switch
129
135
  @include util.uilib-build-css-vars('input-switch', $uilib-input-switch-variables);
130
136
 
@@ -167,9 +173,6 @@
167
173
  // Price
168
174
  @include util.uilib-build-css-vars('price', $uilib-price-variables);
169
175
 
170
- // Promo banner
171
- @include util.uilib-build-css-vars('card-promotion', $uilib-crystalski-card-promotion-variables);
172
-
173
176
  // Promo tag
174
177
  @include util.uilib-build-css-vars('promo-tag', $uilib-promo-tag-variables);
175
178
 
@@ -179,12 +182,12 @@
179
182
  // Ratings and Reviews - Percentage
180
183
  @include util.uilib-build-css-vars('ratings-percentage', $uilib-crystalski-ratings-percentage-variables);
181
184
 
182
- // Ratings and Reviews - Range Icons
183
- @include util.uilib-build-css-vars('ratings-range-icons', $uilib-crystalski-ratings-range-icons-variables);
184
-
185
185
  // Ratings and Reviews - Range bar
186
186
  @include util.uilib-build-css-vars('ratings-range-bar', $uilib-ratings-range-bar-variables);
187
187
 
188
+ // Ratings and Reviews - Range Icons
189
+ @include util.uilib-build-css-vars('ratings-range-icons', $uilib-crystalski-ratings-range-icons-variables);
190
+
188
191
  // Scroller
189
192
  @include util.uilib-build-css-vars('scroller', $uilib-scroller-variables);
190
193
 
@@ -192,7 +195,7 @@
192
195
  @include util.uilib-build-css-vars('show-more-less', $uilib-crystalski-show-more-less-variables);
193
196
 
194
197
  // Skeleton
195
- @include util.uilib-build-css-vars('skeleton', $uilib-crystalski-skeleton-variables);
198
+ @include util.uilib-build-css-vars('skeleton', $uilib-skeleton-variables);
196
199
 
197
200
  // Social proofing
198
201
  @include util.uilib-build-css-vars('social-proofing', $uilib-crystalski-social-proofing-variables);
@@ -195,6 +195,23 @@ $uilib-firstchoice-card-icon-variables: map.merge(
195
195
  )
196
196
  );
197
197
 
198
+ // Card - product
199
+ $uilib-firstchoice-card-product-variables: map.merge(
200
+ $uilib-card-product-variables,
201
+ (
202
+ highlights-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/chevron-down.svg'),
203
+ )
204
+ );
205
+
206
+ // Card - promotion
207
+ $uilib-firstchoice-card-promotion-variables: map.merge(
208
+ $uilib-card-promotion-variables,
209
+ (
210
+ cta-copy-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/copy.svg'),
211
+ cta-copied-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/checkmark-circled-filled.svg'),
212
+ )
213
+ );
214
+
198
215
  // Card - selectable
199
216
  $uilib-firstchoice-card-selectable-variables: map.merge(
200
217
  $uilib-card-selectable-variables,
@@ -208,8 +225,6 @@ $uilib-firstchoice-card-selectable-variables: map.merge(
208
225
  $uilib-firstchoice-card-search-variables: map.merge(
209
226
  $uilib-card-search-variables,
210
227
  (
211
- radius: var(--uilib-border-radius-200),
212
- radius-spacing: var(--uilib-spacing-200),
213
228
  highlights-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/chevron-down.svg'),
214
229
  )
215
230
  );
@@ -402,15 +417,6 @@ $uilib-firstchoice-price-variables: map.merge(
402
417
  )
403
418
  );
404
419
 
405
- // Promo banner
406
- $uilib-firstchoice-card-promotion-variables: map.merge(
407
- $uilib-card-promotion-variables,
408
- (
409
- cta-copy-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/copy.svg'),
410
- cta-copied-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/checkmark-circled-filled.svg'),
411
- )
412
- );
413
-
414
420
  // Ratings and Reviews - Numerical
415
421
  $uilib-firstchoice-ratings-numerical-variables: map.merge(
416
422
  $uilib-ratings-numerical-variables,
@@ -446,6 +452,22 @@ $uilib-firstchoice-show-more-less-variables: map.merge(
446
452
  )
447
453
  );
448
454
 
455
+ // Skeleton
456
+ $uilib-firstchoice-skeleton-variables: map.merge(
457
+ $uilib-skeleton-variables,
458
+ (
459
+ shimmer-color: var(--uilib-color-canvas-default),
460
+ )
461
+ );
462
+
463
+ // Social proofing
464
+ $uilib-firstchoice-social-proofing-variables: map.merge(
465
+ $uilib-social-proofing-variables,
466
+ (
467
+ close-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/cross.svg'),
468
+ )
469
+ );
470
+
449
471
  // Tabs - in-page
450
472
  $uilib-firstchoice-tabs-in-page-variables: map.merge(
451
473
  $uilib-tabs-in-page-variables,
@@ -463,20 +485,3 @@ $uilib-firstchoice-tabs-anchor-variables: map.merge(
463
485
  scroll-right-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/chevron-right.svg'),
464
486
  )
465
487
  );
466
-
467
- // Skeleton
468
- $uilib-firstchoice-skeleton-variables: map.merge(
469
- $uilib-skeleton-variables,
470
- (
471
- color: map.get($uilib-color-semantic-firstchoice, 'other-skeleton-loading'),
472
- shimmer-color: map.get($uilib-firstchoice-primitives, 'color-neutral-10'),
473
- )
474
- );
475
-
476
- // Social proofing
477
- $uilib-firstchoice-social-proofing-variables: map.merge(
478
- $uilib-social-proofing-variables,
479
- (
480
- close-icon: url('#{$uilib-assets-base-url}v3/icons/firstchoice/standard/cross.svg'),
481
- )
482
- );
@@ -83,6 +83,12 @@
83
83
  // Card - icon
84
84
  @include util.uilib-build-css-vars('card-icon', $uilib-firstchoice-card-icon-variables);
85
85
 
86
+ // Card - product
87
+ @include util.uilib-build-css-vars('card-product', $uilib-firstchoice-card-product-variables);
88
+
89
+ // Card - promotion
90
+ @include util.uilib-build-css-vars('card-promotion', $uilib-firstchoice-card-promotion-variables);
91
+
86
92
  // Card - search
87
93
  @include util.uilib-build-css-vars('card-search', $uilib-firstchoice-card-search-variables);
88
94
 
@@ -167,9 +173,6 @@
167
173
  // Price
168
174
  @include util.uilib-build-css-vars('price', $uilib-firstchoice-price-variables);
169
175
 
170
- // Promo banner
171
- @include util.uilib-build-css-vars('card-promotion', $uilib-firstchoice-card-promotion-variables);
172
-
173
176
  // Promo tag
174
177
  @include util.uilib-build-css-vars('promo-tag', $uilib-promo-tag-variables);
175
178
 
@@ -179,12 +182,12 @@
179
182
  // Ratings and Reviews - Percentage
180
183
  @include util.uilib-build-css-vars('ratings-percentage', $uilib-firstchoice-ratings-percentage-variables);
181
184
 
182
- // Ratings and Reviews - Range Icons
183
- @include util.uilib-build-css-vars('ratings-range-icons', $uilib-firstchoice-ratings-range-icons-variables);
184
-
185
185
  // Ratings and Reviews - Range bar
186
186
  @include util.uilib-build-css-vars('ratings-range-bar', $uilib-ratings-range-bar-variables);
187
187
 
188
+ // Ratings and Reviews - Range Icons
189
+ @include util.uilib-build-css-vars('ratings-range-icons', $uilib-firstchoice-ratings-range-icons-variables);
190
+
188
191
  // Scroller
189
192
  @include util.uilib-build-css-vars('scroller', $uilib-scroller-variables);
190
193
 
@@ -359,5 +359,12 @@
359
359
  "primitive": "uilib-border-radius-100"
360
360
  }
361
361
  }
362
+ },
363
+ "skeleton": {
364
+ "tokens": {
365
+ "skeleton-shimmer-color": {
366
+ "primitive": "uilib-color-canvas-default"
367
+ }
368
+ }
362
369
  }
363
370
  }
@@ -14,6 +14,14 @@ $uilib-tui-font-families: map.merge(
14
14
  )
15
15
  );
16
16
 
17
+ // Card - product
18
+ $uilib-tui-card-product-variables: map.merge(
19
+ $uilib-card-product-variables,
20
+ (
21
+ flagship-color: var(--uilib-color-brand-tui-blue),
22
+ )
23
+ );
24
+
17
25
  // Card - search
18
26
  $uilib-tui-card-search-variables: map.merge(
19
27
  $uilib-card-search-variables,
@@ -48,6 +56,3 @@ $uilib-tui-ratings-numerical-variables: map.merge(
48
56
  alt-icon-color: var(--uilib-color-brand-musement),
49
57
  )
50
58
  );
51
-
52
- // Skeleton
53
- $uilib-tui-skeleton-variables: $uilib-skeleton-variables;
@@ -83,6 +83,12 @@
83
83
  // Card - icon
84
84
  @include util.uilib-build-css-vars('card-icon', $uilib-card-icon-variables);
85
85
 
86
+ // Card - product
87
+ @include util.uilib-build-css-vars('card-product', $uilib-tui-card-product-variables);
88
+
89
+ // Card - promotion
90
+ @include util.uilib-build-css-vars('card-promotion', $uilib-card-promotion-variables);
91
+
86
92
  // Card - search
87
93
  @include util.uilib-build-css-vars('card-search', $uilib-tui-card-search-variables);
88
94
 
@@ -134,6 +140,9 @@
134
140
  // Hero
135
141
  @include util.uilib-build-css-vars('hero', $uilib-hero-variables);
136
142
 
143
+ // Highlight panel
144
+ @include util.uilib-build-css-vars('highlight-panel', $uilib-tui-highlight-panel-variables);
145
+
137
146
  // Icon button
138
147
  @include util.uilib-build-css-vars('icon-button', $uilib-icon-button-variables);
139
148
 
@@ -164,9 +173,6 @@
164
173
  // Price
165
174
  @include util.uilib-build-css-vars('price', $uilib-price-variables);
166
175
 
167
- // Promo banner
168
- @include util.uilib-build-css-vars('card-promotion', $uilib-card-promotion-variables);
169
-
170
176
  // Promo tag
171
177
  @include util.uilib-build-css-vars('promo-tag', $uilib-promo-tag-variables);
172
178
 
@@ -176,12 +182,12 @@
176
182
  // Ratings and Reviews - Percentage
177
183
  @include util.uilib-build-css-vars('ratings-percentage', $uilib-ratings-percentage-variables);
178
184
 
179
- // Ratings and Reviews - Range Icons
180
- @include util.uilib-build-css-vars('ratings-range-icons', $uilib-ratings-range-icons-variables);
181
-
182
185
  // Ratings and Reviews - Range bar
183
186
  @include util.uilib-build-css-vars('ratings-range-bar', $uilib-ratings-range-bar-variables);
184
187
 
188
+ // Ratings and Reviews - Range Icons
189
+ @include util.uilib-build-css-vars('ratings-range-icons', $uilib-ratings-range-icons-variables);
190
+
185
191
  // Scroller
186
192
  @include util.uilib-build-css-vars('scroller', $uilib-scroller-variables);
187
193
 
@@ -194,9 +200,6 @@
194
200
  // Social proofing
195
201
  @include util.uilib-build-css-vars('social-proofing', $uilib-social-proofing-variables);
196
202
 
197
- // Highlight panel
198
- @include util.uilib-build-css-vars('highlight-panel', $uilib-tui-highlight-panel-variables);
199
-
200
203
  // Tabs - in-page
201
204
  @include util.uilib-build-css-vars('tabs-in-page', $uilib-tabs-in-page-variables);
202
205
 
@@ -1093,14 +1093,8 @@
1093
1093
  },
1094
1094
  "card-search": {
1095
1095
  "tokens": {
1096
- "card-search-radius": {
1097
- "primitive": "uilib-border-radius-400",
1098
- "displayType": "radius",
1099
- "title": "Card radius",
1100
- "description": "Card radius"
1101
- },
1102
1096
  "card-search-radius-spacing": {
1103
- "primitive": "uilib-border-spacing-400",
1097
+ "primitive": "uilib-card-radius",
1104
1098
  "displayType": "size",
1105
1099
  "title": "Spacing required for card radius",
1106
1100
  "description": "Spacing required for card radius"
@@ -1125,6 +1119,34 @@
1125
1119
  }
1126
1120
  }
1127
1121
  },
1122
+ "card-product": {
1123
+ "tokens": {
1124
+ "card-product-radius-spacing": {
1125
+ "primitive": "uilib-card-radius",
1126
+ "displayType": "size",
1127
+ "title": "Spacing required for card radius",
1128
+ "description": "Spacing required for card radius"
1129
+ },
1130
+ "card-product-flagship-color": {
1131
+ "primitive": "uilib-color-core-brand-strong",
1132
+ "displayType": "color",
1133
+ "title": "Background for flagship wrapper",
1134
+ "description": "Background for flagship wrapper"
1135
+ },
1136
+ "card-product-flagship-text-color": {
1137
+ "primitive": "uilib-color-text-inverse",
1138
+ "displayType": "color",
1139
+ "title": "Text colour for flagship wrapper",
1140
+ "description": "Text colour for flagship wrapper"
1141
+ },
1142
+ "card-product-highlights-icon": {
1143
+ "displayType": "icon",
1144
+ "title": "Icon for show/hide within highlight section",
1145
+ "description": "Icon for show/hide within highlight section",
1146
+ "longValue": true
1147
+ }
1148
+ }
1149
+ },
1128
1150
  "datepicker": {
1129
1151
  "displayType": "color",
1130
1152
  "tokens": {
@@ -2610,7 +2632,7 @@
2610
2632
  "description": "Skeleton loading colour"
2611
2633
  },
2612
2634
  "skeleton-shimmer-color": {
2613
- "primitive": "color-neutral-20",
2635
+ "primitive": "uilib-color-canvas-contrast",
2614
2636
  "title": "Skeleton shimmer colour",
2615
2637
  "description": "Skeleton shimmer colour"
2616
2638
  }
@@ -22,11 +22,14 @@
22
22
  @forward 'lib/breadcrumb/variables';
23
23
  @forward 'lib/alert/variables';
24
24
  @forward 'lib/button/variables';
25
- @forward 'lib/cards/card/variables';
26
25
  @forward 'lib/cards/article/variables';
26
+ @forward 'lib/cards/card/variables';
27
27
  @forward 'lib/cards/carousel/variables';
28
28
  @forward 'lib/cards/icon/variables';
29
+ @forward 'lib/cards/promotion/variables';
29
30
  @forward 'lib/cards/search/variables';
31
+ @forward 'lib/cards/product/variables';
32
+ @forward 'lib/cards/promotion/variables';
30
33
  @forward 'lib/cards/selectable/variables';
31
34
  @forward 'lib/divider/variables';
32
35
  @forward 'lib/flight-details/variables';
@@ -57,7 +60,6 @@
57
60
  @forward 'lib/modal/variables';
58
61
  @forward 'lib/pagination/variables';
59
62
  @forward 'lib/price/variables';
60
- @forward 'lib/cards/promotion/variables';
61
63
  @forward 'lib/promo-tag/variables';
62
64
  @forward 'lib/ratings-reviews/numerical/variables';
63
65
  @forward 'lib/ratings-reviews/percentage/variables';
@@ -75,5 +77,6 @@
75
77
 
76
78
  // Pattern variables
77
79
  @forward 'lib/patterns/edit-search/variables';
80
+ @forward 'lib/patterns/reasons-to-book/variables';
78
81
  @forward 'lib/patterns/review-card/variables';
79
82
  @forward 'lib/patterns/review-summary/variables';
@@ -20,7 +20,7 @@ export interface AccordionProps {
20
20
  }
21
21
 
22
22
  export interface AccordionGroupProps extends AccordionProps {
23
- group?: 'none' | 'default' | 'divider';
23
+ group?: 'none' | 'default' | 'divider' | 'timeline';
24
24
  groupLength?: number;
25
25
  intro?: string;
26
26
  toggleOpen?: string;
@@ -132,6 +132,7 @@ export interface CardSelectableProps {
132
132
  selectedIndex?: number;
133
133
  clickableArea?: 'input' | 'card';
134
134
  includeImage?: boolean;
135
+ includeTag?: boolean;
135
136
  }
136
137
 
137
138
  // ─── Datepicker ────────────────────────────────────────
@@ -652,6 +653,18 @@ export interface SearchCardProps {
652
653
  toggleClose?: string;
653
654
  }
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
+
655
668
  // ─── Show More Or Less ──────────────────────────────────
656
669
  export interface ShowMoreOrLessProps {
657
670
  isOpen?: boolean;