@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/cjs/Sheet.js +244 -112
- package/dist/cjs/Sheet.js.map +2 -2
- package/dist/esm/Sheet.js +253 -109
- package/dist/esm/Sheet.js.map +2 -2
- package/dist/jsx/Sheet.js +233 -100
- package/dist/jsx/Sheet.js.map +2 -2
- package/package.json +6 -6
- package/src/Sheet.tsx +328 -134
- package/types/Sheet.d.ts +73 -87
- package/types/Sheet.d.ts.map +1 -1
- package/types/Drawer.d.ts +0 -184
- package/types/Drawer.d.ts.map +0 -1
package/dist/esm/Sheet.js
CHANGED
|
@@ -29,25 +29,42 @@ var __objRest = (source, exclude) => {
|
|
|
29
29
|
}
|
|
30
30
|
return target;
|
|
31
31
|
};
|
|
32
|
-
import {
|
|
32
|
+
import {
|
|
33
|
+
Theme,
|
|
34
|
+
isClient,
|
|
35
|
+
isWeb,
|
|
36
|
+
mergeEvent,
|
|
37
|
+
styled,
|
|
38
|
+
themeable,
|
|
39
|
+
useEvent,
|
|
40
|
+
useThemeName,
|
|
41
|
+
withStaticProperties
|
|
42
|
+
} from "@tamagui/core";
|
|
33
43
|
import { createContextScope } from "@tamagui/create-context";
|
|
44
|
+
import { Portal } from "@tamagui/portal";
|
|
34
45
|
import { XStack, YStack } from "@tamagui/stacks";
|
|
35
46
|
import { useControllableState } from "@tamagui/use-controllable-state";
|
|
36
47
|
import React, {
|
|
48
|
+
createContext,
|
|
37
49
|
forwardRef,
|
|
38
50
|
isValidElement,
|
|
39
|
-
|
|
51
|
+
useContext,
|
|
40
52
|
useEffect,
|
|
41
53
|
useLayoutEffect,
|
|
42
54
|
useMemo,
|
|
43
55
|
useRef,
|
|
44
56
|
useState
|
|
45
57
|
} from "react";
|
|
46
|
-
import {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
import {
|
|
59
|
+
Animated,
|
|
60
|
+
PanResponder
|
|
61
|
+
} from "react-native";
|
|
62
|
+
const SHEET_NAME = "Sheet";
|
|
63
|
+
const SHEET_HANDLE_NAME = "SheetHandle";
|
|
64
|
+
const [createSheetContext, createSheetScope] = createContextScope(SHEET_NAME);
|
|
65
|
+
const [SheetProvider, useSheetContext] = createSheetContext(SHEET_NAME, {});
|
|
66
|
+
const SheetHandleFrame = styled(XStack, {
|
|
67
|
+
name: SHEET_HANDLE_NAME,
|
|
51
68
|
height: 10,
|
|
52
69
|
borderRadius: 100,
|
|
53
70
|
backgroundColor: "$background",
|
|
@@ -63,107 +80,200 @@ const DrawerHandleFrame = styled(XStack, {
|
|
|
63
80
|
opacity: 0.7
|
|
64
81
|
}
|
|
65
82
|
});
|
|
66
|
-
const
|
|
67
|
-
var _b = _a, {
|
|
68
|
-
const context =
|
|
69
|
-
|
|
83
|
+
const SheetHandle = SheetHandleFrame.extractable((_a) => {
|
|
84
|
+
var _b = _a, { __scopeSheet } = _b, props = __objRest(_b, ["__scopeSheet"]);
|
|
85
|
+
const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet);
|
|
86
|
+
if (context.open === false) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return /* @__PURE__ */ React.createElement(SheetHandleFrame, __spreadValues({
|
|
70
90
|
onPress: () => {
|
|
71
91
|
const nextPos = (context.position + 1) % context.snapPoints.length;
|
|
72
92
|
context.setPosition(nextPos);
|
|
73
93
|
}
|
|
74
94
|
}, props));
|
|
75
95
|
});
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
const DrawerBackdrop = styled(YStack, {
|
|
79
|
-
name: "DrawerBackdrop",
|
|
96
|
+
const SheetOverlayFrame = styled(YStack, {
|
|
97
|
+
name: "SheetOverlay",
|
|
80
98
|
backgroundColor: "$color",
|
|
81
99
|
fullscreen: true,
|
|
82
|
-
opacity: 0.2
|
|
100
|
+
opacity: 0.2,
|
|
101
|
+
zIndex: 0,
|
|
102
|
+
variants: {
|
|
103
|
+
closed: {
|
|
104
|
+
true: {
|
|
105
|
+
opacity: 0,
|
|
106
|
+
pointerEvents: "none"
|
|
107
|
+
},
|
|
108
|
+
false: {
|
|
109
|
+
pointerEvents: "auto"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
83
113
|
});
|
|
84
|
-
const
|
|
85
|
-
|
|
114
|
+
const SheetOverlay = SheetOverlayFrame.extractable((_c) => {
|
|
115
|
+
var _d = _c, { __scopeSheet } = _d, props = __objRest(_d, ["__scopeSheet"]);
|
|
116
|
+
const context = useSheetContext(SHEET_HANDLE_NAME, __scopeSheet);
|
|
117
|
+
return /* @__PURE__ */ React.createElement(SheetOverlayFrame, __spreadProps(__spreadValues({
|
|
118
|
+
closed: !context.open || context.hidden
|
|
119
|
+
}, props), {
|
|
120
|
+
onPress: mergeEvent(props.onPress, context.dismissOnOverlayPress ? () => {
|
|
121
|
+
context.setOpen(false);
|
|
122
|
+
} : void 0)
|
|
123
|
+
}));
|
|
124
|
+
});
|
|
125
|
+
const selectionStyleSheet = isClient ? document.createElement("style") : null;
|
|
126
|
+
if (selectionStyleSheet) {
|
|
127
|
+
document.head.appendChild(selectionStyleSheet);
|
|
128
|
+
}
|
|
129
|
+
const SheetFrame = styled(YStack, {
|
|
130
|
+
name: "SheetFrame",
|
|
86
131
|
flex: 1,
|
|
87
132
|
backgroundColor: "$background",
|
|
88
133
|
borderTopLeftRadius: "$4",
|
|
89
134
|
borderTopRightRadius: "$4",
|
|
90
135
|
padding: "$4",
|
|
91
|
-
width: "100%"
|
|
136
|
+
width: "100%",
|
|
137
|
+
pointerEvents: "auto"
|
|
92
138
|
});
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
setVal(false);
|
|
98
|
-
}
|
|
99
|
-
}, []);
|
|
100
|
-
return val;
|
|
101
|
-
};
|
|
102
|
-
const Drawer = withStaticProperties(themeable(forwardRef((props, ref) => {
|
|
103
|
-
const _a = props, {
|
|
104
|
-
__scopeDrawer,
|
|
139
|
+
const HIDDEN_SIZE = 1e4;
|
|
140
|
+
const Sheet = withStaticProperties(themeable(forwardRef((props, ref) => {
|
|
141
|
+
const {
|
|
142
|
+
__scopeSheet,
|
|
105
143
|
snapPoints: snapPointsProp = [80, 10],
|
|
144
|
+
open: openProp,
|
|
145
|
+
defaultOpen,
|
|
106
146
|
children: childrenProp,
|
|
107
147
|
position: positionProp,
|
|
108
148
|
onChangePosition,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
const
|
|
149
|
+
onChangeOpen,
|
|
150
|
+
defaultPosition,
|
|
151
|
+
dismissOnOverlayPress = true,
|
|
152
|
+
animationConfig,
|
|
153
|
+
disableDrag: disableDragProp,
|
|
154
|
+
modal
|
|
155
|
+
} = props;
|
|
156
|
+
const controller = useContext(SheetControllerContext);
|
|
157
|
+
const isHidden = (controller == null ? void 0 : controller.hidden) || false;
|
|
158
|
+
const disableDrag = disableDragProp ?? (controller == null ? void 0 : controller.disableDrag);
|
|
159
|
+
const themeName = useThemeName();
|
|
160
|
+
const onChangeOpenInternal = (val) => {
|
|
161
|
+
var _a;
|
|
162
|
+
(_a = controller == null ? void 0 : controller.onChangeOpen) == null ? void 0 : _a.call(controller, val);
|
|
163
|
+
onChangeOpen == null ? void 0 : onChangeOpen(val);
|
|
164
|
+
};
|
|
165
|
+
const [open, setOpen] = useControllableState({
|
|
166
|
+
prop: (controller == null ? void 0 : controller.open) ?? openProp,
|
|
167
|
+
defaultProp: defaultOpen || true,
|
|
168
|
+
onChange: onChangeOpenInternal,
|
|
169
|
+
strategy: controller ? "most-recent-wins" : "prop-wins"
|
|
170
|
+
});
|
|
171
|
+
const [frameSize, setFrameSize] = useState(0);
|
|
172
|
+
const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)]);
|
|
173
|
+
const [position_, setPosition] = useControllableState({
|
|
120
174
|
prop: positionProp,
|
|
121
|
-
defaultProp: defaultPosition || 0,
|
|
122
|
-
onChange: onChangePosition
|
|
123
|
-
strategy: "most-recent-wins"
|
|
175
|
+
defaultProp: defaultPosition || (open ? 0 : -1),
|
|
176
|
+
onChange: onChangePosition
|
|
124
177
|
});
|
|
125
|
-
const
|
|
178
|
+
const position = open === false ? -1 : position_;
|
|
126
179
|
const positionValue = useRef();
|
|
127
180
|
if (!positionValue.current) {
|
|
128
|
-
positionValue.current = new Animated.Value(
|
|
129
|
-
}
|
|
130
|
-
const snapPoints = useMemo(() => snapPointsProp, [JSON.stringify(snapPointsProp)]);
|
|
131
|
-
if (isServerSide) {
|
|
132
|
-
return null;
|
|
181
|
+
positionValue.current = new Animated.Value(HIDDEN_SIZE);
|
|
133
182
|
}
|
|
183
|
+
const [isResizing, setIsResizing] = useState(true);
|
|
184
|
+
useLayoutEffect(() => {
|
|
185
|
+
if (!isResizing) {
|
|
186
|
+
setIsResizing(true);
|
|
187
|
+
}
|
|
188
|
+
}, [modal]);
|
|
134
189
|
const spring = useRef(null);
|
|
135
190
|
function stopSpring() {
|
|
136
|
-
var
|
|
137
|
-
(
|
|
191
|
+
var _a;
|
|
192
|
+
(_a = spring.current) == null ? void 0 : _a.stop();
|
|
138
193
|
spring.current = null;
|
|
139
194
|
}
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
if (
|
|
195
|
+
const shouldSetPositionOpen = open && position < 0;
|
|
196
|
+
useEffect(() => {
|
|
197
|
+
if (shouldSetPositionOpen) {
|
|
198
|
+
setPosition(0);
|
|
199
|
+
}
|
|
200
|
+
}, [setPosition, shouldSetPositionOpen]);
|
|
201
|
+
const positions = useMemo(() => snapPoints.map((point) => getPercentSize(point, frameSize)), [frameSize, snapPoints]);
|
|
202
|
+
const animateTo = useEvent((position2) => {
|
|
203
|
+
const pos = positionValue.current;
|
|
204
|
+
if (isHidden && open)
|
|
205
|
+
return;
|
|
206
|
+
if (!pos)
|
|
207
|
+
return;
|
|
208
|
+
if (frameSize === 0)
|
|
209
|
+
return;
|
|
210
|
+
const hiddenValue = frameSize === 0 ? HIDDEN_SIZE : frameSize;
|
|
211
|
+
const toValue = isHidden || position2 === -1 ? hiddenValue : positions[position2];
|
|
212
|
+
if (pos["_value"] === toValue)
|
|
143
213
|
return;
|
|
144
|
-
const toValue = positions[position2];
|
|
145
214
|
stopSpring();
|
|
146
|
-
|
|
215
|
+
if (isHidden || isResizing) {
|
|
216
|
+
if (isResizing) {
|
|
217
|
+
setIsResizing(false);
|
|
218
|
+
}
|
|
219
|
+
Animated.timing(pos, {
|
|
220
|
+
useNativeDriver: !isWeb,
|
|
221
|
+
toValue,
|
|
222
|
+
duration: 0
|
|
223
|
+
}).start();
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const overshootClamping = pos["_value"] === HIDDEN_SIZE;
|
|
227
|
+
spring.current = Animated.spring(pos, __spreadValues({
|
|
147
228
|
useNativeDriver: !isWeb,
|
|
148
|
-
toValue
|
|
149
|
-
|
|
229
|
+
toValue,
|
|
230
|
+
overshootClamping
|
|
231
|
+
}, animationConfig));
|
|
150
232
|
spring.current.start(({ finished }) => finished && stopSpring());
|
|
151
|
-
}
|
|
233
|
+
});
|
|
152
234
|
useLayoutEffect(() => {
|
|
153
235
|
animateTo(position);
|
|
154
|
-
}, [position, animateTo]);
|
|
236
|
+
}, [isHidden, frameSize, position, animateTo]);
|
|
155
237
|
const panResponder = useMemo(() => {
|
|
156
|
-
if (
|
|
238
|
+
if (disableDrag)
|
|
239
|
+
return;
|
|
240
|
+
if (!frameSize)
|
|
157
241
|
return;
|
|
158
|
-
console.log("setup pan");
|
|
159
242
|
const pos = positionValue.current;
|
|
160
243
|
const minY = positions[0];
|
|
161
244
|
let startY = pos["_value"];
|
|
245
|
+
function makeUnselectable(val) {
|
|
246
|
+
if (!selectionStyleSheet)
|
|
247
|
+
return;
|
|
248
|
+
if (!val) {
|
|
249
|
+
selectionStyleSheet.innerText = ``;
|
|
250
|
+
} else {
|
|
251
|
+
selectionStyleSheet.innerText = `:root * { user-select: none !important; -webkit-user-select: none !important; }`;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const finish = (_e, { vy, dy }) => {
|
|
255
|
+
makeUnselectable(false);
|
|
256
|
+
const at = dy + startY;
|
|
257
|
+
const end = at + frameSize * vy * 0.33;
|
|
258
|
+
let closestPoint = 0;
|
|
259
|
+
let dist = Infinity;
|
|
260
|
+
for (let i = 0; i < positions.length; i++) {
|
|
261
|
+
const position2 = positions[i];
|
|
262
|
+
const curDist = end > position2 ? end - position2 : position2 - end;
|
|
263
|
+
if (curDist < dist) {
|
|
264
|
+
dist = curDist;
|
|
265
|
+
closestPoint = i;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
setPosition(closestPoint);
|
|
269
|
+
animateTo(closestPoint);
|
|
270
|
+
};
|
|
162
271
|
return PanResponder.create({
|
|
163
272
|
onMoveShouldSetPanResponder: (_e, { dy }) => {
|
|
164
273
|
return Math.abs(dy) > 6;
|
|
165
274
|
},
|
|
166
275
|
onPanResponderGrant: () => {
|
|
276
|
+
makeUnselectable(true);
|
|
167
277
|
stopSpring();
|
|
168
278
|
startY = pos["_value"];
|
|
169
279
|
},
|
|
@@ -171,76 +281,88 @@ const Drawer = withStaticProperties(themeable(forwardRef((props, ref) => {
|
|
|
171
281
|
const to = dy + startY;
|
|
172
282
|
pos.setValue(resisted(to, minY));
|
|
173
283
|
},
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
}
|
|
284
|
+
onPanResponderEnd: finish,
|
|
285
|
+
onPanResponderTerminate: finish,
|
|
286
|
+
onPanResponderRelease: finish
|
|
190
287
|
});
|
|
191
|
-
}, [
|
|
288
|
+
}, [disableDrag, animateTo, frameSize, positions, setPosition]);
|
|
192
289
|
let handleComponent = null;
|
|
193
|
-
let
|
|
290
|
+
let overlayComponent = null;
|
|
194
291
|
let frameComponent = null;
|
|
195
292
|
React.Children.forEach(childrenProp, (child) => {
|
|
196
|
-
var
|
|
293
|
+
var _a, _b;
|
|
197
294
|
if (isValidElement(child)) {
|
|
198
|
-
|
|
199
|
-
|
|
295
|
+
const name = (_b = (_a = child.type) == null ? void 0 : _a["staticConfig"]) == null ? void 0 : _b.componentName;
|
|
296
|
+
switch (name) {
|
|
297
|
+
case "SheetHandle":
|
|
200
298
|
handleComponent = child;
|
|
201
299
|
break;
|
|
202
|
-
case "
|
|
300
|
+
case "SheetFrame":
|
|
203
301
|
frameComponent = child;
|
|
204
302
|
break;
|
|
205
|
-
case "
|
|
206
|
-
|
|
303
|
+
case "SheetOverlay":
|
|
304
|
+
overlayComponent = child;
|
|
207
305
|
break;
|
|
208
306
|
default:
|
|
209
|
-
console.warn("Warning: passed invalid child to
|
|
307
|
+
console.warn("Warning: passed invalid child to Sheet", child);
|
|
210
308
|
}
|
|
211
309
|
}
|
|
212
310
|
});
|
|
213
|
-
|
|
214
|
-
|
|
311
|
+
const preventShown = (controller == null ? void 0 : controller.hidden) && (controller == null ? void 0 : controller.open);
|
|
312
|
+
if (preventShown) {
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
const contents = /* @__PURE__ */ React.createElement(SheetProvider, {
|
|
316
|
+
dismissOnOverlayPress,
|
|
317
|
+
open,
|
|
318
|
+
hidden: isHidden,
|
|
319
|
+
scope: __scopeSheet,
|
|
215
320
|
position,
|
|
216
321
|
snapPoints,
|
|
217
|
-
setPosition
|
|
218
|
-
|
|
322
|
+
setPosition,
|
|
323
|
+
setOpen
|
|
324
|
+
}, isResizing ? null : overlayComponent, isHidden ? null : handleComponent, /* @__PURE__ */ React.createElement(Animated.View, __spreadProps(__spreadValues({
|
|
325
|
+
ref
|
|
326
|
+
}, panResponder == null ? void 0 : panResponder.panHandlers), {
|
|
219
327
|
onLayout: (e) => {
|
|
220
|
-
|
|
328
|
+
const next = e.nativeEvent.layout.height;
|
|
329
|
+
setFrameSize((prev) => {
|
|
330
|
+
const isBigChange = Math.abs(prev - next) > 50;
|
|
331
|
+
setIsResizing(isBigChange);
|
|
332
|
+
return next;
|
|
333
|
+
});
|
|
221
334
|
},
|
|
335
|
+
pointerEvents: open ? "auto" : "none",
|
|
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: "
|
|
351
|
+
componentName: "Sheet"
|
|
230
352
|
}), {
|
|
231
|
-
Handle:
|
|
232
|
-
Frame:
|
|
233
|
-
|
|
353
|
+
Handle: SheetHandle,
|
|
354
|
+
Frame: SheetFrame,
|
|
355
|
+
Overlay: SheetOverlay
|
|
234
356
|
});
|
|
235
|
-
function
|
|
236
|
-
if (!
|
|
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 =
|
|
365
|
+
const next = frameSize - pct * frameSize;
|
|
244
366
|
return next;
|
|
245
367
|
}
|
|
246
368
|
function resisted(y, minY, maxOverflow = 25) {
|
|
@@ -253,12 +375,34 @@ 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
|
+
};
|
|
256
398
|
export {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
399
|
+
Sheet,
|
|
400
|
+
SheetController,
|
|
401
|
+
SheetFrame,
|
|
402
|
+
SheetHandle,
|
|
403
|
+
SheetHandleFrame,
|
|
404
|
+
SheetOverlay,
|
|
405
|
+
SheetOverlayFrame,
|
|
406
|
+
createSheetScope
|
|
263
407
|
};
|
|
264
408
|
//# sourceMappingURL=Sheet.js.map
|
package/dist/esm/Sheet.js.map
CHANGED
|
@@ -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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|