UNPKG

jobiqo-cl

Version:

[![CircleCI](https://circleci.com/gh/jobiqo/jobiqo-cl.svg?style=svg&circle-token=5a24efa5b8bbc4879276123e77d0d3f35ca7144c)](https://circleci.com/gh/jobiqo/jobiqo-cl)

84 lines (80 loc) 3.21 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var elementCouldBeVScrolled = function (node) { var styles = window.getComputedStyle(node); return (styles.overflowY !== 'hidden' && // not-not-scrollable !(styles.overflowY === styles.overflowX && styles.overflowY === 'visible') // scrollable ); }; var elementCouldBeHScrolled = function (node) { var styles = window.getComputedStyle(node); return (styles.overflowX !== 'hidden' && // not-not-scrollable !(styles.overflowY === styles.overflowX && styles.overflowX === 'visible') // scrollable ); }; var locationCouldBeScrolled = function (axis, node) { var current = node; do { var isScrollable = elementCouldBeScrolled(axis, current); if (isScrollable) { var _a = getScrollVariables(axis, current), s = _a[1], d = _a[2]; if (s > d) { return true; } } current = current.parentNode; } while (current && current !== document.body); return false; }; var getVScrollVariables = function (_a) { var scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight; return [scrollTop, scrollHeight, clientHeight]; }; var getHScrollVariables = function (_a) { var scrollLeft = _a.scrollLeft, scrollWidth = _a.scrollWidth, clientWidth = _a.clientWidth; return [scrollLeft, scrollWidth, clientWidth]; }; var elementCouldBeScrolled = function (axis, node) { return axis === 'v' ? elementCouldBeVScrolled(node) : elementCouldBeHScrolled(node); }; var getScrollVariables = function (axis, node) { return axis === 'v' ? getVScrollVariables(node) : getHScrollVariables(node); }; var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) { var delta = sourceDelta; // find scrollable target var target = event.target; var targetInLock = endTarget.contains(target); var shouldCancelScroll = false; var isDeltaPositive = delta > 0; var availableScroll = 0; var availableScrollTop = 0; do { var _a = getScrollVariables(axis, target), position = _a[0], scroll_1 = _a[1], capacity = _a[2]; var elementScroll = scroll_1 - capacity - position; if (position || elementScroll) { if (elementCouldBeScrolled(axis, target)) { availableScroll += elementScroll; availableScrollTop += position; } } target = target.parentNode; } while ( // portaled content (!targetInLock && target !== document.body) || // self content (targetInLock && (endTarget.contains(target) || endTarget === target))); if (isDeltaPositive && ((noOverscroll && availableScroll === 0) || (!noOverscroll && delta > availableScroll))) { shouldCancelScroll = true; } else if (!isDeltaPositive && ((noOverscroll && availableScrollTop === 0) || (!noOverscroll && -delta > availableScrollTop))) { shouldCancelScroll = true; } return shouldCancelScroll; }; exports.handleScroll = handleScroll; exports.locationCouldBeScrolled = locationCouldBeScrolled;