@tamagui/sheet 3.0.0-beta.924.1 → 3.0.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 (190) hide show
  1. package/dist/cjs/Sheet.cjs +48 -16
  2. package/dist/cjs/Sheet.native.cjs +46 -17
  3. package/dist/cjs/Sheet.native.js +46 -17
  4. package/dist/cjs/Sheet.native.js.map +1 -1
  5. package/dist/cjs/SheetDragSurface.cjs +50 -0
  6. package/dist/{jsx/GestureDetectorWrapper.native.js → cjs/SheetDragSurface.native.cjs} +24 -12
  7. package/dist/cjs/{GestureDetectorWrapper.native.js → SheetDragSurface.native.js} +25 -11
  8. package/dist/cjs/SheetDragSurface.native.js.map +1 -0
  9. package/dist/cjs/SheetImplementationCustom.cjs +41 -58
  10. package/dist/cjs/SheetImplementationCustom.native.cjs +43 -59
  11. package/dist/cjs/SheetImplementationCustom.native.js +43 -59
  12. package/dist/cjs/SheetImplementationCustom.native.js.map +1 -1
  13. package/dist/cjs/SheetScrollView.cjs +15 -3
  14. package/dist/cjs/SheetScrollView.native.cjs +17 -4
  15. package/dist/cjs/SheetScrollView.native.js +17 -4
  16. package/dist/cjs/SheetScrollView.native.js.map +1 -1
  17. package/dist/cjs/nativeSheet.cjs +3 -59
  18. package/dist/cjs/nativeSheet.native.cjs +70 -58
  19. package/dist/cjs/nativeSheet.native.js +70 -58
  20. package/dist/cjs/nativeSheet.native.js.map +1 -1
  21. package/dist/cjs/stableViewportHeight.cjs +27 -0
  22. package/dist/cjs/stableViewportHeight.native.cjs +29 -0
  23. package/dist/cjs/stableViewportHeight.native.js +31 -0
  24. package/dist/cjs/stableViewportHeight.native.js.map +1 -0
  25. package/dist/cjs/useSheetOffscreenSize.cjs +3 -1
  26. package/dist/cjs/useSheetOffscreenSize.native.cjs +3 -2
  27. package/dist/cjs/useSheetOffscreenSize.native.js +3 -2
  28. package/dist/cjs/useSheetOffscreenSize.native.js.map +1 -1
  29. package/dist/cjs/useSheetOpenState.cjs +13 -6
  30. package/dist/cjs/useSheetOpenState.native.cjs +15 -5
  31. package/dist/cjs/useSheetOpenState.native.js +15 -5
  32. package/dist/cjs/useSheetOpenState.native.js.map +1 -1
  33. package/dist/cjs/useSheetProviderProps.cjs +5 -94
  34. package/dist/cjs/useSheetProviderProps.native.cjs +5 -103
  35. package/dist/cjs/useSheetProviderProps.native.js +5 -103
  36. package/dist/cjs/useSheetProviderProps.native.js.map +1 -1
  37. package/dist/cjs/useSheetState.cjs +120 -0
  38. package/dist/cjs/useSheetState.native.cjs +131 -0
  39. package/dist/cjs/useSheetState.native.js +133 -0
  40. package/dist/cjs/useSheetState.native.js.map +1 -0
  41. package/dist/esm/Sheet.mjs +48 -15
  42. package/dist/esm/Sheet.mjs.map +1 -1
  43. package/dist/esm/Sheet.native.js +46 -17
  44. package/dist/esm/Sheet.native.js.map +1 -1
  45. package/dist/esm/SheetDragSurface.mjs +25 -0
  46. package/dist/esm/SheetDragSurface.mjs.map +1 -0
  47. package/dist/esm/SheetDragSurface.native.js +34 -0
  48. package/dist/esm/SheetDragSurface.native.js.map +1 -0
  49. package/dist/esm/SheetImplementationCustom.mjs +39 -56
  50. package/dist/esm/SheetImplementationCustom.mjs.map +1 -1
  51. package/dist/esm/SheetImplementationCustom.native.js +41 -57
  52. package/dist/esm/SheetImplementationCustom.native.js.map +1 -1
  53. package/dist/esm/SheetScrollView.mjs +16 -4
  54. package/dist/esm/SheetScrollView.mjs.map +1 -1
  55. package/dist/esm/SheetScrollView.native.js +18 -5
  56. package/dist/esm/SheetScrollView.native.js.map +1 -1
  57. package/dist/esm/nativeSheet.mjs +3 -60
  58. package/dist/esm/nativeSheet.mjs.map +1 -1
  59. package/dist/esm/nativeSheet.native.js +70 -58
  60. package/dist/esm/nativeSheet.native.js.map +1 -1
  61. package/dist/esm/stableViewportHeight.mjs +8 -0
  62. package/dist/esm/stableViewportHeight.mjs.map +1 -0
  63. package/dist/esm/stableViewportHeight.native.js +8 -0
  64. package/dist/esm/stableViewportHeight.native.js.map +1 -0
  65. package/dist/esm/useKeyboardControllerSheet.native.js +0 -5
  66. package/dist/esm/useSheetOffscreenSize.mjs +3 -1
  67. package/dist/esm/useSheetOffscreenSize.mjs.map +1 -1
  68. package/dist/esm/useSheetOffscreenSize.native.js +3 -2
  69. package/dist/esm/useSheetOffscreenSize.native.js.map +1 -1
  70. package/dist/esm/useSheetOpenState.mjs +14 -7
  71. package/dist/esm/useSheetOpenState.mjs.map +1 -1
  72. package/dist/esm/useSheetOpenState.native.js +16 -6
  73. package/dist/esm/useSheetOpenState.native.js.map +1 -1
  74. package/dist/esm/useSheetProviderProps.mjs +5 -88
  75. package/dist/esm/useSheetProviderProps.mjs.map +1 -1
  76. package/dist/esm/useSheetProviderProps.native.js +5 -97
  77. package/dist/esm/useSheetProviderProps.native.js.map +1 -1
  78. package/dist/esm/useSheetState.mjs +95 -0
  79. package/dist/esm/useSheetState.mjs.map +1 -0
  80. package/dist/esm/useSheetState.native.js +104 -0
  81. package/dist/esm/useSheetState.native.js.map +1 -0
  82. package/dist/jsx/Sheet.mjs +48 -15
  83. package/dist/jsx/Sheet.mjs.map +1 -1
  84. package/dist/jsx/Sheet.native.cjs +46 -17
  85. package/dist/jsx/Sheet.native.js +46 -17
  86. package/dist/jsx/Sheet.native.js.map +1 -1
  87. package/dist/jsx/SheetDragSurface.mjs +25 -0
  88. package/dist/jsx/SheetDragSurface.mjs.map +1 -0
  89. package/dist/{cjs/GestureDetectorWrapper.native.cjs → jsx/SheetDragSurface.native.cjs} +24 -10
  90. package/dist/jsx/{GestureDetectorWrapper.native.cjs → SheetDragSurface.native.js} +26 -10
  91. package/dist/jsx/SheetDragSurface.native.js.map +1 -0
  92. package/dist/jsx/SheetImplementationCustom.mjs +39 -56
  93. package/dist/jsx/SheetImplementationCustom.mjs.map +1 -1
  94. package/dist/jsx/SheetImplementationCustom.native.cjs +43 -59
  95. package/dist/jsx/SheetImplementationCustom.native.js +43 -59
  96. package/dist/jsx/SheetImplementationCustom.native.js.map +1 -1
  97. package/dist/jsx/SheetScrollView.mjs +16 -4
  98. package/dist/jsx/SheetScrollView.mjs.map +1 -1
  99. package/dist/jsx/SheetScrollView.native.cjs +17 -4
  100. package/dist/jsx/SheetScrollView.native.js +17 -4
  101. package/dist/jsx/SheetScrollView.native.js.map +1 -1
  102. package/dist/jsx/nativeSheet.mjs +3 -60
  103. package/dist/jsx/nativeSheet.mjs.map +1 -1
  104. package/dist/jsx/nativeSheet.native.cjs +70 -58
  105. package/dist/jsx/nativeSheet.native.js +70 -58
  106. package/dist/jsx/nativeSheet.native.js.map +1 -1
  107. package/dist/jsx/stableViewportHeight.mjs +8 -0
  108. package/dist/jsx/stableViewportHeight.mjs.map +1 -0
  109. package/dist/jsx/stableViewportHeight.native.cjs +29 -0
  110. package/dist/jsx/stableViewportHeight.native.js +31 -0
  111. package/dist/jsx/stableViewportHeight.native.js.map +1 -0
  112. package/dist/jsx/useSheetOffscreenSize.mjs +3 -1
  113. package/dist/jsx/useSheetOffscreenSize.mjs.map +1 -1
  114. package/dist/jsx/useSheetOffscreenSize.native.cjs +3 -2
  115. package/dist/jsx/useSheetOffscreenSize.native.js +3 -2
  116. package/dist/jsx/useSheetOffscreenSize.native.js.map +1 -1
  117. package/dist/jsx/useSheetOpenState.mjs +14 -7
  118. package/dist/jsx/useSheetOpenState.mjs.map +1 -1
  119. package/dist/jsx/useSheetOpenState.native.cjs +15 -5
  120. package/dist/jsx/useSheetOpenState.native.js +15 -5
  121. package/dist/jsx/useSheetOpenState.native.js.map +1 -1
  122. package/dist/jsx/useSheetProviderProps.mjs +5 -88
  123. package/dist/jsx/useSheetProviderProps.mjs.map +1 -1
  124. package/dist/jsx/useSheetProviderProps.native.cjs +5 -103
  125. package/dist/jsx/useSheetProviderProps.native.js +5 -103
  126. package/dist/jsx/useSheetProviderProps.native.js.map +1 -1
  127. package/dist/jsx/useSheetState.mjs +95 -0
  128. package/dist/jsx/useSheetState.mjs.map +1 -0
  129. package/dist/jsx/useSheetState.native.cjs +131 -0
  130. package/dist/jsx/useSheetState.native.js +133 -0
  131. package/dist/jsx/useSheetState.native.js.map +1 -0
  132. package/package.json +27 -22
  133. package/src/Sheet.tsx +45 -18
  134. package/src/SheetDragSurface.native.tsx +42 -0
  135. package/src/SheetDragSurface.tsx +40 -0
  136. package/src/SheetImplementationCustom.tsx +67 -92
  137. package/src/SheetScrollView.tsx +26 -4
  138. package/src/nativeSheet.native.tsx +110 -0
  139. package/src/nativeSheet.ts +16 -0
  140. package/src/stableViewportHeight.native.ts +9 -0
  141. package/src/stableViewportHeight.ts +15 -0
  142. package/src/types.tsx +44 -1
  143. package/src/useSheetOffscreenSize.tsx +3 -7
  144. package/src/useSheetOpenState.tsx +18 -8
  145. package/src/useSheetProviderProps.tsx +18 -149
  146. package/src/useSheetScrollViewGestures.native.ts +4 -1
  147. package/src/useSheetState.tsx +139 -0
  148. package/types/Sheet.d.ts +71 -167
  149. package/types/Sheet.d.ts.map +1 -1
  150. package/types/SheetDragSurface.d.ts +11 -0
  151. package/types/SheetDragSurface.d.ts.map +1 -0
  152. package/types/SheetDragSurface.native.d.ts +11 -0
  153. package/types/SheetDragSurface.native.d.ts.map +1 -0
  154. package/types/SheetImplementationCustom.d.ts +1 -2
  155. package/types/SheetImplementationCustom.d.ts.map +1 -1
  156. package/types/SheetScrollView.d.ts +3 -3
  157. package/types/SheetScrollView.d.ts.map +1 -1
  158. package/types/nativeSheet.d.ts +8 -9
  159. package/types/nativeSheet.d.ts.map +1 -1
  160. package/types/nativeSheet.native.d.ts +4 -0
  161. package/types/nativeSheet.native.d.ts.map +1 -0
  162. package/types/stableViewportHeight.d.ts +12 -0
  163. package/types/stableViewportHeight.d.ts.map +1 -0
  164. package/types/stableViewportHeight.native.d.ts +6 -0
  165. package/types/stableViewportHeight.native.d.ts.map +1 -0
  166. package/types/types.d.ts +34 -1
  167. package/types/types.d.ts.map +1 -1
  168. package/types/useSheetOffscreenSize.d.ts +1 -1
  169. package/types/useSheetOffscreenSize.d.ts.map +1 -1
  170. package/types/useSheetOpenState.d.ts +3 -1
  171. package/types/useSheetOpenState.d.ts.map +1 -1
  172. package/types/useSheetProviderProps.d.ts +15 -13
  173. package/types/useSheetProviderProps.d.ts.map +1 -1
  174. package/types/useSheetScrollViewGestures.native.d.ts +1 -1
  175. package/types/useSheetScrollViewGestures.native.d.ts.map +1 -1
  176. package/types/useSheetState.d.ts +26 -0
  177. package/types/useSheetState.d.ts.map +1 -0
  178. package/dist/cjs/GestureDetectorWrapper.cjs +0 -44
  179. package/dist/cjs/GestureDetectorWrapper.native.js.map +0 -1
  180. package/dist/esm/GestureDetectorWrapper.mjs +0 -25
  181. package/dist/esm/GestureDetectorWrapper.mjs.map +0 -1
  182. package/dist/esm/GestureDetectorWrapper.native.js +0 -26
  183. package/dist/esm/GestureDetectorWrapper.native.js.map +0 -1
  184. package/dist/jsx/GestureDetectorWrapper.mjs +0 -25
  185. package/dist/jsx/GestureDetectorWrapper.mjs.map +0 -1
  186. package/dist/jsx/GestureDetectorWrapper.native.js.map +0 -1
  187. package/src/GestureDetectorWrapper.tsx +0 -38
  188. package/src/nativeSheet.tsx +0 -86
  189. package/types/GestureDetectorWrapper.d.ts +0 -14
  190. package/types/GestureDetectorWrapper.d.ts.map +0 -1
@@ -0,0 +1,95 @@
1
+ import React from "react";
2
+ import { useControllableState } from "@tamagui/use-controllable-state";
3
+
4
+ function useSheetState(props, state) {
5
+ const handleRef = React.useRef(null);
6
+ const contentRef = React.useRef(null);
7
+ const [frameSize, setFrameSize] = React.useState(0);
8
+ const [maxContentSize, setMaxContentSize] = React.useState(0);
9
+ const snapPointsMode = props.snapPointsMode ?? "percent";
10
+ const snapPointsProp = props.snapPoints ?? (snapPointsMode === "percent" ? [80] : snapPointsMode === "constant" ? [256] : ["fit"]);
11
+ const hasFit = snapPointsProp[0] === "fit";
12
+ const snapPoints = React.useMemo(() => props.dismissOnSnapToBottom ? [...snapPointsProp, 0] : snapPointsProp, [JSON.stringify(snapPointsProp), props.dismissOnSnapToBottom]);
13
+ const [position_, setPositionImmediate] = useControllableState({
14
+ prop: props.position,
15
+ defaultProp: props.defaultPosition || (state.open ? 0 : -1),
16
+ onChange: props.onPositionChange,
17
+ strategy: state.strategy
18
+ });
19
+ const position = state.open === false ? -1 : position_;
20
+ const { open } = state;
21
+ const setPosition = React.useCallback((next) => {
22
+ if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {
23
+ state.setOpen(false);
24
+ } else {
25
+ setPositionImmediate(next);
26
+ }
27
+ }, [
28
+ props.dismissOnSnapToBottom,
29
+ snapPoints.length,
30
+ setPositionImmediate,
31
+ state.setOpen
32
+ ]);
33
+ if (process.env.NODE_ENV === "development") {
34
+ if (snapPointsMode === "mixed" && snapPoints.some((p) => {
35
+ if (typeof p === "string") {
36
+ if (p === "fit") {
37
+ return false;
38
+ }
39
+ if (p.endsWith("%")) {
40
+ const n = Number(p.slice(0, -1));
41
+ return n < 0 || n > 100;
42
+ }
43
+ return true;
44
+ }
45
+ return typeof p !== "number" || p < 0;
46
+ })) {
47
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be positive numeric values, string percentages between 0-100%, or \"fit\" when snapPointsMode is mixed");
48
+ }
49
+ if (snapPointsMode === "mixed" && snapPoints.indexOf("fit") > 0) {
50
+ console.warn("⚠️ Invalid snapPoint given, \"fit\" must be the first/largest snap point when snapPointsMode is mixed");
51
+ }
52
+ if (snapPointsMode === "fit" && (snapPoints.length !== (props.dismissOnSnapToBottom ? 2 : 1) || snapPoints[0] !== "fit")) {
53
+ console.warn("⚠️ Invalid snapPoint given, there are no snap points when snapPointsMode is fit");
54
+ }
55
+ if (snapPointsMode === "constant" && snapPoints.some((p) => typeof p !== "number" || p < 0)) {
56
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be positive numeric values when snapPointsMode is constant");
57
+ }
58
+ if (snapPointsMode === "percent" && snapPoints.some((p) => typeof p !== "number" || p < 0 || p > 100)) {
59
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be numeric values between 0 and 100 when snapPointsMode is percent");
60
+ }
61
+ }
62
+ if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {
63
+ setPositionImmediate(0);
64
+ }
65
+ const shouldSetPositionOpen = open && position < 0;
66
+ React.useEffect(() => {
67
+ if (shouldSetPositionOpen) {
68
+ setPosition(0);
69
+ }
70
+ }, [setPosition, shouldSetPositionOpen]);
71
+ return {
72
+ modal: !!props.modal,
73
+ open: state.open,
74
+ setOpen: state.setOpen,
75
+ hidden: !!state.isHidden,
76
+ contentRef,
77
+ handleRef,
78
+ frameSize,
79
+ setFrameSize,
80
+ maxContentSize,
81
+ dismissOnOverlayPress: props.dismissOnOverlayPress ?? true,
82
+ dismissOnSnapToBottom: props.dismissOnSnapToBottom ?? false,
83
+ scope: props.scope ?? "",
84
+ hasFit,
85
+ position,
86
+ snapPoints,
87
+ snapPointsMode,
88
+ setMaxContentSize,
89
+ setPosition,
90
+ setPositionImmediate
91
+ };
92
+ }
93
+
94
+ export { useSheetState };
95
+ //# sourceMappingURL=useSheetState.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSheetState.js","names":[],"sources":["jsx/useSheetState.js"],"sourcesContent":["import React from \"react\";\nimport { useControllableState } from \"@tamagui/use-controllable-state\";\nfunction useSheetState(props, state) {\n const handleRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [frameSize, setFrameSize] = React.useState(0);\n const [maxContentSize, setMaxContentSize] = React.useState(0);\n const snapPointsMode = props.snapPointsMode ?? \"percent\";\n const snapPointsProp = props.snapPoints ?? (snapPointsMode === \"percent\" ? [80] : snapPointsMode === \"constant\" ? [256] : [\"fit\"]);\n const hasFit = snapPointsProp[0] === \"fit\";\n const snapPoints = React.useMemo(\n () => props.dismissOnSnapToBottom ? [...snapPointsProp, 0] : snapPointsProp,\n [JSON.stringify(snapPointsProp), props.dismissOnSnapToBottom]\n );\n const [position_, setPositionImmediate] = useControllableState({\n prop: props.position,\n defaultProp: props.defaultPosition || (state.open ? 0 : -1),\n onChange: props.onPositionChange,\n strategy: state.strategy\n });\n const position = state.open === false ? -1 : position_;\n const { open } = state;\n const setPosition = React.useCallback(\n (next) => {\n if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {\n state.setOpen(false);\n } else {\n setPositionImmediate(next);\n }\n },\n [props.dismissOnSnapToBottom, snapPoints.length, setPositionImmediate, state.setOpen]\n );\n if (process.env.NODE_ENV === \"development\") {\n if (snapPointsMode === \"mixed\" && snapPoints.some((p) => {\n if (typeof p === \"string\") {\n if (p === \"fit\") {\n return false;\n }\n if (p.endsWith(\"%\")) {\n const n = Number(p.slice(0, -1));\n return n < 0 || n > 100;\n }\n return true;\n }\n return typeof p !== \"number\" || p < 0;\n })) {\n console.warn(\n '\\u26A0\\uFE0F Invalid snapPoint given, snapPoints must be positive numeric values, string percentages between 0-100%, or \"fit\" when snapPointsMode is mixed'\n );\n }\n if (snapPointsMode === \"mixed\" && snapPoints.indexOf(\"fit\") > 0) {\n console.warn(\n '\\u26A0\\uFE0F Invalid snapPoint given, \"fit\" must be the first/largest snap point when snapPointsMode is mixed'\n );\n }\n if (snapPointsMode === \"fit\" && (snapPoints.length !== (props.dismissOnSnapToBottom ? 2 : 1) || snapPoints[0] !== \"fit\")) {\n console.warn(\n \"\\u26A0\\uFE0F Invalid snapPoint given, there are no snap points when snapPointsMode is fit\"\n );\n }\n if (snapPointsMode === \"constant\" && snapPoints.some((p) => typeof p !== \"number\" || p < 0)) {\n console.warn(\n \"\\u26A0\\uFE0F Invalid snapPoint given, snapPoints must be positive numeric values when snapPointsMode is constant\"\n );\n }\n if (snapPointsMode === \"percent\" && snapPoints.some((p) => typeof p !== \"number\" || p < 0 || p > 100)) {\n console.warn(\n \"\\u26A0\\uFE0F Invalid snapPoint given, snapPoints must be numeric values between 0 and 100 when snapPointsMode is percent\"\n );\n }\n }\n if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {\n setPositionImmediate(0);\n }\n const shouldSetPositionOpen = open && position < 0;\n React.useEffect(() => {\n if (shouldSetPositionOpen) {\n setPosition(0);\n }\n }, [setPosition, shouldSetPositionOpen]);\n return {\n modal: !!props.modal,\n open: state.open,\n setOpen: state.setOpen,\n hidden: !!state.isHidden,\n contentRef,\n handleRef,\n frameSize,\n setFrameSize,\n maxContentSize,\n dismissOnOverlayPress: props.dismissOnOverlayPress ?? true,\n dismissOnSnapToBottom: props.dismissOnSnapToBottom ?? false,\n scope: props.scope ?? \"\",\n hasFit,\n position,\n snapPoints,\n snapPointsMode,\n setMaxContentSize,\n setPosition,\n setPositionImmediate\n };\n}\nexport {\n useSheetState\n};\n//# sourceMappingURL=useSheetState.js.map\n"],"mappings":";;;;AAEA,SAAS,cAAc,OAAO,OAAO;CACnC,MAAM,YAAY,MAAM,OAAO,IAAI;CACnC,MAAM,aAAa,MAAM,OAAO,IAAI;CACpC,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAS,CAAC;CAClD,MAAM,CAAC,gBAAgB,qBAAqB,MAAM,SAAS,CAAC;CAC5D,MAAM,iBAAiB,MAAM,kBAAkB;CAC/C,MAAM,iBAAiB,MAAM,eAAe,mBAAmB,YAAY,CAAC,EAAE,IAAI,mBAAmB,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK;CAChI,MAAM,SAAS,eAAe,OAAO;CACrC,MAAM,aAAa,MAAM,cACjB,MAAM,wBAAwB,CAAC,GAAG,gBAAgB,CAAC,IAAI,gBAC7D,CAAC,KAAK,UAAU,cAAc,GAAG,MAAM,qBAAqB,CAC9D;CACA,MAAM,CAAC,WAAW,wBAAwB,qBAAqB;EAC7D,MAAM,MAAM;EACZ,aAAa,MAAM,oBAAoB,MAAM,OAAO,IAAI,CAAC;EACzD,UAAU,MAAM;EAChB,UAAU,MAAM;CAClB,CAAC;CACD,MAAM,WAAW,MAAM,SAAS,QAAQ,CAAC,IAAI;CAC7C,MAAM,EAAE,SAAS;CACjB,MAAM,cAAc,MAAM,aACvB,SAAS;EACR,IAAI,MAAM,yBAAyB,SAAS,WAAW,SAAS,GAAG;GACjE,MAAM,QAAQ,KAAK;EACrB,OAAO;GACL,qBAAqB,IAAI;EAC3B;CACF,GACA;EAAC,MAAM;EAAuB,WAAW;EAAQ;EAAsB,MAAM;CAAO,CACtF;CACA,IAAI,QAAQ,IAAI,aAAa,eAAe;EAC1C,IAAI,mBAAmB,WAAW,WAAW,MAAM,MAAM;GACvD,IAAI,OAAO,MAAM,UAAU;IACzB,IAAI,MAAM,OAAO;KACf,OAAO;IACT;IACA,IAAI,EAAE,SAAS,GAAG,GAAG;KACnB,MAAM,IAAI,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;KAC/B,OAAO,IAAI,KAAK,IAAI;IACtB;IACA,OAAO;GACT;GACA,OAAO,OAAO,MAAM,YAAY,IAAI;EACtC,CAAC,GAAG;GACF,QAAQ,KACN,oJACF;EACF;EACA,IAAI,mBAAmB,WAAW,WAAW,QAAQ,KAAK,IAAI,GAAG;GAC/D,QAAQ,KACN,uGACF;EACF;EACA,IAAI,mBAAmB,UAAU,WAAW,YAAY,MAAM,wBAAwB,IAAI,MAAM,WAAW,OAAO,QAAQ;GACxH,QAAQ,KACN,iFACF;EACF;EACA,IAAI,mBAAmB,cAAc,WAAW,MAAM,MAAM,OAAO,MAAM,YAAY,IAAI,CAAC,GAAG;GAC3F,QAAQ,KACN,wGACF;EACF;EACA,IAAI,mBAAmB,aAAa,WAAW,MAAM,MAAM,OAAO,MAAM,YAAY,IAAI,KAAK,IAAI,GAAG,GAAG;GACrG,QAAQ,KACN,gHACF;EACF;CACF;CACA,IAAI,QAAQ,MAAM,yBAAyB,aAAa,WAAW,SAAS,GAAG;EAC7E,qBAAqB,CAAC;CACxB;CACA,MAAM,wBAAwB,QAAQ,WAAW;CACjD,MAAM,gBAAgB;EACpB,IAAI,uBAAuB;GACzB,YAAY,CAAC;EACf;CACF,GAAG,CAAC,aAAa,qBAAqB,CAAC;CACvC,OAAO;EACL,OAAO,CAAC,CAAC,MAAM;EACf,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,QAAQ,CAAC,CAAC,MAAM;EAChB;EACA;EACA;EACA;EACA;EACA,uBAAuB,MAAM,yBAAyB;EACtD,uBAAuB,MAAM,yBAAyB;EACtD,OAAO,MAAM,SAAS;EACtB;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: true
13
+ });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
18
+ get: () => from[key],
19
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
20
+ });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
25
+ value: mod,
26
+ enumerable: true
27
+ }) : target, mod));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var useSheetState_exports = {};
30
+ __export(useSheetState_exports, { useSheetState: () => useSheetState });
31
+ module.exports = __toCommonJS(useSheetState_exports);
32
+ var import_react = __toESM(require("react"), 1);
33
+ var import_use_controllable_state = require("@tamagui/use-controllable-state");
34
+ function useSheetState(props, state) {
35
+ var handleRef = import_react.default.useRef(null);
36
+ var contentRef = import_react.default.useRef(null);
37
+ var [frameSize, setFrameSize] = import_react.default.useState(0);
38
+ var [maxContentSize, setMaxContentSize] = import_react.default.useState(0);
39
+ var _props_snapPointsMode;
40
+ var snapPointsMode = (_props_snapPointsMode = props.snapPointsMode) !== null && _props_snapPointsMode !== void 0 ? _props_snapPointsMode : "percent";
41
+ var _props_snapPoints;
42
+ var snapPointsProp = (_props_snapPoints = props.snapPoints) !== null && _props_snapPoints !== void 0 ? _props_snapPoints : snapPointsMode === "percent" ? [80] : snapPointsMode === "constant" ? [256] : ["fit"];
43
+ var hasFit = snapPointsProp[0] === "fit";
44
+ var snapPoints = import_react.default.useMemo(function() {
45
+ return props.dismissOnSnapToBottom ? [...snapPointsProp, 0] : snapPointsProp;
46
+ }, [JSON.stringify(snapPointsProp), props.dismissOnSnapToBottom]);
47
+ var [position_, setPositionImmediate] = (0, import_use_controllable_state.useControllableState)({
48
+ prop: props.position,
49
+ defaultProp: props.defaultPosition || (state.open ? 0 : -1),
50
+ onChange: props.onPositionChange,
51
+ strategy: state.strategy
52
+ });
53
+ var position = state.open === false ? -1 : position_;
54
+ var { open } = state;
55
+ var setPosition = import_react.default.useCallback(function(next) {
56
+ if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {
57
+ state.setOpen(false);
58
+ } else {
59
+ setPositionImmediate(next);
60
+ }
61
+ }, [
62
+ props.dismissOnSnapToBottom,
63
+ snapPoints.length,
64
+ setPositionImmediate,
65
+ state.setOpen
66
+ ]);
67
+ if (process.env.NODE_ENV === "development") {
68
+ if (snapPointsMode === "mixed" && snapPoints.some(function(p) {
69
+ if (typeof p === "string") {
70
+ if (p === "fit") {
71
+ return false;
72
+ }
73
+ if (p.endsWith("%")) {
74
+ var n = Number(p.slice(0, -1));
75
+ return n < 0 || n > 100;
76
+ }
77
+ return true;
78
+ }
79
+ return typeof p !== "number" || p < 0;
80
+ })) {
81
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be positive numeric values, string percentages between 0-100%, or \"fit\" when snapPointsMode is mixed");
82
+ }
83
+ if (snapPointsMode === "mixed" && snapPoints.indexOf("fit") > 0) {
84
+ console.warn("⚠️ Invalid snapPoint given, \"fit\" must be the first/largest snap point when snapPointsMode is mixed");
85
+ }
86
+ if (snapPointsMode === "fit" && (snapPoints.length !== (props.dismissOnSnapToBottom ? 2 : 1) || snapPoints[0] !== "fit")) {
87
+ console.warn("⚠️ Invalid snapPoint given, there are no snap points when snapPointsMode is fit");
88
+ }
89
+ if (snapPointsMode === "constant" && snapPoints.some(function(p) {
90
+ return typeof p !== "number" || p < 0;
91
+ })) {
92
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be positive numeric values when snapPointsMode is constant");
93
+ }
94
+ if (snapPointsMode === "percent" && snapPoints.some(function(p) {
95
+ return typeof p !== "number" || p < 0 || p > 100;
96
+ })) {
97
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be numeric values between 0 and 100 when snapPointsMode is percent");
98
+ }
99
+ }
100
+ if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {
101
+ setPositionImmediate(0);
102
+ }
103
+ var shouldSetPositionOpen = open && position < 0;
104
+ import_react.default.useEffect(function() {
105
+ if (shouldSetPositionOpen) {
106
+ setPosition(0);
107
+ }
108
+ }, [setPosition, shouldSetPositionOpen]);
109
+ var _props_dismissOnOverlayPress, _props_dismissOnSnapToBottom, _props_scope;
110
+ return {
111
+ modal: !!props.modal,
112
+ open: state.open,
113
+ setOpen: state.setOpen,
114
+ hidden: !!state.isHidden,
115
+ contentRef,
116
+ handleRef,
117
+ frameSize,
118
+ setFrameSize,
119
+ maxContentSize,
120
+ dismissOnOverlayPress: (_props_dismissOnOverlayPress = props.dismissOnOverlayPress) !== null && _props_dismissOnOverlayPress !== void 0 ? _props_dismissOnOverlayPress : true,
121
+ dismissOnSnapToBottom: (_props_dismissOnSnapToBottom = props.dismissOnSnapToBottom) !== null && _props_dismissOnSnapToBottom !== void 0 ? _props_dismissOnSnapToBottom : false,
122
+ scope: (_props_scope = props.scope) !== null && _props_scope !== void 0 ? _props_scope : "",
123
+ hasFit,
124
+ position,
125
+ snapPoints,
126
+ snapPointsMode,
127
+ setMaxContentSize,
128
+ setPosition,
129
+ setPositionImmediate
130
+ };
131
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: true
13
+ });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
18
+ get: () => from[key],
19
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
20
+ });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
25
+ value: mod,
26
+ enumerable: true
27
+ }) : target, mod));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var useSheetState_exports = {};
30
+ __export(useSheetState_exports, { useSheetState: () => useSheetState });
31
+ module.exports = __toCommonJS(useSheetState_exports);
32
+ var import_react = __toESM(require("react"), 1);
33
+ var import_use_controllable_state = require("@tamagui/use-controllable-state");
34
+ function useSheetState(props, state) {
35
+ var handleRef = import_react.default.useRef(null);
36
+ var contentRef = import_react.default.useRef(null);
37
+ var [frameSize, setFrameSize] = import_react.default.useState(0);
38
+ var [maxContentSize, setMaxContentSize] = import_react.default.useState(0);
39
+ var _props_snapPointsMode;
40
+ var snapPointsMode = (_props_snapPointsMode = props.snapPointsMode) !== null && _props_snapPointsMode !== void 0 ? _props_snapPointsMode : "percent";
41
+ var _props_snapPoints;
42
+ var snapPointsProp = (_props_snapPoints = props.snapPoints) !== null && _props_snapPoints !== void 0 ? _props_snapPoints : snapPointsMode === "percent" ? [80] : snapPointsMode === "constant" ? [256] : ["fit"];
43
+ var hasFit = snapPointsProp[0] === "fit";
44
+ var snapPoints = import_react.default.useMemo(function() {
45
+ return props.dismissOnSnapToBottom ? [...snapPointsProp, 0] : snapPointsProp;
46
+ }, [JSON.stringify(snapPointsProp), props.dismissOnSnapToBottom]);
47
+ var [position_, setPositionImmediate] = (0, import_use_controllable_state.useControllableState)({
48
+ prop: props.position,
49
+ defaultProp: props.defaultPosition || (state.open ? 0 : -1),
50
+ onChange: props.onPositionChange,
51
+ strategy: state.strategy
52
+ });
53
+ var position = state.open === false ? -1 : position_;
54
+ var { open } = state;
55
+ var setPosition = import_react.default.useCallback(function(next) {
56
+ if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {
57
+ state.setOpen(false);
58
+ } else {
59
+ setPositionImmediate(next);
60
+ }
61
+ }, [
62
+ props.dismissOnSnapToBottom,
63
+ snapPoints.length,
64
+ setPositionImmediate,
65
+ state.setOpen
66
+ ]);
67
+ if (process.env.NODE_ENV === "development") {
68
+ if (snapPointsMode === "mixed" && snapPoints.some(function(p) {
69
+ if (typeof p === "string") {
70
+ if (p === "fit") {
71
+ return false;
72
+ }
73
+ if (p.endsWith("%")) {
74
+ var n = Number(p.slice(0, -1));
75
+ return n < 0 || n > 100;
76
+ }
77
+ return true;
78
+ }
79
+ return typeof p !== "number" || p < 0;
80
+ })) {
81
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be positive numeric values, string percentages between 0-100%, or \"fit\" when snapPointsMode is mixed");
82
+ }
83
+ if (snapPointsMode === "mixed" && snapPoints.indexOf("fit") > 0) {
84
+ console.warn("⚠️ Invalid snapPoint given, \"fit\" must be the first/largest snap point when snapPointsMode is mixed");
85
+ }
86
+ if (snapPointsMode === "fit" && (snapPoints.length !== (props.dismissOnSnapToBottom ? 2 : 1) || snapPoints[0] !== "fit")) {
87
+ console.warn("⚠️ Invalid snapPoint given, there are no snap points when snapPointsMode is fit");
88
+ }
89
+ if (snapPointsMode === "constant" && snapPoints.some(function(p) {
90
+ return typeof p !== "number" || p < 0;
91
+ })) {
92
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be positive numeric values when snapPointsMode is constant");
93
+ }
94
+ if (snapPointsMode === "percent" && snapPoints.some(function(p) {
95
+ return typeof p !== "number" || p < 0 || p > 100;
96
+ })) {
97
+ console.warn("⚠️ Invalid snapPoint given, snapPoints must be numeric values between 0 and 100 when snapPointsMode is percent");
98
+ }
99
+ }
100
+ if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {
101
+ setPositionImmediate(0);
102
+ }
103
+ var shouldSetPositionOpen = open && position < 0;
104
+ import_react.default.useEffect(function() {
105
+ if (shouldSetPositionOpen) {
106
+ setPosition(0);
107
+ }
108
+ }, [setPosition, shouldSetPositionOpen]);
109
+ var _props_dismissOnOverlayPress, _props_dismissOnSnapToBottom, _props_scope;
110
+ return {
111
+ modal: !!props.modal,
112
+ open: state.open,
113
+ setOpen: state.setOpen,
114
+ hidden: !!state.isHidden,
115
+ contentRef,
116
+ handleRef,
117
+ frameSize,
118
+ setFrameSize,
119
+ maxContentSize,
120
+ dismissOnOverlayPress: (_props_dismissOnOverlayPress = props.dismissOnOverlayPress) !== null && _props_dismissOnOverlayPress !== void 0 ? _props_dismissOnOverlayPress : true,
121
+ dismissOnSnapToBottom: (_props_dismissOnSnapToBottom = props.dismissOnSnapToBottom) !== null && _props_dismissOnSnapToBottom !== void 0 ? _props_dismissOnSnapToBottom : false,
122
+ scope: (_props_scope = props.scope) !== null && _props_scope !== void 0 ? _props_scope : "",
123
+ hasFit,
124
+ position,
125
+ snapPoints,
126
+ snapPointsMode,
127
+ setMaxContentSize,
128
+ setPosition,
129
+ setPositionImmediate
130
+ };
131
+ }
132
+
133
+ //# sourceMappingURL=useSheetState.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSheetState.native.js","names":[],"sources":["jsx/useSheetState.native.js"],"sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar useSheetState_exports = {};\n__export(useSheetState_exports, {\n useSheetState: () => useSheetState\n});\nmodule.exports = __toCommonJS(useSheetState_exports);\nvar import_react = __toESM(require(\"react\"), 1);\nvar import_use_controllable_state = require(\"@tamagui/use-controllable-state\");\nfunction useSheetState(props, state) {\n var handleRef = import_react.default.useRef(null);\n var contentRef = import_react.default.useRef(null);\n var [frameSize, setFrameSize] = import_react.default.useState(0);\n var [maxContentSize, setMaxContentSize] = import_react.default.useState(0);\n var _props_snapPointsMode;\n var snapPointsMode = (_props_snapPointsMode = props.snapPointsMode) !== null && _props_snapPointsMode !== void 0 ? _props_snapPointsMode : \"percent\";\n var _props_snapPoints;\n var snapPointsProp = (_props_snapPoints = props.snapPoints) !== null && _props_snapPoints !== void 0 ? _props_snapPoints : snapPointsMode === \"percent\" ? [\n 80\n ] : snapPointsMode === \"constant\" ? [\n 256\n ] : [\n \"fit\"\n ];\n var hasFit = snapPointsProp[0] === \"fit\";\n var snapPoints = import_react.default.useMemo(function() {\n return props.dismissOnSnapToBottom ? [\n ...snapPointsProp,\n 0\n ] : snapPointsProp;\n }, [\n JSON.stringify(snapPointsProp),\n props.dismissOnSnapToBottom\n ]);\n var [position_, setPositionImmediate] = (0, import_use_controllable_state.useControllableState)({\n prop: props.position,\n defaultProp: props.defaultPosition || (state.open ? 0 : -1),\n onChange: props.onPositionChange,\n strategy: state.strategy\n });\n var position = state.open === false ? -1 : position_;\n var { open } = state;\n var setPosition = import_react.default.useCallback(function(next) {\n if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {\n state.setOpen(false);\n } else {\n setPositionImmediate(next);\n }\n }, [\n props.dismissOnSnapToBottom,\n snapPoints.length,\n setPositionImmediate,\n state.setOpen\n ]);\n if (process.env.NODE_ENV === \"development\") {\n if (snapPointsMode === \"mixed\" && snapPoints.some(function(p) {\n if (typeof p === \"string\") {\n if (p === \"fit\") {\n return false;\n }\n if (p.endsWith(\"%\")) {\n var n = Number(p.slice(0, -1));\n return n < 0 || n > 100;\n }\n return true;\n }\n return typeof p !== \"number\" || p < 0;\n })) {\n console.warn('\\u26A0\\uFE0F Invalid snapPoint given, snapPoints must be positive numeric values, string percentages between 0-100%, or \"fit\" when snapPointsMode is mixed');\n }\n if (snapPointsMode === \"mixed\" && snapPoints.indexOf(\"fit\") > 0) {\n console.warn('\\u26A0\\uFE0F Invalid snapPoint given, \"fit\" must be the first/largest snap point when snapPointsMode is mixed');\n }\n if (snapPointsMode === \"fit\" && (snapPoints.length !== (props.dismissOnSnapToBottom ? 2 : 1) || snapPoints[0] !== \"fit\")) {\n console.warn(\"\\u26A0\\uFE0F Invalid snapPoint given, there are no snap points when snapPointsMode is fit\");\n }\n if (snapPointsMode === \"constant\" && snapPoints.some(function(p) {\n return typeof p !== \"number\" || p < 0;\n })) {\n console.warn(\"\\u26A0\\uFE0F Invalid snapPoint given, snapPoints must be positive numeric values when snapPointsMode is constant\");\n }\n if (snapPointsMode === \"percent\" && snapPoints.some(function(p) {\n return typeof p !== \"number\" || p < 0 || p > 100;\n })) {\n console.warn(\"\\u26A0\\uFE0F Invalid snapPoint given, snapPoints must be numeric values between 0 and 100 when snapPointsMode is percent\");\n }\n }\n if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {\n setPositionImmediate(0);\n }\n var shouldSetPositionOpen = open && position < 0;\n import_react.default.useEffect(function() {\n if (shouldSetPositionOpen) {\n setPosition(0);\n }\n }, [\n setPosition,\n shouldSetPositionOpen\n ]);\n var _props_dismissOnOverlayPress, _props_dismissOnSnapToBottom, _props_scope;\n return {\n modal: !!props.modal,\n open: state.open,\n setOpen: state.setOpen,\n hidden: !!state.isHidden,\n contentRef,\n handleRef,\n frameSize,\n setFrameSize,\n maxContentSize,\n dismissOnOverlayPress: (_props_dismissOnOverlayPress = props.dismissOnOverlayPress) !== null && _props_dismissOnOverlayPress !== void 0 ? _props_dismissOnOverlayPress : true,\n dismissOnSnapToBottom: (_props_dismissOnSnapToBottom = props.dismissOnSnapToBottom) !== null && _props_dismissOnSnapToBottom !== void 0 ? _props_dismissOnSnapToBottom : false,\n scope: (_props_scope = props.scope) !== null && _props_scope !== void 0 ? _props_scope : \"\",\n hasFit,\n position,\n snapPoints,\n snapPointsMode,\n setMaxContentSize,\n setPosition,\n setPositionImmediate\n };\n}\n//# sourceMappingURL=useSheetState.js.map\n"],"mappings":";;;AACA,IAAI,WAAW,OAAO;AACtB,IAAI,YAAY,OAAO;AACvB,IAAI,mBAAmB,OAAO;AAC9B,IAAI,oBAAoB,OAAO;AAC/B,IAAI,eAAe,OAAO;AAC1B,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,YAAY,QAAQ,QAAQ;CAC9B,KAAK,IAAI,QAAQ,KACf,UAAU,QAAQ,MAAM;EAAE,KAAK,IAAI;EAAO,YAAY;CAAK,CAAC;AAChE;AACA,IAAI,eAAe,IAAI,MAAM,QAAQ,SAAS;CAC5C,IAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY;EAClE,KAAK,IAAI,OAAO,kBAAkB,IAAI,GACpC,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,QACzC,UAAU,IAAI,KAAK;GAAE,WAAW,KAAK;GAAM,YAAY,EAAE,OAAO,iBAAiB,MAAM,GAAG,MAAM,KAAK;EAAW,CAAC;CACvH;CACA,OAAO;AACT;AACA,IAAI,WAAW,KAAK,YAAY,YAAY,SAAS,OAAO,OAAO,SAAS,aAAa,GAAG,CAAC,IAAI,CAAC,GAAG,YAKnG,cAAc,CAAC,OAAO,CAAC,IAAI,aAAa,UAAU,QAAQ,WAAW;CAAE,OAAO;CAAK,YAAY;AAAK,CAAC,IAAI,QACzG,GACF;AACA,IAAI,gBAAgB,QAAQ,YAAY,UAAU,CAAC,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC,GAAG,GAAG;AACzF,IAAI,wBAAwB,CAAC;AAC7B,SAAS,uBAAuB,EAC9B,qBAAqB,cACvB,CAAC;AACD,OAAO,UAAU,aAAa,qBAAqB;AACnD,IAAI,eAAe,QAAQ,QAAQ,OAAO,GAAG,CAAC;AAC9C,IAAI,gCAAgC,QAAQ,iCAAiC;AAC7E,SAAS,cAAc,OAAO,OAAO;CACnC,IAAI,YAAY,aAAa,QAAQ,OAAO,IAAI;CAChD,IAAI,aAAa,aAAa,QAAQ,OAAO,IAAI;CACjD,IAAI,CAAC,WAAW,gBAAgB,aAAa,QAAQ,SAAS,CAAC;CAC/D,IAAI,CAAC,gBAAgB,qBAAqB,aAAa,QAAQ,SAAS,CAAC;CACzE,IAAI;CACJ,IAAI,kBAAkB,wBAAwB,MAAM,oBAAoB,QAAQ,0BAA0B,KAAK,IAAI,wBAAwB;CAC3I,IAAI;CACJ,IAAI,kBAAkB,oBAAoB,MAAM,gBAAgB,QAAQ,sBAAsB,KAAK,IAAI,oBAAoB,mBAAmB,YAAY,CACxJ,EACF,IAAI,mBAAmB,aAAa,CAClC,GACF,IAAI,CACF,KACF;CACA,IAAI,SAAS,eAAe,OAAO;CACnC,IAAI,aAAa,aAAa,QAAQ,QAAQ,WAAW;EACvD,OAAO,MAAM,wBAAwB,CACnC,GAAG,gBACH,CACF,IAAI;CACN,GAAG,CACD,KAAK,UAAU,cAAc,GAC7B,MAAM,qBACR,CAAC;CACD,IAAI,CAAC,WAAW,yBAAyB,GAAG,8BAA8B,qBAAoB,CAAE;EAC9F,MAAM,MAAM;EACZ,aAAa,MAAM,oBAAoB,MAAM,OAAO,IAAI,CAAC;EACzD,UAAU,MAAM;EAChB,UAAU,MAAM;CAClB,CAAC;CACD,IAAI,WAAW,MAAM,SAAS,QAAQ,CAAC,IAAI;CAC3C,IAAI,EAAE,SAAS;CACf,IAAI,cAAc,aAAa,QAAQ,YAAY,SAAS,MAAM;EAChE,IAAI,MAAM,yBAAyB,SAAS,WAAW,SAAS,GAAG;GACjE,MAAM,QAAQ,KAAK;EACrB,OAAO;GACL,qBAAqB,IAAI;EAC3B;CACF,GAAG;EACD,MAAM;EACN,WAAW;EACX;EACA,MAAM;CACR,CAAC;CACD,IAAI,QAAQ,IAAI,aAAa,eAAe;EAC1C,IAAI,mBAAmB,WAAW,WAAW,KAAK,SAAS,GAAG;GAC5D,IAAI,OAAO,MAAM,UAAU;IACzB,IAAI,MAAM,OAAO;KACf,OAAO;IACT;IACA,IAAI,EAAE,SAAS,GAAG,GAAG;KACnB,IAAI,IAAI,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;KAC7B,OAAO,IAAI,KAAK,IAAI;IACtB;IACA,OAAO;GACT;GACA,OAAO,OAAO,MAAM,YAAY,IAAI;EACtC,CAAC,GAAG;GACF,QAAQ,KAAK,oJAA4J;EAC3K;EACA,IAAI,mBAAmB,WAAW,WAAW,QAAQ,KAAK,IAAI,GAAG;GAC/D,QAAQ,KAAK,uGAA+G;EAC9H;EACA,IAAI,mBAAmB,UAAU,WAAW,YAAY,MAAM,wBAAwB,IAAI,MAAM,WAAW,OAAO,QAAQ;GACxH,QAAQ,KAAK,iFAA2F;EAC1G;EACA,IAAI,mBAAmB,cAAc,WAAW,KAAK,SAAS,GAAG;GAC/D,OAAO,OAAO,MAAM,YAAY,IAAI;EACtC,CAAC,GAAG;GACF,QAAQ,KAAK,wGAAkH;EACjI;EACA,IAAI,mBAAmB,aAAa,WAAW,KAAK,SAAS,GAAG;GAC9D,OAAO,OAAO,MAAM,YAAY,IAAI,KAAK,IAAI;EAC/C,CAAC,GAAG;GACF,QAAQ,KAAK,gHAA0H;EACzI;CACF;CACA,IAAI,QAAQ,MAAM,yBAAyB,aAAa,WAAW,SAAS,GAAG;EAC7E,qBAAqB,CAAC;CACxB;CACA,IAAI,wBAAwB,QAAQ,WAAW;CAC/C,aAAa,QAAQ,UAAU,WAAW;EACxC,IAAI,uBAAuB;GACzB,YAAY,CAAC;EACf;CACF,GAAG,CACD,aACA,qBACF,CAAC;CACD,IAAI,8BAA8B,8BAA8B;CAChE,OAAO;EACL,OAAO,CAAC,CAAC,MAAM;EACf,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,QAAQ,CAAC,CAAC,MAAM;EAChB;EACA;EACA;EACA;EACA;EACA,wBAAwB,+BAA+B,MAAM,2BAA2B,QAAQ,iCAAiC,KAAK,IAAI,+BAA+B;EACzK,wBAAwB,+BAA+B,MAAM,2BAA2B,QAAQ,iCAAiC,KAAK,IAAI,+BAA+B;EACzK,QAAQ,eAAe,MAAM,WAAW,QAAQ,iBAAiB,KAAK,IAAI,eAAe;EACzF;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/sheet",
3
- "version": "3.0.0-beta.924.1",
3
+ "version": "3.0.0",
4
4
  "license": "MIT",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
@@ -43,29 +43,33 @@
43
43
  "clean": "tamagui-build clean"
44
44
  },
45
45
  "dependencies": {
46
- "@tamagui/adapt": "3.0.0-beta.924.1",
47
- "@tamagui/animate-presence": "3.0.0-beta.924.1",
48
- "@tamagui/animations-react-native": "3.0.0-beta.924.1",
49
- "@tamagui/compose-refs": "3.0.0-beta.924.1",
50
- "@tamagui/constants": "3.0.0-beta.924.1",
51
- "@tamagui/core": "3.0.0-beta.924.1",
52
- "@tamagui/helpers": "3.0.0-beta.924.1",
53
- "@tamagui/native": "3.0.0-beta.924.1",
54
- "@tamagui/portal": "3.0.0-beta.924.1",
55
- "@tamagui/remove-scroll": "3.0.0-beta.924.1",
56
- "@tamagui/scroll-view": "3.0.0-beta.924.1",
57
- "@tamagui/stacks": "3.0.0-beta.924.1",
58
- "@tamagui/use-constant": "3.0.0-beta.924.1",
59
- "@tamagui/use-controllable-state": "3.0.0-beta.924.1",
60
- "@tamagui/use-did-finish-ssr": "3.0.0-beta.924.1",
61
- "@tamagui/z-index-stack": "3.0.0-beta.924.1"
46
+ "@tamagui/adapt": "3.0.0",
47
+ "@tamagui/animate-presence": "3.0.0",
48
+ "@tamagui/animation-helpers": "3.0.0",
49
+ "@tamagui/animations-react-native": "3.0.0",
50
+ "@tamagui/compose-refs": "3.0.0",
51
+ "@tamagui/constants": "3.0.0",
52
+ "@tamagui/core": "3.0.0",
53
+ "@tamagui/helpers": "3.0.0",
54
+ "@tamagui/native": "3.0.0",
55
+ "@tamagui/portal": "3.0.0",
56
+ "@tamagui/react-native-pan-responder": "3.0.0",
57
+ "@tamagui/react-native-types": "3.0.0",
58
+ "@tamagui/react-native-use-responder-events": "3.0.0",
59
+ "@tamagui/remove-scroll": "3.0.0",
60
+ "@tamagui/scroll-view": "3.0.0",
61
+ "@tamagui/stacks": "3.0.0",
62
+ "@tamagui/use-constant": "3.0.0",
63
+ "@tamagui/use-controllable-state": "3.0.0",
64
+ "@tamagui/use-did-finish-ssr": "3.0.0",
65
+ "@tamagui/z-index-stack": "3.0.0"
62
66
  },
63
67
  "devDependencies": {
64
- "@tamagui/build": "3.0.0-beta.924.1",
68
+ "@tamagui/build": "3.0.0",
65
69
  "react": "19.2.3",
66
- "react-native": "0.86.2",
67
- "react-native-gesture-handler": "~2.32.0",
68
- "react-native-safe-area-context": "~5.7.0"
70
+ "react-native": "0.87.1",
71
+ "react-native-gesture-handler": "3.3.0",
72
+ "react-native-safe-area-context": "5.10.1"
69
73
  },
70
74
  "peerDependencies": {
71
75
  "react": ">=19",
@@ -83,5 +87,6 @@
83
87
  "type": "git",
84
88
  "url": "git+https://github.com/tamagui/tamagui.git",
85
89
  "directory": "code/ui/sheet"
86
- }
90
+ },
91
+ "releaseSourceCommit": "15fbca480b143f876f6975601e23a17d3f90d2ee"
87
92
  }
package/src/Sheet.tsx CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  createStyledHOC,
7
7
  styled,
8
8
  View,
9
+ type GetProps,
9
10
  type TamaguiElement,
10
11
  type ViewProps,
11
12
  } from '@tamagui/core'
@@ -17,8 +18,7 @@ import { useDidFinishSSR } from '@tamagui/use-did-finish-ssr'
17
18
  import { StackZIndexContext } from '@tamagui/z-index-stack'
18
19
  import type { FunctionComponent, Ref } from 'react'
19
20
  import { useContext, useEffect, useMemo, useRef } from 'react'
20
- import type { View as RNView } from 'react-native'
21
- import { Platform } from 'react-native'
21
+ import type { ViewInstance as RNView } from '@tamagui/react-native-types'
22
22
  import {
23
23
  SHEET_BACKGROUND_NAME,
24
24
  SHEET_CONTAINER_NAME,
@@ -48,7 +48,7 @@ type SheetStyleShorthandProps = {
48
48
  }
49
49
 
50
50
  type SheetViewProps<ExtraProps extends object = {}> = SheetScopedProps<
51
- ViewProps & SheetStyleShorthandProps & ExtraProps
51
+ GetProps<typeof View> & SheetStyleShorthandProps & ExtraProps
52
52
  >
53
53
 
54
54
  const SheetHandleFrame = styled(XStack, {
@@ -95,7 +95,6 @@ const SheetContainerFrame = styled(YStack, {
95
95
  position: 'relative',
96
96
  zIndex: 0,
97
97
  width: '100%',
98
- maxHeight: '100%',
99
98
  })
100
99
 
101
100
  const SheetBackgroundFrame = styled(YStack, {
@@ -211,7 +210,7 @@ export const SheetContainer = createStyledHOC(
211
210
  forwardedRef
212
211
  ) => {
213
212
  const context = useSheetContext(scope)
214
- const { hasFit, disableRemoveScroll, frameSize, contentRef, open } = context
213
+ const { hasFit, frameSize, contentRef, open } = context
215
214
  const composedContentRef = useComposedRefs(forwardedRef, contentRef)
216
215
  const offscreenSize = useSheetOffscreenSize(context)
217
216
  const stableFrameSize = useRef(frameSize)
@@ -223,6 +222,26 @@ export const SheetContainer = createStyledHOC(
223
222
  }, [open, frameSize])
224
223
 
225
224
  const sheetContents = useMemo(() => {
225
+ if (context.onlyShowContainer) {
226
+ return (
227
+ <SheetContainerFrame
228
+ ref={composedContentRef}
229
+ flex={hasFit ? 0 : 1}
230
+ flexBasis={hasFit ? 'auto' : undefined}
231
+ maxHeight={hasFit ? undefined : '100%'}
232
+ pointerEvents={open ? 'auto' : 'none'}
233
+ data-state={open ? 'open' : 'closed'}
234
+ {...props}
235
+ onLayout={composeEventHandlers(props.onLayout, (event) => {
236
+ context.setFrameSize(event.nativeEvent.layout.height)
237
+ })}
238
+ >
239
+ <StackZIndexContext zIndex={resolveViewZIndex(props.zIndex)}>
240
+ {children}
241
+ </StackZIndexContext>
242
+ </SheetContainerFrame>
243
+ )
244
+ }
226
245
  const shouldUseFixedHeight = hasFit && !open && stableFrameSize.current
227
246
 
228
247
  return (
@@ -230,6 +249,7 @@ export const SheetContainer = createStyledHOC(
230
249
  ref={composedContentRef}
231
250
  flex={hasFit && open ? 0 : 1}
232
251
  flexBasis={hasFit ? 'auto' : undefined}
252
+ maxHeight="100%"
233
253
  height={
234
254
  shouldUseFixedHeight
235
255
  ? stableFrameSize.current
@@ -250,10 +270,21 @@ export const SheetContainer = createStyledHOC(
250
270
  )}
251
271
  </SheetContainerFrame>
252
272
  )
253
- }, [open, props, frameSize, offscreenSize, adjustPaddingForOffscreenContent, hasFit])
273
+ }, [
274
+ open,
275
+ props,
276
+ frameSize,
277
+ offscreenSize,
278
+ adjustPaddingForOffscreenContent,
279
+ hasFit,
280
+ context.onlyShowContainer,
281
+ context.setFrameSize,
282
+ ])
283
+
284
+ if (context.onlyShowContainer) return sheetContents
254
285
 
255
286
  return (
256
- <RemoveScroll enabled={!disableRemoveScroll && context.open}>
287
+ <RemoveScroll enabled={!context.disableRemoveScroll && context.open}>
257
288
  {sheetContents}
258
289
  </RemoveScroll>
259
290
  )
@@ -275,6 +306,7 @@ export const SheetBackground = createStyledHOC(
275
306
  forwardedRef
276
307
  ) => {
277
308
  const context = useSheetContext(scope)
309
+ if (context.onlyShowContainer) return null
278
310
  const bottomOverflow = isWeb
279
311
  ? Math.max(context.frameSize, getMaxViewportHeight())
280
312
  : context.frameSize
@@ -302,17 +334,12 @@ export const SheetRoot = createRefComponent<RNView, SheetProps>(
302
334
  const isShowingAdaptNonSheet =
303
335
  shouldUseAdapt && !adaptContext.active && adaptContext.open
304
336
 
305
- let SheetImplementation = SheetImplementationCustom
306
-
307
- if (props.native && Platform.OS === 'ios') {
308
- if (process.env.TAMAGUI_TARGET === 'native') {
309
- const impl = getNativeSheet('ios')
310
- if (impl) {
311
- // @ts-expect-error accepting external sheet implementation
312
- SheetImplementation = impl
313
- }
314
- }
315
- }
337
+ const nativeImplementation =
338
+ props.native === true ||
339
+ (Array.isArray(props.native) && props.native.includes('ios'))
340
+ ? getNativeSheet('ios')
341
+ : null
342
+ const SheetImplementation = nativeImplementation ?? SheetImplementationCustom
316
343
 
317
344
  if (isShowingAdaptNonSheet || isShowingNonSheet || !hydrated) {
318
345
  return null
@@ -0,0 +1,42 @@
1
+ import * as React from 'react'
2
+ import { PanResponder, View } from 'react-native'
3
+
4
+ import { getGestureHandlerState } from './gestureState'
5
+ import type { SheetDragSurfaceProps } from './types'
6
+
7
+ /**
8
+ * The surface the sheet is dragged by.
9
+ *
10
+ * With react-native-gesture-handler set up the drag is a `Gesture.Pan`, which
11
+ * needs a native View of its own to attach to. Without it the drag runs on
12
+ * PanResponder, the same as web.
13
+ */
14
+ export function SheetDragSurface({
15
+ gestureHandlerEnabled,
16
+ panGesture,
17
+ panConfig,
18
+ children,
19
+ }: SheetDragSurfaceProps) {
20
+ const { GestureDetector } = getGestureHandlerState()
21
+
22
+ const panHandlers = React.useMemo(
23
+ () => (panConfig ? PanResponder.create(panConfig).panHandlers : undefined),
24
+ [panConfig]
25
+ )
26
+
27
+ if (gestureHandlerEnabled && panGesture && GestureDetector) {
28
+ return (
29
+ <GestureDetector gesture={panGesture}>
30
+ <View style={{ flex: 1 }} collapsable={false}>
31
+ {children}
32
+ </View>
33
+ </GestureDetector>
34
+ )
35
+ }
36
+
37
+ return (
38
+ <View {...panHandlers} style={{ flex: 1, width: '100%', height: '100%' }}>
39
+ {children}
40
+ </View>
41
+ )
42
+ }