ngx-scrollbar-v8
Version:
Custom overlay-scrollbars with native scrolling mechanism.
188 lines • 16.2 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 { fromEvent, animationFrameScheduler } from 'rxjs';
import { mergeMap, pluck, takeUntil, tap } from 'rxjs/operators';
import { NgScrollbar } from './ng-scrollbar';
import { NgScrollbarThumb } from './ng-scrollbar-thumb';
var NgScrollbarY = /** @class */ (function (_super) {
tslib_1.__extends(NgScrollbarY, _super);
function NgScrollbarY(_document, _parent, _platform, _zone) {
var _this = _super.call(this, _parent, _platform, _zone) || this;
_this._document = _document;
_this._parent = _parent;
_this._zone = _zone;
return _this;
}
Object.defineProperty(NgScrollbarY.prototype, "thumbSize", {
/**
* Calculate scrollbar thumbnail size
*/
get: /**
* Calculate scrollbar thumbnail size
* @return {?}
*/
function () {
/** @type {?} */
var barClientHeight = this.bar.nativeElement.clientHeight;
/** @type {?} */
var viewClientHeight = this._view.clientHeight;
/** @type {?} */
var viewScrollHeight = this._view.scrollHeight;
this._naturalThumbSize = barClientHeight / viewScrollHeight * barClientHeight;
this._scrollMax = viewScrollHeight - viewClientHeight;
return this.scrollBoundaries(this._naturalThumbSize, this._scrollMax);
},
enumerable: true,
configurable: true
});
/**
* Scrollbar click
* @param e Mouse event
*/
/**
* Scrollbar click
* @param {?} e Mouse event
* @return {?}
*/
NgScrollbarY.prototype.onScrollbarHolderClick = /**
* Scrollbar click
* @param {?} e Mouse event
* @return {?}
*/
function (e) {
if (e.target === e.currentTarget) {
/** @type {?} */
var offsetY = e.offsetY - this._naturalThumbSize * .5;
/** @type {?} */
var thumbPositionPercentage = offsetY * 100 / this.bar.nativeElement.clientHeight;
/** @type {?} */
var value = thumbPositionPercentage * this._view.scrollHeight / 100;
this._parent.scrollTo((/** @type {?} */ ({ top: value, duration: this.scrollToDuration }))).subscribe();
}
};
/**
* Update scrollbar
*/
/**
* Update scrollbar
* @protected
* @return {?}
*/
NgScrollbarY.prototype.updateScrollbar = /**
* Update scrollbar
* @protected
* @return {?}
*/
function () {
var _this = this;
this._thumbSize = this.thumb.nativeElement.clientHeight;
this._trackMax = this.bar.nativeElement.clientHeight - this._thumbSize;
this._currPos = this._view.scrollTop * this._trackMax / this._scrollMax;
this._zone.run((/**
* @return {?}
*/
function () {
animationFrameScheduler.schedule((/**
* @return {?}
*/
function () {
return _this.updateState({
transform: "translate3d(0, " + _this._currPos + "px, 0)",
height: _this.thumbSize + "px"
});
}));
}));
};
/**
* Start vertical thumb worker
*/
/**
* Start vertical thumb worker
* @protected
* @return {?}
*/
NgScrollbarY.prototype.startThumbEvents = /**
* Start vertical 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.clientHeight - _this._thumbSize;
})), pluck('offsetY'), mergeMap((/**
* @param {?} mouseDownOffset
* @return {?}
*/
function (mouseDownOffset) { return mouseMove$.pipe(takeUntil(mouseUp$), pluck('clientY'), tap((/**
* @param {?} mouseMoveClient
* @return {?}
*/
function (mouseMoveClient) {
/** @type {?} */
var offsetY = mouseMoveClient - _this.bar.nativeElement.getBoundingClientRect().top;
/** @type {?} */
var value = _this._scrollMax * (offsetY - mouseDownOffset) / _this._trackMax;
_this._parent.scrollable.scrollTo({ top: value });
}))); })));
};
NgScrollbarY.decorators = [
{ type: Component, args: [{
selector: 'ng-scrollbar-y',
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 */
NgScrollbarY.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: NgZone }
]; };
return NgScrollbarY;
}(NgScrollbarThumb));
export { NgScrollbarY };
if (false) {
/**
* @type {?}
* @protected
*/
NgScrollbarY.prototype._document;
/**
* @type {?}
* @protected
*/
NgScrollbarY.prototype._parent;
/**
* @type {?}
* @protected
*/
NgScrollbarY.prototype._zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsYmFyLXkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2Nyb2xsYmFyLyIsInNvdXJjZXMiOlsic2Nyb2xsYmFyL25nLXNjcm9sbGJhci15LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQWMsdUJBQXVCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RDtJQVNrQyx3Q0FBZ0I7SUFjaEQsc0JBQXdDLFNBQWMsRUFDTyxPQUFvQixFQUNoRCxTQUFpQixFQUM1QixLQUFhO1FBSG5DLFlBSUUsa0JBQU0sT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FDakM7UUFMdUMsZUFBUyxHQUFULFNBQVMsQ0FBSztRQUNPLGFBQU8sR0FBUCxPQUFPLENBQWE7UUFFM0QsV0FBSyxHQUFMLEtBQUssQ0FBUTs7SUFFbkMsQ0FBQztJQWRELHNCQUFJLG1DQUFTO1FBSGI7O1dBRUc7Ozs7O1FBQ0g7O2dCQUNRLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxZQUFZOztnQkFDckQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZOztnQkFDMUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ2hELElBQUksQ0FB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QUEsVUFBVSxDQUFDLElBQUksQ0FDbkQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUNuQixLQUFLLENBQUMsU0FBUyxDQUFDLEVBQ2hCLEdBQUc7Ozs7UUFBQyxVQUFDLGVBQXVCOztnQkFDcEIsT0FBTyxHQUFHLGVBQWUsR0FBRyxLQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUc7O2dCQUM5RSxLQUFLLEdBQUcsS0FBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxLQUFJLENBQUMsU0FBUztZQUM1RSxLQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDLEVBQUMsQ0FDSCxFQVJxQyxDQVFyQyxFQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7O2dCQXRGRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSxnT0FJVDtpQkFDRjs7OztnREFlYyxNQUFNLFNBQUMsUUFBUTtnQkExQnJCLFdBQVcsdUJBMkJMLE1BQU0sU0FBQyxVQUFVOzs7d0JBQUMsY0FBTSxPQUFBLFdBQVcsRUFBWCxDQUFXLEVBQUM7Z0JBQ0wsTUFBTSx1QkFBckMsTUFBTSxTQUFDLFdBQVc7Z0JBaENMLE1BQU07O0lBOEZsQyxtQkFBQztDQUFBLEFBdkZELENBU2tDLGdCQUFnQixHQThFakQ7U0E5RVksWUFBWTs7Ozs7O0lBY1gsaUNBQTBDOzs7OztJQUMxQywrQkFBcUU7Ozs7O0lBRXJFLDZCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBOZ1pvbmUsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBmb3J3YXJkUmVmLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWVyZ2VNYXAsIHBsdWNrLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5nU2Nyb2xsYmFyIH0gZnJvbSAnLi9uZy1zY3JvbGxiYXInO1xuaW1wb3J0IHsgTmdTY3JvbGxiYXJUaHVtYiB9IGZyb20gJy4vbmctc2Nyb2xsYmFyLXRodW1iJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctc2Nyb2xsYmFyLXknLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICNiYXIgY2xhc3M9XCJuZy1zY3JvbGxiYXIge3tiYXJDbGFzc319XCIgKG1vdXNlZG93bik9XCJvblNjcm9sbGJhckhvbGRlckNsaWNrKCRldmVudClcIj5cbiAgICAgIDxkaXYgI3RodW1iIGNsYXNzPVwibmctc2Nyb2xsYmFyLXRodW1iIHt7dGh1bWJDbGFzc319XCIgW25nU3R5bGVdPVwic2Nyb2xsYmFyU3R5bGUgfCBhc3luY1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIE5nU2Nyb2xsYmFyWSBleHRlbmRzIE5nU2Nyb2xsYmFyVGh1bWIge1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgc2Nyb2xsYmFyIHRodW1ibmFpbCBzaXplXG4gICAqL1xuICBnZXQgdGh1bWJTaXplKCk6IG51bWJlciB7XG4gICAgY29uc3QgYmFyQ2xpZW50SGVpZ2h0ID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3Qgdmlld0NsaWVudEhlaWdodCA9IHRoaXMuX3ZpZXcuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHZpZXdTY3JvbGxIZWlnaHQgPSB0aGlzLl92aWV3LnNjcm9sbEhlaWdodDtcbiAgICB0aGlzLl9uYXR1cmFsVGh1bWJTaXplID0gYmFyQ2xpZW50SGVpZ2h0IC8gdmlld1Njcm9sbEhlaWdodCAqIGJhckNsaWVudEhlaWdodDtcbiAgICB0aGlzLl9zY3JvbGxNYXggPSB2aWV3U2Nyb2xsSGVpZ2h0IC0gdmlld0NsaWVudEhlaWdodDtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxCb3VuZGFyaWVzKHRoaXMuX25hdHVyYWxUaHVtYlNpemUsIHRoaXMuX3Njcm9sbE1heCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcm90ZWN0ZWQgX2RvY3VtZW50OiBhbnksXG4gICAgICAgICAgICAgIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBOZ1Njcm9sbGJhcikpIHByb3RlY3RlZCBfcGFyZW50OiBOZ1Njcm9sbGJhcixcbiAgICAgICAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgX3BsYXRmb3JtOiBPYmplY3QsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBfem9uZTogTmdab25lKSB7XG4gICAgc3VwZXIoX3BhcmVudCwgX3BsYXRmb3JtLCBfem9uZSk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsYmFyIGNsaWNrXG4gICAqIEBwYXJhbSBlIE1vdXNlIGV2ZW50XG4gICAqL1xuICBvblNjcm9sbGJhckhvbGRlckNsaWNrKGU6IGFueSkge1xuICAgIGlmIChlLnRhcmdldCA9PT0gZS5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICBjb25zdCBvZmZzZXRZID0gZS5vZmZzZXRZIC0gdGhpcy5fbmF0dXJhbFRodW1iU2l6ZSAqIC41O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UgPSBvZmZzZXRZICogMTAwIC8gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRodW1iUG9zaXRpb25QZXJjZW50YWdlICogdGhpcy5fdmlldy5zY3JvbGxIZWlnaHQgLyAxMDA7XG4gICAgICB0aGlzLl9wYXJlbnQuc2Nyb2xsVG8oe3RvcDogdmFsdWUsIGR1cmF0aW9uOiB0aGlzLnNjcm9sbFRvRHVyYXRpb259IGFzIGFueSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzY3JvbGxiYXJcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVTY3JvbGxiYXIoKSB7XG4gICAgdGhpcy5fdGh1bWJTaXplID0gdGhpcy50aHVtYi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB0aGlzLl90cmFja01heCA9IHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gdGhpcy5fdGh1bWJTaXplO1xuICAgIHRoaXMuX2N1cnJQb3MgPSB0aGlzLl92aWV3LnNjcm9sbFRvcCAqIHRoaXMuX3RyYWNrTWF4IC8gdGhpcy5fc2Nyb2xsTWF4O1xuICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5fY3VyclBvc31weCwgMClgLFxuICAgICAgICAgIGhlaWdodDogYCR7dGhpcy50aHVtYlNpemV9cHhgXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHZlcnRpY2FsIHRodW1iIHdvcmtlclxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXJ0VGh1bWJFdmVudHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBtb3VzZURvd24kID0gZnJvbUV2ZW50KHRoaXMudGh1bWIubmF0aXZlRWxlbWVudCwgJ21vdXNlZG93bicpO1xuICAgIGNvbnN0IG1vdXNlTW92ZSQgPSBmcm9tRXZlbnQodGhpcy5fZG9jdW1lbnQsICdtb3VzZW1vdmUnKTtcbiAgICBjb25zdCBtb3VzZVVwJCA9IGZyb21FdmVudCh0aGlzLl9kb2N1bWVudCwgJ21vdXNldXAnKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuX2RvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBudWxsKVxuICAgICk7XG4gICAgcmV0dXJuIG1vdXNlRG93biQucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSAoKSA9PiBmYWxzZTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFja01heCBmb3IgYmVmb3JlIHN0YXJ0IGRyYWdnaW5nXG4gICAgICAgIHRoaXMuX3RyYWNrTWF4ID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgLSB0aGlzLl90aHVtYlNpemU7XG4gICAgICB9KSxcbiAgICAgIHBsdWNrKCdvZmZzZXRZJyksXG4gICAgICBtZXJnZU1hcCgobW91c2VEb3duT2Zmc2V0OiBudW1iZXIpID0+IG1vdXNlTW92ZSQucGlwZShcbiAgICAgICAgdGFrZVVudGlsKG1vdXNlVXAkKSxcbiAgICAgICAgcGx1Y2soJ2NsaWVudFknKSxcbiAgICAgICAgdGFwKChtb3VzZU1vdmVDbGllbnQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSBtb3VzZU1vdmVDbGllbnQgLSB0aGlzLmJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3Njcm9sbE1heCAqIChvZmZzZXRZIC0gbW91c2VEb3duT2Zmc2V0KSAvIHRoaXMuX3RyYWNrTWF4O1xuICAgICAgICAgIHRoaXMuX3BhcmVudC5zY3JvbGxhYmxlLnNjcm9sbFRvKHt0b3A6IHZhbHVlfSk7XG4gICAgICAgIH0pXG4gICAgICApKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==