UNPKG

@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
/// <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