nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
35 lines (29 loc) • 1.19 kB
text/typescript
import { throttle } from "es-toolkit";
const LINE_HEIGHT = 16 * 1.125;
const PAGE_HEIGHT =
(typeof window !== "undefined" && window.innerHeight) || 800;
const DELTA_MODE_UNIT = [1, LINE_HEIGHT, PAGE_HEIGHT];
/**
* Inspired by:
* https://github.com/xiel/wheel-gestures/blob/b02412a93aa0e9e70d38c67c01e4293fb1c96c78/src/wheel-normalizer/wheel-normalizer.ts#L9C1-L22C2
*
* Original Licence:
* MIT License / Copyright (c) 2020 Felix Leupold
*/
const normalizeWheel = (e: WheelEvent) => {
const deltaX = e.deltaX * DELTA_MODE_UNIT[e.deltaMode];
const deltaY = e.deltaY * DELTA_MODE_UNIT[e.deltaMode];
const deltaZ = (e.deltaZ || 0) * DELTA_MODE_UNIT[e.deltaMode];
return [deltaX, deltaY, deltaZ] as const;
};
export const throttleWheel = <T extends (evt: WheelEvent) => void>(cb: T) => {
const slow = throttle(cb, 1000 / 2, { edges: ["leading"] });
const medium = throttle(cb, 1000 / 4, { edges: ["leading"] });
const fast = throttle(cb, 1000 / 16);
return (evt: WheelEvent) => {
const [_, deltaY] = normalizeWheel(evt);
const delta = Math.abs(deltaY);
const cb_ = delta < 1 ? slow : delta < 2 ? medium : delta < 60 ? fast : cb;
return cb_(evt);
};
};