UNPKG

tossable

Version:

Generated by ambients-cli

67 lines (66 loc) 2.87 kB
import { inertia, pointer, value, calc } from "popmotion"; import { Cancellable } from "@lincode/promiselikes"; import "../assets/style.css"; import TouchLib from "touchlib"; import { extendFunction } from "@lincode/utils"; export class TossableHandle extends Cancellable { constructor(cb, set, enable, disable) { super(cb); this.set = set; this.enable = enable; this.disable = disable; } } export default ({ min = 0, max = 500, start = min, tug = 0.2, power = 0.6, bounceStiffness = 400, bounceDamping = 20, speed = 1, touchTarget, current, step, onComplete, axis = "x" }) => { const reaction = value(start, step); onComplete && (reaction.complete = extendFunction(reaction.complete, onComplete)); let trackerStart; let trackerStop; const touch = new TouchLib(touchTarget); touchTarget.classList.add("tossable-" + axis); const handle0 = touch.on("panstart", e => { var _a; trackerStart === null || trackerStart === void 0 ? void 0 : trackerStart.stop(); trackerStop === null || trackerStop === void 0 ? void 0 : trackerStop.stop(); const isVertical = Math.abs(e.deltaX) < Math.abs(e.deltaY) / 2; if ((axis === "x" && isVertical) || (axis === "y" && !isVertical)) return; const reactionStart = (_a = current === null || current === void 0 ? void 0 : current()) !== null && _a !== void 0 ? _a : reaction.get(); const applyOverdrag = (v) => { if (v < min) return calc.getValueFromProgress(min, v, tug); if (v > max) return calc.getValueFromProgress(max, v, tug); return v; }; trackerStop = undefined; trackerStart = pointer({ preventDefault: false }) .pipe((v) => reactionStart + (v[axis] - e[axis]) * speed, applyOverdrag) .start(reaction); }); const handle1 = touch.on("panend", () => { trackerStart === null || trackerStart === void 0 ? void 0 : trackerStart.stop(); trackerStop === null || trackerStop === void 0 ? void 0 : trackerStop.stop(); trackerStart = undefined; //@ts-ignore trackerStop = inertia({ min, max, from: reaction.get(), velocity: reaction.getVelocity(), power, bounceStiffness, bounceDamping }).start(reaction); }); return new TossableHandle(() => { handle0.cancel(); handle1.cancel(); }, val => { trackerStart === null || trackerStart === void 0 ? void 0 : trackerStart.stop(); trackerStop === null || trackerStop === void 0 ? void 0 : trackerStop.stop(); trackerStart = undefined; trackerStop = undefined; reaction.update(val); }, () => touch.enable(), () => touch.disable()); };