UNPKG

@helpscout/hsds-react

Version:

React component library for Help Scout's Design System

84 lines (64 loc) 2.54 kB
"use strict"; exports.__esModule = true; exports.hasContentOverflowX = exports.remapScrollingPlane = exports.isMouseWheelYEvent = void 0; var _node = require("../../utilities/node"); var isFirefox = function isFirefox() { if (!navigator) return false; return navigator.userAgent.toLowerCase().indexOf('firefox') > -1; }; /** * Determines if a wheel event came from a mouse or from a trackpad. * * There is not native way to do this in the browser. To calculate this, * various assumptions were made on the delta + threshold values. * * This function isn't full-proof, as a VERY hard trackpad swipe will * result in a true (due to it's higher delta value). * * Note: This is not effective at all in Firefox, since their delta values * are completely off compared to other browsers. * * @param {WheelEvent} event * * @returns {boolean} */ var isMouseWheelYEvent = function isMouseWheelYEvent(event) { if (event === void 0) { event = {}; } var _event = event, deltaX = _event.deltaX, deltaY = _event.deltaY; if (deltaX === undefined || deltaY === undefined) return false; // Wheel scrolls always have an x value of 0 var neutralX = 0; // Enlarges the data set for more precise calculations var wheelMultiplier = 240; // Limiter var wheelThreshold = 480; // Values for calculation var computedDeltaX = deltaX * (wheelMultiplier * -1); var computedDeltaY = Math.abs(deltaY) * wheelMultiplier / 120 * 10; if (computedDeltaX !== neutralX) return false; return computedDeltaY >= wheelThreshold; }; exports.isMouseWheelYEvent = isMouseWheelYEvent; var remapScrollingPlane = function remapScrollingPlane(event) { // Scrolling behaviour is strange in Firefox… // We'll let Firefox natively handle things. // Can't write tests for this in JSDOM. // Can't create fixture for JSDOM's built-in Navigator instance. if (isFirefox()) return; var node = event.currentTarget; // Don't customize native shift + scroll interactions if (event.target.shiftKey) return; if (!node) return; if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) { return; } if (isMouseWheelYEvent(event)) { node.scrollLeft += event.deltaY; } // Scroll-locking if (event.cancelable) event.preventDefault(); }; exports.remapScrollingPlane = remapScrollingPlane; var hasContentOverflowX = function hasContentOverflowX(node) { if (!(0, _node.isNodeElement)(node)) return false; return node.clientWidth < node.scrollWidth; }; exports.hasContentOverflowX = hasContentOverflowX;