@taiga-ui/styles 4.75.0 → 5.0.0-canary.1e78a8a

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 (73) hide show
  1. package/components/appearance.less +51 -0
  2. package/components/avatar.less +193 -0
  3. package/components/badge.less +127 -0
  4. package/components/block.less +118 -0
  5. package/components/button.less +140 -0
  6. package/components/checkbox.less +84 -0
  7. package/components/chip.less +131 -0
  8. package/components/comment.less +63 -0
  9. package/components/compass.less +49 -0
  10. package/components/group.less +172 -0
  11. package/components/icon.less +83 -0
  12. package/components/icons.less +79 -0
  13. package/components/label.less +51 -0
  14. package/components/like.less +67 -0
  15. package/components/link.less +69 -0
  16. package/components/message.less +33 -0
  17. package/components/notification.less +181 -0
  18. package/components/pin.less +166 -0
  19. package/components/progress-bar.less +117 -0
  20. package/components/radio.less +59 -0
  21. package/components/status.less +40 -0
  22. package/components/switch.less +104 -0
  23. package/components/textfield.less +362 -0
  24. package/components/title.less +80 -0
  25. package/components/toast.less +46 -0
  26. package/mixins/appearance.less +56 -0
  27. package/mixins/appearance.scss +57 -0
  28. package/mixins/browsers.less +23 -0
  29. package/mixins/browsers.scss +23 -0
  30. package/mixins/date-picker.less +152 -0
  31. package/mixins/date-picker.scss +152 -0
  32. package/mixins/hitbox.less +17 -0
  33. package/mixins/hitbox.scss +17 -0
  34. package/mixins/miscellaneous.less +171 -0
  35. package/mixins/miscellaneous.scss +164 -0
  36. package/mixins/slider.less +67 -0
  37. package/mixins/slider.scss +67 -0
  38. package/package.json +9 -2
  39. package/taiga-ui-fonts.less +4 -0
  40. package/taiga-ui-theme.less +4 -0
  41. package/theme/appearance/accent.less +14 -0
  42. package/theme/appearance/action.less +38 -0
  43. package/theme/appearance/flat.less +23 -0
  44. package/theme/appearance/floating.less +21 -0
  45. package/theme/appearance/glass.less +30 -0
  46. package/theme/appearance/outline.less +78 -0
  47. package/theme/appearance/primary.less +48 -0
  48. package/theme/appearance/secondary.less +77 -0
  49. package/theme/appearance/status.less +125 -0
  50. package/theme/appearance/table.less +67 -0
  51. package/theme/appearance/textfield.less +80 -0
  52. package/theme/appearance.less +12 -0
  53. package/theme/palette.less +161 -0
  54. package/theme/variables.less +71 -0
  55. package/utils.less +7 -0
  56. package/utils.scss +7 -0
  57. package/variables/media.less +23 -0
  58. package/variables/media.scss +23 -0
  59. package/basic/keyframes.less +0 -19
  60. package/basic/main.less +0 -80
  61. package/markup/tui-container.less +0 -64
  62. package/markup/tui-form.less +0 -145
  63. package/markup/tui-island.less +0 -200
  64. package/markup/tui-list.less +0 -136
  65. package/markup/tui-mobile-only.less +0 -5
  66. package/markup/tui-required.less +0 -13
  67. package/markup/tui-row.less +0 -139
  68. package/markup/tui-skeleton.less +0 -43
  69. package/markup/tui-space.less +0 -52
  70. package/markup/tui-table.less +0 -184
  71. package/markup/tui-text.less +0 -61
  72. package/project.json +0 -35
  73. package/taiga-ui-global.less +0 -14
@@ -0,0 +1,104 @@
1
+ @import '../utils.less';
2
+
3
+ /**
4
+ * @name Switch
5
+ * @selector [tuiSwitch]
6
+ *
7
+ * @description
8
+ * A stylized input type="checkbox" switch
9
+ *
10
+ * @attributes
11
+ * data-size — size (default: 'm') ('s' | 'm')
12
+ *
13
+ * @vars
14
+ * --t-icon-start — checkmark icon
15
+ *
16
+ * @example
17
+ * <input type="checkbox" tuiSwitch tuiAppearance data-appearance="primary" />
18
+ *
19
+ * @see-also
20
+ * Checkbox, Radio
21
+ */
22
+ [tuiSwitch]:where(*&) {
23
+ .transition(~'background, box-shadow');
24
+
25
+ display: inline-block;
26
+ inline-size: 3rem;
27
+ block-size: 1.5rem;
28
+ border-radius: 2rem;
29
+ overflow: hidden;
30
+ cursor: pointer;
31
+ margin: 0;
32
+ flex-shrink: 0;
33
+ color: #fff !important;
34
+
35
+ &[data-size='s'] {
36
+ block-size: 1rem;
37
+ inline-size: 2rem;
38
+
39
+ &::before {
40
+ inline-size: 1rem;
41
+ transform: translateX(calc(var(--tui-inline) * -1rem));
42
+ font-size: 0.75rem;
43
+ }
44
+
45
+ &::after {
46
+ inline-size: 1rem;
47
+ box-shadow: calc(var(--tui-inline) * -2.625rem) 0 0 0.5rem var(--tui-background-base);
48
+ outline-width: 0.167rem;
49
+ transform: scale(0.375);
50
+ }
51
+
52
+ &:checked::after {
53
+ transform: scale(0.375) translateX(calc(var(--tui-inline) * 2.625rem));
54
+ }
55
+ }
56
+
57
+ &:checked {
58
+ &::before {
59
+ transform: none;
60
+ }
61
+
62
+ &::after {
63
+ transform: scale(0.33333) translateX(calc(var(--tui-inline) * 4.5rem));
64
+ }
65
+ }
66
+
67
+ &:disabled._readonly._readonly {
68
+ opacity: 1;
69
+ }
70
+
71
+ &::before,
72
+ &::after {
73
+ position: absolute;
74
+ block-size: 100%;
75
+ inline-size: 1.5rem;
76
+ transition-property: transform;
77
+ zoom: 1;
78
+ }
79
+
80
+ &::before {
81
+ inset-inline-start: 0.125rem;
82
+ font-size: 1rem;
83
+ transform: translateX(calc(var(--tui-inline) * -1.5rem));
84
+ }
85
+
86
+ &::after {
87
+ display: block;
88
+ inset-inline-end: 0;
89
+ border-radius: 100%;
90
+ background: none;
91
+ transform: scale(0.33333);
92
+ box-shadow: calc(var(--tui-inline) * -4.5rem) 0 0 0.75rem var(--tui-background-base);
93
+ outline: 0.375rem solid var(--tui-background-neutral-2-pressed);
94
+ }
95
+
96
+ &:not([data-icon-start])::after {
97
+ outline-offset: 20rem;
98
+ }
99
+
100
+ &:invalid:not([data-mode]),
101
+ &[data-mode~='invalid'] {
102
+ color: #fff;
103
+ }
104
+ }
@@ -0,0 +1,362 @@
1
+ @import '../utils.less';
2
+
3
+ tui-textfield:where(*&) {
4
+ .scrollbar-hidden();
5
+ .transition(color);
6
+
7
+ --t-height: calc(var(--tui-height-l) + 2.5 * var(--t-label) * var(--tui-font-offset));
8
+ --t-padding: var(--tui-padding-l);
9
+ --t-label: 0;
10
+ --t-label-y: -0.75rem;
11
+ --t-label-font: var(--tui-typography-ui-s);
12
+ --t-end: ~'0px';
13
+ --t-start: ~'0px';
14
+ --t-side: ~'0px';
15
+ --t-max: 0.75rem;
16
+ --t-space: ~'clamp(0px, calc(var(--t-side) + var(--t-end)), var(--t-max))';
17
+
18
+ position: relative;
19
+ display: flex;
20
+ flex-wrap: wrap;
21
+ align-items: flex-start;
22
+ min-block-size: var(--t-height);
23
+ padding: 0 var(--t-padding);
24
+ border-radius: var(--tui-radius-l);
25
+ font: var(--tui-typography-ui-m);
26
+ box-sizing: border-box;
27
+ isolation: isolate;
28
+
29
+ &[tuiAppearance] {
30
+ outline: none;
31
+
32
+ &[data-appearance=''] {
33
+ color: var(--tui-text-tertiary);
34
+
35
+ &:not([data-mode~='readonly']) {
36
+ .appearance-hover({
37
+ color: var(--tui-text-secondary);
38
+ });
39
+ }
40
+ }
41
+ }
42
+
43
+ &[data-icon-start] {
44
+ --t-start: 2.5rem;
45
+ }
46
+
47
+ &[data-icon-end] {
48
+ --t-end: 1.75rem;
49
+ }
50
+
51
+ &[tuiIcons] {
52
+ &::before {
53
+ z-index: 1;
54
+ block-size: var(--t-height);
55
+ inline-size: 1.5rem;
56
+ margin-inline-end: 1rem;
57
+ pointer-events: none;
58
+ }
59
+
60
+ &::after {
61
+ position: relative;
62
+ block-size: var(--t-height);
63
+ inline-size: calc(1.5rem + 2 * var(--t-padding));
64
+ cursor: pointer;
65
+ margin-inline-start: calc(0.25rem - var(--t-padding));
66
+ margin-inline-end: calc(-1 * var(--t-padding));
67
+ }
68
+ }
69
+
70
+ &::-webkit-resizer {
71
+ border: 0.25rem solid transparent;
72
+ inline-size: 0.5rem;
73
+ block-size: 0.5rem;
74
+ box-sizing: content-box;
75
+ color: var(--tui-text-tertiary);
76
+ background: linear-gradient(
77
+ -45deg,
78
+ transparent,
79
+ transparent 0.125rem,
80
+ currentColor 0.125rem,
81
+ currentColor 0.1875rem,
82
+ transparent 0.1875rem,
83
+ transparent 0.25rem,
84
+ currentColor 0.25rem,
85
+ currentColor 0.3125rem,
86
+ transparent 0.35rem
87
+ );
88
+ background-clip: content-box;
89
+ }
90
+
91
+ [tuiLabel],
92
+ & > .t-content,
93
+ & > .t-template {
94
+ pointer-events: none;
95
+ }
96
+
97
+ &[data-size='s'] {
98
+ --t-height: var(--tui-height-s);
99
+ --t-padding: var(--tui-padding-s);
100
+ --t-max: ~'0px';
101
+
102
+ border-radius: var(--tui-radius-m);
103
+ font: var(--tui-typography-ui-s);
104
+
105
+ &[data-icon-start] {
106
+ --t-start: 1.5rem;
107
+ }
108
+
109
+ &[data-icon-end] {
110
+ --t-end: 1.5rem;
111
+ }
112
+
113
+ &::before {
114
+ font-size: 1rem;
115
+ margin-inline: -0.25rem 0.25rem;
116
+ }
117
+
118
+ &::after {
119
+ inline-size: calc(0.75rem + 2 * var(--t-padding));
120
+ margin-inline: 0 -0.5rem;
121
+ font-size: 1rem;
122
+ }
123
+
124
+ & > .t-content {
125
+ gap: 0;
126
+
127
+ > *:last-child {
128
+ margin-inline-end: -0.25rem;
129
+ }
130
+ }
131
+ }
132
+
133
+ &[data-size='m'] {
134
+ --t-height: calc(var(--tui-height-m) + 2.5 * var(--t-label) * var(--tui-font-offset));
135
+ --t-padding: var(--tui-padding-m);
136
+ --t-label-font: var(--tui-typography-ui-xs);
137
+ --t-label-y: -0.5625rem;
138
+ --t-max: 0.125rem;
139
+
140
+ border-radius: var(--tui-radius-m);
141
+ font: var(--tui-typography-ui-s);
142
+
143
+ &[data-icon-start] {
144
+ --t-start: 2.125rem;
145
+ }
146
+
147
+ &[data-icon-end] {
148
+ --t-end: 1.75rem;
149
+ }
150
+
151
+ &::before {
152
+ margin-inline: -0.125rem 0.75rem;
153
+ }
154
+
155
+ &::after {
156
+ inline-size: calc(1.25rem + 2 * var(--t-padding));
157
+ margin-inline-start: calc(0.5rem - var(--t-padding));
158
+ }
159
+
160
+ & > .t-content > *:last-child {
161
+ margin-inline-end: -0.125rem;
162
+ }
163
+ }
164
+
165
+ &:is(._disabled, [data-state='disabled']) {
166
+ pointer-events: none;
167
+ opacity: var(--tui-disabled-opacity);
168
+
169
+ [tuiAppearance]:is(._disabled, :disabled, [data-state='disabled']) {
170
+ opacity: 1;
171
+ }
172
+
173
+ tui-icon {
174
+ display: none;
175
+ }
176
+ }
177
+
178
+ &._with-label {
179
+ --t-label: 1;
180
+
181
+ & > .t-template,
182
+ .t-filler,
183
+ [tuiInput] {
184
+ inset-block-end: 0;
185
+ padding-block-start: calc(var(--t-height) / 3);
186
+ padding-block-end: 0;
187
+ }
188
+
189
+ &:is(:not([data-focus='true']), [data-mode~='readonly']) {
190
+ & > .t-template,
191
+ [tuiInput] {
192
+ &::placeholder,
193
+ &._empty {
194
+ color: transparent;
195
+ }
196
+ }
197
+ }
198
+ }
199
+
200
+ & > .t-template,
201
+ .t-filler,
202
+ [tuiInput] {
203
+ position: absolute;
204
+ inset-inline: 0;
205
+ inline-size: auto;
206
+ block-size: var(--t-height);
207
+ appearance: none;
208
+ background: none;
209
+ font: inherit;
210
+ resize: none;
211
+ outline: none;
212
+ color: var(--tui-text-primary);
213
+ box-sizing: border-box;
214
+ border-radius: inherit;
215
+ border-width: 0;
216
+ overscroll-behavior: none;
217
+ padding-inline-start: calc(var(--t-start) + var(--t-padding));
218
+ padding-inline-end: calc(var(--t-end) + var(--t-side) + var(--t-padding) + var(--t-space));
219
+ white-space: nowrap;
220
+ overflow: hidden;
221
+
222
+ &:is(input, textarea):read-only ~ .t-filler {
223
+ display: none;
224
+ }
225
+
226
+ &:disabled {
227
+ animation: tuiPresent 1s infinite;
228
+ opacity: 1;
229
+ }
230
+
231
+ &[inputmode='none'] {
232
+ caret-color: transparent;
233
+ }
234
+
235
+ &::-webkit-inner-spin-button,
236
+ &::-webkit-outer-spin-button {
237
+ appearance: none;
238
+ }
239
+ }
240
+
241
+ &._with-template [tuiInput]:first-of-type {
242
+ color: transparent !important;
243
+ }
244
+
245
+ [tuiInput]:-webkit-autofill,
246
+ [tuiInput][chrome-autofilled], /* Chrome on IOS */
247
+ [tuiInput]:not(._empty, :placeholder-shown),
248
+ &[multi][multi]:not(._empty) {
249
+ [tuiLabel],
250
+ &:not(tui-textfield) ~ [tuiLabel] {
251
+ font: var(--t-label-font);
252
+ transform: translateY(calc(var(--t-label-y) - var(--tui-font-offset) / 2));
253
+ }
254
+ }
255
+
256
+ // Increasing specificity to override all other styles
257
+ [tuiLabel][tuiLabel][tuiLabel] {
258
+ .transition(all);
259
+ .text-overflow();
260
+
261
+ position: relative;
262
+ display: block;
263
+ max-inline-size: calc(100% - var(--t-start));
264
+ flex: 1;
265
+ align-self: flex-start;
266
+ font: inherit;
267
+ user-select: none;
268
+ padding: calc(var(--t-height) / 2 - 0.625em) 0;
269
+ line-height: 1.25 !important;
270
+ transition-duration: inherit;
271
+
272
+ + .t-content {
273
+ margin-inline-start: 0;
274
+ }
275
+ }
276
+
277
+ [tuiLabel],
278
+ [tuiInput]::placeholder,
279
+ [tuiInput]._empty {
280
+ color: var(--tui-text-secondary);
281
+ }
282
+
283
+ select {
284
+ option[value='']:disabled {
285
+ // Hide placeholder from native datalist (Windows OS only)
286
+ color: transparent;
287
+ }
288
+
289
+ optgroup,
290
+ option {
291
+ // Windows OS only
292
+ background-color: var(--tui-background-elevation-3);
293
+ }
294
+
295
+ optgroup,
296
+ option:not(:disabled) {
297
+ // In Windows OS native options inherit color of host <select>
298
+ color: var(--tui-text-primary);
299
+ }
300
+ }
301
+
302
+ button,
303
+ a,
304
+ tui-icon {
305
+ pointer-events: auto;
306
+ }
307
+
308
+ & > .t-content {
309
+ z-index: 1;
310
+ display: flex;
311
+ block-size: var(--t-height);
312
+ align-items: center;
313
+ gap: 0.25rem;
314
+ margin-inline-start: auto;
315
+ isolation: isolate;
316
+ border-radius: inherit;
317
+ }
318
+
319
+ textarea ~ .t-content {
320
+ min-inline-size: 0.5rem;
321
+ }
322
+
323
+ &:is([data-mode~='readonly'], [data-state='disabled'], ._empty) [tuiButtonX],
324
+ [tuiInput]._empty ~ .t-content [tuiButtonX],
325
+ [tuiInput]:disabled ~ .t-content [tuiButtonX] {
326
+ display: none;
327
+ }
328
+
329
+ .t-filler {
330
+ pointer-events: none !important;
331
+ color: var(--tui-text-tertiary);
332
+ }
333
+
334
+ [tuiFluidTypography] {
335
+ font-weight: bold;
336
+ }
337
+
338
+ [tuiSelectLike]:not(:read-only) {
339
+ cursor: pointer;
340
+ }
341
+
342
+ &:has(input[type='tel']) {
343
+ direction: ltr;
344
+ }
345
+
346
+ .appearance-invalid({
347
+ [tuiInput]:not(._empty) ~ [tuiLabel],
348
+ &[multi]:not(._empty) [tuiLabel] {
349
+ color: var(--tui-text-negative);
350
+ }
351
+ });
352
+
353
+ &:not([data-mode~='readonly']) {
354
+ .appearance-focus({
355
+ [tuiLabel] {
356
+ color: var(--tui-text-primary) !important;
357
+ font: var(--t-label-font);
358
+ transform: translateY(calc(var(--t-label-y) - var(--tui-font-offset) / 2));
359
+ }
360
+ });
361
+ }
362
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @name Title
3
+ * @selector [tuiTitle], [tuiSubtitle]
4
+ *
5
+ * @description
6
+ * Basic layout block for titles and subtitles
7
+ * Often used by other more complex elements
8
+ *
9
+ * @attributes
10
+ * data-size — optional size ('s' | 'm' | 'l')
11
+ *
12
+ * @example
13
+ * <h2 tuiTitle>
14
+ * Title
15
+ * <span tuiSubtitle>Subtitle</span>
16
+ * </h2>
17
+ *
18
+ * @see-also
19
+ * Label
20
+ */
21
+ [tuiTitle]:where(*&) {
22
+ position: relative;
23
+ display: flex;
24
+ min-inline-size: 0;
25
+ flex-direction: column;
26
+ text-align: start;
27
+ gap: 0.25rem;
28
+ margin: 0;
29
+ font: var(--tui-typography-ui-m);
30
+
31
+ &[data-size='s'] {
32
+ gap: 0.125rem;
33
+ font: var(--tui-typography-body-s);
34
+
35
+ [tuiSubtitle] {
36
+ font: var(--tui-typography-body-xs);
37
+ }
38
+ }
39
+
40
+ &[data-size='m'] {
41
+ gap: 0.125rem;
42
+ font: var(--tui-typography-heading-h5);
43
+
44
+ [tuiSubtitle] {
45
+ font: var(--tui-typography-body-m);
46
+ }
47
+ }
48
+
49
+ &[data-size='l'] {
50
+ gap: 0.5rem;
51
+ font: var(--tui-typography-heading-h3);
52
+
53
+ [tuiSubtitle] {
54
+ font: var(--tui-typography-body-m);
55
+ }
56
+ }
57
+
58
+ h1,
59
+ h2,
60
+ h3,
61
+ h4,
62
+ h5,
63
+ h6 {
64
+ margin: 0;
65
+ font: inherit;
66
+ }
67
+
68
+ [tuiSubtitle] {
69
+ font: var(--tui-typography-ui-s);
70
+ margin: 0;
71
+ }
72
+ }
73
+
74
+ [tuiButton]:where(*&) [tuiTitle] {
75
+ margin-inline-end: auto;
76
+
77
+ [tuiSubtitle] {
78
+ color: var(--tui-text-secondary);
79
+ }
80
+ }
@@ -0,0 +1,46 @@
1
+ @import '../utils.less';
2
+
3
+ [tuiToast]:where(*&) {
4
+ .transition(transform);
5
+
6
+ display: flex;
7
+ grid-row: 1 / span 2;
8
+ box-sizing: border-box;
9
+ gap: 0.75rem;
10
+ color: var(--tui-text-primary);
11
+ background: var(--tui-background-elevation-3);
12
+ min-block-size: 3.5rem;
13
+ border-radius: 1rem;
14
+ padding: 0.75rem 1rem;
15
+ box-shadow: var(--tui-shadow-medium);
16
+ align-items: center;
17
+ justify-content: center;
18
+ inline-size: max-content;
19
+ font: var(--tui-typography-ui-s);
20
+ max-inline-size: ~'min(calc(100vw - 2rem), 25rem)';
21
+ border: inherit;
22
+ text-decoration: none;
23
+ white-space: pre-line;
24
+ text-align: start;
25
+ overflow: hidden;
26
+
27
+ .interactive({
28
+ cursor: pointer;
29
+ });
30
+
31
+ > *:not(tui-shrink-wrap),
32
+ &::after,
33
+ &::before {
34
+ max-inline-size: 50%;
35
+ margin: 0 -0.25rem;
36
+ }
37
+
38
+ &::after {
39
+ font-size: 1rem;
40
+ color: var(--tui-text-tertiary);
41
+ }
42
+
43
+ [tuiAvatar] {
44
+ margin-inline-end: 0;
45
+ }
46
+ }
@@ -0,0 +1,56 @@
1
+ @import 'miscellaneous.less';
2
+
3
+ .appearance-hover(@content) {
4
+ .interactive({
5
+ @media @tui-mouse {
6
+ &:hover:not([data-state]) {
7
+ @content();
8
+ }
9
+ }
10
+ });
11
+
12
+ &[data-state='hover'] {
13
+ @content();
14
+ }
15
+ }
16
+
17
+ .appearance-active(@content) {
18
+ .interactive({
19
+ &:active:not([data-state]) {
20
+ @content();
21
+ }
22
+ });
23
+
24
+ &[data-state='active'] {
25
+ @content();
26
+ }
27
+ }
28
+
29
+ .appearance-disabled(@content) {
30
+ &:disabled:not([data-state]),
31
+ &[data-state='disabled'] {
32
+ @content();
33
+ }
34
+ }
35
+
36
+ .appearance-focus(@content) {
37
+ &:focus-visible:not([data-focus='false']) {
38
+ @content();
39
+ }
40
+
41
+ &[data-focus='true'] {
42
+ @content();
43
+ }
44
+ }
45
+
46
+ .appearance-invalid(@content) {
47
+ &:is([data-mode~='invalid'], .tui-invalid, :invalid):not(
48
+ [data-mode~='readonly'],
49
+ [data-mode~='valid'],
50
+ [data-state='disabled'],
51
+ :disabled,
52
+ ._disabled
53
+ ) {
54
+ @content();
55
+ }
56
+ }
@@ -0,0 +1,57 @@
1
+ @import 'miscellaneous';
2
+ @import '../variables/media';
3
+
4
+ @mixin appearance-hover {
5
+ @include interactive {
6
+ @media ($tui-mouse) {
7
+ &:hover:not([data-state]) {
8
+ @content;
9
+ }
10
+ }
11
+ }
12
+
13
+ &[data-state='hover'] {
14
+ @content;
15
+ }
16
+ }
17
+
18
+ @mixin appearance-active {
19
+ @include interactive {
20
+ &:active:not([data-state]) {
21
+ @content;
22
+ }
23
+ }
24
+
25
+ &[data-state='active'] {
26
+ @content;
27
+ }
28
+ }
29
+
30
+ @mixin appearance-disabled {
31
+ &:disabled:not([data-state]),
32
+ &[data-state='disabled'] {
33
+ @content;
34
+ }
35
+ }
36
+
37
+ @mixin appearance-focus {
38
+ &:focus-visible:not([data-focus='false']) {
39
+ @content;
40
+ }
41
+
42
+ &[data-focus='true'] {
43
+ @content;
44
+ }
45
+ }
46
+
47
+ @mixin appearance-invalid {
48
+ &:is([data-mode~='invalid'], .tui-invalid, :invalid):not(
49
+ [data-mode~='readonly'],
50
+ [data-mode~='valid'],
51
+ [data-state='disabled'],
52
+ :disabled,
53
+ ._disabled
54
+ ) {
55
+ @content;
56
+ }
57
+ }