UNPKG

ngx-colors-v

Version:

A beautiful color picker for angular that let you choose from a color palette, using sliders (Hue, Lightness, Alpha sliders) or through text input(hex, rgba, hsla)

123 lines 15 kB
import { EventEmitter, Input, Output, Directive, HostListener, forwardRef, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import * as i0 from "@angular/core"; import * as i1 from "../services/panel-factory.service"; export class NgxColorsTriggerDirective { constructor(triggerRef, panelFactory) { this.triggerRef = triggerRef; this.panelFactory = panelFactory; //Main input/output of the color picker // @Input() color = '#000000'; // @Output() colorChange:EventEmitter<string> = new EventEmitter<string>(); this.color = ""; //This defines the type of animation for the palatte.(slide-in | popup) this.colorsAnimation = "slide-in"; this.position = "bottom"; this.attachTo = undefined; this.overlayClassName = undefined; this.colorPickerControls = "default"; this.acceptLabel = "ACCEPT"; this.cancelLabel = "CANCEL"; // This event is trigger every time the selected color change this.change = new EventEmitter(); // This event is trigger every time the user change the color using the panel this.input = new EventEmitter(); // This event is trigger every time the user change the color using the panel this.slider = new EventEmitter(); this.isDisabled = false; this.onTouchedCallback = () => { }; this.onChangeCallback = () => { }; } onClick() { this.open(); } open() { if (!this.isDisabled) { this.panelRef = this.panelFactory.createPanel(this.attachTo, this.overlayClassName); this.panelRef.instance.iniciate(this, this.triggerRef, this.color, this.palette, this.colorsAnimation, this.format, this.hideTextInput, this.hideColorPicker, this.acceptLabel, this.cancelLabel, this.colorPickerControls, this.position); } } close() { this.panelFactory.removePanel(); } setDisabledState(isDisabled) { this.isDisabled = isDisabled; this.triggerRef.nativeElement.style.opacity = isDisabled ? 0.5 : undefined; } setColor(color) { if (color !== this.color) { this.color = color; this.change.emit(color); this.onChangeCallback(color); } this.input.emit(color); } sliderChange(color) { this.slider.emit(color); } writeValue(value) { if (value !== this.color) { this.color = value; this.change.emit(value); } } registerOnChange(fn) { this.onChangeCallback = fn; } registerOnTouched(fn) { this.onTouchedCallback = fn; } } NgxColorsTriggerDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NgxColorsTriggerDirective, deps: [{ token: i0.ElementRef }, { token: i1.PanelFactoryService }], target: i0.ɵɵFactoryTarget.Directive }); NgxColorsTriggerDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: NgxColorsTriggerDirective, selector: "[ngx-colors-trigger]", inputs: { colorsAnimation: "colorsAnimation", palette: "palette", format: "format", position: "position", hideTextInput: "hideTextInput", hideColorPicker: "hideColorPicker", attachTo: "attachTo", overlayClassName: "overlayClassName", colorPickerControls: "colorPickerControls", acceptLabel: "acceptLabel", cancelLabel: "cancelLabel" }, outputs: { change: "change", input: "input", slider: "slider" }, host: { listeners: { "click": "onClick()" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxColorsTriggerDirective), multi: true, }, ], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NgxColorsTriggerDirective, decorators: [{ type: Directive, args: [{ selector: "[ngx-colors-trigger]", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxColorsTriggerDirective), multi: true, }, ], }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.PanelFactoryService }]; }, propDecorators: { colorsAnimation: [{ type: Input }], palette: [{ type: Input }], format: [{ type: Input }], position: [{ type: Input }], hideTextInput: [{ type: Input }], hideColorPicker: [{ type: Input }], attachTo: [{ type: Input }], overlayClassName: [{ type: Input }], colorPickerControls: [{ type: Input }], acceptLabel: [{ type: Input }], cancelLabel: [{ type: Input }], change: [{ type: Output }], input: [{ type: Output }], slider: [{ type: Output }], onClick: [{ type: HostListener, args: ["click"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNvbG9ycy10cmlnZ2VyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb2xvcnMvc3JjL2xpYi9kaXJlY3RpdmVzL25neC1jb2xvcnMtdHJpZ2dlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFHVCxZQUFZLEVBQ1osVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBYXpFLE1BQU0sT0FBTyx5QkFBeUI7SUFpQ3BDLFlBQ1UsVUFBc0IsRUFDdEIsWUFBaUM7UUFEakMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFsQzNDLHVDQUF1QztRQUN2Qyw4QkFBOEI7UUFDOUIsMkVBQTJFO1FBRTNFLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCx1RUFBdUU7UUFDOUQsb0JBQWUsR0FBeUIsVUFBVSxDQUFDO1FBTW5ELGFBQVEsR0FBcUIsUUFBUSxDQUFDO1FBR3RDLGFBQVEsR0FBK0MsU0FBUyxDQUFDO1FBQ2pFLHFCQUFnQixHQUF1QixTQUFTLENBQUM7UUFDakQsd0JBQW1CLEdBQzFCLFNBQVMsQ0FBQztRQUNILGdCQUFXLEdBQVcsUUFBUSxDQUFDO1FBQy9CLGdCQUFXLEdBQVcsUUFBUSxDQUFDO1FBQ3hDLDZEQUE2RDtRQUNuRCxXQUFNLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDcEUsNkVBQTZFO1FBQ25FLFVBQUssR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNuRSw2RUFBNkU7UUFDbkUsV0FBTSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBV3BFLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFNUIsc0JBQWlCLEdB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O2lCQUNGO21JQVNVLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxLQUFLO3NCQUFkLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVnQixPQUFPO3NCQUE3QixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBmb3J3YXJkUmVmLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFBhbmVsRmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvcGFuZWwtZmFjdG9yeS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBhbmVsQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcGFuZWwvcGFuZWwuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBOZ3hDb2xvciB9IGZyb20gXCIuLi9jbGFzZXMvY29sb3JcIjtcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIltuZ3gtY29sb3JzLXRyaWdnZXJdXCIsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hDb2xvcnNUcmlnZ2VyRGlyZWN0aXZlKSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hDb2xvcnNUcmlnZ2VyRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIC8vTWFpbiBpbnB1dC9vdXRwdXQgb2YgdGhlIGNvbG9yIHBpY2tlclxyXG4gIC8vIEBJbnB1dCgpIGNvbG9yID0gJyMwMDAwMDAnO1xyXG4gIC8vIEBPdXRwdXQoKSBjb2xvckNoYW5nZTpFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBjb2xvciA9IFwiXCI7XHJcblxyXG4gIC8vVGhpcyBkZWZpbmVzIHRoZSB0eXBlIG9mIGFuaW1hdGlvbiBmb3IgdGhlIHBhbGF0dGUuKHNsaWRlLWluIHwgcG9wdXApXHJcbiAgQElucHV0KCkgY29sb3JzQW5pbWF0aW9uOiBcInNsaWRlLWluXCIgfCBcInBvcHVwXCIgPSBcInNsaWRlLWluXCI7XHJcblxyXG4gIC8vVGhpcyBpcyB1c2VkIHRvIHNldCBhIGN1c3RvbSBwYWxldHRlIG9mIGNvbG9ycyBpbiB0aGUgcGFuZWw7XHJcbiAgQElucHV0KCkgcGFsZXR0ZTogQXJyYXk8c3RyaW5nPiB8IEFycmF5PE5neENvbG9yPjtcclxuXHJcbiAgQElucHV0KCkgZm9ybWF0OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcG9zaXRpb246IFwidG9wXCIgfCBcImJvdHRvbVwiID0gXCJib3R0b21cIjtcclxuICBASW5wdXQoKSBoaWRlVGV4dElucHV0OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGhpZGVDb2xvclBpY2tlcjogYm9vbGVhbjtcclxuICBASW5wdXQoKSBhdHRhY2hUbzogc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIG92ZXJsYXlDbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBjb2xvclBpY2tlckNvbnRyb2xzOiBcImRlZmF1bHRcIiB8IFwib25seS1hbHBoYVwiIHwgXCJuby1hbHBoYVwiID1cclxuICAgIFwiZGVmYXVsdFwiO1xyXG4gIEBJbnB1dCgpIGFjY2VwdExhYmVsOiBzdHJpbmcgPSBcIkFDQ0VQVFwiO1xyXG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsOiBzdHJpbmcgPSBcIkNBTkNFTFwiO1xyXG4gIC8vIFRoaXMgZXZlbnQgaXMgdHJpZ2dlciBldmVyeSB0aW1lIHRoZSBzZWxlY3RlZCBjb2xvciBjaGFuZ2VcclxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIC8vIFRoaXMgZXZlbnQgaXMgdHJpZ2dlciBldmVyeSB0aW1lIHRoZSB1c2VyIGNoYW5nZSB0aGUgY29sb3IgdXNpbmcgdGhlIHBhbmVsXHJcbiAgQE91dHB1dCgpIGlucHV0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIC8vIFRoaXMgZXZlbnQgaXMgdHJpZ2dlciBldmVyeSB0aW1lIHRoZSB1c2VyIGNoYW5nZSB0aGUgY29sb3IgdXNpbmcgdGhlIHBhbmVsXHJcbiAgQE91dHB1dCgpIHNsaWRlcjogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImNsaWNrXCIpIG9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLm9wZW4oKTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRyaWdnZXJSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHBhbmVsRmFjdG9yeTogUGFuZWxGYWN0b3J5U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgcGFuZWxSZWY6IENvbXBvbmVudFJlZjxQYW5lbENvbXBvbmVudD47XHJcbiAgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgb3BlbigpIHtcclxuICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMucGFuZWxSZWYgPSB0aGlzLnBhbmVsRmFjdG9yeS5jcmVhdGVQYW5lbChcclxuICAgICAgICB0aGlzLmF0dGFjaFRvLFxyXG4gICAgICAgIHRoaXMub3ZlcmxheUNsYXNzTmFtZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnBhbmVsUmVmLmluc3RhbmNlLmluaWNpYXRlKFxyXG4gICAgICAgIHRoaXMsXHJcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVmLFxyXG4gICAgICAgIHRoaXMuY29sb3IsXHJcbiAgICAgICAgdGhpcy5wYWxldHRlLFxyXG4gICAgICAgIHRoaXMuY29sb3JzQW5pbWF0aW9uLFxyXG4gICAgICAgIHRoaXMuZm9ybWF0LFxyXG4gICAgICAgIHRoaXMuaGlkZVRleHRJbnB1dCxcclxuICAgICAgICB0aGlzLmhpZGVDb2xvclBpY2tlcixcclxuICAgICAgICB0aGlzLmFjY2VwdExhYmVsLFxyXG4gICAgICAgIHRoaXMuY2FuY2VsTGFiZWwsXHJcbiAgICAgICAgdGhpcy5jb2xvclBpY2tlckNvbnRyb2xzLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpIHtcclxuICAgIHRoaXMucGFuZWxGYWN0b3J5LnJlbW92ZVBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgdGhpcy50cmlnZ2VyUmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IGlzRGlzYWJsZWQgPyAwLjUgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q29sb3IoY29sb3IpIHtcclxuICAgIGlmIChjb2xvciAhPT0gdGhpcy5jb2xvcikge1xyXG4gICAgICB0aGlzLmNvbG9yID0gY29sb3I7XHJcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQoY29sb3IpO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soY29sb3IpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbnB1dC5lbWl0KGNvbG9yKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzbGlkZXJDaGFuZ2UoY29sb3IpIHtcclxuICAgIHRoaXMuc2xpZGVyLmVtaXQoY29sb3IpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLmNvbG9yKSB7XHJcbiAgICAgIHRoaXMuY29sb3IgPSB2YWx1ZTtcclxuICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcclxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xyXG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxufVxyXG4iXX0=