@favian/headwind-ui
Version:
Headless UI for Angular - Styleless Angular components to integrate with Tailwind CSS
63 lines • 9.24 kB
JavaScript
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=