@scalewing/react 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +48 -4
  3. package/dist/components/ActionMenu.d.ts +14 -0
  4. package/dist/components/ActionMenu.js +4 -0
  5. package/dist/components/ButtonGroup.d.ts +9 -1
  6. package/dist/components/ButtonGroup.js +2 -2
  7. package/dist/components/Checkbox.js +5 -4
  8. package/dist/components/FilterChips.d.ts +17 -1
  9. package/dist/components/FilterChips.js +11 -6
  10. package/dist/components/GlyphTile.d.ts +21 -0
  11. package/dist/components/GlyphTile.js +17 -0
  12. package/dist/components/MultiSelect.d.ts +10 -0
  13. package/dist/components/MultiSelect.js +62 -0
  14. package/dist/components/ScrollRegion.d.ts +6 -2
  15. package/dist/components/ScrollRegion.js +9 -3
  16. package/dist/components/SectionNav.d.ts +25 -2
  17. package/dist/components/SectionNav.js +13 -4
  18. package/dist/components/SegmentedControl.d.ts +8 -0
  19. package/dist/components/SegmentedControl.js +4 -3
  20. package/dist/components/Table.d.ts +49 -5
  21. package/dist/components/Table.js +11 -4
  22. package/dist/components/action-menu/ActionMenuList.js +7 -7
  23. package/dist/components/checkbox/CheckboxControl.d.ts +9 -0
  24. package/dist/components/checkbox/CheckboxControl.js +9 -0
  25. package/dist/components/multi-select/MultiSelectPanel.d.ts +25 -0
  26. package/dist/components/multi-select/MultiSelectPanel.js +41 -0
  27. package/dist/components/multi-select/types.d.ts +35 -0
  28. package/dist/components/multi-select/types.js +1 -0
  29. package/dist/components/multi-select/validate.d.ts +3 -0
  30. package/dist/components/multi-select/validate.js +25 -0
  31. package/dist/components/table/TableCell.d.ts +8 -0
  32. package/dist/components/table/TableCell.js +4 -2
  33. package/dist/components/table/TableRow.d.ts +39 -0
  34. package/dist/components/table/TableRow.js +8 -0
  35. package/dist/components/use-scroll-overflow.d.ts +8 -3
  36. package/dist/components/use-scroll-overflow.js +15 -4
  37. package/dist/css/css-action-menu.js +41 -0
  38. package/dist/css/css-button-group-attached.d.ts +2 -0
  39. package/dist/css/css-button-group-attached.js +70 -0
  40. package/dist/css/css-button.js +5 -1
  41. package/dist/css/css-components.js +8 -0
  42. package/dist/css/css-filter-chips.js +26 -0
  43. package/dist/css/css-glyph-tile.d.ts +5 -0
  44. package/dist/css/css-glyph-tile.js +57 -0
  45. package/dist/css/css-multi-select.d.ts +2 -0
  46. package/dist/css/css-multi-select.js +156 -0
  47. package/dist/css/css-section-nav-filled.d.ts +6 -0
  48. package/dist/css/css-section-nav-filled.js +80 -0
  49. package/dist/css/css-section-nav.js +4 -0
  50. package/dist/css/css-segmented.js +58 -0
  51. package/dist/css/css-table-footer.d.ts +2 -0
  52. package/dist/css/css-table-footer.js +57 -0
  53. package/dist/css/css-table-ledger.d.ts +10 -0
  54. package/dist/css/css-table-ledger.js +122 -0
  55. package/dist/css/css-table.js +8 -0
  56. package/dist/css/css-variables.js +11 -1
  57. package/dist/css/stacking.d.ts +9 -3
  58. package/dist/css/stacking.js +29 -9
  59. package/dist/css/stylesheet.js +4 -0
  60. package/dist/index.d.ts +4 -2
  61. package/dist/index.js +4 -2
  62. package/dist/styles.css +501 -7
  63. package/package.json +2 -2
package/dist/styles.css CHANGED
@@ -19,6 +19,14 @@
19
19
  --sw-color-warning: #B54708;
20
20
  --sw-color-border: #D2D2D7;
21
21
  --sw-button-secondary-border: #D2D2D7;
22
+ --sw-categorical-green: #2E8F47;
23
+ --sw-categorical-blue: #0A7AFF;
24
+ --sw-categorical-orange: #D57F00;
25
+ --sw-categorical-purple: #8E5CD9;
26
+ --sw-categorical-teal: #1A96AD;
27
+ --sw-categorical-rose: #C2415D;
28
+ --sw-categorical-neutral: #8E8E93;
29
+ --sw-categorical-on: #FFFFFF;
22
30
  --sw-space-0: 0px;
23
31
  --sw-space-1: 4px;
24
32
  --sw-space-2: 8px;
@@ -84,6 +92,14 @@
84
92
  --sw-color-warning: #FDB022;
85
93
  --sw-color-border: #3A3A3C;
86
94
  --sw-button-secondary-border: #3A3A3C;
95
+ --sw-categorical-green: #2E8F47;
96
+ --sw-categorical-blue: #0A7AFF;
97
+ --sw-categorical-orange: #D57F00;
98
+ --sw-categorical-purple: #8E5CD9;
99
+ --sw-categorical-teal: #1A96AD;
100
+ --sw-categorical-rose: #C2415D;
101
+ --sw-categorical-neutral: #8E8E93;
102
+ --sw-categorical-on: #FFFFFF;
87
103
  --sw-space-0: 0px;
88
104
  --sw-space-1: 4px;
89
105
  --sw-space-2: 8px;
@@ -812,10 +828,10 @@ body {
812
828
  }
813
829
 
814
830
  /* Backdrop blur makes a glass surface its own stacking context, so it lifts while it holds an open popup (see stacking.ts). */
815
- .sw-card-glass:has(.sw-select-list, .sw-action-menu-list, .sw-tooltip:not([hidden]), .sw-date-field-calendar),
816
- .sw-accordion:has(.sw-select-list, .sw-action-menu-list, .sw-tooltip:not([hidden]), .sw-date-field-calendar) {
831
+ .sw-card-glass:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-tooltip:not([hidden]), .sw-date-field-calendar),
832
+ .sw-accordion:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-tooltip:not([hidden]), .sw-date-field-calendar) {
817
833
  position: relative;
818
- z-index: 3;
834
+ z-index: 4;
819
835
  }
820
836
 
821
837
  .sw-card-outlined {
@@ -915,6 +931,53 @@ body {
915
931
  .sw-button-group > * { width: 100%; }
916
932
  }
917
933
 
934
+ .sw-button-group.sw-button-group-attached {
935
+ align-items: stretch;
936
+ display: inline-flex;
937
+ flex-wrap: nowrap;
938
+ gap: 0;
939
+ isolation: isolate;
940
+ max-width: 100%;
941
+ width: fit-content;
942
+ }
943
+
944
+ .sw-button-group.sw-button-group-attached > .sw-button {
945
+ border-radius: 0;
946
+ }
947
+
948
+ .sw-button-group.sw-button-group-attached > .sw-button + .sw-button {
949
+ margin-inline-start: -1px;
950
+ }
951
+
952
+ .sw-button-group.sw-button-group-attached > .sw-button:first-child {
953
+ border-end-start-radius: var(--sw-radius-sm);
954
+ border-start-start-radius: var(--sw-radius-sm);
955
+ }
956
+
957
+ .sw-button-group.sw-button-group-attached > .sw-button:last-child {
958
+ border-end-end-radius: var(--sw-radius-sm);
959
+ border-start-end-radius: var(--sw-radius-sm);
960
+ }
961
+
962
+ .sw-button-group.sw-button-group-attached > .sw-button + .sw-button:not(.sw-button-secondary) {
963
+ border-inline-start-color: color-mix(in srgb, currentColor 30%, transparent);
964
+ }
965
+
966
+ .sw-button-group.sw-button-group-attached > .sw-button[aria-pressed='true'] {
967
+ position: relative;
968
+ z-index: 1;
969
+ }
970
+
971
+ .sw-button-group.sw-button-group-attached > .sw-button:focus-visible {
972
+ position: relative;
973
+ z-index: 2;
974
+ }
975
+
976
+ @media not all and (min-width: 48rem) {
977
+ .sw-button-group.sw-button-group-attached { align-items: stretch; flex-direction: row; }
978
+ .sw-button-group.sw-button-group-attached > * { width: auto; }
979
+ }
980
+
918
981
  .sw-checkbox {
919
982
  display: flex;
920
983
  flex-direction: column;
@@ -1348,6 +1411,45 @@ body {
1348
1411
  color: var(--sw-color-onAccent);
1349
1412
  }
1350
1413
 
1414
+ .sw-segmented.sw-segmented-with-icons:not(.sw-segmented-filled) {
1415
+ background: var(--sw-color-subtle);
1416
+ border-color: transparent;
1417
+ }
1418
+
1419
+ .sw-segmented-with-icons:not(.sw-segmented-filled) .sw-segmented-item-selected {
1420
+ box-shadow: var(--sw-elevation-sm);
1421
+ }
1422
+
1423
+ .sw-segmented-with-icons .sw-segmented-item {
1424
+ align-items: center;
1425
+ display: inline-flex;
1426
+ gap: var(--sw-space-2);
1427
+ justify-content: center;
1428
+ }
1429
+
1430
+ .sw-segmented-with-icons:not(.sw-segmented-filled) .sw-segmented-item {
1431
+ font-size: 15px;
1432
+ letter-spacing: -0.2px;
1433
+ line-height: 20px;
1434
+ min-height: var(--sw-control-md-min-height);
1435
+ padding-inline: var(--sw-space-2) var(--sw-space-3);
1436
+ }
1437
+
1438
+ .sw-segmented-item-icon {
1439
+ display: inline-flex;
1440
+ flex: none;
1441
+ }
1442
+
1443
+ .sw-segmented.sw-segmented-with-icons[aria-invalid='true'] {
1444
+ border-color: var(--sw-color-danger);
1445
+ }
1446
+
1447
+ @media (forced-colors: active) {
1448
+ .sw-segmented.sw-segmented-with-icons:not(.sw-segmented-filled) { border-color: CanvasText; }
1449
+ .sw-segmented-with-icons:not(.sw-segmented-filled) .sw-segmented-item-selected { outline: 2px solid Highlight; }
1450
+ .sw-segmented.sw-segmented-with-icons[aria-invalid='true'] { border-color: Mark; }
1451
+ }
1452
+
1351
1453
  .sw-segmented-disabled {
1352
1454
  opacity: var(--sw-disabled-opacity);
1353
1455
  }
@@ -1538,6 +1640,118 @@ body {
1538
1640
  .sw-table-sort-none { opacity: 1; }
1539
1641
  }
1540
1642
 
1643
+ .sw-table .sw-table-tone-success {
1644
+ color: var(--sw-color-success);
1645
+ }
1646
+
1647
+ .sw-table .sw-table-tone-danger {
1648
+ color: var(--sw-color-danger);
1649
+ }
1650
+
1651
+ .sw-table .sw-table-tone-muted {
1652
+ color: var(--sw-color-muted);
1653
+ }
1654
+
1655
+ .sw-table .sw-table-tone-accent {
1656
+ color: var(--sw-color-accent);
1657
+ }
1658
+
1659
+ .sw-table-column-rules :is(th, td) + :is(th, td) {
1660
+ border-inline-start: 1px solid var(--sw-color-border);
1661
+ }
1662
+
1663
+ /* A sticky header cell is positioned, so the next cell's fill covers a
1664
+ collapsed border; its rule is a border on its own ::after instead, so
1665
+ forced colours keep it and the logical inset mirrors it. */
1666
+ .sw-table-sticky.sw-table-column-rules thead :is(th, td) + :is(th, td)::after {
1667
+ border-inline-start: 1px solid var(--sw-color-border);
1668
+ content: '';
1669
+ inset-block: 0;
1670
+ inset-inline-start: 0;
1671
+ pointer-events: none;
1672
+ position: absolute;
1673
+ }
1674
+
1675
+ :where(.sw-table tbody, .sw-table tfoot) th[scope='row'] {
1676
+ color: inherit;
1677
+ font: inherit;
1678
+ letter-spacing: inherit;
1679
+ }
1680
+
1681
+ .sw-table-row-sub > th[scope='row'] {
1682
+ padding-inline-start: calc(var(--sw-space-3) + var(--sw-space-6) + var(--sw-space-3));
1683
+ position: relative;
1684
+ }
1685
+
1686
+ .sw-table-compact .sw-table-row-sub > th[scope='row'] {
1687
+ padding-inline-start: calc(var(--sw-space-2) + var(--sw-space-6) + var(--sw-space-3));
1688
+ }
1689
+
1690
+ .sw-table-row-sub > th[scope='row']::after {
1691
+ block-size: var(--sw-space-5);
1692
+ border-inline-start: 2px solid var(--sw-color-border);
1693
+ content: '';
1694
+ inset-block-start: 50%;
1695
+ inset-inline-start: calc(var(--sw-space-3) + var(--sw-space-6));
1696
+ pointer-events: none;
1697
+ position: absolute;
1698
+ transform: translateY(-50%);
1699
+ }
1700
+
1701
+ .sw-table-compact .sw-table-row-sub > th[scope='row']::after {
1702
+ inset-inline-start: calc(var(--sw-space-2) + var(--sw-space-6));
1703
+ }
1704
+
1705
+ .sw-table .sw-table-row-struck > :is(td, th) {
1706
+ background: var(--sw-color-subtle);
1707
+ color: var(--sw-color-muted);
1708
+ text-decoration: line-through;
1709
+ }
1710
+
1711
+ .sw-table .sw-table-row-struck > [class*='sw-table-tone-'] {
1712
+ color: var(--sw-color-muted);
1713
+ }
1714
+
1715
+ @media (forced-colors: active) {
1716
+ .sw-table-column-rules :is(th, td) + :is(th, td),
1717
+ .sw-table-sticky.sw-table-column-rules thead :is(th, td) + :is(th, td)::after { border-color: CanvasText; }
1718
+ .sw-table-row-sub > th[scope='row']::after { border-color: CanvasText; }
1719
+ }
1720
+
1721
+ .sw-table tfoot :is(th, td) {
1722
+ font-weight: 600;
1723
+ position: relative;
1724
+ }
1725
+
1726
+ .sw-table tfoot > tr:first-child > :is(th, td)::before {
1727
+ border-top: 2px solid var(--sw-color-border);
1728
+ content: '';
1729
+ /* Over the last body row's 1 px border, so the rule reads 2 px. */
1730
+ inset-block-start: -1px;
1731
+ inset-inline: 0;
1732
+ pointer-events: none;
1733
+ position: absolute;
1734
+ }
1735
+
1736
+ .sw-table .sw-table-footer-sticky :is(th, td) {
1737
+ background: var(--sw-glass-fill);
1738
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
1739
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
1740
+ bottom: 0;
1741
+ position: sticky;
1742
+ z-index: 2;
1743
+ }
1744
+
1745
+ .sw-table-wrap.sw-scroll-fits:has(> .sw-table > .sw-table-footer-sticky) {
1746
+ overflow: visible;
1747
+ }
1748
+
1749
+ @media (forced-colors: active) {
1750
+ .sw-table tfoot > tr:first-child > :is(th, td)::before { border-color: CanvasText; }
1751
+ .sw-table .sw-table-footer-sticky :is(th, td),
1752
+ .sw-table-sticky thead th { background: Canvas; backdrop-filter: none; -webkit-backdrop-filter: none; }
1753
+ }
1754
+
1541
1755
  .sw-table-row-selected > :first-child {
1542
1756
  position: relative;
1543
1757
  }
@@ -2031,7 +2245,7 @@ body {
2031
2245
  .sw-app-header-sticky {
2032
2246
  position: sticky;
2033
2247
  top: 0;
2034
- z-index: 4;
2248
+ z-index: 5;
2035
2249
  }
2036
2250
 
2037
2251
  .sw-nav {
@@ -2155,6 +2369,54 @@ body {
2155
2369
  }
2156
2370
  }
2157
2371
 
2372
+ .sw-section-nav.sw-section-nav-filled .sw-section-nav-list {
2373
+ border-bottom: 0;
2374
+ }
2375
+
2376
+ /* (0,4,0): outranks the underline and the side list's start bar. */
2377
+ [data-theme] .sw-section-nav.sw-section-nav-filled .sw-section-nav-link {
2378
+ border: 2px solid transparent;
2379
+ border-radius: var(--sw-radius-sm);
2380
+ font-weight: 500;
2381
+ margin-bottom: 0;
2382
+ min-height: var(--sw-control-sm-min-height);
2383
+ padding-inline: var(--sw-control-sm-padding-inline);
2384
+ }
2385
+
2386
+ [data-theme] .sw-section-nav.sw-section-nav-filled .sw-section-nav-link[aria-current] {
2387
+ background: color-mix(in srgb, var(--sw-color-muted) 18%, transparent);
2388
+ border-color: transparent;
2389
+ color: var(--sw-color-text);
2390
+ font-weight: 600;
2391
+ }
2392
+
2393
+ [data-theme] .sw-section-nav-count {
2394
+ align-items: center;
2395
+ background: var(--sw-color-danger);
2396
+ border-radius: var(--sw-radius-pill);
2397
+ box-sizing: border-box;
2398
+ color: var(--sw-color-onDanger);
2399
+ display: inline-flex;
2400
+ font-size: 13px;
2401
+ font-variant-numeric: tabular-nums;
2402
+ font-weight: 700;
2403
+ justify-content: center;
2404
+ letter-spacing: -0.08px;
2405
+ line-height: 1;
2406
+ min-height: calc(var(--sw-space-5) - var(--sw-space-1));
2407
+ min-width: calc(var(--sw-space-5) - var(--sw-space-1));
2408
+ padding-inline: var(--sw-space-1);
2409
+ }
2410
+
2411
+ @media (pointer: coarse) {
2412
+ [data-theme] .sw-section-nav.sw-section-nav-filled .sw-section-nav-link { min-height: var(--sw-control-md-min-height); }
2413
+ }
2414
+
2415
+ @media (forced-colors: active) {
2416
+ [data-theme] .sw-section-nav.sw-section-nav-filled .sw-section-nav-link[aria-current] { border-color: Highlight; }
2417
+ [data-theme] .sw-section-nav-count { border: 1px solid CanvasText; }
2418
+ }
2419
+
2158
2420
  @media (pointer: coarse) {
2159
2421
  [data-theme] .sw-section-nav-link { min-height: var(--sw-control-md-min-height); }
2160
2422
  }
@@ -2705,6 +2967,47 @@ body {
2705
2967
  color: var(--sw-color-danger);
2706
2968
  }
2707
2969
 
2970
+ /*
2971
+ * A command's detail: its current value at the inline end in the muted
2972
+ * colour, then a chevron pointing to the inline end (mirrored right to
2973
+ * left). A long value wraps between words, never inside one (the command
2974
+ * itself may break anywhere), and the chevron stays last.
2975
+ */
2976
+ .sw-action-menu-detail {
2977
+ align-items: center;
2978
+ color: var(--sw-color-muted);
2979
+ display: inline-flex;
2980
+ gap: var(--sw-space-2);
2981
+ margin-inline-start: auto;
2982
+ overflow-wrap: normal;
2983
+ padding-inline-start: var(--sw-space-3);
2984
+ text-align: end;
2985
+ }
2986
+
2987
+ .sw-action-menu-chevron {
2988
+ border-bottom: 2px solid var(--sw-color-muted);
2989
+ border-right: 2px solid var(--sw-color-muted);
2990
+ box-sizing: border-box;
2991
+ height: var(--sw-space-2);
2992
+ width: var(--sw-space-2);
2993
+ flex: none;
2994
+ transform: rotate(-45deg);
2995
+ }
2996
+
2997
+ .sw-action-menu-chevron:dir(rtl) {
2998
+ transform: rotate(135deg);
2999
+ }
3000
+
3001
+ /* A hairline that sets a command apart from the ones above. */
3002
+ .sw-action-menu-separator {
3003
+ border-top: 1px solid var(--sw-color-border);
3004
+ margin-block: var(--sw-space-1);
3005
+ }
3006
+
3007
+ @media (forced-colors: active) {
3008
+ .sw-action-menu-chevron { border-color: CanvasText; }
3009
+ }
3010
+
2708
3011
  /* A coarse pointer gets the full touch target: the trigger at least square, and every command as tall. */
2709
3012
  @media (pointer: coarse) {
2710
3013
  .sw-action-menu-trigger {
@@ -2717,6 +3020,138 @@ body {
2717
3020
  }
2718
3021
  }
2719
3022
 
3023
+ .sw-multi-select {
3024
+ display: inline-flex;
3025
+ max-width: 100%;
3026
+ }
3027
+
3028
+ .sw-multi-select-trigger {
3029
+ align-items: center;
3030
+ appearance: none;
3031
+ background-color: var(--sw-glass-fill);
3032
+ border: 1px solid var(--sw-color-border);
3033
+ border-radius: var(--sw-radius-sm);
3034
+ box-sizing: border-box;
3035
+ color: var(--sw-color-text);
3036
+ column-gap: var(--sw-space-2);
3037
+ cursor: pointer;
3038
+ display: inline-flex;
3039
+ font-family: var(--sw-font-sans);
3040
+ font-size: 15px;
3041
+ font-weight: 600;
3042
+ letter-spacing: -0.2px;
3043
+ line-height: 20px;
3044
+ margin: 0;
3045
+ max-width: 100%;
3046
+ min-height: var(--sw-control-md-min-height);
3047
+ padding-inline: var(--sw-control-md-padding-inline);
3048
+ }
3049
+
3050
+ .sw-multi-select-trigger::after {
3051
+ border-bottom: 2px solid var(--sw-color-muted);
3052
+ border-right: 2px solid var(--sw-color-muted);
3053
+ box-sizing: border-box;
3054
+ height: var(--sw-space-2);
3055
+ width: var(--sw-space-2);
3056
+ content: '';
3057
+ flex: none;
3058
+ margin-inline-start: var(--sw-space-2);
3059
+ transform: translateY(-25%) rotate(45deg);
3060
+ }
3061
+
3062
+ .sw-multi-select-trigger:focus-visible {
3063
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
3064
+ outline-offset: var(--sw-focus-ring-offset);
3065
+ }
3066
+
3067
+ .sw-multi-select-trigger:disabled {
3068
+ cursor: not-allowed;
3069
+ opacity: var(--sw-disabled-opacity);
3070
+ }
3071
+
3072
+ .sw-multi-select-label {
3073
+ color: var(--sw-color-muted);
3074
+ font-weight: 500;
3075
+ }
3076
+
3077
+ .sw-multi-select-summary {
3078
+ min-width: 0;
3079
+ overflow: hidden;
3080
+ text-overflow: ellipsis;
3081
+ white-space: nowrap;
3082
+ }
3083
+
3084
+ .sw-multi-select-panel {
3085
+ background: var(--sw-glass-fill);
3086
+ border: 1px solid var(--sw-glass-border);
3087
+ border-radius: var(--sw-radius-sm);
3088
+ box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
3089
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
3090
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
3091
+ box-sizing: border-box;
3092
+ color: var(--sw-color-text);
3093
+ display: flex;
3094
+ flex-direction: column;
3095
+ inset: auto;
3096
+ margin: 0;
3097
+ /* The viewport, not --sw-select-max: the list is short and should show
3098
+ whole rather than scroll inside a 22rem cap. */
3099
+ max-height: calc(100% - var(--sw-space-2) - var(--sw-space-2));
3100
+ max-width: calc(100% - var(--sw-space-2) - var(--sw-space-2));
3101
+ min-width: var(--sw-select-max);
3102
+ overflow: auto;
3103
+ padding: var(--sw-space-1);
3104
+ position: fixed;
3105
+ width: max-content;
3106
+ z-index: 10;
3107
+ }
3108
+
3109
+ .sw-multi-select-commands {
3110
+ border-bottom: 1px solid var(--sw-color-border);
3111
+ display: flex;
3112
+ justify-content: space-between;
3113
+ margin-bottom: var(--sw-space-1);
3114
+ padding-bottom: var(--sw-space-1);
3115
+ }
3116
+
3117
+ .sw-multi-select-row-separated {
3118
+ border-top: 1px solid var(--sw-color-border);
3119
+ margin-top: var(--sw-space-1);
3120
+ padding-top: var(--sw-space-1);
3121
+ }
3122
+
3123
+ .sw-checkbox-label.sw-multi-select-option {
3124
+ border-radius: var(--sw-radius-sm);
3125
+ box-sizing: border-box;
3126
+ font-family: var(--sw-font-sans);
3127
+ font-size: 15px;
3128
+ font-weight: 400;
3129
+ letter-spacing: -0.2px;
3130
+ line-height: 20px;
3131
+ padding-inline: var(--sw-space-2);
3132
+ width: 100%;
3133
+ }
3134
+
3135
+ .sw-multi-select-option:hover {
3136
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
3137
+ }
3138
+
3139
+ .sw-multi-select-icon {
3140
+ display: inline-flex;
3141
+ flex: none;
3142
+ }
3143
+
3144
+ .sw-multi-select-text {
3145
+ min-width: 0;
3146
+ }
3147
+
3148
+ @media (forced-colors: active) {
3149
+ .sw-multi-select-trigger::after { border-color: CanvasText; }
3150
+ .sw-multi-select-panel { border-color: CanvasText; }
3151
+ .sw-multi-select-commands,
3152
+ .sw-multi-select-row-separated { border-color: CanvasText; }
3153
+ }
3154
+
2720
3155
  .sw-action-bar {
2721
3156
  align-items: center;
2722
3157
  background: var(--sw-glass-fill);
@@ -2808,14 +3243,14 @@ body {
2808
3243
  .sw-action-bar-sticky {
2809
3244
  bottom: calc(var(--sw-space-2) + env(safe-area-inset-bottom, 0px));
2810
3245
  position: sticky;
2811
- z-index: 2;
3246
+ z-index: 3;
2812
3247
  }
2813
3248
 
2814
3249
  @media not all and (min-width: 48rem) {
2815
3250
  .sw-action-bar-sticky-below-md {
2816
3251
  bottom: calc(var(--sw-space-2) + env(safe-area-inset-bottom, 0px));
2817
3252
  position: sticky;
2818
- z-index: 2;
3253
+ z-index: 3;
2819
3254
  }
2820
3255
  }
2821
3256
 
@@ -3126,6 +3561,39 @@ body {
3126
3561
  .sw-notice-band { border-width: 0 0 1px; }
3127
3562
  }
3128
3563
 
3564
+ .sw-glyph-tile {
3565
+ align-items: center;
3566
+ background: var(--sw-glyph-tile-fill);
3567
+ border-radius: var(--sw-radius-sm);
3568
+ box-sizing: border-box;
3569
+ color: var(--sw-categorical-on);
3570
+ display: inline-flex;
3571
+ flex: none;
3572
+ justify-content: center;
3573
+ }
3574
+
3575
+ .sw-glyph-tile > svg {
3576
+ flex: none;
3577
+ height: var(--sw-space-4);
3578
+ width: var(--sw-space-4);
3579
+ }
3580
+
3581
+ .sw-glyph-tile-green { --sw-glyph-tile-fill: var(--sw-categorical-green); }
3582
+ .sw-glyph-tile-blue { --sw-glyph-tile-fill: var(--sw-categorical-blue); }
3583
+ .sw-glyph-tile-orange { --sw-glyph-tile-fill: var(--sw-categorical-orange); }
3584
+ .sw-glyph-tile-purple { --sw-glyph-tile-fill: var(--sw-categorical-purple); }
3585
+ .sw-glyph-tile-teal { --sw-glyph-tile-fill: var(--sw-categorical-teal); }
3586
+ .sw-glyph-tile-rose { --sw-glyph-tile-fill: var(--sw-categorical-rose); }
3587
+ .sw-glyph-tile-neutral { --sw-glyph-tile-fill: var(--sw-categorical-neutral); }
3588
+
3589
+ .sw-glyph-tile-sm { height: var(--sw-space-5); width: var(--sw-space-5); }
3590
+ .sw-glyph-tile-md { height: var(--sw-control-xs-min-height); width: var(--sw-control-xs-min-height); }
3591
+ .sw-glyph-tile-lg { height: var(--sw-space-6); width: var(--sw-space-6); }
3592
+
3593
+ @media (forced-colors: active) {
3594
+ .sw-glyph-tile { border: 1px solid CanvasText; color: CanvasText; }
3595
+ }
3596
+
3129
3597
  .sw-tooltip-anchor {
3130
3598
  display: inline-flex;
3131
3599
  position: relative;
@@ -3357,7 +3825,7 @@ body {
3357
3825
  -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
3358
3826
  position: sticky;
3359
3827
  top: env(safe-area-inset-top, 0px);
3360
- z-index: 4;
3828
+ z-index: 5;
3361
3829
  }
3362
3830
 
3363
3831
  @media (prefers-reduced-transparency: reduce) {
@@ -3472,11 +3940,35 @@ body {
3472
3940
  opacity: var(--sw-disabled-opacity);
3473
3941
  }
3474
3942
 
3943
+ /*
3944
+ * An error: the message under the chips in the danger colour (a polite live
3945
+ * region, out of the layout while empty) and every chip's edge in danger,
3946
+ * the chosen one too (it keeps its accent fill), in normal and forced
3947
+ * colours alike.
3948
+ */
3949
+ .sw-filter-chips-error {
3950
+ color: var(--sw-color-danger);
3951
+ display: block;
3952
+ font-family: var(--sw-font-sans);
3953
+ font-size: 13px;
3954
+ line-height: 18px;
3955
+ padding-top: var(--sw-space-2);
3956
+ }
3957
+
3958
+ .sw-filter-chips-error:empty { position: absolute; }
3959
+
3960
+ .sw-filter-chips[aria-invalid='true'] .sw-filter-chip-face {
3961
+ border-color: var(--sw-color-danger);
3962
+ }
3963
+
3475
3964
  @media (forced-colors: active) {
3476
3965
  .sw-filter-chip-face { background: Canvas; border-color: CanvasText; color: CanvasText; }
3966
+ .sw-filter-chips-error { color: Mark; }
3477
3967
  .sw-filter-chip-input:checked + .sw-filter-chip-face { background: Highlight; border-color: Highlight; color: HighlightText; }
3478
3968
  .sw-filter-chip-input:focus-visible + .sw-filter-chip-face { outline-color: Highlight; }
3479
3969
  .sw-filter-chip-count { color: inherit; }
3970
+ /* After the checked rule, so every chip, the chosen one too, takes the edge. */
3971
+ .sw-filter-chips[aria-invalid='true'] .sw-filter-chip-face { border-color: Mark; }
3480
3972
  }
3481
3973
 
3482
3974
  .sw-grid {
@@ -4617,6 +5109,7 @@ body {
4617
5109
  .sw-badge-neutral,
4618
5110
  .sw-segmented,
4619
5111
  .sw-table-sticky thead th,
5112
+ .sw-table .sw-table-footer-sticky :is(th, td),
4620
5113
  .sw-denomination-strip .sw-denomination-label,
4621
5114
  .sw-denomination-strip thead .sw-denomination-corner:first-child,
4622
5115
  .sw-bar-chart-track,
@@ -4624,6 +5117,7 @@ body {
4624
5117
  .sw-accordion,
4625
5118
  .sw-select-list,
4626
5119
  .sw-action-menu-list,
5120
+ .sw-multi-select-panel,
4627
5121
  .sw-date-field-calendar,
4628
5122
  .sw-toast {
4629
5123
  background: var(--sw-color-surface);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scalewing/react",
3
- "version": "1.28.0",
3
+ "version": "1.30.0",
4
4
  "description": "Scalewing DOM components and package-owned CSS utilities.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -38,7 +38,7 @@
38
38
  "README.md"
39
39
  ],
40
40
  "dependencies": {
41
- "@scalewing/tokens": "^1.4.0"
41
+ "@scalewing/tokens": "^1.5.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "react": "^19.0.0",