@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
@@ -219,3 +219,33 @@
219
219
  content: none;
220
220
  }
221
221
  }
222
+
223
+ /* --- Grid Alignment ------- */
224
+
225
+ /// Vertical alignment of all grid items within their cells (container-level).
226
+ /// @param {String} $value - start | center | end | stretch
227
+
228
+ @mixin uilib-grid-align-items($value) {
229
+ align-items: $value;
230
+ }
231
+
232
+ /// Horizontal alignment of all grid items within their cells (container-level).
233
+ /// @param {String} $value - start | center | end | stretch
234
+
235
+ @mixin uilib-grid-justify-items($value) {
236
+ justify-items: $value;
237
+ }
238
+
239
+ /// Vertical alignment of a single grid item within its cell (column-level).
240
+ /// @param {String} $value - start | center | end | stretch
241
+
242
+ @mixin uilib-grid-col-align-self($value) {
243
+ align-self: $value;
244
+ }
245
+
246
+ /// Horizontal alignment of a single grid item within its cell (column-level).
247
+ /// @param {String} $value - start | center | end | stretch
248
+
249
+ @mixin uilib-grid-col-justify-self($value) {
250
+ justify-self: $value;
251
+ }
@@ -9,3 +9,4 @@ $uilib-grid-selectors-custom: () !default;
9
9
  $uilib-grid-selectors-config: map.merge($uilib-grid-selectors-default, $uilib-grid-selectors-custom);
10
10
  $uilib-grid-selector: map.get($uilib-grid-selectors-config, 'grid');
11
11
  $uilib-grid-selector-column: map.get($uilib-grid-selectors-config, 'column');
12
+ $uilib-grid-align-values: start, center, end, stretch !default;
@@ -52,12 +52,14 @@ $uilib-highlight-panel-included: false !default;
52
52
 
53
53
  &::after {
54
54
  position: absolute;
55
- inset: auto 0 0;
55
+
56
+ // fixed pixel issue
57
+ inset: auto 0 -0.05rem;
56
58
  content: '';
57
59
 
58
60
  display: block;
59
61
 
60
- height: var(--uilib-spacing-400);
62
+ height: calc(var(--uilib-spacing-400) + 0.05rem);
61
63
 
62
64
  border: var(--uilib-stroke-size-025) solid var(--uilib-highlight-panel-border-color);
63
65
  border-bottom-width: 0;
@@ -16,125 +16,216 @@ $uilib-icon-button-included: false !default;
16
16
 
17
17
  @mixin uilib-icon-button-master() {
18
18
  .uilib-icon-button {
19
+ --uilib-icon-button-small-offset: calc(((var(--uilib-icon-button-size-small) - var(--uilib-icon-size-xsmall)) / 2) * -1);
20
+ --uilib-icon-button-medium-offset: calc(((var(--uilib-icon-button-size-medium) - var(--uilib-icon-size-medium)) / 2) * -1);
21
+ --uilib-icon-button-large-offset: calc(((var(--uilib-icon-button-size-large) - var(--uilib-icon-size-xlarge)) / 2) * -1);
22
+
19
23
  position: relative;
20
24
 
21
25
  display: inline-flex;
22
26
  flex-flow: row nowrap;
23
- justify-content: center;
27
+ gap: 0;
28
+ justify-content: flex-end;
24
29
  align-items: center;
25
30
 
26
- width: var(--uilib-icon-button-size-medium);
27
31
  padding: 0;
28
- aspect-ratio: 1/1;
29
32
 
30
- color: var(--uilib-icon-button-primary-color);
33
+ color: var(--uilib-icon-button-text-color);
31
34
  font: var(--uilib-typography-label-medium);
32
35
  text-decoration: none;
33
36
 
34
- border-radius: var(--uilib-icon-button-radius);
37
+ border: 0;
35
38
 
36
- background: var(--uilib-icon-button-primary-bg-color);
39
+ background: transparent;
37
40
 
38
41
  cursor: pointer;
39
42
 
40
43
  appearance: none;
41
44
 
42
- @media (prefers-reduced-motion: no-preference) {
43
- transition:
44
- border-color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
45
- background-color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
46
- color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
47
- transform var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium);
45
+ &::after {
46
+ content: '';
47
+
48
+ order: 2;
49
+
50
+ flex-grow: 0;
51
+ flex-shrink: 0;
52
+
53
+ width: var(--uilib-icon-button-size-medium);
54
+ padding: 0;
55
+ aspect-ratio: 1/1;
56
+
57
+ border-radius: var(--uilib-icon-button-radius);
58
+
59
+ background: var(--uilib-icon-button-primary-bg-color);
60
+
61
+ @media (prefers-reduced-motion: no-preference) {
62
+ transition:
63
+ border-color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
64
+ background-color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
65
+ color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
66
+ transform var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium);
67
+ }
48
68
  }
49
69
 
50
- &:hover:not(:disabled, .uilib-icon-button--disabled) {
70
+ &:hover:not(:disabled, .uilib-icon-button--disabled)::after {
51
71
  background: var(--uilib-icon-button-primary-hover-bg-color);
52
72
  }
53
73
 
54
74
  &:focus-visible {
55
75
  @include uilib-focus;
76
+
77
+ /* stylelint-disable-next-line order/order */
78
+ &::before {
79
+ border-radius: var(--uilib-icon-button-radius);
80
+ }
56
81
  }
57
82
 
58
83
  &:active:not(:disabled, .uilib-icon-button--disabled) {
59
- transform: scale(0.96);
84
+ &::after {
85
+ transform: scale(0.96);
86
+ }
87
+
88
+ .uilib-icon-button__icon {
89
+ transform: translate(var(--uilib-icon-button-medium-offset), 0) scale(0.96);
90
+ }
91
+ }
92
+
93
+ &:is(div) {
94
+ pointer-events: none;
95
+
96
+ &::after,
97
+ &::before,
98
+ .uilib-icon-button__icon {
99
+ pointer-events: none;
100
+ }
60
101
  }
61
102
 
62
103
  &__content {
63
- flex-grow: 1;
104
+ order: 1;
105
+
106
+ padding-right: var(--uilib-spacing-300);
107
+
108
+ font: var(--uilib-typography-label-large);
109
+ text-align: left;
64
110
  }
65
111
 
66
112
  &__icon {
113
+ position: relative;
114
+ z-index: 1;
115
+
116
+ order: 3;
117
+
118
+ flex-shrink: 0;
119
+
120
+ margin-left: calc((var(--uilib-icon-size-medium)) * -1);
121
+
122
+ color: var(--uilib-icon-button-primary-color);
123
+
124
+ transform: translate(var(--uilib-icon-button-medium-offset), 0);
125
+
67
126
  pointer-events: none;
127
+
128
+ @media (prefers-reduced-motion: no-preference) {
129
+ transition:
130
+ border-color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
131
+ background-color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
132
+ color var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium),
133
+ transform var(--uilib-motion-timing-inout) var(--uilib-motion-duration-medium);
134
+ }
68
135
  }
69
136
  }
70
137
 
71
138
  .uilib-icon-button--ghost {
72
- color: var(--uilib-icon-button-ghost-color);
73
-
74
- background: var(--uilib-icon-button-ghost-bg-color);
139
+ &::after {
140
+ background: var(--uilib-icon-button-ghost-bg-color);
141
+ }
75
142
 
76
- &:hover:not(:disabled, .uilib-icon-button--disabled) {
143
+ &:hover:not(:disabled, .uilib-icon-button--disabled)::after {
77
144
  background: var(--uilib-icon-button-ghost-hover-bg-color);
78
145
  }
146
+
147
+ .uilib-icon-button__icon {
148
+ color: var(--uilib-icon-button-ghost-color);
149
+ }
79
150
  }
80
151
 
81
152
  .uilib-icon-button--secondary {
82
- color: var(--uilib-icon-button-secondary-color);
83
-
84
- border: var(--uilib-stroke-size-050) var(--uilib-stroke-style-solid) var(--uilib-icon-button-secondary-color);
153
+ &::after {
154
+ border: var(--uilib-stroke-size-050) var(--uilib-stroke-style-solid) var(--uilib-icon-button-secondary-color);
85
155
 
86
- background: var(--uilib-icon-button-secondary-bg-color);
156
+ background: var(--uilib-icon-button-secondary-bg-color);
157
+ }
87
158
 
88
- &:hover:not(:disabled, .uilib-icon-button--disabled) {
159
+ &:hover:not(:disabled, .uilib-icon-button--disabled)::after {
89
160
  background: var(--uilib-icon-button-secondary-hover-bg-color);
90
161
  }
162
+
163
+ .uilib-icon-button__icon {
164
+ color: var(--uilib-icon-button-secondary-color);
165
+ }
91
166
  }
92
167
 
93
168
  .uilib-icon-button--control {
94
- color: var(--uilib-icon-button-control-color);
169
+ &::after {
170
+ background: var(--uilib-icon-button-control-bg-color);
95
171
 
96
- background: var(--uilib-icon-button-control-bg-color);
97
-
98
- box-shadow: var(--uilib-elevation-200);
172
+ box-shadow: var(--uilib-elevation-200);
173
+ }
99
174
 
100
- &:hover:not(:disabled, .uilib-icon-button--disabled) {
175
+ &:hover:not(:disabled, .uilib-icon-button--disabled)::after {
101
176
  background: var(--uilib-icon-button-control-hover-bg-color);
102
177
  }
178
+
179
+ .uilib-icon-button__icon {
180
+ color: var(--uilib-icon-button-control-color);
181
+ }
103
182
  }
104
183
 
105
184
  .uilib-icon-button--promotion {
106
- color: var(--uilib-icon-button-promotion-color);
107
-
108
- background: var(--uilib-icon-button-promotion-bg-color);
185
+ &::after {
186
+ background: var(--uilib-icon-button-promotion-bg-color);
187
+ }
109
188
 
110
- &:hover:not(:disabled, .uilib-icon-button--disabled) {
189
+ &:hover:not(:disabled, .uilib-icon-button--disabled)::after {
111
190
  background: var(--uilib-icon-button-promotion-hover-bg-color);
112
191
  }
192
+
193
+ .uilib-icon-button__icon {
194
+ color: var(--uilib-icon-button-promotion-color);
195
+ }
113
196
  }
114
197
 
115
198
  .uilib-icon-button--search {
116
- color: var(--uilib-icon-button-search-color);
117
-
118
- background: var(--uilib-icon-button-search-bg-color);
199
+ &::after {
200
+ background: var(--uilib-icon-button-search-bg-color);
201
+ }
119
202
 
120
- &:hover:not(:disabled, .uilib-icon-button--disabled) {
203
+ &:hover:not(:disabled, .uilib-icon-button--disabled)::after {
121
204
  background: var(--uilib-icon-button-search-hover-bg-color);
122
205
  }
206
+
207
+ .uilib-icon-button__icon {
208
+ color: var(--uilib-icon-button-search-color);
209
+ }
123
210
  }
124
211
 
125
212
  .uilib-icon-button--shortlist {
126
- color: var(--uilib-icon-button-shortlist-color);
213
+ &::after {
214
+ background: var(--uilib-icon-button-shortlist-bg-color);
127
215
 
128
- background: var(--uilib-icon-button-shortlist-bg-color);
129
-
130
- box-shadow: 0 0 var(--uilib-spacing-100) 0 var(--uilib-color-other-elevation);
216
+ box-shadow: 0 0 var(--uilib-spacing-100) 0 var(--uilib-color-other-elevation);
217
+ }
131
218
 
132
- &:hover:not(:disabled, .uilib-icon-button--disabled) {
219
+ &:hover:not(:disabled, .uilib-icon-button--disabled)::after {
133
220
  background: var(--uilib-icon-button-shortlist-hover-bg-color);
134
221
  }
135
222
 
136
- .uilib-icon-button__icon--selected {
137
- display: none;
223
+ .uilib-icon-button__icon {
224
+ color: var(--uilib-icon-button-shortlist-color);
225
+
226
+ &--selected {
227
+ display: none;
228
+ }
138
229
  }
139
230
 
140
231
  &[aria-pressed='true'] .uilib-icon-button__icon {
@@ -148,33 +239,119 @@ $uilib-icon-button-included: false !default;
148
239
 
149
240
  .uilib-icon-button:disabled,
150
241
  .uilib-icon-button--disabled {
151
- color: var(--uilib-icon-button-disabled-color);
242
+ cursor: default;
152
243
 
153
- border-color: var(--uilib-icon-button-disabled-bg-color);
244
+ &::after {
245
+ border-color: var(--uilib-icon-button-disabled-bg-color);
154
246
 
155
- background: var(--uilib-icon-button-disabled-bg-color);
247
+ background: var(--uilib-icon-button-disabled-bg-color);
156
248
 
157
- box-shadow: none;
249
+ box-shadow: none;
250
+ }
158
251
 
159
- cursor: default;
252
+ .uilib-icon-button__icon {
253
+ color: var(--uilib-icon-button-disabled-color);
254
+ }
255
+
256
+ .uilib-icon-button__content {
257
+ color: var(--uilib-icon-button-disabled-color);
258
+ }
160
259
  }
161
260
 
162
261
  .uilib-icon-button--ghost:disabled,
163
262
  .uilib-icon-button--ghost.uilib-icon-button--disabled {
164
- color: var(--uilib-icon-button-disabled-bg-color);
263
+ cursor: default;
165
264
 
166
- border-color: var(--uilib-icon-button-ghost-bg-color);
265
+ &::after {
266
+ color: var(--uilib-icon-button-disabled-bg-color);
167
267
 
168
- background: var(--uilib-icon-button-ghost-bg-color);
268
+ border-color: var(--uilib-icon-button-ghost-bg-color);
169
269
 
170
- cursor: default;
270
+ background: var(--uilib-icon-button-ghost-bg-color);
271
+ }
272
+
273
+ .uilib-icon-button__icon {
274
+ color: var(--uilib-icon-button-disabled-color);
275
+ }
276
+
277
+ .uilib-icon-button__content {
278
+ color: var(--uilib-icon-button-disabled-color);
279
+ }
171
280
  }
172
281
 
173
282
  .uilib-icon-button--small {
174
- width: var(--uilib-icon-button-size-small);
283
+ &::after {
284
+ width: var(--uilib-icon-button-size-small);
285
+ }
286
+
287
+ .uilib-icon-button__content {
288
+ padding-right: var(--uilib-spacing-200);
289
+
290
+ font: var(--uilib-typography-label-medium);
291
+ }
292
+
293
+ .uilib-icon-button__icon {
294
+ margin-left: calc((var(--uilib-icon-size-xsmall)) * -1);
295
+
296
+ transform: translate(var(--uilib-icon-button-small-offset), 0);
297
+ }
298
+
299
+ /* stylelint-disable-next-line order/order */
300
+ &:active:not(:disabled, .uilib-icon-button--disabled) {
301
+ .uilib-icon-button__icon {
302
+ transform: translate(var(--uilib-icon-button-small-offset), 0) scale(0.96);
303
+ }
304
+ }
175
305
  }
176
306
 
177
307
  .uilib-icon-button--large {
178
- width: var(--uilib-icon-button-size-large);
308
+ &::after {
309
+ width: var(--uilib-icon-button-size-large);
310
+ }
311
+
312
+ .uilib-icon-button__content {
313
+ padding-right: var(--uilib-spacing-400);
314
+
315
+ font: var(--uilib-typography-component-heading-xlarge);
316
+ }
317
+
318
+ .uilib-icon-button__icon {
319
+ margin-left: calc((var(--uilib-icon-size-xlarge)) * -1);
320
+
321
+ transform: translate(var(--uilib-icon-button-large-offset), 0);
322
+ }
323
+
324
+ /* stylelint-disable-next-line order/order */
325
+ &:active:not(:disabled, .uilib-icon-button--disabled) {
326
+ .uilib-icon-button__icon {
327
+ transform: translate(var(--uilib-icon-button-large-offset), 0) scale(0.96);
328
+ }
329
+ }
330
+ }
331
+
332
+ .uilib-icon-button--label-right {
333
+ justify-content: flex-start;
334
+
335
+ &::after {
336
+ order: 1;
337
+ }
338
+
339
+ .uilib-icon-button__icon {
340
+ order: 2;
341
+ }
342
+
343
+ .uilib-icon-button__content {
344
+ order: 3;
345
+
346
+ padding: 0 0 0 var(--uilib-spacing-300);
347
+ }
348
+
349
+ &.uilib-icon-button--small .uilib-icon-button__content {
350
+ padding-left: var(--uilib-spacing-200);
351
+ }
352
+
353
+ &.uilib-icon-button--large .uilib-icon-button__content {
354
+ padding-left: var(--uilib-spacing-400);
355
+ }
179
356
  }
180
357
  }
@@ -5,6 +5,7 @@
5
5
  // Icon button specific variables to allow theming
6
6
  $uilib-icon-button-variables: (
7
7
  radius: var(--uilib-border-radius-pill),
8
+ text-color: var(--uilib-color-core-interaction),
8
9
  ghost-color: var(--uilib-color-core-interaction),
9
10
  ghost-bg-color: transparent,
10
11
  ghost-hover-bg-color: var(--uilib-color-other-secondary-button-hover-state),
@@ -1,5 +1,6 @@
1
1
  // image / _mixins
2
2
  @use '../../variables/env-variables' as *;
3
+ @use '../grid/mixins' as *;
3
4
 
4
5
  $uilib-image-included: false !default;
5
6
 
@@ -18,6 +19,9 @@ $uilib-image-included: false !default;
18
19
  }
19
20
 
20
21
  .uilib-image {
22
+ // Active focal point — cascades from the largest set breakpoint down to base, then center.
23
+ --uilib-image-focus: var(--uilib-image-focus-base, center);
24
+
21
25
  display: flex;
22
26
 
23
27
  border-radius: var(--uilib-image-rectangle);
@@ -51,53 +55,77 @@ $uilib-image-included: false !default;
51
55
  border-radius: var(--uilib-image-rounded);
52
56
  }
53
57
 
54
- img {
55
- width: 100%;
56
- height: 100%;
57
-
58
- font-size: 0;
59
-
60
- object-fit: cover;
61
- object-position: center;
62
- }
63
-
58
+ // Static focal point classes — set the base var, applied at all breakpoints.
64
59
  /* stylelint-disable-next-line order/order */
65
60
  &--focus {
66
- &-top-left img {
67
- object-position: top left;
61
+ &-top-left {
62
+ --uilib-image-focus-base: top left;
68
63
  }
69
64
 
70
- &-top-center img {
71
- object-position: top center;
65
+ &-top-center {
66
+ --uilib-image-focus-base: top center;
72
67
  }
73
68
 
74
- &-top-right img {
75
- object-position: top right;
69
+ &-top-right {
70
+ --uilib-image-focus-base: top right;
76
71
  }
77
72
 
78
- &-center-left img {
79
- object-position: center left;
73
+ &-center-left {
74
+ --uilib-image-focus-base: center left;
80
75
  }
81
76
 
82
- &-center img {
83
- object-position: center;
77
+ &-center {
78
+ --uilib-image-focus-base: center;
84
79
  }
85
80
 
86
- &-center-right img {
87
- object-position: center right;
81
+ &-center-right {
82
+ --uilib-image-focus-base: center right;
88
83
  }
89
84
 
90
- &-bottom-left img {
91
- object-position: bottom left;
85
+ &-bottom-left {
86
+ --uilib-image-focus-base: bottom left;
92
87
  }
93
88
 
94
- &-bottom-center img {
95
- object-position: bottom center;
89
+ &-bottom-center {
90
+ --uilib-image-focus-base: bottom center;
96
91
  }
97
92
 
98
- &-bottom-right img {
99
- object-position: bottom right;
93
+ &-bottom-right {
94
+ --uilib-image-focus-base: bottom right;
100
95
  }
101
96
  }
97
+
98
+ // Per-breakpoint overrides, each falling back to the smaller breakpoints.
99
+ @include uilib-breakpoint(xs) {
100
+ --uilib-image-focus: var(--uilib-image-focus-xs, var(--uilib-image-focus-base, center));
101
+ }
102
+
103
+ @include uilib-breakpoint(sm) {
104
+ --uilib-image-focus: var(--uilib-image-focus-sm, var(--uilib-image-focus-xs, var(--uilib-image-focus-base, center)));
105
+ }
106
+
107
+ @include uilib-breakpoint(md) {
108
+ --uilib-image-focus: var(
109
+ --uilib-image-focus-md,
110
+ var(--uilib-image-focus-sm, var(--uilib-image-focus-xs, var(--uilib-image-focus-base, center)))
111
+ );
112
+ }
113
+
114
+ @include uilib-breakpoint(lg) {
115
+ --uilib-image-focus: var(
116
+ --uilib-image-focus-lg,
117
+ var(--uilib-image-focus-md, var(--uilib-image-focus-sm, var(--uilib-image-focus-xs, var(--uilib-image-focus-base, center))))
118
+ );
119
+ }
120
+
121
+ img {
122
+ width: 100%;
123
+ height: 100%;
124
+
125
+ font-size: 0;
126
+
127
+ object-fit: cover;
128
+ object-position: var(--uilib-image-focus, center);
129
+ }
102
130
  }
103
131
  }
@@ -37,7 +37,7 @@ $uilib-info-tag-list-included: false !default;
37
37
  padding: var(--uilib-spacing-050) var(--uilib-spacing-100); /* 2px 4px */
38
38
 
39
39
  color: var(--uilib-info-tag-text-color);
40
- font: var(--uilib-typography-label-xsmall);
40
+ font: var(--uilib-typography-label-small);
41
41
  text-align: left;
42
42
  text-decoration: none;
43
43
 
@@ -69,6 +69,12 @@ $uilib-info-tag-list-included: false !default;
69
69
  background: var(--uilib-info-tag-local-product-bg-color);
70
70
  }
71
71
 
72
+ .uilib-info-tag--platinum {
73
+ color: var(--uilib-info-tag-platinum-text-color);
74
+
75
+ background: var(--uilib-info-tag-platinum-bg-color);
76
+ }
77
+
72
78
  // Tooltip variant styles
73
79
  .uilib-info-tag .uilib-tooltip.uilib-tooltip--icon {
74
80
  margin: calc(var(--uilib-spacing-200) * -1);
@@ -8,6 +8,8 @@ $uilib-info-tag-variables: (
8
8
  text-color: var(--uilib-color-text-strong),
9
9
  info-bg-color: var(--uilib-color-status-info-surface),
10
10
  local-product-bg-color: var(--uilib-color-brand-local),
11
+ platinum-bg-color: var(--uilib-color-brand-platinum),
12
+ platinum-text-color: var(--uilib-color-core-neutral),
11
13
  neutral-bg-color: var(--uilib-color-core-neutral),
12
14
  scarcity-bg-color: var(--uilib-color-status-warning-surface),
13
15
  ) !default;
@@ -142,7 +142,15 @@ $uilib-list-included: false !default;
142
142
  &--horizontal {
143
143
  display: flex;
144
144
  flex-flow: row wrap;
145
- gap: var(--uilib-spacing-200) var(--uilib-spacing-400);
145
+ gap: var(--uilib-list-row-gap) var(--uilib-spacing-400);
146
+ }
147
+
148
+ &--compact {
149
+ --uilib-list-row-gap: 0;
150
+ }
151
+
152
+ &--spacious {
153
+ --uilib-list-row-gap: var(--uilib-spacing-400);
146
154
  }
147
155
 
148
156
  &__title {
@@ -196,9 +204,11 @@ $uilib-list-included: false !default;
196
204
 
197
205
  /* For internal use to support richText component */
198
206
  @mixin uilib-list-base() {
207
+ --uilib-list-row-gap: var(--uilib-spacing-200);
208
+
199
209
  display: flex;
200
210
  flex-flow: column;
201
- gap: var(--uilib-spacing-200) var(--uilib-spacing-500);
211
+ gap: var(--uilib-list-row-gap) var(--uilib-spacing-500);
202
212
 
203
213
  margin: 0 0 var(--uilib-spacing-400);
204
214
  padding: 0;
@@ -6,6 +6,6 @@ $uilib-list-variables: (
6
6
  bullet-icon: url('#{$uilib-assets-base-url}v3/icons/tui/standard/list-item.svg'),
7
7
  image-radius: var(--uilib-border-radius-100),
8
8
  image-alt-radius: var(--uilib-border-radius-circle),
9
- multiline-title-font: var(--uilib-typography-label-medium),
9
+ multiline-title-font: var(--uilib-typography-body-medium-strong),
10
10
  highlight-color: var(--uilib-color-text-promotion),
11
11
  ) !default;
@@ -119,7 +119,8 @@ $uilib-modal-included: false !default;
119
119
  justify-content: end;
120
120
  align-items: center;
121
121
 
122
- slot[name='price'] {
122
+ slot[name='price'],
123
+ [slot='price'] {
123
124
  display: flex;
124
125
 
125
126
  margin-right: auto;
@@ -138,8 +139,11 @@ $uilib-modal-included: false !default;
138
139
  }
139
140
  }
140
141
 
141
- // show divider only if price slot is used
142
- &:not(:has(slot[name='price'] *)) .uilib-divider {
142
+ // show divider only if price slot has content
143
+ // V1: slot[name='price'] always exists in the template — use :not(:empty)
144
+ // to check it actually has distributed content.
145
+ // V2: [slot='price'] only exists when the consumer provides it.
146
+ &:not(:has(slot[name='price']:not(:empty), [slot='price'])) .uilib-divider {
143
147
  display: none;
144
148
  }
145
149
  }
@@ -149,6 +153,8 @@ $uilib-modal-included: false !default;
149
153
  mask-image: var(--uilib-modal-close-icon);
150
154
  }
151
155
 
156
+ // Scroll lock fallback for v1 (v2 handles this in JS).
157
+ // TODO(next-major): remove once v1 is retired.
152
158
  body:has(&[open]) {
153
159
  overflow: hidden;
154
160
  }
@@ -0,0 +1,4 @@
1
+ // Card with list / index
2
+ @use 'mixins' as *;
3
+ @include uilib-card-with-list;
4
+ @include uilib-card-with-list-highlight;