UNPKG

@favian/headwind-ui

Version:

Headless UI for Angular - Styleless Angular components to integrate with Tailwind CSS

63 lines 9.24 kB
import { EventEmitter, Injectable } from '@angular/core'; import { HeadwindErrors } from '../constants/headwind-errors'; import * as i0 from "@angular/core"; import * as i1 from "./headwind-platform.service"; export class HeadwindClickDetector { constructor(_headwindPlatformService) { this._headwindPlatformService = _headwindPlatformService; this.outsideClick = new EventEmitter(); this.insideClick = new EventEmitter(); this._mouseDownDetectedFromOutside = false; this._mouseDownDetectedFromInside = false; this._windowMousedownListener = (event) => { if (!this._container) { console.error(HeadwindErrors.headwindError0003); return; } this._mouseDownDetectedFromOutside = event.target instanceof Node && !this._container.contains(event.target); this._mouseDownDetectedFromInside = event.target instanceof Node && this._container.contains(event.target); }; this._windowMouseupListener = (event) => { if (!this._container) { console.error(HeadwindErrors.headwindError0003); return; } if (this._mouseDownDetectedFromOutside && event.target instanceof Node && !this._container.contains(event.target)) { this.outsideClick.emit(); } if (this._mouseDownDetectedFromInside && event.target instanceof Node && this._container.contains(event.target)) { this.insideClick.emit(); } }; } ngOnDestroy() { this.unregister(); } register(container) { this._container = container; this._removeEventListeners(); this._addEventListeners(); } unregister() { delete this._container; this._removeEventListeners(); } _addEventListeners() { if (this._headwindPlatformService.isBrowser) { window.addEventListener('mousedown', this._windowMousedownListener); window.addEventListener('mouseup', this._windowMouseupListener); } } _removeEventListeners() { if (this._headwindPlatformService.isBrowser) { window.removeEventListener('mousedown', this._windowMousedownListener); window.removeEventListener('mouseup', this._windowMouseupListener); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadwindClickDetector, deps: [{ token: i1.HeadwindPlatformService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadwindClickDetector }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadwindClickDetector, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.HeadwindPlatformService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZHdpbmQtY2xpY2stZGV0ZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hlYWR3aW5kLXVpL3NyYy9zZXJ2aWNlcy9oZWFkd2luZC1jbGljay1kZXRlY3Rvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBSTlELE1BQU0sT0FBTyxxQkFBcUI7SUFRaEMsWUFBNkIsd0JBQWlEO1FBQWpELDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBeUI7UUFQOUUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3hDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUcvQixrQ0FBNkIsR0FBRyxLQUFLLENBQUM7UUFDdEMsaUNBQTRCLEdBQUcsS0FBSyxDQUFDO1FBbUNyQyw2QkFBd0IsR0FBRyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2hELE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQyxNQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdHLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUMsTUFBTSxZQUFZLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0csQ0FBQyxDQUFDO1FBRU0sMkJBQXNCLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNoRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLDZCQUE2QixJQUFJLEtBQUssQ0FBQyxNQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2xILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLDRCQUE0QixJQUFJLEtBQUssQ0FBQyxNQUFNLFlBQVksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNoSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDLENBQUM7SUF4RCtFLENBQUM7SUFFbEYsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUSxDQUFDLFNBQWU7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFFNUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFdkIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN2RSxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDSCxDQUFDOytHQXZDVSxxQkFBcUI7bUhBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFEakMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEhlYWR3aW5kRXJyb3JzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2hlYWR3aW5kLWVycm9ycyc7XHJcbmltcG9ydCB7IEhlYWR3aW5kUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9oZWFkd2luZC1wbGF0Zm9ybS5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEhlYWR3aW5kQ2xpY2tEZXRlY3RvciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgb3V0c2lkZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIGluc2lkZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIF9jb250YWluZXI/OiBOb2RlO1xyXG4gIHByaXZhdGUgX21vdXNlRG93bkRldGVjdGVkRnJvbU91dHNpZGUgPSBmYWxzZTtcclxuICBwcml2YXRlIF9tb3VzZURvd25EZXRlY3RlZEZyb21JbnNpZGUgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfaGVhZHdpbmRQbGF0Zm9ybVNlcnZpY2U6IEhlYWR3aW5kUGxhdGZvcm1TZXJ2aWNlKSB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5yZWdpc3RlcigpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIoY29udGFpbmVyOiBOb2RlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7XHJcblxyXG4gICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcclxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgZGVsZXRlIHRoaXMuX2NvbnRhaW5lcjtcclxuXHJcbiAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faGVhZHdpbmRQbGF0Zm9ybVNlcnZpY2UuaXNCcm93c2VyKSB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl93aW5kb3dNb3VzZWRvd25MaXN0ZW5lcik7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fd2luZG93TW91c2V1cExpc3RlbmVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2hlYWR3aW5kUGxhdGZvcm1TZXJ2aWNlLmlzQnJvd3Nlcikge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fd2luZG93TW91c2Vkb3duTGlzdGVuZXIpO1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX3dpbmRvd01vdXNldXBMaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF93aW5kb3dNb3VzZWRvd25MaXN0ZW5lciA9IChldmVudDogRXZlbnQpID0+IHtcclxuICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoSGVhZHdpbmRFcnJvcnMuaGVhZHdpbmRFcnJvcjAwMDMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbW91c2VEb3duRGV0ZWN0ZWRGcm9tT3V0c2lkZSA9IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIE5vZGUgJiYgIXRoaXMuX2NvbnRhaW5lci5jb250YWlucyhldmVudC50YXJnZXQpO1xyXG4gICAgdGhpcy5fbW91c2VEb3duRGV0ZWN0ZWRGcm9tSW5zaWRlID0gZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSAmJiB0aGlzLl9jb250YWluZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIF93aW5kb3dNb3VzZXVwTGlzdGVuZXIgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKEhlYWR3aW5kRXJyb3JzLmhlYWR3aW5kRXJyb3IwMDAzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9tb3VzZURvd25EZXRlY3RlZEZyb21PdXRzaWRlICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIE5vZGUgJiYgIXRoaXMuX2NvbnRhaW5lci5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMub3V0c2lkZUNsaWNrLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fbW91c2VEb3duRGV0ZWN0ZWRGcm9tSW5zaWRlICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIE5vZGUgJiYgdGhpcy5fY29udGFpbmVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5pbnNpZGVDbGljay5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG4iXX0=