@taiga-ui/addon-mobile
Version:
Extension package for Taiga UI that adds support for mobile specific behaviors such as custom data pickers, dropdowns, etc.
53 lines • 9.75 kB
JavaScript
import { afterNextRender, DestroyRef, inject, Injectable, INJECTOR, NgZone, } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { tuiScrollFrom, tuiZoneOptimized } from '@taiga-ui/cdk/observables';
import { tuiGetElementOffset, tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { SCROLL_REF_SELECTOR } from '@taiga-ui/core/components/scrollbar';
import { TUI_SCROLL_REF } from '@taiga-ui/core/tokens';
import { distinctUntilChanged, map, Observable, scan, Subscription } from 'rxjs';
import * as i0 from "@angular/core";
class TuiElasticStickyService extends Observable {
constructor() {
super((subscriber) => {
const subscription = new Subscription();
afterNextRender(() => {
const teardown = tuiScrollFrom(this.host)
.pipe(scan((top) => (this.pinned ? top : this.offsetTop), this.offsetTop), map((top) => Math.max(1 -
Math.max(Math.round(this.host.scrollTop) - top, 0) /
this.el.offsetHeight, 0)), distinctUntilChanged(), tuiZoneOptimized(this.zone), takeUntilDestroyed(this.destroyRef))
.subscribe(subscriber);
if (!subscription.closed) {
subscription.add(teardown);
}
else {
teardown.unsubscribe();
}
}, { injector: this.injector });
return subscription;
});
this.injector = inject(INJECTOR);
this.el = tuiInjectElement();
this.scrollRef = inject(TUI_SCROLL_REF).nativeElement;
this.destroyRef = inject(DestroyRef);
this.zone = inject(NgZone);
}
get host() {
// TODO: Test if we still need it now, that templates pass injector
return this.el.closest(SCROLL_REF_SELECTOR) || this.scrollRef;
}
get offsetTop() {
return tuiGetElementOffset(this.host, this.el).offsetTop;
}
get pinned() {
return (this.el.getBoundingClientRect().top -
this.host.getBoundingClientRect().top ===
0);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiElasticStickyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiElasticStickyService }); }
}
export { TuiElasticStickyService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiElasticStickyService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpYy1zdGlja3kuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FkZG9uLW1vYmlsZS9kaXJlY3RpdmVzL2VsYXN0aWMtc3RpY2t5L2VsYXN0aWMtc3RpY2t5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGVBQWUsRUFDZixVQUFVLEVBQ1YsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQzs7QUFFL0UsTUFDYSx1QkFBd0IsU0FBUSxVQUFrQjtJQU8zRDtRQUNJLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7WUFFeEMsZUFBZSxDQUNYLEdBQUcsRUFBRTtnQkFDRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDcEMsSUFBSSxDQUNELElBQUksQ0FDQSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FDakIsRUFDRCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNSLElBQUksQ0FBQyxHQUFHLENBQ0osQ0FBQztvQkFDRyxJQUFJLENBQUMsR0FBRyxDQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLEVBQ3JDLENBQUMsQ0FDSjt3QkFDRyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFDNUIsQ0FBQyxDQUNKLENBQ0osRUFDRCxvQkFBb0IsRUFBRSxFQUN0QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQzNCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdEM7cUJBQ0EsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUUzQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtvQkFDdEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDOUI7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUMxQjtZQUNMLENBQUMsRUFDRCxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFDLENBQzVCLENBQUM7WUFFRixPQUFPLFlBQVksQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQTdDVSxhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLE9BQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQ2pELGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQTBDdkMsQ0FBQztJQUVELElBQVksSUFBSTtRQUNaLG1FQUFtRTtRQUNuRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsSUFBWSxTQUFTO1FBQ2pCLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFZLE1BQU07UUFDZCxPQUFPLENBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUc7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUc7WUFDekMsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDOytHQWhFUSx1QkFBdUI7bUhBQXZCLHVCQUF1Qjs7U0FBdkIsdUJBQXVCOzRGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGFmdGVyTmV4dFJlbmRlcixcbiAgICBEZXN0cm95UmVmLFxuICAgIGluamVjdCxcbiAgICBJbmplY3RhYmxlLFxuICAgIElOSkVDVE9SLFxuICAgIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHt0dWlTY3JvbGxGcm9tLCB0dWlab25lT3B0aW1pemVkfSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7dHVpR2V0RWxlbWVudE9mZnNldCwgdHVpSW5qZWN0RWxlbWVudH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHtTQ1JPTExfUkVGX1NFTEVDVE9SfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3Njcm9sbGJhcic7XG5pbXBvcnQge1RVSV9TQ1JPTExfUkVGfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBPYnNlcnZhYmxlLCBzY2FuLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHVpRWxhc3RpY1N0aWNreVNlcnZpY2UgZXh0ZW5kcyBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSU5KRUNUT1IpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZWwgPSB0dWlJbmplY3RFbGVtZW50KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxSZWYgPSBpbmplY3QoVFVJX1NDUk9MTF9SRUYpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlYXJkb3duID0gdHVpU2Nyb2xsRnJvbSh0aGlzLmhvc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9wKSA9PiAodGhpcy5waW5uZWQgPyB0b3AgOiB0aGlzLm9mZnNldFRvcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0VG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCh0b3ApID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5ob3N0LnNjcm9sbFRvcCkgLSB0b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWwub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpWm9uZU9wdGltaXplZCh0aGlzLnpvbmUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQodGVhcmRvd24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVhcmRvd24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge2luamVjdG9yOiB0aGlzLmluamVjdG9yfSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGhvc3QoKTogRWxlbWVudCB7XG4gICAgICAgIC8vIFRPRE86IFRlc3QgaWYgd2Ugc3RpbGwgbmVlZCBpdCBub3csIHRoYXQgdGVtcGxhdGVzIHBhc3MgaW5qZWN0b3JcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuY2xvc2VzdChTQ1JPTExfUkVGX1NFTEVDVE9SKSB8fCB0aGlzLnNjcm9sbFJlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBvZmZzZXRUb3AoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHR1aUdldEVsZW1lbnRPZmZzZXQodGhpcy5ob3N0LCB0aGlzLmVsKS5vZmZzZXRUb3A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgcGlubmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLVxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPT09XG4gICAgICAgICAgICAwXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19