ngx-kit 6.1.0 → 6.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.
Files changed (50) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +49 -49
  5. package/data-table/README.md +113 -113
  6. package/date-picker/README.md +69 -69
  7. package/dialog/README.md +92 -92
  8. package/drawer-menu/README.md +77 -77
  9. package/dropzone/README.md +422 -422
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +4 -4
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +1322 -200
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +2 -2
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +2 -2
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  24. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  28. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-image-editor.mjs +75 -11
  31. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-menu.mjs +8 -8
  33. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  34. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  35. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-shared.mjs +2 -2
  37. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  39. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  40. package/gallery/README.md +71 -71
  41. package/gradient-picker/README.md +41 -41
  42. package/menu/README.md +85 -85
  43. package/message/README.md +70 -70
  44. package/notify/README.md +58 -58
  45. package/package.json +1 -1
  46. package/shared/README.md +117 -117
  47. package/time-picker/README.md +95 -95
  48. package/types/ngx-kit-date-picker.d.ts +302 -36
  49. package/types/ngx-kit-dropzone.d.ts +5 -5
  50. package/types/ngx-kit-image-editor.d.ts +29 -4
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-time-picker.mjs","sources":["../../../projects/libs/time-picker/types/config.ts","../../../projects/libs/time-picker/utils/normalize.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.html","../../../projects/libs/time-picker/directives/time-picker.directive.ts","../../../projects/libs/time-picker/providers/provide-time-picker.ts","../../../projects/libs/time-picker/ngx-kit-time-picker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport class NgxTimePickerConfig {\n cancelButtonText: string = 'Cancel';\n confirmButtonText: string = 'Ok';\n amText: string = 'AM';\n pmText: string = 'PM';\n format: '12' | '24' = '12';\n minuteStep: number = 1;\n autoSwitchToMinute: boolean = true;\n}\n\nexport const DEFAULT_TIME_PICKER_CONFIG = new NgxTimePickerConfig();\nexport const NGX_TIME_PICKER_CONFIG = new InjectionToken<NgxTimePickerConfig>(\n 'ngx-time-picker-config',\n {\n factory: () => DEFAULT_TIME_PICKER_CONFIG,\n },\n);\n","export function normalizeTime(value: string): string | null {\r\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\r\n\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const hour = Number(match[1]);\r\n const minute = Number(match[2]);\r\n\r\n if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {\r\n return null;\r\n }\r\n\r\n return [hour.toString().padStart(2, '0'), minute.toString().padStart(2, '0')].join(':');\r\n}\r\n","import {\n Component,\n computed,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n input,\n model,\n OnInit,\n output,\n Output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BrowserService } from 'ngx-kit/shared';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport type { NgxTimePickerMode } from '../../types/mode';\nimport { NGX_TIME_PICKER_CONFIG } from '../../types/config';\nimport { normalizeTime } from '../../utils/normalize';\n\n@Component({\n selector: 'ngx-time-picker',\n templateUrl: './time-picker.html',\n styleUrls: ['./time-picker.scss'],\n imports: [CommonModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\n multi: true,\n },\n ],\n})\nexport class NgxInputTimePickerComponent implements ControlValueAccessor, Validator, OnInit {\n protected readonly browserService = inject(BrowserService);\n\n readonly change = output<string | null>();\n readonly cancel = output<void>();\n\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\n isDisabled = false;\n\n /**\n * Time value.\n *\n * Example:\n * 14:35\n */\n readonly value = model<string>('12:00');\n\n /**\n * 12h or 24h.\n */\n readonly format = input<'12' | '24'>(this.config.format);\n\n /**\n * Minute step.\n */\n readonly minuteStep = input(this.config.minuteStep);\n\n /**\n * Whether the clock is disabled.\n */\n readonly disabled = input(false);\n\n /**\n * Whether to automatically switch from hour to minute.\n */\n readonly autoSwitchToMinute = input<boolean>(this.config.autoSwitchToMinute);\n\n readonly clock = viewChild<ElementRef<SVGSVGElement>>('clock');\n\n readonly mode = signal<NgxTimePickerMode>('hour');\n\n private dragging = false;\n\n readonly parsedTime = computed(() => {\n const value = this.value();\n\n const [hour, minute] = value.split(':').map(Number);\n\n return {\n hour: Number.isFinite(hour) ? hour : 12,\n minute: Number.isFinite(minute) ? minute : 0,\n };\n });\n\n readonly displayHour = computed(() => {\n const { hour } = this.parsedTime();\n\n if (this.format() === '12') {\n const h = hour % 12;\n return h === 0 ? 12 : h;\n }\n\n return hour;\n });\n readonly isPm = computed(() => {\n const hour = Number(this.value().split(':')[0]);\n\n return hour >= 12;\n });\n readonly displayMinute = computed(() => {\n return this.parsedTime().minute;\n });\n\n readonly hourNumbers = computed(() => {\n if (this.format() === '24') {\n return Array.from({ length: 24 }, (_, i) => i);\n }\n\n return Array.from({ length: 12 }, (_, i) => i + 1);\n });\n\n readonly minuteNumbers = computed(() => {\n const step = Math.max(1, 5);\n\n const values: number[] = [];\n\n for (let i = 0; i < 60; i += step) {\n values.push(i);\n }\n\n return values;\n });\n\n readonly hourAngle = computed(() => {\n const { hour } = this.parsedTime();\n\n if (this.format() === '24') {\n /*\n * MUI-like 24 hour clock.\n *\n * 0 -> 0°\n * 6 -> 90°\n * 12 -> 180°\n * 18 -> 270°\n */\n return (hour % 12) * 30;\n }\n\n const h = hour % 12;\n\n return h * 30;\n });\n\n readonly minuteAngle = computed(() => {\n return this.parsedTime().minute * 6;\n });\n\n readonly currentAngle = computed(() => {\n return this.mode() === 'hour' ? this.hourAngle() : this.minuteAngle();\n });\n\n readonly handLength = computed(() => {\n if (this.mode() === 'hour' && this.format() === '24') {\n const hour = this.parsedTime().hour;\n\n if (hour >= 13 && hour <= 23) {\n return 58;\n }\n }\n\n return 86;\n });\n\n readonly hourRadius = computed(() => {\n if (this.mode() !== 'hour') {\n return 94;\n }\n\n if (this.format() !== '24') {\n return 94;\n }\n\n const hour = this.parsedTime().hour;\n\n // 00, 13..23 → inner ring\n if (hour === 0 || hour >= 13) {\n return 58;\n }\n\n // 01..12 → outer ring\n return 94;\n });\n readonly selectedPosition = computed(() => {\n const angle = this.currentAngle();\n\n const radians = ((angle - 90) * Math.PI) / 180;\n\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n });\n readonly handEnd = computed(() => {\n const angle = this.currentAngle();\n\n const radians = ((angle - 90) * Math.PI) / 180;\n\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n });\n\n protected _onChange = (value: string) => {};\n protected _onTouched = () => {};\n protected _validatorOnChange = () => {};\n constructor() {}\n\n ngOnInit(): void {}\n\n writeValue(value: string): void {\n if (!value) {\n this.value.set('12:00');\n return;\n }\n\n const normalized = normalizeTime(value);\n\n if (normalized === null) {\n // invalid value\n return;\n }\n\n this.value.set(normalized);\n }\n validate(control: AbstractControl): ValidationErrors | null {\n return null;\n }\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n registerOnValidatorChange?(fn: () => void): void {\n this._validatorOnChange = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n }\n\n startPointer(event: PointerEvent): void {\n if (this.disabled()) {\n return;\n }\n\n event.preventDefault();\n\n this.dragging = true;\n\n const target = event.currentTarget as HTMLElement;\n\n target.setPointerCapture?.(event.pointerId);\n\n this.updateFromPointer(event);\n }\n\n movePointer(event: PointerEvent): void {\n if (!this.dragging || this.disabled()) {\n return;\n }\n\n event.preventDefault();\n\n this.updateFromPointer(event);\n }\n\n endPointer(event: PointerEvent): void {\n if (!this.dragging) {\n return;\n }\n\n this.dragging = false;\n\n const target = event.currentTarget as HTMLElement;\n\n target.releasePointerCapture?.(event.pointerId);\n\n if (this.mode() === 'hour' && this.autoSwitchToMinute()) {\n this.mode.set('minute');\n }\n }\n\n selectHour(hour: number): void {\n if (this.disabled()) {\n return;\n }\n\n let normalizedHour = hour;\n\n if (this.format() === '12') {\n const currentHour = this.parsedTime().hour;\n\n const isPm = currentHour >= 12;\n\n normalizedHour = hour === 12 ? (isPm ? 12 : 0) : isPm ? hour + 12 : hour;\n }\n\n this.setTime(normalizedHour, this.parsedTime().minute);\n\n if (this.autoSwitchToMinute()) {\n this.mode.set('minute');\n }\n }\n\n selectMinute(minute: number): void {\n if (this.disabled()) {\n return;\n }\n\n this.setTime(this.parsedTime().hour, minute);\n }\n\n setMode(mode: NgxTimePickerMode): void {\n if (!this.disabled()) {\n this.mode.set(mode);\n }\n }\n\n private updateFromPointer(event: PointerEvent): void {\n const svg = this.clock()?.nativeElement;\n\n if (!svg) {\n return;\n }\n\n const rect = svg.getBoundingClientRect();\n\n const x = ((event.clientX - rect.left) / rect.width) * 240;\n\n const y = ((event.clientY - rect.top) / rect.height) * 240;\n\n if (this.mode() === 'hour') {\n this.updateHourFromPointer(x, y);\n return;\n }\n\n this.updateMinuteFromPointer(x, y);\n }\n\n private updateHourFromPointer(x: number, y: number): void {\n const dx = x - 120;\n const dy = y - 120;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n\n if (angle < 0) {\n angle += 360;\n }\n\n let hour = Math.round(angle / 30) % 12;\n\n if (this.format() === '12') {\n hour = hour === 0 ? 12 : hour;\n\n this.setTime(hour, this.parsedTime().minute);\n\n return;\n }\n\n /*\n * 24 hour mode\n *\n * Outer ring:\n * 1 ... 12\n *\n * Inner ring:\n * 13 ... 23, 00\n */\n const INNER_RING_THRESHOLD = 76;\n\n const isInnerRing = distance < INNER_RING_THRESHOLD;\n\n if (isInnerRing) {\n /*\n * Inner ring:\n *\n * 12 position -> 00\n * 1 position -> 13\n * 2 position -> 14\n * ...\n * 11 position -> 23\n */\n hour = hour === 0 ? 0 : hour + 12;\n } else {\n /*\n * Outer ring:\n *\n * 12 position -> 12\n * 1 ... 11 -> 1 ... 11\n */\n hour = hour === 0 ? 12 : hour;\n }\n\n this.setTime(hour, this.parsedTime().minute);\n }\n private updateMinuteFromPointer(x: number, y: number): void {\n const dx = x - 120;\n const dy = y - 120;\n\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n\n if (angle < 0) {\n angle += 360;\n }\n\n let minute = Math.round(angle / 6);\n\n minute %= 60;\n\n const step = Math.max(1, this.minuteStep());\n\n minute = Math.round(minute / step) * step;\n\n if (minute >= 60) {\n minute = 0;\n }\n\n this.setTime(this.parsedTime().hour, minute);\n }\n\n private setTime(hour: number, minute: number): void {\n const h = String(hour).padStart(2, '0');\n const m = String(minute).padStart(2, '0');\n\n this.value.set(`${h}:${m}`);\n }\n\n formatHour(hour: number): string {\n if (this.format() === '24') {\n return String(hour).padStart(2, '0');\n }\n\n return String(hour);\n }\n\n formatMinute(minute: number): string {\n return String(minute).padStart(2, '0');\n }\n\n numberPosition(index: number, total: number, radius = 94): { x: number; y: number } {\n const angle = (index / total) * 360 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n }\n\n hourPosition(hour: number, inner = false): { x: number; y: number } {\n const normalized = hour % 12;\n\n const angle = normalized * 30 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n const radius = inner ? 58 : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n }\n\n minutePosition(minute: number): {\n x: number;\n y: number;\n } {\n const angle = minute * 6 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n return {\n x: 120 + Math.cos(radians) * 94,\n y: 120 + Math.sin(radians) * 94,\n };\n }\n\n togglePmAm(val: 'AM' | 'PM'): void {\n const [hour, minute] = this.value().split(':').map(Number);\n\n let newHour = hour;\n\n if (val === 'AM') {\n // 12:xx PM → 00:xx\n if (hour >= 12) {\n newHour = hour - 12;\n }\n } else {\n // 00:xx AM → 12:xx PM\n if (hour < 12) {\n newHour = hour + 12;\n }\n }\n\n const value = `${String(newHour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n\n this.value.set(value);\n }\n ok() {\n this.change.emit(this.value());\n this._onChange(this.value());\n }\n\n close() {\n this.cancel.emit();\n }\n}\n","<div class=\"ngx-time-picker\" [class.ngx-time-picker--disabled]=\"disabled()\">\n <!-- Header -->\n <div class=\"ngx-time-picker__header\">\n <button\n type=\"button\"\n class=\"ngx-time-picker__value\"\n [class.active]=\"mode() === 'hour'\"\n [disabled]=\"disabled()\"\n (click)=\"setMode('hour')\">\n {{ formatHour(displayHour()) }}\n </button>\n\n <span class=\"ngx-time-picker__separator\">:</span>\n\n <button\n type=\"button\"\n class=\"ngx-time-picker__value\"\n [class.active]=\"mode() === 'minute'\"\n [disabled]=\"disabled()\"\n (click)=\"setMode('minute')\">\n {{ formatMinute(displayMinute()) }}\n </button>\n\n @if (format() == '12') {\n <div class=\"ngx-time-picker_format\">\n <button [class.active]=\"!isPm()\" (click)=\"togglePmAm('AM')\">\n {{ config.amText }}\n </button>\n <button [class.active]=\"isPm()\" (click)=\"togglePmAm('PM')\">\n {{ config.pmText }}\n </button>\n </div>\n }\n </div>\n\n <!-- Clock -->\n <div class=\"ngx-time-picker__clock-wrapper\">\n <svg\n #clock\n class=\"ngx-time-picker__clock\"\n viewBox=\"0 0 240 240\"\n xmlns=\"http://www.w3.org/2000/svg\"\n (pointerdown)=\"startPointer($event)\"\n (pointermove)=\"movePointer($event)\"\n (pointerup)=\"endPointer($event)\"\n (pointercancel)=\"endPointer($event)\">\n <!-- Background -->\n <circle class=\"clock-background\" cx=\"120\" cy=\"120\" r=\"112\" />\n\n <!-- Selected hand line -->\n <line class=\"clock-hand\" x1=\"120\" y1=\"120\" [attr.x2]=\"handEnd().x\" [attr.y2]=\"handEnd().y\" />\n\n <!-- Selected circle -->\n <circle\n class=\"clock-selected\"\n [attr.cx]=\"selectedPosition().x\"\n [attr.cy]=\"selectedPosition().y\"\n r=\"18\" />\n\n <!-- Center -->\n <circle class=\"clock-center\" cx=\"120\" cy=\"120\" r=\"5\" />\n\n <!-- HOURS -->\n @if (mode() === 'hour') {\n @for (hour of hourNumbers(); track hour) {\n @if (format() === '24' && (hour >= 13 || hour == 0)) {\n <g class=\"clock-number clock-number--inner\" (click)=\"selectHour(hour)\">\n <circle\n [attr.cx]=\"hourPosition(hour - 12, true).x\"\n [attr.cy]=\"hourPosition(hour - 12, true).y\"\n r=\"16\" />\n\n <text\n [attr.x]=\"hourPosition(hour - 12, true).x\"\n [attr.y]=\"hourPosition(hour - 12, true).y\">\n {{ hour == 0 ? '00' : hour }}\n </text>\n </g>\n } @else {\n <g\n class=\"clock-number\"\n [class.selected]=\"displayHour() == hour\"\n (click)=\"selectHour(hour)\">\n <circle [attr.cx]=\"hourPosition(hour).x\" [attr.cy]=\"hourPosition(hour).y\" r=\"18\" />\n\n <text [attr.x]=\"hourPosition(hour).x\" [attr.y]=\"hourPosition(hour).y\">\n {{ hour }}\n </text>\n </g>\n }\n }\n }\n\n <!-- MINUTES -->\n @if (mode() === 'minute') {\n @for (minute of minuteNumbers(); track minute) {\n <g\n class=\"clock-number\"\n [class.selected]=\"displayMinute() == minute\"\n (click)=\"selectMinute(minute)\">\n <circle\n [attr.cx]=\"minutePosition(minute).x\"\n [attr.cy]=\"minutePosition(minute).y\"\n r=\"18\" />\n\n <text [attr.x]=\"minutePosition(minute).x\" [attr.y]=\"minutePosition(minute).y\">\n {{ formatMinute(minute) }}\n </text>\n </g>\n }\n }\n </svg>\n </div>\n <div class=\"ngx-time-picker--footer\">\n <button (click)=\"close()\">\n {{ config.cancelButtonText }}\n </button>\n\n <button (click)=\"ok()\">\n {{ config.confirmButtonText }}\n </button>\n </div>\n</div>\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n inject,\n input,\n model,\n output,\n Output,\n Renderer2,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { OverlayRef, OverlayService } from 'ngx-kit/shared';\nimport { NgxInputTimePickerComponent } from '../components/time-picker/time-picker';\nimport { NGX_TIME_PICKER_CONFIG } from '../types/config';\nimport { normalizeTime } from '../utils/normalize';\n\n@Directive({\n selector: '[ngxInputTimePicker]',\n exportAs: 'ngxInputTimePicker',\n host: {\n class: 'ngx-datepicker-input',\n '[attr.readOnly]': 'true',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputTimePicker),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NgxInputTimePicker),\n multi: true,\n },\n ],\n})\nexport class NgxInputTimePicker implements ControlValueAccessor, Validator {\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\n\n openOnCLick = input<boolean>(true);\n\n readonly change = output<string | null>();\n protected readonly value = signal<string>('');\n\n readonly format = input<'12' | '24'>(this.config.format);\n\n private pickerRef?: OverlayRef<NgxInputTimePickerComponent>;\n\n protected _onChange = (value: string | null | undefined) => {};\n protected _onTouched = () => {};\n protected _validatorOnChange = () => {};\n\n private isDisabled = false;\n\n private readonly overlayService = inject(OverlayService);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly renderer = inject(Renderer2);\n constructor(private el: ElementRef<HTMLInputElement>) {}\n\n ngOnDestroy(): void {\n this.destroy();\n }\n\n @HostListener('click', ['$event'])\n onClick(ev: Event) {\n if (this.openOnCLick() && !this.isDisabled) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggle();\n }\n }\n\n @HostListener('input', ['$event'])\n onInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this.value.set(input.value ?? '');\n this._formatValue();\n this._onChange(this.value());\n }\n\n @HostListener('blur')\n onBlur() {\n this._onTouched();\n }\n\n writeValue(value: string): void {\n this.value.set(value);\n this._formatValue();\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n registerOnValidatorChange?(fn: () => void): void {\n this._validatorOnChange = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n if (disabled) {\n this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);\n } else {\n this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\n }\n }\n\n public toggle() {\n if (this.pickerRef || this.isDisabled) {\n this.destroy();\n return;\n }\n\n this.pickerRef = this.overlayService.open({\n anchor: this.el.nativeElement,\n component: NgxInputTimePickerComponent,\n viewContainerRef: this.viewContainerRef,\n alignment: 'center',\n placement: 'bottom',\n margin: 2,\n configure: (instance, ref) => {\n instance.writeValue(this.value());\n\n instance.change.subscribe((c: string | null) => {\n this.value.set(c ?? '');\n this.emitChange();\n this.destroy();\n });\n\n instance.cancel.subscribe(() => ref.close());\n },\n onClosed: () => {\n this.pickerRef = undefined;\n },\n });\n }\n\n private destroy() {\n this.pickerRef?.close();\n this.pickerRef = undefined;\n }\n private async emitChange() {\n this._onChange(this.value());\n this._formatValue();\n this.change.emit(this.value());\n this._onTouched();\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n const raw = this.value();\n if (!raw) return null; // empty is handled by Validators.required, not us\n return normalizeTime(raw) === null ? { invalid: true } : null;\n }\n\n protected _formatValue() {\n this.renderer.setProperty(this.el.nativeElement, 'value', this.value());\n }\n}\n","import { Provider } from '@angular/core';\nimport {\n DEFAULT_TIME_PICKER_CONFIG,\n NGX_TIME_PICKER_CONFIG,\n type NgxTimePickerConfig,\n} from '../types/config';\n\nexport function provideTimePicker(config: Partial<NgxTimePickerConfig>): Provider[] {\n const configuration = { ...DEFAULT_TIME_PICKER_CONFIG, ...config };\n return [\n {\n provide: NGX_TIME_PICKER_CONFIG,\n useValue: configuration,\n },\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;MAEa,mBAAmB,CAAA;IAC9B,gBAAgB,GAAW,QAAQ;IACnC,iBAAiB,GAAW,IAAI;IAChC,MAAM,GAAW,IAAI;IACrB,MAAM,GAAW,IAAI;IACrB,MAAM,GAAgB,IAAI;IAC1B,UAAU,GAAW,CAAC;IACtB,kBAAkB,GAAY,IAAI;AACnC;AAEM,MAAM,0BAA0B,GAAG,IAAI,mBAAmB;MACpD,sBAAsB,GAAG,IAAI,cAAc,CACtD,wBAAwB,EACxB;AACE,IAAA,OAAO,EAAE,MAAM,0BAA0B;AAC1C,CAAA;;ACjBG,SAAU,aAAa,CAAC,KAAa,EAAA;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC;IAEhD,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI;IACb;IAEA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE/B,IAAA,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE,EAAE;AACtD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACzF;;MCgCa,2BAA2B,CAAA;AACnB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAEjD,MAAM,GAAG,MAAM,EAAiB;IAChC,MAAM,GAAG,MAAM,EAAQ;AAEb,IAAA,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC;IAC1D,UAAU,GAAG,KAAK;AAElB;;;;;AAKG;IACM,KAAK,GAAG,KAAK,CAAS,OAAO;8EAAC;AAEvC;;AAEG;AACM,IAAA,MAAM,GAAG,KAAK,CAAc,IAAI,CAAC,MAAM,CAAC,MAAM;+EAAC;AAExD;;AAEG;AACM,IAAA,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;mFAAC;AAEnD;;AAEG;IACM,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;AAEhC;;AAEG;AACM,IAAA,kBAAkB,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,CAAC,kBAAkB;2FAAC;IAEnE,KAAK,GAAG,SAAS,CAA4B,OAAO;8EAAC;IAErD,IAAI,GAAG,MAAM,CAAoB,MAAM;6EAAC;IAEzC,QAAQ,GAAG,KAAK;AAEf,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAE1B,QAAA,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAEnD,OAAO;AACL,YAAA,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;AACvC,YAAA,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC;SAC7C;IACH,CAAC;mFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAElC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;QACzB;AAEA,QAAA,OAAO,IAAI;IACb,CAAC;oFAAC;AACO,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AAC5B,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,OAAO,IAAI,IAAI,EAAE;IACnB,CAAC;6EAAC;AACO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;IACjC,CAAC;sFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAChD;QAEA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;oFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAa,EAAE;AAE3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;AACjC,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChB;AAEA,QAAA,OAAO,MAAM;IACf,CAAC;sFAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;QACjC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAElC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B;;;;;;;AAOG;AACH,YAAA,OAAO,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE;QACzB;AAEA,QAAA,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE;QAEnB,OAAO,CAAC,GAAG,EAAE;IACf,CAAC;kFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC;IACrC,CAAC;oFAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACpC,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;IACvE,CAAC;qFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;YAEnC,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE;AAC5B,gBAAA,OAAO,EAAE;YACX;QACF;AAEA,QAAA,OAAO,EAAE;IACX,CAAC;mFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE;AAC1B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;;QAGnC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE;AAC5B,YAAA,OAAO,EAAE;QACX;;AAGA,QAAA,OAAO,EAAE;IACX,CAAC;mFAAC;AACO,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AAEjC,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG;AAE9C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAE9D,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH,CAAC;yFAAC;AACO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AAEjC,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG;AAE9C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAE9D,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH,CAAC;gFAAC;AAEQ,IAAA,SAAS,GAAG,CAAC,KAAa,KAAI,EAAE,CAAC;AACjC,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AACrB,IAAA,kBAAkB,GAAG,MAAK,EAAE,CAAC;AACvC,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,QAAQ,KAAU;AAElB,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;YACvB;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC;AAEvC,QAAA,IAAI,UAAU,KAAK,IAAI,EAAE;;YAEvB;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;IAC5B;AACA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,yBAAyB,CAAE,EAAc,EAAA;AACvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;IAC9B;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;IAC5B;AAEA,IAAA,YAAY,CAAC,KAAmB,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AAEpB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;QAEjD,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC;AAE3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,WAAW,CAAC,KAAmB,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACrC;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,UAAU,CAAC,KAAmB,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AAErB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;QAEjD,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC,SAAS,CAAC;AAE/C,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AACvD,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB;IACF;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;QAEA,IAAI,cAAc,GAAG,IAAI;AAEzB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;AAE1C,YAAA,MAAM,IAAI,GAAG,WAAW,IAAI,EAAE;AAE9B,YAAA,cAAc,GAAG,IAAI,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI;QAC1E;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;AAEtD,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB;IACF;AAEA,IAAA,YAAY,CAAC,MAAc,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;IAC9C;AAEA,IAAA,OAAO,CAAC,IAAuB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB;IACF;AAEQ,IAAA,iBAAiB,CAAC,KAAmB,EAAA;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa;QAEvC,IAAI,CAAC,GAAG,EAAE;YACR;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,EAAE;AAExC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG;AAE1D,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;AAE1D,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC;IACpC;IAEQ,qBAAqB,CAAC,CAAS,EAAE,CAAS,EAAA;AAChD,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;AAClB,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;AAElB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAE7C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE;AAErD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,KAAK,IAAI,GAAG;QACd;AAEA,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE;AAEtC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI;AAE7B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;YAE5C;QACF;AAEA;;;;;;;;AAQG;QACH,MAAM,oBAAoB,GAAG,EAAE;AAE/B,QAAA,MAAM,WAAW,GAAG,QAAQ,GAAG,oBAAoB;QAEnD,IAAI,WAAW,EAAE;AACf;;;;;;;;AAQG;AACH,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE;QACnC;aAAO;AACL;;;;;AAKG;AACH,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI;QAC/B;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;IAC9C;IACQ,uBAAuB,CAAC,CAAS,EAAE,CAAS,EAAA;AAClD,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;AAClB,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;QAElB,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE;AAErD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,KAAK,IAAI,GAAG;QACd;QAEA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAElC,MAAM,IAAI,EAAE;AAEZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAE3C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI;AAEzC,QAAA,IAAI,MAAM,IAAI,EAAE,EAAE;YAChB,MAAM,GAAG,CAAC;QACZ;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;IAC9C;IAEQ,OAAO,CAAC,IAAY,EAAE,MAAc,EAAA;AAC1C,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACvC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAEzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;IAC7B;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACtC;AAEA,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB;AAEA,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACxC;AAEA,IAAA,cAAc,CAAC,KAAa,EAAE,KAAa,EAAE,MAAM,GAAG,EAAE,EAAA;QACtD,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG,EAAE;QAExC,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;QAEvC,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH;AAEA,IAAA,YAAY,CAAC,IAAY,EAAE,KAAK,GAAG,KAAK,EAAA;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAE;AAE5B,QAAA,MAAM,KAAK,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE;QAElC,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;QAEvC,MAAM,MAAM,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE;QAE9B,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH;AAEA,IAAA,cAAc,CAAC,MAAc,EAAA;AAI3B,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE;QAE7B,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;QAEvC,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/B,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;SAChC;IACH;AAEA,IAAA,UAAU,CAAC,GAAgB,EAAA;QACzB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAE1D,IAAI,OAAO,GAAG,IAAI;AAElB,QAAA,IAAI,GAAG,KAAK,IAAI,EAAE;;AAEhB,YAAA,IAAI,IAAI,IAAI,EAAE,EAAE;AACd,gBAAA,OAAO,GAAG,IAAI,GAAG,EAAE;YACrB;QACF;aAAO;;AAEL,YAAA,IAAI,IAAI,GAAG,EAAE,EAAE;AACb,gBAAA,OAAO,GAAG,IAAI,GAAG,EAAE;YACrB;QACF;QAEA,MAAM,KAAK,GAAG,CAAA,EAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;AAEtF,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;IACA,EAAE,GAAA;QACA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC9B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;uGApeW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAb3B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,2BAA2B,CAAC;AAC1D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,2BAA2B,CAAC;AAC1D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7CH,y7HA2HA,q+ED1FY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAcX,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAlBvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAGlB,CAAC,YAAY,CAAC,EAAA,SAAA,EACZ;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,iCAAiC,CAAC;AAC1D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,iCAAiC,CAAC;AAC1D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,y7HAAA,EAAA,MAAA,EAAA,CAAA,86EAAA,CAAA,EAAA;ytBAuCqD,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEpClD,kBAAkB,CAAA;AAqBT,IAAA,EAAA;AApBD,IAAA,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC;IAE1D,WAAW,GAAG,KAAK,CAAU,IAAI;oFAAC;IAEzB,MAAM,GAAG,MAAM,EAAiB;IACtB,KAAK,GAAG,MAAM,CAAS,EAAE;8EAAC;AAEpC,IAAA,MAAM,GAAG,KAAK,CAAc,IAAI,CAAC,MAAM,CAAC,MAAM;+EAAC;AAEhD,IAAA,SAAS;AAEP,IAAA,SAAS,GAAG,CAAC,KAAgC,KAAI,EAAE,CAAC;AACpD,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AACrB,IAAA,kBAAkB,GAAG,MAAK,EAAE,CAAC;IAE/B,UAAU,GAAG,KAAK;AAET,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC7C,IAAA,WAAA,CAAoB,EAAgC,EAAA;QAAhC,IAAA,CAAA,EAAE,GAAF,EAAE;IAAiC;IAEvD,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;AAGA,IAAA,OAAO,CAAC,EAAS,EAAA;QACf,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAC1C,EAAE,CAAC,eAAe,EAAE;YACpB,EAAE,CAAC,cAAc,EAAE;YACnB,IAAI,CAAC,MAAM,EAAE;QACf;IACF;AAGA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC9B;IAGA,MAAM,GAAA;QACJ,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,yBAAyB,CAAE,EAAc,EAAA;AACvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;IAC9B;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;QAC1B,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;QACxE;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;QAClE;IACF;IAEO,MAAM,GAAA;QACX,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;YACrC,IAAI,CAAC,OAAO,EAAE;YACd;QACF;QAEA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACxC,YAAA,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa;AAC7B,YAAA,SAAS,EAAE,2BAA2B;YACtC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAI;gBAC3B,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAEjC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAgB,KAAI;oBAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,UAAU,EAAE;oBACjB,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,CAAC,CAAC;AAEF,gBAAA,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAC9C,CAAC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;YAC5B,CAAC;AACF,SAAA,CAAC;IACJ;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;AACQ,IAAA,MAAM,UAAU,GAAA;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;AACtB,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI;IAC/D;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACzE;uGAzHW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,EAAA,SAAA,EAblB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBApB9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,sBAAsB;AAC7B,wBAAA,iBAAiB,EAAE,MAAM;AAC1B,qBAAA;AACD,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBA4BE,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;sBAShC,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;sBAQhC,YAAY;uBAAC,MAAM;;;ACrFhB,SAAU,iBAAiB,CAAC,MAAoC,EAAA;IACpE,MAAM,aAAa,GAAG,EAAE,GAAG,0BAA0B,EAAE,GAAG,MAAM,EAAE;IAClE,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,sBAAsB;AAC/B,YAAA,QAAQ,EAAE,aAAa;AACxB,SAAA;KACF;AACH;;ACfA;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-kit-time-picker.mjs","sources":["../../../projects/libs/time-picker/types/config.ts","../../../projects/libs/time-picker/utils/normalize.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.html","../../../projects/libs/time-picker/directives/time-picker.directive.ts","../../../projects/libs/time-picker/providers/provide-time-picker.ts","../../../projects/libs/time-picker/ngx-kit-time-picker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport class NgxTimePickerConfig {\r\n cancelButtonText: string = 'Cancel';\r\n confirmButtonText: string = 'Ok';\r\n amText: string = 'AM';\r\n pmText: string = 'PM';\r\n format: '12' | '24' = '12';\r\n minuteStep: number = 1;\r\n autoSwitchToMinute: boolean = true;\r\n}\r\n\r\nexport const DEFAULT_TIME_PICKER_CONFIG = new NgxTimePickerConfig();\r\nexport const NGX_TIME_PICKER_CONFIG = new InjectionToken<NgxTimePickerConfig>(\r\n 'ngx-time-picker-config',\r\n {\r\n factory: () => DEFAULT_TIME_PICKER_CONFIG,\r\n },\r\n);\r\n","export function normalizeTime(value: string): string | null {\r\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\r\n\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const hour = Number(match[1]);\r\n const minute = Number(match[2]);\r\n\r\n if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {\r\n return null;\r\n }\r\n\r\n return [hour.toString().padStart(2, '0'), minute.toString().padStart(2, '0')].join(':');\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n OnInit,\r\n output,\r\n Output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BrowserService } from 'ngx-kit/shared';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator,\r\n} from '@angular/forms';\r\nimport type { NgxTimePickerMode } from '../../types/mode';\r\nimport { NGX_TIME_PICKER_CONFIG } from '../../types/config';\r\nimport { normalizeTime } from '../../utils/normalize';\r\n\r\n@Component({\r\n selector: 'ngx-time-picker',\r\n templateUrl: './time-picker.html',\r\n styleUrls: ['./time-picker.scss'],\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class NgxInputTimePickerComponent implements ControlValueAccessor, Validator, OnInit {\r\n protected readonly browserService = inject(BrowserService);\r\n\r\n readonly change = output<string | null>();\r\n readonly cancel = output<void>();\r\n\r\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\r\n isDisabled = false;\r\n\r\n /**\r\n * Time value.\r\n *\r\n * Example:\r\n * 14:35\r\n */\r\n readonly value = model<string>('12:00');\r\n\r\n /**\r\n * 12h or 24h.\r\n */\r\n readonly format = input<'12' | '24'>(this.config.format);\r\n\r\n /**\r\n * Minute step.\r\n */\r\n readonly minuteStep = input(this.config.minuteStep);\r\n\r\n /**\r\n * Whether the clock is disabled.\r\n */\r\n readonly disabled = input(false);\r\n\r\n /**\r\n * Whether to automatically switch from hour to minute.\r\n */\r\n readonly autoSwitchToMinute = input<boolean>(this.config.autoSwitchToMinute);\r\n\r\n readonly clock = viewChild<ElementRef<SVGSVGElement>>('clock');\r\n\r\n readonly mode = signal<NgxTimePickerMode>('hour');\r\n\r\n private dragging = false;\r\n\r\n readonly parsedTime = computed(() => {\r\n const value = this.value();\r\n\r\n const [hour, minute] = value.split(':').map(Number);\r\n\r\n return {\r\n hour: Number.isFinite(hour) ? hour : 12,\r\n minute: Number.isFinite(minute) ? minute : 0,\r\n };\r\n });\r\n\r\n readonly displayHour = computed(() => {\r\n const { hour } = this.parsedTime();\r\n\r\n if (this.format() === '12') {\r\n const h = hour % 12;\r\n return h === 0 ? 12 : h;\r\n }\r\n\r\n return hour;\r\n });\r\n readonly isPm = computed(() => {\r\n const hour = Number(this.value().split(':')[0]);\r\n\r\n return hour >= 12;\r\n });\r\n readonly displayMinute = computed(() => {\r\n return this.parsedTime().minute;\r\n });\r\n\r\n readonly hourNumbers = computed(() => {\r\n if (this.format() === '24') {\r\n return Array.from({ length: 24 }, (_, i) => i);\r\n }\r\n\r\n return Array.from({ length: 12 }, (_, i) => i + 1);\r\n });\r\n\r\n readonly minuteNumbers = computed(() => {\r\n const step = Math.max(1, 5);\r\n\r\n const values: number[] = [];\r\n\r\n for (let i = 0; i < 60; i += step) {\r\n values.push(i);\r\n }\r\n\r\n return values;\r\n });\r\n\r\n readonly hourAngle = computed(() => {\r\n const { hour } = this.parsedTime();\r\n\r\n if (this.format() === '24') {\r\n /*\r\n * MUI-like 24 hour clock.\r\n *\r\n * 0 -> 0°\r\n * 6 -> 90°\r\n * 12 -> 180°\r\n * 18 -> 270°\r\n */\r\n return (hour % 12) * 30;\r\n }\r\n\r\n const h = hour % 12;\r\n\r\n return h * 30;\r\n });\r\n\r\n readonly minuteAngle = computed(() => {\r\n return this.parsedTime().minute * 6;\r\n });\r\n\r\n readonly currentAngle = computed(() => {\r\n return this.mode() === 'hour' ? this.hourAngle() : this.minuteAngle();\r\n });\r\n\r\n readonly handLength = computed(() => {\r\n if (this.mode() === 'hour' && this.format() === '24') {\r\n const hour = this.parsedTime().hour;\r\n\r\n if (hour >= 13 && hour <= 23) {\r\n return 58;\r\n }\r\n }\r\n\r\n return 86;\r\n });\r\n\r\n readonly hourRadius = computed(() => {\r\n if (this.mode() !== 'hour') {\r\n return 94;\r\n }\r\n\r\n if (this.format() !== '24') {\r\n return 94;\r\n }\r\n\r\n const hour = this.parsedTime().hour;\r\n\r\n // 00, 13..23 → inner ring\r\n if (hour === 0 || hour >= 13) {\r\n return 58;\r\n }\r\n\r\n // 01..12 → outer ring\r\n return 94;\r\n });\r\n readonly selectedPosition = computed(() => {\r\n const angle = this.currentAngle();\r\n\r\n const radians = ((angle - 90) * Math.PI) / 180;\r\n\r\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\r\n\r\n return {\r\n x: 120 + Math.cos(radians) * radius,\r\n y: 120 + Math.sin(radians) * radius,\r\n };\r\n });\r\n readonly handEnd = computed(() => {\r\n const angle = this.currentAngle();\r\n\r\n const radians = ((angle - 90) * Math.PI) / 180;\r\n\r\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\r\n\r\n return {\r\n x: 120 + Math.cos(radians) * radius,\r\n y: 120 + Math.sin(radians) * radius,\r\n };\r\n });\r\n\r\n protected _onChange = (value: string) => {};\r\n protected _onTouched = () => {};\r\n protected _validatorOnChange = () => {};\r\n constructor() {}\r\n\r\n ngOnInit(): void {}\r\n\r\n writeValue(value: string): void {\r\n if (!value) {\r\n this.value.set('12:00');\r\n return;\r\n }\r\n\r\n const normalized = normalizeTime(value);\r\n\r\n if (normalized === null) {\r\n // invalid value\r\n return;\r\n }\r\n\r\n this.value.set(normalized);\r\n }\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n registerOnValidatorChange?(fn: () => void): void {\r\n this._validatorOnChange = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n }\r\n\r\n startPointer(event: PointerEvent): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n this.dragging = true;\r\n\r\n const target = event.currentTarget as HTMLElement;\r\n\r\n target.setPointerCapture?.(event.pointerId);\r\n\r\n this.updateFromPointer(event);\r\n }\r\n\r\n movePointer(event: PointerEvent): void {\r\n if (!this.dragging || this.disabled()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n this.updateFromPointer(event);\r\n }\r\n\r\n endPointer(event: PointerEvent): void {\r\n if (!this.dragging) {\r\n return;\r\n }\r\n\r\n this.dragging = false;\r\n\r\n const target = event.currentTarget as HTMLElement;\r\n\r\n target.releasePointerCapture?.(event.pointerId);\r\n\r\n if (this.mode() === 'hour' && this.autoSwitchToMinute()) {\r\n this.mode.set('minute');\r\n }\r\n }\r\n\r\n selectHour(hour: number): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n let normalizedHour = hour;\r\n\r\n if (this.format() === '12') {\r\n const currentHour = this.parsedTime().hour;\r\n\r\n const isPm = currentHour >= 12;\r\n\r\n normalizedHour = hour === 12 ? (isPm ? 12 : 0) : isPm ? hour + 12 : hour;\r\n }\r\n\r\n this.setTime(normalizedHour, this.parsedTime().minute);\r\n\r\n if (this.autoSwitchToMinute()) {\r\n this.mode.set('minute');\r\n }\r\n }\r\n\r\n selectMinute(minute: number): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.setTime(this.parsedTime().hour, minute);\r\n }\r\n\r\n setMode(mode: NgxTimePickerMode): void {\r\n if (!this.disabled()) {\r\n this.mode.set(mode);\r\n }\r\n }\r\n\r\n private updateFromPointer(event: PointerEvent): void {\r\n const svg = this.clock()?.nativeElement;\r\n\r\n if (!svg) {\r\n return;\r\n }\r\n\r\n const rect = svg.getBoundingClientRect();\r\n\r\n const x = ((event.clientX - rect.left) / rect.width) * 240;\r\n\r\n const y = ((event.clientY - rect.top) / rect.height) * 240;\r\n\r\n if (this.mode() === 'hour') {\r\n this.updateHourFromPointer(x, y);\r\n return;\r\n }\r\n\r\n this.updateMinuteFromPointer(x, y);\r\n }\r\n\r\n private updateHourFromPointer(x: number, y: number): void {\r\n const dx = x - 120;\r\n const dy = y - 120;\r\n\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\r\n\r\n if (angle < 0) {\r\n angle += 360;\r\n }\r\n\r\n let hour = Math.round(angle / 30) % 12;\r\n\r\n if (this.format() === '12') {\r\n hour = hour === 0 ? 12 : hour;\r\n\r\n this.setTime(hour, this.parsedTime().minute);\r\n\r\n return;\r\n }\r\n\r\n /*\r\n * 24 hour mode\r\n *\r\n * Outer ring:\r\n * 1 ... 12\r\n *\r\n * Inner ring:\r\n * 13 ... 23, 00\r\n */\r\n const INNER_RING_THRESHOLD = 76;\r\n\r\n const isInnerRing = distance < INNER_RING_THRESHOLD;\r\n\r\n if (isInnerRing) {\r\n /*\r\n * Inner ring:\r\n *\r\n * 12 position -> 00\r\n * 1 position -> 13\r\n * 2 position -> 14\r\n * ...\r\n * 11 position -> 23\r\n */\r\n hour = hour === 0 ? 0 : hour + 12;\r\n } else {\r\n /*\r\n * Outer ring:\r\n *\r\n * 12 position -> 12\r\n * 1 ... 11 -> 1 ... 11\r\n */\r\n hour = hour === 0 ? 12 : hour;\r\n }\r\n\r\n this.setTime(hour, this.parsedTime().minute);\r\n }\r\n private updateMinuteFromPointer(x: number, y: number): void {\r\n const dx = x - 120;\r\n const dy = y - 120;\r\n\r\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\r\n\r\n if (angle < 0) {\r\n angle += 360;\r\n }\r\n\r\n let minute = Math.round(angle / 6);\r\n\r\n minute %= 60;\r\n\r\n const step = Math.max(1, this.minuteStep());\r\n\r\n minute = Math.round(minute / step) * step;\r\n\r\n if (minute >= 60) {\r\n minute = 0;\r\n }\r\n\r\n this.setTime(this.parsedTime().hour, minute);\r\n }\r\n\r\n private setTime(hour: number, minute: number): void {\r\n const h = String(hour).padStart(2, '0');\r\n const m = String(minute).padStart(2, '0');\r\n\r\n this.value.set(`${h}:${m}`);\r\n }\r\n\r\n formatHour(hour: number): string {\r\n if (this.format() === '24') {\r\n return String(hour).padStart(2, '0');\r\n }\r\n\r\n return String(hour);\r\n }\r\n\r\n formatMinute(minute: number): string {\r\n return String(minute).padStart(2, '0');\r\n }\r\n\r\n numberPosition(index: number, total: number, radius = 94): { x: number; y: number } {\r\n const angle = (index / total) * 360 - 90;\r\n\r\n const radians = (angle * Math.PI) / 180;\r\n\r\n return {\r\n x: 120 + Math.cos(radians) * radius,\r\n y: 120 + Math.sin(radians) * radius,\r\n };\r\n }\r\n\r\n hourPosition(hour: number, inner = false): { x: number; y: number } {\r\n const normalized = hour % 12;\r\n\r\n const angle = normalized * 30 - 90;\r\n\r\n const radians = (angle * Math.PI) / 180;\r\n\r\n const radius = inner ? 58 : 94;\r\n\r\n return {\r\n x: 120 + Math.cos(radians) * radius,\r\n y: 120 + Math.sin(radians) * radius,\r\n };\r\n }\r\n\r\n minutePosition(minute: number): {\r\n x: number;\r\n y: number;\r\n } {\r\n const angle = minute * 6 - 90;\r\n\r\n const radians = (angle * Math.PI) / 180;\r\n\r\n return {\r\n x: 120 + Math.cos(radians) * 94,\r\n y: 120 + Math.sin(radians) * 94,\r\n };\r\n }\r\n\r\n togglePmAm(val: 'AM' | 'PM'): void {\r\n const [hour, minute] = this.value().split(':').map(Number);\r\n\r\n let newHour = hour;\r\n\r\n if (val === 'AM') {\r\n // 12:xx PM → 00:xx\r\n if (hour >= 12) {\r\n newHour = hour - 12;\r\n }\r\n } else {\r\n // 00:xx AM → 12:xx PM\r\n if (hour < 12) {\r\n newHour = hour + 12;\r\n }\r\n }\r\n\r\n const value = `${String(newHour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\r\n\r\n this.value.set(value);\r\n }\r\n ok() {\r\n this.change.emit(this.value());\r\n this._onChange(this.value());\r\n }\r\n\r\n close() {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<div class=\"ngx-time-picker\" [class.ngx-time-picker--disabled]=\"disabled()\">\r\n <!-- Header -->\r\n <div class=\"ngx-time-picker__header\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-time-picker__value\"\r\n [class.active]=\"mode() === 'hour'\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"setMode('hour')\">\r\n {{ formatHour(displayHour()) }}\r\n </button>\r\n\r\n <span class=\"ngx-time-picker__separator\">:</span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ngx-time-picker__value\"\r\n [class.active]=\"mode() === 'minute'\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"setMode('minute')\">\r\n {{ formatMinute(displayMinute()) }}\r\n </button>\r\n\r\n @if (format() == '12') {\r\n <div class=\"ngx-time-picker_format\">\r\n <button [class.active]=\"!isPm()\" (click)=\"togglePmAm('AM')\">\r\n {{ config.amText }}\r\n </button>\r\n <button [class.active]=\"isPm()\" (click)=\"togglePmAm('PM')\">\r\n {{ config.pmText }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Clock -->\r\n <div class=\"ngx-time-picker__clock-wrapper\">\r\n <svg\r\n #clock\r\n class=\"ngx-time-picker__clock\"\r\n viewBox=\"0 0 240 240\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (pointerdown)=\"startPointer($event)\"\r\n (pointermove)=\"movePointer($event)\"\r\n (pointerup)=\"endPointer($event)\"\r\n (pointercancel)=\"endPointer($event)\">\r\n <!-- Background -->\r\n <circle class=\"clock-background\" cx=\"120\" cy=\"120\" r=\"112\" />\r\n\r\n <!-- Selected hand line -->\r\n <line class=\"clock-hand\" x1=\"120\" y1=\"120\" [attr.x2]=\"handEnd().x\" [attr.y2]=\"handEnd().y\" />\r\n\r\n <!-- Selected circle -->\r\n <circle\r\n class=\"clock-selected\"\r\n [attr.cx]=\"selectedPosition().x\"\r\n [attr.cy]=\"selectedPosition().y\"\r\n r=\"18\" />\r\n\r\n <!-- Center -->\r\n <circle class=\"clock-center\" cx=\"120\" cy=\"120\" r=\"5\" />\r\n\r\n <!-- HOURS -->\r\n @if (mode() === 'hour') {\r\n @for (hour of hourNumbers(); track hour) {\r\n @if (format() === '24' && (hour >= 13 || hour == 0)) {\r\n <g class=\"clock-number clock-number--inner\" (click)=\"selectHour(hour)\">\r\n <circle\r\n [attr.cx]=\"hourPosition(hour - 12, true).x\"\r\n [attr.cy]=\"hourPosition(hour - 12, true).y\"\r\n r=\"16\" />\r\n\r\n <text\r\n [attr.x]=\"hourPosition(hour - 12, true).x\"\r\n [attr.y]=\"hourPosition(hour - 12, true).y\">\r\n {{ hour == 0 ? '00' : hour }}\r\n </text>\r\n </g>\r\n } @else {\r\n <g\r\n class=\"clock-number\"\r\n [class.selected]=\"displayHour() == hour\"\r\n (click)=\"selectHour(hour)\">\r\n <circle [attr.cx]=\"hourPosition(hour).x\" [attr.cy]=\"hourPosition(hour).y\" r=\"18\" />\r\n\r\n <text [attr.x]=\"hourPosition(hour).x\" [attr.y]=\"hourPosition(hour).y\">\r\n {{ hour }}\r\n </text>\r\n </g>\r\n }\r\n }\r\n }\r\n\r\n <!-- MINUTES -->\r\n @if (mode() === 'minute') {\r\n @for (minute of minuteNumbers(); track minute) {\r\n <g\r\n class=\"clock-number\"\r\n [class.selected]=\"displayMinute() == minute\"\r\n (click)=\"selectMinute(minute)\">\r\n <circle\r\n [attr.cx]=\"minutePosition(minute).x\"\r\n [attr.cy]=\"minutePosition(minute).y\"\r\n r=\"18\" />\r\n\r\n <text [attr.x]=\"minutePosition(minute).x\" [attr.y]=\"minutePosition(minute).y\">\r\n {{ formatMinute(minute) }}\r\n </text>\r\n </g>\r\n }\r\n }\r\n </svg>\r\n </div>\r\n <div class=\"ngx-time-picker--footer\">\r\n <button (click)=\"close()\">\r\n {{ config.cancelButtonText }}\r\n </button>\r\n\r\n <button (click)=\"ok()\">\r\n {{ config.confirmButtonText }}\r\n </button>\r\n </div>\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n HostListener,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n Output,\r\n Renderer2,\r\n signal,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator,\r\n} from '@angular/forms';\r\nimport { OverlayRef, OverlayService } from 'ngx-kit/shared';\r\nimport { NgxInputTimePickerComponent } from '../components/time-picker/time-picker';\r\nimport { NGX_TIME_PICKER_CONFIG } from '../types/config';\r\nimport { normalizeTime } from '../utils/normalize';\r\n\r\n@Directive({\r\n selector: '[ngxInputTimePicker]',\r\n exportAs: 'ngxInputTimePicker',\r\n host: {\r\n class: 'ngx-datepicker-input',\r\n '[attr.readOnly]': 'true',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxInputTimePicker),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => NgxInputTimePicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class NgxInputTimePicker implements ControlValueAccessor, Validator {\r\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\r\n\r\n openOnCLick = input<boolean>(true);\r\n\r\n readonly change = output<string | null>();\r\n protected readonly value = signal<string>('');\r\n\r\n readonly format = input<'12' | '24'>(this.config.format);\r\n\r\n private pickerRef?: OverlayRef<NgxInputTimePickerComponent>;\r\n\r\n protected _onChange = (value: string | null | undefined) => {};\r\n protected _onTouched = () => {};\r\n protected _validatorOnChange = () => {};\r\n\r\n private isDisabled = false;\r\n\r\n private readonly overlayService = inject(OverlayService);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly renderer = inject(Renderer2);\r\n constructor(private el: ElementRef<HTMLInputElement>) {}\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(ev: Event) {\r\n if (this.openOnCLick() && !this.isDisabled) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.toggle();\r\n }\r\n }\r\n\r\n @HostListener('input', ['$event'])\r\n onInput(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n this.value.set(input.value ?? '');\r\n this._formatValue();\r\n this._onChange(this.value());\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur() {\r\n this._onTouched();\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.value.set(value);\r\n this._formatValue();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n registerOnValidatorChange?(fn: () => void): void {\r\n this._validatorOnChange = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n if (disabled) {\r\n this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);\r\n } else {\r\n this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\r\n }\r\n }\r\n\r\n public toggle() {\r\n if (this.pickerRef || this.isDisabled) {\r\n this.destroy();\r\n return;\r\n }\r\n\r\n this.pickerRef = this.overlayService.open({\r\n anchor: this.el.nativeElement,\r\n component: NgxInputTimePickerComponent,\r\n viewContainerRef: this.viewContainerRef,\r\n alignment: 'center',\r\n placement: 'bottom',\r\n margin: 2,\r\n configure: (instance, ref) => {\r\n instance.writeValue(this.value());\r\n\r\n instance.change.subscribe((c: string | null) => {\r\n this.value.set(c ?? '');\r\n this.emitChange();\r\n this.destroy();\r\n });\r\n\r\n instance.cancel.subscribe(() => ref.close());\r\n },\r\n onClosed: () => {\r\n this.pickerRef = undefined;\r\n },\r\n });\r\n }\r\n\r\n private destroy() {\r\n this.pickerRef?.close();\r\n this.pickerRef = undefined;\r\n }\r\n private async emitChange() {\r\n this._onChange(this.value());\r\n this._formatValue();\r\n this.change.emit(this.value());\r\n this._onTouched();\r\n }\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n const raw = this.value();\r\n if (!raw) return null; // empty is handled by Validators.required, not us\r\n return normalizeTime(raw) === null ? { invalid: true } : null;\r\n }\r\n\r\n protected _formatValue() {\r\n this.renderer.setProperty(this.el.nativeElement, 'value', this.value());\r\n }\r\n}\r\n","import { Provider } from '@angular/core';\r\nimport {\r\n DEFAULT_TIME_PICKER_CONFIG,\r\n NGX_TIME_PICKER_CONFIG,\r\n type NgxTimePickerConfig,\r\n} from '../types/config';\r\n\r\nexport function provideTimePicker(config: Partial<NgxTimePickerConfig>): Provider[] {\r\n const configuration = { ...DEFAULT_TIME_PICKER_CONFIG, ...config };\r\n return [\r\n {\r\n provide: NGX_TIME_PICKER_CONFIG,\r\n useValue: configuration,\r\n },\r\n ];\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/gallery/README.md CHANGED
@@ -1,71 +1,71 @@
1
- # ngx-kit/gallery
2
-
3
- A professional image viewer: takes a list of images, navigates them with ‹ › buttons (like a carousel), has a fully configurable toolbar (zoom, rotate, download, print, fullscreen), zoom via mouse scroll or two-finger pinch, and panning via drag once zoomed in.
4
-
5
- ## Install
6
-
7
- ```bash
8
- npm install ngx-kit
9
- ```
10
-
11
- ## Usage — directly in the page
12
-
13
- ```html
14
- <ngx-image-viewer [images]="images" [toolbar]="{ print: false }" />
15
- ```
16
-
17
- ```ts
18
- images: NgxImageViewerItem[] = [
19
- { src: '/img/1.jpg', alt: 'Image 1', caption: 'Alborz mountains' },
20
- { src: '/img/2.jpg', alt: 'Image 2' },
21
- ];
22
- ```
23
-
24
- ## Usage — inside a fullscreen dialog
25
-
26
- ```ts
27
- import { NgxImageViewerService } from 'ngx-kit/gallery';
28
-
29
- constructor(private viewer: NgxImageViewerService) {}
30
-
31
- openGallery() {
32
- this.viewer.open(this.images, { startIndex: 0 });
33
- }
34
- ```
35
-
36
- `NgxImageViewerComponent` doesn't depend on any dialog (it only has a `closed` output) — if you want to put it inside your own dialog (e.g. `ngx-kit/dialog`), use the component directly; the service is just a convenience shortcut.
37
-
38
- ## API
39
-
40
- ### `<ngx-image-viewer>`
41
-
42
- | Input | Type | Default | Description |
43
- | --- | --- | --- | --- |
44
- | `images` | `NgxImageViewerItem[]` **(required)** | | `{ src, alt?, caption?, downloadFileName? }` |
45
- | `startIndex` | `number` | `0` | |
46
- | `toolbar` | `NgxImageViewerToolbarConfig` | all `true` | Each button can be toggled individually (see below) |
47
- | `minZoom` / `maxZoom` / `zoomStep` | `number` | `1` / `6` / `0.4` | |
48
-
49
- | Output | Type | Description |
50
- | --- | --- | --- |
51
- | `indexChange` | `number` | The active image changed |
52
- | `closed` | `void` | The user clicked the close button or pressed Esc (the component itself doesn't close anything; that's left to the consumer) |
53
-
54
- ### `NgxImageViewerToolbarConfig`
55
-
56
- `prevNext`, `counter`, `zoomIn`, `zoomOut`, `resetZoom`, `rotateLeft`, `rotateRight`, `download`, `print`, `fullscreen`, `close` — all `boolean`, all default to `true` except `close` (`false`).
57
-
58
- ## Interactions
59
-
60
- | Gesture | Result |
61
- | --- | --- |
62
- | Mouse scroll | Zoom, relative to the point under the cursor (not the image center) |
63
- | Two-finger pinch (touch) | Zoom |
64
- | Drag with mouse or one finger (when zoomed) | Pan |
65
- | ← / → | Previous/next image |
66
- | + / - | Zoom in/out |
67
- | Esc | Emits `closed` |
68
-
69
- ## Dark mode and RTL
70
-
71
- Supported automatically.
1
+ # ngx-kit/gallery
2
+
3
+ A professional image viewer: takes a list of images, navigates them with ‹ › buttons (like a carousel), has a fully configurable toolbar (zoom, rotate, download, print, fullscreen), zoom via mouse scroll or two-finger pinch, and panning via drag once zoomed in.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## Usage — directly in the page
12
+
13
+ ```html
14
+ <ngx-image-viewer [images]="images" [toolbar]="{ print: false }" />
15
+ ```
16
+
17
+ ```ts
18
+ images: NgxImageViewerItem[] = [
19
+ { src: '/img/1.jpg', alt: 'Image 1', caption: 'Alborz mountains' },
20
+ { src: '/img/2.jpg', alt: 'Image 2' },
21
+ ];
22
+ ```
23
+
24
+ ## Usage — inside a fullscreen dialog
25
+
26
+ ```ts
27
+ import { NgxImageViewerService } from 'ngx-kit/gallery';
28
+
29
+ constructor(private viewer: NgxImageViewerService) {}
30
+
31
+ openGallery() {
32
+ this.viewer.open(this.images, { startIndex: 0 });
33
+ }
34
+ ```
35
+
36
+ `NgxImageViewerComponent` doesn't depend on any dialog (it only has a `closed` output) — if you want to put it inside your own dialog (e.g. `ngx-kit/dialog`), use the component directly; the service is just a convenience shortcut.
37
+
38
+ ## API
39
+
40
+ ### `<ngx-image-viewer>`
41
+
42
+ | Input | Type | Default | Description |
43
+ | --- | --- | --- | --- |
44
+ | `images` | `NgxImageViewerItem[]` **(required)** | | `{ src, alt?, caption?, downloadFileName? }` |
45
+ | `startIndex` | `number` | `0` | |
46
+ | `toolbar` | `NgxImageViewerToolbarConfig` | all `true` | Each button can be toggled individually (see below) |
47
+ | `minZoom` / `maxZoom` / `zoomStep` | `number` | `1` / `6` / `0.4` | |
48
+
49
+ | Output | Type | Description |
50
+ | --- | --- | --- |
51
+ | `indexChange` | `number` | The active image changed |
52
+ | `closed` | `void` | The user clicked the close button or pressed Esc (the component itself doesn't close anything; that's left to the consumer) |
53
+
54
+ ### `NgxImageViewerToolbarConfig`
55
+
56
+ `prevNext`, `counter`, `zoomIn`, `zoomOut`, `resetZoom`, `rotateLeft`, `rotateRight`, `download`, `print`, `fullscreen`, `close` — all `boolean`, all default to `true` except `close` (`false`).
57
+
58
+ ## Interactions
59
+
60
+ | Gesture | Result |
61
+ | --- | --- |
62
+ | Mouse scroll | Zoom, relative to the point under the cursor (not the image center) |
63
+ | Two-finger pinch (touch) | Zoom |
64
+ | Drag with mouse or one finger (when zoomed) | Pan |
65
+ | ← / → | Previous/next image |
66
+ | + / - | Zoom in/out |
67
+ | Esc | Emits `closed` |
68
+
69
+ ## Dark mode and RTL
70
+
71
+ Supported automatically.
@@ -1,41 +1,41 @@
1
- # ngx-kit/gradient-picker
2
-
3
- A linear/radial gradient picker with multiple draggable color stops, outputting a ready-to-use CSS string.
4
-
5
- ## Install
6
-
7
- ```bash
8
- npm install ngx-kit
9
- ```
10
-
11
- ## Usage
12
-
13
- ```html
14
- <ngx-input-gradient [(ngModel)]="gradientCss"></ngx-input-gradient>
15
- ```
16
-
17
- Or as a directive on a plain input:
18
-
19
- ```html
20
- <input type="text" [ngxInputGradient]="gradientCss" (change)="gradientCss = $event" />
21
- ```
22
-
23
- The output is a valid CSS string like `linear-gradient(90deg, #ff0000 0%, #0000ff 100%)`, ready to use directly in `background`/`background-image`.
24
-
25
- ## API
26
-
27
- | Input | Type | Default | Description |
28
- | --- | --- | --- | --- |
29
- | `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | Panel theme |
30
- | `setInputBackground` *(directive)* | `boolean` | `true` | Sets the input's background to the selected gradient |
31
- | `change` *(directive)* | `EventEmitter<string>` | | The new gradient string |
32
-
33
- ## UI notes
34
-
35
- - Add a color stop by clicking on the gradient bar; drag to move it.
36
- - Double-click a stop to remove it (or use the delete button if shown).
37
- - Each stop's color is edited with the same `ngx-kit/color-picker` panel (this package depends on it).
38
-
39
- ## Dark mode and RTL
40
-
41
- Supported automatically.
1
+ # ngx-kit/gradient-picker
2
+
3
+ A linear/radial gradient picker with multiple draggable color stops, outputting a ready-to-use CSS string.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```html
14
+ <ngx-input-gradient [(ngModel)]="gradientCss"></ngx-input-gradient>
15
+ ```
16
+
17
+ Or as a directive on a plain input:
18
+
19
+ ```html
20
+ <input type="text" [ngxInputGradient]="gradientCss" (change)="gradientCss = $event" />
21
+ ```
22
+
23
+ The output is a valid CSS string like `linear-gradient(90deg, #ff0000 0%, #0000ff 100%)`, ready to use directly in `background`/`background-image`.
24
+
25
+ ## API
26
+
27
+ | Input | Type | Default | Description |
28
+ | --- | --- | --- | --- |
29
+ | `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | Panel theme |
30
+ | `setInputBackground` *(directive)* | `boolean` | `true` | Sets the input's background to the selected gradient |
31
+ | `change` *(directive)* | `EventEmitter<string>` | | The new gradient string |
32
+
33
+ ## UI notes
34
+
35
+ - Add a color stop by clicking on the gradient bar; drag to move it.
36
+ - Double-click a stop to remove it (or use the delete button if shown).
37
+ - Each stop's color is edited with the same `ngx-kit/color-picker` panel (this package depends on it).
38
+
39
+ ## Dark mode and RTL
40
+
41
+ Supported automatically.
package/menu/README.md CHANGED
@@ -1,85 +1,85 @@
1
- # ngx-kit/menu
2
-
3
- Dropdown menu and context (right-click) menu, with smart positioning relative to an anchor (via `ngx-kit/shared`'s `OverlayService`).
4
-
5
- ## Install
6
-
7
- ```bash
8
- npm install ngx-kit
9
- ```
10
-
11
- ## Basic usage (dropdown menu)
12
-
13
- ```ts
14
- import { NgxMenuModule } from 'ngx-kit/menu';
15
-
16
- @Component({
17
- standalone: true,
18
- imports: [NgxMenuModule],
19
- template: `
20
- <button [ngxMenu]="userMenu">Open menu</button>
21
-
22
- <ngx-menu #userMenu="ngxMenu">
23
- <ngx-menu-item (click)="editProfile()">Edit profile</ngx-menu-item>
24
- <ngx-menu-item (click)="logout()">Sign out</ngx-menu-item>
25
- <ngx-menu-divider></ngx-menu-divider>
26
- <ngx-menu-item [ngxMenu]="subMenu">More settings ›</ngx-menu-item>
27
- </ngx-menu>
28
-
29
- <ngx-menu #subMenu="ngxMenu">
30
- <ngx-menu-item>Option A</ngx-menu-item>
31
- <ngx-menu-item>Option B</ngx-menu-item>
32
- </ngx-menu>
33
- `,
34
- })
35
- export class MyComponent {}
36
- ```
37
-
38
- Important: `<ngx-menu>`'s content isn't rendered until it's triggered via `[ngxMenu]` (or `[ngxContextMenu]`) — so you can't use `<ngx-menu>` directly, without a trigger, as an always-visible list (like a sidebar). For that, use a regular list styled similarly.
39
-
40
- Nested menus (submenus) work exactly as shown above, just by putting `[ngxMenu]` on the `<ngx-menu-item>` itself.
41
-
42
- ## Right-click (context) menu
43
-
44
- ```html
45
- <div [ngxContextMenu]="rightClickMenu">Right-click me</div>
46
-
47
- <ngx-menu #rightClickMenu="ngxMenu">
48
- <ngx-menu-item>Copy</ngx-menu-item>
49
- <ngx-menu-item>Paste</ngx-menu-item>
50
- </ngx-menu>
51
- ```
52
-
53
- ## API
54
-
55
- ### `[ngxMenu]` directive
56
-
57
- | Input | Type | Description |
58
- | --- | --- | --- |
59
- | `ngxMenu` | `NgxMenu \| TemplateRef` | Reference to the menu to open |
60
- | `placement` | `'top' \| 'bottom' \| 'auto'` | Opening direction; defaults to `'auto'` (picked automatically if there isn't enough room) |
61
-
62
- ### `<ngx-menu>`
63
-
64
- | Input | Type | Description |
65
- | --- | --- | --- |
66
- | `class` | `string` | Extra CSS class on the panel |
67
-
68
- ### Styling
69
-
70
- Via CSS custom properties:
71
-
72
- ```css
73
- ngx-menu {
74
- --ngx-menu-bg: light-dark(#fff, #252425);
75
- --ngx-menu-fg: light-dark(#000, #fff);
76
- --ngx-menu-radius: 10px;
77
- --ngx-menu-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
78
- --ngx-menu-item-padding: 8px 14px;
79
- --ngx-menu-item-hover-bg: #9bc6ff68;
80
- }
81
- ```
82
-
83
- ## Dark mode and RTL
84
-
85
- Both are supported automatically (via `ngx-kit/shared`'s `OverlayService`/`DirectionService` and `light-dark()`); no extra work needed.
1
+ # ngx-kit/menu
2
+
3
+ Dropdown menu and context (right-click) menu, with smart positioning relative to an anchor (via `ngx-kit/shared`'s `OverlayService`).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## Basic usage (dropdown menu)
12
+
13
+ ```ts
14
+ import { NgxMenuModule } from 'ngx-kit/menu';
15
+
16
+ @Component({
17
+ standalone: true,
18
+ imports: [NgxMenuModule],
19
+ template: `
20
+ <button [ngxMenu]="userMenu">Open menu</button>
21
+
22
+ <ngx-menu #userMenu="ngxMenu">
23
+ <ngx-menu-item (click)="editProfile()">Edit profile</ngx-menu-item>
24
+ <ngx-menu-item (click)="logout()">Sign out</ngx-menu-item>
25
+ <ngx-menu-divider></ngx-menu-divider>
26
+ <ngx-menu-item [ngxMenu]="subMenu">More settings ›</ngx-menu-item>
27
+ </ngx-menu>
28
+
29
+ <ngx-menu #subMenu="ngxMenu">
30
+ <ngx-menu-item>Option A</ngx-menu-item>
31
+ <ngx-menu-item>Option B</ngx-menu-item>
32
+ </ngx-menu>
33
+ `,
34
+ })
35
+ export class MyComponent {}
36
+ ```
37
+
38
+ Important: `<ngx-menu>`'s content isn't rendered until it's triggered via `[ngxMenu]` (or `[ngxContextMenu]`) — so you can't use `<ngx-menu>` directly, without a trigger, as an always-visible list (like a sidebar). For that, use a regular list styled similarly.
39
+
40
+ Nested menus (submenus) work exactly as shown above, just by putting `[ngxMenu]` on the `<ngx-menu-item>` itself.
41
+
42
+ ## Right-click (context) menu
43
+
44
+ ```html
45
+ <div [ngxContextMenu]="rightClickMenu">Right-click me</div>
46
+
47
+ <ngx-menu #rightClickMenu="ngxMenu">
48
+ <ngx-menu-item>Copy</ngx-menu-item>
49
+ <ngx-menu-item>Paste</ngx-menu-item>
50
+ </ngx-menu>
51
+ ```
52
+
53
+ ## API
54
+
55
+ ### `[ngxMenu]` directive
56
+
57
+ | Input | Type | Description |
58
+ | --- | --- | --- |
59
+ | `ngxMenu` | `NgxMenu \| TemplateRef` | Reference to the menu to open |
60
+ | `placement` | `'top' \| 'bottom' \| 'auto'` | Opening direction; defaults to `'auto'` (picked automatically if there isn't enough room) |
61
+
62
+ ### `<ngx-menu>`
63
+
64
+ | Input | Type | Description |
65
+ | --- | --- | --- |
66
+ | `class` | `string` | Extra CSS class on the panel |
67
+
68
+ ### Styling
69
+
70
+ Via CSS custom properties:
71
+
72
+ ```css
73
+ ngx-menu {
74
+ --ngx-menu-bg: light-dark(#fff, #252425);
75
+ --ngx-menu-fg: light-dark(#000, #fff);
76
+ --ngx-menu-radius: 10px;
77
+ --ngx-menu-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
78
+ --ngx-menu-item-padding: 8px 14px;
79
+ --ngx-menu-item-hover-bg: #9bc6ff68;
80
+ }
81
+ ```
82
+
83
+ ## Dark mode and RTL
84
+
85
+ Both are supported automatically (via `ngx-kit/shared`'s `OverlayService`/`DirectionService` and `light-dark()`); no extra work needed.