@tamagui/sheet 1.0.1-beta.100 → 1.0.1-beta.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/Sheet.js CHANGED
@@ -29,25 +29,43 @@ var __objRest = (source, exclude) => {
29
29
  }
30
30
  return target;
31
31
  };
32
- import { isSSR, isWeb, styled, themeable, withStaticProperties } from "@tamagui/core";
32
+ import {
33
+ Theme,
34
+ isClient,
35
+ isWeb,
36
+ mergeEvent,
37
+ styled,
38
+ themeable,
39
+ useEvent,
40
+ useIsomorphicLayoutEffect,
41
+ useThemeName,
42
+ withStaticProperties
43
+ } from "@tamagui/core";
33
44
  import { createContextScope } from "@tamagui/create-context";
45
+ import { Portal } from "@tamagui/portal";
34
46
  import { XStack, YStack } from "@tamagui/stacks";
35
47
  import { useControllableState } from "@tamagui/use-controllable-state";
36
48
  import React, {
49
+ createContext,
37
50
  forwardRef,
38
51
  isValidElement,
39
- useCallback,
52
+ useContext,
40
53
  useEffect,
41
54
  useLayoutEffect,
42
55
  useMemo,
43
56
  useRef,
44
57
  useState
45
58
  } from "react";
46
- import { Animated, PanResponder } from "react-native";
47
- const DRAWER_NAME = "Drawer";
48
- const DRAWER_HANDLE_NAME = "DrawerHandle";
49
- const DrawerHandleFrame = styled(XStack, {
50
- name: DRAWER_HANDLE_NAME,
59
+ import {
60
+ Animated,
61
+ PanResponder
62
+ } from "react-native";
63
+ const SHEET_NAME = "Sheet";
64
+ const SHEET_HANDLE_NAME = "SheetHandle";
65
+ const [createSheetContext, createSheetScope] = createContextScope(SHEET_NAME);
66
+ const [SheetProvider, useSheetContext] = createSheetContext(SHEET_NAME, {});
67
+ const SheetHandleFrame = styled(XStack, {
68
+ name: SHEET_HANDLE_NAME,
51
69
  height: 10,
52
70
  borderRadius: 100,
53
71
  backgroundColor: "$background",
@@ -63,107 +81,200 @@ const DrawerHandleFrame = styled(XStack, {
63
81
  opacity: 0.7
64
82
  }
65
83
  });
66
- const DrawerHandle = DrawerHandleFrame.extractable((_a) => {
67
- var _b = _a, { __scopeDrawer } = _b, props = __objRest(_b, ["__scopeDrawer"]);
68
- const context = useDrawerContext(DRAWER_HANDLE_NAME, __scopeDrawer);
69
- return /* @__PURE__ */ React.createElement(DrawerHandleFrame, __spreadValues({
84
+ const SheetHandle = SheetHandleFrame.extractable((_a) => {
85
+ var _b = _a, { __scopeSheet } = _b, props = __objRest(_b, ["__scopeSheet"]);
86
+ const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet);
87
+ if (context.open === false) {
88
+ return null;
89
+ }
90
+ return /* @__PURE__ */ React.createElement(SheetHandleFrame, __spreadValues({
70
91
  onPress: () => {
71
92
  const nextPos = (context.position + 1) % context.snapPoints.length;
72
93
  context.setPosition(nextPos);
73
94
  }
74
95
  }, props));
75
96
  });
76
- const [createDrawerContext, createDrawerScope] = createContextScope(DRAWER_NAME);
77
- const [DrawerProvider, useDrawerContext] = createDrawerContext(DRAWER_NAME, {});
78
- const DrawerBackdrop = styled(YStack, {
79
- name: "DrawerBackdrop",
97
+ const SheetOverlayFrame = styled(YStack, {
98
+ name: "SheetOverlay",
80
99
  backgroundColor: "$color",
81
100
  fullscreen: true,
82
- opacity: 0.2
101
+ opacity: 0.2,
102
+ zIndex: 0,
103
+ variants: {
104
+ closed: {
105
+ true: {
106
+ opacity: 0,
107
+ pointerEvents: "none"
108
+ },
109
+ false: {
110
+ pointerEvents: "auto"
111
+ }
112
+ }
113
+ }
83
114
  });
84
- const DrawerFrame = styled(YStack, {
85
- name: "DrawerFrame",
115
+ const SheetOverlay = SheetOverlayFrame.extractable((_c) => {
116
+ var _d = _c, { __scopeSheet } = _d, props = __objRest(_d, ["__scopeSheet"]);
117
+ const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet);
118
+ return /* @__PURE__ */ React.createElement(SheetOverlayFrame, __spreadProps(__spreadValues({
119
+ closed: !context.open || context.hidden
120
+ }, props), {
121
+ onPress: mergeEvent(props.onPress, context.dismissOnOverlayPress ? () => {
122
+ context.setOpen(false);
123
+ } : void 0)
124
+ }));
125
+ });
126
+ const selectionStyleSheet = isClient ? document.createElement("style") : null;
127
+ if (selectionStyleSheet) {
128
+ document.head.appendChild(selectionStyleSheet);
129
+ }
130
+ const SheetFrame = styled(YStack, {
131
+ name: "SheetFrame",
86
132
  flex: 1,
87
133
  backgroundColor: "$background",
88
134
  borderTopLeftRadius: "$4",
89
135
  borderTopRightRadius: "$4",
90
136
  padding: "$4",
91
- width: "100%"
137
+ width: "100%",
138
+ pointerEvents: "auto"
92
139
  });
93
- const useIsSSR = () => {
94
- const [val, setVal] = useState(isWeb ? isSSR : false);
95
- useEffect(() => {
96
- if (isWeb && !isSSR) {
97
- setVal(false);
98
- }
99
- }, []);
100
- return val;
101
- };
102
- const Drawer = withStaticProperties(themeable(forwardRef((props, ref) => {
103
- const _a = props, {
104
- __scopeDrawer,
140
+ const HIDDEN_SIZE = 1e4;
141
+ const Sheet = withStaticProperties(themeable(forwardRef((props, ref) => {
142
+ const {
143
+ __scopeSheet,
105
144
  snapPoints: snapPointsProp = [80, 10],
145
+ open: openProp,
146
+ defaultOpen,
106
147
  children: childrenProp,
107
148
  position: positionProp,
108
149
  onChangePosition,
109
- defaultPosition
110
- } = _a, rest = __objRest(_a, [
111
- "__scopeDrawer",
112
- "snapPoints",
113
- "children",
114
- "position",
115
- "onChangePosition",
116
- "defaultPosition"
117
- ]);
118
- const isServerSide = useIsSSR();
119
- const [position, setPosition] = useControllableState({
150
+ onChangeOpen,
151
+ defaultPosition,
152
+ dismissOnOverlayPress = true,
153
+ animationConfig,
154
+ disableDrag: disableDragProp,
155
+ modal
156
+ } = props;
157
+ const controller = useContext(SheetControllerContext);
158
+ const isHidden = (controller == null ? void 0 : controller.hidden) || false;
159
+ const disableDrag = disableDragProp ?? (controller == null ? void 0 : controller.disableDrag);
160
+ const themeName = useThemeName();
161
+ const onChangeOpenInternal = (val) => {
162
+ var _a;
163
+ (_a = controller == null ? void 0 : controller.onChangeOpen) == null ? void 0 : _a.call(controller, val);
164
+ onChangeOpen == null ? void 0 : onChangeOpen(val);
165
+ };
166
+ const [open, setOpen] = useControllableState({
167
+ prop: (controller == null ? void 0 : controller.open) ?? openProp,
168
+ defaultProp: defaultOpen || true,
169
+ onChange: onChangeOpenInternal,
170
+ strategy: controller ? "most-recent-wins" : "prop-wins"
171
+ });
172
+ const [frameSize, setFrameSize] = useState(0);
173
+ const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)]);
174
+ const [position_, setPosition] = useControllableState({
120
175
  prop: positionProp,
121
- defaultProp: defaultPosition || 0,
122
- onChange: onChangePosition,
123
- strategy: "most-recent-wins"
176
+ defaultProp: defaultPosition || (open ? 0 : -1),
177
+ onChange: onChangePosition
124
178
  });
125
- const [layout, setLayout] = useState();
179
+ const position = open === false ? -1 : position_;
126
180
  const positionValue = useRef();
127
181
  if (!positionValue.current) {
128
- positionValue.current = new Animated.Value(position);
129
- }
130
- const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)]);
131
- if (isServerSide) {
132
- return null;
182
+ positionValue.current = new Animated.Value(HIDDEN_SIZE);
133
183
  }
184
+ const [isResizing, setIsResizing] = useState(true);
185
+ useLayoutEffect(() => {
186
+ if (!isResizing) {
187
+ setIsResizing(true);
188
+ }
189
+ }, [modal]);
134
190
  const spring = useRef(null);
135
191
  function stopSpring() {
136
- var _a2;
137
- (_a2 = spring.current) == null ? void 0 : _a2.stop();
192
+ var _a;
193
+ (_a = spring.current) == null ? void 0 : _a.stop();
138
194
  spring.current = null;
139
195
  }
140
- const positions = useMemo(() => snapPoints.map((point) => getYForPosition(point, layout)), [layout, snapPoints]);
141
- const animateTo = useCallback((position2) => {
142
- if (!positionValue.current)
196
+ const shouldSetPositionOpen = open && position < 0;
197
+ useEffect(() => {
198
+ if (shouldSetPositionOpen) {
199
+ setPosition(0);
200
+ }
201
+ }, [setPosition, shouldSetPositionOpen]);
202
+ const positions = useMemo(() => snapPoints.map((point) => getPercentSize(point, frameSize)), [frameSize, snapPoints]);
203
+ const animateTo = useEvent((position2) => {
204
+ const pos = positionValue.current;
205
+ if (isHidden && open)
206
+ return;
207
+ if (!pos)
208
+ return;
209
+ if (frameSize === 0)
210
+ return;
211
+ const hiddenValue = frameSize === 0 ? HIDDEN_SIZE : frameSize;
212
+ const toValue = isHidden || position2 === -1 ? hiddenValue : positions[position2];
213
+ if (pos["_value"] === toValue)
143
214
  return;
144
- const toValue = positions[position2];
145
215
  stopSpring();
146
- spring.current = Animated.spring(positionValue.current, {
216
+ if (isHidden || isResizing) {
217
+ if (isResizing) {
218
+ setIsResizing(false);
219
+ }
220
+ Animated.timing(pos, {
221
+ useNativeDriver: !isWeb,
222
+ toValue,
223
+ duration: 0
224
+ }).start();
225
+ return;
226
+ }
227
+ const overshootClamping = pos["_value"] === HIDDEN_SIZE;
228
+ spring.current = Animated.spring(pos, __spreadValues({
147
229
  useNativeDriver: !isWeb,
148
- toValue
149
- });
230
+ toValue,
231
+ overshootClamping
232
+ }, animationConfig));
150
233
  spring.current.start(({ finished }) => finished && stopSpring());
151
- }, [positions]);
234
+ });
152
235
  useLayoutEffect(() => {
153
236
  animateTo(position);
154
- }, [position, animateTo]);
237
+ }, [isHidden, frameSize, position, animateTo]);
155
238
  const panResponder = useMemo(() => {
156
- if (!layout)
239
+ if (disableDrag)
240
+ return;
241
+ if (!frameSize)
157
242
  return;
158
- console.log("setup pan");
159
243
  const pos = positionValue.current;
160
244
  const minY = positions[0];
161
245
  let startY = pos["_value"];
246
+ function makeUnselectable(val) {
247
+ if (!selectionStyleSheet)
248
+ return;
249
+ if (!val) {
250
+ selectionStyleSheet.innerText = ``;
251
+ } else {
252
+ selectionStyleSheet.innerText = `:root * { user-select: none !important; -webkit-user-select: none !important; }`;
253
+ }
254
+ }
255
+ const finish = (_e, { vy, dy }) => {
256
+ makeUnselectable(false);
257
+ const at = dy + startY;
258
+ const end = at + frameSize * vy * 0.33;
259
+ let closestPoint = 0;
260
+ let dist = Infinity;
261
+ for (let i = 0; i < positions.length; i++) {
262
+ const position2 = positions[i];
263
+ const curDist = end > position2 ? end - position2 : position2 - end;
264
+ if (curDist < dist) {
265
+ dist = curDist;
266
+ closestPoint = i;
267
+ }
268
+ }
269
+ setPosition(closestPoint);
270
+ animateTo(closestPoint);
271
+ };
162
272
  return PanResponder.create({
163
273
  onMoveShouldSetPanResponder: (_e, { dy }) => {
164
274
  return Math.abs(dy) > 6;
165
275
  },
166
276
  onPanResponderGrant: () => {
277
+ makeUnselectable(true);
167
278
  stopSpring();
168
279
  startY = pos["_value"];
169
280
  },
@@ -171,76 +282,87 @@ const Drawer = withStaticProperties(themeable(forwardRef((props, ref) => {
171
282
  const to = dy + startY;
172
283
  pos.setValue(resisted(to, minY));
173
284
  },
174
- onPanResponderRelease: (_e, { vy, dy }) => {
175
- const at = dy + startY;
176
- const end = at + layout.height * vy * 0.33;
177
- let closestPoint = 0;
178
- let dist = Infinity;
179
- for (let i = 0; i < positions.length; i++) {
180
- const position2 = positions[i];
181
- const curDist = end > position2 ? end - position2 : position2 - end;
182
- if (curDist < dist) {
183
- dist = curDist;
184
- closestPoint = i;
185
- }
186
- }
187
- setPosition(closestPoint);
188
- animateTo(closestPoint);
189
- }
285
+ onPanResponderEnd: finish,
286
+ onPanResponderTerminate: finish,
287
+ onPanResponderRelease: finish
190
288
  });
191
- }, [layout, positions, setPosition]);
289
+ }, [disableDrag, animateTo, frameSize, positions, setPosition]);
192
290
  let handleComponent = null;
193
- let backdropComponent = null;
291
+ let overlayComponent = null;
194
292
  let frameComponent = null;
195
293
  React.Children.forEach(childrenProp, (child) => {
196
- var _a2;
294
+ var _a, _b;
197
295
  if (isValidElement(child)) {
198
- switch ((_a2 = child.type) == null ? void 0 : _a2["staticConfig"].componentName) {
199
- case "DrawerHandle":
296
+ const name = (_b = (_a = child.type) == null ? void 0 : _a["staticConfig"]) == null ? void 0 : _b.componentName;
297
+ switch (name) {
298
+ case "SheetHandle":
200
299
  handleComponent = child;
201
300
  break;
202
- case "DrawerFrame":
301
+ case "SheetFrame":
203
302
  frameComponent = child;
204
303
  break;
205
- case "DrawerBackdrop":
206
- backdropComponent = child;
304
+ case "SheetOverlay":
305
+ overlayComponent = child;
207
306
  break;
208
307
  default:
209
- console.warn("Warning: passed invalid child to Drawer", child);
308
+ console.warn("Warning: passed invalid child to Sheet", child);
210
309
  }
211
310
  }
212
311
  });
213
- return /* @__PURE__ */ React.createElement(DrawerProvider, {
214
- scope: __scopeDrawer,
312
+ const preventShown = (controller == null ? void 0 : controller.hidden) && (controller == null ? void 0 : controller.open);
313
+ if (preventShown) {
314
+ return null;
315
+ }
316
+ const contents = /* @__PURE__ */ React.createElement(SheetProvider, {
317
+ dismissOnOverlayPress,
318
+ open,
319
+ hidden: isHidden,
320
+ scope: __scopeSheet,
215
321
  position,
216
322
  snapPoints,
217
- setPosition
218
- }, backdropComponent, handleComponent, /* @__PURE__ */ React.createElement(Animated.View, __spreadProps(__spreadValues({}, panResponder == null ? void 0 : panResponder.panHandlers), {
323
+ setPosition,
324
+ setOpen
325
+ }, isResizing ? null : overlayComponent, isHidden ? null : handleComponent, /* @__PURE__ */ React.createElement(Animated.View, __spreadProps(__spreadValues({
326
+ ref
327
+ }, panResponder == null ? void 0 : panResponder.panHandlers), {
219
328
  onLayout: (e) => {
220
- setLayout(e.nativeEvent.layout);
329
+ const next = e.nativeEvent.layout.height;
330
+ setFrameSize((prev) => {
331
+ const isBigChange = Math.abs(prev - next) > 50;
332
+ setIsResizing(isBigChange);
333
+ return next;
334
+ });
221
335
  },
222
336
  style: {
337
+ position: "absolute",
338
+ zIndex: 10,
223
339
  width: "100%",
224
340
  height: "100%",
225
- transform: [{ translateY: positionValue.current }]
341
+ transform: [{ translateY: frameSize === 0 ? HIDDEN_SIZE : positionValue.current }]
226
342
  }
227
- }), frameComponent));
343
+ }), isResizing ? null : frameComponent));
344
+ if (modal) {
345
+ return /* @__PURE__ */ React.createElement(Portal, null, /* @__PURE__ */ React.createElement(Theme, {
346
+ name: themeName
347
+ }, contents));
348
+ }
349
+ return contents;
228
350
  }), {
229
- componentName: "Drawer"
351
+ componentName: "Sheet"
230
352
  }), {
231
- Handle: DrawerHandle,
232
- Frame: DrawerFrame,
233
- Backdrop: DrawerBackdrop
353
+ Handle: SheetHandle,
354
+ Frame: SheetFrame,
355
+ Overlay: SheetOverlay
234
356
  });
235
- function getYForPosition(point, layout) {
236
- if (!layout)
357
+ function getPercentSize(point, frameSize) {
358
+ if (!frameSize)
237
359
  return 0;
238
360
  if (point === void 0) {
239
361
  console.warn(`No snapPoint`);
240
362
  return 0;
241
363
  }
242
364
  const pct = point / 100;
243
- const next = layout.height - pct * layout.height;
365
+ const next = frameSize - pct * frameSize;
244
366
  return next;
245
367
  }
246
368
  function resisted(y, minY, maxOverflow = 25) {
@@ -253,12 +375,43 @@ function resisted(y, minY, maxOverflow = 25) {
253
375
  }
254
376
  return y;
255
377
  }
378
+ const SheetControllerContext = createContext(null);
379
+ const SheetController = (_e) => {
380
+ var _f = _e, {
381
+ children,
382
+ onChangeOpen: onChangeOpenProp
383
+ } = _f, value = __objRest(_f, [
384
+ "children",
385
+ "onChangeOpen"
386
+ ]);
387
+ const onChangeOpen = useEvent(onChangeOpenProp);
388
+ const memoValue = useMemo(() => ({
389
+ open: value.open,
390
+ hidden: value.hidden,
391
+ disableDrag: value.disableDrag,
392
+ onChangeOpen
393
+ }), [onChangeOpen, value.open, value.hidden, value.disableDrag]);
394
+ return /* @__PURE__ */ React.createElement(SheetControllerContext.Provider, {
395
+ value: memoValue
396
+ }, children);
397
+ };
398
+ function useLastRenderValue(val) {
399
+ const ref = useRef(val);
400
+ useIsomorphicLayoutEffect(() => {
401
+ return () => {
402
+ ref.current = val;
403
+ };
404
+ });
405
+ return ref.current;
406
+ }
256
407
  export {
257
- Drawer,
258
- DrawerBackdrop,
259
- DrawerFrame,
260
- DrawerHandle,
261
- DrawerHandleFrame,
262
- createDrawerScope
408
+ Sheet,
409
+ SheetController,
410
+ SheetFrame,
411
+ SheetHandle,
412
+ SheetHandleFrame,
413
+ SheetOverlay,
414
+ SheetOverlayFrame,
415
+ createSheetScope
263
416
  };
264
417
  //# sourceMappingURL=Sheet.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Sheet.tsx"],
4
- "sourcesContent": ["import { isSSR, isWeb, styled, themeable, withStaticProperties } from '@tamagui/core'\nimport { ScopedProps, createContextScope } from '@tamagui/create-context'\nimport { XStack, XStackProps, YStack } from '@tamagui/stacks'\nimport { useControllableState } from '@tamagui/use-controllable-state'\nimport React, {\n ReactNode,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { Animated, LayoutRectangle, PanResponder, View } from 'react-native'\n\ntype PositionChangeHandler =\n | ((position: number) => void)\n | React.Dispatch<React.SetStateAction<number>>\n\nconst DRAWER_NAME = 'Drawer'\nconst DRAWER_HANDLE_NAME = 'DrawerHandle'\n\nexport const DrawerHandleFrame = styled(XStack, {\n name: DRAWER_HANDLE_NAME,\n height: 10,\n borderRadius: 100,\n backgroundColor: '$background',\n position: 'absolute',\n pointerEvents: 'auto',\n zIndex: 10,\n y: -18,\n top: 0,\n left: '35%',\n right: '35%',\n opacity: 0.5,\n\n hoverStyle: {\n opacity: 0.7,\n },\n})\n\nexport const DrawerHandle = DrawerHandleFrame.extractable(\n ({ __scopeDrawer, ...props }: ScopedProps<XStackProps, 'Drawer'>) => {\n const context = useDrawerContext(DRAWER_HANDLE_NAME, __scopeDrawer)\n\n return (\n <DrawerHandleFrame\n onPress={() => {\n const nextPos = (context.position + 1) % context.snapPoints.length\n context.setPosition(nextPos)\n }}\n {...props}\n />\n )\n }\n)\n\ntype DrawerContextValue = {\n position: number\n snapPoints: number[]\n setPosition: React.Dispatch<React.SetStateAction<number>>\n}\n\nconst [createDrawerContext, createDrawerScope] = createContextScope(DRAWER_NAME)\nconst [DrawerProvider, useDrawerContext] = createDrawerContext<DrawerContextValue>(\n DRAWER_NAME,\n {} as any\n)\n\nexport const DrawerBackdrop = styled(YStack, {\n name: 'DrawerBackdrop',\n backgroundColor: '$color',\n fullscreen: true,\n opacity: 0.2,\n})\n\nexport const DrawerFrame = styled(YStack, {\n name: 'DrawerFrame',\n flex: 1,\n backgroundColor: '$background',\n borderTopLeftRadius: '$4',\n borderTopRightRadius: '$4',\n padding: '$4',\n width: '100%',\n})\n\nexport type DrawerProps = ScopedProps<\n {\n open?: boolean\n defaultOpen?: boolean\n defaultPosition?: number\n snapPoints?: number[]\n position?: number\n onChangePosition?: PositionChangeHandler\n children?: ReactNode\n },\n 'Drawer'\n>\n\nconst useIsSSR = () => {\n const [val, setVal] = useState(isWeb ? isSSR : false)\n useEffect(() => {\n if (isWeb && !isSSR) {\n setVal(false)\n }\n }, [])\n return val\n}\n\nexport const Drawer = withStaticProperties(\n themeable(\n forwardRef<View, DrawerProps>((props, ref) => {\n const {\n __scopeDrawer,\n snapPoints: snapPointsProp = [80, 10],\n children: childrenProp,\n position: positionProp,\n onChangePosition,\n defaultPosition,\n ...rest\n } = props\n const isServerSide = useIsSSR()\n\n const [position, setPosition] = useControllableState({\n prop: positionProp,\n defaultProp: defaultPosition || 0,\n onChange: onChangePosition,\n strategy: 'most-recent-wins',\n })\n\n const [layout, setLayout] = useState<LayoutRectangle>()\n\n const positionValue = useRef<Animated.Value>()\n if (!positionValue.current) {\n positionValue.current = new Animated.Value(position)\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)])\n\n // we can put non-server side hooks after conditional because based on env\n if (isServerSide) {\n return null\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const spring = useRef<Animated.CompositeAnimation | null>(null)\n\n function stopSpring() {\n spring.current?.stop()\n spring.current = null\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const positions = useMemo(\n () => snapPoints.map((point) => getYForPosition(point, layout)),\n [layout, snapPoints]\n )\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const animateTo = useCallback(\n (position: number) => {\n if (!positionValue.current) return\n const toValue = positions[position]\n stopSpring()\n spring.current = Animated.spring(positionValue.current, {\n useNativeDriver: !isWeb,\n toValue,\n })\n spring.current.start(({ finished }) => finished && stopSpring())\n },\n [positions]\n )\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useLayoutEffect(() => {\n animateTo(position)\n }, [position, animateTo])\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const panResponder = useMemo(() => {\n if (!layout) return\n console.log('setup pan')\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pos = positionValue.current!\n const minY = positions[0]\n let startY = pos['_value']\n\n return PanResponder.create({\n onMoveShouldSetPanResponder: (_e, { dy }) => {\n // we could do some detection of other touchables and cancel here..\n // console.log('wut is', _e)\n return Math.abs(dy) > 6\n },\n onPanResponderGrant: () => {\n stopSpring()\n startY = pos['_value']\n },\n onPanResponderMove: (_e, { dy }) => {\n const to = dy + startY\n pos.setValue(resisted(to, minY))\n },\n onPanResponderRelease: (_e, { vy, dy }) => {\n const at = dy + startY\n // seems liky vy goes up to about 4 at the very most (+ is down, - is up)\n // lets base our multiplier on the total layout height\n const end = at + layout.height * vy * 0.33\n let closestPoint = 0\n let dist = Infinity\n for (let i = 0; i < positions.length; i++) {\n const position = positions[i]\n const curDist = end > position ? end - position : position - end\n if (curDist < dist) {\n dist = curDist\n closestPoint = i\n }\n }\n // have to call both because state may not change but need to snap back\n setPosition(closestPoint)\n animateTo(closestPoint)\n },\n })\n }, [layout, positions, setPosition])\n\n let handleComponent: React.ReactElement | null = null\n let backdropComponent: React.ReactElement | null = null\n let frameComponent: React.ReactElement | null = null\n\n React.Children.forEach(childrenProp, (child) => {\n if (isValidElement(child)) {\n switch (child.type?.['staticConfig'].componentName) {\n case 'DrawerHandle':\n handleComponent = child\n break\n case 'DrawerFrame':\n frameComponent = child\n break\n case 'DrawerBackdrop':\n backdropComponent = child\n break\n default:\n console.warn('Warning: passed invalid child to Drawer', child)\n }\n }\n })\n\n return (\n <DrawerProvider\n scope={__scopeDrawer}\n position={position}\n snapPoints={snapPoints}\n setPosition={setPosition}\n >\n {backdropComponent}\n {handleComponent}\n <Animated.View\n {...panResponder?.panHandlers}\n onLayout={(e) => {\n setLayout(e.nativeEvent.layout)\n }}\n style={{\n width: '100%',\n height: '100%',\n transform: [{ translateY: positionValue.current }],\n }}\n >\n {frameComponent}\n </Animated.View>\n </DrawerProvider>\n )\n }),\n {\n componentName: 'Drawer',\n }\n ),\n {\n Handle: DrawerHandle,\n Frame: DrawerFrame,\n Backdrop: DrawerBackdrop,\n }\n)\n\nfunction getYForPosition(point?: number, layout?: LayoutRectangle) {\n if (!layout) return 0\n if (point === undefined) {\n console.warn(`No snapPoint`)\n return 0\n }\n const pct = point / 100\n const next = layout.height - pct * layout.height\n return next\n}\n\nfunction resisted(y: number, minY: number, maxOverflow = 25) {\n if (y < minY) {\n const past = minY - y\n const pctPast = Math.min(maxOverflow, past) / maxOverflow\n const diminishBy = 1.1 - Math.pow(0.1, pctPast)\n const extra = -diminishBy * maxOverflow\n return minY + extra\n }\n return y\n}\n\nexport { createDrawerScope }\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n GetProps,\n Theme,\n isClient,\n isWeb,\n mergeEvent,\n styled,\n themeable,\n useEvent,\n useIsomorphicLayoutEffect,\n useThemeName,\n withStaticProperties,\n} from '@tamagui/core'\nimport { ScopedProps, createContextScope } from '@tamagui/create-context'\nimport { Portal } from '@tamagui/portal'\nimport { XStack, XStackProps, YStack } from '@tamagui/stacks'\nimport { useControllableState } from '@tamagui/use-controllable-state'\nimport React, {\n ReactNode,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n Animated,\n GestureResponderEvent,\n PanResponder,\n PanResponderGestureState,\n View,\n} from 'react-native'\n\nconst SHEET_NAME = 'Sheet'\nconst SHEET_HANDLE_NAME = 'SheetHandle'\n\nexport type SheetProps = ScopedProps<\n {\n open?: boolean\n defaultOpen?: boolean\n onChangeOpen?: OpenChangeHandler\n position?: number\n defaultPosition?: number\n snapPoints?: number[]\n onChangePosition?: PositionChangeHandler\n children?: ReactNode\n dismissOnOverlayPress?: boolean\n animationConfig?: Animated.SpringAnimationConfig\n disableDrag?: boolean\n modal?: boolean\n },\n 'Sheet'\n>\n\ntype PositionChangeHandler =\n | ((position: number) => void)\n | React.Dispatch<React.SetStateAction<number>>\n\ntype OpenChangeHandler = ((open: boolean) => void) | React.Dispatch<React.SetStateAction<boolean>>\n\ntype SheetContextValue = Required<\n Pick<SheetProps, 'open' | 'position' | 'snapPoints' | 'dismissOnOverlayPress'>\n> & {\n hidden: boolean\n setPosition: React.Dispatch<React.SetStateAction<number>>\n setOpen: React.Dispatch<React.SetStateAction<boolean>>\n}\n\nconst [createSheetContext, createSheetScope] = createContextScope(SHEET_NAME)\nconst [SheetProvider, useSheetContext] = createSheetContext<SheetContextValue>(\n SHEET_NAME,\n {} as any\n)\n\nexport const SheetHandleFrame = styled(XStack, {\n name: SHEET_HANDLE_NAME,\n height: 10,\n borderRadius: 100,\n backgroundColor: '$background',\n position: 'absolute',\n pointerEvents: 'auto',\n zIndex: 10,\n y: -18,\n top: 0,\n left: '35%',\n right: '35%',\n opacity: 0.5,\n\n hoverStyle: {\n opacity: 0.7,\n },\n})\n\ntype SheetScopedProps<A> = ScopedProps<A, 'Sheet'>\n\nexport const SheetHandle = SheetHandleFrame.extractable(\n ({ __scopeSheet, ...props }: SheetScopedProps<XStackProps>) => {\n const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet)\n\n if (context.open === false) {\n return null\n }\n\n return (\n <SheetHandleFrame\n onPress={() => {\n const nextPos = (context.position + 1) % context.snapPoints.length\n context.setPosition(nextPos)\n }}\n {...props}\n />\n )\n }\n)\n\nexport const SheetOverlayFrame = styled(YStack, {\n name: 'SheetOverlay',\n // TODO this should be $background without opacity and just customized by theme\n backgroundColor: '$color',\n fullscreen: true,\n opacity: 0.2,\n zIndex: 0,\n\n variants: {\n closed: {\n true: {\n opacity: 0,\n pointerEvents: 'none',\n },\n false: {\n pointerEvents: 'auto',\n },\n // TODO still have as const bug\n } as const,\n },\n})\n\nexport type SheetOverlayProps = GetProps<typeof SheetOverlayFrame>\n\nexport const SheetOverlay = SheetOverlayFrame.extractable(\n ({ __scopeSheet, ...props }: SheetScopedProps<SheetOverlayProps>) => {\n const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet)\n return (\n <SheetOverlayFrame\n closed={!context.open || context.hidden}\n {...props}\n onPress={mergeEvent(\n props.onPress,\n context.dismissOnOverlayPress\n ? () => {\n context.setOpen(false)\n }\n : undefined\n )}\n />\n )\n }\n)\n\nconst selectionStyleSheet = isClient ? document.createElement('style') : null\nif (selectionStyleSheet) {\n document.head.appendChild(selectionStyleSheet)\n}\n\nexport const SheetFrame = styled(YStack, {\n name: 'SheetFrame',\n flex: 1,\n backgroundColor: '$background',\n borderTopLeftRadius: '$4',\n borderTopRightRadius: '$4',\n padding: '$4',\n width: '100%',\n pointerEvents: 'auto',\n})\n\n// set all the way off screen\nconst HIDDEN_SIZE = 10_000\n\nexport const Sheet = withStaticProperties(\n themeable(\n forwardRef<View, SheetProps>((props, ref) => {\n const {\n __scopeSheet,\n snapPoints: snapPointsProp = [80, 10],\n open: openProp,\n defaultOpen,\n children: childrenProp,\n position: positionProp,\n onChangePosition,\n onChangeOpen,\n defaultPosition,\n dismissOnOverlayPress = true,\n animationConfig,\n disableDrag: disableDragProp,\n modal,\n } = props\n\n // allows for sheets to be controlled by other components\n const controller = useContext(SheetControllerContext)\n const isHidden = controller?.hidden || false\n const disableDrag = disableDragProp ?? controller?.disableDrag\n const themeName = useThemeName()\n\n const onChangeOpenInternal = (val: boolean) => {\n controller?.onChangeOpen?.(val)\n onChangeOpen?.(val)\n }\n\n const [open, setOpen] = useControllableState({\n prop: controller?.open ?? openProp,\n defaultProp: defaultOpen || true,\n onChange: onChangeOpenInternal,\n strategy: controller ? 'most-recent-wins' : 'prop-wins',\n })\n\n const [frameSize, setFrameSize] = useState<number>(0)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)])\n\n // lets set -1 to be always the \"open = false\" position\n const [position_, setPosition] = useControllableState({\n prop: positionProp,\n defaultProp: defaultPosition || (open ? 0 : -1),\n onChange: onChangePosition,\n })\n const position = open === false ? -1 : position_\n\n const positionValue = useRef<Animated.Value>()\n if (!positionValue.current) {\n positionValue.current = new Animated.Value(HIDDEN_SIZE)\n }\n\n const [isResizing, setIsResizing] = useState(true)\n useLayoutEffect(() => {\n if (!isResizing) {\n setIsResizing(true)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [modal])\n\n const spring = useRef<Animated.CompositeAnimation | null>(null)\n function stopSpring() {\n spring.current?.stop()\n spring.current = null\n }\n\n // open must set position\n const shouldSetPositionOpen = open && position < 0\n useEffect(() => {\n if (shouldSetPositionOpen) {\n setPosition(0)\n }\n }, [setPosition, shouldSetPositionOpen])\n\n const positions = useMemo(\n () => snapPoints.map((point) => getPercentSize(point, frameSize)),\n [frameSize, snapPoints]\n )\n\n const animateTo = useEvent((position: number) => {\n const pos = positionValue.current\n if (isHidden && open) return\n if (!pos) return\n if (frameSize === 0) return\n const hiddenValue = frameSize === 0 ? HIDDEN_SIZE : frameSize\n const toValue = isHidden || position === -1 ? hiddenValue : positions[position]\n if (pos['_value'] === toValue) return\n stopSpring()\n if (isHidden || isResizing) {\n if (isResizing) {\n setIsResizing(false)\n }\n Animated.timing(pos, {\n useNativeDriver: !isWeb,\n toValue,\n duration: 0,\n }).start()\n return\n }\n // dont bounce on initial measure to bottom\n const overshootClamping = pos['_value'] === HIDDEN_SIZE\n spring.current = Animated.spring(pos, {\n useNativeDriver: !isWeb,\n toValue,\n overshootClamping,\n ...animationConfig,\n })\n spring.current.start(({ finished }) => finished && stopSpring())\n })\n\n useLayoutEffect(() => {\n animateTo(position)\n }, [isHidden, frameSize, position, animateTo])\n\n const panResponder = useMemo(() => {\n if (disableDrag) return\n if (!frameSize) return\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pos = positionValue.current!\n const minY = positions[0]\n let startY = pos['_value']\n\n function makeUnselectable(val: boolean) {\n if (!selectionStyleSheet) return\n if (!val) {\n selectionStyleSheet.innerText = ``\n } else {\n selectionStyleSheet.innerText = `:root * { user-select: none !important; -webkit-user-select: none !important; }`\n }\n }\n\n const finish = (_e: GestureResponderEvent, { vy, dy }: PanResponderGestureState) => {\n makeUnselectable(false)\n const at = dy + startY\n // seems liky vy goes up to about 4 at the very most (+ is down, - is up)\n // lets base our multiplier on the total layout height\n const end = at + frameSize * vy * 0.33\n let closestPoint = 0\n let dist = Infinity\n for (let i = 0; i < positions.length; i++) {\n const position = positions[i]\n const curDist = end > position ? end - position : position - end\n if (curDist < dist) {\n dist = curDist\n closestPoint = i\n }\n }\n // have to call both because state may not change but need to snap back\n setPosition(closestPoint)\n animateTo(closestPoint)\n }\n\n return PanResponder.create({\n onMoveShouldSetPanResponder: (_e, { dy }) => {\n // we could do some detection of other touchables and cancel here..\n return Math.abs(dy) > 6\n },\n onPanResponderGrant: () => {\n makeUnselectable(true)\n stopSpring()\n startY = pos['_value']\n },\n onPanResponderMove: (_e, { dy }) => {\n const to = dy + startY\n pos.setValue(resisted(to, minY))\n },\n onPanResponderEnd: finish,\n onPanResponderTerminate: finish,\n onPanResponderRelease: finish,\n })\n }, [disableDrag, animateTo, frameSize, positions, setPosition])\n\n let handleComponent: React.ReactElement | null = null\n let overlayComponent: React.ReactElement | null = null\n let frameComponent: React.ReactElement | null = null\n\n // TODO do more radix-like and don't require direct children descendents\n React.Children.forEach(childrenProp, (child) => {\n if (isValidElement(child)) {\n const name = child.type?.['staticConfig']?.componentName\n switch (name) {\n case 'SheetHandle':\n handleComponent = child\n break\n case 'SheetFrame':\n frameComponent = child\n break\n case 'SheetOverlay':\n overlayComponent = child\n break\n default:\n console.warn('Warning: passed invalid child to Sheet', child)\n }\n }\n })\n\n const preventShown = controller?.hidden && controller?.open\n\n if (preventShown) {\n return null\n }\n\n const contents = (\n <SheetProvider\n dismissOnOverlayPress={dismissOnOverlayPress}\n open={open}\n hidden={isHidden}\n scope={__scopeSheet}\n position={position}\n snapPoints={snapPoints}\n setPosition={setPosition}\n setOpen={setOpen}\n >\n {isResizing ? null : overlayComponent}\n {/* no fancy hidden animation etc for handle for now */}\n {isHidden ? null : handleComponent}\n <Animated.View\n ref={ref}\n {...panResponder?.panHandlers}\n onLayout={(e) => {\n const next = e.nativeEvent.layout.height\n setFrameSize((prev) => {\n const isBigChange = Math.abs(prev - next) > 50\n setIsResizing(isBigChange)\n return next\n })\n }}\n // pointerEvents={open ? 'auto' : 'none'}\n style={{\n position: 'absolute',\n zIndex: 10,\n width: '100%',\n height: '100%',\n transform: [{ translateY: frameSize === 0 ? HIDDEN_SIZE : positionValue.current }],\n }}\n >\n {isResizing ? null : frameComponent}\n </Animated.View>\n </SheetProvider>\n )\n\n if (modal) {\n return (\n <Portal>\n <Theme name={themeName}>{contents}</Theme>\n </Portal>\n )\n }\n\n return contents\n }),\n {\n componentName: 'Sheet',\n }\n ),\n {\n Handle: SheetHandle,\n Frame: SheetFrame,\n Overlay: SheetOverlay,\n }\n)\n\nfunction getPercentSize(point?: number, frameSize?: number) {\n if (!frameSize) return 0\n if (point === undefined) {\n console.warn(`No snapPoint`)\n return 0\n }\n const pct = point / 100\n const next = frameSize - pct * frameSize\n return next\n}\n\nfunction resisted(y: number, minY: number, maxOverflow = 25) {\n if (y < minY) {\n const past = minY - y\n const pctPast = Math.min(maxOverflow, past) / maxOverflow\n const diminishBy = 1.1 - Math.pow(0.1, pctPast)\n const extra = -diminishBy * maxOverflow\n return minY + extra\n }\n return y\n}\n\ntype SheetControllerContextValue = {\n disableDrag?: boolean\n open?: boolean\n // hide without \"closing\" to prevent re-animation when shown again\n hidden?: boolean\n onChangeOpen?: React.Dispatch<React.SetStateAction<boolean>> | ((val: boolean) => void)\n}\n\nconst SheetControllerContext = createContext<SheetControllerContextValue | null>(null)\n\nexport const SheetController = ({\n children,\n onChangeOpen: onChangeOpenProp,\n ...value\n}: Partial<SheetControllerContextValue> & { children?: React.ReactNode }) => {\n const onChangeOpen = useEvent(onChangeOpenProp)\n\n const memoValue = useMemo(\n () => ({\n open: value.open,\n hidden: value.hidden,\n disableDrag: value.disableDrag,\n onChangeOpen,\n }),\n [onChangeOpen, value.open, value.hidden, value.disableDrag]\n )\n\n return (\n <SheetControllerContext.Provider value={memoValue}>{children}</SheetControllerContext.Provider>\n )\n}\n\nfunction useLastRenderValue<A>(val: A): A | undefined {\n const ref = useRef<A>(val)\n useIsomorphicLayoutEffect(() => {\n return () => {\n ref.current = val\n }\n })\n return ref.current as A\n}\n\nexport { createSheetScope }\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }