@tangible/ui 0.0.6 → 0.0.8

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 (99) hide show
  1. package/components/Accordion/Accordion.js +11 -3
  2. package/components/Avatar/Avatar.js +4 -3
  3. package/components/Avatar/AvatarGroup.js +7 -5
  4. package/components/Avatar/index.d.ts +2 -2
  5. package/components/Avatar/index.js +1 -1
  6. package/components/Avatar/types.d.ts +27 -0
  7. package/components/Avatar/types.js +8 -0
  8. package/components/Button/Button.js +4 -2
  9. package/components/Button/index.d.ts +2 -1
  10. package/components/Button/index.js +1 -0
  11. package/components/Button/types.d.ts +10 -0
  12. package/components/Button/types.js +3 -1
  13. package/components/Checkbox/Checkbox.js +46 -11
  14. package/components/Checkbox/types.d.ts +9 -0
  15. package/components/Combobox/Combobox.d.ts +1 -1
  16. package/components/Combobox/Combobox.js +28 -7
  17. package/components/Combobox/index.d.ts +2 -1
  18. package/components/Combobox/index.js +1 -0
  19. package/components/Combobox/types.d.ts +14 -0
  20. package/components/Combobox/types.js +3 -1
  21. package/components/Dropdown/Dropdown.js +16 -4
  22. package/components/Field/Field.d.ts +4 -1
  23. package/components/Field/Field.js +38 -7
  24. package/components/Field/FieldContext.d.ts +18 -0
  25. package/components/Field/FieldContext.js +3 -0
  26. package/components/Field/index.d.ts +2 -1
  27. package/components/Field/index.js +1 -0
  28. package/components/MoveHandle/MoveHandle.js +1 -1
  29. package/components/MoveHandle/types.d.ts +1 -1
  30. package/components/MultiSelect/MultiSelect.d.ts +1 -1
  31. package/components/MultiSelect/MultiSelect.js +37 -19
  32. package/components/MultiSelect/index.d.ts +2 -1
  33. package/components/MultiSelect/index.js +1 -0
  34. package/components/MultiSelect/types.d.ts +34 -0
  35. package/components/MultiSelect/types.js +10 -0
  36. package/components/Pager/Pager.d.ts +7 -1
  37. package/components/Pager/Pager.js +7 -5
  38. package/components/Pager/index.d.ts +2 -0
  39. package/components/Pager/index.js +1 -0
  40. package/components/Pager/types.d.ts +37 -0
  41. package/components/Pager/types.js +12 -0
  42. package/components/Radio/Radio.d.ts +4 -0
  43. package/components/Radio/Radio.js +15 -5
  44. package/components/Radio/RadioGroup.d.ts +1 -1
  45. package/components/Radio/RadioGroup.js +2 -2
  46. package/components/Radio/types.d.ts +10 -0
  47. package/components/Rating/Rating.d.ts +2 -32
  48. package/components/Rating/Rating.js +5 -3
  49. package/components/Rating/index.d.ts +2 -1
  50. package/components/Rating/index.js +1 -0
  51. package/components/Rating/types.d.ts +41 -0
  52. package/components/Rating/types.js +4 -0
  53. package/components/SegmentedControl/SegmentedControl.js +6 -5
  54. package/components/SegmentedControl/types.d.ts +17 -5
  55. package/components/Select/Select.d.ts +1 -0
  56. package/components/Select/Select.js +109 -77
  57. package/components/Select/SelectContext.d.ts +4 -16
  58. package/components/Select/SelectContext.js +5 -35
  59. package/components/Select/types.d.ts +19 -19
  60. package/components/Sidebar/Sidebar.js +25 -20
  61. package/components/StepIndicator/StepIndicator.js +11 -8
  62. package/components/StepIndicator/index.d.ts +2 -1
  63. package/components/StepIndicator/index.js +1 -0
  64. package/components/StepIndicator/types.d.ts +18 -0
  65. package/components/StepIndicator/types.js +7 -1
  66. package/components/Switch/Switch.js +28 -14
  67. package/components/Table/BulkActionsBar.d.ts +4 -1
  68. package/components/Table/BulkActionsBar.js +5 -4
  69. package/components/Table/DataTable.d.ts +4 -1
  70. package/components/Table/DataTable.js +10 -8
  71. package/components/Table/index.d.ts +3 -0
  72. package/components/Table/index.js +2 -0
  73. package/components/Table/types.d.ts +20 -0
  74. package/components/Table/types.js +11 -0
  75. package/components/Tabs/Tabs.js +11 -4
  76. package/components/TextInput/TextInput.js +2 -1
  77. package/components/TextInput/types.d.ts +7 -1
  78. package/components/Textarea/Textarea.js +3 -2
  79. package/components/Textarea/types.d.ts +6 -1
  80. package/icons/icons.svg +29 -15
  81. package/icons/lms/index.d.ts +8 -0
  82. package/icons/lms/index.js +48 -4
  83. package/icons/manifest.json +112 -0
  84. package/icons/player/index.js +9 -9
  85. package/icons/registry.d.ts +28 -0
  86. package/icons/registry.js +14 -0
  87. package/icons/system/index.d.ts +20 -0
  88. package/icons/system/index.js +112 -2
  89. package/package.json +1 -1
  90. package/styles/all.css +1 -1
  91. package/styles/all.expanded.css +426 -136
  92. package/styles/all.expanded.unlayered.css +426 -136
  93. package/styles/all.unlayered.css +1 -1
  94. package/styles/components/input/index.scss +29 -7
  95. package/styles/system/_constants.scss +1 -1
  96. package/styles/system/_tokens.scss +1 -0
  97. package/styles/utilities/_index.scss +14 -4
  98. package/tui-manifest.json +102 -46
  99. package/utils/use-roving-group.js +9 -6
@@ -66,6 +66,7 @@
66
66
  /* @tui-tokens
67
67
  --tui-card-bg
68
68
  --tui-card-border
69
+ --tui-card-border-width
69
70
  --tui-card-border-interact
70
71
  --tui-card-radius
71
72
  --tui-card-shadow
@@ -74,7 +75,14 @@
74
75
  --tui-card-foot-basis
75
76
  */
76
77
  /* @tui-tokens
77
- --tui-input-accent
78
+ --tui-checkbox-accent
79
+ --tui-checkbox-border
80
+ --tui-checkbox-border-invalid
81
+ --tui-checkbox-radius
82
+ --tui-checkbox-bg
83
+ --tui-checkbox-size
84
+ --tui-checkbox-gap
85
+ --tui-checkbox-label-color
78
86
  */
79
87
  /* @tui-tokens
80
88
  --tui-chip-bg
@@ -211,6 +219,14 @@
211
219
  */
212
220
  /* @tui-tokens
213
221
  --tui-radio-accent
222
+ --tui-radio-size
223
+ --tui-radio-border
224
+ --tui-radio-bg
225
+ --tui-radio-gap
226
+ --tui-radio-font-size
227
+ --tui-radio-label-color
228
+ --tui-radio-description-color
229
+ --tui-radio-group-gap
214
230
  */
215
231
  /* @tui-tokens
216
232
  --tui-rating-active
@@ -239,10 +255,19 @@
239
255
  --tui-segmented-item-fg
240
256
  --tui-segmented-item-bg-active
241
257
  --tui-segmented-item-fg-active
258
+ --tui-segmented-indicator
259
+ --tui-segmented-indicator-size
242
260
  */
243
261
  /* @tui-tokens
244
262
  --tui-switch-accent
245
- --tui-switch-track-off
263
+ --tui-switch-bg
264
+ --tui-switch-border
265
+ --tui-switch-thumb-bg
266
+ --tui-switch-track-height
267
+ --tui-switch-size
268
+ --tui-switch-label-color
269
+ --tui-switch-font-size
270
+ --tui-switch-gap
246
271
  */
247
272
  /* @tui-tokens
248
273
  --tui-sidebar-width
@@ -316,6 +341,7 @@
316
341
  --tui-focus-ring-color: #2563eb;
317
342
  /* Font Weight */
318
343
  --tui-font-weight-medium: 500;
344
+ --tui-font-weight-semibold: 600;
319
345
  /* Border */
320
346
  --tui-border-width: 1px;
321
347
  /* Z-Index Layers */
@@ -636,6 +662,7 @@
636
662
  --tui-radius-sm: 4px;
637
663
  --tui-radius-md: 8px;
638
664
  --tui-radius-lg: 12px;
665
+ --tui-radius-full: 9999px;
639
666
  --tui-font-size-base: 16px;
640
667
  --tui-line: 1.5;
641
668
  --tui-typography-weight-normal: 400;
@@ -1063,7 +1090,6 @@
1063
1090
  font-weight: var(--tui-button-font-weight, normal);
1064
1091
  line-height: var(--tui-button-line-height, 1.4);
1065
1092
  display: inline-flex;
1066
- align-self: center;
1067
1093
  text-align: center;
1068
1094
  justify-content: center;
1069
1095
  align-items: center;
@@ -1082,7 +1108,7 @@
1082
1108
  border-width: var(--tui-border-width);
1083
1109
  }
1084
1110
  .tui-interface .tui-button .tui-icon {
1085
- font-size: inherit;
1111
+ font-size: 1.25em;
1086
1112
  }
1087
1113
  .tui-interface .tui-button:hover {
1088
1114
  --_bg: var(--_bg-interact);
@@ -1284,7 +1310,6 @@
1284
1310
  font-weight: var(--tui-button-font-weight, normal);
1285
1311
  line-height: var(--tui-button-line-height, 1.4);
1286
1312
  display: inline-flex;
1287
- align-self: center;
1288
1313
  text-align: center;
1289
1314
  justify-content: center;
1290
1315
  align-items: center;
@@ -1320,6 +1345,7 @@
1320
1345
  :where(.tui-interface) .tui-card {
1321
1346
  --_bg: var(--tui-card-bg, var(--tui-color-bg-surface));
1322
1347
  --_border: var(--tui-card-border, var(--tui-color-border));
1348
+ --_border-width: var(--tui-card-border-width, var(--tui-border-width));
1323
1349
  --_border-interact: var(--tui-card-border-interact, var(--tui-theme-primary-base));
1324
1350
  --_radius: var(--tui-card-radius, var(--tui-radius-md));
1325
1351
  --_shadow: var(--tui-card-shadow, var(--tui-shadow-sm));
@@ -1331,7 +1357,7 @@
1331
1357
  position: relative;
1332
1358
  width: 100%;
1333
1359
  border-style: solid;
1334
- border-width: var(--tui-border-width);
1360
+ border-width: var(--_border-width);
1335
1361
  border-color: var(--_border);
1336
1362
  border-radius: var(--_radius);
1337
1363
  background-color: var(--_bg);
@@ -1387,40 +1413,40 @@
1387
1413
  border-end-start-radius: calc(var(--_radius) - 1px);
1388
1414
  }
1389
1415
  @container tuiCard (width >= 400px) {
1390
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner {
1416
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner {
1391
1417
  display: flex;
1392
1418
  flex-direction: row;
1393
1419
  align-items: center;
1394
1420
  gap: var(--_padding);
1395
1421
  }
1396
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__media.is-flush {
1422
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__media.is-flush {
1397
1423
  object-fit: cover;
1398
1424
  object-position: center;
1399
1425
  margin-block: calc(var(--_padding) * -1);
1400
1426
  height: calc(100% + 2 * var(--_padding));
1401
1427
  }
1402
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner *:has(.tui-card__media.is-flush) {
1428
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner *:has(.tui-card__media.is-flush) {
1403
1429
  align-self: stretch;
1404
1430
  }
1405
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__head {
1431
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__head {
1406
1432
  padding-inline-start: var(--_padding);
1407
1433
  padding-block: var(--_padding);
1408
1434
  flex: 0 1 auto;
1409
1435
  }
1410
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__head:has(.tui-icon:only-child) {
1436
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__head:has(.tui-icon:only-child) {
1411
1437
  flex: 0 0 max-content;
1412
1438
  }
1413
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__head .tui-card__media.is-flush:first-child {
1439
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__head .tui-card__media.is-flush:first-child {
1414
1440
  margin-inline-end: var(--_padding);
1415
1441
  max-width: calc(100% + var(--_padding));
1416
1442
  border-start-end-radius: 0;
1417
1443
  border-end-start-radius: calc(var(--_radius) - 1px);
1418
1444
  }
1419
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__body {
1445
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__body {
1420
1446
  flex: 2 1 auto;
1421
1447
  padding-block: var(--_padding);
1422
1448
  }
1423
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__foot {
1449
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__foot {
1424
1450
  width: unset;
1425
1451
  flex: 0 1 var(--_foot-basis);
1426
1452
  padding-block: var(--_padding);
@@ -1428,20 +1454,20 @@
1428
1454
  margin-inline-start: auto;
1429
1455
  justify-content: flex-end;
1430
1456
  }
1431
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__foot .tui-card__media.is-flush:last-child {
1457
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__foot .tui-card__media.is-flush:last-child {
1432
1458
  margin-inline-start: var(--_padding);
1433
1459
  max-width: calc(100% + var(--_padding));
1434
1460
  border-end-start-radius: 0;
1435
1461
  border-start-end-radius: calc(var(--_radius) - 1px);
1436
1462
  }
1437
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__head:not(:first-child),
1438
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__body:not(:first-child),
1439
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__foot:not(:first-child) {
1463
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__head:not(:first-child),
1464
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__body:not(:first-child),
1465
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__foot:not(:first-child) {
1440
1466
  padding-inline-start: 0;
1441
1467
  }
1442
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__head:not(:last-child),
1443
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__body:not(:last-child),
1444
- :where(.tui-interface) .tui-card.is-layout-inline .tui-card__inner .tui-card__foot:not(:last-child) {
1468
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__head:not(:last-child),
1469
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__body:not(:last-child),
1470
+ :where(:where(.tui-interface) .tui-card.is-layout-inline) .tui-card__inner .tui-card__foot:not(:last-child) {
1445
1471
  padding-inline-end: 0;
1446
1472
  }
1447
1473
  }
@@ -1478,29 +1504,73 @@
1478
1504
  :where(.tui-interface) .tui-card.is-style-elevated:hover {
1479
1505
  box-shadow: var(--_shadow-interact);
1480
1506
  }
1481
- :where(.tui-interface) input[type=checkbox]:not(.tui-inline-choice input):focus-visible {
1507
+ .tui-interface input[type=checkbox] {
1508
+ --_accent: var(--tui-checkbox-accent, var(--tui-input-accent, var(--tui-theme-primary-base)));
1509
+ --_border: var(--tui-checkbox-border, var(--tui-color-border));
1510
+ --_radius: var(--tui-checkbox-radius, var(--tui-radius-sm));
1511
+ --_bg: var(--tui-checkbox-bg, var(--tui-color-bg));
1512
+ appearance: none;
1513
+ margin: 0;
1514
+ display: inline-block;
1515
+ width: 1em;
1516
+ height: 1em;
1517
+ flex-shrink: 0;
1518
+ border: var(--tui-border-width) solid var(--_border);
1519
+ border-radius: var(--_radius);
1520
+ background-color: var(--_bg);
1521
+ background-size: 75%;
1522
+ background-position: center;
1523
+ background-repeat: no-repeat;
1524
+ cursor: pointer;
1525
+ transition-duration: var(--tui-motion-duration);
1526
+ transition-timing-function: var(--tui-motion-timing);
1527
+ transition-property: background-color, border-color;
1528
+ }
1529
+ .tui-interface input[type=checkbox]:checked {
1530
+ background-color: var(--_accent);
1531
+ border-color: var(--_accent);
1532
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
1533
+ }
1534
+ .tui-interface input[type=checkbox]:indeterminate {
1535
+ background-color: var(--_accent);
1536
+ border-color: var(--_accent);
1537
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round'%3E%3Cpath d='M6 12h12'/%3E%3C/svg%3E");
1538
+ }
1539
+ .tui-interface input[type=checkbox][aria-invalid=true] {
1540
+ --_border: var(--tui-checkbox-border-invalid, var(--tui-theme-danger-base));
1541
+ }
1542
+ .tui-interface input[type=checkbox]:focus-visible {
1482
1543
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
1483
1544
  outline-offset: var(--tui-focus-ring-offset);
1484
1545
  }
1485
- :where(.tui-interface) input[type=checkbox]:not(.tui-inline-choice input):checked {
1486
- accent-color: var(--tui-input-accent, var(--tui-theme-primary-base));
1546
+ .tui-interface input[type=checkbox]:disabled {
1547
+ cursor: not-allowed;
1487
1548
  }
1488
- :where(.tui-interface) input[type=checkbox]:not(.tui-inline-choice input):disabled {
1549
+ .tui-interface input[type=checkbox]:disabled {
1489
1550
  opacity: var(--tui-opacity-disabled);
1490
- cursor: not-allowed;
1491
1551
  }
1492
- :where(.tui-interface) input[type=checkbox][data-indeterminate=true] {
1493
- accent-color: var(--tui-input-accent, var(--tui-theme-primary-base));
1552
+ .tui-interface .tui-inline-choice input[type=checkbox]:disabled {
1553
+ opacity: 1;
1554
+ }
1555
+ .tui-interface .tui-inline-choice:has(input[type=checkbox]) {
1556
+ gap: var(--tui-checkbox-gap, var(--tui-spacing-xs));
1557
+ }
1558
+ .tui-interface .tui-inline-choice:has(input[type=checkbox]) input[type=checkbox] {
1559
+ font-size: var(--tui-checkbox-size, 1.15em);
1560
+ flex: 0 0 1em;
1561
+ }
1562
+ .tui-interface .tui-inline-choice:has(input[type=checkbox]) > span {
1563
+ color: var(--tui-checkbox-label-color, inherit);
1494
1564
  }
1495
- :where(.tui-interface) .tui-inline-choice.is-disabled {
1565
+ .tui-interface .tui-inline-choice.is-disabled {
1496
1566
  opacity: var(--tui-opacity-disabled);
1497
1567
  cursor: not-allowed;
1498
1568
  }
1499
- :where(.tui-interface) .tui-inline-choice.is-disabled input {
1569
+ .tui-interface .tui-inline-choice.is-disabled input {
1500
1570
  cursor: not-allowed;
1501
1571
  }
1502
1572
  @media (forced-colors: active) {
1503
- :where(.tui-interface) input[type=checkbox] {
1573
+ .tui-interface input[type=checkbox] {
1504
1574
  forced-color-adjust: auto;
1505
1575
  }
1506
1576
  }
@@ -1848,9 +1918,6 @@
1848
1918
  .tui-interface .tui-combobox__input::placeholder {
1849
1919
  color: var(--tui-color-fg-muted);
1850
1920
  }
1851
- .tui-interface .tui-combobox__input:hover:not(:disabled) {
1852
- --_border: var(--tui-theme-secondary-soft);
1853
- }
1854
1921
  .tui-interface .tui-combobox__input:focus {
1855
1922
  --_border: var(--_border-focus);
1856
1923
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
@@ -1864,6 +1931,12 @@
1864
1931
  cursor: not-allowed;
1865
1932
  }
1866
1933
  .tui-interface .tui-combobox__clear {
1934
+ appearance: none;
1935
+ border: none;
1936
+ background: none;
1937
+ padding: 0;
1938
+ font: inherit;
1939
+ margin: 0;
1867
1940
  position: absolute;
1868
1941
  right: calc(var(--tui-spacing-sm) + 1.25em + var(--tui-spacing-xxs));
1869
1942
  display: flex;
@@ -1880,6 +1953,13 @@
1880
1953
  color: var(--tui-color-fg);
1881
1954
  background-color: var(--tui-theme-secondary-subtlest);
1882
1955
  }
1956
+ .tui-interface .tui-combobox__clear:focus-visible {
1957
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
1958
+ outline-offset: var(--tui-focus-ring-offset);
1959
+ }
1960
+ :disabled ~ .tui-interface .tui-combobox__clear {
1961
+ pointer-events: none;
1962
+ }
1883
1963
  .tui-interface .tui-combobox__icon {
1884
1964
  position: absolute;
1885
1965
  right: var(--tui-spacing-sm);
@@ -1974,11 +2054,25 @@
1974
2054
  padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
1975
2055
  padding-bottom: var(--tui-spacing-xxs);
1976
2056
  font-size: var(--tui-typography-size-xs);
1977
- font-weight: 600;
2057
+ font-weight: var(--tui-font-weight-semibold, 600);
1978
2058
  color: var(--tui-color-fg-muted);
1979
2059
  text-transform: uppercase;
1980
2060
  letter-spacing: 0.05em;
1981
2061
  }
2062
+ @media (prefers-reduced-motion: reduce) {
2063
+ .tui-interface .tui-combobox__input {
2064
+ transition-duration: 0ms;
2065
+ }
2066
+ .tui-interface .tui-combobox__icon {
2067
+ transition-duration: 0ms;
2068
+ }
2069
+ .tui-interface .tui-combobox__clear {
2070
+ transition-duration: 0ms;
2071
+ }
2072
+ :where(.tui-interface) .tui-combobox__content {
2073
+ animation-duration: 0ms;
2074
+ }
2075
+ }
1982
2076
  @media (forced-colors: active) {
1983
2077
  .tui-interface .tui-combobox__input {
1984
2078
  background-color: Canvas;
@@ -1998,6 +2092,12 @@
1998
2092
  color: HighlightText;
1999
2093
  forced-color-adjust: none;
2000
2094
  }
2095
+ .tui-interface .tui-combobox__clear {
2096
+ color: CanvasText;
2097
+ }
2098
+ .tui-interface .tui-combobox__clear:focus-visible {
2099
+ outline-color: Highlight;
2100
+ }
2001
2101
  }
2002
2102
  :where(.tui-interface) .tui-content-indicator {
2003
2103
  --_bg: var(--tui-content-indicator-bg, transparent);
@@ -2261,9 +2361,6 @@
2261
2361
  transition-timing-function: var(--tui-motion-timing);
2262
2362
  transition-property: border-color, background-color;
2263
2363
  }
2264
- .tui-interface .tui-multiselect__trigger:hover:not([data-disabled]) {
2265
- --_border: var(--tui-theme-secondary-soft);
2266
- }
2267
2364
  .tui-interface .tui-multiselect__trigger:focus-visible {
2268
2365
  --_border: var(--_border-focus);
2269
2366
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
@@ -2272,7 +2369,7 @@
2272
2369
  .tui-interface .tui-multiselect__trigger[data-state=open] {
2273
2370
  --_border: var(--_border-focus);
2274
2371
  }
2275
- .tui-interface .tui-multiselect__trigger[data-disabled] {
2372
+ .tui-interface .tui-multiselect__trigger[data-disabled], .tui-interface .tui-multiselect__trigger[disabled] {
2276
2373
  opacity: var(--tui-opacity-disabled);
2277
2374
  cursor: not-allowed;
2278
2375
  }
@@ -2451,11 +2548,28 @@
2451
2548
  padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
2452
2549
  padding-bottom: var(--tui-spacing-xxs);
2453
2550
  font-size: var(--tui-typography-size-xs);
2454
- font-weight: 600;
2551
+ font-weight: var(--tui-font-weight-semibold, 600);
2455
2552
  color: var(--tui-color-fg-muted);
2456
2553
  text-transform: uppercase;
2457
2554
  letter-spacing: 0.05em;
2458
2555
  }
2556
+ @media (prefers-reduced-motion: reduce) {
2557
+ .tui-interface .tui-multiselect__trigger {
2558
+ transition-duration: 0ms;
2559
+ }
2560
+ .tui-interface .tui-multiselect__clear {
2561
+ transition-duration: 0ms;
2562
+ }
2563
+ .tui-interface .tui-multiselect__icon {
2564
+ transition-duration: 0ms;
2565
+ }
2566
+ :where(.tui-interface) .tui-multiselect__content {
2567
+ animation-duration: 0ms;
2568
+ }
2569
+ :where(.tui-interface) .tui-multiselect__checkbox {
2570
+ transition-duration: 0ms;
2571
+ }
2572
+ }
2459
2573
  @media (forced-colors: active) {
2460
2574
  .tui-interface .tui-multiselect__trigger {
2461
2575
  background-color: Canvas;
@@ -2486,6 +2600,11 @@
2486
2600
  border: 1px solid CanvasText;
2487
2601
  }
2488
2602
  }
2603
+ .tui-interface .tui-select__trigger-wrap {
2604
+ position: relative;
2605
+ display: inline-flex;
2606
+ width: 100%;
2607
+ }
2489
2608
  .tui-interface .tui-select__trigger {
2490
2609
  --_bg: var(--tui-select-trigger-bg, var(--tui-color-bg-surface));
2491
2610
  --_fg: var(--tui-select-trigger-fg, var(--tui-color-fg));
@@ -2530,9 +2649,6 @@
2530
2649
  transition-timing-function: var(--tui-motion-timing);
2531
2650
  transition-property: border-color, background-color;
2532
2651
  }
2533
- .tui-interface .tui-select__trigger:hover:not([data-disabled]) {
2534
- --_border: var(--tui-theme-secondary-soft);
2535
- }
2536
2652
  .tui-interface .tui-select__trigger:focus-visible {
2537
2653
  --_border: var(--_border-focus);
2538
2654
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
@@ -2541,7 +2657,7 @@
2541
2657
  .tui-interface .tui-select__trigger[data-state=open] {
2542
2658
  --_border: var(--_border-focus);
2543
2659
  }
2544
- .tui-interface .tui-select__trigger[data-disabled] {
2660
+ .tui-interface .tui-select__trigger[data-disabled], .tui-interface .tui-select__trigger[disabled] {
2545
2661
  opacity: var(--tui-opacity-disabled);
2546
2662
  cursor: not-allowed;
2547
2663
  }
@@ -2564,10 +2680,19 @@
2564
2680
  transform: rotate(180deg);
2565
2681
  }
2566
2682
  .tui-interface .tui-select__clear {
2683
+ appearance: none;
2684
+ border: none;
2685
+ background: none;
2686
+ padding: 0;
2687
+ font: inherit;
2688
+ margin: 0;
2689
+ position: absolute;
2690
+ top: 50%;
2691
+ right: calc(var(--tui-spacing-sm) + 1em + var(--tui-spacing-xs));
2692
+ transform: translateY(-50%);
2567
2693
  display: flex;
2568
2694
  align-items: center;
2569
2695
  justify-content: center;
2570
- flex-shrink: 0;
2571
2696
  width: 1.25em;
2572
2697
  height: 1.25em;
2573
2698
  border-radius: var(--tui-radius-sm);
@@ -2579,7 +2704,11 @@
2579
2704
  color: var(--tui-color-fg);
2580
2705
  background-color: var(--tui-theme-secondary-subtlest);
2581
2706
  }
2582
- [data-disabled] .tui-interface .tui-select__clear {
2707
+ .tui-interface .tui-select__clear:focus-visible {
2708
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
2709
+ outline-offset: var(--tui-focus-ring-offset);
2710
+ }
2711
+ [data-disabled] .tui-interface .tui-select__clear, [disabled] .tui-interface .tui-select__clear {
2583
2712
  pointer-events: none;
2584
2713
  }
2585
2714
  :where(.tui-interface) .tui-select__content {
@@ -2666,11 +2795,25 @@
2666
2795
  padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
2667
2796
  padding-bottom: var(--tui-spacing-xxs);
2668
2797
  font-size: var(--tui-typography-size-xs);
2669
- font-weight: 600;
2798
+ font-weight: var(--tui-font-weight-semibold, 600);
2670
2799
  color: var(--tui-color-fg-muted);
2671
2800
  text-transform: uppercase;
2672
2801
  letter-spacing: 0.05em;
2673
2802
  }
2803
+ @media (prefers-reduced-motion: reduce) {
2804
+ .tui-interface .tui-select__trigger {
2805
+ transition-duration: 0ms;
2806
+ }
2807
+ .tui-interface .tui-select__icon {
2808
+ transition-duration: 0ms;
2809
+ }
2810
+ .tui-interface .tui-select__clear {
2811
+ transition-duration: 0ms;
2812
+ }
2813
+ :where(.tui-interface) .tui-select__content {
2814
+ animation-duration: 0ms;
2815
+ }
2816
+ }
2674
2817
  @media (forced-colors: active) {
2675
2818
  .tui-interface .tui-select__trigger {
2676
2819
  background-color: Canvas;
@@ -2690,6 +2833,12 @@
2690
2833
  color: HighlightText;
2691
2834
  forced-color-adjust: none;
2692
2835
  }
2836
+ .tui-interface .tui-select__clear {
2837
+ color: CanvasText;
2838
+ }
2839
+ .tui-interface .tui-select__clear:focus-visible {
2840
+ outline-color: Highlight;
2841
+ }
2693
2842
  }
2694
2843
  :where(.tui-interface) :is(label, .tui-label) {
2695
2844
  color: var(--tui-color-fg);
@@ -2715,7 +2864,7 @@
2715
2864
  textarea,
2716
2865
  select) {
2717
2866
  --_bg: var(--tui-input-bg, var(--tui-color-bg-surface));
2718
- --_fg: var(--tui-input-fg, var(--tui-color-fg-muted));
2867
+ --_fg: var(--tui-input-fg, var(--tui-color-fg));
2719
2868
  --_border: var(--tui-input-border, var(--tui-color-border));
2720
2869
  --_border-focus: var(--tui-input-border-focus, var(--tui-theme-primary-base));
2721
2870
  --_border-invalid: var(--tui-input-border-invalid, var(--tui-theme-danger-base));
@@ -2816,6 +2965,27 @@
2816
2965
  input[type=datetime-local],
2817
2966
  input[type=color],
2818
2967
  textarea,
2968
+ select)::placeholder {
2969
+ color: var(--tui-input-fg-placeholder, var(--tui-color-fg-muted));
2970
+ opacity: 1;
2971
+ }
2972
+ :where(.tui-interface) :is(.tui-input,
2973
+ input[type=text],
2974
+ input[type=email],
2975
+ input[type=url],
2976
+ input[type=password],
2977
+ input[type=search],
2978
+ input[type=number],
2979
+ input[type=tel],
2980
+ input[type=range],
2981
+ input[type=date],
2982
+ input[type=month],
2983
+ input[type=week],
2984
+ input[type=time],
2985
+ input[type=datetime],
2986
+ input[type=datetime-local],
2987
+ input[type=color],
2988
+ textarea,
2819
2989
  select):focus-visible {
2820
2990
  --_border: var(--_border-focus);
2821
2991
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
@@ -2838,6 +3008,27 @@
2838
3008
  input[type=datetime-local],
2839
3009
  input[type=color],
2840
3010
  textarea,
3011
+ select)[readonly] {
3012
+ background-color: var(--tui-input-bg-readonly, var(--tui-color-bg));
3013
+ cursor: default;
3014
+ }
3015
+ :where(.tui-interface) :is(.tui-input,
3016
+ input[type=text],
3017
+ input[type=email],
3018
+ input[type=url],
3019
+ input[type=password],
3020
+ input[type=search],
3021
+ input[type=number],
3022
+ input[type=tel],
3023
+ input[type=range],
3024
+ input[type=date],
3025
+ input[type=month],
3026
+ input[type=week],
3027
+ input[type=time],
3028
+ input[type=datetime],
3029
+ input[type=datetime-local],
3030
+ input[type=color],
3031
+ textarea,
2841
3032
  select)[disabled] {
2842
3033
  opacity: var(--tui-opacity-disabled);
2843
3034
  cursor: not-allowed;
@@ -2887,21 +3078,24 @@
2887
3078
  background-size: 1em;
2888
3079
  }
2889
3080
  :where(.tui-interface) .tui-inline-choice {
2890
- --_accent: var(--tui-input-accent, var(--tui-theme-primary-base));
2891
3081
  display: flex;
2892
3082
  align-items: center;
2893
3083
  gap: var(--tui-spacing-xs);
3084
+ cursor: pointer;
2894
3085
  }
2895
- :where(.tui-interface) .tui-inline-choice input[type=radio],
2896
- :where(.tui-interface) .tui-inline-choice input[type=checkbox] {
3086
+ :where(.tui-interface) .tui-inline-choice input[type=radio] {
3087
+ --_accent: var(--tui-input-accent, var(--tui-theme-primary-base));
2897
3088
  font-size: 1.15em;
2898
3089
  width: 1em;
2899
3090
  height: 1em;
2900
3091
  flex: 0 0 1em;
2901
3092
  margin: 0;
2902
3093
  }
2903
- :where(.tui-interface) .tui-inline-choice input[type=radio]:checked,
2904
- :where(.tui-interface) .tui-inline-choice input[type=checkbox]:checked {
3094
+ :where(.tui-interface) .tui-inline-choice input[type=radio]:focus-visible {
3095
+ outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
3096
+ outline-offset: var(--tui-focus-ring-offset);
3097
+ }
3098
+ :where(.tui-interface) .tui-inline-choice input[type=radio]:checked {
2905
3099
  accent-color: var(--_accent);
2906
3100
  }
2907
3101
  :where(.tui-interface) .tui-inline-choice label {
@@ -2964,7 +3158,7 @@
2964
3158
  }
2965
3159
  :where(.tui-interface) input[type=file] {
2966
3160
  --_bg: var(--tui-input-bg, var(--tui-color-bg-surface));
2967
- --_fg: var(--tui-input-fg, var(--tui-color-fg-muted));
3161
+ --_fg: var(--tui-input-fg, var(--tui-color-fg));
2968
3162
  --_border: var(--tui-input-border, var(--tui-color-border));
2969
3163
  --_radius: var(--tui-input-radius, var(--tui-radius-md));
2970
3164
  font-size: var(--tui-typography-size-sm);
@@ -3073,7 +3267,7 @@
3073
3267
  --_size: var(--tui-control-height-lg, 3rem);
3074
3268
  }
3075
3269
  .tui-interface .tui-icon-button.is-shape-circle {
3076
- border-radius: 50%;
3270
+ border-radius: var(--tui-radius-full);
3077
3271
  }
3078
3272
  .tui-interface .tui-icon-button.is-theme-primary {
3079
3273
  --_fg: var(--tui-icon-button-fg, var(--tui-theme-primary-base));
@@ -3254,7 +3448,7 @@
3254
3448
  }
3255
3449
  .tui-modal__dialog .tui-modal__body {
3256
3450
  flex: 1 1 auto;
3257
- min-height: 4.5rem;
3451
+ min-height: var(--_min-body);
3258
3452
  display: flex;
3259
3453
  flex-direction: column;
3260
3454
  }
@@ -3322,12 +3516,14 @@
3322
3516
  }
3323
3517
  .tui-modal__dialog.is-size-sm {
3324
3518
  --_max: var(--tui-modal-max, 480px);
3519
+ --_min-body: 2rem;
3325
3520
  }
3326
3521
  .tui-modal__dialog.is-size-md {
3327
3522
  --_max: var(--tui-modal-max, 720px);
3328
3523
  }
3329
3524
  .tui-modal__dialog.is-size-lg {
3330
3525
  --_max: var(--tui-modal-max, 960px);
3526
+ --_min-body: 10rem;
3331
3527
  }
3332
3528
  .tui-modal__dialog.is-sticky-head .tui-modal__head {
3333
3529
  position: sticky;
@@ -3566,6 +3762,10 @@
3566
3762
  .tui-interface .tui-move-handle.is-handle:active {
3567
3763
  cursor: grabbing;
3568
3764
  }
3765
+ .tui-interface .tui-move-handle.is-handle.is-size-sm {
3766
+ min-width: 24px;
3767
+ min-height: 24px;
3768
+ }
3569
3769
  @media (forced-colors: active) {
3570
3770
  .tui-move-handle__up,
3571
3771
  .tui-move-handle__down,
@@ -3688,26 +3888,26 @@
3688
3888
  display: flex;
3689
3889
  align-items: center;
3690
3890
  }
3691
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner {
3891
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner {
3692
3892
  display: flex;
3693
3893
  flex-direction: row;
3694
3894
  align-items: center;
3695
3895
  gap: var(--_padding);
3696
3896
  flex: 1 1 auto;
3697
3897
  }
3698
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__head {
3898
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__head {
3699
3899
  padding-inline-start: var(--_padding);
3700
3900
  padding-block: var(--_padding);
3701
3901
  flex: 0 1 auto;
3702
3902
  }
3703
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__head:has(.tui-icon:only-child) {
3903
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__head:has(.tui-icon:only-child) {
3704
3904
  flex: 0 0 max-content;
3705
3905
  }
3706
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__body {
3906
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__body {
3707
3907
  flex: 2 1 auto;
3708
3908
  padding-block: var(--_padding);
3709
3909
  }
3710
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__foot {
3910
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__foot {
3711
3911
  width: unset;
3712
3912
  flex: 0 1 var(--_foot-basis);
3713
3913
  padding-block: var(--_padding);
@@ -3715,14 +3915,14 @@
3715
3915
  margin-inline-start: auto;
3716
3916
  justify-content: flex-end;
3717
3917
  }
3718
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__head:not(:first-child),
3719
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__body:not(:first-child),
3720
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__foot:not(:first-child) {
3918
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__head:not(:first-child),
3919
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__body:not(:first-child),
3920
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__foot:not(:first-child) {
3721
3921
  padding-inline-start: 0;
3722
3922
  }
3723
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__head:not(:last-child),
3724
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__body:not(:last-child),
3725
- :where(.tui-interface) .tui-notice.is-layout-inline .tui-notice__inner .tui-notice__foot:not(:last-child) {
3923
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__head:not(:last-child),
3924
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__body:not(:last-child),
3925
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline) .tui-notice__inner .tui-notice__foot:not(:last-child) {
3726
3926
  padding-inline-end: 0;
3727
3927
  }
3728
3928
  }
@@ -3730,18 +3930,27 @@
3730
3930
  padding-inline-end: calc(var(--_padding) + var(--tui-control-height-sm));
3731
3931
  }
3732
3932
  @container tuiNotice (width >= 400px) {
3733
- :where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible .tui-notice__inner {
3933
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible) .tui-notice__inner {
3734
3934
  padding-inline-end: 0;
3735
3935
  }
3736
- :where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible .tui-notice__inner .tui-notice__head:last-child,
3737
- :where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible .tui-notice__inner .tui-notice__body:last-child,
3738
- :where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible .tui-notice__inner .tui-notice__foot:last-child {
3936
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible) .tui-notice__inner .tui-notice__head:last-child,
3937
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible) .tui-notice__inner .tui-notice__body:last-child,
3938
+ :where(:where(.tui-interface) .tui-notice.is-layout-inline.is-dismissible) .tui-notice__inner .tui-notice__foot:last-child {
3739
3939
  padding-inline-end: 0;
3740
3940
  }
3741
3941
  }
3742
3942
  :where(.tui-interface) .tui-notice.has-stripe {
3743
- border-inline-start-width: var(--tui-notice-stripe-width, 4px);
3744
- border-inline-start-color: var(--_stripe);
3943
+ overflow: hidden;
3944
+ padding-inline-start: var(--tui-notice-stripe-width, 4px);
3945
+ }
3946
+ :where(.tui-interface) .tui-notice.has-stripe::before {
3947
+ content: "";
3948
+ position: absolute;
3949
+ inset-block: 0;
3950
+ inset-inline-start: 0;
3951
+ width: var(--tui-notice-stripe-width, 4px);
3952
+ background-color: var(--_stripe);
3953
+ z-index: 1;
3745
3954
  }
3746
3955
  :where(.tui-interface) .tui-notice.is-theme-info {
3747
3956
  --_bg: var(--tui-notice-bg, var(--tui-theme-primary-subtlest));
@@ -3937,61 +4146,79 @@
3937
4146
  gap: var(--tui-spacing-xs);
3938
4147
  }
3939
4148
  :where(.tui-interface) .tui-radio-group {
4149
+ --_group-gap: var(--tui-radio-group-gap, var(--tui-spacing-xs));
3940
4150
  display: flex;
3941
4151
  flex-direction: column;
3942
- gap: var(--tui-spacing-xs);
4152
+ gap: var(--_group-gap);
3943
4153
  }
3944
4154
  :where(.tui-interface) .tui-radio-group.is-horizontal {
3945
4155
  flex-direction: row;
3946
4156
  flex-wrap: wrap;
3947
- gap: var(--tui-spacing-sm);
4157
+ gap: var(--_group-gap);
3948
4158
  }
3949
4159
  :where(.tui-interface) .tui-radio-group[aria-disabled=true] {
3950
4160
  opacity: var(--tui-opacity-disabled);
3951
4161
  }
3952
4162
  :where(.tui-interface) .tui-radio {
3953
4163
  --_accent: var(--tui-radio-accent, var(--tui-input-accent, var(--tui-theme-primary-base)));
3954
- --_border: var(--tui-input-border, var(--tui-color-border));
4164
+ --_border: var(--tui-radio-border, var(--tui-input-border, var(--tui-color-border)));
4165
+ --_bg: var(--tui-radio-bg, var(--tui-color-bg));
4166
+ --_size: var(--tui-radio-size, 1.15em);
4167
+ --_gap: var(--tui-radio-gap, var(--tui-spacing-xs));
4168
+ --_fs: var(--tui-radio-font-size, var(--tui-typography-size-sm));
4169
+ --_label-color: var(--tui-radio-label-color, var(--tui-color-fg));
4170
+ --_desc-color: var(--tui-radio-description-color, var(--tui-color-fg-muted));
4171
+ display: flex;
4172
+ flex-direction: column;
4173
+ }
4174
+ :where(.tui-interface) .tui-radio:has(.tui-radio__control[aria-checked=true]) .tui-radio__indicator {
4175
+ border-color: var(--_accent);
4176
+ }
4177
+ :where(.tui-interface) .tui-radio:has(.tui-radio__control[aria-checked=true]) .tui-radio__indicator::after {
4178
+ transform: scale(1);
4179
+ background-color: var(--_accent);
4180
+ }
4181
+ :where(.tui-interface) .tui-radio__control {
3955
4182
  display: inline-flex;
3956
4183
  align-items: center;
3957
- gap: var(--tui-spacing-xs);
4184
+ gap: var(--_gap);
3958
4185
  padding: 0;
3959
4186
  border: none;
3960
4187
  background: none;
3961
4188
  font: inherit;
3962
- font-size: var(--tui-typography-size-sm);
3963
- color: var(--tui-color-fg);
4189
+ font-size: var(--_fs);
4190
+ color: var(--_label-color);
3964
4191
  cursor: pointer;
3965
4192
  appearance: none;
3966
4193
  }
3967
- :where(.tui-interface) .tui-radio:focus-visible {
4194
+ :where(.tui-interface) .tui-radio__control:hover:not(:disabled):not([aria-disabled=true]) .tui-radio__indicator {
4195
+ border-color: var(--_accent);
4196
+ }
4197
+ :where(.tui-interface) .tui-radio__control:focus-visible {
3968
4198
  outline: none;
3969
4199
  }
3970
- :where(.tui-interface) .tui-radio:focus-visible .tui-radio__indicator {
4200
+ :where(.tui-interface) .tui-radio__control:focus-visible .tui-radio__indicator {
3971
4201
  outline: var(--tui-focus-ring-width) solid var(--tui-focus-ring-color);
3972
4202
  outline-offset: var(--tui-focus-ring-offset);
3973
4203
  }
3974
- :where(.tui-interface) .tui-radio:disabled {
4204
+ :where(.tui-interface) .tui-radio__control:disabled {
3975
4205
  cursor: not-allowed;
3976
4206
  opacity: var(--tui-opacity-disabled);
4207
+ pointer-events: none;
3977
4208
  }
3978
- :where(.tui-interface) .tui-radio[aria-checked=true] .tui-radio__indicator {
3979
- border-color: var(--_accent);
3980
- }
3981
- :where(.tui-interface) .tui-radio[aria-checked=true] .tui-radio__indicator::after {
3982
- transform: scale(1);
3983
- background-color: var(--_accent);
4209
+ :where(.tui-interface) .tui-radio__control[aria-disabled=true] {
4210
+ cursor: not-allowed;
3984
4211
  }
3985
4212
  :where(.tui-interface) .tui-radio__indicator {
3986
4213
  display: inline-flex;
3987
4214
  align-items: center;
3988
4215
  justify-content: center;
3989
4216
  flex-shrink: 0;
3990
- width: 1.15em;
3991
- height: 1.15em;
4217
+ width: var(--_size);
4218
+ height: var(--_size);
3992
4219
  border-radius: 50%;
3993
4220
  border: var(--tui-border-width) solid var(--_border);
3994
- background-color: var(--tui-color-bg);
4221
+ background-color: var(--_bg);
3995
4222
  transition-duration: var(--tui-motion-duration);
3996
4223
  transition-timing-function: var(--tui-motion-timing);
3997
4224
  transition-property: border-color;
@@ -3999,8 +4226,8 @@
3999
4226
  :where(.tui-interface) .tui-radio__indicator::after {
4000
4227
  content: "";
4001
4228
  display: block;
4002
- width: 0.5em;
4003
- height: 0.5em;
4229
+ width: calc(var(--_size) * 0.435);
4230
+ height: calc(var(--_size) * 0.435);
4004
4231
  border-radius: 50%;
4005
4232
  background-color: transparent;
4006
4233
  transform: scale(0);
@@ -4013,6 +4240,22 @@
4013
4240
  line-height: 1.25em;
4014
4241
  user-select: none;
4015
4242
  }
4243
+ :where(.tui-interface) .tui-radio__body {
4244
+ padding-inline-start: calc(var(--_size) + var(--_gap));
4245
+ }
4246
+ :where(.tui-interface) .tui-radio__description {
4247
+ display: block;
4248
+ margin: 0;
4249
+ font-size: var(--_fs);
4250
+ color: var(--_desc-color);
4251
+ line-height: var(--tui-typography-line-height);
4252
+ }
4253
+ @media (prefers-reduced-motion: reduce) {
4254
+ :where(.tui-interface) .tui-radio__indicator,
4255
+ :where(.tui-interface) .tui-radio__indicator::after {
4256
+ transition: none;
4257
+ }
4258
+ }
4016
4259
  @media (forced-colors: active) {
4017
4260
  :where(.tui-interface) .tui-radio__indicator {
4018
4261
  forced-color-adjust: none;
@@ -4022,10 +4265,10 @@
4022
4265
  :where(.tui-interface) .tui-radio__indicator::after {
4023
4266
  background-color: CanvasText;
4024
4267
  }
4025
- :where(.tui-interface) .tui-radio[aria-checked=true] .tui-radio__indicator {
4268
+ :where(.tui-interface) .tui-radio:has(.tui-radio__control[aria-checked=true]) .tui-radio__indicator {
4026
4269
  border-color: Highlight;
4027
4270
  }
4028
- :where(.tui-interface) .tui-radio[aria-checked=true] .tui-radio__indicator::after {
4271
+ :where(.tui-interface) .tui-radio:has(.tui-radio__control[aria-checked=true]) .tui-radio__indicator::after {
4029
4272
  background-color: Highlight;
4030
4273
  }
4031
4274
  }
@@ -4344,22 +4587,28 @@
4344
4587
  --_gap: var(--tui-segmented-gap, var(--tui-spacing-xs));
4345
4588
  --_padding: var(--tui-segmented-padding, var(--tui-spacing-xs));
4346
4589
  --_radius: var(--tui-segmented-radius, var(--tui-radius-lg));
4347
- --_bg: var(--tui-segmented-bg, var(--tui-color-bg-surface));
4590
+ --_bg: var(--tui-segmented-bg, var(--tui-color-bg-muted));
4348
4591
  --_border: var(--tui-segmented-border, transparent);
4349
4592
  display: inline-flex;
4350
- flex-wrap: wrap;
4593
+ flex-wrap: nowrap;
4351
4594
  gap: var(--_gap);
4352
4595
  padding: var(--_padding);
4353
4596
  background: var(--_bg);
4354
4597
  border: var(--tui-border-width) solid var(--_border);
4355
4598
  border-radius: var(--_radius);
4356
4599
  }
4600
+ :where(.tui-interface) .tui-segmented.is-wrap {
4601
+ flex-wrap: wrap;
4602
+ }
4357
4603
  :where(.tui-interface) .tui-segmented.is-vertical {
4358
4604
  flex-direction: column;
4359
4605
  }
4360
4606
  :where(.tui-interface) .tui-segmented[aria-disabled=true] {
4361
4607
  opacity: var(--tui-opacity-disabled);
4362
4608
  }
4609
+ .tui-interface .tui-segmented.is-variant-pill .tui-segmented__item {
4610
+ --_item-fg: var(--tui-segmented-item-fg, var(--tui-color-fg));
4611
+ }
4363
4612
  :where(.tui-interface) .tui-segmented.is-variant-outline {
4364
4613
  --_bg: transparent;
4365
4614
  --_border: var(--tui-segmented-border, var(--tui-color-border));
@@ -4369,6 +4618,7 @@
4369
4618
  --_padding: 0;
4370
4619
  --_gap: var(--tui-segmented-gap, var(--tui-spacing-md));
4371
4620
  border-radius: 0;
4621
+ border-block-end: var(--tui-border-width) solid var(--tui-color-border);
4372
4622
  }
4373
4623
  .tui-interface .tui-segmented__item {
4374
4624
  --_item-padding: var(--tui-segmented-item-padding, var(--tui-spacing-sm) var(--tui-spacing-md));
@@ -4389,9 +4639,9 @@
4389
4639
  background: var(--_item-bg);
4390
4640
  color: var(--_item-fg);
4391
4641
  font: inherit;
4392
- font-size: var(--tui-font-size-sm);
4642
+ font-size: var(--tui-typography-size-sm);
4393
4643
  font-weight: var(--tui-font-weight-medium, 500);
4394
- line-height: var(--tui-line-height-tight);
4644
+ line-height: var(--tui-line-height-tight, 1.25);
4395
4645
  white-space: nowrap;
4396
4646
  cursor: pointer;
4397
4647
  transition-property: background-color, color;
@@ -4416,44 +4666,45 @@
4416
4666
  }
4417
4667
  .tui-interface .tui-segmented.is-variant-outline .tui-segmented__item {
4418
4668
  --_item-radius: var(--tui-segmented-item-radius, var(--tui-radius-full));
4419
- border: var(--tui-border-width) solid var(--tui-color-border);
4669
+ --_item-border: var(--tui-segmented-border, var(--tui-color-border));
4670
+ --_item-bg-active: var(--tui-segmented-item-bg-active, var(--tui-theme-primary-subtlest));
4671
+ --_item-fg-active: var(--tui-segmented-item-fg-active, var(--tui-theme-primary-strong));
4672
+ border: var(--tui-border-width) solid var(--_item-border);
4420
4673
  }
4421
4674
  .tui-interface .tui-segmented.is-variant-outline .tui-segmented__item[aria-checked=true] {
4422
4675
  border-color: var(--tui-theme-primary-base);
4423
- background: var(--tui-theme-primary-subtlest);
4424
- color: var(--tui-theme-primary-strong);
4676
+ background: var(--_item-bg-active);
4677
+ color: var(--_item-fg-active);
4425
4678
  }
4426
4679
  .tui-interface .tui-segmented.is-variant-underline .tui-segmented__item {
4427
4680
  --_item-radius: 0;
4428
4681
  --_item-fg: var(--tui-segmented-item-fg, var(--tui-color-fg));
4429
4682
  --_indicator: var(--tui-segmented-indicator, var(--tui-theme-primary-base));
4430
4683
  --_indicator-size: var(--tui-segmented-indicator-size, 2px);
4431
- position: relative;
4432
- padding-bottom: calc(var(--tui-spacing-sm) + var(--_indicator-size));
4684
+ margin-block-end: calc(var(--tui-border-width) * -1);
4685
+ border-bottom: var(--_indicator-size) solid transparent;
4433
4686
  }
4434
- .tui-interface .tui-segmented.is-variant-underline .tui-segmented__item::after {
4435
- content: "";
4436
- position: absolute;
4437
- left: 0;
4438
- right: 0;
4439
- bottom: 0;
4440
- height: var(--_indicator-size);
4441
- background: transparent;
4442
- transition: background-color var(--tui-motion-duration) var(--tui-motion-timing);
4687
+ .tui-interface .tui-segmented.is-variant-underline .tui-segmented__item:hover:not([aria-disabled=true]):not([aria-checked=true]) {
4688
+ color: var(--tui-color-fg);
4443
4689
  }
4444
4690
  .tui-interface .tui-segmented.is-variant-underline .tui-segmented__item[aria-checked=true] {
4445
4691
  background: transparent;
4446
4692
  color: var(--tui-color-fg);
4447
- font-weight: var(--tui-font-weight-semibold, 600);
4693
+ border-bottom-color: var(--_indicator);
4448
4694
  }
4449
- .tui-interface .tui-segmented.is-variant-underline .tui-segmented__item[aria-checked=true]::after {
4450
- background: var(--_indicator);
4695
+ .tui-interface .tui-segmented.is-variant-underline .tui-segmented__item:focus-visible {
4696
+ outline-offset: calc(var(--tui-focus-ring-offset) * -1);
4451
4697
  }
4452
4698
  .tui-interface .tui-segmented.is-size-sm .tui-segmented__item {
4453
4699
  --_item-padding: var(--tui-spacing-xs) var(--tui-spacing-sm);
4454
- font-size: var(--tui-font-size-xs);
4700
+ font-size: var(--tui-typography-size-xs);
4455
4701
  min-height: var(--tui-control-height-sm);
4456
4702
  }
4703
+ .tui-interface .tui-segmented.is-size-lg .tui-segmented__item {
4704
+ --_item-padding: var(--tui-spacing-sm) var(--tui-spacing-lg);
4705
+ font-size: var(--tui-typography-size-md);
4706
+ min-height: var(--tui-control-height-lg);
4707
+ }
4457
4708
  :where(.tui-interface) .tui-segmented__item-icon {
4458
4709
  display: inline-flex;
4459
4710
  align-items: center;
@@ -4477,12 +4728,27 @@
4477
4728
  .tui-interface .tui-segmented__item:focus-visible {
4478
4729
  outline: 2px solid CanvasText;
4479
4730
  }
4731
+ .tui-interface .tui-segmented.is-variant-underline .tui-segmented__item[aria-checked=true] {
4732
+ background: transparent;
4733
+ color: CanvasText;
4734
+ border-bottom-color: Highlight;
4735
+ border-bottom-width: 3px;
4736
+ }
4737
+ .tui-interface .tui-segmented.is-variant-outline .tui-segmented__item {
4738
+ border-color: CanvasText;
4739
+ }
4740
+ .tui-interface .tui-segmented.is-variant-outline .tui-segmented__item[aria-checked=true] {
4741
+ background: transparent;
4742
+ color: CanvasText;
4743
+ border-color: Highlight;
4744
+ border-width: 2px;
4745
+ }
4480
4746
  }
4481
4747
  :where(.tui-interface) .tui-switch {
4482
4748
  display: inline-flex;
4483
4749
  align-items: center;
4484
- gap: var(--tui-spacing-xs);
4485
- font-size: var(--tui-typography-size-md);
4750
+ gap: var(--tui-switch-gap, var(--tui-spacing-xs));
4751
+ font-size: var(--tui-switch-font-size, var(--tui-typography-size-md));
4486
4752
  cursor: pointer;
4487
4753
  user-select: none;
4488
4754
  }
@@ -4500,12 +4766,17 @@
4500
4766
  font-weight: unset;
4501
4767
  line-height: 1.25em;
4502
4768
  font-size: var(--tui-typography-size-sm);
4769
+ color: var(--tui-switch-label-color, inherit);
4503
4770
  user-select: none;
4504
4771
  }
4505
4772
  :where(.tui-interface) .tui-switch__track {
4506
4773
  --_accent: var(--tui-switch-accent, var(--tui-input-accent, var(--tui-theme-primary-base)));
4507
- --_track-off: var(--tui-switch-track-off, var(--tui-theme-secondary-soft));
4508
- font-size: var(--tui-typography-size-md);
4774
+ --_bg: var(--tui-switch-bg, var(--tui-theme-secondary-soft));
4775
+ --_border: var(--tui-switch-border, var(--_bg));
4776
+ --_thumb-bg: var(--tui-switch-thumb-bg, var(--tui-color-bg));
4777
+ --_track-height: var(--tui-switch-track-height, 1.4285em);
4778
+ --_thumb-size: calc(var(--_track-height) - 4px);
4779
+ font-size: var(--tui-switch-size, var(--tui-typography-size-md));
4509
4780
  }
4510
4781
  :where(.tui-interface) .tui-switch__track.is-size-sm {
4511
4782
  font-size: var(--tui-typography-size-sm);
@@ -4519,10 +4790,10 @@
4519
4790
  align-items: center;
4520
4791
  flex-shrink: 0;
4521
4792
  width: 2.8575em;
4522
- height: 1.4285em;
4793
+ height: var(--_track-height);
4523
4794
  border-radius: 9999px;
4524
- border: var(--tui-border-width) solid var(--_track-off);
4525
- background-color: var(--_track-off);
4795
+ border: var(--tui-border-width) solid var(--_border);
4796
+ background-color: var(--_bg);
4526
4797
  padding: 0;
4527
4798
  cursor: pointer;
4528
4799
  appearance: none;
@@ -4538,24 +4809,30 @@
4538
4809
  :where(.tui-interface) .tui-switch__track:disabled {
4539
4810
  cursor: not-allowed;
4540
4811
  }
4541
- :where(.tui-interface) .tui-switch__track.is-checked {
4812
+ :where(.tui-interface) .tui-switch__track[aria-checked=true] {
4542
4813
  background-color: var(--_accent);
4543
4814
  border-color: var(--_accent);
4544
4815
  }
4816
+ :where(.tui-interface) .tui-switch__track[aria-invalid=true] {
4817
+ --_border: var(--tui-theme-danger-base);
4818
+ }
4819
+ :where(.tui-interface) .tui-switch__track[aria-invalid=true][aria-checked=true] {
4820
+ border-color: var(--tui-theme-danger-base);
4821
+ }
4545
4822
  :where(.tui-interface) .tui-switch__thumb {
4546
4823
  display: block;
4547
- width: calc(1.4285em - 4px);
4548
- height: calc(1.4285em - 4px);
4824
+ width: var(--_thumb-size);
4825
+ height: var(--_thumb-size);
4549
4826
  border-radius: 50%;
4550
- background-color: var(--tui-color-bg);
4827
+ background-color: var(--_thumb-bg);
4551
4828
  transform: translateX(2px);
4552
4829
  transition-duration: var(--tui-motion-duration);
4553
4830
  transition-timing-function: var(--tui-motion-timing);
4554
4831
  transition-property: transform;
4555
4832
  pointer-events: none;
4556
4833
  }
4557
- :where(.tui-interface) .tui-switch__track.is-checked .tui-switch__thumb {
4558
- transform: translateX(calc(2.8575em - calc(1.4285em - 4px) - 2px - 2 * var(--tui-border-width)));
4834
+ :where(.tui-interface) .tui-switch__track[aria-checked=true] .tui-switch__thumb {
4835
+ transform: translateX(calc(2.8575em - var(--_thumb-size) - 2px - 2 * var(--tui-border-width)));
4559
4836
  }
4560
4837
  @media (forced-colors: active) {
4561
4838
  :where(.tui-interface) .tui-switch__track {
@@ -4563,20 +4840,27 @@
4563
4840
  border: 2px solid CanvasText;
4564
4841
  background-color: Canvas;
4565
4842
  }
4566
- :where(.tui-interface) .tui-switch__track.is-checked {
4843
+ :where(.tui-interface) .tui-switch__track[aria-checked=true] {
4567
4844
  background-color: Highlight;
4568
4845
  border-color: Highlight;
4569
4846
  }
4570
4847
  :where(.tui-interface) .tui-switch__track:focus-visible {
4571
- outline-color: Highlight;
4848
+ outline-color: ButtonText;
4849
+ outline-offset: 3px;
4572
4850
  }
4573
4851
  :where(.tui-interface) .tui-switch__thumb {
4574
4852
  background-color: CanvasText;
4575
4853
  }
4576
- :where(.tui-interface) .tui-switch__track.is-checked .tui-switch__thumb {
4854
+ :where(.tui-interface) .tui-switch__track[aria-checked=true] .tui-switch__thumb {
4577
4855
  background-color: HighlightText;
4578
4856
  }
4579
4857
  }
4858
+ @media (prefers-reduced-motion: reduce) {
4859
+ :where(.tui-interface) .tui-switch__track,
4860
+ :where(.tui-interface) .tui-switch__thumb {
4861
+ transition: none;
4862
+ }
4863
+ }
4580
4864
  :where(.tui-interface) .tui-sidebar {
4581
4865
  --_width: var(--tui-sidebar-width, 320px);
4582
4866
  --_bg: var(--tui-sidebar-bg, var(--tui-color-bg-surface));
@@ -5096,7 +5380,6 @@
5096
5380
  }
5097
5381
  :where(.tui-interface) .tui-textarea {
5098
5382
  min-height: calc(4em + 2 * var(--_py));
5099
- padding-inline: 0.5em;
5100
5383
  font-family: inherit;
5101
5384
  line-height: 1.4;
5102
5385
  }
@@ -5909,8 +6192,7 @@
5909
6192
  .tui-interface ul.tui-inline-flex,
5910
6193
  .tui-interface ul.tui-flex {
5911
6194
  list-style: none !important;
5912
- padding: 0 !important;
5913
- margin: 0 !important;
6195
+ padding-inline-start: 0 !important;
5914
6196
  }
5915
6197
  .tui-interface ul.tui-grid > li,
5916
6198
  .tui-interface ul.tui-stack > li,
@@ -5918,6 +6200,14 @@
5918
6200
  .tui-interface ul.tui-flex > li {
5919
6201
  list-style: none !important;
5920
6202
  }
6203
+ .tui-interface .tui-list-reset {
6204
+ list-style: none !important;
6205
+ padding: 0 !important;
6206
+ margin: 0 !important;
6207
+ }
6208
+ .tui-interface .tui-list-reset > li {
6209
+ list-style: none !important;
6210
+ }
5921
6211
  .tui-interface .is-density-none {
5922
6212
  --tui-gap-inline: 0;
5923
6213
  --tui-gap-block: 0;