@scalewing/react 1.52.0 → 1.54.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 (43) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +14 -1
  3. package/dist/components/Box.d.ts +26 -0
  4. package/dist/components/Box.js +6 -2
  5. package/dist/components/Checkbox.d.ts +18 -1
  6. package/dist/components/Checkbox.js +15 -5
  7. package/dist/components/Dialog.d.ts +14 -1
  8. package/dist/components/Dialog.js +5 -2
  9. package/dist/components/PasteRows.d.ts +55 -0
  10. package/dist/components/PasteRows.js +55 -0
  11. package/dist/components/Stepper.d.ts +2 -66
  12. package/dist/components/Stepper.js +18 -5
  13. package/dist/components/Table.d.ts +1 -0
  14. package/dist/components/Table.js +1 -0
  15. package/dist/components/box/external-link.d.ts +20 -0
  16. package/dist/components/box/external-link.js +37 -0
  17. package/dist/components/checkbox/CheckboxControl.d.ts +1 -1
  18. package/dist/components/checkbox/CheckboxControl.js +4 -3
  19. package/dist/components/dialog/validate.d.ts +3 -1
  20. package/dist/components/dialog/validate.js +3 -1
  21. package/dist/components/paste-rows/parse-pasted-rows.d.ts +26 -0
  22. package/dist/components/paste-rows/parse-pasted-rows.js +123 -0
  23. package/dist/components/stepper/stepper-props.d.ts +78 -0
  24. package/dist/components/stepper/stepper-props.js +1 -0
  25. package/dist/components/stepper/use-stepper-commit.d.ts +22 -0
  26. package/dist/components/stepper/use-stepper-commit.js +66 -0
  27. package/dist/components/table/TableSelectCell.d.ts +26 -0
  28. package/dist/components/table/TableSelectCell.js +19 -0
  29. package/dist/css/css-box-link.d.ts +3 -0
  30. package/dist/css/css-box-link.js +41 -2
  31. package/dist/css/css-checkbox.js +37 -3
  32. package/dist/css/css-components.js +3 -0
  33. package/dist/css/css-dialog-end.d.ts +13 -0
  34. package/dist/css/css-dialog-end.js +75 -0
  35. package/dist/css/css-select.js +10 -0
  36. package/dist/css/css-table-select.d.ts +3 -0
  37. package/dist/css/css-table-select.js +24 -0
  38. package/dist/css/css-table.js +4 -0
  39. package/dist/css/stylesheet.js +2 -0
  40. package/dist/index.d.ts +4 -2
  41. package/dist/index.js +4 -2
  42. package/dist/styles.css +128 -3
  43. package/package.json +1 -1
@@ -0,0 +1,13 @@
1
+ import { type Breakpoint } from './breakpoints.js';
2
+ /**
3
+ * Where a Dialog sits from the layout breakpoint up: `center` (the
4
+ * default) in the middle of the window, `end` as a side panel docked to
5
+ * the inline end (the right, the left in right-to-left).
6
+ */
7
+ export declare const dialogPlacements: readonly ["center", "end"];
8
+ export type DialogPlacement = (typeof dialogPlacements)[number];
9
+ export declare const dialogEndClass = "sw-dialog-end";
10
+ /** The side panel takes its place from this breakpoint up. */
11
+ export declare const dialogEndFrom: Breakpoint;
12
+ export declare function cssDialogEndClasses(): string;
13
+ export declare function dialogEndClassCatalog(): string[];
@@ -0,0 +1,75 @@
1
+ import { breakpointQuery } from './breakpoints.js';
2
+ /**
3
+ * Where a Dialog sits from the layout breakpoint up: `center` (the
4
+ * default) in the middle of the window, `end` as a side panel docked to
5
+ * the inline end (the right, the left in right-to-left).
6
+ */
7
+ export const dialogPlacements = ['center', 'end'];
8
+ export const dialogEndClass = 'sw-dialog-end';
9
+ /** The side panel takes its place from this breakpoint up. */
10
+ export const dialogEndFrom = 'md';
11
+ const end = `.${dialogEndClass}`;
12
+ /*
13
+ * From md up, `placement="end"` is a side panel: the window's full height
14
+ * at the inline end, square corners, one hairline on its inline-start
15
+ * edge, the size's width (md 32rem, lg 56rem, xl 65rem) with a space-8
16
+ * strip of backdrop always in view. Its column grows to the full height so
17
+ * the pinned footer sits on the bottom edge even when the content is short;
18
+ * longer content scrolls inside the panel under the sticky footer, as in
19
+ * the centred dialog. It slides in from its edge unless reduced motion is
20
+ * asked for. Below md the class draws nothing: the dialog is centred, or a
21
+ * bottom sheet with `sheetBelow`. Emitted after the banded and grabber
22
+ * rules so its edges win at equal specificity.
23
+ */
24
+ export function cssDialogEndClasses() {
25
+ return `@media ${breakpointQuery('from', dialogEndFrom)} {
26
+ ${end} {
27
+ border-color: var(--sw-color-border);
28
+ border-radius: 0;
29
+ border-width: 0;
30
+ border-inline-start-width: 1px;
31
+ height: 100%;
32
+ inset-block: 0;
33
+ margin: 0;
34
+ margin-inline-start: auto;
35
+ max-height: none;
36
+ }
37
+
38
+ ${end}[open] {
39
+ animation: sw-dialog-end-in var(--sw-motion-default) var(--sw-motion-easing);
40
+ display: flex;
41
+ flex-direction: column;
42
+ }
43
+
44
+ ${end}[open]:dir(rtl) {
45
+ animation-name: sw-dialog-end-in-rtl;
46
+ }
47
+
48
+ ${end} > .sw-stack {
49
+ flex: 1 0 auto;
50
+ }
51
+
52
+ ${end} .sw-dialog-footer {
53
+ margin-top: auto;
54
+ }
55
+ }
56
+
57
+ @keyframes sw-dialog-end-in {
58
+ from { translate: 100% 0; }
59
+ }
60
+
61
+ @keyframes sw-dialog-end-in-rtl {
62
+ from { translate: -100% 0; }
63
+ }
64
+
65
+ @media (prefers-reduced-motion: reduce) {
66
+ ${end}[open] { animation: none; }
67
+ }
68
+
69
+ @media (forced-colors: active) {
70
+ ${end} { border-inline-start-color: CanvasText; }
71
+ }`;
72
+ }
73
+ export function dialogEndClassCatalog() {
74
+ return [dialogEndClass];
75
+ }
@@ -2,6 +2,7 @@ import { typographyVariants } from '@scalewing/tokens';
2
2
  import { chevronStroke } from './chevron.js';
3
3
  import { zIndex } from './stacking.js';
4
4
  import { quietFill } from './quiet-fill.js';
5
+ import { coarsePointerQuery, touchTarget } from './touch-target.js';
5
6
  const caption = typographyVariants.caption;
6
7
  const label = typographyVariants.label;
7
8
  export function cssSelectClasses() {
@@ -186,6 +187,15 @@ export function cssSelectClasses() {
186
187
  border-top: 1px solid var(--sw-color-border);
187
188
  color: var(--sw-color-accent);
188
189
  margin-top: var(--sw-space-1);
190
+ }
191
+
192
+ /* The comfortable touch target on a coarse pointer, at every size: the
193
+ trigger and each option are at least 44 px high (the md control height),
194
+ as every Button is. Type and padding keep the size's; the rule follows
195
+ the size rules, which it outranks only by order. */
196
+ @media ${coarsePointerQuery} {
197
+ .sw-select .sw-select-trigger,
198
+ .sw-select .sw-select-option { min-height: ${touchTarget}; }
189
199
  }`;
190
200
  }
191
201
  export function selectClassCatalog() {
@@ -0,0 +1,3 @@
1
+ export declare const tableSelectCellClass = "sw-table-select";
2
+ export declare function cssTableSelectClasses(): string;
3
+ export declare function tableSelectClassCatalog(): string[];
@@ -0,0 +1,24 @@
1
+ import { coarsePointerQuery, touchTarget } from './touch-target.js';
2
+ export const tableSelectCellClass = 'sw-table-select';
3
+ /*
4
+ * TableSelectCell's column: as wide as the checkbox (its padding outside),
5
+ * in an auto or a fixed table alike; the box centred in the cell. On a
6
+ * coarse pointer the column widens to the box's 44 px target
7
+ * (`sw-checkbox-label-hidden`, css-checkbox.ts).
8
+ */
9
+ export function cssTableSelectClasses() {
10
+ return `.sw-table .${tableSelectCellClass} {
11
+ width: var(--sw-space-5);
12
+ }
13
+
14
+ .sw-table .${tableSelectCellClass} .sw-checkbox {
15
+ align-items: center;
16
+ }
17
+
18
+ @media ${coarsePointerQuery} {
19
+ .sw-table .${tableSelectCellClass} { width: ${touchTarget}; }
20
+ }`;
21
+ }
22
+ export function tableSelectClassCatalog() {
23
+ return [tableSelectCellClass];
24
+ }
@@ -7,6 +7,7 @@ import { cssTableLedgerClasses, tableLedgerClassCatalog, } from './css-table-led
7
7
  import { cssTableFooterClasses, tableFooterClassCatalog, } from './css-table-footer.js';
8
8
  import { cssTablePagePinClasses, tablePagePinClassCatalog, } from './css-table-page-pin.js';
9
9
  import { cssTableTotalRowClasses, tableTotalRowClassCatalog, } from './css-table-total-row.js';
10
+ import { cssTableSelectClasses, tableSelectClassCatalog, } from './css-table-select.js';
10
11
  import { cssTablePressClasses, tablePressClassCatalog, } from './css-table-press.js';
11
12
  import { cssTableStickyHeaderClasses, tableStickyHeaderClassCatalog, } from './css-table-sticky-header.js';
12
13
  import { cssTableSortClasses, tableSortClassCatalog, } from './css-table-sort.js';
@@ -103,6 +104,8 @@ ${cssTableBoundedClasses()}
103
104
 
104
105
  ${cssTablePressClasses()}
105
106
 
107
+ ${cssTableSelectClasses()}
108
+
106
109
  ${selectedRowRules()}`;
107
110
  }
108
111
  export function tableClassCatalog() {
@@ -123,5 +126,6 @@ export function tableClassCatalog() {
123
126
  ...tablePagePinClassCatalog(),
124
127
  ...tableBoundedClassCatalog(),
125
128
  ...tablePressClassCatalog(),
129
+ ...tableSelectClassCatalog(),
126
130
  ];
127
131
  }
@@ -68,6 +68,7 @@ import { dialogBandedClassCatalog } from './css-dialog-banded.js';
68
68
  import { dialogFrameClassCatalog } from './css-dialog-frame.js';
69
69
  import { dialogCanvasClassCatalog } from './css-dialog-canvas.js';
70
70
  import { dialogGrabberClassCatalog } from './css-dialog-grabber.js';
71
+ import { dialogEndClassCatalog } from './css-dialog-end.js';
71
72
  import { selectClassCatalog } from './css-select.js';
72
73
  import { multiSelectClassCatalog } from './css-multi-select.js';
73
74
  import { comboboxClassCatalog } from './css-combobox.js';
@@ -113,6 +114,7 @@ export function utilityClassCatalog() {
113
114
  ...dialogBandedClassCatalog(),
114
115
  ...dialogCanvasClassCatalog(),
115
116
  ...dialogGrabberClassCatalog(),
117
+ ...dialogEndClassCatalog(),
116
118
  ...accordionClassCatalog(),
117
119
  ...selectClassCatalog(),
118
120
  ...actionMenuClassCatalog(),
package/dist/index.d.ts CHANGED
@@ -15,6 +15,8 @@ export { ListRow, type ListRowProps } from './components/ListRow.js';
15
15
  export { listGroupVariants, listRowTitleAppearances, listRowTones, listRowValueTones, type ListGroupMaxHeight, type ListGroupVariant, type ListRowTitleAppearance, type ListRowTone, type ListRowValueTone, } from './list-options.js';
16
16
  export { listTileColumnCounts, type ListGroupTileColumns, } from './css/css-list-tiles.js';
17
17
  export { Checkbox, type CheckboxProps } from './components/Checkbox.js';
18
+ export { PasteRows, type PasteRowsColumn, type PasteRowsProps, } from './components/PasteRows.js';
19
+ export { parsePastedRows, type PastedRows, type PastedRowsDelimiter, pastedRowsDelimiters, } from './components/paste-rows/parse-pasted-rows.js';
18
20
  export { Spinner, type SpinnerProps, type SpinnerSize, } from './components/Spinner.js';
19
21
  export { Skeleton, skeletonVariants, type SkeletonProps, type SkeletonVariant, } from './components/Skeleton.js';
20
22
  export { EmptyState, emptyStateTitleElements, type EmptyStateProps, type EmptyStateTitleElement, } from './components/EmptyState.js';
@@ -40,7 +42,7 @@ export { Box, type BoxBorder, type BoxElement, type BoxLink, type BoxProps, } fr
40
42
  export { boxLinkAppearances } from './css/css-box-link.js';
41
43
  export { ButtonGroup, buttonGroupAppearances, type ButtonGroupAppearance, type ButtonGroupJustify, type ButtonGroupProps, } from './components/ButtonGroup.js';
42
44
  export { Card, type CardProps, type CardVariant } from './components/Card.js';
43
- export { Dialog, dialogAppearances, dialogSizes, type DialogAppearance, type DialogProps, type DialogRole, type DialogSize, type DialogTitleLevel, } from './components/Dialog.js';
45
+ export { Dialog, dialogAppearances, dialogPlacements, dialogSizes, type DialogAppearance, type DialogPlacement, type DialogProps, type DialogRole, type DialogSize, type DialogTitleLevel, } from './components/Dialog.js';
44
46
  export { StatTile, type StatTileAppearance, statTileAppearances, type StatTileEmphasis, type StatTileProps, type StatTileTone, statTileTones, } from './components/StatTile.js';
45
47
  export { TabPanel, type TabItem, type TabPanelProps, Tabs, type TabsProps, tabId, tabPanelId, } from './components/Tabs.js';
46
48
  export { Toast, toastPlacements, toastTones, type ToastAction, type ToastPlacement, } from './components/Toast.js';
@@ -69,7 +71,7 @@ export { Select } from './components/Select.js';
69
71
  export type { SelectAction, SelectOption, SelectProps, SelectWidth, } from './components/Select.js';
70
72
  export { MultiSelect, type MultiSelectAlign, type MultiSelectOption, type MultiSelectProps, } from './components/MultiSelect.js';
71
73
  export { Stack, type Align, type Justify, type StackProps, } from './components/Stack.js';
72
- export { Table, TableBody, TableCell, TableFooter, TableHeader, TableRow, tableCellTones, tableRowVariants, type TableBodyProps, type TableCellProps, type TableCellTone, type TableColumnWidth, type TableDensity, type TableFooterProps, type TableHeaderProps, type TableLayout, type TableMaxHeight, type TableProps, type TableRowProps, type TableRowVariant, type TableSort, type TableStickyHeader, type TableVerticalAlign, } from './components/Table.js';
74
+ export { Table, TableBody, TableCell, TableFooter, TableHeader, TableRow, TableSelectCell, tableCellTones, tableRowVariants, type TableBodyProps, type TableCellProps, type TableCellTone, type TableColumnWidth, type TableDensity, type TableFooterProps, type TableHeaderProps, type TableLayout, type TableMaxHeight, type TableProps, type TableRowProps, type TableRowVariant, type TableSelectCellProps, type TableSort, type TableStickyHeader, type TableVerticalAlign, } from './components/Table.js';
73
75
  export { Text, type TextAlign, type TextElement, type TextProps, } from './components/Text.js';
74
76
  export { ThemeProvider, useTheme, type ThemeProviderProps, } from './theme/ThemeProvider.js';
75
77
  export { themeCanvases, type ThemeCanvas } from './css/css-canvas-grouped.js';
package/dist/index.js CHANGED
@@ -14,6 +14,8 @@ export { ListRow } from './components/ListRow.js';
14
14
  export { listGroupVariants, listRowTitleAppearances, listRowTones, listRowValueTones, } from './list-options.js';
15
15
  export { listTileColumnCounts, } from './css/css-list-tiles.js';
16
16
  export { Checkbox } from './components/Checkbox.js';
17
+ export { PasteRows, } from './components/PasteRows.js';
18
+ export { parsePastedRows, pastedRowsDelimiters, } from './components/paste-rows/parse-pasted-rows.js';
17
19
  export { Spinner, } from './components/Spinner.js';
18
20
  export { Skeleton, skeletonVariants, } from './components/Skeleton.js';
19
21
  export { EmptyState, emptyStateTitleElements, } from './components/EmptyState.js';
@@ -39,7 +41,7 @@ export { Box, } from './components/Box.js';
39
41
  export { boxLinkAppearances } from './css/css-box-link.js';
40
42
  export { ButtonGroup, buttonGroupAppearances, } from './components/ButtonGroup.js';
41
43
  export { Card } from './components/Card.js';
42
- export { Dialog, dialogAppearances, dialogSizes, } from './components/Dialog.js';
44
+ export { Dialog, dialogAppearances, dialogPlacements, dialogSizes, } from './components/Dialog.js';
43
45
  export { StatTile, statTileAppearances, statTileTones, } from './components/StatTile.js';
44
46
  export { TabPanel, Tabs, tabId, tabPanelId, } from './components/Tabs.js';
45
47
  export { Toast, toastPlacements, toastTones, } from './components/Toast.js';
@@ -65,7 +67,7 @@ export { Combobox, comboboxSizes, } from './components/Combobox.js';
65
67
  export { Select } from './components/Select.js';
66
68
  export { MultiSelect, } from './components/MultiSelect.js';
67
69
  export { Stack, } from './components/Stack.js';
68
- export { Table, TableBody, TableCell, TableFooter, TableHeader, TableRow, tableCellTones, tableRowVariants, } from './components/Table.js';
70
+ export { Table, TableBody, TableCell, TableFooter, TableHeader, TableRow, TableSelectCell, tableCellTones, tableRowVariants, } from './components/Table.js';
69
71
  export { Text, } from './components/Text.js';
70
72
  export { ThemeProvider, useTheme, } from './theme/ThemeProvider.js';
71
73
  export { themeCanvases } from './css/css-canvas-grouped.js';
package/dist/styles.css CHANGED
@@ -666,6 +666,30 @@ body {
666
666
  text-decoration-line: underline;
667
667
  }
668
668
 
669
+ .sw-link-external-mark {
670
+ border-right: 2px solid currentColor;
671
+ border-top: 2px solid currentColor;
672
+ box-sizing: border-box;
673
+ display: inline-block;
674
+ height: var(--sw-space-2);
675
+ margin-inline-start: var(--sw-space-1);
676
+ position: relative;
677
+ vertical-align: middle;
678
+ width: var(--sw-space-2);
679
+ }
680
+
681
+ .sw-link-external-mark::after {
682
+ border-left: 2px solid currentColor;
683
+ content: '';
684
+ height: calc(var(--sw-space-2) * 1.25);
685
+ left: 50%;
686
+ position: absolute;
687
+ top: 50%;
688
+ transform: translate(-50%, -50%) rotate(45deg);
689
+ }
690
+
691
+ .sw-link-external-mark:dir(rtl) { transform: scaleX(-1); }
692
+
669
693
  /*
670
694
  * A programmatic focus target (tabindex="-1": a notice, a card or a heading
671
695
  * that a script focuses after a save) takes the accent ring past the ring
@@ -1185,6 +1209,38 @@ body {
1185
1209
 
1186
1210
  .sw-checkbox-input:checked + .sw-checkbox-mark::after { display: block; }
1187
1211
 
1212
+ /* The mixed state: the accent fill with a dash in place of the check. */
1213
+ .sw-checkbox-input:indeterminate + .sw-checkbox-mark {
1214
+ background: var(--sw-color-accent);
1215
+ border-color: var(--sw-color-accent);
1216
+ }
1217
+
1218
+ .sw-checkbox-input:indeterminate + .sw-checkbox-mark::after {
1219
+ border-right: 0;
1220
+ display: block;
1221
+ height: 0;
1222
+ inset-block-start: calc(50% - 1px);
1223
+ inset-inline-start: calc(50% - var(--sw-space-3) / 2);
1224
+ transform: none;
1225
+ width: var(--sw-space-3);
1226
+ }
1227
+
1228
+ /* A visually hidden label: the box alone is the target, its own size on a
1229
+ fine pointer (so a compact table row keeps its height), the 44 px touch
1230
+ target both ways on a coarse one. */
1231
+ .sw-checkbox-label-hidden {
1232
+ justify-content: center;
1233
+ min-height: 0;
1234
+ position: relative;
1235
+ }
1236
+
1237
+ @media (pointer: coarse) {
1238
+ .sw-checkbox-label-hidden {
1239
+ min-height: var(--sw-control-md-min-height);
1240
+ min-width: var(--sw-control-md-min-height);
1241
+ }
1242
+ }
1243
+
1188
1244
  .sw-checkbox-input:focus-visible + .sw-checkbox-mark {
1189
1245
  outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
1190
1246
  outline-offset: var(--sw-focus-ring-offset);
@@ -1221,13 +1277,13 @@ body {
1221
1277
 
1222
1278
  @media (prefers-reduced-transparency: reduce) {
1223
1279
  .sw-checkbox-mark { background: var(--sw-color-surface); }
1224
- .sw-checkbox-input:checked + .sw-checkbox-mark { background: var(--sw-color-accent); }
1280
+ .sw-checkbox-input:is(:checked, :indeterminate) + .sw-checkbox-mark { background: var(--sw-color-accent); }
1225
1281
  }
1226
1282
 
1227
1283
  @media (forced-colors: active) {
1228
1284
  .sw-checkbox-mark { background: Canvas; border-color: CanvasText; }
1229
- .sw-checkbox-input:checked + .sw-checkbox-mark { background: Highlight; border-color: Highlight; }
1230
- .sw-checkbox-input:checked + .sw-checkbox-mark::after { border-color: HighlightText; }
1285
+ .sw-checkbox-input:is(:checked, :indeterminate) + .sw-checkbox-mark { background: Highlight; border-color: Highlight; }
1286
+ .sw-checkbox-input:is(:checked, :indeterminate) + .sw-checkbox-mark::after { border-color: HighlightText; }
1231
1287
  .sw-checkbox-input[aria-invalid='true'] + .sw-checkbox-mark { border-color: CanvasText; }
1232
1288
  }
1233
1289
 
@@ -2174,6 +2230,18 @@ body {
2174
2230
  .sw-table-action { color: ButtonText; }
2175
2231
  }
2176
2232
 
2233
+ .sw-table .sw-table-select {
2234
+ width: var(--sw-space-5);
2235
+ }
2236
+
2237
+ .sw-table .sw-table-select .sw-checkbox {
2238
+ align-items: center;
2239
+ }
2240
+
2241
+ @media (pointer: coarse) {
2242
+ .sw-table .sw-table-select { width: var(--sw-control-md-min-height); }
2243
+ }
2244
+
2177
2245
  .sw-table-row-selected > :first-child {
2178
2246
  position: relative;
2179
2247
  }
@@ -5837,6 +5905,54 @@ html:has(.sw-site-header-sticky) {
5837
5905
  }
5838
5906
  }
5839
5907
 
5908
+ @media (min-width: 48rem) {
5909
+ .sw-dialog-end {
5910
+ border-color: var(--sw-color-border);
5911
+ border-radius: 0;
5912
+ border-width: 0;
5913
+ border-inline-start-width: 1px;
5914
+ height: 100%;
5915
+ inset-block: 0;
5916
+ margin: 0;
5917
+ margin-inline-start: auto;
5918
+ max-height: none;
5919
+ }
5920
+
5921
+ .sw-dialog-end[open] {
5922
+ animation: sw-dialog-end-in var(--sw-motion-default) var(--sw-motion-easing);
5923
+ display: flex;
5924
+ flex-direction: column;
5925
+ }
5926
+
5927
+ .sw-dialog-end[open]:dir(rtl) {
5928
+ animation-name: sw-dialog-end-in-rtl;
5929
+ }
5930
+
5931
+ .sw-dialog-end > .sw-stack {
5932
+ flex: 1 0 auto;
5933
+ }
5934
+
5935
+ .sw-dialog-end .sw-dialog-footer {
5936
+ margin-top: auto;
5937
+ }
5938
+ }
5939
+
5940
+ @keyframes sw-dialog-end-in {
5941
+ from { translate: 100% 0; }
5942
+ }
5943
+
5944
+ @keyframes sw-dialog-end-in-rtl {
5945
+ from { translate: -100% 0; }
5946
+ }
5947
+
5948
+ @media (prefers-reduced-motion: reduce) {
5949
+ .sw-dialog-end[open] { animation: none; }
5950
+ }
5951
+
5952
+ @media (forced-colors: active) {
5953
+ .sw-dialog-end { border-inline-start-color: CanvasText; }
5954
+ }
5955
+
5840
5956
  .sw-accordion {
5841
5957
  background: var(--sw-glass-fill);
5842
5958
  border: 1px solid var(--sw-glass-border);
@@ -6091,6 +6207,15 @@ html:has(.sw-site-header-sticky) {
6091
6207
  margin-top: var(--sw-space-1);
6092
6208
  }
6093
6209
 
6210
+ /* The comfortable touch target on a coarse pointer, at every size: the
6211
+ trigger and each option are at least 44 px high (the md control height),
6212
+ as every Button is. Type and padding keep the size's; the rule follows
6213
+ the size rules, which it outranks only by order. */
6214
+ @media (pointer: coarse) {
6215
+ .sw-select .sw-select-trigger,
6216
+ .sw-select .sw-select-option { min-height: var(--sw-control-md-min-height); }
6217
+ }
6218
+
6094
6219
  .sw-action-menu {
6095
6220
  display: inline-flex;
6096
6221
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scalewing/react",
3
- "version": "1.52.0",
3
+ "version": "1.54.0",
4
4
  "description": "Scalewing DOM components and package-owned CSS utilities.",
5
5
  "type": "module",
6
6
  "license": "MIT",