(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('rxjs/operators'), require('@angular/core'), require('@angular/common'), require('perfect-scrollbar'), require('resize-observer-polyfill')) : typeof define === 'function' && define.amd ? define('ngx-perfect-scrollbar', ['exports', 'rxjs', 'rxjs/operators', '@angular/core', '@angular/common', 'perfect-scrollbar', 'resize-observer-polyfill'], factory) : (global = global || self, factory(global['ngx-perfect-scrollbar'] = {}, global.rxjs, global.rxjs.operators, global.ng.core, global.ng.common, global.PerfectScrollbar, global.ResizeObserver)); }(this, (function (exports, rxjs, operators, core, common, PerfectScrollbar, ResizeObserver) { 'use strict'; PerfectScrollbar = PerfectScrollbar && Object.prototype.hasOwnProperty.call(PerfectScrollbar, 'default') ? PerfectScrollbar['default'] : PerfectScrollbar; ResizeObserver = ResizeObserver && Object.prototype.hasOwnProperty.call(ResizeObserver, 'default') ? ResizeObserver['default'] : ResizeObserver; var PERFECT_SCROLLBAR_CONFIG = new core.InjectionToken('PERFECT_SCROLLBAR_CONFIG'); var Geometry = /** @class */ (function () { function Geometry(x, y, w, h) { this.x = x; this.y = y; this.w = w; this.h = h; } return Geometry; }()); var Position = /** @class */ (function () { function Position(x, y) { this.x = x; this.y = y; } return Position; }()); var PerfectScrollbarEvents = [ 'psScrollY', 'psScrollX', 'psScrollUp', 'psScrollDown', 'psScrollLeft', 'psScrollRight', 'psYReachEnd', 'psYReachStart', 'psXReachEnd', 'psXReachStart' ]; var PerfectScrollbarConfig = /** @class */ (function () { function PerfectScrollbarConfig(config) { if (config === void 0) { config = {}; } this.assign(config); } PerfectScrollbarConfig.prototype.assign = function (config) { if (config === void 0) { config = {}; } for (var key in config) { this[key] = config[key]; } }; return PerfectScrollbarConfig; }()); var PerfectScrollbarDirective = /** @class */ (function () { function PerfectScrollbarDirective(zone, differs, elementRef, platformId, defaults) { this.zone = zone; this.differs = differs; this.elementRef = elementRef; this.platformId = platformId; this.defaults = defaults; this.instance = null; this.ro = null; this.timeout = null; this.animation = null; this.configDiff = null; this.ngDestroy = new rxjs.Subject(); this.disabled = false; this.psScrollY = new core.EventEmitter(); this.psScrollX = new core.EventEmitter(); this.psScrollUp = new core.EventEmitter(); this.psScrollDown = new core.EventEmitter(); this.psScrollLeft = new core.EventEmitter(); this.psScrollRight = new core.EventEmitter(); this.psYReachEnd = new core.EventEmitter(); this.psYReachStart = new core.EventEmitter(); this.psXReachEnd = new core.EventEmitter(); this.psXReachStart = new core.EventEmitter(); } PerfectScrollbarDirective.prototype.ngOnInit = function () { var _this = this; if (!this.disabled && common.isPlatformBrowser(this.platformId)) { var config_1 = new PerfectScrollbarConfig(this.defaults); config_1.assign(this.config); // Custom configuration this.zone.runOutsideAngular(function () { _this.instance = new PerfectScrollbar(_this.elementRef.nativeElement, config_1); }); if (!this.configDiff) { this.configDiff = this.differs.find(this.config || {}).create(); this.configDiff.diff(this.config || {}); } this.zone.runOutsideAngular(function () { _this.ro = new ResizeObserver(function () { _this.update(); }); if (_this.elementRef.nativeElement.children[0]) { _this.ro.observe(_this.elementRef.nativeElement.children[0]); } _this.ro.observe(_this.elementRef.nativeElement); }); this.zone.runOutsideAngular(function () { PerfectScrollbarEvents.forEach(function (eventName) { var eventType = eventName.replace(/([A-Z])/g, function (c) { return "-" + c.toLowerCase(); }); rxjs.fromEvent(_this.elementRef.nativeElement, eventType) .pipe(operators.auditTime(20), operators.takeUntil(_this.ngDestroy)) .subscribe(function (event) { _this[eventName].emit(event); }); }); }); } }; PerfectScrollbarDirective.prototype.ngOnDestroy = function () { var _this = this; if (common.isPlatformBrowser(this.platformId)) { this.ngDestroy.next(); this.ngDestroy.complete(); if (this.ro) { this.ro.disconnect(); } if (this.timeout && typeof window !== 'undefined') { window.clearTimeout(this.timeout); } this.zone.runOutsideAngular(function () { if (_this.instance) { _this.instance.destroy(); } }); this.instance = null; } }; PerfectScrollbarDirective.prototype.ngDoCheck = function () { if (!this.disabled && this.configDiff && common.isPlatformBrowser(this.platformId)) { var changes = this.configDiff.diff(this.config || {}); if (changes) { this.ngOnDestroy(); this.ngOnInit(); } } }; PerfectScrollbarDirective.prototype.ngOnChanges = function (changes) { if (changes['disabled'] && !changes['disabled'].isFirstChange() && common.isPlatformBrowser(this.platformId)) { if (changes['disabled'].currentValue !== changes['disabled'].previousValue) { if (changes['disabled'].currentValue === true) { this.ngOnDestroy(); } else if (changes['disabled'].currentValue === false) { this.ngOnInit(); } } } }; PerfectScrollbarDirective.prototype.ps = function () { return this.instance; }; PerfectScrollbarDirective.prototype.update = function () { var _this = this; if (typeof window !== 'undefined') { if (this.timeout) { window.clearTimeout(this.timeout); } this.timeout = window.setTimeout(function () { if (!_this.disabled && _this.configDiff) { try { _this.zone.runOutsideAngular(function () { if (_this.instance) { _this.instance.update(); } }); } catch (error) { // Update can be finished after destroy so catch errors } } }, 0); } }; PerfectScrollbarDirective.prototype.geometry = function (prefix) { if (prefix === void 0) { prefix = 'scroll'; } return new Geometry(this.elementRef.nativeElement[prefix + 'Left'], this.elementRef.nativeElement[prefix + 'Top'], this.elementRef.nativeElement[prefix + 'Width'], this.elementRef.nativeElement[prefix + 'Height']); }; PerfectScrollbarDirective.prototype.position = function (absolute) { if (absolute === void 0) { absolute = false; } if (!absolute && this.instance) { return new Position(this.instance.reach.x || 0, this.instance.reach.y || 0); } else { return new Position(this.elementRef.nativeElement.scrollLeft, this.elementRef.nativeElement.scrollTop); } }; PerfectScrollbarDirective.prototype.scrollable = function (direction) { if (direction === void 0) { direction = 'any'; } var element = this.elementRef.nativeElement; if (direction === 'any') { return element.classList.contains('ps--active-x') || element.classList.contains('ps--active-y'); } else if (direction === 'both') { return element.classList.contains('ps--active-x') && element.classList.contains('ps--active-y'); } else { return element.classList.contains('ps--active-' + direction); } }; PerfectScrollbarDirective.prototype.scrollTo = function (x, y, speed) { if (!this.disabled) { if (y == null && speed == null) { this.animateScrolling('scrollTop', x, speed); } else { if (x != null) { this.animateScrolling('scrollLeft', x, speed); } if (y != null) { this.animateScrolling('scrollTop', y, speed); } } } }; PerfectScrollbarDirective.prototype.scrollToX = function (x, speed) { this.animateScrolling('scrollLeft', x, speed); }; PerfectScrollbarDirective.prototype.scrollToY = function (y, speed) { this.animateScrolling('scrollTop', y, speed); }; PerfectScrollbarDirective.prototype.scrollToTop = function (offset, speed) { this.animateScrolling('scrollTop', (offset || 0), speed); }; PerfectScrollbarDirective.prototype.scrollToLeft = function (offset, speed) { this.animateScrolling('scrollLeft', (offset || 0), speed); }; PerfectScrollbarDirective.prototype.scrollToRight = function (offset, speed) { var left = this.elementRef.nativeElement.scrollWidth - this.elementRef.nativeElement.clientWidth; this.animateScrolling('scrollLeft', left - (offset || 0), speed); }; PerfectScrollbarDirective.prototype.scrollToBottom = function (offset, speed) { var top = this.elementRef.nativeElement.scrollHeight - this.elementRef.nativeElement.clientHeight; this.animateScrolling('scrollTop', top - (offset || 0), speed); }; PerfectScrollbarDirective.prototype.scrollToElement = function (element, offset, speed) { if (typeof element === 'string') { element = this.elementRef.nativeElement.querySelector(element); } if (element) { var elementPos = element.getBoundingClientRect(); var scrollerPos = this.elementRef.nativeElement.getBoundingClientRect(); if (this.elementRef.nativeElement.classList.contains('ps--active-x')) { var currentPos = this.elementRef.nativeElement['scrollLeft']; var position = elementPos.left - scrollerPos.left + currentPos; this.animateScrolling('scrollLeft', position + (offset || 0), speed); } if (this.elementRef.nativeElement.classList.contains('ps--active-y')) { var currentPos = this.elementRef.nativeElement['scrollTop']; var position = elementPos.top - scrollerPos.top + currentPos; this.animateScrolling('scrollTop', position + (offset || 0), speed); } } }; PerfectScrollbarDirective.prototype.animateScrolling = function (target, value, speed) { var _this = this; if (this.animation) { window.cancelAnimationFrame(this.animation); this.animation = null; } if (!speed || typeof window === 'undefined') { this.elementRef.nativeElement[target] = value; } else if (value !== this.elementRef.nativeElement[target]) { var newValue_1 = 0; var scrollCount_1 = 0; var oldTimestamp_1 = performance.now(); var oldValue_1 = this.elementRef.nativeElement[target]; var cosParameter_1 = (oldValue_1 - value) / 2; var step_1 = function (newTimestamp) { scrollCount_1 += Math.PI / (speed / (newTimestamp - oldTimestamp_1)); newValue_1 = Math.round(value + cosParameter_1 + cosParameter_1 * Math.cos(scrollCount_1)); // Only continue animation if scroll position has not changed if (_this.elementRef.nativeElement[target] === oldValue_1) { if (scrollCount_1 >= Math.PI) { _this.animateScrolling(target, value, 0); } else { _this.elementRef.nativeElement[target] = newValue_1; // On a zoomed out page the resulting offset may differ oldValue_1 = _this.elementRef.nativeElement[target]; oldTimestamp_1 = newTimestamp; _this.animation = window.requestAnimationFrame(step_1); } } }; window.requestAnimationFrame(step_1); } }; return PerfectScrollbarDirective; }()); PerfectScrollbarDirective.decorators = [ { type: core.Directive, args: [{ selector: '[perfectScrollbar]', exportAs: 'ngxPerfectScrollbar' },] } ]; PerfectScrollbarDirective.ctorParameters = function () { return [ { type: core.NgZone }, { type: core.KeyValueDiffers }, { type: core.ElementRef }, { type: Object, decorators: [{ type: core.Inject, args: [core.PLATFORM_ID,] }] }, { type: undefined, decorators: [{ type: core.Optional }, { type: core.Inject, args: [PERFECT_SCROLLBAR_CONFIG,] }] } ]; }; PerfectScrollbarDirective.propDecorators = { disabled: [{ type: core.Input }], config: [{ type: core.Input, args: ['perfectScrollbar',] }], psScrollY: [{ type: core.Output }], psScrollX: [{ type: core.Output }], psScrollUp: [{ type: core.Output }], psScrollDown: [{ type: core.Output }], psScrollLeft: [{ type: core.Output }], psScrollRight: [{ type: core.Output }], psYReachEnd: [{ type: core.Output }], psYReachStart: [{ type: core.Output }], psXReachEnd: [{ type: core.Output }], psXReachStart: [{ type: core.Output }] }; var PerfectScrollbarComponent = /** @class */ (function () { function PerfectScrollbarComponent(zone, cdRef, platformId) { this.zone = zone; this.cdRef = cdRef; this.platformId = platformId; this.states = {}; this.indicatorX = false; this.indicatorY = false; this.interaction = false; this.scrollPositionX = 0; this.scrollPositionY = 0; this.scrollDirectionX = 0; this.scrollDirectionY = 0; this.usePropagationX = false; this.usePropagationY = false; this.allowPropagationX = false; this.allowPropagationY = false; this.stateTimeout = null; this.ngDestroy = new rxjs.Subject(); this.stateUpdate = new rxjs.Subject(); this.disabled = false; this.usePSClass = true; this.autoPropagation = false; this.scrollIndicators = false; this.psScrollY = new core.EventEmitter(); this.psScrollX = new core.EventEmitter(); this.psScrollUp = new core.EventEmitter(); this.psScrollDown = new core.EventEmitter(); this.psScrollLeft = new core.EventEmitter(); this.psScrollRight = new core.EventEmitter(); this.psYReachEnd = new core.EventEmitter(); this.psYReachStart = new core.EventEmitter(); this.psXReachEnd = new core.EventEmitter(); this.psXReachStart = new core.EventEmitter(); } PerfectScrollbarComponent.prototype.ngOnInit = function () { var _this = this; if (common.isPlatformBrowser(this.platformId)) { this.stateUpdate .pipe(operators.takeUntil(this.ngDestroy), operators.distinctUntilChanged(function (a, b) { return (a === b && !_this.stateTimeout); })) .subscribe(function (state) { if (_this.stateTimeout && typeof window !== 'undefined') { window.clearTimeout(_this.stateTimeout); _this.stateTimeout = null; } if (state === 'x' || state === 'y') { _this.interaction = false; if (state === 'x') { _this.indicatorX = false; _this.states.left = false; _this.states.right = false; if (_this.autoPropagation && _this.usePropagationX) { _this.allowPropagationX = false; } } else if (state === 'y') { _this.indicatorY = false; _this.states.top = false; _this.states.bottom = false; if (_this.autoPropagation && _this.usePropagationY) { _this.allowPropagationY = false; } } } else { if (state === 'left' || state === 'right') { _this.states.left = false; _this.states.right = false; _this.states[state] = true; if (_this.autoPropagation && _this.usePropagationX) { _this.indicatorX = true; } } else if (state === 'top' || state === 'bottom') { _this.states.top = false; _this.states.bottom = false; _this.states[state] = true; if (_this.autoPropagation && _this.usePropagationY) { _this.indicatorY = true; } } if (_this.autoPropagation && typeof window !== 'undefined') { _this.stateTimeout = window.setTimeout(function () { _this.indicatorX = false; _this.indicatorY = false; _this.stateTimeout = null; if (_this.interaction && (_this.states.left || _this.states.right)) { _this.allowPropagationX = true; } if (_this.interaction && (_this.states.top || _this.states.bottom)) { _this.allowPropagationY = true; } _this.cdRef.markForCheck(); }, 500); } } _this.cdRef.markForCheck(); _this.cdRef.detectChanges(); }); this.zone.runOutsideAngular(function () { if (_this.directiveRef) { var element = _this.directiveRef.elementRef.nativeElement; rxjs.fromEvent(element, 'wheel') .pipe(operators.takeUntil(_this.ngDestroy)) .subscribe(function (event) { if (!_this.disabled && _this.autoPropagation) { var scrollDeltaX = event.deltaX; var scrollDeltaY = event.deltaY; _this.checkPropagation(event, scrollDeltaX, scrollDeltaY); } }); rxjs.fromEvent(element, 'touchmove') .pipe(operators.takeUntil(_this.ngDestroy)) .subscribe(function (event) { if (!_this.disabled && _this.autoPropagation) { var scrollPositionX = event.touches[0].clientX; var scrollPositionY = event.touches[0].clientY; var scrollDeltaX = scrollPositionX - _this.scrollPositionX; var scrollDeltaY = scrollPositionY - _this.scrollPositionY; _this.checkPropagation(event, scrollDeltaX, scrollDeltaY); _this.scrollPositionX = scrollPositionX; _this.scrollPositionY = scrollPositionY; } }); rxjs.merge(rxjs.fromEvent(element, 'ps-scroll-x') .pipe(operators.mapTo('x')), rxjs.fromEvent(element, 'ps-scroll-y') .pipe(operators.mapTo('y')), rxjs.fromEvent(element, 'ps-x-reach-end') .pipe(operators.mapTo('right')), rxjs.fromEvent(element, 'ps-y-reach-end') .pipe(operators.mapTo('bottom')), rxjs.fromEvent(element, 'ps-x-reach-start') .pipe(operators.mapTo('left')), rxjs.fromEvent(element, 'ps-y-reach-start') .pipe(operators.mapTo('top'))) .pipe(operators.takeUntil(_this.ngDestroy)) .subscribe(function (state) { if (!_this.disabled && (_this.autoPropagation || _this.scrollIndicators)) { _this.stateUpdate.next(state); } }); } }); window.setTimeout(function () { PerfectScrollbarEvents.forEach(function (eventName) { if (_this.directiveRef) { _this.directiveRef[eventName] = _this[eventName]; } }); }, 0); } }; PerfectScrollbarComponent.prototype.ngOnDestroy = function () { if (common.isPlatformBrowser(this.platformId)) { this.ngDestroy.next(); this.ngDestroy.unsubscribe(); if (this.stateTimeout && typeof window !== 'undefined') { window.clearTimeout(this.stateTimeout); } } }; PerfectScrollbarComponent.prototype.ngDoCheck = function () { if (common.isPlatformBrowser(this.platformId)) { if (!this.disabled && this.autoPropagation && this.directiveRef) { var element = this.directiveRef.elementRef.nativeElement; this.usePropagationX = element.classList.contains('ps--active-x'); this.usePropagationY = element.classList.contains('ps--active-y'); } } }; PerfectScrollbarComponent.prototype.checkPropagation = function (event, deltaX, deltaY) { this.interaction = true; var scrollDirectionX = (deltaX < 0) ? -1 : 1; var scrollDirectionY = (deltaY < 0) ? -1 : 1; if ((this.usePropagationX && this.usePropagationY) || (this.usePropagationX && (!this.allowPropagationX || (this.scrollDirectionX !== scrollDirectionX))) || (this.usePropagationY && (!this.allowPropagationY || (this.scrollDirectionY !== scrollDirectionY)))) { event.preventDefault(); event.stopPropagation(); } if (!!deltaX) { this.scrollDirectionX = scrollDirectionX; } if (!!deltaY) { this.scrollDirectionY = scrollDirectionY; } this.stateUpdate.next('interaction'); this.cdRef.detectChanges(); }; return PerfectScrollbarComponent; }()); PerfectScrollbarComponent.decorators = [ { type: core.Component, args: [{ selector: 'perfect-scrollbar', exportAs: 'ngxPerfectScrollbar', template: "