@tui/design-system 1.6.0 → 1.8.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 (49) hide show
  1. package/CHANGELOG.md +186 -1
  2. package/dist/themes/crystalski/index.css +38 -1
  3. package/dist/themes/crystalski/index.css.map +1 -1
  4. package/dist/themes/firstchoice/index.css +38 -1
  5. package/dist/themes/firstchoice/index.css.map +1 -1
  6. package/dist/themes/tui/index.css +40 -3
  7. package/dist/themes/tui/index.css.map +1 -1
  8. package/package.json +11 -10
  9. package/scss/lib/accordion/_mixins.scss +13 -6
  10. package/scss/lib/active-tag/_mixins.scss +16 -4
  11. package/scss/lib/cards/carousel/_index.scss +3 -0
  12. package/scss/lib/cards/carousel/_mixins.scss +164 -0
  13. package/scss/lib/cards/carousel/_variables.scss +13 -0
  14. package/scss/lib/cards/promotion/_index.scss +3 -0
  15. package/scss/lib/cards/promotion/_mixins.scss +275 -0
  16. package/scss/lib/cards/promotion/_variables.scss +14 -0
  17. package/scss/lib/cards/selectable/_mixins.scss +1 -1
  18. package/scss/lib/flyout-dropdown/_variables.scss +0 -1
  19. package/scss/lib/forms/input-switch/_mixins.scss +12 -6
  20. package/scss/lib/highlight-panel/_index.scss +2 -0
  21. package/scss/lib/highlight-panel/_mixins.scss +244 -0
  22. package/scss/lib/highlight-panel/_variables.scss +21 -0
  23. package/scss/lib/list/_mixins.scss +140 -70
  24. package/scss/lib/list/_variables.scss +2 -0
  25. package/scss/lib/modal/_variables.scss +1 -4
  26. package/scss/lib/patterns/review-card/_index.scss +3 -0
  27. package/scss/lib/patterns/review-card/_mixins.scss +283 -0
  28. package/scss/lib/patterns/review-card/_variables.scss +3 -0
  29. package/scss/lib/ratings-reviews/range-icons/_mixins.scss +16 -2
  30. package/scss/lib/ratings-reviews/range-icons/_variables.scss +2 -0
  31. package/scss/lib/skeleton/_variables.scss +2 -6
  32. package/scss/lib/tabs/_mixins.scss +117 -60
  33. package/scss/lib/tabs/anchor/_mixins.scss +36 -0
  34. package/scss/lib/tabs/in-page/_mixins.scss +82 -29
  35. package/scss/lib/tooltip/_mixins.scss +2 -0
  36. package/scss/mixins.scss +4 -0
  37. package/scss/themes/crystalski/_overrides.scss +27 -0
  38. package/scss/themes/crystalski/index.scss +9 -0
  39. package/scss/themes/crystalski/theme.json +14 -0
  40. package/scss/themes/firstchoice/_overrides.scss +29 -0
  41. package/scss/themes/firstchoice/index.scss +9 -0
  42. package/scss/themes/firstchoice/theme.json +20 -0
  43. package/scss/themes/tui/_overrides.scss +19 -0
  44. package/scss/themes/tui/index.scss +9 -0
  45. package/scss/themes/tui/theme.json +8 -0
  46. package/scss/variables/_primitives.scss +3 -0
  47. package/scss/variables/base-theme.json +234 -1
  48. package/scss/variables.scss +6 -0
  49. package/types/components.ts +39 -2
@@ -0,0 +1,244 @@
1
+ // Highlight panel / _mixins
2
+ @use 'variables' as *;
3
+ @use '../utility/mixins' as *;
4
+ @use '../icon/mixins' as *;
5
+
6
+ $uilib-highlight-panel-included: false !default;
7
+
8
+ @mixin uilib-highlight-panel() {
9
+ @if not $uilib-highlight-panel-included {
10
+ $uilib-highlight-panel-included: true !global;
11
+
12
+ @include uilib-icon;
13
+ @include uilib-highlight-panel-master;
14
+ }
15
+ }
16
+
17
+ @mixin uilib-highlight-panel-master() {
18
+ .uilib-highlight-panel {
19
+ &::after {
20
+ content: '';
21
+
22
+ display: block;
23
+
24
+ height: var(--uilib-spacing-400);
25
+
26
+ border: var(--uilib-stroke-size-025) solid var(--uilib-highlight-panel-border-color);
27
+ border-top: 0;
28
+ border-radius: 0 0 var(--uilib-highlight-panel-radius) var(--uilib-highlight-panel-radius);
29
+
30
+ background: var(--uilib-highlight-panel-bg-color);
31
+ }
32
+
33
+ // ─── Header ───
34
+ &__header {
35
+ position: relative;
36
+
37
+ display: flex;
38
+ gap: var(--uilib-spacing-200);
39
+ align-items: center;
40
+
41
+ padding: var(--uilib-spacing-200) calc(var(--uilib-icon-size-small) + var(--uilib-spacing-600)) var(--uilib-spacing-600)
42
+ var(--uilib-spacing-400);
43
+
44
+ color: var(--uilib-highlight-panel-header-font-color);
45
+
46
+ border-radius: var(--uilib-highlight-panel-radius) var(--uilib-highlight-panel-radius) 0 0;
47
+
48
+ background: var(--uilib-highlight-panel-header-bg-color);
49
+
50
+ // Remove native summary markers
51
+ list-style: none;
52
+
53
+ &::after {
54
+ position: absolute;
55
+ inset: auto 0 0;
56
+ content: '';
57
+
58
+ display: block;
59
+
60
+ height: var(--uilib-spacing-400);
61
+
62
+ border: var(--uilib-stroke-size-025) solid var(--uilib-highlight-panel-border-color);
63
+ border-bottom-width: 0;
64
+ border-radius: var(--uilib-highlight-panel-radius) var(--uilib-highlight-panel-radius) 0 0;
65
+
66
+ background: var(--uilib-highlight-panel-bg-color);
67
+ }
68
+
69
+ &:focus-visible {
70
+ @include uilib-focus;
71
+
72
+ &::before {
73
+ bottom: calc(var(--uilib-spacing-400) - var(--uilib-focus-gap));
74
+
75
+ border-radius: var(--uilib-highlight-panel-radius);
76
+ }
77
+ }
78
+
79
+ &::-webkit-details-marker {
80
+ display: none;
81
+ }
82
+
83
+ &::marker {
84
+ content: '';
85
+
86
+ display: none;
87
+ }
88
+ }
89
+
90
+ // Clickable header (collapsible variant)
91
+ &__collapsible > &__header {
92
+ cursor: pointer;
93
+ }
94
+
95
+ // Collapsible details element (nested inside panel)
96
+ &__collapsible {
97
+ // Reset details styling
98
+ margin: 0;
99
+ padding: 0;
100
+
101
+ border: 0;
102
+ }
103
+
104
+ &__collapsible &__header-text::before {
105
+ display: block;
106
+ }
107
+
108
+ &__collapsible[open] &__header-text::before {
109
+ transform: translate(0, calc((var(--uilib-icon-size-small) / 2) * -1)) rotate(180deg);
110
+ }
111
+
112
+ &__collapsible::details-content {
113
+ block-size: 0;
114
+
115
+ overflow: hidden;
116
+
117
+ @media (prefers-reduced-motion: no-preference) {
118
+ transition:
119
+ block-size var(--uilib-motion-duration-medium) var(--uilib-motion-timing-out),
120
+ content-visibility var(--uilib-motion-duration-medium) allow-discrete;
121
+ }
122
+ }
123
+
124
+ &__collapsible[open]::details-content {
125
+ block-size: auto;
126
+ }
127
+
128
+ &__header-text {
129
+ display: flex;
130
+ flex-direction: column;
131
+
132
+ // ─── Toggle indicator (collapsible) ───
133
+ &::before {
134
+ position: absolute;
135
+ top: calc(50% - var(--uilib-spacing-200));
136
+ right: var(--uilib-spacing-400);
137
+ content: '';
138
+
139
+ display: none;
140
+
141
+ width: var(--uilib-icon-size-small);
142
+ height: var(--uilib-icon-size-small);
143
+
144
+ background-color: var(--uilib-highlight-panel-header-icon-color);
145
+
146
+ -webkit-mask: var(--uilib-highlight-panel-toggle-icon) no-repeat center;
147
+ mask: var(--uilib-highlight-panel-toggle-icon) no-repeat center;
148
+ -webkit-mask-size: contain;
149
+ mask-size: contain;
150
+
151
+ transform: translate(0, calc((var(--uilib-icon-size-small) / 2) * -1));
152
+
153
+ @media (prefers-reduced-motion: no-preference) {
154
+ transition: transform var(--uilib-motion-duration-medium) var(--uilib-motion-timing-out);
155
+ }
156
+ }
157
+ }
158
+
159
+ &__title {
160
+ font: var(--uilib-highlight-panel-header-font);
161
+ }
162
+
163
+ &__subtitle {
164
+ font: var(--uilib-typography-component-heading-small);
165
+ }
166
+
167
+ &__icon {
168
+ flex-shrink: 0;
169
+ }
170
+
171
+ // ─── Content ───
172
+ // ─── Footer (always visible in collapsible mode) ───
173
+ &__content,
174
+ &__footer {
175
+ padding: 0 var(--uilib-spacing-400);
176
+
177
+ border: var(--uilib-stroke-size-025) solid var(--uilib-highlight-panel-border-color);
178
+ border-top-width: 0;
179
+ border-bottom-width: 0;
180
+
181
+ background: var(--uilib-highlight-panel-bg-color);
182
+ }
183
+
184
+ &__content {
185
+ padding-top: var(--uilib-spacing-400);
186
+
187
+ border-top-width: var(--uilib-stroke-size-025);
188
+ border-radius: var(--uilib-highlight-panel-radius) var(--uilib-highlight-panel-radius) 0 0;
189
+ }
190
+
191
+ &:has(&__header) &__content {
192
+ padding-top: 0;
193
+
194
+ border-top-width: 0;
195
+ border-radius: 0;
196
+ }
197
+
198
+ &:has(&__footer) &__content {
199
+ padding-bottom: var(--uilib-spacing-200);
200
+
201
+ &--divider::after {
202
+ content: '';
203
+
204
+ display: block;
205
+
206
+ width: 100%;
207
+ margin-top: var(--uilib-spacing-200);
208
+
209
+ border-bottom: var(--uilib-stroke-size-050) solid var(--uilib-color-border-divider);
210
+ }
211
+ }
212
+
213
+ // ─── Variants ───
214
+ /* stylelint-disable-next-line order/order */
215
+ &--strong &__header {
216
+ color: var(--uilib-highlight-panel-header-font-color-strong);
217
+
218
+ background: var(--uilib-highlight-panel-header-bg-color-strong);
219
+
220
+ &-text::before {
221
+ background-color: var(--uilib-highlight-panel-header-icon-color-strong);
222
+ }
223
+ }
224
+
225
+ &--brand &__header {
226
+ color: var(--uilib-highlight-panel-header-font-color-brand);
227
+
228
+ background: var(--uilib-highlight-panel-header-bg-overlay-brand, none), var(--uilib-highlight-panel-header-bg-color-brand);
229
+ background-repeat: no-repeat;
230
+ background-position:
231
+ right top,
232
+ center;
233
+ background-size: 50%, auto;
234
+
235
+ &-text::before {
236
+ background-color: var(--uilib-highlight-panel-header-icon-color-brand);
237
+ }
238
+ }
239
+
240
+ &--brand &__title {
241
+ font: var(--uilib-highlight-panel-header-font-brand);
242
+ }
243
+ }
244
+ }
@@ -0,0 +1,21 @@
1
+ @use '../../variables/env-variables' as *;
2
+
3
+ // Highlight panel specific variables to allow theming
4
+ $uilib-highlight-panel-variables: (
5
+ radius: var(--uilib-border-radius-400),
6
+ border-color: var(--uilib-color-border-card),
7
+ bg-color: var(--uilib-color-canvas-default),
8
+ header-font: var(--uilib-typography-component-heading-medium),
9
+ header-font-brand: var(--uilib-typography-component-heading-large-strong),
10
+ header-font-color: var(--uilib-color-text-strong),
11
+ header-font-color-strong: var(--uilib-color-text-inverse),
12
+ header-font-color-brand: var(--uilib-color-text-strong),
13
+ header-icon-color: var(--uilib-color-core-interaction),
14
+ header-icon-color-strong: var(--uilib-color-text-inverse),
15
+ header-icon-color-brand: var(--uilib-color-core-interaction),
16
+ header-bg-color: var(--uilib-color-core-surface),
17
+ header-bg-color-strong: var(--uilib-color-core-brand-strong),
18
+ header-bg-color-brand: var(--uilib-color-core-brand),
19
+ header-bg-overlay-brand: none,
20
+ toggle-icon: url('#{$uilib-assets-base-url}v3/icons/tui/standard/chevron-down.svg'),
21
+ ) !default;
@@ -18,110 +18,178 @@ $uilib-list-included: false !default;
18
18
  @mixin uilib-list-master() {
19
19
  .uilib-list {
20
20
  @include uilib-list-base;
21
- }
22
21
 
23
- .uilib-list--strong {
24
- color: var(--uilib-color-text-strong);
25
- }
22
+ /* stylelint-disable-next-line order/order */
23
+ &--strong {
24
+ color: var(--uilib-color-text-strong);
25
+ }
26
26
 
27
- .uilib-list--label {
28
- color: var(--uilib-color-text-strong);
29
- font: var(--uilib-typography-label-medium);
30
- }
27
+ &--label {
28
+ color: var(--uilib-color-text-strong);
29
+ font: var(--uilib-typography-label-medium);
30
+ }
31
31
 
32
- .uilib-list--icon,
33
- .uilib-list--image {
34
- & > li::before {
35
- display: none;
32
+ &--icon,
33
+ &--image {
34
+ & > li::before {
35
+ display: none;
36
+ }
36
37
  }
37
- }
38
38
 
39
- .uilib-list__icon {
40
- position: absolute;
41
- top: 0;
42
- left: 0;
39
+ &__icon {
40
+ position: absolute;
41
+ top: 0;
42
+ left: 0;
43
43
 
44
- &.uilib-icon {
45
- background: var(--uilib-list-bullet-color);
44
+ &.uilib-icon {
45
+ background: var(--uilib-list-bullet-color);
46
+ }
46
47
  }
47
- }
48
48
 
49
- .uilib-list--icon-small {
50
- & > li {
51
- min-height: var(--uilib-icon-size-small);
52
- padding-left: calc(var(--uilib-icon-size-xsmall) + var(--uilib-spacing-200));
49
+ /* stylelint-disable-next-line order/order */
50
+ &--icon-small {
51
+ & > li {
52
+ min-height: var(--uilib-icon-size-small);
53
+ padding-left: calc(var(--uilib-icon-size-xsmall) + var(--uilib-spacing-200));
54
+ }
55
+
56
+ .uilib-list__icon {
57
+ top: calc(var(--uilib-spacing-300) / 4);
58
+ }
53
59
  }
54
60
 
55
- .uilib-list__icon {
56
- top: calc(var(--uilib-spacing-300) / 4);
61
+ &--icon-large {
62
+ & > li {
63
+ min-height: var(--uilib-icon-size-medium);
64
+ padding-top: calc(calc(var(--uilib-icon-size-medium) - calc(1rem * var(--uilib-line-height-body))) / 2);
65
+ padding-left: calc(var(--uilib-icon-size-medium) + var(--uilib-spacing-200));
66
+ }
67
+
68
+ .uilib-list__icon {
69
+ top: 0;
70
+ }
57
71
  }
58
- }
59
72
 
60
- .uilib-list--icon-large {
61
- & > li {
62
- min-height: var(--uilib-icon-size-medium);
63
- padding-top: calc(calc(var(--uilib-icon-size-medium) - calc(1rem * var(--uilib-line-height-body))) / 2);
64
- padding-left: calc(var(--uilib-icon-size-medium) + var(--uilib-spacing-200));
73
+ &--image {
74
+ & > li {
75
+ min-height: var(--uilib-spacing-1000);
76
+ padding-top: calc(var(--uilib-spacing-050) * 5);
77
+ padding-left: calc(var(--uilib-spacing-1000) + var(--uilib-spacing-200));
78
+ }
65
79
  }
66
80
 
67
- .uilib-list__icon {
81
+ &__image {
82
+ position: absolute;
68
83
  top: 0;
84
+ left: 0;
85
+
86
+ width: var(--uilib-spacing-1000);
87
+ aspect-ratio: var(--uilib-aspect-ratio-1x1-square);
88
+
89
+ border-radius: var(--uilib-list-image-radius);
90
+
91
+ overflow: hidden;
92
+
93
+ img {
94
+ object-fit: cover;
95
+ object-position: center;
96
+ }
69
97
  }
70
- }
71
98
 
72
- .uilib-list--image {
73
- & > li {
74
- min-height: var(--uilib-spacing-1000);
75
- padding-top: calc(var(--uilib-spacing-050) * 5);
76
- padding-left: calc(var(--uilib-spacing-1000) + var(--uilib-spacing-200));
99
+ /* stylelint-disable-next-line order/order */
100
+ &--image-alt > li > &__image {
101
+ border-radius: var(--uilib-list-image-alt-radius);
77
102
  }
78
- }
79
103
 
80
- .uilib-list__image {
81
- position: absolute;
82
- top: 0;
83
- left: 0;
104
+ &--inverse {
105
+ @include uilib-list-inverse;
84
106
 
85
- width: var(--uilib-spacing-1000);
86
- aspect-ratio: var(--uilib-aspect-ratio-1x1-square);
107
+ .uilib-list__icon {
108
+ background: var(--uilib-color-text-inverse);
109
+ }
110
+ }
87
111
 
88
- border-radius: var(--uilib-list-image-radius);
112
+ &--numbered {
113
+ @include uilib-list-ordered;
89
114
 
90
- overflow: hidden;
115
+ &.uilib-list--inverse {
116
+ @include uilib-list-ordered-inverse;
117
+ }
118
+ }
119
+
120
+ &--plain {
121
+ & > li {
122
+ padding: 0;
91
123
 
92
- img {
93
- object-fit: cover;
94
- object-position: center;
124
+ &::before {
125
+ display: none;
126
+ }
127
+ }
95
128
  }
96
- }
97
129
 
98
- .uilib-list--image-alt > li > .uilib-list__image {
99
- border-radius: var(--uilib-list-image-alt-radius);
100
- }
130
+ &--columns {
131
+ display: block;
132
+
133
+ columns: 20ch 2;
101
134
 
102
- .uilib-list--inverse {
103
- @include uilib-list-inverse;
135
+ & > li {
136
+ margin-bottom: var(--uilib-spacing-100);
104
137
 
105
- .uilib-list__icon {
106
- background: var(--uilib-color-text-inverse);
138
+ break-inside: avoid;
139
+ }
140
+ }
141
+
142
+ &--horizontal {
143
+ display: flex;
144
+ flex-flow: row wrap;
145
+ gap: var(--uilib-spacing-200) var(--uilib-spacing-400);
107
146
  }
108
- }
109
147
 
110
- .uilib-list--numbered {
111
- @include uilib-list-ordered;
148
+ &__title {
149
+ display: block;
112
150
 
113
- &.uilib-list--inverse {
114
- @include uilib-list-ordered-inverse;
151
+ font: var(--uilib-list-multiline-title-font);
115
152
  }
116
- }
117
153
 
118
- .uilib-list--columns {
119
- display: block;
154
+ li:has(> &__title) {
155
+ font: var(--uilib-typography-body-medium);
156
+ }
157
+
158
+ &:not(&--inverse) li.uilib-list__highlight-item {
159
+ color: var(--uilib-list-highlight-color);
160
+
161
+ &::before {
162
+ color: var(--uilib-list-highlight-color);
163
+ }
120
164
 
121
- columns: 20ch 2;
165
+ .uilib-list__icon {
166
+ background-color: var(--uilib-list-highlight-color);
167
+ }
168
+ }
122
169
 
123
- & > li {
124
- margin-bottom: var(--uilib-spacing-100);
170
+ &:not(&--inverse, &--numbered) li.uilib-list__highlight-item::before {
171
+ background-color: var(--uilib-list-highlight-color);
172
+ }
173
+
174
+ li:has(&__hint) {
175
+ display: grid;
176
+ grid-template-columns: 1fr auto;
177
+ gap: 0 var(--uilib-spacing-200);
178
+ align-items: baseline;
179
+
180
+ > :not(.uilib-list__hint) {
181
+ grid-column: 1;
182
+ }
183
+
184
+ .uilib-list__icon,
185
+ .uilib-list__image {
186
+ grid-column: unset;
187
+ }
188
+ }
189
+
190
+ &__hint {
191
+ grid-row: 1 / span 20;
192
+ grid-column: 2;
125
193
  }
126
194
  }
127
195
  }
@@ -178,6 +246,8 @@ $uilib-list-included: false !default;
178
246
  & > li {
179
247
  padding-left: calc(var(--uilib-icon-size-medium) + var(--uilib-spacing-200));
180
248
 
249
+ counter-increment: list-item;
250
+
181
251
  &::before {
182
252
  left: 0;
183
253
  content: counters(list-item, '.') '.';
@@ -6,4 +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),
10
+ highlight-color: var(--uilib-color-text-promotion),
9
11
  ) !default;
@@ -1,11 +1,8 @@
1
1
  @use '../../variables/env-variables' as *;
2
- @use '../../variables/primitives' as *;
3
- @use '../../variables/border-radius' as *;
4
- @use 'sass:map';
5
2
 
6
3
  // modal specific variables to allow themeing
7
4
  $uilib-modal-variables: (
8
5
  close-icon: url('#{$uilib-assets-base-url}v3/icons/tui/standard/cross.svg'),
9
6
  backdrop-color: var(--uilib-color-other-scrim),
10
- radius: map.get($uilib-radius, '400'),
7
+ radius: var(--uilib-border-radius-400),
11
8
  ) !default;
@@ -0,0 +1,3 @@
1
+ // Review card / index
2
+ @use 'mixins' as *;
3
+ @include uilib-review-card;