@tangible/ui 0.0.1 → 0.0.2

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 (129) hide show
  1. package/components/Card/Card.d.ts +1 -0
  2. package/components/Card/Card.js +17 -20
  3. package/components/Checkbox/Checkbox.d.ts +9 -0
  4. package/components/Checkbox/Checkbox.js +92 -0
  5. package/components/Checkbox/index.d.ts +2 -0
  6. package/components/Checkbox/index.js +1 -0
  7. package/components/Checkbox/types.d.ts +10 -0
  8. package/components/Checkbox/types.js +1 -0
  9. package/components/Chip/Chip.d.ts +4 -1
  10. package/components/Chip/Chip.js +32 -7
  11. package/components/ChipGroup/ChipGroup.d.ts +5 -0
  12. package/components/ChipGroup/ChipGroup.js +68 -0
  13. package/components/ChipGroup/ChipGroupContext.d.ts +3 -0
  14. package/components/ChipGroup/ChipGroupContext.js +5 -0
  15. package/components/ChipGroup/index.d.ts +3 -0
  16. package/components/ChipGroup/index.js +2 -0
  17. package/components/ChipGroup/types.d.ts +36 -0
  18. package/components/ChipGroup/types.js +1 -0
  19. package/components/Chips/Chips.d.ts +2 -0
  20. package/components/Chips/Chips.js +1 -1
  21. package/components/Combobox/Combobox.d.ts +33 -0
  22. package/components/Combobox/Combobox.js +466 -0
  23. package/components/Combobox/ComboboxContext.d.ts +8 -0
  24. package/components/Combobox/ComboboxContext.js +36 -0
  25. package/components/Combobox/index.d.ts +2 -0
  26. package/components/Combobox/index.js +1 -0
  27. package/components/Combobox/types.d.ts +204 -0
  28. package/components/Combobox/types.js +1 -0
  29. package/components/Dropdown/Dropdown.js +2 -1
  30. package/components/Field/Field.d.ts +39 -0
  31. package/components/Field/Field.js +92 -0
  32. package/components/Field/FieldContext.d.ts +16 -0
  33. package/components/Field/FieldContext.js +10 -0
  34. package/components/Field/index.d.ts +2 -0
  35. package/components/Field/index.js +1 -0
  36. package/components/Modal/Modal.d.ts +4 -4
  37. package/components/Modal/Modal.js +14 -12
  38. package/components/MultiSelect/MultiSelect.d.ts +39 -0
  39. package/components/MultiSelect/MultiSelect.js +623 -0
  40. package/components/MultiSelect/MultiSelectContext.d.ts +20 -0
  41. package/components/MultiSelect/MultiSelectContext.js +56 -0
  42. package/components/MultiSelect/index.d.ts +2 -0
  43. package/components/MultiSelect/index.js +1 -0
  44. package/components/MultiSelect/types.d.ts +218 -0
  45. package/components/MultiSelect/types.js +3 -0
  46. package/components/Notice/Notice.d.ts +1 -1
  47. package/components/Notice/Notice.js +1 -1
  48. package/components/Progress/Progress.js +1 -1
  49. package/components/Progress/types.d.ts +7 -7
  50. package/components/Radio/Radio.d.ts +2 -0
  51. package/components/Radio/Radio.js +50 -0
  52. package/components/Radio/RadioGroup.d.ts +2 -0
  53. package/components/Radio/RadioGroup.js +54 -0
  54. package/components/Radio/RadioGroupContext.d.ts +3 -0
  55. package/components/Radio/RadioGroupContext.js +9 -0
  56. package/components/Radio/index.d.ts +8 -0
  57. package/components/Radio/index.js +6 -0
  58. package/components/Radio/types.d.ts +32 -0
  59. package/components/Radio/types.js +1 -0
  60. package/components/Rating/Rating.d.ts +5 -5
  61. package/components/Rating/Rating.js +2 -2
  62. package/components/SegmentedControl/SegmentedControl.js +20 -104
  63. package/components/SegmentedControl/types.d.ts +4 -8
  64. package/components/Select/Select.d.ts +39 -0
  65. package/components/Select/Select.js +497 -0
  66. package/components/Select/SelectContext.d.ts +20 -0
  67. package/components/Select/SelectContext.js +56 -0
  68. package/components/Select/index.d.ts +3 -0
  69. package/components/Select/index.js +1 -0
  70. package/components/Select/types.d.ts +216 -0
  71. package/components/Select/types.js +11 -0
  72. package/components/Sidebar/Sidebar.js +12 -12
  73. package/components/Sidebar/types.d.ts +5 -5
  74. package/components/StepIndicator/StepIndicator.js +1 -1
  75. package/components/StepList/StepList.js +2 -2
  76. package/components/StepList/types.d.ts +4 -4
  77. package/components/Switch/Switch.d.ts +9 -0
  78. package/components/Switch/Switch.js +91 -0
  79. package/components/Switch/index.d.ts +2 -0
  80. package/components/Switch/index.js +1 -0
  81. package/components/Switch/types.d.ts +11 -0
  82. package/components/Switch/types.js +1 -0
  83. package/components/TextInput/TextInput.d.ts +8 -0
  84. package/components/TextInput/TextInput.js +25 -0
  85. package/components/TextInput/index.d.ts +2 -0
  86. package/components/TextInput/index.js +1 -0
  87. package/components/TextInput/types.d.ts +32 -0
  88. package/components/TextInput/types.js +1 -0
  89. package/components/Textarea/Textarea.d.ts +6 -0
  90. package/components/Textarea/Textarea.js +49 -0
  91. package/components/Textarea/index.d.ts +2 -0
  92. package/components/Textarea/index.js +1 -0
  93. package/components/Textarea/types.d.ts +25 -0
  94. package/components/Textarea/types.js +1 -0
  95. package/components/index.d.ts +20 -0
  96. package/components/index.js +10 -0
  97. package/icons/icons.svg +1 -0
  98. package/icons/manifest.json +8 -0
  99. package/icons/registry.d.ts +2 -0
  100. package/icons/registry.js +1 -0
  101. package/icons/system/index.d.ts +2 -0
  102. package/icons/system/index.js +11 -0
  103. package/package.json +1 -1
  104. package/styles/all.css +1 -1
  105. package/styles/all.expanded.css +1187 -96
  106. package/styles/all.expanded.unlayered.css +1187 -96
  107. package/styles/all.unlayered.css +1 -1
  108. package/styles/components/_bundle.scss +20 -0
  109. package/styles/components/input/index.scss +5 -20
  110. package/styles/index.scss +16 -0
  111. package/styles/system/_control.scss +34 -0
  112. package/styles/system/_tokens.scss +8 -0
  113. package/styles/system/index.scss +2 -1
  114. package/styles/utilities/_index.scss +50 -0
  115. package/tui-manifest.json +632 -61
  116. package/utils/compose-events.d.ts +15 -0
  117. package/utils/compose-events.js +27 -0
  118. package/utils/hash.d.ts +15 -0
  119. package/utils/hash.js +32 -0
  120. package/utils/index.d.ts +3 -0
  121. package/utils/index.js +6 -0
  122. package/utils/is-dev.d.ts +5 -0
  123. package/utils/is-dev.js +7 -0
  124. package/utils/use-controllable-state.d.ts +19 -0
  125. package/utils/use-controllable-state.js +59 -0
  126. package/utils/use-roving-group.d.ts +33 -0
  127. package/utils/use-roving-group.js +123 -0
  128. package/utils/value-key.d.ts +16 -0
  129. package/utils/value-key.js +14 -0
@@ -48,6 +48,12 @@
48
48
  --tui-card-foot-basis
49
49
  */
50
50
  /* @tui-tokens
51
+ --tui-field-gap
52
+ --tui-field-label-fg
53
+ --tui-field-helper-fg
54
+ --tui-field-error-fg
55
+ */
56
+ /* @tui-tokens
51
57
  --tui-modal-z
52
58
  --tui-modal-max
53
59
  --tui-modal-backdrop
@@ -84,6 +90,8 @@
84
90
  */
85
91
 
86
92
  :where(.tui-interface) {
93
+ /* UA chrome: native controls, scrollbars render in light mode */
94
+ color-scheme: light;
87
95
  /* ========================
88
96
  PRIMITIVES
89
97
  ======================== */
@@ -116,6 +124,7 @@
116
124
  --tui-color-bg-overlay: rgba(0, 0, 0, var(--tui-opacity-backdrop));
117
125
  /* Neutral: text */
118
126
  --tui-color-fg: #111928;
127
+ --tui-color-fg-secondary: #4B5563;
119
128
  --tui-color-fg-muted: #6B7280;
120
129
  --tui-color-fg-on-accent: #fff;
121
130
  --tui-color-fg-inverted: #fafafa;
@@ -175,6 +184,8 @@
175
184
  }
176
185
 
177
186
  :where(.tui-interface)[data-theme=dark] {
187
+ /* UA chrome: native controls, scrollbars render in dark mode */
188
+ color-scheme: dark;
178
189
  /* Backgrounds */
179
190
  --tui-color-bg: #111928;
180
191
  --tui-color-bg-surface: #202836;
@@ -183,6 +194,7 @@
183
194
  --tui-color-bg-overlay: rgba(0, 0, 0, 0.7);
184
195
  /* Text */
185
196
  --tui-color-fg: #F9FAFB;
197
+ --tui-color-fg-secondary: #D1D5DB;
186
198
  --tui-color-fg-muted: #9CA3AF;
187
199
  --tui-color-fg-on-accent: #fff;
188
200
  --tui-color-fg-inverted: #111928;
@@ -226,6 +238,8 @@
226
238
 
227
239
  @media (prefers-color-scheme: dark) {
228
240
  :where(.tui-interface)[data-theme=auto] {
241
+ /* UA chrome: native controls, scrollbars render in dark mode */
242
+ color-scheme: dark;
229
243
  /* Backgrounds */
230
244
  --tui-color-bg: #111928;
231
245
  --tui-color-bg-surface: #202836;
@@ -234,6 +248,7 @@
234
248
  --tui-color-bg-overlay: rgba(0, 0, 0, 0.7);
235
249
  /* Text */
236
250
  --tui-color-fg: #F9FAFB;
251
+ --tui-color-fg-secondary: #D1D5DB;
237
252
  --tui-color-fg-muted: #9CA3AF;
238
253
  --tui-color-fg-on-accent: #fff;
239
254
  --tui-color-fg-inverted: #111928;
@@ -275,6 +290,11 @@
275
290
  --tui-shadow-color: 0, 0, 0;
276
291
  }
277
292
  }
293
+ @media (prefers-reduced-motion: reduce) {
294
+ :where(.tui-interface) {
295
+ --tui-motion-duration: 0ms;
296
+ }
297
+ }
278
298
  .tui-interface {
279
299
  --tui-spacing-base: 4px;
280
300
  --tui-palette-spacing-1: calc(var(--tui-spacing-base) * 1);
@@ -340,6 +360,12 @@
340
360
  .tui-interface[data-theme] {
341
361
  color: var(--tui-color-fg);
342
362
  }
363
+ .tui-interface,
364
+ .tui-interface *,
365
+ .tui-interface *::before,
366
+ .tui-interface *::after {
367
+ box-sizing: border-box;
368
+ }
343
369
  .tui-interface button,
344
370
  .tui-interface [type=button],
345
371
  .tui-interface [type=submit],
@@ -457,20 +483,6 @@
457
483
  :where(.tui-interface) .tui-accordion__panel[data-state=open] > .tui-accordion__panel-content {
458
484
  animation: tui-fadeFromTransparent var(--tui-motion-duration) var(--tui-motion-timing) forwards;
459
485
  }
460
- @media (prefers-reduced-motion: reduce) {
461
- :where(.tui-interface) .tui-accordion__panel {
462
- transition: none;
463
- }
464
- :where(.tui-interface) .tui-accordion__panel-content {
465
- transition: none;
466
- }
467
- :where(.tui-interface) .tui-accordion__indicator {
468
- transition: none;
469
- }
470
- :where(.tui-interface) .tui-accordion__trigger {
471
- transition: none;
472
- }
473
- }
474
486
  :where(.tui-interface) {
475
487
  --tui-avatar-palette-coral: #c62828;
476
488
  --tui-avatar-palette-amber: #f59e0b;
@@ -537,12 +549,14 @@
537
549
  }
538
550
  :where(.tui-interface) .tui-avatar.is-color-lime {
539
551
  --_bg: var(--tui-avatar-bg, var(--tui-avatar-palette-lime));
552
+ --_fg: var(--tui-avatar-fg, var(--tui-color-fg));
540
553
  }
541
554
  :where(.tui-interface) .tui-avatar.is-color-teal {
542
555
  --_bg: var(--tui-avatar-bg, var(--tui-avatar-palette-teal));
543
556
  }
544
557
  :where(.tui-interface) .tui-avatar.is-color-cyan {
545
558
  --_bg: var(--tui-avatar-bg, var(--tui-avatar-palette-cyan));
559
+ --_fg: var(--tui-avatar-fg, var(--tui-color-fg));
546
560
  }
547
561
  :where(.tui-interface) .tui-avatar.is-color-blue {
548
562
  --_bg: var(--tui-avatar-bg, var(--tui-avatar-palette-blue));
@@ -675,7 +689,6 @@
675
689
  font-size: var(--tui-typography-size-md);
676
690
  font-weight: normal;
677
691
  line-height: 1.4;
678
- box-sizing: border-box;
679
692
  display: inline-flex;
680
693
  align-self: center;
681
694
  text-align: center;
@@ -869,11 +882,6 @@
869
882
  border-color: transparent;
870
883
  }
871
884
  }
872
- @media (prefers-reduced-motion: reduce) {
873
- .tui-interface .tui-button {
874
- transition: none;
875
- }
876
- }
877
885
  .tui-interface input[type=file] {
878
886
  --_bg: var(--tui-button-bg, var(--tui-theme-primary-base));
879
887
  --_fg: var(--tui-button-fg, var(--tui-color-bg-surface));
@@ -929,7 +937,6 @@
929
937
  --_shadow-interact: var(--tui-card-shadow-interact, var(--tui-shadow-sm));
930
938
  --_padding: var(--tui-card-padding, var(--tui-spacing-md));
931
939
  --_foot-basis: var(--tui-card-foot-basis, 500px);
932
- box-sizing: border-box;
933
940
  container-type: inline-size;
934
941
  container-name: tuiCard;
935
942
  position: relative;
@@ -955,7 +962,6 @@
955
962
  padding-block: var(--_padding);
956
963
  padding-inline: var(--_padding);
957
964
  width: 100%;
958
- box-sizing: border-box;
959
965
  }
960
966
  :where(.tui-interface) .tui-card__head .tui-card__media.is-flush:first-child {
961
967
  margin-block-start: calc(var(--_padding) * -1);
@@ -965,7 +971,6 @@
965
971
  :where(.tui-interface) .tui-card__body {
966
972
  padding-inline: var(--_padding);
967
973
  width: 100%;
968
- box-sizing: border-box;
969
974
  }
970
975
  :where(.tui-interface) .tui-card__body > *:first-child {
971
976
  margin-block-start: unset;
@@ -986,7 +991,6 @@
986
991
  padding-block: var(--_padding);
987
992
  padding-inline: var(--_padding);
988
993
  width: 100%;
989
- box-sizing: border-box;
990
994
  }
991
995
  :where(.tui-interface) .tui-card__foot .tui-card__media.is-flush:last-child {
992
996
  margin-block-end: calc(var(--_padding) * -1);
@@ -1077,6 +1081,27 @@
1077
1081
  :where(.tui-interface) .tui-card.is-style-elevated:hover {
1078
1082
  box-shadow: var(--_shadow-interact);
1079
1083
  }
1084
+ :where(.tui-interface) input[type=checkbox]:not(.tui-inline-choice input):focus-visible {
1085
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
1086
+ outline-offset: var(--tui-focus-ring-offset);
1087
+ }
1088
+ :where(.tui-interface) input[type=checkbox]:not(.tui-inline-choice input):checked {
1089
+ accent-color: var(--tui-input-accent, var(--tui-theme-primary-base));
1090
+ }
1091
+ :where(.tui-interface) input[type=checkbox]:not(.tui-inline-choice input):disabled {
1092
+ opacity: var(--tui-opacity-disabled);
1093
+ cursor: not-allowed;
1094
+ }
1095
+ :where(.tui-interface) input[type=checkbox][data-indeterminate=true] {
1096
+ accent-color: var(--tui-input-accent, var(--tui-theme-primary-base));
1097
+ }
1098
+ :where(.tui-interface) .tui-inline-choice.is-disabled {
1099
+ opacity: var(--tui-opacity-disabled);
1100
+ cursor: not-allowed;
1101
+ }
1102
+ :where(.tui-interface) .tui-inline-choice.is-disabled input {
1103
+ cursor: not-allowed;
1104
+ }
1080
1105
  :where(.tui-interface) .tui-chip {
1081
1106
  --_bg: var(--tui-chip-bg, var(--tui-theme-secondary-subtle));
1082
1107
  --_fg: var(--tui-chip-fg, var(--tui-theme-secondary-strongest));
@@ -1325,6 +1350,240 @@
1325
1350
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
1326
1351
  outline-offset: var(--tui-focus-ring-offset);
1327
1352
  }
1353
+ .tui-chip-group {
1354
+ display: flex;
1355
+ flex-wrap: wrap;
1356
+ gap: var(--_gap, var(--tui-chip-group-gap, var(--tui-spacing-sm)));
1357
+ }
1358
+ .tui-chip-group.is-density-xs {
1359
+ --_gap: var(--tui-chip-group-gap, var(--tui-spacing-xs));
1360
+ }
1361
+ .tui-chip-group.is-density-sm {
1362
+ --_gap: var(--tui-chip-group-gap, var(--tui-spacing-sm));
1363
+ }
1364
+ .tui-chip-group.is-density-md {
1365
+ --_gap: var(--tui-chip-group-gap, var(--tui-spacing-md));
1366
+ }
1367
+ .tui-chip-group.is-direction-stack {
1368
+ flex-direction: column;
1369
+ flex-wrap: nowrap;
1370
+ }
1371
+ .tui-chip-group:not(.is-direction-stack).is-align-start {
1372
+ justify-content: flex-start;
1373
+ }
1374
+ .tui-chip-group:not(.is-direction-stack).is-align-center {
1375
+ justify-content: center;
1376
+ }
1377
+ .tui-chip-group:not(.is-direction-stack).is-align-end {
1378
+ justify-content: flex-end;
1379
+ }
1380
+ .tui-chip-group.is-direction-stack.is-align-start {
1381
+ align-items: flex-start;
1382
+ }
1383
+ .tui-chip-group.is-direction-stack.is-align-center {
1384
+ align-items: center;
1385
+ }
1386
+ .tui-chip-group.is-direction-stack.is-align-end {
1387
+ align-items: flex-end;
1388
+ }
1389
+ .tui-interface .tui-combobox {
1390
+ position: relative;
1391
+ display: inline-block;
1392
+ width: 100%;
1393
+ }
1394
+ .tui-interface .tui-combobox__input-wrapper {
1395
+ position: relative;
1396
+ display: flex;
1397
+ align-items: center;
1398
+ }
1399
+ .tui-interface .tui-combobox__input {
1400
+ --_bg: var(--tui-combobox-input-bg, var(--tui-select-trigger-bg, var(--tui-color-bg)));
1401
+ --_fg: var(--tui-combobox-input-fg, var(--tui-select-trigger-fg, var(--tui-color-fg)));
1402
+ --_border: var(--tui-combobox-input-border, var(--tui-select-trigger-border, var(--tui-color-border)));
1403
+ --_border-focus: var(--tui-combobox-input-border-focus, var(--tui-select-trigger-border-focus, var(--tui-theme-primary-base)));
1404
+ --_radius: var(--tui-combobox-input-radius, var(--tui-select-trigger-radius, var(--tui-radius-md)));
1405
+ appearance: none;
1406
+ font: inherit;
1407
+ margin: 0;
1408
+ --_fs: var(--tui-typography-size-md);
1409
+ --_py: var(--tui-spacing-xxs);
1410
+ font-size: var(--_fs);
1411
+ padding-block: var(--_py);
1412
+ min-height: calc(2em + 2 * var(--_py));
1413
+ }
1414
+ .tui-interface .tui-combobox__input.is-size-sm {
1415
+ --_fs: var(--tui-typography-size-sm);
1416
+ }
1417
+ .tui-interface .tui-combobox__input.is-size-lg {
1418
+ --_fs: var(--tui-typography-size-lg);
1419
+ }
1420
+ .tui-interface .tui-combobox__input {
1421
+ display: block;
1422
+ width: 100%;
1423
+ padding-inline: var(--tui-spacing-sm);
1424
+ padding-right: calc(var(--tui-spacing-sm) + 1.5em + var(--tui-spacing-xs) + 1.25em);
1425
+ background-color: var(--_bg);
1426
+ color: var(--_fg);
1427
+ border: var(--tui-border-width) solid var(--_border);
1428
+ border-radius: var(--_radius);
1429
+ line-height: 1.4;
1430
+ transition-duration: var(--tui-motion-duration);
1431
+ transition-timing-function: var(--tui-motion-timing);
1432
+ transition-property: border-color, background-color;
1433
+ }
1434
+ .tui-interface .tui-combobox__input::placeholder {
1435
+ color: var(--tui-color-fg-muted);
1436
+ }
1437
+ .tui-interface .tui-combobox__input:hover:not(:disabled) {
1438
+ --_border: var(--tui-theme-secondary-soft);
1439
+ }
1440
+ .tui-interface .tui-combobox__input:focus {
1441
+ --_border: var(--_border-focus);
1442
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
1443
+ outline-offset: var(--tui-focus-ring-offset);
1444
+ }
1445
+ .tui-interface .tui-combobox__input[aria-expanded=true] {
1446
+ --_border: var(--_border-focus);
1447
+ }
1448
+ .tui-interface .tui-combobox__input:disabled {
1449
+ opacity: var(--tui-opacity-disabled);
1450
+ cursor: not-allowed;
1451
+ }
1452
+ .tui-interface .tui-combobox__clear {
1453
+ position: absolute;
1454
+ right: calc(var(--tui-spacing-sm) + 1.25em + var(--tui-spacing-xxs));
1455
+ display: flex;
1456
+ align-items: center;
1457
+ justify-content: center;
1458
+ width: 1.25em;
1459
+ height: 1.25em;
1460
+ border-radius: var(--tui-radius-sm);
1461
+ color: var(--tui-color-fg-muted);
1462
+ cursor: pointer;
1463
+ transition: color var(--tui-motion-duration) var(--tui-motion-timing), background-color var(--tui-motion-duration) var(--tui-motion-timing);
1464
+ }
1465
+ .tui-interface .tui-combobox__clear:hover {
1466
+ color: var(--tui-color-fg);
1467
+ background-color: var(--tui-theme-secondary-subtlest);
1468
+ }
1469
+ .tui-interface .tui-combobox__icon {
1470
+ position: absolute;
1471
+ right: var(--tui-spacing-sm);
1472
+ display: flex;
1473
+ align-items: center;
1474
+ justify-content: center;
1475
+ color: var(--tui-color-fg-muted);
1476
+ pointer-events: none;
1477
+ transition: transform var(--tui-motion-duration) var(--tui-motion-timing);
1478
+ }
1479
+ [aria-expanded=true] ~ .tui-interface .tui-combobox__icon {
1480
+ transform: rotate(180deg);
1481
+ }
1482
+ :where(.tui-interface) .tui-combobox__content {
1483
+ --_bg: var(--tui-combobox-content-bg, var(--tui-select-content-bg, var(--tui-color-bg-elevated)));
1484
+ --_border: var(--tui-combobox-content-border, var(--tui-select-content-border, var(--tui-color-border)));
1485
+ --_shadow: var(--tui-combobox-content-shadow, var(--tui-select-content-shadow, 0 4px 12px rgba(0, 0, 0, 0.15)));
1486
+ --_radius: var(--tui-combobox-content-radius, var(--tui-select-content-radius, var(--tui-radius-md)));
1487
+ z-index: var(--tui-layer-top);
1488
+ min-width: 160px;
1489
+ padding: var(--tui-spacing-xxs);
1490
+ overflow-y: auto;
1491
+ overscroll-behavior: contain;
1492
+ pointer-events: auto;
1493
+ scrollbar-width: thin;
1494
+ scrollbar-color: var(--tui-color-fg-muted) transparent;
1495
+ }
1496
+ :where(.tui-interface) .tui-combobox__content::-webkit-scrollbar {
1497
+ width: 8px;
1498
+ }
1499
+ :where(.tui-interface) .tui-combobox__content::-webkit-scrollbar-track {
1500
+ background: transparent;
1501
+ }
1502
+ :where(.tui-interface) .tui-combobox__content::-webkit-scrollbar-thumb {
1503
+ background-color: var(--tui-color-fg-muted);
1504
+ border-radius: 4px;
1505
+ border: 2px solid transparent;
1506
+ background-clip: content-box;
1507
+ opacity: 0.5;
1508
+ }
1509
+ :where(.tui-interface) .tui-combobox__content::-webkit-scrollbar-thumb:hover {
1510
+ opacity: 1;
1511
+ }
1512
+ :where(.tui-interface) .tui-combobox__content {
1513
+ background-color: var(--_bg);
1514
+ border: var(--tui-border-width) solid var(--_border);
1515
+ border-radius: var(--_radius);
1516
+ box-shadow: var(--_shadow);
1517
+ animation: tui-fadeFromTransparent var(--tui-motion-duration) var(--tui-motion-timing);
1518
+ }
1519
+ :where(.tui-interface) .tui-combobox__option {
1520
+ --_bg-hover: var(--tui-combobox-option-bg-hover, var(--tui-select-option-bg-hover, var(--tui-theme-secondary-subtlest)));
1521
+ --_bg-selected: var(--tui-combobox-option-bg-selected, var(--tui-select-option-bg-selected, var(--tui-theme-primary-subtlest)));
1522
+ display: flex;
1523
+ align-items: center;
1524
+ justify-content: space-between;
1525
+ gap: var(--tui-spacing-xs);
1526
+ padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
1527
+ border-radius: var(--tui-radius-sm);
1528
+ cursor: pointer;
1529
+ font-size: var(--tui-typography-size-sm);
1530
+ line-height: 1.4;
1531
+ }
1532
+ :where(.tui-interface) .tui-combobox__option:hover:not([data-disabled]), :where(.tui-interface) .tui-combobox__option[data-highlighted]:not([data-disabled]) {
1533
+ background-color: var(--_bg-hover);
1534
+ }
1535
+ :where(.tui-interface) .tui-combobox__option[aria-selected=true] {
1536
+ background-color: var(--_bg-selected);
1537
+ }
1538
+ :where(.tui-interface) .tui-combobox__option[aria-selected=true]:hover:not([data-disabled]), :where(.tui-interface) .tui-combobox__option[aria-selected=true][data-highlighted]:not([data-disabled]) {
1539
+ background-color: var(--tui-theme-primary-subtle);
1540
+ }
1541
+ :where(.tui-interface) .tui-combobox__option[data-disabled] {
1542
+ opacity: var(--tui-opacity-disabled);
1543
+ cursor: not-allowed;
1544
+ }
1545
+ :where(.tui-interface) .tui-combobox__option-content {
1546
+ flex: 1;
1547
+ min-width: 0;
1548
+ }
1549
+ :where(.tui-interface) .tui-combobox__option-check {
1550
+ flex-shrink: 0;
1551
+ color: var(--tui-theme-primary-base);
1552
+ }
1553
+ :where(.tui-interface) .tui-combobox__group + :where(.tui-interface) .tui-combobox__group {
1554
+ margin-top: var(--tui-spacing-xxs);
1555
+ padding-top: var(--tui-spacing-xxs);
1556
+ border-top: var(--tui-border-width) solid var(--tui-color-divider);
1557
+ }
1558
+ :where(.tui-interface) .tui-combobox__label {
1559
+ padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
1560
+ padding-bottom: var(--tui-spacing-xxs);
1561
+ font-size: var(--tui-typography-size-xs);
1562
+ font-weight: 600;
1563
+ color: var(--tui-color-fg-muted);
1564
+ text-transform: uppercase;
1565
+ letter-spacing: 0.05em;
1566
+ }
1567
+ @media (forced-colors: active) {
1568
+ .tui-interface .tui-combobox__input {
1569
+ background-color: Canvas;
1570
+ color: CanvasText;
1571
+ border-color: CanvasText;
1572
+ }
1573
+ .tui-interface .tui-combobox__input:focus {
1574
+ outline-color: Highlight;
1575
+ }
1576
+ :where(.tui-interface) .tui-combobox__content {
1577
+ background-color: Canvas;
1578
+ color: CanvasText;
1579
+ border-color: CanvasText;
1580
+ }
1581
+ :where(.tui-interface) .tui-combobox__option:hover:not([data-disabled]), :where(.tui-interface) .tui-combobox__option[data-highlighted]:not([data-disabled]), :where(.tui-interface) .tui-combobox__option[aria-selected=true] {
1582
+ background-color: Highlight;
1583
+ color: HighlightText;
1584
+ forced-color-adjust: none;
1585
+ }
1586
+ }
1328
1587
  :where(.tui-interface) .tui-content-indicator {
1329
1588
  --_bg: var(--tui-content-indicator-bg, transparent);
1330
1589
  --_border: var(--tui-content-indicator-border, var(--tui-color-border));
@@ -1393,7 +1652,6 @@
1393
1652
  --_border: var(--tui-dropdown-border, var(--tui-color-border-default));
1394
1653
  --_item-bg-hover: var(--tui-dropdown-item-bg-hover, var(--tui-color-bg-subtle));
1395
1654
  --_item-bg-active: var(--tui-dropdown-item-bg-active, var(--tui-color-bg-muted));
1396
- box-sizing: border-box;
1397
1655
  z-index: var(--_z);
1398
1656
  min-width: var(--tui-dropdown-min-width, 160px);
1399
1657
  padding: var(--tui-spacing-xxs, 4px);
@@ -1410,7 +1668,6 @@
1410
1668
  :where(.tui-interface) .tui-dropdown__item,
1411
1669
  :where(.tui-interface) .tui-dropdown .tui-button,
1412
1670
  :where(.tui-interface) .tui-dropdown .tui-icon-button {
1413
- box-sizing: border-box;
1414
1671
  justify-content: flex-start;
1415
1672
  width: 100%;
1416
1673
  min-width: 0;
@@ -1451,11 +1708,6 @@
1451
1708
  :where(.tui-interface) .tui-dropdown .tui-icon-button {
1452
1709
  justify-content: center;
1453
1710
  }
1454
- @media (prefers-reduced-motion: reduce) {
1455
- :where(.tui-interface) .tui-dropdown {
1456
- animation: none;
1457
- }
1458
- }
1459
1711
  @media (forced-colors: active) {
1460
1712
  :where(.tui-interface) .tui-dropdown {
1461
1713
  background-color: Canvas;
@@ -1474,10 +1726,598 @@
1474
1726
  forced-color-adjust: none;
1475
1727
  }
1476
1728
  }
1477
- :where(.tui-interface) :is(label, .tui-label) {
1478
- color: var(--tui-color-fg);
1479
- font-weight: bold;
1729
+ :where(.tui-interface) .tui-field {
1730
+ --_gap: var(--tui-field-gap, var(--tui-spacing-xs));
1731
+ --_label-fg: var(--tui-field-label-fg, var(--tui-color-fg));
1732
+ --_helper-fg: var(--tui-field-helper-fg, var(--tui-color-fg-secondary));
1733
+ --_error-fg: var(--tui-field-error-fg, var(--tui-theme-danger-base));
1734
+ display: flex;
1735
+ flex-direction: column;
1736
+ gap: var(--_gap);
1737
+ }
1738
+ :where(.tui-interface) .tui-field.is-layout-inline {
1739
+ display: grid;
1740
+ grid-template-columns: auto 1fr;
1741
+ align-items: baseline;
1742
+ column-gap: var(--tui-spacing-sm);
1743
+ row-gap: var(--_gap);
1744
+ }
1745
+ :where(.tui-interface) .tui-field.is-layout-inline .tui-field__label {
1746
+ grid-column: 1;
1747
+ }
1748
+ :where(.tui-interface) .tui-field.is-layout-inline > :not(.tui-field__label):not(.tui-field__helper):not(.tui-field__error) {
1749
+ grid-column: 2;
1750
+ }
1751
+ :where(.tui-interface) .tui-field.is-layout-inline .tui-field__helper,
1752
+ :where(.tui-interface) .tui-field.is-layout-inline .tui-field__error {
1753
+ grid-column: 2;
1754
+ }
1755
+ :where(.tui-interface) .tui-field__label {
1756
+ color: var(--_label-fg);
1480
1757
  font-size: var(--tui-typography-size-sm);
1758
+ font-weight: bold;
1759
+ line-height: 1.25;
1760
+ }
1761
+ :where(.tui-interface) .tui-field__required {
1762
+ color: var(--_error-fg);
1763
+ margin-inline-start: 0.125em;
1764
+ }
1765
+ :where(.tui-interface) .tui-field__helper {
1766
+ color: var(--_helper-fg);
1767
+ font-size: var(--tui-typography-size-xs);
1768
+ line-height: 1.4;
1769
+ }
1770
+ :where(.tui-interface) .tui-field__error {
1771
+ color: var(--_error-fg);
1772
+ font-size: var(--tui-typography-size-xs);
1773
+ line-height: 1.4;
1774
+ }
1775
+ :where(.tui-interface) .tui-field.is-error .tui-field__label {
1776
+ color: var(--_error-fg);
1777
+ }
1778
+ :where(.tui-interface) .tui-field.is-disabled {
1779
+ pointer-events: none;
1780
+ }
1781
+ .tui-interface .tui-multiselect__trigger {
1782
+ --_bg: var(--tui-multiselect-trigger-bg, var(--tui-color-bg));
1783
+ --_fg: var(--tui-multiselect-trigger-fg, var(--tui-color-fg));
1784
+ --_border: var(--tui-multiselect-trigger-border, var(--tui-color-border));
1785
+ --_border-focus: var(--tui-multiselect-trigger-border-focus, var(--tui-theme-primary-base));
1786
+ --_radius: var(--tui-multiselect-trigger-radius, var(--tui-radius-md));
1787
+ appearance: none;
1788
+ border: none;
1789
+ font: inherit;
1790
+ margin: 0;
1791
+ --_fs: var(--tui-typography-size-md);
1792
+ --_py: var(--tui-spacing-xxs);
1793
+ font-size: var(--_fs);
1794
+ padding-block: var(--_py);
1795
+ min-height: calc(2em + 2 * var(--_py));
1796
+ }
1797
+ .tui-interface .tui-multiselect__trigger.is-size-sm {
1798
+ --_fs: var(--tui-typography-size-sm);
1799
+ }
1800
+ .tui-interface .tui-multiselect__trigger.is-size-lg {
1801
+ --_fs: var(--tui-typography-size-lg);
1802
+ }
1803
+ .tui-interface .tui-multiselect__trigger {
1804
+ display: inline-flex;
1805
+ align-items: center;
1806
+ justify-content: space-between;
1807
+ gap: var(--tui-spacing-xs);
1808
+ min-width: 160px;
1809
+ width: 100%;
1810
+ padding-inline: var(--tui-spacing-sm);
1811
+ background-color: var(--_bg);
1812
+ color: var(--_fg);
1813
+ border: var(--tui-border-width) solid var(--_border);
1814
+ border-radius: var(--_radius);
1815
+ cursor: pointer;
1816
+ line-height: 1.4;
1817
+ text-align: left;
1818
+ transition-duration: var(--tui-motion-duration);
1819
+ transition-timing-function: var(--tui-motion-timing);
1820
+ transition-property: border-color, background-color;
1821
+ }
1822
+ .tui-interface .tui-multiselect__trigger:hover:not([data-disabled]) {
1823
+ --_border: var(--tui-theme-secondary-soft);
1824
+ }
1825
+ .tui-interface .tui-multiselect__trigger:focus-visible {
1826
+ --_border: var(--_border-focus);
1827
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
1828
+ outline-offset: var(--tui-focus-ring-offset);
1829
+ }
1830
+ .tui-interface .tui-multiselect__trigger[data-state=open] {
1831
+ --_border: var(--_border-focus);
1832
+ }
1833
+ .tui-interface .tui-multiselect__trigger[data-disabled] {
1834
+ opacity: var(--tui-opacity-disabled);
1835
+ cursor: not-allowed;
1836
+ }
1837
+ .tui-interface .tui-multiselect__value {
1838
+ flex: 1;
1839
+ min-width: 0;
1840
+ overflow: hidden;
1841
+ }
1842
+ .tui-interface .tui-multiselect__placeholder {
1843
+ color: var(--tui-color-fg-muted);
1844
+ white-space: nowrap;
1845
+ overflow: hidden;
1846
+ text-overflow: ellipsis;
1847
+ }
1848
+ .tui-interface .tui-multiselect__count {
1849
+ white-space: nowrap;
1850
+ }
1851
+ .tui-interface .tui-multiselect__chips {
1852
+ display: flex;
1853
+ flex-wrap: wrap;
1854
+ gap: var(--tui-spacing-xxs);
1855
+ min-width: 0;
1856
+ }
1857
+ .tui-interface .tui-multiselect__chip {
1858
+ --_chip-bg: var(--tui-multiselect-chip-bg, var(--tui-theme-secondary-subtlest));
1859
+ --_chip-fg: var(--tui-multiselect-chip-fg, var(--tui-color-fg));
1860
+ display: inline-flex;
1861
+ align-items: center;
1862
+ padding: 0.125em 0.5em;
1863
+ background-color: var(--_chip-bg);
1864
+ color: var(--_chip-fg);
1865
+ border-radius: var(--tui-radius-sm);
1866
+ font-size: var(--tui-typography-size-xs);
1867
+ line-height: 1.4;
1868
+ white-space: nowrap;
1869
+ max-width: 120px;
1870
+ overflow: hidden;
1871
+ text-overflow: ellipsis;
1872
+ }
1873
+ .tui-interface .tui-multiselect__more {
1874
+ display: inline-flex;
1875
+ align-items: center;
1876
+ padding: 0.125em 0.375em;
1877
+ color: var(--tui-color-fg-muted);
1878
+ font-size: var(--tui-typography-size-xs);
1879
+ line-height: 1.4;
1880
+ white-space: nowrap;
1881
+ }
1882
+ .tui-interface .tui-multiselect__clear {
1883
+ display: flex;
1884
+ align-items: center;
1885
+ justify-content: center;
1886
+ flex-shrink: 0;
1887
+ width: 1.25em;
1888
+ height: 1.25em;
1889
+ border-radius: var(--tui-radius-sm);
1890
+ color: var(--tui-color-fg-muted);
1891
+ cursor: pointer;
1892
+ transition: color var(--tui-motion-duration) var(--tui-motion-timing), background-color var(--tui-motion-duration) var(--tui-motion-timing);
1893
+ }
1894
+ .tui-interface .tui-multiselect__clear:hover {
1895
+ color: var(--tui-color-fg);
1896
+ background-color: var(--tui-theme-secondary-subtlest);
1897
+ }
1898
+ [data-disabled] .tui-interface .tui-multiselect__clear {
1899
+ pointer-events: none;
1900
+ }
1901
+ .tui-interface .tui-multiselect__icon {
1902
+ flex-shrink: 0;
1903
+ color: var(--tui-color-fg-muted);
1904
+ transition: transform var(--tui-motion-duration) var(--tui-motion-timing);
1905
+ }
1906
+ [data-state=open] .tui-interface .tui-multiselect__icon {
1907
+ transform: rotate(180deg);
1908
+ }
1909
+ :where(.tui-interface) .tui-multiselect__content {
1910
+ --_bg: var(--tui-multiselect-content-bg, var(--tui-color-bg-elevated));
1911
+ --_border: var(--tui-multiselect-content-border, var(--tui-color-border));
1912
+ --_shadow: var(--tui-multiselect-content-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));
1913
+ --_radius: var(--tui-multiselect-content-radius, var(--tui-radius-md));
1914
+ z-index: var(--tui-layer-top);
1915
+ min-width: 160px;
1916
+ padding: var(--tui-spacing-xxs);
1917
+ overflow-y: auto;
1918
+ overscroll-behavior: contain;
1919
+ pointer-events: auto;
1920
+ scrollbar-width: thin;
1921
+ scrollbar-color: var(--tui-color-fg-muted) transparent;
1922
+ }
1923
+ :where(.tui-interface) .tui-multiselect__content::-webkit-scrollbar {
1924
+ width: 8px;
1925
+ }
1926
+ :where(.tui-interface) .tui-multiselect__content::-webkit-scrollbar-track {
1927
+ background: transparent;
1928
+ }
1929
+ :where(.tui-interface) .tui-multiselect__content::-webkit-scrollbar-thumb {
1930
+ background-color: var(--tui-color-fg-muted);
1931
+ border-radius: 4px;
1932
+ border: 2px solid transparent;
1933
+ background-clip: content-box;
1934
+ opacity: 0.5;
1935
+ }
1936
+ :where(.tui-interface) .tui-multiselect__content::-webkit-scrollbar-thumb:hover {
1937
+ opacity: 1;
1938
+ }
1939
+ :where(.tui-interface) .tui-multiselect__content {
1940
+ background-color: var(--_bg);
1941
+ border: var(--tui-border-width) solid var(--_border);
1942
+ border-radius: var(--_radius);
1943
+ box-shadow: var(--_shadow);
1944
+ animation: tui-fadeFromTransparent var(--tui-motion-duration) var(--tui-motion-timing);
1945
+ }
1946
+ :where(.tui-interface) .tui-multiselect__option {
1947
+ --_bg-hover: var(--tui-multiselect-option-bg-hover, var(--tui-theme-secondary-subtlest));
1948
+ --_bg-selected: var(--tui-multiselect-option-bg-selected, var(--tui-theme-primary-subtlest));
1949
+ display: flex;
1950
+ align-items: center;
1951
+ gap: var(--tui-spacing-xs);
1952
+ padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
1953
+ border-radius: var(--tui-radius-sm);
1954
+ cursor: pointer;
1955
+ font-size: var(--tui-typography-size-sm);
1956
+ line-height: 1.4;
1957
+ }
1958
+ :where(.tui-interface) .tui-multiselect__option:hover:not([data-disabled]):not([data-blocked]), :where(.tui-interface) .tui-multiselect__option[data-highlighted]:not([data-disabled]):not([data-blocked]) {
1959
+ background-color: var(--_bg-hover);
1960
+ }
1961
+ :where(.tui-interface) .tui-multiselect__option[aria-selected=true] {
1962
+ background-color: var(--_bg-selected);
1963
+ }
1964
+ :where(.tui-interface) .tui-multiselect__option[aria-selected=true]:hover:not([data-disabled]):not([data-blocked]), :where(.tui-interface) .tui-multiselect__option[aria-selected=true][data-highlighted]:not([data-disabled]):not([data-blocked]) {
1965
+ background-color: var(--tui-theme-primary-subtle);
1966
+ }
1967
+ :where(.tui-interface) .tui-multiselect__option[data-disabled] {
1968
+ opacity: var(--tui-opacity-disabled);
1969
+ cursor: not-allowed;
1970
+ }
1971
+ :where(.tui-interface) .tui-multiselect__option[data-blocked] {
1972
+ opacity: var(--tui-opacity-disabled);
1973
+ cursor: not-allowed;
1974
+ }
1975
+ :where(.tui-interface) .tui-multiselect__option-content {
1976
+ display: flex;
1977
+ align-items: center;
1978
+ gap: var(--tui-spacing-xs);
1979
+ flex: 1;
1980
+ min-width: 0;
1981
+ }
1982
+ :where(.tui-interface) .tui-multiselect__checkbox {
1983
+ display: flex;
1984
+ align-items: center;
1985
+ justify-content: center;
1986
+ flex-shrink: 0;
1987
+ width: 1em;
1988
+ height: 1em;
1989
+ border: var(--tui-border-width) solid var(--tui-color-border);
1990
+ border-radius: var(--tui-radius-xs);
1991
+ background-color: var(--tui-color-bg);
1992
+ color: var(--tui-color-fg-on-accent);
1993
+ transition: background-color var(--tui-motion-duration) var(--tui-motion-timing), border-color var(--tui-motion-duration) var(--tui-motion-timing);
1994
+ }
1995
+ :where(.tui-interface) .tui-multiselect__checkbox.is-checked {
1996
+ background-color: var(--tui-theme-primary-base);
1997
+ border-color: var(--tui-theme-primary-base);
1998
+ }
1999
+ [data-disabled] :where(.tui-interface) .tui-multiselect__checkbox {
2000
+ opacity: var(--tui-opacity-disabled);
2001
+ }
2002
+ :where(.tui-interface) .tui-multiselect__group + :where(.tui-interface) .tui-multiselect__group {
2003
+ margin-top: var(--tui-spacing-xxs);
2004
+ padding-top: var(--tui-spacing-xxs);
2005
+ border-top: var(--tui-border-width) solid var(--tui-color-divider);
2006
+ }
2007
+ :where(.tui-interface) .tui-multiselect__label {
2008
+ padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
2009
+ padding-bottom: var(--tui-spacing-xxs);
2010
+ font-size: var(--tui-typography-size-xs);
2011
+ font-weight: 600;
2012
+ color: var(--tui-color-fg-muted);
2013
+ text-transform: uppercase;
2014
+ letter-spacing: 0.05em;
2015
+ }
2016
+ @media (forced-colors: active) {
2017
+ .tui-interface .tui-multiselect__trigger {
2018
+ background-color: Canvas;
2019
+ color: CanvasText;
2020
+ border-color: CanvasText;
2021
+ }
2022
+ .tui-interface .tui-multiselect__trigger:focus-visible {
2023
+ outline-color: Highlight;
2024
+ }
2025
+ :where(.tui-interface) .tui-multiselect__content {
2026
+ background-color: Canvas;
2027
+ color: CanvasText;
2028
+ border-color: CanvasText;
2029
+ }
2030
+ :where(.tui-interface) .tui-multiselect__option:hover:not([data-disabled]), :where(.tui-interface) .tui-multiselect__option[data-highlighted]:not([data-disabled]), :where(.tui-interface) .tui-multiselect__option[aria-selected=true] {
2031
+ background-color: Highlight;
2032
+ color: HighlightText;
2033
+ forced-color-adjust: none;
2034
+ }
2035
+ :where(.tui-interface) .tui-multiselect__checkbox {
2036
+ border-color: CanvasText;
2037
+ }
2038
+ :where(.tui-interface) .tui-multiselect__checkbox.is-checked {
2039
+ background-color: Highlight;
2040
+ border-color: Highlight;
2041
+ }
2042
+ .tui-interface .tui-multiselect__chip {
2043
+ border: 1px solid CanvasText;
2044
+ }
2045
+ }
2046
+ .tui-interface .tui-select__trigger {
2047
+ --_bg: var(--tui-select-trigger-bg, var(--tui-color-bg));
2048
+ --_fg: var(--tui-select-trigger-fg, var(--tui-color-fg));
2049
+ --_border: var(--tui-select-trigger-border, var(--tui-color-border));
2050
+ --_border-focus: var(--tui-select-trigger-border-focus, var(--tui-theme-primary-base));
2051
+ --_radius: var(--tui-select-trigger-radius, var(--tui-radius-md));
2052
+ appearance: none;
2053
+ border: none;
2054
+ font: inherit;
2055
+ margin: 0;
2056
+ --_fs: var(--tui-typography-size-md);
2057
+ --_py: var(--tui-spacing-xxs);
2058
+ font-size: var(--_fs);
2059
+ padding-block: var(--_py);
2060
+ min-height: calc(2em + 2 * var(--_py));
2061
+ }
2062
+ .tui-interface .tui-select__trigger.is-size-sm {
2063
+ --_fs: var(--tui-typography-size-sm);
2064
+ }
2065
+ .tui-interface .tui-select__trigger.is-size-lg {
2066
+ --_fs: var(--tui-typography-size-lg);
2067
+ }
2068
+ .tui-interface .tui-select__trigger {
2069
+ display: inline-flex;
2070
+ align-items: center;
2071
+ justify-content: space-between;
2072
+ gap: var(--tui-spacing-xs);
2073
+ min-width: 160px;
2074
+ width: 100%;
2075
+ padding-inline: var(--tui-spacing-sm);
2076
+ background-color: var(--_bg);
2077
+ color: var(--_fg);
2078
+ border: var(--tui-border-width) solid var(--_border);
2079
+ border-radius: var(--_radius);
2080
+ cursor: pointer;
2081
+ line-height: 1.4;
2082
+ text-align: left;
2083
+ transition-duration: var(--tui-motion-duration);
2084
+ transition-timing-function: var(--tui-motion-timing);
2085
+ transition-property: border-color, background-color;
2086
+ }
2087
+ .tui-interface .tui-select__trigger:hover:not([data-disabled]) {
2088
+ --_border: var(--tui-theme-secondary-soft);
2089
+ }
2090
+ .tui-interface .tui-select__trigger:focus-visible {
2091
+ --_border: var(--_border-focus);
2092
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
2093
+ outline-offset: var(--tui-focus-ring-offset);
2094
+ }
2095
+ .tui-interface .tui-select__trigger[data-state=open] {
2096
+ --_border: var(--_border-focus);
2097
+ }
2098
+ .tui-interface .tui-select__trigger[data-disabled] {
2099
+ opacity: var(--tui-opacity-disabled);
2100
+ cursor: not-allowed;
2101
+ }
2102
+ .tui-interface .tui-select__value {
2103
+ flex: 1;
2104
+ min-width: 0;
2105
+ overflow: hidden;
2106
+ text-overflow: ellipsis;
2107
+ white-space: nowrap;
2108
+ }
2109
+ .tui-interface .tui-select__placeholder {
2110
+ color: var(--tui-color-fg-muted);
2111
+ }
2112
+ .tui-interface .tui-select__icon {
2113
+ flex-shrink: 0;
2114
+ color: var(--tui-color-fg-muted);
2115
+ transition: transform var(--tui-motion-duration) var(--tui-motion-timing);
2116
+ }
2117
+ [data-state=open] .tui-interface .tui-select__icon {
2118
+ transform: rotate(180deg);
2119
+ }
2120
+ .tui-interface .tui-select__clear {
2121
+ display: flex;
2122
+ align-items: center;
2123
+ justify-content: center;
2124
+ flex-shrink: 0;
2125
+ width: 1.25em;
2126
+ height: 1.25em;
2127
+ border-radius: var(--tui-radius-sm);
2128
+ color: var(--tui-color-fg-muted);
2129
+ cursor: pointer;
2130
+ transition: color var(--tui-motion-duration) var(--tui-motion-timing), background-color var(--tui-motion-duration) var(--tui-motion-timing);
2131
+ }
2132
+ .tui-interface .tui-select__clear:hover {
2133
+ color: var(--tui-color-fg);
2134
+ background-color: var(--tui-theme-secondary-subtlest);
2135
+ }
2136
+ [data-disabled] .tui-interface .tui-select__clear {
2137
+ pointer-events: none;
2138
+ }
2139
+ :where(.tui-interface) .tui-select__content {
2140
+ --_bg: var(--tui-select-content-bg, var(--tui-color-bg-elevated));
2141
+ --_border: var(--tui-select-content-border, var(--tui-color-border));
2142
+ --_shadow: var(--tui-select-content-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));
2143
+ --_radius: var(--tui-select-content-radius, var(--tui-radius-md));
2144
+ z-index: var(--tui-layer-top);
2145
+ min-width: 160px;
2146
+ padding: var(--tui-spacing-xxs);
2147
+ overflow-y: auto;
2148
+ overscroll-behavior: contain;
2149
+ pointer-events: auto;
2150
+ scrollbar-width: thin;
2151
+ scrollbar-color: var(--tui-color-fg-muted) transparent;
2152
+ }
2153
+ :where(.tui-interface) .tui-select__content::-webkit-scrollbar {
2154
+ width: 8px;
2155
+ }
2156
+ :where(.tui-interface) .tui-select__content::-webkit-scrollbar-track {
2157
+ background: transparent;
2158
+ }
2159
+ :where(.tui-interface) .tui-select__content::-webkit-scrollbar-thumb {
2160
+ background-color: var(--tui-color-fg-muted);
2161
+ border-radius: 4px;
2162
+ border: 2px solid transparent;
2163
+ background-clip: content-box;
2164
+ opacity: 0.5;
2165
+ }
2166
+ :where(.tui-interface) .tui-select__content::-webkit-scrollbar-thumb:hover {
2167
+ opacity: 1;
2168
+ }
2169
+ :where(.tui-interface) .tui-select__content {
2170
+ background-color: var(--_bg);
2171
+ border: var(--tui-border-width) solid var(--_border);
2172
+ border-radius: var(--_radius);
2173
+ box-shadow: var(--_shadow);
2174
+ animation: tui-fadeFromTransparent var(--tui-motion-duration) var(--tui-motion-timing);
2175
+ }
2176
+ :where(.tui-interface) .tui-select__option {
2177
+ --_bg-hover: var(--tui-select-option-bg-hover, var(--tui-theme-secondary-subtlest));
2178
+ --_bg-selected: var(--tui-select-option-bg-selected, var(--tui-theme-primary-subtlest));
2179
+ display: flex;
2180
+ align-items: center;
2181
+ gap: var(--tui-spacing-xs);
2182
+ padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
2183
+ border-radius: var(--tui-radius-sm);
2184
+ cursor: pointer;
2185
+ font-size: var(--tui-typography-size-sm);
2186
+ line-height: 1.4;
2187
+ }
2188
+ :where(.tui-interface) .tui-select__option:hover:not([data-disabled]), :where(.tui-interface) .tui-select__option[data-highlighted]:not([data-disabled]) {
2189
+ background-color: var(--_bg-hover);
2190
+ }
2191
+ :where(.tui-interface) .tui-select__option[aria-selected=true] {
2192
+ background-color: var(--_bg-selected);
2193
+ font-weight: 500;
2194
+ }
2195
+ :where(.tui-interface) .tui-select__option[aria-selected=true]:hover:not([data-disabled]), :where(.tui-interface) .tui-select__option[aria-selected=true][data-highlighted]:not([data-disabled]) {
2196
+ background-color: var(--tui-theme-primary-subtle);
2197
+ }
2198
+ :where(.tui-interface) .tui-select__option[data-disabled] {
2199
+ opacity: var(--tui-opacity-disabled);
2200
+ cursor: not-allowed;
2201
+ }
2202
+ :where(.tui-interface) .tui-select__option-content {
2203
+ display: flex;
2204
+ align-items: center;
2205
+ gap: var(--tui-spacing-xs);
2206
+ flex: 1;
2207
+ min-width: 0;
2208
+ }
2209
+ :where(.tui-interface) .tui-select__option-check {
2210
+ flex-shrink: 0;
2211
+ color: var(--tui-theme-primary-base);
2212
+ }
2213
+ :where(.tui-interface) .tui-select__group + :where(.tui-interface) .tui-select__group {
2214
+ margin-top: var(--tui-spacing-xxs);
2215
+ padding-top: var(--tui-spacing-xxs);
2216
+ border-top: var(--tui-border-width) solid var(--tui-color-divider);
2217
+ }
2218
+ :where(.tui-interface) .tui-select__label {
2219
+ padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
2220
+ padding-bottom: var(--tui-spacing-xxs);
2221
+ font-size: var(--tui-typography-size-xs);
2222
+ font-weight: 600;
2223
+ color: var(--tui-color-fg-muted);
2224
+ text-transform: uppercase;
2225
+ letter-spacing: 0.05em;
2226
+ }
2227
+ @media (forced-colors: active) {
2228
+ .tui-interface .tui-select__trigger {
2229
+ background-color: Canvas;
2230
+ color: CanvasText;
2231
+ border-color: CanvasText;
2232
+ }
2233
+ .tui-interface .tui-select__trigger:focus-visible {
2234
+ outline-color: Highlight;
2235
+ }
2236
+ :where(.tui-interface) .tui-select__content {
2237
+ background-color: Canvas;
2238
+ color: CanvasText;
2239
+ border-color: CanvasText;
2240
+ }
2241
+ :where(.tui-interface) .tui-select__option:hover:not([data-disabled]), :where(.tui-interface) .tui-select__option[data-highlighted]:not([data-disabled]), :where(.tui-interface) .tui-select__option[aria-selected=true] {
2242
+ background-color: Highlight;
2243
+ color: HighlightText;
2244
+ forced-color-adjust: none;
2245
+ }
2246
+ }
2247
+ :where(.tui-interface) :is(label, .tui-label) {
2248
+ color: var(--tui-color-fg);
2249
+ font-weight: bold;
2250
+ font-size: var(--tui-typography-size-sm);
2251
+ }
2252
+ :where(.tui-interface) :is(.tui-input,
2253
+ input[type=text],
2254
+ input[type=email],
2255
+ input[type=url],
2256
+ input[type=password],
2257
+ input[type=search],
2258
+ input[type=number],
2259
+ input[type=tel],
2260
+ input[type=range],
2261
+ input[type=date],
2262
+ input[type=month],
2263
+ input[type=week],
2264
+ input[type=time],
2265
+ input[type=datetime],
2266
+ input[type=datetime-local],
2267
+ input[type=color],
2268
+ textarea,
2269
+ select) {
2270
+ --_bg: var(--tui-input-bg, var(--tui-color-bg));
2271
+ --_fg: var(--tui-input-fg, var(--tui-color-fg-muted));
2272
+ --_border: var(--tui-input-border, var(--tui-color-border));
2273
+ --_border-focus: var(--tui-input-border-focus, var(--tui-theme-primary-base));
2274
+ --_border-invalid: var(--tui-input-border-invalid, var(--tui-theme-danger-base));
2275
+ --_radius: var(--tui-input-radius, var(--tui-radius-md));
2276
+ --_fs: var(--tui-typography-size-md);
2277
+ --_py: var(--tui-spacing-xxs);
2278
+ font-size: var(--_fs);
2279
+ padding-block: var(--_py);
2280
+ min-height: calc(2em + 2 * var(--_py));
2281
+ }
2282
+ :where(.tui-interface) :is(.tui-input,
2283
+ input[type=text],
2284
+ input[type=email],
2285
+ input[type=url],
2286
+ input[type=password],
2287
+ input[type=search],
2288
+ input[type=number],
2289
+ input[type=tel],
2290
+ input[type=range],
2291
+ input[type=date],
2292
+ input[type=month],
2293
+ input[type=week],
2294
+ input[type=time],
2295
+ input[type=datetime],
2296
+ input[type=datetime-local],
2297
+ input[type=color],
2298
+ textarea,
2299
+ select).is-size-sm {
2300
+ --_fs: var(--tui-typography-size-sm);
2301
+ }
2302
+ :where(.tui-interface) :is(.tui-input,
2303
+ input[type=text],
2304
+ input[type=email],
2305
+ input[type=url],
2306
+ input[type=password],
2307
+ input[type=search],
2308
+ input[type=number],
2309
+ input[type=tel],
2310
+ input[type=range],
2311
+ input[type=date],
2312
+ input[type=month],
2313
+ input[type=week],
2314
+ input[type=time],
2315
+ input[type=datetime],
2316
+ input[type=datetime-local],
2317
+ input[type=color],
2318
+ textarea,
2319
+ select).is-size-lg {
2320
+ --_fs: var(--tui-typography-size-lg);
1481
2321
  }
1482
2322
  :where(.tui-interface) :is(.tui-input,
1483
2323
  input[type=text],
@@ -1497,23 +2337,13 @@
1497
2337
  input[type=color],
1498
2338
  textarea,
1499
2339
  select) {
1500
- --_bg: var(--tui-input-bg, var(--tui-color-bg));
1501
- --_fg: var(--tui-input-fg, var(--tui-color-fg-muted));
1502
- --_border: var(--tui-input-border, var(--tui-color-border));
1503
- --_border-focus: var(--tui-input-border-focus, var(--tui-theme-primary-base));
1504
- --_border-invalid: var(--tui-input-border-invalid, var(--tui-theme-danger-base));
1505
- --_radius: var(--tui-input-radius, var(--tui-radius-md));
1506
- font-size: var(--tui-typography-size-sm);
1507
2340
  font-family: inherit;
1508
- box-sizing: content-box;
1509
2341
  border: var(--tui-border-width) solid var(--_border);
1510
2342
  border-radius: var(--_radius);
1511
2343
  appearance: none;
1512
2344
  background-color: var(--_bg);
1513
2345
  color: var(--_fg);
1514
- height: calc(2em - 2 * var(--tui-border-width));
1515
2346
  padding-inline: 0.5em;
1516
- padding-block: 0;
1517
2347
  min-width: 1px;
1518
2348
  transition-duration: var(--tui-motion-duration);
1519
2349
  transition-timing-function: var(--tui-motion-timing);
@@ -1579,16 +2409,26 @@
1579
2409
  input[type=datetime-local],
1580
2410
  input[type=color],
1581
2411
  textarea,
1582
- select):invalid {
2412
+ select):invalid, :where(.tui-interface) :is(.tui-input,
2413
+ input[type=text],
2414
+ input[type=email],
2415
+ input[type=url],
2416
+ input[type=password],
2417
+ input[type=search],
2418
+ input[type=number],
2419
+ input[type=tel],
2420
+ input[type=range],
2421
+ input[type=date],
2422
+ input[type=month],
2423
+ input[type=week],
2424
+ input[type=time],
2425
+ input[type=datetime],
2426
+ input[type=datetime-local],
2427
+ input[type=color],
2428
+ textarea,
2429
+ select)[aria-invalid=true] {
1583
2430
  --_border: var(--_border-invalid);
1584
2431
  }
1585
- :where(.tui-interface) :is(input[type=search], input[type=search].tui-input) {
1586
- padding-inline-start: 2.5em !important;
1587
- background-image: url('data:image/svg+xml;utf8,<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M8 16a8 8 0 1 1 8-8 8.009 8.009 0 0 1-8 8ZM8 2a6 6 0 1 0 6 6 6.006 6.006 0 0 0-6-6ZM19 20a1 1 0 0 1-.707-.293l-4-4a1 1 0 0 1 1.414-1.414l4 4A1 1 0 0 1 19 20Z" fill="%231F2A37"/></svg>');
1588
- background-repeat: no-repeat;
1589
- background-position: 0.75em 50%;
1590
- background-size: 1em;
1591
- }
1592
2432
  :where(.tui-interface) :is(select, select.tui-input) {
1593
2433
  padding-inline-end: 2.5em !important;
1594
2434
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAxMSAxMCI+PHBhdGggZmlsbD0iIzExMTkyOCIgZD0iTTUuNTExIDcuNWEuOTM5LjkzOSAwIDAgMS0uNjM2LS4yNDRsLTMuNi0zLjMyNmEuODMzLjgzMyAwIDAgMS0uMjAyLS4yNy43NzguNzc4IDAgMCAxLS4wMDYtLjY0My44My44MyAwIDAgMSAuMTk3LS4yNzMuOTA5LjkwOSAwIDAgMSAuMjk1LS4xODIuOTY1Ljk2NSAwIDAgMSAuNjk2LjAwNmMuMTEuMDQzLjIxLjEwNi4yOTIuMTg2bDIuOTY0IDIuNzM4IDIuOTY0LTIuNzM4YS45NC45NCAwIDAgMSAuNjMzLS4yMzRjLjIzNi4wMDIuNDYyLjA5LjYyOC4yNDRhLjgwMS44MDEgMCAwIDEgLjI2NC41OC44LjggMCAwIDEtLjI1My41ODZsLTMuNiAzLjMyNmEuOTM5LjkzOSAwIDAgMS0uNjM2LjI0NFoiLz48L3N2Zz4=");
@@ -1621,7 +2461,7 @@
1621
2461
  }
1622
2462
  :where(.tui-interface) .tui-toggle {
1623
2463
  --_accent: var(--tui-input-accent, var(--tui-theme-primary-base));
1624
- --_track-off: var(--tui-palette-color-gray-300);
2464
+ --_track-off: var(--tui-theme-secondary-soft);
1625
2465
  }
1626
2466
  :where(.tui-interface) .tui-toggle input[type=checkbox] {
1627
2467
  position: absolute;
@@ -1679,7 +2519,6 @@
1679
2519
  --_radius: var(--tui-input-radius, var(--tui-radius-md));
1680
2520
  font-size: var(--tui-typography-size-sm);
1681
2521
  font-family: inherit;
1682
- box-sizing: content-box;
1683
2522
  border: var(--tui-border-width) solid var(--_border);
1684
2523
  border-radius: var(--_radius);
1685
2524
  background-color: var(--_bg);
@@ -1865,14 +2704,6 @@
1865
2704
  outline-offset: 2px;
1866
2705
  }
1867
2706
  }
1868
- @media (prefers-reduced-motion: reduce) {
1869
- .tui-icon-button {
1870
- transition: none;
1871
- }
1872
- .tui-icon-button__spinner {
1873
- animation: none;
1874
- }
1875
- }
1876
2707
  .tui-modal {
1877
2708
  --_z: var(--tui-modal-z, var(--tui-layer-modal, 1000));
1878
2709
  --_backdrop: var(--tui-modal-backdrop, var(--tui-color-bg-overlay));
@@ -1929,7 +2760,7 @@
1929
2760
  --_min-foot: 4rem;
1930
2761
  }
1931
2762
  .tui-modal__dialog {
1932
- box-sizing: border-box;
2763
+ color: var(--tui-color-fg);
1933
2764
  border-style: solid;
1934
2765
  border-width: var(--tui-border-width);
1935
2766
  border-color: var(--_border);
@@ -1967,13 +2798,11 @@
1967
2798
  padding-block: var(--_padding);
1968
2799
  padding-inline: var(--_padding);
1969
2800
  width: 100%;
1970
- box-sizing: border-box;
1971
2801
  }
1972
2802
  .tui-modal__dialog .tui-modal__foot {
1973
2803
  padding-block: var(--_padding);
1974
2804
  padding-inline: var(--_padding);
1975
2805
  width: 100%;
1976
- box-sizing: border-box;
1977
2806
  }
1978
2807
  .tui-modal__dialog.is-size-sm {
1979
2808
  --_max: var(--tui-modal-max, 480px);
@@ -2028,7 +2857,6 @@
2028
2857
  --_padding: var(--tui-notice-padding, var(--tui-spacing-sm));
2029
2858
  --_foot-basis: var(--tui-notice-foot-basis, 500px);
2030
2859
  --_gap: var(--tui-spacing-sm);
2031
- box-sizing: border-box;
2032
2860
  container-type: inline-size;
2033
2861
  container-name: tuiNotice;
2034
2862
  position: relative;
@@ -2061,7 +2889,6 @@
2061
2889
  padding-block: var(--_padding);
2062
2890
  padding-inline: var(--_padding);
2063
2891
  width: 100%;
2064
- box-sizing: border-box;
2065
2892
  display: flex;
2066
2893
  align-items: center;
2067
2894
  gap: var(--_gap);
@@ -2069,7 +2896,6 @@
2069
2896
  :where(.tui-interface) .tui-notice__body {
2070
2897
  padding-inline: var(--_padding);
2071
2898
  width: 100%;
2072
- box-sizing: border-box;
2073
2899
  }
2074
2900
  :where(.tui-interface) .tui-notice__body > *:first-child {
2075
2901
  margin-block-start: unset;
@@ -2080,6 +2906,13 @@
2080
2906
  :where(.tui-interface) .tui-notice__body > p {
2081
2907
  margin: 0;
2082
2908
  }
2909
+ :where(.tui-interface) .tui-notice__body a {
2910
+ color: var(--tui-theme-primary-strong);
2911
+ text-decoration: underline;
2912
+ }
2913
+ :where(.tui-interface) .tui-notice__body a:hover {
2914
+ color: var(--tui-theme-primary-stronger);
2915
+ }
2083
2916
  :where(.tui-interface) .tui-notice__body:first-child {
2084
2917
  padding-block-start: var(--_padding);
2085
2918
  }
@@ -2090,7 +2923,6 @@
2090
2923
  padding-block: var(--_padding);
2091
2924
  padding-inline: var(--_padding);
2092
2925
  width: 100%;
2093
- box-sizing: border-box;
2094
2926
  }
2095
2927
  :where(.tui-interface) .tui-notice.is-layout-inline {
2096
2928
  display: flex;
@@ -2338,6 +3170,83 @@
2338
3170
  align-items: center;
2339
3171
  gap: var(--tui-spacing-xs);
2340
3172
  }
3173
+ :where(.tui-interface) .tui-radio-group {
3174
+ display: flex;
3175
+ flex-direction: column;
3176
+ gap: var(--tui-spacing-xs);
3177
+ }
3178
+ :where(.tui-interface) .tui-radio-group.is-horizontal {
3179
+ flex-direction: row;
3180
+ flex-wrap: wrap;
3181
+ gap: var(--tui-spacing-sm);
3182
+ }
3183
+ :where(.tui-interface) .tui-radio-group[aria-disabled=true] {
3184
+ opacity: var(--tui-opacity-disabled);
3185
+ }
3186
+ :where(.tui-interface) .tui-radio {
3187
+ --_accent: var(--tui-radio-accent, var(--tui-input-accent, var(--tui-theme-primary-base)));
3188
+ --_border: var(--tui-input-border, var(--tui-color-border));
3189
+ display: inline-flex;
3190
+ align-items: center;
3191
+ gap: var(--tui-spacing-xs);
3192
+ padding: 0;
3193
+ border: none;
3194
+ background: none;
3195
+ font: inherit;
3196
+ font-size: var(--tui-typography-size-sm);
3197
+ color: var(--tui-color-fg);
3198
+ cursor: pointer;
3199
+ appearance: none;
3200
+ }
3201
+ :where(.tui-interface) .tui-radio:focus-visible {
3202
+ outline: none;
3203
+ }
3204
+ :where(.tui-interface) .tui-radio:focus-visible .tui-radio__indicator {
3205
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
3206
+ outline-offset: var(--tui-focus-ring-offset);
3207
+ }
3208
+ :where(.tui-interface) .tui-radio:disabled {
3209
+ cursor: not-allowed;
3210
+ opacity: var(--tui-opacity-disabled);
3211
+ }
3212
+ :where(.tui-interface) .tui-radio[aria-checked=true] .tui-radio__indicator {
3213
+ border-color: var(--_accent);
3214
+ }
3215
+ :where(.tui-interface) .tui-radio[aria-checked=true] .tui-radio__indicator::after {
3216
+ transform: scale(1);
3217
+ background-color: var(--_accent);
3218
+ }
3219
+ :where(.tui-interface) .tui-radio__indicator {
3220
+ display: inline-flex;
3221
+ align-items: center;
3222
+ justify-content: center;
3223
+ flex-shrink: 0;
3224
+ width: 1.15em;
3225
+ height: 1.15em;
3226
+ border-radius: 50%;
3227
+ border: var(--tui-border-width) solid var(--_border);
3228
+ background-color: var(--tui-color-bg);
3229
+ transition-duration: var(--tui-motion-duration);
3230
+ transition-timing-function: var(--tui-motion-timing);
3231
+ transition-property: border-color;
3232
+ }
3233
+ :where(.tui-interface) .tui-radio__indicator::after {
3234
+ content: "";
3235
+ display: block;
3236
+ width: 0.5em;
3237
+ height: 0.5em;
3238
+ border-radius: 50%;
3239
+ background-color: transparent;
3240
+ transform: scale(0);
3241
+ transition-duration: var(--tui-motion-duration);
3242
+ transition-timing-function: var(--tui-motion-timing);
3243
+ transition-property: transform, background-color;
3244
+ }
3245
+ :where(.tui-interface) .tui-radio__label {
3246
+ font-weight: unset;
3247
+ line-height: 1.25em;
3248
+ user-select: none;
3249
+ }
2341
3250
  :where(.tui-interface) .tui-rating {
2342
3251
  --_active: var(--tui-rating-active, var(--tui-theme-warning-base));
2343
3252
  --_inactive: var(--tui-rating-inactive, var(--tui-color-fg-muted));
@@ -2750,11 +3659,6 @@
2750
3659
  :where(.tui-interface) .tui-segmented__item-label {
2751
3660
  min-width: 0;
2752
3661
  }
2753
- @media (prefers-reduced-motion: reduce) {
2754
- .tui-interface .tui-segmented__item {
2755
- transition: none;
2756
- }
2757
- }
2758
3662
  @media (forced-colors: active) {
2759
3663
  .tui-interface .tui-segmented__item[aria-checked=true] {
2760
3664
  forced-color-adjust: none;
@@ -2765,6 +3669,85 @@
2765
3669
  outline: 2px solid CanvasText;
2766
3670
  }
2767
3671
  }
3672
+ :where(.tui-interface) .tui-switch {
3673
+ display: inline-flex;
3674
+ align-items: center;
3675
+ gap: var(--tui-spacing-xs);
3676
+ font-size: var(--tui-typography-size-md);
3677
+ cursor: pointer;
3678
+ user-select: none;
3679
+ }
3680
+ :where(.tui-interface) .tui-switch.is-size-sm {
3681
+ font-size: var(--tui-typography-size-sm);
3682
+ }
3683
+ :where(.tui-interface) .tui-switch.is-size-lg {
3684
+ font-size: var(--tui-typography-size-lg);
3685
+ }
3686
+ :where(.tui-interface) .tui-switch.is-disabled {
3687
+ opacity: var(--tui-opacity-disabled);
3688
+ cursor: not-allowed;
3689
+ }
3690
+ :where(.tui-interface) .tui-switch__label {
3691
+ font-weight: unset;
3692
+ line-height: 1.25em;
3693
+ font-size: var(--tui-typography-size-sm);
3694
+ user-select: none;
3695
+ }
3696
+ :where(.tui-interface) .tui-switch__track {
3697
+ --_accent: var(--tui-switch-accent, var(--tui-input-accent, var(--tui-theme-primary-base)));
3698
+ --_track-off: var(--tui-switch-track-off, var(--tui-theme-secondary-soft));
3699
+ font-size: var(--tui-typography-size-md);
3700
+ }
3701
+ :where(.tui-interface) .tui-switch__track.is-size-sm {
3702
+ font-size: var(--tui-typography-size-sm);
3703
+ }
3704
+ :where(.tui-interface) .tui-switch__track.is-size-lg {
3705
+ font-size: var(--tui-typography-size-lg);
3706
+ }
3707
+ :where(.tui-interface) .tui-switch__track {
3708
+ position: relative;
3709
+ display: inline-flex;
3710
+ align-items: center;
3711
+ flex-shrink: 0;
3712
+ width: 2.8575em;
3713
+ height: 1.4285em;
3714
+ border-radius: 9999px;
3715
+ border: var(--tui-border-width) solid var(--_track-off);
3716
+ background-color: var(--_track-off);
3717
+ padding: 0;
3718
+ cursor: pointer;
3719
+ appearance: none;
3720
+ font: inherit;
3721
+ transition-duration: var(--tui-motion-duration);
3722
+ transition-timing-function: var(--tui-motion-timing);
3723
+ transition-property: background-color, border-color;
3724
+ }
3725
+ :where(.tui-interface) .tui-switch__track:focus-visible {
3726
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
3727
+ outline-offset: var(--tui-focus-ring-offset);
3728
+ }
3729
+ :where(.tui-interface) .tui-switch__track:disabled {
3730
+ cursor: not-allowed;
3731
+ }
3732
+ :where(.tui-interface) .tui-switch__track.is-checked {
3733
+ background-color: var(--_accent);
3734
+ border-color: var(--_accent);
3735
+ }
3736
+ :where(.tui-interface) .tui-switch__thumb {
3737
+ display: block;
3738
+ width: calc(1.4285em - 4px);
3739
+ height: calc(1.4285em - 4px);
3740
+ border-radius: 50%;
3741
+ background-color: var(--tui-color-bg);
3742
+ transform: translateX(2px);
3743
+ transition-duration: var(--tui-motion-duration);
3744
+ transition-timing-function: var(--tui-motion-timing);
3745
+ transition-property: transform;
3746
+ pointer-events: none;
3747
+ }
3748
+ :where(.tui-interface) .tui-switch__track.is-checked .tui-switch__thumb {
3749
+ transform: translateX(calc(2.8575em - calc(1.4285em - 4px) - 2px - 2 * var(--tui-border-width)));
3750
+ }
2768
3751
  :where(.tui-interface) .tui-sidebar {
2769
3752
  --_width: var(--tui-sidebar-width, 320px);
2770
3753
  --_bg: var(--tui-sidebar-bg, var(--tui-color-bg-surface));
@@ -2856,12 +3839,6 @@
2856
3839
  body.tui-sidebar-drawer-open {
2857
3840
  overflow: hidden;
2858
3841
  }
2859
- @media (prefers-reduced-motion: reduce) {
2860
- :where(.tui-interface) .tui-sidebar-drawer__backdrop,
2861
- :where(.tui-interface) .tui-sidebar-drawer__panel {
2862
- animation: none;
2863
- }
2864
- }
2865
3842
  :where(.tui-interface) .tui-step-indicator {
2866
3843
  display: inline-flex;
2867
3844
  }
@@ -2930,7 +3907,7 @@
2930
3907
  border-left: 3px solid transparent;
2931
3908
  border-radius: var(--_radius);
2932
3909
  background: transparent;
2933
- color: inherit;
3910
+ color: var(--tui-color-fg);
2934
3911
  font: inherit;
2935
3912
  text-align: start;
2936
3913
  text-decoration: none;
@@ -2964,11 +3941,6 @@
2964
3941
  min-width: 0;
2965
3942
  line-height: var(--tui-line-height-normal, 1.5);
2966
3943
  }
2967
- @media (prefers-reduced-motion: reduce) {
2968
- :where(.tui-interface) .tui-steplist__item {
2969
- transition: none;
2970
- }
2971
- }
2972
3944
  :where(.tui-interface) .tui-table {
2973
3945
  --_border: var(--tui-table-border, var(--tui-color-border));
2974
3946
  --_bg: var(--tui-table-bg, transparent);
@@ -3198,11 +4170,6 @@
3198
4170
  :where(.tui-interface) .tui-tabs__panel > *:last-child {
3199
4171
  margin-block-end: 0;
3200
4172
  }
3201
- @media (prefers-reduced-motion: reduce) {
3202
- :where(.tui-interface) .tui-tabs__tab {
3203
- transition: none;
3204
- }
3205
- }
3206
4173
  @media (forced-colors: active) {
3207
4174
  .tui-interface .tui-tabs__tab[data-state=active] {
3208
4175
  forced-color-adjust: none;
@@ -3228,6 +4195,104 @@
3228
4195
  border-width: 2px;
3229
4196
  }
3230
4197
  }
4198
+ :where(.tui-interface) .tui-textarea {
4199
+ --_fs: var(--tui-typography-size-md);
4200
+ --_py: var(--tui-spacing-xxs);
4201
+ font-size: var(--_fs);
4202
+ padding-block: var(--_py);
4203
+ min-height: calc(2em + 2 * var(--_py));
4204
+ }
4205
+ :where(.tui-interface) .tui-textarea.is-size-sm {
4206
+ --_fs: var(--tui-typography-size-sm);
4207
+ }
4208
+ :where(.tui-interface) .tui-textarea.is-size-lg {
4209
+ --_fs: var(--tui-typography-size-lg);
4210
+ }
4211
+ :where(.tui-interface) .tui-textarea {
4212
+ min-height: calc(4em + 2 * var(--_py));
4213
+ padding-inline: 0.5em;
4214
+ font-family: inherit;
4215
+ line-height: 1.4;
4216
+ }
4217
+ :where(.tui-interface) .tui-textarea.is-autoresize {
4218
+ resize: none;
4219
+ overflow: hidden;
4220
+ }
4221
+ :where(.tui-interface) .tui-input-group {
4222
+ --_gap: var(--tui-input-group-gap, var(--tui-spacing-xs));
4223
+ --_bg: var(--tui-input-bg, var(--tui-color-bg));
4224
+ --_border: var(--tui-input-border, var(--tui-color-border));
4225
+ --_border-focus: var(--tui-input-border-focus, var(--tui-theme-primary-base));
4226
+ --_radius: var(--tui-input-radius, var(--tui-radius-md));
4227
+ --_fs: var(--tui-typography-size-md);
4228
+ --_py: var(--tui-spacing-xxs);
4229
+ font-size: var(--_fs);
4230
+ padding-block: var(--_py);
4231
+ min-height: calc(2em + 2 * var(--_py));
4232
+ }
4233
+ :where(.tui-interface) .tui-input-group.is-size-sm {
4234
+ --_fs: var(--tui-typography-size-sm);
4235
+ }
4236
+ :where(.tui-interface) .tui-input-group.is-size-lg {
4237
+ --_fs: var(--tui-typography-size-lg);
4238
+ }
4239
+ :where(.tui-interface) .tui-input-group {
4240
+ display: inline-flex;
4241
+ align-items: center;
4242
+ gap: var(--_gap);
4243
+ background-color: var(--_bg);
4244
+ border: var(--tui-border-width) solid var(--_border);
4245
+ border-radius: var(--_radius);
4246
+ padding-inline: var(--tui-spacing-xs);
4247
+ }
4248
+ :where(.tui-interface) .tui-input-group .tui-input,
4249
+ :where(.tui-interface) .tui-input-group input {
4250
+ border: none;
4251
+ background: transparent;
4252
+ padding-inline: 0;
4253
+ padding-block: 0;
4254
+ min-height: 0;
4255
+ min-width: 0;
4256
+ flex: 1 1 auto;
4257
+ }
4258
+ :where(.tui-interface) .tui-input-group .tui-input:focus-visible,
4259
+ :where(.tui-interface) .tui-input-group input:focus-visible {
4260
+ outline: none;
4261
+ }
4262
+ :where(.tui-interface) .tui-input-group:focus-within {
4263
+ --_border: var(--_border-focus);
4264
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
4265
+ outline-offset: var(--tui-focus-ring-offset);
4266
+ }
4267
+ :where(.tui-interface) .tui-input-group:has(input:invalid), :where(.tui-interface) .tui-input-group:has(input[aria-invalid=true]) {
4268
+ --_border: var(--tui-input-border-invalid, var(--tui-theme-danger-base));
4269
+ }
4270
+ :where(.tui-interface) .tui-input-group.is-disabled {
4271
+ opacity: var(--tui-opacity-disabled);
4272
+ cursor: not-allowed;
4273
+ }
4274
+ :where(.tui-interface) .tui-input-group.is-disabled > * {
4275
+ pointer-events: none;
4276
+ }
4277
+ :where(.tui-interface) .tui-input-group__prefix,
4278
+ :where(.tui-interface) .tui-input-group__suffix {
4279
+ display: inline-flex;
4280
+ align-items: center;
4281
+ flex-shrink: 0;
4282
+ color: var(--tui-color-fg-secondary);
4283
+ pointer-events: none;
4284
+ user-select: none;
4285
+ }
4286
+ :where(.tui-interface) .tui-input-group__prefix button, :where(.tui-interface) .tui-input-group__prefix a, :where(.tui-interface) .tui-input-group__prefix [role=button],
4287
+ :where(.tui-interface) .tui-input-group__suffix button,
4288
+ :where(.tui-interface) .tui-input-group__suffix a,
4289
+ :where(.tui-interface) .tui-input-group__suffix [role=button] {
4290
+ pointer-events: auto;
4291
+ }
4292
+ :where(.tui-interface) .tui-input-group__prefix .tui-icon,
4293
+ :where(.tui-interface) .tui-input-group__suffix .tui-icon {
4294
+ font-size: 1em;
4295
+ }
3231
4296
  :where(.tui-interface) .tui-toolbar {
3232
4297
  --_gap: var(--tui-toolbar-gap, var(--tui-spacing-sm));
3233
4298
  --_padding: var(--tui-toolbar-padding, 0);
@@ -3278,11 +4343,6 @@
3278
4343
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
3279
4344
  outline-offset: var(--tui-focus-ring-offset);
3280
4345
  }
3281
- @media (prefers-reduced-motion: reduce) {
3282
- :where(.tui-interface) .tui-tooltip {
3283
- animation: none;
3284
- }
3285
- }
3286
4346
  @media (forced-colors: active) {
3287
4347
  :where(.tui-interface) .tui-tooltip {
3288
4348
  background-color: Canvas;
@@ -4105,6 +5165,37 @@
4105
5165
  border-right-width: var(--tui-border-width, 1px) !important;
4106
5166
  border-right-style: solid !important;
4107
5167
  }
5168
+ .tui-interface .tui-input-reset::-webkit-search-decoration, .tui-interface .tui-input-reset::-webkit-search-cancel-button, .tui-interface .tui-input-reset::-webkit-search-results-button, .tui-interface .tui-input-reset::-webkit-search-results-decoration,
5169
+ .tui-interface .tui-input-reset input::-webkit-search-decoration,
5170
+ .tui-interface .tui-input-reset input::-webkit-search-cancel-button,
5171
+ .tui-interface .tui-input-reset input::-webkit-search-results-button,
5172
+ .tui-interface .tui-input-reset input::-webkit-search-results-decoration {
5173
+ display: none !important;
5174
+ -webkit-appearance: none !important;
5175
+ }
5176
+ .tui-interface .tui-input-reset::-webkit-inner-spin-button, .tui-interface .tui-input-reset::-webkit-outer-spin-button,
5177
+ .tui-interface .tui-input-reset input::-webkit-inner-spin-button,
5178
+ .tui-interface .tui-input-reset input::-webkit-outer-spin-button {
5179
+ -webkit-appearance: none !important;
5180
+ margin: 0 !important;
5181
+ }
5182
+ .tui-interface .tui-input-reset[type=number],
5183
+ .tui-interface .tui-input-reset input[type=number] {
5184
+ -moz-appearance: textfield !important;
5185
+ }
5186
+ .tui-interface .tui-input-reset::-webkit-calendar-picker-indicator,
5187
+ .tui-interface .tui-input-reset input::-webkit-calendar-picker-indicator {
5188
+ display: none !important;
5189
+ -webkit-appearance: none !important;
5190
+ }
5191
+ .tui-interface .tui-input-reset::-webkit-color-swatch-wrapper,
5192
+ .tui-interface .tui-input-reset input::-webkit-color-swatch-wrapper {
5193
+ padding: 0 !important;
5194
+ }
5195
+ .tui-interface .tui-input-reset::-webkit-color-swatch,
5196
+ .tui-interface .tui-input-reset input::-webkit-color-swatch {
5197
+ border: none !important;
5198
+ }
4108
5199
  .tui-interface .tui-border-primary {
4109
5200
  border-color: var(--tui-theme-primary-border, var(--tui-theme-primary-base)) !important;
4110
5201
  }