ngx-scrollbar-v8
Version:
Custom overlay-scrollbars with native scrolling mechanism.
199 lines • 17.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Inject, NgZone, ChangeDetectionStrategy, forwardRef, PLATFORM_ID } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { Directionality } from '@angular/cdk/bidi';
import { fromEvent, animationFrameScheduler } from 'rxjs';
import { mergeMap, pluck, takeUntil, tap } from 'rxjs/operators';
import { NgScrollbar } from './ng-scrollbar';
import { NgScrollbarThumb } from './ng-scrollbar-thumb';
var NgScrollbarX = /** @class */ (function (_super) {
tslib_1.__extends(NgScrollbarX, _super);
function NgScrollbarX(_document, _parent, _platform, _dir, _zone) {
var _this = _super.call(this, _parent, _platform, _zone) || this;
_this._document = _document;
_this._parent = _parent;
_this._dir = _dir;
_this._zone = _zone;
return _this;
}
Object.defineProperty(NgScrollbarX.prototype, "thumbSize", {
/**
* Calculate scrollbar thumbnail size
*/
get: /**
* Calculate scrollbar thumbnail size
* @return {?}
*/
function () {
/** @type {?} */
var barClientWidth = this.bar.nativeElement.clientWidth;
/** @type {?} */
var viewClientWidth = this._view.clientWidth;
/** @type {?} */
var viewScrollWidth = this._view.scrollWidth;
this._naturalThumbSize = barClientWidth / viewScrollWidth * barClientWidth;
this._scrollMax = viewScrollWidth - viewClientWidth;
return this.scrollBoundaries(this._naturalThumbSize, this._scrollMax);
},
enumerable: true,
configurable: true
});
/**
* Scrollbar click
* @param e Mouse event
*/
/**
* Scrollbar click
* @param {?} e Mouse event
* @return {?}
*/
NgScrollbarX.prototype.onScrollbarHolderClick = /**
* Scrollbar click
* @param {?} e Mouse event
* @return {?}
*/
function (e) {
if (e.target === e.currentTarget) {
/** @type {?} */
var offsetX = e.offsetX - this._naturalThumbSize * .5;
/** @type {?} */
var thumbPositionPercentage = offsetX * 100 / this.bar.nativeElement.clientWidth;
/** @type {?} */
var value = thumbPositionPercentage * this._view.scrollWidth / 100;
this._parent.scrollTo((/** @type {?} */ ({ left: value, duration: this.scrollToDuration }))).subscribe();
}
};
/**
* Update scrollbar
*/
/**
* Update scrollbar
* @protected
* @return {?}
*/
NgScrollbarX.prototype.updateScrollbar = /**
* Update scrollbar
* @protected
* @return {?}
*/
function () {
var _this = this;
this._thumbSize = this.thumb.nativeElement.clientWidth;
this._trackMax = this.bar.nativeElement.clientWidth - this._thumbSize;
this._currPos = this._view.scrollLeft * this._trackMax / this._scrollMax;
this._zone.run((/**
* @return {?}
*/
function () {
animationFrameScheduler.schedule((/**
* @return {?}
*/
function () {
return _this.updateState({
transform: "translate3d(" + (_this._dir.value === 'rtl' ? _this._currPos - _this._trackMax : _this._currPos) + "px, 0, 0)",
width: _this.thumbSize + "px"
});
}));
}));
};
/**
* Start horizontal thumb worker
*/
/**
* Start horizontal thumb worker
* @protected
* @return {?}
*/
NgScrollbarX.prototype.startThumbEvents = /**
* Start horizontal thumb worker
* @protected
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var mouseDown$ = fromEvent(this.thumb.nativeElement, 'mousedown');
/** @type {?} */
var mouseMove$ = fromEvent(this._document, 'mousemove');
/** @type {?} */
var mouseUp$ = fromEvent(this._document, 'mouseup').pipe(tap((/**
* @return {?}
*/
function () { return _this._document.onselectstart = null; })));
return mouseDown$.pipe(tap((/**
* @return {?}
*/
function () {
_this._document.onselectstart = (/**
* @return {?}
*/
function () { return false; });
// Initialize trackMax for before start dragging
_this._trackMax = _this.bar.nativeElement.clientWidth - _this._thumbSize;
})), pluck('offsetX'), mergeMap((/**
* @param {?} mouseDownOffset
* @return {?}
*/
function (mouseDownOffset) { return mouseMove$.pipe(takeUntil(mouseUp$), pluck('clientX'), tap((/**
* @param {?} mouseMoveClient
* @return {?}
*/
function (mouseMoveClient) {
/** @type {?} */
var offsetX = mouseMoveClient - _this.bar.nativeElement.getBoundingClientRect().left;
/** @type {?} */
var value = _this._scrollMax * (offsetX - mouseDownOffset) / _this._trackMax;
if (_this._dir.value === 'rtl') {
value = value === 0 ? offsetX - _this._trackMax : value;
}
_this._parent.scrollable.scrollTo({ left: value });
}))); })));
};
NgScrollbarX.decorators = [
{ type: Component, args: [{
selector: 'ng-scrollbar-x',
changeDetection: ChangeDetectionStrategy.OnPush,
template: "\n <div #bar class=\"ng-scrollbar {{barClass}}\" (mousedown)=\"onScrollbarHolderClick($event)\">\n <div #thumb class=\"ng-scrollbar-thumb {{thumbClass}}\" [ngStyle]=\"scrollbarStyle | async\"></div>\n </div>\n "
}] }
];
/** @nocollapse */
NgScrollbarX.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: NgScrollbar, decorators: [{ type: Inject, args: [forwardRef((/**
* @return {?}
*/
function () { return NgScrollbar; })),] }] },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: Directionality },
{ type: NgZone }
]; };
return NgScrollbarX;
}(NgScrollbarThumb));
export { NgScrollbarX };
if (false) {
/**
* @type {?}
* @protected
*/
NgScrollbarX.prototype._document;
/**
* @type {?}
* @protected
*/
NgScrollbarX.prototype._parent;
/**
* @type {?}
* @protected
*/
NgScrollbarX.prototype._dir;
/**
* @type {?}
* @protected
*/
NgScrollbarX.prototype._zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsYmFyLXguanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2Nyb2xsYmFyLyIsInNvdXJjZXMiOlsic2Nyb2xsYmFyL25nLXNjcm9sbGJhci14LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFjLHVCQUF1QixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQ7SUFTa0Msd0NBQWdCO0lBY2hELHNCQUF3QyxTQUFjLEVBQ08sT0FBb0IsRUFDaEQsU0FBaUIsRUFDNUIsSUFBb0IsRUFDcEIsS0FBYTtRQUpuQyxZQUtFLGtCQUFNLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQ2pDO1FBTnVDLGVBQVMsR0FBVCxTQUFTLENBQUs7UUFDTyxhQUFPLEdBQVAsT0FBTyxDQUFhO1FBRTNELFVBQUksR0FBSixJQUFJLENBQWdCO1FBQ3BCLFdBQUssR0FBTCxLQUFLLENBQVE7O0lBRW5DLENBQUM7SUFmRCxzQkFBSSxtQ0FBUztRQUhiOztXQUVHOzs7OztRQUNIOztnQkFDUSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVzs7Z0JBQ25ELGVBQWUsR0FBRyxJQUFJ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TSxPQUFBLFdBQVcsRUFBWCxDQUFXLEVBQUM7Z0JBQ0wsTUFBTSx1QkFBckMsTUFBTSxTQUFDLFdBQVc7Z0JBL0J4QixjQUFjO2dCQUZLLE1BQU07O0lBbUdsQyxtQkFBQztDQUFBLEFBM0ZELENBU2tDLGdCQUFnQixHQWtGakQ7U0FsRlksWUFBWTs7Ozs7O0lBY1gsaUNBQTBDOzs7OztJQUMxQywrQkFBcUU7Ozs7O0lBRXJFLDRCQUE4Qjs7Ozs7SUFDOUIsNkJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIGZvcndhcmRSZWYsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1lcmdlTWFwLCBwbHVjaywgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOZ1Njcm9sbGJhciB9IGZyb20gJy4vbmctc2Nyb2xsYmFyJztcbmltcG9ydCB7IE5nU2Nyb2xsYmFyVGh1bWIgfSBmcm9tICcuL25nLXNjcm9sbGJhci10aHVtYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLXNjcm9sbGJhci14JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAjYmFyIGNsYXNzPVwibmctc2Nyb2xsYmFyIHt7YmFyQ2xhc3N9fVwiIChtb3VzZWRvd24pPVwib25TY3JvbGxiYXJIb2xkZXJDbGljaygkZXZlbnQpXCI+XG4gICAgICA8ZGl2ICN0aHVtYiBjbGFzcz1cIm5nLXNjcm9sbGJhci10aHVtYiB7e3RodW1iQ2xhc3N9fVwiIFtuZ1N0eWxlXT1cInNjcm9sbGJhclN0eWxlIHwgYXN5bmNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbGJhclggZXh0ZW5kcyBOZ1Njcm9sbGJhclRodW1iIHtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHNjcm9sbGJhciB0aHVtYm5haWwgc2l6ZVxuICAgKi9cbiAgZ2V0IHRodW1iU2l6ZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGJhckNsaWVudFdpZHRoID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCB2aWV3Q2xpZW50V2lkdGggPSB0aGlzLl92aWV3LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHZpZXdTY3JvbGxXaWR0aCA9IHRoaXMuX3ZpZXcuc2Nyb2xsV2lkdGg7XG4gICAgdGhpcy5fbmF0dXJhbFRodW1iU2l6ZSA9IGJhckNsaWVudFdpZHRoIC8gdmlld1Njcm9sbFdpZHRoICogYmFyQ2xpZW50V2lkdGg7XG4gICAgdGhpcy5fc2Nyb2xsTWF4ID0gdmlld1Njcm9sbFdpZHRoIC0gdmlld0NsaWVudFdpZHRoO1xuICAgIHJldHVybiB0aGlzLnNjcm9sbEJvdW5kYXJpZXModGhpcy5fbmF0dXJhbFRodW1iU2l6ZSwgdGhpcy5fc2Nyb2xsTWF4KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByb3RlY3RlZCBfZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgICAgICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE5nU2Nyb2xsYmFyKSkgcHJvdGVjdGVkIF9wYXJlbnQ6IE5nU2Nyb2xsYmFyLFxuICAgICAgICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBfcGxhdGZvcm06IE9iamVjdCxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3pvbmU6IE5nWm9uZSkge1xuICAgIHN1cGVyKF9wYXJlbnQsIF9wbGF0Zm9ybSwgX3pvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbGJhciBjbGlja1xuICAgKiBAcGFyYW0gZSBNb3VzZSBldmVudFxuICAgKi9cbiAgb25TY3JvbGxiYXJIb2xkZXJDbGljayhlOiBhbnkpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGUub2Zmc2V0WCAtIHRoaXMuX25hdHVyYWxUaHVtYlNpemUgKiAuNTtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb25QZXJjZW50YWdlID0gb2Zmc2V0WCAqIDEwMCAvIHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRodW1iUG9zaXRpb25QZXJjZW50YWdlICogdGhpcy5fdmlldy5zY3JvbGxXaWR0aCAvIDEwMDtcbiAgICAgIHRoaXMuX3BhcmVudC5zY3JvbGxUbyh7bGVmdDogdmFsdWUsIGR1cmF0aW9uOiB0aGlzLnNjcm9sbFRvRHVyYXRpb259IGFzIGFueSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzY3JvbGxiYXJcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVTY3JvbGxiYXIoKSB7XG4gICAgdGhpcy5fdGh1bWJTaXplID0gdGhpcy50aHVtYi5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHRoaXMuX3RyYWNrTWF4ID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCAtIHRoaXMuX3RodW1iU2l6ZTtcbiAgICB0aGlzLl9jdXJyUG9zID0gdGhpcy5fdmlldy5zY3JvbGxMZWZ0ICogdGhpcy5fdHJhY2tNYXggLyB0aGlzLl9zY3JvbGxNYXg7XG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnID8gdGhpcy5fY3VyclBvcyAtIHRoaXMuX3RyYWNrTWF4IDogdGhpcy5fY3VyclBvc31weCwgMCwgMClgLFxuICAgICAgICAgIHdpZHRoOiBgJHt0aGlzLnRodW1iU2l6ZX1weGBcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgaG9yaXpvbnRhbCB0aHVtYiB3b3JrZXJcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydFRodW1iRXZlbnRzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgbW91c2VEb3duJCA9IGZyb21FdmVudCh0aGlzLnRodW1iLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nKTtcbiAgICBjb25zdCBtb3VzZU1vdmUkID0gZnJvbUV2ZW50KHRoaXMuX2RvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XG4gICAgY29uc3QgbW91c2VVcCQgPSBmcm9tRXZlbnQodGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gbnVsbClcbiAgICApO1xuICAgIHJldHVybiBtb3VzZURvd24kLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2U7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdHJhY2tNYXggZm9yIGJlZm9yZSBzdGFydCBkcmFnZ2luZ1xuICAgICAgICB0aGlzLl90cmFja01heCA9IHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggLSB0aGlzLl90aHVtYlNpemU7XG4gICAgICB9KSxcbiAgICAgIHBsdWNrKCdvZmZzZXRYJyksXG4gICAgICBtZXJnZU1hcCgobW91c2VEb3duT2Zmc2V0OiBudW1iZXIpID0+IG1vdXNlTW92ZSQucGlwZShcbiAgICAgICAgdGFrZVVudGlsKG1vdXNlVXAkKSxcbiAgICAgICAgcGx1Y2soJ2NsaWVudFgnKSxcbiAgICAgICAgdGFwKChtb3VzZU1vdmVDbGllbnQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBtb3VzZU1vdmVDbGllbnQgLSB0aGlzLmJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fc2Nyb2xsTWF4ICogKG9mZnNldFggLSBtb3VzZURvd25PZmZzZXQpIC8gdGhpcy5fdHJhY2tNYXg7XG4gICAgICAgICAgaWYgKHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IDAgPyBvZmZzZXRYIC0gdGhpcy5fdHJhY2tNYXggOiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcGFyZW50LnNjcm9sbGFibGUuc2Nyb2xsVG8oe2xlZnQ6IHZhbHVlfSk7XG4gICAgICAgIH0pXG4gICAgICApKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==