@tui/design-system 1.8.0 → 1.10.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 (34) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/dist/themes/crystalski/index.css +16 -13
  3. package/dist/themes/crystalski/index.css.map +1 -1
  4. package/dist/themes/firstchoice/index.css +16 -13
  5. package/dist/themes/firstchoice/index.css.map +1 -1
  6. package/dist/themes/tui/index.css +12 -9
  7. package/dist/themes/tui/index.css.map +1 -1
  8. package/package.json +7 -2
  9. package/scss/lib/cards/selectable/_mixins.scss +34 -11
  10. package/scss/lib/forms/input-checkbox/_mixins.scss +6 -7
  11. package/scss/lib/forms/input-radio/_mixins.scss +6 -7
  12. package/scss/lib/forms/input-select/_mixins.scss +21 -2
  13. package/scss/lib/forms/input-stepper/_mixins.scss +1 -3
  14. package/scss/lib/grid/_column.scss +21 -0
  15. package/scss/lib/grid/_mixins.scss +89 -0
  16. package/scss/lib/info-tag/_mixins.scss +2 -0
  17. package/scss/lib/patterns/edit-search/_index.scss +3 -0
  18. package/scss/lib/patterns/edit-search/_mixins.scss +98 -0
  19. package/scss/lib/patterns/edit-search/_variables.scss +7 -0
  20. package/scss/lib/patterns/reasons-to-book/_index.scss +3 -0
  21. package/scss/lib/patterns/reasons-to-book/_mixins.scss +86 -0
  22. package/scss/lib/patterns/reasons-to-book/_variables.scss +3 -0
  23. package/scss/lib/patterns/review-summary/_index.scss +3 -0
  24. package/scss/lib/patterns/review-summary/_mixins.scss +156 -0
  25. package/scss/lib/patterns/review-summary/_variables.scss +3 -0
  26. package/scss/lib/ratings-reviews/range-bar/_mixins.scss +3 -2
  27. package/scss/mixins.scss +5 -0
  28. package/scss/themes/crystalski/index.scss +4 -0
  29. package/scss/themes/firstchoice/index.scss +4 -0
  30. package/scss/themes/tui/index.scss +4 -0
  31. package/scss/variables/_grid.scss +3 -3
  32. package/scss/variables/base-theme.json +21 -0
  33. package/scss/variables.scss +4 -1
  34. package/types/components.ts +34 -0
@@ -47,6 +47,27 @@
47
47
  #{$uilib-grid-selector-column}--order#{$prefix}-reset {
48
48
  @include uilib-grid-col-order-reset;
49
49
  }
50
+
51
+ // Dividers
52
+ #{$uilib-grid-selector-column}--divider#{$prefix}-left {
53
+ @include uilib-grid-col-divider-left;
54
+ }
55
+
56
+ #{$uilib-grid-selector-column}--divider#{$prefix}-top {
57
+ @include uilib-grid-col-divider-top;
58
+ }
59
+
60
+ #{$uilib-grid-selector-column}--divider#{$prefix}-left-none {
61
+ @include uilib-grid-col-divider-left-none;
62
+ }
63
+
64
+ #{$uilib-grid-selector-column}--divider#{$prefix}-top-none {
65
+ @include uilib-grid-col-divider-top-none;
66
+ }
67
+
68
+ #{$uilib-grid-selector-column}--divider#{$prefix}-none {
69
+ @include uilib-grid-col-divider-none;
70
+ }
50
71
  }
51
72
 
52
73
  @include uilib-generate-grid-for-resolution;
@@ -130,3 +130,92 @@
130
130
  @mixin uilib-grid-col-order-reset {
131
131
  order: 0;
132
132
  }
133
+
134
+ /* --- Grid Column Dividers ------- */
135
+
136
+ /// Adds a vertical divider (left edge) to a grid column using ::after.
137
+ /// Positioned in the centre of the column gap.
138
+ /// Can be combined with uilib-grid-col-divider-top on the same element.
139
+ ///
140
+ /// @example scss - Usage
141
+ /// .my-col { @include uilib-grid-col-divider-left; }
142
+ ///
143
+ /// @example scss - Both dividers on the same column
144
+ /// .my-col {
145
+ /// @include uilib-grid-col-divider-left;
146
+ /// @include uilib-grid-col-divider-top;
147
+ /// }
148
+
149
+ @mixin uilib-grid-col-divider-left {
150
+ position: relative;
151
+
152
+ &::after {
153
+ position: absolute;
154
+ top: 0;
155
+ left: calc(var(--uilib-grid-gutter-width) / -2);
156
+ bottom: 0;
157
+ content: '';
158
+
159
+ border-left: var(--uilib-stroke-size-025) var(--uilib-stroke-style-solid) var(--uilib-color-border-divider);
160
+
161
+ pointer-events: none;
162
+ }
163
+ }
164
+
165
+ /// Adds a horizontal divider (top edge) to a grid column using ::before.
166
+ /// Positioned in the centre of the row gap.
167
+ /// Can be combined with uilib-grid-col-divider-left on the same element.
168
+ ///
169
+ /// @example scss - Usage
170
+ /// .my-col { @include uilib-grid-col-divider-top; }
171
+
172
+ @mixin uilib-grid-col-divider-top {
173
+ position: relative;
174
+
175
+ &::before {
176
+ position: absolute;
177
+ top: calc(var(--uilib-grid-gutter-height) / -2);
178
+ left: 0;
179
+ right: 0;
180
+ content: '';
181
+
182
+ border-top: var(--uilib-stroke-size-025) var(--uilib-stroke-style-solid) var(--uilib-color-border-divider);
183
+
184
+ pointer-events: none;
185
+ }
186
+ }
187
+
188
+ /// Removes the left (vertical) divider from a grid column.
189
+
190
+ @mixin uilib-grid-col-divider-left-none {
191
+ &::after {
192
+ content: none;
193
+ }
194
+ }
195
+
196
+ /// Removes the top (horizontal) divider from a grid column.
197
+
198
+ @mixin uilib-grid-col-divider-top-none {
199
+ &::before {
200
+ content: none;
201
+ }
202
+ }
203
+
204
+ /// Removes both dividers from a grid column.
205
+ ///
206
+ /// @example scss - Remove all dividers at a breakpoint
207
+ /// .my-col {
208
+ /// @include uilib-grid-col-divider-left;
209
+ /// @include uilib-grid-col-divider-top;
210
+ /// @include uilib-breakpoint(md) { @include uilib-grid-col-divider-none; }
211
+ /// }
212
+
213
+ @mixin uilib-grid-col-divider-none {
214
+ &::after {
215
+ content: none;
216
+ }
217
+
218
+ &::before {
219
+ content: none;
220
+ }
221
+ }
@@ -47,6 +47,8 @@ $uilib-info-tag-list-included: false !default;
47
47
  }
48
48
 
49
49
  .uilib-info-tag__content {
50
+ min-width: 0;
51
+
50
52
  line-height: 1rem;
51
53
  overflow-wrap: break-word;
52
54
  }
@@ -0,0 +1,3 @@
1
+ // Edit search / index
2
+ @use 'mixins' as *;
3
+ @include uilib-edit-search;
@@ -0,0 +1,98 @@
1
+ // Edit search / _mixins
2
+ @use 'sass:map';
3
+ @use 'variables' as *;
4
+ @use '../../../variables/breakpoints' as *;
5
+ @use '../../utility/mixins' as *;
6
+ @use '../../button/mixins' as *;
7
+ @use '../../link/mixins' as *;
8
+ @use '../../list/mixins' as *;
9
+
10
+ $uilib-edit-search-included: false !default;
11
+
12
+ @mixin uilib-edit-search() {
13
+ @if not $uilib-edit-search-included {
14
+ $uilib-edit-search-included: true !global;
15
+
16
+ @include uilib-button;
17
+ @include uilib-link;
18
+ @include uilib-list;
19
+ @include uilib-edit-search-master;
20
+ }
21
+ }
22
+
23
+ @mixin uilib-edit-search-master() {
24
+ .uilib-edit-search {
25
+ display: flex;
26
+ flex-flow: row nowrap;
27
+ gap: var(--uilib-spacing-600);
28
+ justify-content: space-between;
29
+ align-items: center;
30
+
31
+ padding: var(--uilib-spacing-200) var(--uilib-spacing-200) var(--uilib-spacing-200) var(--uilib-spacing-400);
32
+
33
+ color: var(--uilib-edit-search-text-color);
34
+
35
+ border-radius: var(--uilib-edit-search-radius);
36
+
37
+ background: var(--uilib-edit-search-bg-color);
38
+
39
+ &__content {
40
+ display: flex;
41
+ flex-flow: column;
42
+ gap: var(--uilib-spacing-100);
43
+ }
44
+
45
+ &__heading {
46
+ font: var(--uilib-typography-label-medium-strong);
47
+
48
+ &--hidden {
49
+ @include uilib-visually-hidden;
50
+ }
51
+ }
52
+
53
+ &__link:visited {
54
+ color: var(--uilib-color-text-link);
55
+ text-decoration-color: var(--uilib-link-decoration-color);
56
+ }
57
+
58
+ &__button {
59
+ align-self: flex-end;
60
+ }
61
+
62
+ &__list {
63
+ margin: 0;
64
+ }
65
+
66
+ /* stylelint-disable-next-line order/order */
67
+ @media (max-width: #{map.get($uilib-breakpoints, md)}) {
68
+ &__list {
69
+ display: -webkit-box;
70
+
71
+ text-align: left;
72
+ text-overflow: ellipsis;
73
+
74
+ overflow: hidden;
75
+ -webkit-line-clamp: 2;
76
+ line-clamp: 2;
77
+ -webkit-box-orient: vertical;
78
+
79
+ > li {
80
+ display: inline;
81
+
82
+ padding-left: 0;
83
+
84
+ &::before,
85
+ .uilib-icon {
86
+ display: none;
87
+ }
88
+
89
+ &:not(:last-child)::after {
90
+ content: ' | ';
91
+
92
+ display: inline;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,7 @@
1
+ // Edit search / _variables
2
+
3
+ $uilib-edit-search-variables: (
4
+ radius: var(--uilib-border-radius-400),
5
+ bg-color: var(--uilib-color-core-surface),
6
+ text-color: var(--uilib-color-text-strong),
7
+ ) !default;
@@ -0,0 +1,3 @@
1
+ // Reasons to book / index
2
+ @use 'mixins' as *;
3
+ @include uilib-reasons-to-book;
@@ -0,0 +1,86 @@
1
+ // Reasons to book / _mixins
2
+ @use 'variables' as *;
3
+ @use '../../link/mixins' as *;
4
+ @use '../../cards/carousel/mixins' as *;
5
+
6
+ $uilib-reasons-to-book-included: false !default;
7
+
8
+ @mixin uilib-reasons-to-book() {
9
+ @if not $uilib-reasons-to-book-included {
10
+ $uilib-reasons-to-book-included: true !global;
11
+
12
+ @include uilib-link;
13
+ @include uilib-carousel;
14
+ @include uilib-reasons-to-book-master;
15
+ }
16
+ }
17
+
18
+ @mixin uilib-reasons-to-book-master() {
19
+ .uilib-reasons-to-book {
20
+ container-name: uilib-reasons-to-book;
21
+ container-type: inline-size;
22
+
23
+ &__heading {
24
+ margin: 0 0 var(--uilib-spacing-400);
25
+
26
+ color: var(--uilib-color-text-strong);
27
+ font: var(--uilib-typography-heading-xxlarge);
28
+ }
29
+
30
+ // Reason cards keep their own natural (content-driven) width and simply overflow/scroll
31
+ // rather than being evenly redivided to fill the viewport — unlike the generic Carousel
32
+ // `item` slide, which defaults to `flex: 0 0 calc(100cqw / visible)`. The trailing divider
33
+ // line is a `::after` pseudo-element on the slide itself (not a separate Divider element),
34
+ // so this internal `gap` (not the track gap, which Embla would mismeasure) provides the
35
+ // space between the reason content and its line — and the line is automatically omitted on
36
+ // the last slide via `:not(:last-child)`, with no JS "is this the last item" check needed.
37
+ .uilib-carousel__slide {
38
+ flex: 0 0 auto;
39
+ gap: var(--uilib-spacing-400);
40
+
41
+ &:not(:last-child)::after {
42
+ content: '';
43
+
44
+ flex: 0 0 auto;
45
+ align-self: stretch;
46
+
47
+ border-inline-end: var(--uilib-stroke-size-025) solid var(--uilib-color-border-divider);
48
+ }
49
+ }
50
+
51
+ &__reason {
52
+ display: flex;
53
+ gap: var(--uilib-spacing-200);
54
+ align-items: center;
55
+ }
56
+
57
+ &__pictogram {
58
+ flex: 0 0 auto;
59
+
60
+ width: 4.5rem; /* 72 / 16 — fixed pictogram size per Figma, no matching icon-size token */
61
+ height: 4.5rem;
62
+ }
63
+
64
+ &__text {
65
+ max-width: 9.875rem; /* 158 / 16 — keeps the ~238px card pitch from Figma; wraps to 2 lines */
66
+ margin: 0;
67
+
68
+ color: var(--uilib-color-text-strong);
69
+ font: var(--uilib-typography-component-heading-small-strong);
70
+ }
71
+
72
+ // Compact reflow: below this container width the reason card centres its text and stacks
73
+ // the pictogram above it. Driven by the pattern's own width, not the viewport, so it works
74
+ // the same whether the carousel is full-bleed or nested in a narrower column.
75
+ // 34.1875rem = 547px — the top of the Compact range in Figma (288–547px); Static/Scrollable
76
+ // (548px+) stay above it.
77
+ /* stylelint-disable-next-line order/order */
78
+ @container uilib-reasons-to-book (max-width: 34.1875rem) {
79
+ .uilib-reasons-to-book__reason {
80
+ flex-direction: column;
81
+
82
+ text-align: center;
83
+ }
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,3 @@
1
+ // Reasons to book / _variables
2
+
3
+ $uilib-reasons-to-book-variables: () !default;
@@ -0,0 +1,3 @@
1
+ // Review summary / index
2
+ @use 'mixins' as *;
3
+ @include uilib-review-summary;
@@ -0,0 +1,156 @@
1
+ // Review summary / _mixins
2
+ @use 'variables' as *;
3
+ @use '../../utility/mixins' as *;
4
+ @use '../../divider/mixins' as *;
5
+ @use '../../link/mixins' as *;
6
+ @use '../../ratings-reviews/range-bar/mixins' as *;
7
+ @use '../../ratings-reviews/range-icons/mixins' as *;
8
+ @use '../../ratings-reviews/range-icons-group/mixins' as *;
9
+
10
+ $uilib-review-summary-included: false !default;
11
+
12
+ @mixin uilib-review-summary() {
13
+ @if not $uilib-review-summary-included {
14
+ $uilib-review-summary-included: true !global;
15
+
16
+ @include uilib-divider;
17
+ @include uilib-link;
18
+ @include uilib-ratings-range-bar;
19
+ @include uilib-ratings-range-icons;
20
+ @include uilib-ratings-range-icons-group;
21
+ @include uilib-review-summary-master;
22
+ }
23
+ }
24
+
25
+ @mixin uilib-review-summary-master() {
26
+ .uilib-review-summary {
27
+ container-name: uilib-review-summary;
28
+ container-type: inline-size;
29
+
30
+ display: grid;
31
+ grid-template-columns: auto 1fr;
32
+ gap: var(--uilib-spacing-400) var(--uilib-spacing-200);
33
+ align-items: center;
34
+
35
+ &__title {
36
+ color: var(--uilib-color-text-strong);
37
+ font: var(--uilib-typography-heading-small);
38
+ }
39
+
40
+ &__logo {
41
+ height: 1.125rem; /* 18 / 16 */
42
+ }
43
+
44
+ &__overall-rating,
45
+ &__divider,
46
+ &__breakdown,
47
+ &__link {
48
+ grid-column: 1 / -1;
49
+ }
50
+
51
+ &__overall-rating {
52
+ display: grid;
53
+ grid-template-columns: auto 1fr;
54
+ gap: var(--uilib-spacing-100) var(--uilib-spacing-400);
55
+ align-items: start;
56
+
57
+ max-width: max-content;
58
+
59
+ .uilib-ratings-range-icons__value {
60
+ grid-row: 1 / span 3;
61
+
62
+ font: var(--uilib-typography-heading-xxlarge);
63
+ }
64
+
65
+ .uilib-ratings-range-icons__score {
66
+ grid-row: unset;
67
+ }
68
+
69
+ .uilib-ratings-range-icons__details {
70
+ grid-column: unset;
71
+ }
72
+ }
73
+
74
+ &__divider {
75
+ width: 100%;
76
+ }
77
+
78
+ &__visually-hidden {
79
+ @include uilib-visually-hidden;
80
+ }
81
+
82
+ &__breakdown {
83
+ display: flex;
84
+ flex-flow: column;
85
+ gap: var(--uilib-spacing-800) var(--uilib-spacing-1600);
86
+ align-items: flex-start;
87
+
88
+ width: 100%;
89
+
90
+ .uilib-ratings-range-bar-group,
91
+ .uilib-ratings-range-icons-group {
92
+ width: 100%;
93
+ max-width: 20rem; /* 320 / 16 */
94
+ margin: 0;
95
+ }
96
+ }
97
+
98
+ &__link {
99
+ margin-top: var(--uilib-spacing-200);
100
+ }
101
+
102
+ /* stylelint-disable-next-line order/order */
103
+ @container uilib-review-summary (min-width: 22rem) {
104
+ &__overall-rating {
105
+ .uilib-ratings-range-icons__value {
106
+ min-width: 3ex; /* 52px / 16 */
107
+ }
108
+ }
109
+
110
+ &__breakdown {
111
+ display: grid;
112
+ grid-template-columns: auto 1fr;
113
+ gap: var(--uilib-spacing-800) var(--uilib-spacing-400);
114
+ align-items: start;
115
+
116
+ &::before {
117
+ grid-row: 1 / span 2;
118
+ grid-column: 1;
119
+
120
+ content: '';
121
+
122
+ display: block;
123
+
124
+ width: 3ex; /* 52px / 16 */
125
+ height: 100%;
126
+
127
+ font: var(--uilib-typography-heading-xxlarge);
128
+ }
129
+
130
+ .uilib-ratings-range-bar-group,
131
+ .uilib-ratings-range-icons-group {
132
+ grid-column: 2;
133
+ }
134
+ }
135
+ }
136
+
137
+ @container uilib-review-summary (min-width: 42rem) {
138
+ &__breakdown {
139
+ grid-template-columns: auto 1fr 1fr;
140
+ gap: var(--uilib-spacing-1600);
141
+
142
+ max-width: 44.5rem;
143
+
144
+ &::before {
145
+ grid-row: 1 / span 1;
146
+
147
+ margin-right: calc(var(--uilib-spacing-1200) * -1);
148
+ }
149
+
150
+ .uilib-ratings-range-icons-group {
151
+ grid-column: 3;
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
@@ -0,0 +1,3 @@
1
+ // Review summary / _variables
2
+
3
+ $uilib-review-summary-variables: () !default;
@@ -133,9 +133,10 @@ $uilib-ratings-range-bar-included: false !default;
133
133
  }
134
134
 
135
135
  &__bar {
136
+ $margin: calc((1rem * var(--uilib-line-height-body)) - 1rem);
136
137
  width: var(--uilib-ratings-range-bar-bar-width);
137
- height: calc(1rem - var(--uilib-stroke-size-050));
138
- margin-top: var(--uilib-spacing-050);
138
+ height: 1rem;
139
+ margin: calc(#{$margin} / 2) 0;
139
140
 
140
141
  border: var(--uilib-stroke-size-025) var(--uilib-stroke-style-solid) var(--uilib-ratings-range-bar-bar-color);
141
142
  border-radius: var(--uilib-border-radius-pill);
package/scss/mixins.scss CHANGED
@@ -57,4 +57,9 @@
57
57
  @forward 'lib/travel-aware-banner/mixins';
58
58
  @forward 'lib/typography/mixins';
59
59
  @forward 'lib/utility/mixins';
60
+
61
+ // Pattern mixins
62
+ @forward 'lib/patterns/edit-search/mixins';
63
+ @forward 'lib/patterns/reasons-to-book/mixins';
60
64
  @forward 'lib/patterns/review-card/mixins';
65
+ @forward 'lib/patterns/review-summary/mixins';
@@ -208,4 +208,8 @@
208
208
 
209
209
  // Travel Aware Banner
210
210
  @include util.uilib-build-css-vars('travel-aware-banner', $uilib-travel-aware-banner-variables);
211
+
212
+ // Patterns
213
+ // Edit search
214
+ @include util.uilib-build-css-vars('edit-search', $uilib-edit-search-variables);
211
215
  }
@@ -208,4 +208,8 @@
208
208
 
209
209
  // Travel Aware Banner
210
210
  @include util.uilib-build-css-vars('travel-aware-banner', $uilib-travel-aware-banner-variables);
211
+
212
+ // Patterns
213
+ // Edit search
214
+ @include util.uilib-build-css-vars('edit-search', $uilib-edit-search-variables);
211
215
  }
@@ -208,4 +208,8 @@
208
208
 
209
209
  // Travel Aware Banner
210
210
  @include util.uilib-build-css-vars('travel-aware-banner', $uilib-travel-aware-banner-variables);
211
+
212
+ // Patterns
213
+ // Edit search
214
+ @include util.uilib-build-css-vars('edit-search', $uilib-edit-search-variables);
211
215
  }
@@ -1,11 +1,11 @@
1
1
  // grid
2
2
  $uilib-grid-size: 0.25rem !default; // 4px
3
3
  $uilib-grid-columns: 12 !default;
4
- $uilib-grid-gutter-width: $uilib-grid-size * 4; // 16px
5
- $uilib-grid-gutter-height: $uilib-grid-size * 4; // 16px
4
+ $uilib-grid-gutter-width: $uilib-grid-size * 4 !default; // 16px
5
+ $uilib-grid-gutter-height: $uilib-grid-size * 4 !default; // 16px
6
6
 
7
7
  // layout
8
- $uilib-layout-max-width: 80rem; // 1280px
8
+ $uilib-layout-max-width: 80rem !default; // 1280px
9
9
  $uilib-layout-app-height: 100dvh;
10
10
 
11
11
  @mixin uilib-grid-base-vars() {
@@ -2769,5 +2769,26 @@
2769
2769
  "description": "Travel Aware banner border radius"
2770
2770
  }
2771
2771
  }
2772
+ },
2773
+ "edit-search": {
2774
+ "displayType": "color",
2775
+ "tokens": {
2776
+ "edit-search-radius": {
2777
+ "displayType": "radius",
2778
+ "primitive": "uilib-border-radius-400",
2779
+ "title": "Edit search border radius",
2780
+ "description": "Edit search border radius"
2781
+ },
2782
+ "edit-search-bg-color": {
2783
+ "primitive": "--uilib-color-core-surface",
2784
+ "title": "Edit search background colour",
2785
+ "description": "Edit search background colour"
2786
+ },
2787
+ "edit-search-text-color": {
2788
+ "primitive": "--uilib-color-text-strong",
2789
+ "title": "Edit search text colour",
2790
+ "description": "Edit search text colour"
2791
+ }
2792
+ }
2772
2793
  }
2773
2794
  }
@@ -73,5 +73,8 @@
73
73
  @forward 'lib/travel-aware-banner/variables';
74
74
  @forward 'lib/typography/variables';
75
75
 
76
- // pattern variables
76
+ // Pattern variables
77
+ @forward 'lib/patterns/edit-search/variables';
78
+ @forward 'lib/patterns/reasons-to-book/variables';
77
79
  @forward 'lib/patterns/review-card/variables';
80
+ @forward 'lib/patterns/review-summary/variables';
@@ -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 ────────────────────────────────────────
@@ -389,6 +390,13 @@ export type ListTextVariant = 'default' | 'strong' | 'label';
389
390
  export type ListIconSize = 'small' | 'medium' | 'large';
390
391
  export type ListLayout = 'default' | 'columns' | 'horizontal';
391
392
 
393
+ export interface ListItem {
394
+ label?: string;
395
+ iconSize?: ListIconSize;
396
+ iconAsset?: string;
397
+ imageUrl?: string;
398
+ }
399
+
392
400
  export interface ListProps {
393
401
  variant?: ListVariant;
394
402
  textVariant?: ListTextVariant;
@@ -403,6 +411,7 @@ export interface ListProps {
403
411
  altShape?: boolean;
404
412
  start?: number;
405
413
  theme?: Theme;
414
+ extraClasses?: string[];
406
415
  }
407
416
 
408
417
  // ─── Loader ────────────────────────────────────────────
@@ -563,6 +572,7 @@ export interface RangeBarProps {
563
572
  /** @deprecated Theme is no longer supported for this component */
564
573
  theme?: Theme;
565
574
  isGroup?: boolean;
575
+ items?: { label: string; score: number; accessibleLabel?: string }[];
566
576
  }
567
577
 
568
578
  // ─── Ratings: Range icons (Sun/Star/TUI/TripAdvisor/TUI-T) ─
@@ -695,6 +705,7 @@ export interface TooltipProps {
695
705
  label?: string;
696
706
  content?: string;
697
707
  isInverse?: boolean;
708
+ tooltipRoot?: string;
698
709
  theme?: Theme;
699
710
  }
700
711
 
@@ -717,3 +728,26 @@ export interface SocialProofingProps {
717
728
  hasIcon?: boolean;
718
729
  closeLabel?: string;
719
730
  }
731
+
732
+ // ─── PATTERNS ────────────────────────────────────────────
733
+ // ─── Edit search ────────────────────────────────────────────
734
+
735
+ export interface EditSearchProps {
736
+ variant?: 'back' | 'list';
737
+ heading?: string;
738
+ listItems?: ListItem[];
739
+ uniqueId?: string;
740
+ }
741
+
742
+ // ─── Review Card ───────────────────────────────────────────
743
+ export interface ReviewCardProps {
744
+ layout?: 'default' | 'compact' | 'dual';
745
+ switchLayout?: boolean;
746
+ breakpoint?: number;
747
+ brand?: 'tripadvisor' | 'customer' | 'holidaycheck';
748
+ }
749
+
750
+ // ─── Review Summary ────────────────────────────────────────
751
+ export interface ReviewSummaryProps {
752
+ brand?: 'tripadvisor' | 'customer';
753
+ }