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