@tui/design-system 1.6.0 → 1.7.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 (35) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/dist/themes/crystalski/index.css +11 -1
  3. package/dist/themes/crystalski/index.css.map +1 -1
  4. package/dist/themes/firstchoice/index.css +11 -1
  5. package/dist/themes/firstchoice/index.css.map +1 -1
  6. package/dist/themes/tui/index.css +13 -3
  7. package/dist/themes/tui/index.css.map +1 -1
  8. package/package.json +2 -2
  9. package/scss/lib/accordion/_mixins.scss +1 -3
  10. package/scss/lib/active-tag/_mixins.scss +16 -4
  11. package/scss/lib/cards/promotion/_index.scss +3 -0
  12. package/scss/lib/cards/promotion/_mixins.scss +275 -0
  13. package/scss/lib/cards/promotion/_variables.scss +14 -0
  14. package/scss/lib/cards/selectable/_mixins.scss +1 -1
  15. package/scss/lib/flyout-dropdown/_variables.scss +0 -1
  16. package/scss/lib/forms/input-switch/_mixins.scss +12 -6
  17. package/scss/lib/list/_mixins.scss +91 -72
  18. package/scss/lib/list/_variables.scss +1 -0
  19. package/scss/lib/modal/_variables.scss +1 -4
  20. package/scss/lib/skeleton/_variables.scss +2 -6
  21. package/scss/lib/tabs/_mixins.scss +117 -60
  22. package/scss/lib/tabs/anchor/_mixins.scss +36 -0
  23. package/scss/lib/tabs/in-page/_mixins.scss +82 -29
  24. package/scss/lib/tooltip/_mixins.scss +2 -0
  25. package/scss/mixins.scss +1 -0
  26. package/scss/themes/crystalski/_overrides.scss +10 -0
  27. package/scss/themes/crystalski/index.scss +3 -0
  28. package/scss/themes/crystalski/theme.json +7 -0
  29. package/scss/themes/firstchoice/_overrides.scss +10 -0
  30. package/scss/themes/firstchoice/index.scss +3 -0
  31. package/scss/themes/firstchoice/theme.json +7 -0
  32. package/scss/themes/tui/index.scss +3 -0
  33. package/scss/variables/base-theme.json +64 -0
  34. package/scss/variables.scss +1 -0
  35. package/types/components.ts +32 -0
@@ -1,5 +1,4 @@
1
1
  @use '../../variables/env-variables' as *;
2
- @use 'sass:map';
3
2
 
4
3
  // flyout dropdown specific variables to allow themeing
5
4
  $uilib-flyout-dropdown-variables: (
@@ -25,7 +25,7 @@ $uilib-input-switch-included: false !default;
25
25
  margin-bottom: var(--uilib-spacing-200);
26
26
  }
27
27
 
28
- &__input {
28
+ &--input-switch &__input {
29
29
  margin-top: 0;
30
30
  }
31
31
  }
@@ -49,11 +49,13 @@ $uilib-input-switch-included: false !default;
49
49
  font: var(--uilib-form-row-label-font);
50
50
  }
51
51
 
52
- &:has(.uilib-input-switch__input[disabled]) {
52
+ &:has(.uilib-input-switch__input:disabled),
53
+ &-input:disabled + .uilib-input-switch {
53
54
  cursor: auto;
54
55
  }
55
56
 
56
- &:has(.uilib-input-switch__input:focus-visible) {
57
+ &:has(.uilib-input-switch__input:focus-visible),
58
+ &-input:focus-visible + .uilib-input-switch {
57
59
  @include uilib-focus;
58
60
 
59
61
  &::before {
@@ -61,7 +63,8 @@ $uilib-input-switch-included: false !default;
61
63
  }
62
64
  }
63
65
 
64
- &__input {
66
+ &__input,
67
+ &-input {
65
68
  position: absolute;
66
69
 
67
70
  width: 0;
@@ -71,7 +74,8 @@ $uilib-input-switch-included: false !default;
71
74
 
72
75
  opacity: 0;
73
76
 
74
- &:checked + .uilib-input-switch__track {
77
+ &:checked + .uilib-input-switch__track,
78
+ &:checked + .uilib-input-switch .uilib-input-switch__track {
75
79
  border-color: var(--uilib-input-switch-track-selected-border-color);
76
80
 
77
81
  background-color: var(--uilib-input-switch-track-selected-color);
@@ -83,7 +87,9 @@ $uilib-input-switch-included: false !default;
83
87
  }
84
88
  }
85
89
 
86
- &[disabled] + .uilib-input-switch__track {
90
+ /* stylelint-disable-next-line order/order */
91
+ &:disabled + .uilib-input-switch__track,
92
+ &:disabled + .uilib-input-switch .uilib-input-switch__track {
87
93
  border-color: var(--uilib-input-switch-track-disabled-border-color);
88
94
 
89
95
  background-color: var(--uilib-input-switch-track-color-disabled);
@@ -18,110 +18,129 @@ $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;
69
- }
70
- }
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;
71
92
 
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));
93
+ img {
94
+ object-fit: cover;
95
+ object-position: center;
96
+ }
77
97
  }
78
- }
79
98
 
80
- .uilib-list__image {
81
- position: absolute;
82
- top: 0;
83
- left: 0;
99
+ /* stylelint-disable-next-line order/order */
100
+ &--image-alt > li > &__image {
101
+ border-radius: var(--uilib-list-image-alt-radius);
102
+ }
84
103
 
85
- width: var(--uilib-spacing-1000);
86
- aspect-ratio: var(--uilib-aspect-ratio-1x1-square);
104
+ &--inverse {
105
+ @include uilib-list-inverse;
87
106
 
88
- border-radius: var(--uilib-list-image-radius);
107
+ .uilib-list__icon {
108
+ background: var(--uilib-color-text-inverse);
109
+ }
110
+ }
89
111
 
90
- overflow: hidden;
112
+ &--numbered {
113
+ @include uilib-list-ordered;
91
114
 
92
- img {
93
- object-fit: cover;
94
- object-position: center;
115
+ &.uilib-list--inverse {
116
+ @include uilib-list-ordered-inverse;
117
+ }
95
118
  }
96
- }
97
119
 
98
- .uilib-list--image-alt > li > .uilib-list__image {
99
- border-radius: var(--uilib-list-image-alt-radius);
100
- }
120
+ &--columns {
121
+ display: block;
101
122
 
102
- .uilib-list--inverse {
103
- @include uilib-list-inverse;
123
+ columns: 20ch 2;
104
124
 
105
- .uilib-list__icon {
106
- background: var(--uilib-color-text-inverse);
125
+ & > li {
126
+ margin-bottom: var(--uilib-spacing-100);
127
+ }
107
128
  }
108
- }
109
-
110
- .uilib-list--numbered {
111
- @include uilib-list-ordered;
112
129
 
113
- &.uilib-list--inverse {
114
- @include uilib-list-ordered-inverse;
130
+ &--horizontal {
131
+ display: flex;
132
+ flex-flow: row wrap;
133
+ gap: var(--uilib-spacing-200) var(--uilib-spacing-400);
115
134
  }
116
- }
117
135
 
118
- .uilib-list--columns {
119
- display: block;
136
+ &__title {
137
+ display: block;
120
138
 
121
- columns: 20ch 2;
139
+ font: var(--uilib-list-multiline-title-font);
140
+ }
122
141
 
123
- & > li {
124
- margin-bottom: var(--uilib-spacing-100);
142
+ li:has(> &__title) {
143
+ font: var(--uilib-typography-body-medium);
125
144
  }
126
145
  }
127
146
  }
@@ -6,4 +6,5 @@ $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
10
  ) !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;
@@ -1,8 +1,4 @@
1
- @use 'sass:map';
2
- @use '../../variables/colors' as *;
3
- @use '../../variables/primitives' as *;
4
-
5
1
  $uilib-skeleton-variables: (
6
- color: map.get($uilib-color-semantic, 'other-skeleton-loading'),
7
- shimmer-color: map.get($uilib-primitives, 'color-neutral-20'),
2
+ color: var(--uilib-color-other-skeleton-loading),
3
+ shimmer-color: var(--uilib-color-canvas-contrast),
8
4
  ) !default;
@@ -1,39 +1,44 @@
1
1
  // Shared tab styles used by in-page and tabs-anchor.
2
2
  // $prefix: the BEM block name, e.g. 'uilib-tabs-in-page' or 'uilib-tabs-anchor'
3
+
4
+ @mixin uilib-tablist-base() {
5
+ --left-fade: 0rem;
6
+ --right-fade: 0rem;
7
+
8
+ $fade-mask: linear-gradient(to right, transparent 0, black var(--left-fade), black calc(100% - var(--right-fade)), transparent 100%);
9
+
10
+ scroll-padding-inline: var(--left-fade) var(--right-fade);
11
+
12
+ margin: calc(-1 * var(--uilib-spacing-200));
13
+ padding: var(--uilib-spacing-200);
14
+
15
+ overflow-x: auto;
16
+ scroll-behavior: smooth;
17
+ scrollbar-width: none;
18
+ -webkit-mask-image: #{$fade-mask};
19
+ mask-image: #{$fade-mask};
20
+ mask-origin: padding-box;
21
+ mask-clip: padding-box;
22
+ }
23
+
3
24
  @mixin uilib-tab-base($prefix) {
4
25
  position: relative;
5
26
 
6
- display: flex;
7
- flex-shrink: 0;
8
- gap: var(--uilib-spacing-200);
9
- align-items: center;
10
-
11
27
  max-width: 12.5rem;
12
28
  padding: var(--uilib-spacing-300) var(--uilib-spacing-500);
13
29
 
14
30
  color: var(--#{$prefix}-text-color);
15
31
  font-weight: var(--uilib-font-weight-semibold);
16
32
  font-family: var(--uilib-font-family-lead);
33
+ white-space: normal;
17
34
  text-decoration: none;
18
35
 
19
- border-radius: var(--uilib-border-radius-200);
20
-
21
36
  background: transparent;
22
37
 
23
38
  cursor: pointer;
24
39
  }
25
40
 
26
41
  @mixin uilib-tabs-shared($prefix) {
27
- .#{$prefix}__scroll-button--left .uilib-icon {
28
- -webkit-mask-image: var(--#{$prefix}-scroll-left-icon);
29
- mask-image: var(--#{$prefix}-scroll-left-icon);
30
- }
31
-
32
- .#{$prefix}__scroll-button--right .uilib-icon {
33
- -webkit-mask-image: var(--#{$prefix}-scroll-right-icon);
34
- mask-image: var(--#{$prefix}-scroll-right-icon);
35
- }
36
-
37
42
  .#{$prefix} {
38
43
  // .uilib-icon-button selector is chained to raise specificity above uilib-icon-button's
39
44
  // `display: inline-flex`, which appears later due to alphabetical @include sorting in storybook
@@ -42,6 +47,16 @@
42
47
  display: none;
43
48
  }
44
49
 
50
+ &__scroll-button--left .uilib-icon {
51
+ -webkit-mask-image: var(--#{$prefix}-scroll-left-icon);
52
+ mask-image: var(--#{$prefix}-scroll-left-icon);
53
+ }
54
+
55
+ &__scroll-button--right .uilib-icon {
56
+ -webkit-mask-image: var(--#{$prefix}-scroll-right-icon);
57
+ mask-image: var(--#{$prefix}-scroll-right-icon);
58
+ }
59
+
45
60
  &__scroll-wrapper {
46
61
  position: relative;
47
62
  }
@@ -71,55 +86,19 @@
71
86
  right: 0;
72
87
  }
73
88
 
74
- &__tablist {
75
- --left-fade: 0;
76
- --right-fade: 0;
77
-
78
- $fade-mask: linear-gradient(to right, transparent 0, black var(--left-fade), black calc(100% - var(--right-fade)), transparent 100%);
79
-
80
- scroll-padding-inline: var(--left-fade) var(--right-fade);
81
-
82
- display: flex;
83
- flex-direction: row;
84
- align-items: end;
85
-
86
- margin: calc(-1 * var(--uilib-spacing-200));
87
- padding: var(--uilib-spacing-200);
88
-
89
- overflow-x: auto;
90
- scroll-behavior: smooth;
91
- scrollbar-width: none;
92
- -webkit-mask-image: #{$fade-mask};
93
- mask-image: #{$fade-mask};
94
- mask-origin: padding-box;
95
- mask-clip: padding-box;
96
- }
97
-
98
- &__scroll-wrapper:has(&__scroll-button--left:not(.#{$prefix}--hidden)) &__tablist {
99
- --left-fade: var(--#{$prefix}-scroll-fade-width);
100
- }
101
-
102
- &__scroll-wrapper:has(&__scroll-button--right:not(.#{$prefix}--hidden)) &__tablist {
103
- --right-fade: var(--#{$prefix}-scroll-fade-width);
104
- }
105
-
106
89
  &__tab {
90
+ @include uilib-tab-base($prefix);
91
+
92
+ /* stylelint-disable-next-line order/order */
107
93
  &--active {
108
94
  color: var(--#{$prefix}-active-color);
109
- }
110
-
111
- &--active::after {
112
- position: absolute;
113
- left: 0;
114
- bottom: 0;
115
- content: '';
116
-
117
- width: 100%;
118
95
 
119
- border-bottom: var(--uilib-stroke-size-075) var(--uilib-stroke-style-solid) var(--#{$prefix}-active-color);
96
+ box-shadow: inset 0 calc(var(--uilib-stroke-size-075) * -1) 0 0 var(--#{$prefix}-active-color);
120
97
  }
121
98
 
122
- @include uilib-tab-base($prefix);
99
+ &::before {
100
+ border-radius: var(--uilib-border-radius-100);
101
+ }
123
102
 
124
103
  &:hover {
125
104
  color: var(--#{$prefix}-active-color);
@@ -151,6 +130,84 @@
151
130
  max-height: unset;
152
131
  }
153
132
  }
133
+
134
+ &-inner {
135
+ display: flex;
136
+ flex-flow: row nowrap;
137
+ gap: var(--uilib-spacing-200);
138
+ justify-content: center;
139
+ align-items: center;
140
+ }
141
+ }
142
+ }
143
+
144
+ // ─── V1: flex on tablist and tab ───
145
+ [version='1'].#{$prefix} {
146
+ .#{$prefix}__tablist {
147
+ @include uilib-tablist-base;
148
+
149
+ /* stylelint-disable-next-line order/order */
150
+ display: flex;
151
+ flex-direction: row;
152
+ align-items: end;
153
+ }
154
+
155
+ .#{$prefix}__tab {
156
+ display: inline-flex;
157
+ flex-shrink: 0;
158
+ gap: var(--uilib-spacing-200);
159
+ align-items: center;
160
+ }
161
+ }
162
+
163
+ // ─── V2: table layout on tablist, scrolling on wrapper ───
164
+ [version='2'].#{$prefix} {
165
+ .#{$prefix}__tablist-wrapper {
166
+ @include uilib-tablist-base;
167
+ }
168
+
169
+ .#{$prefix}__tablist {
170
+ display: table;
171
+
172
+ table-layout: fixed;
173
+ }
174
+
175
+ .#{$prefix}__tab-outer {
176
+ display: table-cell;
177
+
178
+ vertical-align: bottom;
179
+ }
180
+
181
+ .#{$prefix}__tab {
182
+ width: max-content;
183
+ }
184
+
185
+ .#{$prefix}__tab-inner {
186
+ display: flex;
187
+ flex-flow: row nowrap;
188
+ gap: var(--uilib-spacing-200);
189
+ align-items: center;
190
+ }
191
+ }
192
+
193
+ // ─── Scroll fade triggers ───
194
+ [version='1'].#{$prefix} {
195
+ &:has(.#{$prefix}__scroll-button--left:not(.#{$prefix}--hidden)) .#{$prefix}__tablist {
196
+ --left-fade: var(--#{$prefix}-scroll-fade-width);
197
+ }
198
+
199
+ &:has(.#{$prefix}__scroll-button--right:not(.#{$prefix}--hidden)) .#{$prefix}__tablist {
200
+ --right-fade: var(--#{$prefix}-scroll-fade-width);
201
+ }
202
+ }
203
+
204
+ [version='2'].#{$prefix} .#{$prefix}__scroll-wrapper {
205
+ &:has(.#{$prefix}__scroll-button--left:not(.#{$prefix}--hidden)) .#{$prefix}__tablist-wrapper {
206
+ --left-fade: var(--#{$prefix}-scroll-fade-width);
207
+ }
208
+
209
+ &:has(.#{$prefix}__scroll-button--right:not(.#{$prefix}--hidden)) .#{$prefix}__tablist-wrapper {
210
+ --right-fade: var(--#{$prefix}-scroll-fade-width);
154
211
  }
155
212
  }
156
213
  }
@@ -25,6 +25,15 @@ $uilib-tabs-anchor-included: false !default;
25
25
  display: inline-flex;
26
26
 
27
27
  @include uilib-tab-base($prefix);
28
+
29
+ /* stylelint-disable-next-line order/order */
30
+ flex-flow: row nowrap;
31
+ gap: var(--uilib-spacing-200);
32
+ align-items: center;
33
+
34
+ .uilib-icon {
35
+ flex-shrink: 0;
36
+ }
28
37
  }
29
38
  }
30
39
 
@@ -33,9 +42,24 @@ $uilib-tabs-anchor-included: false !default;
33
42
 
34
43
  @include uilib-tabs-shared($prefix);
35
44
 
45
+ .#{$prefix}__tab {
46
+ display: flex;
47
+ flex-flow: row nowrap;
48
+ gap: var(--uilib-spacing-200);
49
+ align-items: center;
50
+
51
+ &-label {
52
+ text-align: center;
53
+ }
54
+ }
55
+
36
56
  .#{$prefix}-wrapper {
37
57
  display: flex;
38
58
  flex-direction: column;
59
+
60
+ & > section:focus-visible::before {
61
+ border-radius: var(--uilib-border-radius-100);
62
+ }
39
63
  }
40
64
 
41
65
  // No-JS fallback
@@ -62,6 +86,18 @@ $uilib-tabs-anchor-included: false !default;
62
86
  & .#{$prefix}__scroll-wrapper {
63
87
  border-bottom: none;
64
88
  }
89
+
90
+ .uilib-tabs-anchor__scroll-button {
91
+ top: calc(50% - var(--uilib-spacing-100));
92
+
93
+ &--left {
94
+ left: calc(-1 * var(--uilib-spacing-100));
95
+ }
96
+
97
+ &--right {
98
+ right: calc(-1 * var(--uilib-spacing-100));
99
+ }
100
+ }
65
101
  }
66
102
 
67
103
  @media (prefers-reduced-motion: no-preference) {