| 10 | const clamp = (v: number, lo: number, hi: number): number => Math.min(hi, Math.max(lo, v)); |
| 11 | |
| 12 | const normalizeWheelDelta = (e: WheelEvent, basisCssPx: number): number => { |
| 13 | const raw = e.deltaY; |
| 14 | if (!Number.isFinite(raw) || raw === 0) return 0; |
| 15 | |
| 16 | // Normalize to CSS pixels-ish so sensitivity is stable across deltaMode. |
| 17 | switch (e.deltaMode) { |
| 18 | case WheelEvent.DOM_DELTA_PIXEL: |
| 19 | return raw; |
| 20 | case WheelEvent.DOM_DELTA_LINE: |
| 21 | return raw * 16; |
| 22 | case WheelEvent.DOM_DELTA_PAGE: |
| 23 | return raw * (Number.isFinite(basisCssPx) && basisCssPx > 0 ? basisCssPx : 800); |
| 24 | default: |
| 25 | return raw; |
| 26 | } |
| 27 | }; |
| 28 | |
| 29 | const normalizeWheelDeltaX = (e: WheelEvent, basisCssPx: number): number => { |
| 30 | const raw = e.deltaX; |