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

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/jsx/Sheet.js CHANGED
@@ -1,22 +1,39 @@
1
- import { isSSR, isWeb, styled, themeable, withStaticProperties } from "@tamagui/core";
1
+ import {
2
+ Theme,
3
+ isClient,
4
+ isWeb,
5
+ mergeEvent,
6
+ styled,
7
+ themeable,
8
+ useEvent,
9
+ useThemeName,
10
+ withStaticProperties
11
+ } from "@tamagui/core";
2
12
  import { createContextScope } from "@tamagui/create-context";
13
+ import { Portal } from "@tamagui/portal";
3
14
  import { XStack, YStack } from "@tamagui/stacks";
4
15
  import { useControllableState } from "@tamagui/use-controllable-state";
5
16
  import React, {
17
+ createContext,
6
18
  forwardRef,
7
19
  isValidElement,
8
- useCallback,
20
+ useContext,
9
21
  useEffect,
10
22
  useLayoutEffect,
11
23
  useMemo,
12
24
  useRef,
13
25
  useState
14
26
  } from "react";
15
- import { Animated, PanResponder } from "react-native";
16
- const DRAWER_NAME = "Drawer";
17
- const DRAWER_HANDLE_NAME = "DrawerHandle";
18
- const DrawerHandleFrame = styled(XStack, {
19
- name: DRAWER_HANDLE_NAME,
27
+ import {
28
+ Animated,
29
+ PanResponder
30
+ } from "react-native";
31
+ const SHEET_NAME = "Sheet";
32
+ const SHEET_HANDLE_NAME = "SheetHandle";
33
+ const [createSheetContext, createSheetScope] = createContextScope(SHEET_NAME);
34
+ const [SheetProvider, useSheetContext] = createSheetContext(SHEET_NAME, {});
35
+ const SheetHandleFrame = styled(XStack, {
36
+ name: SHEET_HANDLE_NAME,
20
37
  height: 10,
21
38
  borderRadius: 100,
22
39
  backgroundColor: "$background",
@@ -32,98 +49,194 @@ const DrawerHandleFrame = styled(XStack, {
32
49
  opacity: 0.7
33
50
  }
34
51
  });
35
- const DrawerHandle = DrawerHandleFrame.extractable(({ __scopeDrawer, ...props }) => {
36
- const context = useDrawerContext(DRAWER_HANDLE_NAME, __scopeDrawer);
37
- return <DrawerHandleFrame onPress={() => {
52
+ const SheetHandle = SheetHandleFrame.extractable(({ __scopeSheet, ...props }) => {
53
+ const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet);
54
+ if (context.open === false) {
55
+ return null;
56
+ }
57
+ return <SheetHandleFrame onPress={() => {
38
58
  const nextPos = (context.position + 1) % context.snapPoints.length;
39
59
  context.setPosition(nextPos);
40
60
  }} {...props} />;
41
61
  });
42
- const [createDrawerContext, createDrawerScope] = createContextScope(DRAWER_NAME);
43
- const [DrawerProvider, useDrawerContext] = createDrawerContext(DRAWER_NAME, {});
44
- const DrawerBackdrop = styled(YStack, {
45
- name: "DrawerBackdrop",
62
+ const SheetOverlayFrame = styled(YStack, {
63
+ name: "SheetOverlay",
46
64
  backgroundColor: "$color",
47
65
  fullscreen: true,
48
- opacity: 0.2
66
+ opacity: 0.2,
67
+ zIndex: 0,
68
+ variants: {
69
+ closed: {
70
+ true: {
71
+ opacity: 0,
72
+ pointerEvents: "none"
73
+ },
74
+ false: {
75
+ pointerEvents: "auto"
76
+ }
77
+ }
78
+ }
79
+ });
80
+ const SheetOverlay = SheetOverlayFrame.extractable(({ __scopeSheet, ...props }) => {
81
+ const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet);
82
+ return <SheetOverlayFrame closed={!context.open || context.hidden} {...props} onPress={mergeEvent(props.onPress, context.dismissOnOverlayPress ? () => {
83
+ context.setOpen(false);
84
+ } : void 0)} />;
49
85
  });
50
- const DrawerFrame = styled(YStack, {
51
- name: "DrawerFrame",
86
+ const selectionStyleSheet = isClient ? document.createElement("style") : null;
87
+ if (selectionStyleSheet) {
88
+ document.head.appendChild(selectionStyleSheet);
89
+ }
90
+ const SheetFrame = styled(YStack, {
91
+ name: "SheetFrame",
52
92
  flex: 1,
53
93
  backgroundColor: "$background",
54
94
  borderTopLeftRadius: "$4",
55
95
  borderTopRightRadius: "$4",
56
96
  padding: "$4",
57
- width: "100%"
97
+ width: "100%",
98
+ pointerEvents: "auto"
58
99
  });
59
- const useIsSSR = () => {
60
- const [val, setVal] = useState(isWeb ? isSSR : false);
61
- useEffect(() => {
62
- if (isWeb && !isSSR) {
63
- setVal(false);
64
- }
65
- }, []);
66
- return val;
67
- };
68
- const Drawer = withStaticProperties(themeable(forwardRef((props, ref) => {
100
+ const HIDDEN_SIZE = 1e4;
101
+ const Sheet = withStaticProperties(themeable(forwardRef((props, ref) => {
102
+ var _a;
69
103
  const {
70
- __scopeDrawer,
104
+ __scopeSheet,
71
105
  snapPoints: snapPointsProp = [80, 10],
106
+ open: openProp,
107
+ defaultOpen,
72
108
  children: childrenProp,
73
109
  position: positionProp,
74
110
  onChangePosition,
111
+ onChangeOpen,
75
112
  defaultPosition,
76
- ...rest
113
+ dismissOnOverlayPress = true,
114
+ animationConfig,
115
+ disableDrag: disableDragProp,
116
+ modal
77
117
  } = props;
78
- const isServerSide = useIsSSR();
79
- const [position, setPosition] = useControllableState({
118
+ const controller = useContext(SheetControllerContext);
119
+ const isHidden = (controller == null ? void 0 : controller.hidden) || false;
120
+ const disableDrag = disableDragProp != null ? disableDragProp : controller == null ? void 0 : controller.disableDrag;
121
+ const themeName = useThemeName();
122
+ const onChangeOpenInternal = (val) => {
123
+ var _a2;
124
+ (_a2 = controller == null ? void 0 : controller.onChangeOpen) == null ? void 0 : _a2.call(controller, val);
125
+ onChangeOpen == null ? void 0 : onChangeOpen(val);
126
+ };
127
+ const [open, setOpen] = useControllableState({
128
+ prop: (_a = controller == null ? void 0 : controller.open) != null ? _a : openProp,
129
+ defaultProp: defaultOpen || true,
130
+ onChange: onChangeOpenInternal,
131
+ strategy: controller ? "most-recent-wins" : "prop-wins"
132
+ });
133
+ const [frameSize, setFrameSize] = useState(0);
134
+ const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)]);
135
+ const [position_, setPosition] = useControllableState({
80
136
  prop: positionProp,
81
- defaultProp: defaultPosition || 0,
82
- onChange: onChangePosition,
83
- strategy: "most-recent-wins"
137
+ defaultProp: defaultPosition || (open ? 0 : -1),
138
+ onChange: onChangePosition
84
139
  });
85
- const [layout, setLayout] = useState();
140
+ const position = open === false ? -1 : position_;
86
141
  const positionValue = useRef();
87
142
  if (!positionValue.current) {
88
- positionValue.current = new Animated.Value(position);
89
- }
90
- const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)]);
91
- if (isServerSide) {
92
- return null;
143
+ positionValue.current = new Animated.Value(HIDDEN_SIZE);
93
144
  }
145
+ const [isResizing, setIsResizing] = useState(true);
146
+ useLayoutEffect(() => {
147
+ if (!isResizing) {
148
+ setIsResizing(true);
149
+ }
150
+ }, [modal]);
94
151
  const spring = useRef(null);
95
152
  function stopSpring() {
96
- var _a;
97
- (_a = spring.current) == null ? void 0 : _a.stop();
153
+ var _a2;
154
+ (_a2 = spring.current) == null ? void 0 : _a2.stop();
98
155
  spring.current = null;
99
156
  }
100
- const positions = useMemo(() => snapPoints.map((point) => getYForPosition(point, layout)), [layout, snapPoints]);
101
- const animateTo = useCallback((position2) => {
102
- if (!positionValue.current)
157
+ const shouldSetPositionOpen = open && position < 0;
158
+ useEffect(() => {
159
+ if (shouldSetPositionOpen) {
160
+ setPosition(0);
161
+ }
162
+ }, [setPosition, shouldSetPositionOpen]);
163
+ const positions = useMemo(() => snapPoints.map((point) => getPercentSize(point, frameSize)), [frameSize, snapPoints]);
164
+ const animateTo = useEvent((position2) => {
165
+ const pos = positionValue.current;
166
+ if (isHidden && open)
167
+ return;
168
+ if (!pos)
169
+ return;
170
+ if (frameSize === 0)
171
+ return;
172
+ const hiddenValue = frameSize === 0 ? HIDDEN_SIZE : frameSize;
173
+ const toValue = isHidden || position2 === -1 ? hiddenValue : positions[position2];
174
+ if (pos["_value"] === toValue)
103
175
  return;
104
- const toValue = positions[position2];
105
176
  stopSpring();
106
- spring.current = Animated.spring(positionValue.current, {
177
+ if (isHidden || isResizing) {
178
+ if (isResizing) {
179
+ setIsResizing(false);
180
+ }
181
+ Animated.timing(pos, {
182
+ useNativeDriver: !isWeb,
183
+ toValue,
184
+ duration: 0
185
+ }).start();
186
+ return;
187
+ }
188
+ const overshootClamping = pos["_value"] === HIDDEN_SIZE;
189
+ spring.current = Animated.spring(pos, {
107
190
  useNativeDriver: !isWeb,
108
- toValue
191
+ toValue,
192
+ overshootClamping,
193
+ ...animationConfig
109
194
  });
110
195
  spring.current.start(({ finished }) => finished && stopSpring());
111
- }, [positions]);
196
+ });
112
197
  useLayoutEffect(() => {
113
198
  animateTo(position);
114
- }, [position, animateTo]);
199
+ }, [isHidden, frameSize, position, animateTo]);
115
200
  const panResponder = useMemo(() => {
116
- if (!layout)
201
+ if (disableDrag)
202
+ return;
203
+ if (!frameSize)
117
204
  return;
118
- console.log("setup pan");
119
205
  const pos = positionValue.current;
120
206
  const minY = positions[0];
121
207
  let startY = pos["_value"];
208
+ function makeUnselectable(val) {
209
+ if (!selectionStyleSheet)
210
+ return;
211
+ if (!val) {
212
+ selectionStyleSheet.innerText = ``;
213
+ } else {
214
+ selectionStyleSheet.innerText = `:root * { user-select: none !important; -webkit-user-select: none !important; }`;
215
+ }
216
+ }
217
+ const finish = (_e, { vy, dy }) => {
218
+ makeUnselectable(false);
219
+ const at = dy + startY;
220
+ const end = at + frameSize * vy * 0.33;
221
+ let closestPoint = 0;
222
+ let dist = Infinity;
223
+ for (let i = 0; i < positions.length; i++) {
224
+ const position2 = positions[i];
225
+ const curDist = end > position2 ? end - position2 : position2 - end;
226
+ if (curDist < dist) {
227
+ dist = curDist;
228
+ closestPoint = i;
229
+ }
230
+ }
231
+ setPosition(closestPoint);
232
+ animateTo(closestPoint);
233
+ };
122
234
  return PanResponder.create({
123
235
  onMoveShouldSetPanResponder: (_e, { dy }) => {
124
236
  return Math.abs(dy) > 6;
125
237
  },
126
238
  onPanResponderGrant: () => {
239
+ makeUnselectable(true);
127
240
  stopSpring();
128
241
  startY = pos["_value"];
129
242
  },
@@ -131,72 +244,75 @@ const Drawer = withStaticProperties(themeable(forwardRef((props, ref) => {
131
244
  const to = dy + startY;
132
245
  pos.setValue(resisted(to, minY));
133
246
  },
134
- onPanResponderRelease: (_e, { vy, dy }) => {
135
- const at = dy + startY;
136
- const end = at + layout.height * vy * 0.33;
137
- let closestPoint = 0;
138
- let dist = Infinity;
139
- for (let i = 0; i < positions.length; i++) {
140
- const position2 = positions[i];
141
- const curDist = end > position2 ? end - position2 : position2 - end;
142
- if (curDist < dist) {
143
- dist = curDist;
144
- closestPoint = i;
145
- }
146
- }
147
- setPosition(closestPoint);
148
- animateTo(closestPoint);
149
- }
247
+ onPanResponderEnd: finish,
248
+ onPanResponderTerminate: finish,
249
+ onPanResponderRelease: finish
150
250
  });
151
- }, [layout, positions, setPosition]);
251
+ }, [disableDrag, animateTo, frameSize, positions, setPosition]);
152
252
  let handleComponent = null;
153
- let backdropComponent = null;
253
+ let overlayComponent = null;
154
254
  let frameComponent = null;
155
255
  React.Children.forEach(childrenProp, (child) => {
156
- var _a;
256
+ var _a2, _b;
157
257
  if (isValidElement(child)) {
158
- switch ((_a = child.type) == null ? void 0 : _a["staticConfig"].componentName) {
159
- case "DrawerHandle":
258
+ const name = (_b = (_a2 = child.type) == null ? void 0 : _a2["staticConfig"]) == null ? void 0 : _b.componentName;
259
+ switch (name) {
260
+ case "SheetHandle":
160
261
  handleComponent = child;
161
262
  break;
162
- case "DrawerFrame":
263
+ case "SheetFrame":
163
264
  frameComponent = child;
164
265
  break;
165
- case "DrawerBackdrop":
166
- backdropComponent = child;
266
+ case "SheetOverlay":
267
+ overlayComponent = child;
167
268
  break;
168
269
  default:
169
- console.warn("Warning: passed invalid child to Drawer", child);
270
+ console.warn("Warning: passed invalid child to Sheet", child);
170
271
  }
171
272
  }
172
273
  });
173
- return <DrawerProvider scope={__scopeDrawer} position={position} snapPoints={snapPoints} setPosition={setPosition}>
174
- {backdropComponent}
175
- {handleComponent}
176
- <Animated.View {...panResponder == null ? void 0 : panResponder.panHandlers} onLayout={(e) => {
177
- setLayout(e.nativeEvent.layout);
178
- }} style={{
274
+ const preventShown = (controller == null ? void 0 : controller.hidden) && (controller == null ? void 0 : controller.open);
275
+ if (preventShown) {
276
+ return null;
277
+ }
278
+ const contents = <SheetProvider dismissOnOverlayPress={dismissOnOverlayPress} open={open} hidden={isHidden} scope={__scopeSheet} position={position} snapPoints={snapPoints} setPosition={setPosition} setOpen={setOpen}>
279
+ {isResizing ? null : overlayComponent}
280
+ {isHidden ? null : handleComponent}
281
+ <Animated.View ref={ref} {...panResponder == null ? void 0 : panResponder.panHandlers} onLayout={(e) => {
282
+ const next = e.nativeEvent.layout.height;
283
+ setFrameSize((prev) => {
284
+ const isBigChange = Math.abs(prev - next) > 50;
285
+ setIsResizing(isBigChange);
286
+ return next;
287
+ });
288
+ }} pointerEvents={open ? "auto" : "none"} style={{
289
+ position: "absolute",
290
+ zIndex: 10,
179
291
  width: "100%",
180
292
  height: "100%",
181
- transform: [{ translateY: positionValue.current }]
182
- }}>{frameComponent}</Animated.View>
183
- </DrawerProvider>;
293
+ transform: [{ translateY: frameSize === 0 ? HIDDEN_SIZE : positionValue.current }]
294
+ }}>{isResizing ? null : frameComponent}</Animated.View>
295
+ </SheetProvider>;
296
+ if (modal) {
297
+ return <Portal><Theme name={themeName}>{contents}</Theme></Portal>;
298
+ }
299
+ return contents;
184
300
  }), {
185
- componentName: "Drawer"
301
+ componentName: "Sheet"
186
302
  }), {
187
- Handle: DrawerHandle,
188
- Frame: DrawerFrame,
189
- Backdrop: DrawerBackdrop
303
+ Handle: SheetHandle,
304
+ Frame: SheetFrame,
305
+ Overlay: SheetOverlay
190
306
  });
191
- function getYForPosition(point, layout) {
192
- if (!layout)
307
+ function getPercentSize(point, frameSize) {
308
+ if (!frameSize)
193
309
  return 0;
194
310
  if (point === void 0) {
195
311
  console.warn(`No snapPoint`);
196
312
  return 0;
197
313
  }
198
314
  const pct = point / 100;
199
- const next = layout.height - pct * layout.height;
315
+ const next = frameSize - pct * frameSize;
200
316
  return next;
201
317
  }
202
318
  function resisted(y, minY, maxOverflow = 25) {
@@ -209,12 +325,29 @@ function resisted(y, minY, maxOverflow = 25) {
209
325
  }
210
326
  return y;
211
327
  }
328
+ const SheetControllerContext = createContext(null);
329
+ const SheetController = ({
330
+ children,
331
+ onChangeOpen: onChangeOpenProp,
332
+ ...value
333
+ }) => {
334
+ const onChangeOpen = useEvent(onChangeOpenProp);
335
+ const memoValue = useMemo(() => ({
336
+ open: value.open,
337
+ hidden: value.hidden,
338
+ disableDrag: value.disableDrag,
339
+ onChangeOpen
340
+ }), [onChangeOpen, value.open, value.hidden, value.disableDrag]);
341
+ return <SheetControllerContext.Provider value={memoValue}>{children}</SheetControllerContext.Provider>;
342
+ };
212
343
  export {
213
- Drawer,
214
- DrawerBackdrop,
215
- DrawerFrame,
216
- DrawerHandle,
217
- DrawerHandleFrame,
218
- createDrawerScope
344
+ Sheet,
345
+ SheetController,
346
+ SheetFrame,
347
+ SheetHandle,
348
+ SheetHandleFrame,
349
+ SheetOverlay,
350
+ SheetOverlayFrame,
351
+ createSheetScope
219
352
  };
220
353
  //# 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\nexport { createSheetScope }\n"],
5
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AAAA;AAAA;AAAA;AAQA,MAAM,aAAa;AACnB,MAAM,oBAAoB;AAkC1B,MAAM,CAAC,oBAAoB,oBAAoB,mBAAmB,UAAU;AAC5E,MAAM,CAAC,eAAe,mBAAmB,mBACvC,YACA,CAAC,CACH;AAEO,MAAM,mBAAmB,OAAO,QAAQ;AAAA,EAC7C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,GAAG;AAAA,EACH,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EAET,YAAY;AAAA,IACV,SAAS;AAAA,EACX;AACF,CAAC;AAIM,MAAM,cAAc,iBAAiB,YAC1C,CAAC,EAAE,iBAAiB,YAA2C;AAC7D,QAAM,UAAU,gBAAgB,mBAAmB,YAAY;AAE/D,MAAI,QAAQ,SAAS,OAAO;AAC1B,WAAO;AAAA,EACT;AAEA,SACE,CAAC,iBACC,SAAS,MAAM;AACb,UAAM,UAAW,SAAQ,WAAW,KAAK,QAAQ,WAAW;AAC5D,YAAQ,YAAY,OAAO;AAAA,EAC7B,OACI,OACN;AAEJ,CACF;AAEO,MAAM,oBAAoB,OAAO,QAAQ;AAAA,EAC9C,MAAM;AAAA,EAEN,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AAAA,EAER,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,MACA,OAAO;AAAA,QACL,eAAe;AAAA,MACjB;AAAA,IAEF;AAAA,EACF;AACF,CAAC;AAIM,MAAM,eAAe,kBAAkB,YAC5C,CAAC,EAAE,iBAAiB,YAAiD;AACnE,QAAM,UAAU,gBAAgB,mBAAmB,YAAY;AAC/D,SACE,CAAC,kBACC,QAAQ,CAAC,QAAQ,QAAQ,QAAQ,YAC7B,OACJ,SAAS,WACP,MAAM,SACN,QAAQ,wBACJ,MAAM;AACJ,YAAQ,QAAQ,KAAK;AAAA,EACvB,IACA,MACN,GACF;AAEJ,CACF;AAEA,MAAM,sBAAsB,WAAW,SAAS,cAAc,OAAO,IAAI;AACzE,IAAI,qBAAqB;AACvB,WAAS,KAAK,YAAY,mBAAmB;AAC/C;AAEO,MAAM,aAAa,OAAO,QAAQ;AAAA,EACvC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,eAAe;AACjB,CAAC;AAGD,MAAM,cAAc;AAEb,MAAM,QAAQ,qBACnB,UACE,WAA6B,CAAC,OAAO,QAAQ;AAxLjD;AAyLM,QAAM;AAAA,IACJ;AAAA,IACA,YAAY,iBAAiB,CAAC,IAAI,EAAE;AAAA,IACpC,MAAM;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAwB;AAAA,IACxB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,MACE;AAGJ,QAAM,aAAa,WAAW,sBAAsB;AACpD,QAAM,WAAW,0CAAY,WAAU;AACvC,QAAM,cAAc,4CAAmB,yCAAY;AACnD,QAAM,YAAY,aAAa;AAE/B,QAAM,uBAAuB,CAAC,QAAiB;AA/MrD;AAgNQ,oDAAY,iBAAZ,qCAA2B;AAC3B,iDAAe;AAAA,EACjB;AAEA,QAAM,CAAC,MAAM,WAAW,qBAAqB;AAAA,IAC3C,MAAM,+CAAY,SAAZ,YAAoB;AAAA,IAC1B,aAAa,eAAe;AAAA,IAC5B,UAAU;AAAA,IACV,UAAU,aAAa,qBAAqB;AAAA,EAC9C,CAAC;AAED,QAAM,CAAC,WAAW,gBAAgB,SAAiB,CAAC;AAEpD,QAAM,aAAa,QAAQ,MAAM,gBAAgB,CAAC,KAAK,UAAU,cAAc,CAAC,CAAC;AAGjF,QAAM,CAAC,WAAW,eAAe,qBAAqB;AAAA,IACpD,MAAM;AAAA,IACN,aAAa,mBAAoB,QAAO,IAAI;AAAA,IAC5C,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,WAAW,SAAS,QAAQ,KAAK;AAEvC,QAAM,gBAAgB,OAAuB;AAC7C,MAAI,CAAC,cAAc,SAAS;AAC1B,kBAAc,UAAU,IAAI,SAAS,MAAM,WAAW;AAAA,EACxD;AAEA,QAAM,CAAC,YAAY,iBAAiB,SAAS,IAAI;AACjD,kBAAgB,MAAM;AACpB,QAAI,CAAC,YAAY;AACf,oBAAc,IAAI;AAAA,IACpB;AAAA,EAEF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,SAAS,OAA2C,IAAI;AAC9D,wBAAsB;AArP5B;AAsPQ,kBAAO,YAAP,oBAAgB;AAChB,WAAO,UAAU;AAAA,EACnB;AAGA,QAAM,wBAAwB,QAAQ,WAAW;AACjD,YAAU,MAAM;AACd,QAAI,uBAAuB;AACzB,kBAAY,CAAC;AAAA,IACf;AAAA,EACF,GAAG,CAAC,aAAa,qBAAqB,CAAC;AAEvC,QAAM,YAAY,QAChB,MAAM,WAAW,IAAI,CAAC,UAAU,eAAe,OAAO,SAAS,CAAC,GAChE,CAAC,WAAW,UAAU,CACxB;AAEA,QAAM,YAAY,SAAS,CAAC,cAAqB;AAC/C,UAAM,MAAM,cAAc;AAC1B,QAAI,YAAY;AAAM;AACtB,QAAI,CAAC;AAAK;AACV,QAAI,cAAc;AAAG;AACrB,UAAM,cAAc,cAAc,IAAI,cAAc;AACpD,UAAM,UAAU,YAAY,cAAa,KAAK,cAAc,UAAU;AACtE,QAAI,IAAI,cAAc;AAAS;AAC/B,eAAW;AACX,QAAI,YAAY,YAAY;AAC1B,UAAI,YAAY;AACd,sBAAc,KAAK;AAAA,MACrB;AACA,eAAS,OAAO,KAAK;AAAA,QACnB,iBAAiB,CAAC;AAAA,QAClB;AAAA,QACA,UAAU;AAAA,MACZ,CAAC,EAAE,MAAM;AACT;AAAA,IACF;AAEA,UAAM,oBAAoB,IAAI,cAAc;AAC5C,WAAO,UAAU,SAAS,OAAO,KAAK;AAAA,MACpC,iBAAiB,CAAC;AAAA,MAClB;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AACD,WAAO,QAAQ,MAAM,CAAC,EAAE,eAAe,YAAY,WAAW,CAAC;AAAA,EACjE,CAAC;AAED,kBAAgB,MAAM;AACpB,cAAU,QAAQ;AAAA,EACpB,GAAG,CAAC,UAAU,WAAW,UAAU,SAAS,CAAC;AAE7C,QAAM,eAAe,QAAQ,MAAM;AACjC,QAAI;AAAa;AACjB,QAAI,CAAC;AAAW;AAGhB,UAAM,MAAM,cAAc;AAC1B,UAAM,OAAO,UAAU;AACvB,QAAI,SAAS,IAAI;AAEjB,8BAA0B,KAAc;AACtC,UAAI,CAAC;AAAqB;AAC1B,UAAI,CAAC,KAAK;AACR,4BAAoB,YAAY;AAAA,MAClC,OAAO;AACL,4BAAoB,YAAY;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,IAA2B,EAAE,IAAI,SAAmC;AAClF,uBAAiB,KAAK;AACtB,YAAM,KAAK,KAAK;AAGhB,YAAM,MAAM,KAAK,YAAY,KAAK;AAClC,UAAI,eAAe;AACnB,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,cAAM,YAAW,UAAU;AAC3B,cAAM,UAAU,MAAM,YAAW,MAAM,YAAW,YAAW;AAC7D,YAAI,UAAU,MAAM;AAClB,iBAAO;AACP,yBAAe;AAAA,QACjB;AAAA,MACF;AAEA,kBAAY,YAAY;AACxB,gBAAU,YAAY;AAAA,IACxB;AAEA,WAAO,aAAa,OAAO;AAAA,MACzB,6BAA6B,CAAC,IAAI,EAAE,SAAS;AAE3C,eAAO,KAAK,IAAI,EAAE,IAAI;AAAA,MACxB;AAAA,MACA,qBAAqB,MAAM;AACzB,yBAAiB,IAAI;AACrB,mBAAW;AACX,iBAAS,IAAI;AAAA,MACf;AAAA,MACA,oBAAoB,CAAC,IAAI,EAAE,SAAS;AAClC,cAAM,KAAK,KAAK;AAChB,YAAI,SAAS,SAAS,IAAI,IAAI,CAAC;AAAA,MACjC;AAAA,MACA,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,MACzB,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,WAAW,WAAW,WAAW,WAAW,CAAC;AAE9D,MAAI,kBAA6C;AACjD,MAAI,mBAA8C;AAClD,MAAI,iBAA4C;AAGhD,QAAM,SAAS,QAAQ,cAAc,CAAC,UAAU;AA1WtD;AA2WQ,QAAI,eAAe,KAAK,GAAG;AACzB,YAAM,OAAO,mBAAM,SAAN,oBAAa,oBAAb,mBAA8B;AAC3C,cAAQ;AAAA,aACD;AACH,4BAAkB;AAClB;AAAA,aACG;AACH,2BAAiB;AACjB;AAAA,aACG;AACH,6BAAmB;AACnB;AAAA;AAEA,kBAAQ,KAAK,0CAA0C,KAAK;AAAA;AAAA,IAElE;AAAA,EACF,CAAC;AAED,QAAM,eAAe,0CAAY,WAAU,0CAAY;AAEvD,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,WACJ,CAAC,cACC,uBAAuB,uBACvB,MAAM,MACN,QAAQ,UACR,OAAO,cACP,UAAU,UACV,YAAY,YACZ,aAAa,aACb,SAAS;AAAA,KAER,aAAa,OAAO;AAAA,KAEpB,WAAW,OAAO;AAAA,IACnB,CAAC,SAAS,KACR,KAAK,SACD,6CAAc,aAClB,UAAU,CAAC,MAAM;AACf,YAAM,OAAO,EAAE,YAAY,OAAO;AAClC,mBAAa,CAAC,SAAS;AACrB,cAAM,cAAc,KAAK,IAAI,OAAO,IAAI,IAAI;AAC5C,sBAAc,WAAW;AACzB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,GACA,eAAe,OAAO,SAAS,QAC/B,OAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,CAAC,EAAE,YAAY,cAAc,IAAI,cAAc,cAAc,QAAQ,CAAC;AAAA,IACnF,IAEC,aAAa,OAAO,eACvB,EArBC,SAAS;AAAA,EAsBZ,EAnCC;AAsCH,MAAI,OAAO;AACT,WACE,CAAC,OACC,CAAC,MAAM,MAAM,YAAY,SAAS,EAAjC,MACH,EAFC;AAAA,EAIL;AAEA,SAAO;AACT,CAAC,GACD;AAAA,EACE,eAAe;AACjB,CACF,GACA;AAAA,EACE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX,CACF;AAEA,wBAAwB,OAAgB,WAAoB;AAC1D,MAAI,CAAC;AAAW,WAAO;AACvB,MAAI,UAAU,QAAW;AACvB,YAAQ,KAAK,cAAc;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,MAAM,QAAQ;AACpB,QAAM,OAAO,YAAY,MAAM;AAC/B,SAAO;AACT;AAEA,kBAAkB,GAAW,MAAc,cAAc,IAAI;AAC3D,MAAI,IAAI,MAAM;AACZ,UAAM,OAAO,OAAO;AACpB,UAAM,UAAU,KAAK,IAAI,aAAa,IAAI,IAAI;AAC9C,UAAM,aAAa,MAAM,KAAK,IAAI,KAAK,OAAO;AAC9C,UAAM,QAAQ,CAAC,aAAa;AAC5B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO;AACT;AAUA,MAAM,yBAAyB,cAAkD,IAAI;AAE9E,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,KACX;AAAA,MACwE;AAC3E,QAAM,eAAe,SAAS,gBAAgB;AAE9C,QAAM,YAAY,QAChB,MAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,IACnB;AAAA,EACF,IACA,CAAC,cAAc,MAAM,MAAM,MAAM,QAAQ,MAAM,WAAW,CAC5D;AAEA,SACE,CAAC,uBAAuB,SAAS,OAAO,YAAY,SAAS,EAA5D,uBAAuB;AAE5B;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/sheet",
3
- "version": "1.0.1-beta.100",
3
+ "version": "1.0.1-beta.103",
4
4
  "sideEffects": [
5
5
  "*.css"
6
6
  ],
@@ -20,10 +20,10 @@
20
20
  "watch": "tamagui-build --watch"
21
21
  },
22
22
  "dependencies": {
23
- "@tamagui/core": "^1.0.1-beta.100",
24
- "@tamagui/create-context": "^1.0.1-beta.100",
25
- "@tamagui/stacks": "^1.0.1-beta.100",
26
- "@tamagui/use-controllable-state": "^1.0.1-beta.100"
23
+ "@tamagui/core": "^1.0.1-beta.103",
24
+ "@tamagui/create-context": "^1.0.1-beta.103",
25
+ "@tamagui/stacks": "^1.0.1-beta.103",
26
+ "@tamagui/use-controllable-state": "^1.0.1-beta.103"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": "*",
@@ -31,7 +31,7 @@
31
31
  "react-native": "*"
32
32
  },
33
33
  "devDependencies": {
34
- "@tamagui/build": "^1.0.1-beta.100",
34
+ "@tamagui/build": "^1.0.1-beta.103",
35
35
  "react": "*",
36
36
  "react-dom": "*",
37
37
  "react-native": "*"