@seed-design/lynx-react 0.6.2 → 0.7.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 (236) hide show
  1. package/lib/components/Accordion/Accordion.d.ts.map +1 -1
  2. package/lib/components/Accordion/Accordion.jsx +24 -14
  3. package/lib/components/ActionButton/ActionButton.d.ts +1 -1
  4. package/lib/components/ActionButton/ActionButton.d.ts.map +1 -1
  5. package/lib/components/ActionButton/ActionButton.jsx +12 -4
  6. package/lib/components/AppBar/AppBar.d.ts.map +1 -1
  7. package/lib/components/AppBar/AppBar.jsx +9 -8
  8. package/lib/components/Badge/Badge.d.ts.map +1 -1
  9. package/lib/components/Badge/Badge.jsx +2 -1
  10. package/lib/components/BottomSheet/BottomSheet.d.ts.map +1 -1
  11. package/lib/components/BottomSheet/BottomSheet.jsx +9 -9
  12. package/lib/components/Box/Box.d.ts.map +1 -1
  13. package/lib/components/Box/Box.jsx +2 -1
  14. package/lib/components/Callout/Callout.d.ts +2 -2
  15. package/lib/components/Callout/Callout.d.ts.map +1 -1
  16. package/lib/components/Callout/Callout.jsx +20 -10
  17. package/lib/components/Checkbox/Checkbox.d.ts +4 -2
  18. package/lib/components/Checkbox/Checkbox.d.ts.map +1 -1
  19. package/lib/components/Checkbox/Checkbox.jsx +33 -17
  20. package/lib/components/Chip/Chip.d.ts +1 -1
  21. package/lib/components/Chip/Chip.d.ts.map +1 -1
  22. package/lib/components/Chip/Chip.jsx +36 -16
  23. package/lib/components/Count/Count.d.ts +7 -0
  24. package/lib/components/Count/Count.d.ts.map +1 -0
  25. package/lib/components/Count/Count.jsx +19 -0
  26. package/lib/components/Count/index.d.ts +2 -0
  27. package/lib/components/Count/index.d.ts.map +1 -0
  28. package/lib/components/Divider/Divider.d.ts.map +1 -1
  29. package/lib/components/Divider/Divider.jsx +2 -1
  30. package/lib/components/Field/Field.d.ts.map +1 -1
  31. package/lib/components/Field/Field.jsx +11 -15
  32. package/lib/components/Icon/Icon.d.ts.map +1 -1
  33. package/lib/components/Icon/Icon.jsx +4 -3
  34. package/lib/components/InputButton/InputButton.d.ts +40 -0
  35. package/lib/components/InputButton/InputButton.d.ts.map +1 -0
  36. package/lib/components/InputButton/InputButton.jsx +118 -0
  37. package/lib/components/InputButton/InputButton.namespace.d.ts +2 -0
  38. package/lib/components/InputButton/InputButton.namespace.d.ts.map +1 -0
  39. package/lib/components/InputButton/InputButton.namespace.js +16 -0
  40. package/lib/components/InputButton/index.d.ts +3 -0
  41. package/lib/components/InputButton/index.d.ts.map +1 -0
  42. package/lib/components/KeyboardAvoidingScrollView/KeyboardAvoidingScrollView.d.ts.map +1 -1
  43. package/lib/components/KeyboardAvoidingScrollView/KeyboardAvoidingScrollView.jsx +12 -8
  44. package/lib/components/List/List.d.ts +51 -0
  45. package/lib/components/List/List.d.ts.map +1 -0
  46. package/lib/components/List/List.jsx +176 -0
  47. package/lib/components/List/List.namespace.d.ts +2 -0
  48. package/lib/components/List/List.namespace.d.ts.map +1 -0
  49. package/lib/components/List/List.namespace.js +18 -0
  50. package/lib/components/List/index.d.ts +3 -0
  51. package/lib/components/List/index.d.ts.map +1 -0
  52. package/lib/components/MannerTemp/MannerTemp.d.ts.map +1 -1
  53. package/lib/components/MannerTemp/MannerTemp.jsx +3 -2
  54. package/lib/components/MannerTempBadge/MannerTempBadge.d.ts.map +1 -1
  55. package/lib/components/MannerTempBadge/MannerTempBadge.jsx +2 -1
  56. package/lib/components/Menu/Menu.d.ts +69 -0
  57. package/lib/components/Menu/Menu.d.ts.map +1 -0
  58. package/lib/components/Menu/Menu.jsx +520 -0
  59. package/lib/components/Menu/Menu.namespace.d.ts +2 -0
  60. package/lib/components/Menu/Menu.namespace.d.ts.map +1 -0
  61. package/lib/components/Menu/Menu.namespace.js +21 -0
  62. package/lib/components/Menu/index.d.ts +3 -0
  63. package/lib/components/Menu/index.d.ts.map +1 -0
  64. package/lib/components/NotificationBadge/NotificationBadge.d.ts.map +1 -1
  65. package/lib/components/NotificationBadge/NotificationBadge.jsx +3 -2
  66. package/lib/components/PageBanner/PageBanner.d.ts +5 -5
  67. package/lib/components/PageBanner/PageBanner.d.ts.map +1 -1
  68. package/lib/components/PageBanner/PageBanner.jsx +25 -14
  69. package/lib/components/ProgressCircle/ProgressCircle.d.ts +2 -2
  70. package/lib/components/ProgressCircle/ProgressCircle.d.ts.map +1 -1
  71. package/lib/components/ProgressCircle/ProgressCircle.jsx +4 -3
  72. package/lib/components/RadioGroup/RadioGroup.d.ts +5 -3
  73. package/lib/components/RadioGroup/RadioGroup.d.ts.map +1 -1
  74. package/lib/components/RadioGroup/RadioGroup.jsx +22 -9
  75. package/lib/components/ReactionButton/ReactionButton.d.ts +20 -0
  76. package/lib/components/ReactionButton/ReactionButton.d.ts.map +1 -0
  77. package/lib/components/ReactionButton/ReactionButton.jsx +88 -0
  78. package/lib/components/ReactionButton/index.d.ts +2 -0
  79. package/lib/components/ReactionButton/index.d.ts.map +1 -0
  80. package/lib/components/ScaleFeedback/ScaleFeedback.d.ts +11 -0
  81. package/lib/components/ScaleFeedback/ScaleFeedback.d.ts.map +1 -0
  82. package/lib/components/ScaleFeedback/ScaleFeedback.jsx +16 -0
  83. package/lib/components/ScaleFeedback/index.d.ts +2 -0
  84. package/lib/components/ScaleFeedback/index.d.ts.map +1 -0
  85. package/lib/components/SegmentedControl/SegmentedControl.d.ts +1 -0
  86. package/lib/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  87. package/lib/components/SegmentedControl/SegmentedControl.jsx +23 -10
  88. package/lib/components/SelectBox/SelectBox.d.ts.map +1 -1
  89. package/lib/components/SelectBox/SelectBox.jsx +23 -13
  90. package/lib/components/Stack/Stack.d.ts.map +1 -1
  91. package/lib/components/Stack/Stack.jsx +2 -1
  92. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.d.ts +85 -0
  93. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.d.ts.map +1 -0
  94. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.jsx +256 -0
  95. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.d.ts +2 -0
  96. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.d.ts.map +1 -0
  97. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.js +24 -0
  98. package/lib/components/SwipeableMenuSheet/index.d.ts +3 -0
  99. package/lib/components/SwipeableMenuSheet/index.d.ts.map +1 -0
  100. package/lib/components/Switch/Switch.d.ts +27 -3
  101. package/lib/components/Switch/Switch.d.ts.map +1 -1
  102. package/lib/components/Switch/Switch.jsx +22 -9
  103. package/lib/components/Tabs/Tabs.d.ts +4 -2
  104. package/lib/components/Tabs/Tabs.d.ts.map +1 -1
  105. package/lib/components/Tabs/Tabs.jsx +37 -22
  106. package/lib/components/TagGroup/TagGroup.d.ts.map +1 -1
  107. package/lib/components/TagGroup/TagGroup.jsx +4 -3
  108. package/lib/components/Text/Text.d.ts.map +1 -1
  109. package/lib/components/Text/Text.jsx +2 -1
  110. package/lib/components/TextField/TextField.d.ts.map +1 -1
  111. package/lib/components/TextField/TextField.jsx +35 -23
  112. package/lib/components/index.d.ts +7 -0
  113. package/lib/components/index.d.ts.map +1 -1
  114. package/lib/components/private/Positioning.d.ts +69 -0
  115. package/lib/components/private/Positioning.d.ts.map +1 -0
  116. package/lib/components/private/Positioning.js +109 -0
  117. package/lib/components/private/TrackPositioning.d.ts +22 -0
  118. package/lib/components/private/TrackPositioning.d.ts.map +1 -0
  119. package/lib/contexts/ScaleFeedbackContentContext.d.ts +4 -0
  120. package/lib/contexts/ScaleFeedbackContentContext.d.ts.map +1 -0
  121. package/lib/contexts/ScaleFeedbackContentContext.js +6 -0
  122. package/lib/contexts/index.d.ts +2 -0
  123. package/lib/contexts/index.d.ts.map +1 -0
  124. package/lib/hooks/index.d.ts +1 -0
  125. package/lib/hooks/index.d.ts.map +1 -1
  126. package/lib/hooks/useIconColor.d.ts.map +1 -1
  127. package/lib/hooks/useIconColor.js +8 -3
  128. package/lib/hooks/usePressTap.d.ts +4 -3
  129. package/lib/hooks/usePressTap.d.ts.map +1 -1
  130. package/lib/hooks/useScaleFeedback.d.ts +48 -0
  131. package/lib/hooks/useScaleFeedback.d.ts.map +1 -0
  132. package/lib/hooks/useScaleFeedback.js +108 -0
  133. package/lib/index.d.ts +1 -0
  134. package/lib/index.d.ts.map +1 -1
  135. package/lib/index.js +17 -3
  136. package/lib/node_modules/.bun/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js +493 -0
  137. package/lib/node_modules/.bun/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +114 -0
  138. package/lib/utils/calculate-scale-feedback.d.ts +5 -0
  139. package/lib/utils/calculate-scale-feedback.d.ts.map +1 -0
  140. package/lib/utils/calculate-scale-feedback.js +13 -0
  141. package/lib/utils/compose-event-handlers.d.ts +5 -0
  142. package/lib/utils/compose-event-handlers.d.ts.map +1 -0
  143. package/lib/utils/compose-event-handlers.js +16 -0
  144. package/lib/utils/create-slot-recipe-context.d.ts.map +1 -1
  145. package/lib/utils/create-slot-recipe-context.jsx +6 -16
  146. package/lib/utils/index.d.ts +1 -0
  147. package/lib/utils/index.d.ts.map +1 -1
  148. package/lib/utils/merge-props.d.ts +15 -0
  149. package/lib/utils/merge-props.d.ts.map +1 -0
  150. package/lib/utils/merge-props.js +36 -0
  151. package/lib/utils/merge-refs.d.ts +8 -0
  152. package/lib/utils/merge-refs.d.ts.map +1 -0
  153. package/lib/utils/merge-refs.js +38 -0
  154. package/package.json +6 -5
  155. package/src/components/Accordion/Accordion.tsx +36 -27
  156. package/src/components/ActionButton/ActionButton.tsx +27 -12
  157. package/src/components/AppBar/AppBar.tsx +17 -18
  158. package/src/components/Badge/Badge.tsx +2 -2
  159. package/src/components/BottomSheet/BottomSheet.tsx +9 -17
  160. package/src/components/Box/Box.tsx +2 -2
  161. package/src/components/Callout/Callout.tsx +39 -22
  162. package/src/components/Checkbox/Checkbox.test.tsx +44 -0
  163. package/src/components/Checkbox/Checkbox.tsx +52 -21
  164. package/src/components/Chip/Chip.test.tsx +50 -1
  165. package/src/components/Chip/Chip.tsx +75 -31
  166. package/src/components/Count/Count.tsx +35 -0
  167. package/src/components/Count/index.ts +1 -0
  168. package/src/components/Divider/Divider.tsx +2 -2
  169. package/src/components/Field/Field.tsx +15 -28
  170. package/src/components/Icon/Icon.test.tsx +4 -6
  171. package/src/components/Icon/Icon.tsx +14 -7
  172. package/src/components/InputButton/InputButton.namespace.ts +20 -0
  173. package/src/components/InputButton/InputButton.test.tsx +82 -0
  174. package/src/components/InputButton/InputButton.tsx +295 -0
  175. package/src/components/InputButton/index.ts +2 -0
  176. package/src/components/KeyboardAvoidingScrollView/KeyboardAvoidingScrollView.tsx +16 -21
  177. package/src/components/List/List.namespace.ts +24 -0
  178. package/src/components/List/List.test.tsx +162 -0
  179. package/src/components/List/List.tsx +476 -0
  180. package/src/components/List/index.ts +3 -0
  181. package/src/components/MannerTemp/MannerTemp.tsx +3 -4
  182. package/src/components/MannerTempBadge/MannerTempBadge.tsx +2 -2
  183. package/src/components/Menu/Menu.namespace.ts +26 -0
  184. package/src/components/Menu/Menu.tsx +883 -0
  185. package/src/components/Menu/index.ts +31 -0
  186. package/src/components/NotificationBadge/NotificationBadge.tsx +4 -9
  187. package/src/components/PageBanner/PageBanner.test.tsx +3 -0
  188. package/src/components/PageBanner/PageBanner.tsx +54 -45
  189. package/src/components/ProgressCircle/ProgressCircle.test.tsx +48 -0
  190. package/src/components/ProgressCircle/ProgressCircle.tsx +22 -3
  191. package/src/components/RadioGroup/RadioGroup.test.tsx +87 -0
  192. package/src/components/RadioGroup/RadioGroup.tsx +50 -14
  193. package/src/components/ReactionButton/ReactionButton.test.tsx +122 -0
  194. package/src/components/ReactionButton/ReactionButton.tsx +139 -0
  195. package/src/components/ReactionButton/index.ts +1 -0
  196. package/src/components/ScaleFeedback/ScaleFeedback.test.tsx +41 -0
  197. package/src/components/ScaleFeedback/ScaleFeedback.tsx +32 -0
  198. package/src/components/ScaleFeedback/index.ts +1 -0
  199. package/src/components/SegmentedControl/SegmentedControl.test.tsx +15 -3
  200. package/src/components/SegmentedControl/SegmentedControl.tsx +35 -14
  201. package/src/components/SelectBox/SelectBox.test.tsx +39 -1
  202. package/src/components/SelectBox/SelectBox.tsx +27 -16
  203. package/src/components/Stack/Stack.tsx +2 -2
  204. package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.namespace.ts +37 -0
  205. package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.test.tsx +258 -0
  206. package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.tsx +655 -0
  207. package/src/components/SwipeableMenuSheet/index.ts +43 -0
  208. package/src/components/Switch/Switch.test.tsx +57 -0
  209. package/src/components/Switch/Switch.tsx +60 -16
  210. package/src/components/Tabs/Tabs.test.tsx +19 -0
  211. package/src/components/Tabs/Tabs.tsx +72 -40
  212. package/src/components/TagGroup/TagGroup.tsx +4 -6
  213. package/src/components/Text/Text.tsx +2 -2
  214. package/src/components/TextField/TextField.tsx +60 -54
  215. package/src/components/index.ts +7 -0
  216. package/src/components/private/Positioning.test.ts +235 -0
  217. package/src/components/private/Positioning.ts +223 -0
  218. package/src/components/private/TrackPositioning.test.ts +58 -0
  219. package/src/components/private/TrackPositioning.ts +37 -0
  220. package/src/contexts/ScaleFeedbackContentContext.ts +4 -0
  221. package/src/contexts/index.ts +1 -0
  222. package/src/hooks/index.ts +1 -0
  223. package/src/hooks/useIconColor.test.ts +4 -4
  224. package/src/hooks/useIconColor.ts +13 -6
  225. package/src/hooks/usePressTap.ts +4 -3
  226. package/src/hooks/useScaleFeedback.integration.test.tsx +85 -0
  227. package/src/hooks/useScaleFeedback.test.ts +50 -0
  228. package/src/hooks/useScaleFeedback.ts +199 -0
  229. package/src/index.ts +1 -0
  230. package/src/utils/calculate-scale-feedback.ts +12 -0
  231. package/src/utils/compose-event-handlers.ts +16 -0
  232. package/src/utils/create-slot-recipe-context.tsx +6 -7
  233. package/src/utils/index.ts +1 -0
  234. package/src/utils/merge-props.test.tsx +152 -0
  235. package/src/utils/merge-props.ts +62 -0
  236. package/src/utils/merge-refs.ts +44 -0
@@ -0,0 +1,655 @@
1
+ import { menuSheet } from "@seed-design/lynx-css/recipes/menu-sheet";
2
+ import type { MenuSheetVariantProps } from "@seed-design/lynx-css/recipes/menu-sheet";
3
+ import { menuSheetItem } from "@seed-design/lynx-css/recipes/menu-sheet-item";
4
+ import type { MenuSheetItemVariantProps } from "@seed-design/lynx-css/recipes/menu-sheet-item";
5
+ import * as React from "@lynx-js/react";
6
+ import { forwardRef, isValidElement } from "@lynx-js/react";
7
+ import type { ForwardRefExoticComponent, PropsWithoutRef, RefAttributes } from "@lynx-js/react";
8
+ import clsx from "clsx";
9
+
10
+ import { usePressTap } from "../../hooks/usePressTap";
11
+ import { useSafeArea } from "../../hooks/useSafeArea";
12
+ import type {
13
+ LynxAccessibilityProps,
14
+ LynxPressableProps,
15
+ LynxStyledElementProps,
16
+ LynxTextRef,
17
+ LynxViewRef,
18
+ } from "../../types";
19
+ import { createSlotRecipeContext } from "../../utils/create-slot-recipe-context";
20
+ import { toArray } from "../../utils/children";
21
+ import {
22
+ BottomSheetBackdrop,
23
+ BottomSheetContent,
24
+ BottomSheetHandle,
25
+ BottomSheetPositioner,
26
+ BottomSheetRoot,
27
+ type BottomSheetBackdropProps,
28
+ type BottomSheetContentProps,
29
+ type BottomSheetHandleProps,
30
+ type BottomSheetPositionerProps,
31
+ type BottomSheetRootProps,
32
+ type BottomSheetRootRef,
33
+ } from "../BottomSheet/BottomSheet";
34
+ import { IconSlotProvider } from "../Icon/Icon";
35
+
36
+ type LynxForwardRefComponent<T, P> = ForwardRefExoticComponent<
37
+ PropsWithoutRef<P> & RefAttributes<T>
38
+ >;
39
+
40
+ interface SwipeableMenuSheetClassNames {
41
+ positioner: string;
42
+ backdrop: string;
43
+ content: string;
44
+ contentInner: string;
45
+ header: string;
46
+ title: string;
47
+ description: string;
48
+ list: string;
49
+ group: string;
50
+ footer: string;
51
+ closeButton: string;
52
+ closeButtonLabel: string;
53
+ }
54
+
55
+ interface SwipeableMenuSheetItemClassNames {
56
+ root: string;
57
+ content: string;
58
+ label: string;
59
+ description: string;
60
+ prefixIcon: string;
61
+ divider: string;
62
+ }
63
+
64
+ const { ClassNamesProvider, useClassNames } = createSlotRecipeContext(menuSheet);
65
+ // Keep this concrete: Lynx drops the entire calc when this token remains a var() reference.
66
+ const CONTENT_PADDING_BOTTOM = "16px";
67
+
68
+ export type SwipeableMenuSheetCloseReason = "trigger" | "closeButton" | "interactOutside" | "drag";
69
+
70
+ export interface SwipeableMenuSheetOpenChangeDetails {
71
+ reason: SwipeableMenuSheetCloseReason;
72
+ }
73
+
74
+ interface SwipeableMenuSheetContextValue {
75
+ rootRef: React.RefObject<BottomSheetRootRef | null>;
76
+ skipAnimation: boolean;
77
+ setPendingReason: (reason: SwipeableMenuSheetCloseReason) => void;
78
+ }
79
+
80
+ const SwipeableMenuSheetContext = React.createContext<SwipeableMenuSheetContextValue | null>(null);
81
+ const ContentLabelAlignContext = React.createContext<SwipeableMenuSheetLabelAlign | undefined>(
82
+ undefined,
83
+ );
84
+ const GroupLabelAlignContext = React.createContext<SwipeableMenuSheetLabelAlign | undefined>(
85
+ undefined,
86
+ );
87
+ const SwipeableMenuSheetItemPositionContext = React.createContext({ isLast: true });
88
+
89
+ function useSwipeableMenuSheetContext(): SwipeableMenuSheetContextValue {
90
+ const context = React.useContext(SwipeableMenuSheetContext);
91
+ if (!context) {
92
+ throw new Error(
93
+ "SwipeableMenuSheet compound components must be used within SwipeableMenuSheetRoot.",
94
+ );
95
+ }
96
+ return context;
97
+ }
98
+
99
+ function closeSheet(
100
+ rootRef: React.RefObject<BottomSheetRootRef | null>,
101
+ skipAnimation: boolean,
102
+ ): void {
103
+ if (skipAnimation) {
104
+ rootRef.current?.close({ animate: false });
105
+ } else {
106
+ rootRef.current?.close();
107
+ }
108
+ }
109
+
110
+ export type SwipeableMenuSheetRootRef = BottomSheetRootRef;
111
+
112
+ export interface SwipeableMenuSheetRootProps
113
+ extends Omit<
114
+ BottomSheetRootProps,
115
+ | "open"
116
+ | "defaultOpen"
117
+ | "onOpenChange"
118
+ | "side"
119
+ | "snapPoints"
120
+ | "headerAlign"
121
+ | "skipAnimation"
122
+ >,
123
+ Omit<MenuSheetVariantProps, "closeButtonPressed"> {
124
+ open?: boolean;
125
+ defaultOpen?: boolean;
126
+ onOpenChange?: (open: boolean, details: SwipeableMenuSheetOpenChangeDetails) => void;
127
+ }
128
+
129
+ /**
130
+ * A bottom-only, fit-height menu sheet backed by the Lynx BottomSheet engine.
131
+ */
132
+ export const SwipeableMenuSheetRoot: LynxForwardRefComponent<
133
+ BottomSheetRootRef,
134
+ SwipeableMenuSheetRootProps
135
+ > = forwardRef<BottomSheetRootRef, SwipeableMenuSheetRootProps>((props, forwardedRef) => {
136
+ const [variantProps, restProps] = menuSheet.splitVariantProps(props);
137
+ const { open, defaultOpen, onOpenChange, children, ...nativeProps } = restProps;
138
+ const skipAnimation = variantProps.skipAnimation === true;
139
+ const internalRef = React.useRef<BottomSheetRootRef | null>(null);
140
+ const pendingReasonRef = React.useRef<SwipeableMenuSheetCloseReason | null>(null);
141
+
142
+ const mergedRef = React.useCallback(
143
+ (value: BottomSheetRootRef | null) => {
144
+ internalRef.current = value;
145
+ if (typeof forwardedRef === "function") {
146
+ forwardedRef(value);
147
+ } else if (forwardedRef) {
148
+ forwardedRef.current = value;
149
+ }
150
+ },
151
+ [forwardedRef],
152
+ );
153
+ const setPendingReason = React.useCallback((reason: SwipeableMenuSheetCloseReason) => {
154
+ pendingReasonRef.current = reason;
155
+ }, []);
156
+ const handleShowChange = React.useCallback(
157
+ (nextOpen: boolean) => {
158
+ const reason = pendingReasonRef.current ?? "drag";
159
+ pendingReasonRef.current = null;
160
+ onOpenChange?.(nextOpen, { reason });
161
+ },
162
+ [onOpenChange],
163
+ );
164
+ const classNames = React.useMemo(() => menuSheet({ skipAnimation }), [skipAnimation]);
165
+ const context = React.useMemo<SwipeableMenuSheetContextValue>(
166
+ () => ({ rootRef: internalRef, skipAnimation, setPendingReason }),
167
+ [setPendingReason, skipAnimation],
168
+ );
169
+
170
+ return (
171
+ <SwipeableMenuSheetContext.Provider value={context}>
172
+ <ClassNamesProvider value={classNames}>
173
+ <BottomSheetRoot
174
+ {...nativeProps}
175
+ ref={mergedRef}
176
+ open={open}
177
+ defaultOpen={defaultOpen}
178
+ side="bottom"
179
+ snapPoints={["fit"]}
180
+ skipAnimation={skipAnimation}
181
+ onOpenChange={handleShowChange}
182
+ >
183
+ {children}
184
+ </BottomSheetRoot>
185
+ </ClassNamesProvider>
186
+ </SwipeableMenuSheetContext.Provider>
187
+ );
188
+ });
189
+ SwipeableMenuSheetRoot.displayName = "SwipeableMenuSheetRoot";
190
+
191
+ export interface SwipeableMenuSheetTriggerProps
192
+ extends LynxStyledElementProps,
193
+ LynxAccessibilityProps,
194
+ Pick<LynxPressableProps, "bindtap"> {}
195
+
196
+ export const SwipeableMenuSheetTrigger: LynxForwardRefComponent<
197
+ unknown,
198
+ SwipeableMenuSheetTriggerProps
199
+ > = forwardRef<unknown, SwipeableMenuSheetTriggerProps>((props, ref) => {
200
+ const {
201
+ children,
202
+ className,
203
+ style,
204
+ bindtap: userBindtap,
205
+ "accessibility-element": accessibilityElement = true,
206
+ "accessibility-label": accessibilityLabel,
207
+ "accessibility-role-description": accessibilityRoleDescription = "button",
208
+ "accessibility-traits": accessibilityTraits,
209
+ "accessibility-value": accessibilityValue,
210
+ "accessibility-elements-hidden": accessibilityElementsHidden,
211
+ "accessibility-heading": accessibilityHeading,
212
+ "accessibility-actions": accessibilityActions,
213
+ "accessibility-exclusive-focus": accessibilityExclusiveFocus,
214
+ "ios-platform-accessibility-id": iosPlatformAccessibilityId,
215
+ } = props;
216
+ const { rootRef, setPendingReason, skipAnimation } = useSwipeableMenuSheetContext();
217
+
218
+ const handleTap: NonNullable<LynxPressableProps["bindtap"]> = (event, instance) => {
219
+ setPendingReason("trigger");
220
+ if (skipAnimation) {
221
+ rootRef.current?.open({ animate: false });
222
+ } else {
223
+ rootRef.current?.open();
224
+ }
225
+ userBindtap?.(event, instance);
226
+ };
227
+
228
+ return (
229
+ <view
230
+ {...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
231
+ bindtap={handleTap}
232
+ className={className}
233
+ style={style as never}
234
+ accessibility-element={accessibilityElement}
235
+ accessibility-label={accessibilityLabel}
236
+ accessibility-role-description={accessibilityRoleDescription}
237
+ accessibility-traits={accessibilityTraits}
238
+ accessibility-value={accessibilityValue}
239
+ accessibility-elements-hidden={accessibilityElementsHidden}
240
+ accessibility-heading={accessibilityHeading}
241
+ accessibility-actions={accessibilityActions}
242
+ accessibility-exclusive-focus={accessibilityExclusiveFocus}
243
+ ios-platform-accessibility-id={iosPlatformAccessibilityId}
244
+ >
245
+ {children}
246
+ </view>
247
+ );
248
+ });
249
+ SwipeableMenuSheetTrigger.displayName = "SwipeableMenuSheetTrigger";
250
+
251
+ export interface SwipeableMenuSheetPositionerProps extends BottomSheetPositionerProps {}
252
+
253
+ export const SwipeableMenuSheetPositioner: LynxForwardRefComponent<
254
+ unknown,
255
+ SwipeableMenuSheetPositionerProps
256
+ > = forwardRef<unknown, SwipeableMenuSheetPositionerProps>((props, ref) => {
257
+ const classNames = useClassNames();
258
+
259
+ return (
260
+ <BottomSheetPositioner
261
+ {...(ref ? { ref } : {})}
262
+ {...props}
263
+ className={clsx(classNames.positioner, props.className)}
264
+ />
265
+ );
266
+ });
267
+ SwipeableMenuSheetPositioner.displayName = "SwipeableMenuSheetPositioner";
268
+
269
+ export interface SwipeableMenuSheetBackdropProps extends BottomSheetBackdropProps {}
270
+
271
+ export function SwipeableMenuSheetBackdrop(props: SwipeableMenuSheetBackdropProps) {
272
+ const { children, className, clickToClose = true, onClick: userOnClick, ...nativeProps } = props;
273
+ const classNames = useClassNames();
274
+ const { rootRef, setPendingReason, skipAnimation } = useSwipeableMenuSheetContext();
275
+ const handleClick = React.useCallback(() => {
276
+ if (clickToClose) {
277
+ setPendingReason("interactOutside");
278
+ closeSheet(rootRef, skipAnimation);
279
+ }
280
+ userOnClick?.();
281
+ }, [clickToClose, rootRef, setPendingReason, skipAnimation, userOnClick]);
282
+
283
+ return (
284
+ <BottomSheetBackdrop
285
+ {...nativeProps}
286
+ className={clsx(classNames.backdrop, className)}
287
+ clickToClose={false}
288
+ onClick={handleClick}
289
+ >
290
+ {children}
291
+ </BottomSheetBackdrop>
292
+ );
293
+ }
294
+ SwipeableMenuSheetBackdrop.displayName = "SwipeableMenuSheetBackdrop";
295
+
296
+ export interface SwipeableMenuSheetContentProps
297
+ extends BottomSheetContentProps,
298
+ LynxAccessibilityProps {
299
+ labelAlign?: SwipeableMenuSheetLabelAlign;
300
+ }
301
+
302
+ export const SwipeableMenuSheetContent: LynxForwardRefComponent<
303
+ unknown,
304
+ SwipeableMenuSheetContentProps
305
+ > = forwardRef<unknown, SwipeableMenuSheetContentProps>((props, ref) => {
306
+ const { children, className, innerClassName, innerStyle, labelAlign, ...contentProps } = props;
307
+ const classNames = useClassNames();
308
+ const { safeAreaInsetBottom } = useSafeArea();
309
+
310
+ return (
311
+ <ContentLabelAlignContext.Provider value={labelAlign}>
312
+ <BottomSheetContent
313
+ {...(ref ? { ref } : {})}
314
+ {...contentProps}
315
+ className={clsx(classNames.content, className)}
316
+ innerClassName={clsx(classNames.contentInner, innerClassName)}
317
+ innerStyle={
318
+ {
319
+ paddingBottom: `calc(${CONTENT_PADDING_BOTTOM} + ${safeAreaInsetBottom})`,
320
+ ...innerStyle,
321
+ } as BottomSheetContentProps["innerStyle"]
322
+ }
323
+ >
324
+ {children}
325
+ </BottomSheetContent>
326
+ </ContentLabelAlignContext.Provider>
327
+ );
328
+ });
329
+ SwipeableMenuSheetContent.displayName = "SwipeableMenuSheetContent";
330
+
331
+ export interface SwipeableMenuSheetHandleProps extends BottomSheetHandleProps {}
332
+
333
+ export function SwipeableMenuSheetHandle(props: SwipeableMenuSheetHandleProps) {
334
+ return <BottomSheetHandle {...props} />;
335
+ }
336
+ SwipeableMenuSheetHandle.displayName = "SwipeableMenuSheetHandle";
337
+
338
+ export interface SwipeableMenuSheetSlotProps extends LynxStyledElementProps {}
339
+
340
+ function createViewSlot(
341
+ slotName: keyof SwipeableMenuSheetClassNames,
342
+ ): LynxForwardRefComponent<unknown, SwipeableMenuSheetSlotProps> {
343
+ return forwardRef<unknown, SwipeableMenuSheetSlotProps>((props, ref) => {
344
+ const { children, className, style } = props;
345
+ const classNames = useClassNames();
346
+
347
+ return (
348
+ <view
349
+ {...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
350
+ className={clsx(classNames[slotName], className)}
351
+ style={style as never}
352
+ >
353
+ {children}
354
+ </view>
355
+ );
356
+ });
357
+ }
358
+
359
+ function createTextSlot(
360
+ slotName: keyof SwipeableMenuSheetClassNames,
361
+ ): LynxForwardRefComponent<unknown, SwipeableMenuSheetSlotProps> {
362
+ return forwardRef<unknown, SwipeableMenuSheetSlotProps>((props, ref) => {
363
+ const { children, className, style } = props;
364
+ const classNames = useClassNames();
365
+
366
+ return (
367
+ <text
368
+ {...(ref ? ({ ref: ref as LynxTextRef } as Record<string, unknown>) : {})}
369
+ className={clsx(classNames[slotName], className)}
370
+ style={style as never}
371
+ >
372
+ {children}
373
+ </text>
374
+ );
375
+ });
376
+ }
377
+
378
+ export interface SwipeableMenuSheetHeaderProps extends SwipeableMenuSheetSlotProps {}
379
+ export const SwipeableMenuSheetHeader = createViewSlot("header");
380
+ SwipeableMenuSheetHeader.displayName = "SwipeableMenuSheetHeader";
381
+
382
+ export interface SwipeableMenuSheetTitleProps extends SwipeableMenuSheetSlotProps {}
383
+ export const SwipeableMenuSheetTitle = createTextSlot("title");
384
+ SwipeableMenuSheetTitle.displayName = "SwipeableMenuSheetTitle";
385
+
386
+ export interface SwipeableMenuSheetDescriptionProps extends SwipeableMenuSheetSlotProps {}
387
+ export const SwipeableMenuSheetDescription = createTextSlot("description");
388
+ SwipeableMenuSheetDescription.displayName = "SwipeableMenuSheetDescription";
389
+
390
+ export interface SwipeableMenuSheetListProps extends SwipeableMenuSheetSlotProps {}
391
+ export const SwipeableMenuSheetList = createViewSlot("list");
392
+ SwipeableMenuSheetList.displayName = "SwipeableMenuSheetList";
393
+
394
+ export type SwipeableMenuSheetLabelAlign = "left" | "center";
395
+
396
+ export interface SwipeableMenuSheetGroupProps extends SwipeableMenuSheetSlotProps {
397
+ labelAlign?: SwipeableMenuSheetLabelAlign;
398
+ }
399
+
400
+ export const SwipeableMenuSheetGroup: LynxForwardRefComponent<
401
+ unknown,
402
+ SwipeableMenuSheetGroupProps
403
+ > = forwardRef<unknown, SwipeableMenuSheetGroupProps>((props, ref) => {
404
+ const { children, className, style, labelAlign } = props;
405
+ const classNames = useClassNames();
406
+ const contentLabelAlign = React.useContext(ContentLabelAlignContext);
407
+ const resolvedLabelAlign = labelAlign ?? contentLabelAlign;
408
+ const items = toArray(children);
409
+
410
+ return (
411
+ <GroupLabelAlignContext.Provider value={resolvedLabelAlign}>
412
+ <view
413
+ {...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
414
+ className={clsx(classNames.group, className)}
415
+ style={style as never}
416
+ >
417
+ {items.map((item, index) => (
418
+ <SwipeableMenuSheetItemPositionContext.Provider
419
+ key={isValidElement(item) ? (item.key ?? index) : index}
420
+ value={{ isLast: index === items.length - 1 }}
421
+ >
422
+ {item}
423
+ </SwipeableMenuSheetItemPositionContext.Provider>
424
+ ))}
425
+ </view>
426
+ </GroupLabelAlignContext.Provider>
427
+ );
428
+ });
429
+ SwipeableMenuSheetGroup.displayName = "SwipeableMenuSheetGroup";
430
+
431
+ export interface SwipeableMenuSheetFooterProps extends SwipeableMenuSheetSlotProps {}
432
+ export const SwipeableMenuSheetFooter = createViewSlot("footer");
433
+ SwipeableMenuSheetFooter.displayName = "SwipeableMenuSheetFooter";
434
+
435
+ export interface SwipeableMenuSheetCloseButtonProps
436
+ extends LynxStyledElementProps,
437
+ LynxAccessibilityProps,
438
+ LynxPressableProps {}
439
+
440
+ export const SwipeableMenuSheetCloseButton: LynxForwardRefComponent<
441
+ unknown,
442
+ SwipeableMenuSheetCloseButtonProps
443
+ > = forwardRef<unknown, SwipeableMenuSheetCloseButtonProps>((props, ref) => {
444
+ const {
445
+ children,
446
+ className,
447
+ style,
448
+ bindtap: userBindtap,
449
+ "main-thread:bindtap": userMainThreadBindtap,
450
+ "accessibility-element": accessibilityElement = true,
451
+ "accessibility-label": accessibilityLabel = "Close",
452
+ "accessibility-role-description": accessibilityRoleDescription = "button",
453
+ "accessibility-traits": accessibilityTraits,
454
+ "accessibility-value": accessibilityValue,
455
+ "accessibility-elements-hidden": accessibilityElementsHidden,
456
+ "accessibility-heading": accessibilityHeading,
457
+ "accessibility-actions": accessibilityActions,
458
+ "accessibility-exclusive-focus": accessibilityExclusiveFocus,
459
+ "ios-platform-accessibility-id": iosPlatformAccessibilityId,
460
+ } = props;
461
+ const { rootRef, setPendingReason, skipAnimation } = useSwipeableMenuSheetContext();
462
+ const handleTap = React.useCallback<NonNullable<LynxPressableProps["bindtap"]>>(
463
+ (event, instance) => {
464
+ setPendingReason("closeButton");
465
+ closeSheet(rootRef, skipAnimation);
466
+ userBindtap?.(event, instance);
467
+ },
468
+ [rootRef, setPendingReason, skipAnimation, userBindtap],
469
+ );
470
+ const { pressed, ...pressHandlers } = usePressTap({
471
+ onTap: handleTap,
472
+ mainThreadOnTap: userMainThreadBindtap,
473
+ });
474
+ const classNames = menuSheet({ skipAnimation, closeButtonPressed: pressed });
475
+
476
+ return (
477
+ <view
478
+ {...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
479
+ {...pressHandlers}
480
+ className={clsx(classNames.closeButton, className)}
481
+ style={style as never}
482
+ accessibility-element={accessibilityElement}
483
+ accessibility-label={accessibilityLabel}
484
+ accessibility-role-description={accessibilityRoleDescription}
485
+ accessibility-traits={accessibilityTraits}
486
+ accessibility-value={accessibilityValue}
487
+ accessibility-elements-hidden={accessibilityElementsHidden}
488
+ accessibility-heading={accessibilityHeading}
489
+ accessibility-actions={accessibilityActions}
490
+ accessibility-exclusive-focus={accessibilityExclusiveFocus}
491
+ ios-platform-accessibility-id={iosPlatformAccessibilityId}
492
+ >
493
+ <text className={classNames.closeButtonLabel}>{children}</text>
494
+ </view>
495
+ );
496
+ });
497
+ SwipeableMenuSheetCloseButton.displayName = "SwipeableMenuSheetCloseButton";
498
+
499
+ export type SwipeableMenuSheetItemTone = NonNullable<MenuSheetItemVariantProps["tone"]>;
500
+
501
+ export interface SwipeableMenuSheetItemProps
502
+ extends LynxStyledElementProps,
503
+ LynxAccessibilityProps,
504
+ LynxPressableProps {
505
+ tone?: SwipeableMenuSheetItemTone;
506
+ labelAlign?: SwipeableMenuSheetLabelAlign;
507
+ }
508
+
509
+ interface SwipeableMenuSheetItemContextValue {
510
+ classNames: SwipeableMenuSheetItemClassNames;
511
+ }
512
+
513
+ const SwipeableMenuSheetItemContext =
514
+ React.createContext<SwipeableMenuSheetItemContextValue | null>(null);
515
+
516
+ function useSwipeableMenuSheetItemContext(): SwipeableMenuSheetItemContextValue {
517
+ const context = React.useContext(SwipeableMenuSheetItemContext);
518
+ if (!context) {
519
+ throw new Error("SwipeableMenuSheet item slots must be used within SwipeableMenuSheetItem.");
520
+ }
521
+ return context;
522
+ }
523
+
524
+ export const SwipeableMenuSheetItem: LynxForwardRefComponent<unknown, SwipeableMenuSheetItemProps> =
525
+ forwardRef<unknown, SwipeableMenuSheetItemProps>((props, ref) => {
526
+ const {
527
+ children,
528
+ className,
529
+ style,
530
+ tone = "neutral",
531
+ labelAlign,
532
+ bindtap: userBindtap,
533
+ "main-thread:bindtap": userMainThreadBindtap,
534
+ "accessibility-element": accessibilityElement = true,
535
+ "accessibility-role-description": accessibilityRoleDescription = "button",
536
+ "accessibility-label": accessibilityLabel,
537
+ "accessibility-traits": accessibilityTraits,
538
+ "accessibility-value": accessibilityValue,
539
+ "accessibility-elements-hidden": accessibilityElementsHidden,
540
+ "accessibility-heading": accessibilityHeading,
541
+ "accessibility-actions": accessibilityActions,
542
+ "accessibility-exclusive-focus": accessibilityExclusiveFocus,
543
+ "ios-platform-accessibility-id": iosPlatformAccessibilityId,
544
+ } = props;
545
+ const groupLabelAlign = React.useContext(GroupLabelAlignContext);
546
+ const contentLabelAlign = React.useContext(ContentLabelAlignContext);
547
+ const { isLast } = React.useContext(SwipeableMenuSheetItemPositionContext);
548
+ const resolvedLabelAlign = labelAlign ?? groupLabelAlign ?? contentLabelAlign ?? "left";
549
+ const { pressed, ...pressHandlers } = usePressTap({
550
+ onTap: userBindtap,
551
+ mainThreadOnTap: userMainThreadBindtap,
552
+ });
553
+ const classNames = menuSheetItem({ tone, labelAlign: resolvedLabelAlign, pressed });
554
+ const itemContext = React.useMemo<SwipeableMenuSheetItemContextValue>(
555
+ () => ({ classNames }),
556
+ [classNames],
557
+ );
558
+
559
+ return (
560
+ <SwipeableMenuSheetItemContext.Provider value={itemContext}>
561
+ <IconSlotProvider
562
+ value={{
563
+ classNames: { prefixIcon: classNames.prefixIcon },
564
+ deps: [tone, resolvedLabelAlign, pressed],
565
+ }}
566
+ >
567
+ <view
568
+ {...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
569
+ {...pressHandlers}
570
+ className={clsx(classNames.root, className)}
571
+ style={style as never}
572
+ accessibility-element={accessibilityElement}
573
+ accessibility-label={accessibilityLabel}
574
+ accessibility-role-description={accessibilityRoleDescription}
575
+ accessibility-traits={accessibilityTraits}
576
+ accessibility-value={accessibilityValue}
577
+ accessibility-elements-hidden={accessibilityElementsHidden}
578
+ accessibility-heading={accessibilityHeading}
579
+ accessibility-actions={accessibilityActions}
580
+ accessibility-exclusive-focus={accessibilityExclusiveFocus}
581
+ ios-platform-accessibility-id={iosPlatformAccessibilityId}
582
+ >
583
+ {children}
584
+ </view>
585
+ {!isLast ? (
586
+ <view className={classNames.divider} accessibility-elements-hidden={true} />
587
+ ) : null}
588
+ </IconSlotProvider>
589
+ </SwipeableMenuSheetItemContext.Provider>
590
+ );
591
+ });
592
+ SwipeableMenuSheetItem.displayName = "SwipeableMenuSheetItem";
593
+
594
+ export interface SwipeableMenuSheetItemContentProps extends LynxStyledElementProps {}
595
+
596
+ export const SwipeableMenuSheetItemContent: LynxForwardRefComponent<
597
+ unknown,
598
+ SwipeableMenuSheetItemContentProps
599
+ > = forwardRef<unknown, SwipeableMenuSheetItemContentProps>((props, ref) => {
600
+ const { children, className, style } = props;
601
+ const { classNames } = useSwipeableMenuSheetItemContext();
602
+
603
+ return (
604
+ <view
605
+ {...(ref ? ({ ref: ref as LynxViewRef } as Record<string, unknown>) : {})}
606
+ className={clsx(classNames.content, className)}
607
+ style={style as never}
608
+ >
609
+ {children}
610
+ </view>
611
+ );
612
+ });
613
+ SwipeableMenuSheetItemContent.displayName = "SwipeableMenuSheetItemContent";
614
+
615
+ export interface SwipeableMenuSheetItemLabelProps extends LynxStyledElementProps {}
616
+
617
+ export const SwipeableMenuSheetItemLabel: LynxForwardRefComponent<
618
+ unknown,
619
+ SwipeableMenuSheetItemLabelProps
620
+ > = forwardRef<unknown, SwipeableMenuSheetItemLabelProps>((props, ref) => {
621
+ const { children, className, style } = props;
622
+ const { classNames } = useSwipeableMenuSheetItemContext();
623
+
624
+ return (
625
+ <text
626
+ {...(ref ? ({ ref: ref as LynxTextRef } as Record<string, unknown>) : {})}
627
+ className={clsx(classNames.label, className)}
628
+ style={style as never}
629
+ >
630
+ {children}
631
+ </text>
632
+ );
633
+ });
634
+ SwipeableMenuSheetItemLabel.displayName = "SwipeableMenuSheetItemLabel";
635
+
636
+ export interface SwipeableMenuSheetItemDescriptionProps extends LynxStyledElementProps {}
637
+
638
+ export const SwipeableMenuSheetItemDescription: LynxForwardRefComponent<
639
+ unknown,
640
+ SwipeableMenuSheetItemDescriptionProps
641
+ > = forwardRef<unknown, SwipeableMenuSheetItemDescriptionProps>((props, ref) => {
642
+ const { children, className, style } = props;
643
+ const { classNames } = useSwipeableMenuSheetItemContext();
644
+
645
+ return (
646
+ <text
647
+ {...(ref ? ({ ref: ref as LynxTextRef } as Record<string, unknown>) : {})}
648
+ className={clsx(classNames.description, className)}
649
+ style={style as never}
650
+ >
651
+ {children}
652
+ </text>
653
+ );
654
+ });
655
+ SwipeableMenuSheetItemDescription.displayName = "SwipeableMenuSheetItemDescription";
@@ -0,0 +1,43 @@
1
+ export {
2
+ SwipeableMenuSheetBackdrop,
3
+ type SwipeableMenuSheetBackdropProps,
4
+ SwipeableMenuSheetCloseButton,
5
+ type SwipeableMenuSheetCloseButtonProps,
6
+ SwipeableMenuSheetContent,
7
+ type SwipeableMenuSheetContentProps,
8
+ SwipeableMenuSheetDescription,
9
+ type SwipeableMenuSheetDescriptionProps,
10
+ SwipeableMenuSheetFooter,
11
+ type SwipeableMenuSheetFooterProps,
12
+ SwipeableMenuSheetGroup,
13
+ type SwipeableMenuSheetGroupProps,
14
+ SwipeableMenuSheetHandle,
15
+ type SwipeableMenuSheetHandleProps,
16
+ SwipeableMenuSheetHeader,
17
+ type SwipeableMenuSheetHeaderProps,
18
+ SwipeableMenuSheetItem,
19
+ SwipeableMenuSheetItemContent,
20
+ type SwipeableMenuSheetItemContentProps,
21
+ SwipeableMenuSheetItemDescription,
22
+ type SwipeableMenuSheetItemDescriptionProps,
23
+ SwipeableMenuSheetItemLabel,
24
+ type SwipeableMenuSheetItemLabelProps,
25
+ type SwipeableMenuSheetItemProps,
26
+ type SwipeableMenuSheetItemTone,
27
+ SwipeableMenuSheetList,
28
+ type SwipeableMenuSheetListProps,
29
+ type SwipeableMenuSheetLabelAlign,
30
+ type SwipeableMenuSheetCloseReason,
31
+ type SwipeableMenuSheetOpenChangeDetails,
32
+ SwipeableMenuSheetPositioner,
33
+ type SwipeableMenuSheetPositionerProps,
34
+ SwipeableMenuSheetRoot,
35
+ type SwipeableMenuSheetRootProps,
36
+ type SwipeableMenuSheetRootRef,
37
+ SwipeableMenuSheetTitle,
38
+ type SwipeableMenuSheetTitleProps,
39
+ SwipeableMenuSheetTrigger,
40
+ type SwipeableMenuSheetTriggerProps,
41
+ } from "./SwipeableMenuSheet";
42
+
43
+ export * as SwipeableMenuSheet from "./SwipeableMenuSheet.namespace";