@taiga-ui/addon-mobile
Version:
Extension package for Taiga UI that adds support for mobile specific behaviors such as custom data pickers, dropdowns, etc.
98 lines • 15.3 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { ChangeDetectionStrategy, Component, DestroyRef, Directive, inject, Input, ViewEncapsulation, } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { tuiTypedFromEvent } from '@taiga-ui/cdk/observables';
import { tuiIsHTMLElement } from '@taiga-ui/cdk/utils/dom';
import { tuiPx, tuiWithStyles } from '@taiga-ui/cdk/utils/miscellaneous';
import { TUI_ANIMATIONS_SPEED } from '@taiga-ui/core/tokens';
import { tuiGetDuration } from '@taiga-ui/core/utils/miscellaneous';
import { first, merge, race, switchMap, tap } from 'rxjs';
import * as i0 from "@angular/core";
const TO_KEYFRAMES = [
{
transform: 'scale(0)',
opacity: '0.12',
},
{
opacity: '0.12',
},
];
const FROM_KEYFRAMES = [
{
opacity: '0.12',
},
{
opacity: '0',
},
];
class TuiRippleStyles {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRippleStyles, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiRippleStyles, isStandalone: true, selector: "ng-component", host: { classAttribute: "tui-ripple-styles" }, ngImport: i0, template: '', isInline: true, styles: [".tui-ripple{position:absolute;z-index:100;opacity:.12;border-radius:100%;background:var(--tui-ripple-background, currentColor);animation-fill-mode:forwards;pointer-events:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRippleStyles, decorators: [{
type: Component,
args: [{ standalone: true, template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
class: 'tui-ripple-styles',
}, styles: [".tui-ripple{position:absolute;z-index:100;opacity:.12;border-radius:100%;background:var(--tui-ripple-background, currentColor);animation-fill-mode:forwards;pointer-events:none}\n"] }]
}] });
class TuiRipple {
constructor() {
this.doc = inject(DOCUMENT);
this.destroyRef = inject(DestroyRef);
this.animationOptions = {
duration: tuiGetDuration(inject(TUI_ANIMATIONS_SPEED)),
};
this.nothing = tuiWithStyles(TuiRippleStyles);
this.tuiRipple = '';
}
start(x, y, target, el) {
const element = this.tuiRipple ? target.closest(this.tuiRipple) : el;
if (!tuiIsHTMLElement(element)) {
return;
}
const ripple = this.createRipple(x, y, element.getBoundingClientRect());
const touchEnd$ = merge(tuiTypedFromEvent(element, 'pointerup'), tuiTypedFromEvent(element, 'pointercancel'), tuiTypedFromEvent(element, 'pointermove'));
element.appendChild(ripple);
const animationEndOn$ = tuiTypedFromEvent(ripple.animate(TO_KEYFRAMES, this.animationOptions), 'finish');
race(touchEnd$.pipe(switchMap(() => animationEndOn$)), animationEndOn$.pipe(switchMap(() => touchEnd$)))
.pipe(first(), switchMap(() => tuiTypedFromEvent(ripple.animate(FROM_KEYFRAMES, this.animationOptions), 'finish')), first(), tap(() => element.removeChild(ripple)), takeUntilDestroyed(this.destroyRef))
.subscribe();
}
createRipple(clientX, clientY, { width, height, top, left }) {
const ripple = this.doc.createElement('div');
const radius = Math.sqrt(width * width + height * height);
const dimension = radius * 2;
const x = clientX - left - radius;
const y = clientY - top - radius;
Object.assign(ripple.style, {
position: 'absolute',
top: tuiPx(y),
left: tuiPx(x),
width: tuiPx(dimension),
height: tuiPx(dimension),
zIndex: 100,
opacity: 0.12,
borderRadius: '100%',
background: 'var(--tui-ripple-background, currentColor)',
animationFillMode: 'forwards',
pointerEvents: 'none',
});
return ripple;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRipple, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiRipple, isStandalone: true, selector: "[tuiRipple]", inputs: { tuiRipple: "tuiRipple" }, host: { listeners: { "pointerdown.zoneless": "start($event.clientX, $event.clientY, $event.target, $event.currentTarget)" } }, ngImport: i0 }); }
}
export { TuiRipple };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRipple, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[tuiRipple]',
host: {
'(pointerdown.zoneless)': 'start($event.clientX, $event.clientY, $event.target, $event.currentTarget)',
},
}]
}], propDecorators: { tuiRipple: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FkZG9uLW1vYmlsZS9kaXJlY3RpdmVzL3JpcHBsZS9yaXBwbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUV4RCxNQUFNLFlBQVksR0FBRztJQUNqQjtRQUNJLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLE9BQU8sRUFBRSxNQUFNO0tBQ2xCO0lBQ0Q7UUFDSSxPQUFPLEVBQUUsTUFBTTtLQUNsQjtDQUNKLENBQUM7QUFDRixNQUFNLGNBQWMsR0FBRztJQUNuQjtRQUNJLE9BQU8sRUFBRSxNQUFNO0tBQ2xCO0lBQ0Q7UUFDSSxPQUFPLEVBQUUsR0FBRztLQUNmO0NBQ0osQ0FBQztBQUVGLE1BVU0sZUFBZTsr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Q0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUVqQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDeEIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3hCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsT0FBTyxFQUFFLElBQUk7WUFDYixZQUFZLEVBQUUsTUFBTTtZQUNwQixVQUFVLEVBQUUsNENBQTRDO1lBQ3hELGlCQUFpQixFQUFFLFVBQVU7WUFDN0IsYUFBYSxFQUFFLE1BQU07U0FDeEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzsrR0E5RVEsU0FBUzttR0FBVCxTQUFTOztTQUFULFNBQVM7NEZBQVQsU0FBUztrQkFSckIsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLElBQUksRUFBRTt3QkFDRix3QkFBd0IsRUFDcEIsNEVBQTRFO3FCQUNuRjtpQkFDSjs4QkFXVSxTQUFTO3NCQURmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRGVzdHJveVJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge3R1aVR5cGVkRnJvbUV2ZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7dHVpSXNIVE1MRWxlbWVudH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHt0dWlQeCwgdHVpV2l0aFN0eWxlc30gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7VFVJX0FOSU1BVElPTlNfU1BFRUR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL3Rva2Vucyc7XG5pbXBvcnQge3R1aUdldER1cmF0aW9ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7Zmlyc3QsIG1lcmdlLCByYWNlLCBzd2l0Y2hNYXAsIHRhcH0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IFRPX0tFWUZSQU1FUyA9IFtcbiAgICB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApJyxcbiAgICAgICAgb3BhY2l0eTogJzAuMTInLFxuICAgIH0sXG4gICAge1xuICAgICAgICBvcGFjaXR5OiAnMC4xMicsXG4gICAgfSxcbl07XG5jb25zdCBGUk9NX0tFWUZSQU1FUyA9IFtcbiAgICB7XG4gICAgICAgIG9wYWNpdHk6ICcwLjEyJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgb3BhY2l0eTogJzAnLFxuICAgIH0sXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiAnJyxcbiAgICBzdHlsZVVybHM6IFsnLi9yaXBwbGUuc3R5bGUubGVzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ3R1aS1yaXBwbGUtc3R5bGVzJyxcbiAgICB9LFxufSlcbmNsYXNzIFR1aVJpcHBsZVN0eWxlcyB7fVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnW3R1aVJpcHBsZV0nLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhwb2ludGVyZG93bi56b25lbGVzcyknOlxuICAgICAgICAgICAgJ3N0YXJ0KCRldmVudC5jbGllbnRYLCAkZXZlbnQuY2xpZW50WSwgJGV2ZW50LnRhcmdldCwgJGV2ZW50LmN1cnJlbnRUYXJnZXQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlSaXBwbGUge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhbmltYXRpb25PcHRpb25zID0ge1xuICAgICAgICBkdXJhdGlvbjogdHVpR2V0RHVyYXRpb24oaW5qZWN0KFRVSV9BTklNQVRJT05TX1NQRUVEKSksXG4gICAgfTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBub3RoaW5nID0gdHVpV2l0aFN0eWxlcyhUdWlSaXBwbGVTdHlsZXMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHVpUmlwcGxlID0gJyc7XG5cbiAgICBwcm90ZWN0ZWQgc3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIsIHRhcmdldDogSFRNTEVsZW1lbnQsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50dWlSaXBwbGUgPyB0YXJnZXQuY2xvc2VzdCh0aGlzLnR1aVJpcHBsZSkgOiBlbDtcblxuICAgICAgICBpZiAoIXR1aUlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpcHBsZSA9IHRoaXMuY3JlYXRlUmlwcGxlKHgsIHksIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICBjb25zdCB0b3VjaEVuZCQgPSBtZXJnZShcbiAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KGVsZW1lbnQsICdwb2ludGVydXAnKSxcbiAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KGVsZW1lbnQsICdwb2ludGVyY2FuY2VsJyksXG4gICAgICAgICAgICB0dWlUeXBlZEZyb21FdmVudChlbGVtZW50LCAncG9pbnRlcm1vdmUnKSxcbiAgICAgICAgKTtcblxuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHJpcHBsZSk7XG5cbiAgICAgICAgY29uc3QgYW5pbWF0aW9uRW5kT24kID0gdHVpVHlwZWRGcm9tRXZlbnQoXG4gICAgICAgICAgICByaXBwbGUuYW5pbWF0ZShUT19LRVlGUkFNRVMsIHRoaXMuYW5pbWF0aW9uT3B0aW9ucyksXG4gICAgICAgICAgICAnZmluaXNoJyxcbiAgICAgICAgKTtcblxuICAgICAgICByYWNlKFxuICAgICAgICAgICAgdG91Y2hFbmQkLnBpcGUoc3dpdGNoTWFwKCgpID0+IGFuaW1hdGlvbkVuZE9uJCkpLFxuICAgICAgICAgICAgYW5pbWF0aW9uRW5kT24kLnBpcGUoc3dpdGNoTWFwKCgpID0+IHRvdWNoRW5kJCkpLFxuICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0dWlUeXBlZEZyb21FdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpcHBsZS5hbmltYXRlKEZST01fS0VZRlJBTUVTLCB0aGlzLmFuaW1hdGlvbk9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmlzaCcsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiBlbGVtZW50LnJlbW92ZUNoaWxkKHJpcHBsZSkpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUmlwcGxlKFxuICAgICAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgICAgIGNsaWVudFk6IG51bWJlcixcbiAgICAgICAge3dpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdH06IERPTVJlY3QsXG4gICAgKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCByaXBwbGU6IEhUTUxFbGVtZW50ID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IE1hdGguc3FydCh3aWR0aCAqIHdpZHRoICsgaGVpZ2h0ICogaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgZGltZW5zaW9uID0gcmFkaXVzICogMjtcbiAgICAgICAgY29uc3QgeCA9IGNsaWVudFggLSBsZWZ0IC0gcmFkaXVzO1xuICAgICAgICBjb25zdCB5ID0gY2xpZW50WSAtIHRvcCAtIHJhZGl1cztcblxuICAgICAgICBPYmplY3QuYXNzaWduKHJpcHBsZS5zdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICB0b3A6IHR1aVB4KHkpLFxuICAgICAgICAgICAgbGVmdDogdHVpUHgoeCksXG4gICAgICAgICAgICB3aWR0aDogdHVpUHgoZGltZW5zaW9uKSxcbiAgICAgICAgICAgIGhlaWdodDogdHVpUHgoZGltZW5zaW9uKSxcbiAgICAgICAgICAgIHpJbmRleDogMTAwLFxuICAgICAgICAgICAgb3BhY2l0eTogMC4xMixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzEwMCUnLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLXR1aS1yaXBwbGUtYmFja2dyb3VuZCwgY3VycmVudENvbG9yKScsXG4gICAgICAgICAgICBhbmltYXRpb25GaWxsTW9kZTogJ2ZvcndhcmRzJyxcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJpcHBsZTtcbiAgICB9XG59XG4iXX0=