@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
55 lines • 9.97 kB
JavaScript
/// <reference types="@taiga-ui/tsconfig/ng-dev-mode" />
/// <reference types="@taiga-ui/tsconfig/ng-dev-mode" />
import { inject, Injectable, NgZone } from '@angular/core';
import { WA_ANIMATION_FRAME, WA_PERFORMANCE } from '@ng-web-apis/common';
import { tuiZonefreeScheduler } from '@taiga-ui/cdk/observables';
import { tuiClamp } from '@taiga-ui/cdk/utils/math';
import { tuiEaseInOutQuad } from '@taiga-ui/cdk/utils/miscellaneous';
import { defer, endWith, map, of, switchMap, takeUntil, tap, timer } from 'rxjs';
import * as i0 from "@angular/core";
const SCROLL_TIME = 300;
function getX(elementOrWindow) {
return 'scrollX' in elementOrWindow
? elementOrWindow.scrollX
: elementOrWindow.scrollLeft;
}
function getY(elementOrWindow) {
return 'scrollY' in elementOrWindow
? elementOrWindow.scrollY
: elementOrWindow.scrollTop;
}
class TuiScrollService {
constructor() {
this.performanceRef = inject(WA_PERFORMANCE);
this.animationFrame$ = inject(WA_ANIMATION_FRAME);
this.zone = inject(NgZone);
}
scroll$(elementOrWindow, scrollTop, scrollLeft = getX(elementOrWindow), duration = SCROLL_TIME) {
ngDevMode && console.assert(duration >= 0, 'duration cannot be negative');
ngDevMode && console.assert(scrollTop >= 0, 'scrollTop cannot be negative');
ngDevMode && console.assert(scrollLeft >= 0, 'scrollLeft cannot be negative');
const initialTop = getY(elementOrWindow);
const initialLeft = getX(elementOrWindow);
const deltaTop = scrollTop - initialTop;
const deltaLeft = scrollLeft - initialLeft;
const observable = !duration
? of([scrollTop, scrollLeft])
: defer(() => of(this.performanceRef.now())).pipe(switchMap((start) => this.animationFrame$.pipe(map((now) => now - start))), map((elapsed) => tuiEaseInOutQuad(tuiClamp(elapsed / duration, 0, 1))), map((percent) => [
initialTop + deltaTop * percent,
initialLeft + deltaLeft * percent,
]), takeUntil(timer(duration, tuiZonefreeScheduler(this.zone))), endWith([scrollTop, scrollLeft]));
return observable.pipe(tap(([scrollTop, scrollLeft]) => {
elementOrWindow.scrollTo?.(scrollLeft, scrollTop);
}));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiScrollService, providedIn: 'root' }); }
}
export { TuiScrollService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiScrollService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc2VydmljZXMvc2Nyb2xsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQXdEO0FBQXhELHdEQUF3RDtBQUN4RCxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUVuRSxPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQzs7QUFFL0UsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBRXhCLFNBQVMsSUFBSSxDQUFDLGVBQWlDO0lBQzNDLE9BQU8sU0FBUyxJQUFJLGVBQWU7UUFDL0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQ3pCLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO0FBQ3JDLENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxlQUFpQztJQUMzQyxPQUFPLFNBQVMsSUFBSSxlQUFlO1FBQy9CLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTztRQUN6QixDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFHYSxnQkFBZ0I7SUFIN0I7UUFJcUIsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxTQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBcUMxQztJQW5DVSxPQUFPLENBQ1YsZUFBaUMsRUFDakMsU0FBaUIsRUFDakIsYUFBcUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUMxQyxXQUFtQixXQUFXO1FBRTlCLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUMxRSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDNUUsU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztRQUN4QyxNQUFNLFNBQVMsR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzNDLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBUTtZQUN4QixDQUFDLENBQUMsRUFBRSxDQUFtQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzNDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQ3ZELEVBQ0QsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUN0RSxHQUFHLENBQTJCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsVUFBVSxHQUFHLFFBQVEsR0FBRyxPQUFPO2dCQUMvQixXQUFXLEdBQUcsU0FBUyxHQUFHLE9BQU87YUFDcEMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQzNELE9BQU8sQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FDckQsQ0FBQztRQUVSLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRTtZQUM1QixlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDOytHQXZDUSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZiLE1BQU07O1NBRVQsZ0JBQWdCOzRGQUFoQixnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJAdGFpZ2EtdWkvdHNjb25maWcvbmctZGV2LW1vZGVcIiAvPlxuaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGUsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1dBX0FOSU1BVElPTl9GUkFNRSwgV0FfUEVSRk9STUFOQ0V9IGZyb20gJ0BuZy13ZWItYXBpcy9jb21tb24nO1xuaW1wb3J0IHt0dWlab25lZnJlZVNjaGVkdWxlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge3R1aUNsYW1wfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21hdGgnO1xuaW1wb3J0IHt0dWlFYXNlSW5PdXRRdWFkfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHR5cGUge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWZlciwgZW5kV2l0aCwgbWFwLCBvZiwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCwgdGltZXJ9IGZyb20gJ3J4anMnO1xuXG5jb25zdCBTQ1JPTExfVElNRSA9IDMwMDtcblxuZnVuY3Rpb24gZ2V0WChlbGVtZW50T3JXaW5kb3c6IEVsZW1lbnQgfCBXaW5kb3cpOiBudW1iZXIge1xuICAgIHJldHVybiAnc2Nyb2xsWCcgaW4gZWxlbWVudE9yV2luZG93XG4gICAgICAgID8gZWxlbWVudE9yV2luZG93LnNjcm9sbFhcbiAgICAgICAgOiBlbGVtZW50T3JXaW5kb3cuc2Nyb2xsTGVmdDtcbn1cblxuZnVuY3Rpb24gZ2V0WShlbGVtZW50T3JXaW5kb3c6IEVsZW1lbnQgfCBXaW5kb3cpOiBudW1iZXIge1xuICAgIHJldHVybiAnc2Nyb2xsWScgaW4gZWxlbWVudE9yV2luZG93XG4gICAgICAgID8gZWxlbWVudE9yV2luZG93LnNjcm9sbFlcbiAgICAgICAgOiBlbGVtZW50T3JXaW5kb3cuc2Nyb2xsVG9wO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlTY3JvbGxTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcmZvcm1hbmNlUmVmID0gaW5qZWN0KFdBX1BFUkZPUk1BTkNFKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGlvbkZyYW1lJCA9IGluamVjdChXQV9BTklNQVRJT05fRlJBTUUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gICAgcHVibGljIHNjcm9sbCQoXG4gICAgICAgIGVsZW1lbnRPcldpbmRvdzogRWxlbWVudCB8IFdpbmRvdyxcbiAgICAgICAgc2Nyb2xsVG9wOiBudW1iZXIsXG4gICAgICAgIHNjcm9sbExlZnQ6IG51bWJlciA9IGdldFgoZWxlbWVudE9yV2luZG93KSxcbiAgICAgICAgZHVyYXRpb246IG51bWJlciA9IFNDUk9MTF9USU1FLFxuICAgICk6IE9ic2VydmFibGU8W251bWJlciwgbnVtYmVyXT4ge1xuICAgICAgICBuZ0Rldk1vZGUgJiYgY29uc29sZS5hc3NlcnQoZHVyYXRpb24gPj0gMCwgJ2R1cmF0aW9uIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgICAgICBuZ0Rldk1vZGUgJiYgY29uc29sZS5hc3NlcnQoc2Nyb2xsVG9wID49IDAsICdzY3JvbGxUb3AgY2Fubm90IGJlIG5lZ2F0aXZlJyk7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBjb25zb2xlLmFzc2VydChzY3JvbGxMZWZ0ID49IDAsICdzY3JvbGxMZWZ0IGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuXG4gICAgICAgIGNvbnN0IGluaXRpYWxUb3AgPSBnZXRZKGVsZW1lbnRPcldpbmRvdyk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxMZWZ0ID0gZ2V0WChlbGVtZW50T3JXaW5kb3cpO1xuICAgICAgICBjb25zdCBkZWx0YVRvcCA9IHNjcm9sbFRvcCAtIGluaXRpYWxUb3A7XG4gICAgICAgIGNvbnN0IGRlbHRhTGVmdCA9IHNjcm9sbExlZnQgLSBpbml0aWFsTGVmdDtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9ICFkdXJhdGlvblxuICAgICAgICAgICAgPyBvZjxbbnVtYmVyLCBudW1iZXJdPihbc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0XSlcbiAgICAgICAgICAgIDogZGVmZXIoKCkgPT4gb2YodGhpcy5wZXJmb3JtYW5jZVJlZi5ub3coKSkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHN0YXJ0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uRnJhbWUkLnBpcGUobWFwKChub3cpID0+IG5vdyAtIHN0YXJ0KSksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgbWFwKChlbGFwc2VkKSA9PiB0dWlFYXNlSW5PdXRRdWFkKHR1aUNsYW1wKGVsYXBzZWQgLyBkdXJhdGlvbiwgMCwgMSkpKSxcbiAgICAgICAgICAgICAgICAgIG1hcDxudW1iZXIsIFtudW1iZXIsIG51bWJlcl0+KChwZXJjZW50KSA9PiBbXG4gICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFRvcCArIGRlbHRhVG9wICogcGVyY2VudCxcbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTGVmdCArIGRlbHRhTGVmdCAqIHBlcmNlbnQsXG4gICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aW1lcihkdXJhdGlvbiwgdHVpWm9uZWZyZWVTY2hlZHVsZXIodGhpcy56b25lKSkpLFxuICAgICAgICAgICAgICAgICAgZW5kV2l0aDxbbnVtYmVyLCBudW1iZXJdPihbc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0XSksXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShcbiAgICAgICAgICAgIHRhcCgoW3Njcm9sbFRvcCwgc2Nyb2xsTGVmdF0pID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50T3JXaW5kb3cuc2Nyb2xsVG8/LihzY3JvbGxMZWZ0LCBzY3JvbGxUb3ApO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19