@taiga-ui/core
Version:
Core library for creating Angular components and applications using Taiga UI
46 lines • 10.1 kB
JavaScript
import { inject, Injectable } from '@angular/core';
import { tuiTypedFromEvent, tuiZonefree } from '@taiga-ui/cdk/observables';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { TUI_SCROLL_REF } from '@taiga-ui/core/tokens';
import { filter, map, merge, Observable, switchMap, takeUntil } from 'rxjs';
import * as i0 from "@angular/core";
class TuiScrollbarService extends Observable {
constructor() {
super((subscriber) => this.scroll$.subscribe(subscriber));
this.el = tuiInjectElement();
this.element = inject(TUI_SCROLL_REF).nativeElement;
this.scroll$ = merge(tuiTypedFromEvent(this.el.parentElement, 'mousedown').pipe(filter(({ target }) => target !== this.el), map((event) => this.getScrolled(event, 0.5, 0.5))), tuiTypedFromEvent(this.el, 'mousedown').pipe(tuiZonefree(), switchMap((event) => {
const { ownerDocument } = this.el;
const rect = this.el.getBoundingClientRect();
const vertical = getOffsetVertical(event, rect);
const horizontal = getOffsetHorizontal(event, rect);
return tuiTypedFromEvent(ownerDocument, 'mousemove').pipe(map((event) => this.getScrolled(event, vertical, horizontal)), takeUntil(tuiTypedFromEvent(ownerDocument, 'mouseup')));
})));
}
getScrolled({ clientY, clientX }, offsetY, offsetX) {
const { offsetHeight, offsetWidth } = this.el;
const { top, left, right, width, height } = this.el.parentElement.getBoundingClientRect();
const rtl = this.el.matches('[dir="rtl"] :scope');
const inline = rtl ? right : left;
const multiplier = rtl ? -1 : 1;
const maxTop = this.element.scrollHeight - height;
const maxLeft = this.element.scrollWidth - width;
const scrolledTop = (clientY - top - offsetHeight * offsetY) / (height - offsetHeight);
const scrolledLeft = (clientX - inline - offsetWidth * offsetX * multiplier) /
(width - offsetWidth);
return [maxTop * scrolledTop, maxLeft * scrolledLeft];
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiScrollbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiScrollbarService }); }
}
export { TuiScrollbarService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiScrollbarService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
function getOffsetVertical({ clientY }, { top, height }) {
return (clientY - top) / height;
}
function getOffsetHorizontal({ clientX }, { left, width }) {
return (clientX - left) / width;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYmFyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NvbXBvbmVudHMvc2Nyb2xsYmFyL3Njcm9sbGJhci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUUxRSxNQUNhLG1CQUFvQixTQUFRLFVBQTRCO0lBd0JqRTtRQUNJLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQXhCN0MsT0FBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDL0MsWUFBTyxHQUFHLEtBQUssQ0FDNUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUN2RCxNQUFNLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUN4QyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxF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QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dHVpVHlwZWRGcm9tRXZlbnQsIHR1aVpvbmVmcmVlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7dHVpSW5qZWN0RWxlbWVudH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHtUVUlfU0NST0xMX1JFRn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7ZmlsdGVyLCBtYXAsIG1lcmdlLCBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUdWlTY3JvbGxiYXJTZXJ2aWNlIGV4dGVuZHMgT2JzZXJ2YWJsZTxbbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnQgPSBpbmplY3QoVFVJX1NDUk9MTF9SRUYpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGwkID0gbWVyZ2UoXG4gICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZWwucGFyZW50RWxlbWVudCEsICdtb3VzZWRvd24nKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCh7dGFyZ2V0fSkgPT4gdGFyZ2V0ICE9PSB0aGlzLmVsKSxcbiAgICAgICAgICAgIG1hcCgoZXZlbnQpID0+IHRoaXMuZ2V0U2Nyb2xsZWQoZXZlbnQsIDAuNSwgMC41KSksXG4gICAgICAgICksXG4gICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZWwsICdtb3VzZWRvd24nKS5waXBlKFxuICAgICAgICAgICAgdHVpWm9uZWZyZWUoKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7b3duZXJEb2N1bWVudH0gPSB0aGlzLmVsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsID0gZ2V0T2Zmc2V0VmVydGljYWwoZXZlbnQsIHJlY3QpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWwgPSBnZXRPZmZzZXRIb3Jpem9udGFsKGV2ZW50LCByZWN0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0dWlUeXBlZEZyb21FdmVudChvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChldmVudCkgPT4gdGhpcy5nZXRTY3JvbGxlZChldmVudCwgdmVydGljYWwsIGhvcml6b250YWwpKSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHR1aVR5cGVkRnJvbUV2ZW50KG93bmVyRG9jdW1lbnQsICdtb3VzZXVwJykpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKChzdWJzY3JpYmVyKSA9PiB0aGlzLnNjcm9sbCQuc3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNjcm9sbGVkKFxuICAgICAgICB7Y2xpZW50WSwgY2xpZW50WH06IE1vdXNlRXZlbnQsXG4gICAgICAgIG9mZnNldFk6IG51bWJlcixcbiAgICAgICAgb2Zmc2V0WDogbnVtYmVyLFxuICAgICk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICBjb25zdCB7b2Zmc2V0SGVpZ2h0LCBvZmZzZXRXaWR0aH0gPSB0aGlzLmVsO1xuICAgICAgICBjb25zdCB7dG9wLCBsZWZ0LCByaWdodCwgd2lkdGgsIGhlaWdodH0gPVxuICAgICAgICAgICAgdGhpcy5lbC5wYXJlbnRFbGVtZW50IS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgcnRsID0gdGhpcy5lbC5tYXRjaGVzKCdbZGlyPVwicnRsXCJdIDpzY29wZScpO1xuICAgICAgICBjb25zdCBpbmxpbmUgPSBydGwgPyByaWdodCA6IGxlZnQ7XG4gICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBydGwgPyAtMSA6IDE7XG4gICAgICAgIGNvbnN0IG1heFRvcCA9IHRoaXMuZWxlbWVudC5zY3JvbGxIZWlnaHQgLSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IG1heExlZnQgPSB0aGlzLmVsZW1lbnQuc2Nyb2xsV2lkdGggLSB3aWR0aDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsZWRUb3AgPVxuICAgICAgICAgICAgKGNsaWVudFkgLSB0b3AgLSBvZmZzZXRIZWlnaHQgKiBvZmZzZXRZKSAvIChoZWlnaHQgLSBvZmZzZXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBzY3JvbGxlZExlZnQgPVxuICAgICAgICAgICAgKGNsaWVudFggLSBpbmxpbmUgLSBvZmZzZXRXaWR0aCAqIG9mZnNldFggKiBtdWx0aXBsaWVyKSAvXG4gICAgICAgICAgICAod2lkdGggLSBvZmZzZXRXaWR0aCk7XG5cbiAgICAgICAgcmV0dXJuIFttYXhUb3AgKiBzY3JvbGxlZFRvcCwgbWF4TGVmdCAqIHNjcm9sbGVkTGVmdF07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXRWZXJ0aWNhbCh7Y2xpZW50WX06IE1vdXNlRXZlbnQsIHt0b3AsIGhlaWdodH06IERPTVJlY3QpOiBudW1iZXIge1xuICAgIHJldHVybiAoY2xpZW50WSAtIHRvcCkgLyBoZWlnaHQ7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldEhvcml6b250YWwoe2NsaWVudFh9OiBNb3VzZUV2ZW50LCB7bGVmdCwgd2lkdGh9OiBET01SZWN0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGNsaWVudFggLSBsZWZ0KSAvIHdpZHRoO1xufVxuIl19