UNPKG

@taiga-ui/cdk

Version:

Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance

55 lines 10 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc2VydmljZXMvc2Nyb2xsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQXdEO0FBQXhELHdEQUF3RDtBQUN4RCxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQ0gsS0FBSyxFQUNMLE9BQU8sRUFDUCxHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssR0FDUixNQUFNLE1BQU0sQ0FBQzs7QUFFZCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFFeEIsU0FBUyxJQUFJLENBQUMsZUFBaUM7SUFDM0MsT0FBTyxTQUFTLElBQUksZUFBZTtRQUMvQixDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU87UUFDekIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLGVBQWlDO0lBQzNDLE9BQU8sU0FBUyxJQUFJLGVBQWU7UUFDL0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQ3pCLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUdhLGdCQUFnQjtJQUg3QjtRQUlxQixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdDLFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FxQzFDO0lBbkNVLE9BQU8sQ0FDVixlQUFpQyxFQUNqQyxTQUFpQixFQUNqQixhQUFxQixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQzFDLFdBQW1CLFdBQVc7UUFFOUIsU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQzFFLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUUsOEJBQThCLENBQUMsQ0FBQztRQUM1RSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFFOUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFRO1lBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQW1CLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDM0MsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FDdkQsRUFDRCxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3RFLEdBQUcsQ0FBMkIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUN2QyxVQUFVLEdBQUcsUUFBUSxHQUFHLE9BQU87Z0JBQy9CLFdBQVcsR0FBRyxTQUFTLEdBQUcsT0FBTzthQUNwQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDM0QsT0FBTyxDQUFtQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUNyRCxDQUFDO1FBRVIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFO1lBQzVCLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7K0dBdkNRLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBRmIsTUFBTTs7U0FFVCxnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkB0YWlnYS11aS90c2NvbmZpZy9uZy1kZXYtbW9kZVwiIC8+XG5pbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZSwgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V0FfQU5JTUFUSU9OX0ZSQU1FLCBXQV9QRVJGT1JNQU5DRX0gZnJvbSAnQG5nLXdlYi1hcGlzL2NvbW1vbic7XG5pbXBvcnQge3R1aVpvbmVmcmVlU2NoZWR1bGVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7dHVpQ2xhbXB9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWF0aCc7XG5pbXBvcnQge3R1aUVhc2VJbk91dFF1YWR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1xuICAgIGRlZmVyLFxuICAgIGVuZFdpdGgsXG4gICAgbWFwLFxuICAgIHR5cGUgT2JzZXJ2YWJsZSxcbiAgICBvZixcbiAgICBzd2l0Y2hNYXAsXG4gICAgdGFrZVVudGlsLFxuICAgIHRhcCxcbiAgICB0aW1lcixcbn0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IFNDUk9MTF9USU1FID0gMzAwO1xuXG5mdW5jdGlvbiBnZXRYKGVsZW1lbnRPcldpbmRvdzogRWxlbWVudCB8IFdpbmRvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuICdzY3JvbGxYJyBpbiBlbGVtZW50T3JXaW5kb3dcbiAgICAgICAgPyBlbGVtZW50T3JXaW5kb3cuc2Nyb2xsWFxuICAgICAgICA6IGVsZW1lbnRPcldpbmRvdy5zY3JvbGxMZWZ0O1xufVxuXG5mdW5jdGlvbiBnZXRZKGVsZW1lbnRPcldpbmRvdzogRWxlbWVudCB8IFdpbmRvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuICdzY3JvbGxZJyBpbiBlbGVtZW50T3JXaW5kb3dcbiAgICAgICAgPyBlbGVtZW50T3JXaW5kb3cuc2Nyb2xsWVxuICAgICAgICA6IGVsZW1lbnRPcldpbmRvdy5zY3JvbGxUb3A7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFR1aVNjcm9sbFNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGVyZm9ybWFuY2VSZWYgPSBpbmplY3QoV0FfUEVSRk9STUFOQ0UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5pbWF0aW9uRnJhbWUkID0gaW5qZWN0KFdBX0FOSU1BVElPTl9GUkFNRSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgICBwdWJsaWMgc2Nyb2xsJChcbiAgICAgICAgZWxlbWVudE9yV2luZG93OiBFbGVtZW50IHwgV2luZG93LFxuICAgICAgICBzY3JvbGxUb3A6IG51bWJlcixcbiAgICAgICAgc2Nyb2xsTGVmdDogbnVtYmVyID0gZ2V0WChlbGVtZW50T3JXaW5kb3cpLFxuICAgICAgICBkdXJhdGlvbjogbnVtYmVyID0gU0NST0xMX1RJTUUsXG4gICAgKTogT2JzZXJ2YWJsZTxbbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBjb25zb2xlLmFzc2VydChkdXJhdGlvbiA+PSAwLCAnZHVyYXRpb24gY2Fubm90IGJlIG5lZ2F0aXZlJyk7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBjb25zb2xlLmFzc2VydChzY3JvbGxUb3AgPj0gMCwgJ3Njcm9sbFRvcCBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcbiAgICAgICAgbmdEZXZNb2RlICYmIGNvbnNvbGUuYXNzZXJ0KHNjcm9sbExlZnQgPj0gMCwgJ3Njcm9sbExlZnQgY2Fubm90IGJlIG5lZ2F0aXZlJyk7XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbFRvcCA9IGdldFkoZWxlbWVudE9yV2luZG93KTtcbiAgICAgICAgY29uc3QgaW5pdGlhbExlZnQgPSBnZXRYKGVsZW1lbnRPcldpbmRvdyk7XG4gICAgICAgIGNvbnN0IGRlbHRhVG9wID0gc2Nyb2xsVG9wIC0gaW5pdGlhbFRvcDtcbiAgICAgICAgY29uc3QgZGVsdGFMZWZ0ID0gc2Nyb2xsTGVmdCAtIGluaXRpYWxMZWZ0O1xuICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gIWR1cmF0aW9uXG4gICAgICAgICAgICA/IG9mPFtudW1iZXIsIG51bWJlcl0+KFtzY3JvbGxUb3AsIHNjcm9sbExlZnRdKVxuICAgICAgICAgICAgOiBkZWZlcigoKSA9PiBvZih0aGlzLnBlcmZvcm1hbmNlUmVmLm5vdygpKSkucGlwZShcbiAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc3RhcnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb25GcmFtZSQucGlwZShtYXAoKG5vdykgPT4gbm93IC0gc3RhcnQpKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBtYXAoKGVsYXBzZWQpID0+IHR1aUVhc2VJbk91dFF1YWQodHVpQ2xhbXAoZWxhcHNlZCAvIGR1cmF0aW9uLCAwLCAxKSkpLFxuICAgICAgICAgICAgICAgICAgbWFwPG51bWJlciwgW251bWJlciwgbnVtYmVyXT4oKHBlcmNlbnQpID0+IFtcbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVG9wICsgZGVsdGFUb3AgKiBwZXJjZW50LFxuICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxMZWZ0ICsgZGVsdGFMZWZ0ICogcGVyY2VudCxcbiAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRpbWVyKGR1cmF0aW9uLCB0dWlab25lZnJlZVNjaGVkdWxlcih0aGlzLnpvbmUpKSksXG4gICAgICAgICAgICAgICAgICBlbmRXaXRoPFtudW1iZXIsIG51bWJlcl0+KFtzY3JvbGxUb3AsIHNjcm9sbExlZnRdKSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZS5waXBlKFxuICAgICAgICAgICAgdGFwKChbc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0XSkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRPcldpbmRvdy5zY3JvbGxUbz8uKHNjcm9sbExlZnQsIHNjcm9sbFRvcCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=