ngx-scrollbar-v8
Version:
Custom overlay-scrollbars with native scrolling mechanism.
157 lines • 14.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
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';
export class NgScrollbarY extends NgScrollbarThumb {
/**
* @param {?} _document
* @param {?} _parent
* @param {?} _platform
* @param {?} _zone
*/
constructor(_document, _parent, _platform, _zone) {
super(_parent, _platform, _zone);
this._document = _document;
this._parent = _parent;
this._zone = _zone;
}
/**
* Calculate scrollbar thumbnail size
* @return {?}
*/
get thumbSize() {
/** @type {?} */
const barClientHeight = this.bar.nativeElement.clientHeight;
/** @type {?} */
const viewClientHeight = this._view.clientHeight;
/** @type {?} */
const viewScrollHeight = this._view.scrollHeight;
this._naturalThumbSize = barClientHeight / viewScrollHeight * barClientHeight;
this._scrollMax = viewScrollHeight - viewClientHeight;
return this.scrollBoundaries(this._naturalThumbSize, this._scrollMax);
}
/**
* Scrollbar click
* @param {?} e Mouse event
* @return {?}
*/
onScrollbarHolderClick(e) {
if (e.target === e.currentTarget) {
/** @type {?} */
const offsetY = e.offsetY - this._naturalThumbSize * .5;
/** @type {?} */
const thumbPositionPercentage = offsetY * 100 / this.bar.nativeElement.clientHeight;
/** @type {?} */
const value = thumbPositionPercentage * this._view.scrollHeight / 100;
this._parent.scrollTo((/** @type {?} */ ({ top: value, duration: this.scrollToDuration }))).subscribe();
}
}
/**
* Update scrollbar
* @protected
* @return {?}
*/
updateScrollbar() {
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 {?}
*/
() => {
animationFrameScheduler.schedule((/**
* @return {?}
*/
() => this.updateState({
transform: `translate3d(0, ${this._currPos}px, 0)`,
height: `${this.thumbSize}px`
})));
}));
}
/**
* Start vertical thumb worker
* @protected
* @return {?}
*/
startThumbEvents() {
/** @type {?} */
const mouseDown$ = fromEvent(this.thumb.nativeElement, 'mousedown');
/** @type {?} */
const mouseMove$ = fromEvent(this._document, 'mousemove');
/** @type {?} */
const mouseUp$ = fromEvent(this._document, 'mouseup').pipe(tap((/**
* @return {?}
*/
() => this._document.onselectstart = null)));
return mouseDown$.pipe(tap((/**
* @return {?}
*/
() => {
this._document.onselectstart = (/**
* @return {?}
*/
() => false);
// Initialize trackMax for before start dragging
this._trackMax = this.bar.nativeElement.clientHeight - this._thumbSize;
})), pluck('offsetY'), mergeMap((/**
* @param {?} mouseDownOffset
* @return {?}
*/
(mouseDownOffset) => mouseMove$.pipe(takeUntil(mouseUp$), pluck('clientY'), tap((/**
* @param {?} mouseMoveClient
* @return {?}
*/
(mouseMoveClient) => {
/** @type {?} */
const offsetY = mouseMoveClient - this.bar.nativeElement.getBoundingClientRect().top;
/** @type {?} */
const 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: `
<div #bar class="ng-scrollbar {{barClass}}" (mousedown)="onScrollbarHolderClick($event)">
<div #thumb class="ng-scrollbar-thumb {{thumbClass}}" [ngStyle]="scrollbarStyle | async"></div>
</div>
`
}] }
];
/** @nocollapse */
NgScrollbarY.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: NgScrollbar, decorators: [{ type: Inject, args: [forwardRef((/**
* @return {?}
*/
() => NgScrollbar)),] }] },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: NgZone }
];
if (false) {
/**
* @type {?}
* @protected
*/
NgScrollbarY.prototype._document;
/**
* @type {?}
* @protected
*/
NgScrollbarY.prototype._parent;
/**
* @type {?}
* @protected
*/
NgScrollbarY.prototype._zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsYmFyLXkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2Nyb2xsYmFyLyIsInNvdXJjZXMiOlsic2Nyb2xsYmFyL25nLXNjcm9sbGJhci15LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBYyx1QkFBdUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBV3hELE1BQU0sT0FBTyxZQUFhLFNBQVEsZ0JBQWdCOzs7Ozs7O0lBY2hELFlBQXdDLFNBQWMsRUFDTyxPQUFvQixFQUNoRCxTQUFpQixFQUM1QixLQUFhO1FBQ2pDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSkssY0FBUyxHQUFULFNBQVMsQ0FBSztRQUNPLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFFM0QsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUVuQyxDQUFDOzs7OztJQWRELElBQUksU0FBUzs7Y0FDTCxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsWUFBWTs7Y0FDckQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZOztjQUMxQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7UUFDaEQsSUFBSSxDQUFDLGlCQUFp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QUFDLGVBQXVCLEVBQUUsRUFBRTs7a0JBQ3hCLE9BQU8sR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHOztrQkFDOUUsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVM7WUFDNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUMsR0FBRyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7UUFDakQsQ0FBQyxFQUFDLENBQ0gsRUFBQyxDQUNILENBQUM7SUFDSixDQUFDOzs7WUF0RkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxRQUFRLEVBQUU7Ozs7R0FJVDthQUNGOzs7OzRDQWVjLE1BQU0sU0FBQyxRQUFRO1lBMUJyQixXQUFXLHVCQTJCTCxNQUFNLFNBQUMsVUFBVTs7O29CQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBQztZQUNMLE1BQU0sdUJBQXJDLE1BQU0sU0FBQyxXQUFXO1lBaENMLE1BQU07Ozs7Ozs7SUE4QnBCLGlDQUEwQzs7Ozs7SUFDMUMsK0JBQXFFOzs7OztJQUVyRSw2QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgTmdab25lLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgZm9yd2FyZFJlZiwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1lcmdlTWFwLCBwbHVjaywgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOZ1Njcm9sbGJhciB9IGZyb20gJy4vbmctc2Nyb2xsYmFyJztcbmltcG9ydCB7IE5nU2Nyb2xsYmFyVGh1bWIgfSBmcm9tICcuL25nLXNjcm9sbGJhci10aHVtYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLXNjcm9sbGJhci15JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAjYmFyIGNsYXNzPVwibmctc2Nyb2xsYmFyIHt7YmFyQ2xhc3N9fVwiIChtb3VzZWRvd24pPVwib25TY3JvbGxiYXJIb2xkZXJDbGljaygkZXZlbnQpXCI+XG4gICAgICA8ZGl2ICN0aHVtYiBjbGFzcz1cIm5nLXNjcm9sbGJhci10aHVtYiB7e3RodW1iQ2xhc3N9fVwiIFtuZ1N0eWxlXT1cInNjcm9sbGJhclN0eWxlIHwgYXN5bmNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbGJhclkgZXh0ZW5kcyBOZ1Njcm9sbGJhclRodW1iIHtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHNjcm9sbGJhciB0aHVtYm5haWwgc2l6ZVxuICAgKi9cbiAgZ2V0IHRodW1iU2l6ZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGJhckNsaWVudEhlaWdodCA9IHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHZpZXdDbGllbnRIZWlnaHQgPSB0aGlzLl92aWV3LmNsaWVudEhlaWdodDtcbiAgICBjb25zdCB2aWV3U2Nyb2xsSGVpZ2h0ID0gdGhpcy5fdmlldy5zY3JvbGxIZWlnaHQ7XG4gICAgdGhpcy5fbmF0dXJhbFRodW1iU2l6ZSA9IGJhckNsaWVudEhlaWdodCAvIHZpZXdTY3JvbGxIZWlnaHQgKiBiYXJDbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5fc2Nyb2xsTWF4ID0gdmlld1Njcm9sbEhlaWdodCAtIHZpZXdDbGllbnRIZWlnaHQ7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsQm91bmRhcmllcyh0aGlzLl9uYXR1cmFsVGh1bWJTaXplLCB0aGlzLl9zY3JvbGxNYXgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJvdGVjdGVkIF9kb2N1bWVudDogYW55LFxuICAgICAgICAgICAgICBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gTmdTY3JvbGxiYXIpKSBwcm90ZWN0ZWQgX3BhcmVudDogTmdTY3JvbGxiYXIsXG4gICAgICAgICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIF9wbGF0Zm9ybTogT2JqZWN0LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3pvbmU6IE5nWm9uZSkge1xuICAgIHN1cGVyKF9wYXJlbnQsIF9wbGF0Zm9ybSwgX3pvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbGJhciBjbGlja1xuICAgKiBAcGFyYW0gZSBNb3VzZSBldmVudFxuICAgKi9cbiAgb25TY3JvbGxiYXJIb2xkZXJDbGljayhlOiBhbnkpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgY29uc3Qgb2Zmc2V0WSA9IGUub2Zmc2V0WSAtIHRoaXMuX25hdHVyYWxUaHVtYlNpemUgKiAuNTtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb25QZXJjZW50YWdlID0gb2Zmc2V0WSAqIDEwMCAvIHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgdmFsdWUgPSB0aHVtYlBvc2l0aW9uUGVyY2VudGFnZSAqIHRoaXMuX3ZpZXcuc2Nyb2xsSGVpZ2h0IC8gMTAwO1xuICAgICAgdGhpcy5fcGFyZW50LnNjcm9sbFRvKHt0b3A6IHZhbHVlLCBkdXJhdGlvbjogdGhpcy5zY3JvbGxUb0R1cmF0aW9ufSBhcyBhbnkpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgc2Nyb2xsYmFyXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlU2Nyb2xsYmFyKCkge1xuICAgIHRoaXMuX3RodW1iU2l6ZSA9IHRoaXMudGh1bWIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5fdHJhY2tNYXggPSB0aGlzLmJhci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCAtIHRoaXMuX3RodW1iU2l6ZTtcbiAgICB0aGlzLl9jdXJyUG9zID0gdGhpcy5fdmlldy5zY3JvbGxUb3AgKiB0aGlzLl90cmFja01heCAvIHRoaXMuX3Njcm9sbE1heDtcbiAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICBhbmltYXRpb25GcmFtZVNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PlxuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMuX2N1cnJQb3N9cHgsIDApYCxcbiAgICAgICAgICBoZWlnaHQ6IGAke3RoaXMudGh1bWJTaXplfXB4YFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB2ZXJ0aWNhbCB0aHVtYiB3b3JrZXJcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydFRodW1iRXZlbnRzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgbW91c2VEb3duJCA9IGZyb21FdmVudCh0aGlzLnRodW1iLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nKTtcbiAgICBjb25zdCBtb3VzZU1vdmUkID0gZnJvbUV2ZW50KHRoaXMuX2RvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XG4gICAgY29uc3QgbW91c2VVcCQgPSBmcm9tRXZlbnQodGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gbnVsbClcbiAgICApO1xuICAgIHJldHVybiBtb3VzZURvd24kLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2U7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdHJhY2tNYXggZm9yIGJlZm9yZSBzdGFydCBkcmFnZ2luZ1xuICAgICAgICB0aGlzLl90cmFja01heCA9IHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gdGhpcy5fdGh1bWJTaXplO1xuICAgICAgfSksXG4gICAgICBwbHVjaygnb2Zmc2V0WScpLFxuICAgICAgbWVyZ2VNYXAoKG1vdXNlRG93bk9mZnNldDogbnVtYmVyKSA9PiBtb3VzZU1vdmUkLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbChtb3VzZVVwJCksXG4gICAgICAgIHBsdWNrKCdjbGllbnRZJyksXG4gICAgICAgIHRhcCgobW91c2VNb3ZlQ2xpZW50OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBvZmZzZXRZID0gbW91c2VNb3ZlQ2xpZW50IC0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zY3JvbGxNYXggKiAob2Zmc2V0WSAtIG1vdXNlRG93bk9mZnNldCkgLyB0aGlzLl90cmFja01heDtcbiAgICAgICAgICB0aGlzLl9wYXJlbnQuc2Nyb2xsYWJsZS5zY3JvbGxUbyh7dG9wOiB2YWx1ZX0pO1xuICAgICAgICB9KVxuICAgICAgKSlcbiAgICApO1xuICB9XG59XG4iXX0=