@recursyve/ngx-material-components 22.0.0 → 22.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_sass/_override-utils.scss +31 -0
- package/colorpicker/_index.scss +1 -0
- package/colorpicker/_theme.scss +19 -0
- package/fesm2022/recursyve-ngx-material-components-chip-list.mjs +2 -2
- package/fesm2022/recursyve-ngx-material-components-chip-list.mjs.map +1 -1
- package/fesm2022/recursyve-ngx-material-components-colorpicker.mjs +237 -0
- package/fesm2022/recursyve-ngx-material-components-colorpicker.mjs.map +1 -0
- package/fesm2022/recursyve-ngx-material-components-dropzone.mjs +23 -7
- package/fesm2022/recursyve-ngx-material-components-dropzone.mjs.map +1 -1
- package/fesm2022/recursyve-ngx-material-components-form-field-error.mjs +174 -33
- package/fesm2022/recursyve-ngx-material-components-form-field-error.mjs.map +1 -1
- package/fesm2022/recursyve-ngx-material-components-timepicker.mjs +550 -0
- package/fesm2022/recursyve-ngx-material-components-timepicker.mjs.map +1 -0
- package/fesm2022/recursyve-ngx-material-components-typeahead.mjs +24 -12
- package/fesm2022/recursyve-ngx-material-components-typeahead.mjs.map +1 -1
- package/package.json +16 -4
- package/timepicker/_index.scss +1 -0
- package/timepicker/_theme.scss +41 -0
- package/types/recursyve-ngx-material-components-colorpicker.d.ts +77 -0
- package/types/recursyve-ngx-material-components-dropzone.d.ts +8 -1
- package/types/recursyve-ngx-material-components-form-field-error.d.ts +25 -3
- package/types/recursyve-ngx-material-components-timepicker.d.ts +99 -0
- package/types/recursyve-ngx-material-components-typeahead.d.ts +3 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
@use "sass:map";
|
|
2
|
+
|
|
3
|
+
/// Emits CSS custom properties from a typed token map.
|
|
4
|
+
/// @param {Map} $overrides - Token name to value map passed by the consumer
|
|
5
|
+
/// @param {Map} $token-vars - Token name to CSS custom property name map
|
|
6
|
+
@mixin emit-token-overrides($overrides, $token-vars) {
|
|
7
|
+
@each $token, $value in $overrides {
|
|
8
|
+
@if not map.has-key($token-vars, $token) {
|
|
9
|
+
@error "Unknown token `#{$token}`. Expected one of: #{map.keys($token-vars)}.";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@each $token, $css-var in $token-vars {
|
|
14
|
+
@if map.has-key($overrides, $token) {
|
|
15
|
+
#{$css-var}: #{map.get($overrides, $token)};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/// Shared suffix tokens for field-like components (colorpicker, timepicker).
|
|
21
|
+
@function field-suffix-token-vars($component) {
|
|
22
|
+
@return (
|
|
23
|
+
disabled-icon-color: --nice-#{$component}-disabled-icon-color,
|
|
24
|
+
icon-color: --nice-#{$component}-icon-color,
|
|
25
|
+
icon-size: --nice-#{$component}-icon-size,
|
|
26
|
+
invalid-icon-color: --nice-#{$component}-invalid-icon-color,
|
|
27
|
+
suffix-padding-inline-end: --nice-#{$component}-suffix-padding-inline-end,
|
|
28
|
+
toggle-size: --nice-#{$component}-toggle-size,
|
|
29
|
+
width: --nice-#{$component}-width
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@forward "theme";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
@use "sass:map";
|
|
2
|
+
@use "../_sass/override-utils" as utils;
|
|
3
|
+
|
|
4
|
+
$_tokens: map.merge(
|
|
5
|
+
utils.field-suffix-token-vars(colorpicker),
|
|
6
|
+
(
|
|
7
|
+
input-cursor: --nice-colorpicker-input-cursor,
|
|
8
|
+
prefix-padding-inline-start: --nice-colorpicker-prefix-padding-inline-start,
|
|
9
|
+
swatch-border-color: --nice-colorpicker-swatch-border-color,
|
|
10
|
+
swatch-size: --nice-colorpicker-swatch-size
|
|
11
|
+
)
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
@mixin overrides($tokens: ()) {
|
|
15
|
+
.mat-mdc-form-field:has(nice-colorpicker),
|
|
16
|
+
.mat-mdc-form-field:has(nice-colorpicker-toggle) {
|
|
17
|
+
@include utils.emit-token-overrides($tokens, $_tokens);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -141,7 +141,7 @@ class NiceChipListItems {
|
|
|
141
141
|
this.removeChip.emit(index);
|
|
142
142
|
}
|
|
143
143
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceChipListItems, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
144
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NiceChipListItems, isStandalone: true, selector: "nice-chip-list-items", outputs: { removeChip: "removeChip" }, ngImport: i0, template: "@if (items) {\n <mat-chip-set>\n @for (item of items(); track item) {\n <mat-chip-row [highlighted]=\"true\" (removed)=\"remove($index)\">\n @if (formatLabelFn) {\n {{ formatLabelFn(item) }}\n } @else {\n {{ item }}\n }\n\n <button matChipRemove>\n <nice-chip-list-items-clear-icon />\n </button>\n </mat-chip-row>\n }\n </mat-chip-set>\n}\n", styles: ["nice-chip-list-items-clear-icon{margin-top:-1px;width:16px;height:16px}\n"], dependencies: [{ kind: "component", type: MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: NiceChipListItemsClearIcon, selector: "nice-chip-list-items-clear-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
144
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NiceChipListItems, isStandalone: true, selector: "nice-chip-list-items", outputs: { removeChip: "removeChip" }, ngImport: i0, template: "@if (items) {\n <mat-chip-set>\n @for (item of items(); track item) {\n <mat-chip-row [highlighted]=\"true\" (removed)=\"remove($index)\">\n @if (formatLabelFn) {\n {{ formatLabelFn(item) }}\n } @else {\n {{ item }}\n }\n\n <button matChipRemove type=\"button\">\n <nice-chip-list-items-clear-icon />\n </button>\n </mat-chip-row>\n }\n </mat-chip-set>\n}\n", styles: ["nice-chip-list-items-clear-icon{margin-top:-1px;width:16px;height:16px}\n"], dependencies: [{ kind: "component", type: MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: NiceChipListItemsClearIcon, selector: "nice-chip-list-items-clear-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
145
145
|
}
|
|
146
146
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceChipListItems, decorators: [{
|
|
147
147
|
type: Component,
|
|
@@ -150,7 +150,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
150
150
|
MatChipRemove,
|
|
151
151
|
MatChipRow,
|
|
152
152
|
NiceChipListItemsClearIcon
|
|
153
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (items) {\n <mat-chip-set>\n @for (item of items(); track item) {\n <mat-chip-row [highlighted]=\"true\" (removed)=\"remove($index)\">\n @if (formatLabelFn) {\n {{ formatLabelFn(item) }}\n } @else {\n {{ item }}\n }\n\n <button matChipRemove>\n <nice-chip-list-items-clear-icon />\n </button>\n </mat-chip-row>\n }\n </mat-chip-set>\n}\n", styles: ["nice-chip-list-items-clear-icon{margin-top:-1px;width:16px;height:16px}\n"] }]
|
|
153
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (items) {\n <mat-chip-set>\n @for (item of items(); track item) {\n <mat-chip-row [highlighted]=\"true\" (removed)=\"remove($index)\">\n @if (formatLabelFn) {\n {{ formatLabelFn(item) }}\n } @else {\n {{ item }}\n }\n\n <button matChipRemove type=\"button\">\n <nice-chip-list-items-clear-icon />\n </button>\n </mat-chip-row>\n }\n </mat-chip-set>\n}\n", styles: ["nice-chip-list-items-clear-icon{margin-top:-1px;width:16px;height:16px}\n"] }]
|
|
154
154
|
}], propDecorators: { removeChip: [{ type: i0.Output, args: ["removeChip"] }] } });
|
|
155
155
|
|
|
156
156
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recursyve-ngx-material-components-chip-list.mjs","sources":["../../../src/material-components/chip-list/chip-list.ts","../../../src/material-components/chip-list/icons/clear/chip-list-items-clear-icon.ts","../../../src/material-components/chip-list/icons/clear/chip-list-items-clear-icon.svg","../../../src/material-components/chip-list/items/chip-list-items.ts","../../../src/material-components/chip-list/items/chip-list-items.html","../../../src/material-components/chip-list/recursyve-ngx-material-components-chip-list.ts"],"sourcesContent":["import {\n Directive,\n effect,\n ElementRef,\n HostListener,\n inject,\n Injector,\n input,\n OnInit,\n signal,\n untracked\n} from \"@angular/core\";\nimport { toObservable } from \"@angular/core/rxjs-interop\";\nimport { ControlValueAccessor, NgControl } from \"@angular/forms\";\nimport { NiceAsyncTypeahead } from \"@recursyve/ngx-material-components/typeahead\";\nimport { NiceChipListItems } from \"./items/chip-list-items\";\n\n@Directive({\n selector: \"input[niceChipList], nice-async-typeahead[niceChipList]\"\n})\nexport class NiceChipListDirective<T extends object> implements ControlValueAccessor, OnInit {\n public readonly withItemList = input.required<NiceChipListItems<T>>();\n public readonly reloadOnSelected = input<boolean>(true);\n public readonly separatorKeyboardCodes = input<string[]>([\"Enter\"]);\n\n private readonly elementRef = inject(ElementRef);\n private readonly injector = inject(Injector);\n private readonly asyncTypeahead = inject<NiceAsyncTypeahead<T>>(NiceAsyncTypeahead, { optional: true });\n private readonly ngControl = inject<NgControl>(NgControl, { optional: true });\n\n private readonly values = signal<T[]>([]);\n\n private propagateChanges?: (_: T[]) => void;\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n effect(() => {\n const values = this.values();\n untracked(() => this.updateTypeaheadSearchOptions(values));\n });\n }\n\n @HostListener(\"keydown\", [\"$event\"])\n public onKeyDown(event: KeyboardEvent): void {\n if (this.asyncTypeahead) {\n return;\n }\n\n if (!this.separatorKeyboardCodes().includes(event.code)) {\n return;\n }\n\n if (!this.elementRef.nativeElement.validity.valid) {\n return;\n }\n\n this.addValue(this.elementRef.nativeElement.value);\n this.elementRef.nativeElement.value = \"\";\n event.preventDefault();\n }\n\n public ngOnInit(): void {\n this.setupAsyncTypeahead();\n\n const parentElement = this.elementRef.nativeElement.parentElement;\n if (parentElement.classList.contains(\"mat-mdc-form-field-infix\")) {\n parentElement.style.alignItems = \"flex-start\";\n parentElement.style.flexDirection = \"column-reverse\";\n }\n\n const withItemList = this.withItemList();\n withItemList.setItemsReactivity(toObservable(this.values, { injector: this.injector }));\n withItemList.removeChip.subscribe((index) => {\n const values = [...this.values()];\n values.splice(index, 1);\n\n this.propagateChanges?.(values);\n this.values.set(values);\n });\n\n if (this.asyncTypeahead) {\n withItemList.setFormatLabel((item) => this.asyncTypeahead!.formatLabel(item));\n }\n }\n\n public writeValue(obj: T[] | null): void {\n if (!obj) {\n this.values.set([]);\n } else if (Array.isArray(obj)) {\n this.values.set([...obj]);\n }\n }\n\n public registerOnChange(fn: (_: T[]) => void): void {\n this.propagateChanges = fn;\n }\n\n public registerOnTouched(): void {\n return;\n }\n\n private setupAsyncTypeahead(): void {\n if (!this.asyncTypeahead) {\n return;\n }\n\n this.asyncTypeahead.selected\n .subscribe((value) => {\n if (!value) {\n return;\n }\n\n this.addValue(value);\n this.asyncTypeahead?.removeActiveValue();\n });\n }\n\n private addValue(value: T): void {\n const values = [...this.values()];\n if (values.includes(value)) {\n return;\n }\n\n values.push(value);\n this.propagateChanges?.(values);\n this.values.set(values);\n }\n\n private updateTypeaheadSearchOptions(ignore: T[]): void {\n if (!this.asyncTypeahead) {\n return;\n }\n\n const searchOptions = this.asyncTypeahead.searchOptions();\n this.asyncTypeahead.setSearchOptions({ ...(searchOptions ?? {}), ignore });\n }\n}\n","import { Component, ChangeDetectionStrategy } from \"@angular/core\";\n\n@Component({\n selector: \"nice-chip-list-items-clear-icon\",\n changeDetection: ChangeDetectionStrategy.Eager,\n templateUrl: \"chip-list-items-clear-icon.svg\"\n})\nexport class NiceChipListItemsClearIcon {}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0a12 12 0 1 0 12 12A12 12 0 0 0 12 0Zm5.49 16.07a1 1 0 0 1 -1.41 1.42l-3.9 -3.9a0.25 0.25 0 0 0 -0.36 0l-3.9 3.9a1 1 0 1 1 -1.41 -1.42l3.9 -3.89a0.25 0.25 0 0 0 0 -0.36l-3.9 -3.9a1 1 0 0 1 1.41 -1.41l3.9 3.9a0.25 0.25 0 0 0 0.36 0l3.9 -3.9a1 1 0 0 1 1.41 1.41l-3.9 3.9a0.25 0.25 0 0 0 0 0.36Z\" fill=\"currentColor\" stroke-width=\"1\"></path>\n</svg>\n","import { ChangeDetectionStrategy, Component, inject, Injector, output, Signal } from \"@angular/core\";\nimport { toSignal } from \"@angular/core/rxjs-interop\";\nimport { MatChipRemove, MatChipRow, MatChipSet } from \"@angular/material/chips\";\nimport { Observable } from \"rxjs\";\nimport { NiceChipListItemsClearIcon } from \"../icons/clear/chip-list-items-clear-icon\";\n\n@Component({\n selector: \"nice-chip-list-items\",\n templateUrl: \"./chip-list-items.html\",\n styleUrls: [\"./chip-list-items.scss\"],\n imports: [\n MatChipSet,\n MatChipRemove,\n MatChipRow,\n NiceChipListItemsClearIcon\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NiceChipListItems<T> {\n public readonly removeChip = output<number>();\n\n protected readonly injector = inject(Injector);\n\n public items?: Signal<T[]>;\n public formatLabelFn?: (value: T) => string;\n\n public setItemsReactivity(items$: Observable<T[]>): void {\n this.items = toSignal(items$, { injector: this.injector, initialValue: [] });\n }\n\n public setFormatLabel(fn: (value: T) => string): void {\n this.formatLabelFn = fn;\n }\n\n public remove(index: number): void {\n this.removeChip.emit(index);\n }\n}\n","@if (items) {\n <mat-chip-set>\n @for (item of items(); track item) {\n <mat-chip-row [highlighted]=\"true\" (removed)=\"remove($index)\">\n @if (formatLabelFn) {\n {{ formatLabelFn(item) }}\n } @else {\n {{ item }}\n }\n\n <button matChipRemove>\n <nice-chip-list-items-clear-icon />\n </button>\n </mat-chip-row>\n }\n </mat-chip-set>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;MAoBa,qBAAqB,CAAA;IACd,YAAY,GAAG,KAAK,CAAC,QAAQ;qFAAwB;IACrD,gBAAgB,GAAG,KAAK,CAAU,IAAI;yFAAC;AACvC,IAAA,sBAAsB,GAAG,KAAK,CAAW,CAAC,OAAO,CAAC;+FAAC;AAElD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,cAAc,GAAG,MAAM,CAAwB,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACtF,SAAS,GAAG,MAAM,CAAY,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAE5D,MAAM,GAAG,MAAM,CAAM,EAAE;+EAAC;AAEjC,IAAA,gBAAgB;AAExB,IAAA,WAAA,GAAA;AACI,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACvC;QAEA,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,SAAS,CAAC,MAAM,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAC9D,QAAA,CAAC,CAAC;IACN;AAGO,IAAA,SAAS,CAAC,KAAoB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB;QACJ;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACrD;QACJ;QAEA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC/C;QACJ;QAEA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;QACxC,KAAK,CAAC,cAAc,EAAE;IAC1B;IAEO,QAAQ,GAAA;QACX,IAAI,CAAC,mBAAmB,EAAE;QAE1B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa;QACjE,IAAI,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE;AAC9D,YAAA,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY;AAC7C,YAAA,aAAa,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB;QACxD;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,QAAA,YAAY,CAAC,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvF,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;YACxC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAEvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;AAC/B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjF;IACJ;AAEO,IAAA,UAAU,CAAC,GAAe,EAAA;QAC7B,IAAI,CAAC,GAAG,EAAE;AACN,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB;AAAO,aAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAC7B;IACJ;AAEO,IAAA,gBAAgB,CAAC,EAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;IAC9B;IAEO,iBAAiB,GAAA;QACpB;IACJ;IAEQ,mBAAmB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC;AACf,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACjB,IAAI,CAAC,KAAK,EAAE;gBACR;YACJ;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,YAAA,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE;AAC5C,QAAA,CAAC,CAAC;IACV;AAEQ,IAAA,QAAQ,CAAC,KAAQ,EAAA;QACrB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACxB;QACJ;AAEA,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IAC3B;AAEQ,IAAA,4BAA4B,CAAC,MAAW,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB;QACJ;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;AACzD,QAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,IAAI,aAAa,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9E;uGAtHS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yDAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE;AACb,iBAAA;;sBA0BI,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;MCtC1B,0BAA0B,CAAA;uGAA1B,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,2FCPvC,ubAGA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA;;2FDIa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;+BACI,iCAAiC,EAAA,eAAA,EAC1B,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,ubAAA,EAAA;;;MEcrC,iBAAiB,CAAA;IACV,UAAU,GAAG,MAAM,EAAU;AAE1B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEvC,IAAA,KAAK;AACL,IAAA,aAAa;AAEb,IAAA,kBAAkB,CAAC,MAAuB,EAAA;AAC7C,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAChF;AAEO,IAAA,cAAc,CAAC,EAAwB,EAAA;AAC1C,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IAC3B;AAEO,IAAA,MAAM,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;uGAlBS,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClB9B,qgBAiBA,EAAA,MAAA,EAAA,CAAA,2EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNQ,UAAU,mGACV,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,UAAU,EAAA,QAAA,EAAA,wEAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,0BAA0B,EAAA,QAAA,EAAA,iCAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIrB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAZ7B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EAGvB;wBACL,UAAU;wBACV,aAAa;wBACb,UAAU;wBACV;qBACH,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qgBAAA,EAAA,MAAA,EAAA,CAAA,2EAAA,CAAA,EAAA;;;AEhBnD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"recursyve-ngx-material-components-chip-list.mjs","sources":["../../../src/material-components/chip-list/chip-list.ts","../../../src/material-components/chip-list/icons/clear/chip-list-items-clear-icon.ts","../../../src/material-components/chip-list/icons/clear/chip-list-items-clear-icon.svg","../../../src/material-components/chip-list/items/chip-list-items.ts","../../../src/material-components/chip-list/items/chip-list-items.html","../../../src/material-components/chip-list/recursyve-ngx-material-components-chip-list.ts"],"sourcesContent":["import {\n Directive,\n effect,\n ElementRef,\n HostListener,\n inject,\n Injector,\n input,\n OnInit,\n signal,\n untracked\n} from \"@angular/core\";\nimport { toObservable } from \"@angular/core/rxjs-interop\";\nimport { ControlValueAccessor, NgControl } from \"@angular/forms\";\nimport { NiceAsyncTypeahead } from \"@recursyve/ngx-material-components/typeahead\";\nimport { NiceChipListItems } from \"./items/chip-list-items\";\n\n@Directive({\n selector: \"input[niceChipList], nice-async-typeahead[niceChipList]\"\n})\nexport class NiceChipListDirective<T extends object> implements ControlValueAccessor, OnInit {\n public readonly withItemList = input.required<NiceChipListItems<T>>();\n public readonly reloadOnSelected = input<boolean>(true);\n public readonly separatorKeyboardCodes = input<string[]>([\"Enter\"]);\n\n private readonly elementRef = inject(ElementRef);\n private readonly injector = inject(Injector);\n private readonly asyncTypeahead = inject<NiceAsyncTypeahead<T>>(NiceAsyncTypeahead, { optional: true });\n private readonly ngControl = inject<NgControl>(NgControl, { optional: true });\n\n private readonly values = signal<T[]>([]);\n\n private propagateChanges?: (_: T[]) => void;\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n effect(() => {\n const values = this.values();\n untracked(() => this.updateTypeaheadSearchOptions(values));\n });\n }\n\n @HostListener(\"keydown\", [\"$event\"])\n public onKeyDown(event: KeyboardEvent): void {\n if (this.asyncTypeahead) {\n return;\n }\n\n if (!this.separatorKeyboardCodes().includes(event.code)) {\n return;\n }\n\n if (!this.elementRef.nativeElement.validity.valid) {\n return;\n }\n\n this.addValue(this.elementRef.nativeElement.value);\n this.elementRef.nativeElement.value = \"\";\n event.preventDefault();\n }\n\n public ngOnInit(): void {\n this.setupAsyncTypeahead();\n\n const parentElement = this.elementRef.nativeElement.parentElement;\n if (parentElement.classList.contains(\"mat-mdc-form-field-infix\")) {\n parentElement.style.alignItems = \"flex-start\";\n parentElement.style.flexDirection = \"column-reverse\";\n }\n\n const withItemList = this.withItemList();\n withItemList.setItemsReactivity(toObservable(this.values, { injector: this.injector }));\n withItemList.removeChip.subscribe((index) => {\n const values = [...this.values()];\n values.splice(index, 1);\n\n this.propagateChanges?.(values);\n this.values.set(values);\n });\n\n if (this.asyncTypeahead) {\n withItemList.setFormatLabel((item) => this.asyncTypeahead!.formatLabel(item));\n }\n }\n\n public writeValue(obj: T[] | null): void {\n if (!obj) {\n this.values.set([]);\n } else if (Array.isArray(obj)) {\n this.values.set([...obj]);\n }\n }\n\n public registerOnChange(fn: (_: T[]) => void): void {\n this.propagateChanges = fn;\n }\n\n public registerOnTouched(): void {\n return;\n }\n\n private setupAsyncTypeahead(): void {\n if (!this.asyncTypeahead) {\n return;\n }\n\n this.asyncTypeahead.selected\n .subscribe((value) => {\n if (!value) {\n return;\n }\n\n this.addValue(value);\n this.asyncTypeahead?.removeActiveValue();\n });\n }\n\n private addValue(value: T): void {\n const values = [...this.values()];\n if (values.includes(value)) {\n return;\n }\n\n values.push(value);\n this.propagateChanges?.(values);\n this.values.set(values);\n }\n\n private updateTypeaheadSearchOptions(ignore: T[]): void {\n if (!this.asyncTypeahead) {\n return;\n }\n\n const searchOptions = this.asyncTypeahead.searchOptions();\n this.asyncTypeahead.setSearchOptions({ ...(searchOptions ?? {}), ignore });\n }\n}\n","import { Component, ChangeDetectionStrategy } from \"@angular/core\";\n\n@Component({\n selector: \"nice-chip-list-items-clear-icon\",\n changeDetection: ChangeDetectionStrategy.Eager,\n templateUrl: \"chip-list-items-clear-icon.svg\"\n})\nexport class NiceChipListItemsClearIcon {}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0a12 12 0 1 0 12 12A12 12 0 0 0 12 0Zm5.49 16.07a1 1 0 0 1 -1.41 1.42l-3.9 -3.9a0.25 0.25 0 0 0 -0.36 0l-3.9 3.9a1 1 0 1 1 -1.41 -1.42l3.9 -3.89a0.25 0.25 0 0 0 0 -0.36l-3.9 -3.9a1 1 0 0 1 1.41 -1.41l3.9 3.9a0.25 0.25 0 0 0 0.36 0l3.9 -3.9a1 1 0 0 1 1.41 1.41l-3.9 3.9a0.25 0.25 0 0 0 0 0.36Z\" fill=\"currentColor\" stroke-width=\"1\"></path>\n</svg>\n","import { ChangeDetectionStrategy, Component, inject, Injector, output, Signal } from \"@angular/core\";\nimport { toSignal } from \"@angular/core/rxjs-interop\";\nimport { MatChipRemove, MatChipRow, MatChipSet } from \"@angular/material/chips\";\nimport { Observable } from \"rxjs\";\nimport { NiceChipListItemsClearIcon } from \"../icons/clear/chip-list-items-clear-icon\";\n\n@Component({\n selector: \"nice-chip-list-items\",\n templateUrl: \"./chip-list-items.html\",\n styleUrls: [\"./chip-list-items.scss\"],\n imports: [\n MatChipSet,\n MatChipRemove,\n MatChipRow,\n NiceChipListItemsClearIcon\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NiceChipListItems<T> {\n public readonly removeChip = output<number>();\n\n protected readonly injector = inject(Injector);\n\n public items?: Signal<T[]>;\n public formatLabelFn?: (value: T) => string;\n\n public setItemsReactivity(items$: Observable<T[]>): void {\n this.items = toSignal(items$, { injector: this.injector, initialValue: [] });\n }\n\n public setFormatLabel(fn: (value: T) => string): void {\n this.formatLabelFn = fn;\n }\n\n public remove(index: number): void {\n this.removeChip.emit(index);\n }\n}\n","@if (items) {\n <mat-chip-set>\n @for (item of items(); track item) {\n <mat-chip-row [highlighted]=\"true\" (removed)=\"remove($index)\">\n @if (formatLabelFn) {\n {{ formatLabelFn(item) }}\n } @else {\n {{ item }}\n }\n\n <button matChipRemove type=\"button\">\n <nice-chip-list-items-clear-icon />\n </button>\n </mat-chip-row>\n }\n </mat-chip-set>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, viewChild, signal, computed, effect, untracked, ViewEncapsulation, Component, InjectionToken, inject } from '@angular/core';
|
|
3
|
+
import { validate, FormField } from '@angular/forms/signals';
|
|
4
|
+
import { MatFormFieldControl } from '@angular/material/form-field';
|
|
5
|
+
import { Subject } from 'rxjs';
|
|
6
|
+
import { TinyColor } from '@ctrl/tinycolor';
|
|
7
|
+
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
8
|
+
import { MatIconButton } from '@angular/material/button';
|
|
9
|
+
import { MatIcon } from '@angular/material/icon';
|
|
10
|
+
import * as i1 from 'ngx-color/chrome';
|
|
11
|
+
import { ColorChromeModule } from 'ngx-color/chrome';
|
|
12
|
+
|
|
13
|
+
const registeredFields = new WeakSet();
|
|
14
|
+
const NICE_COLOR_PARSE_ERROR_KIND = "parse";
|
|
15
|
+
function isValidNiceColor(value) {
|
|
16
|
+
const normalized = value?.trim();
|
|
17
|
+
if (!normalized) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return new TinyColor(normalized).isValid;
|
|
21
|
+
}
|
|
22
|
+
function normalizeNiceColor(value) {
|
|
23
|
+
const normalized = value.trim();
|
|
24
|
+
if (!normalized) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const color = new TinyColor(normalized);
|
|
28
|
+
return color.isValid ? color.toHexString() : null;
|
|
29
|
+
}
|
|
30
|
+
function niceColorFormat(path, message) {
|
|
31
|
+
validate(path, ({ value }) => {
|
|
32
|
+
const current = value()?.trim() ?? "";
|
|
33
|
+
if (!current || isValidNiceColor(current)) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return { kind: NICE_COLOR_PARSE_ERROR_KIND, message };
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function registerNiceColorFormatValidation(field, message) {
|
|
40
|
+
if (registeredFields.has(field)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
registeredFields.add(field);
|
|
44
|
+
niceColorFormat(field, message);
|
|
45
|
+
}
|
|
46
|
+
/** @deprecated Use {@link niceColorFormat} in the `form()` schema callback instead. */
|
|
47
|
+
const registerNiceColorpickerValidation = registerNiceColorFormatValidation;
|
|
48
|
+
|
|
49
|
+
function hasNiceColorFormatError(value) {
|
|
50
|
+
const normalized = value?.trim() ?? "";
|
|
51
|
+
return normalized !== "" && !isValidNiceColor(normalized);
|
|
52
|
+
}
|
|
53
|
+
function niceColorFieldErrorState(state) {
|
|
54
|
+
if (!state.touched() && !state.dirty()) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (hasNiceColorFormatError(state.value())) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return state.invalid();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
class NiceColorpicker {
|
|
64
|
+
static nextId = 0;
|
|
65
|
+
field = input.required(/* @ts-ignore */
|
|
66
|
+
...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
|
|
67
|
+
id = `nice-colorpicker-${NiceColorpicker.nextId++}`;
|
|
68
|
+
controlType = "nice-colorpicker";
|
|
69
|
+
stateChanges = new Subject();
|
|
70
|
+
ngControl = null;
|
|
71
|
+
placeholder = "";
|
|
72
|
+
required = false;
|
|
73
|
+
textInput = viewChild("textInput", /* @ts-ignore */
|
|
74
|
+
...(ngDevMode ? [{ debugName: "textInput" }] : /* istanbul ignore next */ []));
|
|
75
|
+
isInputFocused = signal(false, /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "isInputFocused" }] : /* istanbul ignore next */ []));
|
|
77
|
+
swatchColor = computed(() => {
|
|
78
|
+
const value = this.field()().value()?.trim();
|
|
79
|
+
if (!value) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return normalizeNiceColor(value);
|
|
83
|
+
}, /* @ts-ignore */
|
|
84
|
+
...(ngDevMode ? [{ debugName: "swatchColor" }] : /* istanbul ignore next */ []));
|
|
85
|
+
showSwatch = computed(() => {
|
|
86
|
+
const hasValue = !!this.field()().value()?.trim();
|
|
87
|
+
return hasValue || this.isInputFocused();
|
|
88
|
+
}, /* @ts-ignore */
|
|
89
|
+
...(ngDevMode ? [{ debugName: "showSwatch" }] : /* istanbul ignore next */ []));
|
|
90
|
+
get value() {
|
|
91
|
+
return this.field()().value() || null;
|
|
92
|
+
}
|
|
93
|
+
get focused() {
|
|
94
|
+
return this.isInputFocused();
|
|
95
|
+
}
|
|
96
|
+
get empty() {
|
|
97
|
+
return !this.field()().value()?.trim();
|
|
98
|
+
}
|
|
99
|
+
get shouldLabelFloat() {
|
|
100
|
+
return this.focused || !this.empty;
|
|
101
|
+
}
|
|
102
|
+
get disabled() {
|
|
103
|
+
return this.field()().disabled();
|
|
104
|
+
}
|
|
105
|
+
get errorState() {
|
|
106
|
+
return niceColorFieldErrorState(this.field()());
|
|
107
|
+
}
|
|
108
|
+
constructor() {
|
|
109
|
+
effect(() => {
|
|
110
|
+
const state = this.field()();
|
|
111
|
+
state.value();
|
|
112
|
+
state.disabled();
|
|
113
|
+
state.invalid();
|
|
114
|
+
state.touched();
|
|
115
|
+
state.dirty();
|
|
116
|
+
this.isInputFocused();
|
|
117
|
+
untracked(() => this.stateChanges.next());
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
setDescribedByIds(ids) {
|
|
121
|
+
const input = this.textInput()?.nativeElement;
|
|
122
|
+
if (!input) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (ids.length) {
|
|
126
|
+
input.setAttribute("aria-describedby", ids.join(" "));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
input.removeAttribute("aria-describedby");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
onContainerClick() {
|
|
133
|
+
if (this.disabled) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.textInput()?.nativeElement.focus();
|
|
137
|
+
}
|
|
138
|
+
onInputBlur() {
|
|
139
|
+
this.isInputFocused.set(false);
|
|
140
|
+
const state = this.field()();
|
|
141
|
+
const normalized = normalizeNiceColor(state.value() ?? "");
|
|
142
|
+
if (normalized) {
|
|
143
|
+
state.value.set(normalized);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceColorpicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
147
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NiceColorpicker, isStandalone: true, selector: "nice-colorpicker", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class.nice-colorpicker--focused": "focused", "class.nice-colorpicker--empty": "empty", "class.nice-colorpicker--invalid": "errorState", "attr.aria-invalid": "errorState", "id": "id" }, classAttribute: "nice-colorpicker" }, providers: [{ provide: MatFormFieldControl, useExisting: NiceColorpicker }], viewQueries: [{ propertyName: "textInput", first: true, predicate: ["textInput"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (showSwatch()) {\n <span\n class=\"nice-colorpicker__swatch\"\n aria-hidden=\"true\"\n [class.nice-colorpicker__swatch--empty]=\"!swatchColor()\"\n [style.--nice-colorpicker-swatch-color]=\"swatchColor()\"\n ></span>\n}\n\n<input\n #textInput\n class=\"nice-colorpicker__text-input\"\n [formField]=\"field()\"\n (blur)=\"onInputBlur()\"\n (focus)=\"isInputFocused.set(true)\"\n/>\n", styles: ["nice-colorpicker{display:flex;align-items:center;width:100%;min-width:0;gap:.5rem}.mat-mdc-form-field:has(nice-colorpicker){--nice-colorpicker-prefix-padding-inline-start: .75rem;width:var(--nice-colorpicker-width, 100%)}.mat-mdc-form-field:has(nice-colorpicker) .nice-colorpicker__swatch{display:inline-block;flex-shrink:0;width:var(--nice-colorpicker-swatch-size, 1.25rem);height:var(--nice-colorpicker-swatch-size, 1.25rem);border:1px solid var(--nice-colorpicker-swatch-border-color, rgba(0, 0, 0, .38));border-radius:50%;background-color:var(--nice-colorpicker-swatch-color, transparent)}.mat-mdc-form-field:has(nice-colorpicker) .nice-colorpicker__swatch--empty{background-color:transparent;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-position:0 0,0 4px,4px -4px,-4px 0;background-size:8px 8px}.mat-mdc-form-field:has(nice-colorpicker) .nice-colorpicker__text-input{flex:1;min-width:0;padding:0;border:none;outline:none;background:transparent;color:inherit;font:inherit;cursor:var(--nice-colorpicker-input-cursor, text)}.mat-mdc-form-field:has(nice-colorpicker-toggle){--nice-field-suffix-icon-size: var(--nice-colorpicker-icon-size, 1.5rem)}.mat-mdc-form-field:has(nice-colorpicker-toggle) .nice-colorpicker-toggle{color:var(--nice-colorpicker-icon-color, inherit)}.mat-mdc-form-field:has(nice-colorpicker-toggle) .nice-colorpicker-toggle[disabled]{color:var(--nice-colorpicker-disabled-icon-color, inherit)}.mat-mdc-form-field:has(nice-colorpicker-toggle).mat-form-field-invalid .nice-colorpicker-toggle{color:var(--nice-colorpicker-invalid-icon-color, inherit)}\n"], dependencies: [{ kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
148
|
+
}
|
|
149
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceColorpicker, decorators: [{
|
|
150
|
+
type: Component,
|
|
151
|
+
args: [{ selector: "nice-colorpicker", imports: [FormField], encapsulation: ViewEncapsulation.None, providers: [{ provide: MatFormFieldControl, useExisting: NiceColorpicker }], host: {
|
|
152
|
+
class: "nice-colorpicker",
|
|
153
|
+
"[class.nice-colorpicker--focused]": "focused",
|
|
154
|
+
"[class.nice-colorpicker--empty]": "empty",
|
|
155
|
+
"[class.nice-colorpicker--invalid]": "errorState",
|
|
156
|
+
"[attr.aria-invalid]": "errorState",
|
|
157
|
+
"[id]": "id"
|
|
158
|
+
}, template: "@if (showSwatch()) {\n <span\n class=\"nice-colorpicker__swatch\"\n aria-hidden=\"true\"\n [class.nice-colorpicker__swatch--empty]=\"!swatchColor()\"\n [style.--nice-colorpicker-swatch-color]=\"swatchColor()\"\n ></span>\n}\n\n<input\n #textInput\n class=\"nice-colorpicker__text-input\"\n [formField]=\"field()\"\n (blur)=\"onInputBlur()\"\n (focus)=\"isInputFocused.set(true)\"\n/>\n", styles: ["nice-colorpicker{display:flex;align-items:center;width:100%;min-width:0;gap:.5rem}.mat-mdc-form-field:has(nice-colorpicker){--nice-colorpicker-prefix-padding-inline-start: .75rem;width:var(--nice-colorpicker-width, 100%)}.mat-mdc-form-field:has(nice-colorpicker) .nice-colorpicker__swatch{display:inline-block;flex-shrink:0;width:var(--nice-colorpicker-swatch-size, 1.25rem);height:var(--nice-colorpicker-swatch-size, 1.25rem);border:1px solid var(--nice-colorpicker-swatch-border-color, rgba(0, 0, 0, .38));border-radius:50%;background-color:var(--nice-colorpicker-swatch-color, transparent)}.mat-mdc-form-field:has(nice-colorpicker) .nice-colorpicker__swatch--empty{background-color:transparent;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-position:0 0,0 4px,4px -4px,-4px 0;background-size:8px 8px}.mat-mdc-form-field:has(nice-colorpicker) .nice-colorpicker__text-input{flex:1;min-width:0;padding:0;border:none;outline:none;background:transparent;color:inherit;font:inherit;cursor:var(--nice-colorpicker-input-cursor, text)}.mat-mdc-form-field:has(nice-colorpicker-toggle){--nice-field-suffix-icon-size: var(--nice-colorpicker-icon-size, 1.5rem)}.mat-mdc-form-field:has(nice-colorpicker-toggle) .nice-colorpicker-toggle{color:var(--nice-colorpicker-icon-color, inherit)}.mat-mdc-form-field:has(nice-colorpicker-toggle) .nice-colorpicker-toggle[disabled]{color:var(--nice-colorpicker-disabled-icon-color, inherit)}.mat-mdc-form-field:has(nice-colorpicker-toggle).mat-form-field-invalid .nice-colorpicker-toggle{color:var(--nice-colorpicker-invalid-icon-color, inherit)}\n"] }]
|
|
159
|
+
}], ctorParameters: () => [], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], textInput: [{ type: i0.ViewChild, args: ["textInput", { isSignal: true }] }] } });
|
|
160
|
+
|
|
161
|
+
const NICE_COLORPICKER_CONFIG = new InjectionToken("nice_colorpicker_config");
|
|
162
|
+
|
|
163
|
+
class NiceColorpickerToggle {
|
|
164
|
+
config = inject(NICE_COLORPICKER_CONFIG);
|
|
165
|
+
field = input.required(/* @ts-ignore */
|
|
166
|
+
...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
|
|
167
|
+
isPickerOpen = signal(false, /* @ts-ignore */
|
|
168
|
+
...(ngDevMode ? [{ debugName: "isPickerOpen" }] : /* istanbul ignore next */ []));
|
|
169
|
+
overlayPositions = [
|
|
170
|
+
{
|
|
171
|
+
originX: "end",
|
|
172
|
+
originY: "bottom",
|
|
173
|
+
overlayX: "end",
|
|
174
|
+
overlayY: "top",
|
|
175
|
+
offsetY: 8
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
originX: "end",
|
|
179
|
+
originY: "top",
|
|
180
|
+
overlayX: "end",
|
|
181
|
+
overlayY: "bottom",
|
|
182
|
+
offsetY: -8
|
|
183
|
+
}
|
|
184
|
+
];
|
|
185
|
+
paletteIcon = this.config.paletteIcon;
|
|
186
|
+
isDisabled = computed(() => this.field()().disabled(), /* @ts-ignore */
|
|
187
|
+
...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
188
|
+
pickerColor = computed(() => {
|
|
189
|
+
const value = this.field()().value();
|
|
190
|
+
return value || "#000000";
|
|
191
|
+
}, /* @ts-ignore */
|
|
192
|
+
...(ngDevMode ? [{ debugName: "pickerColor" }] : /* istanbul ignore next */ []));
|
|
193
|
+
closePicker() {
|
|
194
|
+
this.isPickerOpen.set(false);
|
|
195
|
+
}
|
|
196
|
+
onPickerChange(event) {
|
|
197
|
+
this.field()().value.set(event.color.hex);
|
|
198
|
+
}
|
|
199
|
+
togglePicker(event) {
|
|
200
|
+
event.stopPropagation();
|
|
201
|
+
if (this.isDisabled()) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
this.isPickerOpen.update((open) => !open);
|
|
205
|
+
}
|
|
206
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceColorpickerToggle, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
207
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NiceColorpickerToggle, isStandalone: true, selector: "nice-colorpicker-toggle", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "nice-colorpicker-toggle" }, ngImport: i0, template: "<button\n #overlayOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n mat-icon-button\n type=\"button\"\n [attr.aria-label]=\"isPickerOpen() ? 'Close color picker' : 'Open color picker'\"\n [disabled]=\"isDisabled()\"\n (click)=\"togglePicker($event)\"\n>\n @if (paletteIcon) {\n <mat-icon [svgIcon]=\"paletteIcon\" />\n } @else {\n <mat-icon>palette</mat-icon>\n }\n</button>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOpen]=\"isPickerOpen()\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"'nice-colorpicker__overlay-panel'\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n (backdropClick)=\"closePicker()\"\n (detach)=\"closePicker()\"\n>\n <div class=\"nice-colorpicker__panel\">\n <color-chrome [color]=\"pickerColor()\" [disableAlpha]=\"true\" (onChange)=\"onPickerChange($event)\" />\n </div>\n</ng-template>\n", styles: [".nice-colorpicker-toggle{display:inline-flex}.nice-colorpicker__overlay-panel{z-index:1000}.nice-colorpicker__panel{overflow:hidden;border-radius:4px;background:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: ColorChromeModule }, { kind: "component", type: i1.ChromeComponent, selector: "color-chrome", inputs: ["disableAlpha"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
208
|
+
}
|
|
209
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceColorpickerToggle, decorators: [{
|
|
210
|
+
type: Component,
|
|
211
|
+
args: [{ selector: "nice-colorpicker-toggle", imports: [CdkConnectedOverlay, CdkOverlayOrigin, ColorChromeModule, MatIcon, MatIconButton], encapsulation: ViewEncapsulation.None, host: {
|
|
212
|
+
class: "nice-colorpicker-toggle"
|
|
213
|
+
}, template: "<button\n #overlayOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n mat-icon-button\n type=\"button\"\n [attr.aria-label]=\"isPickerOpen() ? 'Close color picker' : 'Open color picker'\"\n [disabled]=\"isDisabled()\"\n (click)=\"togglePicker($event)\"\n>\n @if (paletteIcon) {\n <mat-icon [svgIcon]=\"paletteIcon\" />\n } @else {\n <mat-icon>palette</mat-icon>\n }\n</button>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOpen]=\"isPickerOpen()\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"'nice-colorpicker__overlay-panel'\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n (backdropClick)=\"closePicker()\"\n (detach)=\"closePicker()\"\n>\n <div class=\"nice-colorpicker__panel\">\n <color-chrome [color]=\"pickerColor()\" [disableAlpha]=\"true\" (onChange)=\"onPickerChange($event)\" />\n </div>\n</ng-template>\n", styles: [".nice-colorpicker-toggle{display:inline-flex}.nice-colorpicker__overlay-panel{z-index:1000}.nice-colorpicker__panel{overflow:hidden;border-radius:4px;background:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}\n"] }]
|
|
214
|
+
}], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }] } });
|
|
215
|
+
|
|
216
|
+
const defaultConfig = {
|
|
217
|
+
invalidFormatKey: "errors.colorpicker.invalidFormat"
|
|
218
|
+
};
|
|
219
|
+
function provideColorpicker(options = { config: defaultConfig }) {
|
|
220
|
+
return [
|
|
221
|
+
{
|
|
222
|
+
provide: NICE_COLORPICKER_CONFIG,
|
|
223
|
+
useValue: options.config
|
|
224
|
+
}
|
|
225
|
+
];
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* Public API Surface of colorpicker
|
|
230
|
+
*/
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Generated bundle index. Do not edit.
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
export { NICE_COLOR_PARSE_ERROR_KIND, NiceColorpicker, NiceColorpickerToggle, defaultConfig as defaultColorpickerConfig, hasNiceColorFormatError, isValidNiceColor, niceColorFieldErrorState, niceColorFormat, normalizeNiceColor, provideColorpicker, registerNiceColorFormatValidation, registerNiceColorpickerValidation };
|
|
237
|
+
//# sourceMappingURL=recursyve-ngx-material-components-colorpicker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursyve-ngx-material-components-colorpicker.mjs","sources":["../../../src/material-components/colorpicker/color-validation.ts","../../../src/material-components/colorpicker/field-error-state.ts","../../../src/material-components/colorpicker/colorpicker.ts","../../../src/material-components/colorpicker/colorpicker.html","../../../src/material-components/colorpicker/constant.ts","../../../src/material-components/colorpicker/colorpicker-toggle.ts","../../../src/material-components/colorpicker/colorpicker-toggle.html","../../../src/material-components/colorpicker/provider.ts","../../../src/material-components/colorpicker/index.ts","../../../src/material-components/colorpicker/recursyve-ngx-material-components-colorpicker.ts"],"sourcesContent":["import { validate, type FieldTree, type SchemaPath } from \"@angular/forms/signals\";\nimport { TinyColor } from \"@ctrl/tinycolor\";\n\nconst registeredFields = new WeakSet<object>();\n\nexport const NICE_COLOR_PARSE_ERROR_KIND = \"parse\";\n\nexport function isValidNiceColor(value: string | null | undefined): boolean {\n const normalized = value?.trim();\n\n if (!normalized) {\n return true;\n }\n\n return new TinyColor(normalized).isValid;\n}\n\nexport function normalizeNiceColor(value: string): string | null {\n const normalized = value.trim();\n\n if (!normalized) {\n return null;\n }\n\n const color = new TinyColor(normalized);\n\n return color.isValid ? color.toHexString() : null;\n}\n\nexport function niceColorFormat(path: FieldTree<string> | SchemaPath<string>, message: string): void {\n validate(path as SchemaPath<string>, ({ value }) => {\n const current = value()?.trim() ?? \"\";\n\n if (!current || isValidNiceColor(current)) {\n return undefined;\n }\n\n return { kind: NICE_COLOR_PARSE_ERROR_KIND, message };\n });\n}\n\nexport function registerNiceColorFormatValidation(field: FieldTree<string>, message: string): void {\n if (registeredFields.has(field)) {\n return;\n }\n\n registeredFields.add(field);\n niceColorFormat(field, message);\n}\n\n/** @deprecated Use {@link niceColorFormat} in the `form()` schema callback instead. */\nexport const registerNiceColorpickerValidation = registerNiceColorFormatValidation;\n","import type { FieldState } from \"@angular/forms/signals\";\n\nimport { isValidNiceColor } from \"./color-validation\";\n\nexport function hasNiceColorFormatError(value: string | null | undefined): boolean {\n const normalized = value?.trim() ?? \"\";\n\n return normalized !== \"\" && !isValidNiceColor(normalized);\n}\n\nexport function niceColorFieldErrorState(state: FieldState<string>): boolean {\n if (!state.touched() && !state.dirty()) {\n return false;\n }\n\n if (hasNiceColorFormatError(state.value())) {\n return true;\n }\n\n return state.invalid();\n}\n","import type { ElementRef } from \"@angular/core\";\nimport { Component, computed, effect, input, signal, untracked, viewChild, ViewEncapsulation } from \"@angular/core\";\nimport type { FieldTree } from \"@angular/forms/signals\";\nimport { FormField } from \"@angular/forms/signals\";\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport { Subject } from \"rxjs\";\nimport { normalizeNiceColor } from \"./color-validation\";\nimport { niceColorFieldErrorState } from \"./field-error-state\";\n\n@Component({\n selector: \"nice-colorpicker\",\n imports: [FormField],\n templateUrl: \"./colorpicker.html\",\n styleUrl: \"./colorpicker.scss\",\n encapsulation: ViewEncapsulation.None,\n providers: [{ provide: MatFormFieldControl, useExisting: NiceColorpicker }],\n host: {\n class: \"nice-colorpicker\",\n \"[class.nice-colorpicker--focused]\": \"focused\",\n \"[class.nice-colorpicker--empty]\": \"empty\",\n \"[class.nice-colorpicker--invalid]\": \"errorState\",\n \"[attr.aria-invalid]\": \"errorState\",\n \"[id]\": \"id\"\n }\n})\nexport class NiceColorpicker implements MatFormFieldControl<string> {\n private static nextId = 0;\n\n public readonly field = input.required<FieldTree<string>>();\n\n public readonly id = `nice-colorpicker-${NiceColorpicker.nextId++}`;\n public readonly controlType = \"nice-colorpicker\";\n public readonly stateChanges = new Subject<void>();\n public readonly ngControl = null;\n public readonly placeholder = \"\";\n public readonly required = false;\n\n private readonly textInput = viewChild<ElementRef<HTMLInputElement>>(\"textInput\");\n\n protected readonly isInputFocused = signal(false);\n\n protected readonly swatchColor = computed(() => {\n const value = this.field()().value()?.trim();\n if (!value) {\n return null;\n }\n\n return normalizeNiceColor(value);\n });\n\n protected readonly showSwatch = computed(() => {\n const hasValue = !!this.field()().value()?.trim();\n return hasValue || this.isInputFocused();\n });\n\n public get value(): string | null {\n return this.field()().value() || null;\n }\n\n public get focused(): boolean {\n return this.isInputFocused();\n }\n\n public get empty(): boolean {\n return !this.field()().value()?.trim();\n }\n\n public get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n public get disabled(): boolean {\n return this.field()().disabled();\n }\n\n public get errorState(): boolean {\n return niceColorFieldErrorState(this.field()());\n }\n\n constructor() {\n effect(() => {\n const state = this.field()();\n state.value();\n state.disabled();\n state.invalid();\n state.touched();\n state.dirty();\n this.isInputFocused();\n\n untracked(() => this.stateChanges.next());\n });\n }\n\n public setDescribedByIds(ids: string[]): void {\n const input = this.textInput()?.nativeElement;\n if (!input) {\n return;\n }\n\n if (ids.length) {\n input.setAttribute(\"aria-describedby\", ids.join(\" \"));\n } else {\n input.removeAttribute(\"aria-describedby\");\n }\n }\n\n public onContainerClick(): void {\n if (this.disabled) {\n return;\n }\n\n this.textInput()?.nativeElement.focus();\n }\n\n protected onInputBlur(): void {\n this.isInputFocused.set(false);\n\n const state = this.field()();\n const normalized = normalizeNiceColor(state.value() ?? \"\");\n\n if (normalized) {\n state.value.set(normalized);\n }\n }\n}\n","@if (showSwatch()) {\n <span\n class=\"nice-colorpicker__swatch\"\n aria-hidden=\"true\"\n [class.nice-colorpicker__swatch--empty]=\"!swatchColor()\"\n [style.--nice-colorpicker-swatch-color]=\"swatchColor()\"\n ></span>\n}\n\n<input\n #textInput\n class=\"nice-colorpicker__text-input\"\n [formField]=\"field()\"\n (blur)=\"onInputBlur()\"\n (focus)=\"isInputFocused.set(true)\"\n/>\n","import { InjectionToken } from \"@angular/core\";\nimport { NiceColorpickerConfig } from \"./config\";\n\nexport const NICE_COLORPICKER_CONFIG = new InjectionToken<NiceColorpickerConfig>(\"nice_colorpicker_config\");\n","import type { ConnectedPosition } from \"@angular/cdk/overlay\";\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from \"@angular/cdk/overlay\";\nimport { Component, computed, inject, input, signal, ViewEncapsulation } from \"@angular/core\";\nimport type { FieldTree } from \"@angular/forms/signals\";\nimport { MatIconButton } from \"@angular/material/button\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport type { ColorEvent } from \"ngx-color\";\nimport { ColorChromeModule } from \"ngx-color/chrome\";\nimport { NICE_COLORPICKER_CONFIG } from \"./constant\";\n\n@Component({\n selector: \"nice-colorpicker-toggle\",\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, ColorChromeModule, MatIcon, MatIconButton],\n templateUrl: \"./colorpicker-toggle.html\",\n styleUrl: \"./colorpicker-toggle.scss\",\n encapsulation: ViewEncapsulation.None,\n host: {\n class: \"nice-colorpicker-toggle\"\n }\n})\nexport class NiceColorpickerToggle {\n private readonly config = inject(NICE_COLORPICKER_CONFIG);\n\n public readonly field = input.required<FieldTree<string>>();\n\n protected readonly isPickerOpen = signal(false);\n\n protected readonly overlayPositions: ConnectedPosition[] = [\n {\n originX: \"end\",\n originY: \"bottom\",\n overlayX: \"end\",\n overlayY: \"top\",\n offsetY: 8\n },\n {\n originX: \"end\",\n originY: \"top\",\n overlayX: \"end\",\n overlayY: \"bottom\",\n offsetY: -8\n }\n ];\n\n protected readonly paletteIcon = this.config.paletteIcon;\n\n protected readonly isDisabled = computed(() => this.field()().disabled());\n\n protected readonly pickerColor = computed(() => {\n const value = this.field()().value();\n return value || \"#000000\";\n });\n\n protected closePicker(): void {\n this.isPickerOpen.set(false);\n }\n\n protected onPickerChange(event: ColorEvent): void {\n this.field()().value.set(event.color.hex);\n }\n\n protected togglePicker(event: MouseEvent): void {\n event.stopPropagation();\n\n if (this.isDisabled()) {\n return;\n }\n\n this.isPickerOpen.update((open) => !open);\n }\n}\n","<button\n #overlayOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n mat-icon-button\n type=\"button\"\n [attr.aria-label]=\"isPickerOpen() ? 'Close color picker' : 'Open color picker'\"\n [disabled]=\"isDisabled()\"\n (click)=\"togglePicker($event)\"\n>\n @if (paletteIcon) {\n <mat-icon [svgIcon]=\"paletteIcon\" />\n } @else {\n <mat-icon>palette</mat-icon>\n }\n</button>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOpen]=\"isPickerOpen()\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"'nice-colorpicker__overlay-panel'\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n (backdropClick)=\"closePicker()\"\n (detach)=\"closePicker()\"\n>\n <div class=\"nice-colorpicker__panel\">\n <color-chrome [color]=\"pickerColor()\" [disableAlpha]=\"true\" (onChange)=\"onPickerChange($event)\" />\n </div>\n</ng-template>\n","import { Provider } from \"@angular/core\";\nimport { NiceColorpickerConfig } from \"./config\";\nimport { NICE_COLORPICKER_CONFIG } from \"./constant\";\nimport { NiceColorpickerOptions } from \"./options\";\n\nconst defaultConfig: NiceColorpickerConfig = {\n invalidFormatKey: \"errors.colorpicker.invalidFormat\"\n};\n\nexport { defaultConfig as defaultColorpickerConfig };\n\nexport function provideColorpicker(options: NiceColorpickerOptions = { config: defaultConfig }): Provider[] {\n return [\n {\n provide: NICE_COLORPICKER_CONFIG,\n useValue: options.config\n }\n ];\n}\n","/*\n * Public API Surface of colorpicker\n */\n\nexport * from \"./colorpicker\";\nexport * from \"./colorpicker-toggle\";\nexport * from \"./color-validation\";\nexport * from \"./field-error-state\";\nexport * from \"./config\";\nexport * from \"./options\";\nexport * from \"./provider\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|