@sigmela/router 0.4.0 → 0.5.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.
- package/CHANGELOG.md +15 -0
- package/README.md +32 -5
- package/dist/components/Sheet.d.ts +4 -1
- package/dist/components/Sheet.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -11
- package/dist/index.js.map +1 -1
- package/dist/router.css +4 -0
- package/package.json +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,21 @@ All notable changes to this package are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
5
|
[semantic versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## 0.5.0
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `Sheet` accepts `presentation="fullscreen"`, turning a bottom sheet into a
|
|
12
|
+
full-height surface (header switches to the modal shape, dismissal measures
|
|
13
|
+
the viewport). Sheets stay content-sized by default.
|
|
14
|
+
|
|
15
|
+
- Public exports for the overlay surface: `Sheet`, `SheetFrame`,
|
|
16
|
+
`useModalSwipeTarget`, `useSheetDragEngine`, `sheetDragStartsInInteractiveControl`,
|
|
17
|
+
`sheetScrollAtTop` and `SheetDragUpdate`. Previously only `Modal`/`ModalFrame`
|
|
18
|
+
were reachable, so apps could route to a sheet but not build its body.
|
|
19
|
+
- `example/`: a Vite sandbox covering stacks, overlays, tab bar, drawer,
|
|
20
|
+
split view and guards (`npm run example`).
|
|
21
|
+
|
|
7
22
|
## 0.1.0
|
|
8
23
|
|
|
9
24
|
First standalone release, extracted from the Sigmela merchant web app.
|
package/README.md
CHANGED
|
@@ -42,15 +42,24 @@ Styles ship with the bundle: `dist/index.js` imports `router.css`, so bundlers
|
|
|
42
42
|
that handle CSS from dependencies (Vite, webpack, Next, Parcel) pick it up
|
|
43
43
|
automatically — no extra import needed.
|
|
44
44
|
|
|
45
|
-
Environments without a CSS loader — plain Node,
|
|
46
|
-
|
|
47
|
-
`@sigmela/router/router.css` there, and load the stylesheet explicitly on the
|
|
48
|
-
client:
|
|
45
|
+
Environments without a CSS loader — plain Node, some SSR pipelines — cannot
|
|
46
|
+
resolve that import. Load the stylesheet explicitly there:
|
|
49
47
|
|
|
50
48
|
```ts
|
|
51
49
|
import '@sigmela/router/router.css';
|
|
52
50
|
```
|
|
53
51
|
|
|
52
|
+
For Vitest with the `node` environment, inline the package so Vite handles the
|
|
53
|
+
CSS import instead of Node:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
// vitest.config.ts
|
|
57
|
+
test: {
|
|
58
|
+
environment: 'node',
|
|
59
|
+
server: { deps: { inline: [/@sigmela\/router/] } },
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
54
63
|
## Route primitives
|
|
55
64
|
|
|
56
65
|
| Element | Purpose |
|
|
@@ -60,7 +69,7 @@ import '@sigmela/router/router.css';
|
|
|
60
69
|
| `Router.Redirect` | Declarative redirect |
|
|
61
70
|
| `Router.Modal` | Full-cover or content-sized overlay above the current screen |
|
|
62
71
|
| `Router.Sheet` | Bottom sheet, content-sized or fullscreen |
|
|
63
|
-
| `Router.TabBar` / `Router.TabBarItem` | Tab navigation
|
|
72
|
+
| `Router.TabBar` / `Router.TabBarItem` | Tab navigation; selecting a tab routes to its root path |
|
|
64
73
|
| `Router.Drawer` / `Router.DrawerGroup` / `Router.DrawerSection` / `Router.DrawerItem` | Persistent side navigation |
|
|
65
74
|
| `Router.SplitView` | Primary/secondary panes above a width breakpoint |
|
|
66
75
|
| `Router.Protected` | Guarded subtree with a redirect target |
|
|
@@ -150,6 +159,23 @@ The router owns navigation, overlay surfaces and their gestures. It never
|
|
|
150
159
|
imports application features, i18n, data layers or design-system components —
|
|
151
160
|
screens and layouts are supplied by the host app as JSX.
|
|
152
161
|
|
|
162
|
+
## Sandbox
|
|
163
|
+
|
|
164
|
+
`example/` is a Vite playground that exercises every primitive against the
|
|
165
|
+
router source, with hot reload:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npm install
|
|
169
|
+
npm run example # http://localhost:5180
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
It has three shells you can switch between: **Stack & overlays** (pushes,
|
|
173
|
+
params, search params, fullscreen and content-sized modals, a sheet, and a
|
|
174
|
+
modal owning its own three-step stack), **Tab bar** (per-tab routes, history
|
|
175
|
+
state), and **Drawer & split** (drawer groups and sections, a split view, and a
|
|
176
|
+
guarded route). `example/src/theme.css` shows the `--router-*` tokens driving
|
|
177
|
+
the whole look.
|
|
178
|
+
|
|
153
179
|
## Development
|
|
154
180
|
|
|
155
181
|
```bash
|
|
@@ -158,6 +184,7 @@ npm run typecheck
|
|
|
158
184
|
npm test # 58 contract tests
|
|
159
185
|
npm run lint
|
|
160
186
|
npm run build # dist/index.js + dist/router.css + type declarations
|
|
187
|
+
npm run example # Vite sandbox on the source
|
|
161
188
|
```
|
|
162
189
|
|
|
163
190
|
`ROUTER_CONTRACT.md` documents the invariants the contract tests protect.
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
2
|
import type { RouterShellMode } from '../types';
|
|
3
3
|
type SheetVariant = 'attached' | 'detached';
|
|
4
|
+
type SheetPresentation = 'content' | 'fullscreen';
|
|
4
5
|
interface SheetProps {
|
|
5
6
|
children: ReactNode;
|
|
6
7
|
disableDismiss?: boolean;
|
|
7
8
|
onRequestClose?: () => void;
|
|
8
9
|
variant?: SheetVariant;
|
|
10
|
+
/** 'fullscreen' turns the sheet into a full-height surface. */
|
|
11
|
+
presentation?: SheetPresentation;
|
|
9
12
|
}
|
|
10
13
|
interface SheetFrameProps {
|
|
11
14
|
children: ReactNode;
|
|
@@ -17,7 +20,7 @@ interface SheetFrameProps {
|
|
|
17
20
|
activeContentKey?: string;
|
|
18
21
|
}
|
|
19
22
|
export declare function SheetFrame({ children, open, onRequestClose, onExitComplete, zIndex, shell, activeContentKey, }: SheetFrameProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
-
declare function SheetRoot({ children, disableDismiss, onRequestClose, variant, }: SheetProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
declare function SheetRoot({ children, disableDismiss, onRequestClose, variant, presentation, }: SheetProps): import("react/jsx-runtime").JSX.Element;
|
|
21
24
|
interface SheetHeaderProps {
|
|
22
25
|
title?: string;
|
|
23
26
|
leftAction?: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sheet.d.ts","sourceRoot":"","sources":["../../src/components/Sheet.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,KAAK,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"Sheet.d.ts","sourceRoot":"","sources":["../../src/components/Sheet.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,KAAK,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAC5C,KAAK,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAAC;AA4BlD,UAAU,UAAU;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAOD,UAAU,eAAe;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,cAAc,EACd,MAAM,EACN,KAA0B,EAC1B,gBAA8C,GAC/C,EAAE,eAAe,2CA+KjB;AAED,iBAAS,SAAS,CAAC,EACjB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,OAAoB,EACpB,YAAwB,GACzB,EAAE,UAAU,2CAsBZ;AAED,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC5B;AAED,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,UAAU,EACV,WAAW,EACX,eAAe,EACf,MAAa,EACb,KAAe,GAChB,EAAE,gBAAgB,2CA2BlB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iBAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAE/D;AAED,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,iBAAS,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,oBAAoB,2CAgB5E;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAa7D;AAED,eAAO,MAAM,KAAK;;;;;CAKhB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { Router, useCurrentModal, useCurrentRoute, useDrawer, useHistoryState, useParams, useRoute, useRouter, useSearchParams, type CurrentModalApi, type RouterDrawerApi, type RouterDrawerGroup, type RouterDrawerGroupProps, type RouterDrawerItem, type RouterDrawerItemProps, type RouterDrawerNode, type RouterDrawerSection, type RouterDrawerSectionProps, type RouterDrawerProps, type RouterApi, type RouterNavigateFunction, type RouterReplaceFunction, type RouterRedirectProps, type RouterRouteContextValue, type RouterRouteLayoutProps, type RouterProtectedProps, type RouterRouteRenderProps, type RouterScreenAnimation, type RouterSplitPane, type RouterSplitViewProps, type RouterSplitViewSlotProps, type RouterTabBarTab, } from './Router';
|
|
2
2
|
export type { RouterShellMode } from './types';
|
|
3
3
|
export type { RouterOverlayLayout } from './types';
|
|
4
|
-
export { Modal, ModalFrame } from './components';
|
|
4
|
+
export { Modal, ModalFrame, Sheet, SheetFrame, useModalSwipeTarget, useSheetDragEngine, sheetDragStartsInInteractiveControl, sheetScrollAtTop, type SheetDragUpdate, } from './components';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EACL,KAAK,EACL,UAAU,EACV,KAAK,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mCAAmC,EACnC,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -35,6 +35,14 @@ var SHEET_DRAG_START_DISTANCE = 2;
|
|
|
35
35
|
function sheetScrollAtTop(el) {
|
|
36
36
|
return !el || el.scrollTop <= SHEET_DRAG_EPS;
|
|
37
37
|
}
|
|
38
|
+
function sheetDragStartsInInteractiveControl(target) {
|
|
39
|
+
if (!(target instanceof Element)) return false;
|
|
40
|
+
return Boolean(
|
|
41
|
+
target.closest(
|
|
42
|
+
'button,a,input,textarea,select,[role="button"],[data-sheet-drag-ignore="true"]'
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
}
|
|
38
46
|
function sheetDragStartsInTextInput(target) {
|
|
39
47
|
if (!(target instanceof Element)) return false;
|
|
40
48
|
return Boolean(
|
|
@@ -643,6 +651,8 @@ function SheetFrame({
|
|
|
643
651
|
const disableDismiss = options?.disableDismiss ?? false;
|
|
644
652
|
const customRequestClose = options?.onRequestClose;
|
|
645
653
|
const variant = options?.variant ?? "detached";
|
|
654
|
+
const presentation = options?.presentation ?? "content";
|
|
655
|
+
const fullscreen = presentation === "fullscreen";
|
|
646
656
|
const requestClose = useCallback(() => {
|
|
647
657
|
if (disableDismiss) return;
|
|
648
658
|
if (customRequestClose) {
|
|
@@ -657,12 +667,34 @@ function SheetFrame({
|
|
|
657
667
|
close: requestClose,
|
|
658
668
|
canClose: !disableDismiss,
|
|
659
669
|
variant,
|
|
670
|
+
presentation,
|
|
660
671
|
setOptions
|
|
661
672
|
}),
|
|
662
|
-
[
|
|
673
|
+
[
|
|
674
|
+
requestClose,
|
|
675
|
+
disableDismiss,
|
|
676
|
+
presentation,
|
|
677
|
+
setScrollElement,
|
|
678
|
+
setOptions,
|
|
679
|
+
variant
|
|
680
|
+
]
|
|
663
681
|
);
|
|
664
682
|
const surfaceStyle = useMemo(
|
|
665
|
-
() =>
|
|
683
|
+
() => fullscreen ? {
|
|
684
|
+
backgroundColor: "var(--router-bg)",
|
|
685
|
+
borderRadius: "33px 33px 0 0",
|
|
686
|
+
boxShadow: "var(--router-card-shadow)",
|
|
687
|
+
color: "var(--router-text)",
|
|
688
|
+
overflow: "hidden",
|
|
689
|
+
bottom: 0,
|
|
690
|
+
left: 0,
|
|
691
|
+
right: 0,
|
|
692
|
+
width: "100%",
|
|
693
|
+
maxWidth: "var(--router-container)",
|
|
694
|
+
height: "calc(100dvh - env(safe-area-inset-top, 0px))",
|
|
695
|
+
maxHeight: "none",
|
|
696
|
+
marginInline: "auto"
|
|
697
|
+
} : variant === "detached" ? {
|
|
666
698
|
backgroundColor: "var(--router-bg)",
|
|
667
699
|
borderRadius: "28px 28px 32px 32px",
|
|
668
700
|
boxShadow: "var(--router-card-shadow)",
|
|
@@ -690,7 +722,7 @@ function SheetFrame({
|
|
|
690
722
|
bottom: 0,
|
|
691
723
|
maxHeight: "calc(100dvh - env(safe-area-inset-top, 0px))"
|
|
692
724
|
},
|
|
693
|
-
[variant]
|
|
725
|
+
[fullscreen, variant]
|
|
694
726
|
);
|
|
695
727
|
const backdropStyle = useMemo(
|
|
696
728
|
() => shell === "desktop-fullscreen" ? {
|
|
@@ -721,11 +753,12 @@ function SheetFrame({
|
|
|
721
753
|
surfaceClassName: "router-sheet-surface",
|
|
722
754
|
surfaceStyle,
|
|
723
755
|
scrollElement,
|
|
756
|
+
closeTarget: fullscreen ? "viewport" : "surface",
|
|
724
757
|
children: /* @__PURE__ */ jsx(
|
|
725
758
|
"div",
|
|
726
759
|
{
|
|
727
760
|
ref: setFrameScrollElement,
|
|
728
|
-
className:
|
|
761
|
+
className: `router-scroll router-sheet-frame-scroll${fullscreen ? " router-sheet-frame-scroll--fullscreen" : ""}`,
|
|
729
762
|
children
|
|
730
763
|
}
|
|
731
764
|
)
|
|
@@ -736,14 +769,27 @@ function SheetRoot({
|
|
|
736
769
|
children,
|
|
737
770
|
disableDismiss,
|
|
738
771
|
onRequestClose,
|
|
739
|
-
variant = "detached"
|
|
772
|
+
variant = "detached",
|
|
773
|
+
presentation = "content"
|
|
740
774
|
}) {
|
|
741
775
|
const { setOptions } = useSheetContext();
|
|
742
776
|
const contentKey = useOverlayContentKey();
|
|
743
777
|
useLayoutEffect(() => {
|
|
744
|
-
setOptions(contentKey, {
|
|
778
|
+
setOptions(contentKey, {
|
|
779
|
+
disableDismiss,
|
|
780
|
+
onRequestClose,
|
|
781
|
+
variant,
|
|
782
|
+
presentation
|
|
783
|
+
});
|
|
745
784
|
return () => setOptions(contentKey, null);
|
|
746
|
-
}, [
|
|
785
|
+
}, [
|
|
786
|
+
contentKey,
|
|
787
|
+
disableDismiss,
|
|
788
|
+
onRequestClose,
|
|
789
|
+
presentation,
|
|
790
|
+
setOptions,
|
|
791
|
+
variant
|
|
792
|
+
]);
|
|
747
793
|
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
748
794
|
}
|
|
749
795
|
function SheetHeader({
|
|
@@ -754,8 +800,9 @@ function SheetHeader({
|
|
|
754
800
|
sticky = true,
|
|
755
801
|
align = "start"
|
|
756
802
|
}) {
|
|
757
|
-
const { close, canClose } = useSheetContext();
|
|
758
|
-
const
|
|
803
|
+
const { close, canClose, presentation } = useSheetContext();
|
|
804
|
+
const headerBaseClassName = presentation === "fullscreen" ? "router-modal-header" : "router-sheet-header";
|
|
805
|
+
const headerClassName = `${headerBaseClassName}${sticky ? ` ${headerBaseClassName}--sticky` : ""}`;
|
|
759
806
|
const titleClassName = `router-sheet-title${align === "center" ? " router-sheet-title--center" : ""}`;
|
|
760
807
|
return /* @__PURE__ */ jsxs("div", { className: headerClassName, children: [
|
|
761
808
|
leftAction != null && /* @__PURE__ */ jsx("div", { className: "router-sheet-header-side", children: leftAction }),
|
|
@@ -795,7 +842,7 @@ function SheetFooter({ children, className }) {
|
|
|
795
842
|
}
|
|
796
843
|
);
|
|
797
844
|
}
|
|
798
|
-
Object.assign(SheetRoot, {
|
|
845
|
+
var Sheet = Object.assign(SheetRoot, {
|
|
799
846
|
Header: SheetHeader,
|
|
800
847
|
Content: SheetContent,
|
|
801
848
|
ScrollView: SheetScrollView,
|
|
@@ -3644,6 +3691,6 @@ var Router = Object.assign(RouterRoot, {
|
|
|
3644
3691
|
Protected: RouterProtected
|
|
3645
3692
|
});
|
|
3646
3693
|
|
|
3647
|
-
export { Modal, ModalFrame, Router, useCurrentModal, useCurrentRoute, useDrawer, useHistoryState, useParams, useRoute, useRouter, useSearchParams };
|
|
3694
|
+
export { Modal, ModalFrame, Router, Sheet, SheetFrame, sheetDragStartsInInteractiveControl, sheetScrollAtTop, useCurrentModal, useCurrentRoute, useDrawer, useHistoryState, useModalSwipeTarget, useParams, useRoute, useRouter, useSearchParams, useSheetDragEngine };
|
|
3648
3695
|
//# sourceMappingURL=index.js.map
|
|
3649
3696
|
//# sourceMappingURL=index.js.map
|