@scalewing/react 1.29.0 → 1.31.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 (61) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +13 -3
  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/Combobox.d.ts +14 -0
  8. package/dist/components/Combobox.js +125 -0
  9. package/dist/components/Field.d.ts +17 -0
  10. package/dist/components/Field.js +54 -5
  11. package/dist/components/FilterChips.d.ts +17 -1
  12. package/dist/components/FilterChips.js +11 -6
  13. package/dist/components/ScrollRegion.d.ts +6 -2
  14. package/dist/components/ScrollRegion.js +9 -3
  15. package/dist/components/SectionNav.d.ts +25 -2
  16. package/dist/components/SectionNav.js +13 -4
  17. package/dist/components/Table.d.ts +49 -5
  18. package/dist/components/Table.js +11 -4
  19. package/dist/components/action-menu/ActionMenuList.js +7 -7
  20. package/dist/components/combobox/ComboboxPopup.d.ts +25 -0
  21. package/dist/components/combobox/ComboboxPopup.js +68 -0
  22. package/dist/components/combobox/entries.d.ts +18 -0
  23. package/dist/components/combobox/entries.js +34 -0
  24. package/dist/components/combobox/types.d.ts +63 -0
  25. package/dist/components/combobox/types.js +1 -0
  26. package/dist/components/combobox/validate.d.ts +3 -0
  27. package/dist/components/combobox/validate.js +44 -0
  28. package/dist/components/field/SearchFrame.d.ts +16 -0
  29. package/dist/components/field/SearchFrame.js +32 -0
  30. package/dist/components/table/TableCell.d.ts +8 -0
  31. package/dist/components/table/TableCell.js +4 -2
  32. package/dist/components/table/TableRow.d.ts +39 -0
  33. package/dist/components/table/TableRow.js +8 -0
  34. package/dist/components/use-scroll-overflow.d.ts +8 -3
  35. package/dist/components/use-scroll-overflow.js +15 -4
  36. package/dist/css/css-action-menu.js +41 -0
  37. package/dist/css/css-button-group-attached.d.ts +2 -0
  38. package/dist/css/css-button-group-attached.js +70 -0
  39. package/dist/css/css-button.js +5 -1
  40. package/dist/css/css-combobox.d.ts +2 -0
  41. package/dist/css/css-combobox.js +135 -0
  42. package/dist/css/css-components.js +4 -0
  43. package/dist/css/css-field-search.d.ts +2 -0
  44. package/dist/css/css-field-search.js +118 -0
  45. package/dist/css/css-field.js +4 -0
  46. package/dist/css/css-filter-chips.js +26 -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-table-footer.d.ts +2 -0
  51. package/dist/css/css-table-footer.js +57 -0
  52. package/dist/css/css-table-ledger.d.ts +10 -0
  53. package/dist/css/css-table-ledger.js +122 -0
  54. package/dist/css/css-table.js +8 -0
  55. package/dist/css/stacking.d.ts +9 -3
  56. package/dist/css/stacking.js +28 -8
  57. package/dist/css/stylesheet.js +2 -0
  58. package/dist/index.d.ts +4 -3
  59. package/dist/index.js +4 -3
  60. package/dist/styles.css +483 -7
  61. package/package.json +1 -1
package/dist/styles.css CHANGED
@@ -828,10 +828,10 @@ body {
828
828
  }
829
829
 
830
830
  /* Backdrop blur makes a glass surface its own stacking context, so it lifts while it holds an open popup (see stacking.ts). */
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) {
831
+ .sw-card-glass:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-combobox-popup, .sw-tooltip:not([hidden]), .sw-date-field-calendar),
832
+ .sw-accordion:has(.sw-select-list, .sw-action-menu-list, .sw-multi-select-panel, .sw-combobox-popup, .sw-tooltip:not([hidden]), .sw-date-field-calendar) {
833
833
  position: relative;
834
- z-index: 3;
834
+ z-index: 4;
835
835
  }
836
836
 
837
837
  .sw-card-outlined {
@@ -931,6 +931,53 @@ body {
931
931
  .sw-button-group > * { width: 100%; }
932
932
  }
933
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
+
934
981
  .sw-checkbox {
935
982
  display: flex;
936
983
  flex-direction: column;
@@ -1593,6 +1640,118 @@ body {
1593
1640
  .sw-table-sort-none { opacity: 1; }
1594
1641
  }
1595
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
+
1596
1755
  .sw-table-row-selected > :first-child {
1597
1756
  position: relative;
1598
1757
  }
@@ -2086,7 +2245,7 @@ body {
2086
2245
  .sw-app-header-sticky {
2087
2246
  position: sticky;
2088
2247
  top: 0;
2089
- z-index: 4;
2248
+ z-index: 5;
2090
2249
  }
2091
2250
 
2092
2251
  .sw-nav {
@@ -2210,6 +2369,54 @@ body {
2210
2369
  }
2211
2370
  }
2212
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
+
2213
2420
  @media (pointer: coarse) {
2214
2421
  [data-theme] .sw-section-nav-link { min-height: var(--sw-control-md-min-height); }
2215
2422
  }
@@ -2760,6 +2967,47 @@ body {
2760
2967
  color: var(--sw-color-danger);
2761
2968
  }
2762
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
+
2763
3011
  /* A coarse pointer gets the full touch target: the trigger at least square, and every command as tall. */
2764
3012
  @media (pointer: coarse) {
2765
3013
  .sw-action-menu-trigger {
@@ -2772,6 +3020,110 @@ body {
2772
3020
  }
2773
3021
  }
2774
3022
 
3023
+ .sw-combobox {
3024
+ max-width: 100%;
3025
+ min-width: 0;
3026
+ }
3027
+
3028
+ .sw-combobox-popup {
3029
+ background: var(--sw-glass-fill);
3030
+ border: 1px solid var(--sw-glass-border);
3031
+ border-radius: var(--sw-radius-sm);
3032
+ box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
3033
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
3034
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
3035
+ box-sizing: border-box;
3036
+ color: var(--sw-color-text);
3037
+ inset: auto;
3038
+ margin: 0;
3039
+ max-height: min(var(--sw-select-max), calc(100% - var(--sw-space-2) - var(--sw-space-2)));
3040
+ max-width: calc(100% - var(--sw-space-2) - var(--sw-space-2));
3041
+ overflow: auto;
3042
+ padding: var(--sw-space-1);
3043
+ position: fixed;
3044
+ z-index: 10;
3045
+ }
3046
+
3047
+ .sw-combobox-heading {
3048
+ color: var(--sw-color-muted);
3049
+ font-family: var(--sw-font-sans);
3050
+ font-size: 13px;
3051
+ font-weight: 600;
3052
+ letter-spacing: -0.08px;
3053
+ line-height: 18px;
3054
+ padding: var(--sw-space-2) var(--sw-space-3) var(--sw-space-1);
3055
+ }
3056
+
3057
+ .sw-combobox-option {
3058
+ align-items: center;
3059
+ border-radius: var(--sw-radius-sm);
3060
+ box-sizing: border-box;
3061
+ column-gap: var(--sw-space-2);
3062
+ cursor: pointer;
3063
+ display: flex;
3064
+ flex-wrap: wrap;
3065
+ font-family: var(--sw-font-sans);
3066
+ font-size: 15px;
3067
+ letter-spacing: -0.2px;
3068
+ line-height: 20px;
3069
+ min-height: var(--sw-control-md-min-height);
3070
+ overflow-wrap: anywhere;
3071
+ padding: var(--sw-space-1) var(--sw-space-3);
3072
+ }
3073
+
3074
+ .sw-combobox-option + .sw-combobox-option {
3075
+ border-top: 1px solid var(--sw-color-border);
3076
+ }
3077
+
3078
+ .sw-combobox-label {
3079
+ font-weight: 600;
3080
+ }
3081
+
3082
+ .sw-combobox-description {
3083
+ color: var(--sw-color-muted);
3084
+ font-size: 13px;
3085
+ letter-spacing: -0.08px;
3086
+ line-height: 18px;
3087
+ }
3088
+
3089
+ .sw-combobox-option[aria-selected='true'] {
3090
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
3091
+ }
3092
+
3093
+ .sw-combobox-option[aria-disabled='true'] {
3094
+ cursor: not-allowed;
3095
+ }
3096
+
3097
+ .sw-combobox-option[aria-disabled='true'] .sw-combobox-label {
3098
+ color: var(--sw-color-muted);
3099
+ }
3100
+
3101
+ .sw-combobox-action {
3102
+ border-top: 1px solid var(--sw-color-border);
3103
+ color: var(--sw-color-accent);
3104
+ margin-top: var(--sw-space-1);
3105
+ }
3106
+
3107
+ .sw-combobox-empty,
3108
+ .sw-combobox-note {
3109
+ color: var(--sw-color-muted);
3110
+ font-family: var(--sw-font-sans);
3111
+ font-size: 13px;
3112
+ letter-spacing: -0.08px;
3113
+ line-height: 18px;
3114
+ padding: var(--sw-space-2) var(--sw-space-3);
3115
+ }
3116
+
3117
+ @media (forced-colors: active) {
3118
+ .sw-combobox-popup { border-color: CanvasText; }
3119
+ .sw-combobox-option[aria-selected='true'] { background: Highlight; color: HighlightText; forced-color-adjust: none; }
3120
+ .sw-combobox-option[aria-selected='true'] .sw-combobox-description { color: HighlightText; }
3121
+ .sw-combobox-option[aria-selected='true'] .sw-badge { forced-color-adjust: auto; }
3122
+ .sw-combobox-option[aria-disabled='true'] .sw-combobox-label { color: GrayText; }
3123
+ .sw-combobox-option[aria-selected='true'][aria-disabled='true'] .sw-combobox-label { color: HighlightText; }
3124
+ .sw-combobox-option + .sw-combobox-option { border-color: CanvasText; }
3125
+ .sw-combobox-action { border-color: CanvasText; }
3126
+ }
2775
3127
  .sw-multi-select {
2776
3128
  display: inline-flex;
2777
3129
  max-width: 100%;
@@ -2995,14 +3347,14 @@ body {
2995
3347
  .sw-action-bar-sticky {
2996
3348
  bottom: calc(var(--sw-space-2) + env(safe-area-inset-bottom, 0px));
2997
3349
  position: sticky;
2998
- z-index: 2;
3350
+ z-index: 3;
2999
3351
  }
3000
3352
 
3001
3353
  @media not all and (min-width: 48rem) {
3002
3354
  .sw-action-bar-sticky-below-md {
3003
3355
  bottom: calc(var(--sw-space-2) + env(safe-area-inset-bottom, 0px));
3004
3356
  position: sticky;
3005
- z-index: 2;
3357
+ z-index: 3;
3006
3358
  }
3007
3359
  }
3008
3360
 
@@ -3577,7 +3929,7 @@ body {
3577
3929
  -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
3578
3930
  position: sticky;
3579
3931
  top: env(safe-area-inset-top, 0px);
3580
- z-index: 4;
3932
+ z-index: 5;
3581
3933
  }
3582
3934
 
3583
3935
  @media (prefers-reduced-transparency: reduce) {
@@ -3692,11 +4044,35 @@ body {
3692
4044
  opacity: var(--sw-disabled-opacity);
3693
4045
  }
3694
4046
 
4047
+ /*
4048
+ * An error: the message under the chips in the danger colour (a polite live
4049
+ * region, out of the layout while empty) and every chip's edge in danger,
4050
+ * the chosen one too (it keeps its accent fill), in normal and forced
4051
+ * colours alike.
4052
+ */
4053
+ .sw-filter-chips-error {
4054
+ color: var(--sw-color-danger);
4055
+ display: block;
4056
+ font-family: var(--sw-font-sans);
4057
+ font-size: 13px;
4058
+ line-height: 18px;
4059
+ padding-top: var(--sw-space-2);
4060
+ }
4061
+
4062
+ .sw-filter-chips-error:empty { position: absolute; }
4063
+
4064
+ .sw-filter-chips[aria-invalid='true'] .sw-filter-chip-face {
4065
+ border-color: var(--sw-color-danger);
4066
+ }
4067
+
3695
4068
  @media (forced-colors: active) {
3696
4069
  .sw-filter-chip-face { background: Canvas; border-color: CanvasText; color: CanvasText; }
4070
+ .sw-filter-chips-error { color: Mark; }
3697
4071
  .sw-filter-chip-input:checked + .sw-filter-chip-face { background: Highlight; border-color: Highlight; color: HighlightText; }
3698
4072
  .sw-filter-chip-input:focus-visible + .sw-filter-chip-face { outline-color: Highlight; }
3699
4073
  .sw-filter-chip-count { color: inherit; }
4074
+ /* After the checked rule, so every chip, the chosen one too, takes the edge. */
4075
+ .sw-filter-chips[aria-invalid='true'] .sw-filter-chip-face { border-color: Mark; }
3700
4076
  }
3701
4077
 
3702
4078
  .sw-grid {
@@ -4244,6 +4620,104 @@ body {
4244
4620
 
4245
4621
  [data-theme] .sw-field-adorned > input:disabled { background: transparent; }
4246
4622
 
4623
+ .sw-field-adorned.sw-field-search {
4624
+ gap: var(--sw-space-2);
4625
+ padding-inline-end: 0;
4626
+ }
4627
+
4628
+ .sw-field-search-leading {
4629
+ color: var(--sw-color-muted);
4630
+ display: inline-flex;
4631
+ flex: none;
4632
+ }
4633
+
4634
+ [data-theme] .sw-field-search > input[type='search'] {
4635
+ appearance: none;
4636
+ -webkit-appearance: none;
4637
+ }
4638
+
4639
+ .sw-field-search > input[type='search']::-webkit-search-cancel-button,
4640
+ .sw-field-search > input[type='search']::-webkit-search-decoration {
4641
+ -webkit-appearance: none;
4642
+ appearance: none;
4643
+ display: none;
4644
+ }
4645
+
4646
+ .sw-field-search > input:last-child {
4647
+ margin-inline-end: var(--sw-control-md-padding-inline);
4648
+ }
4649
+
4650
+ .sw-field-search-clear {
4651
+ align-items: center;
4652
+ align-self: stretch;
4653
+ appearance: none;
4654
+ background: transparent;
4655
+ border: 0;
4656
+ border-radius: var(--sw-radius-sm);
4657
+ color: inherit;
4658
+ cursor: pointer;
4659
+ display: inline-flex;
4660
+ flex: none;
4661
+ justify-content: center;
4662
+ margin: 0;
4663
+ min-width: var(--sw-control-xs-min-height);
4664
+ padding: 0 var(--sw-space-2);
4665
+ }
4666
+
4667
+ .sw-field-search-clear:focus-visible {
4668
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
4669
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
4670
+ }
4671
+
4672
+ /* One ring at a time: the clear button's own while it has focus. */
4673
+ .sw-field-search:has(.sw-field-search-clear:focus-visible) {
4674
+ outline: none;
4675
+ }
4676
+
4677
+ .sw-field-search-clear:hover .sw-field-search-cross {
4678
+ background: var(--sw-color-text);
4679
+ }
4680
+
4681
+ .sw-field-xs .sw-field-search > input:last-child {
4682
+ margin-inline-end: var(--sw-control-xs-padding-inline);
4683
+ }
4684
+
4685
+ .sw-field-search-cross {
4686
+ background: var(--sw-color-muted);
4687
+ border-radius: var(--sw-radius-pill);
4688
+ display: inline-block;
4689
+ height: var(--sw-space-4);
4690
+ position: relative;
4691
+ width: var(--sw-space-4);
4692
+ }
4693
+
4694
+ .sw-field-search-cross::before,
4695
+ .sw-field-search-cross::after {
4696
+ background: var(--sw-color-surface);
4697
+ border-radius: 1px;
4698
+ content: '';
4699
+ height: 2px;
4700
+ inset: 0;
4701
+ margin: auto;
4702
+ position: absolute;
4703
+ width: calc(var(--sw-space-2) + 2px);
4704
+ }
4705
+
4706
+ .sw-field-search-cross::before { transform: rotate(45deg); }
4707
+ .sw-field-search-cross::after { transform: rotate(-45deg); }
4708
+
4709
+ @media (pointer: coarse) {
4710
+ .sw-field-search-clear { min-width: var(--sw-control-md-min-height); }
4711
+ }
4712
+
4713
+ @media (forced-colors: active) {
4714
+ .sw-field-search-leading { color: FieldText; }
4715
+ /* Backgrounds are forced in this mode; the disc keeps its own system colours. */
4716
+ .sw-field-search-cross { background: ButtonText; forced-color-adjust: none; }
4717
+ .sw-field-search-cross::before,
4718
+ .sw-field-search-cross::after { background: ButtonFace; }
4719
+ }
4720
+
4247
4721
  [data-theme] .sw-field-changed > :is(input, select, textarea),
4248
4722
  .sw-field-changed .sw-field-adorned {
4249
4723
  border-color: var(--sw-color-accent);
@@ -4837,6 +5311,7 @@ body {
4837
5311
  .sw-badge-neutral,
4838
5312
  .sw-segmented,
4839
5313
  .sw-table-sticky thead th,
5314
+ .sw-table .sw-table-footer-sticky :is(th, td),
4840
5315
  .sw-denomination-strip .sw-denomination-label,
4841
5316
  .sw-denomination-strip thead .sw-denomination-corner:first-child,
4842
5317
  .sw-bar-chart-track,
@@ -4845,6 +5320,7 @@ body {
4845
5320
  .sw-select-list,
4846
5321
  .sw-action-menu-list,
4847
5322
  .sw-multi-select-panel,
5323
+ .sw-combobox-popup,
4848
5324
  .sw-date-field-calendar,
4849
5325
  .sw-toast {
4850
5326
  background: var(--sw-color-surface);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scalewing/react",
3
- "version": "1.29.0",
3
+ "version": "1.31.0",
4
4
  "description": "Scalewing DOM components and package-owned CSS utilities.",
5
5
  "type": "module",
6
6
  "license": "MIT",