@brickclay-org/ui 0.0.48 → 0.0.49

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.
@@ -1 +1 @@
1
- {"version":3,"file":"brickclay-org-ui.mjs","sources":["../../../projects/brickclay-lib/src/lib/assets/icons.ts","../../../projects/brickclay-lib/src/lib/brickclay-lib.ts","../../../projects/brickclay-lib/src/lib/calender/components/time-picker/time-picker.component.ts","../../../projects/brickclay-lib/src/lib/calender/components/time-picker/time-picker.component.html","../../../projects/brickclay-lib/src/lib/calender/services/calendar-manager.service.ts","../../../projects/brickclay-lib/src/lib/calender/components/custom-calendar/custom-calendar.component.ts","../../../projects/brickclay-lib/src/lib/calender/components/custom-calendar/custom-calendar.component.html","../../../projects/brickclay-lib/src/lib/calender/components/scheduled-date-picker/scheduled-date-picker.component.ts","../../../projects/brickclay-lib/src/lib/calender/components/scheduled-date-picker/scheduled-date-picker.component.html","../../../projects/brickclay-lib/src/lib/calender/calendar.module.ts","../../../projects/brickclay-lib/src/lib/toggle/toggle.ts","../../../projects/brickclay-lib/src/lib/toggle/toggle.html","../../../projects/brickclay-lib/src/lib/checkbox/checkbox.ts","../../../projects/brickclay-lib/src/lib/checkbox/checkbox.html","../../../projects/brickclay-lib/src/lib/radio/radio.ts","../../../projects/brickclay-lib/src/lib/radio/radio.html","../../../projects/brickclay-lib/src/lib/pill/pill.ts","../../../projects/brickclay-lib/src/lib/pill/pill.html","../../../projects/brickclay-lib/src/lib/badge/badge.ts","../../../projects/brickclay-lib/src/lib/badge/badge.html","../../../projects/brickclay-lib/src/lib/spinner/spinner.ts","../../../projects/brickclay-lib/src/lib/spinner/spinner.html","../../../projects/brickclay-lib/src/lib/ui-button/ui-button.ts","../../../projects/brickclay-lib/src/lib/ui-button/ui-button.html","../../../projects/brickclay-lib/src/lib/ui-icon-button/ui-icon-button.ts","../../../projects/brickclay-lib/src/lib/ui-icon-button/ui-icon-button.html","../../../projects/brickclay-lib/src/lib/button-group/button-group.ts","../../../projects/brickclay-lib/src/lib/button-group/button-group.html","../../../projects/brickclay-lib/src/lib/textarea/textarea.ts","../../../projects/brickclay-lib/src/lib/textarea/textarea.html","../../../projects/brickclay-lib/src/lib/tooltip/tooltip.directive.ts","../../../projects/brickclay-lib/src/lib/grid/components/grid/grid.ts","../../../projects/brickclay-lib/src/lib/grid/components/grid/grid.html","../../../projects/brickclay-lib/src/lib/select/select.ts","../../../projects/brickclay-lib/src/lib/select/select.html","../../../projects/brickclay-lib/src/lib/input/input.ts","../../../projects/brickclay-lib/src/lib/input/input.html","../../../projects/brickclay-lib/src/lib/input-chips/input-chips.ts","../../../projects/brickclay-lib/src/lib/input-chips/input-chips.html","../../../projects/brickclay-lib/src/lib/tabs/tabs.ts","../../../projects/brickclay-lib/src/lib/tabs/tabs.html","../../../projects/brickclay-lib/src/lib/dialog/dialog.tokens.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-animations.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-container.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-container.html","../../../projects/brickclay-lib/src/lib/dialog/dialog-ref.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-config.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog.service.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-content-directives.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog.module.ts","../../../projects/brickclay-lib/src/lib/validator/validator.ts","../../../projects/brickclay-lib/src/lib/validator/validator.html","../../../projects/brickclay-lib/src/public-api.ts","../../../projects/brickclay-lib/src/brickclay-org-ui.ts"],"sourcesContent":["// Icon paths that will be resolved relative to the library's assets folder\r\n// When published to npm, users will need to configure their angular.json to include these assets\r\nexport const BrickclayIcons = {\r\n arrowleft: 'assets/icons/chevron-left.svg',\r\n arrowRight: 'assets/icons/chevron-right.svg',\r\n calenderIcon: 'assets/icons/calender.svg',\r\n timerIcon: 'assets/icons/timer.svg',\r\n} as const;\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-brickclay-lib',\r\n imports: [],\r\n template: `\r\n <p>\r\n brickclay-lib works!\r\n </p>\r\n `,\r\n styles: ``,\r\n})\r\nexport class BrickclayLib {\r\n\r\n}\r\n","import { BrickclayIcons } from '../../../assets/icons';\r\nimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, AfterViewInit, QueryList, ViewChildren, ElementRef, HostListener, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'bk-time-picker',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './time-picker.component.html',\r\n styleUrls: ['./time-picker.component.css']\r\n})\r\nexport class BkTimePicker implements OnInit, OnChanges, AfterViewInit {\r\n @Input() value: string = '1:00 AM'; // Time in format \"H:MM AM/PM\"\r\n @Input() label: string = 'Time';\r\n @Input() placeholder: string = 'Select time';\r\n @Input() position: 'left' | 'right' = 'left';\r\n @Input() pickerId: string = ''; // Unique ID for this picker\r\n @Input() closePicker: number = 0; // Close counter from parent (triggers close when changed)\r\n @Input() timeFormat: 12 | 24 = 12; // Visual mode: 12h or 24h\r\n @Input() showSeconds = false; // Whether to show/edit seconds\r\n @Output() timeChange = new EventEmitter<string>();\r\n @Output() pickerOpened = new EventEmitter<string>(); // Notify parent when opened\r\n @Output() pickerClosed = new EventEmitter<string>(); // Notify parent when closed\r\n\r\n @ViewChildren('timeScroll') timeScrollElements!: QueryList<ElementRef>;\r\n\r\n showPicker = false;\r\n currentHour = 1;\r\n currentMinute = 0;\r\n currentAMPM = 'AM';\r\n currentSecond = 0;\r\n\r\n brickclayIcons=BrickclayIcons;\r\n\r\n ngOnInit() {\r\n this.parseTimeValue();\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.showPicker) {\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 100);\r\n }\r\n }\r\n\r\n parseTimeValue() {\r\n const parsed = this.parseTimeStringToComponents(this.value);\r\n this.currentHour = parsed.hour;\r\n this.currentMinute = parsed.minute;\r\n this.currentSecond = parsed.second;\r\n this.currentAMPM = parsed.ampm;\r\n }\r\n\r\n getHours(): number[] {\r\n // 12-hour: 1-12, 24-hour: 0-23\r\n if (this.timeFormat === 24) {\r\n return Array.from({ length: 24 }, (_, i) => i);\r\n }\r\n return Array.from({ length: 12 }, (_, i) => i + 1);\r\n }\r\n\r\n getMinutes(): number[] {\r\n return Array.from({ length: 60 }, (_, i) => i);\r\n }\r\n\r\n getSeconds(): number[] {\r\n return Array.from({ length: 60 }, (_, i) => i);\r\n }\r\n\r\n getAMPMOptions(): string[] {\r\n return ['AM', 'PM'];\r\n }\r\n\r\n parseTimeStringToComponents(timeStr: string): { hour: number; minute: number; second: number; ampm: string } {\r\n // Supports:\r\n // - \"H:MM AM/PM\"\r\n // - \"H:MM:SS AM/PM\"\r\n // - \"HH:MM\" (24h)\r\n // - \"HH:MM:SS\" (24h)\r\n if (!timeStr) {\r\n return {\r\n hour: this.timeFormat === 24 ? 0 : 12,\r\n minute: 0,\r\n second: 0,\r\n ampm: this.timeFormat === 24 ? '' : 'AM'\r\n };\r\n }\r\n\r\n const parts = timeStr.trim().split(' ');\r\n const timePart = parts[0] || (this.timeFormat === 24 ? '00:00' : '12:00');\r\n let ampm = (parts[1] || '').toUpperCase();\r\n\r\n const [hoursStr, minutesStr, secondsStr] = timePart.split(':');\r\n let hour = parseInt(hoursStr || (this.timeFormat === 24 ? '0' : '12'), 10);\r\n const minute = parseInt(minutesStr || '0', 10);\r\n const second = parseInt(secondsStr || '0', 10);\r\n\r\n if (this.timeFormat === 24) {\r\n // In 24-hour mode we ignore AM/PM and keep hour as 0-23\r\n return {\r\n hour: isNaN(hour) ? 0 : Math.min(Math.max(hour, 0), 23),\r\n minute: isNaN(minute) ? 0 : Math.min(Math.max(minute, 0), 59),\r\n second: isNaN(second) ? 0 : Math.min(Math.max(second, 0), 59),\r\n ampm: ''\r\n };\r\n }\r\n\r\n // 12-hour mode: normalize AM/PM and convert 24h inputs if needed\r\n let ampmValue = ampm === 'PM' || ampm === 'AM' ? ampm : '';\r\n if (!ampmValue) {\r\n // No AM/PM provided -> interpret as 24-hour and convert to 12-hour with AM/PM\r\n if (hour >= 12) {\r\n ampmValue = 'PM';\r\n if (hour > 12) hour -= 12;\r\n } else {\r\n ampmValue = 'AM';\r\n if (hour === 0) hour = 12;\r\n }\r\n }\r\n\r\n // Clamp to 1-12 range\r\n if (hour < 1) hour = 1;\r\n if (hour > 12) hour = 12;\r\n\r\n return {\r\n hour,\r\n minute: isNaN(minute) ? 0 : Math.min(Math.max(minute, 0), 59),\r\n second: isNaN(second) ? 0 : Math.min(Math.max(second, 0), 59),\r\n ampm: ampmValue\r\n };\r\n }\r\n\r\n formatTimeFromComponents(hour: number, minute: number, second: number, ampm: string): string {\r\n const hStr = hour.toString().padStart(2, '0');\r\n const minuteStr = minute.toString().padStart(2, '0');\r\n const secondStr = second.toString().padStart(2, '0');\r\n\r\n if (this.timeFormat === 24) {\r\n // \"HH:mm\" or \"HH:mm:ss\"\r\n return this.showSeconds\r\n ? `${hStr}:${minuteStr}:${secondStr}`\r\n : `${hStr}:${minuteStr}`;\r\n }\r\n\r\n // 12-hour: \"H:MM\" or \"H:MM:SS\" with AM/PM\r\n const displayHour = hour; // already 1-12\r\n return this.showSeconds\r\n ? `${displayHour}:${minuteStr}:${secondStr} ${ampm}`\r\n : `${displayHour}:${minuteStr} ${ampm}`;\r\n }\r\n\r\n togglePicker() {\r\n if (!this.showPicker) {\r\n this.showPicker = true;\r\n this.parseTimeValue();\r\n this.pickerOpened.emit(this.pickerId);\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 100);\r\n } else {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n }\r\n }\r\n\r\n onHourChange(hour: number) {\r\n this.currentHour = hour;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n onMinuteChange(minute: number) {\r\n this.currentMinute = minute;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n onSecondChange(second: number) {\r\n this.currentSecond = second;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n onAMPMChange(ampm: string) {\r\n this.currentAMPM = ampm;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n updateTime() {\r\n const newTime = this.formatTimeFromComponents(\r\n this.currentHour,\r\n this.currentMinute,\r\n this.currentSecond,\r\n this.currentAMPM\r\n );\r\n this.value = newTime;\r\n this.timeChange.emit(newTime);\r\n }\r\n\r\n scrollToSelectedTimes() {\r\n this.timeScrollElements.forEach((elementRef) => {\r\n const element = elementRef.nativeElement;\r\n const selectedItem = element.querySelector('.time-item.selected');\r\n if (selectedItem) {\r\n const scrollTop = selectedItem.offsetTop - element.offsetHeight / 40 + selectedItem.offsetHeight / 40;\r\n element.scrollTop = scrollTop;\r\n }\r\n });\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n if (!target.closest('.time-picker-wrapper') && this.showPicker) {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n }\r\n }\r\n\r\n private previousCloseCounter: number = 0;\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['value'] && changes['value'].currentValue) {\r\n this.parseTimeValue();\r\n }\r\n if (changes['closePicker'] && this.showPicker) {\r\n const newCounter = changes['closePicker'].currentValue;\r\n // If counter increased, close the picker\r\n if (newCounter > this.previousCloseCounter) {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n this.previousCloseCounter = newCounter;\r\n }\r\n }\r\n }\r\n\r\n // Basic keyboard support on the input (combobox behavior)\r\n onInputKeydown(event: KeyboardEvent) {\r\n const key = event.key;\r\n\r\n if (key === 'Enter' || key === ' ') {\r\n event.preventDefault();\r\n this.togglePicker();\r\n return;\r\n }\r\n\r\n if (key === 'Escape' && this.showPicker) {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n return;\r\n }\r\n\r\n // Simple hour increment/decrement when closed\r\n if (!this.showPicker && (key === 'ArrowUp' || key === 'ArrowDown')) {\r\n event.preventDefault();\r\n if (this.timeFormat === 24) {\r\n if (key === 'ArrowUp') {\r\n this.currentHour = (this.currentHour + 1) % 24;\r\n } else {\r\n this.currentHour = this.currentHour <= 0 ? 23 : this.currentHour - 1;\r\n }\r\n } else {\r\n if (key === 'ArrowUp') {\r\n this.currentHour = this.currentHour >= 12 ? 1 : this.currentHour + 1;\r\n } else {\r\n this.currentHour = this.currentHour <= 1 ? 12 : this.currentHour - 1;\r\n }\r\n }\r\n this.updateTime();\r\n }\r\n }\r\n}\r\n\r\n","<div class=\"time-picker-wrapper\">\r\n <div class=\"time-input-group\">\r\n <label *ngIf=\"label\">{{ label }}</label>\r\n <div class=\"time-input-wrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"time-input\"\r\n [value]=\"value\"\r\n [placeholder]=\"placeholder\"\r\n readonly\r\n (click)=\"togglePicker()\">\r\n <span class=\"time-icon\">\r\n <img alt=\"timer\" class=\"timer-icon\" [src]='brickclayIcons.timerIcon'/>\r\n </span>\r\n <div class=\"custom-time-picker-dropdown\" *ngIf=\"showPicker\">\r\n <div class=\"custom-time-picker\" [ngClass]=\"position === 'left' ? 'left-position' : 'right-position'\">\r\n <!-- Hours Column -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #timeScroll>\r\n <div\r\n *ngFor=\"let h of getHours()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentHour === h\"\r\n (click)=\"onHourChange(h)\">\r\n {{ h.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <!-- Minutes Column -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #timeScroll>\r\n <div\r\n *ngFor=\"let m of getMinutes()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentMinute === m\"\r\n (click)=\"onMinuteChange(m)\">\r\n {{ m.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <!-- AM/PM Column -->\r\n <div class=\"time-column ampm-column\">\r\n <div class=\"time-scroll\" #timeScroll>\r\n <div\r\n *ngFor=\"let ap of getAMPMOptions()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentAMPM === ap\"\r\n (click)=\"onAMPMChange(ap)\">\r\n {{ ap }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CalendarManagerService {\r\n private calendarInstances: Set<() => void> = new Set();\r\n private closeAllSubject = new Subject<void>();\r\n \r\n closeAll$ = this.closeAllSubject.asObservable();\r\n\r\n /**\r\n * Register a calendar instance with its close function\r\n */\r\n register(closeFn: () => void): () => void {\r\n this.calendarInstances.add(closeFn);\r\n \r\n // Return unregister function\r\n return () => {\r\n this.calendarInstances.delete(closeFn);\r\n };\r\n }\r\n\r\n /**\r\n * Close all calendars except the one being opened\r\n */\r\n closeAllExcept(exceptCloseFn: () => void): void {\r\n this.calendarInstances.forEach(closeFn => {\r\n if (closeFn !== exceptCloseFn) {\r\n closeFn();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Close all calendars\r\n */\r\n closeAll(): void {\r\n this.closeAllSubject.next();\r\n this.calendarInstances.forEach(closeFn => closeFn());\r\n }\r\n}\r\n\r\n\r\n","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CalendarManagerService } from '../../services/calendar-manager.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { BkTimePicker } from '../time-picker/time-picker.component';\r\nimport moment from 'moment';\r\nimport { BrickclayIcons } from '../../../assets/icons';\r\nexport interface CalendarRange {\r\n start: Date;\r\n end: Date;\r\n}\r\n\r\nexport interface CalendarSelection {\r\n startDate: string | null;\r\n endDate: string | null;\r\n selectedDates?: string[]; // For multi-date selection\r\n}\r\n\r\n@Component({\r\n selector: 'bk-custom-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BkTimePicker],\r\n templateUrl: './custom-calendar.component.html',\r\n styleUrls: ['./custom-calendar.component.css']\r\n})\r\nexport class BkCustomCalendar implements OnInit, OnDestroy, OnChanges {\r\n\r\n // Basic Options\r\n @Input() enableTimepicker = false;\r\n @Input() autoApply = false;\r\n @Input() closeOnAutoApply = false;\r\n @Input() showCancel = true;\r\n @Input() linkedCalendars = false;\r\n @Input() singleDatePicker = false;\r\n @Input() showWeekNumbers = false;\r\n @Input() showISOWeekNumbers = false;\r\n @Input() customRangeDirection = false;\r\n @Input() lockStartDate = false;\r\n @Input() position: 'center' | 'left' | 'right' = 'left';\r\n @Input() drop: 'up' | 'down' = 'down';\r\n @Input() dualCalendar = false;\r\n @Input() showRanges = true;\r\n @Input() timeFormat: 12 | 24 = 24;\r\n @Input() enableSeconds = false;\r\n @Input() customRanges?: Record<string, CalendarRange>;\r\n @Input() multiDateSelection = false; // NEW: Enable multi-date selection\r\n @Input() maxDate?: Date; // NEW: Maximum selectable date\r\n @Input() minDate?: Date; // NEW: Minimum selectable date\r\n @Input() placeholder = 'Select date range'; // NEW: Custom placeholder\r\n @Input() opens: 'left' | 'right' | 'center' = 'left'; // NEW: Popup position\r\n @Input() inline = false; // NEW: Always show calendar inline (no popup)\r\n @Input() isDisplayCrossIcon = true; // NEW: Show/Hide clear (X) icon\r\n\r\n @Output() selected = new EventEmitter<CalendarSelection>();\r\n @Output() opened = new EventEmitter<void>();\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n /**\r\n * External value passed from parent. If provided, component will select these dates on init / change.\r\n * Accepts { startDate: Date|null, endDate: Date|null, selectedDates?: Date[] }\r\n */\r\n @Input() selectedValue: CalendarSelection | null = null;\r\n /** Optional display format for the input value. Uses moment formatting tokens. */\r\n @Input() displayFormat = 'MM/DD/YYYY';\r\n\r\n brickclayIcons = BrickclayIcons;\r\n\r\n show = false;\r\n today = new Date();\r\n month = this.today.getMonth();\r\n year = this.today.getFullYear();\r\n calendar: { day: number, currentMonth: boolean }[][] = [];\r\n leftMonth!: number;\r\n leftYear!: number;\r\n rightMonth!: number;\r\n rightYear!: number;\r\n leftCalendar: { day: number, currentMonth: boolean }[][] = [];\r\n rightCalendar: { day: number, currentMonth: boolean }[][] = [];\r\n @Input() startDate: Date | null = null;\r\n @Input() endDate: Date | null = null;\r\n selectedDates: Date[] = []; // NEW: For multi-date selection\r\n disableHighlight = false;\r\n hoveredDate: Date | null = null; // For hover preview\r\n\r\n // Track raw input values for minutes to allow free typing\r\n minuteInputValues: { [key: string]: string } = {};\r\n\r\n // Time picker for single calendar (12-hour format: 1-12)\r\n selectedHour = 1;\r\n selectedMinute = 0;\r\n selectedSecond = 0;\r\n selectedAMPM: 'AM' | 'PM' = 'AM';\r\n\r\n // NEW: Separate time pickers for dual calendar (12-hour format: 1-12)\r\n startHour = 1;\r\n startMinute = 0;\r\n startSecond = 0;\r\n startAMPM: 'AM' | 'PM' = 'AM';\r\n endHour = 2;\r\n endMinute = 0;\r\n endSecond = 0;\r\n endAMPM: 'AM' | 'PM' = 'AM';\r\n\r\n // Track open time-picker within this calendar (for single-open behavior)\r\n openTimePickerId: string | null = null;\r\n closePickerCounter: { [key: string]: number } = {};\r\n\r\n defaultRanges: Record<string, CalendarRange> = {};\r\n activeRange: string | null = null; // Track which range is currently active\r\n rangeOrder: string[] = []; // Maintain order of ranges\r\n\r\n private unregisterFn?: () => void;\r\n private closeAllSubscription?: Subscription;\r\n private closeFn?: () => void;\r\n\r\n constructor(private calendarManager: CalendarManagerService) {}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: MouseEvent) {\r\n // Don't handle click outside if inline mode is enabled\r\n if (this.inline) {\r\n return;\r\n }\r\n const target = event.target as HTMLElement;\r\n if (this.show && !target.closest('.calendar-container')) {\r\n this.close();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n if (!this.customRanges) {\r\n this.initializeDefaultRanges();\r\n } else {\r\n // If customRanges is provided via @Input, set the order based on the keys\r\n // Maintain the desired order if keys match, otherwise use provided order\r\n const desiredOrder = ['Today', 'Yesterday', 'Last 7 Days', 'Last 30 Days', 'This Month', 'Last Month', 'Custom Range'];\r\n const providedKeys = Object.keys(this.customRanges);\r\n // Check if Custom Range exists, if not add it\r\n if (!this.customRanges['Custom Range']) {\r\n this.customRanges['Custom Range'] = { start: new Date(), end: new Date() };\r\n }\r\n // Build order: first add desired order items that exist, then add any remaining\r\n this.rangeOrder = desiredOrder.filter(key => providedKeys.includes(key) || key === 'Custom Range');\r\n const remaining = providedKeys.filter(key => !this.rangeOrder.includes(key));\r\n this.rangeOrder = [...this.rangeOrder, ...remaining];\r\n }\r\n if (this.dualCalendar) this.initializeDual();\r\n else this.generateCalendar();\r\n\r\n // Initialize time from existing dates if available\r\n if (this.startDate) {\r\n this.initializeTimeFromDate(this.startDate, true);\r\n }\r\n if (this.endDate) {\r\n this.initializeTimeFromDate(this.endDate, false);\r\n }\r\n\r\n // Check if current dates match any predefined range\r\n if (this.startDate && this.endDate) {\r\n this.checkAndSetActiveRange();\r\n }\r\n\r\n // If inline mode, always show calendar\r\n if (this.inline) {\r\n this.show = true;\r\n }\r\n\r\n // Register this calendar instance with the manager service\r\n this.closeFn = () => {\r\n if (this.show && !this.inline) {\r\n this.close();\r\n }\r\n };\r\n this.unregisterFn = this.calendarManager.register(this.closeFn);\r\n\r\n // Subscribe to close all events (skip if inline)\r\n this.closeAllSubscription = this.calendarManager.closeAll$.subscribe(() => {\r\n if (this.show && !this.inline) {\r\n this.close();\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['selectedValue'] && this.selectedValue) {\r\n // Normalize incoming values to Date or null\r\n const s = this.selectedValue;\r\n this.startDate = s.startDate ? new Date(s.startDate) : null;\r\n this.endDate = s.endDate ? new Date(s.endDate) : null;\r\n this.selectedDates = (s.selectedDates || []).map((d) => new Date(d));\r\n\r\n // Update calendar month/year to show the start date (or end date if start missing)\r\n const focusDate = this.startDate ?? this.endDate ?? new Date();\r\n this.month = focusDate.getMonth();\r\n this.year = focusDate.getFullYear();\r\n if (this.dualCalendar) {\r\n this.initializeDual();\r\n } else {\r\n this.generateCalendar();\r\n }\r\n\r\n // Re-evaluate active range if any\r\n this.checkAndSetActiveRange();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Unregister this calendar instance\r\n if (this.unregisterFn) {\r\n this.unregisterFn();\r\n }\r\n\r\n // Unsubscribe from close all events\r\n if (this.closeAllSubscription) {\r\n this.closeAllSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n checkAndSetActiveRange() {\r\n if (!this.customRanges || !this.startDate || !this.endDate) return;\r\n\r\n // Normalize dates for comparison (ignore time)\r\n const normalizeDate = (date: Date) => {\r\n const d = new Date(date);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n };\r\n\r\n const start = normalizeDate(this.startDate);\r\n const end = normalizeDate(this.endDate);\r\n\r\n // Check each range (except Custom Range)\r\n for (const key of this.rangeOrder) {\r\n if (key === 'Custom Range') continue;\r\n const range = this.customRanges![key];\r\n if (range) {\r\n const rangeStart = normalizeDate(range.start);\r\n const rangeEnd = normalizeDate(range.end);\r\n if (start.getTime() === rangeStart.getTime() && end.getTime() === rangeEnd.getTime()) {\r\n this.activeRange = key;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // If no match found, it's a custom range\r\n this.activeRange = 'Custom Range';\r\n }\r\n\r\n initializeDefaultRanges() {\r\n const today = new Date();\r\n this.customRanges = {\r\n 'Today': { start: new Date(today.getFullYear(), today.getMonth(), today.getDate()), end: new Date(today.getFullYear(), today.getMonth(), today.getDate()) },\r\n 'Yesterday': { start: this.addDays(today, -1), end: this.addDays(today, -1) },\r\n 'Last 7 Days': { start: this.addDays(today, -6), end: today },\r\n 'Last 30 Days': { start: this.addDays(today, -29), end: today },\r\n 'This Month': { start: new Date(today.getFullYear(), today.getMonth(), 1), end: today },\r\n 'Last Month': { start: new Date(today.getFullYear(), today.getMonth() - 1, 1), end: new Date(today.getFullYear(), today.getMonth(), 0) },\r\n 'Custom Range': { start: new Date(), end: new Date() }, // Placeholder, won't be used for selection\r\n };\r\n // Set the order of ranges\r\n this.rangeOrder = ['Today', 'Yesterday', 'Last 7 Days', 'Last 30 Days', 'This Month', 'Last Month', 'Custom Range'];\r\n }\r\n\r\n initializeTimeFromDate(date: Date, isStart: boolean) {\r\n // Always use 12-hour format\r\n const hours24 = date.getHours();\r\n const minutes = date.getMinutes();\r\n const seconds = date.getSeconds();\r\n\r\n if (isStart) {\r\n this.startMinute = minutes;\r\n this.startSecond = seconds;\r\n if (hours24 >= 12) {\r\n this.startAMPM = 'PM';\r\n this.startHour = hours24 > 12 ? hours24 - 12 : 12;\r\n } else {\r\n this.startAMPM = 'AM';\r\n this.startHour = hours24 === 0 ? 12 : hours24;\r\n }\r\n } else {\r\n this.endMinute = minutes;\r\n this.endSecond = seconds;\r\n if (hours24 >= 12) {\r\n this.endAMPM = 'PM';\r\n this.endHour = hours24 > 12 ? hours24 - 12 : 12;\r\n } else {\r\n this.endAMPM = 'AM';\r\n this.endHour = hours24 === 0 ? 12 : hours24;\r\n }\r\n }\r\n }\r\n\r\n toggle() {\r\n // Don't toggle if inline mode is enabled\r\n if (this.inline) {\r\n return;\r\n }\r\n const wasOpen = this.show;\r\n this.show = !this.show;\r\n\r\n if (this.show) {\r\n // If opening, close all other calendars first\r\n if (!wasOpen && this.closeFn) {\r\n this.calendarManager.closeAllExcept(this.closeFn);\r\n }\r\n this.disableHighlight = false;\r\n this.opened.emit();\r\n } else {\r\n this.closed.emit();\r\n }\r\n }\r\n\r\n close() {\r\n // Don't close if inline mode is enabled\r\n if (this.inline) {\r\n return;\r\n }\r\n this.show = false;\r\n this.closed.emit();\r\n }\r\n\r\n onDateHover(day: number | null, fromRight = false) {\r\n if (!day || this.singleDatePicker || this.multiDateSelection) {\r\n this.hoveredDate = null;\r\n return;\r\n }\r\n\r\n // Only show hover preview if start date is selected but end date is not\r\n if (!this.startDate || this.endDate) {\r\n this.hoveredDate = null;\r\n return;\r\n }\r\n\r\n if (!this.dualCalendar) {\r\n this.hoveredDate = new Date(this.year, this.month, day);\r\n } else {\r\n this.hoveredDate = fromRight\r\n ? new Date(this.rightYear, this.rightMonth, day)\r\n : new Date(this.leftYear, this.leftMonth, day);\r\n }\r\n }\r\n\r\n onDateLeave() {\r\n this.hoveredDate = null;\r\n }\r\n\r\n selectDate(day: number | null, fromRight = false) {\r\n if (!day) return;\r\n\r\n let selected: Date;\r\n if (!this.dualCalendar) {\r\n selected = new Date(this.year, this.month, day);\r\n } else {\r\n selected = fromRight\r\n ? new Date(this.rightYear, this.rightMonth, day)\r\n : new Date(this.leftYear, this.leftMonth, day);\r\n }\r\n\r\n // Clear hover on selection\r\n this.hoveredDate = null;\r\n\r\n // Check min/max date constraints\r\n if (this.minDate && selected < this.minDate) return;\r\n if (this.maxDate && selected > this.maxDate) return;\r\n\r\n // Multi-date selection mode\r\n if (this.multiDateSelection) {\r\n this.handleMultiDateSelection(selected);\r\n return;\r\n }\r\n\r\n // Apply time if timepicker is enabled (convert 12-hour to 24-hour)\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n // For dual calendar, use separate start/end times\r\n // If no startDate OR endDate exists, we're selecting start date\r\n const isStart = !this.startDate || !!this.endDate;\r\n this.applyTimeToDate(selected, isStart);\r\n } else {\r\n // For single calendar, always use selected time for start\r\n this.applyTimeToDate(selected, true);\r\n }\r\n }\r\n\r\n // Single date picker mode\r\n if (this.singleDatePicker) {\r\n this.startDate = selected;\r\n this.endDate = null;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Apply time immediately if timepicker is enabled\r\n if (this.enableTimepicker) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.autoApply) {\r\n this.apply();\r\n if (this.closeOnAutoApply && !this.inline) this.close();\r\n } else {\r\n // Always emit selection event even if autoApply is false (especially for inline calendars)\r\n this.emitSelection();\r\n }\r\n return;\r\n }\r\n\r\n // Range selection mode\r\n if (!this.startDate || this.endDate) {\r\n this.startDate = selected;\r\n this.endDate = null;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Keep left calendar on the selected month for better UX\r\n if (this.dualCalendar) {\r\n this.leftMonth = selected.getMonth();\r\n this.leftYear = selected.getFullYear();\r\n // Reset right calendar to original position (next month after left) when end date is cleared\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n this.generateDualCalendars();\r\n }\r\n // Don't overwrite time picker values - keep current values and apply them to the date\r\n // Time picker values are already set by user, we just apply them to the selected date\r\n } else {\r\n if (selected < this.startDate && !this.customRangeDirection) {\r\n this.endDate = this.startDate;\r\n this.startDate = selected;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Swap times if needed\r\n if (this.dualCalendar && this.enableTimepicker) {\r\n [this.startHour, this.endHour] = [this.endHour, this.startHour];\r\n [this.startMinute, this.endMinute] = [this.endMinute, this.startMinute];\r\n [this.startSecond, this.endSecond] = [this.endSecond, this.startSecond];\r\n [this.startAMPM, this.endAMPM] = [this.endAMPM, this.startAMPM];\r\n }\r\n // Keep left calendar on the selected month\r\n if (this.dualCalendar) {\r\n this.leftMonth = selected.getMonth();\r\n this.leftYear = selected.getFullYear();\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n }\r\n } else {\r\n this.endDate = selected;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Only move right calendar if end date is in a different month than start date\r\n if (this.dualCalendar) {\r\n if (this.startDate) {\r\n const startMonth = this.startDate.getMonth();\r\n const startYear = this.startDate.getFullYear();\r\n const endMonth = selected.getMonth();\r\n const endYear = selected.getFullYear();\r\n\r\n // Only move right calendar if end date is in a different month\r\n if (endMonth !== startMonth || endYear !== startYear) {\r\n this.rightMonth = endMonth;\r\n this.rightYear = endYear;\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n // If both dates are in same month, keep right calendar in its current position\r\n } else {\r\n // If no start date, move right calendar to end date month\r\n this.rightMonth = selected.getMonth();\r\n this.rightYear = selected.getFullYear();\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n }\r\n // Don't overwrite time picker values - keep current end time values\r\n // Time picker values are already set by user\r\n }\r\n if (this.autoApply) {\r\n this.apply();\r\n if (this.closeOnAutoApply && !this.inline) this.close();\r\n } else {\r\n // Check if the selection matches a predefined range\r\n this.checkAndSetActiveRange();\r\n // Always emit selection event for inline calendars\r\n if (this.inline) {\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n }\r\n\r\n handleMultiDateSelection(selected: Date) {\r\n const dateStr = this.getDateString(selected);\r\n const existingIndex = this.selectedDates.findIndex(d => this.getDateString(d) === dateStr);\r\n\r\n if (existingIndex >= 0) {\r\n // Deselect if already selected\r\n this.selectedDates.splice(existingIndex, 1);\r\n } else {\r\n // Add to selection\r\n this.selectedDates.push(new Date(selected));\r\n this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\r\n }\r\n\r\n // Update startDate and endDate for compatibility\r\n if (this.selectedDates.length > 0) {\r\n this.startDate = new Date(this.selectedDates[0]);\r\n this.endDate = new Date(this.selectedDates[this.selectedDates.length - 1]);\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n } else {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.activeRange = null;\r\n }\r\n\r\n // Always emit selection event for inline calendars or when autoApply is true\r\n if (this.autoApply || this.inline) {\r\n this.emitSelection();\r\n if (this.closeOnAutoApply && !this.inline) this.close();\r\n }\r\n }\r\n\r\n getDateString(date: Date): string {\r\n return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\r\n }\r\n\r\n isDateInMultiSelection(year: number, month: number, day: number): boolean {\r\n if (!this.multiDateSelection || this.selectedDates.length === 0) return false;\r\n const cellDate = new Date(year, month, day);\r\n return this.selectedDates.some(d => this.getDateString(d) === this.getDateString(cellDate));\r\n }\r\n\r\n apply() {\r\n // Format minute inputs to 2 digits before applying\r\n this.formatAllMinuteInputs();\r\n\r\n // Apply time to dates\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n // Dual calendar with separate start/end times (always 12-hour format)\r\n if (this.startDate) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate) {\r\n this.applyTimeToDate(this.endDate, false);\r\n }\r\n } else {\r\n // Single calendar with time (always 12-hour format)\r\n if (this.startDate) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate && !this.singleDatePicker) {\r\n this.applyTimeToDate(this.endDate, true);\r\n }\r\n }\r\n }\r\n\r\n // Check if the selection matches a predefined range\r\n this.checkAndSetActiveRange();\r\n\r\n this.emitSelection();\r\n this.disableHighlight = true;\r\n this.close();\r\n }\r\n\r\n cancel() {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.selectedDates = [];\r\n this.close();\r\n }\r\n\r\n clear() {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.selectedDates = [];\r\n this.activeRange = null; // Clear active range\r\n\r\n // Reset right calendar to original position (next month after left) when end date is cleared\r\n if (this.dualCalendar && !this.endDate) {\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n this.generateDualCalendars();\r\n }\r\n\r\n this.emitSelection();\r\n }\r\n\r\n chooseRange(key: string) {\r\n if (!this.customRanges) return;\r\n // Don't allow selecting \"Custom Range\" directly - it's only activated when manually selecting dates\r\n if (key === 'Custom Range') return;\r\n const r = this.customRanges[key];\r\n if (!r) return;\r\n this.startDate = new Date(r.start);\r\n this.endDate = new Date(r.end);\r\n this.selectedDates = [];\r\n this.activeRange = key; // Set active range\r\n\r\n // Navigate calendars to show the selected date range\r\n if (this.dualCalendar) {\r\n // For dual calendar: left always shows start date month\r\n if (this.startDate) {\r\n this.leftMonth = this.startDate.getMonth();\r\n this.leftYear = this.startDate.getFullYear();\r\n }\r\n\r\n // Right calendar logic\r\n if (this.endDate && this.startDate) {\r\n const startMonth = this.startDate.getMonth();\r\n const startYear = this.startDate.getFullYear();\r\n const endMonth = this.endDate.getMonth();\r\n const endYear = this.endDate.getFullYear();\r\n\r\n // Only move right calendar if end date is in a different month than start date\r\n if (endMonth !== startMonth || endYear !== startYear) {\r\n this.rightMonth = endMonth;\r\n this.rightYear = endYear;\r\n } else {\r\n // If both dates are in same month, reset right calendar to default position (next month after left)\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n }\r\n } else if (this.endDate && !this.startDate) {\r\n // If only end date exists, show it in right calendar\r\n this.rightMonth = this.endDate.getMonth();\r\n this.rightYear = this.endDate.getFullYear();\r\n } else {\r\n // If no end date, reset right calendar to default position\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n }\r\n\r\n this.generateDualCalendars();\r\n } else {\r\n // For single calendar: show the start date month (or end date if only end date exists)\r\n if (this.startDate) {\r\n this.month = this.startDate.getMonth();\r\n this.year = this.startDate.getFullYear();\r\n } else if (this.endDate) {\r\n this.month = this.endDate.getMonth();\r\n this.year = this.endDate.getFullYear();\r\n }\r\n this.generateCalendar();\r\n }\r\n\r\n this.emitSelection();\r\n if (this.autoApply || this.closeOnAutoApply) {\r\n this.close();\r\n }\r\n }\r\n\r\n // emitSelection() {\r\n // const selection: CalendarSelection = {\r\n // startDate: this.startDate,\r\n // endDate: this.endDate\r\n // };\r\n // if (this.multiDateSelection) {\r\n // selection.selectedDates = [...this.selectedDates];\r\n // }\r\n // this.selected.emit(selection);\r\n // }\r\n\r\n emitSelection() {\r\n const selection: CalendarSelection = {\r\n startDate: this.startDate ? this.formatDateToString(this.startDate) : null,\r\n endDate: this.endDate ? this.formatDateToString(this.endDate) : null,\r\n };\r\n\r\n if (this.multiDateSelection && this.selectedDates.length > 0) {\r\n selection.selectedDates = this.selectedDates.map(d => this.formatDateToString(d));\r\n }\r\n\r\n this.selected.emit(selection);\r\n }\r\n\r\n addDays(date: Date, days: number): Date {\r\n const d = new Date(date);\r\n d.setDate(d.getDate() + days);\r\n return d;\r\n }\r\n\r\n generateCalendar() {\r\n this.calendar = this.buildCalendar(this.year, this.month);\r\n }\r\n\r\n nextMonth() {\r\n if (!this.dualCalendar) {\r\n this.month++;\r\n if (this.month > 11) { this.month = 0; this.year++; }\r\n this.generateCalendar();\r\n return;\r\n }\r\n // For dual calendar, this should not be used - use nextLeftMonth or nextRightMonth instead\r\n this.nextLeftMonth();\r\n }\r\n\r\n prevMonth() {\r\n if (!this.dualCalendar) {\r\n this.month--;\r\n if (this.month < 0) { this.month = 11; this.year--; }\r\n this.generateCalendar();\r\n return;\r\n }\r\n // For dual calendar, this should not be used - use prevLeftMonth or prevRightMonth instead\r\n this.prevLeftMonth();\r\n }\r\n\r\n // Independent navigation for left calendar\r\n nextLeftMonth() {\r\n this.leftMonth++;\r\n if (this.leftMonth > 11) { this.leftMonth = 0; this.leftYear++; }\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n }\r\n\r\n prevLeftMonth() {\r\n this.leftMonth--;\r\n if (this.leftMonth < 0) { this.leftMonth = 11; this.leftYear--; }\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n }\r\n\r\n // Independent navigation for right calendar\r\n nextRightMonth() {\r\n this.rightMonth++;\r\n if (this.rightMonth > 11) { this.rightMonth = 0; this.rightYear++; }\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n\r\n prevRightMonth() {\r\n this.rightMonth--;\r\n if (this.rightMonth < 0) { this.rightMonth = 11; this.rightYear--; }\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n\r\n initializeDual() {\r\n this.leftMonth = this.today.getMonth();\r\n this.leftYear = this.today.getFullYear();\r\n // Initialize right calendar to next month, but they can move independently\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) { this.rightMonth = 0; this.rightYear++; }\r\n this.generateDualCalendars();\r\n }\r\n\r\n generateDualCalendars() {\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n\r\n buildCalendar(year: number, month: number): { day: number, currentMonth: boolean }[][] {\r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n const prevMonthDays = new Date(year, month, 0).getDate();\r\n\r\n const grid: { day: number, currentMonth: boolean }[][] = [];\r\n let row: { day: number, currentMonth: boolean }[] = [];\r\n\r\n // Adjust first day (0 = Sunday, 1 = Monday, etc.)\r\n const adjustedFirstDay = firstDay === 0 ? 6 : firstDay - 1; // Make Monday = 0\r\n\r\n for (let i = adjustedFirstDay - 1; i >= 0; i--) {\r\n row.push({ day: prevMonthDays - i, currentMonth: false });\r\n }\r\n for (let d = 1; d <= daysInMonth; d++) {\r\n row.push({ day: d, currentMonth: true });\r\n if (row.length === 7) { grid.push(row); row = []; }\r\n }\r\n let nextMonthDay = 1;\r\n while (row.length > 0 && row.length < 7) {\r\n row.push({ day: nextMonthDay++, currentMonth: false });\r\n }\r\n if (row.length) grid.push(row);\r\n\r\n // Ensure we always have 6 rows (42 cells total) for consistent layout\r\n while (grid.length < 6) {\r\n const newRow: { day: number, currentMonth: boolean }[] = [];\r\n for (let i = 0; i < 7; i++) {\r\n newRow.push({ day: nextMonthDay++, currentMonth: false });\r\n }\r\n grid.push(newRow);\r\n }\r\n\r\n return grid;\r\n }\r\n\r\n isDateSelected(year: number, month: number, day: number): boolean {\r\n if (this.disableHighlight) return false;\r\n if (!day) return false;\r\n\r\n // Multi-date selection\r\n if (this.multiDateSelection) {\r\n return this.isDateInMultiSelection(year, month, day);\r\n }\r\n\r\n const cellDate = new Date(year, month, day);\r\n\r\n // Check if it's today (highlight today by default if no date selected)\r\n const today = new Date();\r\n const isToday = cellDate.getFullYear() === today.getFullYear() &&\r\n cellDate.getMonth() === today.getMonth() &&\r\n cellDate.getDate() === today.getDate();\r\n\r\n // If no startDate is set and it's today, highlight it\r\n if (!this.startDate && isToday) {\r\n return true;\r\n }\r\n\r\n if (!this.startDate) return false;\r\n\r\n // Check if date is disabled\r\n if (this.minDate && cellDate < this.minDate) return false;\r\n if (this.maxDate && cellDate > this.maxDate) return false;\r\n\r\n const sameDay =\r\n cellDate.getFullYear() === this.startDate.getFullYear() &&\r\n cellDate.getMonth() === this.startDate.getMonth() &&\r\n cellDate.getDate() === this.startDate.getDate();\r\n\r\n if (this.singleDatePicker) return sameDay;\r\n\r\n // For range selection: only highlight start and end dates (not in-between)\r\n if (this.startDate && this.endDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const end = new Date(this.endDate.getFullYear(), this.endDate.getMonth(), this.endDate.getDate());\r\n return cellDate.getTime() === start.getTime() || cellDate.getTime() === end.getTime();\r\n }\r\n\r\n // If only start date is selected and hovering, check if this is start or hovered end\r\n if (this.startDate && !this.endDate && this.hoveredDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const hovered = new Date(this.hoveredDate.getFullYear(), this.hoveredDate.getMonth(), this.hoveredDate.getDate());\r\n // Show both start and hovered date as selected (circular black)\r\n return cellDate.getTime() === start.getTime() || cellDate.getTime() === hovered.getTime();\r\n }\r\n\r\n return sameDay;\r\n }\r\n\r\n isDateInRange(year: number, month: number, day: number): boolean {\r\n if (this.disableHighlight || !day) return false;\r\n if (this.singleDatePicker) return false;\r\n if (this.multiDateSelection) return false;\r\n\r\n const cellDate = new Date(year, month, day);\r\n\r\n // If both start and end are selected, show gray background for dates in between\r\n if (this.startDate && this.endDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const end = new Date(this.endDate.getFullYear(), this.endDate.getMonth(), this.endDate.getDate());\r\n return cellDate > start && cellDate < end;\r\n }\r\n\r\n // If only start is selected and hovering, show preview range\r\n if (this.startDate && !this.endDate && this.hoveredDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const hovered = new Date(this.hoveredDate.getFullYear(), this.hoveredDate.getMonth(), this.hoveredDate.getDate());\r\n\r\n // Determine which is earlier - show gray background for dates between them\r\n const minDate = hovered < start ? hovered : start;\r\n const maxDate = hovered >= start ? hovered : start;\r\n return cellDate > minDate && cellDate < maxDate;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isDateDisabled(year: number, month: number, day: number): boolean {\r\n if (!day) return false;\r\n const cellDate = new Date(year, month, day);\r\n if (this.minDate && cellDate < this.minDate) return true;\r\n if (this.maxDate && cellDate > this.maxDate) return true;\r\n return false;\r\n }\r\n\r\n isToday(year: number, month: number, day: number): boolean {\r\n if (!day) return false;\r\n const today = new Date();\r\n const cellDate = new Date(year, month, day);\r\n return cellDate.getFullYear() === today.getFullYear() &&\r\n cellDate.getMonth() === today.getMonth() &&\r\n cellDate.getDate() === today.getDate();\r\n }\r\n\r\n getDisplayValue(): string {\r\n if (this.multiDateSelection && this.selectedDates.length > 0) {\r\n if (this.selectedDates.length === 1) {\r\n return moment(this.selectedDates[0]).format(this.displayFormat);\r\n }\r\n return `${this.selectedDates.length} dates selected`;\r\n }\r\n\r\n if (!this.startDate) return '';\r\n\r\n // Prefer moment formatting for consistent display\r\n let dateStr = moment(this.startDate).format(this.displayFormat);\r\n\r\n if (this.enableTimepicker && !this.dualCalendar) {\r\n const hr = this.startDate.getHours().toString().padStart(2, '0');\r\n const min = this.startDate.getMinutes().toString().padStart(2, '0');\r\n dateStr += ` ${hr}:${min}`;\r\n if (this.enableSeconds) {\r\n const sec = this.startDate.getSeconds().toString().padStart(2, '0');\r\n dateStr += `:${sec}`;\r\n }\r\n }\r\n\r\n if (this.endDate && !this.singleDatePicker) {\r\n let endStr = moment(this.endDate).format(this.displayFormat);\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n const startHr = this.startDate.getHours().toString().padStart(2, '0');\r\n const startMin = this.startDate.getMinutes().toString().padStart(2, '0');\r\n dateStr += ` ${startHr}:${startMin}`;\r\n if (this.enableSeconds) {\r\n const startSec = this.startDate.getSeconds().toString().padStart(2, '0');\r\n dateStr += `:${startSec}`;\r\n }\r\n }\r\n const endHr = this.endDate.getHours().toString().padStart(2, '0');\r\n const endMin = this.endDate.getMinutes().toString().padStart(2, '0');\r\n endStr += ` ${endHr}:${endMin}`;\r\n if (this.enableSeconds) {\r\n const endSec = this.endDate.getSeconds().toString().padStart(2, '0');\r\n endStr += `:${endSec}`;\r\n }\r\n }\r\n return `${dateStr} - ${endStr}`;\r\n }\r\n return dateStr;\r\n }\r\n\r\n // Time picker helpers\r\n getTimeInputValue(isStart = true): string {\r\n const h = isStart ? this.startHour : this.endHour;\r\n const m = isStart ? this.startMinute : this.endMinute;\r\n return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;\r\n }\r\n\r\n getSingleTimeInputValue(): string {\r\n return `${this.selectedHour.toString().padStart(2, '0')}:${this.selectedMinute.toString().padStart(2, '0')}`;\r\n }\r\n\r\n // NEW: Helper to build display value for BkTimePicker (single calendar)\r\n getSingleTimePickerDisplay(): string {\r\n const hour = this.selectedHour || 12;\r\n const minuteStr = this.selectedMinute.toString().padStart(2, '0');\r\n const ampm = this.selectedAMPM || 'AM';\r\n return `${hour}:${minuteStr} ${ampm}`;\r\n }\r\n\r\n // NEW: Helper to build display value for BkTimePicker (dual calendar)\r\n getDualTimePickerDisplay(isStart = true): string {\r\n const hour = isStart ? (this.startHour || 12) : (this.endHour || 12);\r\n const minute = isStart ? this.startMinute : this.endMinute;\r\n const ampm = isStart ? (this.startAMPM || 'AM') : (this.endAMPM || 'AM');\r\n const minuteStr = minute.toString().padStart(2, '0');\r\n return `${hour}:${minuteStr} ${ampm}`;\r\n }\r\n\r\n // Coordination helpers for embedded BkTimePicker instances\r\n onTimePickerOpened(pickerId: string) {\r\n // Close previously open picker inside this calendar\r\n if (this.openTimePickerId && this.openTimePickerId !== pickerId) {\r\n if (!this.closePickerCounter[this.openTimePickerId]) {\r\n this.closePickerCounter[this.openTimePickerId] = 0;\r\n }\r\n this.closePickerCounter[this.openTimePickerId]++;\r\n }\r\n this.openTimePickerId = pickerId;\r\n }\r\n\r\n onTimePickerClosed(pickerId: string) {\r\n if (this.openTimePickerId === pickerId) {\r\n this.openTimePickerId = null;\r\n }\r\n }\r\n\r\n shouldClosePicker(pickerId: string): number {\r\n return this.closePickerCounter[pickerId] || 0;\r\n }\r\n\r\n // NEW: Parse \"H:MM AM/PM\" (or \"HH:MM\" 24h) from BkTimePicker\r\n private parsePickerTimeString(timeStr: string): { hour12: number; minute: number; ampm: 'AM' | 'PM' } {\r\n if (!timeStr) {\r\n return { hour12: 12, minute: 0, ampm: 'AM' };\r\n }\r\n\r\n const parts = timeStr.trim().split(' ');\r\n const timePart = parts[0] || '12:00';\r\n let ampmPart = (parts[1] || '').toUpperCase();\r\n\r\n const [hourStr, minuteStr] = timePart.split(':');\r\n let hour = parseInt(hourStr || '12', 10);\r\n const minute = parseInt(minuteStr || '0', 10);\r\n\r\n if (ampmPart !== 'AM' && ampmPart !== 'PM') {\r\n // Interpret as 24-hour input and convert\r\n if (hour >= 12) {\r\n ampmPart = 'PM';\r\n if (hour > 12) hour -= 12;\r\n } else {\r\n ampmPart = 'AM';\r\n if (hour === 0) hour = 12;\r\n }\r\n }\r\n\r\n // Clamp to 1-12 range just in case\r\n if (hour < 1) hour = 1;\r\n if (hour > 12) hour = 12;\r\n\r\n return { hour12: hour, minute, ampm: ampmPart as 'AM' | 'PM' };\r\n }\r\n\r\n // NEW: Handle BkTimePicker change for single calendar\r\n onSingleTimePickerChange(time: string) {\r\n const { hour12, minute, ampm } = this.parsePickerTimeString(time);\r\n\r\n this.selectedHour = hour12;\r\n this.selectedMinute = minute;\r\n this.selectedAMPM = ampm;\r\n\r\n if (this.startDate) {\r\n let h24 = hour12;\r\n if (ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.startDate.setHours(h24, minute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n // NEW: Handle BkTimePicker change for dual calendar\r\n onDualTimePickerChange(time: string, isStart = true) {\r\n const { hour12, minute, ampm } = this.parsePickerTimeString(time);\r\n\r\n if (isStart) {\r\n this.startHour = hour12;\r\n this.startMinute = minute;\r\n this.startAMPM = ampm;\r\n\r\n if (this.startDate) {\r\n let h24 = hour12;\r\n if (ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.startDate.setHours(h24, minute, this.startSecond);\r\n }\r\n } else {\r\n this.endHour = hour12;\r\n this.endMinute = minute;\r\n this.endAMPM = ampm;\r\n\r\n if (this.endDate) {\r\n let h24 = hour12;\r\n if (ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.endDate.setHours(h24, minute, this.endSecond);\r\n }\r\n }\r\n\r\n this.emitSelection();\r\n }\r\n\r\n onTimeChange(event: any, isStart = true) {\r\n const [h, m] = event.target.value.split(':').map(Number);\r\n if (isStart) {\r\n this.startHour = h;\r\n this.startMinute = m;\r\n if (this.startDate) {\r\n this.startDate.setHours(h, m, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endHour = h;\r\n this.endMinute = m;\r\n if (this.endDate) {\r\n this.endDate.setHours(h, m, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n\r\n onSingleTimeChange(event: any) {\r\n const [h, m] = event.target.value.split(':').map(Number);\r\n this.selectedHour = h;\r\n this.selectedMinute = m;\r\n if (this.startDate) {\r\n this.startDate.setHours(h, m, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n // Custom time picker controls\r\n incrementHour(isStart = true) {\r\n // 12-hour format: 1-12\r\n if (isStart) {\r\n this.startHour = this.startHour >= 12 ? 1 : this.startHour + 1;\r\n // Toggle AM/PM at 12\r\n if (this.startHour === 12) {\r\n this.startAMPM = this.startAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endHour = this.endHour >= 12 ? 1 : this.endHour + 1;\r\n // Toggle AM/PM at 12\r\n if (this.endHour === 12) {\r\n this.endAMPM = this.endAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n decrementHour(isStart = true) {\r\n // 12-hour format: 1-12\r\n if (isStart) {\r\n this.startHour = this.startHour <= 1 ? 12 : this.startHour - 1;\r\n // Toggle AM/PM at 12\r\n if (this.startHour === 12) {\r\n this.startAMPM = this.startAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endHour = this.endHour <= 1 ? 12 : this.endHour - 1;\r\n // Toggle AM/PM at 12\r\n if (this.endHour === 12) {\r\n this.endAMPM = this.endAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n incrementMinute(isStart = true) {\r\n if (isStart) {\r\n this.startMinute = (this.startMinute + 1) % 60;\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endMinute = (this.endMinute + 1) % 60;\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n decrementMinute(isStart = true) {\r\n if (isStart) {\r\n this.startMinute = this.startMinute <= 0 ? 59 : this.startMinute - 1;\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endMinute = this.endMinute <= 0 ? 59 : this.endMinute - 1;\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n toggleAMPM(isStart = true) {\r\n if (isStart) {\r\n this.startAMPM = this.startAMPM === 'AM' ? 'PM' : 'AM';\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endAMPM = this.endAMPM === 'AM' ? 'PM' : 'AM';\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n // Single calendar time picker controls (12-hour format: 1-12)\r\n incrementSingleHour() {\r\n this.selectedHour = this.selectedHour >= 12 ? 1 : this.selectedHour + 1;\r\n // Toggle AM/PM at 12\r\n if (this.selectedHour === 12) {\r\n this.selectedAMPM = this.selectedAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n decrementSingleHour() {\r\n this.selectedHour = this.selectedHour <= 1 ? 12 : this.selectedHour - 1;\r\n // Toggle AM/PM at 12\r\n if (this.selectedHour === 12) {\r\n this.selectedAMPM = this.selectedAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n incrementSingleMinute() {\r\n this.selectedMinute = (this.selectedMinute + 1) % 60;\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n decrementSingleMinute() {\r\n this.selectedMinute = this.selectedMinute <= 0 ? 59 : this.selectedMinute - 1;\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n toggleSingleAMPM() {\r\n this.selectedAMPM = this.selectedAMPM === 'AM' ? 'PM' : 'AM';\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n getMonthName(month: number): string {\r\n const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n return months[month];\r\n }\r\n\r\n // Input handlers for direct hour/minute input (12-hour format only)\r\n onHourInput(event: any, isStart = true, isSingle = false): void {\r\n const inputValue = event.target.value;\r\n\r\n // Allow empty input while typing\r\n if (inputValue === '' || inputValue === null || inputValue === undefined) {\r\n return;\r\n }\r\n\r\n let value = parseInt(inputValue) || 0;\r\n\r\n // Validate: 1-12 for 12-hour format\r\n if (value < 1) value = 1;\r\n if (value > 12) value = 12;\r\n\r\n if (isSingle) {\r\n this.selectedHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n } else if (isStart) {\r\n this.startHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endHour = value;\r\n if (this.endDate) {\r\n let h = value;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n // Don't format during input, only on blur\r\n event.target.value = value.toString();\r\n }\r\n\r\n onHourBlur(event: any, isStart = true, isSingle = false): void {\r\n const inputValue = event.target.value;\r\n if (inputValue === '' || inputValue === null || inputValue === undefined) {\r\n // If empty, set to current value\r\n const currentValue = isSingle ? this.selectedHour : (isStart ? this.startHour : this.endHour);\r\n event.target.value = currentValue.toString();\r\n return;\r\n }\r\n\r\n let value = parseInt(inputValue) || 0;\r\n if (value < 1) value = 1;\r\n if (value > 12) value = 12;\r\n\r\n // Format to single digit (no padding for hours in 12-hour format)\r\n event.target.value = value.toString();\r\n\r\n // Update the value\r\n if (isSingle) {\r\n this.selectedHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n } else if (isStart) {\r\n this.startHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endHour = value;\r\n if (this.endDate) {\r\n let h = value;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n\r\n onMinuteInput(event: any, isStart = true, isSingle = false): void {\r\n const inputValue = event.target.value;\r\n const key = `${isStart ? 'start' : 'end'}_${isSingle ? 'single' : 'dual'}`;\r\n\r\n // Remove any non-digit characters\r\n const digitsOnly = inputValue.replace(/\\D/g, '');\r\n\r\n // Store raw input value for display\r\n this.minuteInputValues[key] = digitsOnly;\r\n\r\n // Allow empty input while typing\r\n if (digitsOnly === '' || digitsOnly === null || digitsOnly === undefined) {\r\n return; // Don't modify the input, let user clear it\r\n }\r\n\r\n // Allow typing up to 2 digits without formatting\r\n let value = parseInt(digitsOnly) || 0;\r\n\r\n // If user types more than 2 digits, take only first 2\r\n if (digitsOnly.length > 2) {\r\n value = parseInt(digitsOnly.substring(0, 2));\r\n this.minuteInputValues[key] = digitsOnly.substring(0, 2);\r\n event.target.value = digitsOnly.substring(0, 2);\r\n }\r\n\r\n // If value exceeds 59, clamp it to 59\r\n if (value > 59) {\r\n value = 59;\r\n this.minuteInputValues[key] = '59';\r\n event.target.value = '59';\r\n }\r\n\r\n // Update the internal value silently (don't emit during typing to avoid re-rendering)\r\n if (isSingle) {\r\n this.selectedMinute = value;\r\n } else if (isStart) {\r\n this.startMinute = value;\r\n } else {\r\n this.endMinute = value;\r\n }\r\n\r\n // Don't update dates or emit during typing - wait for blur or apply\r\n }\r\n\r\n onMinuteBlur(event: any, isStart = true, isSingle = false): void {\r\n const key = `${isStart ? 'start' : 'end'}_${isSingle ? 'single' : 'dual'}`;\r\n const inputValue = event.target.value;\r\n\r\n if (inputValue === '' || inputValue === null || inputValue === undefined) {\r\n // If empty, set to current value\r\n const currentValue = isSingle ? this.selectedMinute : (isStart ? this.startMinute : this.endMinute);\r\n event.target.value = currentValue.toString().padStart(2, '0');\r\n delete this.minuteInputValues[key];\r\n return;\r\n }\r\n\r\n const digitsOnly = inputValue.replace(/\\D/g, '');\r\n let value = parseInt(digitsOnly) || 0;\r\n if (value < 0) value = 0;\r\n if (value > 59) value = 59;\r\n\r\n // Format to 2 digits on blur (01-09 becomes 01-09, 10-59 stays as is)\r\n event.target.value = value.toString().padStart(2, '0');\r\n delete this.minuteInputValues[key]; // Clear raw input, use formatted value\r\n\r\n // Update the value\r\n if (isSingle) {\r\n this.selectedMinute = value;\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n } else if (isStart) {\r\n this.startMinute = value;\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endMinute = value;\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n\r\n // Get display value for hour (always 12-hour format)\r\n getDisplayHour(hour: number): number {\r\n if (hour === 0) return 12;\r\n if (hour > 12) return hour - 12;\r\n return hour;\r\n }\r\n\r\n // Get display value for minute (formatted only when not actively typing)\r\n getMinuteDisplayValue(isStart: boolean, isSingle: boolean): string {\r\n const key = `${isStart ? 'start' : 'end'}_${isSingle ? 'single' : 'dual'}`;\r\n // If user is typing (has raw input), show that, otherwise show formatted value\r\n if (this.minuteInputValues[key] !== undefined) {\r\n return this.minuteInputValues[key];\r\n }\r\n // Otherwise return formatted value\r\n const value = isSingle ? this.selectedMinute : (isStart ? this.startMinute : this.endMinute);\r\n return value.toString().padStart(2, '0');\r\n }\r\n\r\n // Helper method to apply time picker values to a date\r\n applyTimeToDate(date: Date, isStart: boolean): void {\r\n if (this.dualCalendar) {\r\n if (isStart) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n date.setHours(h, this.startMinute, this.startSecond);\r\n } else {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n date.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n } else {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n date.setHours(h, this.selectedMinute, this.selectedSecond);\r\n }\r\n }\r\n\r\n // Select all text on focus for easy replacement\r\n onTimeInputFocus(event: any): void {\r\n event.target.select();\r\n }\r\n\r\n // Format all minute inputs to 2 digits (called before Apply)\r\n formatAllMinuteInputs(): void {\r\n // Format minute inputs in the DOM - find all minute inputs and format single digits\r\n const inputs = document.querySelectorAll('.time-input');\r\n inputs.forEach((input: any) => {\r\n const value = parseInt(input.value);\r\n // If it's a valid minute value (0-59) and not already formatted (single digit or 2 digits without leading zero)\r\n if (!isNaN(value) && value >= 0 && value <= 59) {\r\n // Format if it's a single digit (1-9) or if it's 2 digits but the first is not 0\r\n if (input.value.length === 1 || (input.value.length === 2 && !input.value.startsWith('0') && value < 10)) {\r\n input.value = value.toString().padStart(2, '0');\r\n }\r\n }\r\n });\r\n }\r\n\r\n formatDateToString(date: Date): string {\r\n const yyyy = date.getFullYear();\r\n const mm = (date.getMonth() + 1).toString().padStart(2, '0'); // month is 0-based\r\n const dd = date.getDate().toString().padStart(2, '0');\r\n return `${yyyy}-${mm}-${dd}`;\r\n }\r\n}\r\n","<div class=\"calendar-container relative\" [class.open]=\"show\" [class.inline-mode]=\"inline\">\r\n <!-- Input field -->\r\n <div class=\"input-wrapper\" *ngIf=\"!inline\">\r\n <input\r\n type=\"text\"\r\n (click)=\"toggle()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n class=\"calendar-input\">\r\n <!-- *ngIf=\"!getDisplayValue()\" -->\r\n\r\n <span class=\"calendar-icon\" >\r\n <img alt=\"calendar\" class=\"calendar-icon-img\" [src]='brickclayIcons.calenderIcon'/>\r\n </span>\r\n <button class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">×</button>\r\n </div>\r\n\r\n <!-- Calendar Popup / Inline -->\r\n <div class=\"calendar-popup\"\r\n [class.inline-calendar]=\"inline\"\r\n [ngClass]=\"{\r\n 'position-right': !inline && opens === 'right',\r\n 'position-center': !inline && opens === 'center',\r\n 'drop-up': !inline && drop === 'up',\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar\r\n }\"\r\n *ngIf=\"inline || show\">\r\n\r\n <!-- RANGES -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges\">\r\n <button\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n [disabled]=\"rangeKey === 'Custom Range'\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges ? 'w-100 flex-grow-1' : ''\">\r\n\r\n\r\n <!-- SINGLE CALENDAR -->\r\n <div *ngIf=\"!dualCalendar\" class=\"calendar-wrapper\">\r\n <div class=\"header\">\r\n <!-- <button (click)=\"prevMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img src=\"assets/calender/pagination-left-gray.svg\" alt=\"arrow-left\" class=\"arrow-left\">\r\n </button> -->\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"prevMonth()\" matTooltip=\"Prev month\"\r\n >\r\n <img alt=\"prev\" class=\"h-3 w-3\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">{{ getMonthName(month) }} {{ year }}</span>\r\n <!-- <button (click)=\"nextMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img src=\"assets/calender/pagination-right-gray.svg\" alt=\"arrow-right\" class=\"arrow-right\">\r\n </button> -->\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"nextMonth()\" matTooltip=\"Next month\"\r\n >\r\n <img alt=\"next\" class=\"h-3 w-3\" [src]='brickclayIcons.arrowRight'/>\r\n <!--<img src=\"assets/calender/pagination-right-gray.svg\" alt=\"next\" class=\"h-3 w-3\" /> -->\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let d of ['Mo','Tu','We','Th','Fr','Sa','Su']\" class=\"weekday-header\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && selectDate(dayObj.day)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(year, month, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(year, month, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(year, month, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(year, month, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(year, month, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- Single Calendar Time Picker -->\r\n <div *ngIf=\"enableTimepicker\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"single-time\"\r\n [label]=\"''\"\r\n [value]=\"getSingleTimePickerDisplay()\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\r\n (timeChange)=\"onSingleTimePickerChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DUAL CALENDAR -->\r\n <div class=\"dual-calendar\" *ngIf=\"dualCalendar\">\r\n <!-- LEFT CALENDAR -->\r\n <div class=\"calendar-left\">\r\n <div class=\"header\">\r\n <button (click)=\"prevLeftMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">{{ getMonthName(leftMonth) }} {{ leftYear }}</span>\r\n <button (click)=\"nextLeftMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n </div>\r\n <table class=\"calendar-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let d of ['Mo','Tu','We','Th','Fr','Sa','Su']\" class=\"weekday-header\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && selectDate(dayObj.day, false)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(leftYear, leftMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(leftYear, leftMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(leftYear, leftMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(leftYear, leftMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(leftYear, leftMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- Start Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Start Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-start\"\r\n [label]=\"''\"\r\n [value]=\"getDualTimePickerDisplay(true)\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\r\n (timeChange)=\"onDualTimePickerChange($event, true)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT CALENDAR -->\r\n <div class=\"calendar-right\">\r\n <div class=\"header\">\r\n <button (click)=\"prevRightMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">{{ getMonthName(rightMonth) }} {{ rightYear }}</span>\r\n <button (click)=\"nextRightMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n </div>\r\n <table class=\"calendar-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let d of ['Mo','Tu','We','Th','Fr','Sa','Su']\" class=\"weekday-header\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && selectDate(dayObj.day, true)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && onDateHover(dayObj.day, true)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(rightYear, rightMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(rightYear, rightMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(rightYear, rightMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(rightYear, rightMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(rightYear, rightMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- End Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">End Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-end\"\r\n [label]=\"''\"\r\n [value]=\"getDualTimePickerDisplay(false)\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\r\n (timeChange)=\"onDualTimePickerChange($event, false)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER -->\r\n <div class=\"footer\" *ngIf=\"!inline\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkCustomCalendar, CalendarSelection } from '../custom-calendar/custom-calendar.component';\r\nimport { BkTimePicker } from '../time-picker/time-picker.component';\r\n\r\nexport interface TimeConfiguration {\r\n date: Date;\r\n allDay: boolean;\r\n startTime: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\r\n endTime: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\r\n}\r\n\r\nexport interface ScheduledDateSelection {\r\n mode: 'single' | 'multiple' | 'range';\r\n singleDate?: {\r\n startDate: Date;\r\n endDate: Date;\r\n allDay: boolean;\r\n startTime: string;\r\n endTime: string;\r\n };\r\n multipleDates?: TimeConfiguration[];\r\n dateRange?: {\r\n startDate: Date;\r\n endDate: Date;\r\n allDay: boolean;\r\n startTime: string;\r\n endTime: string;\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'bk-scheduled-date-picker',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BkCustomCalendar, BkTimePicker],\r\n templateUrl: './scheduled-date-picker.component.html',\r\n styleUrls: ['./scheduled-date-picker.component.css']\r\n})\r\nexport class BkScheduledDatePicker implements OnInit {\r\n @Input() timeFormat: 12 | 24 = 12;\r\n @Input() enableSeconds = false;\r\n\r\n @Output() scheduled = new EventEmitter<ScheduledDateSelection>();\r\n @Output() cleared = new EventEmitter<void>();\r\n\r\n activeTab: 'single' | 'multiple' | 'range' = 'single';\r\n openTimePickerId: string | null = null; // Track which time picker is currently open\r\n closePickerCounter: { [key: string]: number } = {}; // Track close signals for each picker\r\n\r\n // Single Date\r\n singleDate: Date | null = null;\r\n singleAllDay = false;\r\n singleStartTime = '1:00 AM';\r\n singleEndTime = '2:00 AM';\r\n\r\n // Multiple Dates\r\n multipleDates: TimeConfiguration[] = [];\r\n\r\n // Date Range\r\n rangeStartDate: Date | null = null;\r\n rangeEndDate: Date | null = null;\r\n rangeAllDay = false;\r\n rangeStartTime = '1:00 AM';\r\n rangeEndTime = '2:00 AM';\r\n\r\n ngOnInit() {\r\n // Initialize with default time if needed\r\n }\r\n\r\n onTabChange(tab: 'single' | 'multiple' | 'range') {\r\n this.activeTab = tab;\r\n this.openTimePickerId = null; // Close any open pickers when switching tabs\r\n }\r\n\r\n onTimePickerOpened(pickerId: string) {\r\n // Close all other pickers when one opens\r\n if (this.openTimePickerId && this.openTimePickerId !== pickerId) {\r\n // Increment close counter for the previously open picker\r\n if (!this.closePickerCounter[this.openTimePickerId]) {\r\n this.closePickerCounter[this.openTimePickerId] = 0;\r\n }\r\n this.closePickerCounter[this.openTimePickerId]++;\r\n }\r\n this.openTimePickerId = pickerId;\r\n }\r\n\r\n onTimePickerClosed(pickerId: string) {\r\n // Reset open picker ID if this was the open one\r\n if (this.openTimePickerId === pickerId) {\r\n this.openTimePickerId = null;\r\n }\r\n }\r\n\r\n shouldClosePicker(pickerId: string): number {\r\n // Return the counter value for this picker (triggers change detection)\r\n return this.closePickerCounter[pickerId] || 0;\r\n }\r\n\r\n // Single Date Handlers\r\n onSingleDateSelected(event: CalendarSelection) {\r\n if (event.startDate) {\r\n this.singleDate = new Date(event.startDate);\r\n // Initialize time if not all day\r\n if (!this.singleAllDay) {\r\n this.updateSingleDateTimes();\r\n }\r\n this.emitScheduled();\r\n } else {\r\n this.singleDate = null;\r\n }\r\n }\r\n\r\n onSingleAllDayChange() {\r\n this.singleAllDay = !this.singleAllDay;\r\n if (this.singleDate) {\r\n this.updateSingleDateTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onSingleStartTimeChange(time: string) {\r\n this.singleStartTime = time;\r\n if (this.singleDate) {\r\n this.updateSingleDateTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onSingleEndTimeChange(time: string) {\r\n this.singleEndTime = time;\r\n if (this.singleDate) {\r\n this.updateSingleDateTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n updateSingleDateTimes() {\r\n if (!this.singleDate) return;\r\n if (this.singleAllDay) {\r\n this.singleDate.setHours(0, 0, 0, 0);\r\n } else {\r\n const startTime = this.parseTimeString(this.singleStartTime);\r\n const endTime = this.parseTimeString(this.singleEndTime);\r\n this.singleDate.setHours(startTime.hours, startTime.minutes, 0, 0);\r\n }\r\n }\r\n\r\n // Multiple Dates Handlers\r\n onMultipleDatesSelected(event: CalendarSelection) {\r\n if (event.selectedDates && event.selectedDates.length > 0) {\r\n const newDates: TimeConfiguration[] = [];\r\n\r\n event.selectedDates.forEach(date => {\r\n // const dateStr = this.getDateString(date);\r\n const dateStr = date;\r\n const existing = this.multipleDates.find(d => this.getDateString(d.date) === dateStr);\r\n\r\n if (existing) {\r\n newDates.push(existing);\r\n } else {\r\n // Create new time configuration for this date\r\n newDates.push({\r\n date: new Date(date),\r\n allDay: false,\r\n startTime: '1:00 AM',\r\n endTime: '2:00 AM'\r\n });\r\n }\r\n });\r\n\r\n this.multipleDates = newDates;\r\n this.emitScheduled();\r\n } else {\r\n this.multipleDates = [];\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onMultipleDateAllDayChange(index: number) {\r\n if (this.multipleDates[index]) {\r\n this.multipleDates[index].allDay = !this.multipleDates[index].allDay;\r\n if (this.multipleDates[index].allDay) {\r\n this.multipleDates[index].date.setHours(0, 0, 0, 0);\r\n } else {\r\n const time = this.parseTimeString(this.multipleDates[index].startTime);\r\n this.multipleDates[index].date.setHours(time.hours, time.minutes, 0, 0);\r\n }\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onMultipleDateStartTimeChange(index: number, time: string) {\r\n if (this.multipleDates[index]) {\r\n this.multipleDates[index].startTime = time;\r\n if (!this.multipleDates[index].allDay) {\r\n const parsed = this.parseTimeString(time);\r\n this.multipleDates[index].date.setHours(parsed.hours, parsed.minutes, 0, 0);\r\n }\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onMultipleDateEndTimeChange(index: number, time: string) {\r\n if (this.multipleDates[index]) {\r\n this.multipleDates[index].endTime = time;\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n // Date Range Handlers\r\n onRangeSelected(event: CalendarSelection) {\r\n if (event.startDate && event.endDate) {\r\n this.rangeStartDate = new Date(event.startDate);\r\n this.rangeEndDate = new Date(event.endDate);\r\n if (!this.rangeAllDay) {\r\n this.updateRangeTimes();\r\n }\r\n this.emitScheduled();\r\n } else {\r\n this.rangeStartDate = null;\r\n this.rangeEndDate = null;\r\n }\r\n }\r\n\r\n onRangeAllDayChange() {\r\n this.rangeAllDay = !this.rangeAllDay;\r\n if (this.rangeStartDate && this.rangeEndDate) {\r\n this.updateRangeTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onRangeStartTimeChange(time: string) {\r\n this.rangeStartTime = time;\r\n if (this.rangeStartDate && !this.rangeAllDay) {\r\n this.updateRangeTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onRangeEndTimeChange(time: string) {\r\n this.rangeEndTime = time;\r\n if (this.rangeEndDate && !this.rangeAllDay) {\r\n this.updateRangeTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n updateRangeTimes() {\r\n if (!this.rangeStartDate || !this.rangeEndDate) return;\r\n\r\n if (this.rangeAllDay) {\r\n this.rangeStartDate.setHours(0, 0, 0, 0);\r\n this.rangeEndDate.setHours(23, 59, 59, 999);\r\n } else {\r\n const startTime = this.parseTimeString(this.rangeStartTime);\r\n const endTime = this.parseTimeString(this.rangeEndTime);\r\n this.rangeStartDate.setHours(startTime.hours, startTime.minutes, 0, 0);\r\n this.rangeEndDate.setHours(endTime.hours, endTime.minutes, 0, 0);\r\n }\r\n }\r\n\r\n // Utility Methods\r\n parseTimeString(timeStr: string): { hours: number; minutes: number } {\r\n // Parse time string like \"7:01 AM\" or \"19:01\"\r\n const parts = timeStr.split(' ');\r\n let timePart = parts[0];\r\n const ampm = parts[1];\r\n\r\n const [hoursStr, minutesStr] = timePart.split(':');\r\n let hours = parseInt(hoursStr, 10);\r\n const minutes = parseInt(minutesStr || '0', 10);\r\n\r\n if (ampm) {\r\n if (ampm.toUpperCase() === 'PM' && hours !== 12) {\r\n hours += 12;\r\n } else if (ampm.toUpperCase() === 'AM' && hours === 12) {\r\n hours = 0;\r\n }\r\n }\r\n\r\n return { hours, minutes };\r\n }\r\n\r\n getDateString(date: Date): string {\r\n return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\r\n }\r\n\r\n formatDate(date: Date): string {\r\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n return `${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;\r\n }\r\n\r\n emitScheduled() {\r\n const selection: ScheduledDateSelection = {\r\n mode: this.activeTab\r\n };\r\n\r\n if (this.activeTab === 'single' && this.singleDate) {\r\n // For single date, create startDate and endDate with same date but different times\r\n const startDate = new Date(this.singleDate);\r\n const endDate = new Date(this.singleDate);\r\n\r\n if (!this.singleAllDay) {\r\n const startTime = this.parseTimeString(this.singleStartTime);\r\n const endTime = this.parseTimeString(this.singleEndTime);\r\n startDate.setHours(startTime.hours, startTime.minutes, 0, 0);\r\n endDate.setHours(endTime.hours, endTime.minutes, 0, 0);\r\n } else {\r\n startDate.setHours(0, 0, 0, 0);\r\n endDate.setHours(23, 59, 59, 999);\r\n }\r\n\r\n selection.singleDate = {\r\n startDate: startDate,\r\n endDate: endDate,\r\n allDay: this.singleAllDay,\r\n startTime: this.singleStartTime,\r\n endTime: this.singleEndTime\r\n };\r\n } else if (this.activeTab === 'multiple') {\r\n selection.multipleDates = this.multipleDates.map(d => ({\r\n date: new Date(d.date),\r\n allDay: d.allDay,\r\n startTime: d.startTime,\r\n endTime: d.endTime\r\n }));\r\n } else if (this.activeTab === 'range' && this.rangeStartDate && this.rangeEndDate) {\r\n selection.dateRange = {\r\n startDate: new Date(this.rangeStartDate),\r\n endDate: new Date(this.rangeEndDate),\r\n allDay: this.rangeAllDay,\r\n startTime: this.rangeStartTime,\r\n endTime: this.rangeEndTime\r\n };\r\n }\r\n\r\n this.scheduled.emit(selection);\r\n }\r\n\r\n clear() {\r\n this.singleDate = null;\r\n this.multipleDates = [];\r\n this.rangeStartDate = null;\r\n this.rangeEndDate = null;\r\n this.singleAllDay = false;\r\n this.rangeAllDay = false;\r\n this.singleStartTime = '1:00 AM';\r\n this.singleEndTime = '2:00 AM';\r\n this.rangeStartTime = '1:00 AM';\r\n this.rangeEndTime = '2:00 AM';\r\n this.cleared.emit();\r\n }\r\n\r\n apply() {\r\n this.emitScheduled();\r\n }\r\n\r\n}\r\n\r\n","<div class=\"scheduled-date-picker-container\">\r\n <!-- Header with Tabs -->\r\n\r\n\r\n <!-- Main Content Area -->\r\n\r\n <div class=\"scheduled-content\">\r\n <!-- Left Side: Calendar -->\r\n <div class=\"calendar-section\">\r\n <h2 class=\"scheduled-title\">Scheduled Dates</h2>\r\n <div class=\"tabs\">\r\n <button\r\n class=\"tab-button\"\r\n [class.active]=\"activeTab === 'single'\"\r\n (click)=\"onTabChange('single')\">\r\n Single Date\r\n </button>\r\n <button\r\n class=\"tab-button\"\r\n [class.active]=\"activeTab === 'multiple'\"\r\n (click)=\"onTabChange('multiple')\">\r\n Multiple Dates\r\n </button>\r\n <button\r\n class=\"tab-button\"\r\n [class.active]=\"activeTab === 'range'\"\r\n (click)=\"onTabChange('range')\">\r\n Date Range\r\n </button>\r\n </div>\r\n <!-- Single Date Calendar -->\r\n <div *ngIf=\"activeTab === 'single'\" class=\"calendar-wrapper-inline\">\r\n <bk-custom-calendar\r\n [inline]=\"true\"\r\n [dualCalendar]=\"false\"\r\n [singleDatePicker]=\"true\"\r\n [showRanges]=\"false\"\r\n [enableTimepicker]=\"false\"\r\n [showCancel]=\"false\"\r\n placeholder=\"Select a date\"\r\n (selected)=\"onSingleDateSelected($event)\">\r\n </bk-custom-calendar>\r\n </div>\r\n\r\n <!-- Multiple Dates Calendar -->\r\n <div *ngIf=\"activeTab === 'multiple'\" class=\"calendar-wrapper-inline\">\r\n <bk-custom-calendar\r\n [inline]=\"true\"\r\n [dualCalendar]=\"false\"\r\n [singleDatePicker]=\"false\"\r\n [showRanges]=\"false\"\r\n [enableTimepicker]=\"false\"\r\n [multiDateSelection]=\"true\"\r\n [showCancel]=\"false\"\r\n placeholder=\"Select multiple dates\"\r\n (selected)=\"onMultipleDatesSelected($event)\">\r\n </bk-custom-calendar>\r\n </div>\r\n\r\n <!-- Date Range Calendar -->\r\n <div *ngIf=\"activeTab === 'range'\" class=\"calendar-wrapper-inline\">\r\n <bk-custom-calendar\r\n [inline]=\"true\"\r\n [dualCalendar]=\"false\"\r\n [singleDatePicker]=\"false\"\r\n [showRanges]=\"false\"\r\n [enableTimepicker]=\"false\"\r\n [showCancel]=\"false\"\r\n placeholder=\"Select date range\"\r\n (selected)=\"onRangeSelected($event)\">\r\n </bk-custom-calendar>\r\n </div>\r\n </div>\r\n\r\n <!-- Right Side: Time Configuration -->\r\n <div class=\"time-config-section\">\r\n <h3 class=\"time-config-title\">Time Configuration</h3>\r\n\r\n <!-- Single Date Time Configuration -->\r\n <div *ngIf=\"activeTab === 'single'\">\r\n <div *ngIf=\"singleDate\" class=\"time-config-item\">\r\n <div class=\"time-config-header\">\r\n <span class=\"date-label\">{{ formatDate(singleDate) }}</span>\r\n <label class=\"all-day-toggle\">\r\n <span class=\"toggle-label\">All Day</span>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"singleAllDay\"\r\n (change)=\"onSingleAllDayChange()\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"!singleAllDay\" class=\"time-inputs\">\r\n <bk-time-picker\r\n pickerId=\"single-start\"\r\n label=\"Start Time\"\r\n [value]=\"singleStartTime\"\r\n [position]=\"'left'\"\r\n [closePicker]=\"shouldClosePicker('single-start')\"\r\n (timeChange)=\"onSingleStartTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n <bk-time-picker\r\n pickerId=\"single-end\"\r\n label=\"End Time\"\r\n [value]=\"singleEndTime\"\r\n [position]=\"'right'\"\r\n [closePicker]=\"shouldClosePicker('single-end')\"\r\n (timeChange)=\"onSingleEndTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!singleDate\" class=\"no-selection\">\r\n <p>No date selected. Select a date from the calendar.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Multiple Dates Time Configuration -->\r\n <div *ngIf=\"activeTab === 'multiple'\" class=\"time-config-list\">\r\n <div\r\n *ngFor=\"let dateConfig of multipleDates; let i = index\"\r\n class=\"time-config-item\">\r\n <div class=\"time-config-header\">\r\n <span class=\"date-label\">{{ formatDate(dateConfig.date) }}</span>\r\n <label class=\"all-day-toggle\">\r\n <span class=\"toggle-label\">All Day</span>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"dateConfig.allDay\"\r\n (change)=\"onMultipleDateAllDayChange(i)\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"!dateConfig.allDay\" class=\"time-inputs\">\r\n <bk-time-picker\r\n [pickerId]=\"'multiple-' + i + '-start'\"\r\n label=\"Start Time\"\r\n [value]=\"dateConfig.startTime\"\r\n [position]=\"'left'\"\r\n [closePicker]=\"shouldClosePicker('multiple-' + i + '-start')\"\r\n (timeChange)=\"onMultipleDateStartTimeChange(i, $event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n <bk-time-picker\r\n [pickerId]=\"'multiple-' + i + '-end'\"\r\n label=\"End Time\"\r\n [value]=\"dateConfig.endTime\"\r\n [position]=\"'right'\"\r\n [closePicker]=\"shouldClosePicker('multiple-' + i + '-end')\"\r\n (timeChange)=\"onMultipleDateEndTimeChange(i, $event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n <div *ngIf=\"multipleDates.length === 0\" class=\"no-selection\">\r\n <p>No dates selected. Select dates from the calendar.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Date Range Time Configuration -->\r\n <div *ngIf=\"activeTab === 'range' && rangeStartDate && rangeEndDate\" class=\"time-config-item\">\r\n <div class=\"time-config-header\">\r\n <span class=\"date-label\">{{ formatDate(rangeStartDate) }} - {{ formatDate(rangeEndDate) }}</span>\r\n <label class=\"all-day-toggle\">\r\n <span class=\"toggle-label\">All Day</span>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"rangeAllDay\"\r\n (change)=\"onRangeAllDayChange()\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"!rangeAllDay\" class=\"time-inputs\">\r\n <bk-time-picker\r\n pickerId=\"range-start\"\r\n label=\"Start Time\"\r\n [value]=\"rangeStartTime\"\r\n [position]=\"'left'\"\r\n [closePicker]=\"shouldClosePicker('range-start')\"\r\n (timeChange)=\"onRangeStartTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n <bk-time-picker\r\n pickerId=\"range-end\"\r\n label=\"End Time\"\r\n [value]=\"rangeEndTime\"\r\n [position]=\"'right'\"\r\n [closePicker]=\"shouldClosePicker('range-end')\"\r\n (timeChange)=\"onRangeEndTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n <div *ngIf=\"activeTab === 'range' && (!rangeStartDate || !rangeEndDate)\" class=\"no-selection\">\r\n <p>No date range selected. Select a date range from the calendar.</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"action-buttons\">\r\n <button class=\"btn-clear\" (click)=\"clear()\">Clear</button>\r\n <button class=\"btn-apply\" (click)=\"apply()\">Apply</button>\r\n </div>\r\n</div>\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BkCustomCalendar } from './components/custom-calendar/custom-calendar.component';\r\nimport { BkScheduledDatePicker } from './components/scheduled-date-picker/scheduled-date-picker.component';\r\nimport { BkTimePicker } from './components/time-picker/time-picker.component';\r\n\r\n\r\n\r\n/**\r\n * Optional NgModule wrapper for projects that prefer module-based usage.\r\n *\r\n * Note:\r\n * - The components themselves are standalone, so you can also import them\r\n * directly into any standalone component without using this module.\r\n * - This module is mainly for:\r\n * - Existing apps that still use feature modules\r\n * - Easier \"plug-and-play\" integration: import CalendarModule once and use\r\n * the three exported components anywhere in your templates.\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n BkCustomCalendar,\r\n BkScheduledDatePicker,\r\n BkTimePicker\r\n ],\r\n exports: [\r\n BkCustomCalendar,\r\n BkScheduledDatePicker,\r\n BkTimePicker\r\n ]\r\n})\r\nexport class CalendarModule {}\r\n\r\n\r\n","import { Component, Input, Output, EventEmitter, forwardRef, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-toggle',\r\n standalone: true,\r\n imports: [CommonModule],\r\n encapsulation:ViewEncapsulation.None,\r\n templateUrl: './toggle.html',\r\n styleUrls: ['./toggle.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkToggle),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkToggle implements ControlValueAccessor {\r\n\r\n @Input() label: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() toggleClass: string = 'toggle-md';\r\n\r\n @Output() change = new EventEmitter<boolean>();\r\n\r\n isChecked: boolean = false;\r\n\r\n // CVA callbacks (placeholders)\r\n onChange = (_: boolean) => {};\r\n onTouched = () => {};\r\n\r\n toggle() {\r\n if (this.disabled) return;\r\n\r\n this.isChecked = !this.isChecked;\r\n this.onChange(this.isChecked); // Notify Forms API\r\n this.onTouched(); // Notify Validation API\r\n this.change.emit(this.isChecked); // Notify standard event listeners\r\n }\r\n\r\n // Called by Angular to write value to the view\r\n writeValue(value: boolean): void {\r\n this.isChecked = value;\r\n }\r\n\r\n // Called by Angular to register the function to call when changed\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Called by Angular to register the function to call when touched\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n // Called by Angular when the disabled state changes\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n}\r\n","<div class=\"inline-flex items-center gap-2 cursor-pointer\" (click)=\"toggle()\">\r\n <button\r\n type=\"button\"\r\n role=\"switch\"\r\n [attr.aria-checked]=\"isChecked\"\r\n [disabled]=\"disabled\"\r\n class=\"toggle-base\"\r\n [ngClass]=\"toggleClass\"\r\n [class.toggle-on]=\"isChecked\"\r\n [class.toggle-off]=\"!isChecked\"\r\n [class.toggle-disabled]=\"disabled\"\r\n >\r\n <span\r\n class=\"toggle-knob\"\r\n [class.knob-on]=\"isChecked\"\r\n [class.knob-off]=\"!isChecked\"\r\n ></span>\r\n </button>\r\n @if (label){\r\n <span class=\"text-sm font-medium text-[#1B223A] select-none\" [class.opacity-70]=\"disabled\">\r\n {{ label }}\r\n </span>\r\n }\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, forwardRef, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './checkbox.html',\r\n styleUrls: ['./checkbox.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkCheckbox),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkCheckbox implements ControlValueAccessor {\r\n\r\n @Input() checkboxClass: string = '';\r\n @Input() label: string = '';\r\n @Input() labelClass: string = '';\r\n @Input() disabled: boolean = false;\r\n\r\n @Output() change = new EventEmitter<boolean>();\r\n\r\n // This is the value bound via ngModel\r\n isChecked: boolean = false;\r\n\r\n // ControlValueAccessor callbacks\r\n private onChange = (_: any) => {};\r\n private onTouched = () => {};\r\n\r\n // Toggle function for click / keyboard\r\n toggle() {\r\n if (this.disabled) return;\r\n\r\n this.isChecked = !this.isChecked;\r\n\r\n // Update ngModel value\r\n this.onChange(this.isChecked);\r\n this.onTouched();\r\n\r\n // Emit the change event\r\n this.change.emit(this.isChecked);\r\n }\r\n\r\n /** ------------------ ControlValueAccessor methods ------------------ */\r\n\r\n writeValue(value: boolean): void {\r\n this.isChecked = value ?? false; // handle null/undefined safely\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n}\r\n","<div\r\n class=\"inline-flex items-center gap-2 cursor-pointer group outline-none\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n tabindex=\"0\"\r\n [attr.aria-disabled]=\"disabled\">\r\n <div\r\n class=\"relative flex items-center justify-center border-2 transition-all duration-200 ease-in-out rounded group-focus-visible:ring-2 group-focus-visible:ring-blue-600 group-focus-visible:ring-offset-2 checkbox\"\r\n [ngClass]=\"[\r\n checkboxClass,\r\n isChecked && !disabled ? 'bg-black border-black' : '',\r\n !isChecked && !disabled ? 'bg-white border-gray-300 group-hover:border-gray-400' : '',\r\n disabled && isChecked ? 'bg-gray-300 border-gray-300' : '',\r\n disabled && !isChecked ? 'bg-gray-100 border-gray-200' : '',\r\n disabled ? 'cursor-not-allowed' : ''\r\n ]\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n class=\"text-white pointer-events-none transition-opacity duration-200\"\r\n [class.opacity-0]=\"!isChecked\"\r\n [class.opacity-100]=\"isChecked\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </div>\r\n@if(label){\r\n <span\r\n [ngClass]=\"disabled ? 'text-gray-400' : ''\"\r\n class=\"font-medium text-xs text-[#1B223A] select-none {{labelClass}}\"\r\n >\r\n {{ label }}\r\n </span>\r\n}\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n forwardRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\n@Component({\r\n selector: 'bk-radio-button',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './radio.html',\r\n styleUrl: './radio.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkRadioButton),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkRadioButton implements ControlValueAccessor {\r\n\r\n @Input() radioClass = '';\r\n @Input() label = '';\r\n @Input() labelClass = '';\r\n @Input() value: any;\r\n @Input() disabled = false;\r\n @Input() variant: 'dot' | 'tick' = 'dot';\r\n\r\n @Output() change = new EventEmitter<any>();\r\n\r\n modelValue: any;\r\n\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n\r\n select(): void {\r\n if (this.disabled) return;\r\n\r\n if (this.modelValue !== this.value) {\r\n this.modelValue = this.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.change.emit(this.value);\r\n }\r\n }\r\n\r\n get isChecked(): boolean {\r\n return this.modelValue === this.value;\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.modelValue = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n}\r\n","<div\r\n class=\"inline-flex items-center gap-2 cursor-pointer group outline-none\"\r\n (click)=\"select()\"\r\n (keydown.enter)=\"select()\"\r\n (keydown.space)=\"$event.preventDefault(); select()\"\r\n tabindex=\"0\"\r\n [attr.aria-disabled]=\"disabled\">\r\n\r\n <div\r\n class=\"relative flex items-center justify-center rounded-full border-2 transition-all duration-200 flex-shrink-0 group-focus-visible:ring-2 group-focus-visible:ring-blue-600 group-focus-visible:ring-offset-2 radio\"\r\n [ngClass]=\"[\r\n radioClass,\r\n !isChecked && !disabled ? 'bg-white border-gray-300 group-hover:border-gray-400' : '',\r\n\r\n variant === 'dot' && isChecked && !disabled ? 'border-black bg-white' : '',\r\n\r\n variant === 'tick' && isChecked && !disabled ? 'bg-black border-black' : '',\r\n\r\n disabled && isChecked && variant === 'tick' ? 'bg-gray-300 border-gray-300' : '',\r\n disabled && isChecked && variant === 'dot' ? 'border-gray-300 bg-gray-50' : '',\r\n disabled && !isChecked ? 'bg-gray-100 border-gray-200' : '',\r\n disabled ? 'cursor-not-allowed' : ''\r\n ]\"\r\n >\r\n@if(variant === 'dot'){\r\n <span\r\n class=\"rounded-full bg-black transition-transform duration-200 transform dot\"\r\n [class.scale-0]=\"!isChecked\"\r\n [class.scale-100]=\"isChecked\"\r\n [class.bg-gray-400]=\"disabled\"\r\n ></span>\r\n}\r\n @if (variant === 'tick'){\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n class=\"text-white pointer-events-none transition-opacity duration-200 tick\"\r\n [class.opacity-0]=\"!isChecked\"\r\n [class.opacity-100]=\"isChecked\"\r\n\r\n >\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n }\r\n </div>\r\n\r\n @if(label) {\r\n <span class=\"font-medium text-xs text-[#1B223A] select-none {{labelClass}}\"\r\n [ngClass]=\"disabled ? 'text-gray-400' : ''\">\r\n {{ label }}\r\n </span>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nexport type PillVariant = 'Light' | 'Solid' | 'Outline' | 'Transparent';\r\nexport type PillColor = 'Gray' | 'Primary' | 'Error' | 'Warning' | 'Success' | 'Purple' | 'Cyan';\r\nexport type PillSize = 'xsm' |'sm' | 'md' | 'lg';\r\n@Component({\r\n selector: 'bk-pill',\r\n standalone: true,\r\n templateUrl: './pill.html',\r\n styleUrl: './pill.css',\r\n})\r\nexport class BkPill {\r\n @Input() label: string = '';\r\n @Input() variant: PillVariant = 'Light';\r\n @Input() color: PillColor = 'Gray';\r\n @Input() size: PillSize = 'md';\r\n @Input() dot: 'left' | 'right' | 'none' = 'none';\r\n @Input() removable: boolean = false;\r\n @Input() customClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<string>();\r\n\r\n get containerClasses(): string {\r\n // 1. Size Class\r\n const sizeClass = `pill-${this.size}`;\r\n\r\n // 2. Color/Variant Class (Dynamic Generation)\r\n const styleClass = `${this.color}-${this.variant}`;\r\n\r\n // 3. customClasses\r\n const customClass = `${this.customClass}`;\r\n\r\n return `pill ${sizeClass} ${styleClass} ${customClass}`;\r\n }\r\n\r\n onRemove(e: Event) {\r\n e.stopPropagation();\r\n this.clicked.emit(this.label);\r\n }\r\n}\r\n","<span [className]=\"containerClasses\">\r\n\r\n @if (dot === 'left') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n <span>{{ label }}</span>\r\n\r\n @if (dot === 'right') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n @if (removable) {\r\n <button\r\n (click)=\"onRemove($event)\"\r\n class=\"pill-close \"> <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n</button>\r\n }\r\n</span>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type BadgeVariant = 'Light' | 'Solid' | 'Outline' | 'Transparent';\r\nexport type BadgeColor = 'Gray' | 'Primary' | 'Error' | 'Warning' | 'Success' | 'Purple' | 'Cyan';\r\nexport type BadgeSize = 'xsm' |'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'bk-badge',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './badge.html',\r\n styleUrls: ['./badge.css'],\r\n})\r\nexport class BkBadge {\r\n @Input() label: string = '';\r\n @Input() variant: BadgeVariant = 'Light';\r\n @Input() color: BadgeColor = 'Gray';\r\n @Input() size: BadgeSize = 'md';\r\n @Input() dot: 'left' | 'right' | 'none' = 'none';\r\n @Input() removable: boolean = false;\r\n @Input() customClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<string>();\r\n\r\n get containerClasses(): string {\r\n // 1. Size Class\r\n const sizeClass = `badge-${this.size}`;\r\n\r\n // 2. Color/Variant Class (Dynamic Generation)\r\n const styleClass = `${this.color}-${this.variant}`;\r\n\r\n // 3. customClasses\r\n const customClass = `${this.customClass}`;\r\n return `badge ${sizeClass} ${styleClass} ${customClass}`;\r\n }\r\n\r\n onRemove(e: Event) {\r\n e.stopPropagation();\r\n this.clicked.emit(this.label);\r\n }\r\n}\r\n","<span [className]=\"containerClasses\">\r\n\r\n @if (dot === 'left') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n <span>{{ label }}</span>\r\n\r\n @if (dot === 'right') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n @if (removable) {\r\n <button\r\n (click)=\"onRemove($event)\"\r\n class=\"badge-close\"> <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n</button>\r\n }\r\n</span>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n// Mapped names to your 5 sizes\r\nexport type SpinnerSize = 'xsm' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n@Component({\r\n selector: 'bk-spinner',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './spinner.html',\r\n styleUrl: './spinner.css',\r\n})\r\nexport class BkSpinner {\r\n @Input() size: SpinnerSize = 'md';\r\n @Input() show = true;\r\n @Input() color = 'text-blue-600'; // default\r\n\r\n get classes(): string {\r\n return `spinner ${this.size} ${this.color}`;\r\n }\r\n}\r\n","@if (show) {\r\n<span [class]=\"classes\" role=\"status\" aria-label=\"loading\">\r\n <span class=\"sr-only\">Loading...</span>\r\n</span>\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type ButtonSize = 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type ButtonVariant = 'primary' | 'secondary';\r\n\r\n@Component({\r\n selector: 'bk-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ui-button.html',\r\n styleUrl: './ui-button.css',\r\n})\r\nexport class BkButton {\r\n // --- Inputs ---\r\n\r\n // 1. Style & Size Inputs\r\n @Input() variant: ButtonVariant = 'primary';\r\n @Input() size: ButtonSize = 'md';\r\n\r\n // 2. Content Inputs\r\n @Input() label: string = ''; // Pass text directly\r\n @Input() leftIcon?: string;\r\n @Input() rightIcon?: string;\r\n @Input() iconAlt: string = 'icon';\r\n\r\n // 3. State & Config\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n @Input() loading: boolean = false;\r\n @Input() disabled: boolean = false;\r\n\r\n // 4. Customization (Optional overrides)\r\n @Input() buttonClass: string = ''; // Append extra classes if needed\r\n @Input() textClass: string = '';\r\n @Input() spinnerClass: string = '';\r\n\r\n // --- Outputs ---\r\n @Output() clicked = new EventEmitter<boolean>();\r\n\r\n // --- Logic ---\r\n onClick(event: Event) {\r\n if (!this.disabled && !this.loading) {\r\n this.clicked.emit(true);\r\n }\r\n }\r\n\r\n // Generate the class string based on Inputs\r\n get buttonClasses(): string {\r\n const variantClass = this.variant === 'primary' ? 'btn-primary' : 'btn-secondary';\r\n\r\n // Combine: Variant + Size + Custom Classes\r\n // Note: The size name (e.g., 'sm') matches your CSS class name exactly\r\n return `btn ${variantClass} ${this.size} ${this.buttonClass}`;\r\n }\r\n}\r\n","<button\r\n [attr.type]=\"type\"\r\n [class]=\"buttonClasses\"\r\n [disabled]=\"disabled || loading\"\r\n (click)=\"onClick($event)\"\r\n>\r\n @if (leftIcon) {\r\n <img [src]=\"leftIcon\" [alt]=\"iconAlt\" class=\"icon shrink-0\" />\r\n }\r\n\r\n @if (label) {\r\n <span [class]=\"textClass\">\r\n {{ label }}\r\n </span>\r\n }\r\n @if (loading) {\r\n <span [class]=\"spinnerClass\" class=\"spinner\"></span>\r\n }\r\n\r\n\r\n @if (rightIcon) {\r\n <img [src]=\"rightIcon\" [alt]=\"iconAlt\" class=\"icon shrink-0\" />\r\n }\r\n\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type IconButtonSize = 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type IconButtonVariant = 'primary' | 'secondary';\r\n\r\n@Component({\r\n selector: 'bk-icon-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ui-icon-button.html',\r\n styleUrl: './ui-icon-button.css',\r\n})\r\nexport class BkIconButton {\r\n // --- Inputs ---\r\n @Input() icon!: string; // Required icon path\r\n @Input() alt: string = 'icon';\r\n @Input() variant: IconButtonVariant = 'primary';\r\n @Input() size: IconButtonSize = 'md';\r\n\r\n @Input() disabled: boolean = false;\r\n\r\n // Custom classes\r\n @Input() buttonClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<boolean>();\r\n\r\n onClick(event: Event) {\r\n if (!this.disabled) {\r\n this.clicked.emit(true);\r\n }\r\n }\r\n\r\n get buttonClasses(): string {\r\n // Maps inputs to CSS classes: .btn-icon .primary .md\r\n return `btn-icon ${this.variant} ${this.size} ${this.buttonClass}`;\r\n }\r\n}\r\n","<button\r\n [class]=\"buttonClasses\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClick($event)\"\r\n>\r\n <img [src]=\"icon\" [alt]=\"alt\" class=\"icon\" />\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface GroupItem {\r\n label: string;\r\n value: any;\r\n}\r\n\r\nexport type GroupMode = 'single' | 'multiple';\r\n\r\n@Component({\r\n selector: 'bk-button-group',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './button-group.html',\r\n styleUrl: './button-group.css',\r\n})\r\nexport class BkButtonGroup {\r\n // --- Inputs ---\r\n @Input() items: GroupItem[] = [];\r\n @Input() mode: GroupMode = 'single';\r\n @Input() disabled: boolean = false;\r\n\r\n // Holds the current selection.\r\n // For 'single', it's a single value. For 'multiple', it's an array.\r\n @Input() value: any | any[] = null;\r\n\r\n // --- Outputs ---\r\n @Output() valueChange = new EventEmitter<any>();\r\n\r\n // --- Logic ---\r\n\r\n onItemClick(itemValue: any) {\r\n if (this.disabled) return;\r\n\r\n if (this.mode === 'single') {\r\n // 1. Single Mode: Just set the value\r\n if (this.value !== itemValue) {\r\n this.value = itemValue;\r\n this.valueChange.emit(this.value);\r\n }\r\n } else {\r\n // 2. Multiple Mode: Toggle value in array\r\n let currentValues = Array.isArray(this.value) ? [...this.value] : [];\r\n\r\n if (currentValues.includes(itemValue)) {\r\n // Remove if exists\r\n currentValues = currentValues.filter(v => v !== itemValue);\r\n } else {\r\n // Add if not exists\r\n currentValues.push(itemValue);\r\n }\r\n\r\n this.value = currentValues;\r\n this.valueChange.emit(this.value);\r\n }\r\n }\r\n\r\n // Helper to check active state for UI\r\n isActive(itemValue: any): boolean {\r\n if (this.mode === 'single') {\r\n return this.value === itemValue;\r\n } else {\r\n return Array.isArray(this.value) && this.value.includes(itemValue);\r\n }\r\n }\r\n\r\n // --- Styles ---\r\n\r\n get containerClass(): string {\r\n return `group-container ${this.disabled ? 'disabled' : ''}`;\r\n }\r\n}\r\n","<div [class]=\"containerClass\">\r\n @for (item of items; track item.value) {\r\n <div\r\n class=\"group-item\"\r\n [class.active]=\"isActive(item.value)\"\r\n [class.inactive]=\"!isActive(item.value)\"\r\n (click)=\"onItemClick(item.value)\"\r\n >\r\n {{ item.label }}\r\n </div>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Optional, Output, Self } from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NgControl } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nexport type BkTextAreaAutoComplete =\r\n | 'on'\r\n | 'off'\r\n | 'name'\r\n | 'honorific-prefix'\r\n | 'given-name'\r\n | 'additional-name'\r\n | 'family-name'\r\n | 'honorific-suffix'\r\n | 'nickname'\r\n | 'email'\r\n | 'username'\r\n | 'new-password'\r\n | 'current-password'\r\n | 'organization-title'\r\n | 'organization'\r\n | 'street-address'\r\n | 'address-line1'\r\n | 'address-line2'\r\n | 'address-line3'\r\n | 'address-level4'\r\n | 'address-level3'\r\n | 'address-level2'\r\n | 'address-level1'\r\n | 'country'\r\n | 'country-name'\r\n | 'postal-code'\r\n | 'cc-name'\r\n | 'cc-given-name'\r\n | 'cc-additional-name'\r\n | 'cc-family-name'\r\n | 'cc-number'\r\n | 'cc-exp'\r\n | 'cc-exp-month'\r\n | 'cc-exp-year'\r\n | 'cc-csc'\r\n | 'cc-type'\r\n | 'transaction-currency'\r\n | 'transaction-amount'\r\n | 'language'\r\n | 'bday'\r\n | 'bday-day'\r\n | 'bday-month'\r\n | 'bday-year'\r\n | 'sex'\r\n | 'tel'\r\n | 'tel-country-code'\r\n | 'tel-national'\r\n | 'tel-area-code'\r\n | 'tel-local'\r\n | 'tel-extension'\r\n | 'impp'\r\n | 'url'\r\n | 'photo';\r\n\r\nexport type BkTextAreaAutoCapitalize =\r\n | 'off'\r\n | 'none'\r\n | 'on'\r\n | 'sentences'\r\n | 'words'\r\n | 'characters';\r\n\r\nexport type BkTextAreaInputMode =\r\n | 'none'\r\n | 'text'\r\n | 'tel'\r\n | 'url'\r\n | 'email'\r\n | 'numeric'\r\n | 'decimal'\r\n | 'search';\r\n@Component({\r\n selector: 'bk-textarea',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './textarea.html'\r\n})\r\nexport class BkTextarea implements ControlValueAccessor {\r\n @Input() autoComplete : BkTextAreaAutoComplete = 'off';\r\n @Input() name!: string;\r\n @Input() id!: string;\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() rows: number = 4;\r\n @Input() hint: string = '';\r\n @Input() required: boolean = false;\r\n @Input() maxlength: number | null = null;\r\n @Input() minlength: number | null = null;\r\n @Input() hasError: boolean | null = false;\r\n @Input() disabled: boolean = false;\r\n @Input() errorMessage: string = '';\r\n @Input() tabIndex: number | null = null;\r\n @Input() readOnly: boolean = false;\r\n @Input() autoCapitalize: BkTextAreaAutoCapitalize | null = null;\r\n @Input() inputMode: BkTextAreaInputMode | null = null;\r\n @Output() input = new EventEmitter<Event>();\r\n @Output() change = new EventEmitter<Event>();\r\n @Output() blur = new EventEmitter<Event>();\r\n @Output() focus = new EventEmitter<Event>();\r\n value: string = '';\r\n\r\n\r\n // --- ControlValueAccessor ---\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n\r\n constructor(@Optional() @Self() private ngControl: NgControl) {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n\r\n\r\n // --- Expose FormControl state ---\r\n get control(): any {\r\n return this.ngControl?.control;\r\n }\r\n\r\n get touched(): boolean {\r\n return this.control?.touched;\r\n }\r\n\r\n get dirty(): boolean {\r\n return this.control?.dirty;\r\n }\r\n\r\n get errors(): any {\r\n return this.control?.errors;\r\n }\r\n\r\n\r\n\r\n\r\n handleFocus(event: Event): void {\r\n this.focus.emit(event);\r\n }\r\n\r\n handleBlur(event:Event): void {\r\n this.onTouched();\r\n this.blur.emit(event);\r\n }\r\n handleInput(event: Event): void {\r\n const val = (event.target as HTMLInputElement).value;\r\n this.value = val; // update CVA value\r\n this.onChange(val); // propagate to parent form\r\n this.input.emit(event); // emit raw event\r\n }\r\n\r\n handleChange(event: Event) {\r\n this.change.emit(event); // emit raw change event\r\n }\r\n\r\n\r\n writeValue(value: any): void {\r\n this.value = value ?? '';\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n\r\n}\r\n","<div class=\"flex flex-col gap-1.5 w-full\">\r\n\r\n @if (label) {\r\n <label\r\n class=\"text-sm font-medium text-[#141414] block\" [for]=\"id\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"text-[#E7000B] ml-0.5\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative\">\r\n <textarea\r\n [id]=\"id\"\r\n [name]=\"name\"\r\n [disabled]=\"disabled\"\r\n [tabindex]=\"tabIndex\"\r\n [readOnly]=\"readOnly\"\r\n [attr.maxlength]=\"maxlength\"\r\n [attr.minlength]=\"minlength\"\r\n [autocomplete]=\"autoComplete\"\r\n [autocapitalize]=\"autoCapitalize\"\r\n [inputMode]=\"inputMode\"\r\n [value]=\"value\"\r\n (input)=\"handleInput($event)\"\r\n (change)=\"handleChange($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n [placeholder]=\"placeholder\"\r\n\r\n [autocomplete]=\"autoComplete\"\r\n\r\n rows=\"{{rows}}\"\r\n class=\"\r\n w-full\r\n px-3 py-2.5\r\n text-sm\r\n border border-[#E3E3E7] rounded-[4px]\r\n outline-none\r\n transition-colors duration-200\r\n bg-white resize-y\r\n placeholder:text-[#6B7080]\r\n \"\r\n [ngClass]=\"{\r\n 'border-[#FA727A] text-[#141414]': hasError && !disabled,\r\n\r\n 'focus:border-[#6B7080] text-[#141414]': !hasError && !disabled,\r\n\r\n 'bg-[#F4F4F6] text-[#A1A3AE] border-[#E3E3E7] cursor-not-allowed': disabled\r\n }\"\r\n ></textarea>\r\n </div>\r\n\r\n <div class=\"flex justify-between items-start font-normal text-sm\">\r\n\r\n <div class=\"flex-1\">\r\n @if (hasError) {\r\n <span class=\"text-[#F34050]\">\r\n {{ errorMessage }}\r\n </span>\r\n } @else if (hint) {\r\n <span class=\"text-[#868997]\">\r\n {{ hint }}\r\n </span>\r\n }\r\n </div>\r\n\r\n @if (maxlength) {\r\n <div\r\n class=\"text-[#868997] tabular-nums flex-shrink-0\"\r\n >\r\n {{ value.length }}/{{ maxlength }}\r\n </div>\r\n }\r\n\r\n\r\n </div>\r\n\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n Renderer2,\r\n OnDestroy,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[bkTooltip]',\r\n standalone: true,\r\n})\r\nexport class BKTooltipDirective implements OnInit,OnChanges, OnDestroy {\r\n @Input('bkTooltip') tooltipContent: string | string[] = '';\r\n @Input('bkTooltipPosition') tooltipPosition: 'left' | 'right' | 'top' | 'bottom' = 'right';\r\n\r\n private tooltipElement: HTMLElement | null = null;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) {}\r\n\r\n ngOnInit(): void {\r\n this.createTooltip();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['tooltipContent'] && !changes['tooltipContent'].firstChange) {\r\n this.updateTooltipContent();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeTooltip();\r\n }\r\n\r\n\r\n updateTooltipContent() {\r\n // If tooltip doesn't exist yet and content is now available, create it\r\n if (!this.tooltipElement && !this.isTooltipContentEmpty()) {\r\n this.createTooltip();\r\n return;\r\n }\r\n\r\n if (!this.tooltipElement) return;\r\n if (this.isTooltipContentEmpty()) return;\r\n\r\n // remove old .text nodes\r\n Array.from(this.tooltipElement.querySelectorAll('.text')).forEach((el) =>\r\n this.renderer.removeChild(this.tooltipElement, el)\r\n );\r\n\r\n this.appendContent();\r\n }\r\n\r\n appendContent() {\r\n if (!this.tooltipElement) return;\r\n\r\n const contentLines = Array.isArray(this.tooltipContent)\r\n ? this.tooltipContent\r\n : [this.tooltipContent];\r\n\r\n contentLines.forEach((line: string) => {\r\n const div = this.renderer.createElement('div');\r\n this.renderer.addClass(div, 'text');\r\n if (line?.trim().startsWith('<')) {\r\n div.innerHTML = line;\r\n } else {\r\n const text = this.renderer.createText(line ?? '');\r\n this.renderer.appendChild(div, text);\r\n }\r\n this.renderer.appendChild(this.tooltipElement!, div);\r\n });\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n if (this.tooltipElement) {\r\n this.setTooltipPosition();\r\n this.setStyle(this.tooltipElement, {\r\n visibility: 'visible',\r\n opacity: '1',\r\n });\r\n this.renderer.setStyle(document.body, 'overflow-x', 'hidden');// ✅ temporarily lock horizontal scroll\r\n }\r\n }\r\n\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave() {\r\n if (this.tooltipElement) {\r\n this.setStyle(this.tooltipElement, {\r\n visibility: 'hidden',\r\n opacity: '0',\r\n });\r\n this.renderer.removeStyle(document.body, 'overflow-x'); // ✅ restore scroll when tooltip hides\r\n }\r\n }\r\n\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n onWindowChange() {\r\n if (this.tooltipElement?.style.visibility === 'visible') {\r\n this.setTooltipPosition();\r\n }\r\n }\r\n private isTooltipContentEmpty(): boolean {\r\n if (typeof this.tooltipContent === 'string') {\r\n return !this.tooltipContent.trim();\r\n } else if (Array.isArray(this.tooltipContent)) {\r\n return this.tooltipContent.length === 0 || this.tooltipContent.every(line => !line.trim());\r\n }\r\n return true;\r\n }\r\n private createTooltip() {\r\n if(this.isTooltipContentEmpty()) return\r\n this.tooltipElement = this.renderer.createElement('div');\r\n this.renderer.addClass(this.tooltipElement, 'bk-tooltip-content');\r\n\r\n // Add content\r\n const contentLines = Array.isArray(this.tooltipContent) ? this.tooltipContent : [this.tooltipContent];\r\n contentLines.forEach((line: string) => {\r\n const div = this.renderer.createElement('div');\r\n this.renderer.addClass(div, 'text');\r\n // this.renderer.appendChild(div, this.renderer.createText(line));\r\n // Check if the line contains HTML\r\n if (line.trim().startsWith('<')) {\r\n div.innerHTML = line;\r\n } else {\r\n const text = this.renderer.createText(line);\r\n this.renderer.appendChild(div, text);\r\n }\r\n this.renderer.appendChild(this.tooltipElement!, div);\r\n });\r\n\r\n // Add triangle\r\n const triangle = this.renderer.createElement('div');\r\n this.renderer.addClass(triangle, 'bk-tooltip-triangle');\r\n this.renderer.appendChild(this.tooltipElement, triangle);\r\n\r\n // Set base styles\r\n this.setStyle(this.tooltipElement!, {\r\n position: 'fixed',\r\n visibility: 'hidden',\r\n opacity: '0',\r\n zIndex: '9999',\r\n transition: 'opacity 0.3s ease, visibility 0.3s ease',\r\n });\r\n\r\n this.renderer.appendChild(document.body, this.tooltipElement);\r\n }\r\n\r\n private setTooltipPosition() {\r\n if (!this.tooltipElement) return;\r\n\r\n const hostRect = this.el.nativeElement.getBoundingClientRect();\r\n const tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n\r\n const triangle = this.tooltipElement.querySelector('.bk-tooltip-triangle') as HTMLElement;\r\n const padding = 10;\r\n\r\n let top = 0, left = 0;\r\n\r\n // Position logic\r\n switch (this.tooltipPosition) {\r\n case 'right':\r\n case 'left':\r\n top = hostRect.top + scrollTop + hostRect.height / 2;\r\n left = this.tooltipPosition === 'right'\r\n ? hostRect.right + scrollLeft + padding\r\n : hostRect.left + scrollLeft - tooltipRect.width - padding;\r\n\r\n // Auto flip if out of viewport\r\n if (this.tooltipPosition === 'right' && left + tooltipRect.width > window.innerWidth) {\r\n left = hostRect.left + scrollLeft - tooltipRect.width - padding;\r\n } else if (this.tooltipPosition === 'left' && left < 0) {\r\n left = hostRect.right + scrollLeft + padding;\r\n }\r\n\r\n this.setStyle(this.tooltipElement, {\r\n transform: 'translateY(-50%)',\r\n });\r\n\r\n this.setTriangleStyles(triangle, this.tooltipPosition, left < hostRect.left + scrollLeft);\r\n break;\r\n\r\n case 'top':\r\n case 'bottom':\r\n left = hostRect.left + scrollLeft + hostRect.width / 2 - tooltipRect.width / 2;\r\n top = this.tooltipPosition === 'top'\r\n ? hostRect.top + scrollTop - tooltipRect.height - padding\r\n : hostRect.bottom + scrollTop + padding;\r\n\r\n // Prevent overflow\r\n left = Math.max(10, Math.min(left, window.innerWidth - tooltipRect.width - 10));\r\n\r\n this.setStyle(this.tooltipElement, {\r\n transform: 'translateX(0)',\r\n });\r\n\r\n this.setTriangleStyles(triangle, this.tooltipPosition);\r\n break;\r\n }\r\n\r\n this.setStyle(this.tooltipElement, {\r\n top: `${top}px`,\r\n left: `${left}px`,\r\n });\r\n }\r\n\r\n private setTriangleStyles(\r\n triangle: HTMLElement,\r\n position: 'left' | 'right' | 'top' | 'bottom',\r\n flipped: boolean = false\r\n ) {\r\n if (!triangle) return;\r\n\r\n const base = {\r\n top: '',\r\n left: '',\r\n right: '',\r\n bottom: '',\r\n transform: '',\r\n borderColor: '',\r\n };\r\n\r\n let styles: any = { ...base };\r\n\r\n switch (position) {\r\n case 'right':\r\n styles = flipped\r\n ? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }\r\n : { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };\r\n break;\r\n\r\n case 'left':\r\n styles = flipped\r\n ? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }\r\n : { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };\r\n break;\r\n\r\n case 'top':\r\n styles = {\r\n bottom: '-15px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n borderColor: '#1a1a1a transparent transparent transparent',\r\n };\r\n break;\r\n\r\n case 'bottom':\r\n styles = {\r\n top: '-15px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n borderColor: 'transparent transparent #1a1a1a transparent',\r\n };\r\n break;\r\n }\r\n\r\n this.setStyle(triangle, styles);\r\n }\r\n\r\n private removeTooltip() {\r\n if (this.tooltipElement) {\r\n this.renderer.removeChild(document.body, this.tooltipElement);\r\n this.tooltipElement = null;\r\n }\r\n }\r\n\r\n // Utility function to apply multiple styles\r\n private setStyle(el: HTMLElement, styles: { [key: string]: string }) {\r\n Object.entries(styles).forEach(([prop, value]) => {\r\n this.renderer.setStyle(el, prop, value);\r\n });\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { TableColumn, TableAction } from '../../models/grid.model';\r\nimport { CdkDragDrop, moveItemInArray, CdkDragMove, CdkDragStart, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { BKTooltipDirective } from '../../../tooltip/tooltip.directive';\r\nexport type SortDirection = 'asc' | 'desc';\r\n@Component({\r\n selector: 'bk-grid',\r\n standalone: true,\r\n imports: [CommonModule,DragDropModule,ScrollingModule, BKTooltipDirective],\r\n templateUrl: './grid.html',\r\n styleUrl: './grid.css',\r\n})\r\nexport class BkGrid<T = any> {\r\n @Input() draggable: boolean = false;\r\n @Input() columns: TableColumn<T>[] = [];\r\n @Input() result!: T[];\r\n @Input() actions: TableAction[] = [];\r\n\r\n @Output() actionClick = new EventEmitter<{\r\n action: string;\r\n row: T;\r\n }>();\r\n\r\n @Output() sortChange = new EventEmitter<{\r\n columnIndex: number;\r\n column: TableColumn<T>;\r\n direction: SortDirection;\r\n }>();\r\n @Output() dragDropChange = new EventEmitter<T[]>();\r\n sortColumn?: keyof T;\r\n sortDirection:SortDirection = 'asc';\r\n\r\n @ViewChild('tableScrollContainer', { static: false })\r\n tableScrollContainer!: ElementRef<HTMLDivElement>;\r\n\r\n get firstVisibleColumnIndex(): number {\r\n const index = this.columns.findIndex(col => col.visible !== false);\r\n return index >= 0 ? index : 0;\r\n }\r\n /* ---------- Sorting ---------- */\r\n sort(column: TableColumn<T>, index: number) {\r\n if (!column.sortable || !column.field) return;\r\n\r\n // Toggle sort direction\r\n this.sortDirection =\r\n this.sortColumn === column.field ? (this.sortDirection === 'asc' ? 'desc' : 'asc') : 'asc';\r\n\r\n this.sortColumn = column.field;\r\n\r\n // Emit sort change separately\r\n this.sortChange.emit({\r\n columnIndex: index,\r\n column,\r\n direction: this.sortDirection,\r\n });\r\n }\r\n\r\n /* ---------- Visibility ---------- */\r\n isColumnVisible(column: TableColumn<T>): boolean {\r\n return column.visible !== false;\r\n }\r\n\r\n /* ---------- Cell Value ---------- */\r\n getCellValue(row: T, column: TableColumn<T>): string {\r\n if (column.formatter) {\r\n return column.formatter(row);\r\n }\r\n if (column.field) {\r\n return String(row[column.field] ?? '');\r\n }\r\n return '';\r\n }\r\n\r\n /* ---------- Actions ---------- */\r\n emitAction(action: TableAction, row: T) {\r\n this.actionClick.emit({\r\n action: action.name,\r\n row,\r\n });\r\n }\r\n\r\n dropList(event: CdkDragDrop<T[]>) {\r\n if (!this.draggable || !this.result) return;\r\n\r\n moveItemInArray(this.result, event.previousIndex, event.currentIndex);\r\n\r\n // Update existing sortOrder on T\r\n this.result.forEach((item: any, index) => {\r\n item.sortOrder = index + 1;\r\n });\r\n\r\n // Emit reordered list\r\n this.dragDropChange.emit(this.result);\r\n }\r\n\r\n onDragMoved(event: CdkDragMove<any>) {\r\n if (!this.tableScrollContainer) return;\r\n\r\n const container = this.tableScrollContainer.nativeElement;\r\n const rect = container.getBoundingClientRect();\r\n const pointerY = event.pointerPosition.y - rect.top;\r\n\r\n const threshold = 80;\r\n const maxSpeed = 25;\r\n\r\n if (pointerY < threshold) {\r\n const intensity = 1 - pointerY / threshold;\r\n container.scrollTop -= Math.min(maxSpeed, intensity * maxSpeed);\r\n } else if (pointerY > rect.height - threshold) {\r\n const intensity = 1 - (rect.height - pointerY) / threshold;\r\n container.scrollTop += Math.min(maxSpeed, intensity * maxSpeed);\r\n }\r\n }\r\n\r\n onDragStart(event: CdkDragStart<any>) {\r\n const row = event.source.element.nativeElement as HTMLElement;\r\n const cells = Array.from(row.querySelectorAll('td'));\r\n\r\n setTimeout(() => {\r\n const preview = document.querySelector('.cdk-drag-preview') as HTMLElement;\r\n\r\n if (!preview) return;\r\n\r\n const previewCells = preview.querySelectorAll('td');\r\n\r\n cells.forEach((cell, index) => {\r\n const width = cell.getBoundingClientRect().width + 'px';\r\n const previewCell = previewCells[index] as HTMLElement;\r\n\r\n if (previewCell) {\r\n previewCell.style.width = width;\r\n previewCell.style.minWidth = width;\r\n previewCell.style.maxWidth = width;\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","<div\r\n #tableScrollContainer\r\n cdkScrollable\r\n class=\"h-[calc(100vh-260px)] overflow-y-auto\">\r\n\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\r\n\r\n <!-- ================= HEADER ================= -->\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.header;let i=$index;) {\r\n @if (isColumnVisible(col)) {\r\n <th\r\n class=\"grid-header sticky top-0 cursor-pointer\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\"\r\n (click)=\"sort(col,i)\"\r\n >\r\n <span class=\"flex items-center gap-1\"\r\n [ngClass]=\"sortColumn === col.field\r\n ? (sortDirection === 'asc' ? 'grid-asc' : 'grid-desc')\r\n : ''\">\r\n {{ col.header }}\r\n @if (col.sortable) {\r\n <span class=\"grid-sort-icon\"></span>\r\n }\r\n </span>\r\n </th>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <th class=\"grid-header sticky top-0 action-sticky z-10 !bg-[#FBFBFC] w-20\">\r\n Action\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- ================= BODY ================= -->\r\n <tbody\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!draggable\"\r\n [cdkDropListData]=\"result || []\"\r\n (cdkDropListDropped)=\"dropList($event)\">\r\n\r\n @for (row of result; track row; let rowIndex = $index) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragDisabled]=\"!draggable\"\r\n (cdkDragStarted)=\"onDragStart($event)\"\r\n (cdkDragMoved)=\"onDragMoved($event)\"\r\n class=\"\" [ngClass]=\"{ 'cursor-move ': draggable }\">\r\n\r\n @for (col of columns; track col.header; let colIndex = $index) {\r\n @if (isColumnVisible(col)) {\r\n <td class=\"grid-cell text-nowrap\" [ngClass]=\"col.cellClass\">\r\n @if (draggable && colIndex === firstVisibleColumnIndex) {\r\n <span cdkDragHandle class=\"mr-2 text-gray-400\" [ngClass]=\"{ 'cursor-move': draggable }\">☰</span>\r\n }\r\n {{ getCellValue(row, col) }}\r\n </td>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <td class=\"grid-cell action-sticky text-center\">\r\n <div class=\"flex items-center justify-center gap-1.5\">\r\n @for (action of actions; track action.name) {\r\n @if (action.hasPermission) {\r\n \r\n <button \r\n bkTooltip=\"{{ action.tooltip }}\"\r\n bkTooltipPosition=\"top\" \r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA]\"\r\n (click)=\"emitAction(action, row)\"\r\n >\r\n <img\r\n [src]=\"action.icon\"\r\n width=\"14\"\r\n height=\"14\"\r\n alt=\"action-icon\"\r\n />\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n","import {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n model,\r\n forwardRef,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n computed,\r\n effect,\r\n ViewChild,\r\n ViewChildren,\r\n QueryList, Input\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-select',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './select.html',\r\n styleUrls: ['./select.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkSelect),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkSelect implements ControlValueAccessor {\r\n // --- Inputs ---\r\n items = input<any[]>([]);\r\n bindLabel = input<string>('label');\r\n bindValue = input<string>('');\r\n placeholder = input<string>('');\r\n notFoundText = input<string>('No items found');\r\n loadingText = input<string>('Loading...');\r\n clearAllText = input<string>('Clear all');\r\n groupBy = input<string>(''); // NEW\r\n colorKey = input<string>(''); // e.g. \"color\"\r\n\r\n // iconSrc = input<string>('Clear all');\r\n @Input() iconAlt: string = 'icon';\r\n @Input() label: string = '';\r\n @Input() required: Boolean = false;\r\n\r\n\r\n @Input() iconSrc?: string; // optional icon\r\n\r\n // Config\r\n multiple = input<boolean>(false);\r\n maxLabels = input<number>(2);\r\n searchable = input<boolean>(true);\r\n allSelect = input<boolean>(false);\r\n clearable = input<boolean>(true);\r\n readonly = input<boolean>(false);\r\n disabled = model<boolean>(false);\r\n loading = input<boolean>(false);\r\n closeOnSelect = input<boolean>(true);\r\n dropdownPosition = input<'bottom' | 'top'>('bottom');\r\n @Input() hasError: boolean = false;\r\n @Input() errorMessage: string = '';\r\n\r\n\r\n // 1. NEW INPUT: Toggle append-to-body behavior\r\n appendToBody = input<boolean>(false);\r\n\r\n // --- Outputs ---\r\n open = output<void>();\r\n close = output<void>();\r\n focus = output<void>();\r\n blur = output<void>();\r\n search = output<{ term: string, items: any[] }>();\r\n clear = output<any>();\r\n change = output<any>();\r\n scrollToEnd = output<void>();\r\n\r\n // --- Refs ---\r\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\r\n @ViewChild('optionsListContainer') optionsListContainer!: ElementRef<HTMLDivElement>;\r\n @ViewChildren('optionsRef') optionsRef!: QueryList<ElementRef>;\r\n @ViewChild('controlWrapper') controlWrapper!: ElementRef<HTMLDivElement>;\r\n\r\n // --- State ---\r\n private _value: any = null;\r\n\r\n isOpen = signal(false);\r\n selectedOptions = signal<any[]>([]);\r\n searchTerm = signal<string>('');\r\n markedIndex = signal(-1);\r\n\r\n dropdownStyle = signal<{\r\n top?: string;\r\n bottom?: string;\r\n left: string;\r\n width: string;\r\n }>({\r\n left: '0px',\r\n width: 'auto'\r\n });\r\n\r\n\r\n filteredItems = computed(() => {\r\n const term = this.searchTerm().toLowerCase();\r\n const list = this.items();\r\n if (!term || !this.searchable()) return list;\r\n return list.filter(item => {\r\n const label = this.resolveLabel(item).toLowerCase();\r\n return label.includes(term);\r\n });\r\n });\r\n\r\n isAllSelected = computed(() => {\r\n const filtered = this.filteredItems();\r\n const current = this.selectedOptions();\r\n if (!filtered.length) return false;\r\n return filtered.every(item => this.isItemSelected(item));\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const currentItems = this.items();\r\n if (currentItems.length > 0 && this._value !== null) {\r\n this.resolveSelectedOptions(this._value);\r\n }\r\n });\r\n }\r\n\r\n // --- Helpers ---\r\n resolveLabel(item: any): string {\r\n if (!item) return '';\r\n const labelProp = this.bindLabel();\r\n return labelProp && typeof item === 'object' ? item[labelProp] : String(item);\r\n }\r\n\r\n resolveValue(item: any): any {\r\n const valueProp = this.bindValue();\r\n return valueProp && typeof item === 'object' ? item[valueProp] : item;\r\n }\r\n\r\n isItemSelected(item: any): boolean {\r\n const current = this.selectedOptions();\r\n const compareFn = this.compareWith();\r\n const itemVal = this.resolveValue(item);\r\n return current.some(selected => compareFn(itemVal, this.resolveValue(selected)));\r\n }\r\n\r\n compareWith = input<(a: any, b: any) => boolean>((a, b) => a === b);\r\n\r\n // --- Actions ---\r\n\r\n toggleDropdown(event: Event | null) {\r\n if (event) { event.preventDefault(); event.stopPropagation(); }\r\n if (this.disabled() || this.readonly()) return;\r\n this.isOpen() ? this.closeDropdown() : this.openDropdown();\r\n }\r\n\r\n openDropdown() {\r\n if (this.isOpen()) return;\r\n\r\n // Only calculate position if we are appending to body\r\n if (this.appendToBody()) {\r\n this.updatePosition();\r\n }\r\n\r\n this.isOpen.set(true);\r\n // this.markedIndex.set(0);\r\n this.open.emit();\r\n this.focus.emit();\r\n // this.markedIndex.set(0);\r\n // setTimeout(() => this.searchInput?.nativeElement.focus());\r\n setTimeout(() => {\r\n if (this.searchable()) {\r\n this.searchInput?.nativeElement.focus();\r\n } else {\r\n this.controlWrapper?.nativeElement.focus();\r\n }\r\n });\r\n }\r\n\r\n closeDropdown() {\r\n if (!this.isOpen()) return;\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.onTouched();\r\n this.close.emit();\r\n this.blur.emit();\r\n }\r\n\r\n getTop(): string | null {\r\n if (this.appendToBody()) {\r\n return this.dropdownStyle().top ?? null;\r\n }\r\n\r\n // NOT appendToBody\r\n return this.dropdownPosition() === 'bottom' ? '105%' : null;\r\n }\r\n\r\n getBottom(): string | null {\r\n if (this.appendToBody()) {\r\n return this.dropdownStyle().bottom ?? null;\r\n }\r\n\r\n // NOT appendToBody\r\n return this.dropdownPosition() === 'top' ? '105%' : null;\r\n }\r\n\r\n\r\n updatePosition() {\r\n const rect = this.controlWrapper.nativeElement.getBoundingClientRect();\r\n\r\n if (this.dropdownPosition() === 'bottom') {\r\n this.dropdownStyle.set({\r\n top: `${rect.bottom + 4}px`,\r\n bottom: undefined,\r\n left: `${rect.left}px`,\r\n width: `${rect.width}px`\r\n });\r\n } else {\r\n this.dropdownStyle.set({\r\n top: undefined,\r\n bottom: `${window.innerHeight - rect.top + 4}px`,\r\n left: `${rect.left}px`,\r\n width: `${rect.width}px`\r\n });\r\n }\r\n }\r\n\r\n\r\n\r\n // 2. FIXED: Removed ['$event'] argument\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n onWindowEvents() {\r\n // Only close on scroll if we are in \"fixed\" mode (append to body)\r\n if (this.isOpen() && this.appendToBody()) {\r\n this.closeDropdown();\r\n }\r\n }\r\n\r\n // ... (toggleSelectAll, handleSelection, removeOption, handleClear logic same as before) ...\r\n\r\n toggleSelectAll(event: Event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n const allSelected = this.isAllSelected();\r\n const filtered = this.filteredItems();\r\n let newSelection = [...this.selectedOptions()];\r\n const compareFn = this.compareWith();\r\n if (allSelected) {\r\n newSelection = newSelection.filter(sel => {\r\n const selVal = this.resolveValue(sel);\r\n return !filtered.some(fItem => compareFn(this.resolveValue(fItem), selVal));\r\n });\r\n } else {\r\n filtered.forEach(item => {\r\n if (!this.isItemSelected(item)) newSelection.push(item);\r\n });\r\n }\r\n this.updateModel(newSelection);\r\n }\r\n\r\n handleSelection(item: any, event?: Event) {\r\n if (event) event.stopPropagation();\r\n if (this.multiple()) {\r\n const isSelected = this.isItemSelected(item);\r\n let newSelection = [...this.selectedOptions()];\r\n const compareFn = this.compareWith();\r\n if (isSelected) {\r\n const itemVal = this.resolveValue(item);\r\n newSelection = newSelection.filter(sel => !compareFn(this.resolveValue(sel), itemVal));\r\n } else {\r\n newSelection.push(item);\r\n }\r\n this.updateModel(newSelection);\r\n if (this.closeOnSelect()) this.closeDropdown();\r\n } else {\r\n this.updateModel([item]);\r\n if (this.closeOnSelect()) this.closeDropdown();\r\n }\r\n }\r\n\r\n removeOption(item: any, event: Event) {\r\n event.stopPropagation();\r\n const newSelection = this.selectedOptions().filter(i => i !== item);\r\n this.updateModel(newSelection);\r\n }\r\n\r\n handleClear(event: Event) {\r\n event.stopPropagation();\r\n this.updateModel([]);\r\n this.clear.emit(null);\r\n }\r\n\r\n private updateModel(items: any[]) {\r\n this.selectedOptions.set(items);\r\n if (this.multiple()) {\r\n const values = items.map(i => this.resolveValue(i));\r\n this._value = values;\r\n this.onChange(values);\r\n this.change.emit(items);\r\n } else {\r\n const item = items[0] || null;\r\n const value = item ? this.resolveValue(item) : null;\r\n this._value = value;\r\n this.onChange(value);\r\n this.change.emit(item);\r\n }\r\n }\r\n\r\n onSearchInput(event: Event) {\r\n const val = (event.target as HTMLInputElement).value;\r\n this.searchTerm.set(val);\r\n this.markedIndex.set(0);\r\n this.search.emit({ term: val, items: this.filteredItems() });\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (!this.isOpen()) return;\r\n const list = this.filteredItems();\r\n const current = this.markedIndex();\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (current < list.length - 1) {\r\n this.markedIndex.set(current + 1);\r\n this.scrollToMarked();\r\n }\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n if (current > 0) {\r\n this.markedIndex.set(current - 1);\r\n this.scrollToMarked();\r\n }\r\n break;\r\n case 'Enter':\r\n event.preventDefault();\r\n if (current >= 0 && list[current]) this.handleSelection(list[current]);\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n this.closeDropdown();\r\n break;\r\n }\r\n }\r\n\r\n onScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n if (target.scrollHeight - target.scrollTop <= target.clientHeight + 10) {\r\n this.scrollToEnd.emit();\r\n }\r\n }\r\n\r\n scrollToMarked() {\r\n setTimeout(() => {\r\n const container = this.optionsListContainer?.nativeElement;\r\n const options = this.optionsRef?.toArray();\r\n const index = this.markedIndex();\r\n if (container && options && options[index]) {\r\n const el = options[index].nativeElement;\r\n if (el.offsetTop < container.scrollTop) {\r\n container.scrollTop = el.offsetTop;\r\n } else if ((el.offsetTop + el.clientHeight) > (container.scrollTop + container.clientHeight)) {\r\n container.scrollTop = (el.offsetTop + el.clientHeight) - container.clientHeight;\r\n }\r\n }\r\n });\r\n }\r\n\r\n onChange: any = () => {};\r\n onTouched: any = () => {};\r\n writeValue(value: any): void { this._value = value; this.resolveSelectedOptions(value); }\r\n registerOnChange(fn: any) { this.onChange = fn; }\r\n registerOnTouched(fn: any) { this.onTouched = fn; }\r\n setDisabledState(d: boolean) { this.disabled.set(d); }\r\n\r\n private resolveSelectedOptions(val: any) {\r\n const list = this.items();\r\n if (!list.length) return;\r\n if (val === null || val === undefined) {\r\n this.selectedOptions.set([]);\r\n return;\r\n }\r\n const valArray = Array.isArray(val) ? val : [val];\r\n const bindVal = this.bindValue();\r\n const compare = this.compareWith();\r\n const matchedItems = list.filter(item => {\r\n const itemVal = bindVal ? item[bindVal] : item;\r\n return valArray.some(v => compare(v, itemVal));\r\n });\r\n this.selectedOptions.set(matchedItems);\r\n }\r\n\r\n private el = inject(ElementRef);\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(e: Event) {\r\n if (!this.el.nativeElement.contains(e.target)) this.closeDropdown();\r\n }\r\n\r\n openFromLabel(event: MouseEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (this.disabled() || this.readonly()) return;\r\n\r\n this.controlWrapper.nativeElement.focus();\r\n this.openDropdown();\r\n }\r\n\r\n groupedItems = computed(() => {\r\n const groupKey = this.groupBy();\r\n const list = this.filteredItems();\r\n\r\n if (!groupKey) {\r\n return [{ group: null, items: list }];\r\n }\r\n\r\n const map = new Map<string, any[]>();\r\n\r\n list.forEach(item => {\r\n const key = item[groupKey] ?? 'Others';\r\n if (!map.has(key)) map.set(key, []);\r\n map.get(key)!.push(item);\r\n });\r\n\r\n return Array.from(map.entries()).map(([group, items]) => ({\r\n group,\r\n items\r\n }));\r\n });\r\n\r\n resolveColor(item: any): string | null {\r\n if (!item) return null;\r\n const key = this.colorKey();\r\n return key && typeof item === 'object' ? item[key] : null;\r\n }\r\n\r\n\r\n}\r\n","<div class=\"ng-select-container\">\r\n\r\n @if(label){\r\n <label\r\n class=\"select-label\"\r\n (click)=\"openFromLabel($event)\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"select-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div\r\n #controlWrapper\r\n class=\"ng-select-control\"\r\n [ngClass]=\"{ 'has-error': hasError }\"\r\n\r\n tabindex=\"0\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [class.focused]=\"isOpen()\"\r\n [class.disabled]=\"disabled()\"\r\n (mousedown)=\"toggleDropdown($event)\"\r\n >\r\n <!-- Icon (Always visible if set) -->\r\n @if (iconSrc) {\r\n <img [src]=\"iconSrc\" [alt]=\"iconAlt\" class=\"shrink-0\"/>\r\n }\r\n <div class=\"ng-value-container\">\r\n @if (selectedOptions().length === 0) {\r\n <div class=\"ng-placeholder\">{{ placeholder() }}</div>\r\n }\r\n @if (multiple() && selectedOptions().length > 0) {\r\n <div class=\"ng-value-chips\">\r\n @for (opt of selectedOptions().slice(0, maxLabels()); track $index) {\r\n <div class=\"multi-badge-item\">\r\n <span class=\"multi-badge-item-text\" [style.color]=\"resolveColor(opt)\">{{ resolveLabel(opt) }}</span>\r\n\r\n <button type=\"button\" (mousedown)=\"removeOption(opt, $event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\r\n <path d=\"M6.625 0.625L0.625 6.625M0.625 0.625L6.625 6.625\" stroke=\"#BBBDC5\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n }\r\n @if (selectedOptions().length > maxLabels()) {\r\n <div class=\"multi-badge-item\"><span\r\n class=\"multi-badge-item-text\">+{{ selectedOptions().length - maxLabels() }}</span></div>\r\n }\r\n </div>\r\n }\r\n @if (!multiple() && selectedOptions().length > 0) {\r\n <div class=\"ng-value-label-single\" [style.color]=\"resolveColor(selectedOptions()[0])\">\r\n {{ resolveLabel(selectedOptions()[0]) }}</div>\r\n }\r\n </div>\r\n <div class=\"ng-actions\">\r\n @if (clearable() && selectedOptions().length > 0 && !disabled()) {\r\n <span class=\"ng-clear-wrapper\" (mousedown)=\"handleClear($event)\" title=\"Clear\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\"\r\n y1=\"6\" x2=\"6\"\r\n y2=\"18\"></line><line\r\n x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </span>\r\n }\r\n <span class=\"ng-arrow-wrapper\" [class.open]=\"isOpen()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path\r\n d=\"m6 9 6 6 6-6\"/></svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n @if (isOpen()) {\r\n <div\r\n #dropdownPanel\r\n class=\"custom-ng-dropdown-panel\"\r\n [attr.data-position]=\"dropdownPosition()\"\r\n (scroll)=\"onScroll($event)\"\r\n\r\n [style.position]=\"appendToBody() ? 'fixed' : 'absolute'\"\r\n [style.top]=\"getTop()\"\r\n [style.bottom]=\"getBottom()\"\r\n [style.left]=\"appendToBody() ? dropdownStyle().left : null\"\r\n [style.width]=\"appendToBody() ? dropdownStyle().width : '100%'\"\r\n [class.grouped]=\"groupBy()\"\r\n >\r\n\r\n\r\n @if (searchable()) {\r\n <div class=\"ng-dropdown-search\">\r\n <div class=\"ng-search-wrapper\">\r\n <svg class=\"text-[#BBBDC5] mr-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\r\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\r\n </svg>\r\n <input #searchInput type=\"text\" class=\"ng-search-input\" [value]=\"searchTerm()\" [placeholder]=\"'Search...'\"\r\n (input)=\"onSearchInput($event)\" (keydown)=\"onKeyDown($event)\" (click)=\"$event.stopPropagation()\">\r\n </div>\r\n </div>\r\n }\r\n <div #optionsListContainer class=\"ng-options-list\">\r\n @if (loading()) {\r\n <div class=\"ng-option-disabled\">{{ loadingText() }}</div>\r\n } @else {\r\n @if (allSelect()){\r\n\r\n @if (multiple() && filteredItems().length > 0) {\r\n <div class=\"ng-option\" (mousedown)=\"toggleSelectAll($event)\" [class.selected]=\"isAllSelected()\">\r\n <div class=\"flex-1 flex justify-between\">\r\n <span>Select All</span>\r\n @if (isAllSelected()) {\r\n <svg class=\"text-[#141414]\" width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\">\r\n <polyline points=\"20 6 9 17 4 12\"/>\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n @for (group of groupedItems(); track $index) {\r\n\r\n @if (group.group) {\r\n <div class=\"ng-option-group\">\r\n {{ group.group }}\r\n </div>\r\n }\r\n\r\n @for (item of group.items; track $index) {\r\n <div #optionsRef class=\"ng-option\" [class.selected]=\"isItemSelected(item)\" [class.marked]=\"$index === markedIndex()\" (click)=\"handleSelection(item, $event)\">\r\n <div class=\"flex-1 flex justify-between\">\r\n <span [style.color]=\"resolveColor(item)\">{{ resolveLabel(item) }}</span>\r\n\r\n @if (isItemSelected(item)) {\r\n <svg class=\"text-[#141414]\" width=\"17\" height=\"17\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\r\n <polyline points=\"20 6 9 17 4 12\"/>\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n }\r\n\r\n @if (filteredItems().length === 0) {\r\n <div class=\"ng-option-disabled\">{{ notFoundText() }}</div>\r\n }\r\n }\r\n </div>\r\n\r\n </div>\r\n }\r\n @if(hasError){\r\n @if (errorMessage) {\r\n <p class=\"select-error\">{{ errorMessage }}</p>\r\n }\r\n }\r\n\r\n\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgxMaskDirective, provideNgxMask } from 'ngx-mask';\r\nimport {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n ElementRef,\r\n ViewChild,\r\n forwardRef,\r\n Output,\r\n EventEmitter\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR\r\n} from '@angular/forms';\r\n\r\n\r\nexport type BkInputType =\r\n | 'text'\r\n | 'email'\r\n | 'password'\r\n | 'number'\r\n | 'url'\r\n | 'tel';\r\nexport type BkInputAutoComplete =\r\n | 'on'\r\n | 'off'\r\n | 'name'\r\n | 'honorific-prefix'\r\n | 'given-name'\r\n | 'additional-name'\r\n | 'family-name'\r\n | 'honorific-suffix'\r\n | 'nickname'\r\n | 'email'\r\n | 'username'\r\n | 'new-password'\r\n | 'current-password'\r\n | 'organization-title'\r\n | 'organization'\r\n | 'street-address'\r\n | 'address-line1'\r\n | 'address-line2'\r\n | 'address-line3'\r\n | 'address-level4'\r\n | 'address-level3'\r\n | 'address-level2'\r\n | 'address-level1'\r\n | 'country'\r\n | 'country-name'\r\n | 'postal-code'\r\n | 'cc-name'\r\n | 'cc-given-name'\r\n | 'cc-additional-name'\r\n | 'cc-family-name'\r\n | 'cc-number'\r\n | 'cc-exp'\r\n | 'cc-exp-month'\r\n | 'cc-exp-year'\r\n | 'cc-csc'\r\n | 'cc-type'\r\n | 'transaction-currency'\r\n | 'transaction-amount'\r\n | 'language'\r\n | 'bday'\r\n | 'bday-day'\r\n | 'bday-month'\r\n | 'bday-year'\r\n | 'sex'\r\n | 'tel'\r\n | 'tel-country-code'\r\n | 'tel-national'\r\n | 'tel-area-code'\r\n | 'tel-local'\r\n | 'tel-extension'\r\n | 'impp'\r\n | 'url'\r\n | 'photo';\r\n\r\nexport type BkInputAutoCapitalize =\r\n | 'off'\r\n | 'none'\r\n | 'on'\r\n | 'sentences'\r\n | 'words'\r\n | 'characters';\r\n\r\nexport type BkInputMode =\r\n | 'none'\r\n | 'text'\r\n | 'tel'\r\n | 'url'\r\n | 'email'\r\n | 'numeric'\r\n | 'decimal'\r\n | 'search';\r\n\r\nexport type IconOrientation = 'left' | 'right';\r\nexport interface CountryOption {\r\n code: string;\r\n name: string;\r\n mask: string;\r\n prefix:string;\r\n placeholder:string;\r\n}\r\n@Component({\r\n selector: 'bk-input',\r\n imports: [CommonModule,NgxMaskDirective,FormsModule],\r\n templateUrl: './input.html',\r\n styleUrl: './input.css',\r\n standalone: true,\r\n providers: [\r\n provideNgxMask(),\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkInput),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkInput implements OnInit, OnDestroy, ControlValueAccessor {\r\n\r\n // =================== Inputs (all your original ones) ===================\r\n @Input() id!: string ;\r\n @Input() name!: string ;\r\n @Input() mask: string | null= null;\r\n @Input() autoComplete : BkInputAutoComplete = 'off';\r\n @Input() label: string = '';\r\n @Input() placeholder: string = 'stephend@i2cinc.com';\r\n @Input() hint: string = '';\r\n @Input() required: boolean = false;\r\n @Input() type: BkInputType = 'text';\r\n @Input() value: string = '';\r\n @Input() hasError: boolean = false;\r\n @Input() showErrorIcon:boolean=false;\r\n @Input() errorMessage: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() tabIndex: number | null = null;\r\n @Input() readOnly: boolean = false;\r\n @Input() autoCapitalize: BkInputAutoComplete | null = null;\r\n @Input() inputMode: BkInputMode | null = null;\r\n @Input() iconSrc?: string;\r\n @Input() iconAlt: string = 'icon';\r\n @Input() showIcon: boolean = true;\r\n @Input() phone: boolean = false;\r\n @Input() countryCode: string = 'US';\r\n @Input() countryOptions: CountryOption[] = [\r\n { code: 'US', name: 'US', mask: '(000) 000-0000', prefix: '+1 ',placeholder:'(000) 000-0000' },\r\n { code: 'MT', name: 'MT', mask: '(000) 000-0000', prefix: '+356 ',placeholder:'(000) 000-0000' },\r\n { code: 'PL', name: 'PL', mask: '(000) 000-0000', prefix: '+48 ',placeholder:'(000) 000-0000' },\r\n { code: 'CH', name: 'CH', mask: '(000) 000-0000', prefix: '+41 ' ,placeholder:'(000) 000-0000'},\r\n { code: 'TR', name: 'TR', mask: '(000) 000-0000', prefix: '+90 ' ,placeholder:'(000) 000-0000'},\r\n { code: 'UG', name: 'UG', mask: '(000) 000-0000', prefix: '+256 ',placeholder:'(000) 000-0000' },\r\n { code: 'ZM', name: 'ZM', mask: '(000) 000-0000', prefix: '+260 ',placeholder:'(000) 000-0000' }\r\n];\r\n\r\n selectedCountry: CountryOption= this.countryOptions[0];\r\n @Input() iconOrientation: IconOrientation = 'left'\r\n\r\n @Input() password: boolean = false;\r\n @Input() showPassword: boolean = false;\r\n\r\n @Input() pattern?: string|null;\r\n @Input() max: number|null = null;\r\n @Input() min: number|null = null;\r\n @Input() step: number|null = null;\r\n @Input() maxlength: number|null = null;\r\n @Input() minlength: number|null = null;\r\n // =================== ViewChild ===================\r\n @ViewChild('dropdownRef') dropdownRef?: ElementRef;\r\n @ViewChild('selectRef') selectRef?: ElementRef;\r\n @ViewChild('inputField') inputField?: ElementRef<HTMLInputElement>;\r\n\r\n // =================== Internal State ===================\r\n isFocused: boolean = false;\r\n inputValue: string = '';\r\n isDropdownOpen: boolean = false;\r\n\r\n\r\n // =================== Output Emitter ===================\r\n @Output() input = new EventEmitter<Event>();\r\n @Output() change = new EventEmitter<Event>();\r\n @Output() focus = new EventEmitter<Event>();\r\n @Output() blur = new EventEmitter<Event>();\r\n @Output() clicked = new EventEmitter<boolean>();\r\n\r\n get placeHolderText(): string {\r\n if (this.phone) {\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n return country?.placeholder || '';\r\n }\r\n return this.placeholder;\r\n }\r\n\r\n get maskValue(): string {\r\n if (this.mask) return this.mask;\r\n if (this.phone) {\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n return country?.mask || '';\r\n }\r\n return '';\r\n }\r\n\r\n get maskPrefixValue(): string {\r\n if (this.phone) {\r\n\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n return country?.prefix || '';\r\n }\r\n return '';\r\n }\r\n\r\n // =================== CVA Callbacks ===================\r\n private onChange = (value: any) => {};\r\n private onTouched = () => {};\r\n\r\n writeValue(value: any): void {\r\n this.value = value || '';\r\n this.inputValue = this.value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // =================== Lifecycle ===================\r\n private closeAllDropdownsHandler = () => {\r\n if (this.phone && this.isDropdownOpen) this.isDropdownOpen = false;\r\n };\r\n\r\n ngOnInit(): void {\r\n if (this.value) this.inputValue = this.value;\r\n if (this.password && this.type !== 'password') this.type = 'password';\r\n if (this.phone) {\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n\r\n if (country) this.selectedCountry = country;\r\n document.addEventListener('closeAllPhoneDropdowns', this.closeAllDropdownsHandler);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.phone) {\r\n document.removeEventListener('closeAllPhoneDropdowns', this.closeAllDropdownsHandler);\r\n }\r\n }\r\n\r\n // =================== Host Listener ===================\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.phone && this.isDropdownOpen) {\r\n const target = event.target as HTMLElement;\r\n if (this.selectRef?.nativeElement && this.dropdownRef?.nativeElement) {\r\n const clickedInside =\r\n this.selectRef.nativeElement.contains(target) ||\r\n this.dropdownRef.nativeElement.contains(target);\r\n if (!clickedInside) this.isDropdownOpen = false;\r\n }\r\n }\r\n }\r\n\r\n // =================== Event Handlers ===================\r\n handleFocus(event: Event): void {\r\n this.focus.emit(event);\r\n if (!this.disabled) this.isFocused = true;\r\n }\r\n\r\n handleBlur(event:Event): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.blur.emit(event);\r\n }\r\n handleInput(event: Event): void {\r\n const val = (event.target as HTMLInputElement).value;\r\n this.inputValue = val;\r\n this.value = val; // update CVA value\r\n this.onChange(val); // propagate to parent form\r\n this.input.emit(event); // emit raw event\r\n }\r\n\r\n handleClicked():void {\r\n this.clicked.emit(true);\r\n }\r\n\r\n handleChange(event: Event) {\r\n this.change.emit(event); // emit raw change event\r\n }\r\n\r\n toggleDropdown(event?: Event): void {\r\n if (!this.disabled && this.phone) {\r\n if (!this.isDropdownOpen) {\r\n document.dispatchEvent(new CustomEvent('closeAllPhoneDropdowns'));\r\n setTimeout(() => (this.isDropdownOpen = true), 0);\r\n } else {\r\n this.isDropdownOpen = false;\r\n }\r\n event?.stopPropagation();\r\n }\r\n }\r\n\r\nselectCountry(country: CountryOption): void {\r\n const oldCountry = this.selectedCountry;\r\n this.selectedCountry = country;\r\n this.countryCode = country.code;\r\n this.isDropdownOpen = false;\r\n\r\n const currentRaw = this.inputField?.nativeElement?.value || this.inputValue;\r\n let newPhone = '';\r\n\r\n if (currentRaw && currentRaw.trim() !== '') {\r\n // Input has some value → replace old prefix\r\n if (oldCountry?.prefix && oldCountry.code !== country.code) {\r\n const oldPrefixEscaped = oldCountry.prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`^${oldPrefixEscaped}\\\\s?`);\r\n const oldMaskedValue = currentRaw.replace(regex, '');\r\n newPhone = country.prefix + oldMaskedValue;\r\n } else {\r\n newPhone = country.prefix + currentRaw;\r\n }\r\n } else {\r\n // Input is empty → show only the new prefix OR empty\r\n newPhone = ''; // optionally: newPhone = country.prefix;\r\n }\r\n\r\n this.inputValue = newPhone;\r\n this.value = newPhone;\r\n this.onChange(newPhone);\r\n\r\n setTimeout(() => {\r\n if (this.inputField?.nativeElement) {\r\n this.inputField.nativeElement.value = newPhone;\r\n this.inputField.nativeElement.dispatchEvent(\r\n new Event('input', { bubbles: true })\r\n );\r\n }\r\n }, 0);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n togglePasswordVisibility(event: Event): void {\r\n if (!this.disabled && this.password) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.showPassword = !this.showPassword;\r\n this.type = this.showPassword ? 'text' : 'password';\r\n }\r\n }\r\n\r\n handleIconClick(event: Event): void {\r\n if (this.disabled || this.readOnly) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n this.clicked.emit(true);\r\n }\r\n\r\n // =================== Getters ===================\r\n get isFilled(): boolean {\r\n return this.inputValue.length > 0;\r\n }\r\n\r\n get inputState(): 'default' | 'focused' | 'filled' | 'error' | 'disabled' {\r\n if (this.disabled) return 'disabled';\r\n if (this.hasError) return 'error';\r\n if (this.isFocused || this.isDropdownOpen) return 'focused';\r\n if (this.isFilled) return 'filled';\r\n return 'default';\r\n }\r\n\r\n get currentInputType(): string {\r\n if (this.password) return this.showPassword ? 'text' : 'password';\r\n return this.type;\r\n }\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"input-container\">\r\n @if(label){\r\n <label [for]=\"id\" class=\"input-label\">\r\n {{ label }}\r\n @if(required){\r\n <span class=\"input-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"input-wrapper\" [ngClass]=\"{\r\n 'input-wrapper--url': type === 'url',\r\n 'input-wrapper--phone': phone,\r\n 'input-wrapper--password': password,\r\n 'input-wrapper--icon': iconSrc && showIcon\r\n }\">\r\n\r\n <input\r\n #inputField\r\n [type]=\"currentInputType\"\r\n [id]=\"id\"\r\n [name]=\"name\"\r\n [disabled]=\"disabled\"\r\n [tabindex]=\"tabIndex\"\r\n [readOnly]=\"readOnly\"\r\n [attr.maxlength]=\"maxlength\"\r\n [attr.minlength]=\"minlength\"\r\n [autocomplete]=\"autoComplete\"\r\n [autocapitalize]=\"autoCapitalize\"\r\n\r\n [attr.max]=\"max\"\r\n [attr.min]=\"min\"\r\n [attr.step]=\"step\"\r\n\r\n [placeholder]=\"placeHolderText\"\r\n [pattern]=\"pattern\"\r\n [autocomplete]=\"autoComplete\"\r\n [value]=\"inputValue\"\r\n\r\n\r\n\r\n [mask]=\"maskValue\"\r\n [prefix]=\"maskPrefixValue\"\r\n [showMaskTyped]=\"false\"\r\n [dropSpecialCharacters]=\"false\"\r\n (change)=\"handleChange($event)\"\r\n (input)=\"handleInput($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"input-field\"\r\n\r\n [ngClass]=\"{\r\n 'input-field--url': type === 'url',\r\n 'input-field--phone': phone,\r\n 'input-field--icon-left': iconSrc && showIcon && iconOrientation === 'left',\r\n 'input-field--icon-right': iconSrc && showIcon && iconOrientation === 'right',\r\n 'input-field--password': password,\r\n 'input-field--default': inputState === 'default',\r\n 'input-field--focused': inputState === 'focused',\r\n 'input-field--filled': inputState === 'filled',\r\n 'input-field--error': inputState === 'error',\r\n 'input-field--disabled': inputState === 'disabled'\r\n }\">\r\n\r\n @if(iconSrc && showIcon){\r\n <img (click)=\"handleIconClick($event)\" [src]=\"iconSrc\" [alt]=\"iconAlt\" [ngClass]=\"{\r\n 'input-search-icon--left': iconOrientation === 'left',\r\n 'input-search-icon--right': iconOrientation === 'right',\r\n 'cursor-pointer': !disabled && !readOnly\r\n }\" class=\"input-search-icon\">\r\n }\r\n\r\n @if(showErrorIcon){\r\n <img src=\"../../assets/images/icons/global/info-circle.svg\" class=\"input-search-icon input-search-icon--right\">\r\n }\r\n\r\n @if(password){\r\n <button type=\"button\" (click)=\"togglePasswordVisibility($event)\" class=\"input-password-toggle\" [disabled]=\"disabled\" tabindex=\"-1\">\r\n <img [src]=\"showPassword ? '../../assets/images/icons/global/eye-slash-icon.svg' : '../../assets/images/icons/global/eye-icon.svg'\" [alt]=\"showPassword ? 'Hide password' : 'Show password'\" class=\"input-password-icon\">\r\n </button>\r\n }\r\n\r\n @if(phone){\r\n <div #selectRef class=\"input-phone-selector\" [ngClass]=\"{\r\n 'input-phone-selector--default': inputState === 'default',\r\n 'input-phone-selector--focused': inputState === 'focused',\r\n 'input-phone-selector--filled': inputState === 'filled',\r\n 'input-phone-selector--error': inputState === 'error',\r\n 'input-phone-selector--disabled': inputState === 'disabled'\r\n }\" (click)=\"toggleDropdown($event)\">\r\n <span class=\"input-phone-selector-text\">{{ selectedCountry.name }}</span>\r\n <img src=\"../../assets/images/icons/global/input-arrow-down.svg\" alt=\"Dropdown\" class=\"input-phone-selector-arrow\" [ngClass]=\"{'input-phone-selector-arrow--open': isDropdownOpen}\">\r\n </div>\r\n }\r\n\r\n @if(phone && isDropdownOpen){\r\n <div #dropdownRef class=\"input-phone-dropdown\" (click)=\"$event.stopPropagation()\">\r\n <button *ngFor=\"let country of countryOptions\" type=\"button\" class=\"input-phone-dropdown-item\" [ngClass]=\"{'input-phone-dropdown-item--active': selectedCountry.code === country.code}\" (click)=\"selectCountry(country); $event.stopPropagation()\">\r\n {{ country.name }}\r\n </button>\r\n </div>\r\n }\r\n\r\n\r\n\r\n @if(type === 'url'){\r\n <span class=\"input-url-prefix\" [ngClass]=\"{\r\n 'input-url-prefix--default': inputState === 'default',\r\n 'input-url-prefix--focused': inputState === 'focused',\r\n 'input-url-prefix--filled': inputState === 'filled',\r\n 'input-url-prefix--error': inputState === 'error',\r\n 'input-url-prefix--disabled': inputState === 'disabled'\r\n }\">https</span>\r\n }\r\n </div>\r\n\r\n @if(hasError){\r\n @if (errorMessage) {\r\n <p class=\"input-error\">{{ errorMessage }}</p>\r\n }\r\n }\r\n @if(!hasError){\r\n @if(hint){\r\n <p class=\"input-hint\">{{ hint }}</p>\r\n }\r\n }\r\n</div>\r\n","import { Component, Input, forwardRef, ViewChild, ElementRef, AfterViewInit, EventEmitter, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-input-chips',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-chips.html',\r\n styleUrl: './input-chips.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkInputChips),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkInputChips implements ControlValueAccessor, AfterViewInit {\r\n @ViewChild('badgeInput') badgeInput!: ElementRef<HTMLInputElement>;\r\n @ViewChild('fieldWrapper') fieldWrapper!: ElementRef<HTMLDivElement>;\r\n\r\n // --- Configuration Inputs ---\r\n @Input() id!: string ;\r\n @Input() name!: string ;\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() hint: string = '';\r\n @Input() required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() readOnly: boolean = false;\r\n /**\r\n * If true, displays the component in an error state (red border).\r\n * It also replaces the hint text with the error message.\r\n */\r\n @Input() hasError: boolean = false;\r\n @Input() errorMessage: string = 'This is a error message';\r\n // =================== Output Emitter ===================\r\n @Output() input = new EventEmitter<Event>();\r\n @Output() change = new EventEmitter<string[]>();\r\n\r\n @Output() focus = new EventEmitter<Event>();\r\n @Output() blur = new EventEmitter<Event>();\r\n // --- State Properties ---\r\n badges: string[] = [];\r\n inputValue: string = '';\r\n isFocused: boolean = false;\r\n needsScroll: boolean = false;\r\n\r\n // --- ControlValueAccessor Methods ---\r\n onChange: any = () => {};\r\n onTouched: any = () => {};\r\n\r\n // Get input state for styling variants\r\n get inputState(): 'default' | 'focused' | 'filled' | 'error' | 'disabled' {\r\n if (this.disabled) return 'disabled';\r\n if (this.hasError) return 'error';\r\n if (this.isFocused) return 'focused';\r\n if (this.badges.length > 0 || this.inputValue.length > 0) return 'filled';\r\n return 'default';\r\n }\r\n\r\n\r\n\r\n // Handle keydown events (Enter to add badge, Backspace to remove)\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n // Add badge on Enter or comma\r\n if (event.key === 'Enter' || event.key === ',') {\r\n event.preventDefault();\r\n this.addBadge();\r\n }\r\n // Remove last badge on Backspace when input is empty\r\n else if (event.key === 'Backspace' && this.inputValue === '' && this.badges.length > 0) {\r\n this.removeBadge(this.badges.length - 1);\r\n }\r\n }\r\n\r\n // Add a badge from the current input value\r\n addBadge(): void {\r\n const trimmedValue = this.inputValue.trim();\r\n if (trimmedValue && !this.badges.includes(trimmedValue)) {\r\n this.badges.push(trimmedValue);\r\n this.inputValue = '';\r\n this.updateValue();\r\n // Check if scroll is needed after adding badge (with delay for DOM update)\r\n setTimeout(() => this.checkScrollNeeded(), 10);\r\n } else if (trimmedValue && this.badges.includes(trimmedValue)) {\r\n // Optionally show a message that badge already exists\r\n this.inputValue = '';\r\n }\r\n }\r\n\r\n // Remove a badge at the given index\r\n removeBadge(index: number): void {\r\n if (this.disabled) return;\r\n this.badges.splice(index, 1);\r\n this.updateValue();\r\n // Check if scroll is needed after removing badge (with delay for DOM update)\r\n setTimeout(() => {\r\n this.checkScrollNeeded();\r\n if (this.badgeInput) {\r\n this.badgeInput.nativeElement.focus();\r\n }\r\n }, 10);\r\n }\r\n\r\n // Check if scrolling is needed (when content wraps)\r\n checkScrollNeeded(): void {\r\n if (this.fieldWrapper && this.fieldWrapper.nativeElement) {\r\n const wrapper = this.fieldWrapper.nativeElement;\r\n\r\n // Get all badge items\r\n const badgeItems = wrapper.querySelectorAll('.input-badge-item');\r\n\r\n if (badgeItems.length === 0) {\r\n // No badges, no scroll needed\r\n this.needsScroll = false;\r\n return;\r\n }\r\n\r\n // Get the first badge's top position\r\n const firstBadge = badgeItems[0] as HTMLElement;\r\n const firstBadgeTop = firstBadge.offsetTop;\r\n\r\n // Check if any badge is on a different line (different top position)\r\n let hasWrapped = false;\r\n for (let i = 1; i < badgeItems.length; i++) {\r\n const badge = badgeItems[i] as HTMLElement;\r\n // If a badge's top position is different, it means it wrapped to a new line\r\n if (Math.abs(badge.offsetTop - firstBadgeTop) > 5) {\r\n hasWrapped = true;\r\n break;\r\n }\r\n }\r\n\r\n // Also check if the input field is on a different line\r\n if (!hasWrapped && this.badgeInput && this.badgeInput.nativeElement) {\r\n const inputTop = this.badgeInput.nativeElement.offsetTop;\r\n if (Math.abs(inputTop - firstBadgeTop) > 5) {\r\n hasWrapped = true;\r\n }\r\n }\r\n\r\n // Only enable scroll if content actually wrapped\r\n this.needsScroll = hasWrapped;\r\n }\r\n }\r\n\r\n // Update the value and notify Angular Forms\r\n updateValue(): void {\r\n this.onChange([...this.badges]);\r\n this.change.emit([...this.badges]);\r\n }\r\n\r\n // Focus the input field\r\n focusInput(): void {\r\n if (!this.disabled && this.badgeInput) {\r\n this.badgeInput.nativeElement.focus();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Check scroll after view initializes\r\n setTimeout(() => this.checkScrollNeeded(), 10);\r\n }\r\n\r\n // Called when Angular writes a value TO the component (e.g. initial value)\r\n writeValue(value: any): void {\r\n if (Array.isArray(value)) {\r\n this.badges = [...value];\r\n } else {\r\n this.badges = [];\r\n }\r\n this.inputValue = '';\r\n // Check scroll after value is written (with delay for DOM update)\r\n setTimeout(() => this.checkScrollNeeded(), 10);\r\n }\r\n\r\n // Register function to call when value changes\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Register function to call when component is touched/blurred\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n // Called when the component is disabled via the form control\r\n setDisabledState(disabled: boolean): void {\r\n this.disabled = disabled;\r\n }\r\n\r\n // =================== Event Handlers ===================\r\n\r\n // Called when the value in the UI changes (user types)\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.inputValue = input.value;\r\n }\r\n\r\n\r\n handleFocus(event: Event): void {\r\n if (!this.disabled) {\r\n this.isFocused = true;\r\n }\r\n this.onChange([...this.badges]);\r\n this.focus.emit(event);\r\n }\r\n\r\n handleBlur(event:Event): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.onChange([...this.badges]);\r\n this.blur.emit(event);\r\n }\r\n\r\n\r\n\r\n}\r\n","<div class=\"input-badge-container\">\r\n @if (label) {\r\n <label\r\n [for]=\"id\"\r\n class=\"input-badge-label\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"input-badge-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"input-badge-wrapper\">\r\n <div\r\n #fieldWrapper\r\n class=\"input-badge-field-wrapper\"\r\n [ngClass]=\"{\r\n 'input-badge-field-wrapper--default': inputState === 'default',\r\n 'input-badge-field-wrapper--focused': inputState === 'focused',\r\n 'input-badge-field-wrapper--filled': inputState === 'filled',\r\n 'input-badge-field-wrapper--error': inputState === 'error',\r\n 'input-badge-field-wrapper--disabled': inputState === 'disabled',\r\n 'input-badge-field-wrapper--scrollable': needsScroll\r\n }\"\r\n (click)=\"focusInput()\"\r\n >\r\n <!-- Badges -->\r\n @for (badge of badges; track badge; let i = $index) {\r\n <div class=\"input-badge-item\">\r\n <span class=\"input-badge-item-text\">{{ badge }}</span>\r\n @if (!disabled) {\r\n <button type=\"button\" (click)=\"removeBadge(i); $event.stopPropagation()\"class=\"input-badge-item-close\" >\r\n <img src=\"../../../../assets/images/icons/global/badge-close.svg\" alt=\"Remove\" class=\"input-badge-item-close-icon\"/>\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Input Field -->\r\n <input\r\n #badgeInput\r\n type=\"text\"\r\n [id]=\"id\"\r\n [name]=\"name\"\r\n [value]=\"inputValue\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (input)=\"handleInput($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n [placeholder]=\"badges.length === 0 ? placeholder : ''\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n class=\"input-badge-input\"\r\n [ngClass]=\"{\r\n 'input-badge-input--default': inputState === 'default',\r\n 'input-badge-input--focused': inputState === 'focused',\r\n 'input-badge-input--filled': inputState === 'filled',\r\n 'input-badge-input--error': inputState === 'error',\r\n 'input-badge-input--disabled': inputState === 'disabled'\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"input-badge-footer\">\r\n <div class=\"input-badge-footer-content\">\r\n @if (hasError) {\r\n <span class=\"input-badge-error\"> {{ errorMessage }}</span>\r\n } @else if (hint) {\r\n <span class=\"input-badge-hint\"> {{ hint }}</span>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface TabItem {\r\n id: string;\r\n label: string;\r\n icon?: string; // Icon for inactive state\r\n iconActive?: string; // Icon for active state (optional, falls back to icon if not provided)\r\n iconAlt?: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'bk-tabs',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './tabs.html',\r\n styleUrl: './tabs.css',\r\n})\r\nexport class BkTabs {\r\n @Input() list: TabItem[] = [];\r\n @Input() activeTabId: string = '';\r\n @Input() disabled: boolean = false;\r\n\r\n @Output() change = new EventEmitter<TabItem>();\r\n\r\n // Set active tab and emit change event\r\n setActiveTab(tab:TabItem): void {\r\n debugger\r\n if (tab?.disabled || this.disabled) return;\r\n this.activeTabId = tab.id;\r\n this.change.emit(tab);\r\n\r\n }\r\n\r\n // Check if a tab is active\r\n isActive(tabId: string): boolean {\r\n return this.activeTabId === tabId;\r\n }\r\n\r\n // Get the appropriate icon for a tab based on its active state\r\n getTabIcon(tab: TabItem): string | undefined {\r\n if (this.isActive(tab.id) && tab.iconActive) {\r\n return tab.iconActive;\r\n }\r\n return tab.icon;\r\n }\r\n}\r\n","<div class=\"tabs-container\">\r\n <ul class=\"tabs-list\" role=\"tablist\">\r\n @for (tab of list; track tab.id; let i = $index) {\r\n <li class=\"tabs-item\" role=\"presentation\">\r\n <button\r\n type=\"button\"\r\n [id]=\"'tab-' + tab.id\"\r\n [attr.aria-selected]=\"isActive(tab.id)\"\r\n [attr.aria-controls]=\"'panel-' + tab.id\"\r\n [disabled]=\"tab.disabled\"\r\n [class.tabs-button--active]=\"isActive(tab.id)\"\r\n [class.tabs-button--disabled]=\"disabled || tab.disabled\"\r\n [class.tabs-button--no-icon]=\"!getTabIcon(tab)\"\r\n class=\"tabs-button\"\r\n (click)=\"setActiveTab(tab)\"\r\n role=\"tab\">\r\n @if (getTabIcon(tab)) {\r\n <img\r\n [src]=\"getTabIcon(tab)\"\r\n [alt]=\"tab.iconAlt || tab.label\"\r\n class=\"tabs-icon\">\r\n }\r\n <span class=\"tabs-label\">{{ tab.label }}</span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n</div>\r\n","/**\r\n * Dialog Injection Tokens\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * • `DIALOG_DATA` — Re-exported from `@angular/cdk/dialog` so that\r\n * consumers import from our barrel and the token identity matches\r\n * exactly what CDK's `Dialog` service provides in the injector.\r\n * This means `@Inject(DIALOG_DATA)` works without any extra wiring.\r\n *\r\n * • `DIALOG_GLOBAL_CONFIG` — Optional app-level defaults, same pattern\r\n * as before.\r\n *\r\n * • `INTERNAL_DIALOG_CONFIG` — Internal-only token used to pass our\r\n * full `DialogConfig` (including animation fields) to the custom\r\n * `DialogContainerComponent`. Not part of the public API.\r\n */\r\n\r\nimport { InjectionToken } from '@angular/core';\r\nimport { DIALOG_DATA as CDK_DIALOG_DATA } from '@angular/cdk/dialog';\r\nimport { DialogConfig } from './dialog-config';\r\n\r\n// ──── Public ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Injection token used to pass arbitrary data into a dialog component.\r\n *\r\n * This is CDK's own `DIALOG_DATA` token — re-exported so that imports\r\n * from our barrel (`shared/components/dialog`) resolve to the exact same\r\n * token that CDK's `Dialog` service provides.\r\n *\r\n * Usage inside a dialog component:\r\n * ```ts\r\n * constructor(@Inject(DIALOG_DATA) public data: MyDataType) {}\r\n * ```\r\n */\r\nexport const DIALOG_DATA = CDK_DIALOG_DATA;\r\n\r\n/**\r\n * Optional token for providing global dialog defaults at the\r\n * application level.\r\n *\r\n * Usage in `app.config.ts` or a module's `providers` array:\r\n * ```ts\r\n * providers: [\r\n * { provide: DIALOG_GLOBAL_CONFIG, useValue: { animation: 'zoom', width: '600px' } }\r\n * ]\r\n * ```\r\n */\r\nexport const DIALOG_GLOBAL_CONFIG = new InjectionToken<DialogConfig>(\r\n 'DIALOG_GLOBAL_CONFIG',\r\n);\r\n\r\n// ──── Internal ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Internal token that carries our full `DialogConfig` (with animation\r\n * settings, position offsets, etc.) into the `DialogContainerComponent`.\r\n *\r\n * @internal — not exported from the barrel; do not depend on it.\r\n */\r\nexport const INTERNAL_DIALOG_CONFIG = new InjectionToken<DialogConfig>(\r\n 'INTERNAL_DIALOG_CONFIG',\r\n);\r\n","/**\r\n * Dialog Animations\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Animations are implemented via the Web Animations API (WAAPI) instead of\r\n * Angular's @angular/animations so that:\r\n * 1. The dialog container stays truly standalone — no BrowserAnimationsModule\r\n * dependency is required.\r\n * 2. We have full programmatic control over timing, easing, and cleanup.\r\n * 3. Future presets can be added without touching the component template.\r\n *\r\n * Each preset exports an `enter` and `leave` keyframe array plus a\r\n * recommended timing object. The DialogContainerComponent plays these\r\n * via `element.animate()`.\r\n */\r\n\r\nimport { DialogAnimation } from './dialog-config';\r\n\r\nexport interface AnimationKeyframes {\r\n keyframes: Keyframe[];\r\n options: KeyframeAnimationOptions;\r\n}\r\n\r\n/**\r\n * Build enter/leave WAAPI keyframes for the dialog **panel** element.\r\n */\r\nexport function getDialogPanelAnimation(\r\n preset: DialogAnimation,\r\n enterDuration: number,\r\n leaveDuration: number\r\n): { enter: AnimationKeyframes; leave: AnimationKeyframes } {\r\n const easeEnter = 'cubic-bezier(0.0, 0.0, 0.2, 1)'; // decelerate\r\n const easeLeave = 'cubic-bezier(0.4, 0.0, 1, 1)'; // accelerate\r\n\r\n switch (preset) {\r\n // ─── Fade ────────────────────────────────────────────────────\r\n case 'fade':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'scale(0.95)' },\r\n { opacity: 1, transform: 'scale(1)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'scale(1)' },\r\n { opacity: 0, transform: 'scale(0.95)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Zoom ────────────────────────────────────────────────────\r\n case 'zoom':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'scale(0.5)' },\r\n { opacity: 1, transform: 'scale(1)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'scale(1)' },\r\n { opacity: 0, transform: 'scale(0.5)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Top ───────────────────────────────────────────────\r\n case 'slide-top':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateY(-40px)' },\r\n { opacity: 1, transform: 'translateY(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateY(0)' },\r\n { opacity: 0, transform: 'translateY(-40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Bottom ────────────────────────────────────────────\r\n case 'slide-bottom':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateY(40px)' },\r\n { opacity: 1, transform: 'translateY(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateY(0)' },\r\n { opacity: 0, transform: 'translateY(40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Left ──────────────────────────────────────────────\r\n case 'slide-left':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateX(-40px)' },\r\n { opacity: 1, transform: 'translateX(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateX(0)' },\r\n { opacity: 0, transform: 'translateX(-40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Right ─────────────────────────────────────────────\r\n case 'slide-right':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateX(40px)' },\r\n { opacity: 1, transform: 'translateX(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateX(0)' },\r\n { opacity: 0, transform: 'translateX(40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── None ────────────────────────────────────────────────────\r\n case 'none':\r\n default:\r\n return {\r\n enter: {\r\n keyframes: [{ opacity: 1 }],\r\n options: { duration: 0, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [{ opacity: 0 }],\r\n options: { duration: 0, fill: 'forwards' },\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Build enter/leave WAAPI keyframes for the **backdrop** element.\r\n * The backdrop always uses a simple opacity fade regardless of the\r\n * panel animation preset.\r\n */\r\nexport function getDialogBackdropAnimation(\r\n enterDuration: number,\r\n leaveDuration: number\r\n): { enter: AnimationKeyframes; leave: AnimationKeyframes } {\r\n return {\r\n enter: {\r\n keyframes: [{ opacity: 0 }, { opacity: 1 }],\r\n options: { duration: enterDuration, easing: 'ease-out', fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [{ opacity: 1 }, { opacity: 0 }],\r\n options: { duration: leaveDuration, easing: 'ease-in', fill: 'forwards' },\r\n },\r\n };\r\n}\r\n","/**\r\n * DialogContainerComponent\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Extends CDK's `CdkDialogContainer` — the headless base class that\r\n * provides:\r\n * • Focus-trap management (tab key stays inside the dialog).\r\n * • Auto-focus / restore-focus behaviour.\r\n * • Portal outlet (`<ng-template cdkPortalOutlet />`) for dynamic\r\n * component projection.\r\n * • ARIA attribute management on the host element.\r\n *\r\n * We add:\r\n * • WAAPI enter / leave animations on the panel (host element) and\r\n * the CDK backdrop sibling.\r\n * • Flex-column styles on the dynamically created component host so\r\n * `.bk-dialog-content` scrolls and `.bk-dialog-actions` stays pinned.\r\n * • Position-offset application via CSS margin.\r\n *\r\n * This component is **never** used directly — it is created internally\r\n * by `DialogService` via CDK's `Dialog.open()`.\r\n */\r\n\r\nimport {\r\n Component,\r\n ComponentRef,\r\n inject,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CdkDialogContainer } from '@angular/cdk/dialog';\r\nimport { CdkPortalOutlet, ComponentPortal } from '@angular/cdk/portal';\r\n\r\nimport { DialogConfig } from './dialog-config';\r\nimport { INTERNAL_DIALOG_CONFIG } from './dialog.tokens';\r\nimport {\r\n getDialogPanelAnimation,\r\n getDialogBackdropAnimation,\r\n} from './dialog-animations';\r\n\r\n@Component({\r\n selector: 'bk-dialog-container',\r\n standalone: true,\r\n imports: [CdkPortalOutlet],\r\n templateUrl: './dialog-container.html',\r\n styleUrl: './dialog-container.css',\r\n host: {\r\n 'class': 'bk-dialog-container',\r\n },\r\n})\r\nexport class DialogContainerComponent extends CdkDialogContainer implements OnInit {\r\n\r\n /**\r\n * Our full config (including animation fields).\r\n * Provided by DialogService via the INTERNAL_DIALOG_CONFIG token.\r\n */\r\n private readonly _dialogConfig: DialogConfig = inject(INTERNAL_DIALOG_CONFIG);\r\n\r\n // ──── Opened promise ─────────────────────────────────────────────────\r\n /**\r\n * Resolves when the enter animation finishes (or immediately for 'none').\r\n * `DialogService` subscribes via `.then()` to emit `afterOpened` on the\r\n * `DialogRef`.\r\n */\r\n private _resolveOpened!: () => void;\r\n readonly opened = new Promise<void>(resolve => {\r\n this._resolveOpened = resolve;\r\n });\r\n\r\n // ──── Lifecycle ──────────────────────────────────────────────────────\r\n\r\n ngOnInit(): void {\r\n this._playEnterAnimation();\r\n this._applyPositionOffsets();\r\n }\r\n\r\n // ──── Portal override ────────────────────────────────────────────────\r\n\r\n /**\r\n * Override the CDK base to apply flex-column layout on the dynamically\r\n * created component's host element.\r\n *\r\n * Angular's emulated view encapsulation prevents scoped CSS from reaching\r\n * dynamically-projected elements, so we set styles programmatically.\r\n */\r\n override attachComponentPortal<C>(portal: ComponentPortal<C>): ComponentRef<C> {\r\n const ref = super.attachComponentPortal(portal);\r\n const el = ref.location.nativeElement as HTMLElement;\r\n el.style.display = 'flex';\r\n el.style.flexDirection = 'column';\r\n el.style.flex = '1 1 auto';\r\n el.style.minHeight = '0';\r\n el.style.overflow = 'hidden';\r\n return ref;\r\n }\r\n\r\n // ──── WAAPI Animations ───────────────────────────────────────────────\r\n\r\n /**\r\n * Play the enter animation on the panel (host element) and backdrop.\r\n * Resolves the `opened` promise when the panel animation finishes.\r\n */\r\n private _playEnterAnimation(): void {\r\n const preset = this._dialogConfig.animation ?? 'fade';\r\n\r\n if (preset === 'none') {\r\n this._resolveOpened();\r\n return;\r\n }\r\n\r\n const enterDur = this._dialogConfig.animationDurationEnter ?? 200;\r\n const leaveDur = this._dialogConfig.animationDurationLeave ?? 150;\r\n\r\n // ── Panel animation ──\r\n const panelAnim = getDialogPanelAnimation(preset, enterDur, leaveDur);\r\n const anim = this._elementRef.nativeElement.animate(\r\n panelAnim.enter.keyframes,\r\n panelAnim.enter.options,\r\n );\r\n\r\n // ── Backdrop animation ──\r\n const backdropEl = this._getBackdropElement();\r\n if (backdropEl) {\r\n // Override CDK's CSS transition so our WAAPI timing wins.\r\n backdropEl.style.transition = 'none';\r\n backdropEl.style.backgroundColor = 'var(--dialog-backdrop-bg, rgba(0, 0, 0, 0.5))';\r\n const bdAnim = getDialogBackdropAnimation(enterDur, leaveDur);\r\n backdropEl.animate(bdAnim.enter.keyframes, bdAnim.enter.options);\r\n }\r\n\r\n anim.onfinish = () => this._resolveOpened();\r\n }\r\n\r\n /**\r\n * Play the leave animation. Returns a Promise that resolves when done.\r\n * Called by `DialogRef._runCloseSequence()` before CDK tears down the\r\n * overlay.\r\n */\r\n playLeaveAnimation(): Promise<void> {\r\n const preset = this._dialogConfig.animation ?? 'fade';\r\n if (preset === 'none') return Promise.resolve();\r\n\r\n const enterDur = this._dialogConfig.animationDurationEnter ?? 200;\r\n const leaveDur = this._dialogConfig.animationDurationLeave ?? 150;\r\n\r\n return new Promise<void>(resolve => {\r\n // ── Panel ──\r\n const panelAnim = getDialogPanelAnimation(preset, enterDur, leaveDur);\r\n const anim = this._elementRef.nativeElement.animate(\r\n panelAnim.leave.keyframes,\r\n panelAnim.leave.options,\r\n );\r\n\r\n // ── Backdrop ──\r\n const backdropEl = this._getBackdropElement();\r\n if (backdropEl) {\r\n const bdAnim = getDialogBackdropAnimation(enterDur, leaveDur);\r\n backdropEl.animate(bdAnim.leave.keyframes, bdAnim.leave.options);\r\n }\r\n\r\n anim.onfinish = () => resolve();\r\n // Safety net — resolve even if onfinish never fires (SSR, etc.).\r\n setTimeout(() => resolve(), leaveDur + 50);\r\n });\r\n }\r\n\r\n // ──── Position Offsets ───────────────────────────────────────────────\r\n\r\n /**\r\n * Apply explicit position offsets via CSS margin.\r\n * These are additive to CDK's `GlobalPositionStrategy` alignment.\r\n */\r\n private _applyPositionOffsets(): void {\r\n const pos = this._dialogConfig.position;\r\n if (!pos) return;\r\n\r\n const el = this._elementRef.nativeElement;\r\n if (pos.top) el.style.marginTop = pos.top;\r\n if (pos.bottom) el.style.marginBottom = pos.bottom;\r\n if (pos.left) el.style.marginLeft = pos.left;\r\n if (pos.right) el.style.marginRight = pos.right;\r\n }\r\n\r\n // ──── Helpers ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * CDK places the backdrop as a sibling of `.cdk-overlay-pane`.\r\n * Walk up from our host → pane → wrapper, then query for the backdrop.\r\n */\r\n private _getBackdropElement(): HTMLElement | null {\r\n const pane = this._elementRef.nativeElement.closest('.cdk-overlay-pane');\r\n return pane?.parentElement?.querySelector<HTMLElement>('.cdk-overlay-backdrop') ?? null;\r\n }\r\n}\r\n","<!--\r\n Dialog Container Template (CDK-based)\r\n\r\n Architecture:\r\n ─────────────\r\n CDK Overlay manages the full overlay stack:\r\n\r\n ┌─ .cdk-overlay-container (fixed, z-index managed by CDK) ──────┐\r\n │ ┌─ .cdk-global-overlay-wrapper (flex-center) ──────────────┐ │\r\n │ │ .cdk-overlay-backdrop (click → close, CDK transition) │ │\r\n │ │ ┌─ .cdk-overlay-pane (width/height from config) ──────┐ │ │\r\n │ │ │ <bk-dialog-container> ← this component (panel) │ │ │\r\n │ │ │ <ng-template cdkPortalOutlet /> ← user component │ │ │\r\n │ │ │ <UserDialogComponent> │ │ │\r\n │ │ │ <h2 bk-dialog-title>Title</h2> │ │ │\r\n │ │ │ <div bk-dialog-content>Scrollable body</div> │ │ │\r\n │ │ │ <div bk-dialog-actions>Pinned buttons</div> │ │ │\r\n │ │ │ </UserDialogComponent> │ │ │\r\n │ │ │ </bk-dialog-container> │ │ │\r\n │ │ └──────────────────────────────────────────────────────┘ │ │\r\n │ └──────────────────────────────────────────────────────────┘ │\r\n └──────────────────────────────────────────────────────────────┘\r\n\r\n The host element IS the visible panel (background, radius, shadow).\r\n CDK Portal projects the caller's component as a direct child.\r\n\r\n Directives (BkDialogTitle, BkDialogContent, BkDialogActions, BkDialogClose)\r\n apply the corresponding CSS classes and add accessibility features.\r\n-->\r\n\r\n<ng-template cdkPortalOutlet />\r\n","/**\r\n * DialogRef — Handle returned to callers by `DialogService.open()`.\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Wraps CDK's `DialogRef` to add:\r\n * • WAAPI leave-animation before CDK tears down the overlay.\r\n * • Per-instance `afterOpened()` observable (CDK only has a service-level\r\n * `afterOpened` Subject).\r\n * • The same familiar API shape used by callers (`close`, `afterClosed`,\r\n * `backdropClick`, `keydownEvents`, `componentInstance`).\r\n *\r\n * CDK's `DialogRef<R, C>` has Result first, Component second.\r\n * Ours keeps `<T, R>` (Component first, Result second) to match the\r\n * convention consumers already use.\r\n */\r\n\r\nimport { DialogRef as CdkDialogRef } from '@angular/cdk/dialog';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\n/**\r\n * Minimal interface for the container's capabilities.\r\n * Avoids a direct import of `DialogContainerComponent` in this file\r\n * (container imports nothing from ref, so no cycle, but this keeps\r\n * the coupling lightweight).\r\n *\r\n * The optional ARIA methods are inherited from `CdkDialogContainer`\r\n * and used by `BkDialogTitle` to register/deregister title IDs for\r\n * the `aria-labelledby` attribute.\r\n */\r\nexport interface DialogAnimatable {\r\n playLeaveAnimation(): Promise<void>;\r\n _addAriaLabelledBy?(id: string): void;\r\n _removeAriaLabelledBy?(id: string): void;\r\n}\r\n\r\nexport class DialogRef<T = unknown, R = unknown> {\r\n /** Unique dialog identifier (managed by CDK). */\r\n readonly id: string;\r\n\r\n /** Instance of the component rendered inside the dialog. */\r\n componentInstance!: T;\r\n\r\n // ──── Internal wiring (set by DialogService) ──────────────────────────\r\n\r\n /** @internal Container reference for leave animation. */\r\n _containerInstance!: DialogAnimatable;\r\n\r\n /** @internal Prevent double-close. */\r\n private _closing = false;\r\n\r\n /** @internal Per-instance afterOpened Subject. */\r\n private readonly _afterOpened$ = new Subject<void>();\r\n\r\n constructor(\r\n /**\r\n * @internal Wrapped CDK ref.\r\n * Typed as `CdkDialogRef<any>` to avoid deep generic-variance issues\r\n * that arise from CDK's `config.providers` callback signature.\r\n * The public API (`afterClosed`, etc.) re-types the observables.\r\n */\r\n readonly _cdkRef: CdkDialogRef<any>,\r\n ) {\r\n this.id = _cdkRef.id;\r\n }\r\n\r\n // ──── Public API ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Close the dialog, optionally returning a result.\r\n * Plays the WAAPI leave animation, then delegates to CDK for cleanup.\r\n */\r\n close(result?: R): void {\r\n if (this._closing) return;\r\n this._closing = true;\r\n this._runCloseSequence(result);\r\n }\r\n\r\n /**\r\n * Observable that emits (and completes) once after the dialog has been\r\n * removed from the DOM and all cleanup is done.\r\n */\r\n afterClosed(): Observable<R | undefined> {\r\n return this._cdkRef.closed as Observable<R | undefined>;\r\n }\r\n\r\n /**\r\n * Observable that emits (and completes) when the enter animation\r\n * finishes and the dialog is fully visible.\r\n */\r\n afterOpened(): Observable<void> {\r\n return this._afterOpened$.asObservable();\r\n }\r\n\r\n /**\r\n * Observable of backdrop / outside-pointer click events.\r\n */\r\n backdropClick(): Observable<MouseEvent> {\r\n return this._cdkRef.outsidePointerEvents;\r\n }\r\n\r\n /**\r\n * Observable of keyboard events dispatched while this dialog is open.\r\n */\r\n keydownEvents(): Observable<KeyboardEvent> {\r\n return this._cdkRef.keydownEvents;\r\n }\r\n\r\n // ──── Internal helpers ────────────────────────────────────────────────\r\n\r\n /** @internal Called by the container once the enter animation finishes. */\r\n _emitOpened(): void {\r\n this._afterOpened$.next();\r\n this._afterOpened$.complete();\r\n }\r\n\r\n /** Play leave animation, then close via CDK. */\r\n private async _runCloseSequence(result?: R): Promise<void> {\r\n try {\r\n await this._containerInstance.playLeaveAnimation();\r\n } catch {\r\n // Animation may fail in SSR / test — proceed anyway.\r\n }\r\n this._cdkRef.close(result);\r\n }\r\n}\r\n","/**\r\n * Dialog Configuration\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Our `DialogConfig` mirrors the fields from CDK's `DialogConfig` that we\r\n * expose, plus adds custom animation properties powered by WAAPI.\r\n *\r\n * When `DialogService.open()` is called these values are:\r\n * 1. Merged with global defaults and per-call overrides.\r\n * 2. Mapped onto CDK's native `DialogConfig` for overlay, backdrop, scroll,\r\n * position, ARIA, and focus-trap management.\r\n * 3. Passed to `DialogContainerComponent` via an internal token for\r\n * animation playback and position offsets.\r\n *\r\n * CDK handles: unique IDs, z-index stacking, scroll blocking, focus trap,\r\n * backdrop rendering, overlay positioning, keyboard events.\r\n * We handle: WAAPI animations, panel appearance, convenience config sugar.\r\n */\r\n\r\nimport { ScrollStrategy } from '@angular/cdk/overlay';\r\n\r\n// ──── Animation Types ────────────────────────────────────────────────────\r\n\r\n/**\r\n * Built-in WAAPI animation presets.\r\n * 'none' disables animation entirely.\r\n */\r\nexport type DialogAnimation =\r\n | 'none'\r\n | 'fade'\r\n | 'zoom'\r\n | 'slide-top'\r\n | 'slide-bottom'\r\n | 'slide-left'\r\n | 'slide-right';\r\n\r\n// ──── Position ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Fine-grained position offsets.\r\n * When provided, the dialog shifts from the default centred position.\r\n * Internally this is mapped to CDK's `GlobalPositionStrategy`.\r\n */\r\nexport interface DialogPosition {\r\n top?: string;\r\n bottom?: string;\r\n left?: string;\r\n right?: string;\r\n}\r\n\r\n// ──── Main Config ────────────────────────────────────────────────────────\r\n\r\nexport interface DialogConfig<D = unknown> {\r\n // ── Identity ──────────────────────────────────────────────────────────\r\n /**\r\n * Unique dialog identifier.\r\n * CDK auto-generates one if omitted and validates uniqueness —\r\n * opening a second dialog with the same ID throws at runtime.\r\n */\r\n id?: string;\r\n\r\n // ── Sizing ────────────────────────────────────────────────────────────\r\n width?: string;\r\n height?: string;\r\n minWidth?: string | number;\r\n minHeight?: string | number;\r\n maxWidth?: string | number;\r\n maxHeight?: string | number;\r\n\r\n // ── Behaviour ─────────────────────────────────────────────────────────\r\n /**\r\n * Master lock — when `true`, neither ESC nor backdrop click closes\r\n * the dialog (same semantics as `MatDialogConfig.disableClose`).\r\n */\r\n disableClose?: boolean;\r\n\r\n /**\r\n * Close when backdrop is clicked. Default `true`.\r\n * Ignored when `disableClose` is `true`.\r\n */\r\n closeOnBackdrop?: boolean;\r\n\r\n /**\r\n * Close when Escape key is pressed. Default `true`.\r\n * Ignored when `disableClose` is `true`.\r\n */\r\n closeOnEsc?: boolean;\r\n\r\n /** Show a backdrop behind the dialog. Default `true`. */\r\n hasBackdrop?: boolean;\r\n\r\n /**\r\n * Block body scroll while the dialog is open. Default `true`.\r\n * Mapped to CDK `BlockScrollStrategy` / `NoopScrollStrategy`.\r\n */\r\n lockScroll?: boolean;\r\n\r\n // ── Styling ───────────────────────────────────────────────────────────\r\n /** Extra CSS class(es) applied to the CDK overlay pane. */\r\n panelClass?: string | string[];\r\n /** Extra CSS class(es) applied to the CDK backdrop element. */\r\n backdropClass?: string | string[];\r\n\r\n // ── Data ──────────────────────────────────────────────────────────────\r\n /** Payload injected into the dialog component via `DIALOG_DATA`. */\r\n data?: D;\r\n\r\n // ── Animation (WAAPI) ─────────────────────────────────────────────────\r\n /** Panel animation preset. Default `'fade'`. */\r\n animation?: DialogAnimation;\r\n /** Enter animation duration in ms. Default `200`. */\r\n animationDurationEnter?: number;\r\n /** Leave animation duration in ms. Default `150`. */\r\n animationDurationLeave?: number;\r\n\r\n // ── Position ──────────────────────────────────────────────────────────\r\n /** Position offsets — moves the dialog from its default centred position. */\r\n position?: DialogPosition;\r\n\r\n // ── Accessibility ─────────────────────────────────────────────────────\r\n role?: 'dialog' | 'alertdialog';\r\n ariaLabel?: string;\r\n ariaLabelledBy?: string;\r\n ariaDescribedBy?: string;\r\n /**\r\n * Where to send focus when the dialog opens.\r\n * `true` → first tabbable element (default).\r\n * `false` → no auto-focus.\r\n * A CSS selector string → that element.\r\n */\r\n autoFocus?: boolean | string;\r\n /** Restore focus to the previously-focused element on close. */\r\n restoreFocus?: boolean;\r\n\r\n // ── Advanced ──────────────────────────────────────────────────────────\r\n /** Override CDK's scroll strategy for this dialog. */\r\n scrollStrategy?: ScrollStrategy;\r\n}\r\n\r\n// ──── Defaults ───────────────────────────────────────────────────────────\r\n\r\nexport const DEFAULT_DIALOG_CONFIG: DialogConfig = {\r\n id: undefined,\r\n width: undefined,\r\n height: undefined,\r\n minWidth: undefined,\r\n minHeight: undefined,\r\n maxWidth: '90vw',\r\n maxHeight: '90vh',\r\n disableClose: false,\r\n closeOnBackdrop: true,\r\n closeOnEsc: true,\r\n hasBackdrop: true,\r\n lockScroll: true,\r\n panelClass: '',\r\n backdropClass: '',\r\n data: undefined,\r\n animation: 'fade',\r\n animationDurationEnter: 200,\r\n animationDurationLeave: 150,\r\n position: undefined,\r\n role: 'dialog',\r\n ariaLabel: undefined,\r\n ariaLabelledBy: undefined,\r\n ariaDescribedBy: undefined,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n scrollStrategy: undefined,\r\n};\r\n","/**\r\n * DialogService — The core engine of the custom dialog system.\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Built on top of Angular CDK's `Dialog` service (the same foundation\r\n * that `MatDialog` uses internally):\r\n *\r\n * 1. CDK creates the overlay, backdrop, scroll-blocking, focus-trap,\r\n * z-index stacking, and unique ID management — battle-tested infra\r\n * shared with every Angular Material dialog in the ecosystem.\r\n *\r\n * 2. We provide our own `DialogContainerComponent` (extending\r\n * `CdkDialogContainer`) for WAAPI animations and panel styling.\r\n *\r\n * 3. We wrap CDK's `DialogRef` in our own `DialogRef` to add the\r\n * leave-animation step before CDK tears down the overlay, and to\r\n * expose the same familiar API shape (`afterClosed()`, etc.).\r\n *\r\n * 4. Configuration is merged DEFAULT → GLOBAL → per-call, then mapped\r\n * to CDK's native config with our extras carried via an internal\r\n * injection token.\r\n *\r\n * What CDK handles for us (no custom code needed):\r\n * ─────────────────────────────────────────────────\r\n * ✓ Unique dialog IDs (throws on collision)\r\n * ✓ Z-index stacking via `.cdk-overlay-container`\r\n * ✓ Focus trap (tab key stays inside dialog)\r\n * ✓ Auto-focus / restore-focus\r\n * ✓ Scroll blocking (BlockScrollStrategy)\r\n * ✓ Backdrop rendering and click detection\r\n * ✓ Keyboard event forwarding\r\n * ✓ Overlay DOM lifecycle (create → attach → detach → dispose)\r\n *\r\n * Memory safety:\r\n * ─────────────\r\n * CDK manages the full lifecycle: on close it detaches the overlay,\r\n * destroys the container, and disposes the overlay ref.\r\n * Our DialogRef subjects complete via CDK's `closed` observable,\r\n * preventing lingering subscriptions.\r\n */\r\n\r\nimport {\r\n inject,\r\n Injectable,\r\n Type,\r\n} from '@angular/core';\r\nimport { Dialog } from '@angular/cdk/dialog';\r\nimport { Overlay } from '@angular/cdk/overlay';\r\nimport { filter } from 'rxjs';\r\n\r\nimport { DialogConfig, DEFAULT_DIALOG_CONFIG } from './dialog-config';\r\nimport { DialogRef } from './dialog-ref';\r\nimport { DialogContainerComponent } from './dialog-container';\r\nimport { DIALOG_GLOBAL_CONFIG, INTERNAL_DIALOG_CONFIG } from './dialog.tokens';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DialogService {\r\n private readonly _cdkDialog = inject(Dialog);\r\n private readonly _overlay = inject(Overlay);\r\n private readonly _globalConfig: DialogConfig | null =\r\n inject(DIALOG_GLOBAL_CONFIG, { optional: true });\r\n\r\n /** Stack of currently open dialog refs (most recent = last). */\r\n private readonly _openDialogRefs: DialogRef<any, any>[] = [];\r\n\r\n // ════════════════════════════════════════════════════════════════════\r\n // Public API\r\n // ════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Open a dialog containing the given component.\r\n *\r\n * @param component The component class to render inside the dialog.\r\n * @param config Optional per-dialog configuration (merged on top\r\n * of global and default settings).\r\n * @returns A strongly-typed `DialogRef` to interact with.\r\n *\r\n * @example\r\n * ```ts\r\n * const ref = this.dialog.open(UserFormComponent, {\r\n * width: '500px',\r\n * data: { userId: 10 },\r\n * });\r\n * ref.afterClosed().subscribe(result => console.log(result));\r\n * ```\r\n */\r\n open<T, D = unknown, R = unknown>(\r\n component: Type<T>,\r\n config?: DialogConfig<D>,\r\n ): DialogRef<T, R> {\r\n // ── 1. Merge configs: DEFAULT ← GLOBAL ← per-call ──────────────\r\n const mergedConfig = {\r\n ...DEFAULT_DIALOG_CONFIG,\r\n ...(this._globalConfig ?? {}),\r\n ...(config ?? {}),\r\n } as DialogConfig<D>;\r\n\r\n // ── 2. Prepare the return ref (set inside providers callback) ───\r\n let ourRef!: DialogRef<T, R>;\r\n\r\n // ── 3. Build CDK-native config ──────────────────────────────────\r\n const cdkConfig = {\r\n // Identity\r\n id: mergedConfig.id,\r\n\r\n // Sizing (applied on .cdk-overlay-pane)\r\n width: mergedConfig.width,\r\n height: mergedConfig.height,\r\n minWidth: mergedConfig.minWidth,\r\n minHeight: mergedConfig.minHeight,\r\n maxWidth: mergedConfig.maxWidth ?? '90vw',\r\n maxHeight: mergedConfig.maxHeight ?? '90vh',\r\n\r\n // Backdrop\r\n hasBackdrop: mergedConfig.hasBackdrop !== false,\r\n backdropClass: mergedConfig.backdropClass || 'cdk-overlay-dark-backdrop',\r\n\r\n // Panel class (always include our base class)\r\n panelClass: this._buildPanelClasses(mergedConfig),\r\n\r\n // Data (CDK provides this as DIALOG_DATA automatically)\r\n data: mergedConfig.data,\r\n\r\n // We manage close ourselves for fine-grained closeOnBackdrop / closeOnEsc.\r\n disableClose: true,\r\n\r\n // Accessibility\r\n autoFocus: mergedConfig.autoFocus ?? true,\r\n restoreFocus: mergedConfig.restoreFocus ?? true,\r\n role: mergedConfig.role ?? 'dialog',\r\n ariaLabel: mergedConfig.ariaLabel ?? null,\r\n ariaLabelledBy: mergedConfig.ariaLabelledBy ?? null,\r\n ariaDescribedBy: mergedConfig.ariaDescribedBy ?? null,\r\n\r\n // Scroll strategy\r\n scrollStrategy:\r\n mergedConfig.scrollStrategy ??\r\n (mergedConfig.lockScroll !== false\r\n ? this._overlay.scrollStrategies.block()\r\n : this._overlay.scrollStrategies.noop()),\r\n\r\n // Position strategy (centered by default, shifted by offsets)\r\n positionStrategy: this._buildPositionStrategy(mergedConfig),\r\n\r\n // ── Custom container ──────────────────────────────────────────\r\n container: {\r\n type: DialogContainerComponent,\r\n providers: () => [\r\n { provide: INTERNAL_DIALOG_CONFIG, useValue: mergedConfig },\r\n ],\r\n },\r\n\r\n // ── Provider callback ─────────────────────────────────────────\r\n // Runs after the container is created but before the user\r\n // component. We create our `DialogRef` wrapper here and make\r\n // it available for injection in the user component.\r\n providers: (\r\n cdkRef: any,\r\n _cdkConfig: any,\r\n containerInstance: any,\r\n ) => {\r\n ourRef = new DialogRef<T, R>(cdkRef);\r\n ourRef._containerInstance = containerInstance as DialogContainerComponent;\r\n\r\n // Wire up afterOpened emission.\r\n (containerInstance as DialogContainerComponent).opened\r\n .then(() => ourRef._emitOpened());\r\n\r\n return [\r\n { provide: DialogRef, useValue: ourRef },\r\n ];\r\n },\r\n };\r\n\r\n // ── 4. Open via CDK ─────────────────────────────────────────────\r\n const cdkRef = this._cdkDialog.open(component, cdkConfig as any);\r\n\r\n // ── 5. Link componentInstance ───────────────────────────────────\r\n ourRef.componentInstance = cdkRef.componentInstance as T;\r\n\r\n // ── 6. Set up close-on-backdrop / close-on-ESC ──────────────────\r\n this._setupCloseListeners(ourRef, mergedConfig);\r\n\r\n // ── 7. Track in stack ───────────────────────────────────────────\r\n this._openDialogRefs.push(ourRef);\r\n\r\n // ── 8. Cleanup on close ─────────────────────────────────────────\r\n ourRef.afterClosed().subscribe(() => {\r\n const idx = this._openDialogRefs.indexOf(ourRef);\r\n if (idx !== -1) this._openDialogRefs.splice(idx, 1);\r\n });\r\n\r\n return ourRef;\r\n }\r\n\r\n /**\r\n * Close all currently open dialogs (most recent first).\r\n */\r\n closeAll(): void {\r\n for (let i = this._openDialogRefs.length - 1; i >= 0; i--) {\r\n this._openDialogRefs[i]!.close();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the `DialogRef` of the most recently opened dialog,\r\n * or `undefined` if none are open.\r\n */\r\n getTopDialog(): DialogRef | undefined {\r\n return this._openDialogRefs[this._openDialogRefs.length - 1];\r\n }\r\n\r\n /**\r\n * Get a dialog by its CDK-managed unique ID.\r\n */\r\n getDialogById(id: string): DialogRef | undefined {\r\n return this._openDialogRefs.find(r => r.id === id);\r\n }\r\n\r\n /**\r\n * Number of currently open dialogs.\r\n */\r\n get openDialogCount(): number {\r\n return this._openDialogRefs.length;\r\n }\r\n\r\n /**\r\n * Read-only snapshot of currently open dialog refs.\r\n * Used internally by content directives (`BkDialogTitle`, `BkDialogActions`,\r\n * `BkDialogClose`) for the DOM-walk fallback when `DialogRef` is not\r\n * available via injection (e.g. inside `<ng-template>`).\r\n */\r\n get openDialogsRef(): readonly DialogRef[] {\r\n return this._openDialogRefs;\r\n }\r\n\r\n // ════════════════════════════════════════════════════════════════════\r\n // Convenience Helpers\r\n // ════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Open a simple confirmation dialog.\r\n * Resolves `true` if the user confirms, `false` otherwise.\r\n *\r\n * @example\r\n * ```ts\r\n * const ref = this.dialog.confirm({\r\n * message: 'Delete this item?',\r\n * component: ConfirmDialogComponent,\r\n * });\r\n * ref.afterClosed().subscribe(yes => { if (yes) ... });\r\n * ```\r\n */\r\n confirm(options: {\r\n title?: string;\r\n message: string;\r\n btnOkText?: string;\r\n btnCancelText?: string;\r\n width?: string;\r\n component: Type<unknown>;\r\n }): DialogRef<unknown, boolean> {\r\n return this.open<unknown, unknown, boolean>(options.component, {\r\n width: options.width ?? '400px',\r\n disableClose: true,\r\n closeOnBackdrop: false,\r\n animation: 'fade',\r\n data: {\r\n title: options.title ?? 'Confirm',\r\n message: options.message,\r\n btnOkText: options.btnOkText ?? 'Yes',\r\n btnCancelText: options.btnCancelText ?? 'No',\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Open a simple alert dialog.\r\n */\r\n alert(options: {\r\n title?: string;\r\n message: string;\r\n btnOkText?: string;\r\n width?: string;\r\n component: Type<unknown>;\r\n }): DialogRef<unknown, void> {\r\n return this.open<unknown, unknown, void>(options.component, {\r\n width: options.width ?? '400px',\r\n disableClose: true,\r\n closeOnBackdrop: false,\r\n animation: 'fade',\r\n data: {\r\n title: options.title ?? 'Alert',\r\n message: options.message,\r\n btnOkText: options.btnOkText ?? 'OK',\r\n },\r\n });\r\n }\r\n\r\n // ════════════════════════════════════════════════════════════════════\r\n // Private\r\n // ════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Subscribe to backdrop-click and ESC events on the CDK ref,\r\n * closing the dialog based on our config flags.\r\n *\r\n * We always set CDK `disableClose: true` so that CDK never auto-closes;\r\n * this gives us fine-grained control over `closeOnBackdrop` and\r\n * `closeOnEsc` independently.\r\n */\r\n private _setupCloseListeners(ref: DialogRef, config: DialogConfig): void {\r\n if (config.disableClose) return;\r\n\r\n // Backdrop click\r\n if (config.closeOnBackdrop !== false) {\r\n ref.backdropClick().subscribe(() => ref.close());\r\n }\r\n\r\n // ESC key\r\n if (config.closeOnEsc !== false) {\r\n ref.keydownEvents()\r\n .pipe(filter((e: KeyboardEvent) => e.key === 'Escape' || e.key === 'Esc'))\r\n .subscribe((e: KeyboardEvent) => {\r\n e.preventDefault();\r\n ref.close();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Build the CSS classes for the CDK overlay pane.\r\n * Always includes our base class; adds user-provided classes on top.\r\n */\r\n private _buildPanelClasses(config: DialogConfig): string[] {\r\n const classes = ['bk-dialog-pane'];\r\n if (config.panelClass) {\r\n if (Array.isArray(config.panelClass)) {\r\n classes.push(...config.panelClass);\r\n } else {\r\n classes.push(config.panelClass);\r\n }\r\n }\r\n return classes;\r\n }\r\n\r\n /**\r\n * Build CDK's `GlobalPositionStrategy` from our position config.\r\n * Falls back to centred (both axes) when no position is specified.\r\n */\r\n private _buildPositionStrategy(config: DialogConfig) {\r\n const strategy = this._overlay.position().global();\r\n\r\n if (config.position?.top) {\r\n strategy.top(config.position.top);\r\n } else if (config.position?.bottom) {\r\n strategy.bottom(config.position.bottom);\r\n } else {\r\n strategy.centerVertically();\r\n }\r\n\r\n if (config.position?.left) {\r\n strategy.left(config.position.left);\r\n } else if (config.position?.right) {\r\n strategy.right(config.position.right);\r\n } else {\r\n strategy.centerHorizontally();\r\n }\r\n\r\n return strategy;\r\n }\r\n}\r\n","/**\r\n * Dialog Content Directives\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * These directives mirror Angular Material's dialog content directives:\r\n *\r\n * MatDialogTitle → BkDialogTitle\r\n * MatDialogContent → BkDialogContent\r\n * MatDialogActions → BkDialogActions\r\n * MatDialogClose → BkDialogClose\r\n *\r\n * Each directive:\r\n * 1. Applies the corresponding CSS host class (e.g. `bk-dialog-content`)\r\n * that is styled in `dialog-container.css` via `::ng-deep`.\r\n * 2. Provides extra accessibility or behavioural features on top of the\r\n * plain CSS class.\r\n *\r\n * Consumers can still use the raw CSS classes directly (without importing\r\n * these directives) for backward compatibility, but the directives are\r\n * preferred because they add CdkScrollable, ARIA integration, and one-click\r\n * close behaviour.\r\n *\r\n * @see https://github.com/angular/components/blob/main/src/material/dialog/dialog-content-directives.ts\r\n */\r\n\r\nimport {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CdkScrollable } from '@angular/cdk/scrolling';\r\n\r\nimport { DialogRef } from './dialog-ref';\r\nimport { DialogService } from './dialog.service';\r\n\r\n// ──── ID Generation ──────────────────────────────────────────────────────\r\n\r\nlet nextTitleId = 0;\r\n\r\n// ──── Helper ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Finds the closest `DialogRef` by walking up the DOM from the given\r\n * element to the nearest `bk-dialog-container` host, then matching its\r\n * `id` attribute against the currently open dialogs.\r\n *\r\n * This fallback is necessary when a directive lives inside an\r\n * `<ng-template>` (TemplateRef), where the dialog's custom injector is\r\n * not available.\r\n *\r\n * @see Material's `getClosestDialog` in `dialog-content-directives.ts`\r\n */\r\nfunction getClosestDialog(\r\n element: ElementRef<HTMLElement>,\r\n openDialogs: readonly DialogRef[],\r\n): DialogRef | null {\r\n let parent = element.nativeElement.parentElement;\r\n while (parent && !parent.classList.contains('bk-dialog-container')) {\r\n parent = parent.parentElement;\r\n }\r\n return parent\r\n ? openDialogs.find(ref => ref.id === parent!.id) ?? null\r\n : null;\r\n}\r\n\r\n// ──── Base for Title / Actions ───────────────────────────────────────────\r\n\r\n/**\r\n * Shared abstract base that resolves the owning `DialogRef` (via DI or\r\n * DOM walk) and invokes `_onAdd()` / `_onRemove()` lifecycle hooks.\r\n *\r\n * Same pattern as Material's internal `MatDialogLayoutSection`.\r\n */\r\n@Directive({ standalone: true })\r\nabstract class BkDialogLayoutSection implements OnInit, OnDestroy {\r\n protected _dialogRef: DialogRef | null = inject(DialogRef, { optional: true });\r\n protected _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(DialogService);\r\n\r\n ngOnInit(): void {\r\n if (!this._dialogRef) {\r\n this._dialogRef = getClosestDialog(\r\n this._elementRef,\r\n this._dialogService.openDialogsRef,\r\n );\r\n }\r\n if (this._dialogRef) {\r\n Promise.resolve().then(() => this._onAdd());\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this._dialogRef) {\r\n Promise.resolve().then(() => this._onRemove());\r\n }\r\n }\r\n\r\n protected abstract _onAdd(): void;\r\n protected abstract _onRemove(): void;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogTitle\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Marks an element as the dialog title.\r\n *\r\n * • Generates a unique `id` and binds it to the host element.\r\n * • Registers the `id` with the CDK container's `aria-labelledby` queue\r\n * so screen readers announce the dialog title automatically.\r\n *\r\n * Usage:\r\n * ```html\r\n * <h2 bk-dialog-title>Edit User</h2>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-title], [bkDialogTitle]',\r\n standalone: true,\r\n exportAs: 'bkDialogTitle',\r\n host: {\r\n 'class': 'bk-dialog-title',\r\n '[id]': 'id',\r\n },\r\n})\r\nexport class BkDialogTitle extends BkDialogLayoutSection {\r\n /** Unique element `id`. Auto-generated but can be overridden. */\r\n @Input() id: string = `bk-dialog-title-${nextTitleId++}`;\r\n\r\n protected _onAdd(): void {\r\n // Register with the CdkDialogContainer's aria-labelledby queue.\r\n // _containerInstance extends CdkDialogContainer which has _addAriaLabelledBy.\r\n (this._dialogRef as any)?._containerInstance?._addAriaLabelledBy?.(this.id);\r\n }\r\n\r\n protected _onRemove(): void {\r\n (this._dialogRef as any)?._containerInstance?._removeAriaLabelledBy?.(this.id);\r\n }\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogContent\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Scrollable content area of a dialog.\r\n *\r\n * • Applies the `bk-dialog-content` CSS class → `flex: 1 1 auto; overflow: auto`.\r\n * • Composes CDK's `CdkScrollable` for scroll-position monitoring and\r\n * integration with CDK's scroll dispatcher.\r\n *\r\n * Usage (attribute):\r\n * ```html\r\n * <div bk-dialog-content>\r\n * <!-- body content — this area scrolls -->\r\n * </div>\r\n * ```\r\n *\r\n * Usage (element):\r\n * ```html\r\n * <bk-dialog-content>...</bk-dialog-content>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-content], bk-dialog-content, [bkDialogContent]',\r\n standalone: true,\r\n exportAs: 'bkDialogContent',\r\n host: {\r\n 'class': 'bk-dialog-content',\r\n },\r\n hostDirectives: [CdkScrollable],\r\n})\r\nexport class BkDialogContent {}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogActions\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Container for action buttons at the bottom of a dialog.\r\n * Stays pinned when the content area scrolls.\r\n *\r\n * • Applies `bk-dialog-actions` class → `flex: 0 0 auto` (never shrinks).\r\n * • Optional `align` input controls horizontal alignment.\r\n *\r\n * Usage:\r\n * ```html\r\n * <div bk-dialog-actions>\r\n * <button (click)=\"cancel()\">Cancel</button>\r\n * <button (click)=\"save()\">Save</button>\r\n * </div>\r\n *\r\n * <!-- With alignment -->\r\n * <div bk-dialog-actions align=\"center\">...</div>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-actions], bk-dialog-actions, [bkDialogActions]',\r\n standalone: true,\r\n exportAs: 'bkDialogActions',\r\n host: {\r\n 'class': 'bk-dialog-actions',\r\n '[class.bk-dialog-actions-align-start]': 'align === \"start\"',\r\n '[class.bk-dialog-actions-align-center]': 'align === \"center\"',\r\n '[class.bk-dialog-actions-align-end]': 'align === \"end\"',\r\n },\r\n})\r\nexport class BkDialogActions extends BkDialogLayoutSection {\r\n /** Horizontal alignment of action buttons. */\r\n @Input() align?: 'start' | 'center' | 'end';\r\n\r\n protected _onAdd(): void {\r\n // Future: notify container for action section count (like Material).\r\n }\r\n\r\n protected _onRemove(): void {\r\n // No-op.\r\n }\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogClose\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Closes the dialog when the host element is clicked.\r\n * Optionally returns a result value to the opener.\r\n *\r\n * • Sets `type=\"button\"` by default to prevent accidental form submissions.\r\n * • Supports an optional `aria-label` for screen readers.\r\n *\r\n * Usage:\r\n * ```html\r\n * <!-- Close with no result -->\r\n * <button bk-dialog-close>Cancel</button>\r\n *\r\n * <!-- Close with a result value -->\r\n * <button [bk-dialog-close]=\"'confirmed'\">OK</button>\r\n *\r\n * <!-- Alternative camelCase binding -->\r\n * <button [bkDialogClose]=\"myResult\">Done</button>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-close], [bkDialogClose]',\r\n standalone: true,\r\n exportAs: 'bkDialogClose',\r\n host: {\r\n '(click)': '_onButtonClick($event)',\r\n '[attr.aria-label]': 'ariaLabel || null',\r\n '[attr.type]': 'type',\r\n },\r\n})\r\nexport class BkDialogClose implements OnInit, OnChanges {\r\n private _dialogRef: DialogRef | null = inject(DialogRef, { optional: true });\r\n private _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(DialogService);\r\n\r\n /** Screen-reader label for the button. */\r\n @Input('aria-label') ariaLabel?: string;\r\n\r\n /** Prevents accidental form submits. Default: `'button'`. */\r\n @Input() type: 'submit' | 'button' | 'reset' = 'button';\r\n\r\n /** Dialog result — set via `[bk-dialog-close]=\"value\"`. */\r\n @Input('bk-dialog-close') dialogResult: any;\r\n\r\n /** Alternative camelCase binding: `[bkDialogClose]=\"value\"`. */\r\n @Input('bkDialogClose') _bkDialogClose: any;\r\n\r\n ngOnInit(): void {\r\n if (!this._dialogRef) {\r\n this._dialogRef = getClosestDialog(\r\n this._elementRef,\r\n this._dialogService.openDialogsRef,\r\n );\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const proxiedChange = changes['_bkDialogClose'] || changes['dialogResult'];\r\n if (proxiedChange) {\r\n this.dialogResult = proxiedChange.currentValue;\r\n }\r\n }\r\n\r\n _onButtonClick(_event: MouseEvent): void {\r\n this._dialogRef?.close(this.dialogResult);\r\n }\r\n}\r\n","/**\r\n * BkDialogModule\r\n *\r\n * Optional NgModule wrapper for projects that prefer module-based usage.\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Follows the exact same pattern as Angular Material's `MatDialogModule`\r\n * and `@brickclay-org/ui`'s `CalendarModule`:\r\n *\r\n * • All components/directives are **standalone**.\r\n * • This module simply imports + re-exports them for convenience.\r\n * • `DialogService` is `providedIn: 'root'`, so it does NOT need to\r\n * be listed in `providers` here — it is tree-shakeable and available\r\n * app-wide automatically.\r\n *\r\n * Two usage styles:\r\n *\r\n * ───────── Module-based (NgModule) ─────────\r\n * ```ts\r\n * import { BkDialogModule } from '@shared/components/dialog';\r\n *\r\n * @NgModule({ imports: [BkDialogModule] })\r\n * export class FuelCostModule {}\r\n * ```\r\n *\r\n * ───────── Standalone ──────────────────────\r\n * ```ts\r\n * @Component({\r\n * standalone: true,\r\n * imports: [BkDialogContent, BkDialogActions, BkDialogClose],\r\n * })\r\n * export class MyDialog {}\r\n * ```\r\n *\r\n * @see https://github.com/angular/components/blob/main/src/material/dialog/dialog-module.ts\r\n */\r\n\r\nimport { NgModule } from '@angular/core';\r\nimport { DialogModule as CdkDialogModule } from '@angular/cdk/dialog';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\n\r\nimport { DialogContainerComponent } from './dialog-container';\r\nimport {\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n} from './dialog-content-directives';\r\n\r\n@NgModule({\r\n imports: [\r\n // ── CDK foundations ──────────────────────────────────────────────\r\n CdkDialogModule,\r\n OverlayModule,\r\n PortalModule,\r\n\r\n // ── Our standalone pieces ───────────────────────────────────────\r\n DialogContainerComponent,\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n ],\r\n exports: [\r\n // ── Public API for template usage ───────────────────────────────\r\n // Consumers import BkDialogModule and get these directives in\r\n // their templates automatically — just like MatDialogModule.\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n ],\r\n})\r\nexport class BkDialogModule {}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { NgModel } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-validator',\r\n imports: [],\r\n templateUrl: './validator.html',\r\n})\r\nexport class BkValidator implements OnInit {\r\n @Input() control!: NgModel;\r\n @Input() label!: string;\r\n @Input() errorMessage: string='';\r\n @Input() showError:boolean= false;\r\n\r\n\r\n\r\n constructor() {\r\n\r\n\r\n }\r\n ngOnInit(): void {\r\n\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n","<span class=\"text-left font-medium text-xs leading-normal text-[#C10007] mt-0.5 h-[1px] block\">\r\n @if (control && control.invalid && (control.dirty || control.touched)) {\r\n @if (control.errors?.['required']) {\r\n <span>\r\n {{ label }} is required.\r\n </span>\r\n }\r\n @else if (control.errors?.['minlength']) {\r\n <span>\r\n {{ label }} must be at least\r\n {{ control.errors?.['minlength']?.requiredLength }} characters long.\r\n </span>\r\n }\r\n @else if (control.errors?.['maxlength']) {\r\n <span>\r\n {{ label }} cannot exceed\r\n {{ control.errors?.['maxlength']?.requiredLength }} characters.\r\n </span>\r\n }\r\n @else if (control.errors?.['pattern']) {\r\n <span>\r\n {{ label }} contains invalid characters.\r\n </span>\r\n } @else if (control.errors?.['min']) {\r\n <span>\r\n {{ label }} must be at least {{ control.errors?.['min'].min }}.\r\n </span>\r\n } @else if (control.errors?.['max']) {\r\n <span>\r\n {{ label }} cannot be greater than {{ control.errors?.['max'].max }}.\r\n </span>\r\n }\r\n\r\n } @else if (showError) {\r\n <span>\r\n {{ errorMessage }}\r\n </span>\r\n }\r\n</span>\r\n","/*\r\n * Public API Surface of brickclay-lib\r\n */\r\n\r\n//Icons\r\nexport * from './lib/assets/icons'\r\n//Library\r\nexport * from './lib/brickclay-lib';\r\n//Calender\r\nexport * from './lib/calender/components/custom-calendar/custom-calendar.component';\r\nexport * from './lib/calender/components/scheduled-date-picker/scheduled-date-picker.component';\r\nexport * from './lib/calender/components/time-picker/time-picker.component';\r\nexport * from './lib/calender/calendar.module';\r\nexport * from './lib/calender/services/calendar-manager.service';\r\n//Toggle\r\nexport * from './lib/toggle/toggle';\r\n//CheckBox\r\nexport * from './lib/checkbox/checkbox';\r\n//Radio-Button\r\nexport * from './lib/radio/radio'\r\n//Pill\r\nexport * from './lib/pill/pill'\r\n//Badge\r\nexport * from './lib/badge/badge'\r\n//Spinner\r\nexport * from './lib/spinner/spinner'\r\n//Button\r\nexport * from './lib/ui-button/ui-button'\r\nexport * from './lib/ui-icon-button/ui-icon-button'\r\nexport * from './lib/button-group/button-group'\r\n//Text-Area\r\nexport * from './lib/textarea/textarea'\r\n//Table\r\nexport * from './lib/grid/components/grid/grid';\r\nexport * from './lib/grid/models/grid.model';\r\n//Single Select\r\nexport * from './lib/select/select';\r\n//Input\r\nexport * from './lib/input/input';\r\n//Input-Chips\r\nexport * from './lib/input-chips/input-chips';\r\n//Tabs\r\nexport * from './lib/tabs/tabs';\r\n\r\n//Dialog system\r\nexport { BkDialogModule } from './lib/dialog/dialog.module';\r\nexport { DialogService } from './lib/dialog/dialog.service';\r\nexport { DialogRef } from './lib/dialog/dialog-ref';\r\nexport { DIALOG_DATA, DIALOG_GLOBAL_CONFIG } from './lib/dialog/dialog.tokens';\r\nexport type { DialogConfig, DialogPosition, DialogAnimation } from './lib/dialog/dialog-config';\r\nexport { DEFAULT_DIALOG_CONFIG } from './lib/dialog/dialog-config';\r\nexport {\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n} from './lib/dialog/dialog-content-directives';\r\nexport type { AnimationKeyframes } from './lib/dialog/dialog-animations';\r\nexport { getDialogPanelAnimation, getDialogBackdropAnimation } from './lib/dialog/dialog-animations';\r\n\r\n//Tooltip\r\nexport * from './lib/tooltip/tooltip.directive';\r\n\r\n//Validator\r\nexport * from './lib/validator/validator';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CalendarManagerService","i2","i1","CDK_DIALOG_DATA","CdkDialogModule"],"mappings":"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"}
1
+ {"version":3,"file":"brickclay-org-ui.mjs","sources":["../../../projects/brickclay-lib/src/lib/assets/icons.ts","../../../projects/brickclay-lib/src/lib/brickclay-lib.ts","../../../projects/brickclay-lib/src/lib/calender/components/time-picker/time-picker.component.ts","../../../projects/brickclay-lib/src/lib/calender/components/time-picker/time-picker.component.html","../../../projects/brickclay-lib/src/lib/calender/services/calendar-manager.service.ts","../../../projects/brickclay-lib/src/lib/calender/components/custom-calendar/custom-calendar.component.ts","../../../projects/brickclay-lib/src/lib/calender/components/custom-calendar/custom-calendar.component.html","../../../projects/brickclay-lib/src/lib/calender/components/scheduled-date-picker/scheduled-date-picker.component.ts","../../../projects/brickclay-lib/src/lib/calender/components/scheduled-date-picker/scheduled-date-picker.component.html","../../../projects/brickclay-lib/src/lib/calender/calendar.module.ts","../../../projects/brickclay-lib/src/lib/toggle/toggle.ts","../../../projects/brickclay-lib/src/lib/toggle/toggle.html","../../../projects/brickclay-lib/src/lib/checkbox/checkbox.ts","../../../projects/brickclay-lib/src/lib/checkbox/checkbox.html","../../../projects/brickclay-lib/src/lib/radio/radio.ts","../../../projects/brickclay-lib/src/lib/radio/radio.html","../../../projects/brickclay-lib/src/lib/pill/pill.ts","../../../projects/brickclay-lib/src/lib/pill/pill.html","../../../projects/brickclay-lib/src/lib/badge/badge.ts","../../../projects/brickclay-lib/src/lib/badge/badge.html","../../../projects/brickclay-lib/src/lib/spinner/spinner.ts","../../../projects/brickclay-lib/src/lib/spinner/spinner.html","../../../projects/brickclay-lib/src/lib/ui-button/ui-button.ts","../../../projects/brickclay-lib/src/lib/ui-button/ui-button.html","../../../projects/brickclay-lib/src/lib/ui-icon-button/ui-icon-button.ts","../../../projects/brickclay-lib/src/lib/ui-icon-button/ui-icon-button.html","../../../projects/brickclay-lib/src/lib/button-group/button-group.ts","../../../projects/brickclay-lib/src/lib/button-group/button-group.html","../../../projects/brickclay-lib/src/lib/textarea/textarea.ts","../../../projects/brickclay-lib/src/lib/textarea/textarea.html","../../../projects/brickclay-lib/src/lib/tooltip/tooltip.directive.ts","../../../projects/brickclay-lib/src/lib/grid/components/grid/grid.ts","../../../projects/brickclay-lib/src/lib/grid/components/grid/grid.html","../../../projects/brickclay-lib/src/lib/select/select.ts","../../../projects/brickclay-lib/src/lib/select/select.html","../../../projects/brickclay-lib/src/lib/input/input.ts","../../../projects/brickclay-lib/src/lib/input/input.html","../../../projects/brickclay-lib/src/lib/input-chips/input-chips.ts","../../../projects/brickclay-lib/src/lib/input-chips/input-chips.html","../../../projects/brickclay-lib/src/lib/tabs/tabs.ts","../../../projects/brickclay-lib/src/lib/tabs/tabs.html","../../../projects/brickclay-lib/src/lib/dialog/dialog.tokens.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-animations.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-container.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-container.html","../../../projects/brickclay-lib/src/lib/dialog/dialog-ref.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-config.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog.service.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog-content-directives.ts","../../../projects/brickclay-lib/src/lib/dialog/dialog.module.ts","../../../projects/brickclay-lib/src/lib/validator/validator.ts","../../../projects/brickclay-lib/src/lib/validator/validator.html","../../../projects/brickclay-lib/src/public-api.ts","../../../projects/brickclay-lib/src/brickclay-org-ui.ts"],"sourcesContent":["// Icon paths that will be resolved relative to the library's assets folder\r\n// When published to npm, users will need to configure their angular.json to include these assets\r\nexport const BrickclayIcons = {\r\n arrowleft: 'assets/icons/chevron-left.svg',\r\n arrowRight: 'assets/icons/chevron-right.svg',\r\n calenderIcon: 'assets/icons/calender.svg',\r\n timerIcon: 'assets/icons/timer.svg',\r\n} as const;\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-brickclay-lib',\r\n imports: [],\r\n template: `\r\n <p>\r\n brickclay-lib works!\r\n </p>\r\n `,\r\n styles: ``,\r\n})\r\nexport class BrickclayLib {\r\n\r\n}\r\n","import { BrickclayIcons } from '../../../assets/icons';\r\nimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, AfterViewInit, QueryList, ViewChildren, ElementRef, HostListener, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'bk-time-picker',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './time-picker.component.html',\r\n styleUrls: ['./time-picker.component.css']\r\n})\r\nexport class BkTimePicker implements OnInit, OnChanges, AfterViewInit {\r\n @Input() value: string = '1:00 AM'; // Time in format \"H:MM AM/PM\"\r\n @Input() label: string = 'Time';\r\n @Input() placeholder: string = 'Select time';\r\n @Input() position: 'left' | 'right' = 'left';\r\n @Input() pickerId: string = ''; // Unique ID for this picker\r\n @Input() closePicker: number = 0; // Close counter from parent (triggers close when changed)\r\n @Input() timeFormat: 12 | 24 = 12; // Visual mode: 12h or 24h\r\n @Input() showSeconds = false; // Whether to show/edit seconds\r\n @Output() timeChange = new EventEmitter<string>();\r\n @Output() pickerOpened = new EventEmitter<string>(); // Notify parent when opened\r\n @Output() pickerClosed = new EventEmitter<string>(); // Notify parent when closed\r\n\r\n @ViewChildren('timeScroll') timeScrollElements!: QueryList<ElementRef>;\r\n\r\n showPicker = false;\r\n currentHour = 1;\r\n currentMinute = 0;\r\n currentAMPM = 'AM';\r\n currentSecond = 0;\r\n\r\n brickclayIcons=BrickclayIcons;\r\n\r\n ngOnInit() {\r\n this.parseTimeValue();\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.showPicker) {\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 100);\r\n }\r\n }\r\n\r\n parseTimeValue() {\r\n const parsed = this.parseTimeStringToComponents(this.value);\r\n this.currentHour = parsed.hour;\r\n this.currentMinute = parsed.minute;\r\n this.currentSecond = parsed.second;\r\n this.currentAMPM = parsed.ampm;\r\n }\r\n\r\n getHours(): number[] {\r\n // 12-hour: 1-12, 24-hour: 0-23\r\n if (this.timeFormat === 24) {\r\n return Array.from({ length: 24 }, (_, i) => i);\r\n }\r\n return Array.from({ length: 12 }, (_, i) => i + 1);\r\n }\r\n\r\n getMinutes(): number[] {\r\n return Array.from({ length: 60 }, (_, i) => i);\r\n }\r\n\r\n getSeconds(): number[] {\r\n return Array.from({ length: 60 }, (_, i) => i);\r\n }\r\n\r\n getAMPMOptions(): string[] {\r\n return ['AM', 'PM'];\r\n }\r\n\r\n parseTimeStringToComponents(timeStr: string): { hour: number; minute: number; second: number; ampm: string } {\r\n // Supports:\r\n // - \"H:MM AM/PM\"\r\n // - \"H:MM:SS AM/PM\"\r\n // - \"HH:MM\" (24h)\r\n // - \"HH:MM:SS\" (24h)\r\n if (!timeStr) {\r\n return {\r\n hour: this.timeFormat === 24 ? 0 : 12,\r\n minute: 0,\r\n second: 0,\r\n ampm: this.timeFormat === 24 ? '' : 'AM'\r\n };\r\n }\r\n\r\n const parts = timeStr.trim().split(' ');\r\n const timePart = parts[0] || (this.timeFormat === 24 ? '00:00' : '12:00');\r\n let ampm = (parts[1] || '').toUpperCase();\r\n\r\n const [hoursStr, minutesStr, secondsStr] = timePart.split(':');\r\n let hour = parseInt(hoursStr || (this.timeFormat === 24 ? '0' : '12'), 10);\r\n const minute = parseInt(minutesStr || '0', 10);\r\n const second = parseInt(secondsStr || '0', 10);\r\n\r\n if (this.timeFormat === 24) {\r\n // In 24-hour mode we ignore AM/PM and keep hour as 0-23\r\n return {\r\n hour: isNaN(hour) ? 0 : Math.min(Math.max(hour, 0), 23),\r\n minute: isNaN(minute) ? 0 : Math.min(Math.max(minute, 0), 59),\r\n second: isNaN(second) ? 0 : Math.min(Math.max(second, 0), 59),\r\n ampm: ''\r\n };\r\n }\r\n\r\n // 12-hour mode: normalize AM/PM and convert 24h inputs if needed\r\n let ampmValue = ampm === 'PM' || ampm === 'AM' ? ampm : '';\r\n if (!ampmValue) {\r\n // No AM/PM provided -> interpret as 24-hour and convert to 12-hour with AM/PM\r\n if (hour >= 12) {\r\n ampmValue = 'PM';\r\n if (hour > 12) hour -= 12;\r\n } else {\r\n ampmValue = 'AM';\r\n if (hour === 0) hour = 12;\r\n }\r\n }\r\n\r\n // Clamp to 1-12 range\r\n if (hour < 1) hour = 1;\r\n if (hour > 12) hour = 12;\r\n\r\n return {\r\n hour,\r\n minute: isNaN(minute) ? 0 : Math.min(Math.max(minute, 0), 59),\r\n second: isNaN(second) ? 0 : Math.min(Math.max(second, 0), 59),\r\n ampm: ampmValue\r\n };\r\n }\r\n\r\n formatTimeFromComponents(hour: number, minute: number, second: number, ampm: string): string {\r\n const hStr = hour.toString().padStart(2, '0');\r\n const minuteStr = minute.toString().padStart(2, '0');\r\n const secondStr = second.toString().padStart(2, '0');\r\n\r\n if (this.timeFormat === 24) {\r\n // \"HH:mm\" or \"HH:mm:ss\"\r\n return this.showSeconds\r\n ? `${hStr}:${minuteStr}:${secondStr}`\r\n : `${hStr}:${minuteStr}`;\r\n }\r\n\r\n // 12-hour: \"H:MM\" or \"H:MM:SS\" with AM/PM\r\n const displayHour = hour; // already 1-12\r\n return this.showSeconds\r\n ? `${displayHour}:${minuteStr}:${secondStr} ${ampm}`\r\n : `${displayHour}:${minuteStr} ${ampm}`;\r\n }\r\n\r\n togglePicker() {\r\n if (!this.showPicker) {\r\n this.showPicker = true;\r\n this.parseTimeValue();\r\n this.pickerOpened.emit(this.pickerId);\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 100);\r\n } else {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n }\r\n }\r\n\r\n onHourChange(hour: number) {\r\n this.currentHour = hour;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n onMinuteChange(minute: number) {\r\n this.currentMinute = minute;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n onSecondChange(second: number) {\r\n this.currentSecond = second;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n onAMPMChange(ampm: string) {\r\n this.currentAMPM = ampm;\r\n this.updateTime();\r\n setTimeout(() => {\r\n this.scrollToSelectedTimes();\r\n }, 50);\r\n }\r\n\r\n updateTime() {\r\n const newTime = this.formatTimeFromComponents(\r\n this.currentHour,\r\n this.currentMinute,\r\n this.currentSecond,\r\n this.currentAMPM\r\n );\r\n this.value = newTime;\r\n this.timeChange.emit(newTime);\r\n }\r\n\r\n scrollToSelectedTimes() {\r\n this.timeScrollElements.forEach((elementRef) => {\r\n const element = elementRef.nativeElement;\r\n const selectedItem = element.querySelector('.time-item.selected');\r\n if (selectedItem) {\r\n const scrollTop = selectedItem.offsetTop - element.offsetHeight / 40 + selectedItem.offsetHeight / 40;\r\n element.scrollTop = scrollTop;\r\n }\r\n });\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n if (!target.closest('.time-picker-wrapper') && this.showPicker) {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n }\r\n }\r\n\r\n private previousCloseCounter: number = 0;\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['value'] && changes['value'].currentValue) {\r\n this.parseTimeValue();\r\n }\r\n if (changes['closePicker'] && this.showPicker) {\r\n const newCounter = changes['closePicker'].currentValue;\r\n // If counter increased, close the picker\r\n if (newCounter > this.previousCloseCounter) {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n this.previousCloseCounter = newCounter;\r\n }\r\n }\r\n }\r\n\r\n // Basic keyboard support on the input (combobox behavior)\r\n onInputKeydown(event: KeyboardEvent) {\r\n const key = event.key;\r\n\r\n if (key === 'Enter' || key === ' ') {\r\n event.preventDefault();\r\n this.togglePicker();\r\n return;\r\n }\r\n\r\n if (key === 'Escape' && this.showPicker) {\r\n this.showPicker = false;\r\n this.pickerClosed.emit(this.pickerId);\r\n return;\r\n }\r\n\r\n // Simple hour increment/decrement when closed\r\n if (!this.showPicker && (key === 'ArrowUp' || key === 'ArrowDown')) {\r\n event.preventDefault();\r\n if (this.timeFormat === 24) {\r\n if (key === 'ArrowUp') {\r\n this.currentHour = (this.currentHour + 1) % 24;\r\n } else {\r\n this.currentHour = this.currentHour <= 0 ? 23 : this.currentHour - 1;\r\n }\r\n } else {\r\n if (key === 'ArrowUp') {\r\n this.currentHour = this.currentHour >= 12 ? 1 : this.currentHour + 1;\r\n } else {\r\n this.currentHour = this.currentHour <= 1 ? 12 : this.currentHour - 1;\r\n }\r\n }\r\n this.updateTime();\r\n }\r\n }\r\n}\r\n\r\n","<div class=\"time-picker-wrapper\">\r\n <div class=\"time-input-group\">\r\n <label *ngIf=\"label\">{{ label }}</label>\r\n <div class=\"time-input-wrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"time-input\"\r\n [value]=\"value\"\r\n [placeholder]=\"placeholder\"\r\n readonly\r\n (click)=\"togglePicker()\">\r\n <span class=\"time-icon\">\r\n <img alt=\"timer\" class=\"timer-icon\" [src]='brickclayIcons.timerIcon'/>\r\n </span>\r\n <div class=\"custom-time-picker-dropdown\" *ngIf=\"showPicker\">\r\n <div class=\"custom-time-picker\" [ngClass]=\"position === 'left' ? 'left-position' : 'right-position'\">\r\n <!-- Hours Column -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #timeScroll>\r\n <div\r\n *ngFor=\"let h of getHours()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentHour === h\"\r\n (click)=\"onHourChange(h)\">\r\n {{ h.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <!-- Minutes Column -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #timeScroll>\r\n <div\r\n *ngFor=\"let m of getMinutes()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentMinute === m\"\r\n (click)=\"onMinuteChange(m)\">\r\n {{ m.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <!-- AM/PM Column -->\r\n <div class=\"time-column ampm-column\">\r\n <div class=\"time-scroll\" #timeScroll>\r\n <div\r\n *ngFor=\"let ap of getAMPMOptions()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentAMPM === ap\"\r\n (click)=\"onAMPMChange(ap)\">\r\n {{ ap }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CalendarManagerService {\r\n private calendarInstances: Set<() => void> = new Set();\r\n private closeAllSubject = new Subject<void>();\r\n \r\n closeAll$ = this.closeAllSubject.asObservable();\r\n\r\n /**\r\n * Register a calendar instance with its close function\r\n */\r\n register(closeFn: () => void): () => void {\r\n this.calendarInstances.add(closeFn);\r\n \r\n // Return unregister function\r\n return () => {\r\n this.calendarInstances.delete(closeFn);\r\n };\r\n }\r\n\r\n /**\r\n * Close all calendars except the one being opened\r\n */\r\n closeAllExcept(exceptCloseFn: () => void): void {\r\n this.calendarInstances.forEach(closeFn => {\r\n if (closeFn !== exceptCloseFn) {\r\n closeFn();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Close all calendars\r\n */\r\n closeAll(): void {\r\n this.closeAllSubject.next();\r\n this.calendarInstances.forEach(closeFn => closeFn());\r\n }\r\n}\r\n\r\n\r\n","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CalendarManagerService } from '../../services/calendar-manager.service';\r\nimport { Subscription } from 'rxjs';\r\nimport { BkTimePicker } from '../time-picker/time-picker.component';\r\nimport moment from 'moment';\r\nimport { BrickclayIcons } from '../../../assets/icons';\r\nexport interface CalendarRange {\r\n start: Date;\r\n end: Date;\r\n}\r\n\r\nexport interface CalendarSelection {\r\n startDate: string | null;\r\n endDate: string | null;\r\n selectedDates?: string[]; // For multi-date selection\r\n}\r\n\r\n@Component({\r\n selector: 'bk-custom-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BkTimePicker],\r\n templateUrl: './custom-calendar.component.html',\r\n styleUrls: ['./custom-calendar.component.css']\r\n})\r\nexport class BkCustomCalendar implements OnInit, OnDestroy, OnChanges {\r\n\r\n // Basic Options\r\n @Input() enableTimepicker = false;\r\n @Input() autoApply = false;\r\n @Input() closeOnAutoApply = false;\r\n @Input() showCancel = true;\r\n @Input() linkedCalendars = false;\r\n @Input() singleDatePicker = false;\r\n @Input() showWeekNumbers = false;\r\n @Input() showISOWeekNumbers = false;\r\n @Input() customRangeDirection = false;\r\n @Input() lockStartDate = false;\r\n @Input() position: 'center' | 'left' | 'right' = 'left';\r\n @Input() drop: 'up' | 'down' = 'down';\r\n @Input() dualCalendar = false;\r\n @Input() showRanges = true;\r\n @Input() timeFormat: 12 | 24 = 24;\r\n @Input() enableSeconds = false;\r\n @Input() customRanges?: Record<string, CalendarRange>;\r\n @Input() multiDateSelection = false; // NEW: Enable multi-date selection\r\n @Input() maxDate?: Date; // NEW: Maximum selectable date\r\n @Input() minDate?: Date; // NEW: Minimum selectable date\r\n @Input() placeholder = 'Select date range'; // NEW: Custom placeholder\r\n @Input() opens: 'left' | 'right' | 'center' = 'left'; // NEW: Popup position\r\n @Input() inline = false; // NEW: Always show calendar inline (no popup)\r\n @Input() isDisplayCrossIcon = true; // NEW: Show/Hide clear (X) icon\r\n\r\n @Output() selected = new EventEmitter<CalendarSelection>();\r\n @Output() opened = new EventEmitter<void>();\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n /**\r\n * External value passed from parent. If provided, component will select these dates on init / change.\r\n * Accepts { startDate: Date|null, endDate: Date|null, selectedDates?: Date[] }\r\n */\r\n @Input() selectedValue: CalendarSelection | null = null;\r\n /** Optional display format for the input value. Uses moment formatting tokens. */\r\n @Input() displayFormat = 'MM/DD/YYYY';\r\n\r\n brickclayIcons = BrickclayIcons;\r\n\r\n show = false;\r\n today = new Date();\r\n month = this.today.getMonth();\r\n year = this.today.getFullYear();\r\n calendar: { day: number, currentMonth: boolean }[][] = [];\r\n leftMonth!: number;\r\n leftYear!: number;\r\n rightMonth!: number;\r\n rightYear!: number;\r\n leftCalendar: { day: number, currentMonth: boolean }[][] = [];\r\n rightCalendar: { day: number, currentMonth: boolean }[][] = [];\r\n @Input() startDate: Date | null = null;\r\n @Input() endDate: Date | null = null;\r\n selectedDates: Date[] = []; // NEW: For multi-date selection\r\n disableHighlight = false;\r\n hoveredDate: Date | null = null; // For hover preview\r\n\r\n // Track raw input values for minutes to allow free typing\r\n minuteInputValues: { [key: string]: string } = {};\r\n\r\n // Time picker for single calendar (12-hour format: 1-12)\r\n selectedHour = 1;\r\n selectedMinute = 0;\r\n selectedSecond = 0;\r\n selectedAMPM: 'AM' | 'PM' = 'AM';\r\n\r\n // NEW: Separate time pickers for dual calendar (12-hour format: 1-12)\r\n startHour = 1;\r\n startMinute = 0;\r\n startSecond = 0;\r\n startAMPM: 'AM' | 'PM' = 'AM';\r\n endHour = 2;\r\n endMinute = 0;\r\n endSecond = 0;\r\n endAMPM: 'AM' | 'PM' = 'AM';\r\n\r\n // Track open time-picker within this calendar (for single-open behavior)\r\n openTimePickerId: string | null = null;\r\n closePickerCounter: { [key: string]: number } = {};\r\n\r\n defaultRanges: Record<string, CalendarRange> = {};\r\n activeRange: string | null = null; // Track which range is currently active\r\n rangeOrder: string[] = []; // Maintain order of ranges\r\n\r\n private unregisterFn?: () => void;\r\n private closeAllSubscription?: Subscription;\r\n private closeFn?: () => void;\r\n\r\n constructor(private calendarManager: CalendarManagerService) {}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: MouseEvent) {\r\n // Don't handle click outside if inline mode is enabled\r\n if (this.inline) {\r\n return;\r\n }\r\n const target = event.target as HTMLElement;\r\n if (this.show && !target.closest('.calendar-container')) {\r\n this.close();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n if (!this.customRanges) {\r\n this.initializeDefaultRanges();\r\n } else {\r\n // If customRanges is provided via @Input, set the order based on the keys\r\n // Maintain the desired order if keys match, otherwise use provided order\r\n const desiredOrder = ['Today', 'Yesterday', 'Last 7 Days', 'Last 30 Days', 'This Month', 'Last Month', 'Custom Range'];\r\n const providedKeys = Object.keys(this.customRanges);\r\n // Check if Custom Range exists, if not add it\r\n if (!this.customRanges['Custom Range']) {\r\n this.customRanges['Custom Range'] = { start: new Date(), end: new Date() };\r\n }\r\n // Build order: first add desired order items that exist, then add any remaining\r\n this.rangeOrder = desiredOrder.filter(key => providedKeys.includes(key) || key === 'Custom Range');\r\n const remaining = providedKeys.filter(key => !this.rangeOrder.includes(key));\r\n this.rangeOrder = [...this.rangeOrder, ...remaining];\r\n }\r\n if (this.dualCalendar) this.initializeDual();\r\n else this.generateCalendar();\r\n\r\n // Initialize time from existing dates if available\r\n if (this.startDate) {\r\n this.initializeTimeFromDate(this.startDate, true);\r\n }\r\n if (this.endDate) {\r\n this.initializeTimeFromDate(this.endDate, false);\r\n }\r\n\r\n // Check if current dates match any predefined range\r\n if (this.startDate && this.endDate) {\r\n this.checkAndSetActiveRange();\r\n }\r\n\r\n // If inline mode, always show calendar\r\n if (this.inline) {\r\n this.show = true;\r\n }\r\n\r\n // Register this calendar instance with the manager service\r\n this.closeFn = () => {\r\n if (this.show && !this.inline) {\r\n this.close();\r\n }\r\n };\r\n this.unregisterFn = this.calendarManager.register(this.closeFn);\r\n\r\n // Subscribe to close all events (skip if inline)\r\n this.closeAllSubscription = this.calendarManager.closeAll$.subscribe(() => {\r\n if (this.show && !this.inline) {\r\n this.close();\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['selectedValue'] && this.selectedValue) {\r\n // Normalize incoming values to Date or null\r\n const s = this.selectedValue;\r\n this.startDate = s.startDate ? new Date(s.startDate) : null;\r\n this.endDate = s.endDate ? new Date(s.endDate) : null;\r\n this.selectedDates = (s.selectedDates || []).map((d) => new Date(d));\r\n\r\n // Update calendar month/year to show the start date (or end date if start missing)\r\n const focusDate = this.startDate ?? this.endDate ?? new Date();\r\n this.month = focusDate.getMonth();\r\n this.year = focusDate.getFullYear();\r\n if (this.dualCalendar) {\r\n this.initializeDual();\r\n } else {\r\n this.generateCalendar();\r\n }\r\n\r\n // Re-evaluate active range if any\r\n this.checkAndSetActiveRange();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Unregister this calendar instance\r\n if (this.unregisterFn) {\r\n this.unregisterFn();\r\n }\r\n\r\n // Unsubscribe from close all events\r\n if (this.closeAllSubscription) {\r\n this.closeAllSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n checkAndSetActiveRange() {\r\n if (!this.customRanges || !this.startDate || !this.endDate) return;\r\n\r\n // Normalize dates for comparison (ignore time)\r\n const normalizeDate = (date: Date) => {\r\n const d = new Date(date);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n };\r\n\r\n const start = normalizeDate(this.startDate);\r\n const end = normalizeDate(this.endDate);\r\n\r\n // Check each range (except Custom Range)\r\n for (const key of this.rangeOrder) {\r\n if (key === 'Custom Range') continue;\r\n const range = this.customRanges![key];\r\n if (range) {\r\n const rangeStart = normalizeDate(range.start);\r\n const rangeEnd = normalizeDate(range.end);\r\n if (start.getTime() === rangeStart.getTime() && end.getTime() === rangeEnd.getTime()) {\r\n this.activeRange = key;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // If no match found, it's a custom range\r\n this.activeRange = 'Custom Range';\r\n }\r\n\r\n initializeDefaultRanges() {\r\n const today = new Date();\r\n this.customRanges = {\r\n 'Today': { start: new Date(today.getFullYear(), today.getMonth(), today.getDate()), end: new Date(today.getFullYear(), today.getMonth(), today.getDate()) },\r\n 'Yesterday': { start: this.addDays(today, -1), end: this.addDays(today, -1) },\r\n 'Last 7 Days': { start: this.addDays(today, -6), end: today },\r\n 'Last 30 Days': { start: this.addDays(today, -29), end: today },\r\n 'This Month': { start: new Date(today.getFullYear(), today.getMonth(), 1), end: today },\r\n 'Last Month': { start: new Date(today.getFullYear(), today.getMonth() - 1, 1), end: new Date(today.getFullYear(), today.getMonth(), 0) },\r\n 'Custom Range': { start: new Date(), end: new Date() }, // Placeholder, won't be used for selection\r\n };\r\n // Set the order of ranges\r\n this.rangeOrder = ['Today', 'Yesterday', 'Last 7 Days', 'Last 30 Days', 'This Month', 'Last Month', 'Custom Range'];\r\n }\r\n\r\n initializeTimeFromDate(date: Date, isStart: boolean) {\r\n // Always use 12-hour format\r\n const hours24 = date.getHours();\r\n const minutes = date.getMinutes();\r\n const seconds = date.getSeconds();\r\n\r\n if (isStart) {\r\n this.startMinute = minutes;\r\n this.startSecond = seconds;\r\n if (hours24 >= 12) {\r\n this.startAMPM = 'PM';\r\n this.startHour = hours24 > 12 ? hours24 - 12 : 12;\r\n } else {\r\n this.startAMPM = 'AM';\r\n this.startHour = hours24 === 0 ? 12 : hours24;\r\n }\r\n } else {\r\n this.endMinute = minutes;\r\n this.endSecond = seconds;\r\n if (hours24 >= 12) {\r\n this.endAMPM = 'PM';\r\n this.endHour = hours24 > 12 ? hours24 - 12 : 12;\r\n } else {\r\n this.endAMPM = 'AM';\r\n this.endHour = hours24 === 0 ? 12 : hours24;\r\n }\r\n }\r\n }\r\n\r\n toggle() {\r\n // Don't toggle if inline mode is enabled\r\n if (this.inline) {\r\n return;\r\n }\r\n const wasOpen = this.show;\r\n this.show = !this.show;\r\n\r\n if (this.show) {\r\n // If opening, close all other calendars first\r\n if (!wasOpen && this.closeFn) {\r\n this.calendarManager.closeAllExcept(this.closeFn);\r\n }\r\n this.disableHighlight = false;\r\n this.opened.emit();\r\n } else {\r\n this.closed.emit();\r\n }\r\n }\r\n\r\n close() {\r\n // Don't close if inline mode is enabled\r\n if (this.inline) {\r\n return;\r\n }\r\n this.show = false;\r\n this.closed.emit();\r\n }\r\n\r\n onDateHover(day: number | null, fromRight = false) {\r\n if (!day || this.singleDatePicker || this.multiDateSelection) {\r\n this.hoveredDate = null;\r\n return;\r\n }\r\n\r\n // Only show hover preview if start date is selected but end date is not\r\n if (!this.startDate || this.endDate) {\r\n this.hoveredDate = null;\r\n return;\r\n }\r\n\r\n if (!this.dualCalendar) {\r\n this.hoveredDate = new Date(this.year, this.month, day);\r\n } else {\r\n this.hoveredDate = fromRight\r\n ? new Date(this.rightYear, this.rightMonth, day)\r\n : new Date(this.leftYear, this.leftMonth, day);\r\n }\r\n }\r\n\r\n onDateLeave() {\r\n this.hoveredDate = null;\r\n }\r\n\r\n selectDate(day: number | null, fromRight = false) {\r\n if (!day) return;\r\n\r\n let selected: Date;\r\n if (!this.dualCalendar) {\r\n selected = new Date(this.year, this.month, day);\r\n } else {\r\n selected = fromRight\r\n ? new Date(this.rightYear, this.rightMonth, day)\r\n : new Date(this.leftYear, this.leftMonth, day);\r\n }\r\n\r\n // Clear hover on selection\r\n this.hoveredDate = null;\r\n\r\n // Check min/max date constraints\r\n if (this.minDate && selected < this.minDate) return;\r\n if (this.maxDate && selected > this.maxDate) return;\r\n\r\n // Multi-date selection mode\r\n if (this.multiDateSelection) {\r\n this.handleMultiDateSelection(selected);\r\n return;\r\n }\r\n\r\n // Apply time if timepicker is enabled (convert 12-hour to 24-hour)\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n // For dual calendar, use separate start/end times\r\n // If no startDate OR endDate exists, we're selecting start date\r\n const isStart = !this.startDate || !!this.endDate;\r\n this.applyTimeToDate(selected, isStart);\r\n } else {\r\n // For single calendar, always use selected time for start\r\n this.applyTimeToDate(selected, true);\r\n }\r\n }\r\n\r\n // Single date picker mode\r\n if (this.singleDatePicker) {\r\n this.startDate = selected;\r\n this.endDate = null;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Apply time immediately if timepicker is enabled\r\n if (this.enableTimepicker) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.autoApply) {\r\n this.apply();\r\n if (this.closeOnAutoApply && !this.inline) this.close();\r\n } else {\r\n // Always emit selection event even if autoApply is false (especially for inline calendars)\r\n this.emitSelection();\r\n }\r\n return;\r\n }\r\n\r\n // Range selection mode\r\n if (!this.startDate || this.endDate) {\r\n this.startDate = selected;\r\n this.endDate = null;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Keep left calendar on the selected month for better UX\r\n if (this.dualCalendar) {\r\n this.leftMonth = selected.getMonth();\r\n this.leftYear = selected.getFullYear();\r\n // Reset right calendar to original position (next month after left) when end date is cleared\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n this.generateDualCalendars();\r\n }\r\n // Don't overwrite time picker values - keep current values and apply them to the date\r\n // Time picker values are already set by user, we just apply them to the selected date\r\n } else {\r\n if (selected < this.startDate && !this.customRangeDirection) {\r\n this.endDate = this.startDate;\r\n this.startDate = selected;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Swap times if needed\r\n if (this.dualCalendar && this.enableTimepicker) {\r\n [this.startHour, this.endHour] = [this.endHour, this.startHour];\r\n [this.startMinute, this.endMinute] = [this.endMinute, this.startMinute];\r\n [this.startSecond, this.endSecond] = [this.endSecond, this.startSecond];\r\n [this.startAMPM, this.endAMPM] = [this.endAMPM, this.startAMPM];\r\n }\r\n // Keep left calendar on the selected month\r\n if (this.dualCalendar) {\r\n this.leftMonth = selected.getMonth();\r\n this.leftYear = selected.getFullYear();\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n }\r\n } else {\r\n this.endDate = selected;\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n // Only move right calendar if end date is in a different month than start date\r\n if (this.dualCalendar) {\r\n if (this.startDate) {\r\n const startMonth = this.startDate.getMonth();\r\n const startYear = this.startDate.getFullYear();\r\n const endMonth = selected.getMonth();\r\n const endYear = selected.getFullYear();\r\n\r\n // Only move right calendar if end date is in a different month\r\n if (endMonth !== startMonth || endYear !== startYear) {\r\n this.rightMonth = endMonth;\r\n this.rightYear = endYear;\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n // If both dates are in same month, keep right calendar in its current position\r\n } else {\r\n // If no start date, move right calendar to end date month\r\n this.rightMonth = selected.getMonth();\r\n this.rightYear = selected.getFullYear();\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n }\r\n // Don't overwrite time picker values - keep current end time values\r\n // Time picker values are already set by user\r\n }\r\n if (this.autoApply) {\r\n this.apply();\r\n if (this.closeOnAutoApply && !this.inline) this.close();\r\n } else {\r\n // Check if the selection matches a predefined range\r\n this.checkAndSetActiveRange();\r\n // Always emit selection event for inline calendars\r\n if (this.inline) {\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n }\r\n\r\n handleMultiDateSelection(selected: Date) {\r\n const dateStr = this.getDateString(selected);\r\n const existingIndex = this.selectedDates.findIndex(d => this.getDateString(d) === dateStr);\r\n\r\n if (existingIndex >= 0) {\r\n // Deselect if already selected\r\n this.selectedDates.splice(existingIndex, 1);\r\n } else {\r\n // Add to selection\r\n this.selectedDates.push(new Date(selected));\r\n this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\r\n }\r\n\r\n // Update startDate and endDate for compatibility\r\n if (this.selectedDates.length > 0) {\r\n this.startDate = new Date(this.selectedDates[0]);\r\n this.endDate = new Date(this.selectedDates[this.selectedDates.length - 1]);\r\n // Activate Custom Range when manually selecting dates\r\n this.activeRange = 'Custom Range';\r\n } else {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.activeRange = null;\r\n }\r\n\r\n // Always emit selection event for inline calendars or when autoApply is true\r\n if (this.autoApply || this.inline) {\r\n this.emitSelection();\r\n if (this.closeOnAutoApply && !this.inline) this.close();\r\n }\r\n }\r\n\r\n getDateString(date: Date): string {\r\n return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\r\n }\r\n\r\n isDateInMultiSelection(year: number, month: number, day: number): boolean {\r\n if (!this.multiDateSelection || this.selectedDates.length === 0) return false;\r\n const cellDate = new Date(year, month, day);\r\n return this.selectedDates.some(d => this.getDateString(d) === this.getDateString(cellDate));\r\n }\r\n\r\n apply() {\r\n // Format minute inputs to 2 digits before applying\r\n this.formatAllMinuteInputs();\r\n\r\n // Apply time to dates\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n // Dual calendar with separate start/end times (always 12-hour format)\r\n if (this.startDate) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate) {\r\n this.applyTimeToDate(this.endDate, false);\r\n }\r\n } else {\r\n // Single calendar with time (always 12-hour format)\r\n if (this.startDate) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate && !this.singleDatePicker) {\r\n this.applyTimeToDate(this.endDate, true);\r\n }\r\n }\r\n }\r\n\r\n // Check if the selection matches a predefined range\r\n this.checkAndSetActiveRange();\r\n\r\n this.emitSelection();\r\n this.disableHighlight = true;\r\n this.close();\r\n }\r\n\r\n cancel() {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.selectedDates = [];\r\n this.close();\r\n }\r\n\r\n clear() {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.selectedDates = [];\r\n this.activeRange = null; // Clear active range\r\n\r\n // Reset right calendar to original position (next month after left) when end date is cleared\r\n if (this.dualCalendar && !this.endDate) {\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n this.generateDualCalendars();\r\n }\r\n\r\n this.emitSelection();\r\n }\r\n\r\n chooseRange(key: string) {\r\n if (!this.customRanges) return;\r\n // Don't allow selecting \"Custom Range\" directly - it's only activated when manually selecting dates\r\n if (key === 'Custom Range') return;\r\n const r = this.customRanges[key];\r\n if (!r) return;\r\n this.startDate = new Date(r.start);\r\n this.endDate = new Date(r.end);\r\n this.selectedDates = [];\r\n this.activeRange = key; // Set active range\r\n\r\n // Navigate calendars to show the selected date range\r\n if (this.dualCalendar) {\r\n // For dual calendar: left always shows start date month\r\n if (this.startDate) {\r\n this.leftMonth = this.startDate.getMonth();\r\n this.leftYear = this.startDate.getFullYear();\r\n }\r\n\r\n // Right calendar logic\r\n if (this.endDate && this.startDate) {\r\n const startMonth = this.startDate.getMonth();\r\n const startYear = this.startDate.getFullYear();\r\n const endMonth = this.endDate.getMonth();\r\n const endYear = this.endDate.getFullYear();\r\n\r\n // Only move right calendar if end date is in a different month than start date\r\n if (endMonth !== startMonth || endYear !== startYear) {\r\n this.rightMonth = endMonth;\r\n this.rightYear = endYear;\r\n } else {\r\n // If both dates are in same month, reset right calendar to default position (next month after left)\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n }\r\n } else if (this.endDate && !this.startDate) {\r\n // If only end date exists, show it in right calendar\r\n this.rightMonth = this.endDate.getMonth();\r\n this.rightYear = this.endDate.getFullYear();\r\n } else {\r\n // If no end date, reset right calendar to default position\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) {\r\n this.rightMonth = 0;\r\n this.rightYear++;\r\n }\r\n }\r\n\r\n this.generateDualCalendars();\r\n } else {\r\n // For single calendar: show the start date month (or end date if only end date exists)\r\n if (this.startDate) {\r\n this.month = this.startDate.getMonth();\r\n this.year = this.startDate.getFullYear();\r\n } else if (this.endDate) {\r\n this.month = this.endDate.getMonth();\r\n this.year = this.endDate.getFullYear();\r\n }\r\n this.generateCalendar();\r\n }\r\n\r\n this.emitSelection();\r\n if (this.autoApply || this.closeOnAutoApply) {\r\n this.close();\r\n }\r\n }\r\n\r\n // emitSelection() {\r\n // const selection: CalendarSelection = {\r\n // startDate: this.startDate,\r\n // endDate: this.endDate\r\n // };\r\n // if (this.multiDateSelection) {\r\n // selection.selectedDates = [...this.selectedDates];\r\n // }\r\n // this.selected.emit(selection);\r\n // }\r\n\r\n emitSelection() {\r\n const selection: CalendarSelection = {\r\n startDate: this.startDate ? this.formatDateToString(this.startDate) : null,\r\n endDate: this.endDate ? this.formatDateToString(this.endDate) : null,\r\n };\r\n\r\n if (this.multiDateSelection && this.selectedDates.length > 0) {\r\n selection.selectedDates = this.selectedDates.map(d => this.formatDateToString(d));\r\n }\r\n\r\n this.selected.emit(selection);\r\n }\r\n\r\n addDays(date: Date, days: number): Date {\r\n const d = new Date(date);\r\n d.setDate(d.getDate() + days);\r\n return d;\r\n }\r\n\r\n generateCalendar() {\r\n this.calendar = this.buildCalendar(this.year, this.month);\r\n }\r\n\r\n nextMonth() {\r\n if (!this.dualCalendar) {\r\n this.month++;\r\n if (this.month > 11) { this.month = 0; this.year++; }\r\n this.generateCalendar();\r\n return;\r\n }\r\n // For dual calendar, this should not be used - use nextLeftMonth or nextRightMonth instead\r\n this.nextLeftMonth();\r\n }\r\n\r\n prevMonth() {\r\n if (!this.dualCalendar) {\r\n this.month--;\r\n if (this.month < 0) { this.month = 11; this.year--; }\r\n this.generateCalendar();\r\n return;\r\n }\r\n // For dual calendar, this should not be used - use prevLeftMonth or prevRightMonth instead\r\n this.prevLeftMonth();\r\n }\r\n\r\n // Independent navigation for left calendar\r\n nextLeftMonth() {\r\n this.leftMonth++;\r\n if (this.leftMonth > 11) { this.leftMonth = 0; this.leftYear++; }\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n }\r\n\r\n prevLeftMonth() {\r\n this.leftMonth--;\r\n if (this.leftMonth < 0) { this.leftMonth = 11; this.leftYear--; }\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n }\r\n\r\n // Independent navigation for right calendar\r\n nextRightMonth() {\r\n this.rightMonth++;\r\n if (this.rightMonth > 11) { this.rightMonth = 0; this.rightYear++; }\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n\r\n prevRightMonth() {\r\n this.rightMonth--;\r\n if (this.rightMonth < 0) { this.rightMonth = 11; this.rightYear--; }\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n\r\n initializeDual() {\r\n this.leftMonth = this.today.getMonth();\r\n this.leftYear = this.today.getFullYear();\r\n // Initialize right calendar to next month, but they can move independently\r\n this.rightMonth = this.leftMonth + 1;\r\n this.rightYear = this.leftYear;\r\n if (this.rightMonth > 11) { this.rightMonth = 0; this.rightYear++; }\r\n this.generateDualCalendars();\r\n }\r\n\r\n generateDualCalendars() {\r\n this.leftCalendar = this.buildCalendar(this.leftYear, this.leftMonth);\r\n this.rightCalendar = this.buildCalendar(this.rightYear, this.rightMonth);\r\n }\r\n\r\n buildCalendar(year: number, month: number): { day: number, currentMonth: boolean }[][] {\r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n const prevMonthDays = new Date(year, month, 0).getDate();\r\n\r\n const grid: { day: number, currentMonth: boolean }[][] = [];\r\n let row: { day: number, currentMonth: boolean }[] = [];\r\n\r\n // Adjust first day (0 = Sunday, 1 = Monday, etc.)\r\n const adjustedFirstDay = firstDay === 0 ? 6 : firstDay - 1; // Make Monday = 0\r\n\r\n for (let i = adjustedFirstDay - 1; i >= 0; i--) {\r\n row.push({ day: prevMonthDays - i, currentMonth: false });\r\n }\r\n for (let d = 1; d <= daysInMonth; d++) {\r\n row.push({ day: d, currentMonth: true });\r\n if (row.length === 7) { grid.push(row); row = []; }\r\n }\r\n let nextMonthDay = 1;\r\n while (row.length > 0 && row.length < 7) {\r\n row.push({ day: nextMonthDay++, currentMonth: false });\r\n }\r\n if (row.length) grid.push(row);\r\n\r\n // Ensure we always have 6 rows (42 cells total) for consistent layout\r\n while (grid.length < 6) {\r\n const newRow: { day: number, currentMonth: boolean }[] = [];\r\n for (let i = 0; i < 7; i++) {\r\n newRow.push({ day: nextMonthDay++, currentMonth: false });\r\n }\r\n grid.push(newRow);\r\n }\r\n\r\n return grid;\r\n }\r\n\r\n isDateSelected(year: number, month: number, day: number): boolean {\r\n if (this.disableHighlight) return false;\r\n if (!day) return false;\r\n\r\n // Multi-date selection\r\n if (this.multiDateSelection) {\r\n return this.isDateInMultiSelection(year, month, day);\r\n }\r\n\r\n const cellDate = new Date(year, month, day);\r\n\r\n // Check if it's today (highlight today by default if no date selected)\r\n const today = new Date();\r\n const isToday = cellDate.getFullYear() === today.getFullYear() &&\r\n cellDate.getMonth() === today.getMonth() &&\r\n cellDate.getDate() === today.getDate();\r\n\r\n // If no startDate is set and it's today, highlight it\r\n if (!this.startDate && isToday) {\r\n return true;\r\n }\r\n\r\n if (!this.startDate) return false;\r\n\r\n // Check if date is disabled\r\n if (this.minDate && cellDate < this.minDate) return false;\r\n if (this.maxDate && cellDate > this.maxDate) return false;\r\n\r\n const sameDay =\r\n cellDate.getFullYear() === this.startDate.getFullYear() &&\r\n cellDate.getMonth() === this.startDate.getMonth() &&\r\n cellDate.getDate() === this.startDate.getDate();\r\n\r\n if (this.singleDatePicker) return sameDay;\r\n\r\n // For range selection: only highlight start and end dates (not in-between)\r\n if (this.startDate && this.endDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const end = new Date(this.endDate.getFullYear(), this.endDate.getMonth(), this.endDate.getDate());\r\n return cellDate.getTime() === start.getTime() || cellDate.getTime() === end.getTime();\r\n }\r\n\r\n // If only start date is selected and hovering, check if this is start or hovered end\r\n if (this.startDate && !this.endDate && this.hoveredDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const hovered = new Date(this.hoveredDate.getFullYear(), this.hoveredDate.getMonth(), this.hoveredDate.getDate());\r\n // Show both start and hovered date as selected (circular black)\r\n return cellDate.getTime() === start.getTime() || cellDate.getTime() === hovered.getTime();\r\n }\r\n\r\n return sameDay;\r\n }\r\n\r\n isDateInRange(year: number, month: number, day: number): boolean {\r\n if (this.disableHighlight || !day) return false;\r\n if (this.singleDatePicker) return false;\r\n if (this.multiDateSelection) return false;\r\n\r\n const cellDate = new Date(year, month, day);\r\n\r\n // If both start and end are selected, show gray background for dates in between\r\n if (this.startDate && this.endDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const end = new Date(this.endDate.getFullYear(), this.endDate.getMonth(), this.endDate.getDate());\r\n return cellDate > start && cellDate < end;\r\n }\r\n\r\n // If only start is selected and hovering, show preview range\r\n if (this.startDate && !this.endDate && this.hoveredDate) {\r\n const start = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n const hovered = new Date(this.hoveredDate.getFullYear(), this.hoveredDate.getMonth(), this.hoveredDate.getDate());\r\n\r\n // Determine which is earlier - show gray background for dates between them\r\n const minDate = hovered < start ? hovered : start;\r\n const maxDate = hovered >= start ? hovered : start;\r\n return cellDate > minDate && cellDate < maxDate;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isDateDisabled(year: number, month: number, day: number): boolean {\r\n if (!day) return false;\r\n const cellDate = new Date(year, month, day);\r\n if (this.minDate && cellDate < this.minDate) return true;\r\n if (this.maxDate && cellDate > this.maxDate) return true;\r\n return false;\r\n }\r\n\r\n isToday(year: number, month: number, day: number): boolean {\r\n if (!day) return false;\r\n const today = new Date();\r\n const cellDate = new Date(year, month, day);\r\n return cellDate.getFullYear() === today.getFullYear() &&\r\n cellDate.getMonth() === today.getMonth() &&\r\n cellDate.getDate() === today.getDate();\r\n }\r\n\r\n getDisplayValue(): string {\r\n if (this.multiDateSelection && this.selectedDates.length > 0) {\r\n if (this.selectedDates.length === 1) {\r\n return moment(this.selectedDates[0]).format(this.displayFormat);\r\n }\r\n return `${this.selectedDates.length} dates selected`;\r\n }\r\n\r\n if (!this.startDate) return '';\r\n\r\n // Prefer moment formatting for consistent display\r\n let dateStr = moment(this.startDate).format(this.displayFormat);\r\n\r\n if (this.enableTimepicker && !this.dualCalendar) {\r\n const hr = this.startDate.getHours().toString().padStart(2, '0');\r\n const min = this.startDate.getMinutes().toString().padStart(2, '0');\r\n dateStr += ` ${hr}:${min}`;\r\n if (this.enableSeconds) {\r\n const sec = this.startDate.getSeconds().toString().padStart(2, '0');\r\n dateStr += `:${sec}`;\r\n }\r\n }\r\n\r\n if (this.endDate && !this.singleDatePicker) {\r\n let endStr = moment(this.endDate).format(this.displayFormat);\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n const startHr = this.startDate.getHours().toString().padStart(2, '0');\r\n const startMin = this.startDate.getMinutes().toString().padStart(2, '0');\r\n dateStr += ` ${startHr}:${startMin}`;\r\n if (this.enableSeconds) {\r\n const startSec = this.startDate.getSeconds().toString().padStart(2, '0');\r\n dateStr += `:${startSec}`;\r\n }\r\n }\r\n const endHr = this.endDate.getHours().toString().padStart(2, '0');\r\n const endMin = this.endDate.getMinutes().toString().padStart(2, '0');\r\n endStr += ` ${endHr}:${endMin}`;\r\n if (this.enableSeconds) {\r\n const endSec = this.endDate.getSeconds().toString().padStart(2, '0');\r\n endStr += `:${endSec}`;\r\n }\r\n }\r\n return `${dateStr} - ${endStr}`;\r\n }\r\n return dateStr;\r\n }\r\n\r\n // Time picker helpers\r\n getTimeInputValue(isStart = true): string {\r\n const h = isStart ? this.startHour : this.endHour;\r\n const m = isStart ? this.startMinute : this.endMinute;\r\n return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;\r\n }\r\n\r\n getSingleTimeInputValue(): string {\r\n return `${this.selectedHour.toString().padStart(2, '0')}:${this.selectedMinute.toString().padStart(2, '0')}`;\r\n }\r\n\r\n // NEW: Helper to build display value for BkTimePicker (single calendar)\r\n getSingleTimePickerDisplay(): string {\r\n const hour = this.selectedHour || 12;\r\n const minuteStr = this.selectedMinute.toString().padStart(2, '0');\r\n const ampm = this.selectedAMPM || 'AM';\r\n return `${hour}:${minuteStr} ${ampm}`;\r\n }\r\n\r\n // NEW: Helper to build display value for BkTimePicker (dual calendar)\r\n getDualTimePickerDisplay(isStart = true): string {\r\n const hour = isStart ? (this.startHour || 12) : (this.endHour || 12);\r\n const minute = isStart ? this.startMinute : this.endMinute;\r\n const ampm = isStart ? (this.startAMPM || 'AM') : (this.endAMPM || 'AM');\r\n const minuteStr = minute.toString().padStart(2, '0');\r\n return `${hour}:${minuteStr} ${ampm}`;\r\n }\r\n\r\n // Coordination helpers for embedded BkTimePicker instances\r\n onTimePickerOpened(pickerId: string) {\r\n // Close previously open picker inside this calendar\r\n if (this.openTimePickerId && this.openTimePickerId !== pickerId) {\r\n if (!this.closePickerCounter[this.openTimePickerId]) {\r\n this.closePickerCounter[this.openTimePickerId] = 0;\r\n }\r\n this.closePickerCounter[this.openTimePickerId]++;\r\n }\r\n this.openTimePickerId = pickerId;\r\n }\r\n\r\n onTimePickerClosed(pickerId: string) {\r\n if (this.openTimePickerId === pickerId) {\r\n this.openTimePickerId = null;\r\n }\r\n }\r\n\r\n shouldClosePicker(pickerId: string): number {\r\n return this.closePickerCounter[pickerId] || 0;\r\n }\r\n\r\n // NEW: Parse \"H:MM AM/PM\" (or \"HH:MM\" 24h) from BkTimePicker\r\n private parsePickerTimeString(timeStr: string): { hour12: number; minute: number; ampm: 'AM' | 'PM' } {\r\n if (!timeStr) {\r\n return { hour12: 12, minute: 0, ampm: 'AM' };\r\n }\r\n\r\n const parts = timeStr.trim().split(' ');\r\n const timePart = parts[0] || '12:00';\r\n let ampmPart = (parts[1] || '').toUpperCase();\r\n\r\n const [hourStr, minuteStr] = timePart.split(':');\r\n let hour = parseInt(hourStr || '12', 10);\r\n const minute = parseInt(minuteStr || '0', 10);\r\n\r\n if (ampmPart !== 'AM' && ampmPart !== 'PM') {\r\n // Interpret as 24-hour input and convert\r\n if (hour >= 12) {\r\n ampmPart = 'PM';\r\n if (hour > 12) hour -= 12;\r\n } else {\r\n ampmPart = 'AM';\r\n if (hour === 0) hour = 12;\r\n }\r\n }\r\n\r\n // Clamp to 1-12 range just in case\r\n if (hour < 1) hour = 1;\r\n if (hour > 12) hour = 12;\r\n\r\n return { hour12: hour, minute, ampm: ampmPart as 'AM' | 'PM' };\r\n }\r\n\r\n // NEW: Handle BkTimePicker change for single calendar\r\n onSingleTimePickerChange(time: string) {\r\n const { hour12, minute, ampm } = this.parsePickerTimeString(time);\r\n\r\n this.selectedHour = hour12;\r\n this.selectedMinute = minute;\r\n this.selectedAMPM = ampm;\r\n\r\n if (this.startDate) {\r\n let h24 = hour12;\r\n if (ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.startDate.setHours(h24, minute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n // NEW: Handle BkTimePicker change for dual calendar\r\n onDualTimePickerChange(time: string, isStart = true) {\r\n const { hour12, minute, ampm } = this.parsePickerTimeString(time);\r\n\r\n if (isStart) {\r\n this.startHour = hour12;\r\n this.startMinute = minute;\r\n this.startAMPM = ampm;\r\n\r\n if (this.startDate) {\r\n let h24 = hour12;\r\n if (ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.startDate.setHours(h24, minute, this.startSecond);\r\n }\r\n } else {\r\n this.endHour = hour12;\r\n this.endMinute = minute;\r\n this.endAMPM = ampm;\r\n\r\n if (this.endDate) {\r\n let h24 = hour12;\r\n if (ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.endDate.setHours(h24, minute, this.endSecond);\r\n }\r\n }\r\n\r\n this.emitSelection();\r\n }\r\n\r\n onTimeChange(event: any, isStart = true) {\r\n const [h, m] = event.target.value.split(':').map(Number);\r\n if (isStart) {\r\n this.startHour = h;\r\n this.startMinute = m;\r\n if (this.startDate) {\r\n this.startDate.setHours(h, m, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endHour = h;\r\n this.endMinute = m;\r\n if (this.endDate) {\r\n this.endDate.setHours(h, m, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n\r\n onSingleTimeChange(event: any) {\r\n const [h, m] = event.target.value.split(':').map(Number);\r\n this.selectedHour = h;\r\n this.selectedMinute = m;\r\n if (this.startDate) {\r\n this.startDate.setHours(h, m, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n // Custom time picker controls\r\n incrementHour(isStart = true) {\r\n // 12-hour format: 1-12\r\n if (isStart) {\r\n this.startHour = this.startHour >= 12 ? 1 : this.startHour + 1;\r\n // Toggle AM/PM at 12\r\n if (this.startHour === 12) {\r\n this.startAMPM = this.startAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endHour = this.endHour >= 12 ? 1 : this.endHour + 1;\r\n // Toggle AM/PM at 12\r\n if (this.endHour === 12) {\r\n this.endAMPM = this.endAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n decrementHour(isStart = true) {\r\n // 12-hour format: 1-12\r\n if (isStart) {\r\n this.startHour = this.startHour <= 1 ? 12 : this.startHour - 1;\r\n // Toggle AM/PM at 12\r\n if (this.startHour === 12) {\r\n this.startAMPM = this.startAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endHour = this.endHour <= 1 ? 12 : this.endHour - 1;\r\n // Toggle AM/PM at 12\r\n if (this.endHour === 12) {\r\n this.endAMPM = this.endAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n incrementMinute(isStart = true) {\r\n if (isStart) {\r\n this.startMinute = (this.startMinute + 1) % 60;\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endMinute = (this.endMinute + 1) % 60;\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n decrementMinute(isStart = true) {\r\n if (isStart) {\r\n this.startMinute = this.startMinute <= 0 ? 59 : this.startMinute - 1;\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endMinute = this.endMinute <= 0 ? 59 : this.endMinute - 1;\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n toggleAMPM(isStart = true) {\r\n if (isStart) {\r\n this.startAMPM = this.startAMPM === 'AM' ? 'PM' : 'AM';\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n }\r\n } else {\r\n this.endAMPM = this.endAMPM === 'AM' ? 'PM' : 'AM';\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n }\r\n this.emitSelection();\r\n }\r\n\r\n // Single calendar time picker controls (12-hour format: 1-12)\r\n incrementSingleHour() {\r\n this.selectedHour = this.selectedHour >= 12 ? 1 : this.selectedHour + 1;\r\n // Toggle AM/PM at 12\r\n if (this.selectedHour === 12) {\r\n this.selectedAMPM = this.selectedAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n decrementSingleHour() {\r\n this.selectedHour = this.selectedHour <= 1 ? 12 : this.selectedHour - 1;\r\n // Toggle AM/PM at 12\r\n if (this.selectedHour === 12) {\r\n this.selectedAMPM = this.selectedAMPM === 'AM' ? 'PM' : 'AM';\r\n }\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n incrementSingleMinute() {\r\n this.selectedMinute = (this.selectedMinute + 1) % 60;\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n decrementSingleMinute() {\r\n this.selectedMinute = this.selectedMinute <= 0 ? 59 : this.selectedMinute - 1;\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n toggleSingleAMPM() {\r\n this.selectedAMPM = this.selectedAMPM === 'AM' ? 'PM' : 'AM';\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n getMonthName(month: number): string {\r\n const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n return months[month];\r\n }\r\n\r\n // Input handlers for direct hour/minute input (12-hour format only)\r\n onHourInput(event: any, isStart = true, isSingle = false): void {\r\n const inputValue = event.target.value;\r\n\r\n // Allow empty input while typing\r\n if (inputValue === '' || inputValue === null || inputValue === undefined) {\r\n return;\r\n }\r\n\r\n let value = parseInt(inputValue) || 0;\r\n\r\n // Validate: 1-12 for 12-hour format\r\n if (value < 1) value = 1;\r\n if (value > 12) value = 12;\r\n\r\n if (isSingle) {\r\n this.selectedHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n } else if (isStart) {\r\n this.startHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endHour = value;\r\n if (this.endDate) {\r\n let h = value;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n\r\n // Don't format during input, only on blur\r\n event.target.value = value.toString();\r\n }\r\n\r\n onHourBlur(event: any, isStart = true, isSingle = false): void {\r\n const inputValue = event.target.value;\r\n if (inputValue === '' || inputValue === null || inputValue === undefined) {\r\n // If empty, set to current value\r\n const currentValue = isSingle ? this.selectedHour : (isStart ? this.startHour : this.endHour);\r\n event.target.value = currentValue.toString();\r\n return;\r\n }\r\n\r\n let value = parseInt(inputValue) || 0;\r\n if (value < 1) value = 1;\r\n if (value > 12) value = 12;\r\n\r\n // Format to single digit (no padding for hours in 12-hour format)\r\n event.target.value = value.toString();\r\n\r\n // Update the value\r\n if (isSingle) {\r\n this.selectedHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n } else if (isStart) {\r\n this.startHour = value;\r\n if (this.startDate) {\r\n let h = value;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endHour = value;\r\n if (this.endDate) {\r\n let h = value;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n\r\n onMinuteInput(event: any, isStart = true, isSingle = false): void {\r\n const inputValue = event.target.value;\r\n const key = `${isStart ? 'start' : 'end'}_${isSingle ? 'single' : 'dual'}`;\r\n\r\n // Remove any non-digit characters\r\n const digitsOnly = inputValue.replace(/\\D/g, '');\r\n\r\n // Store raw input value for display\r\n this.minuteInputValues[key] = digitsOnly;\r\n\r\n // Allow empty input while typing\r\n if (digitsOnly === '' || digitsOnly === null || digitsOnly === undefined) {\r\n return; // Don't modify the input, let user clear it\r\n }\r\n\r\n // Allow typing up to 2 digits without formatting\r\n let value = parseInt(digitsOnly) || 0;\r\n\r\n // If user types more than 2 digits, take only first 2\r\n if (digitsOnly.length > 2) {\r\n value = parseInt(digitsOnly.substring(0, 2));\r\n this.minuteInputValues[key] = digitsOnly.substring(0, 2);\r\n event.target.value = digitsOnly.substring(0, 2);\r\n }\r\n\r\n // If value exceeds 59, clamp it to 59\r\n if (value > 59) {\r\n value = 59;\r\n this.minuteInputValues[key] = '59';\r\n event.target.value = '59';\r\n }\r\n\r\n // Update the internal value silently (don't emit during typing to avoid re-rendering)\r\n if (isSingle) {\r\n this.selectedMinute = value;\r\n } else if (isStart) {\r\n this.startMinute = value;\r\n } else {\r\n this.endMinute = value;\r\n }\r\n\r\n // Don't update dates or emit during typing - wait for blur or apply\r\n }\r\n\r\n onMinuteBlur(event: any, isStart = true, isSingle = false): void {\r\n const key = `${isStart ? 'start' : 'end'}_${isSingle ? 'single' : 'dual'}`;\r\n const inputValue = event.target.value;\r\n\r\n if (inputValue === '' || inputValue === null || inputValue === undefined) {\r\n // If empty, set to current value\r\n const currentValue = isSingle ? this.selectedMinute : (isStart ? this.startMinute : this.endMinute);\r\n event.target.value = currentValue.toString().padStart(2, '0');\r\n delete this.minuteInputValues[key];\r\n return;\r\n }\r\n\r\n const digitsOnly = inputValue.replace(/\\D/g, '');\r\n let value = parseInt(digitsOnly) || 0;\r\n if (value < 0) value = 0;\r\n if (value > 59) value = 59;\r\n\r\n // Format to 2 digits on blur (01-09 becomes 01-09, 10-59 stays as is)\r\n event.target.value = value.toString().padStart(2, '0');\r\n delete this.minuteInputValues[key]; // Clear raw input, use formatted value\r\n\r\n // Update the value\r\n if (isSingle) {\r\n this.selectedMinute = value;\r\n if (this.startDate) {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.selectedMinute, this.selectedSecond);\r\n this.emitSelection();\r\n }\r\n } else if (isStart) {\r\n this.startMinute = value;\r\n if (this.startDate) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n this.startDate.setHours(h, this.startMinute, this.startSecond);\r\n this.emitSelection();\r\n }\r\n } else {\r\n this.endMinute = value;\r\n if (this.endDate) {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n this.endDate.setHours(h, this.endMinute, this.endSecond);\r\n this.emitSelection();\r\n }\r\n }\r\n }\r\n\r\n // Get display value for hour (always 12-hour format)\r\n getDisplayHour(hour: number): number {\r\n if (hour === 0) return 12;\r\n if (hour > 12) return hour - 12;\r\n return hour;\r\n }\r\n\r\n // Get display value for minute (formatted only when not actively typing)\r\n getMinuteDisplayValue(isStart: boolean, isSingle: boolean): string {\r\n const key = `${isStart ? 'start' : 'end'}_${isSingle ? 'single' : 'dual'}`;\r\n // If user is typing (has raw input), show that, otherwise show formatted value\r\n if (this.minuteInputValues[key] !== undefined) {\r\n return this.minuteInputValues[key];\r\n }\r\n // Otherwise return formatted value\r\n const value = isSingle ? this.selectedMinute : (isStart ? this.startMinute : this.endMinute);\r\n return value.toString().padStart(2, '0');\r\n }\r\n\r\n // Helper method to apply time picker values to a date\r\n applyTimeToDate(date: Date, isStart: boolean): void {\r\n if (this.dualCalendar) {\r\n if (isStart) {\r\n let h = this.startHour;\r\n if (this.startAMPM === 'PM' && h < 12) h += 12;\r\n if (this.startAMPM === 'AM' && h === 12) h = 0;\r\n date.setHours(h, this.startMinute, this.startSecond);\r\n } else {\r\n let h = this.endHour;\r\n if (this.endAMPM === 'PM' && h < 12) h += 12;\r\n if (this.endAMPM === 'AM' && h === 12) h = 0;\r\n date.setHours(h, this.endMinute, this.endSecond);\r\n }\r\n } else {\r\n let h = this.selectedHour;\r\n if (this.selectedAMPM === 'PM' && h < 12) h += 12;\r\n if (this.selectedAMPM === 'AM' && h === 12) h = 0;\r\n date.setHours(h, this.selectedMinute, this.selectedSecond);\r\n }\r\n }\r\n\r\n // Select all text on focus for easy replacement\r\n onTimeInputFocus(event: any): void {\r\n event.target.select();\r\n }\r\n\r\n // Format all minute inputs to 2 digits (called before Apply)\r\n formatAllMinuteInputs(): void {\r\n // Format minute inputs in the DOM - find all minute inputs and format single digits\r\n const inputs = document.querySelectorAll('.time-input');\r\n inputs.forEach((input: any) => {\r\n const value = parseInt(input.value);\r\n // If it's a valid minute value (0-59) and not already formatted (single digit or 2 digits without leading zero)\r\n if (!isNaN(value) && value >= 0 && value <= 59) {\r\n // Format if it's a single digit (1-9) or if it's 2 digits but the first is not 0\r\n if (input.value.length === 1 || (input.value.length === 2 && !input.value.startsWith('0') && value < 10)) {\r\n input.value = value.toString().padStart(2, '0');\r\n }\r\n }\r\n });\r\n }\r\n\r\n formatDateToString(date: Date): string {\r\n const yyyy = date.getFullYear();\r\n const mm = (date.getMonth() + 1).toString().padStart(2, '0'); // month is 0-based\r\n const dd = date.getDate().toString().padStart(2, '0');\r\n return `${yyyy}-${mm}-${dd}`;\r\n }\r\n}\r\n","<div class=\"calendar-container relative\" [class.open]=\"show\" [class.inline-mode]=\"inline\">\r\n <!-- Input field -->\r\n <div class=\"input-wrapper\" *ngIf=\"!inline\">\r\n <input\r\n type=\"text\"\r\n (click)=\"toggle()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n class=\"calendar-input\">\r\n <!-- *ngIf=\"!getDisplayValue()\" -->\r\n\r\n <span class=\"calendar-icon\" >\r\n <img alt=\"calendar\" class=\"calendar-icon-img\" [src]='brickclayIcons.calenderIcon'/>\r\n </span>\r\n <button class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">×</button>\r\n </div>\r\n\r\n <!-- Calendar Popup / Inline -->\r\n <div class=\"calendar-popup\"\r\n [class.inline-calendar]=\"inline\"\r\n [ngClass]=\"{\r\n 'position-right': !inline && opens === 'right',\r\n 'position-center': !inline && opens === 'center',\r\n 'drop-up': !inline && drop === 'up',\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar\r\n }\"\r\n *ngIf=\"inline || show\">\r\n\r\n <!-- RANGES -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges\">\r\n <button\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n [disabled]=\"rangeKey === 'Custom Range'\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges ? 'w-100 flex-grow-1' : ''\">\r\n\r\n\r\n <!-- SINGLE CALENDAR -->\r\n <div *ngIf=\"!dualCalendar\" class=\"calendar-wrapper\">\r\n <div class=\"header\">\r\n <!-- <button (click)=\"prevMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img src=\"assets/calender/pagination-left-gray.svg\" alt=\"arrow-left\" class=\"arrow-left\">\r\n </button> -->\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"prevMonth()\" matTooltip=\"Prev month\"\r\n >\r\n <img alt=\"prev\" class=\"h-3 w-3\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">{{ getMonthName(month) }} {{ year }}</span>\r\n <!-- <button (click)=\"nextMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img src=\"assets/calender/pagination-right-gray.svg\" alt=\"arrow-right\" class=\"arrow-right\">\r\n </button> -->\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"nextMonth()\" matTooltip=\"Next month\"\r\n >\r\n <img alt=\"next\" class=\"h-3 w-3\" [src]='brickclayIcons.arrowRight'/>\r\n <!--<img src=\"assets/calender/pagination-right-gray.svg\" alt=\"next\" class=\"h-3 w-3\" /> -->\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let d of ['Mo','Tu','We','Th','Fr','Sa','Su']\" class=\"weekday-header\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && selectDate(dayObj.day)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(year, month, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(year, month, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(year, month, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(year, month, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(year, month, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- Single Calendar Time Picker -->\r\n <div *ngIf=\"enableTimepicker\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"single-time\"\r\n [label]=\"''\"\r\n [value]=\"getSingleTimePickerDisplay()\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\r\n (timeChange)=\"onSingleTimePickerChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DUAL CALENDAR -->\r\n <div class=\"dual-calendar\" *ngIf=\"dualCalendar\">\r\n <!-- LEFT CALENDAR -->\r\n <div class=\"calendar-left\">\r\n <div class=\"header\">\r\n <button (click)=\"prevLeftMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">{{ getMonthName(leftMonth) }} {{ leftYear }}</span>\r\n <button (click)=\"nextLeftMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n </div>\r\n <table class=\"calendar-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let d of ['Mo','Tu','We','Th','Fr','Sa','Su']\" class=\"weekday-header\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && selectDate(dayObj.day, false)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(leftYear, leftMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(leftYear, leftMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(leftYear, leftMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(leftYear, leftMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(leftYear, leftMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- Start Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Start Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-start\"\r\n [label]=\"''\"\r\n [value]=\"getDualTimePickerDisplay(true)\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\r\n (timeChange)=\"onDualTimePickerChange($event, true)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT CALENDAR -->\r\n <div class=\"calendar-right\">\r\n <div class=\"header\">\r\n <button (click)=\"prevRightMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">{{ getMonthName(rightMonth) }} {{ rightYear }}</span>\r\n <button (click)=\"nextRightMonth()\" class=\"nav-btn\" type=\"button\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n </div>\r\n <table class=\"calendar-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let d of ['Mo','Tu','We','Th','Fr','Sa','Su']\" class=\"weekday-header\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && selectDate(dayObj.day, true)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && onDateHover(dayObj.day, true)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(rightYear, rightMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(rightYear, rightMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(rightYear, rightMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(rightYear, rightMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(rightYear, rightMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- End Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">End Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-end\"\r\n [label]=\"''\"\r\n [value]=\"getDualTimePickerDisplay(false)\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\r\n (timeChange)=\"onDualTimePickerChange($event, false)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER -->\r\n <div class=\"footer\" *ngIf=\"!inline\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkCustomCalendar, CalendarSelection } from '../custom-calendar/custom-calendar.component';\r\nimport { BkTimePicker } from '../time-picker/time-picker.component';\r\n\r\nexport interface TimeConfiguration {\r\n date: Date;\r\n allDay: boolean;\r\n startTime: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\r\n endTime: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\r\n}\r\n\r\nexport interface ScheduledDateSelection {\r\n mode: 'single' | 'multiple' | 'range';\r\n singleDate?: {\r\n startDate: Date;\r\n endDate: Date;\r\n allDay: boolean;\r\n startTime: string;\r\n endTime: string;\r\n };\r\n multipleDates?: TimeConfiguration[];\r\n dateRange?: {\r\n startDate: Date;\r\n endDate: Date;\r\n allDay: boolean;\r\n startTime: string;\r\n endTime: string;\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'bk-scheduled-date-picker',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BkCustomCalendar, BkTimePicker],\r\n templateUrl: './scheduled-date-picker.component.html',\r\n styleUrls: ['./scheduled-date-picker.component.css']\r\n})\r\nexport class BkScheduledDatePicker implements OnInit {\r\n @Input() timeFormat: 12 | 24 = 12;\r\n @Input() enableSeconds = false;\r\n\r\n @Output() scheduled = new EventEmitter<ScheduledDateSelection>();\r\n @Output() cleared = new EventEmitter<void>();\r\n\r\n activeTab: 'single' | 'multiple' | 'range' = 'single';\r\n openTimePickerId: string | null = null; // Track which time picker is currently open\r\n closePickerCounter: { [key: string]: number } = {}; // Track close signals for each picker\r\n\r\n // Single Date\r\n singleDate: Date | null = null;\r\n singleAllDay = false;\r\n singleStartTime = '1:00 AM';\r\n singleEndTime = '2:00 AM';\r\n\r\n // Multiple Dates\r\n multipleDates: TimeConfiguration[] = [];\r\n\r\n // Date Range\r\n rangeStartDate: Date | null = null;\r\n rangeEndDate: Date | null = null;\r\n rangeAllDay = false;\r\n rangeStartTime = '1:00 AM';\r\n rangeEndTime = '2:00 AM';\r\n\r\n ngOnInit() {\r\n // Initialize with default time if needed\r\n }\r\n\r\n onTabChange(tab: 'single' | 'multiple' | 'range') {\r\n this.activeTab = tab;\r\n this.openTimePickerId = null; // Close any open pickers when switching tabs\r\n }\r\n\r\n onTimePickerOpened(pickerId: string) {\r\n // Close all other pickers when one opens\r\n if (this.openTimePickerId && this.openTimePickerId !== pickerId) {\r\n // Increment close counter for the previously open picker\r\n if (!this.closePickerCounter[this.openTimePickerId]) {\r\n this.closePickerCounter[this.openTimePickerId] = 0;\r\n }\r\n this.closePickerCounter[this.openTimePickerId]++;\r\n }\r\n this.openTimePickerId = pickerId;\r\n }\r\n\r\n onTimePickerClosed(pickerId: string) {\r\n // Reset open picker ID if this was the open one\r\n if (this.openTimePickerId === pickerId) {\r\n this.openTimePickerId = null;\r\n }\r\n }\r\n\r\n shouldClosePicker(pickerId: string): number {\r\n // Return the counter value for this picker (triggers change detection)\r\n return this.closePickerCounter[pickerId] || 0;\r\n }\r\n\r\n // Single Date Handlers\r\n onSingleDateSelected(event: CalendarSelection) {\r\n if (event.startDate) {\r\n this.singleDate = new Date(event.startDate);\r\n // Initialize time if not all day\r\n if (!this.singleAllDay) {\r\n this.updateSingleDateTimes();\r\n }\r\n this.emitScheduled();\r\n } else {\r\n this.singleDate = null;\r\n }\r\n }\r\n\r\n onSingleAllDayChange() {\r\n this.singleAllDay = !this.singleAllDay;\r\n if (this.singleDate) {\r\n this.updateSingleDateTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onSingleStartTimeChange(time: string) {\r\n this.singleStartTime = time;\r\n if (this.singleDate) {\r\n this.updateSingleDateTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onSingleEndTimeChange(time: string) {\r\n this.singleEndTime = time;\r\n if (this.singleDate) {\r\n this.updateSingleDateTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n updateSingleDateTimes() {\r\n if (!this.singleDate) return;\r\n if (this.singleAllDay) {\r\n this.singleDate.setHours(0, 0, 0, 0);\r\n } else {\r\n const startTime = this.parseTimeString(this.singleStartTime);\r\n const endTime = this.parseTimeString(this.singleEndTime);\r\n this.singleDate.setHours(startTime.hours, startTime.minutes, 0, 0);\r\n }\r\n }\r\n\r\n // Multiple Dates Handlers\r\n onMultipleDatesSelected(event: CalendarSelection) {\r\n if (event.selectedDates && event.selectedDates.length > 0) {\r\n const newDates: TimeConfiguration[] = [];\r\n\r\n event.selectedDates.forEach(date => {\r\n // const dateStr = this.getDateString(date);\r\n const dateStr = date;\r\n const existing = this.multipleDates.find(d => this.getDateString(d.date) === dateStr);\r\n\r\n if (existing) {\r\n newDates.push(existing);\r\n } else {\r\n // Create new time configuration for this date\r\n newDates.push({\r\n date: new Date(date),\r\n allDay: false,\r\n startTime: '1:00 AM',\r\n endTime: '2:00 AM'\r\n });\r\n }\r\n });\r\n\r\n this.multipleDates = newDates;\r\n this.emitScheduled();\r\n } else {\r\n this.multipleDates = [];\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onMultipleDateAllDayChange(index: number) {\r\n if (this.multipleDates[index]) {\r\n this.multipleDates[index].allDay = !this.multipleDates[index].allDay;\r\n if (this.multipleDates[index].allDay) {\r\n this.multipleDates[index].date.setHours(0, 0, 0, 0);\r\n } else {\r\n const time = this.parseTimeString(this.multipleDates[index].startTime);\r\n this.multipleDates[index].date.setHours(time.hours, time.minutes, 0, 0);\r\n }\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onMultipleDateStartTimeChange(index: number, time: string) {\r\n if (this.multipleDates[index]) {\r\n this.multipleDates[index].startTime = time;\r\n if (!this.multipleDates[index].allDay) {\r\n const parsed = this.parseTimeString(time);\r\n this.multipleDates[index].date.setHours(parsed.hours, parsed.minutes, 0, 0);\r\n }\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onMultipleDateEndTimeChange(index: number, time: string) {\r\n if (this.multipleDates[index]) {\r\n this.multipleDates[index].endTime = time;\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n // Date Range Handlers\r\n onRangeSelected(event: CalendarSelection) {\r\n if (event.startDate && event.endDate) {\r\n this.rangeStartDate = new Date(event.startDate);\r\n this.rangeEndDate = new Date(event.endDate);\r\n if (!this.rangeAllDay) {\r\n this.updateRangeTimes();\r\n }\r\n this.emitScheduled();\r\n } else {\r\n this.rangeStartDate = null;\r\n this.rangeEndDate = null;\r\n }\r\n }\r\n\r\n onRangeAllDayChange() {\r\n this.rangeAllDay = !this.rangeAllDay;\r\n if (this.rangeStartDate && this.rangeEndDate) {\r\n this.updateRangeTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onRangeStartTimeChange(time: string) {\r\n this.rangeStartTime = time;\r\n if (this.rangeStartDate && !this.rangeAllDay) {\r\n this.updateRangeTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n onRangeEndTimeChange(time: string) {\r\n this.rangeEndTime = time;\r\n if (this.rangeEndDate && !this.rangeAllDay) {\r\n this.updateRangeTimes();\r\n this.emitScheduled();\r\n }\r\n }\r\n\r\n updateRangeTimes() {\r\n if (!this.rangeStartDate || !this.rangeEndDate) return;\r\n\r\n if (this.rangeAllDay) {\r\n this.rangeStartDate.setHours(0, 0, 0, 0);\r\n this.rangeEndDate.setHours(23, 59, 59, 999);\r\n } else {\r\n const startTime = this.parseTimeString(this.rangeStartTime);\r\n const endTime = this.parseTimeString(this.rangeEndTime);\r\n this.rangeStartDate.setHours(startTime.hours, startTime.minutes, 0, 0);\r\n this.rangeEndDate.setHours(endTime.hours, endTime.minutes, 0, 0);\r\n }\r\n }\r\n\r\n // Utility Methods\r\n parseTimeString(timeStr: string): { hours: number; minutes: number } {\r\n // Parse time string like \"7:01 AM\" or \"19:01\"\r\n const parts = timeStr.split(' ');\r\n let timePart = parts[0];\r\n const ampm = parts[1];\r\n\r\n const [hoursStr, minutesStr] = timePart.split(':');\r\n let hours = parseInt(hoursStr, 10);\r\n const minutes = parseInt(minutesStr || '0', 10);\r\n\r\n if (ampm) {\r\n if (ampm.toUpperCase() === 'PM' && hours !== 12) {\r\n hours += 12;\r\n } else if (ampm.toUpperCase() === 'AM' && hours === 12) {\r\n hours = 0;\r\n }\r\n }\r\n\r\n return { hours, minutes };\r\n }\r\n\r\n getDateString(date: Date): string {\r\n return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\r\n }\r\n\r\n formatDate(date: Date): string {\r\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n return `${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;\r\n }\r\n\r\n emitScheduled() {\r\n const selection: ScheduledDateSelection = {\r\n mode: this.activeTab\r\n };\r\n\r\n if (this.activeTab === 'single' && this.singleDate) {\r\n // For single date, create startDate and endDate with same date but different times\r\n const startDate = new Date(this.singleDate);\r\n const endDate = new Date(this.singleDate);\r\n\r\n if (!this.singleAllDay) {\r\n const startTime = this.parseTimeString(this.singleStartTime);\r\n const endTime = this.parseTimeString(this.singleEndTime);\r\n startDate.setHours(startTime.hours, startTime.minutes, 0, 0);\r\n endDate.setHours(endTime.hours, endTime.minutes, 0, 0);\r\n } else {\r\n startDate.setHours(0, 0, 0, 0);\r\n endDate.setHours(23, 59, 59, 999);\r\n }\r\n\r\n selection.singleDate = {\r\n startDate: startDate,\r\n endDate: endDate,\r\n allDay: this.singleAllDay,\r\n startTime: this.singleStartTime,\r\n endTime: this.singleEndTime\r\n };\r\n } else if (this.activeTab === 'multiple') {\r\n selection.multipleDates = this.multipleDates.map(d => ({\r\n date: new Date(d.date),\r\n allDay: d.allDay,\r\n startTime: d.startTime,\r\n endTime: d.endTime\r\n }));\r\n } else if (this.activeTab === 'range' && this.rangeStartDate && this.rangeEndDate) {\r\n selection.dateRange = {\r\n startDate: new Date(this.rangeStartDate),\r\n endDate: new Date(this.rangeEndDate),\r\n allDay: this.rangeAllDay,\r\n startTime: this.rangeStartTime,\r\n endTime: this.rangeEndTime\r\n };\r\n }\r\n\r\n this.scheduled.emit(selection);\r\n }\r\n\r\n clear() {\r\n this.singleDate = null;\r\n this.multipleDates = [];\r\n this.rangeStartDate = null;\r\n this.rangeEndDate = null;\r\n this.singleAllDay = false;\r\n this.rangeAllDay = false;\r\n this.singleStartTime = '1:00 AM';\r\n this.singleEndTime = '2:00 AM';\r\n this.rangeStartTime = '1:00 AM';\r\n this.rangeEndTime = '2:00 AM';\r\n this.cleared.emit();\r\n }\r\n\r\n apply() {\r\n this.emitScheduled();\r\n }\r\n\r\n}\r\n\r\n","<div class=\"scheduled-date-picker-container\">\r\n <!-- Header with Tabs -->\r\n\r\n\r\n <!-- Main Content Area -->\r\n\r\n <div class=\"scheduled-content\">\r\n <!-- Left Side: Calendar -->\r\n <div class=\"calendar-section\">\r\n <h2 class=\"scheduled-title\">Scheduled Dates</h2>\r\n <div class=\"tabs\">\r\n <button\r\n class=\"tab-button\"\r\n [class.active]=\"activeTab === 'single'\"\r\n (click)=\"onTabChange('single')\">\r\n Single Date\r\n </button>\r\n <button\r\n class=\"tab-button\"\r\n [class.active]=\"activeTab === 'multiple'\"\r\n (click)=\"onTabChange('multiple')\">\r\n Multiple Dates\r\n </button>\r\n <button\r\n class=\"tab-button\"\r\n [class.active]=\"activeTab === 'range'\"\r\n (click)=\"onTabChange('range')\">\r\n Date Range\r\n </button>\r\n </div>\r\n <!-- Single Date Calendar -->\r\n <div *ngIf=\"activeTab === 'single'\" class=\"calendar-wrapper-inline\">\r\n <bk-custom-calendar\r\n [inline]=\"true\"\r\n [dualCalendar]=\"false\"\r\n [singleDatePicker]=\"true\"\r\n [showRanges]=\"false\"\r\n [enableTimepicker]=\"false\"\r\n [showCancel]=\"false\"\r\n placeholder=\"Select a date\"\r\n (selected)=\"onSingleDateSelected($event)\">\r\n </bk-custom-calendar>\r\n </div>\r\n\r\n <!-- Multiple Dates Calendar -->\r\n <div *ngIf=\"activeTab === 'multiple'\" class=\"calendar-wrapper-inline\">\r\n <bk-custom-calendar\r\n [inline]=\"true\"\r\n [dualCalendar]=\"false\"\r\n [singleDatePicker]=\"false\"\r\n [showRanges]=\"false\"\r\n [enableTimepicker]=\"false\"\r\n [multiDateSelection]=\"true\"\r\n [showCancel]=\"false\"\r\n placeholder=\"Select multiple dates\"\r\n (selected)=\"onMultipleDatesSelected($event)\">\r\n </bk-custom-calendar>\r\n </div>\r\n\r\n <!-- Date Range Calendar -->\r\n <div *ngIf=\"activeTab === 'range'\" class=\"calendar-wrapper-inline\">\r\n <bk-custom-calendar\r\n [inline]=\"true\"\r\n [dualCalendar]=\"false\"\r\n [singleDatePicker]=\"false\"\r\n [showRanges]=\"false\"\r\n [enableTimepicker]=\"false\"\r\n [showCancel]=\"false\"\r\n placeholder=\"Select date range\"\r\n (selected)=\"onRangeSelected($event)\">\r\n </bk-custom-calendar>\r\n </div>\r\n </div>\r\n\r\n <!-- Right Side: Time Configuration -->\r\n <div class=\"time-config-section\">\r\n <h3 class=\"time-config-title\">Time Configuration</h3>\r\n\r\n <!-- Single Date Time Configuration -->\r\n <div *ngIf=\"activeTab === 'single'\">\r\n <div *ngIf=\"singleDate\" class=\"time-config-item\">\r\n <div class=\"time-config-header\">\r\n <span class=\"date-label\">{{ formatDate(singleDate) }}</span>\r\n <label class=\"all-day-toggle\">\r\n <span class=\"toggle-label\">All Day</span>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"singleAllDay\"\r\n (change)=\"onSingleAllDayChange()\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"!singleAllDay\" class=\"time-inputs\">\r\n <bk-time-picker\r\n pickerId=\"single-start\"\r\n label=\"Start Time\"\r\n [value]=\"singleStartTime\"\r\n [position]=\"'left'\"\r\n [closePicker]=\"shouldClosePicker('single-start')\"\r\n (timeChange)=\"onSingleStartTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n <bk-time-picker\r\n pickerId=\"single-end\"\r\n label=\"End Time\"\r\n [value]=\"singleEndTime\"\r\n [position]=\"'right'\"\r\n [closePicker]=\"shouldClosePicker('single-end')\"\r\n (timeChange)=\"onSingleEndTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!singleDate\" class=\"no-selection\">\r\n <p>No date selected. Select a date from the calendar.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Multiple Dates Time Configuration -->\r\n <div *ngIf=\"activeTab === 'multiple'\" class=\"time-config-list\">\r\n <div\r\n *ngFor=\"let dateConfig of multipleDates; let i = index\"\r\n class=\"time-config-item\">\r\n <div class=\"time-config-header\">\r\n <span class=\"date-label\">{{ formatDate(dateConfig.date) }}</span>\r\n <label class=\"all-day-toggle\">\r\n <span class=\"toggle-label\">All Day</span>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"dateConfig.allDay\"\r\n (change)=\"onMultipleDateAllDayChange(i)\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"!dateConfig.allDay\" class=\"time-inputs\">\r\n <bk-time-picker\r\n [pickerId]=\"'multiple-' + i + '-start'\"\r\n label=\"Start Time\"\r\n [value]=\"dateConfig.startTime\"\r\n [position]=\"'left'\"\r\n [closePicker]=\"shouldClosePicker('multiple-' + i + '-start')\"\r\n (timeChange)=\"onMultipleDateStartTimeChange(i, $event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n <bk-time-picker\r\n [pickerId]=\"'multiple-' + i + '-end'\"\r\n label=\"End Time\"\r\n [value]=\"dateConfig.endTime\"\r\n [position]=\"'right'\"\r\n [closePicker]=\"shouldClosePicker('multiple-' + i + '-end')\"\r\n (timeChange)=\"onMultipleDateEndTimeChange(i, $event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n <div *ngIf=\"multipleDates.length === 0\" class=\"no-selection\">\r\n <p>No dates selected. Select dates from the calendar.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Date Range Time Configuration -->\r\n <div *ngIf=\"activeTab === 'range' && rangeStartDate && rangeEndDate\" class=\"time-config-item\">\r\n <div class=\"time-config-header\">\r\n <span class=\"date-label\">{{ formatDate(rangeStartDate) }} - {{ formatDate(rangeEndDate) }}</span>\r\n <label class=\"all-day-toggle\">\r\n <span class=\"toggle-label\">All Day</span>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"rangeAllDay\"\r\n (change)=\"onRangeAllDayChange()\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"!rangeAllDay\" class=\"time-inputs\">\r\n <bk-time-picker\r\n pickerId=\"range-start\"\r\n label=\"Start Time\"\r\n [value]=\"rangeStartTime\"\r\n [position]=\"'left'\"\r\n [closePicker]=\"shouldClosePicker('range-start')\"\r\n (timeChange)=\"onRangeStartTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n <bk-time-picker\r\n pickerId=\"range-end\"\r\n label=\"End Time\"\r\n [value]=\"rangeEndTime\"\r\n [position]=\"'right'\"\r\n [closePicker]=\"shouldClosePicker('range-end')\"\r\n (timeChange)=\"onRangeEndTimeChange($event)\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n <div *ngIf=\"activeTab === 'range' && (!rangeStartDate || !rangeEndDate)\" class=\"no-selection\">\r\n <p>No date range selected. Select a date range from the calendar.</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"action-buttons\">\r\n <button class=\"btn-clear\" (click)=\"clear()\">Clear</button>\r\n <button class=\"btn-apply\" (click)=\"apply()\">Apply</button>\r\n </div>\r\n</div>\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BkCustomCalendar } from './components/custom-calendar/custom-calendar.component';\r\nimport { BkScheduledDatePicker } from './components/scheduled-date-picker/scheduled-date-picker.component';\r\nimport { BkTimePicker } from './components/time-picker/time-picker.component';\r\n\r\n\r\n\r\n/**\r\n * Optional NgModule wrapper for projects that prefer module-based usage.\r\n *\r\n * Note:\r\n * - The components themselves are standalone, so you can also import them\r\n * directly into any standalone component without using this module.\r\n * - This module is mainly for:\r\n * - Existing apps that still use feature modules\r\n * - Easier \"plug-and-play\" integration: import CalendarModule once and use\r\n * the three exported components anywhere in your templates.\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n BkCustomCalendar,\r\n BkScheduledDatePicker,\r\n BkTimePicker\r\n ],\r\n exports: [\r\n BkCustomCalendar,\r\n BkScheduledDatePicker,\r\n BkTimePicker\r\n ]\r\n})\r\nexport class CalendarModule {}\r\n\r\n\r\n","import { Component, Input, Output, EventEmitter, forwardRef, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-toggle',\r\n standalone: true,\r\n imports: [CommonModule],\r\n encapsulation:ViewEncapsulation.None,\r\n templateUrl: './toggle.html',\r\n styleUrls: ['./toggle.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkToggle),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkToggle implements ControlValueAccessor {\r\n\r\n @Input() label: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() toggleClass: string = 'toggle-md';\r\n\r\n @Output() change = new EventEmitter<boolean>();\r\n\r\n isChecked: boolean = false;\r\n\r\n // CVA callbacks (placeholders)\r\n onChange = (_: boolean) => {};\r\n onTouched = () => {};\r\n\r\n toggle() {\r\n if (this.disabled) return;\r\n\r\n this.isChecked = !this.isChecked;\r\n this.onChange(this.isChecked); // Notify Forms API\r\n this.onTouched(); // Notify Validation API\r\n this.change.emit(this.isChecked); // Notify standard event listeners\r\n }\r\n\r\n // Called by Angular to write value to the view\r\n writeValue(value: boolean): void {\r\n this.isChecked = value;\r\n }\r\n\r\n // Called by Angular to register the function to call when changed\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Called by Angular to register the function to call when touched\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n // Called by Angular when the disabled state changes\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n}\r\n","<div class=\"inline-flex items-center gap-2 cursor-pointer\" (click)=\"toggle()\">\r\n <button\r\n type=\"button\"\r\n role=\"switch\"\r\n [attr.aria-checked]=\"isChecked\"\r\n [disabled]=\"disabled\"\r\n class=\"toggle-base\"\r\n [ngClass]=\"toggleClass\"\r\n [class.toggle-on]=\"isChecked\"\r\n [class.toggle-off]=\"!isChecked\"\r\n [class.toggle-disabled]=\"disabled\"\r\n >\r\n <span\r\n class=\"toggle-knob\"\r\n [class.knob-on]=\"isChecked\"\r\n [class.knob-off]=\"!isChecked\"\r\n ></span>\r\n </button>\r\n @if (label){\r\n <span class=\"text-sm font-medium text-[#1B223A] select-none\" [class.opacity-70]=\"disabled\">\r\n {{ label }}\r\n </span>\r\n }\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, forwardRef, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './checkbox.html',\r\n styleUrls: ['./checkbox.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkCheckbox),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkCheckbox implements ControlValueAccessor {\r\n\r\n @Input() checkboxClass: string = '';\r\n @Input() label: string = '';\r\n @Input() labelClass: string = '';\r\n @Input() disabled: boolean = false;\r\n\r\n @Output() change = new EventEmitter<boolean>();\r\n\r\n // This is the value bound via ngModel\r\n isChecked: boolean = false;\r\n\r\n // ControlValueAccessor callbacks\r\n private onChange = (_: any) => {};\r\n private onTouched = () => {};\r\n\r\n // Toggle function for click / keyboard\r\n toggle() {\r\n if (this.disabled) return;\r\n\r\n this.isChecked = !this.isChecked;\r\n\r\n // Update ngModel value\r\n this.onChange(this.isChecked);\r\n this.onTouched();\r\n\r\n // Emit the change event\r\n this.change.emit(this.isChecked);\r\n }\r\n\r\n /** ------------------ ControlValueAccessor methods ------------------ */\r\n\r\n writeValue(value: boolean): void {\r\n this.isChecked = value ?? false; // handle null/undefined safely\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n}\r\n","<div\r\n class=\"inline-flex items-center gap-2 cursor-pointer group outline-none\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n tabindex=\"0\"\r\n [attr.aria-disabled]=\"disabled\">\r\n <div\r\n class=\"relative flex items-center justify-center border-2 transition-all duration-200 ease-in-out rounded group-focus-visible:ring-2 group-focus-visible:ring-blue-600 group-focus-visible:ring-offset-2 checkbox\"\r\n [ngClass]=\"[\r\n checkboxClass,\r\n isChecked && !disabled ? 'bg-black border-black' : '',\r\n !isChecked && !disabled ? 'bg-white border-gray-300 group-hover:border-gray-400' : '',\r\n disabled && isChecked ? 'bg-gray-300 border-gray-300' : '',\r\n disabled && !isChecked ? 'bg-gray-100 border-gray-200' : '',\r\n disabled ? 'cursor-not-allowed' : ''\r\n ]\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n class=\"text-white pointer-events-none transition-opacity duration-200\"\r\n [class.opacity-0]=\"!isChecked\"\r\n [class.opacity-100]=\"isChecked\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </div>\r\n@if(label){\r\n <span\r\n [ngClass]=\"disabled ? 'text-gray-400' : ''\"\r\n class=\"font-medium text-xs text-[#1B223A] select-none {{labelClass}}\"\r\n >\r\n {{ label }}\r\n </span>\r\n}\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n forwardRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\n@Component({\r\n selector: 'bk-radio-button',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './radio.html',\r\n styleUrl: './radio.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkRadioButton),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkRadioButton implements ControlValueAccessor {\r\n\r\n @Input() radioClass = '';\r\n @Input() label = '';\r\n @Input() labelClass = '';\r\n @Input() value: any;\r\n @Input() disabled = false;\r\n @Input() variant: 'dot' | 'tick' = 'dot';\r\n\r\n @Output() change = new EventEmitter<any>();\r\n\r\n modelValue: any;\r\n\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n\r\n select(): void {\r\n if (this.disabled) return;\r\n\r\n if (this.modelValue !== this.value) {\r\n this.modelValue = this.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.change.emit(this.value);\r\n }\r\n }\r\n\r\n get isChecked(): boolean {\r\n return this.modelValue === this.value;\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.modelValue = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n}\r\n","<div\r\n class=\"inline-flex items-center gap-2 cursor-pointer group outline-none\"\r\n (click)=\"select()\"\r\n (keydown.enter)=\"select()\"\r\n (keydown.space)=\"$event.preventDefault(); select()\"\r\n tabindex=\"0\"\r\n [attr.aria-disabled]=\"disabled\">\r\n\r\n <div\r\n class=\"relative flex items-center justify-center rounded-full border-2 transition-all duration-200 flex-shrink-0 group-focus-visible:ring-2 group-focus-visible:ring-blue-600 group-focus-visible:ring-offset-2 radio\"\r\n [ngClass]=\"[\r\n radioClass,\r\n !isChecked && !disabled ? 'bg-white border-gray-300 group-hover:border-gray-400' : '',\r\n\r\n variant === 'dot' && isChecked && !disabled ? 'border-black bg-white' : '',\r\n\r\n variant === 'tick' && isChecked && !disabled ? 'bg-black border-black' : '',\r\n\r\n disabled && isChecked && variant === 'tick' ? 'bg-gray-300 border-gray-300' : '',\r\n disabled && isChecked && variant === 'dot' ? 'border-gray-300 bg-gray-50' : '',\r\n disabled && !isChecked ? 'bg-gray-100 border-gray-200' : '',\r\n disabled ? 'cursor-not-allowed' : ''\r\n ]\"\r\n >\r\n@if(variant === 'dot'){\r\n <span\r\n class=\"rounded-full bg-black transition-transform duration-200 transform dot\"\r\n [class.scale-0]=\"!isChecked\"\r\n [class.scale-100]=\"isChecked\"\r\n [class.bg-gray-400]=\"disabled\"\r\n ></span>\r\n}\r\n @if (variant === 'tick'){\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n class=\"text-white pointer-events-none transition-opacity duration-200 tick\"\r\n [class.opacity-0]=\"!isChecked\"\r\n [class.opacity-100]=\"isChecked\"\r\n\r\n >\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n }\r\n </div>\r\n\r\n @if(label) {\r\n <span class=\"font-medium text-xs text-[#1B223A] select-none {{labelClass}}\"\r\n [ngClass]=\"disabled ? 'text-gray-400' : ''\">\r\n {{ label }}\r\n </span>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nexport type PillVariant = 'Light' | 'Solid' | 'Outline' | 'Transparent';\r\nexport type PillColor = 'Gray' | 'Primary' | 'Error' | 'Warning' | 'Success' | 'Purple' | 'Cyan';\r\nexport type PillSize = 'xsm' |'sm' | 'md' | 'lg';\r\n@Component({\r\n selector: 'bk-pill',\r\n standalone: true,\r\n templateUrl: './pill.html',\r\n styleUrl: './pill.css',\r\n})\r\nexport class BkPill {\r\n @Input() label: string = '';\r\n @Input() variant: PillVariant = 'Light';\r\n @Input() color: PillColor = 'Gray';\r\n @Input() size: PillSize = 'md';\r\n @Input() dot: 'left' | 'right' | 'none' = 'none';\r\n @Input() removable: boolean = false;\r\n @Input() customClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<string>();\r\n\r\n get containerClasses(): string {\r\n // 1. Size Class\r\n const sizeClass = `pill-${this.size}`;\r\n\r\n // 2. Color/Variant Class (Dynamic Generation)\r\n const styleClass = `${this.color}-${this.variant}`;\r\n\r\n // 3. customClasses\r\n const customClass = `${this.customClass}`;\r\n\r\n return `pill ${sizeClass} ${styleClass} ${customClass}`;\r\n }\r\n\r\n onRemove(e: Event) {\r\n e.stopPropagation();\r\n this.clicked.emit(this.label);\r\n }\r\n}\r\n","<span [className]=\"containerClasses\">\r\n\r\n @if (dot === 'left') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n <span>{{ label }}</span>\r\n\r\n @if (dot === 'right') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n @if (removable) {\r\n <button\r\n (click)=\"onRemove($event)\"\r\n class=\"pill-close \"> <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n</button>\r\n }\r\n</span>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type BadgeVariant = 'Light' | 'Solid' | 'Outline' | 'Transparent';\r\nexport type BadgeColor = 'Gray' | 'Primary' | 'Error' | 'Warning' | 'Success' | 'Purple' | 'Cyan';\r\nexport type BadgeSize = 'xsm' |'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'bk-badge',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './badge.html',\r\n styleUrls: ['./badge.css'],\r\n})\r\nexport class BkBadge {\r\n @Input() label: string = '';\r\n @Input() variant: BadgeVariant = 'Light';\r\n @Input() color: BadgeColor = 'Gray';\r\n @Input() size: BadgeSize = 'md';\r\n @Input() dot: 'left' | 'right' | 'none' = 'none';\r\n @Input() removable: boolean = false;\r\n @Input() customClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<string>();\r\n\r\n get containerClasses(): string {\r\n // 1. Size Class\r\n const sizeClass = `badge-${this.size}`;\r\n\r\n // 2. Color/Variant Class (Dynamic Generation)\r\n const styleClass = `${this.color}-${this.variant}`;\r\n\r\n // 3. customClasses\r\n const customClass = `${this.customClass}`;\r\n return `badge ${sizeClass} ${styleClass} ${customClass}`;\r\n }\r\n\r\n onRemove(e: Event) {\r\n e.stopPropagation();\r\n this.clicked.emit(this.label);\r\n }\r\n}\r\n","<span [className]=\"containerClasses\">\r\n\r\n @if (dot === 'left') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n <span>{{ label }}</span>\r\n\r\n @if (dot === 'right') {\r\n <span class=\"dot\"></span>\r\n }\r\n\r\n @if (removable) {\r\n <button\r\n (click)=\"onRemove($event)\"\r\n class=\"badge-close\"> <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n</button>\r\n }\r\n</span>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n// Mapped names to your 5 sizes\r\nexport type SpinnerSize = 'xsm' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n@Component({\r\n selector: 'bk-spinner',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './spinner.html',\r\n styleUrl: './spinner.css',\r\n})\r\nexport class BkSpinner {\r\n @Input() size: SpinnerSize = 'md';\r\n @Input() show = true;\r\n @Input() color = 'text-blue-600'; // default\r\n\r\n get classes(): string {\r\n return `spinner ${this.size} ${this.color}`;\r\n }\r\n}\r\n","@if (show) {\r\n<span [class]=\"classes\" role=\"status\" aria-label=\"loading\">\r\n <span class=\"sr-only\">Loading...</span>\r\n</span>\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type ButtonSize = 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type ButtonVariant = 'primary' | 'secondary';\r\n\r\n@Component({\r\n selector: 'bk-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ui-button.html',\r\n styleUrl: './ui-button.css',\r\n})\r\nexport class BkButton {\r\n // --- Inputs ---\r\n\r\n // 1. Style & Size Inputs\r\n @Input() variant: ButtonVariant = 'primary';\r\n @Input() size: ButtonSize = 'md';\r\n\r\n // 2. Content Inputs\r\n @Input() label: string = ''; // Pass text directly\r\n @Input() leftIcon?: string;\r\n @Input() rightIcon?: string;\r\n @Input() iconAlt: string = 'icon';\r\n\r\n // 3. State & Config\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n @Input() loading: boolean = false;\r\n @Input() disabled: boolean = false;\r\n\r\n // 4. Customization (Optional overrides)\r\n @Input() buttonClass: string = ''; // Append extra classes if needed\r\n @Input() textClass: string = '';\r\n @Input() spinnerClass: string = '';\r\n\r\n // --- Outputs ---\r\n @Output() clicked = new EventEmitter<boolean>();\r\n\r\n // --- Logic ---\r\n onClick(event: Event) {\r\n if (!this.disabled && !this.loading) {\r\n this.clicked.emit(true);\r\n }\r\n }\r\n\r\n // Generate the class string based on Inputs\r\n get buttonClasses(): string {\r\n const variantClass = this.variant === 'primary' ? 'btn-primary' : 'btn-secondary';\r\n\r\n // Combine: Variant + Size + Custom Classes\r\n // Note: The size name (e.g., 'sm') matches your CSS class name exactly\r\n return `btn ${variantClass} ${this.size} ${this.buttonClass}`;\r\n }\r\n}\r\n","<button\r\n [attr.type]=\"type\"\r\n [class]=\"buttonClasses\"\r\n [disabled]=\"disabled || loading\"\r\n (click)=\"onClick($event)\"\r\n>\r\n @if (leftIcon) {\r\n <img [src]=\"leftIcon\" [alt]=\"iconAlt\" class=\"icon shrink-0\" />\r\n }\r\n\r\n @if (label) {\r\n <span [class]=\"textClass\">\r\n {{ label }}\r\n </span>\r\n }\r\n @if (loading) {\r\n <span [class]=\"spinnerClass\" class=\"spinner\"></span>\r\n }\r\n\r\n\r\n @if (rightIcon) {\r\n <img [src]=\"rightIcon\" [alt]=\"iconAlt\" class=\"icon shrink-0\" />\r\n }\r\n\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type IconButtonSize = 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type IconButtonVariant = 'primary' | 'secondary';\r\n\r\n@Component({\r\n selector: 'bk-icon-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ui-icon-button.html',\r\n styleUrl: './ui-icon-button.css',\r\n})\r\nexport class BkIconButton {\r\n // --- Inputs ---\r\n @Input() icon!: string; // Required icon path\r\n @Input() alt: string = 'icon';\r\n @Input() variant: IconButtonVariant = 'primary';\r\n @Input() size: IconButtonSize = 'md';\r\n\r\n @Input() disabled: boolean = false;\r\n\r\n // Custom classes\r\n @Input() buttonClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<boolean>();\r\n\r\n onClick(event: Event) {\r\n if (!this.disabled) {\r\n this.clicked.emit(true);\r\n }\r\n }\r\n\r\n get buttonClasses(): string {\r\n // Maps inputs to CSS classes: .btn-icon .primary .md\r\n return `btn-icon ${this.variant} ${this.size} ${this.buttonClass}`;\r\n }\r\n}\r\n","<button\r\n [class]=\"buttonClasses\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClick($event)\"\r\n>\r\n <img [src]=\"icon\" [alt]=\"alt\" class=\"icon\" />\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface GroupItem {\r\n label: string;\r\n value: any;\r\n}\r\n\r\nexport type GroupMode = 'single' | 'multiple';\r\n\r\n@Component({\r\n selector: 'bk-button-group',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './button-group.html',\r\n styleUrl: './button-group.css',\r\n})\r\nexport class BkButtonGroup {\r\n // --- Inputs ---\r\n @Input() items: GroupItem[] = [];\r\n @Input() mode: GroupMode = 'single';\r\n @Input() disabled: boolean = false;\r\n\r\n // Holds the current selection.\r\n // For 'single', it's a single value. For 'multiple', it's an array.\r\n @Input() value: any | any[] = null;\r\n\r\n // --- Outputs ---\r\n @Output() valueChange = new EventEmitter<any>();\r\n\r\n // --- Logic ---\r\n\r\n onItemClick(itemValue: any) {\r\n if (this.disabled) return;\r\n\r\n if (this.mode === 'single') {\r\n // 1. Single Mode: Just set the value\r\n if (this.value !== itemValue) {\r\n this.value = itemValue;\r\n this.valueChange.emit(this.value);\r\n }\r\n } else {\r\n // 2. Multiple Mode: Toggle value in array\r\n let currentValues = Array.isArray(this.value) ? [...this.value] : [];\r\n\r\n if (currentValues.includes(itemValue)) {\r\n // Remove if exists\r\n currentValues = currentValues.filter(v => v !== itemValue);\r\n } else {\r\n // Add if not exists\r\n currentValues.push(itemValue);\r\n }\r\n\r\n this.value = currentValues;\r\n this.valueChange.emit(this.value);\r\n }\r\n }\r\n\r\n // Helper to check active state for UI\r\n isActive(itemValue: any): boolean {\r\n if (this.mode === 'single') {\r\n return this.value === itemValue;\r\n } else {\r\n return Array.isArray(this.value) && this.value.includes(itemValue);\r\n }\r\n }\r\n\r\n // --- Styles ---\r\n\r\n get containerClass(): string {\r\n return `group-container ${this.disabled ? 'disabled' : ''}`;\r\n }\r\n}\r\n","<div [class]=\"containerClass\">\r\n @for (item of items; track item.value) {\r\n <div\r\n class=\"group-item\"\r\n [class.active]=\"isActive(item.value)\"\r\n [class.inactive]=\"!isActive(item.value)\"\r\n (click)=\"onItemClick(item.value)\"\r\n >\r\n {{ item.label }}\r\n </div>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Optional, Output, Self } from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NgControl } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nexport type BkTextAreaAutoComplete =\r\n | 'on'\r\n | 'off'\r\n | 'name'\r\n | 'honorific-prefix'\r\n | 'given-name'\r\n | 'additional-name'\r\n | 'family-name'\r\n | 'honorific-suffix'\r\n | 'nickname'\r\n | 'email'\r\n | 'username'\r\n | 'new-password'\r\n | 'current-password'\r\n | 'organization-title'\r\n | 'organization'\r\n | 'street-address'\r\n | 'address-line1'\r\n | 'address-line2'\r\n | 'address-line3'\r\n | 'address-level4'\r\n | 'address-level3'\r\n | 'address-level2'\r\n | 'address-level1'\r\n | 'country'\r\n | 'country-name'\r\n | 'postal-code'\r\n | 'cc-name'\r\n | 'cc-given-name'\r\n | 'cc-additional-name'\r\n | 'cc-family-name'\r\n | 'cc-number'\r\n | 'cc-exp'\r\n | 'cc-exp-month'\r\n | 'cc-exp-year'\r\n | 'cc-csc'\r\n | 'cc-type'\r\n | 'transaction-currency'\r\n | 'transaction-amount'\r\n | 'language'\r\n | 'bday'\r\n | 'bday-day'\r\n | 'bday-month'\r\n | 'bday-year'\r\n | 'sex'\r\n | 'tel'\r\n | 'tel-country-code'\r\n | 'tel-national'\r\n | 'tel-area-code'\r\n | 'tel-local'\r\n | 'tel-extension'\r\n | 'impp'\r\n | 'url'\r\n | 'photo';\r\n\r\nexport type BkTextAreaAutoCapitalize =\r\n | 'off'\r\n | 'none'\r\n | 'on'\r\n | 'sentences'\r\n | 'words'\r\n | 'characters';\r\n\r\nexport type BkTextAreaInputMode =\r\n | 'none'\r\n | 'text'\r\n | 'tel'\r\n | 'url'\r\n | 'email'\r\n | 'numeric'\r\n | 'decimal'\r\n | 'search';\r\n@Component({\r\n selector: 'bk-textarea',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './textarea.html'\r\n})\r\nexport class BkTextarea implements ControlValueAccessor {\r\n @Input() autoComplete : BkTextAreaAutoComplete = 'off';\r\n @Input() name!: string;\r\n @Input() id!: string;\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() rows: number = 4;\r\n @Input() hint: string = '';\r\n @Input() required: boolean = false;\r\n @Input() maxlength: number | null = null;\r\n @Input() minlength: number | null = null;\r\n @Input() hasError: boolean | null = false;\r\n @Input() disabled: boolean = false;\r\n @Input() errorMessage: string = '';\r\n @Input() tabIndex: number | null = null;\r\n @Input() readOnly: boolean = false;\r\n @Input() autoCapitalize: BkTextAreaAutoCapitalize | null = null;\r\n @Input() inputMode: BkTextAreaInputMode | null = null;\r\n @Output() input = new EventEmitter<Event>();\r\n @Output() change = new EventEmitter<Event>();\r\n @Output() blur = new EventEmitter<Event>();\r\n @Output() focus = new EventEmitter<Event>();\r\n value: string = '';\r\n\r\n\r\n // --- ControlValueAccessor ---\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n\r\n constructor(@Optional() @Self() private ngControl: NgControl) {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n\r\n\r\n // --- Expose FormControl state ---\r\n get control(): any {\r\n return this.ngControl?.control;\r\n }\r\n\r\n get touched(): boolean {\r\n return this.control?.touched;\r\n }\r\n\r\n get dirty(): boolean {\r\n return this.control?.dirty;\r\n }\r\n\r\n get errors(): any {\r\n return this.control?.errors;\r\n }\r\n\r\n\r\n\r\n\r\n handleFocus(event: Event): void {\r\n this.focus.emit(event);\r\n }\r\n\r\n handleBlur(event:Event): void {\r\n this.onTouched();\r\n this.blur.emit(event);\r\n }\r\n handleInput(event: Event): void {\r\n const val = (event.target as HTMLInputElement).value;\r\n this.value = val; // update CVA value\r\n this.onChange(val); // propagate to parent form\r\n this.input.emit(event); // emit raw event\r\n }\r\n\r\n handleChange(event: Event) {\r\n this.change.emit(event); // emit raw change event\r\n }\r\n\r\n\r\n writeValue(value: any): void {\r\n this.value = value ?? '';\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n\r\n}\r\n","<div class=\"flex flex-col gap-1.5 w-full\">\r\n\r\n @if (label) {\r\n <label\r\n class=\"text-sm font-medium text-[#141414] block\" [for]=\"id\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"text-[#E7000B] ml-0.5\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative\">\r\n <textarea\r\n [id]=\"id\"\r\n [name]=\"name\"\r\n [disabled]=\"disabled\"\r\n [tabindex]=\"tabIndex\"\r\n [readOnly]=\"readOnly\"\r\n [attr.maxlength]=\"maxlength\"\r\n [attr.minlength]=\"minlength\"\r\n [autocomplete]=\"autoComplete\"\r\n [autocapitalize]=\"autoCapitalize\"\r\n [inputMode]=\"inputMode\"\r\n [value]=\"value\"\r\n (input)=\"handleInput($event)\"\r\n (change)=\"handleChange($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n [placeholder]=\"placeholder\"\r\n\r\n [autocomplete]=\"autoComplete\"\r\n\r\n rows=\"{{rows}}\"\r\n class=\"\r\n w-full\r\n px-3 py-2.5\r\n text-sm\r\n border border-[#E3E3E7] rounded-[4px]\r\n outline-none\r\n transition-colors duration-200\r\n bg-white resize-y\r\n placeholder:text-[#6B7080]\r\n \"\r\n [ngClass]=\"{\r\n 'border-[#FA727A] text-[#141414]': hasError && !disabled,\r\n\r\n 'focus:border-[#6B7080] text-[#141414]': !hasError && !disabled,\r\n\r\n 'bg-[#F4F4F6] text-[#A1A3AE] border-[#E3E3E7] cursor-not-allowed': disabled\r\n }\"\r\n ></textarea>\r\n </div>\r\n\r\n <div class=\"flex justify-between items-start font-normal text-sm\">\r\n\r\n <div class=\"flex-1\">\r\n @if (hasError) {\r\n <span class=\"text-[#F34050]\">\r\n {{ errorMessage }}\r\n </span>\r\n } @else if (hint) {\r\n <span class=\"text-[#868997]\">\r\n {{ hint }}\r\n </span>\r\n }\r\n </div>\r\n\r\n @if (maxlength) {\r\n <div\r\n class=\"text-[#868997] tabular-nums flex-shrink-0\"\r\n >\r\n {{ value.length }}/{{ maxlength }}\r\n </div>\r\n }\r\n\r\n\r\n </div>\r\n\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n Renderer2,\r\n OnDestroy,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[bkTooltip]',\r\n standalone: true,\r\n})\r\nexport class BKTooltipDirective implements OnInit,OnChanges, OnDestroy {\r\n @Input('bkTooltip') tooltipContent: string | string[] = '';\r\n @Input('bkTooltipPosition') tooltipPosition: 'left' | 'right' | 'top' | 'bottom' = 'right';\r\n\r\n private tooltipElement: HTMLElement | null = null;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) {}\r\n\r\n ngOnInit(): void {\r\n this.createTooltip();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['tooltipContent'] && !changes['tooltipContent'].firstChange) {\r\n this.updateTooltipContent();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeTooltip();\r\n }\r\n\r\n\r\n updateTooltipContent() {\r\n // If tooltip doesn't exist yet and content is now available, create it\r\n if (!this.tooltipElement && !this.isTooltipContentEmpty()) {\r\n this.createTooltip();\r\n return;\r\n }\r\n\r\n if (!this.tooltipElement) return;\r\n if (this.isTooltipContentEmpty()) return;\r\n\r\n // remove old .text nodes\r\n Array.from(this.tooltipElement.querySelectorAll('.text')).forEach((el) =>\r\n this.renderer.removeChild(this.tooltipElement, el)\r\n );\r\n\r\n this.appendContent();\r\n }\r\n\r\n appendContent() {\r\n if (!this.tooltipElement) return;\r\n\r\n const contentLines = Array.isArray(this.tooltipContent)\r\n ? this.tooltipContent\r\n : [this.tooltipContent];\r\n\r\n contentLines.forEach((line: string) => {\r\n const div = this.renderer.createElement('div');\r\n this.renderer.addClass(div, 'text');\r\n if (line?.trim().startsWith('<')) {\r\n div.innerHTML = line;\r\n } else {\r\n const text = this.renderer.createText(line ?? '');\r\n this.renderer.appendChild(div, text);\r\n }\r\n this.renderer.appendChild(this.tooltipElement!, div);\r\n });\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n if (this.tooltipElement) {\r\n this.setTooltipPosition();\r\n this.setStyle(this.tooltipElement, {\r\n visibility: 'visible',\r\n opacity: '1',\r\n });\r\n this.renderer.setStyle(document.body, 'overflow-x', 'hidden');// ✅ temporarily lock horizontal scroll\r\n }\r\n }\r\n\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave() {\r\n if (this.tooltipElement) {\r\n this.setStyle(this.tooltipElement, {\r\n visibility: 'hidden',\r\n opacity: '0',\r\n });\r\n this.renderer.removeStyle(document.body, 'overflow-x'); // ✅ restore scroll when tooltip hides\r\n }\r\n }\r\n\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n onWindowChange() {\r\n if (this.tooltipElement?.style.visibility === 'visible') {\r\n this.setTooltipPosition();\r\n }\r\n }\r\n private isTooltipContentEmpty(): boolean {\r\n if (typeof this.tooltipContent === 'string') {\r\n return !this.tooltipContent.trim();\r\n } else if (Array.isArray(this.tooltipContent)) {\r\n return this.tooltipContent.length === 0 || this.tooltipContent.every(line => !line.trim());\r\n }\r\n return true;\r\n }\r\n private createTooltip() {\r\n if(this.isTooltipContentEmpty()) return\r\n this.tooltipElement = this.renderer.createElement('div');\r\n this.renderer.addClass(this.tooltipElement, 'bk-tooltip-content');\r\n\r\n // Add content\r\n const contentLines = Array.isArray(this.tooltipContent) ? this.tooltipContent : [this.tooltipContent];\r\n contentLines.forEach((line: string) => {\r\n const div = this.renderer.createElement('div');\r\n this.renderer.addClass(div, 'text');\r\n // this.renderer.appendChild(div, this.renderer.createText(line));\r\n // Check if the line contains HTML\r\n if (line.trim().startsWith('<')) {\r\n div.innerHTML = line;\r\n } else {\r\n const text = this.renderer.createText(line);\r\n this.renderer.appendChild(div, text);\r\n }\r\n this.renderer.appendChild(this.tooltipElement!, div);\r\n });\r\n\r\n // Add triangle\r\n const triangle = this.renderer.createElement('div');\r\n this.renderer.addClass(triangle, 'bk-tooltip-triangle');\r\n this.renderer.appendChild(this.tooltipElement, triangle);\r\n\r\n // Set base styles\r\n this.setStyle(this.tooltipElement!, {\r\n position: 'fixed',\r\n visibility: 'hidden',\r\n opacity: '0',\r\n zIndex: '9999',\r\n transition: 'opacity 0.3s ease, visibility 0.3s ease',\r\n });\r\n\r\n this.renderer.appendChild(document.body, this.tooltipElement);\r\n }\r\n\r\n private setTooltipPosition() {\r\n if (!this.tooltipElement) return;\r\n\r\n const hostRect = this.el.nativeElement.getBoundingClientRect();\r\n const tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n\r\n const triangle = this.tooltipElement.querySelector('.bk-tooltip-triangle') as HTMLElement;\r\n const padding = 10;\r\n\r\n let top = 0, left = 0;\r\n\r\n // Position logic\r\n switch (this.tooltipPosition) {\r\n case 'right':\r\n case 'left':\r\n top = hostRect.top + scrollTop + hostRect.height / 2;\r\n left = this.tooltipPosition === 'right'\r\n ? hostRect.right + scrollLeft + padding\r\n : hostRect.left + scrollLeft - tooltipRect.width - padding;\r\n\r\n // Auto flip if out of viewport\r\n if (this.tooltipPosition === 'right' && left + tooltipRect.width > window.innerWidth) {\r\n left = hostRect.left + scrollLeft - tooltipRect.width - padding;\r\n } else if (this.tooltipPosition === 'left' && left < 0) {\r\n left = hostRect.right + scrollLeft + padding;\r\n }\r\n\r\n this.setStyle(this.tooltipElement, {\r\n transform: 'translateY(-50%)',\r\n });\r\n\r\n this.setTriangleStyles(triangle, this.tooltipPosition, left < hostRect.left + scrollLeft);\r\n break;\r\n\r\n case 'top':\r\n case 'bottom':\r\n left = hostRect.left + scrollLeft + hostRect.width / 2 - tooltipRect.width / 2;\r\n top = this.tooltipPosition === 'top'\r\n ? hostRect.top + scrollTop - tooltipRect.height - padding\r\n : hostRect.bottom + scrollTop + padding;\r\n\r\n // Prevent overflow\r\n left = Math.max(10, Math.min(left, window.innerWidth - tooltipRect.width - 10));\r\n\r\n this.setStyle(this.tooltipElement, {\r\n transform: 'translateX(0)',\r\n });\r\n\r\n this.setTriangleStyles(triangle, this.tooltipPosition);\r\n break;\r\n }\r\n\r\n this.setStyle(this.tooltipElement, {\r\n top: `${top}px`,\r\n left: `${left}px`,\r\n });\r\n }\r\n\r\n private setTriangleStyles(\r\n triangle: HTMLElement,\r\n position: 'left' | 'right' | 'top' | 'bottom',\r\n flipped: boolean = false\r\n ) {\r\n if (!triangle) return;\r\n\r\n const base = {\r\n top: '',\r\n left: '',\r\n right: '',\r\n bottom: '',\r\n transform: '',\r\n borderColor: '',\r\n };\r\n\r\n let styles: any = { ...base };\r\n\r\n switch (position) {\r\n case 'right':\r\n styles = flipped\r\n ? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }\r\n : { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };\r\n break;\r\n\r\n case 'left':\r\n styles = flipped\r\n ? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }\r\n : { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };\r\n break;\r\n\r\n case 'top':\r\n styles = {\r\n bottom: '-15px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n borderColor: '#1a1a1a transparent transparent transparent',\r\n };\r\n break;\r\n\r\n case 'bottom':\r\n styles = {\r\n top: '-15px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n borderColor: 'transparent transparent #1a1a1a transparent',\r\n };\r\n break;\r\n }\r\n\r\n this.setStyle(triangle, styles);\r\n }\r\n\r\n private removeTooltip() {\r\n if (this.tooltipElement) {\r\n this.renderer.removeChild(document.body, this.tooltipElement);\r\n this.tooltipElement = null;\r\n }\r\n }\r\n\r\n // Utility function to apply multiple styles\r\n private setStyle(el: HTMLElement, styles: { [key: string]: string }) {\r\n Object.entries(styles).forEach(([prop, value]) => {\r\n this.renderer.setStyle(el, prop, value);\r\n });\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { TableColumn, TableAction } from '../../models/grid.model';\r\nimport { CdkDragDrop, moveItemInArray, CdkDragMove, CdkDragStart, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { BKTooltipDirective } from '../../../tooltip/tooltip.directive';\r\nexport type SortDirection = 'asc' | 'desc';\r\n@Component({\r\n selector: 'bk-grid',\r\n standalone: true,\r\n imports: [CommonModule,DragDropModule,ScrollingModule, BKTooltipDirective],\r\n templateUrl: './grid.html',\r\n styleUrl: './grid.css',\r\n})\r\nexport class BkGrid<T = any> {\r\n @Input() draggable: boolean = false;\r\n @Input() columns: TableColumn<T>[] = [];\r\n @Input() result!: T[];\r\n @Input() actions: TableAction[] = [];\r\n\r\n @Output() actionClick = new EventEmitter<{\r\n action: string;\r\n row: T;\r\n }>();\r\n\r\n @Output() sortChange = new EventEmitter<{\r\n columnIndex: number;\r\n column: TableColumn<T>;\r\n direction: SortDirection;\r\n }>();\r\n @Output() dragDropChange = new EventEmitter<T[]>();\r\n sortColumn?: keyof T;\r\n sortDirection:SortDirection = 'asc';\r\n\r\n @ViewChild('tableScrollContainer', { static: false })\r\n tableScrollContainer!: ElementRef<HTMLDivElement>;\r\n\r\n get firstVisibleColumnIndex(): number {\r\n const index = this.columns.findIndex(col => col.visible !== false);\r\n return index >= 0 ? index : 0;\r\n }\r\n /* ---------- Sorting ---------- */\r\n sort(column: TableColumn<T>, index: number) {\r\n if (!column.sortable || !column.field) return;\r\n\r\n // Toggle sort direction\r\n this.sortDirection =\r\n this.sortColumn === column.field ? (this.sortDirection === 'asc' ? 'desc' : 'asc') : 'asc';\r\n\r\n this.sortColumn = column.field;\r\n\r\n // Emit sort change separately\r\n this.sortChange.emit({\r\n columnIndex: index,\r\n column,\r\n direction: this.sortDirection,\r\n });\r\n }\r\n\r\n /* ---------- Visibility ---------- */\r\n isColumnVisible(column: TableColumn<T>): boolean {\r\n return column.visible !== false;\r\n }\r\n\r\n /* ---------- Cell Value ---------- */\r\n getCellValue(row: T, column: TableColumn<T>): string {\r\n if (column.formatter) {\r\n return column.formatter(row);\r\n }\r\n if (column.field) {\r\n return String(row[column.field] ?? '');\r\n }\r\n return '';\r\n }\r\n\r\n /* ---------- Actions ---------- */\r\n emitAction(action: TableAction, row: T) {\r\n this.actionClick.emit({\r\n action: action.name,\r\n row,\r\n });\r\n }\r\n\r\n dropList(event: CdkDragDrop<T[]>) {\r\n if (!this.draggable || !this.result) return;\r\n\r\n moveItemInArray(this.result, event.previousIndex, event.currentIndex);\r\n\r\n // Update existing sortOrder on T\r\n this.result.forEach((item: any, index) => {\r\n item.sortOrder = index + 1;\r\n });\r\n\r\n // Emit reordered list\r\n this.dragDropChange.emit(this.result);\r\n }\r\n\r\n onDragMoved(event: CdkDragMove<any>) {\r\n if (!this.tableScrollContainer) return;\r\n\r\n const container = this.tableScrollContainer.nativeElement;\r\n const rect = container.getBoundingClientRect();\r\n const pointerY = event.pointerPosition.y - rect.top;\r\n\r\n const threshold = 80;\r\n const maxSpeed = 25;\r\n\r\n if (pointerY < threshold) {\r\n const intensity = 1 - pointerY / threshold;\r\n container.scrollTop -= Math.min(maxSpeed, intensity * maxSpeed);\r\n } else if (pointerY > rect.height - threshold) {\r\n const intensity = 1 - (rect.height - pointerY) / threshold;\r\n container.scrollTop += Math.min(maxSpeed, intensity * maxSpeed);\r\n }\r\n }\r\n\r\n onDragStart(event: CdkDragStart<any>) {\r\n const row = event.source.element.nativeElement as HTMLElement;\r\n const cells = Array.from(row.querySelectorAll('td'));\r\n\r\n setTimeout(() => {\r\n const preview = document.querySelector('.cdk-drag-preview') as HTMLElement;\r\n\r\n if (!preview) return;\r\n\r\n const previewCells = preview.querySelectorAll('td');\r\n\r\n cells.forEach((cell, index) => {\r\n const width = cell.getBoundingClientRect().width + 'px';\r\n const previewCell = previewCells[index] as HTMLElement;\r\n\r\n if (previewCell) {\r\n previewCell.style.width = width;\r\n previewCell.style.minWidth = width;\r\n previewCell.style.maxWidth = width;\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","<div\r\n #tableScrollContainer\r\n cdkScrollable\r\n class=\"h-[calc(100vh-260px)] overflow-y-auto\">\r\n\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\r\n\r\n <!-- ================= HEADER ================= -->\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.header;let i=$index;) {\r\n @if (isColumnVisible(col)) {\r\n <th\r\n class=\"grid-header sticky top-0 cursor-pointer\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\"\r\n (click)=\"sort(col,i)\"\r\n >\r\n <span class=\"flex items-center gap-1\"\r\n [ngClass]=\"sortColumn === col.field\r\n ? (sortDirection === 'asc' ? 'grid-asc' : 'grid-desc')\r\n : ''\">\r\n {{ col.header }}\r\n @if (col.sortable) {\r\n <span class=\"grid-sort-icon\"></span>\r\n }\r\n </span>\r\n </th>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <th class=\"grid-header sticky top-0 action-sticky z-10 !bg-[#FBFBFC] w-20\">\r\n Action\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- ================= BODY ================= -->\r\n <tbody\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!draggable\"\r\n [cdkDropListData]=\"result || []\"\r\n (cdkDropListDropped)=\"dropList($event)\">\r\n\r\n @for (row of result; track row; let rowIndex = $index) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragDisabled]=\"!draggable\"\r\n (cdkDragStarted)=\"onDragStart($event)\"\r\n (cdkDragMoved)=\"onDragMoved($event)\"\r\n class=\"\" [ngClass]=\"{ 'cursor-move ': draggable }\">\r\n\r\n @for (col of columns; track col.header; let colIndex = $index) {\r\n @if (isColumnVisible(col)) {\r\n <td class=\"grid-cell text-nowrap\" [ngClass]=\"col.cellClass\">\r\n @if (draggable && colIndex === firstVisibleColumnIndex) {\r\n <span cdkDragHandle class=\"mr-2 text-gray-400\" [ngClass]=\"{ 'cursor-move': draggable }\">☰</span>\r\n }\r\n {{ getCellValue(row, col) }}\r\n </td>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <td class=\"grid-cell action-sticky text-center\">\r\n <div class=\"flex items-center justify-center gap-1.5\">\r\n @for (action of actions; track action.name) {\r\n @if (action.hasPermission) {\r\n \r\n <button \r\n bkTooltip=\"{{ action.tooltip }}\"\r\n bkTooltipPosition=\"top\" \r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA]\"\r\n (click)=\"emitAction(action, row)\"\r\n >\r\n <img\r\n [src]=\"action.icon\"\r\n width=\"14\"\r\n height=\"14\"\r\n alt=\"action-icon\"\r\n />\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n","import {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n model,\r\n forwardRef,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n computed,\r\n effect,\r\n ViewChild,\r\n ViewChildren,\r\n QueryList, Input\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-select',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './select.html',\r\n styleUrls: ['./select.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkSelect),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkSelect implements ControlValueAccessor {\r\n // --- Inputs ---\r\n items = input<any[]>([]);\r\n bindLabel = input<string>('label');\r\n bindValue = input<string>('');\r\n placeholder = input<string>('');\r\n notFoundText = input<string>('No items found');\r\n loadingText = input<string>('Loading...');\r\n clearAllText = input<string>('Clear all');\r\n groupBy = input<string>(''); // NEW\r\n colorKey = input<string>(''); // e.g. \"color\"\r\n\r\n // iconSrc = input<string>('Clear all');\r\n @Input() iconAlt: string = 'icon';\r\n @Input() label: string = '';\r\n @Input() required: Boolean = false;\r\n\r\n\r\n @Input() iconSrc?: string; // optional icon\r\n\r\n // Config\r\n multiple = input<boolean>(false);\r\n maxLabels = input<number>(2);\r\n searchable = input<boolean>(true);\r\n allSelect = input<boolean>(false);\r\n clearable = input<boolean>(true);\r\n readonly = input<boolean>(false);\r\n disabled = model<boolean>(false);\r\n loading = input<boolean>(false);\r\n closeOnSelect = input<boolean>(true);\r\n dropdownPosition = input<'bottom' | 'top'>('bottom');\r\n @Input() hasError: boolean = false;\r\n @Input() errorMessage: string = '';\r\n\r\n\r\n // 1. NEW INPUT: Toggle append-to-body behavior\r\n appendToBody = input<boolean>(false);\r\n\r\n // --- Outputs ---\r\n open = output<void>();\r\n close = output<void>();\r\n focus = output<void>();\r\n blur = output<void>();\r\n search = output<{ term: string, items: any[] }>();\r\n clear = output<any>();\r\n change = output<any>();\r\n scrollToEnd = output<void>();\r\n\r\n // --- Refs ---\r\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\r\n @ViewChild('optionsListContainer') optionsListContainer!: ElementRef<HTMLDivElement>;\r\n @ViewChildren('optionsRef') optionsRef!: QueryList<ElementRef>;\r\n @ViewChild('controlWrapper') controlWrapper!: ElementRef<HTMLDivElement>;\r\n\r\n // --- State ---\r\n private _value: any = null;\r\n\r\n isOpen = signal(false);\r\n selectedOptions = signal<any[]>([]);\r\n searchTerm = signal<string>('');\r\n markedIndex = signal(-1);\r\n\r\n dropdownStyle = signal<{\r\n top?: string;\r\n bottom?: string;\r\n left: string;\r\n width: string;\r\n }>({\r\n left: '0px',\r\n width: 'auto'\r\n });\r\n\r\n\r\n filteredItems = computed(() => {\r\n const term = this.searchTerm().toLowerCase();\r\n const list = this.items();\r\n if (!term || !this.searchable()) return list;\r\n return list.filter(item => {\r\n const label = this.resolveLabel(item).toLowerCase();\r\n return label.includes(term);\r\n });\r\n });\r\n\r\n isAllSelected = computed(() => {\r\n const filtered = this.filteredItems();\r\n const current = this.selectedOptions();\r\n if (!filtered.length) return false;\r\n return filtered.every(item => this.isItemSelected(item));\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const currentItems = this.items();\r\n if (currentItems.length > 0 && this._value !== null) {\r\n this.resolveSelectedOptions(this._value);\r\n }\r\n });\r\n }\r\n\r\n // --- Helpers ---\r\n resolveLabel(item: any): string {\r\n if (!item) return '';\r\n const labelProp = this.bindLabel();\r\n return labelProp && typeof item === 'object' ? item[labelProp] : String(item);\r\n }\r\n\r\n resolveValue(item: any): any {\r\n const valueProp = this.bindValue();\r\n return valueProp && typeof item === 'object' ? item[valueProp] : item;\r\n }\r\n\r\n isItemSelected(item: any): boolean {\r\n const current = this.selectedOptions();\r\n const compareFn = this.compareWith();\r\n const itemVal = this.resolveValue(item);\r\n return current.some(selected => compareFn(itemVal, this.resolveValue(selected)));\r\n }\r\n\r\n compareWith = input<(a: any, b: any) => boolean>((a, b) => a === b);\r\n\r\n // --- Actions ---\r\n\r\n toggleDropdown(event: Event | null) {\r\n if (event) { event.preventDefault(); event.stopPropagation(); }\r\n if (this.disabled() || this.readonly()) return;\r\n this.isOpen() ? this.closeDropdown() : this.openDropdown();\r\n }\r\n\r\n openDropdown() {\r\n if (this.isOpen()) return;\r\n\r\n // Only calculate position if we are appending to body\r\n if (this.appendToBody()) {\r\n this.updatePosition();\r\n }\r\n\r\n this.isOpen.set(true);\r\n // this.markedIndex.set(0);\r\n this.open.emit();\r\n this.focus.emit();\r\n // this.markedIndex.set(0);\r\n // setTimeout(() => this.searchInput?.nativeElement.focus());\r\n setTimeout(() => {\r\n if (this.searchable()) {\r\n this.searchInput?.nativeElement.focus();\r\n } else {\r\n this.controlWrapper?.nativeElement.focus();\r\n }\r\n });\r\n }\r\n\r\n closeDropdown() {\r\n if (!this.isOpen()) return;\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.onTouched();\r\n this.close.emit();\r\n this.blur.emit();\r\n }\r\n\r\n getTop(): string | null {\r\n if (this.appendToBody()) {\r\n return this.dropdownStyle().top ?? null;\r\n }\r\n\r\n // NOT appendToBody\r\n return this.dropdownPosition() === 'bottom' ? '105%' : null;\r\n }\r\n\r\n getBottom(): string | null {\r\n if (this.appendToBody()) {\r\n return this.dropdownStyle().bottom ?? null;\r\n }\r\n\r\n // NOT appendToBody\r\n return this.dropdownPosition() === 'top' ? '105%' : null;\r\n }\r\n\r\n\r\n updatePosition() {\r\n const rect = this.controlWrapper.nativeElement.getBoundingClientRect();\r\n\r\n if (this.dropdownPosition() === 'bottom') {\r\n this.dropdownStyle.set({\r\n top: `${rect.bottom + 4}px`,\r\n bottom: undefined,\r\n left: `${rect.left}px`,\r\n width: `${rect.width}px`\r\n });\r\n } else {\r\n this.dropdownStyle.set({\r\n top: undefined,\r\n bottom: `${window.innerHeight - rect.top + 4}px`,\r\n left: `${rect.left}px`,\r\n width: `${rect.width}px`\r\n });\r\n }\r\n }\r\n\r\n\r\n\r\n // 2. FIXED: Removed ['$event'] argument\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n onWindowEvents() {\r\n // Only close on scroll if we are in \"fixed\" mode (append to body)\r\n if (this.isOpen() && this.appendToBody()) {\r\n this.closeDropdown();\r\n }\r\n }\r\n\r\n // ... (toggleSelectAll, handleSelection, removeOption, handleClear logic same as before) ...\r\n\r\n toggleSelectAll(event: Event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n const allSelected = this.isAllSelected();\r\n const filtered = this.filteredItems();\r\n let newSelection = [...this.selectedOptions()];\r\n const compareFn = this.compareWith();\r\n if (allSelected) {\r\n newSelection = newSelection.filter(sel => {\r\n const selVal = this.resolveValue(sel);\r\n return !filtered.some(fItem => compareFn(this.resolveValue(fItem), selVal));\r\n });\r\n } else {\r\n filtered.forEach(item => {\r\n if (!this.isItemSelected(item)) newSelection.push(item);\r\n });\r\n }\r\n this.updateModel(newSelection);\r\n }\r\n\r\n handleSelection(item: any, event?: Event) {\r\n if (event) event.stopPropagation();\r\n if (this.multiple()) {\r\n const isSelected = this.isItemSelected(item);\r\n let newSelection = [...this.selectedOptions()];\r\n const compareFn = this.compareWith();\r\n if (isSelected) {\r\n const itemVal = this.resolveValue(item);\r\n newSelection = newSelection.filter(sel => !compareFn(this.resolveValue(sel), itemVal));\r\n } else {\r\n newSelection.push(item);\r\n }\r\n this.updateModel(newSelection);\r\n if (this.closeOnSelect()) this.closeDropdown();\r\n } else {\r\n this.updateModel([item]);\r\n if (this.closeOnSelect()) this.closeDropdown();\r\n }\r\n }\r\n\r\n removeOption(item: any, event: Event) {\r\n event.stopPropagation();\r\n const newSelection = this.selectedOptions().filter(i => i !== item);\r\n this.updateModel(newSelection);\r\n }\r\n\r\n handleClear(event: Event) {\r\n event.stopPropagation();\r\n this.updateModel([]);\r\n this.clear.emit(null);\r\n }\r\n\r\n private updateModel(items: any[]) {\r\n this.selectedOptions.set(items);\r\n if (this.multiple()) {\r\n const values = items.map(i => this.resolveValue(i));\r\n this._value = values;\r\n this.onChange(values);\r\n this.change.emit(items);\r\n } else {\r\n const item = items[0] || null;\r\n const value = item ? this.resolveValue(item) : null;\r\n this._value = value;\r\n this.onChange(value);\r\n this.change.emit(item);\r\n }\r\n }\r\n\r\n onSearchInput(event: Event) {\r\n const val = (event.target as HTMLInputElement).value;\r\n this.searchTerm.set(val);\r\n this.markedIndex.set(0);\r\n this.search.emit({ term: val, items: this.filteredItems() });\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (!this.isOpen()) return;\r\n const list = this.filteredItems();\r\n const current = this.markedIndex();\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (current < list.length - 1) {\r\n this.markedIndex.set(current + 1);\r\n this.scrollToMarked();\r\n }\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n if (current > 0) {\r\n this.markedIndex.set(current - 1);\r\n this.scrollToMarked();\r\n }\r\n break;\r\n case 'Enter':\r\n event.preventDefault();\r\n if (current >= 0 && list[current]) this.handleSelection(list[current]);\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n this.closeDropdown();\r\n break;\r\n }\r\n }\r\n\r\n onScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n if (target.scrollHeight - target.scrollTop <= target.clientHeight + 10) {\r\n this.scrollToEnd.emit();\r\n }\r\n }\r\n\r\n scrollToMarked() {\r\n setTimeout(() => {\r\n const container = this.optionsListContainer?.nativeElement;\r\n const options = this.optionsRef?.toArray();\r\n const index = this.markedIndex();\r\n if (container && options && options[index]) {\r\n const el = options[index].nativeElement;\r\n if (el.offsetTop < container.scrollTop) {\r\n container.scrollTop = el.offsetTop;\r\n } else if ((el.offsetTop + el.clientHeight) > (container.scrollTop + container.clientHeight)) {\r\n container.scrollTop = (el.offsetTop + el.clientHeight) - container.clientHeight;\r\n }\r\n }\r\n });\r\n }\r\n\r\n onChange: any = () => {};\r\n onTouched: any = () => {};\r\n writeValue(value: any): void { this._value = value; this.resolveSelectedOptions(value); }\r\n registerOnChange(fn: any) { this.onChange = fn; }\r\n registerOnTouched(fn: any) { this.onTouched = fn; }\r\n setDisabledState(d: boolean) { this.disabled.set(d); }\r\n\r\n private resolveSelectedOptions(val: any) {\r\n const list = this.items();\r\n if (!list.length) return;\r\n if (val === null || val === undefined) {\r\n this.selectedOptions.set([]);\r\n return;\r\n }\r\n const valArray = Array.isArray(val) ? val : [val];\r\n const bindVal = this.bindValue();\r\n const compare = this.compareWith();\r\n const matchedItems = list.filter(item => {\r\n const itemVal = bindVal ? item[bindVal] : item;\r\n return valArray.some(v => compare(v, itemVal));\r\n });\r\n this.selectedOptions.set(matchedItems);\r\n }\r\n\r\n private el = inject(ElementRef);\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(e: Event) {\r\n if (!this.el.nativeElement.contains(e.target)) this.closeDropdown();\r\n }\r\n\r\n openFromLabel(event: MouseEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (this.disabled() || this.readonly()) return;\r\n\r\n this.controlWrapper.nativeElement.focus();\r\n this.openDropdown();\r\n }\r\n\r\n groupedItems = computed(() => {\r\n const groupKey = this.groupBy();\r\n const list = this.filteredItems();\r\n\r\n if (!groupKey) {\r\n return [{ group: null, items: list }];\r\n }\r\n\r\n const map = new Map<string, any[]>();\r\n\r\n list.forEach(item => {\r\n const key = item[groupKey] ?? 'Others';\r\n if (!map.has(key)) map.set(key, []);\r\n map.get(key)!.push(item);\r\n });\r\n\r\n return Array.from(map.entries()).map(([group, items]) => ({\r\n group,\r\n items\r\n }));\r\n });\r\n\r\n resolveColor(item: any): string | null {\r\n if (!item) return null;\r\n const key = this.colorKey();\r\n return key && typeof item === 'object' ? item[key] : null;\r\n }\r\n\r\n\r\n}\r\n","<div class=\"ng-select-container\">\r\n\r\n @if(label){\r\n <label\r\n class=\"select-label\"\r\n (click)=\"openFromLabel($event)\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"select-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div\r\n #controlWrapper\r\n class=\"ng-select-control\"\r\n [ngClass]=\"{ 'has-error': hasError }\"\r\n\r\n tabindex=\"0\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [class.focused]=\"isOpen()\"\r\n [class.disabled]=\"disabled()\"\r\n (mousedown)=\"toggleDropdown($event)\"\r\n >\r\n <!-- Icon (Always visible if set) -->\r\n @if (iconSrc) {\r\n <img [src]=\"iconSrc\" [alt]=\"iconAlt\" class=\"shrink-0\"/>\r\n }\r\n <div class=\"ng-value-container\">\r\n @if (selectedOptions().length === 0) {\r\n <div class=\"ng-placeholder\">{{ placeholder() }}</div>\r\n }\r\n @if (multiple() && selectedOptions().length > 0) {\r\n <div class=\"ng-value-chips\">\r\n @for (opt of selectedOptions().slice(0, maxLabels()); track $index) {\r\n <div class=\"multi-badge-item\">\r\n <span class=\"multi-badge-item-text\" [style.color]=\"resolveColor(opt)\">{{ resolveLabel(opt) }}</span>\r\n\r\n <button type=\"button\" (mousedown)=\"removeOption(opt, $event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\r\n <path d=\"M6.625 0.625L0.625 6.625M0.625 0.625L6.625 6.625\" stroke=\"#BBBDC5\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n }\r\n @if (selectedOptions().length > maxLabels()) {\r\n <div class=\"multi-badge-item\"><span\r\n class=\"multi-badge-item-text\">+{{ selectedOptions().length - maxLabels() }}</span></div>\r\n }\r\n </div>\r\n }\r\n @if (!multiple() && selectedOptions().length > 0) {\r\n <div class=\"ng-value-label-single\" [style.color]=\"resolveColor(selectedOptions()[0])\">\r\n {{ resolveLabel(selectedOptions()[0]) }}</div>\r\n }\r\n </div>\r\n <div class=\"ng-actions\">\r\n @if (clearable() && selectedOptions().length > 0 && !disabled()) {\r\n <span class=\"ng-clear-wrapper\" (mousedown)=\"handleClear($event)\" title=\"Clear\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\"\r\n y1=\"6\" x2=\"6\"\r\n y2=\"18\"></line><line\r\n x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </span>\r\n }\r\n <span class=\"ng-arrow-wrapper\" [class.open]=\"isOpen()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path\r\n d=\"m6 9 6 6 6-6\"/></svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n @if (isOpen()) {\r\n <div\r\n #dropdownPanel\r\n class=\"custom-ng-dropdown-panel\"\r\n [attr.data-position]=\"dropdownPosition()\"\r\n (scroll)=\"onScroll($event)\"\r\n\r\n [style.position]=\"appendToBody() ? 'fixed' : 'absolute'\"\r\n [style.top]=\"getTop()\"\r\n [style.bottom]=\"getBottom()\"\r\n [style.left]=\"appendToBody() ? dropdownStyle().left : null\"\r\n [style.width]=\"appendToBody() ? dropdownStyle().width : '100%'\"\r\n [class.grouped]=\"groupBy()\"\r\n >\r\n\r\n\r\n @if (searchable()) {\r\n <div class=\"ng-dropdown-search\">\r\n <div class=\"ng-search-wrapper\">\r\n <svg class=\"text-[#BBBDC5] mr-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\r\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\r\n </svg>\r\n <input #searchInput type=\"text\" class=\"ng-search-input\" [value]=\"searchTerm()\" [placeholder]=\"'Search...'\"\r\n (input)=\"onSearchInput($event)\" (keydown)=\"onKeyDown($event)\" (click)=\"$event.stopPropagation()\">\r\n </div>\r\n </div>\r\n }\r\n <div #optionsListContainer class=\"ng-options-list\">\r\n @if (loading()) {\r\n <div class=\"ng-option-disabled\">{{ loadingText() }}</div>\r\n } @else {\r\n @if (allSelect()){\r\n\r\n @if (multiple() && filteredItems().length > 0) {\r\n <div class=\"ng-option\" (mousedown)=\"toggleSelectAll($event)\" [class.selected]=\"isAllSelected()\">\r\n <div class=\"flex-1 flex justify-between\">\r\n <span>Select All</span>\r\n @if (isAllSelected()) {\r\n <svg class=\"text-[#141414]\" width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\">\r\n <polyline points=\"20 6 9 17 4 12\"/>\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n @for (group of groupedItems(); track $index) {\r\n\r\n @if (group.group) {\r\n <div class=\"ng-option-group\">\r\n {{ group.group }}\r\n </div>\r\n }\r\n\r\n @for (item of group.items; track $index) {\r\n <div #optionsRef class=\"ng-option\" [class.selected]=\"isItemSelected(item)\" [class.marked]=\"$index === markedIndex()\" (click)=\"handleSelection(item, $event)\">\r\n <div class=\"flex-1 flex justify-between\">\r\n <span [style.color]=\"resolveColor(item)\">{{ resolveLabel(item) }}</span>\r\n\r\n @if (isItemSelected(item)) {\r\n <svg class=\"text-[#141414]\" width=\"17\" height=\"17\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\r\n <polyline points=\"20 6 9 17 4 12\"/>\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n }\r\n\r\n @if (filteredItems().length === 0) {\r\n <div class=\"ng-option-disabled\">{{ notFoundText() }}</div>\r\n }\r\n }\r\n </div>\r\n\r\n </div>\r\n }\r\n @if(hasError){\r\n @if (errorMessage) {\r\n <p class=\"select-error\">{{ errorMessage }}</p>\r\n }\r\n }\r\n\r\n\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgxMaskDirective, provideNgxMask } from 'ngx-mask';\r\nimport {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n ElementRef,\r\n ViewChild,\r\n forwardRef,\r\n Output,\r\n EventEmitter\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR\r\n} from '@angular/forms';\r\n\r\n\r\nexport type BkInputType =\r\n | 'text'\r\n | 'email'\r\n | 'password'\r\n | 'number'\r\n | 'url'\r\n | 'tel';\r\nexport type BkInputAutoComplete =\r\n | 'on'\r\n | 'off'\r\n | 'name'\r\n | 'honorific-prefix'\r\n | 'given-name'\r\n | 'additional-name'\r\n | 'family-name'\r\n | 'honorific-suffix'\r\n | 'nickname'\r\n | 'email'\r\n | 'username'\r\n | 'new-password'\r\n | 'current-password'\r\n | 'organization-title'\r\n | 'organization'\r\n | 'street-address'\r\n | 'address-line1'\r\n | 'address-line2'\r\n | 'address-line3'\r\n | 'address-level4'\r\n | 'address-level3'\r\n | 'address-level2'\r\n | 'address-level1'\r\n | 'country'\r\n | 'country-name'\r\n | 'postal-code'\r\n | 'cc-name'\r\n | 'cc-given-name'\r\n | 'cc-additional-name'\r\n | 'cc-family-name'\r\n | 'cc-number'\r\n | 'cc-exp'\r\n | 'cc-exp-month'\r\n | 'cc-exp-year'\r\n | 'cc-csc'\r\n | 'cc-type'\r\n | 'transaction-currency'\r\n | 'transaction-amount'\r\n | 'language'\r\n | 'bday'\r\n | 'bday-day'\r\n | 'bday-month'\r\n | 'bday-year'\r\n | 'sex'\r\n | 'tel'\r\n | 'tel-country-code'\r\n | 'tel-national'\r\n | 'tel-area-code'\r\n | 'tel-local'\r\n | 'tel-extension'\r\n | 'impp'\r\n | 'url'\r\n | 'photo';\r\n\r\nexport type BkInputAutoCapitalize =\r\n | 'off'\r\n | 'none'\r\n | 'on'\r\n | 'sentences'\r\n | 'words'\r\n | 'characters';\r\n\r\nexport type BkInputMode =\r\n | 'none'\r\n | 'text'\r\n | 'tel'\r\n | 'url'\r\n | 'email'\r\n | 'numeric'\r\n | 'decimal'\r\n | 'search';\r\n\r\nexport type IconOrientation = 'left' | 'right';\r\nexport interface CountryOption {\r\n code: string;\r\n name: string;\r\n mask: string;\r\n prefix:string;\r\n placeholder:string;\r\n}\r\n@Component({\r\n selector: 'bk-input',\r\n imports: [CommonModule,NgxMaskDirective,FormsModule],\r\n templateUrl: './input.html',\r\n styleUrl: './input.css',\r\n standalone: true,\r\n providers: [\r\n provideNgxMask(),\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkInput),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkInput implements OnInit, OnDestroy, ControlValueAccessor {\r\n\r\n // =================== Inputs (all your original ones) ===================\r\n @Input() id!: string ;\r\n @Input() name!: string ;\r\n @Input() mask: string | null= null;\r\n @Input() autoComplete : BkInputAutoComplete = 'off';\r\n @Input() label: string = '';\r\n @Input() placeholder: string = 'stephend@i2cinc.com';\r\n @Input() hint: string = '';\r\n @Input() required: boolean = false;\r\n @Input() type: BkInputType = 'text';\r\n @Input() value: string = '';\r\n @Input() hasError: boolean = false;\r\n @Input() showErrorIcon:boolean=false;\r\n @Input() errorMessage: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() tabIndex: number | null = null;\r\n @Input() readOnly: boolean = false;\r\n @Input() autoCapitalize: BkInputAutoComplete | null = null;\r\n @Input() inputMode: BkInputMode | null = null;\r\n @Input() iconSrc?: string;\r\n @Input() iconAlt: string = 'icon';\r\n @Input() showIcon: boolean = true;\r\n @Input() phone: boolean = false;\r\n @Input() countryCode: string = 'US';\r\n @Input() countryOptions: CountryOption[] = [\r\n { code: 'US', name: 'US', mask: '(000) 000-0000', prefix: '+1 ',placeholder:'(000) 000-0000' },\r\n { code: 'MT', name: 'MT', mask: '(000) 000-0000', prefix: '+356 ',placeholder:'(000) 000-0000' },\r\n { code: 'PL', name: 'PL', mask: '(000) 000-0000', prefix: '+48 ',placeholder:'(000) 000-0000' },\r\n { code: 'CH', name: 'CH', mask: '(000) 000-0000', prefix: '+41 ' ,placeholder:'(000) 000-0000'},\r\n { code: 'TR', name: 'TR', mask: '(000) 000-0000', prefix: '+90 ' ,placeholder:'(000) 000-0000'},\r\n { code: 'UG', name: 'UG', mask: '(000) 000-0000', prefix: '+256 ',placeholder:'(000) 000-0000' },\r\n { code: 'ZM', name: 'ZM', mask: '(000) 000-0000', prefix: '+260 ',placeholder:'(000) 000-0000' }\r\n];\r\n\r\n selectedCountry: CountryOption= this.countryOptions[0];\r\n @Input() iconOrientation: IconOrientation = 'left'\r\n\r\n @Input() password: boolean = false;\r\n @Input() showPassword: boolean = false;\r\n\r\n @Input() pattern?: string|null;\r\n @Input() max: number|null = null;\r\n @Input() min: number|null = null;\r\n @Input() step: number|null = null;\r\n @Input() maxlength: number|null = null;\r\n @Input() minlength: number|null = null;\r\n // =================== ViewChild ===================\r\n @ViewChild('dropdownRef') dropdownRef?: ElementRef;\r\n @ViewChild('selectRef') selectRef?: ElementRef;\r\n @ViewChild('inputField') inputField?: ElementRef<HTMLInputElement>;\r\n\r\n // =================== Internal State ===================\r\n isFocused: boolean = false;\r\n inputValue: string = '';\r\n isDropdownOpen: boolean = false;\r\n\r\n\r\n // =================== Output Emitter ===================\r\n @Output() input = new EventEmitter<Event>();\r\n @Output() change = new EventEmitter<Event>();\r\n @Output() focus = new EventEmitter<Event>();\r\n @Output() blur = new EventEmitter<Event>();\r\n @Output() clicked = new EventEmitter<boolean>();\r\n\r\n get placeHolderText(): string {\r\n if (this.phone) {\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n return country?.placeholder || '';\r\n }\r\n return this.placeholder;\r\n }\r\n\r\n get maskValue(): string {\r\n if (this.mask) return this.mask;\r\n if (this.phone) {\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n return country?.mask || '';\r\n }\r\n return '';\r\n }\r\n\r\n get maskPrefixValue(): string {\r\n if (this.phone) {\r\n\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n return country?.prefix || '';\r\n }\r\n return '';\r\n }\r\n\r\n // =================== CVA Callbacks ===================\r\n private onChange = (value: any) => {};\r\n private onTouched = () => {};\r\n\r\n writeValue(value: any): void {\r\n this.value = value || '';\r\n this.inputValue = this.value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // =================== Lifecycle ===================\r\n private closeAllDropdownsHandler = () => {\r\n if (this.phone && this.isDropdownOpen) this.isDropdownOpen = false;\r\n };\r\n\r\n ngOnInit(): void {\r\n if (this.value) this.inputValue = this.value;\r\n if (this.password && this.type !== 'password') this.type = 'password';\r\n if (this.phone) {\r\n const country = this.countryOptions.find(c => c.code === this.countryCode);\r\n\r\n if (country) this.selectedCountry = country;\r\n document.addEventListener('closeAllPhoneDropdowns', this.closeAllDropdownsHandler);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.phone) {\r\n document.removeEventListener('closeAllPhoneDropdowns', this.closeAllDropdownsHandler);\r\n }\r\n }\r\n\r\n // =================== Host Listener ===================\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.phone && this.isDropdownOpen) {\r\n const target = event.target as HTMLElement;\r\n if (this.selectRef?.nativeElement && this.dropdownRef?.nativeElement) {\r\n const clickedInside =\r\n this.selectRef.nativeElement.contains(target) ||\r\n this.dropdownRef.nativeElement.contains(target);\r\n if (!clickedInside) this.isDropdownOpen = false;\r\n }\r\n }\r\n }\r\n\r\n // =================== Event Handlers ===================\r\n handleFocus(event: Event): void {\r\n this.focus.emit(event);\r\n if (!this.disabled) this.isFocused = true;\r\n }\r\n\r\n handleBlur(event:Event): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.blur.emit(event);\r\n }\r\n handleInput(event: Event): void {\r\n const val = (event.target as HTMLInputElement).value;\r\n this.inputValue = val;\r\n this.value = val; // update CVA value\r\n this.onChange(val); // propagate to parent form\r\n this.input.emit(event); // emit raw event\r\n }\r\n\r\n handleClicked():void {\r\n this.clicked.emit(true);\r\n }\r\n\r\n handleChange(event: Event) {\r\n this.change.emit(event); // emit raw change event\r\n }\r\n\r\n toggleDropdown(event?: Event): void {\r\n if (!this.disabled && this.phone) {\r\n if (!this.isDropdownOpen) {\r\n document.dispatchEvent(new CustomEvent('closeAllPhoneDropdowns'));\r\n setTimeout(() => (this.isDropdownOpen = true), 0);\r\n } else {\r\n this.isDropdownOpen = false;\r\n }\r\n event?.stopPropagation();\r\n }\r\n }\r\n\r\nselectCountry(country: CountryOption): void {\r\n const oldCountry = this.selectedCountry;\r\n this.selectedCountry = country;\r\n this.countryCode = country.code;\r\n this.isDropdownOpen = false;\r\n\r\n const currentRaw = this.inputField?.nativeElement?.value || this.inputValue;\r\n let newPhone = '';\r\n\r\n if (currentRaw && currentRaw.trim() !== '') {\r\n // Input has some value → replace old prefix\r\n if (oldCountry?.prefix && oldCountry.code !== country.code) {\r\n const oldPrefixEscaped = oldCountry.prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`^${oldPrefixEscaped}\\\\s?`);\r\n const oldMaskedValue = currentRaw.replace(regex, '');\r\n newPhone = country.prefix + oldMaskedValue;\r\n } else {\r\n newPhone = country.prefix + currentRaw;\r\n }\r\n } else {\r\n // Input is empty → show only the new prefix OR empty\r\n newPhone = ''; // optionally: newPhone = country.prefix;\r\n }\r\n\r\n this.inputValue = newPhone;\r\n this.value = newPhone;\r\n this.onChange(newPhone);\r\n\r\n setTimeout(() => {\r\n if (this.inputField?.nativeElement) {\r\n this.inputField.nativeElement.value = newPhone;\r\n this.inputField.nativeElement.dispatchEvent(\r\n new Event('input', { bubbles: true })\r\n );\r\n }\r\n }, 0);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n togglePasswordVisibility(event: Event): void {\r\n if (!this.disabled && this.password) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.showPassword = !this.showPassword;\r\n this.type = this.showPassword ? 'text' : 'password';\r\n }\r\n }\r\n\r\n handleIconClick(event: Event): void {\r\n if (this.disabled || this.readOnly) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n this.clicked.emit(true);\r\n }\r\n\r\n // =================== Getters ===================\r\n get isFilled(): boolean {\r\n return this.inputValue.length > 0;\r\n }\r\n\r\n get inputState(): 'default' | 'focused' | 'filled' | 'error' | 'disabled' {\r\n if (this.disabled) return 'disabled';\r\n if (this.hasError) return 'error';\r\n if (this.isFocused || this.isDropdownOpen) return 'focused';\r\n if (this.isFilled) return 'filled';\r\n return 'default';\r\n }\r\n\r\n get currentInputType(): string {\r\n if (this.password) return this.showPassword ? 'text' : 'password';\r\n return this.type;\r\n }\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"input-container\">\r\n @if(label){\r\n <label [for]=\"id\" class=\"input-label\">\r\n {{ label }}\r\n @if(required){\r\n <span class=\"input-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"input-wrapper\" [ngClass]=\"{\r\n 'input-wrapper--url': type === 'url',\r\n 'input-wrapper--phone': phone,\r\n 'input-wrapper--password': password,\r\n 'input-wrapper--icon': iconSrc && showIcon\r\n }\">\r\n\r\n <input\r\n #inputField\r\n [type]=\"currentInputType\"\r\n [id]=\"id\"\r\n [name]=\"name\"\r\n [disabled]=\"disabled\"\r\n [tabindex]=\"tabIndex\"\r\n [readOnly]=\"readOnly\"\r\n [attr.maxlength]=\"maxlength\"\r\n [attr.minlength]=\"minlength\"\r\n [autocomplete]=\"autoComplete\"\r\n [autocapitalize]=\"autoCapitalize\"\r\n\r\n [attr.max]=\"max\"\r\n [attr.min]=\"min\"\r\n [attr.step]=\"step\"\r\n\r\n [placeholder]=\"placeHolderText\"\r\n [pattern]=\"pattern\"\r\n [autocomplete]=\"autoComplete\"\r\n [value]=\"inputValue\"\r\n\r\n\r\n\r\n [mask]=\"maskValue\"\r\n [prefix]=\"maskPrefixValue\"\r\n [showMaskTyped]=\"false\"\r\n [dropSpecialCharacters]=\"false\"\r\n (change)=\"handleChange($event)\"\r\n (input)=\"handleInput($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"input-field\"\r\n\r\n [ngClass]=\"{\r\n 'input-field--url': type === 'url',\r\n 'input-field--phone': phone,\r\n 'input-field--icon-left': iconSrc && showIcon && iconOrientation === 'left',\r\n 'input-field--icon-right': iconSrc && showIcon && iconOrientation === 'right',\r\n 'input-field--password': password,\r\n 'input-field--default': inputState === 'default',\r\n 'input-field--focused': inputState === 'focused',\r\n 'input-field--filled': inputState === 'filled',\r\n 'input-field--error': inputState === 'error',\r\n 'input-field--disabled': inputState === 'disabled'\r\n }\">\r\n\r\n @if(iconSrc && showIcon){\r\n <img (click)=\"handleIconClick($event)\" [src]=\"iconSrc\" [alt]=\"iconAlt\" [ngClass]=\"{\r\n 'input-search-icon--left': iconOrientation === 'left',\r\n 'input-search-icon--right': iconOrientation === 'right',\r\n 'cursor-pointer': !disabled && !readOnly\r\n }\" class=\"input-search-icon\">\r\n }\r\n\r\n @if(showErrorIcon){\r\n <img src=\"../../assets/images/icons/global/info-circle.svg\" class=\"input-search-icon input-search-icon--right\">\r\n }\r\n\r\n @if(password){\r\n <button type=\"button\" (click)=\"togglePasswordVisibility($event)\" class=\"input-password-toggle\" [disabled]=\"disabled\" tabindex=\"-1\">\r\n <img [src]=\"showPassword ? '../../assets/images/icons/global/eye-slash-icon.svg' : '../../assets/images/icons/global/eye-icon.svg'\" [alt]=\"showPassword ? 'Hide password' : 'Show password'\" class=\"input-password-icon\">\r\n </button>\r\n }\r\n\r\n @if(phone){\r\n <div #selectRef class=\"input-phone-selector\" [ngClass]=\"{\r\n 'input-phone-selector--default': inputState === 'default',\r\n 'input-phone-selector--focused': inputState === 'focused',\r\n 'input-phone-selector--filled': inputState === 'filled',\r\n 'input-phone-selector--error': inputState === 'error',\r\n 'input-phone-selector--disabled': inputState === 'disabled'\r\n }\" (click)=\"toggleDropdown($event)\">\r\n <span class=\"input-phone-selector-text\">{{ selectedCountry.name }}</span>\r\n <img src=\"../../assets/images/icons/global/input-arrow-down.svg\" alt=\"Dropdown\" class=\"input-phone-selector-arrow\" [ngClass]=\"{'input-phone-selector-arrow--open': isDropdownOpen}\">\r\n </div>\r\n }\r\n\r\n @if(phone && isDropdownOpen){\r\n <div #dropdownRef class=\"input-phone-dropdown\" (click)=\"$event.stopPropagation()\">\r\n <button *ngFor=\"let country of countryOptions\" type=\"button\" class=\"input-phone-dropdown-item\" [ngClass]=\"{'input-phone-dropdown-item--active': selectedCountry.code === country.code}\" (click)=\"selectCountry(country); $event.stopPropagation()\">\r\n {{ country.name }}\r\n </button>\r\n </div>\r\n }\r\n\r\n\r\n\r\n @if(type === 'url'){\r\n <span class=\"input-url-prefix\" [ngClass]=\"{\r\n 'input-url-prefix--default': inputState === 'default',\r\n 'input-url-prefix--focused': inputState === 'focused',\r\n 'input-url-prefix--filled': inputState === 'filled',\r\n 'input-url-prefix--error': inputState === 'error',\r\n 'input-url-prefix--disabled': inputState === 'disabled'\r\n }\">https</span>\r\n }\r\n </div>\r\n\r\n @if(hasError){\r\n @if (errorMessage) {\r\n <p class=\"input-error\">{{ errorMessage }}</p>\r\n }\r\n }\r\n @if(!hasError){\r\n @if(hint){\r\n <p class=\"input-hint\">{{ hint }}</p>\r\n }\r\n }\r\n</div>\r\n","import { Component, Input, forwardRef, ViewChild, ElementRef, AfterViewInit, EventEmitter, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-input-chips',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-chips.html',\r\n styleUrl: './input-chips.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkInputChips),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkInputChips implements ControlValueAccessor, AfterViewInit {\r\n @ViewChild('badgeInput') badgeInput!: ElementRef<HTMLInputElement>;\r\n @ViewChild('fieldWrapper') fieldWrapper!: ElementRef<HTMLDivElement>;\r\n\r\n // --- Configuration Inputs ---\r\n @Input() id!: string ;\r\n @Input() name!: string ;\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() hint: string = '';\r\n @Input() required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() readOnly: boolean = false;\r\n /**\r\n * If true, displays the component in an error state (red border).\r\n * It also replaces the hint text with the error message.\r\n */\r\n @Input() hasError: boolean = false;\r\n @Input() errorMessage: string = 'This is a error message';\r\n // =================== Output Emitter ===================\r\n @Output() input = new EventEmitter<Event>();\r\n @Output() change = new EventEmitter<string[]>();\r\n\r\n @Output() focus = new EventEmitter<Event>();\r\n @Output() blur = new EventEmitter<Event>();\r\n // --- State Properties ---\r\n badges: string[] = [];\r\n inputValue: string = '';\r\n isFocused: boolean = false;\r\n needsScroll: boolean = false;\r\n\r\n // --- ControlValueAccessor Methods ---\r\n onChange: any = () => {};\r\n onTouched: any = () => {};\r\n\r\n // Get input state for styling variants\r\n get inputState(): 'default' | 'focused' | 'filled' | 'error' | 'disabled' {\r\n if (this.disabled) return 'disabled';\r\n if (this.hasError) return 'error';\r\n if (this.isFocused) return 'focused';\r\n if (this.badges.length > 0 || this.inputValue.length > 0) return 'filled';\r\n return 'default';\r\n }\r\n\r\n\r\n\r\n // Handle keydown events (Enter to add badge, Backspace to remove)\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n // Add badge on Enter or comma\r\n if (event.key === 'Enter' || event.key === ',') {\r\n event.preventDefault();\r\n this.addBadge();\r\n }\r\n // Remove last badge on Backspace when input is empty\r\n else if (event.key === 'Backspace' && this.inputValue === '' && this.badges.length > 0) {\r\n this.removeBadge(this.badges.length - 1);\r\n }\r\n }\r\n\r\n // Add a badge from the current input value\r\n addBadge(): void {\r\n const trimmedValue = this.inputValue.trim();\r\n if (trimmedValue && !this.badges.includes(trimmedValue)) {\r\n this.badges.push(trimmedValue);\r\n this.inputValue = '';\r\n this.updateValue();\r\n // Check if scroll is needed after adding badge (with delay for DOM update)\r\n setTimeout(() => this.checkScrollNeeded(), 10);\r\n } else if (trimmedValue && this.badges.includes(trimmedValue)) {\r\n // Optionally show a message that badge already exists\r\n this.inputValue = '';\r\n }\r\n }\r\n\r\n // Remove a badge at the given index\r\n removeBadge(index: number): void {\r\n if (this.disabled) return;\r\n this.badges.splice(index, 1);\r\n this.updateValue();\r\n // Check if scroll is needed after removing badge (with delay for DOM update)\r\n setTimeout(() => {\r\n this.checkScrollNeeded();\r\n if (this.badgeInput) {\r\n this.badgeInput.nativeElement.focus();\r\n }\r\n }, 10);\r\n }\r\n\r\n // Check if scrolling is needed (when content wraps)\r\n checkScrollNeeded(): void {\r\n if (this.fieldWrapper && this.fieldWrapper.nativeElement) {\r\n const wrapper = this.fieldWrapper.nativeElement;\r\n\r\n // Get all badge items\r\n const badgeItems = wrapper.querySelectorAll('.input-badge-item');\r\n\r\n if (badgeItems.length === 0) {\r\n // No badges, no scroll needed\r\n this.needsScroll = false;\r\n return;\r\n }\r\n\r\n // Get the first badge's top position\r\n const firstBadge = badgeItems[0] as HTMLElement;\r\n const firstBadgeTop = firstBadge.offsetTop;\r\n\r\n // Check if any badge is on a different line (different top position)\r\n let hasWrapped = false;\r\n for (let i = 1; i < badgeItems.length; i++) {\r\n const badge = badgeItems[i] as HTMLElement;\r\n // If a badge's top position is different, it means it wrapped to a new line\r\n if (Math.abs(badge.offsetTop - firstBadgeTop) > 5) {\r\n hasWrapped = true;\r\n break;\r\n }\r\n }\r\n\r\n // Also check if the input field is on a different line\r\n if (!hasWrapped && this.badgeInput && this.badgeInput.nativeElement) {\r\n const inputTop = this.badgeInput.nativeElement.offsetTop;\r\n if (Math.abs(inputTop - firstBadgeTop) > 5) {\r\n hasWrapped = true;\r\n }\r\n }\r\n\r\n // Only enable scroll if content actually wrapped\r\n this.needsScroll = hasWrapped;\r\n }\r\n }\r\n\r\n // Update the value and notify Angular Forms\r\n updateValue(): void {\r\n this.onChange([...this.badges]);\r\n this.change.emit([...this.badges]);\r\n }\r\n\r\n // Focus the input field\r\n focusInput(): void {\r\n if (!this.disabled && this.badgeInput) {\r\n this.badgeInput.nativeElement.focus();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Check scroll after view initializes\r\n setTimeout(() => this.checkScrollNeeded(), 10);\r\n }\r\n\r\n // Called when Angular writes a value TO the component (e.g. initial value)\r\n writeValue(value: any): void {\r\n if (Array.isArray(value)) {\r\n this.badges = [...value];\r\n } else {\r\n this.badges = [];\r\n }\r\n this.inputValue = '';\r\n // Check scroll after value is written (with delay for DOM update)\r\n setTimeout(() => this.checkScrollNeeded(), 10);\r\n }\r\n\r\n // Register function to call when value changes\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Register function to call when component is touched/blurred\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n // Called when the component is disabled via the form control\r\n setDisabledState(disabled: boolean): void {\r\n this.disabled = disabled;\r\n }\r\n\r\n // =================== Event Handlers ===================\r\n\r\n // Called when the value in the UI changes (user types)\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.inputValue = input.value;\r\n }\r\n\r\n\r\n handleFocus(event: Event): void {\r\n if (!this.disabled) {\r\n this.isFocused = true;\r\n }\r\n this.onChange([...this.badges]);\r\n this.focus.emit(event);\r\n }\r\n\r\n handleBlur(event:Event): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.onChange([...this.badges]);\r\n this.blur.emit(event);\r\n }\r\n\r\n\r\n\r\n}\r\n","<div class=\"input-badge-container\">\r\n @if (label) {\r\n <label\r\n [for]=\"id\"\r\n class=\"input-badge-label\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"input-badge-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"input-badge-wrapper\">\r\n <div\r\n #fieldWrapper\r\n class=\"input-badge-field-wrapper\"\r\n [ngClass]=\"{\r\n 'input-badge-field-wrapper--default': inputState === 'default',\r\n 'input-badge-field-wrapper--focused': inputState === 'focused',\r\n 'input-badge-field-wrapper--filled': inputState === 'filled',\r\n 'input-badge-field-wrapper--error': inputState === 'error',\r\n 'input-badge-field-wrapper--disabled': inputState === 'disabled',\r\n 'input-badge-field-wrapper--scrollable': needsScroll\r\n }\"\r\n (click)=\"focusInput()\"\r\n >\r\n <!-- Badges -->\r\n @for (badge of badges; track badge; let i = $index) {\r\n <div class=\"input-badge-item\">\r\n <span class=\"input-badge-item-text\">{{ badge }}</span>\r\n @if (!disabled) {\r\n <button type=\"button\" (click)=\"removeBadge(i); $event.stopPropagation()\"class=\"input-badge-item-close\" >\r\n <img src=\"../../../../assets/images/icons/global/badge-close.svg\" alt=\"Remove\" class=\"input-badge-item-close-icon\"/>\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Input Field -->\r\n <input\r\n #badgeInput\r\n type=\"text\"\r\n [id]=\"id\"\r\n [name]=\"name\"\r\n [value]=\"inputValue\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (input)=\"handleInput($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n [placeholder]=\"badges.length === 0 ? placeholder : ''\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n class=\"input-badge-input\"\r\n [ngClass]=\"{\r\n 'input-badge-input--default': inputState === 'default',\r\n 'input-badge-input--focused': inputState === 'focused',\r\n 'input-badge-input--filled': inputState === 'filled',\r\n 'input-badge-input--error': inputState === 'error',\r\n 'input-badge-input--disabled': inputState === 'disabled'\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"input-badge-footer\">\r\n <div class=\"input-badge-footer-content\">\r\n @if (hasError) {\r\n <span class=\"input-badge-error\"> {{ errorMessage }}</span>\r\n } @else if (hint) {\r\n <span class=\"input-badge-hint\"> {{ hint }}</span>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface TabItem {\r\n id: string;\r\n label: string;\r\n icon?: string; // Icon for inactive state\r\n iconActive?: string; // Icon for active state (optional, falls back to icon if not provided)\r\n iconAlt?: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'bk-tabs',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './tabs.html',\r\n styleUrl: './tabs.css',\r\n})\r\nexport class BkTabs {\r\n @Input() list: TabItem[] = [];\r\n @Input() activeTabId: string = '';\r\n @Input() disabled: boolean = false;\r\n\r\n @Output() change = new EventEmitter<TabItem>();\r\n\r\n // Set active tab and emit change event\r\n setActiveTab(tab:TabItem): void {\r\n debugger\r\n if (tab?.disabled || this.disabled) return;\r\n this.activeTabId = tab.id;\r\n this.change.emit(tab);\r\n\r\n }\r\n\r\n // Check if a tab is active\r\n isActive(tabId: string): boolean {\r\n return this.activeTabId === tabId;\r\n }\r\n\r\n // Get the appropriate icon for a tab based on its active state\r\n getTabIcon(tab: TabItem): string | undefined {\r\n if (this.isActive(tab.id) && tab.iconActive) {\r\n return tab.iconActive;\r\n }\r\n return tab.icon;\r\n }\r\n}\r\n","<div class=\"tabs-container\">\r\n <ul class=\"tabs-list\" role=\"tablist\">\r\n @for (tab of list; track tab.id; let i = $index) {\r\n <li class=\"tabs-item\" role=\"presentation\">\r\n <button\r\n type=\"button\"\r\n [id]=\"'tab-' + tab.id\"\r\n [attr.aria-selected]=\"isActive(tab.id)\"\r\n [attr.aria-controls]=\"'panel-' + tab.id\"\r\n [disabled]=\"tab.disabled\"\r\n [class.tabs-button--active]=\"isActive(tab.id)\"\r\n [class.tabs-button--disabled]=\"disabled || tab.disabled\"\r\n [class.tabs-button--no-icon]=\"!getTabIcon(tab)\"\r\n class=\"tabs-button\"\r\n (click)=\"setActiveTab(tab)\"\r\n role=\"tab\">\r\n @if (getTabIcon(tab)) {\r\n <img\r\n [src]=\"getTabIcon(tab)\"\r\n [alt]=\"tab.iconAlt || tab.label\"\r\n class=\"tabs-icon\">\r\n }\r\n <span class=\"tabs-label\">{{ tab.label }}</span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n</div>\r\n","/**\r\n * Dialog Injection Tokens\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * • `DIALOG_DATA` — Re-exported from `@angular/cdk/dialog` so that\r\n * consumers import from our barrel and the token identity matches\r\n * exactly what CDK's `Dialog` service provides in the injector.\r\n * This means `@Inject(DIALOG_DATA)` works without any extra wiring.\r\n *\r\n * • `DIALOG_GLOBAL_CONFIG` — Optional app-level defaults, same pattern\r\n * as before.\r\n *\r\n * • `INTERNAL_DIALOG_CONFIG` — Internal-only token used to pass our\r\n * full `DialogConfig` (including animation fields) to the custom\r\n * `DialogContainerComponent`. Not part of the public API.\r\n */\r\n\r\nimport { InjectionToken } from '@angular/core';\r\nimport { DIALOG_DATA as CDK_DIALOG_DATA } from '@angular/cdk/dialog';\r\nimport { DialogConfig } from './dialog-config';\r\n\r\n// ──── Public ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Injection token used to pass arbitrary data into a dialog component.\r\n *\r\n * This is CDK's own `DIALOG_DATA` token — re-exported so that imports\r\n * from our barrel (`shared/components/dialog`) resolve to the exact same\r\n * token that CDK's `Dialog` service provides.\r\n *\r\n * Usage inside a dialog component:\r\n * ```ts\r\n * constructor(@Inject(DIALOG_DATA) public data: MyDataType) {}\r\n * ```\r\n */\r\nexport const DIALOG_DATA = CDK_DIALOG_DATA;\r\n\r\n/**\r\n * Optional token for providing global dialog defaults at the\r\n * application level.\r\n *\r\n * Usage in `app.config.ts` or a module's `providers` array:\r\n * ```ts\r\n * providers: [\r\n * { provide: DIALOG_GLOBAL_CONFIG, useValue: { animation: 'zoom', width: '600px' } }\r\n * ]\r\n * ```\r\n */\r\nexport const DIALOG_GLOBAL_CONFIG = new InjectionToken<DialogConfig>(\r\n 'DIALOG_GLOBAL_CONFIG',\r\n);\r\n\r\n// ──── Internal ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Internal token that carries our full `DialogConfig` (with animation\r\n * settings, position offsets, etc.) into the `DialogContainerComponent`.\r\n *\r\n * @internal — not exported from the barrel; do not depend on it.\r\n */\r\nexport const INTERNAL_DIALOG_CONFIG = new InjectionToken<DialogConfig>(\r\n 'INTERNAL_DIALOG_CONFIG',\r\n);\r\n","/**\r\n * Dialog Animations\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Animations are implemented via the Web Animations API (WAAPI) instead of\r\n * Angular's @angular/animations so that:\r\n * 1. The dialog container stays truly standalone — no BrowserAnimationsModule\r\n * dependency is required.\r\n * 2. We have full programmatic control over timing, easing, and cleanup.\r\n * 3. Future presets can be added without touching the component template.\r\n *\r\n * Each preset exports an `enter` and `leave` keyframe array plus a\r\n * recommended timing object. The DialogContainerComponent plays these\r\n * via `element.animate()`.\r\n */\r\n\r\nimport { DialogAnimation } from './dialog-config';\r\n\r\nexport interface AnimationKeyframes {\r\n keyframes: Keyframe[];\r\n options: KeyframeAnimationOptions;\r\n}\r\n\r\n/**\r\n * Build enter/leave WAAPI keyframes for the dialog **panel** element.\r\n */\r\nexport function getDialogPanelAnimation(\r\n preset: DialogAnimation,\r\n enterDuration: number,\r\n leaveDuration: number\r\n): { enter: AnimationKeyframes; leave: AnimationKeyframes } {\r\n const easeEnter = 'cubic-bezier(0.0, 0.0, 0.2, 1)'; // decelerate\r\n const easeLeave = 'cubic-bezier(0.4, 0.0, 1, 1)'; // accelerate\r\n\r\n switch (preset) {\r\n // ─── Fade ────────────────────────────────────────────────────\r\n case 'fade':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'scale(0.95)' },\r\n { opacity: 1, transform: 'scale(1)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'scale(1)' },\r\n { opacity: 0, transform: 'scale(0.95)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Zoom ────────────────────────────────────────────────────\r\n case 'zoom':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'scale(0.5)' },\r\n { opacity: 1, transform: 'scale(1)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'scale(1)' },\r\n { opacity: 0, transform: 'scale(0.5)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Top ───────────────────────────────────────────────\r\n case 'slide-top':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateY(-40px)' },\r\n { opacity: 1, transform: 'translateY(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateY(0)' },\r\n { opacity: 0, transform: 'translateY(-40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Bottom ────────────────────────────────────────────\r\n case 'slide-bottom':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateY(40px)' },\r\n { opacity: 1, transform: 'translateY(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateY(0)' },\r\n { opacity: 0, transform: 'translateY(40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Left ──────────────────────────────────────────────\r\n case 'slide-left':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateX(-40px)' },\r\n { opacity: 1, transform: 'translateX(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateX(0)' },\r\n { opacity: 0, transform: 'translateX(-40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── Slide Right ─────────────────────────────────────────────\r\n case 'slide-right':\r\n return {\r\n enter: {\r\n keyframes: [\r\n { opacity: 0, transform: 'translateX(40px)' },\r\n { opacity: 1, transform: 'translateX(0)' },\r\n ],\r\n options: { duration: enterDuration, easing: easeEnter, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [\r\n { opacity: 1, transform: 'translateX(0)' },\r\n { opacity: 0, transform: 'translateX(40px)' },\r\n ],\r\n options: { duration: leaveDuration, easing: easeLeave, fill: 'forwards' },\r\n },\r\n };\r\n\r\n // ─── None ────────────────────────────────────────────────────\r\n case 'none':\r\n default:\r\n return {\r\n enter: {\r\n keyframes: [{ opacity: 1 }],\r\n options: { duration: 0, fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [{ opacity: 0 }],\r\n options: { duration: 0, fill: 'forwards' },\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Build enter/leave WAAPI keyframes for the **backdrop** element.\r\n * The backdrop always uses a simple opacity fade regardless of the\r\n * panel animation preset.\r\n */\r\nexport function getDialogBackdropAnimation(\r\n enterDuration: number,\r\n leaveDuration: number\r\n): { enter: AnimationKeyframes; leave: AnimationKeyframes } {\r\n return {\r\n enter: {\r\n keyframes: [{ opacity: 0 }, { opacity: 1 }],\r\n options: { duration: enterDuration, easing: 'ease-out', fill: 'forwards' },\r\n },\r\n leave: {\r\n keyframes: [{ opacity: 1 }, { opacity: 0 }],\r\n options: { duration: leaveDuration, easing: 'ease-in', fill: 'forwards' },\r\n },\r\n };\r\n}\r\n","/**\r\n * DialogContainerComponent\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Extends CDK's `CdkDialogContainer` — the headless base class that\r\n * provides:\r\n * • Focus-trap management (tab key stays inside the dialog).\r\n * • Auto-focus / restore-focus behaviour.\r\n * • Portal outlet (`<ng-template cdkPortalOutlet />`) for dynamic\r\n * component projection.\r\n * • ARIA attribute management on the host element.\r\n *\r\n * We add:\r\n * • WAAPI enter / leave animations on the panel (host element) and\r\n * the CDK backdrop sibling.\r\n * • Flex-column styles on the dynamically created component host so\r\n * `.bk-dialog-content` scrolls and `.bk-dialog-actions` stays pinned.\r\n * • Position-offset application via CSS margin.\r\n *\r\n * This component is **never** used directly — it is created internally\r\n * by `DialogService` via CDK's `Dialog.open()`.\r\n */\r\n\r\nimport {\r\n Component,\r\n ComponentRef,\r\n inject,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CdkDialogContainer } from '@angular/cdk/dialog';\r\nimport { CdkPortalOutlet, ComponentPortal } from '@angular/cdk/portal';\r\n\r\nimport { DialogConfig } from './dialog-config';\r\nimport { INTERNAL_DIALOG_CONFIG } from './dialog.tokens';\r\nimport {\r\n getDialogPanelAnimation,\r\n getDialogBackdropAnimation,\r\n} from './dialog-animations';\r\n\r\n@Component({\r\n selector: 'bk-dialog-container',\r\n standalone: true,\r\n imports: [CdkPortalOutlet],\r\n templateUrl: './dialog-container.html',\r\n styleUrl: './dialog-container.css',\r\n host: {\r\n 'class': 'bk-dialog-container',\r\n },\r\n})\r\nexport class DialogContainerComponent extends CdkDialogContainer implements OnInit {\r\n\r\n /**\r\n * Our full config (including animation fields).\r\n * Provided by DialogService via the INTERNAL_DIALOG_CONFIG token.\r\n */\r\n private readonly _dialogConfig: DialogConfig = inject(INTERNAL_DIALOG_CONFIG);\r\n\r\n // ──── Opened promise ─────────────────────────────────────────────────\r\n /**\r\n * Resolves when the enter animation finishes (or immediately for 'none').\r\n * `DialogService` subscribes via `.then()` to emit `afterOpened` on the\r\n * `DialogRef`.\r\n */\r\n private _resolveOpened!: () => void;\r\n readonly opened = new Promise<void>(resolve => {\r\n this._resolveOpened = resolve;\r\n });\r\n\r\n // ──── Lifecycle ──────────────────────────────────────────────────────\r\n\r\n ngOnInit(): void {\r\n this._playEnterAnimation();\r\n this._applyPositionOffsets();\r\n }\r\n\r\n // ──── Portal override ────────────────────────────────────────────────\r\n\r\n /**\r\n * Override the CDK base to apply flex-column layout on the dynamically\r\n * created component's host element.\r\n *\r\n * Angular's emulated view encapsulation prevents scoped CSS from reaching\r\n * dynamically-projected elements, so we set styles programmatically.\r\n */\r\n override attachComponentPortal<C>(portal: ComponentPortal<C>): ComponentRef<C> {\r\n const ref = super.attachComponentPortal(portal);\r\n const el = ref.location.nativeElement as HTMLElement;\r\n el.style.display = 'flex';\r\n el.style.flexDirection = 'column';\r\n el.style.flex = '1 1 auto';\r\n el.style.minHeight = '0';\r\n el.style.overflow = 'hidden';\r\n return ref;\r\n }\r\n\r\n // ──── WAAPI Animations ───────────────────────────────────────────────\r\n\r\n /**\r\n * Play the enter animation on the panel (host element) and backdrop.\r\n * Resolves the `opened` promise when the panel animation finishes.\r\n */\r\n private _playEnterAnimation(): void {\r\n const preset = this._dialogConfig.animation ?? 'fade';\r\n\r\n if (preset === 'none') {\r\n this._resolveOpened();\r\n return;\r\n }\r\n\r\n const enterDur = this._dialogConfig.animationDurationEnter ?? 200;\r\n const leaveDur = this._dialogConfig.animationDurationLeave ?? 150;\r\n\r\n // ── Panel animation ──\r\n const panelAnim = getDialogPanelAnimation(preset, enterDur, leaveDur);\r\n const anim = this._elementRef.nativeElement.animate(\r\n panelAnim.enter.keyframes,\r\n panelAnim.enter.options,\r\n );\r\n\r\n // ── Backdrop animation ──\r\n const backdropEl = this._getBackdropElement();\r\n if (backdropEl) {\r\n // Override CDK's CSS transition so our WAAPI timing wins.\r\n backdropEl.style.transition = 'none';\r\n backdropEl.style.backgroundColor = 'var(--dialog-backdrop-bg, rgba(0, 0, 0, 0.5))';\r\n const bdAnim = getDialogBackdropAnimation(enterDur, leaveDur);\r\n backdropEl.animate(bdAnim.enter.keyframes, bdAnim.enter.options);\r\n }\r\n\r\n anim.onfinish = () => this._resolveOpened();\r\n }\r\n\r\n /**\r\n * Play the leave animation. Returns a Promise that resolves when done.\r\n * Called by `DialogRef._runCloseSequence()` before CDK tears down the\r\n * overlay.\r\n */\r\n playLeaveAnimation(): Promise<void> {\r\n const preset = this._dialogConfig.animation ?? 'fade';\r\n if (preset === 'none') return Promise.resolve();\r\n\r\n const enterDur = this._dialogConfig.animationDurationEnter ?? 200;\r\n const leaveDur = this._dialogConfig.animationDurationLeave ?? 150;\r\n\r\n return new Promise<void>(resolve => {\r\n // ── Panel ──\r\n const panelAnim = getDialogPanelAnimation(preset, enterDur, leaveDur);\r\n const anim = this._elementRef.nativeElement.animate(\r\n panelAnim.leave.keyframes,\r\n panelAnim.leave.options,\r\n );\r\n\r\n // ── Backdrop ──\r\n const backdropEl = this._getBackdropElement();\r\n if (backdropEl) {\r\n const bdAnim = getDialogBackdropAnimation(enterDur, leaveDur);\r\n backdropEl.animate(bdAnim.leave.keyframes, bdAnim.leave.options);\r\n }\r\n\r\n anim.onfinish = () => resolve();\r\n // Safety net — resolve even if onfinish never fires (SSR, etc.).\r\n setTimeout(() => resolve(), leaveDur + 50);\r\n });\r\n }\r\n\r\n // ──── Position Offsets ───────────────────────────────────────────────\r\n\r\n /**\r\n * Apply explicit position offsets via CSS margin.\r\n * These are additive to CDK's `GlobalPositionStrategy` alignment.\r\n */\r\n private _applyPositionOffsets(): void {\r\n const pos = this._dialogConfig.position;\r\n if (!pos) return;\r\n\r\n const el = this._elementRef.nativeElement;\r\n if (pos.top) el.style.marginTop = pos.top;\r\n if (pos.bottom) el.style.marginBottom = pos.bottom;\r\n if (pos.left) el.style.marginLeft = pos.left;\r\n if (pos.right) el.style.marginRight = pos.right;\r\n }\r\n\r\n // ──── Helpers ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * CDK places the backdrop as a sibling of `.cdk-overlay-pane`.\r\n * Walk up from our host → pane → wrapper, then query for the backdrop.\r\n */\r\n private _getBackdropElement(): HTMLElement | null {\r\n const pane = this._elementRef.nativeElement.closest('.cdk-overlay-pane');\r\n return pane?.parentElement?.querySelector<HTMLElement>('.cdk-overlay-backdrop') ?? null;\r\n }\r\n}\r\n","<!--\r\n Dialog Container Template (CDK-based)\r\n\r\n Architecture:\r\n ─────────────\r\n CDK Overlay manages the full overlay stack:\r\n\r\n ┌─ .cdk-overlay-container (fixed, z-index managed by CDK) ──────┐\r\n │ ┌─ .cdk-global-overlay-wrapper (flex-center) ──────────────┐ │\r\n │ │ .cdk-overlay-backdrop (click → close, CDK transition) │ │\r\n │ │ ┌─ .cdk-overlay-pane (width/height from config) ──────┐ │ │\r\n │ │ │ <bk-dialog-container> ← this component (panel) │ │ │\r\n │ │ │ <ng-template cdkPortalOutlet /> ← user component │ │ │\r\n │ │ │ <UserDialogComponent> │ │ │\r\n │ │ │ <h2 bk-dialog-title>Title</h2> │ │ │\r\n │ │ │ <div bk-dialog-content>Scrollable body</div> │ │ │\r\n │ │ │ <div bk-dialog-actions>Pinned buttons</div> │ │ │\r\n │ │ │ </UserDialogComponent> │ │ │\r\n │ │ │ </bk-dialog-container> │ │ │\r\n │ │ └──────────────────────────────────────────────────────┘ │ │\r\n │ └──────────────────────────────────────────────────────────┘ │\r\n └──────────────────────────────────────────────────────────────┘\r\n\r\n The host element IS the visible panel (background, radius, shadow).\r\n CDK Portal projects the caller's component as a direct child.\r\n\r\n Directives (BkDialogTitle, BkDialogContent, BkDialogActions, BkDialogClose)\r\n apply the corresponding CSS classes and add accessibility features.\r\n-->\r\n\r\n<ng-template cdkPortalOutlet />\r\n","/**\r\n * DialogRef — Handle returned to callers by `DialogService.open()`.\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Wraps CDK's `DialogRef` to add:\r\n * • WAAPI leave-animation before CDK tears down the overlay.\r\n * • Per-instance `afterOpened()` observable (CDK only has a service-level\r\n * `afterOpened` Subject).\r\n * • The same familiar API shape used by callers (`close`, `afterClosed`,\r\n * `backdropClick`, `keydownEvents`, `componentInstance`).\r\n *\r\n * CDK's `DialogRef<R, C>` has Result first, Component second.\r\n * Ours keeps `<T, R>` (Component first, Result second) to match the\r\n * convention consumers already use.\r\n */\r\n\r\nimport { DialogRef as CdkDialogRef } from '@angular/cdk/dialog';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\n/**\r\n * Minimal interface for the container's capabilities.\r\n * Avoids a direct import of `DialogContainerComponent` in this file\r\n * (container imports nothing from ref, so no cycle, but this keeps\r\n * the coupling lightweight).\r\n *\r\n * The optional ARIA methods are inherited from `CdkDialogContainer`\r\n * and used by `BkDialogTitle` to register/deregister title IDs for\r\n * the `aria-labelledby` attribute.\r\n */\r\nexport interface DialogAnimatable {\r\n playLeaveAnimation(): Promise<void>;\r\n _addAriaLabelledBy?(id: string): void;\r\n _removeAriaLabelledBy?(id: string): void;\r\n}\r\n\r\nexport class DialogRef<T = unknown, R = unknown> {\r\n /** Unique dialog identifier (managed by CDK). */\r\n readonly id: string;\r\n\r\n /** Instance of the component rendered inside the dialog. */\r\n componentInstance!: T;\r\n\r\n // ──── Internal wiring (set by DialogService) ──────────────────────────\r\n\r\n /** @internal Container reference for leave animation. */\r\n _containerInstance!: DialogAnimatable;\r\n\r\n /** @internal Prevent double-close. */\r\n private _closing = false;\r\n\r\n /** @internal Per-instance afterOpened Subject. */\r\n private readonly _afterOpened$ = new Subject<void>();\r\n\r\n constructor(\r\n /**\r\n * @internal Wrapped CDK ref.\r\n * Typed as `CdkDialogRef<any>` to avoid deep generic-variance issues\r\n * that arise from CDK's `config.providers` callback signature.\r\n * The public API (`afterClosed`, etc.) re-types the observables.\r\n */\r\n readonly _cdkRef: CdkDialogRef<any>,\r\n ) {\r\n this.id = _cdkRef.id;\r\n }\r\n\r\n // ──── Public API ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Close the dialog, optionally returning a result.\r\n * Plays the WAAPI leave animation, then delegates to CDK for cleanup.\r\n */\r\n close(result?: R): void {\r\n if (this._closing) return;\r\n this._closing = true;\r\n this._runCloseSequence(result);\r\n }\r\n\r\n /**\r\n * Observable that emits (and completes) once after the dialog has been\r\n * removed from the DOM and all cleanup is done.\r\n */\r\n afterClosed(): Observable<R | undefined> {\r\n return this._cdkRef.closed as Observable<R | undefined>;\r\n }\r\n\r\n /**\r\n * Observable that emits (and completes) when the enter animation\r\n * finishes and the dialog is fully visible.\r\n */\r\n afterOpened(): Observable<void> {\r\n return this._afterOpened$.asObservable();\r\n }\r\n\r\n /**\r\n * Observable of backdrop / outside-pointer click events.\r\n */\r\n backdropClick(): Observable<MouseEvent> {\r\n return this._cdkRef.outsidePointerEvents;\r\n }\r\n\r\n /**\r\n * Observable of keyboard events dispatched while this dialog is open.\r\n */\r\n keydownEvents(): Observable<KeyboardEvent> {\r\n return this._cdkRef.keydownEvents;\r\n }\r\n\r\n // ──── Internal helpers ────────────────────────────────────────────────\r\n\r\n /** @internal Called by the container once the enter animation finishes. */\r\n _emitOpened(): void {\r\n this._afterOpened$.next();\r\n this._afterOpened$.complete();\r\n }\r\n\r\n /** Play leave animation, then close via CDK. */\r\n private async _runCloseSequence(result?: R): Promise<void> {\r\n try {\r\n await this._containerInstance.playLeaveAnimation();\r\n } catch {\r\n // Animation may fail in SSR / test — proceed anyway.\r\n }\r\n this._cdkRef.close(result);\r\n }\r\n}\r\n","/**\r\n * Dialog Configuration\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Our `DialogConfig` mirrors the fields from CDK's `DialogConfig` that we\r\n * expose, plus adds custom animation properties powered by WAAPI.\r\n *\r\n * When `DialogService.open()` is called these values are:\r\n * 1. Merged with global defaults and per-call overrides.\r\n * 2. Mapped onto CDK's native `DialogConfig` for overlay, backdrop, scroll,\r\n * position, ARIA, and focus-trap management.\r\n * 3. Passed to `DialogContainerComponent` via an internal token for\r\n * animation playback and position offsets.\r\n *\r\n * CDK handles: unique IDs, z-index stacking, scroll blocking, focus trap,\r\n * backdrop rendering, overlay positioning, keyboard events.\r\n * We handle: WAAPI animations, panel appearance, convenience config sugar.\r\n */\r\n\r\nimport { ScrollStrategy } from '@angular/cdk/overlay';\r\n\r\n// ──── Animation Types ────────────────────────────────────────────────────\r\n\r\n/**\r\n * Built-in WAAPI animation presets.\r\n * 'none' disables animation entirely.\r\n */\r\nexport type DialogAnimation =\r\n | 'none'\r\n | 'fade'\r\n | 'zoom'\r\n | 'slide-top'\r\n | 'slide-bottom'\r\n | 'slide-left'\r\n | 'slide-right';\r\n\r\n// ──── Position ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Fine-grained position offsets.\r\n * When provided, the dialog shifts from the default centred position.\r\n * Internally this is mapped to CDK's `GlobalPositionStrategy`.\r\n */\r\nexport interface DialogPosition {\r\n top?: string;\r\n bottom?: string;\r\n left?: string;\r\n right?: string;\r\n}\r\n\r\n// ──── Main Config ────────────────────────────────────────────────────────\r\n\r\nexport interface DialogConfig<D = unknown> {\r\n // ── Identity ──────────────────────────────────────────────────────────\r\n /**\r\n * Unique dialog identifier.\r\n * CDK auto-generates one if omitted and validates uniqueness —\r\n * opening a second dialog with the same ID throws at runtime.\r\n */\r\n id?: string;\r\n\r\n // ── Sizing ────────────────────────────────────────────────────────────\r\n width?: string;\r\n height?: string;\r\n minWidth?: string | number;\r\n minHeight?: string | number;\r\n maxWidth?: string | number;\r\n maxHeight?: string | number;\r\n\r\n // ── Behaviour ─────────────────────────────────────────────────────────\r\n /**\r\n * Master lock — when `true`, neither ESC nor backdrop click closes\r\n * the dialog (same semantics as `MatDialogConfig.disableClose`).\r\n */\r\n disableClose?: boolean;\r\n\r\n /**\r\n * Close when backdrop is clicked. Default `true`.\r\n * Ignored when `disableClose` is `true`.\r\n */\r\n closeOnBackdrop?: boolean;\r\n\r\n /**\r\n * Close when Escape key is pressed. Default `true`.\r\n * Ignored when `disableClose` is `true`.\r\n */\r\n closeOnEsc?: boolean;\r\n\r\n /** Show a backdrop behind the dialog. Default `true`. */\r\n hasBackdrop?: boolean;\r\n\r\n /**\r\n * Block body scroll while the dialog is open. Default `true`.\r\n * Mapped to CDK `BlockScrollStrategy` / `NoopScrollStrategy`.\r\n */\r\n lockScroll?: boolean;\r\n\r\n // ── Styling ───────────────────────────────────────────────────────────\r\n /** Extra CSS class(es) applied to the CDK overlay pane. */\r\n panelClass?: string | string[];\r\n /** Extra CSS class(es) applied to the CDK backdrop element. */\r\n backdropClass?: string | string[];\r\n\r\n // ── Data ──────────────────────────────────────────────────────────────\r\n /** Payload injected into the dialog component via `DIALOG_DATA`. */\r\n data?: D;\r\n\r\n // ── Animation (WAAPI) ─────────────────────────────────────────────────\r\n /** Panel animation preset. Default `'fade'`. */\r\n animation?: DialogAnimation;\r\n /** Enter animation duration in ms. Default `200`. */\r\n animationDurationEnter?: number;\r\n /** Leave animation duration in ms. Default `150`. */\r\n animationDurationLeave?: number;\r\n\r\n // ── Position ──────────────────────────────────────────────────────────\r\n /** Position offsets — moves the dialog from its default centred position. */\r\n position?: DialogPosition;\r\n\r\n // ── Accessibility ─────────────────────────────────────────────────────\r\n role?: 'dialog' | 'alertdialog';\r\n ariaLabel?: string;\r\n ariaLabelledBy?: string;\r\n ariaDescribedBy?: string;\r\n /**\r\n * Where to send focus when the dialog opens.\r\n * `true` → first tabbable element (default).\r\n * `false` → no auto-focus.\r\n * A CSS selector string → that element.\r\n */\r\n autoFocus?: boolean | string;\r\n /** Restore focus to the previously-focused element on close. */\r\n restoreFocus?: boolean;\r\n\r\n // ── Advanced ──────────────────────────────────────────────────────────\r\n /** Override CDK's scroll strategy for this dialog. */\r\n scrollStrategy?: ScrollStrategy;\r\n}\r\n\r\n// ──── Defaults ───────────────────────────────────────────────────────────\r\n\r\nexport const DEFAULT_DIALOG_CONFIG: DialogConfig = {\r\n id: undefined,\r\n width: undefined,\r\n height: undefined,\r\n minWidth: undefined,\r\n minHeight: undefined,\r\n maxWidth: '90vw',\r\n maxHeight: '90vh',\r\n disableClose: false,\r\n closeOnBackdrop: true,\r\n closeOnEsc: true,\r\n hasBackdrop: true,\r\n lockScroll: true,\r\n panelClass: '',\r\n backdropClass: '',\r\n data: undefined,\r\n animation: 'fade',\r\n animationDurationEnter: 200,\r\n animationDurationLeave: 150,\r\n position: undefined,\r\n role: 'dialog',\r\n ariaLabel: undefined,\r\n ariaLabelledBy: undefined,\r\n ariaDescribedBy: undefined,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n scrollStrategy: undefined,\r\n};\r\n","/**\r\n * DialogService — The core engine of the custom dialog system.\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Built on top of Angular CDK's `Dialog` service (the same foundation\r\n * that `MatDialog` uses internally):\r\n *\r\n * 1. CDK creates the overlay, backdrop, scroll-blocking, focus-trap,\r\n * z-index stacking, and unique ID management — battle-tested infra\r\n * shared with every Angular Material dialog in the ecosystem.\r\n *\r\n * 2. We provide our own `DialogContainerComponent` (extending\r\n * `CdkDialogContainer`) for WAAPI animations and panel styling.\r\n *\r\n * 3. We wrap CDK's `DialogRef` in our own `DialogRef` to add the\r\n * leave-animation step before CDK tears down the overlay, and to\r\n * expose the same familiar API shape (`afterClosed()`, etc.).\r\n *\r\n * 4. Configuration is merged DEFAULT → GLOBAL → per-call, then mapped\r\n * to CDK's native config with our extras carried via an internal\r\n * injection token.\r\n *\r\n * What CDK handles for us (no custom code needed):\r\n * ─────────────────────────────────────────────────\r\n * ✓ Unique dialog IDs (throws on collision)\r\n * ✓ Z-index stacking via `.cdk-overlay-container`\r\n * ✓ Focus trap (tab key stays inside dialog)\r\n * ✓ Auto-focus / restore-focus\r\n * ✓ Scroll blocking (BlockScrollStrategy)\r\n * ✓ Backdrop rendering and click detection\r\n * ✓ Keyboard event forwarding\r\n * ✓ Overlay DOM lifecycle (create → attach → detach → dispose)\r\n *\r\n * Memory safety:\r\n * ─────────────\r\n * CDK manages the full lifecycle: on close it detaches the overlay,\r\n * destroys the container, and disposes the overlay ref.\r\n * Our DialogRef subjects complete via CDK's `closed` observable,\r\n * preventing lingering subscriptions.\r\n */\r\n\r\nimport {\r\n inject,\r\n Injectable,\r\n Type,\r\n} from '@angular/core';\r\nimport { Dialog } from '@angular/cdk/dialog';\r\nimport { Overlay } from '@angular/cdk/overlay';\r\nimport { filter } from 'rxjs';\r\n\r\nimport { DialogConfig, DEFAULT_DIALOG_CONFIG } from './dialog-config';\r\nimport { DialogRef } from './dialog-ref';\r\nimport { DialogContainerComponent } from './dialog-container';\r\nimport { DIALOG_GLOBAL_CONFIG, INTERNAL_DIALOG_CONFIG } from './dialog.tokens';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DialogService {\r\n private readonly _cdkDialog = inject(Dialog);\r\n private readonly _overlay = inject(Overlay);\r\n private readonly _globalConfig: DialogConfig | null =\r\n inject(DIALOG_GLOBAL_CONFIG, { optional: true });\r\n\r\n /** Stack of currently open dialog refs (most recent = last). */\r\n private readonly _openDialogRefs: DialogRef<any, any>[] = [];\r\n\r\n // ════════════════════════════════════════════════════════════════════\r\n // Public API\r\n // ════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Open a dialog containing the given component.\r\n *\r\n * @param component The component class to render inside the dialog.\r\n * @param config Optional per-dialog configuration (merged on top\r\n * of global and default settings).\r\n * @returns A strongly-typed `DialogRef` to interact with.\r\n *\r\n * @example\r\n * ```ts\r\n * const ref = this.dialog.open(UserFormComponent, {\r\n * width: '500px',\r\n * data: { userId: 10 },\r\n * });\r\n * ref.afterClosed().subscribe(result => console.log(result));\r\n * ```\r\n */\r\n open<T, D = unknown, R = unknown>(\r\n component: Type<T>,\r\n config?: DialogConfig<D>,\r\n ): DialogRef<T, R> {\r\n // ── 1. Merge configs: DEFAULT ← GLOBAL ← per-call ──────────────\r\n const mergedConfig = {\r\n ...DEFAULT_DIALOG_CONFIG,\r\n ...(this._globalConfig ?? {}),\r\n ...(config ?? {}),\r\n } as DialogConfig<D>;\r\n\r\n // ── 2. Prepare the return ref (set inside providers callback) ───\r\n let ourRef!: DialogRef<T, R>;\r\n\r\n // ── 3. Build CDK-native config ──────────────────────────────────\r\n const cdkConfig = {\r\n // Identity\r\n id: mergedConfig.id,\r\n\r\n // Sizing (applied on .cdk-overlay-pane)\r\n width: mergedConfig.width,\r\n height: mergedConfig.height,\r\n minWidth: mergedConfig.minWidth,\r\n minHeight: mergedConfig.minHeight,\r\n maxWidth: mergedConfig.maxWidth ?? '90vw',\r\n maxHeight: mergedConfig.maxHeight ?? '90vh',\r\n\r\n // Backdrop\r\n hasBackdrop: mergedConfig.hasBackdrop !== false,\r\n backdropClass: mergedConfig.backdropClass || 'cdk-overlay-dark-backdrop',\r\n\r\n // Panel class (always include our base class)\r\n panelClass: this._buildPanelClasses(mergedConfig),\r\n\r\n // Data (CDK provides this as DIALOG_DATA automatically)\r\n data: mergedConfig.data,\r\n\r\n // We manage close ourselves for fine-grained closeOnBackdrop / closeOnEsc.\r\n disableClose: true,\r\n\r\n // Accessibility\r\n autoFocus: mergedConfig.autoFocus ?? true,\r\n restoreFocus: mergedConfig.restoreFocus ?? true,\r\n role: mergedConfig.role ?? 'dialog',\r\n ariaLabel: mergedConfig.ariaLabel ?? null,\r\n ariaLabelledBy: mergedConfig.ariaLabelledBy ?? null,\r\n ariaDescribedBy: mergedConfig.ariaDescribedBy ?? null,\r\n\r\n // Scroll strategy\r\n scrollStrategy:\r\n mergedConfig.scrollStrategy ??\r\n (mergedConfig.lockScroll !== false\r\n ? this._overlay.scrollStrategies.block()\r\n : this._overlay.scrollStrategies.noop()),\r\n\r\n // Position strategy (centered by default, shifted by offsets)\r\n positionStrategy: this._buildPositionStrategy(mergedConfig),\r\n\r\n // ── Custom container ──────────────────────────────────────────\r\n container: {\r\n type: DialogContainerComponent,\r\n providers: () => [\r\n { provide: INTERNAL_DIALOG_CONFIG, useValue: mergedConfig },\r\n ],\r\n },\r\n\r\n // ── Provider callback ─────────────────────────────────────────\r\n // Runs after the container is created but before the user\r\n // component. We create our `DialogRef` wrapper here and make\r\n // it available for injection in the user component.\r\n providers: (\r\n cdkRef: any,\r\n _cdkConfig: any,\r\n containerInstance: any,\r\n ) => {\r\n ourRef = new DialogRef<T, R>(cdkRef);\r\n ourRef._containerInstance = containerInstance as DialogContainerComponent;\r\n\r\n // Wire up afterOpened emission.\r\n (containerInstance as DialogContainerComponent).opened\r\n .then(() => ourRef._emitOpened());\r\n\r\n return [\r\n { provide: DialogRef, useValue: ourRef },\r\n ];\r\n },\r\n };\r\n\r\n // ── 4. Open via CDK ─────────────────────────────────────────────\r\n const cdkRef = this._cdkDialog.open(component, cdkConfig as any);\r\n\r\n // ── 5. Link componentInstance ───────────────────────────────────\r\n ourRef.componentInstance = cdkRef.componentInstance as T;\r\n\r\n // ── 6. Set up close-on-backdrop / close-on-ESC ──────────────────\r\n this._setupCloseListeners(ourRef, mergedConfig);\r\n\r\n // ── 7. Track in stack ───────────────────────────────────────────\r\n this._openDialogRefs.push(ourRef);\r\n\r\n // ── 8. Cleanup on close ─────────────────────────────────────────\r\n ourRef.afterClosed().subscribe(() => {\r\n const idx = this._openDialogRefs.indexOf(ourRef);\r\n if (idx !== -1) this._openDialogRefs.splice(idx, 1);\r\n });\r\n\r\n return ourRef;\r\n }\r\n\r\n /**\r\n * Close all currently open dialogs (most recent first).\r\n */\r\n closeAll(): void {\r\n for (let i = this._openDialogRefs.length - 1; i >= 0; i--) {\r\n this._openDialogRefs[i]!.close();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the `DialogRef` of the most recently opened dialog,\r\n * or `undefined` if none are open.\r\n */\r\n getTopDialog(): DialogRef | undefined {\r\n return this._openDialogRefs[this._openDialogRefs.length - 1];\r\n }\r\n\r\n /**\r\n * Get a dialog by its CDK-managed unique ID.\r\n */\r\n getDialogById(id: string): DialogRef | undefined {\r\n return this._openDialogRefs.find(r => r.id === id);\r\n }\r\n\r\n /**\r\n * Number of currently open dialogs.\r\n */\r\n get openDialogCount(): number {\r\n return this._openDialogRefs.length;\r\n }\r\n\r\n /**\r\n * Read-only snapshot of currently open dialog refs.\r\n * Used internally by content directives (`BkDialogTitle`, `BkDialogActions`,\r\n * `BkDialogClose`) for the DOM-walk fallback when `DialogRef` is not\r\n * available via injection (e.g. inside `<ng-template>`).\r\n */\r\n get openDialogsRef(): readonly DialogRef[] {\r\n return this._openDialogRefs;\r\n }\r\n\r\n // ════════════════════════════════════════════════════════════════════\r\n // Convenience Helpers\r\n // ════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Open a simple confirmation dialog.\r\n * Resolves `true` if the user confirms, `false` otherwise.\r\n *\r\n * @example\r\n * ```ts\r\n * const ref = this.dialog.confirm({\r\n * message: 'Delete this item?',\r\n * component: ConfirmDialogComponent,\r\n * });\r\n * ref.afterClosed().subscribe(yes => { if (yes) ... });\r\n * ```\r\n */\r\n confirm(options: {\r\n title?: string;\r\n message: string;\r\n btnOkText?: string;\r\n btnCancelText?: string;\r\n width?: string;\r\n component: Type<unknown>;\r\n }): DialogRef<unknown, boolean> {\r\n return this.open<unknown, unknown, boolean>(options.component, {\r\n width: options.width ?? '400px',\r\n disableClose: true,\r\n closeOnBackdrop: false,\r\n animation: 'fade',\r\n data: {\r\n title: options.title ?? 'Confirm',\r\n message: options.message,\r\n btnOkText: options.btnOkText ?? 'Yes',\r\n btnCancelText: options.btnCancelText ?? 'No',\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Open a simple alert dialog.\r\n */\r\n alert(options: {\r\n title?: string;\r\n message: string;\r\n btnOkText?: string;\r\n width?: string;\r\n component: Type<unknown>;\r\n }): DialogRef<unknown, void> {\r\n return this.open<unknown, unknown, void>(options.component, {\r\n width: options.width ?? '400px',\r\n disableClose: true,\r\n closeOnBackdrop: false,\r\n animation: 'fade',\r\n data: {\r\n title: options.title ?? 'Alert',\r\n message: options.message,\r\n btnOkText: options.btnOkText ?? 'OK',\r\n },\r\n });\r\n }\r\n\r\n // ════════════════════════════════════════════════════════════════════\r\n // Private\r\n // ════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Subscribe to backdrop-click and ESC events on the CDK ref,\r\n * closing the dialog based on our config flags.\r\n *\r\n * We always set CDK `disableClose: true` so that CDK never auto-closes;\r\n * this gives us fine-grained control over `closeOnBackdrop` and\r\n * `closeOnEsc` independently.\r\n */\r\n private _setupCloseListeners(ref: DialogRef, config: DialogConfig): void {\r\n if (config.disableClose) return;\r\n\r\n // Backdrop click\r\n if (config.closeOnBackdrop !== false) {\r\n ref.backdropClick().subscribe(() => ref.close());\r\n }\r\n\r\n // ESC key\r\n if (config.closeOnEsc !== false) {\r\n ref.keydownEvents()\r\n .pipe(filter((e: KeyboardEvent) => e.key === 'Escape' || e.key === 'Esc'))\r\n .subscribe((e: KeyboardEvent) => {\r\n e.preventDefault();\r\n ref.close();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Build the CSS classes for the CDK overlay pane.\r\n * Always includes our base class; adds user-provided classes on top.\r\n */\r\n private _buildPanelClasses(config: DialogConfig): string[] {\r\n const classes = ['bk-dialog-pane'];\r\n if (config.panelClass) {\r\n if (Array.isArray(config.panelClass)) {\r\n classes.push(...config.panelClass);\r\n } else {\r\n classes.push(config.panelClass);\r\n }\r\n }\r\n return classes;\r\n }\r\n\r\n /**\r\n * Build CDK's `GlobalPositionStrategy` from our position config.\r\n * Falls back to centred (both axes) when no position is specified.\r\n */\r\n private _buildPositionStrategy(config: DialogConfig) {\r\n const strategy = this._overlay.position().global();\r\n\r\n if (config.position?.top) {\r\n strategy.top(config.position.top);\r\n } else if (config.position?.bottom) {\r\n strategy.bottom(config.position.bottom);\r\n } else {\r\n strategy.centerVertically();\r\n }\r\n\r\n if (config.position?.left) {\r\n strategy.left(config.position.left);\r\n } else if (config.position?.right) {\r\n strategy.right(config.position.right);\r\n } else {\r\n strategy.centerHorizontally();\r\n }\r\n\r\n return strategy;\r\n }\r\n}\r\n","/**\r\n * Dialog Content Directives\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * These directives mirror Angular Material's dialog content directives:\r\n *\r\n * MatDialogTitle → BkDialogTitle\r\n * MatDialogContent → BkDialogContent\r\n * MatDialogActions → BkDialogActions\r\n * MatDialogClose → BkDialogClose\r\n *\r\n * Each directive:\r\n * 1. Applies the corresponding CSS host class (e.g. `bk-dialog-content`)\r\n * that is styled in `dialog-container.css` via `::ng-deep`.\r\n * 2. Provides extra accessibility or behavioural features on top of the\r\n * plain CSS class.\r\n *\r\n * Consumers can still use the raw CSS classes directly (without importing\r\n * these directives) for backward compatibility, but the directives are\r\n * preferred because they add CdkScrollable, ARIA integration, and one-click\r\n * close behaviour.\r\n *\r\n * @see https://github.com/angular/components/blob/main/src/material/dialog/dialog-content-directives.ts\r\n */\r\n\r\nimport {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CdkScrollable } from '@angular/cdk/scrolling';\r\n\r\nimport { DialogRef } from './dialog-ref';\r\nimport { DialogService } from './dialog.service';\r\n\r\n// ──── ID Generation ──────────────────────────────────────────────────────\r\n\r\nlet nextTitleId = 0;\r\n\r\n// ──── Helper ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Finds the closest `DialogRef` by walking up the DOM from the given\r\n * element to the nearest `bk-dialog-container` host, then matching its\r\n * `id` attribute against the currently open dialogs.\r\n *\r\n * This fallback is necessary when a directive lives inside an\r\n * `<ng-template>` (TemplateRef), where the dialog's custom injector is\r\n * not available.\r\n *\r\n * @see Material's `getClosestDialog` in `dialog-content-directives.ts`\r\n */\r\nfunction getClosestDialog(\r\n element: ElementRef<HTMLElement>,\r\n openDialogs: readonly DialogRef[],\r\n): DialogRef | null {\r\n let parent = element.nativeElement.parentElement;\r\n while (parent && !parent.classList.contains('bk-dialog-container')) {\r\n parent = parent.parentElement;\r\n }\r\n return parent\r\n ? openDialogs.find(ref => ref.id === parent!.id) ?? null\r\n : null;\r\n}\r\n\r\n// ──── Base for Title / Actions ───────────────────────────────────────────\r\n\r\n/**\r\n * Shared abstract base that resolves the owning `DialogRef` (via DI or\r\n * DOM walk) and invokes `_onAdd()` / `_onRemove()` lifecycle hooks.\r\n *\r\n * Same pattern as Material's internal `MatDialogLayoutSection`.\r\n */\r\n@Directive({ standalone: true })\r\nabstract class BkDialogLayoutSection implements OnInit, OnDestroy {\r\n protected _dialogRef: DialogRef | null = inject(DialogRef, { optional: true });\r\n protected _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(DialogService);\r\n\r\n ngOnInit(): void {\r\n if (!this._dialogRef) {\r\n this._dialogRef = getClosestDialog(\r\n this._elementRef,\r\n this._dialogService.openDialogsRef,\r\n );\r\n }\r\n if (this._dialogRef) {\r\n Promise.resolve().then(() => this._onAdd());\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this._dialogRef) {\r\n Promise.resolve().then(() => this._onRemove());\r\n }\r\n }\r\n\r\n protected abstract _onAdd(): void;\r\n protected abstract _onRemove(): void;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogTitle\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Marks an element as the dialog title.\r\n *\r\n * • Generates a unique `id` and binds it to the host element.\r\n * • Registers the `id` with the CDK container's `aria-labelledby` queue\r\n * so screen readers announce the dialog title automatically.\r\n *\r\n * Usage:\r\n * ```html\r\n * <h2 bk-dialog-title>Edit User</h2>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-title], [bkDialogTitle]',\r\n standalone: true,\r\n exportAs: 'bkDialogTitle',\r\n host: {\r\n 'class': 'bk-dialog-title',\r\n '[id]': 'id',\r\n },\r\n})\r\nexport class BkDialogTitle extends BkDialogLayoutSection {\r\n /** Unique element `id`. Auto-generated but can be overridden. */\r\n @Input() id: string = `bk-dialog-title-${nextTitleId++}`;\r\n\r\n protected _onAdd(): void {\r\n // Register with the CdkDialogContainer's aria-labelledby queue.\r\n // _containerInstance extends CdkDialogContainer which has _addAriaLabelledBy.\r\n (this._dialogRef as any)?._containerInstance?._addAriaLabelledBy?.(this.id);\r\n }\r\n\r\n protected _onRemove(): void {\r\n (this._dialogRef as any)?._containerInstance?._removeAriaLabelledBy?.(this.id);\r\n }\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogContent\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Scrollable content area of a dialog.\r\n *\r\n * • Applies the `bk-dialog-content` CSS class → `flex: 1 1 auto; overflow: auto`.\r\n * • Composes CDK's `CdkScrollable` for scroll-position monitoring and\r\n * integration with CDK's scroll dispatcher.\r\n *\r\n * Usage (attribute):\r\n * ```html\r\n * <div bk-dialog-content>\r\n * <!-- body content — this area scrolls -->\r\n * </div>\r\n * ```\r\n *\r\n * Usage (element):\r\n * ```html\r\n * <bk-dialog-content>...</bk-dialog-content>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-content], bk-dialog-content, [bkDialogContent]',\r\n standalone: true,\r\n exportAs: 'bkDialogContent',\r\n host: {\r\n 'class': 'bk-dialog-content',\r\n },\r\n hostDirectives: [CdkScrollable],\r\n})\r\nexport class BkDialogContent {}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogActions\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Container for action buttons at the bottom of a dialog.\r\n * Stays pinned when the content area scrolls.\r\n *\r\n * • Applies `bk-dialog-actions` class → `flex: 0 0 auto` (never shrinks).\r\n * • Optional `align` input controls horizontal alignment.\r\n *\r\n * Usage:\r\n * ```html\r\n * <div bk-dialog-actions>\r\n * <button (click)=\"cancel()\">Cancel</button>\r\n * <button (click)=\"save()\">Save</button>\r\n * </div>\r\n *\r\n * <!-- With alignment -->\r\n * <div bk-dialog-actions align=\"center\">...</div>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-actions], bk-dialog-actions, [bkDialogActions]',\r\n standalone: true,\r\n exportAs: 'bkDialogActions',\r\n host: {\r\n 'class': 'bk-dialog-actions',\r\n '[class.bk-dialog-actions-align-start]': 'align === \"start\"',\r\n '[class.bk-dialog-actions-align-center]': 'align === \"center\"',\r\n '[class.bk-dialog-actions-align-end]': 'align === \"end\"',\r\n },\r\n})\r\nexport class BkDialogActions extends BkDialogLayoutSection {\r\n /** Horizontal alignment of action buttons. */\r\n @Input() align?: 'start' | 'center' | 'end';\r\n\r\n protected _onAdd(): void {\r\n // Future: notify container for action section count (like Material).\r\n }\r\n\r\n protected _onRemove(): void {\r\n // No-op.\r\n }\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// BkDialogClose\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Closes the dialog when the host element is clicked.\r\n * Optionally returns a result value to the opener.\r\n *\r\n * • Sets `type=\"button\"` by default to prevent accidental form submissions.\r\n * • Supports an optional `aria-label` for screen readers.\r\n *\r\n * Usage:\r\n * ```html\r\n * <!-- Close with no result -->\r\n * <button bk-dialog-close>Cancel</button>\r\n *\r\n * <!-- Close with a result value -->\r\n * <button [bk-dialog-close]=\"'confirmed'\">OK</button>\r\n *\r\n * <!-- Alternative camelCase binding -->\r\n * <button [bkDialogClose]=\"myResult\">Done</button>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[bk-dialog-close], [bkDialogClose]',\r\n standalone: true,\r\n exportAs: 'bkDialogClose',\r\n host: {\r\n '(click)': '_onButtonClick($event)',\r\n '[attr.aria-label]': 'ariaLabel || null',\r\n '[attr.type]': 'type',\r\n },\r\n})\r\nexport class BkDialogClose implements OnInit, OnChanges {\r\n private _dialogRef: DialogRef | null = inject(DialogRef, { optional: true });\r\n private _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(DialogService);\r\n\r\n /** Screen-reader label for the button. */\r\n @Input('aria-label') ariaLabel?: string;\r\n\r\n /** Prevents accidental form submits. Default: `'button'`. */\r\n @Input() type: 'submit' | 'button' | 'reset' = 'button';\r\n\r\n /** Dialog result — set via `[bk-dialog-close]=\"value\"`. */\r\n @Input('bk-dialog-close') dialogResult: any;\r\n\r\n /** Alternative camelCase binding: `[bkDialogClose]=\"value\"`. */\r\n @Input('bkDialogClose') _bkDialogClose: any;\r\n\r\n ngOnInit(): void {\r\n if (!this._dialogRef) {\r\n this._dialogRef = getClosestDialog(\r\n this._elementRef,\r\n this._dialogService.openDialogsRef,\r\n );\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const proxiedChange = changes['_bkDialogClose'] || changes['dialogResult'];\r\n if (proxiedChange) {\r\n this.dialogResult = proxiedChange.currentValue;\r\n }\r\n }\r\n\r\n _onButtonClick(_event: MouseEvent): void {\r\n this._dialogRef?.close(this.dialogResult);\r\n }\r\n}\r\n","/**\r\n * BkDialogModule\r\n *\r\n * Optional NgModule wrapper for projects that prefer module-based usage.\r\n *\r\n * Architecture Decision:\r\n * ─────────────────────\r\n * Follows the exact same pattern as Angular Material's `MatDialogModule`\r\n * and `@brickclay-org/ui`'s `CalendarModule`:\r\n *\r\n * • All components/directives are **standalone**.\r\n * • This module simply imports + re-exports them for convenience.\r\n * • `DialogService` is `providedIn: 'root'`, so it does NOT need to\r\n * be listed in `providers` here — it is tree-shakeable and available\r\n * app-wide automatically.\r\n *\r\n * Two usage styles:\r\n *\r\n * ───────── Module-based (NgModule) ─────────\r\n * ```ts\r\n * import { BkDialogModule } from '@shared/components/dialog';\r\n *\r\n * @NgModule({ imports: [BkDialogModule] })\r\n * export class FuelCostModule {}\r\n * ```\r\n *\r\n * ───────── Standalone ──────────────────────\r\n * ```ts\r\n * @Component({\r\n * standalone: true,\r\n * imports: [BkDialogContent, BkDialogActions, BkDialogClose],\r\n * })\r\n * export class MyDialog {}\r\n * ```\r\n *\r\n * @see https://github.com/angular/components/blob/main/src/material/dialog/dialog-module.ts\r\n */\r\n\r\nimport { NgModule } from '@angular/core';\r\nimport { DialogModule as CdkDialogModule } from '@angular/cdk/dialog';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\n\r\nimport { DialogContainerComponent } from './dialog-container';\r\nimport {\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n} from './dialog-content-directives';\r\n\r\n@NgModule({\r\n imports: [\r\n // ── CDK foundations ──────────────────────────────────────────────\r\n CdkDialogModule,\r\n OverlayModule,\r\n PortalModule,\r\n\r\n // ── Our standalone pieces ───────────────────────────────────────\r\n DialogContainerComponent,\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n ],\r\n exports: [\r\n // ── Public API for template usage ───────────────────────────────\r\n // Consumers import BkDialogModule and get these directives in\r\n // their templates automatically — just like MatDialogModule.\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n ],\r\n})\r\nexport class BkDialogModule {}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { NgModel } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-validator',\r\n standalone:true,\r\n imports: [],\r\n templateUrl: './validator.html',\r\n})\r\nexport class BkValidator implements OnInit {\r\n @Input() control!: NgModel;\r\n @Input() label!: string;\r\n @Input() errorMessage: string='';\r\n @Input() showError:boolean= false;\r\n\r\n\r\n\r\n constructor() {\r\n\r\n\r\n }\r\n ngOnInit(): void {\r\n\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n","<span class=\"text-left font-medium text-xs leading-normal text-[#C10007] mt-0.5 h-[1px] block\">\r\n @if (control && control.invalid && (control.dirty || control.touched)) {\r\n @if (control.errors?.['required']) {\r\n <span>\r\n {{ label }} is required.\r\n </span>\r\n }\r\n @else if (control.errors?.['minlength']) {\r\n <span>\r\n {{ label }} must be at least\r\n {{ control.errors?.['minlength']?.requiredLength }} characters long.\r\n </span>\r\n }\r\n @else if (control.errors?.['maxlength']) {\r\n <span>\r\n {{ label }} cannot exceed\r\n {{ control.errors?.['maxlength']?.requiredLength }} characters.\r\n </span>\r\n }\r\n @else if (control.errors?.['pattern']) {\r\n <span>\r\n {{ label }} contains invalid characters.\r\n </span>\r\n } @else if (control.errors?.['min']) {\r\n <span>\r\n {{ label }} must be at least {{ control.errors?.['min'].min }}.\r\n </span>\r\n } @else if (control.errors?.['max']) {\r\n <span>\r\n {{ label }} cannot be greater than {{ control.errors?.['max'].max }}.\r\n </span>\r\n }\r\n\r\n } @else if (showError) {\r\n <span>\r\n {{ errorMessage }}\r\n </span>\r\n }\r\n</span>\r\n","/*\r\n * Public API Surface of brickclay-lib\r\n */\r\n\r\n//Icons\r\nexport * from './lib/assets/icons'\r\n//Library\r\nexport * from './lib/brickclay-lib';\r\n//Calender\r\nexport * from './lib/calender/components/custom-calendar/custom-calendar.component';\r\nexport * from './lib/calender/components/scheduled-date-picker/scheduled-date-picker.component';\r\nexport * from './lib/calender/components/time-picker/time-picker.component';\r\nexport * from './lib/calender/calendar.module';\r\nexport * from './lib/calender/services/calendar-manager.service';\r\n//Toggle\r\nexport * from './lib/toggle/toggle';\r\n//CheckBox\r\nexport * from './lib/checkbox/checkbox';\r\n//Radio-Button\r\nexport * from './lib/radio/radio'\r\n//Pill\r\nexport * from './lib/pill/pill'\r\n//Badge\r\nexport * from './lib/badge/badge'\r\n//Spinner\r\nexport * from './lib/spinner/spinner'\r\n//Button\r\nexport * from './lib/ui-button/ui-button'\r\nexport * from './lib/ui-icon-button/ui-icon-button'\r\nexport * from './lib/button-group/button-group'\r\n//Text-Area\r\nexport * from './lib/textarea/textarea'\r\n//Table\r\nexport * from './lib/grid/components/grid/grid';\r\nexport * from './lib/grid/models/grid.model';\r\n//Single Select\r\nexport * from './lib/select/select';\r\n//Input\r\nexport * from './lib/input/input';\r\n//Input-Chips\r\nexport * from './lib/input-chips/input-chips';\r\n//Tabs\r\nexport * from './lib/tabs/tabs';\r\n\r\n//Dialog system\r\nexport { BkDialogModule } from './lib/dialog/dialog.module';\r\nexport { DialogService } from './lib/dialog/dialog.service';\r\nexport { DialogRef } from './lib/dialog/dialog-ref';\r\nexport { DIALOG_DATA, DIALOG_GLOBAL_CONFIG } from './lib/dialog/dialog.tokens';\r\nexport type { DialogConfig, DialogPosition, DialogAnimation } from './lib/dialog/dialog-config';\r\nexport { DEFAULT_DIALOG_CONFIG } from './lib/dialog/dialog-config';\r\nexport {\r\n BkDialogTitle,\r\n BkDialogContent,\r\n BkDialogActions,\r\n BkDialogClose,\r\n} from './lib/dialog/dialog-content-directives';\r\nexport type { AnimationKeyframes } from './lib/dialog/dialog-animations';\r\nexport { getDialogPanelAnimation, getDialogBackdropAnimation } from './lib/dialog/dialog-animations';\r\n\r\n//Tooltip\r\nexport * from './lib/tooltip/tooltip.directive';\r\n\r\n//Validator\r\nexport * from './lib/validator/validator';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CalendarManagerService","i2","i1","CDK_DIALOG_DATA","CdkDialogModule"],"mappings":"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"}