123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.handleScroll = exports.locationCouldBeScrolled = void 0;
- var alwaysContainsScroll = function (node) {
- // textarea will always _contain_ scroll inside self. It only can be hidden
- return node.tagName === 'TEXTAREA';
- };
- var elementCanBeScrolled = function (node, overflow) {
- var styles = window.getComputedStyle(node);
- return (
- // not-not-scrollable
- styles[overflow] !== 'hidden' &&
- // contains scroll inside self
- !(styles.overflowY === styles.overflowX && !alwaysContainsScroll(node) && styles[overflow] === 'visible'));
- };
- var elementCouldBeVScrolled = function (node) { return elementCanBeScrolled(node, 'overflowY'); };
- var elementCouldBeHScrolled = function (node) { return elementCanBeScrolled(node, 'overflowX'); };
- var locationCouldBeScrolled = function (axis, node) {
- var current = node;
- do {
- // Skip over shadow root
- if (typeof ShadowRoot !== 'undefined' && current instanceof ShadowRoot) {
- current = current.host;
- }
- 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;
- };
- exports.locationCouldBeScrolled = locationCouldBeScrolled;
- 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 getDirectionFactor = function (axis, direction) {
- /**
- * If the element's direction is rtl (right-to-left), then scrollLeft is 0 when the scrollbar is at its rightmost position,
- * and then increasingly negative as you scroll towards the end of the content.
- * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft
- */
- return axis === 'h' && direction === 'rtl' ? -1 : 1;
- };
- var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) {
- var directionFactor = getDirectionFactor(axis, window.getComputedStyle(endTarget).direction);
- var delta = directionFactor * 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 - directionFactor * 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;
|