@recursyve/ngx-material-components 22.1.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.
@@ -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":"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"}
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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"}