@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 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, `vitest` with the `node`
46
- environment, some SSR pipelines — cannot resolve that import. Alias or stub
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 with per-tab stacks |
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;AA0B5C,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;CACxB;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,2CAkJjB;AAED,iBAAS,SAAS,CAAC,EACjB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,OAAoB,GACrB,EAAE,UAAU,2CAUZ;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,2CAuBlB;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"}
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
@@ -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,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
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
- [requestClose, disableDismiss, setScrollElement, setOptions, variant]
673
+ [
674
+ requestClose,
675
+ disableDismiss,
676
+ presentation,
677
+ setScrollElement,
678
+ setOptions,
679
+ variant
680
+ ]
663
681
  );
664
682
  const surfaceStyle = useMemo(
665
- () => variant === "detached" ? {
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: "router-scroll router-sheet-frame-scroll",
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, { disableDismiss, onRequestClose, variant });
778
+ setOptions(contentKey, {
779
+ disableDismiss,
780
+ onRequestClose,
781
+ variant,
782
+ presentation
783
+ });
745
784
  return () => setOptions(contentKey, null);
746
- }, [contentKey, disableDismiss, onRequestClose, setOptions, variant]);
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 headerClassName = `router-sheet-header${sticky ? " router-sheet-header--sticky" : ""}`;
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