@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 @@
1
+ {"version":3,"file":"recursyve-ngx-material-components-timepicker.mjs","sources":["../../../src/material-components/timepicker/constant.ts","../../../src/material-components/timepicker/time-utils.ts","../../../src/material-components/timepicker/provider.ts","../../../src/material-components/timepicker/time-format-validation.ts","../../../src/material-components/timepicker/field-error-state.ts","../../../src/material-components/timepicker/timepicker.ts","../../../src/material-components/timepicker/timepicker.html","../../../src/material-components/timepicker/timepicker-face.ts","../../../src/material-components/timepicker/timepicker-face.html","../../../src/material-components/timepicker/timepicker-dialog.ts","../../../src/material-components/timepicker/timepicker-dialog.html","../../../src/material-components/timepicker/timepicker-toggle.ts","../../../src/material-components/timepicker/timepicker-toggle.html","../../../src/material-components/timepicker/index.ts","../../../src/material-components/timepicker/recursyve-ngx-material-components-timepicker.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { NiceTimepickerConfig } from \"./config\";\n\nexport const NICE_TIMEPICKER_CONFIG = new InjectionToken<NiceTimepickerConfig>(\"nice_timepicker_config\");\n","export type TimePeriod = \"AM\" | \"PM\";\n\nexport type ParsedTime = {\n hour: number;\n minute: number;\n period: TimePeriod;\n};\n\nexport type ClockFaceOption = {\n angle: number;\n value: number;\n};\n\nexport const DEFAULT_MINUTES_GAP = 1;\nexport const DEFAULT_MINUTE_LABEL_GAP = 5;\n\nconst TWELVE_HOUR_PATTERN = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i;\nconst TWENTY_FOUR_HOUR_PATTERN = /^(\\d{1,2}):(\\d{2})$/;\n\nexport function parseTime(value: string | null | undefined): ParsedTime | null {\n const normalized = value?.trim();\n if (!normalized) {\n return null;\n }\n\n const twelveHourMatch = normalized.match(TWELVE_HOUR_PATTERN);\n if (twelveHourMatch) {\n const hour = Number(twelveHourMatch[1]);\n const minute = Number(twelveHourMatch[2]);\n const period = twelveHourMatch[3].toUpperCase() as TimePeriod;\n\n if (!isValidTwelveHourTime(hour, minute)) {\n return null;\n }\n\n return { hour, minute, period };\n }\n\n const twentyFourHourMatch = normalized.match(TWENTY_FOUR_HOUR_PATTERN);\n if (twentyFourHourMatch) {\n const hour24 = Number(twentyFourHourMatch[1]);\n const minute = Number(twentyFourHourMatch[2]);\n\n if (hour24 > 23 || minute > 59) {\n return null;\n }\n\n const period: TimePeriod = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour = toTwelveHour(hour24);\n\n return { hour, minute, period };\n }\n\n return null;\n}\n\nexport function formatTime(time: ParsedTime): string {\n return `${time.hour}:${pad(time.minute)} ${time.period}`;\n}\n\nexport function getDefaultTime(): ParsedTime {\n const now = new Date();\n const hour24 = now.getHours();\n\n return {\n hour: toTwelveHour(hour24),\n minute: now.getMinutes(),\n period: hour24 >= 12 ? \"PM\" : \"AM\"\n };\n}\n\nexport function resolveTime(value: string | null | undefined): ParsedTime {\n return parseTime(value) ?? getDefaultTime();\n}\n\nexport function getHourFaceOptions(): ClockFaceOption[] {\n return Array.from({ length: 12 }, (_, index) => {\n const value = index + 1;\n const angle = 30 * value;\n\n return {\n value,\n angle\n };\n });\n}\n\nexport function getMinuteFaceOptions(minutesGap = DEFAULT_MINUTES_GAP): ClockFaceOption[] {\n const options: ClockFaceOption[] = [];\n const angleStep = 360 / 60;\n\n for (let minute = 0; minute < 60; minute++) {\n if (minute % minutesGap !== 0) {\n continue;\n }\n\n const angle = angleStep * minute;\n\n options.push({\n value: minute,\n angle: angle === 0 ? 360 : angle\n });\n }\n\n return options;\n}\n\nexport function isMinuteLabelVisible(minute: number, minutesGap = DEFAULT_MINUTES_GAP): boolean {\n return minute % minutesGap === 0;\n}\n\nexport function getMinuteLabelGap(minutesGap: number, dottedMinutesInGap: boolean): number {\n if (minutesGap > 1) {\n return minutesGap;\n }\n\n return dottedMinutesInGap ? DEFAULT_MINUTE_LABEL_GAP : 1;\n}\n\nfunction isValidTwelveHourTime(hour: number, minute: number): boolean {\n return hour >= 1 && hour <= 12 && minute >= 0 && minute <= 59;\n}\n\nfunction toTwelveHour(hour24: number): number {\n const hour = hour24 % 12;\n return hour === 0 ? 12 : hour;\n}\n\nfunction pad(value: number): string {\n return value.toString().padStart(2, \"0\");\n}\n","import { Provider } from \"@angular/core\";\nimport { NiceTimepickerConfig } from \"./config\";\nimport { NICE_TIMEPICKER_CONFIG } from \"./constant\";\nimport { NiceTimepickerOptions } from \"./options\";\nimport { DEFAULT_MINUTES_GAP } from \"./time-utils\";\n\nconst defaultTranslationKeys: NiceTimepickerConfig[\"translationKeys\"] = {\n cancel: \"components.timepicker.cancel\",\n confirm: \"components.timepicker.confirm\",\n title: \"components.timepicker.title\"\n};\n\nconst defaultConfig: NiceTimepickerConfig = {\n dottedMinutesInGap: true,\n minutesGap: DEFAULT_MINUTES_GAP,\n invalidFormatKey: \"errors.timepicker.invalidFormat\",\n translationKeys: defaultTranslationKeys\n};\n\nexport { defaultConfig as defaultTimepickerConfig };\n\nexport function provideTimepicker(options?: NiceTimepickerOptions): Provider[] {\n return [\n {\n provide: NICE_TIMEPICKER_CONFIG,\n useValue: {\n ...defaultConfig,\n ...options?.config,\n translationKeys: {\n ...defaultTranslationKeys,\n ...options?.config?.translationKeys\n }\n }\n }\n ];\n}\n","import { validate, type FieldTree, type SchemaPath } from \"@angular/forms/signals\";\nimport { formatTime, parseTime } from \"./time-utils\";\n\nconst registeredFields = new WeakSet<object>();\n\nexport const NICE_TIME_PARSE_ERROR_KIND = \"parse\";\n\nexport function isValidNiceTime(value: string | null | undefined): boolean {\n const normalized = value?.trim();\n\n if (!normalized) {\n return true;\n }\n\n return parseTime(normalized) !== null;\n}\n\nexport function normalizeNiceTime(value: string): string | null {\n const parsed = parseTime(value);\n\n return parsed ? formatTime(parsed) : null;\n}\n\nexport function niceTimeFormat(path: FieldTree<string> | SchemaPath<string>, message: string): void {\n validate(path as SchemaPath<string>, ({ value }) => {\n const current = value()?.trim() ?? \"\";\n\n if (!current || isValidNiceTime(current)) {\n return undefined;\n }\n\n return { kind: NICE_TIME_PARSE_ERROR_KIND, message };\n });\n}\n\nexport function registerNiceTimeFormatValidation(field: FieldTree<string>, message: string): void {\n if (registeredFields.has(field)) {\n return;\n }\n\n registeredFields.add(field);\n niceTimeFormat(field, message);\n}\n","import type { FieldState } from \"@angular/forms/signals\";\n\nimport { isValidNiceTime } from \"./time-format-validation\";\n\nexport function hasNiceTimeFormatError(value: string | null | undefined): boolean {\n const normalized = value?.trim() ?? \"\";\n\n return normalized !== \"\" && !isValidNiceTime(normalized);\n}\n\nexport function niceTimeFieldErrorState(state: FieldState<string>): boolean {\n if (!state.touched() && !state.dirty()) {\n return false;\n }\n\n if (hasNiceTimeFormatError(state.value())) {\n return true;\n }\n\n return state.invalid();\n}\n","import type { ElementRef } from \"@angular/core\";\nimport { Component, 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 { niceTimeFieldErrorState } from \"./field-error-state\";\nimport { normalizeNiceTime } from \"./time-format-validation\";\n\n@Component({\n selector: \"nice-timepicker\",\n imports: [FormField],\n templateUrl: \"./timepicker.html\",\n styleUrl: \"./timepicker.scss\",\n encapsulation: ViewEncapsulation.None,\n providers: [{ provide: MatFormFieldControl, useExisting: NiceTimepicker }],\n host: {\n class: \"nice-timepicker\",\n \"[class.nice-timepicker--focused]\": \"focused\",\n \"[class.nice-timepicker--empty]\": \"empty\",\n \"[class.nice-timepicker--invalid]\": \"errorState\",\n \"[attr.aria-invalid]\": \"errorState\",\n \"[id]\": \"id\"\n }\n})\nexport class NiceTimepicker implements MatFormFieldControl<string> {\n private static nextId = 0;\n\n public readonly field = input.required<FieldTree<string>>();\n\n public readonly id = `nice-timepicker-${NiceTimepicker.nextId++}`;\n public readonly controlType = \"nice-timepicker\";\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 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 niceTimeFieldErrorState(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 = normalizeNiceTime(state.value() ?? \"\");\n\n if (normalized) {\n state.value.set(normalized);\n }\n }\n}\n","<input\n #textInput\n class=\"nice-timepicker__text-input\"\n [formField]=\"field()\"\n (blur)=\"onInputBlur()\"\n (focus)=\"isInputFocused.set(true)\"\n/>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n HostListener,\n input,\n output,\n viewChild,\n ViewEncapsulation\n} from \"@angular/core\";\nimport { MatMiniFabButton } from \"@angular/material/button\";\nimport { MatToolbar } from \"@angular/material/toolbar\";\n\nimport { ClockFaceOption, DEFAULT_MINUTES_GAP, getMinuteLabelGap, isMinuteLabelVisible } from \"./time-utils\";\n\ntype TimepickerFaceUnit = \"hour\" | \"minute\";\n\nfunction roundAngle(angle: number, step: number): number {\n return Math.round(angle / step) * step;\n}\n\nfunction countAngleByCords(x0: number, y0: number, x: number, y: number, currentAngle: number): number {\n if (y > y0 && x >= x0) {\n return 180 - currentAngle;\n }\n\n if (y > y0 && x < x0) {\n return 180 + currentAngle;\n }\n\n if (y < y0 && x < x0) {\n return 360 - currentAngle;\n }\n\n return currentAngle;\n}\n\n@Component({\n selector: \"nice-timepicker-face\",\n imports: [MatMiniFabButton, MatToolbar],\n templateUrl: \"./timepicker-face.html\",\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NiceTimepickerFace implements AfterViewInit {\n public readonly dottedMinutesInGap = input(true);\n public readonly faceTime = input.required<ClockFaceOption[]>();\n public readonly minutesGap = input(DEFAULT_MINUTES_GAP);\n public readonly selectedValue = input.required<number>();\n public readonly unit = input.required<TimepickerFaceUnit>();\n\n public readonly timeChange = output<number>();\n public readonly timeSelected = output<number>();\n\n private readonly clockFace = viewChild.required<ElementRef<HTMLElement>>(\"clockFace\");\n\n private isDragging = false;\n private touchEndHandler?: (event: Event) => void;\n private touchStartHandler?: (event: Event) => void;\n\n protected readonly selectedTime = computed(() => {\n const match = this.faceTime().find((time) => time.value === this.selectedValue());\n\n if (match) {\n return match;\n }\n\n const fallbackAngle = this.unit() === \"hour\" ? 30 * this.selectedValue() : 6 * this.selectedValue();\n\n return {\n value: this.selectedValue(),\n angle: fallbackAngle === 0 ? 360 : fallbackAngle\n };\n });\n\n protected readonly showSelectionFab = computed(() => {\n if (this.unit() !== \"minute\") {\n return false;\n }\n\n const labelGap = getMinuteLabelGap(this.minutesGap(), this.dottedMinutesInGap());\n\n return !isMinuteLabelVisible(this.selectedValue(), labelGap);\n });\n\n private static readonly FAB_OVERLAP_THRESHOLD_DEG = 13;\n\n protected readonly optionsUnderFab = computed(() => {\n const result = new Set<number>();\n\n if (!this.showSelectionFab()) {\n return result;\n }\n\n const fabAngle = this.selectedTime().angle;\n\n for (const option of this.faceTime()) {\n let diff = Math.abs(fabAngle - option.angle);\n if (diff > 180) {\n diff = 360 - diff;\n }\n if (diff <= NiceTimepickerFace.FAB_OVERLAP_THRESHOLD_DEG) {\n result.add(option.value);\n }\n }\n\n return result;\n });\n\n public ngAfterViewInit(): void {\n this.addTouchEvents();\n }\n\n @HostListener(\"mousedown\", [\"$event\"])\n protected onMouseDown(event: MouseEvent): void {\n event.preventDefault();\n this.isDragging = true;\n }\n\n @HostListener(\"mouseup\", [\"$event\"])\n protected onMouseUp(event: MouseEvent): void {\n event.preventDefault();\n this.isDragging = false;\n }\n\n @HostListener(\"click\", [\"$event\"])\n @HostListener(\"mousemove\", [\"$event\"])\n protected onMousePointer(event: MouseEvent): void {\n if (!this.isDragging && event.type !== \"click\") {\n return;\n }\n\n this.selectTime(event.clientX, event.clientY, !this.isDragging);\n }\n\n @HostListener(\"touchmove\", [\"$event\"])\n @HostListener(\"touchend\", [\"$event\"])\n protected onTouchPointer(event: TouchEvent): void {\n const touch = event.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n if (!this.isDragging && event.type !== \"touchend\") {\n return;\n }\n\n this.selectTime(touch.clientX, touch.clientY, !this.isDragging);\n }\n\n protected formatOption(option: ClockFaceOption): string | null {\n if (this.unit() === \"minute\") {\n const labelGap = getMinuteLabelGap(this.minutesGap(), this.dottedMinutesInGap());\n\n if (!isMinuteLabelVisible(option.value, labelGap)) {\n return null;\n }\n\n return option.value.toString().padStart(2, \"0\");\n }\n\n return option.value.toString();\n }\n\n protected isFaceOptionHighlighted(option: ClockFaceOption): boolean {\n if (option.value !== this.selectedValue()) {\n return false;\n }\n\n if (this.unit() === \"minute\") {\n const labelGap = getMinuteLabelGap(this.minutesGap(), this.dottedMinutesInGap());\n\n return isMinuteLabelVisible(option.value, labelGap);\n }\n\n return true;\n }\n\n private selectTime(clientX: number, clientY: number, finalizeSelection: boolean): void {\n const clockFaceBounds = this.clockFace().nativeElement.getBoundingClientRect();\n const centerX = clockFaceBounds.left + clockFaceBounds.width / 2;\n const centerY = clockFaceBounds.top + clockFaceBounds.height / 2;\n const arctangent =\n (Math.atan(Math.abs(clientX - centerX) / Math.abs(clientY - centerY)) * 180) / Math.PI;\n const circleAngle = countAngleByCords(centerX, centerY, clientX, clientY, arctangent);\n const angleStep =\n this.unit() === \"minute\" ? 6 * (this.minutesGap() || 1) : 30;\n const roundedAngle = roundAngle(circleAngle, angleStep);\n const angle = roundedAngle || 360;\n const selectedTime = this.faceTime().find((time) => time.angle === angle);\n\n if (!selectedTime) {\n return;\n }\n\n this.timeChange.emit(selectedTime.value);\n\n if (finalizeSelection) {\n this.timeSelected.emit(selectedTime.value);\n }\n }\n\n private addTouchEvents(): void {\n const element = this.clockFace().nativeElement;\n this.touchStartHandler = (event: Event) => this.onMouseDown(event as MouseEvent);\n this.touchEndHandler = (event: Event) => this.onMouseUp(event as MouseEvent);\n\n element.addEventListener(\"touchstart\", this.touchStartHandler, { passive: false });\n element.addEventListener(\"touchend\", this.touchEndHandler);\n }\n}\n","<div class=\"clock-face\" #clockFace>\n <mat-toolbar\n class=\"clock-face__clock-hand\"\n [class.clock-face__clock-hand_minute]=\"unit() === 'minute'\"\n [style.transform]=\"'rotate(' + selectedTime().angle + 'deg)'\"\n ></mat-toolbar>\n\n <mat-toolbar class=\"clock-face__center\" color=\"primary\"></mat-toolbar>\n\n <div class=\"clock-face__container\">\n @if (unit() === \"hour\") {\n @for (option of faceTime(); track option.value) {\n <div\n class=\"clock-face__number clock-face__number--outer\"\n [style.transform]=\"'rotateZ(' + option.angle + 'deg)'\"\n >\n <button\n mat-mini-fab\n disableRipple\n type=\"button\"\n tabindex=\"-1\"\n class=\"mat-elevation-z0 nice-timepicker-face__button\"\n [color]=\"isFaceOptionHighlighted(option) ? 'primary' : undefined\"\n [style.transform]=\"'rotateZ(-' + option.angle + 'deg)'\"\n >\n {{ formatOption(option) }}\n </button>\n </div>\n }\n } @else {\n @for (option of faceTime(); track option.value) {\n @if (formatOption(option); as label) {\n <div\n class=\"clock-face__number clock-face__number--outer clock-face__number--labeled\"\n [style.transform]=\"'rotateZ(' + option.angle + 'deg)'\"\n >\n <button\n mat-mini-fab\n disableRipple\n type=\"button\"\n tabindex=\"-1\"\n class=\"mat-elevation-z0 nice-timepicker-face__button\"\n [class.nice-timepicker-face__button--under-fab]=\"optionsUnderFab().has(option.value)\"\n [color]=\"isFaceOptionHighlighted(option) ? 'primary' : undefined\"\n [style.transform]=\"'rotateZ(-' + option.angle + 'deg)'\"\n >\n {{ label }}\n </button>\n </div>\n }\n }\n }\n </div>\n\n @if (unit() === \"minute\" && showSelectionFab()) {\n <div\n class=\"clock-face__hand-fab-arm\"\n [style.transform]=\"'rotate(' + selectedTime().angle + 'deg)'\"\n >\n <button\n mat-mini-fab\n disableRipple\n color=\"primary\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"mat-elevation-z0 clock-face__clock-hand_minute-fab\"\n >\n <span class=\"clock-face__clock-hand_minute_dot\"></span>\n </button>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, signal, ViewEncapsulation } from \"@angular/core\";\nimport { MatButton } from \"@angular/material/button\";\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from \"@angular/material/dialog\";\nimport { MatToolbar } from \"@angular/material/toolbar\";\nimport { NiceTranslatePipe } from \"@recursyve/ngx-material-components/common\";\n\nimport type { ClockFaceOption, ParsedTime, TimePeriod } from \"./time-utils\";\nimport { formatTime, getHourFaceOptions, getMinuteFaceOptions, resolveTime } from \"./time-utils\";\nimport { NiceTimepickerFace } from \"./timepicker-face\";\n\nexport type NiceTimepickerDialogData = {\n cancelKey: string;\n confirmKey: string;\n dottedMinutesInGap: boolean;\n minutesGap: number;\n time: string;\n titleKey: string;\n};\n\ntype ActiveUnit = \"hour\" | \"minute\";\n\n@Component({\n selector: \"nice-timepicker-dialog\",\n imports: [MatDialogModule, MatToolbar, MatButton, NiceTimepickerFace, NiceTranslatePipe],\n templateUrl: \"./timepicker-dialog.html\",\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NiceTimepickerDialog {\n private readonly dialogRef = inject(MatDialogRef<NiceTimepickerDialog, string | undefined>);\n protected readonly data = inject<NiceTimepickerDialogData>(MAT_DIALOG_DATA);\n\n private readonly parsedTime = resolveTime(this.data.time);\n\n protected readonly activeUnit = signal<ActiveUnit>(\"hour\");\n protected readonly hour = signal(this.parsedTime.hour);\n protected readonly minute = signal(this.parsedTime.minute);\n protected readonly period = signal<TimePeriod>(this.parsedTime.period);\n\n protected readonly selectedHour = computed(() => this.hour().toString().padStart(2, \"0\"));\n protected readonly selectedMinute = computed(() => this.minute().toString().padStart(2, \"0\"));\n protected readonly selectedPeriod = computed(() => this.period());\n\n protected readonly faceOptions = computed((): ClockFaceOption[] => {\n if (this.activeUnit() === \"hour\") {\n return getHourFaceOptions();\n }\n\n return getMinuteFaceOptions(this.data.minutesGap);\n });\n\n protected cancel(): void {\n this.dialogRef.close();\n }\n\n protected confirm(): void {\n const time: ParsedTime = {\n hour: this.hour(),\n minute: this.minute(),\n period: this.period()\n };\n\n this.dialogRef.close(formatTime(time));\n }\n\n protected onFaceTimeChange(value: number): void {\n if (this.activeUnit() === \"hour\") {\n this.hour.set(value);\n return;\n }\n\n this.minute.set(value);\n }\n\n protected onFaceTimeSelected(value: number): void {\n this.onFaceTimeChange(value);\n\n if (this.activeUnit() === \"hour\") {\n this.activeUnit.set(\"minute\");\n }\n }\n\n protected setActiveUnit(unit: ActiveUnit): void {\n this.activeUnit.set(unit);\n }\n\n protected setPeriod(period: TimePeriod): void {\n this.period.set(period);\n }\n}\n","<div mat-dialog-content>\n <div class=\"timepicker\">\n <mat-toolbar class=\"timepicker-header\">\n <div class=\"timepicker-dial\">\n <p class=\"nice-timepicker-dialog-title\">{{ data.titleKey | niceTranslate }}</p>\n\n <div class=\"timepicker-dial__container\">\n <div class=\"timepicker-dial__time\">\n <button\n type=\"button\"\n class=\"timepicker-dial__control\"\n [class.active]=\"activeUnit() === 'hour'\"\n (click)=\"setActiveUnit('hour')\"\n >\n {{ selectedHour() }}\n </button>\n\n <span>:</span>\n\n <button\n type=\"button\"\n class=\"timepicker-dial__control\"\n [class.active]=\"activeUnit() === 'minute'\"\n (click)=\"setActiveUnit('minute')\"\n >\n {{ selectedMinute() }}\n </button>\n </div>\n\n <div class=\"timepicker-dial__period\">\n <button\n type=\"button\"\n class=\"timepicker-period__btn\"\n [class.active]=\"selectedPeriod() === 'AM'\"\n (click)=\"setPeriod('AM')\"\n >\n AM\n </button>\n\n <button\n type=\"button\"\n class=\"timepicker-period__btn\"\n [class.active]=\"selectedPeriod() === 'PM'\"\n (click)=\"setPeriod('PM')\"\n >\n PM\n </button>\n </div>\n </div>\n </div>\n </mat-toolbar>\n\n <div class=\"timepicker__main-content\">\n <div class=\"timepicker__body\">\n <nice-timepicker-face\n [dottedMinutesInGap]=\"data.dottedMinutesInGap\"\n [faceTime]=\"faceOptions()\"\n [minutesGap]=\"data.minutesGap\"\n [selectedValue]=\"activeUnit() === 'hour' ? hour() : minute()\"\n [unit]=\"activeUnit()\"\n (timeChange)=\"onFaceTimeChange($event)\"\n (timeSelected)=\"onFaceTimeSelected($event)\"\n />\n </div>\n </div>\n </div>\n</div>\n\n<div mat-dialog-actions>\n <button mat-button type=\"button\" (click)=\"cancel()\">\n {{ data.cancelKey | niceTranslate }}\n </button>\n\n <button mat-flat-button type=\"button\" (click)=\"confirm()\">\n {{ data.confirmKey | niceTranslate }}\n </button>\n</div>\n","import { Component, computed, DestroyRef, inject, input, ViewEncapsulation } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport type { FieldTree } from \"@angular/forms/signals\";\nimport { MatIconButton } from \"@angular/material/button\";\nimport { MatDialog } from \"@angular/material/dialog\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { NICE_TIMEPICKER_CONFIG } from \"./constant\";\nimport { NiceTimepickerDialog } from \"./timepicker-dialog\";\n\n@Component({\n selector: \"nice-timepicker-toggle\",\n imports: [MatIcon, MatIconButton],\n templateUrl: \"./timepicker-toggle.html\",\n styleUrl: \"./timepicker-toggle.scss\",\n encapsulation: ViewEncapsulation.None,\n host: {\n class: \"nice-timepicker-toggle\"\n }\n})\nexport class NiceTimepickerToggle {\n private readonly config = inject(NICE_TIMEPICKER_CONFIG);\n private readonly dialog = inject(MatDialog);\n private readonly destroyRef = inject(DestroyRef);\n\n public readonly field = input.required<FieldTree<string>>();\n\n protected readonly toggleIcon = this.config.toggleIcon;\n protected readonly translationKeys = this.config.translationKeys;\n\n protected readonly isDisabled = computed(() => this.field()().disabled());\n\n protected openPicker(event: MouseEvent): void {\n event.stopPropagation();\n\n if (this.isDisabled()) {\n return;\n }\n\n const dialogRef = this.dialog.open(NiceTimepickerDialog, {\n panelClass: \"nice-timepicker-dialog\",\n data: {\n time: this.field()().value() || \"\",\n titleKey: this.translationKeys.title,\n cancelKey: this.translationKeys.cancel,\n confirmKey: this.translationKeys.confirm,\n minutesGap: this.config.minutesGap ?? 1,\n dottedMinutesInGap: this.config.dottedMinutesInGap ?? true\n }\n });\n\n dialogRef\n .afterClosed()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((time) => {\n if (time !== undefined) {\n this.field()().value.set(time);\n }\n });\n }\n}\n","<button\n mat-icon-button\n type=\"button\"\n [attr.aria-label]=\"'Open time picker'\"\n [disabled]=\"isDisabled()\"\n (click)=\"openPicker($event)\"\n>\n @if (toggleIcon) {\n <mat-icon [svgIcon]=\"toggleIcon\" />\n } @else {\n <mat-icon>schedule</mat-icon>\n }\n</button>\n","/*\n * Public API Surface of timepicker\n */\n\nexport * from \"./config\";\nexport * from \"./options\";\nexport * from \"./provider\";\nexport * from \"./timepicker\";\nexport * from \"./timepicker-toggle\";\nexport * from \"./time-format-validation\";\nexport * from \"./field-error-state\";\nexport * from \"./time-utils\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, DestroyRef, signal, computed, Injectable, ChangeDetectionStrategy, Component, input, output, viewChild, ElementRef, ChangeDetectorRef, untracked, effect, ViewChildren, Directive, booleanAttribute, ViewEncapsulation } from '@angular/core';
2
+ import { InjectionToken, inject, DestroyRef, signal, computed, Injectable, ChangeDetectionStrategy, Component, input, output, viewChild, ElementRef, ChangeDetectorRef, untracked, ViewChildren, Directive, booleanAttribute, effect, ViewEncapsulation } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { Subject, switchMap, EMPTY, defer, map, catchError, finalize, tap, startWith, merge, debounceTime, distinctUntilChanged, take, takeUntil } from 'rxjs';
5
5
  import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
@@ -293,6 +293,8 @@ class NiceTypeaheadBase {
293
293
  });
294
294
  ngControl = inject(NgControl, { optional: true, self: true });
295
295
  _panelDoneAnimatingStream = new Subject();
296
+ /** Tab index of the typeahead trigger, aligned with `MatSelect`. */
297
+ tabIndex = 0;
296
298
  _keyManager;
297
299
  _preferredOverlayOrigin;
298
300
  _overlayWidth;
@@ -356,7 +358,6 @@ class NiceTypeaheadBase {
356
358
  return this._panelOpen;
357
359
  }
358
360
  constructor() {
359
- effect(() => this._input()?.nativeElement.focus());
360
361
  if (this.ngControl) {
361
362
  // Note: we provide the value accessor through here, instead of
362
363
  // the `providers` to avoid running into a circular import.
@@ -395,7 +396,7 @@ class NiceTypeaheadBase {
395
396
  }
396
397
  this.stateChanges.next();
397
398
  if (event.target.tagName.toLowerCase() !== "input") {
398
- this.onFocusChanged(true);
399
+ this.open();
399
400
  }
400
401
  }
401
402
  setDescribedByIds(ids) {
@@ -408,9 +409,6 @@ class NiceTypeaheadBase {
408
409
  onFocusChanged(isFocused) {
409
410
  this.focused = isFocused;
410
411
  this.stateChanges.next();
411
- if (isFocused) {
412
- this.open();
413
- }
414
412
  }
415
413
  writeValue(value) {
416
414
  this._assignValue(value);
@@ -508,6 +506,15 @@ class NiceTypeaheadBase {
508
506
  this._overlayDir()?.positionChange.pipe(take(1)).subscribe(() => {
509
507
  this._changeDetectorRef.detectChanges();
510
508
  this._positioningSettled();
509
+ this._focusSearchInput();
510
+ });
511
+ }
512
+ _focusSearchInput() {
513
+ queueMicrotask(() => {
514
+ const input = this._input()?.nativeElement;
515
+ if (this.panelOpen && input) {
516
+ input.focus({ preventScroll: true });
517
+ }
511
518
  });
512
519
  }
513
520
  _initKeyManager() {
@@ -711,10 +718,15 @@ class NiceTypeaheadBase {
711
718
  return false;
712
719
  }
713
720
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceTypeaheadBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
714
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.0", type: NiceTypeaheadBase, isStandalone: true, inputs: { noItemsFoundLabel: { classPropertyName: "noItemsFoundLabel", publicName: "noItemsFoundLabel", isSignal: true, isRequired: false, transformFunction: null }, labelProperty: { classPropertyName: "labelProperty", publicName: "labelProperty", isSignal: true, isRequired: false, transformFunction: null }, formatLabelFn: { classPropertyName: "formatLabelFn", publicName: "formatLabelFn", isSignal: true, isRequired: false, transformFunction: null }, optionTemplate: { classPropertyName: "optionTemplate", publicName: "optionTemplate", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, canRemoveValue: { classPropertyName: "canRemoveValue", publicName: "canRemoveValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "_input", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "_panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "_overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "options", predicate: MatOption, descendants: true }], ngImport: i0 });
721
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.0", type: NiceTypeaheadBase, isStandalone: true, inputs: { noItemsFoundLabel: { classPropertyName: "noItemsFoundLabel", publicName: "noItemsFoundLabel", isSignal: true, isRequired: false, transformFunction: null }, labelProperty: { classPropertyName: "labelProperty", publicName: "labelProperty", isSignal: true, isRequired: false, transformFunction: null }, formatLabelFn: { classPropertyName: "formatLabelFn", publicName: "formatLabelFn", isSignal: true, isRequired: false, transformFunction: null }, optionTemplate: { classPropertyName: "optionTemplate", publicName: "optionTemplate", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, canRemoveValue: { classPropertyName: "canRemoveValue", publicName: "canRemoveValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected" }, host: { properties: { "attr.tabindex": "disabled ? -1 : tabIndex" } }, viewQueries: [{ propertyName: "_input", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "_panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "_overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "options", predicate: MatOption, descendants: true }], ngImport: i0 });
715
722
  }
716
723
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceTypeaheadBase, decorators: [{
717
- type: Directive
724
+ type: Directive,
725
+ args: [{
726
+ host: {
727
+ "[attr.tabindex]": "disabled ? -1 : tabIndex"
728
+ }
729
+ }]
718
730
  }], ctorParameters: () => [], propDecorators: { options: [{
719
731
  type: ViewChildren,
720
732
  args: [MatOption]
@@ -863,7 +875,7 @@ class NiceAsyncTypeahead extends NiceTypeaheadBase {
863
875
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NiceAsyncTypeahead, isStandalone: true, selector: "nice-async-typeahead", inputs: { resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null }, searchOptions: { classPropertyName: "searchOptions", publicName: "searchOptions", isSignal: true, isRequired: false, transformFunction: null }, autoSelectModes: { classPropertyName: "autoSelectModes", publicName: "autoSelectModes", isSignal: true, isRequired: false, transformFunction: null }, autoSelectFirstValue: { classPropertyName: "autoSelectFirstValue", publicName: "autoSelectFirstValue", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "combobox", "aria-haspopup": "listbox" }, listeners: { "keydown": "_handleKeydown($event)", "focus": "onFocusChanged(true)", "blur": "onFocusChanged(false)" }, properties: { "attr.id": "id", "attr.aria-controls": "panelOpen ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.nice-typeahead-disabled": "disabled", "class.nice-typeahead-invalid": "errorState", "class.nice-typeahead-required": "required", "class.nice-typeahead-empty": "empty" }, classAttribute: "nice-typeahead" }, providers: [
864
876
  { provide: MatFormFieldControl, useExisting: NiceAsyncTypeahead },
865
877
  NiceTypeaheadService
866
- ], viewQueries: [{ propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button class=\"nice-typeahead-remove\" mat-icon-button (click)=\"$event.stopPropagation(); removeActiveValue()\">\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NiceTypeaheadSearchIcon, selector: "nice-typeahead-search-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
878
+ ], viewQueries: [{ propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button\n class=\"nice-typeahead-remove\"\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation(); removeActiveValue()\"\n >\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NiceTypeaheadSearchIcon, selector: "nice-typeahead-search-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
867
879
  }
868
880
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceAsyncTypeahead, decorators: [{
869
881
  type: Component,
@@ -899,7 +911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
899
911
  "(keydown)": "_handleKeydown($event)",
900
912
  "(focus)": "onFocusChanged(true)",
901
913
  "(blur)": "onFocusChanged(false)"
902
- }, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button class=\"nice-typeahead-remove\" mat-icon-button (click)=\"$event.stopPropagation(); removeActiveValue()\">\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"] }]
914
+ }, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button\n class=\"nice-typeahead-remove\"\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation(); removeActiveValue()\"\n >\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"] }]
903
915
  }], ctorParameters: () => [], propDecorators: { resource: [{ type: i0.Input, args: [{ isSignal: true, alias: "resource", required: true }] }], searchOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchOptions", required: false }] }], autoSelectModes: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoSelectModes", required: false }] }], autoSelectFirstValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoSelectFirstValue", required: false }] }], optionsContainer: [{ type: i0.ViewChild, args: ["optionsContainer", { isSignal: true }] }] } });
904
916
 
905
917
  class NiceTypeahead extends NiceTypeaheadBase {
@@ -941,7 +953,7 @@ class NiceTypeahead extends NiceTypeaheadBase {
941
953
  });
942
954
  }
943
955
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceTypeahead, deps: null, target: i0.ɵɵFactoryTarget.Component });
944
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NiceTypeahead, isStandalone: true, selector: "nice-typeahead", inputs: { values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: true, transformFunction: null }, searchFn: { classPropertyName: "searchFn", publicName: "searchFn", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "combobox", "aria-haspopup": "listbox" }, listeners: { "keydown": "_handleKeydown($event)", "focus": "onFocusChanged(true)", "blur": "onFocusChanged(false)" }, properties: { "attr.id": "id", "attr.aria-controls": "panelOpen ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.nice-typeahead-disabled": "disabled", "class.nice-typeahead-invalid": "errorState", "class.nice-typeahead-required": "required", "class.nice-typeahead-empty": "empty" }, classAttribute: "nice-typeahead" }, providers: [{ provide: MatFormFieldControl, useExisting: NiceTypeahead }], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button class=\"nice-typeahead-remove\" mat-icon-button (click)=\"$event.stopPropagation(); removeActiveValue()\">\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NiceTypeaheadSearchIcon, selector: "nice-typeahead-search-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
956
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NiceTypeahead, isStandalone: true, selector: "nice-typeahead", inputs: { values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: true, transformFunction: null }, searchFn: { classPropertyName: "searchFn", publicName: "searchFn", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "combobox", "aria-haspopup": "listbox" }, listeners: { "keydown": "_handleKeydown($event)", "focus": "onFocusChanged(true)", "blur": "onFocusChanged(false)" }, properties: { "attr.id": "id", "attr.aria-controls": "panelOpen ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.nice-typeahead-disabled": "disabled", "class.nice-typeahead-invalid": "errorState", "class.nice-typeahead-required": "required", "class.nice-typeahead-empty": "empty" }, classAttribute: "nice-typeahead" }, providers: [{ provide: MatFormFieldControl, useExisting: NiceTypeahead }], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button\n class=\"nice-typeahead-remove\"\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation(); removeActiveValue()\"\n >\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NiceTypeaheadSearchIcon, selector: "nice-typeahead-search-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
945
957
  }
946
958
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NiceTypeahead, decorators: [{
947
959
  type: Component,
@@ -974,7 +986,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
974
986
  "(keydown)": "_handleKeydown($event)",
975
987
  "(focus)": "onFocusChanged(true)",
976
988
  "(blur)": "onFocusChanged(false)"
977
- }, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button class=\"nice-typeahead-remove\" mat-icon-button (click)=\"$event.stopPropagation(); removeActiveValue()\">\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"] }]
989
+ }, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n class=\"nice-typeahead\"\n cdk-overlay-origin\n>\n <div class=\"nice-typeahead-value\">\n @if (_empty()) {\n <span class=\"nice-typeahead-placeholder mat-mdc-select-min-line\">{{ _placeholder() }}</span>\n } @else {\n <span class=\"nice-typeahead-value-text\">\n <span class=\"mat-mdc-select-min-line\">\n @if (_value(); as activeValue) {\n {{ formatLabel(activeValue) }}\n }\n </span>\n </span>\n }\n </div>\n\n <div class=\"nice-typeahead-suffix\">\n @if (_empty()) {\n <div class=\"mat-mdc-select-arrow\">\n <svg viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n </svg>\n </div>\n } @else if (canRemoveValue()) {\n <button\n class=\"nice-typeahead-remove\"\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation(); removeActiveValue()\"\n >\n <svg viewBox=\"0 -960 960 960\">\n <path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\"/>\n </svg>\n </button>\n }\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"_overlayWidth\"\n [cdkConnectedOverlayOrigin]=\"_preferredOverlayOrigin || fallbackOverlayOrigin\"\n (attach)=\"_onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"nice-typeahead-panel nice-typeahead--open nice-typehead-animations-enabled\"\n [ngClass]=\"panelClass()\"\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n (scrollend)=\"_handleScrollEnd()\"\n >\n <div class=\"nice-typeahead-search-input\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input\n #input\n class=\"nice-typeahead__input\"\n matInput\n [formControl]=\"_searchControl\"\n >\n\n <nice-typeahead-search-icon matIconPrefix />\n </mat-form-field>\n </div>\n\n <div #optionsContainer class=\"nice-typeahead-options\" role=\"presentation\">\n @for (item of filteredValues(); track item) {\n <mat-option [value]=\"item\">\n @if (optionTemplate(); as optionTemplate) {\n <ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ formatLabel(item) }}\n }\n </mat-option>\n } @empty {\n <mat-option disabled>\n <span class=\"nice-typeahead__no-items\">\n {{ noItemsFoundLabel() }}\n </span>\n </mat-option>\n }\n </div>\n </div>\n</ng-template>\n", styles: ["nice-typeahead,nice-async-typeahead{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-app-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-app-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-app-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-app-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-app-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-app-body-large-tracking))}nice-typeahead.nice-typeahead-disabled,nice-async-typeahead.nice-typeahead-disabled{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-typeahead.nice-typeahead-disabled .nice-typeahead-remove,nice-async-typeahead.nice-typeahead-disabled .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-disabled .nice-typeahead-remove{color:var(--mat-select-disabled-trigger-text-color)}nice-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow,nice-async-typeahead.nice-typeahead-invalid .mat-mdc-select-arrow{color:var(--mat-select-invalid-arrow-color)}nice-typeahead .nice-typeahead,nice-async-typeahead .nice-typeahead{width:100%;display:inline-flex;align-items:center;justify-content:space-between;cursor:pointer;position:relative;box-sizing:border-box}nice-typeahead .nice-typeahead-suffix,nice-async-typeahead .nice-typeahead-suffix{height:24px;flex-shrink:0;display:inline-flex;align-items:center;--mdc-icon-button-state-layer-size: 24px}nice-typeahead .nice-typeahead-suffix .nice-typeahead-remove,nice-async-typeahead .nice-typeahead-suffix .nice-typeahead-remove{margin-right:-6px}nice-typeahead .nice-typeahead-value,nice-async-typeahead .nice-typeahead-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}nice-typeahead .nice-typeahead-value-text,nice-async-typeahead .nice-typeahead-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nice-typeahead .mat-mdc-select-min-line:empty:before,nice-async-typeahead .mat-mdc-select-min-line:empty:before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}nice-typeahead .nice-typeahead__input,nice-async-typeahead .nice-typeahead__input{border:none;outline:none;box-shadow:none;background:none;padding:0;margin:0;color:inherit}.mat-mdc-form-field-type-nice-typeahead:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-nice-typeahead.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}@keyframes _nice-typeahead-enter{0%{opacity:0;transform:scaleY(.8)}to{opacity:1;transform:none}}@keyframes _nice-typeahead-exit{0%{opacity:1}to{opacity:0}}div.nice-typeahead-panel{width:100%;outline:0;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-app-surface-container))}div.nice-typeahead-panel nice-typeahead-search-icon{width:16px;height:16px;margin-right:8px;margin-left:16px}div.nice-typeahead-panel nice-typeahead-search-icon svg{width:16px;height:16px}div.nice-typeahead-panel .nice-typeahead-search-input{padding-left:8px;padding-right:8px;padding-bottom:8px}div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field,div.nice-typeahead-panel .nice-typeahead-search-input .mat-mdc-form-field-infix{width:100%}div.nice-typeahead-panel .nice-typeahead-options{overflow:auto;max-height:384px}div.nice-typeahead-panel{box-shadow:var(--mat-select-container-elevation-shadow)}.nice-typehead-animations-enabled{animation:_nice-typeahead-enter .12s cubic-bezier(0,0,.2,1)}.nice-typehead-animations-enabled.mat-select-panel-exit{animation:_nice-typeahead-exit .1s linear}\n"] }]
978
990
  }], propDecorators: { values: [{ type: i0.Input, args: [{ isSignal: true, alias: "values", required: true }] }], searchFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchFn", required: false }] }] } });
979
991
 
980
992
  /**