@scalewing/react 1.27.0 → 1.29.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 (67) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +99 -3
  3. package/dist/components/Checkbox.js +5 -4
  4. package/dist/components/DenominationGrid.d.ts +4 -1
  5. package/dist/components/DenominationGrid.js +8 -3
  6. package/dist/components/Dialog.d.ts +28 -4
  7. package/dist/components/Dialog.js +20 -2
  8. package/dist/components/GlyphTile.d.ts +21 -0
  9. package/dist/components/GlyphTile.js +17 -0
  10. package/dist/components/MultiSelect.d.ts +10 -0
  11. package/dist/components/MultiSelect.js +62 -0
  12. package/dist/components/Notice.d.ts +69 -0
  13. package/dist/components/Notice.js +48 -0
  14. package/dist/components/Progress.d.ts +3 -1
  15. package/dist/components/Progress.js +4 -0
  16. package/dist/components/SegmentedControl.d.ts +8 -0
  17. package/dist/components/SegmentedControl.js +4 -3
  18. package/dist/components/Toast.d.ts +20 -4
  19. package/dist/components/Toast.js +44 -21
  20. package/dist/components/checkbox/CheckboxControl.d.ts +9 -0
  21. package/dist/components/checkbox/CheckboxControl.js +9 -0
  22. package/dist/components/denomination-grid/DenominationStrip.d.ts +5 -2
  23. package/dist/components/denomination-grid/DenominationStrip.js +2 -2
  24. package/dist/components/denomination-grid/DenominationTiles.d.ts +5 -2
  25. package/dist/components/denomination-grid/DenominationTiles.js +2 -2
  26. package/dist/components/denomination-grid/types.d.ts +9 -0
  27. package/dist/components/dialog/DialogFooter.d.ts +14 -0
  28. package/dist/components/dialog/DialogFooter.js +11 -0
  29. package/dist/components/dialog/DialogTitle.d.ts +11 -4
  30. package/dist/components/dialog/DialogTitle.js +8 -6
  31. package/dist/components/multi-select/MultiSelectPanel.d.ts +25 -0
  32. package/dist/components/multi-select/MultiSelectPanel.js +41 -0
  33. package/dist/components/multi-select/types.d.ts +35 -0
  34. package/dist/components/multi-select/types.js +1 -0
  35. package/dist/components/multi-select/validate.d.ts +3 -0
  36. package/dist/components/multi-select/validate.js +25 -0
  37. package/dist/components/toast/ToastContent.d.ts +22 -0
  38. package/dist/components/toast/ToastContent.js +21 -0
  39. package/dist/components/toast/use-toast-hold.d.ts +28 -0
  40. package/dist/components/toast/use-toast-hold.js +53 -0
  41. package/dist/components/toast/use-toast-timer.d.ts +15 -0
  42. package/dist/components/toast/use-toast-timer.js +34 -0
  43. package/dist/css/css-components.js +16 -0
  44. package/dist/css/css-denomination-grid.js +4 -0
  45. package/dist/css/css-denomination-label.d.ts +10 -0
  46. package/dist/css/css-denomination-label.js +36 -0
  47. package/dist/css/css-dialog-frame.d.ts +2 -0
  48. package/dist/css/css-dialog-frame.js +83 -0
  49. package/dist/css/css-dialog.js +20 -4
  50. package/dist/css/css-glyph-tile.d.ts +5 -0
  51. package/dist/css/css-glyph-tile.js +57 -0
  52. package/dist/css/css-multi-select.d.ts +2 -0
  53. package/dist/css/css-multi-select.js +156 -0
  54. package/dist/css/css-notice.d.ts +22 -0
  55. package/dist/css/css-notice.js +168 -0
  56. package/dist/css/css-progress.d.ts +3 -0
  57. package/dist/css/css-progress.js +13 -6
  58. package/dist/css/css-segmented.js +58 -0
  59. package/dist/css/css-toast-card.d.ts +5 -0
  60. package/dist/css/css-toast-card.js +122 -0
  61. package/dist/css/css-variables.js +12 -1
  62. package/dist/css/stacking.js +5 -2
  63. package/dist/css/stylesheet.js +10 -0
  64. package/dist/index.d.ts +8 -5
  65. package/dist/index.js +7 -4
  66. package/dist/styles.css +522 -3
  67. 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;
@@ -48,6 +56,7 @@
48
56
  --sw-container-max: 72rem;
49
57
  --sw-dialog-max: 32rem;
50
58
  --sw-dialog-max-lg: 56rem;
59
+ --sw-dialog-max-xl: 65rem;
51
60
  --sw-select-max: 16rem;
52
61
  --sw-split-min: 14rem;
53
62
  --sw-split-size: 22rem;
@@ -83,6 +92,14 @@
83
92
  --sw-color-warning: #FDB022;
84
93
  --sw-color-border: #3A3A3C;
85
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;
86
103
  --sw-space-0: 0px;
87
104
  --sw-space-1: 4px;
88
105
  --sw-space-2: 8px;
@@ -112,6 +129,7 @@
112
129
  --sw-container-max: 72rem;
113
130
  --sw-dialog-max: 32rem;
114
131
  --sw-dialog-max-lg: 56rem;
132
+ --sw-dialog-max-xl: 65rem;
115
133
  --sw-select-max: 16rem;
116
134
  --sw-split-min: 14rem;
117
135
  --sw-split-size: 22rem;
@@ -810,8 +828,8 @@ body {
810
828
  }
811
829
 
812
830
  /* Backdrop blur makes a glass surface its own stacking context, so it lifts while it holds an open popup (see stacking.ts). */
813
- .sw-card-glass:has(.sw-select-list, .sw-action-menu-list, .sw-tooltip:not([hidden]), .sw-date-field-calendar),
814
- .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) {
815
833
  position: relative;
816
834
  z-index: 3;
817
835
  }
@@ -1346,6 +1364,45 @@ body {
1346
1364
  color: var(--sw-color-onAccent);
1347
1365
  }
1348
1366
 
1367
+ .sw-segmented.sw-segmented-with-icons:not(.sw-segmented-filled) {
1368
+ background: var(--sw-color-subtle);
1369
+ border-color: transparent;
1370
+ }
1371
+
1372
+ .sw-segmented-with-icons:not(.sw-segmented-filled) .sw-segmented-item-selected {
1373
+ box-shadow: var(--sw-elevation-sm);
1374
+ }
1375
+
1376
+ .sw-segmented-with-icons .sw-segmented-item {
1377
+ align-items: center;
1378
+ display: inline-flex;
1379
+ gap: var(--sw-space-2);
1380
+ justify-content: center;
1381
+ }
1382
+
1383
+ .sw-segmented-with-icons:not(.sw-segmented-filled) .sw-segmented-item {
1384
+ font-size: 15px;
1385
+ letter-spacing: -0.2px;
1386
+ line-height: 20px;
1387
+ min-height: var(--sw-control-md-min-height);
1388
+ padding-inline: var(--sw-space-2) var(--sw-space-3);
1389
+ }
1390
+
1391
+ .sw-segmented-item-icon {
1392
+ display: inline-flex;
1393
+ flex: none;
1394
+ }
1395
+
1396
+ .sw-segmented.sw-segmented-with-icons[aria-invalid='true'] {
1397
+ border-color: var(--sw-color-danger);
1398
+ }
1399
+
1400
+ @media (forced-colors: active) {
1401
+ .sw-segmented.sw-segmented-with-icons:not(.sw-segmented-filled) { border-color: CanvasText; }
1402
+ .sw-segmented-with-icons:not(.sw-segmented-filled) .sw-segmented-item-selected { outline: 2px solid Highlight; }
1403
+ .sw-segmented.sw-segmented-with-icons[aria-invalid='true'] { border-color: Mark; }
1404
+ }
1405
+
1349
1406
  .sw-segmented-disabled {
1350
1407
  opacity: var(--sw-disabled-opacity);
1351
1408
  }
@@ -2182,6 +2239,10 @@ body {
2182
2239
  max-width: min(var(--sw-dialog-max-lg), calc(100vw - var(--sw-space-8)));
2183
2240
  }
2184
2241
 
2242
+ .sw-dialog-xl {
2243
+ max-width: min(var(--sw-dialog-max-xl), calc(100vw - var(--sw-space-8)));
2244
+ }
2245
+
2185
2246
  @media not all and (min-width: 48rem) {
2186
2247
  .sw-dialog-sheet-below-md {
2187
2248
  border-radius: var(--sw-radius-lg) var(--sw-radius-lg) 0 0;
@@ -2198,6 +2259,12 @@ body {
2198
2259
  .sw-dialog-sheet-below-md[open] {
2199
2260
  animation: sw-dialog-sheet-in var(--sw-motion-default) var(--sw-motion-easing);
2200
2261
  }
2262
+
2263
+ .sw-dialog-sheet-below-md .sw-dialog-footer {
2264
+ bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
2265
+ margin-bottom: calc(-1 * (var(--sw-space-5) + env(safe-area-inset-bottom, 0px)));
2266
+ padding-bottom: calc(var(--sw-space-3) + env(safe-area-inset-bottom, 0px));
2267
+ }
2201
2268
  }
2202
2269
 
2203
2270
  @keyframes sw-dialog-sheet-in {
@@ -2223,7 +2290,8 @@ body {
2223
2290
  gap: var(--sw-space-2);
2224
2291
  }
2225
2292
 
2226
- .sw-dialog-header > :first-child {
2293
+ .sw-dialog-header > :is(h2, h3),
2294
+ .sw-dialog-titles {
2227
2295
  flex: 1 1 auto;
2228
2296
  min-width: 0;
2229
2297
  }
@@ -2270,6 +2338,64 @@ body {
2270
2338
  .sw-dialog-close-glyph::before { transform: rotate(45deg); }
2271
2339
  .sw-dialog-close-glyph::after { transform: rotate(-45deg); }
2272
2340
 
2341
+ .sw-dialog-header-framed {
2342
+ align-items: center;
2343
+ gap: var(--sw-space-3);
2344
+ }
2345
+
2346
+ .sw-dialog-icon {
2347
+ display: inline-flex;
2348
+ flex: none;
2349
+ }
2350
+
2351
+ .sw-dialog-description { margin: 0; }
2352
+
2353
+ .sw-dialog-footer {
2354
+ align-items: center;
2355
+ background: var(--sw-color-surface);
2356
+ border-top: 1px solid var(--sw-color-border);
2357
+ /* Sticky insets count from the scrollport's padding edge: step past the
2358
+ dialog's own padding to sit on its bottom edge. */
2359
+ bottom: calc(-1 * var(--sw-space-5));
2360
+ box-sizing: border-box;
2361
+ display: flex;
2362
+ flex-wrap: wrap;
2363
+ gap: var(--sw-space-2) var(--sw-space-4);
2364
+ margin: 0 calc(-1 * var(--sw-space-5)) calc(-1 * var(--sw-space-5));
2365
+ padding: var(--sw-space-3) var(--sw-space-5);
2366
+ position: sticky;
2367
+ }
2368
+
2369
+ .sw-dialog-footer-status {
2370
+ align-items: center;
2371
+ display: flex;
2372
+ flex: 1 1 auto;
2373
+ min-width: 0;
2374
+ }
2375
+
2376
+ /* With no summary the live region stays in the dialog, so a first figure
2377
+ is still announced, but it takes no room in the footer. */
2378
+ .sw-dialog-footer-status:empty {
2379
+ clip-path: inset(50%);
2380
+ height: 1px;
2381
+ overflow: hidden;
2382
+ position: absolute;
2383
+ width: 1px;
2384
+ }
2385
+
2386
+ .sw-dialog-footer-actions {
2387
+ display: flex;
2388
+ flex: 0 1 auto;
2389
+ flex-wrap: wrap;
2390
+ gap: var(--sw-space-2);
2391
+ justify-content: flex-end;
2392
+ margin-inline-start: auto;
2393
+ }
2394
+
2395
+ @media (forced-colors: active) {
2396
+ .sw-dialog-footer { border-top-color: CanvasText; }
2397
+ }
2398
+
2273
2399
  .sw-accordion {
2274
2400
  background: var(--sw-glass-fill);
2275
2401
  border: 1px solid var(--sw-glass-border);
@@ -2646,6 +2772,138 @@ body {
2646
2772
  }
2647
2773
  }
2648
2774
 
2775
+ .sw-multi-select {
2776
+ display: inline-flex;
2777
+ max-width: 100%;
2778
+ }
2779
+
2780
+ .sw-multi-select-trigger {
2781
+ align-items: center;
2782
+ appearance: none;
2783
+ background-color: var(--sw-glass-fill);
2784
+ border: 1px solid var(--sw-color-border);
2785
+ border-radius: var(--sw-radius-sm);
2786
+ box-sizing: border-box;
2787
+ color: var(--sw-color-text);
2788
+ column-gap: var(--sw-space-2);
2789
+ cursor: pointer;
2790
+ display: inline-flex;
2791
+ font-family: var(--sw-font-sans);
2792
+ font-size: 15px;
2793
+ font-weight: 600;
2794
+ letter-spacing: -0.2px;
2795
+ line-height: 20px;
2796
+ margin: 0;
2797
+ max-width: 100%;
2798
+ min-height: var(--sw-control-md-min-height);
2799
+ padding-inline: var(--sw-control-md-padding-inline);
2800
+ }
2801
+
2802
+ .sw-multi-select-trigger::after {
2803
+ border-bottom: 2px solid var(--sw-color-muted);
2804
+ border-right: 2px solid var(--sw-color-muted);
2805
+ box-sizing: border-box;
2806
+ height: var(--sw-space-2);
2807
+ width: var(--sw-space-2);
2808
+ content: '';
2809
+ flex: none;
2810
+ margin-inline-start: var(--sw-space-2);
2811
+ transform: translateY(-25%) rotate(45deg);
2812
+ }
2813
+
2814
+ .sw-multi-select-trigger:focus-visible {
2815
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
2816
+ outline-offset: var(--sw-focus-ring-offset);
2817
+ }
2818
+
2819
+ .sw-multi-select-trigger:disabled {
2820
+ cursor: not-allowed;
2821
+ opacity: var(--sw-disabled-opacity);
2822
+ }
2823
+
2824
+ .sw-multi-select-label {
2825
+ color: var(--sw-color-muted);
2826
+ font-weight: 500;
2827
+ }
2828
+
2829
+ .sw-multi-select-summary {
2830
+ min-width: 0;
2831
+ overflow: hidden;
2832
+ text-overflow: ellipsis;
2833
+ white-space: nowrap;
2834
+ }
2835
+
2836
+ .sw-multi-select-panel {
2837
+ background: var(--sw-glass-fill);
2838
+ border: 1px solid var(--sw-glass-border);
2839
+ border-radius: var(--sw-radius-sm);
2840
+ box-shadow: var(--sw-elevation-sm), inset 0 1px 0 var(--sw-glass-specular);
2841
+ backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
2842
+ -webkit-backdrop-filter: blur(var(--sw-glass-blur)) saturate(var(--sw-glass-saturate));
2843
+ box-sizing: border-box;
2844
+ color: var(--sw-color-text);
2845
+ display: flex;
2846
+ flex-direction: column;
2847
+ inset: auto;
2848
+ margin: 0;
2849
+ /* The viewport, not --sw-select-max: the list is short and should show
2850
+ whole rather than scroll inside a 22rem cap. */
2851
+ max-height: calc(100% - var(--sw-space-2) - var(--sw-space-2));
2852
+ max-width: calc(100% - var(--sw-space-2) - var(--sw-space-2));
2853
+ min-width: var(--sw-select-max);
2854
+ overflow: auto;
2855
+ padding: var(--sw-space-1);
2856
+ position: fixed;
2857
+ width: max-content;
2858
+ z-index: 10;
2859
+ }
2860
+
2861
+ .sw-multi-select-commands {
2862
+ border-bottom: 1px solid var(--sw-color-border);
2863
+ display: flex;
2864
+ justify-content: space-between;
2865
+ margin-bottom: var(--sw-space-1);
2866
+ padding-bottom: var(--sw-space-1);
2867
+ }
2868
+
2869
+ .sw-multi-select-row-separated {
2870
+ border-top: 1px solid var(--sw-color-border);
2871
+ margin-top: var(--sw-space-1);
2872
+ padding-top: var(--sw-space-1);
2873
+ }
2874
+
2875
+ .sw-checkbox-label.sw-multi-select-option {
2876
+ border-radius: var(--sw-radius-sm);
2877
+ box-sizing: border-box;
2878
+ font-family: var(--sw-font-sans);
2879
+ font-size: 15px;
2880
+ font-weight: 400;
2881
+ letter-spacing: -0.2px;
2882
+ line-height: 20px;
2883
+ padding-inline: var(--sw-space-2);
2884
+ width: 100%;
2885
+ }
2886
+
2887
+ .sw-multi-select-option:hover {
2888
+ background: color-mix(in srgb, var(--sw-color-muted) 16%, transparent);
2889
+ }
2890
+
2891
+ .sw-multi-select-icon {
2892
+ display: inline-flex;
2893
+ flex: none;
2894
+ }
2895
+
2896
+ .sw-multi-select-text {
2897
+ min-width: 0;
2898
+ }
2899
+
2900
+ @media (forced-colors: active) {
2901
+ .sw-multi-select-trigger::after { border-color: CanvasText; }
2902
+ .sw-multi-select-panel { border-color: CanvasText; }
2903
+ .sw-multi-select-commands,
2904
+ .sw-multi-select-row-separated { border-color: CanvasText; }
2905
+ }
2906
+
2649
2907
  .sw-action-bar {
2650
2908
  align-items: center;
2651
2909
  background: var(--sw-glass-fill);
@@ -2893,6 +3151,7 @@ body {
2893
3151
 
2894
3152
  .sw-progress-accent { --sw-progress-color: var(--sw-color-accent); }
2895
3153
  .sw-progress-success { --sw-progress-color: var(--sw-color-success); }
3154
+ .sw-progress-warning { --sw-progress-color: var(--sw-color-warning); }
2896
3155
  .sw-progress-danger { --sw-progress-color: var(--sw-color-danger); }
2897
3156
 
2898
3157
  .sw-progress-heading {
@@ -2943,6 +3202,150 @@ body {
2943
3202
  .sw-progress-bar::-moz-progress-bar { background: Highlight; }
2944
3203
  }
2945
3204
 
3205
+ .sw-notice-info { --sw-notice-fill: var(--sw-color-accentSubtle); --sw-notice-ink: color-mix(in srgb, var(--sw-color-accent) 70%, var(--sw-color-text)); }
3206
+ .sw-notice-success { --sw-notice-fill: color-mix(in srgb, var(--sw-color-success) 10%, var(--sw-color-surface)); --sw-notice-ink: color-mix(in srgb, var(--sw-color-success) 70%, var(--sw-color-text)); }
3207
+ .sw-notice-warning { --sw-notice-fill: color-mix(in srgb, var(--sw-color-warning) 10%, var(--sw-color-surface)); --sw-notice-ink: color-mix(in srgb, var(--sw-color-warning) 70%, var(--sw-color-text)); }
3208
+ .sw-notice-danger { --sw-notice-fill: color-mix(in srgb, var(--sw-color-danger) 10%, var(--sw-color-surface)); --sw-notice-ink: color-mix(in srgb, var(--sw-color-danger) 70%, var(--sw-color-text)); }
3209
+
3210
+ .sw-notice {
3211
+ align-items: flex-start;
3212
+ background: var(--sw-notice-fill);
3213
+ border-radius: var(--sw-radius-sm);
3214
+ box-sizing: border-box;
3215
+ color: var(--sw-notice-ink);
3216
+ column-gap: var(--sw-space-2);
3217
+ display: flex;
3218
+ flex-wrap: wrap;
3219
+ font-family: var(--sw-font-sans);
3220
+ font-size: 15px;
3221
+ letter-spacing: -0.2px;
3222
+ line-height: 20px;
3223
+ min-width: 0;
3224
+ padding: var(--sw-space-2) var(--sw-space-3);
3225
+ row-gap: var(--sw-space-2);
3226
+ /* Muted words of a control inside (a field's or a checkbox's
3227
+ description) take the ink, which keeps 4.5:1 on the fill. */
3228
+ --sw-color-muted: var(--sw-notice-ink);
3229
+ }
3230
+
3231
+ .sw-notice-icon {
3232
+ display: inline-flex;
3233
+ flex: none;
3234
+ min-height: 20px;
3235
+ align-items: center;
3236
+ }
3237
+
3238
+ .sw-notice-content {
3239
+ align-items: baseline;
3240
+ column-gap: var(--sw-space-2);
3241
+ display: flex;
3242
+ flex: 1 1 16rem;
3243
+ flex-wrap: wrap;
3244
+ min-width: 0;
3245
+ row-gap: var(--sw-space-1);
3246
+ }
3247
+
3248
+ .sw-notice-stacked {
3249
+ align-items: stretch;
3250
+ flex-direction: column;
3251
+ row-gap: var(--sw-space-2);
3252
+ }
3253
+
3254
+ .sw-notice-title {
3255
+ font-weight: 600;
3256
+ min-width: 0;
3257
+ }
3258
+
3259
+ .sw-notice-body {
3260
+ flex: 1 1 auto;
3261
+ font-weight: 400;
3262
+ min-width: 0;
3263
+ }
3264
+
3265
+ .sw-notice-action {
3266
+ align-items: center;
3267
+ align-self: flex-start;
3268
+ display: inline-flex;
3269
+ flex: none;
3270
+ min-height: 20px;
3271
+ }
3272
+
3273
+ /* A small Button keeps the note one text line tall: it overhangs the
3274
+ padding evenly instead of growing the row. */
3275
+ .sw-notice-action > .sw-button {
3276
+ margin-block: calc((20px - var(--sw-control-sm-min-height)) / 2);
3277
+ }
3278
+
3279
+ /* A band across the page's full width, such as an environment strip
3280
+ above the app header: square, the xs control height, caption type,
3281
+ its words centered on one line that wraps on a phone. A glyph or an
3282
+ action stays on the words' row (no wrap): the words wrap instead. */
3283
+ .sw-notice-band {
3284
+ align-items: center;
3285
+ border-radius: 0;
3286
+ flex-wrap: nowrap;
3287
+ font-size: 13px;
3288
+ justify-content: center;
3289
+ letter-spacing: -0.08px;
3290
+ line-height: 18px;
3291
+ min-height: var(--sw-control-xs-min-height);
3292
+ padding: var(--sw-space-1) var(--sw-space-4);
3293
+ text-align: center;
3294
+ width: 100%;
3295
+ }
3296
+
3297
+ .sw-notice-band .sw-notice-content {
3298
+ flex: 0 1 auto;
3299
+ justify-content: center;
3300
+ }
3301
+
3302
+ .sw-notice-band .sw-notice-icon,
3303
+ .sw-notice-band .sw-notice-action { min-height: 18px; }
3304
+
3305
+ .sw-notice-band .sw-notice-action { align-self: center; }
3306
+
3307
+ .sw-notice-band .sw-notice-action > .sw-button {
3308
+ margin-block: calc((18px - var(--sw-control-sm-min-height)) / 2);
3309
+ }
3310
+
3311
+ @media (forced-colors: active) {
3312
+ .sw-notice { border: 1px solid CanvasText; }
3313
+ .sw-notice-band { border-width: 0 0 1px; }
3314
+ }
3315
+
3316
+ .sw-glyph-tile {
3317
+ align-items: center;
3318
+ background: var(--sw-glyph-tile-fill);
3319
+ border-radius: var(--sw-radius-sm);
3320
+ box-sizing: border-box;
3321
+ color: var(--sw-categorical-on);
3322
+ display: inline-flex;
3323
+ flex: none;
3324
+ justify-content: center;
3325
+ }
3326
+
3327
+ .sw-glyph-tile > svg {
3328
+ flex: none;
3329
+ height: var(--sw-space-4);
3330
+ width: var(--sw-space-4);
3331
+ }
3332
+
3333
+ .sw-glyph-tile-green { --sw-glyph-tile-fill: var(--sw-categorical-green); }
3334
+ .sw-glyph-tile-blue { --sw-glyph-tile-fill: var(--sw-categorical-blue); }
3335
+ .sw-glyph-tile-orange { --sw-glyph-tile-fill: var(--sw-categorical-orange); }
3336
+ .sw-glyph-tile-purple { --sw-glyph-tile-fill: var(--sw-categorical-purple); }
3337
+ .sw-glyph-tile-teal { --sw-glyph-tile-fill: var(--sw-categorical-teal); }
3338
+ .sw-glyph-tile-rose { --sw-glyph-tile-fill: var(--sw-categorical-rose); }
3339
+ .sw-glyph-tile-neutral { --sw-glyph-tile-fill: var(--sw-categorical-neutral); }
3340
+
3341
+ .sw-glyph-tile-sm { height: var(--sw-space-5); width: var(--sw-space-5); }
3342
+ .sw-glyph-tile-md { height: var(--sw-control-xs-min-height); width: var(--sw-control-xs-min-height); }
3343
+ .sw-glyph-tile-lg { height: var(--sw-space-6); width: var(--sw-space-6); }
3344
+
3345
+ @media (forced-colors: active) {
3346
+ .sw-glyph-tile { border: 1px solid CanvasText; color: CanvasText; }
3347
+ }
3348
+
2946
3349
  .sw-tooltip-anchor {
2947
3350
  display: inline-flex;
2948
3351
  position: relative;
@@ -3727,6 +4130,28 @@ body {
3727
4130
  .sw-denomination-strip-aligned .sw-denomination-total-head { width: 0; }
3728
4131
  }
3729
4132
 
4133
+ .sw-denomination-labels-plain .sw-denomination-label {
4134
+ border-inline-start: 0;
4135
+ color: var(--sw-color-text);
4136
+ }
4137
+
4138
+ /* The total under a phone's label keeps its row's tone. */
4139
+ .sw-denomination-labels-plain .sw-denomination-total-inline { color: var(--sw-denomination-tone); }
4140
+
4141
+ .sw-denomination-strip.sw-denomination-labels-plain .sw-denomination-label {
4142
+ padding-inline-start: var(--sw-space-2);
4143
+ }
4144
+
4145
+ .sw-denomination-strip.sw-denomination-labels-plain .sw-denomination-label::before { content: none; }
4146
+
4147
+ @media not all and (min-width: 48rem) {
4148
+ .sw-denomination-strip.sw-denomination-labels-plain .sw-denomination-label { padding-inline-start: var(--sw-space-1); }
4149
+ }
4150
+
4151
+ @media (forced-colors: active) {
4152
+ .sw-denomination-labels-plain .sw-denomination-label { color: CanvasText; }
4153
+ }
4154
+
3730
4155
  @media (forced-colors: active) {
3731
4156
  .sw-denomination-label { border-inline-start-color: CanvasText; color: CanvasText; }
3732
4157
  .sw-denomination-strip .sw-denomination-label::before { background: CanvasText; forced-color-adjust: none; }
@@ -4292,6 +4717,99 @@ body {
4292
4717
  }
4293
4718
  }
4294
4719
 
4720
+ .sw-toast-title {
4721
+ display: block;
4722
+ font-size: 15px;
4723
+ font-weight: 600;
4724
+ letter-spacing: -0.2px;
4725
+ line-height: 20px;
4726
+ }
4727
+
4728
+ .sw-toast-detail {
4729
+ color: var(--sw-color-muted);
4730
+ font-size: 15px;
4731
+ font-weight: 400;
4732
+ letter-spacing: -0.2px;
4733
+ line-height: 20px;
4734
+ }
4735
+
4736
+ .sw-toast-row:has(.sw-toast-title) { align-items: flex-start; }
4737
+
4738
+ .sw-toast-row .sw-toast-body { flex: 1 1 auto; }
4739
+
4740
+ .sw-button.sw-toast-action {
4741
+ flex: none;
4742
+ margin-block: calc((20px - var(--sw-control-sm-min-height)) / 2);
4743
+ }
4744
+
4745
+ .sw-toast-interactive { pointer-events: auto; }
4746
+
4747
+ .sw-toast-top-end {
4748
+ bottom: auto;
4749
+ left: auto;
4750
+ max-width: min(var(--sw-dialog-max), calc(100% - var(--sw-space-4) - var(--sw-space-4)));
4751
+ right: max(var(--sw-space-4), env(safe-area-inset-right, 0px));
4752
+ top: max(var(--sw-space-4), env(safe-area-inset-top, 0px));
4753
+ translate: none;
4754
+ }
4755
+
4756
+ .sw-toast-top-end:dir(rtl) {
4757
+ left: max(var(--sw-space-4), env(safe-area-inset-left, 0px));
4758
+ right: auto;
4759
+ }
4760
+
4761
+ .sw-toast-top-end:popover-open {
4762
+ animation: sw-toast-drop var(--sw-motion-default) var(--sw-motion-easing);
4763
+ }
4764
+
4765
+ @keyframes sw-toast-drop {
4766
+ from {
4767
+ opacity: 0;
4768
+ translate: 0 calc(-1 * var(--sw-space-3));
4769
+ }
4770
+ to {
4771
+ opacity: 1;
4772
+ translate: none;
4773
+ }
4774
+ }
4775
+
4776
+ .sw-toast-remaining {
4777
+ background: var(--sw-color-border);
4778
+ border-radius: var(--sw-radius-pill);
4779
+ display: block;
4780
+ height: var(--sw-space-1);
4781
+ margin-top: var(--sw-space-2);
4782
+ overflow: hidden;
4783
+ position: relative;
4784
+ }
4785
+
4786
+ .sw-toast-remaining::after {
4787
+ animation: sw-toast-remaining var(--sw-toast-duration, 0ms) linear forwards;
4788
+ background: var(--sw-toast-tone, var(--sw-color-accent));
4789
+ content: '';
4790
+ inset: 0;
4791
+ position: absolute;
4792
+ transform-origin: left center;
4793
+ }
4794
+
4795
+ .sw-toast-remaining:dir(rtl)::after { transform-origin: right center; }
4796
+
4797
+ .sw-toast-paused .sw-toast-remaining::after { animation-play-state: paused; }
4798
+
4799
+ @keyframes sw-toast-remaining {
4800
+ from { transform: scaleX(1); }
4801
+ to { transform: scaleX(0); }
4802
+ }
4803
+
4804
+ @media (prefers-reduced-motion: reduce) {
4805
+ .sw-toast-top-end:popover-open { animation: none; }
4806
+ }
4807
+
4808
+ @media (forced-colors: active) {
4809
+ .sw-toast-remaining { background: Canvas; border: 1px solid CanvasText; }
4810
+ .sw-toast-remaining::after { background: CanvasText; }
4811
+ }
4812
+
4295
4813
  @media (min-width: 48rem) {
4296
4814
  .sw-hide-from-md { display: none; }
4297
4815
  }
@@ -4326,6 +4844,7 @@ body {
4326
4844
  .sw-accordion,
4327
4845
  .sw-select-list,
4328
4846
  .sw-action-menu-list,
4847
+ .sw-multi-select-panel,
4329
4848
  .sw-date-field-calendar,
4330
4849
  .sw-toast {
4331
4850
  background: var(--sw-color-surface);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scalewing/react",
3
- "version": "1.27.0",
3
+ "version": "1.29.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",