@niibase/bottom-sheet-manager 1.1.0 → 1.3.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 (63) hide show
  1. package/README.md +372 -38
  2. package/lib/commonjs/events.js +100 -15
  3. package/lib/commonjs/events.js.map +1 -1
  4. package/lib/commonjs/index.js +7 -0
  5. package/lib/commonjs/index.js.map +1 -1
  6. package/lib/commonjs/manager.js +107 -29
  7. package/lib/commonjs/manager.js.map +1 -1
  8. package/lib/commonjs/provider.js +69 -28
  9. package/lib/commonjs/provider.js.map +1 -1
  10. package/lib/commonjs/router/index.js +50 -21
  11. package/lib/commonjs/router/index.js.map +1 -1
  12. package/lib/commonjs/router/router.js +137 -12
  13. package/lib/commonjs/router/router.js.map +1 -1
  14. package/lib/commonjs/router/view.js +194 -84
  15. package/lib/commonjs/router/view.js.map +1 -1
  16. package/lib/commonjs/sheet.js +125 -76
  17. package/lib/commonjs/sheet.js.map +1 -1
  18. package/lib/module/events.js +100 -15
  19. package/lib/module/events.js.map +1 -1
  20. package/lib/module/index.js +1 -1
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/module/manager.js +108 -29
  23. package/lib/module/manager.js.map +1 -1
  24. package/lib/module/provider.js +65 -25
  25. package/lib/module/provider.js.map +1 -1
  26. package/lib/module/router/index.js +34 -18
  27. package/lib/module/router/index.js.map +1 -1
  28. package/lib/module/router/router.js +135 -11
  29. package/lib/module/router/router.js.map +1 -1
  30. package/lib/module/router/view.js +194 -84
  31. package/lib/module/router/view.js.map +1 -1
  32. package/lib/module/sheet.js +127 -78
  33. package/lib/module/sheet.js.map +1 -1
  34. package/lib/typescript/events.d.ts +46 -12
  35. package/lib/typescript/events.d.ts.map +1 -1
  36. package/lib/typescript/index.d.ts +1 -1
  37. package/lib/typescript/index.d.ts.map +1 -1
  38. package/lib/typescript/manager.d.ts +57 -7
  39. package/lib/typescript/manager.d.ts.map +1 -1
  40. package/lib/typescript/provider.d.ts +22 -3
  41. package/lib/typescript/provider.d.ts.map +1 -1
  42. package/lib/typescript/router/index.d.ts +33 -17
  43. package/lib/typescript/router/index.d.ts.map +1 -1
  44. package/lib/typescript/router/router.d.ts +44 -5
  45. package/lib/typescript/router/router.d.ts.map +1 -1
  46. package/lib/typescript/router/types.d.ts +113 -17
  47. package/lib/typescript/router/types.d.ts.map +1 -1
  48. package/lib/typescript/router/view.d.ts +1 -1
  49. package/lib/typescript/router/view.d.ts.map +1 -1
  50. package/lib/typescript/sheet.d.ts.map +1 -1
  51. package/lib/typescript/types.d.ts +27 -12
  52. package/lib/typescript/types.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/src/events.ts +118 -27
  55. package/src/index.ts +6 -5
  56. package/src/manager.ts +156 -33
  57. package/src/provider.tsx +98 -44
  58. package/src/router/index.tsx +38 -31
  59. package/src/router/router.ts +184 -15
  60. package/src/router/types.ts +119 -22
  61. package/src/router/view.tsx +252 -132
  62. package/src/sheet.tsx +176 -95
  63. package/src/types.ts +144 -129
@@ -1,20 +1,42 @@
1
- import { NavigatorTypeBagBase, ParamListBase, StaticConfig, TypedNavigator } from "@react-navigation/native";
2
- import React from "react";
1
+ import { type NavigatorTypeBagBase, type ParamListBase, type StaticConfig, type TypedNavigator } from "@react-navigation/native";
2
+ import * as React from "react";
3
3
  import type { BottomSheetNavigationEventMap, BottomSheetNavigationOptions, BottomSheetNavigationProp, BottomSheetNavigationState, BottomSheetNavigatorProps } from "./types";
4
- declare function BottomSheetNavigator({ id, children, screenListeners, screenOptions, ...rest }: BottomSheetNavigatorProps): React.JSX.Element;
4
+ declare function BottomSheetNavigator({ id, children, screenListeners, screenOptions, initialRouteName, ...rest }: BottomSheetNavigatorProps): React.JSX.Element;
5
5
  /**
6
- * To use BottomSheetNavigator with expo-router, the first screen should be your app content
7
- * and add a border radius of 24px to the root view if want to snap to 100%.
6
+ * Creates a bottom sheet navigator that renders screens as bottom sheet modals.
7
+ *
8
+ * The first screen in the navigator is rendered as the main content,
9
+ * and subsequent screens are rendered as bottom sheet modals on top.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * // With React Navigation
14
+ * const { Navigator, Screen } = createBottomSheetNavigator();
15
+ *
16
+ * function App() {
17
+ * return (
18
+ * <Navigator>
19
+ * <Screen name="Home" component={HomeScreen} />
20
+ * <Screen
21
+ * name="Details"
22
+ * component={DetailsSheet}
23
+ * options={{ snapPoints: ['50%', '100%'] }}
24
+ * />
25
+ * </Navigator>
26
+ * );
27
+ * }
28
+ * ```
8
29
  *
9
30
  * @example
10
31
  * ```tsx
32
+ * // With Expo Router
33
+ * import { Slot, withLayoutContext } from "expo-router";
11
34
  * import {
12
35
  * createBottomSheetNavigator,
13
36
  * BottomSheetNavigationOptions,
14
37
  * BottomSheetNavigationEventMap,
15
38
  * BottomSheetNavigationState,
16
- * } from "@repo/bottom-sheet";
17
- * import { Slot, withLayoutContext } from "expo-router";
39
+ * } from "@niibase/bottom-sheet-manager";
18
40
  *
19
41
  * const { Navigator } = createBottomSheetNavigator();
20
42
  *
@@ -30,17 +52,10 @@ declare function BottomSheetNavigator({ id, children, screenListeners, screenOpt
30
52
  * };
31
53
  *
32
54
  * export default function Layout() {
55
+ * // SSR guard - navigator doesn't work on server
33
56
  * if (typeof window === "undefined") return <Slot />;
34
- * return (
35
- * <BottomSheet
36
- * screenOptions={
37
- * {
38
- * // API Reference: `@repo/design/bottom-sheet/types.ts`
39
- * // And: https://gorhom.github.io/react-native-bottom-sheet/modal/props/
40
- * }
41
- * }
42
- *. />
43
- * );
57
+ *
58
+ * return <BottomSheet />;
44
59
  * }
45
60
  * ```
46
61
  */
@@ -56,4 +71,5 @@ export declare function createBottomSheetNavigator<const ParamList extends Param
56
71
  Navigator: typeof BottomSheetNavigator;
57
72
  }, const Config extends StaticConfig<TypeBag> = StaticConfig<TypeBag>>(config?: Config): TypedNavigator<TypeBag, Config>;
58
73
  export * from "./types";
74
+ export { BottomSheetActions, useBottomSheetNavigation } from "./router";
59
75
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC5B,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAGjB,iBAAS,oBAAoB,CAAC,EAC5B,EAAE,EACF,QAAQ,EACR,eAAe,EACf,aAAa,EACb,GAAG,IAAI,EACR,EAAE,yBAAyB,qBAwB3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EAExD,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG;IAE3C,SAAS,EAAE,SAAS,CAAC;IAErB,WAAW,EAAE,WAAW,CAAC;IAEzB,KAAK,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAE7C,aAAa,EAAE,4BAA4B,CAAC;IAE5C,QAAQ,EAAE,6BAA6B,CAAC;IAExC,cAAc,EAAE;SACb,SAAS,IAAI,MAAM,SAAS,GAAG,yBAAyB,CACvD,SAAS,EACT,SAAS,EACT,WAAW,CACZ;KACF,CAAC;IAEF,SAAS,EAAE,OAAO,oBAAoB,CAAC;CACxC,EAED,KAAK,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAClE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAIlD;AAED,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC5B,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAIjB,iBAAS,oBAAoB,CAAC,EAC5B,EAAE,EACF,QAAQ,EACR,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,GAAG,IAAI,EACR,EAAE,yBAAyB,qBAyB3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACxD,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG;IAC3C,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAC7C,aAAa,EAAE,4BAA4B,CAAC;IAC5C,QAAQ,EAAE,6BAA6B,CAAC;IACxC,cAAc,EAAE;SACb,SAAS,IAAI,MAAM,SAAS,GAAG,yBAAyB,CACvD,SAAS,EACT,SAAS,EACT,WAAW,CACZ;KACF,CAAC;IACF,SAAS,EAAE,OAAO,oBAAoB,CAAC;CACxC,EACD,KAAK,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAClE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAElD;AAED,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
@@ -1,14 +1,33 @@
1
- import { ParamListBase, Router, StackActionType, StackRouterOptions } from "@react-navigation/native";
2
- import type { BottomSheetNavigationState } from "./types";
1
+ import { type CommonActions, type ParamListBase, type Router, type StackActionType, type StackRouterOptions } from "@react-navigation/native";
2
+ import type { BottomSheetNavigationProp, BottomSheetNavigationState } from "./types";
3
3
  export type BottomSheetRouterOptions = StackRouterOptions;
4
- export type BottomSheetActionType = StackActionType | {
4
+ export type BottomSheetActionType = StackActionType | ReturnType<typeof CommonActions.goBack> | {
5
5
  type: "SNAP_TO";
6
6
  index: number;
7
7
  source?: string;
8
8
  target?: string;
9
+ } | {
10
+ type: "DISMISS";
11
+ source?: string;
12
+ target?: string;
13
+ } | {
14
+ type: "REMOVE";
15
+ source?: string;
16
+ target?: string;
9
17
  };
10
18
  export declare const BottomSheetActions: {
11
- snapTo(index: number): BottomSheetActionType;
19
+ /**
20
+ * Snap the bottom sheet to a specific index.
21
+ */
22
+ snapTo: (index: number) => BottomSheetActionType;
23
+ /**
24
+ * Dismiss the current bottom sheet.
25
+ */
26
+ dismiss: () => BottomSheetActionType;
27
+ /**
28
+ * Remove the sheet from navigation state after dismiss animation completes.
29
+ */
30
+ remove: () => BottomSheetActionType;
12
31
  replace(name: string, params?: object): {
13
32
  readonly type: "REPLACE";
14
33
  readonly payload: {
@@ -43,5 +62,25 @@ export declare const BottomSheetActions: {
43
62
  };
44
63
  };
45
64
  };
46
- export declare function BottomSheetRouter(routerOptions: StackRouterOptions): Router<BottomSheetNavigationState<ParamListBase>, BottomSheetActionType>;
65
+ export declare const BottomSheetRouter: (routerOptions: StackRouterOptions) => Router<BottomSheetNavigationState<ParamListBase>, BottomSheetActionType>;
66
+ /**
67
+ * Hook to access BottomSheet navigation with the snapTo helper.
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * function MySheet() {
72
+ * const navigation = useBottomSheetNavigation();
73
+ *
74
+ * // Snap to a specific index
75
+ * const handleExpand = () => {
76
+ * navigation.snapTo(1); // Snap to second index
77
+ * };
78
+ *
79
+ * return (
80
+ * <Button title="Expand" onPress={handleExpand} />
81
+ * );
82
+ * }
83
+ * ```
84
+ */
85
+ export declare const useBottomSheetNavigation: <T extends ParamListBase = ParamListBase>() => BottomSheetNavigationProp<T>;
47
86
  //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/router/router.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,MAAM,EAEN,eAAe,EAEf,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAC3B,eAAe,GACf;IACI,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAER,eAAO,MAAM,kBAAkB;kBAEb,MAAM,GAAG,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;aAqEu2B,CAAC;;;;;;;;;CAlEv5B,CAAC;AAEF,wBAAgB,iBAAiB,CAC7B,aAAa,EAAE,kBAAkB,GAClC,MAAM,CAAC,0BAA0B,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC,CA6D1E"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/router/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,eAAe,EACpB,KAAK,kBAAkB,EAC1B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAErF,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAC3B,eAAe,GACf,UAAU,CAAC,OAAO,aAAa,CAAC,MAAM,CAAC,GACvC;IACI,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,GACD;IACI,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,GACD;IACI,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAER,eAAO,MAAM,kBAAkB;IAE3B;;OAEG;oBACa,MAAM,KAAG,qBAAqB;IAC9C;;OAEG;mBACU,qBAAqB;IAClC;;OAEG;kBACS,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;aA2Eb,CAAhB;;;;;;;;;CA1EP,CAAC;AAmCF,eAAO,MAAM,iBAAiB,GAC1B,eAAe,kBAAkB,KAClC,MAAM,CAAC,0BAA0B,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAwJzE,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,wBAAwB,GACjC,CAAC,SAAS,aAAa,GAAG,aAAa,OACtC,yBAAyB,CAAC,CAAC,CAAkD,CAAC"}
@@ -1,45 +1,141 @@
1
- import type { BottomSheetModalProps } from "@gorhom/bottom-sheet";
2
1
  import type { DefaultNavigatorOptions, Descriptor, NavigationHelpers, NavigationProp, NavigationState, ParamListBase, RouteProp, StackActionHelpers } from "@react-navigation/native";
3
- export type BottomSheetNavigationEventMap = {};
4
- export type BottomSheetNavigationState<ParamList extends ParamListBase> = Omit<NavigationState<ParamList>, "routes"> & {
2
+ import type { BottomSheetModalProps } from "@gorhom/bottom-sheet";
3
+ /**
4
+ * Navigation events emitted by the bottom sheet navigator.
5
+ */
6
+ export type BottomSheetNavigationEventMap = {
7
+ /**
8
+ * Event emitted when a sheet is presented.
9
+ */
10
+ sheetPresent: {
11
+ data: undefined;
12
+ };
13
+ /**
14
+ * Event emitted when a sheet is dismissed.
15
+ */
16
+ sheetDismiss: {
17
+ data: undefined;
18
+ };
19
+ };
20
+ /**
21
+ * Extended route type with bottom sheet specific properties.
22
+ */
23
+ export type BottomSheetRoute<ParamList extends ParamListBase = ParamListBase> = NavigationState<ParamList>["routes"][number] & {
24
+ /**
25
+ * The snap point index the sheet should animate to.
26
+ */
27
+ snapToIndex?: number | null;
28
+ /**
29
+ * Key to track snap changes for re-rendering.
30
+ */
31
+ snapToKey?: number;
32
+ /**
33
+ * Whether this route is in the process of being closed.
34
+ */
35
+ closing?: boolean;
36
+ };
37
+ /**
38
+ * Navigation state type for the bottom sheet navigator.
39
+ */
40
+ export type BottomSheetNavigationState<ParamList extends ParamListBase> = Omit<NavigationState<ParamList>, "routes" | "type"> & {
5
41
  type: "bottom-sheet";
6
- routes: (NavigationState<ParamList>["routes"][number] & {
7
- snapToIndex?: number | null;
8
- })[];
42
+ routes: BottomSheetRoute<ParamList>[];
9
43
  };
44
+ /**
45
+ * Action helpers available on the navigation object.
46
+ */
10
47
  export type BottomSheetActionHelpers<ParamList extends ParamListBase> = StackActionHelpers<ParamList> & {
11
48
  /**
12
- * Snap the drawer to a point.
49
+ * Snap the sheet to a specific point.
50
+ * @param index The snap point index to snap to.
13
51
  */
14
- snapTo(index?: number): void;
52
+ snapTo(index: number): void;
53
+ /**
54
+ * Dismiss the current sheet.
55
+ */
56
+ dismiss(): void;
15
57
  };
58
+ /**
59
+ * Navigation prop type for screens in the bottom sheet navigator.
60
+ */
16
61
  export type BottomSheetNavigationProp<ParamList extends ParamListBase, RouteName extends keyof ParamList = string, NavigatorID extends string | undefined = undefined> = NavigationProp<ParamList, RouteName, NavigatorID, BottomSheetNavigationState<ParamList>, BottomSheetNavigationOptions, BottomSheetNavigationEventMap> & BottomSheetActionHelpers<ParamList>;
62
+ /**
63
+ * Props available to screen components in the bottom sheet navigator.
64
+ */
17
65
  export type BottomSheetScreenProps<ParamList extends ParamListBase, RouteName extends keyof ParamList = string, NavigatorID extends string | undefined = undefined> = {
18
66
  navigation: BottomSheetNavigationProp<ParamList, RouteName, NavigatorID>;
19
67
  route: RouteProp<ParamList, RouteName>;
20
68
  };
21
- export type BottomSheetNavigationHelpers = NavigationHelpers<ParamListBase, BottomSheetNavigationEventMap>;
22
- export type BottomSheetNavigationConfig = {};
23
- export type BottomSheetNavigationOptions = Omit<BottomSheetModalProps, "containerHeight" | "snapPoints" | "gestureEventsHandlersHook" | "animatedPosition" | "animatedIndex" | "topInset" | "onChange" | "onAnimate" | "onClose" | "children" | "$modal" | "waitFor" | "simultaneousHandlers"> & {
69
+ /**
70
+ * Navigation helpers type for the bottom sheet navigator.
71
+ */
72
+ export type BottomSheetNavigationHelpers = NavigationHelpers<ParamListBase, BottomSheetNavigationEventMap> & BottomSheetActionHelpers<ParamListBase>;
73
+ /**
74
+ * Configuration options for the bottom sheet navigator.
75
+ */
76
+ export type BottomSheetNavigationConfig = {
24
77
  /**
25
- * Points for the bottom sheet to snap to. It accepts array of number, string or mix.
26
- * String values should be a percentage.
78
+ * Whether to detach inactive sheets from the view hierarchy.
79
+ * @default false
80
+ */
81
+ detachInactiveScreens?: boolean;
82
+ };
83
+ /**
84
+ * Screen options available for bottom sheet screens.
85
+ */
86
+ export type BottomSheetNavigationOptions = Omit<BottomSheetModalProps, "containerHeight" | "snapPoints" | "gestureEventsHandlersHook" | "animatedPosition" | "onChange" | "onClose" | "children" | "$modal" | "waitFor" | "simultaneousHandlers"> & {
87
+ /**
88
+ * Points for the bottom sheet to snap to.
89
+ * Accepts an array of numbers (pixels) or strings (percentages).
90
+ *
27
91
  * @example
28
92
  * snapPoints={[200, 500]}
29
- * snapPoints={[200, '%50']}
30
- * snapPoints={['%100']}
31
- * @type Array<string | number>
93
+ * snapPoints={[200, '50%']}
94
+ * snapPoints={['100%']}
95
+ *
96
+ * @default ['66%']
32
97
  */
33
98
  snapPoints?: Array<string | number>;
34
99
  /**
35
- * When `true`, tapping on the backdrop will not dismiss the modal.
100
+ * When `true`, tapping on the backdrop will not dismiss the sheet.
101
+ * @default false
102
+ */
103
+ clickThrough?: boolean;
104
+ /**
105
+ * Whether the bottom sheet is an iOS 18 modal sheet type of animation.
106
+ * When enabled at snap point 90%, the content behind the sheet scales down and gets a
107
+ * border radius, similar to iOS 18 system sheets.
36
108
  * @default false
37
109
  */
110
+ iosModalSheetTypeOfAnimation?: boolean;
111
+ /**
112
+ * Opacity of the backdrop overlay.
113
+ * @default 0.45
114
+ */
115
+ opacity?: number;
116
+ };
117
+ export type BottomSheetModalScreenProps = Omit<BottomSheetModalProps, "onDismiss"> & {
118
+ route: BottomSheetRoute;
119
+ navigation: BottomSheetNavigationHelpers;
38
120
  clickThrough?: boolean;
121
+ opacity?: number;
122
+ /**
123
+ * Callback when sheet animation changes.
124
+ */
125
+ onSheetAnimate?: (from: number, to: number) => void;
39
126
  };
127
+ /**
128
+ * Props for the bottom sheet navigator component.
129
+ */
40
130
  export type BottomSheetNavigatorProps = DefaultNavigatorOptions<ParamListBase, undefined, // or your ID if you want a named ID, e.g. 'BottomSheetNavigator'
41
131
  BottomSheetNavigationState<ParamListBase>, BottomSheetNavigationOptions, BottomSheetNavigationEventMap, BottomSheetNavigationHelpers> & BottomSheetNavigationConfig;
132
+ /**
133
+ * Descriptor type for bottom sheet screens.
134
+ */
42
135
  export type BottomSheetDescriptor = Descriptor<BottomSheetNavigationOptions, BottomSheetNavigationProp<ParamListBase>, RouteProp<ParamListBase>>;
136
+ /**
137
+ * Map of route keys to their descriptors.
138
+ */
43
139
  export type BottomSheetDescriptorMap = {
44
140
  [key: string]: BottomSheetDescriptor;
45
141
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/router/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EACR,uBAAuB,EACvB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,aAAa,EACb,SAAS,EACT,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAE/C,MAAM,MAAM,0BAA0B,CAAC,SAAS,SAAS,aAAa,IAAI,IAAI,CAC1E,eAAe,CAAC,SAAS,CAAC,EAC1B,QAAQ,CACX,GAAG;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG;QACpD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,SAAS,SAAS,aAAa,IAChE,kBAAkB,CAAC,SAAS,CAAC,GAAG;IAC5B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEN,MAAM,MAAM,yBAAyB,CACjC,SAAS,SAAS,aAAa,EAC/B,SAAS,SAAS,MAAM,SAAS,GAAG,MAAM,EAC1C,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,IAClD,cAAc,CACd,SAAS,EACT,SAAS,EACT,WAAW,EACX,0BAA0B,CAAC,SAAS,CAAC,EACrC,4BAA4B,EAC5B,6BAA6B,CAChC,GACG,wBAAwB,CAAC,SAAS,CAAC,CAAC;AAExC,MAAM,MAAM,sBAAsB,CAC9B,SAAS,SAAS,aAAa,EAC/B,SAAS,SAAS,MAAM,SAAS,GAAG,MAAM,EAC1C,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,IAClD;IACA,UAAU,EAAE,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACzE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,iBAAiB,CACxD,aAAa,EACb,6BAA6B,CAChC,CAAC;AAGF,MAAM,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE7C,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC3C,qBAAqB,EAEnB,iBAAiB,GACjB,YAAY,GACZ,2BAA2B,GAC3B,kBAAkB,GAClB,eAAe,GACf,UAAU,GACV,UAAU,GACV,WAAW,GACX,SAAS,GACT,UAAU,GACV,QAAQ,GACR,SAAS,GACT,sBAAsB,CAC3B,GAAG;IACA;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAC3D,aAAa,EACb,SAAS,EAAE,iEAAiE;AAC5E,0BAA0B,CAAC,aAAa,CAAC,EACzC,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,CAC/B,GACG,2BAA2B,CAAC;AAEhC,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAC1C,4BAA4B,EAC5B,yBAAyB,CAAC,aAAa,CAAC,EACxC,SAAS,CAAC,aAAa,CAAC,CAC3B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAAC;CACxC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/router/types.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,6 @@ type Props = BottomSheetNavigationConfig & {
6
6
  navigation: BottomSheetNavigationHelpers;
7
7
  descriptors: BottomSheetDescriptorMap;
8
8
  };
9
- export declare function BottomSheetView({ state, descriptors }: Props): React.JSX.Element | null;
9
+ export declare function BottomSheetView({ state, navigation, descriptors }: Props): React.JSX.Element | null;
10
10
  export {};
11
11
  //# sourceMappingURL=view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/router/view.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAY,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAE5B,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAgGjB,KAAK,KAAK,GAAG,2BAA2B,GAAG;IACzC,KAAK,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACjD,UAAU,EAAE,4BAA4B,CAAC;IACzC,WAAW,EAAE,wBAAwB,CAAC;CACvC,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,4BAuI5D"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/router/view.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAY,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAEV,wBAAwB,EAExB,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAE3B,MAAM,SAAS,CAAC;AAyNjB,KAAK,KAAK,GAAG,2BAA2B,GAAG;IACzC,KAAK,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACjD,UAAU,EAAE,4BAA4B,CAAC;IACzC,WAAW,EAAE,wBAAwB,CAAC;CACvC,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,KAAK,4BAmIxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../src/sheet.tsx"],"names":[],"mappings":"AAAA,OAAsB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,EAC1B,iBAAiB,EAEjB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAgB9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI1E,UAAU,aACR,SAAQ,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACpF,CAAC,EAAE,SAAS,QAAQ,EAClB,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,GACrE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAGrB,IAAI,EAAE,OAAO,eAAe,CAAC;IAC7B,UAAU,EAAE,OAAO,qBAAqB,CAAC;IACzC,QAAQ,EAAE,OAAO,mBAAmB,CAAC;IACrC,WAAW,EAAE,OAAO,sBAAsB,CAAC;IAC3C,eAAe,EAAE,OAAO,0BAA0B,CAAC;IACnD,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,eAAe,EAAE,OAAO,0BAA0B,CAAC;IACnD,QAAQ,EAAE,OAAO,mBAAmB,CAAC;IACrC,SAAS,EAAE,OAAO,oBAAoB,CAAC;CACxC;AAyQD,QAAA,MAAM,WAAW,EAAuC,aAAa,CAAC;AA2BtE,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../src/sheet.tsx"],"names":[],"mappings":"AAAA,OAAsB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,EAC1B,iBAAiB,EAEjB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAgB9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,QAAQ,EAAiB,MAAM,SAAS,CAAC;AAIzF,UAAU,aACR,SAAQ,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACpF,CAAC,EAAE,SAAS,QAAQ,EAClB,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,GACrE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAGrB,IAAI,EAAE,OAAO,eAAe,CAAC;IAC7B,UAAU,EAAE,OAAO,qBAAqB,CAAC;IACzC,QAAQ,EAAE,OAAO,mBAAmB,CAAC;IACrC,WAAW,EAAE,OAAO,sBAAsB,CAAC;IAC3C,eAAe,EAAE,OAAO,0BAA0B,CAAC;IACnD,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,eAAe,EAAE,OAAO,0BAA0B,CAAC;IACnD,QAAQ,EAAE,OAAO,mBAAmB,CAAC;IACrC,SAAS,EAAE,OAAO,oBAAoB,CAAC;CACxC;AAsWD,QAAA,MAAM,WAAW,EAAuC,aAAa,CAAC;AActE,eAAe,WAAW,CAAC"}
@@ -17,6 +17,18 @@ export interface SheetDefinition<Payload = never, ReturnValue = never> {
17
17
  payload: Payload;
18
18
  returnValue: ReturnValue;
19
19
  }
20
+ /**
21
+ * Defines how sheets behave when a new sheet is opened.
22
+ *
23
+ * - `switch`: Closes current sheet and shows new one. Previous sheet is
24
+ * restored when new one closes.
25
+ *
26
+ * - `replace`: Closes current sheet and opens new one. Previous sheet is
27
+ * removed from stack (not restored on close).
28
+ *
29
+ * - `push`: (experimental) Stacks new sheet on top. Previous sheet remains visible underneath.
30
+ */
31
+ export type StackBehavior = "switch" | "replace" | "push";
20
32
  export interface BottomSheetInstance<Id extends SheetIds = SheetIds> {
21
33
  /**
22
34
  * Close the bottom sheet.
@@ -64,7 +76,7 @@ export interface BottomSheetInstance<Id extends SheetIds = SheetIds> {
64
76
  */
65
77
  readonly snapToPosition: (position: string | number, animationConfigs?: AnimationConfigs) => void;
66
78
  }
67
- export type BottomSheetProps = Omit<RNBottomSheetProps, "children" | "onClose" | "animatedIndex" | "topInset"> & {
79
+ export type BottomSheetProps = Omit<RNBottomSheetProps, "children" | "onClose"> & {
68
80
  /**
69
81
  * ID of the `BottomSheet`.
70
82
  */
@@ -81,15 +93,16 @@ export type BottomSheetProps = Omit<RNBottomSheetProps, "children" | "onClose" |
81
93
  /**
82
94
  * Callback when the sheet close.
83
95
  *
84
- * @type () => void;
96
+ * @type () => any;
97
+ * @returns The data returned by the sheet to be returned when closed.
85
98
  */
86
- onClose?: (data?: any) => void;
99
+ onClose?: (data?: unknown) => unknown;
87
100
  /**
88
101
  * Event called before sheets is visible.
89
102
  * @param data Payload of the sheet if any.
90
103
  * @type () => void;
91
104
  */
92
- onBeforeShow?: (data?: any) => void;
105
+ onBeforeShow?: (data?: unknown) => void;
93
106
  /**
94
107
  * Can click through the sheet to the underlying view.
95
108
  * @default false
@@ -101,17 +114,19 @@ export type BottomSheetProps = Omit<RNBottomSheetProps, "children" | "onClose" |
101
114
  */
102
115
  opacity?: number;
103
116
  /**
104
- * Defines the stack behavior when modal mounts. (experimental)
117
+ * Defines the stack behavior when sheets are opened.
118
+ *
119
+ * - `switch`: (default) Dismisses the current sheet before showing the new one.
120
+ * - `replace`: Swaps the current sheet's content with smooth crossfade animation.
121
+ * - `push`: (experimental) Pushes new sheet on top, creating a navigable stack.
122
+ *
105
123
  * @default "switch"
106
124
  */
107
- stackBehavior?: "push" | "replace" | "switch";
108
- /**
109
- * Whether the bottom sheet edge to edge.
110
- * @default false
111
- */
112
- fullScreen?: boolean;
125
+ stackBehavior?: StackBehavior;
113
126
  /**
114
- * Whether the bottom sheet is an iOS modal sheet type of animation.
127
+ * Whether the bottom sheet is an iOS 18 modal sheet type of animation.
128
+ * When enabled at snap point 90%, the content behind the sheet scales down and gets a
129
+ * border radius, similar to iOS 18 system sheets.
115
130
  * @default false
116
131
  */
117
132
  iosModalSheetTypeOfAnimation?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@niibase/bottom-sheet-manager",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "A bottom sheet manager for react-native based on @gorhom/bottom-sheet",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/events.ts CHANGED
@@ -1,40 +1,131 @@
1
- import {
2
- DeviceEventEmitter,
3
- NativeAppEventEmitter,
4
- NativeEventEmitter,
5
- Platform,
6
- } from "react-native";
7
-
8
- /* eslint-disable curly */
9
- export type EventHandler = (...args: any[]) => void;
10
- export type EventHandlerSubscription = {
11
- unsubscribe: () => void;
1
+ /**
2
+ * High-performance event manager using Maps for O(1) lookups.
3
+ * Replaces React Native's EventEmitter which has significant overhead.
4
+ */
5
+
6
+ export type EventHandler<T extends unknown[] = unknown[]> = (...args: T) => void;
7
+
8
+ export interface EventSubscription {
9
+ readonly unsubscribe: () => void;
10
+ }
11
+
12
+ type HandlerEntry = {
13
+ handler: EventHandler;
14
+ id: number;
12
15
  };
13
16
 
14
- export default class EventManager {
15
- _registry?: NativeEventEmitter;
16
- constructor() {
17
- this._registry = Platform.select({
18
- ios: NativeAppEventEmitter,
19
- android: DeviceEventEmitter,
20
- });
17
+ class EventManager {
18
+ private _handlers = new Map<string, HandlerEntry[]>();
19
+ private _nextId = 0;
20
+
21
+ /**
22
+ * Subscribe to an event with a handler function.
23
+ * Returns a subscription object with an unsubscribe method.
24
+ */
25
+ subscribe<T extends unknown[] = unknown[]>(
26
+ name: string,
27
+ handler: EventHandler<T>,
28
+ ): EventSubscription {
29
+ if (!name || typeof handler !== "function") {
30
+ throw new Error("Event name and handler function are required.");
31
+ }
32
+
33
+ const id = this._nextId++;
34
+ const entry: HandlerEntry = { handler: handler as EventHandler, id };
35
+
36
+ const handlers = this._handlers.get(name);
37
+ if (handlers) {
38
+ handlers.push(entry);
39
+ } else {
40
+ this._handlers.set(name, [entry]);
41
+ }
42
+
43
+ return {
44
+ unsubscribe: () => {
45
+ const currentHandlers = this._handlers.get(name);
46
+ if (currentHandlers) {
47
+ const index = currentHandlers.findIndex((h) => h.id === id);
48
+ if (index !== -1) {
49
+ currentHandlers.splice(index, 1);
50
+ if (currentHandlers.length === 0) {
51
+ this._handlers.delete(name);
52
+ }
53
+ }
54
+ }
55
+ },
56
+ };
21
57
  }
22
58
 
23
- subscribe(name: string, handler: EventHandler) {
24
- if (!name || !handler) throw new Error("name and handler are required.");
25
- const event = this._registry?.addListener(name, handler);
26
- return { unsubscribe: () => event?.remove() };
59
+ /**
60
+ * Publish an event with optional arguments.
61
+ * All subscribed handlers will be called synchronously.
62
+ */
63
+ publish<T extends unknown[] = unknown[]>(name: string, ...args: T): void {
64
+ const handlers = this._handlers.get(name);
65
+ if (!handlers || handlers.length === 0) return;
66
+
67
+ // Create a copy to avoid issues if handlers modify the list during iteration
68
+ const handlersSnapshot = handlers.slice();
69
+ for (let i = 0; i < handlersSnapshot.length; i++) {
70
+ handlersSnapshot[i].handler(...args);
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Publish an event asynchronously using microtasks for better performance.
76
+ * Useful when you don't need immediate execution.
77
+ */
78
+ publishAsync<T extends unknown[] = unknown[]>(name: string, ...args: T): void {
79
+ queueMicrotask(() => this.publish(name, ...args));
27
80
  }
28
81
 
29
- publish(name: string, ...args: any[]) {
30
- this._registry?.emit(name, ...args);
82
+ /**
83
+ * Check if an event has any subscribers.
84
+ */
85
+ hasSubscribers(name: string): boolean {
86
+ const handlers = this._handlers.get(name);
87
+ return !!handlers && handlers.length > 0;
31
88
  }
32
89
 
33
- remove(...names: string[]) {
34
- for (const eventType of names) {
35
- this._registry?.removeAllListeners(eventType);
90
+ /**
91
+ * Get the number of subscribers for an event.
92
+ */
93
+ subscriberCount(name: string): number {
94
+ return this._handlers.get(name)?.length ?? 0;
95
+ }
96
+
97
+ /**
98
+ * Remove all listeners for the specified event names.
99
+ */
100
+ remove(...names: string[]): void {
101
+ for (const name of names) {
102
+ this._handlers.delete(name);
36
103
  }
37
104
  }
105
+
106
+ /**
107
+ * Remove all event listeners.
108
+ */
109
+ clear(): void {
110
+ this._handlers.clear();
111
+ }
112
+
113
+ /**
114
+ * Subscribe to an event that will only fire once.
115
+ */
116
+ once<T extends unknown[] = unknown[]>(
117
+ name: string,
118
+ handler: EventHandler<T>,
119
+ ): EventSubscription {
120
+ const subscription = this.subscribe<T>(name, (...args) => {
121
+ subscription.unsubscribe();
122
+ handler(...args);
123
+ });
124
+ return subscription;
125
+ }
38
126
  }
39
127
 
128
+ // Singleton instance for global event management
40
129
  export const eventManager = new EventManager();
130
+
131
+ export default EventManager;
package/src/index.ts CHANGED
@@ -3,9 +3,10 @@ export { SheetManager } from "./manager";
3
3
  export * from "./router";
4
4
  export * from "./types";
5
5
  export {
6
- SheetProvider,
7
- useSheetPayload,
8
- useSheetRef,
9
- useOnSheet,
10
- registerSheet,
6
+ SheetProvider,
7
+ useSheetPayload,
8
+ useSheetRef,
9
+ useOnSheet,
10
+ useStackBehaviorContext,
11
+ registerSheet,
11
12
  } from "./provider";