@scalewing/react 1.51.0 → 1.53.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 (44) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +14 -2
  3. package/dist/components/Checkbox.d.ts +18 -1
  4. package/dist/components/Checkbox.js +15 -5
  5. package/dist/components/Dialog.d.ts +14 -1
  6. package/dist/components/Dialog.js +5 -2
  7. package/dist/components/PasteRows.d.ts +55 -0
  8. package/dist/components/PasteRows.js +55 -0
  9. package/dist/components/SiteHeader.d.ts +6 -3
  10. package/dist/components/SiteHeader.js +8 -4
  11. package/dist/components/Table.d.ts +1 -0
  12. package/dist/components/Table.js +1 -0
  13. package/dist/components/checkbox/CheckboxControl.d.ts +1 -1
  14. package/dist/components/checkbox/CheckboxControl.js +4 -3
  15. package/dist/components/dialog/validate.d.ts +3 -1
  16. package/dist/components/dialog/validate.js +3 -1
  17. package/dist/components/paste-rows/parse-pasted-rows.d.ts +26 -0
  18. package/dist/components/paste-rows/parse-pasted-rows.js +123 -0
  19. package/dist/components/site-header/types.d.ts +16 -1
  20. package/dist/components/site-header/validate.d.ts +4 -3
  21. package/dist/components/site-header/validate.js +12 -3
  22. package/dist/components/table/TableSelectCell.d.ts +26 -0
  23. package/dist/components/table/TableSelectCell.js +19 -0
  24. package/dist/css/css-checkbox.js +37 -3
  25. package/dist/css/css-components.js +3 -0
  26. package/dist/css/css-dialog-end.d.ts +13 -0
  27. package/dist/css/css-dialog-end.js +75 -0
  28. package/dist/css/css-select.js +10 -0
  29. package/dist/css/css-site-footer.js +11 -1
  30. package/dist/css/css-site-header-anchors.d.ts +1 -0
  31. package/dist/css/css-site-header-anchors.js +22 -0
  32. package/dist/css/css-site-header-skip-link.d.ts +1 -0
  33. package/dist/css/css-site-header-skip-link.js +49 -0
  34. package/dist/css/css-site-header.js +26 -11
  35. package/dist/css/css-table-select.d.ts +3 -0
  36. package/dist/css/css-table-select.js +24 -0
  37. package/dist/css/css-table.js +4 -0
  38. package/dist/css/site-header-geometry.d.ts +21 -0
  39. package/dist/css/site-header-geometry.js +28 -0
  40. package/dist/css/stylesheet.js +2 -0
  41. package/dist/index.d.ts +5 -3
  42. package/dist/index.js +4 -2
  43. package/dist/styles.css +165 -3
  44. package/package.json +1 -1
@@ -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
  }
@@ -0,0 +1,21 @@
1
+ /** The bar's height below `lg`: 56 px. */
2
+ export declare const siteHeaderCompactHeight = "calc(var(--sw-control-md-min-height) + var(--sw-space-3))";
3
+ /** The bar's height from `lg`: 72 px. */
4
+ export declare const siteHeaderWideHeight = "calc(var(--sw-control-md-min-height) + var(--sw-space-5) + var(--sw-space-1))";
5
+ /** The bar's content: the page container plus the page gutter each side. */
6
+ export declare const siteHeaderBarMaxWidth = "calc(var(--sw-container-max) + 2 * var(--sw-space-5))";
7
+ /** From here the bar is the wide one with its row of destinations. */
8
+ export declare const siteHeaderWideQuery: string;
9
+ /** From here the bar's gutter is the wider one. */
10
+ export declare const siteHeaderGutterQuery: string;
11
+ /** The bar's gutter below `md` (`compact`) and from it (`wide`). */
12
+ export declare const siteHeaderGutter: {
13
+ readonly compact: "var(--sw-space-4)";
14
+ readonly wide: "var(--sw-space-5)";
15
+ };
16
+ /**
17
+ * Where the bar's content starts, measured from the header's start: the
18
+ * centred bar's margin (none on a window narrower than the bar) plus its
19
+ * gutter, so something laid over the bar lines up with the brand.
20
+ */
21
+ export declare function siteHeaderContentStart(gutter: string): string;
@@ -0,0 +1,28 @@
1
+ import { breakpointQuery } from './breakpoints.js';
2
+ /*
3
+ * The site header's measures, shared by the bar, its skip link and the
4
+ * document's scroll padding so all three agree on where the bar ends.
5
+ */
6
+ /** The bar's height below `lg`: 56 px. */
7
+ export const siteHeaderCompactHeight = 'calc(var(--sw-control-md-min-height) + var(--sw-space-3))';
8
+ /** The bar's height from `lg`: 72 px. */
9
+ export const siteHeaderWideHeight = 'calc(var(--sw-control-md-min-height) + var(--sw-space-5) + var(--sw-space-1))';
10
+ /** The bar's content: the page container plus the page gutter each side. */
11
+ export const siteHeaderBarMaxWidth = 'calc(var(--sw-container-max) + 2 * var(--sw-space-5))';
12
+ /** From here the bar is the wide one with its row of destinations. */
13
+ export const siteHeaderWideQuery = breakpointQuery('from', 'lg');
14
+ /** From here the bar's gutter is the wider one. */
15
+ export const siteHeaderGutterQuery = breakpointQuery('from', 'md');
16
+ /** The bar's gutter below `md` (`compact`) and from it (`wide`). */
17
+ export const siteHeaderGutter = {
18
+ compact: 'var(--sw-space-4)',
19
+ wide: 'var(--sw-space-5)',
20
+ };
21
+ /**
22
+ * Where the bar's content starts, measured from the header's start: the
23
+ * centred bar's margin (none on a window narrower than the bar) plus its
24
+ * gutter, so something laid over the bar lines up with the brand.
25
+ */
26
+ export function siteHeaderContentStart(gutter) {
27
+ return `calc(max(0px, (100% - ${siteHeaderBarMaxWidth}) / 2) + ${gutter})`;
28
+ }
@@ -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';
@@ -81,7 +83,7 @@ export { breakpointQuery } from './css/breakpoints.js';
81
83
  export { Band, bandElements, bandTones, bandWidths, } from './components/Band.js';
82
84
  export type { BandElement, BandProps, BandTone, BandWidth, } from './components/Band.js';
83
85
  export { SiteHeader } from './components/SiteHeader.js';
84
- export type { SiteHeaderItem, SiteHeaderLabels, SiteHeaderProps, } from './components/SiteHeader.js';
86
+ export type { SiteHeaderItem, SiteHeaderLabels, SiteHeaderProps, SiteHeaderSkipLink, } from './components/SiteHeader.js';
85
87
  export { ScreenPreview, screenPreviewFrames, } from './components/ScreenPreview.js';
86
88
  export type { ScreenPreviewFrame, ScreenPreviewProps, } from './components/ScreenPreview.js';
87
89
  export { PreviewGroup } from './components/screen-preview/PreviewGroup.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
@@ -1185,6 +1185,38 @@ body {
1185
1185
 
1186
1186
  .sw-checkbox-input:checked + .sw-checkbox-mark::after { display: block; }
1187
1187
 
1188
+ /* The mixed state: the accent fill with a dash in place of the check. */
1189
+ .sw-checkbox-input:indeterminate + .sw-checkbox-mark {
1190
+ background: var(--sw-color-accent);
1191
+ border-color: var(--sw-color-accent);
1192
+ }
1193
+
1194
+ .sw-checkbox-input:indeterminate + .sw-checkbox-mark::after {
1195
+ border-right: 0;
1196
+ display: block;
1197
+ height: 0;
1198
+ inset-block-start: calc(50% - 1px);
1199
+ inset-inline-start: calc(50% - var(--sw-space-3) / 2);
1200
+ transform: none;
1201
+ width: var(--sw-space-3);
1202
+ }
1203
+
1204
+ /* A visually hidden label: the box alone is the target, its own size on a
1205
+ fine pointer (so a compact table row keeps its height), the 44 px touch
1206
+ target both ways on a coarse one. */
1207
+ .sw-checkbox-label-hidden {
1208
+ justify-content: center;
1209
+ min-height: 0;
1210
+ position: relative;
1211
+ }
1212
+
1213
+ @media (pointer: coarse) {
1214
+ .sw-checkbox-label-hidden {
1215
+ min-height: var(--sw-control-md-min-height);
1216
+ min-width: var(--sw-control-md-min-height);
1217
+ }
1218
+ }
1219
+
1188
1220
  .sw-checkbox-input:focus-visible + .sw-checkbox-mark {
1189
1221
  outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
1190
1222
  outline-offset: var(--sw-focus-ring-offset);
@@ -1221,13 +1253,13 @@ body {
1221
1253
 
1222
1254
  @media (prefers-reduced-transparency: reduce) {
1223
1255
  .sw-checkbox-mark { background: var(--sw-color-surface); }
1224
- .sw-checkbox-input:checked + .sw-checkbox-mark { background: var(--sw-color-accent); }
1256
+ .sw-checkbox-input:is(:checked, :indeterminate) + .sw-checkbox-mark { background: var(--sw-color-accent); }
1225
1257
  }
1226
1258
 
1227
1259
  @media (forced-colors: active) {
1228
1260
  .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; }
1261
+ .sw-checkbox-input:is(:checked, :indeterminate) + .sw-checkbox-mark { background: Highlight; border-color: Highlight; }
1262
+ .sw-checkbox-input:is(:checked, :indeterminate) + .sw-checkbox-mark::after { border-color: HighlightText; }
1231
1263
  .sw-checkbox-input[aria-invalid='true'] + .sw-checkbox-mark { border-color: CanvasText; }
1232
1264
  }
1233
1265
 
@@ -2174,6 +2206,18 @@ body {
2174
2206
  .sw-table-action { color: ButtonText; }
2175
2207
  }
2176
2208
 
2209
+ .sw-table .sw-table-select {
2210
+ width: var(--sw-space-5);
2211
+ }
2212
+
2213
+ .sw-table .sw-table-select .sw-checkbox {
2214
+ align-items: center;
2215
+ }
2216
+
2217
+ @media (pointer: coarse) {
2218
+ .sw-table .sw-table-select { width: var(--sw-control-md-min-height); }
2219
+ }
2220
+
2177
2221
  .sw-table-row-selected > :first-child {
2178
2222
  position: relative;
2179
2223
  }
@@ -4939,6 +4983,13 @@ body {
4939
4983
  min-height: var(--sw-control-md-min-height);
4940
4984
  }
4941
4985
 
4986
+ [data-theme] .sw-band-inverse :is(.sw-site-footer-legal, .sw-site-footer-end) > a:not(.sw-button) {
4987
+ align-items: center;
4988
+ display: inline-flex;
4989
+ justify-content: center;
4990
+ min-height: var(--sw-control-md-min-height);
4991
+ }
4992
+
4942
4993
  .sw-site-footer-links {
4943
4994
  gap: 0;
4944
4995
  }
@@ -4998,6 +5049,10 @@ body {
4998
5049
  gap: var(--sw-space-1);
4999
5050
  }
5000
5051
 
5052
+ .sw-site-header-compact-actions {
5053
+ display: contents;
5054
+ }
5055
+
5001
5056
  .sw-site-header-list {
5002
5057
  list-style: none;
5003
5058
  margin: 0;
@@ -5054,6 +5109,10 @@ body {
5054
5109
  list-style: none;
5055
5110
  }
5056
5111
 
5112
+ .sw-site-header-compact:has(> .sw-site-header-menu[open]) > .sw-site-header-compact-actions {
5113
+ display: none;
5114
+ }
5115
+
5057
5116
  .sw-site-header-menu > summary::-webkit-details-marker {
5058
5117
  display: none;
5059
5118
  }
@@ -5138,6 +5197,52 @@ body {
5138
5197
  padding-top: var(--sw-space-5);
5139
5198
  }
5140
5199
 
5200
+ .sw-site-header-skip-link {
5201
+ align-items: center;
5202
+ background: var(--sw-color-surface);
5203
+ border-radius: var(--sw-radius-pill);
5204
+ box-sizing: border-box;
5205
+ display: inline-flex;
5206
+ font-family: var(--sw-font-sans);
5207
+ font-size: 15px;
5208
+ font-weight: 600;
5209
+ inset-block-start: 50%;
5210
+ inset-inline-start: calc(max(0px, (100% - calc(var(--sw-container-max) + 2 * var(--sw-space-5))) / 2) + var(--sw-space-4));
5211
+ letter-spacing: -0.2px;
5212
+ line-height: 20px;
5213
+ padding-inline: var(--sw-space-4);
5214
+ position: absolute;
5215
+ transform: translateY(-50%);
5216
+ white-space: nowrap;
5217
+ }
5218
+
5219
+ [data-theme] .sw-site-header-skip-link {
5220
+ color: var(--sw-color-text);
5221
+ text-decoration: none;
5222
+ }
5223
+
5224
+ [data-theme] .sw-site-header-skip-link:focus {
5225
+ min-height: var(--sw-control-md-min-height);
5226
+ outline: var(--sw-focus-ring-width) solid var(--sw-color-accent);
5227
+ outline-offset: calc(-1 * var(--sw-focus-ring-width));
5228
+ }
5229
+
5230
+ .sw-site-header-skip-link:not(:focus) { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
5231
+
5232
+ @media (min-width: 48rem) {
5233
+ .sw-site-header-skip-link { inset-inline-start: calc(max(0px, (100% - calc(var(--sw-container-max) + 2 * var(--sw-space-5))) / 2) + var(--sw-space-5)); }
5234
+ }
5235
+
5236
+ html:has(.sw-site-header-sticky) {
5237
+ scroll-padding-top: calc(calc(var(--sw-control-md-min-height) + var(--sw-space-3)) + 1px + var(--sw-space-3));
5238
+ }
5239
+
5240
+ @media (min-width: 64rem) {
5241
+ html:has(.sw-site-header-sticky) {
5242
+ scroll-padding-top: calc(calc(var(--sw-control-md-min-height) + var(--sw-space-5) + var(--sw-space-1)) + 1px + var(--sw-space-3));
5243
+ }
5244
+ }
5245
+
5141
5246
  /*
5142
5247
  * Forced colours drop box shadows, so the current destination's bar is a
5143
5248
  * thick underline there.
@@ -5776,6 +5881,54 @@ body {
5776
5881
  }
5777
5882
  }
5778
5883
 
5884
+ @media (min-width: 48rem) {
5885
+ .sw-dialog-end {
5886
+ border-color: var(--sw-color-border);
5887
+ border-radius: 0;
5888
+ border-width: 0;
5889
+ border-inline-start-width: 1px;
5890
+ height: 100%;
5891
+ inset-block: 0;
5892
+ margin: 0;
5893
+ margin-inline-start: auto;
5894
+ max-height: none;
5895
+ }
5896
+
5897
+ .sw-dialog-end[open] {
5898
+ animation: sw-dialog-end-in var(--sw-motion-default) var(--sw-motion-easing);
5899
+ display: flex;
5900
+ flex-direction: column;
5901
+ }
5902
+
5903
+ .sw-dialog-end[open]:dir(rtl) {
5904
+ animation-name: sw-dialog-end-in-rtl;
5905
+ }
5906
+
5907
+ .sw-dialog-end > .sw-stack {
5908
+ flex: 1 0 auto;
5909
+ }
5910
+
5911
+ .sw-dialog-end .sw-dialog-footer {
5912
+ margin-top: auto;
5913
+ }
5914
+ }
5915
+
5916
+ @keyframes sw-dialog-end-in {
5917
+ from { translate: 100% 0; }
5918
+ }
5919
+
5920
+ @keyframes sw-dialog-end-in-rtl {
5921
+ from { translate: -100% 0; }
5922
+ }
5923
+
5924
+ @media (prefers-reduced-motion: reduce) {
5925
+ .sw-dialog-end[open] { animation: none; }
5926
+ }
5927
+
5928
+ @media (forced-colors: active) {
5929
+ .sw-dialog-end { border-inline-start-color: CanvasText; }
5930
+ }
5931
+
5779
5932
  .sw-accordion {
5780
5933
  background: var(--sw-glass-fill);
5781
5934
  border: 1px solid var(--sw-glass-border);
@@ -6030,6 +6183,15 @@ body {
6030
6183
  margin-top: var(--sw-space-1);
6031
6184
  }
6032
6185
 
6186
+ /* The comfortable touch target on a coarse pointer, at every size: the
6187
+ trigger and each option are at least 44 px high (the md control height),
6188
+ as every Button is. Type and padding keep the size's; the rule follows
6189
+ the size rules, which it outranks only by order. */
6190
+ @media (pointer: coarse) {
6191
+ .sw-select .sw-select-trigger,
6192
+ .sw-select .sw-select-option { min-height: var(--sw-control-md-min-height); }
6193
+ }
6194
+
6033
6195
  .sw-action-menu {
6034
6196
  display: inline-flex;
6035
6197
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scalewing/react",
3
- "version": "1.51.0",
3
+ "version": "1.53.0",
4
4
  "description": "Scalewing DOM components and package-owned CSS utilities.",
5
5
  "type": "module",
6
6
  "license": "MIT",