@brickclay-org/ui 0.1.76 → 0.1.78

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/ui-avatar/ui-avatar.ts","../../../projects/brickclay-lib/src/lib/ui-avatar/ui-avatar.html","../../../projects/brickclay-lib/src/lib/shared/utilities/color-appearance.ts","../../../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/lib/avatar-profile/avatar-profile.ts","../../../projects/brickclay-lib/src/lib/avatar-profile/avatar-profile.html","../../../projects/brickclay-lib/src/lib/hierarchical-select/hierarchical-select.ts","../../../projects/brickclay-lib/src/lib/hierarchical-select/hierarchical-select.html","../../../projects/brickclay-lib/src/lib/toastr/toastr.service.ts","../../../projects/brickclay-lib/src/lib/toastr/toastr.ts","../../../projects/brickclay-lib/src/lib/toastr/toastr.html","../../../projects/brickclay-lib/src/lib/column-select/models/column-filter-option.ts","../../../projects/brickclay-lib/src/lib/column-select/service/column-filter.service.ts","../../../projects/brickclay-lib/src/lib/column-select/components/column-select/column-select.ts","../../../projects/brickclay-lib/src/lib/column-select/components/column-select/column-select.html","../../../projects/brickclay-lib/src/lib/file-picker/file-picker.ts","../../../projects/brickclay-lib/src/lib/file-picker/file-picker.html","../../../projects/brickclay-lib/src/lib/file-card/file-card.ts","../../../projects/brickclay-lib/src/lib/file-card/file-card.html","../../../projects/brickclay-lib/src/lib/pagination/pagination.ts","../../../projects/brickclay-lib/src/lib/pagination/pagination.html","../../../projects/brickclay-lib/src/lib/loader/loader.ts","../../../projects/brickclay-lib/src/lib/loader/loader.html","../../../projects/brickclay-lib/src/lib/dropdown/dropdown.ts","../../../projects/brickclay-lib/src/lib/dropdown/dropdown.html","../../../projects/brickclay-lib/src/lib/menu/menu.ts","../../../projects/brickclay-lib/src/lib/menu/menu.html","../../../projects/brickclay-lib/src/lib/shared/utilities/popover-position.ts","../../../projects/brickclay-lib/src/lib/popover/popover.ts","../../../projects/brickclay-lib/src/lib/popover/popover.html","../../../projects/brickclay-lib/src/lib/ui-avatar-group/ui-avatar-group.ts","../../../projects/brickclay-lib/src/lib/ui-avatar-group/ui-avatar-group.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/custom-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, OnDestroy, AfterViewInit, ViewChild, ElementRef, HostListener, SimpleChanges, forwardRef, Renderer2 } 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-time-picker',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './time-picker.component.html',\r\n styleUrls: ['./time-picker.component.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkTimePicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkTimePicker implements OnInit, OnChanges, OnDestroy, AfterViewInit, ControlValueAccessor {\r\n\r\n @Input() required: boolean = false;\r\n\r\n /** @deprecated Prefer [(ngModel)] */\r\n @Input() value: string | null = null;\r\n\r\n @Input() label: string = '';\r\n @Input() placeholder: string = 'Select time';\r\n @Input() clearable = false;\r\n @Input() position: 'left' | 'right' = 'left';\r\n @Input() variation: 'default' | 'lg' = 'default';\r\n @Input() pickerId: string = '';\r\n @Input() closePicker: number = 0;\r\n @Input() timeFormat: 12 | 24 = 12;\r\n @Input() showSeconds = false;\r\n /** When true, auto-flip the dropdown above/below and left/right based on available viewport space. */\r\n @Input() autoPosition = false;\r\n /** When true, position the dropdown with `fixed` so it escapes ancestor overflow (dialogs, scroll containers),\r\n * follows the trigger on scroll, and closes when the trigger is scrolled out of view. */\r\n @Input() appendToBody = false;\r\n\r\n @Output() change = new EventEmitter<string | null>();\r\n @Output() timeChange = new EventEmitter<string | null>();\r\n @Output() pickerOpened = new EventEmitter<string>();\r\n @Output() pickerClosed = new EventEmitter<string>();\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n @Input() disabled:boolean = false;\r\n\r\n @ViewChild('hourScroll') hourScrollEl?: ElementRef<HTMLElement>;\r\n @ViewChild('minuteScroll') minuteScrollEl?: ElementRef<HTMLElement>;\r\n @ViewChild('secondScroll') secondScrollEl?: ElementRef<HTMLElement>;\r\n\r\n /** The positioned trigger (its rect anchors the dropdown). */\r\n @ViewChild('tpWrapper') tpWrapper?: ElementRef<HTMLElement>;\r\n /** The dropdown panel element (measured for flip decisions). */\r\n @ViewChild('tpDropdown') tpDropdown?: ElementRef<HTMLElement>;\r\n\r\n /** Resolved placement state, driven by updatePosition(). */\r\n placeAbove = false;\r\n resolvedPosition: 'left' | 'right' = 'left';\r\n dropdownStyle: Record<string, string> = {};\r\n\r\n /** Row height in px. MUST match the .time-item height in CSS for the active variation. */\r\n private get ITEM_HEIGHT(): number {\r\n return this.variation === 'lg' ? 32 : 28;\r\n }\r\n\r\n /** Finite lists (no cyclic loop) — same as the hours column, so 00..59 has a hard start/end. */\r\n minutes: number[] = Array.from({ length: 60 }, (_, i) => i);\r\n seconds: number[] = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n showPicker = false;\r\n currentHour = 12;\r\n currentMinute = 0;\r\n currentSecond = 0;\r\n currentAMPM = 'PM';\r\n\r\n /**\r\n * Highlight that follows a column while scrolling. It is purely visual: scrolling moves it\r\n * but does NOT commit the value. The value is only selected/committed when the user clicks\r\n * an item (see onHourChange / onMinuteChange / onSecondChange).\r\n */\r\n activeHour = 12;\r\n activeMinute = 0;\r\n activeSecond = 0;\r\n\r\n private _modelValue: string | null = null;\r\n\r\n brickclayIcons = BrickclayIcons;\r\n\r\n constructor(private renderer: Renderer2) {}\r\n\r\n /* ---------------- appendToBody dropdown relocation ---------------- */\r\n\r\n /**\r\n * `appendToBody` anchors the dropdown with `position: fixed`, which only tracks the viewport when\r\n * NO ancestor establishes a containing block (transform / filter / perspective / will-change /\r\n * contain / backdrop-filter). Inside such an ancestor the fixed coordinates resolve against that\r\n * ancestor instead and the dropdown drifts off-position. To be robust we physically move the panel\r\n * to <body> while open (Angular keeps managing it by reference) and move it back before *ngIf\r\n * tears it down. The panel carries a `tp-compact` self-class so its `default`-variation sizing —\r\n * otherwise scoped under the `.time-input-group.default` ancestor it just left — still applies.\r\n */\r\n private dropdownMovedToBody = false;\r\n private dropdownOriginalParent: HTMLElement | null = null;\r\n\r\n private moveDropdownToBody(): void {\r\n const el = this.tpDropdown?.nativeElement;\r\n if (!el || this.dropdownMovedToBody) return;\r\n this.dropdownOriginalParent = el.parentElement;\r\n this.renderer.appendChild(document.body, el);\r\n this.dropdownMovedToBody = true;\r\n }\r\n\r\n /** Return the dropdown to its original slot so *ngIf can destroy it cleanly (safe to call twice). */\r\n private restoreDropdownFromBody(): void {\r\n if (!this.dropdownMovedToBody) return;\r\n const el = this.tpDropdown?.nativeElement;\r\n if (el && this.dropdownOriginalParent) {\r\n this.renderer.appendChild(this.dropdownOriginalParent, el);\r\n }\r\n this.dropdownMovedToBody = false;\r\n this.dropdownOriginalParent = null;\r\n }\r\n\r\n /* ---------------- CVA ---------------- */\r\n\r\n writeValue(value: string | null): void {\r\n\r\n if (!value) {\r\n this._modelValue = null;\r\n this.setDefaultsForDropdown();\r\n return;\r\n }\r\n\r\n this._modelValue = value;\r\n this.parseTimeValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): 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 /* ---------------- Display ---------------- */\r\n\r\n getDisplayValue(): string {\r\n\r\n if (!this._modelValue) return '';\r\n\r\n return this.formatTimeFromComponents(\r\n this.currentHour,\r\n this.currentMinute,\r\n this.currentSecond,\r\n this.currentAMPM\r\n );\r\n }\r\n\r\n get hasValue(): boolean {\r\n return !!this._modelValue;\r\n }\r\n\r\n /* ---------------- Defaults ---------------- */\r\n\r\n private setDefaultsForDropdown(): void {\r\n\r\n if (this.timeFormat === 24) {\r\n this.currentHour = 0;\r\n } else {\r\n this.currentHour = 12;\r\n this.currentAMPM = 'PM';\r\n }\r\n\r\n this.currentMinute = 0;\r\n this.currentSecond = 0;\r\n this.activeHour = this.currentHour;\r\n this.activeMinute = 0;\r\n this.activeSecond = 0;\r\n }\r\n\r\n clear(): void {\r\n\r\n this._modelValue = null;\r\n this.value = null;\r\n\r\n this.setDefaultsForDropdown();\r\n\r\n this.onChange(null);\r\n this.change.emit(null);\r\n this.timeChange.emit(null);\r\n\r\n this.markAsTouched();\r\n }\r\n\r\n markAsTouched(): void {\r\n this.onTouched();\r\n }\r\n\r\n /* ---------------- Lifecycle ---------------- */\r\n\r\n ngOnInit() {\r\n this.parseTimeValue(this._modelValue ?? this.value);\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n if (this.showPicker) {\r\n setTimeout(() => this.scrollToSelectedTimes(), 100);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes['value'] && !this._modelValue) {\r\n this.parseTimeValue(this.value);\r\n }\r\n\r\n if (changes['closePicker'] && this.showPicker) {\r\n\r\n const newCounter = changes['closePicker'].currentValue;\r\n\r\n if (newCounter > this.previousCloseCounter) {\r\n this.dismiss();\r\n this.previousCloseCounter = newCounter;\r\n }\r\n }\r\n }\r\n\r\n /* ---------------- Parse Logic ---------------- */\r\n\r\n parseTimeValue(timeStr?: string | null) {\r\n\r\n const str = timeStr ?? this._modelValue ?? this.value ?? '';\r\n\r\n if (!str) {\r\n this._modelValue = null;\r\n this.setDefaultsForDropdown();\r\n return;\r\n }\r\n\r\n this._modelValue = str;\r\n\r\n const parsed = this.parseTimeStringToComponents(str);\r\n\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 // Scroll highlight starts on the committed value.\r\n this.activeHour = parsed.hour;\r\n this.activeMinute = parsed.minute;\r\n this.activeSecond = parsed.second;\r\n }\r\n\r\n parseTimeStringToComponents(timeStr: string) {\r\n\r\n const parts = timeStr.trim().split(' ');\r\n const timePart = parts[0];\r\n let ampm = (parts[1] || '').toUpperCase();\r\n\r\n const [h, m, s] = timePart.split(':');\r\n\r\n let hour = parseInt(h || '0', 10);\r\n const minute = parseInt(m || '0', 10);\r\n const second = parseInt(s || '0', 10);\r\n\r\n if (this.timeFormat === 24) {\r\n\r\n return {\r\n hour: Math.min(Math.max(hour, 0), 23),\r\n minute: Math.min(Math.max(minute, 0), 59),\r\n second: Math.min(Math.max(second, 0), 59),\r\n ampm: ''\r\n };\r\n }\r\n\r\n if (!ampm) {\r\n\r\n if (hour >= 12) {\r\n ampm = 'PM';\r\n if (hour > 12) hour -= 12;\r\n } else {\r\n ampm = 'AM';\r\n if (hour === 0) hour = 12;\r\n }\r\n }\r\n\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,\r\n second,\r\n ampm\r\n };\r\n }\r\n\r\n formatTimeFromComponents(hour: number, minute: number, second: number, ampm: string): string {\r\n\r\n const hStr = hour.toString().padStart(2, '0');\r\n const mStr = minute.toString().padStart(2, '0');\r\n const sStr = second.toString().padStart(2, '0');\r\n\r\n if (this.timeFormat === 24) {\r\n return this.showSeconds ? `${hStr}:${mStr}:${sStr}` : `${hStr}:${mStr}`;\r\n }\r\n\r\n return this.showSeconds\r\n ? `${hour}:${mStr}:${sStr} ${ampm}`\r\n : `${hour}:${mStr} ${ampm}`;\r\n }\r\n\r\n /* ---------------- Picker ---------------- */\r\n\r\n togglePicker() {\r\n\r\n if (!this.showPicker) {\r\n\r\n this.showPicker = true;\r\n\r\n this.parseTimeValue(this._modelValue);\r\n\r\n this.pickerOpened.emit(this.pickerId);\r\n\r\n if (this.autoPosition || this.appendToBody) {\r\n this.attachViewportListeners();\r\n // Measure once the dropdown is in the DOM, before it becomes visible to the user.\r\n setTimeout(() => {\r\n // Relocate to <body> first so no transformed/overflow ancestor can re-anchor the fixed\r\n // dropdown, then compute viewport coordinates.\r\n if (this.appendToBody) this.moveDropdownToBody();\r\n this.updatePosition();\r\n }, 0);\r\n }\r\n\r\n setTimeout(() => this.scrollToSelectedTimes(), 100);\r\n\r\n } else {\r\n\r\n this.dismiss();\r\n }\r\n }\r\n\r\n /** Central close path so listeners are always detached and events emitted once. */\r\n private dismiss(): void {\r\n\r\n if (!this.showPicker) return;\r\n\r\n // Put the dropdown back before showPicker=false so *ngIf removes it from the right parent on the\r\n // next change-detection pass (avoids leaving an orphan node in <body>).\r\n this.restoreDropdownFromBody();\r\n this.showPicker = false;\r\n this.detachViewportListeners();\r\n this.markAsTouched();\r\n this.pickerClosed.emit(this.pickerId);\r\n }\r\n\r\n /* ---------------- Change handlers ---------------- */\r\n\r\n onHourChange(hour: number) {\r\n this.currentHour = hour;\r\n this.activeHour = hour;\r\n this.updateTime();\r\n }\r\n\r\n onMinuteChange(minute: number) {\r\n this.currentMinute = minute;\r\n this.activeMinute = minute;\r\n this.updateTime();\r\n }\r\n\r\n onSecondChange(second: number) {\r\n this.currentSecond = second;\r\n this.activeSecond = second;\r\n this.updateTime();\r\n }\r\n\r\n onAMPMChange(ampm: string) {\r\n this.currentAMPM = ampm;\r\n this.updateTime();\r\n }\r\n\r\n updateTime() {\r\n\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\r\n this._modelValue = newTime;\r\n this.value = newTime;\r\n\r\n this.onChange(newTime);\r\n this.change.emit(newTime);\r\n this.timeChange.emit(newTime);\r\n }\r\n\r\n /* ---------------- Scroll ---------------- */\r\n\r\n /** Position each column so the committed value sits at the top of its viewport. */\r\n scrollToSelectedTimes() {\r\n this.scrollColumnTo(this.hourScrollEl, this.getHours().indexOf(this.currentHour));\r\n this.scrollColumnTo(this.minuteScrollEl, this.currentMinute);\r\n if (this.showSeconds) this.scrollColumnTo(this.secondScrollEl, this.currentSecond);\r\n }\r\n\r\n private scrollColumnTo(ref: ElementRef<HTMLElement> | undefined, index: number): void {\r\n const el = ref?.nativeElement;\r\n if (!el || index < 0) return;\r\n // Center the value in the viewport; the browser clamps at the top/bottom edges, which\r\n // keeps the ~3 visible rows filled with real values instead of blank space.\r\n el.scrollTop = index * this.ITEM_HEIGHT - el.clientHeight / 2 + this.ITEM_HEIGHT / 2;\r\n }\r\n\r\n /** Item nearest the viewport center for the current scroll position, clamped to [0, count - 1]. */\r\n private scrollIndex(ref: ElementRef<HTMLElement> | undefined, count: number): number {\r\n const el = ref?.nativeElement;\r\n if (!el) return -1;\r\n const center = el.scrollTop + el.clientHeight / 2;\r\n const index = Math.round((center - this.ITEM_HEIGHT / 2) / this.ITEM_HEIGHT);\r\n return Math.min(Math.max(index, 0), count - 1);\r\n }\r\n\r\n /* ---------------- Outside click ---------------- */\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n\r\n if (!this.showPicker) return;\r\n\r\n const target = event.target as HTMLElement;\r\n\r\n // When appendToBody has relocated the dropdown to <body>, it is no longer inside\r\n // .time-picker-wrapper, so also treat clicks within the dropdown itself as \"inside\".\r\n const dropdownEl = this.tpDropdown?.nativeElement;\r\n const insideDropdown = !!dropdownEl && (dropdownEl === target || dropdownEl.contains(target));\r\n\r\n if (!target.closest('.time-picker-wrapper') && !insideDropdown) {\r\n\r\n this.dismiss();\r\n }\r\n }\r\n\r\n private previousCloseCounter = 0;\r\n\r\n getHours(): number[] {\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\ngetAMPMOptions(): string[] {\r\n return ['PM','AM'];\r\n}\r\n\r\n// Scrolling any column only moves its highlight; the value is committed on click.\r\nonHourScroll(): void {\r\n const idx = this.scrollIndex(this.hourScrollEl, this.getHours().length);\r\n if (idx < 0) return;\r\n this.activeHour = this.getHours()[idx];\r\n}\r\n\r\nonMinuteScroll(): void {\r\n const idx = this.scrollIndex(this.minuteScrollEl, this.minutes.length);\r\n if (idx < 0) return;\r\n this.activeMinute = idx;\r\n}\r\n\r\nonSecondScroll(): void {\r\n const idx = this.scrollIndex(this.secondScrollEl, this.seconds.length);\r\n if (idx < 0) return;\r\n this.activeSecond = idx;\r\n}\r\n\r\n /* ---------------- Overlay positioning (auto-flip / appendToBody) ---------------- */\r\n\r\n /**\r\n * Resolve the dropdown placement against the current viewport.\r\n * - autoPosition: flip above when there isn't room below, and flip the horizontal\r\n * side when the preferred side would overflow.\r\n * - appendToBody: additionally anchor with `position: fixed` (inline style) so the\r\n * dropdown escapes ancestor overflow and follows the trigger on scroll.\r\n */\r\n private updatePosition(): void {\r\n\r\n if (!this.showPicker) return;\r\n\r\n const trigger = this.tpWrapper?.nativeElement;\r\n const dropdown = this.tpDropdown?.nativeElement;\r\n if (!trigger || !dropdown) return;\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const height = dropdown.offsetHeight || 140;\r\n const width = dropdown.offsetWidth || 182;\r\n const margin = 8;\r\n const gap = 4;\r\n\r\n // Vertical: flip above only when there isn't enough room below and there's more room above.\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n this.placeAbove =\r\n this.autoPosition && spaceBelow < height + margin && spaceAbove > spaceBelow;\r\n\r\n // Horizontal: start from the requested side, flip if it would overflow that edge.\r\n const viewportW = window.innerWidth;\r\n let side: 'left' | 'right' = this.position;\r\n if (this.autoPosition) {\r\n if (side === 'left' && rect.left + width > viewportW - margin) side = 'right';\r\n else if (side === 'right' && rect.right - width < margin) side = 'left';\r\n }\r\n this.resolvedPosition = side;\r\n\r\n if (this.appendToBody) {\r\n let left = side === 'right' ? rect.right - width : rect.left;\r\n // Clamp so it never leaves the viewport, regardless of the flip decision above.\r\n left = Math.min(left, viewportW - width - margin);\r\n left = Math.max(left, margin);\r\n\r\n this.dropdownStyle = this.placeAbove\r\n ? {\r\n position: 'fixed',\r\n top: 'auto',\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\r\n left: `${left}px`,\r\n right: 'auto',\r\n 'z-index': '100000',\r\n }\r\n : {\r\n position: 'fixed',\r\n top: `${rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n right: 'auto',\r\n 'z-index': '100000',\r\n };\r\n } else {\r\n // Non-appendToBody stays absolute; placement is driven by CSS classes only.\r\n this.dropdownStyle = {};\r\n }\r\n }\r\n\r\n private viewportListenersAttached = false;\r\n private viewportRafId: number | null = null;\r\n\r\n private readonly onViewportChange = (): void => {\r\n if (this.viewportRafId != null) return;\r\n this.viewportRafId = requestAnimationFrame(() => {\r\n this.viewportRafId = null;\r\n this.handleViewportChange();\r\n });\r\n };\r\n\r\n private handleViewportChange(): void {\r\n\r\n if (!this.showPicker) return;\r\n\r\n if (this.appendToBody) {\r\n const rect = this.tpWrapper?.nativeElement?.getBoundingClientRect();\r\n if (!rect) return;\r\n if (this.isTriggerOutOfView(rect)) {\r\n this.dismiss();\r\n return;\r\n }\r\n }\r\n\r\n this.updatePosition();\r\n }\r\n\r\n /** True when the trigger has scrolled out of the viewport or out of any clipping ancestor. */\r\n private isTriggerOutOfView(rect: DOMRect): boolean {\r\n\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight) return true;\r\n\r\n let el = this.tpWrapper?.nativeElement?.parentElement ?? null;\r\n while (el && el !== document.body && el !== document.documentElement) {\r\n if (this.isScrollClippingContainer(el)) {\r\n const c = el.getBoundingClientRect();\r\n if (rect.bottom <= c.top || rect.top >= c.bottom || rect.right <= c.left || rect.left >= c.right) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n private isScrollClippingContainer(el: HTMLElement): boolean {\r\n const style = getComputedStyle(el);\r\n const clipsY = /(auto|scroll|hidden)/.test(style.overflowY) && el.scrollHeight > el.clientHeight;\r\n const clipsX = /(auto|scroll|hidden)/.test(style.overflowX) && el.scrollWidth > el.clientWidth;\r\n return clipsY || clipsX;\r\n }\r\n\r\n private attachViewportListeners(): void {\r\n if (this.viewportListenersAttached) return;\r\n // Capture phase so nested scroll containers (dialog bodies, panels) are caught too.\r\n document.addEventListener('scroll', this.onViewportChange, true);\r\n window.addEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = true;\r\n }\r\n\r\n private detachViewportListeners(): void {\r\n if (!this.viewportListenersAttached) return;\r\n document.removeEventListener('scroll', this.onViewportChange, true);\r\n window.removeEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = false;\r\n if (this.viewportRafId != null) {\r\n cancelAnimationFrame(this.viewportRafId);\r\n this.viewportRafId = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.detachViewportListeners();\r\n // If destroyed while open with the dropdown relocated to <body>, put it back so Angular's\r\n // teardown removes it from the expected parent instead of leaving an orphan node in <body>.\r\n this.restoreDropdownFromBody();\r\n }\r\n}\r\n","<div class=\"time-picker-wrapper\">\r\n <div class=\"time-input-group\" [ngClass]=\"variation\">\r\n @if (label) {\r\n <label>{{ label }}</label>\r\n }\r\n <div class=\"time-input-wrapper\" [class.has-value]=\"hasValue\" #tpWrapper>\r\n <input\r\n type=\"text\"\r\n class=\"time-input\"\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled ? true : null\"\r\n readonly\r\n (click)=\"!disabled && togglePicker()\"\r\n (blur)=\"markAsTouched()\"\r\n />\r\n <span class=\"time-icon\">\r\n <img alt=\"timer\" class=\"timer-icon\" [src]=\"brickclayIcons.timerIcon\" />\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"time-clear-btn\"\r\n *ngIf=\"clearable && hasValue && !disabled\"\r\n (click)=\"clear(); $event.stopPropagation()\"\r\n title=\"Clear time\"\r\n aria-label=\"Clear time\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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 <div class=\"custom-time-picker-dropdown\" *ngIf=\"showPicker\">\r\n <div\r\n #tpDropdown\r\n class=\"custom-time-picker\"\r\n [ngStyle]=\"dropdownStyle\"\r\n [class.tp-above]=\"placeAbove\"\r\n [class.append-to-body]=\"appendToBody\"\r\n [ngClass]=\"{\r\n 'left-position': resolvedPosition === 'left',\r\n 'right-position': resolvedPosition === 'right',\r\n 'format-24': timeFormat === 24,\r\n 'tp-compact': variation === 'default',\r\n }\"\r\n >\r\n <!-- Hours Column (finite list, no loop) -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #hourScroll (scroll)=\"onHourScroll()\">\r\n <div\r\n *ngFor=\"let h of getHours()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentHour === h\"\r\n [class.active]=\"activeHour === h\"\r\n (click)=\"onHourChange(h)\"\r\n >\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 (finite list, no loop) -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #minuteScroll (scroll)=\"onMinuteScroll()\">\r\n <div\r\n *ngFor=\"let m of minutes\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentMinute === m\"\r\n [class.active]=\"activeMinute === m\"\r\n (click)=\"onMinuteChange(m)\"\r\n >\r\n {{ m.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n @if (showSeconds) {\r\n <span class=\"time-separator\">:</span>\r\n <!-- Seconds Column (finite list, no loop) -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #secondScroll (scroll)=\"onSecondScroll()\">\r\n <div\r\n *ngFor=\"let s of seconds\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentSecond === s\"\r\n [class.active]=\"activeSecond === s\"\r\n (click)=\"onSecondChange(s)\"\r\n >\r\n {{ s.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <!-- AM/PM Column (only in 12-hour format) -->\r\n @if (timeFormat === 12) {\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-column ampm-column\">\r\n <div class=\"time-scroll\">\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 >\r\n {{ ap }}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface CalendarRange {\r\n start: Date;\r\n end: Date;\r\n}\r\n\r\nexport interface CustomRangesConfig {\r\n customRanges?: Record<string, CalendarRange>;\r\n rangeOrder: string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BkCalendarManagerService {\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 customRanges: Record<string, CalendarRange> = {};\r\n rangeOrder: string[] = [];\r\n\r\n constructor() {\r\n this.initializeDefaultRanges();\r\n }\r\n\r\n /**\r\n * Returns service-defined custom ranges and their display order.\r\n * Used when the calendar does not pass customRanges via @Input().\r\n */\r\n getCustomRanges(): CustomRangesConfig {\r\n this.initializeDefaultRanges();\r\n return {\r\n customRanges: { ...this.customRanges },\r\n rangeOrder: [...this.rangeOrder],\r\n };\r\n }\r\n\r\n initializeDefaultRanges(): void {\r\n const today = new Date();\r\n\r\n this.customRanges = {\r\n Today: {\r\n start: new Date(today.getFullYear(), today.getMonth(), today.getDate()),\r\n end: new Date(today.getFullYear(), today.getMonth(), today.getDate()),\r\n },\r\n Yesterday: {\r\n start: this.addDays(today, -1),\r\n end: this.addDays(today, -1),\r\n },\r\n 'Last 7 Days': {\r\n start: this.addDays(today, -6),\r\n end: today,\r\n },\r\n 'Last 30 Days': {\r\n start: this.addDays(today, -29),\r\n end: today,\r\n },\r\n 'This Month': {\r\n start: new Date(today.getFullYear(), today.getMonth(), 1),\r\n end: new Date(today.getFullYear(), today.getMonth() + 1, 0),\r\n },\r\n 'Last Month': {\r\n start: new Date(today.getFullYear(), today.getMonth() - 1, 1),\r\n end: new Date(today.getFullYear(), today.getMonth(), 0),\r\n },\r\n 'Custom Range': {\r\n start: new Date(),\r\n end: new Date(),\r\n },\r\n };\r\n\r\n this.rangeOrder = [\r\n 'Today',\r\n 'Yesterday',\r\n 'Last 7 Days',\r\n 'Last 30 Days',\r\n 'This Month',\r\n 'Last Month',\r\n 'Custom Range',\r\n ];\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 /**\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 getOnlyDate(input: string | Date): string {\r\n const date = new Date(input);\r\n\r\n const year = date.getFullYear();\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const day = date.getDate().toString().padStart(2, '0');\r\n\r\n return `${year}-${month}-${day}`;\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, OnChanges, SimpleChanges, ViewChild, ElementRef, forwardRef, Renderer2 } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule, Validator, AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { BkCalendarManagerService, CalendarRange } 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\n\r\nexport type { CalendarRange } from '../../services/calendar-manager.service';\r\n\r\nexport class CalendarSelection {\r\n startDate: string | null = null;\r\n endDate: string | null = null;\r\n /** Start time in 12-hour format with AM/PM (e.g. \"1:00 AM\"). */\r\n startTime: string | null = null;\r\n /** End time in 12-hour format with AM/PM (e.g. \"2:00 AM\"). */\r\n endTime: string | null = 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 providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkCustomCalendar),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => BkCustomCalendar),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkCustomCalendar implements OnInit, OnDestroy, OnChanges, ControlValueAccessor, Validator {\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 /** Vertical placement relative to the input. When explicitly set, overrides viewport-space detection entirely. */\r\n @Input() popupPosition?: 'top' | 'bottom';\r\n @Input() drop: 'up' | 'down' = 'down';\r\n @Input() dualCalendar = false;\r\n @Input() showRanges = true;\r\n @Input() timeFormat: 12 | 24 = 12;\r\n @Input() clearableTime: boolean = false;\r\n @Input() enableSeconds = false;\r\n @Input() customRanges?: Record<string, CalendarRange>;\r\n /** Column headers for weekdays; index 0 is the first column. Default Monday–Sunday. */\r\n @Input() weekDayLabels: string[] = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\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() compact = false; // NEW: Compact (smaller) layout variant. Default false keeps the original sizing.\r\n @Input() autoPosition = false; // NEW: When true, auto-flip popup above/below based on available viewport space. Default false.\r\n @Input() appendToBody = false; // When true, positions popup with fixed so it isn't clipped inside dialogs/overflow\r\n @Input() isDisplayCrossIcon = true; // NEW: Show/Hide clear (X) icon\r\n @Input() hasError = false; // NEW: Show/Hide clear (X) icon\r\n @Input() errorMessage = ''\r\n @Output() selected = new EventEmitter<CalendarSelection>();\r\n\r\n @ViewChild('inputWrapper') inputWrapper!: ElementRef<HTMLDivElement>;\r\n @ViewChild('calendarPopup') calendarPopupRef?: ElementRef<HTMLDivElement>;\r\n\r\n /** Used when appendToBody is true to position the popup in viewport coordinates */\r\n dropdownStyle: { top?: string; bottom?: string; left?: string } = {};\r\n /** Resolved after layout; used for CSS `drop-up` and appendToBody positioning with viewport flip */\r\n popupPlacementAbove = false;\r\n @Output() opened = new EventEmitter<void>();\r\n @Output() closed = new EventEmitter<void>();\r\n @Input() showCancelApply = true;\r\n /**\r\n * External value passed from parent / ngModel. When used with ngModel, this is the bound value.\r\n * Accepts { startDate: string|null, endDate: string|null, selectedDates?: string[] }\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 /** When true, the control is required (used with ngModel for validation: dirty, touched, invalid). */\r\n @Input() required = false;\r\n\r\n /** CVA: called when form control value is set (e.g. ngModel binding) */\r\n private onChange: (value: CalendarSelection | null) => void = () => {};\r\n /** CVA: called when control is touched (blur / close) */\r\n private onTouched: () => void = () => {};\r\n disabled = false;\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 startDate: Date | null = null;\r\n 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 /** Current start time string in 12-hour format with AM/PM (e.g. \"1:00 AM\"). Synced with ngModel/CalendarSelection. */\r\n startTime: string | null = null;\r\n /** Current end time string in 12-hour format with AM/PM (e.g. \"2:00 AM\"). Synced with ngModel/CalendarSelection. */\r\n endTime: string | null = null;\r\n\r\n /** ngModel binding for single-calendar time picker (null = no time). */\r\n singleTimeModel: string | null = null;\r\n /** ngModel binding for dual-calendar start time picker (null = no time). */\r\n startTimeModel: string | null = null;\r\n /** ngModel binding for dual-calendar end time picker (null = no time). */\r\n endTimeModel: string | null = null;\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 activeRange: string | null = null; // Track which range is currently active\r\n @Input() rangeOrder: string[] = []; // Maintain order of ranges\r\n\r\n /** Keyboard roving focus for date grid (local date, midnight) */\r\n keyboardFocusDate: Date | null = null;\r\n\r\n private unregisterFn?: () => void;\r\n private closeAllSubscription?: Subscription;\r\n private closeFn?: () => void;\r\n\r\n constructor(private calendarManager: BkCalendarManagerService, private renderer: Renderer2) {}\r\n\r\n /**\r\n * appendToBody popup relocation.\r\n *\r\n * `appendToBody` uses `position: fixed`, which only anchors to the viewport when NO ancestor\r\n * establishes a containing block (transform / filter / perspective / will-change / contain /\r\n * backdrop-filter). Consumers frequently place the calendar inside such an ancestor (an animated\r\n * panel, a CSS-transformed modal, etc.), which silently re-anchors the fixed popup and pushes it\r\n * off-position. To be robust everywhere we physically move the popup node to <body> while it is\r\n * open, then move it back before Angular's *ngIf tears it down. Angular keeps managing the node by\r\n * reference after the move, so its event bindings, change detection, and emulated-encapsulation\r\n * styles all continue to work.\r\n */\r\n private popupMovedToBody = false;\r\n private popupOriginalParent: HTMLElement | null = null;\r\n private popupOriginalNextSibling: Node | null = null;\r\n\r\n private movePopupToBody(): void {\r\n const el = this.calendarPopupRef?.nativeElement;\r\n if (!el || this.popupMovedToBody) return;\r\n this.popupOriginalParent = el.parentElement;\r\n this.popupOriginalNextSibling = el.nextSibling;\r\n this.renderer.appendChild(document.body, el);\r\n this.popupMovedToBody = true;\r\n }\r\n\r\n /** Return the popup to its original DOM slot so *ngIf can destroy it cleanly (safe to call twice). */\r\n private restorePopupFromBody(): void {\r\n if (!this.popupMovedToBody) return;\r\n const el = this.calendarPopupRef?.nativeElement;\r\n const parent = this.popupOriginalParent;\r\n if (el && parent) {\r\n const ref = this.popupOriginalNextSibling;\r\n if (ref && ref.parentNode === parent) {\r\n this.renderer.insertBefore(parent, el, ref);\r\n } else {\r\n this.renderer.appendChild(parent, el);\r\n }\r\n }\r\n this.popupMovedToBody = false;\r\n this.popupOriginalParent = null;\r\n this.popupOriginalNextSibling = null;\r\n }\r\n\r\n /** Weekday headers; falls back to Mon–Sun if the input is not length 7. */\r\n get resolvedWeekDayLabels(): string[] {\r\n const d = this.weekDayLabels;\r\n if (d?.length === 7) return d;\r\n return ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\r\n }\r\n\r\n /** When dual range mode, Apply is blocked until both endpoints exist. */\r\n get isDualRangeApplyBlocked(): boolean {\r\n if (!this.dualCalendar || this.singleDatePicker || this.multiDateSelection) return false;\r\n return !this.startDate || !this.endDate;\r\n }\r\n\r\n /**\r\n * Popup single-date with manual Apply: do not push to ngModel / (selected) until Apply.\r\n * Inline calendars have no Apply footer, so they always commit immediately.\r\n */\r\n private shouldDeferSingleDateCommit(): boolean {\r\n return this.singleDatePicker && !this.autoApply && !this.inline;\r\n }\r\n\r\n private emitSelectionUnlessSingleDateDeferred(): void {\r\n if (this.shouldDeferSingleDateCommit()) return;\r\n this.emitSelection();\r\n }\r\n\r\n /** Discard in-popup draft and restore last committed value from {@link selectedValue}. */\r\n private revertSingleDateDraftIfNeeded(): void {\r\n if (this.shouldDeferSingleDateCommit()) {\r\n this.applyValueToState(this.selectedValue ?? null);\r\n }\r\n }\r\n\r\n private finishPopupDismissal(): void {\r\n if (this.inline) return;\r\n this.detachViewportListeners();\r\n this.revertSingleDateDraftIfNeeded();\r\n // Put the popup back in its original slot BEFORE show=false so *ngIf removes it from the right\r\n // parent on the next change-detection pass (avoids leaving an orphan node in <body>).\r\n this.restorePopupFromBody();\r\n this.show = false;\r\n this.onTouched();\r\n this.closed.emit();\r\n }\r\n\r\n /** User preference before viewport adjustment (only used when popupPosition is not explicitly set). */\r\n private preferPopupAbove(): boolean {\r\n return this.drop === 'up';\r\n }\r\n\r\n private resolveCustomRangesFromInputsOrService(): void {\r\n const svc = this.calendarManager.getCustomRanges();\r\n if (!this.customRanges) {\r\n this.customRanges = { ...svc.customRanges! };\r\n this.rangeOrder = [...svc.rangeOrder];\r\n } else {\r\n if (!this.rangeOrder?.length) {\r\n const keys = Object.keys(this.customRanges);\r\n const ordered = svc.rangeOrder.filter(k => keys.includes(k));\r\n const rest = keys.filter(k => !ordered.includes(k));\r\n this.rangeOrder = [...ordered, ...rest];\r\n }\r\n if (!this.customRanges['Custom Range']) {\r\n this.customRanges['Custom Range'] = { start: new Date(), end: new Date() };\r\n }\r\n }\r\n }\r\n\r\n private labelToJsWeekday(label: string): number {\r\n const key = label.replace(/\\./g, '').trim().toLowerCase();\r\n const map: Record<string, number> = {\r\n sun: 0, sunday: 0, su: 0,\r\n mon: 1, monday: 1, mo: 1,\r\n tue: 2, tues: 2, tuesday: 2, tu: 2,\r\n wed: 3, wednesday: 3, we: 3,\r\n thu: 4, thur: 4, thurs: 4, thursday: 4, th: 4,\r\n fri: 5, friday: 5, fr: 5,\r\n sat: 6, saturday: 6, sa: 6,\r\n };\r\n return map[key] ?? 1;\r\n }\r\n\r\n private getWeekStartDayIndex(): number {\r\n return this.labelToJsWeekday(this.resolvedWeekDayLabels[0] ?? 'Mon');\r\n }\r\n\r\n // --- ControlValueAccessor implementation ---\r\n writeValue(value: CalendarSelection | null): void {\r\n this.selectedValue = value ?? null;\r\n this.applyValueToState(this.selectedValue);\r\n }\r\n\r\n registerOnChange(fn: (value: CalendarSelection | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): 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 /** Validator: when required is true, value must have a date selected. */\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (!this.required) return null;\r\n const value = control.value as CalendarSelection | null;\r\n if (!value) return { required: true };\r\n if (this.multiDateSelection) {\r\n if (!value.selectedDates || value.selectedDates.length === 0) return { required: true };\r\n } else {\r\n if (!value.startDate) return { required: true };\r\n }\r\n return null;\r\n }\r\n\r\n /** Call from template when control loses focus (for CVA touched state). */\r\n markAsTouched(): void {\r\n this.onTouched();\r\n }\r\n\r\n /** Clears embedded time picker ngModels, spinner state, raw minute typing, and forces dropdowns closed. */\r\n private resetEmbeddedTimePickerUiState(): void {\r\n this.singleTimeModel = null;\r\n this.startTimeModel = null;\r\n this.endTimeModel = null;\r\n this.selectedHour = 1;\r\n this.selectedMinute = 0;\r\n this.selectedSecond = 0;\r\n this.selectedAMPM = 'AM';\r\n this.startHour = 1;\r\n this.startMinute = 0;\r\n this.startSecond = 0;\r\n this.startAMPM = 'AM';\r\n this.endHour = 2;\r\n this.endMinute = 0;\r\n this.endSecond = 0;\r\n this.endAMPM = 'AM';\r\n this.minuteInputValues = {};\r\n this.openTimePickerId = null;\r\n for (const id of ['single-time', 'dual-start', 'dual-end'] as const) {\r\n this.closePickerCounter[id] = (this.closePickerCounter[id] || 0) + 1;\r\n }\r\n }\r\n\r\n /** Apply CalendarSelection to internal state (startDate, endDate, startTime, endTime, selectedDates, calendar view). */\r\n private applyValueToState(value: CalendarSelection | null): void {\r\n if (!value) {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.startTime = null;\r\n this.endTime = null;\r\n this.selectedDates = [];\r\n this.activeRange = null;\r\n this.resetEmbeddedTimePickerUiState();\r\n this.month = this.today.getMonth();\r\n this.year = this.today.getFullYear();\r\n this.generateCalendar();\r\n if (this.dualCalendar) {\r\n this.initializeDual();\r\n }\r\n return;\r\n }\r\n const s = value;\r\n this.startDate = s.startDate ? this.parseDateString(s.startDate) : null;\r\n this.endDate = s.endDate ? this.parseDateString(s.endDate) : null;\r\n this.selectedDates = (s.selectedDates || []).map((d) => typeof d === 'string' ? this.parseDateString(d) : new Date(d));\r\n this.startTime = s.startTime ?? null;\r\n this.endTime = s.endTime ?? null;\r\n\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 if (this.startDate) {\r\n this.leftMonth = this.startDate.getMonth();\r\n this.leftYear = this.startDate.getFullYear();\r\n }\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 if (endMonth !== startMonth || endYear !== startYear) {\r\n this.rightMonth = endMonth;\r\n this.rightYear = endYear;\r\n } else {\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 this.rightMonth = this.endDate.getMonth();\r\n this.rightYear = this.endDate.getFullYear();\r\n } else {\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 this.generateDualCalendars();\r\n } else {\r\n this.generateCalendar();\r\n }\r\n\r\n if (this.startTime) {\r\n const startParsed = this.parsePickerTimeString(this.startTime);\r\n this.startHour = startParsed.hour12;\r\n this.startMinute = startParsed.minute;\r\n this.startAMPM = startParsed.ampm;\r\n if (this.startDate) {\r\n let h24 = startParsed.hour12;\r\n if (startParsed.ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (startParsed.ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.startDate.setHours(h24, startParsed.minute, this.startSecond);\r\n }\r\n this.selectedHour = this.startHour;\r\n this.selectedMinute = this.startMinute;\r\n this.selectedAMPM = this.startAMPM;\r\n } else if (this.startDate) {\r\n // Date-only committed value: keep startTime null; sync spinners for UX only (not emitted until user sets time).\r\n this.initializeTimeFromDate(this.startDate, true);\r\n if (!this.dualCalendar) {\r\n this.selectedHour = this.startHour;\r\n this.selectedMinute = this.startMinute;\r\n this.selectedAMPM = this.startAMPM;\r\n }\r\n }\r\n\r\n if (this.endTime) {\r\n const endParsed = this.parsePickerTimeString(this.endTime);\r\n this.endHour = endParsed.hour12;\r\n this.endMinute = endParsed.minute;\r\n this.endAMPM = endParsed.ampm;\r\n if (this.endDate) {\r\n let h24 = endParsed.hour12;\r\n if (endParsed.ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (endParsed.ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.endDate.setHours(h24, endParsed.minute, this.endSecond);\r\n }\r\n } else if (this.endDate) {\r\n this.initializeTimeFromDate(this.endDate, false);\r\n }\r\n\r\n if (this.startDate && this.endDate) {\r\n this.checkAndSetActiveRange();\r\n }\r\n\r\n // Sync ngModel values for embedded time pickers (null when no time set)\r\n if (!this.dualCalendar) {\r\n this.singleTimeModel = this.startTime ?? null;\r\n } else {\r\n this.startTimeModel = this.startTime ?? null;\r\n this.endTimeModel = this.endTime ?? null;\r\n }\r\n }\r\n\r\n /** Format to \"H:MM AM/PM\" string. */\r\n private formatTimeToAmPm(hour12: number, minute: number, ampm: string): string {\r\n const m = minute.toString().padStart(2, '0');\r\n return `${hour12}:${m} ${ampm}`;\r\n }\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 if (!this.show) return;\r\n const target = event.target as HTMLElement;\r\n // When appendToBody has relocated the popup to <body>, it is no longer a descendant of\r\n // .calendar-container, so also treat clicks within the popup element itself as \"inside\".\r\n const popupEl = this.calendarPopupRef?.nativeElement;\r\n const insidePopup = !!popupEl && (popupEl === target || popupEl.contains(target));\r\n if (!target.closest('.calendar-container') && !insidePopup) {\r\n this.close();\r\n }\r\n }\r\n\r\n /** True while capture-phase scroll + resize listeners are attached (only while the popup is open). */\r\n private viewportListenersAttached = false;\r\n /** Pending rAF id so bursts of scroll events collapse into one layout pass. */\r\n private viewportRafId: number | null = null;\r\n\r\n /**\r\n * Recipe steps 2 & 4: while the popup is open, keep it glued to the trigger as the page\r\n * (or any nested scroll container) scrolls, and dismiss it once the trigger leaves the viewport.\r\n * Throttled through requestAnimationFrame to avoid layout thrash during fast scrolling.\r\n */\r\n private readonly onViewportChange = (): void => {\r\n if (this.viewportRafId != null) return;\r\n this.viewportRafId = requestAnimationFrame(() => {\r\n this.viewportRafId = null;\r\n this.handleViewportChange();\r\n });\r\n };\r\n\r\n private handleViewportChange(): void {\r\n if (!this.show || this.inline) return;\r\n\r\n if (this.appendToBody) {\r\n const trigger = this.inputWrapper?.nativeElement;\r\n if (!trigger) return;\r\n const rect = trigger.getBoundingClientRect();\r\n // Step 4: trigger scrolled fully out of view → close instead of leaving a floating panel behind.\r\n if (this.isTriggerOutOfView(rect)) {\r\n this.close();\r\n return;\r\n }\r\n // Step 2: re-anchor (and re-flip) so the panel follows the trigger.\r\n this.updatePosition();\r\n } else {\r\n // Absolute-positioned popups track the trigger natively; just re-evaluate the flip.\r\n this.refreshPopupPlacement();\r\n }\r\n }\r\n\r\n /**\r\n * Trigger is no longer visible and the fixed popup should be dismissed. True when the trigger is\r\n * either entirely outside the viewport, or clipped out of ANY ancestor scroll container — e.g.\r\n * scrolled behind the header/footer of a modal body. This makes step 4 work both on the plain\r\n * page and inside a dialog when `appendToBody` positions the popup with `fixed`.\r\n */\r\n private isTriggerOutOfView(rect: DOMRect): boolean {\r\n // 1. Fully above or below the viewport.\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight) return true;\r\n\r\n // 2. Fully clipped out of a scrollable ancestor (the modal body, a scroll pane, etc.).\r\n let el = this.inputWrapper?.nativeElement?.parentElement ?? null;\r\n while (el && el !== document.body && el !== document.documentElement) {\r\n if (this.isScrollClippingContainer(el)) {\r\n const c = el.getBoundingClientRect();\r\n if (\r\n rect.bottom <= c.top ||\r\n rect.top >= c.bottom ||\r\n rect.right <= c.left ||\r\n rect.left >= c.right\r\n ) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n /** An ancestor that clips overflowing content on an axis where its content actually overflows. */\r\n private isScrollClippingContainer(el: HTMLElement): boolean {\r\n const style = getComputedStyle(el);\r\n const clipsY =\r\n /(auto|scroll|hidden)/.test(style.overflowY) && el.scrollHeight > el.clientHeight;\r\n const clipsX =\r\n /(auto|scroll|hidden)/.test(style.overflowX) && el.scrollWidth > el.clientWidth;\r\n return clipsY || clipsX;\r\n }\r\n\r\n private attachViewportListeners(): void {\r\n if (this.viewportListenersAttached) return;\r\n // capture = true so scrolling inside ANY ancestor container fires this, not only window scroll.\r\n document.addEventListener('scroll', this.onViewportChange, true);\r\n window.addEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = true;\r\n }\r\n\r\n private detachViewportListeners(): void {\r\n if (!this.viewportListenersAttached) return;\r\n document.removeEventListener('scroll', this.onViewportChange, true);\r\n window.removeEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = false;\r\n if (this.viewportRafId != null) {\r\n cancelAnimationFrame(this.viewportRafId);\r\n this.viewportRafId = null;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.resolveCustomRangesFromInputsOrService();\r\n if (this.dualCalendar) this.initializeDual();\r\n else this.generateCalendar();\r\n\r\n // Initialize spinner state from existing dates (does not set startTime/endTime — those stay null until user picks time).\r\n if (this.startDate) {\r\n this.initializeTimeFromDate(this.startDate, true);\r\n if (!this.dualCalendar) {\r\n this.selectedHour = this.startHour;\r\n this.selectedMinute = this.startMinute;\r\n this.selectedAMPM = this.startAMPM;\r\n }\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 setTimeout(() => this.initKeyboardFocus(), 0);\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']) {\r\n this.applyValueToState(this.selectedValue ?? null);\r\n }\r\n if (changes['customRanges'] || changes['rangeOrder']) {\r\n this.resolveCustomRangesFromInputsOrService();\r\n }\r\n if (changes['weekDayLabels'] && !changes['weekDayLabels'].firstChange) {\r\n this.regenerateCalendarsForWeekStart();\r\n }\r\n }\r\n\r\n private regenerateCalendarsForWeekStart(): void {\r\n if (this.dualCalendar) {\r\n this.generateDualCalendars();\r\n } else {\r\n this.generateCalendar();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Ensure global scroll/resize listeners never outlive the component\r\n this.detachViewportListeners();\r\n\r\n // If destroyed while open with the popup relocated to <body>, put it back so Angular's teardown\r\n // removes it from the expected parent instead of leaving an orphan node in <body>.\r\n this.restorePopupFromBody();\r\n\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 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 if (this.disabled) return;\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.attachViewportListeners();\r\n setTimeout(() => {\r\n this.initKeyboardFocus();\r\n this.calendarPopupRef?.nativeElement?.focus({ preventScroll: true });\r\n if (this.appendToBody && this.inputWrapper?.nativeElement) {\r\n // Move the popup out to <body> first so any transformed/overflow ancestor can no longer\r\n // re-anchor or clip its fixed positioning, then compute viewport coordinates.\r\n this.movePopupToBody();\r\n this.updatePosition();\r\n } else if (!this.inline) {\r\n this.refreshPopupPlacement();\r\n }\r\n }, 0);\r\n this.opened.emit();\r\n } else {\r\n this.finishPopupDismissal();\r\n }\r\n }\r\n\r\n /** Update popup position when appendToBody is true (fixed positioning relative to viewport). */\r\n updatePosition() {\r\n if (!this.inputWrapper?.nativeElement) return;\r\n const rect = this.inputWrapper.nativeElement.getBoundingClientRect();\r\n const popupEl = this.calendarPopupRef?.nativeElement;\r\n const popupH = popupEl?.offsetHeight ?? 360;\r\n const popupW = popupEl?.offsetWidth ?? 320;\r\n const placeAbove = this.computePlacementAbove(rect, popupH);\r\n this.popupPlacementAbove = placeAbove;\r\n const left = this.computePopupLeft(rect, popupW);\r\n const gap = 4;\r\n if (placeAbove) {\r\n this.dropdownStyle = {\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\r\n left: `${left}px`,\r\n };\r\n } else {\r\n this.dropdownStyle = {\r\n top: `${rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Horizontal placement for the fixed (appendToBody) popup.\r\n *\r\n * The base edge follows the author's {@link opens} preference:\r\n * • 'left' → align left edges, panel opens rightwards (default)\r\n * • 'right' → align right edges, panel opens leftwards\r\n * • 'center' → centred on the trigger\r\n * When {@link autoPosition} is on, the panel auto-flips to the opposite edge if the preferred\r\n * side would overflow the viewport, then clamps to an 8px margin so it can never leave the screen.\r\n * When autoPosition is off, the explicit `opens` value is honoured as-is.\r\n */\r\n private computePopupLeft(rect: DOMRect, popupWidth: number): number {\r\n const margin = 8;\r\n const viewportW = window.innerWidth;\r\n\r\n // 1. Base alignment from the user-provided `opens`.\r\n let left: number;\r\n if (this.opens === 'right') {\r\n left = rect.right - popupWidth; // align right edges → opens leftwards\r\n } else if (this.opens === 'center') {\r\n left = rect.left + rect.width / 2 - popupWidth / 2;\r\n } else {\r\n left = rect.left; // align left edges → opens rightwards\r\n }\r\n\r\n if (!this.autoPosition) return left;\r\n\r\n // 2. Auto-flip to the opposite edge when the preferred side overflows the viewport.\r\n if (left + popupWidth > viewportW - margin) {\r\n left = rect.right - popupWidth; // flip: open leftwards\r\n }\r\n if (left < margin) {\r\n left = rect.left; // flip back: open rightwards\r\n }\r\n\r\n // 3. Final clamp so the panel always stays fully on screen on both edges.\r\n left = Math.min(left, viewportW - popupWidth - margin);\r\n left = Math.max(left, margin);\r\n return left;\r\n }\r\n\r\n /** Non–append-to-body: set `popupPlacementAbove` for CSS `drop-up` with viewport flip. */\r\n refreshPopupPlacement(): void {\r\n if (!this.inputWrapper?.nativeElement) return;\r\n const rect = this.inputWrapper.nativeElement.getBoundingClientRect();\r\n const popupH = this.calendarPopupRef?.nativeElement?.offsetHeight ?? 360;\r\n this.popupPlacementAbove = this.computePlacementAbove(rect, popupH);\r\n }\r\n\r\n private computePlacementAbove(rect: DOMRect, popupHeight: number): boolean {\r\n // If the consumer explicitly set popupPosition, honour it — no space-check override.\r\n if (this.popupPosition === 'top') return true;\r\n if (this.popupPosition === 'bottom') return false;\r\n\r\n // Space-based auto-flip is opt-in. When disabled, just honour the `drop` preference.\r\n if (!this.autoPosition) {\r\n return this.preferPopupAbove();\r\n }\r\n\r\n // autoPosition enabled → auto-detect based on available viewport space.\r\n const gap = 12;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const spaceAbove = rect.top - gap;\r\n const preferAbove = this.preferPopupAbove();\r\n if (preferAbove) {\r\n return spaceAbove >= popupHeight || spaceAbove >= spaceBelow;\r\n }\r\n if (spaceBelow >= popupHeight || spaceBelow >= spaceAbove) return false;\r\n return true;\r\n }\r\n\r\n /** Normalize to local midnight and clamp to min/max selectable day. */\r\n private clampCalendarDayToSelectableRange(d: Date): Date {\r\n let x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n if (this.minDate) {\r\n const min = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n if (x < min) x = new Date(min.getFullYear(), min.getMonth(), min.getDate());\r\n }\r\n if (this.maxDate) {\r\n const max = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), this.maxDate.getDate());\r\n if (x > max) x = new Date(max.getFullYear(), max.getMonth(), max.getDate());\r\n }\r\n return x;\r\n }\r\n\r\n private initKeyboardFocus(): void {\r\n if (!this.inline && !this.show) return;\r\n const base =\r\n this.startDate ??\r\n this.endDate ??\r\n new Date(this.today.getFullYear(), this.today.getMonth(), this.today.getDate());\r\n const d = this.clampCalendarDayToSelectableRange(\r\n new Date(base.getFullYear(), base.getMonth(), base.getDate())\r\n );\r\n this.keyboardFocusDate = d;\r\n this.ensureKeyboardFocusVisible();\r\n }\r\n\r\n /**\r\n * After clearing values, drop stale keyboard highlight (was last start/end) and reset the\r\n * visible month(s) to today (clamped). Move DOM focus to the popup when open, else the input.\r\n */\r\n private resetCalendarFocusAfterClear(): void {\r\n const todayLocal = new Date(this.today.getFullYear(), this.today.getMonth(), this.today.getDate());\r\n this.keyboardFocusDate = this.clampCalendarDayToSelectableRange(todayLocal);\r\n\r\n if (this.dualCalendar) {\r\n this.leftMonth = this.keyboardFocusDate.getMonth();\r\n this.leftYear = this.keyboardFocusDate.getFullYear();\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 } else {\r\n this.month = this.keyboardFocusDate.getMonth();\r\n this.year = this.keyboardFocusDate.getFullYear();\r\n this.generateCalendar();\r\n }\r\n\r\n this.scheduleDomFocusAfterClear();\r\n }\r\n\r\n private scheduleDomFocusAfterClear(): void {\r\n setTimeout(() => {\r\n if (this.show || this.inline) {\r\n this.calendarPopupRef?.nativeElement?.focus({ preventScroll: true });\r\n return;\r\n }\r\n const inputEl = this.inputWrapper?.nativeElement?.querySelector<HTMLInputElement>('.calendar-input');\r\n inputEl?.focus({ preventScroll: true });\r\n }, 0);\r\n }\r\n\r\n private ensureKeyboardFocusVisible(): void {\r\n if (!this.keyboardFocusDate) return;\r\n const fd = this.keyboardFocusDate;\r\n if (!this.dualCalendar) {\r\n if (fd.getMonth() !== this.month || fd.getFullYear() !== this.year) {\r\n this.month = fd.getMonth();\r\n this.year = fd.getFullYear();\r\n this.generateCalendar();\r\n }\r\n return;\r\n }\r\n const fm = fd.getMonth();\r\n const fy = fd.getFullYear();\r\n const inLeft = fm === this.leftMonth && fy === this.leftYear;\r\n const inRight = fm === this.rightMonth && fy === this.rightYear;\r\n if (inLeft || inRight) return;\r\n this.leftMonth = fm;\r\n this.leftYear = fy;\r\n this.rightMonth = fm + 1;\r\n this.rightYear = fy;\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 private moveKeyboardFocus(deltaDays: number): void {\r\n if (!this.keyboardFocusDate) this.initKeyboardFocus();\r\n if (!this.keyboardFocusDate) return;\r\n let next = this.addDays(this.keyboardFocusDate, deltaDays);\r\n if (this.minDate) {\r\n const min = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n if (next < min) next = min;\r\n }\r\n if (this.maxDate) {\r\n const max = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), this.maxDate.getDate());\r\n if (next > max) next = max;\r\n }\r\n this.keyboardFocusDate = new Date(next.getFullYear(), next.getMonth(), next.getDate());\r\n this.ensureKeyboardFocusVisible();\r\n }\r\n\r\n /**\r\n * When focus is inside a real control (button, link, field), do not intercept keys here.\r\n * Otherwise this handler's preventDefault (Enter/Space) blocks native button activation and\r\n * bubbled Enter still runs applyKeyboardSelection — breaking keyboard parity with click.\r\n */\r\n private isKeyboardEventFromInteractiveDescendant(event: KeyboardEvent): boolean {\r\n const t = event.target;\r\n if (!(t instanceof Element)) return false;\r\n return !!t.closest(\r\n 'button, a[href], input, select, textarea, [contenteditable=\"true\"], bk-time-picker'\r\n );\r\n }\r\n\r\n onCalendarPopupKeydown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n if (event.key === 'Tab') return;\r\n if (this.isKeyboardEventFromInteractiveDescendant(event)) {\r\n return;\r\n }\r\n\r\n const k = event.key;\r\n if (k === 'ArrowLeft' || k === 'ArrowRight' || k === 'ArrowUp' || k === 'ArrowDown' || k === 'Enter' || k === ' ') {\r\n event.preventDefault();\r\n }\r\n if (k === 'ArrowLeft') this.moveKeyboardFocus(-1);\r\n else if (k === 'ArrowRight') this.moveKeyboardFocus(1);\r\n else if (k === 'ArrowUp') this.moveKeyboardFocus(-7);\r\n else if (k === 'ArrowDown') this.moveKeyboardFocus(7);\r\n else if (k === 'Enter' || k === ' ') this.applyKeyboardSelection();\r\n }\r\n\r\n private applyKeyboardSelection(): void {\r\n if (!this.keyboardFocusDate) return;\r\n const day = this.keyboardFocusDate.getDate();\r\n if (this.dualCalendar) {\r\n const fr = this.keyboardFocusDate.getMonth() === this.rightMonth && this.keyboardFocusDate.getFullYear() === this.rightYear;\r\n const fl = this.keyboardFocusDate.getMonth() === this.leftMonth && this.keyboardFocusDate.getFullYear() === this.leftYear;\r\n if (fr) this.selectDate(day, true);\r\n else if (fl) this.selectDate(day, false);\r\n else {\r\n this.ensureKeyboardFocusVisible();\r\n const fr2 = this.keyboardFocusDate.getMonth() === this.rightMonth && this.keyboardFocusDate.getFullYear() === this.rightYear;\r\n this.selectDate(day, fr2);\r\n }\r\n } else {\r\n this.selectDate(day, false);\r\n }\r\n }\r\n\r\n isKeyboardFocusedCell(year: number, month: number, day: number): boolean {\r\n if (!this.keyboardFocusDate || !day) return false;\r\n return (\r\n this.keyboardFocusDate.getFullYear() === year &&\r\n this.keyboardFocusDate.getMonth() === month &&\r\n this.keyboardFocusDate.getDate() === day\r\n );\r\n }\r\n\r\n onRangeButtonKeydown(event: KeyboardEvent, rangeKey: string): void {\r\n if (event.key === ' ' || event.key === 'Enter') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.chooseRange(rangeKey);\r\n }\r\n }\r\n\r\n close() {\r\n if (this.inline) {\r\n return;\r\n }\r\n this.finishPopupDismissal();\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 || this.disabled) 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 this.keyboardFocusDate = new Date(selected.getFullYear(), selected.getMonth(), selected.getDate());\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 only when user has already selected a time; otherwise keep time null (date at midnight)\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n const isStart = !this.startDate || !!this.endDate;\r\n if (isStart && this.startTime != null) this.applyTimeToDate(selected, true);\r\n else if (!isStart && this.endTime != null) this.applyTimeToDate(selected, false);\r\n else selected.setHours(0, 0, this.selectedSecond);\r\n } else {\r\n if (this.startTime != null) this.applyTimeToDate(selected, true);\r\n else selected.setHours(0, 0, this.selectedSecond);\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 only if user has already picked a time; otherwise keep time null\r\n if (this.enableTimepicker) {\r\n if (this.startTime != null) this.applyTimeToDate(this.startDate, true);\r\n else this.startDate.setHours(0, 0, this.selectedSecond);\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 this.emitSelectionUnlessSingleDateDeferred();\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 if (this.disabled) return;\r\n if (this.isDualRangeApplyBlocked) return;\r\n // Format minute inputs to 2 digits before applying\r\n this.formatAllMinuteInputs();\r\n\r\n // Apply time only when the user has an explicit time string (avoids inventing \"12:00 AM\" from picker defaults).\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n if (this.startDate && this.startTime != null) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate && this.endTime != null) {\r\n this.applyTimeToDate(this.endDate, false);\r\n }\r\n } else {\r\n if (this.startDate && this.startTime != null) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate && !this.singleDatePicker && this.startTime != null) {\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.onTouched();\r\n this.close();\r\n }\r\n\r\n cancel() {\r\n if (this.disabled) return;\r\n // if (this.shouldDeferSingleDateCommit()) {\r\n // this.finishPopupDismissal();\r\n // return;\r\n // }\r\n // this.startDate = null;\r\n // this.endDate = null;\r\n // this.selectedDates = [];\r\n // this.resetCalendarFocusAfterClear();\r\n this.close();\r\n }\r\n\r\n clear() {\r\n if (this.disabled) return;\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.startTime = null;\r\n this.endTime = null;\r\n this.selectedDates = [];\r\n this.activeRange = null;\r\n this.resetEmbeddedTimePickerUiState();\r\n\r\n this.resetCalendarFocusAfterClear();\r\n\r\n this.emitSelection();\r\n }\r\n\r\n chooseRange(key: string) {\r\n if (this.disabled || !this.customRanges) return;\r\n if (key === 'Custom Range') {\r\n this.activeRange = 'Custom Range';\r\n return;\r\n }\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 if (this.endDate) {\r\n this.keyboardFocusDate = new Date(this.endDate.getFullYear(), this.endDate.getMonth(), this.endDate.getDate());\r\n } else if (this.startDate) {\r\n this.keyboardFocusDate = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n }\r\n\r\n // \"Custom Range\" returned above — here we only handle predefined presets.\r\n // Popup: quick-select preset → same as Apply (commit + close). Inline: keep prior emit / deferred rules.\r\n if (this.inline) {\r\n this.emitSelectionUnlessSingleDateDeferred();\r\n if (this.shouldDeferSingleDateCommit() && this.autoApply) {\r\n this.apply();\r\n }\r\n return;\r\n }\r\n this.apply();\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 hasValue =\r\n this.startDate != null ||\r\n this.endDate != null ||\r\n (this.multiDateSelection && this.selectedDates.length > 0);\r\n\r\n if (!hasValue) {\r\n this.selectedValue = null;\r\n this.onChange(null);\r\n this.selected.emit({\r\n startDate: null,\r\n endDate: null,\r\n startTime: null,\r\n endTime: null,\r\n selectedDates: [],\r\n });\r\n return;\r\n }\r\n\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 startTime: this.startTime ?? null,\r\n endTime: this.endTime ?? 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.selectedValue = selection;\r\n this.onChange(selection);\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 weekStart = this.getWeekStartDayIndex();\r\n const firstDayJs = new Date(year, month, 1).getDay();\r\n const offset = (firstDayJs - weekStart + 7) % 7;\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 for (let i = offset - 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 // Only show time when user has selected a time; use startTime/endTime strings so 12:00 AM shows as \"12:00 AM\" not \"00:00\"\r\n if (this.enableTimepicker && !this.dualCalendar && this.startTime != null) {\r\n dateStr += ` ${this.startTime}`;\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 && this.startTime != null) {\r\n dateStr += ` ${this.startTime}`;\r\n }\r\n if (this.endTime != null) {\r\n endStr += ` ${this.endTime}`;\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 | null) {\r\n if (time == null || time === '') {\r\n this.startTime = null;\r\n this.selectedHour = 1;\r\n this.selectedMinute = 0;\r\n this.selectedAMPM = 'AM';\r\n if (this.startDate) {\r\n this.startDate.setHours(0, 0, this.selectedSecond);\r\n }\r\n this.emitSelectionUnlessSingleDateDeferred();\r\n return;\r\n }\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 const timeStr = this.formatTimeToAmPm(hour12, minute, ampm);\r\n this.startTime = timeStr;\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 }\r\n\r\n this.emitSelectionUnlessSingleDateDeferred();\r\n }\r\n\r\n // NEW: Handle BkTimePicker change for dual calendar\r\n onDualTimePickerChange(time: string | null, isStart = true) {\r\n if (time == null || time === '') {\r\n if (isStart) {\r\n this.startTime = null;\r\n this.startHour = 1;\r\n this.startMinute = 0;\r\n this.startAMPM = 'AM';\r\n if (this.startDate) this.startDate.setHours(0, 0, this.startSecond);\r\n } else {\r\n this.endTime = null;\r\n this.endHour = 2;\r\n this.endMinute = 0;\r\n this.endAMPM = 'AM';\r\n if (this.endDate) this.endDate.setHours(0, 0, this.endSecond);\r\n }\r\n this.emitSelection();\r\n return;\r\n }\r\n const { hour12, minute, ampm } = this.parsePickerTimeString(time);\r\n const timeStr = this.formatTimeToAmPm(hour12, minute, ampm);\r\n\r\n if (isStart) {\r\n this.startHour = hour12;\r\n this.startMinute = minute;\r\n this.startAMPM = ampm;\r\n this.startTime = timeStr;\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 this.endTime = timeStr;\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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 /**\r\n * Parse a date-only string (YYYY-MM-DD) as local date.\r\n * Using new Date('2026-02-21') would be UTC midnight and can show as previous day in local time.\r\n */\r\n private parseDateString(value: string): Date {\r\n if (!value || typeof value !== 'string') return new Date(value);\r\n const match = value.trim().match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\r\n if (match) {\r\n const y = parseInt(match[1], 10);\r\n const m = parseInt(match[2], 10) - 1;\r\n const d = parseInt(match[3], 10);\r\n if (m >= 0 && m <= 11 && d >= 1 && d <= 31) {\r\n return new Date(y, m, d);\r\n }\r\n }\r\n return new Date(value);\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\" [class.disabled]=\"disabled\">\r\n <!-- Input field -->\r\n <div #inputWrapper class=\"input-wrapper\" *ngIf=\"!inline\">\r\n <input\r\n type=\"text\"\r\n (click)=\"!disabled && toggle()\"\r\n (keydown.enter)=\"$event.preventDefault()\"\r\n (blur)=\"markAsTouched()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [attr.disabled]=\"disabled ? true : null\"\r\n [class.hasError]=\"hasError\"\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 type=\"button\" class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon && !disabled\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">×</button>\r\n </div>\r\n\r\n <!-- Calendar Popup / Inline -->\r\n <div #calendarPopup\r\n class=\"calendar-popup\"\r\n [class.inline-calendar]=\"inline\"\r\n [class.append-to-body]=\"appendToBody && !inline\"\r\n [style.position]=\"appendToBody && !inline ? 'fixed' : null\"\r\n [style.top]=\"appendToBody && !inline && !popupPlacementAbove ? dropdownStyle.top : null\"\r\n [style.bottom]=\"appendToBody && !inline && popupPlacementAbove ? dropdownStyle.bottom : null\"\r\n [style.left]=\"appendToBody && !inline ? dropdownStyle.left : null\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n [ngClass]=\"{\r\n 'position-right': !inline && !appendToBody && opens === 'right',\r\n 'position-center': !inline && !appendToBody && opens === 'center',\r\n 'drop-up': !inline && popupPlacementAbove,\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\"\r\n *ngIf=\"inline || show\">\r\n\r\n <!-- RANGES -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges\" role=\"listbox\" aria-label=\"Date ranges\">\r\n <button\r\n type=\"button\"\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n (keydown)=\"onRangeButtonKeydown($event, rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"activeRange === rangeKey\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges ? 'w-100 flex-grow-1 border-l border-[#eee]' : ''\">\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\" role=\"grid\" [attr.aria-label]=\"getMonthName(month) + ' ' + year\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\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-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(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 [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"singleTimeModel\"\r\n (ngModelChange)=\"onSingleTimePickerChange($event); singleTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\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\" role=\"grid\" [attr.aria-label]=\"getMonthName(leftMonth) + ' ' + leftYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\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-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(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 [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"startTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, true); startTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\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\" role=\"grid\" [attr.aria-label]=\"getMonthName(rightMonth) + ' ' + rightYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\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-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(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 [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"endTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, false); endTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\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 && showCancelApply\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\" [disabled]=\"disabled || isDualRangeApplyBlocked\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n@if (hasError){\r\n<p class=\"calender-error\">{{errorMessage}}</p>\r\n}\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 | null) {\r\n if (time == null) return;\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 | null) {\r\n if (time == null) return;\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 | null) {\r\n if (time == null || !this.multipleDates[index]) return;\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 onMultipleDateEndTimeChange(index: number, time: string | null) {\r\n if (time == null || !this.multipleDates[index]) return;\r\n this.multipleDates[index].endTime = time;\r\n this.emitScheduled();\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 | null) {\r\n if (time == null) return;\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 | null) {\r\n if (time == null) return;\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 const y = date.getFullYear();\r\n const m = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const d = date.getDate().toString().padStart(2, '0');\r\n return `${y}-${m}-${d}`;\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 (change)=\"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 (change)=\"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 (change)=\"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 (change)=\"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 (change)=\"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 (change)=\"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 * 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 ],\r\n exports: [\r\n BkCustomCalendar,\r\n BkScheduledDatePicker,\r\n BkTimePicker,\r\n\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>\r\n <div\r\n class=\"relative flex items-center justify-center border-2 transition-all duration-200 ease-in-out rounded 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 } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-radio-button',\r\n standalone: true,\r\n imports: [CommonModule],\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 /**\r\n * The model value represented by this radio option.\r\n * Checked when the bound model `=== value`.\r\n */\r\n @Input() value: unknown;\r\n /**\r\n * Model value to write when de-selecting this radio (only when `allowDeselect` is true).\r\n */\r\n @Input() uncheckedValue: unknown = null;\r\n /**\r\n * If true, selecting an already-selected radio will clear the model to `uncheckedValue`.\r\n * Default false (standard radio behavior).\r\n */\r\n @Input() allowDeselect = false;\r\n @Input() disabled = false;\r\n @Input() variant: 'dot' | 'tick' = 'dot';\r\n\r\n @Output() change = new EventEmitter<unknown>();\r\n\r\n modelValue: unknown;\r\n\r\n onChange = (_: unknown) => {};\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 if (!this.allowDeselect) return;\r\n this.modelValue = this.uncheckedValue;\r\n this.onChange(this.uncheckedValue);\r\n this.onTouched();\r\n this.change.emit(this.uncheckedValue);\r\n return;\r\n }\r\n\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 get isChecked(): boolean {\r\n return this.modelValue === this.value;\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n this.modelValue = value;\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): 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 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 @Input() shadow: boolean = true;\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 [disabled]=\"disabled || loading\"\r\n (click)=\"onClick($event)\"\r\n class=\"{{buttonClasses}}\"\r\n [ngClass]=\"{ 'btn-shadow': shadow }\"\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 = 'xxxsm' | 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type IconButtonVariant = 'primary' | 'secondary' | 'none';\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 @Input() disabled: boolean = false;\r\n // Custom classes\r\n @Input() buttonClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<boolean>();\r\n @Output() hovered = 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 onMouseEnter() {\r\n if (!this.disabled) {\r\n this.hovered.emit(true);\r\n }\r\n }\r\n\r\n onMouseLeave() {\r\n if (!this.disabled) {\r\n this.hovered.emit(false);\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 (mouseenter)=\"onMouseEnter()\"\r\n (mouseleave)=\"onMouseLeave()\"\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 @if (label) {\r\n <label 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 [autocomplete]=\"autoComplete\"\r\n rows=\"{{ rows }}\"\r\n class=\"w-full px-3 py-2.5 text-sm border border-[#E3E3E7] outline-none transition-colors duration-200 bg-white resize-y placeholder:text-[#6B7080] rounded bk-textarea-shadow \"\r\n [ngClass]=\"{\r\n 'border-[#FA727A]': hasError && !disabled,\r\n 'focus:border-[#6B7080]': !hasError && !disabled,\r\n '!bg-[#F4F4F6] !text-[#A1A3AE] cursor-not-allowed !border-[#E3E3E7]': 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 <div class=\"flex-1\">\r\n @if (hasError) {\r\n <span class=\"font-medium text-xs leading-normal text-[#C10007] text-left\">\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 class=\"text-[#868997] tabular-nums flex-shrink-0\">\r\n {{ value.length }}/{{ maxlength }}\r\n </div>\r\n }\r\n </div>\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 @Input('bkTooltipScrollable') scrollable: boolean = false;\r\n @Input('bkTooltipMaxHeight') maxHeight: string = '300px';\r\n @Input('bkTooltipSize') tooltipSize: 'sm' | 'md' = 'md';\r\n @Input('bkTooltipAutoHeight') autoHeight: boolean = true; // Auto-adjust height based on available space\r\n\r\n private tooltipElement: HTMLElement | null = null;\r\n private contentWrapper: HTMLElement | null = null;\r\n private isHoveringTooltip: boolean = false;\r\n private hideTimeout: any = null;\r\n private tooltipListeners: (() => void)[] = [];\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 if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n this.cleanupTooltipListeners();\r\n this.removeTooltip();\r\n }\r\n\r\n\r\n updateTooltipContent() {\r\n // If content is now empty, destroy the tooltip so it no longer shows on hover\r\n if (this.isTooltipContentEmpty()) {\r\n this.removeTooltip();\r\n return;\r\n }\r\n\r\n // If tooltip doesn't exist yet and content is now available, create it\r\n if (!this.tooltipElement) {\r\n this.createTooltip();\r\n return;\r\n }\r\n\r\n // Update existing tooltip: remove old text nodes and re-append updated content\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 // Append to wrapper if scrollable, otherwise to tooltip directly\r\n const target = this.contentWrapper || this.tooltipElement;\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(target, div);\r\n });\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n // Clear any pending hide timeout\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n\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 // Don't hide immediately - wait a bit to see if mouse moves to tooltip\r\n // Only hide if not hovering over tooltip\r\n if (!this.isHoveringTooltip) {\r\n this.hideTimeout = setTimeout(() => {\r\n if (!this.isHoveringTooltip && this.tooltipElement) {\r\n this.hideTooltip();\r\n }\r\n }, 100); // Small delay to allow mouse to move to tooltip\r\n }\r\n }\r\n\r\n // private hideTooltip() {\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');\r\n // }\r\n // }\r\n\r\n // Hide tooltip on mousedown so it doesn't stick during CDK drag-drop\r\n // (CDK drag steals the element before mouseleave can fire)\r\n @HostListener('mousedown')\r\n @HostListener('touchstart')\r\n onInteract() {\r\n this.hideTooltip();\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\r\n private hideTooltip() {\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 this.isHoveringTooltip = false;\r\n }\r\n\r\n private setupTooltipHoverListeners() {\r\n if (!this.tooltipElement) return;\r\n\r\n // Clean up existing listeners\r\n this.cleanupTooltipListeners();\r\n\r\n // Add mouseenter listener to tooltip\r\n const mouseEnterListener = this.renderer.listen(this.tooltipElement, 'mouseenter', () => {\r\n this.isHoveringTooltip = true;\r\n // Clear any pending hide timeout\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n // Ensure tooltip is visible\r\n if (this.tooltipElement) {\r\n this.setStyle(this.tooltipElement, {\r\n visibility: 'visible',\r\n opacity: '1',\r\n });\r\n }\r\n });\r\n\r\n // Add mouseleave listener to tooltip\r\n const mouseLeaveListener = this.renderer.listen(this.tooltipElement, 'mouseleave', () => {\r\n this.isHoveringTooltip = false;\r\n // Hide tooltip after a short delay\r\n this.hideTimeout = setTimeout(() => {\r\n this.hideTooltip();\r\n }, 100);\r\n });\r\n\r\n // Store listeners for cleanup\r\n this.tooltipListeners = [mouseEnterListener, mouseLeaveListener];\r\n }\r\n\r\n private cleanupTooltipListeners() {\r\n this.tooltipListeners.forEach(cleanup => cleanup());\r\n this.tooltipListeners = [];\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 this.renderer.addClass(this.tooltipElement, `bk-tooltip-${this.tooltipSize}`);\r\n\r\n // Add scrollable class if needed\r\n if (this.scrollable) {\r\n this.renderer.addClass(this.tooltipElement, 'bk-tooltip-scrollable');\r\n }\r\n\r\n // Create wrapper for content if scrollable\r\n if (this.scrollable) {\r\n this.contentWrapper = this.renderer.createElement('div');\r\n this.renderer.addClass(this.contentWrapper, 'bk-tooltip-content-wrapper');\r\n this.renderer.setStyle(this.contentWrapper, 'max-height', this.maxHeight);\r\n this.renderer.appendChild(this.tooltipElement, this.contentWrapper);\r\n }\r\n\r\n // Add content\r\n const contentLines = Array.isArray(this.tooltipContent)\r\n ? this.tooltipContent\r\n : [this.tooltipContent];\r\n\r\n const target = this.contentWrapper || this.tooltipElement;\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(target, 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 maxWidth: '300px',\r\n wordBreak: 'normal', // ← only break at spaces\r\n overflowWrap: 'normal', // ← don't force break\r\n whiteSpace: 'pre-wrap', // ← ← ← KEY: respects spaces, wraps at word boundaries\r\n boxSizing: 'border-box',\r\n });\r\n\r\n this.renderer.appendChild(document.body, this.tooltipElement);\r\n\r\n // Setup hover listeners for the tooltip itself\r\n this.setupTooltipHoverListeners();\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 let tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n\r\n const triangle = this.tooltipElement.querySelector('.bk-tooltip-triangle') as HTMLElement;\r\n const padding = 10;\r\n const viewportHeight = window.innerHeight;\r\n const viewportWidth = window.innerWidth;\r\n\r\n // Get content wrapper reference\r\n const contentWrapper = this.tooltipElement.querySelector('.bk-tooltip-content-wrapper') as HTMLElement;\r\n\r\n // Get actual content height first (without max-height constraint)\r\n let contentHeight = 0;\r\n\r\n if (contentWrapper && this.scrollable) {\r\n // Temporarily remove max-height to get actual content height\r\n const originalMaxHeight = contentWrapper.style.maxHeight;\r\n this.renderer.setStyle(contentWrapper, 'max-height', 'none');\r\n // Force reflow to get accurate scrollHeight\r\n contentWrapper.offsetHeight;\r\n contentHeight = contentWrapper.scrollHeight;\r\n // Restore original styles\r\n this.renderer.setStyle(contentWrapper, 'max-height', originalMaxHeight);\r\n }\r\n\r\n // Calculate available space and adjust max-height if scrollable and auto-height is enabled\r\n if (this.scrollable && this.autoHeight && contentWrapper && contentHeight > 0) {\r\n const spaceInfo = this.calculateAvailableSpace(\r\n hostRect,\r\n this.tooltipPosition,\r\n viewportHeight,\r\n viewportWidth,\r\n padding,\r\n contentHeight\r\n );\r\n\r\n if (spaceInfo.available > 0) {\r\n // Set optimal height\r\n const heightToUse = spaceInfo.optimalHeight;\r\n this.renderer.setStyle(contentWrapper, 'max-height', `${heightToUse}px`);\r\n\r\n // Only enable scroll if content exceeds available space\r\n if (spaceInfo.needsScroll) {\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', 'auto');\r\n } else {\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', 'hidden');\r\n }\r\n\r\n // Force a reflow to get updated dimensions\r\n contentWrapper.offsetHeight;\r\n }\r\n }\r\n\r\n // Recalculate tooltip dimensions after max-height adjustment\r\n tooltipRect = this.tooltipElement.getBoundingClientRect();\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 + hostRect.height / 2;\r\n left =\r\n this.tooltipPosition === 'right'\r\n ? hostRect.right + padding\r\n : hostRect.left - tooltipRect.width - padding;\r\n\r\n // Auto flip if out of viewport\r\n if (this.tooltipPosition === 'right' && left + tooltipRect.width > viewportWidth) {\r\n left = hostRect.left - tooltipRect.width - padding;\r\n } else if (this.tooltipPosition === 'left' && left < 0) {\r\n left = hostRect.right + 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);\r\n break;\r\n\r\n case 'top':\r\n case 'bottom':\r\n left = hostRect.left + hostRect.width / 2 - tooltipRect.width / 2;\r\n top = this.tooltipPosition === 'top'\r\n ? hostRect.top - tooltipRect.height - padding\r\n : hostRect.bottom + padding;\r\n\r\n // Prevent overflow\r\n left = Math.max(10, Math.min(left, viewportWidth - tooltipRect.width - 10));\r\n\r\n // Adjust vertically if tooltip goes out of viewport\r\n if (this.tooltipPosition === 'bottom' && top + tooltipRect.height > viewportHeight) {\r\n // Try positioning above instead\r\n if (hostRect.top - tooltipRect.height - padding >= 0) {\r\n top = hostRect.top - tooltipRect.height - padding;\r\n // Recalculate available space for top position\r\n if (this.scrollable && this.autoHeight && contentWrapper && contentHeight > 0) {\r\n const spaceInfo = this.calculateAvailableSpace(\r\n hostRect,\r\n 'top',\r\n viewportHeight,\r\n viewportWidth,\r\n padding,\r\n contentHeight\r\n );\r\n if (spaceInfo.available > 0) {\r\n this.renderer.setStyle(contentWrapper, 'max-height', `${spaceInfo.optimalHeight}px`);\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', spaceInfo.needsScroll ? 'auto' : 'hidden');\r\n contentWrapper.offsetHeight;\r\n tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n }\r\n }\r\n this.setTriangleStyles(triangle, 'top');\r\n }\r\n } else if (this.tooltipPosition === 'top' && top < 0) {\r\n // Try positioning below instead\r\n if (hostRect.bottom + tooltipRect.height + padding <= viewportHeight) {\r\n top = hostRect.bottom + padding;\r\n // Recalculate available space for bottom position\r\n if (this.scrollable && this.autoHeight && contentWrapper && contentHeight > 0) {\r\n const spaceInfo = this.calculateAvailableSpace(\r\n hostRect,\r\n 'bottom',\r\n viewportHeight,\r\n viewportWidth,\r\n padding,\r\n contentHeight\r\n );\r\n if (spaceInfo.available > 0) {\r\n this.renderer.setStyle(contentWrapper, 'max-height', `${spaceInfo.optimalHeight}px`);\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', spaceInfo.needsScroll ? 'auto' : 'hidden');\r\n contentWrapper.offsetHeight;\r\n tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n }\r\n }\r\n this.setTriangleStyles(triangle, 'bottom');\r\n }\r\n } else {\r\n this.setTriangleStyles(triangle, this.tooltipPosition);\r\n }\r\n\r\n this.setStyle(this.tooltipElement, {\r\n transform: 'translateX(0)',\r\n });\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 /**\r\n * Calculates available space for tooltip based on position\r\n * Returns: { available: number, needsScroll: boolean, optimalHeight: number }\r\n */\r\n private calculateAvailableSpace(\r\n hostRect: DOMRect,\r\n tooltipPosition: 'left' | 'right' | 'top' | 'bottom',\r\n viewportHeight: number,\r\n viewportWidth: number,\r\n padding: number,\r\n contentHeight: number\r\n ): { available: number; needsScroll: boolean; optimalHeight: number } {\r\n if (!this.scrollable || !this.autoHeight) {\r\n return { available: 0, needsScroll: false, optimalHeight: 0 };\r\n }\r\n\r\n let availableSpace = 0;\r\n const minHeight = 100;\r\n const maxHeightLimit = parseInt(this.maxHeight) || 300;\r\n const buffer = 35; // Extra buffer to prevent cutting\r\n\r\n switch (tooltipPosition) {\r\n case 'bottom':\r\n const spaceBelow = viewportHeight - hostRect.bottom - padding - buffer;\r\n availableSpace = Math.max(minHeight, Math.min(spaceBelow, maxHeightLimit));\r\n break;\r\n\r\n case 'top':\r\n const spaceAbove = hostRect.top - padding - buffer;\r\n availableSpace = Math.max(minHeight, Math.min(spaceAbove, maxHeightLimit));\r\n break;\r\n\r\n case 'left':\r\n case 'right':\r\n const spaceBelowSide = viewportHeight - hostRect.bottom - padding - buffer;\r\n const spaceAboveSide = hostRect.top - padding - buffer;\r\n const maxVerticalSpace = Math.max(spaceBelowSide, spaceAboveSide);\r\n availableSpace = Math.max(minHeight, Math.min(maxVerticalSpace, maxHeightLimit));\r\n break;\r\n }\r\n\r\n // Check if content fits without scroll\r\n const needsScroll = contentHeight > availableSpace;\r\n // Optimal height: use content height if it fits, otherwise use available space\r\n const optimalHeight = needsScroll ? availableSpace : contentHeight;\r\n\r\n return { available: availableSpace, needsScroll, optimalHeight };\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 this.contentWrapper = 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\r\n","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { CdkDragDrop, moveItemInArray, CdkDragMove, CdkDragStart, CdkDrag, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { BKTooltipDirective } from '../../../tooltip/tooltip.directive';\r\nimport { BkBadge } from '../../../badge/badge';\r\nimport { TableAction, TableBadge, TableColumn, TableIcon } from '../../models/grid.model';\r\nimport { BkCheckbox } from '../../../checkbox/checkbox';\r\nexport type SortDirection = 'asc' | 'desc';\r\n@Component({\r\n selector: 'bk-grid',\r\n standalone: true,\r\n imports: [CommonModule,DragDropModule,ScrollingModule,BkBadge,BKTooltipDirective,BkCheckbox,FormsModule],\r\n templateUrl: './grid.html',\r\n styleUrl: './grid.css',\r\n})\r\nexport class BkGrid<T = any> {\r\n /* ================= Inputs ================= */\r\n\r\n @Input() draggable: boolean = false;\r\n @Input() columns: TableColumn<T>[] = [];\r\n @Input() result!: T[];\r\n @Input() actions: TableAction<T>[] | ((row: T) => TableAction<T>[]) = [];\r\n @Input() customClass: string = 'h-[calc(100vh-260px)]';\r\n @Input() actionIconClass: string = '';\r\n @Input() actionClass: string = '';\r\n @Input() showNoRecords: boolean = false;\r\n @Input() noRecordFoundHeight: string = '';\r\n\r\n @Output() change = new EventEmitter<{\r\n row: T;\r\n column: TableColumn<T>\r\n }>();\r\n /* ================= Outputs ================= */\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\r\n @Output() dragDropChange = new EventEmitter<T[]>();\r\n\r\n /* ================= Sorting ================= */\r\n\r\n sortColumn?: keyof T;\r\n sortDirection: SortDirection = 'asc';\r\n\r\n /* ================= ViewChild ================= */\r\n\r\n @ViewChild('tableScrollContainer', { static: false })\r\n tableScrollContainer!: ElementRef<HTMLDivElement>;\r\n\r\n /* ================= Helpers ================= */\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\r\n /* ================= Sorting ================= */\r\n\r\n sort(column: TableColumn<T>, index: number) {\r\n if (!column.sortable || !column.field) return;\r\n\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 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\r\n isColumnVisible(column: TableColumn<T>): boolean {\r\n return column.visible !== false;\r\n }\r\n\r\n /* ================= Cell Value ================= */\r\n\r\n getCellValue(row: T, column: TableColumn<T>): string {\r\n if (column.formatter) {\r\n return column.formatter(row);\r\n }\r\n\r\n if (column.field) {\r\n return String(row[column.field] ?? '');\r\n }\r\n\r\n return '';\r\n }\r\n\r\n /* ================= Checkbox ================= */\r\n\r\n getCheckboxValue(row: T, column: TableColumn<T>): boolean {\r\n if (!column.field) return false;\r\n return !!(row as any)[column.field];\r\n }\r\n\r\n setCheckboxValue(row: T, column: TableColumn<T>, value: boolean): void {\r\n if (column.field){\r\n (row as any)[column.field] = value;\r\n this.change.emit({row: row,column:column});\r\n }\r\n }\r\n\r\n /* ================= Badges ================= */\r\n\r\n getBadge(row: T, column: TableColumn<T>): TableBadge | undefined {\r\n if (!column.badges) return undefined;\r\n const list = typeof column.badges === 'function' ? column.badges(row) : column.badges;\r\n return list.find((b) => b.label === this.getCellValue(row, column));\r\n }\r\n\r\n /* ================= Icons ================= */\r\n\r\n getIcons(row: T, column: TableColumn<T>): TableIcon[] {\r\n if (!column.icons) return [];\r\n\r\n return typeof column.icons === 'function' ? column.icons(row) : column.icons;\r\n }\r\n\r\n /* ================= Tooltip ================= */\r\n\r\n getTooltipValue(row: T, column: TableColumn<T>): string {\r\n if (column.toolTipField) {\r\n return String(row[column.toolTipField] ?? '');\r\n }\r\n return '';\r\n }\r\n /* ================= Actions ================= */\r\n\r\n getRowActions(row: T, column?: TableColumn<T>): TableAction<T>[] {\r\n const source = column?.actions ?? this.actions;\r\n\r\n if (!source) return [];\r\n\r\n return typeof source === 'function' ? source(row) : source;\r\n }\r\n\r\n isActionVisible(action: TableAction<T>, row: T): boolean {\r\n if (!action.hasPermission) return false;\r\n\r\n if (typeof action.visible === 'function') {\r\n return action.visible(row);\r\n }\r\n\r\n if (typeof action.visible === 'boolean') {\r\n return action.visible;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n isActionDisabled(action: TableAction<T>, row: T): boolean {\r\n if (typeof action.disabled === 'function') {\r\n return action.disabled(row);\r\n }\r\n\r\n return !!action.disabled;\r\n }\r\n\r\n emitAction(action: TableAction<T>, row: T) {\r\n if (action.onClick) {\r\n action.onClick(row);\r\n }\r\n\r\n this.actionClick.emit({\r\n action: action.name,\r\n row,\r\n });\r\n }\r\n\r\n /* ================= Drag Drop ================= */\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 this.result.forEach((item: any, index) => {\r\n item.sortOrder = index + 1;\r\n });\r\n\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 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 #tableScrollContainer cdkScrollable class=\"overflow-y-auto\" [ngClass]=\"customClass\">\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\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-[-1px]\"\r\n [class.cursor-pointer]=\"col.sortable\"\r\n [class.cursor-default]=\"!col.sortable\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n class=\"{{ col.headerClass }} {{ col.cellClass }}\"\r\n (click)=\"sort(col, i)\"\r\n >\r\n <!-- [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\" -->\r\n <span\r\n class=\"flex items-center gap-1\"\r\n [ngClass]=\"\r\n sortColumn === col.field\r\n ? sortDirection === 'asc'\r\n ? 'grid-asc'\r\n : 'grid-desc'\r\n : ''\r\n \"\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 {{actionClass}}\">Action</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=\"\"\r\n [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\r\n cdkDragHandle\r\n class=\"mr-2 text-gray-400\"\r\n [ngClass]=\"{ 'cursor-move': draggable }\"\r\n >☰</span\r\n >\r\n }\r\n @if (col.checkbox) {\r\n <bk-checkbox\r\n checkboxClass=\"sm\"\r\n [ngModel]=\"getCheckboxValue(row, col)\"\r\n (ngModelChange)=\"setCheckboxValue(row, col, $event)\"\r\n [disabled]=\"typeof col.checkboxDisabled === 'function' ? col.checkboxDisabled(row) : col.checkboxDisabled || false\"\r\n [bkTooltip]=\"typeof col.checkboxTooltip === 'function' ? col.checkboxTooltip(row) : col.checkboxTooltip || ''\"\r\n [bkTooltipPosition]=\"col.checkboxTooltipPosition || 'top'\"\r\n ></bk-checkbox>\r\n } @else if (col.badges) {\r\n @let badge = getBadge(row, col);\r\n @if (badge) {\r\n <bk-badge\r\n [label]=\"badge.label\"\r\n [variant]=\"badge.variant\"\r\n [size]=\"badge.size\"\r\n [color]=\"badge.color\"\r\n [dot]=\"badge.dot\"\r\n [customClass]=\"badge.customClass\"\r\n [bkTooltip]=\"badge.toolTipLabel || ''\"\r\n [bkTooltipPosition]=\"badge.tooltipPosition || 'top'\"\r\n ></bk-badge>\r\n }\r\n } @else if (col.icons) {\r\n @let iconsList = getIcons(row, col);\r\n <div class=\"flex justify-center items-center gap-2\">\r\n @for (icon of iconsList; track $index) {\r\n @if(icon.url){\r\n <img\r\n [src]=\"icon.url\"\r\n class=\"size-4\"\r\n [ngClass]=\"{ 'cursor-pointer': icon.url }\"\r\n [bkTooltip]=\"icon.toolTipLabel || []\"\r\n [bkTooltipPosition]=\"icon.tooltipPosition || 'top'\"\r\n />\r\n }\r\n }\r\n </div>\r\n } @else if (col.toolTipField) {\r\n <span\r\n [bkTooltip]=\"getTooltipValue(row, col)\"\r\n [bkTooltipPosition]=\"col.toolTipPosition || 'top'\"\r\n >\r\n {{ getCellValue(row, col) }}\r\n </span>\r\n } @else {\r\n {{ getCellValue(row, col) }}\r\n }\r\n </td>\r\n }\r\n }\r\n\r\n @if (getRowActions(row).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 getRowActions(row); track action.name) {\r\n @if (isActionVisible(action, row)) {\r\n <button\r\n [bkTooltip]=\"action.tooltip\"\r\n [bkTooltipPosition]=\"action?.tooltipPosition || 'top'\"\r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA] {{actionIconClass}}\"\r\n (click)=\"emitAction(action, row)\"\r\n [disabled]=\"isActionDisabled(action, row)\"\r\n >\r\n <img [src]=\"action.icon\" width=\"14\" height=\"14\" alt=\"action-icon\" />\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n @if (showNoRecords) {\r\n <tr>\r\n <td\r\n [attr.colspan]=\"columns.length + (actions.length ? 1 : 0)\"\r\n class=\"text-center py-10 {{ noRecordFoundHeight }}\"\r\n >\r\n <div class=\"flex flex-col justify-center items-center w-full h-auto\">\r\n <img\r\n src=\"./assets/media/logos/no-data-found.jpg\"\r\n class=\"mb-3 w-96\"\r\n alt=\"No data found\"\r\n />\r\n\r\n <span class=\"block text-sm leading-3 text-center font-semibold text-[#60646C] mt-2\"\r\n >Data may be empty, or try adjusting your filter.</span\r\n >\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, forwardRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\n\r\n\r\n/** `xxsm` (16px) fits inside an 18px text line box and inside a bordered chip —\r\n * use it inline in form controls so adding an avatar can't change the height. */\r\nexport type AvatarSize = 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type AvatarVariant = 'gray' | 'colored';\r\nexport type DotStatus = 'active' | 'inactive' | 'notification' | 'none';\r\nexport type DotPosition = 'bottom-right' | 'top-left';\r\nexport type AvatarFallback = 'auto' | 'initials' | 'icon';\r\n\r\n@Component({\r\n selector: 'bk-avatar',\r\n standalone: true,\r\n imports: [CommonModule, BKTooltipDirective],\r\n templateUrl: './ui-avatar.html',\r\n styleUrls: ['./ui-avatar.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkAvatar),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkAvatar implements OnChanges, ControlValueAccessor {\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n // ---------- Display Inputs ----------\r\n @Input() src: string | null = null;\r\n @Input() alt = 'Avatar';\r\n @Input() name = '';\r\n @Input() initialsOverride = '';\r\n @Input() tooltipContent: string | string[] | null = null;\r\n @Input() bgColor: string | null = null;\r\n @Input() textColor: string | null = null;\r\n\r\n @Input() size: AvatarSize = 'md';\r\n @Input() variant: AvatarVariant = 'gray';\r\n @Input() fallback: AvatarFallback = 'auto';\r\n\r\n @Input() dot: DotStatus = 'none';\r\n @Input() dotPosition: DotPosition = 'bottom-right';\r\n\r\n // ---------- Outputs ----------\r\n /** Emits when the provided image URL fails to load */\r\n @Output() imageLoadError = new EventEmitter<void>();\r\n\r\n // ---------- Internal State ----------\r\n initials = '';\r\n imageLoadFailed = false;\r\n\r\n // ---------- CVA Callbacks ----------\r\n private onChange = (_value: string | null) => {};\r\n private onTouched = () => {};\r\n\r\n /**\r\n * Called by the forms system when the model value changes (ngModel / formControl).\r\n * Sets the src directly and tells OnPush to re-check the template.\r\n */\r\n writeValue(value: string | null): void {\r\n this.src = value || null;\r\n this.imageLoadFailed = false;\r\n // OnPush won't detect this change on its own because writeValue\r\n // is called programmatically by the forms system — not through an\r\n // @Input binding. markForCheck tells Angular: \"this component's\r\n // template might have changed, check it on the next CD cycle.\"\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(_isDisabled: boolean): void {\r\n // Display-only component — disabled doesn't change visual behaviour,\r\n // but we still honour the CVA contract.\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ---------- Lifecycle ----------\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['name'] || changes['initialsOverride']) {\r\n this.initials = this.initialsOverride || this.getInitials(this.name);\r\n }\r\n // Reset error state whenever a new src arrives via @Input\r\n if (changes['src']) {\r\n this.imageLoadFailed = false;\r\n }\r\n }\r\n\r\n onImageError(): void {\r\n this.imageLoadFailed = true;\r\n this.imageLoadError.emit();\r\n }\r\n\r\n // ---------- Derived UI ----------\r\n get showImage(): boolean {\r\n return !!(this.src) && !this.imageLoadFailed;\r\n }\r\n\r\n get showInitials(): boolean {\r\n if (this.showImage) return false;\r\n if (!this.name) return false;\r\n if (this.fallback === 'icon') return false;\r\n return true; // 'auto' and 'initials' both show initials when name is present\r\n }\r\n\r\n get showIcon(): boolean {\r\n return !this.showImage && !this.showInitials;\r\n }\r\n\r\n get containerClasses(): string {\r\n return [\r\n 'avatar',\r\n this.size,\r\n VARIANT_MAP[this.variant]\r\n ].join(' ');\r\n }\r\n\r\n get containerStyles(): Record<string, string> | null {\r\n const styles: Record<string, string> = {};\r\n if (this.bgColor) {\r\n styles['background'] = this.bgColor;\r\n }\r\n if (this.textColor) {\r\n styles['color'] = this.textColor;\r\n }\r\n return Object.keys(styles).length ? styles : null;\r\n }\r\n\r\n get resolvedTooltip(): string | string[] {\r\n return this.tooltipContent ?? this.name;\r\n }\r\n\r\n get dotClasses(): string {\r\n return [\r\n 'avatar-dot',\r\n this.size,\r\n DOT_COLOR_MAP[this.dot],\r\n DOT_POSITION_MAP[this.dotPosition]\r\n ].join(' ');\r\n }\r\n\r\n // ---------- Utils ----------\r\n private getInitials(name: string): string {\r\n if (!name?.trim()) return '';\r\n const normalized = name.includes(',')\r\n ? name.split(',').map(part => part.trim()).filter(Boolean).reverse().join(' ')\r\n : name.trim();\r\n const parts = normalized.split(/\\s+/);\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts.at(-1)![0]).toUpperCase();\r\n }\r\n}\r\n\r\n// ---------- Constants ----------\r\nconst VARIANT_MAP: Record<AvatarVariant, string> = {\r\n gray: 'bg-white border border-[#EFEFF1] text-[#363C51]',\r\n colored: 'bg-[#F63D68] border border-white text-white'\r\n};\r\n\r\nconst DOT_COLOR_MAP: Record<DotStatus, string> = {\r\n active: 'active',\r\n inactive: 'inactive',\r\n notification: 'notification',\r\n none: 'hidden'\r\n};\r\n\r\nconst DOT_POSITION_MAP: Record<DotPosition, string> = {\r\n 'bottom-right': 'bottom-0 right-0',\r\n 'top-left': 'top-0.5 -left-0.5'\r\n};\r\n","<div\r\n [ngClass]=\"containerClasses\"\r\n [ngStyle]=\"containerStyles\"\r\n [bkTooltip]=\"resolvedTooltip\"\r\n [bkTooltipPosition]=\"'top'\"\r\n>\r\n\r\n @if (showImage) {\r\n <img\r\n [src]=\"src\"\r\n [alt]=\"alt\"\r\n class=\"avatar-img\"\r\n (error)=\"onImageError()\"\r\n />\r\n }\r\n\r\n @else if (showInitials) {\r\n <span class=\"avatar-text\">\r\n {{ initials }}\r\n </span>\r\n }\r\n\r\n @else {\r\n <svg\r\n class=\"placeholder-icon\"\r\n viewBox=\"0 0 32 32\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M16 16c3.682 0 6.667-2.985 6.667-6.667S19.682 2.667 16 2.667 9.333 5.651 9.333 9.333 12.318 16 16 16Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M27.453 29.333C27.453 24.173 22.32 20 16 20S4.547 24.173 4.547 29.333\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n }\r\n\r\n @if (dot !== 'none') {\r\n <span [ngClass]=\"dotClasses\"></span>\r\n }\r\n\r\n</div>\r\n","/* =========================================================================\r\n Derives a full UI appearance (background / text / border / dot) from a\r\n single accent colour. Shared by bk-status-select, bk-select and\r\n bk-hierarchical-select so colour handling stays identical across all three.\r\n ========================================================================= */\r\n\r\n/** How an accent colour is applied to a control. */\r\nexport type ColorFill = 'subtle' | 'solid' | 'none';\r\n\r\n/** Resolved colours for one accent. */\r\nexport interface ColorAppearance {\r\n backgroundColor: string | null;\r\n color: string | null;\r\n borderColor: string | null;\r\n dotColor: string | null;\r\n}\r\n\r\ninterface Rgb { r: number; g: number; b: number; }\r\n\r\nconst BLACK: Rgb = { r: 0, g: 0, b: 0 };\r\nconst WHITE: Rgb = { r: 255, g: 255, b: 255 };\r\n\r\nconst HEX3 = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i;\r\nconst HEX6 = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\r\nconst RGB_FN = /^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i;\r\n\r\n/** The neutral look used when there is no colour (or an unparseable one). */\r\nexport const NEUTRAL_APPEARANCE: ColorAppearance = {\r\n backgroundColor: null,\r\n color: null,\r\n borderColor: null,\r\n dotColor: null\r\n};\r\n\r\n/**\r\n * Parses hex and rgb()/rgba() colours. Named CSS colours (\"red\") are not\r\n * supported — they'd need a live DOM to resolve — and return null, which makes\r\n * the caller fall back to the neutral (uncoloured) appearance.\r\n */\r\nexport function parseColor(input: string | null | undefined): Rgb | null {\r\n if (!input) return null;\r\n const s = String(input).trim();\r\n\r\n let m = HEX3.exec(s);\r\n if (m) {\r\n return {\r\n r: parseInt(m[1] + m[1], 16),\r\n g: parseInt(m[2] + m[2], 16),\r\n b: parseInt(m[3] + m[3], 16)\r\n };\r\n }\r\n\r\n m = HEX6.exec(s);\r\n if (m) {\r\n return { r: parseInt(m[1], 16), g: parseInt(m[2], 16), b: parseInt(m[3], 16) };\r\n }\r\n\r\n m = RGB_FN.exec(s);\r\n if (m) {\r\n return { r: clampChannel(+m[1]), g: clampChannel(+m[2]), b: clampChannel(+m[3]) };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction clampChannel(v: number): number {\r\n return Math.max(0, Math.min(255, Math.round(v)));\r\n}\r\n\r\n/** WCAG relative luminance — used to decide whether text needs to be light or dark. */\r\nfunction luminance({ r, g, b }: Rgb): number {\r\n const [lr, lg, lb] = [r, g, b].map(v => {\r\n const c = v / 255;\r\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\r\n });\r\n return 0.2126 * lr + 0.7152 * lg + 0.0722 * lb;\r\n}\r\n\r\n/** Linear blend of `c` toward `target`. amount 0 = c, 1 = target. */\r\nfunction mix(c: Rgb, target: Rgb, amount: number): Rgb {\r\n return {\r\n r: Math.round(c.r + (target.r - c.r) * amount),\r\n g: Math.round(c.g + (target.g - c.g) * amount),\r\n b: Math.round(c.b + (target.b - c.b) * amount)\r\n };\r\n}\r\n\r\n/**\r\n * Darkens a colour until it reads acceptably as text on a light tint. Pastel\r\n * accents (light yellows, mints) are unreadable at full strength, so they get\r\n * stepped toward black; already-dark accents pass through untouched.\r\n */\r\nfunction readableOnLight(c: Rgb): Rgb {\r\n let out = c;\r\n let guard = 0;\r\n while (luminance(out) > 0.4 && guard < 12) {\r\n out = mix(out, BLACK, 0.2);\r\n guard++;\r\n }\r\n return out;\r\n}\r\n\r\nfunction rgbString({ r, g, b }: Rgb): string {\r\n return `rgb(${r}, ${g}, ${b})`;\r\n}\r\n\r\nfunction rgbaString({ r, g, b }: Rgb, alpha: number): string {\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n}\r\n\r\n/**\r\n * Derives every colour the UI needs from a single accent colour.\r\n *\r\n * subtle → soft tint of the accent, accent-coloured (darkened if needed) text.\r\n * solid → accent as the background, white or near-black text by contrast.\r\n * none → no background; only the dot and text carry the accent.\r\n */\r\nexport function deriveAppearance(\r\n color: string | null | undefined,\r\n fill: ColorFill = 'subtle'\r\n): ColorAppearance {\r\n const rgb = parseColor(color);\r\n if (!rgb) return NEUTRAL_APPEARANCE;\r\n\r\n const dotColor = rgbString(rgb);\r\n\r\n if (fill === 'solid') {\r\n return {\r\n backgroundColor: dotColor,\r\n color: luminance(rgb) > 0.5 ? '#141414' : '#FFFFFF',\r\n borderColor: rgbString(mix(rgb, BLACK, 0.08)),\r\n // On a solid accent background the dot must contrast with the accent itself.\r\n dotColor: luminance(rgb) > 0.5 ? rgbaString(BLACK, 0.55) : rgbaString(WHITE, 0.85)\r\n };\r\n }\r\n\r\n const text = rgbString(readableOnLight(rgb));\r\n\r\n if (fill === 'none') {\r\n return { backgroundColor: null, color: text, borderColor: null, dotColor };\r\n }\r\n\r\n return {\r\n backgroundColor: rgbaString(rgb, 0.12),\r\n color: text,\r\n borderColor: rgbaString(rgb, 0.28),\r\n dotColor\r\n };\r\n}\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 AfterViewInit,\r\n OnDestroy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nimport { BkCheckbox } from '../checkbox/checkbox';\r\nimport { BkAvatar } from '../ui-avatar/ui-avatar';\r\nimport {\r\n ColorAppearance,\r\n deriveAppearance,\r\n NEUTRAL_APPEARANCE\r\n} from '../shared/utilities/color-appearance';\r\n\r\n@Component({\r\n selector: 'bk-select',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BKTooltipDirective,BkCheckbox,BkAvatar],\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, AfterViewInit, OnDestroy {\r\n // --- Inputs ---\r\n items = input<any[]>([]);\r\n bindLabel = input<string>('label');\r\n bindValue = input<string>('');\r\n bindIcon = input<string>(''); // key in item for icon URL\r\n isResponsive = input<boolean>(true)\r\n placeholder = input<string>('');\r\n notFoundText = input<string>('No records 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 /**\r\n * Show an accent dot beside each option, driven by `colorKey`.\r\n *\r\n * In single-select mode the control is also tinted with the selected option's\r\n * colour (same treatment as bk-status-select), unless `hasError` is set — an\r\n * errored control drops the accent for a soft red tint instead. Multi-select\r\n * never tints the control: one background can't represent several colours, so\r\n * the accents are carried on the chips instead.\r\n *\r\n * Only one leading visual renders per row — precedence is avatar > icon > dot\r\n * — so the dot appears only when `showAvatar` is off and the item has no icon.\r\n */\r\n showDots = input<boolean>(false);\r\n\r\n /**\r\n * Render an avatar before each option label: the `avatarKey` image when the\r\n * item has one, otherwise initials derived from the label (\"mtayyab\" → \"MT\").\r\n * Replaces the plain icon <img> in options and the single-select value.\r\n */\r\n showAvatar = input<boolean>(false);\r\n\r\n /**\r\n * Key holding the avatar image URL, used only when `showAvatar` is on.\r\n * Falls back to `bindIcon` when unset. Kept separate from `bindIcon` so the\r\n * plain icon feature stays independent — an item's icon should not appear\r\n * as a bare <img> just because it also has an avatar.\r\n */\r\n avatarKey = input<string>('');\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 @Input() variation: 'default' | 'sm' = 'default';\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 @ViewChild('dropdownPanel') dropdownPanel?: ElementRef<HTMLDivElement>;\r\n @ViewChild('chipsViewport') chipsViewport?: ElementRef<HTMLDivElement>;\r\n @ViewChildren('measureChip') measureChips?: QueryList<ElementRef<HTMLElement>>;\r\n @ViewChild('measurePlus') measurePlus?: ElementRef<HTMLElement>;\r\n\r\n // --- State ---\r\n private _value: any = null;\r\n private static activeInstance: BkSelect | null = null;\r\n isOpen = signal(false);\r\n selectedOptions = signal<any[]>([]);\r\n searchTerm = signal<string>('');\r\n markedIndex = signal(-1);\r\n\r\n // Side the panel is actually rendered on. Starts from the requested\r\n // `dropdownPosition` but is auto-flipped based on available viewport space\r\n // (see applyPlacement). Used by both append-to-body and inline modes.\r\n placement = signal<'bottom' | 'top'>('bottom');\r\n\r\n // When appendToBody is on we physically relocate the panel to <body> so it\r\n // escapes any transformed/overflow ancestor (e.g. an animated dialog, whose\r\n // residual transform would otherwise make position:fixed resolve against the\r\n // dialog and get clipped). These track the panel's home so we can put it back\r\n // before Angular removes it on close.\r\n private originalPanelParent: Node | null = null;\r\n private originalPanelAnchor: Node | null = null;\r\n private panelInBody = false;\r\n\r\n // Number of multi-select chips currently rendered before collapsing into \"+N\".\r\n // Computed dynamically from the available width (see recomputeVisibleChips()).\r\n visibleCount = signal<number>(0);\r\n private resizeObserver?: ResizeObserver;\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 /**\r\n * True when the user is allowed to change the selection. Both disabled and\r\n * readonly lock the control, so neither may offer a remove/clear affordance.\r\n */\r\n isEditable = computed(() => !this.disabled() && !this.readonly());\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 // Re-measure the chips whenever the selection (or mode) changes so the\r\n // number of visible chips always reflects the available space.\r\n effect(() => {\r\n this.selectedOptions();\r\n this.multiple();\r\n this.scheduleRecompute();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Recompute visible chips whenever the control is resized (responsive\r\n // layouts, manual width changes, container resizes, etc.).\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(() => this.scheduleRecompute());\r\n if (this.controlWrapper?.nativeElement) {\r\n this.resizeObserver.observe(this.controlWrapper.nativeElement);\r\n }\r\n }\r\n this.scheduleRecompute();\r\n\r\n // Keep the append-to-body (fixed) panel glued to the control while any\r\n // ancestor scrolls or the window resizes. Capture phase (`true`) is what\r\n // lets us catch scrolling inside nested overflow containers, not just the\r\n // window — @HostListener('window:scroll') would miss those.\r\n window.addEventListener('scroll', this.reposition, true);\r\n window.addEventListener('resize', this.reposition);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.resizeObserver?.disconnect();\r\n window.removeEventListener('scroll', this.reposition, true);\r\n window.removeEventListener('resize', this.reposition);\r\n // If we're torn down while open, don't leave the relocated panel orphaned in <body>.\r\n if (this.panelInBody) {\r\n this.dropdownPanel?.nativeElement.remove();\r\n this.panelInBody = false;\r\n }\r\n }\r\n\r\n // Re-evaluate placement as the page scrolls/resizes. For append-to-body this\r\n // recomputes the fixed coordinates so the panel follows the control while it's\r\n // visible, and closes once the control is fully scrolled out of view (by the\r\n // viewport OR any scroll container such as a modal body). Inline just re-flips.\r\n // Bound as an arrow fn so it can be add/removeEventListener'd.\r\n private reposition = () => {\r\n if (!this.isOpen()) return;\r\n\r\n if (this.appendToBody()) {\r\n const rect = this.controlWrapper?.nativeElement.getBoundingClientRect();\r\n if (rect && this.isControlClipped(rect)) {\r\n this.closeDropdown();\r\n return;\r\n }\r\n }\r\n this.applyPlacement();\r\n };\r\n\r\n /**\r\n * True when the control is fully outside the visible area — either the\r\n * viewport or a scrollable/clipping ancestor (e.g. a dialog's scroll body).\r\n * Used to close the floating (append-to-body) panel once its anchor is no\r\n * longer on screen, instead of leaving it hanging.\r\n */\r\n private isControlClipped(rect: DOMRect): boolean {\r\n // Outside the viewport.\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight ||\r\n rect.right <= 0 || rect.left >= window.innerWidth) {\r\n return true;\r\n }\r\n // Outside any clipping ancestor.\r\n let el = this.controlWrapper?.nativeElement.parentElement;\r\n while (el && el !== document.body) {\r\n const style = getComputedStyle(el);\r\n const clips = /(auto|scroll|hidden|clip|overlay)/;\r\n if (clips.test(style.overflowY) || clips.test(style.overflowX)) {\r\n const r = el.getBoundingClientRect();\r\n if (rect.bottom <= r.top || rect.top >= r.bottom ||\r\n rect.right <= r.left || rect.left >= r.right) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Relocate the panel node to <body> so it truly escapes any transformed or\r\n * overflow-clipped ancestor (dialogs, drawers, cards with overflow, etc.).\r\n * Setting position:fixed alone is not enough when an ancestor has a transform.\r\n */\r\n private movePanelToBody() {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || this.panelInBody) return;\r\n this.originalPanelParent = panel.parentNode;\r\n this.originalPanelAnchor = panel.nextSibling;\r\n document.body.appendChild(panel);\r\n this.panelInBody = true;\r\n }\r\n\r\n /**\r\n * Return the panel to its original DOM position so Angular's @if can remove\r\n * it cleanly on close. Must run before isOpen is set to false.\r\n */\r\n private restorePanel() {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || !this.panelInBody) return;\r\n if (this.originalPanelParent) {\r\n this.originalPanelParent.insertBefore(panel, this.originalPanelAnchor);\r\n }\r\n this.panelInBody = false;\r\n this.originalPanelParent = null;\r\n this.originalPanelAnchor = null;\r\n }\r\n\r\n private scheduleRecompute() {\r\n // Defer to the next frame so the hidden measurement row has been laid out.\r\n if (typeof requestAnimationFrame !== 'undefined') {\r\n requestAnimationFrame(() => this.recomputeVisibleChips());\r\n } else {\r\n setTimeout(() => this.recomputeVisibleChips());\r\n }\r\n }\r\n\r\n /**\r\n * Measures the off-screen chip row and works out how many chips fit on a\r\n * single line. If every chip fits, all of them are shown and no \"+N\" badge\r\n * is rendered. Otherwise it keeps as many chips as fit while reserving space\r\n * for the \"+N\" overflow badge.\r\n */\r\n private recomputeVisibleChips() {\r\n if (!this.multiple()) return;\r\n\r\n const total = this.selectedOptions().length;\r\n const viewport = this.chipsViewport?.nativeElement;\r\n const chips = this.measureChips?.toArray() ?? [];\r\n\r\n if (!viewport || total === 0 || chips.length === 0) {\r\n this.visibleCount.set(total);\r\n return;\r\n }\r\n\r\n const available = viewport.clientWidth;\r\n if (available <= 0) {\r\n // Not laid out yet — retry on the next frame.\r\n this.scheduleRecompute();\r\n return;\r\n }\r\n\r\n // Per-chip horizontal spacing: gap-0.5 (2px) + me-0.5 margin (2px).\r\n const spacing = 4;\r\n const steps = chips.map(c => c.nativeElement.offsetWidth + spacing);\r\n\r\n // How many chips fit when no overflow badge is needed.\r\n let used = 0;\r\n let count = 0;\r\n for (const step of steps) {\r\n if (used + step <= available) {\r\n used += step;\r\n count++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (count >= total) {\r\n // Everything fits — show all chips, no \"+N\".\r\n this.visibleCount.set(total);\r\n return;\r\n }\r\n\r\n // Overflow: reserve room for the \"+N\" badge and shrink until it fits.\r\n const plusWidth = (this.measurePlus?.nativeElement.offsetWidth ?? 24) + spacing;\r\n let prefix = steps.slice(0, count).reduce((a, b) => a + b, 0);\r\n while (count > 1 && prefix + plusWidth > available) {\r\n count--;\r\n prefix -= steps[count];\r\n }\r\n\r\n // Always keep at least one chip visible, even if the control is too narrow\r\n // to fit a full chip — it will simply truncate with an ellipsis.\r\n this.visibleCount.set(Math.max(count, 1));\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 isItemDisabled(item: any): boolean {\r\n return !!item?.disabled;\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 // Close previously opened dropdown\r\n if (BkSelect.activeInstance && BkSelect.activeInstance !== this) {\r\n BkSelect.activeInstance.closeDropdown();\r\n }\r\n\r\n BkSelect.activeInstance = this;\r\n\r\n // Decide the initial side before the panel paints (uses an estimated\r\n // height; corrected after render in the setTimeout below).\r\n this.applyPlacement();\r\n\r\n this.isOpen.set(true);\r\n this.open.emit();\r\n this.focus.emit();\r\n\r\n setTimeout(() => {\r\n // Panel is in the DOM now. In appendToBody mode, relocate it to <body>\r\n // so it escapes any transformed/overflow ancestor, then position it.\r\n if (this.appendToBody()) this.movePanelToBody();\r\n\r\n // Recompute with the panel's real height so the initial up/down flip is\r\n // accurate (openDropdown ran applyPlacement() before the panel existed,\r\n // using an estimated height).\r\n this.applyPlacement();\r\n\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\r\n // Put the panel back where Angular expects it before the @if removes it.\r\n this.restorePanel();\r\n\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 if (BkSelect.activeInstance === this) {\r\n BkSelect.activeInstance = null;\r\n }\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 — use the auto-flipped placement, not the raw input.\r\n return this.placement() === '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 — use the auto-flipped placement, not the raw input.\r\n return this.placement() === 'top' ? 'calc(100% + 4px)' : null;\r\n }\r\n\r\n\r\n /**\r\n * Decides which side the panel should open on (auto-flip) and, for\r\n * append-to-body mode, computes the fixed coordinates. Shared by both modes\r\n * and re-run on open and on every scroll/resize so the panel snaps to\r\n * whichever side has room — honouring `dropdownPosition` when it fits.\r\n */\r\n applyPlacement() {\r\n const control = this.controlWrapper?.nativeElement;\r\n if (!control) return;\r\n\r\n const rect = control.getBoundingClientRect();\r\n const gap = 4;\r\n\r\n // Actual panel height once it's rendered; fall back to a sensible estimate\r\n // on the very first open (panel isn't in the DOM yet at that point — a\r\n // follow-up call after render corrects it with the real height).\r\n const panelHeight = this.dropdownPanel?.nativeElement.offsetHeight || 300;\r\n\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const spaceAbove = rect.top - gap;\r\n\r\n // Honour the requested position when it fits; otherwise flip to wherever\r\n // there's more room.\r\n const preferred = this.dropdownPosition();\r\n let placeTop: boolean;\r\n if (preferred === 'top') {\r\n placeTop = spaceAbove >= panelHeight || spaceAbove > spaceBelow;\r\n } else {\r\n placeTop = spaceBelow < panelHeight && spaceAbove > spaceBelow;\r\n }\r\n this.placement.set(placeTop ? 'top' : 'bottom');\r\n\r\n // Inline (absolute) mode is positioned by CSS relative to the control, so\r\n // the placement signal above is all it needs. Only append-to-body needs\r\n // explicit fixed coordinates.\r\n if (!this.appendToBody()) return;\r\n\r\n if (placeTop) {\r\n this.dropdownStyle.set({\r\n top: undefined,\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\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: `${rect.bottom + gap}px`,\r\n bottom: undefined,\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 // Scroll/resize are handled by the capture-phase listeners wired up in\r\n // ngAfterViewInit (see `reposition`), which keep the panel attached to the\r\n // control and re-flip it up/down as space allows, instead of closing it.\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) && !this.isItemDisabled(fItem));\r\n });\r\n } else {\r\n filtered.forEach(item => {\r\n if (!this.isItemSelected(item) && !this.isItemDisabled(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.isItemDisabled(item)) return;\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 if (!this.isEditable()) return;\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 if (!this.isEditable()) return;\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()) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.openDropdown();\r\n }\r\n return;\r\n }\r\n const list = this.filteredItems();\r\n const current = this.markedIndex();\r\n switch (event.key) {\r\n case 'Tab':\r\n this.closeDropdown();\r\n break;\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 onTabPress(event: KeyboardEvent){\r\n if(event.key === 'Tab') {\r\n this.closeDropdown();\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 if (val === null || val === undefined) {\r\n this.selectedOptions.set([]);\r\n return;\r\n }\r\n const list = this.items();\r\n if (!list.length) return;\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 const target = e.target as Node;\r\n // When appendToBody relocates the panel to <body>, it's no longer inside\r\n // the host element — treat clicks within the panel as \"inside\" too so\r\n // interacting with the search box / scrollbar doesn't close it.\r\n if (this.el.nativeElement.contains(target)) return;\r\n if (this.dropdownPanel?.nativeElement.contains(target)) return;\r\n 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 * Colours for the control itself. Single-select only: with several chips\r\n * selected there is no single accent that could represent them, so multi\r\n * mode stays neutral and relies on per-chip dots.\r\n */\r\n controlAppearance = computed<ColorAppearance>(() => {\r\n if (!this.showDots() || this.multiple()) return NEUTRAL_APPEARANCE;\r\n const selected = this.selectedOptions()[0];\r\n if (!selected) return NEUTRAL_APPEARANCE;\r\n return deriveAppearance(this.resolveColor(selected), 'subtle');\r\n });\r\n\r\n /**\r\n * Tint for an errored control, derived from the same red as the error border\r\n * so the control reads as one state rather than a red outline over a colour.\r\n */\r\n private static readonly ERROR_APPEARANCE = deriveAppearance('#D11E14', 'subtle');\r\n\r\n /**\r\n * Colours actually applied to the control. An option's accent never survives\r\n * an error: the tint is swapped for a soft red one so the error can't be\r\n * mistaken for a status colour. Only tintable controls have anything to swap\r\n * — a multi-select is neutral either way, since one background can't stand in\r\n * for several chips.\r\n */\r\n controlStyle(): ColorAppearance {\r\n if (!this.hasError) return this.controlAppearance();\r\n return this.showDots() && !this.multiple()\r\n ? BkSelect.ERROR_APPEARANCE\r\n : NEUTRAL_APPEARANCE;\r\n }\r\n\r\n /** Raw accent for an option's dot. Null when the item has no usable colour. */\r\n accentFor(item: any): string | null {\r\n return deriveAppearance(this.resolveColor(item), 'subtle').dotColor;\r\n }\r\n\r\n /**\r\n * Label colour for an option/chip. With showDots on, the accent is darkened\r\n * until it stays legible (a pale accent as raw text is unreadable); otherwise\r\n * the raw colorKey value is used, preserving the previous behaviour.\r\n */\r\n optionTextColor(item: any): string | null {\r\n if (!this.showDots()) return this.resolveColor(item);\r\n return deriveAppearance(this.resolveColor(item), 'none').color;\r\n }\r\n\r\n /** Soft tint for an option's avatar, so it matches the option's accent. */\r\n avatarBgFor(item: any): string | null {\r\n return deriveAppearance(this.resolveColor(item), 'subtle').backgroundColor;\r\n }\r\n\r\n /** Readable text colour paired with avatarBgFor. */\r\n avatarTextFor(item: any): string | null {\r\n return deriveAppearance(this.resolveColor(item), 'subtle').color;\r\n }\r\n\r\n resolveIcon(item: any): string | null {\r\n if (!item) return null;\r\n const key = this.bindIcon();\r\n return key && typeof item === 'object' ? item[key] ?? null : null;\r\n }\r\n\r\n /** Image for the avatar. Prefers `avatarKey`, falling back to `bindIcon`. */\r\n resolveAvatarSrc(item: any): string | null {\r\n if (!item || typeof item !== 'object') return null;\r\n const key = this.avatarKey() || this.bindIcon();\r\n return key ? item[key] ?? null : null;\r\n }\r\n\r\n getRemainingItems(): string[] {\r\n return this.selectedOptions()\r\n .slice(this.visibleCount())\r\n .map((x) => this.resolveLabel(x));\r\n }\r\n\r\n getTooltipIfEllipsed(el: HTMLElement, text: string): string {\r\n if (!el) return '';\r\n return el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight ? text : '';\r\n }\r\n\r\n onOptionHover(index: number) {\r\n this.markedIndex.set(index);\r\n }\r\n}\r\n\r\n","<div class=\"bk-select-container\" [ngClass]=\"variation\">\r\n @if (label) {\r\n <label class=\"bk-select-label\" (click)=\"openFromLabel($event)\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"bk-select-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative\">\r\n <!-- controlStyle() resolves the tint: the selected option's accent normally,\r\n a soft red one while hasError. It's a method rather than a computed\r\n because hasError is a plain @Input, not a signal. -->\r\n <div\r\n #controlWrapper\r\n class=\"bk-select-control\"\r\n [ngClass]=\"{ 'bk-has-error': hasError }\"\r\n tabindex=\"0\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [class.bk-focused]=\"isOpen()\"\r\n [class.bk-disabled]=\"disabled()\"\r\n [class.bk-filled]=\"!!controlStyle().backgroundColor\"\r\n [style.backgroundColor]=\"controlStyle().backgroundColor\"\r\n [style.color]=\"controlStyle().color\"\r\n [style.borderColor]=\"controlStyle().borderColor\"\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=\"bk-value-container\">\r\n @if (selectedOptions().length === 0) {\r\n <div class=\"bk-placeholder\">{{ placeholder() }}</div>\r\n }\r\n @if (multiple() && selectedOptions().length > 0) {\r\n <div\r\n #chipsViewport\r\n class=\"bk-value-chips bk-chips-viewport flex gap-0.5 flex-nowrap overflow-hidden h-[18px]\"\r\n >\r\n @for (opt of selectedOptions().slice(0, visibleCount()); track $index) {\r\n <div class=\"bk-multi-badge-item me-0.5\" [class.bk-chip-has-avatar]=\"showAvatar()\">\r\n <!-- One leading visual only: avatar > icon > dot. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(opt)\"\r\n [name]=\"resolveLabel(opt)\"\r\n [alt]=\"iconAlt\"\r\n [bgColor]=\"avatarBgFor(opt)\"\r\n [textColor]=\"avatarTextFor(opt)\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(opt)) {\r\n <img [src]=\"resolveIcon(opt)!\" alt=\"icon\" class=\"bk-chip-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(opt)) {\r\n <span class=\"bk-chip-dot\" [style.backgroundColor]=\"accentFor(opt)\"></span>\r\n }\r\n <span #badgeTextEl class=\"bk-multi-badge-item-text\" [style.color]=\"optionTextColor(opt)\"\r\n [bkTooltip]=\"getTooltipIfEllipsed(badgeTextEl, resolveLabel(opt))\"\r\n bkTooltipPosition=\"top\">{{\r\n resolveLabel(opt)\r\n }}</span>\r\n\r\n <!-- A locked control must not offer a way to drop a value. -->\r\n @if (isEditable()) {\r\n <button type=\"button\" (mousedown)=\"removeOption(opt, $event)\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M6.625 0.625L0.625 6.625M0.625 0.625L6.625 6.625\"\r\n stroke=\"#BBBDC5\"\r\n stroke-width=\"1.25\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n }\r\n @if (visibleCount() < selectedOptions().length) {\r\n <div class=\"bk-multi-badge-item\">\r\n <span\r\n class=\"bk-multi-badge-item-text\"\r\n bkTooltipPosition=\"top\"\r\n [bkTooltip]=\"getRemainingItems()\"\r\n >+{{ selectedOptions().length - visibleCount() }}</span\r\n >\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Hidden off-screen row used only to measure each chip's natural\r\n width so we can decide how many fit on a single line. -->\r\n <div class=\"bk-value-chips bk-chips-measure flex gap-0.5 flex-nowrap\" aria-hidden=\"true\">\r\n @for (opt of selectedOptions(); track $index) {\r\n <div #measureChip class=\"bk-multi-badge-item me-0.5\" [class.bk-chip-has-avatar]=\"showAvatar()\">\r\n <!-- Must mirror the visible chip exactly — same leading visual\r\n and same precedence — or the measured width is wrong and\r\n \"+N\" collapses at the wrong point. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(opt)\"\r\n [name]=\"resolveLabel(opt)\"\r\n [alt]=\"iconAlt\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(opt)) {\r\n <img [src]=\"resolveIcon(opt)!\" alt=\"icon\" class=\"bk-chip-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(opt)) {\r\n <span class=\"bk-chip-dot\"></span>\r\n }\r\n <span class=\"bk-multi-badge-item-text\">{{ resolveLabel(opt) }}</span>\r\n @if (isEditable()) {\r\n <button type=\"button\" tabindex=\"-1\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M6.625 0.625L0.625 6.625M0.625 0.625L6.625 6.625\"\r\n stroke=\"#BBBDC5\"\r\n stroke-width=\"1.25\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n }\r\n <div #measurePlus class=\"bk-multi-badge-item\">\r\n <span class=\"bk-multi-badge-item-text\">+{{ selectedOptions().length }}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (!multiple() && selectedOptions().length > 0) {\r\n <div class=\"flex items-center gap-1.5 min-w-0 w-full\">\r\n <!-- One leading visual only: avatar > icon > dot.\r\n `flex` on the host: bk-avatar's host is display:inline by\r\n default, so its inline-flex body sits on a baseline and the\r\n host gains descender space — which knocks the avatar out of\r\n vertical centre against the label. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(selectedOptions()[0])\"\r\n [name]=\"resolveLabel(selectedOptions()[0])\"\r\n [alt]=\"iconAlt\"\r\n [bgColor]=\"avatarBgFor(selectedOptions()[0])\"\r\n [textColor]=\"avatarTextFor(selectedOptions()[0])\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(selectedOptions()[0])) {\r\n <img [src]=\"resolveIcon(selectedOptions()[0])!\" alt=\"icon\" class=\"bk-option-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(selectedOptions()[0])) {\r\n <span class=\"bk-value-dot\" [style.backgroundColor]=\"accentFor(selectedOptions()[0])\"></span>\r\n }\r\n <div #singleValueEl class=\"bk-value-label-single\" [style.color]=\"controlStyle().color ?? resolveColor(selectedOptions()[0])\"\r\n [bkTooltip]=\"getTooltipIfEllipsed(singleValueEl, resolveLabel(selectedOptions()[0]))\"\r\n bkTooltipPosition=\"top\">\r\n {{ resolveLabel(selectedOptions()[0]) }}\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"bk-actions\">\r\n @if (clearable() && selectedOptions().length > 0 && isEditable()) {\r\n <span class=\"bk-clear-wrapper\" (mousedown)=\"handleClear($event)\" title=\"Clear\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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 </span>\r\n }\r\n <span class=\"bk-arrow-wrapper\" [class.bk-open]=\"isOpen()\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n @if (isOpen()) {\r\n <div\r\n #dropdownPanel\r\n tabindex=\"-1\"\r\n (keydown)=\"onTabPress($event)\"\r\n class=\"bk-dropdown-panel\"\r\n [attr.data-position]=\"placement()\"\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 [style.zIndex]=\"appendToBody() ? 10000 : null\"\r\n [class.bk-grouped]=\"groupBy()\"\r\n >\r\n @if (searchable()) {\r\n <div class=\"bk-dropdown-search mb-1\">\r\n <div class=\"bk-search-wrapper\">\r\n <svg\r\n class=\"text-[#BBBDC5] mr-2\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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\r\n #searchInput\r\n tabindex=\"-1\"\r\n type=\"text\"\r\n class=\"bk-search-input\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"'Search...'\"\r\n (input)=\"onSearchInput($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n <div\r\n #optionsListContainer\r\n tabindex=\"-1\"\r\n class=\"bk-options-list\"\r\n [class.bk-no-responsive]=\"!isResponsive()\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n @if (loading()) {\r\n <div class=\"bk-option-disabled\">{{ loadingText() }}</div>\r\n } @else {\r\n @if (allSelect()) {\r\n @if (multiple() && filteredItems().length > 0) {\r\n <div\r\n class=\"bk-option\"\r\n (mousedown)=\"toggleSelectAll($event)\"\r\n [class.bk-selected]=\"isAllSelected()\"\r\n >\r\n <div class=\"flex-1 flex items-center gap-2 min-w-0\">\r\n <!-- Reflects state only: pointer-events-none lets the row's\r\n mousedown own the toggle, so the box can't fire twice.\r\n standalone keeps this ngModel out of any parent <form>\r\n bk-select is rendered inside. -->\r\n <bk-checkbox\r\n class=\"pointer-events-none shrink-0 flex\"\r\n checkboxClass=\"sm\"\r\n [ngModel]=\"isAllSelected()\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n ></bk-checkbox>\r\n <span class=\"line-clamp-1\">Select All</span>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @for (group of groupedItems(); track $index) {\r\n @if (group.group) {\r\n <div class=\"bk-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\r\n #optionsRef\r\n tabindex=\"-1\"\r\n class=\"bk-option\"\r\n [class.bk-selected]=\"isItemSelected(item)\"\r\n [class.bk-marked]=\"$index === markedIndex()\"\r\n [class.bk-option-disabled]=\"isItemDisabled(item)\"\r\n [class.cursor-not-allowed]=\"isItemDisabled(item)\"\r\n (click)=\"handleSelection(item, $event)\"\r\n (mouseenter)=\"onOptionHover($index)\"\r\n >\r\n <div class=\"flex-1 flex justify-between gap-2 min-w-0\">\r\n <div class=\"flex items-center gap-2 min-w-0 flex-1\">\r\n <!-- One leading visual only: avatar > icon > dot. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(item)\"\r\n [name]=\"resolveLabel(item)\"\r\n [alt]=\"iconAlt\"\r\n [bgColor]=\"avatarBgFor(item)\"\r\n [textColor]=\"avatarTextFor(item)\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(item)) {\r\n <img [src]=\"resolveIcon(item)!\" alt=\"icon\" class=\"bk-option-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(item)) {\r\n <span class=\"bk-value-dot\" [style.backgroundColor]=\"accentFor(item)\"></span>\r\n }\r\n <span #optionLabelEl class=\"bk-option-label min-w-0\" [style.color]=\"optionTextColor(item)\"\r\n [bkTooltip]=\"getTooltipIfEllipsed(optionLabelEl, resolveLabel(item))\"\r\n bkTooltipPosition=\"top\">{{\r\n resolveLabel(item)\r\n }}</span>\r\n </div>\r\n\r\n @if (isItemSelected(item)) {\r\n <svg\r\n class=\"text-[#141414] shrink-0\"\r\n width=\"17\"\r\n height=\"17\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n >\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 @if (filteredItems().length === 0) {\r\n <div class=\"bk-option-disabled\">{{ notFoundText() }}</div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n @if (hasError) {\r\n @if (errorMessage) {\r\n <p class=\"bk-select-error\">{{ errorMessage }}</p>\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 AfterViewInit,\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, AfterViewInit, 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() dropSpecialCharacters: boolean | string[] | readonly string[] = false;\r\n @Input() autoComplete : BkInputAutoComplete = 'off';\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\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 @ViewChild(NgxMaskDirective) maskDirective?: NgxMaskDirective;\r\n\r\n // =================== Internal State ===================\r\n isFocused: boolean = false;\r\n inputValue: string = '';\r\n isDropdownOpen: boolean = false;\r\n private pendingMaskedValue: string | null = null;\r\n private isPropagatingViewValue = 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 private applyDropSpecialCharacters(viewValue: string): string {\r\n if (!viewValue) return '';\r\n\r\n // Align with ngx-mask semantics: when enabled, remove special mask characters from model.\r\n if (this.dropSpecialCharacters) {\r\n return viewValue.replace(/[^0-9A-Za-z]/g, '');\r\n }\r\n\r\n if (Array.isArray(this.dropSpecialCharacters)) {\r\n if (this.dropSpecialCharacters.length === 0) return viewValue;\r\n const escaped = this.dropSpecialCharacters\r\n .map((c) => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\r\n .join('');\r\n const re = new RegExp(`[${escaped}]`, 'g');\r\n return viewValue.replace(re, '');\r\n }\r\n\r\n return viewValue;\r\n }\r\n\r\n writeValue(value: any): void {\r\n const str = (value === null || value === undefined) ? '' : String(value);\r\n this.value = str;\r\n if (!this.maskValue) {\r\n this.inputValue = str;\r\n this.pendingMaskedValue = null;\r\n return;\r\n }\r\n\r\n // When the value came from this component's own input event, the masked view is\r\n // already correct. Re-applying it here can reset the caret position.\r\n if (this.isPropagatingViewValue) return;\r\n\r\n void this.writeMaskedViewValue(str);\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 !== undefined && this.value !== null && this.value !== '') {\r\n this.inputValue = String(this.value);\r\n }\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 ngAfterViewInit(): void {\r\n if (this.maskValue) {\r\n void this.writeMaskedViewValue(this.pendingMaskedValue ?? this.value);\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 viewVal = (event.target as HTMLInputElement).value ?? '';\r\n // Keep the displayed value masked.\r\n this.inputValue = viewVal;\r\n\r\n // Decide what to write to the model.\r\n const modelRaw = this.applyDropSpecialCharacters(viewVal);\r\n this.value = modelRaw;\r\n\r\n const out =\r\n this.type === 'number'\r\n ? (modelRaw === '' ? null : Number(modelRaw))\r\n : modelRaw;\r\n this.isPropagatingViewValue = true;\r\n this.onChange(out);\r\n queueMicrotask(() => {\r\n this.isPropagatingViewValue = false;\r\n });\r\n this.input.emit(event);\r\n\r\n // If parent handlers mutate the underlying native input value (e.g. clamping/formatting),\r\n // resync our internal view-model from the real input to avoid visual \"append\" artifacts.\r\n queueMicrotask(() => {\r\n const nativeVal = this.inputField?.nativeElement?.value;\r\n if (nativeVal !== undefined && nativeVal !== null && nativeVal !== this.inputValue) {\r\n this.inputValue = nativeVal;\r\n }\r\n });\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 void this.writeMaskedViewValue(newPhone);\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 private async writeMaskedViewValue(value: string): Promise<void> {\r\n this.pendingMaskedValue = value;\r\n\r\n if (!this.maskValue || !this.maskDirective || !this.inputField?.nativeElement) {\r\n this.inputValue = value;\r\n return;\r\n }\r\n\r\n await this.maskDirective.writeValue(value);\r\n this.inputValue = this.inputField.nativeElement.value ?? '';\r\n this.pendingMaskedValue = null;\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 @if (maskValue) {\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 [attr.pattern]=\"pattern\"\r\n [autocomplete]=\"autoComplete\"\r\n [value]=\"inputValue\"\r\n\r\n [mask]=\"maskValue\"\r\n [prefix]=\"maskPrefixValue\"\r\n [showMaskTyped]=\"false\"\r\n [dropSpecialCharacters]=\"dropSpecialCharacters\"\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 } @else {\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 [attr.pattern]=\"pattern\"\r\n [autocomplete]=\"autoComplete\"\r\n [value]=\"inputValue\"\r\n\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\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\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\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\n\r\nexport type TabIconDirection = 'left' | 'right'\r\nexport type TabsOrientation = 'horizontal' | 'vertical'\r\nexport type TabsVariant = 'default' | 'segmented'\r\n\r\n/**\r\n * Per-usage CSS classes for the 'segmented' variant.\r\n * Pass Tailwind classes (not raw colors). Because the component uses\r\n * emulated encapsulation, its default color rules out-specify plain\r\n * utilities — so use the important prefix, e.g. '!bg-white', '!text-black'.\r\n * Any field left undefined keeps the default design token from tabs.css.\r\n */\r\nexport interface TabsColors {\r\n wrapper?: string; // track background classes — default bg #54578E12\r\n active?: string; // active tab background classes — default bg #FFFFFF\r\n activeText?: string; // active tab text classes — default text #15191E\r\n inactive?: string; // inactive tab text classes — default text #6B7080\r\n}\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 direction?: TabIconDirection;\r\n iconTooltip?: string | string[];\r\n iconTooltipDirection?: 'left' | 'right' | 'top' | 'bottom';\r\n error?: boolean;\r\n /**\r\n * When the tab is in an error state, render an error icon (on the side given\r\n * by `direction`) with `iconTooltip` shown on hover of the icon.\r\n * When false/omitted, no error icon is drawn and `iconTooltip` falls back to\r\n * the tab button itself. Works for both variants and orientations.\r\n */\r\n showErrorIcon?: boolean;\r\n /**\r\n * Optional custom error icon URL. If omitted while `showErrorIcon` is true,\r\n * the component's default error icon is used.\r\n */\r\n errorIcon?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'bk-tabs',\r\n standalone: true,\r\n imports: [CommonModule, BKTooltipDirective],\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 @Input() orientation: TabsOrientation = 'horizontal';\r\n @Input() variant: TabsVariant = 'default';\r\n @Input() colors: TabsColors = {};\r\n\r\n /**\r\n * When true, if the currently active tab is in an error state, navigation to\r\n * the other tabs is blocked (they render disabled) until the error clears.\r\n * Optional — defaults to false, so navigation stays free unless opted in.\r\n */\r\n @Input() lockNavigationOnError: boolean = false;\r\n\r\n /** Fallback error icon used when a tab has `showErrorIcon` but no `errorIcon`. */\r\n private readonly defaultErrorIcon = '../../assets/icons/alert-circle-red.svg';\r\n\r\n // Convenience getters for template class bindings\r\n get isVertical(): boolean {\r\n return this.orientation === 'vertical';\r\n }\r\n\r\n get isSegmented(): boolean {\r\n return this.variant === 'segmented';\r\n }\r\n\r\n // Wrapper (track) classes — only for segmented; empty keeps the CSS default.\r\n get wrapperClass(): string {\r\n return this.isSegmented ? (this.colors.wrapper ?? '') : '';\r\n }\r\n\r\n // Per-tab color classes for the segmented variant.\r\n // Active tabs get background + text classes; inactive tabs get the text class.\r\n // Empty strings simply fall through to the default colors in tabs.css.\r\n segmentedTabClass(tab: TabItem): string {\r\n if (!this.isSegmented) return '';\r\n if (this.isActive(tab.id)) {\r\n return `${this.colors.active ?? ''} ${this.colors.activeText ?? ''}`.trim();\r\n }\r\n return this.colors.inactive ?? '';\r\n }\r\n\r\n @Output() change = new EventEmitter<TabItem>();\r\n\r\n // True when the currently active tab is flagged with an error.\r\n get activeTabHasError(): boolean {\r\n return this.list.some(t => t.id === this.activeTabId && !!t.error);\r\n }\r\n\r\n // A tab is locked when navigation-on-error is enabled, the active tab has an\r\n // error, and this tab is not the active one. Locked tabs render disabled.\r\n isLocked(tab: TabItem): boolean {\r\n return this.lockNavigationOnError && this.activeTabHasError && tab.id !== this.activeTabId;\r\n }\r\n\r\n // Set active tab and emit change event\r\n setActiveTab(tab:TabItem): void {\r\n if (tab?.disabled || this.disabled || this.isLocked(tab)) 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/error state.\r\n // In an error state, when the tab opts into an error icon, show the custom\r\n // `errorIcon` or the component default error icon — this replaces the tab's\r\n // own decorative `icon` so the error is always what's surfaced.\r\n getTabIcon(tab: TabItem): string | undefined {\r\n if (tab.error && tab.showErrorIcon) {\r\n return tab.errorIcon ?? this.defaultErrorIcon;\r\n }\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\r\n class=\"tabs-container\"\r\n [class.tabs-container--segmented]=\"isSegmented\"\r\n [ngClass]=\"isSegmented ? wrapperClass : (isVertical ? 'w-auto' : 'overflow-x-auto whitespace-nowrap')\">\r\n <ul\r\n class=\"tabs-list\"\r\n [class.tabs-list--segmented]=\"isSegmented\"\r\n [class.tabs-list--segmented-vertical]=\"isSegmented && isVertical\"\r\n [class.tabs-list--vertical]=\"isVertical && !isSegmented\"\r\n [attr.aria-orientation]=\"orientation\"\r\n role=\"tablist\">\r\n @for (tab of list; track tab.id; let i = $index) {\r\n <li class=\"tabs-item\" role=\"presentation\">\r\n <!--\r\n Tooltip logic:\r\n - Icon present (error or not) → tooltip on the icon, button gets no tooltip\r\n - No icon + error state → tooltip on the button\r\n - No icon + no error → no tooltip\r\n -->\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 || isLocked(tab)\"\r\n [class.tabs-button--active]=\"isActive(tab.id)\"\r\n [class.tabs-button--error]=\"tab.error\"\r\n [class.tabs-button--disabled]=\"disabled || tab.disabled || isLocked(tab)\"\r\n [class.tabs-button--icon-right]=\"tab.direction === 'right'\"\r\n [class.tabs-button--segmented]=\"isSegmented\"\r\n [ngClass]=\"[\r\n isSegmented ? segmentedTabClass(tab) : '',\r\n (isVertical && !isSegmented) ? 'w-full justify-start' : ''\r\n ]\"\r\n [bkTooltip]=\"(!getTabIcon(tab) && tab.error) ? (tab.iconTooltip || []) : []\"\r\n [bkTooltipPosition]=\"tab.iconTooltipDirection || 'top'\"\r\n class=\"tabs-button\"\r\n (click)=\"setActiveTab(tab)\"\r\n role=\"tab\">\r\n <!-- Left icon: tooltip lives on the icon when an icon is present -->\r\n <img\r\n [bkTooltip]=\"getTabIcon(tab) ? (tab.iconTooltip || []) : []\" [bkTooltipPosition]=\"tab.iconTooltipDirection || 'top'\"\r\n [attr.src]=\"getTabIcon(tab)\"\r\n [alt]=\"tab.iconAlt || tab.label\"\r\n [class.tabs-icon--hidden]=\"!getTabIcon(tab) || tab.direction === 'right'\"\r\n class=\"tabs-icon\">\r\n <span class=\"tabs-label\">{{ tab.label }}</span>\r\n <!-- Right icon: same tooltip rule, shown when direction is 'right' -->\r\n <img\r\n [bkTooltip]=\"getTabIcon(tab) ? (tab.iconTooltip || []) : []\" [bkTooltipPosition]=\"tab.iconTooltipDirection || 'top'\"\r\n [attr.src]=\"getTabIcon(tab)\"\r\n [alt]=\"tab.iconAlt || tab.label\"\r\n [class.tabs-icon--hidden]=\"!getTabIcon(tab) || tab.direction !== 'right'\"\r\n class=\"tabs-icon\">\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n</div>\r\n\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 `BkDialogConfig` (including animation fields) to the custom\r\n * `BkDialogContainerComponent`. 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 { BkDialogConfig } 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(BK_DIALOG_DATA) public data: MyDataType) {}\r\n * ```\r\n */\r\nexport const BK_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: BK_DIALOG_GLOBAL_CONFIG, useValue: { animation: 'zoom', width: '600px' } }\r\n * ]\r\n * ```\r\n */\r\nexport const BK_DIALOG_GLOBAL_CONFIG = new InjectionToken<BkDialogConfig>(\r\n 'BK_DIALOG_GLOBAL_CONFIG',\r\n);\r\n\r\n// ──── Internal ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Internal token that carries our full `BkDialogConfig` (with animation\r\n * settings, position offsets, etc.) into the `BkDialogContainerComponent`.\r\n *\r\n * @internal — not exported from the barrel; do not depend on it.\r\n */\r\nexport const BK_INTERNAL_DIALOG_CONFIG = new InjectionToken<BkDialogConfig>(\r\n 'BK_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 BkDialogContainerComponent plays these\r\n * via `element.animate()`.\r\n */\r\n\r\nimport { BkDialogAnimation } from './dialog-config';\r\n\r\nexport interface BkAnimationKeyframes {\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: BkDialogAnimation,\r\n enterDuration: number,\r\n leaveDuration: number\r\n): { enter: BkAnimationKeyframes; leave: BkAnimationKeyframes } {\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: BkAnimationKeyframes; leave: BkAnimationKeyframes } {\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 * BkDialogContainerComponent\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 `BkDialogService` 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 { BkDialogConfig } from './dialog-config';\r\nimport { BK_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 BkDialogContainerComponent extends CdkDialogContainer implements OnInit {\r\n\r\n /**\r\n * Our full config (including animation fields).\r\n * Provided by BkDialogService via the INTERNAL_DIALOG_CONFIG token.\r\n */\r\n private readonly _dialogConfig: BkDialogConfig = inject(BK_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 * `BkDialogService` subscribes via `.then()` to emit `afterOpened` on the\r\n * `BkDialogRef`.\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 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 = () => {\r\n // Cancel the animation so the persisted `transform` from\r\n // `fill: 'forwards'` is removed. A lingering transform (even\r\n // `scale(1)`) creates a new CSS containing block, which traps\r\n // absolutely-positioned descendants (e.g. dropdown panels)\r\n // inside `overflow: hidden` ancestors — causing UI distortion.\r\n // The element's default styles (opacity: 1, no transform) are\r\n // the same as the animation's final state, so cancelling is\r\n // visually seamless.\r\n anim.cancel();\r\n this._resolveOpened();\r\n };\r\n }\r\n\r\n /**\r\n * Play the leave animation. Returns a Promise that resolves when done.\r\n * Called by `BkDialogRef._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 * BkDialogRef — Handle returned to callers by `BkDialogService.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 `BkDialogContainerComponent` 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 BkDialogRef<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 BkDialogService) ──────────────────────────\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 `BkDialogConfig` 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 `BkDialogService.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 `BkDialogContainerComponent` 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 BkDialogAnimation =\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 BkDialogPosition {\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 BkDialogConfig<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?: BkDialogAnimation;\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?: BkDialogPosition;\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 BK_DEFAULT_DIALOG_CONFIG: BkDialogConfig = {\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 * BkDialogService — 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 `BkDialogContainerComponent` (extending\r\n * `CdkDialogContainer`) for WAAPI animations and panel styling.\r\n *\r\n * 3. We wrap CDK's `DialogRef` in our own `BkDialogRef` 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 BkDialogRef 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 { BkDialogConfig, BK_DEFAULT_DIALOG_CONFIG } from './dialog-config';\r\nimport { BkDialogRef } from './dialog-ref';\r\nimport { BkDialogContainerComponent } from './dialog-container';\r\nimport { BK_DIALOG_GLOBAL_CONFIG, BK_INTERNAL_DIALOG_CONFIG } from './dialog.tokens';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class BkDialogService {\r\n private readonly _cdkDialog = inject(Dialog);\r\n private readonly _overlay = inject(Overlay);\r\n private readonly _globalConfig: BkDialogConfig | null =\r\n inject(BK_DIALOG_GLOBAL_CONFIG, { optional: true });\r\n\r\n /** Stack of currently open dialog refs (most recent = last). */\r\n private readonly _openDialogRefs: BkDialogRef<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 `BkDialogRef` 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?: BkDialogConfig<D>,\r\n ): BkDialogRef<T, R> {\r\n // ── 1. Merge configs: DEFAULT ← GLOBAL ← per-call ──────────────\r\n const mergedConfig = {\r\n ...BK_DEFAULT_DIALOG_CONFIG,\r\n ...(this._globalConfig ?? {}),\r\n ...(config ?? {}),\r\n } as BkDialogConfig<D>;\r\n\r\n // ── 2. Prepare the return ref (set inside providers callback) ───\r\n let ourRef!: BkDialogRef<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: BkDialogContainerComponent,\r\n providers: () => [\r\n { provide: BK_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 `BkDialogRef` 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 BkDialogRef<T, R>(cdkRef);\r\n ourRef._containerInstance = containerInstance as BkDialogContainerComponent;\r\n\r\n // Wire up afterOpened emission.\r\n (containerInstance as BkDialogContainerComponent).opened\r\n .then(() => ourRef._emitOpened());\r\n\r\n return [\r\n { provide: BkDialogRef, 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 `BkDialogRef` of the most recently opened dialog,\r\n * or `undefined` if none are open.\r\n */\r\n getTopDialog(): BkDialogRef | 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): BkDialogRef | 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 `BkDialogRef` is not\r\n * available via injection (e.g. inside `<ng-template>`).\r\n */\r\n get openDialogsRef(): readonly BkDialogRef[] {\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 }): BkDialogRef<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 }): BkDialogRef<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: BkDialogRef, config: BkDialogConfig): void {\r\n if (config.disableClose) return;\r\n\r\n // Backdrop click\r\n if (config.closeOnBackdrop !== false) {\r\n ref.backdropClick().subscribe((event: any) => {\r\n // Only the top-most dialog should react to backdrop clicks\r\n if (this.getTopDialog() !== ref) {\r\n return;\r\n }\r\n\r\n // Prevent this click from leaking to underlying overlays\r\n try {\r\n if (event) {\r\n if (typeof event.preventDefault === 'function') event.preventDefault();\r\n if (typeof event.stopPropagation === 'function') event.stopPropagation();\r\n if (typeof event.stopImmediatePropagation === 'function') event.stopImmediatePropagation();\r\n }\r\n } catch {\r\n // no-op\r\n }\r\n\r\n // Defer close so CDK finishes dispatching this event on the top overlay\r\n setTimeout(() => ref.close());\r\n });\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 // Only the top-most dialog should react to ESC\r\n if (this.getTopDialog() !== ref) {\r\n return;\r\n }\r\n try {\r\n if (typeof e.preventDefault === 'function') e.preventDefault();\r\n if (typeof e.stopPropagation === 'function') e.stopPropagation();\r\n } catch {\r\n // no-op\r\n }\r\n setTimeout(() => 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: BkDialogConfig): 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: BkDialogConfig) {\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 { BkDialogRef } from './dialog-ref';\r\nimport { BkDialogService } 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 `BkDialogRef` 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 BkDialogRef[],\r\n): BkDialogRef | 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 `BkDialogRef` (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: BkDialogRef | null = inject(BkDialogRef, { optional: true });\r\n protected _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(BkDialogService);\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: BkDialogRef | null = inject(BkDialogRef, { optional: true });\r\n private _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(BkDialogService);\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 * • `BkDialogService` 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 { BkDialogContainerComponent } 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 BkDialogContainerComponent,\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\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 }\r\n @else if (showError) {\r\n <span>\r\n {{ errorMessage }}\r\n </span>\r\n }\r\n</span>\r\n","import { Component, EventEmitter, Input, OnDestroy, Output, SimpleChanges, forwardRef } from '@angular/core';\r\nimport { CommonModule, NgClass } from '@angular/common';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nexport type BkAvatarSize = 'sm' | 'md' | 'lg' | 'xl';\r\nexport type BkAvatarFallback = 'auto' | 'initials' | 'icon' | 'camera';\r\n\r\n@Component({\r\n selector: 'bk-avatar-uploader',\r\n imports: [NgClass, CommonModule, BKTooltipDirective],\r\n templateUrl: './avatar-profile.html',\r\n styleUrl: './avatar-profile.css',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkAvatarUploader),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => BkAvatarUploader),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkAvatarUploader implements OnDestroy, ControlValueAccessor, Validator {\r\n\r\n // ---------- Display inputs ----------\r\n @Input() src: string | null = null;\r\n @Input() alt = 'Avatar';\r\n @Input() name = '';\r\n @Input() size: BkAvatarSize = 'md';\r\n @Input() fallback: BkAvatarFallback = 'auto';\r\n\r\n // ---------- Functional inputs ----------\r\n /** Whether upload / remove actions are enabled */\r\n @Input() editable = true;\r\n /** Accepted file MIME types for the file picker */\r\n @Input() accept = 'image/jpeg, image/png, image/heic, image/heif, .heic, .heif';\r\n /** Max file size in KB (0 = no limit) */\r\n @Input() maxFileSizeKB = 0;\r\n /** Label shown on the upload button */\r\n @Input() uploadLabel = 'Upload';\r\n /** Hint text shown below the upload button */\r\n @Input() hint = '500x500 JPEG, PNG Image';\r\n /** External loading state (e.g. while uploading) */\r\n @Input() loading = false;\r\n /** Whether the remove badge is shown when an image is present */\r\n @Input() removable = false;\r\n @Input() removeableIconTooltip = 'Remove';\r\n\r\n // ---------- Form / CVA inputs ----------\r\n /** Label displayed above the avatar */\r\n @Input() label = '';\r\n /** Whether the field is required (shows asterisk) */\r\n @Input() required = false;\r\n /** External error state flag */\r\n @Input() hasError = false;\r\n /** Error message to display when hasError is true */\r\n @Input() errorMessage = '';\r\n /** Disabled state (also set via CVA setDisabledState) */\r\n @Input() disabled = false;\r\n\r\n // ---------- Outputs ----------\r\n /** Emits the selected File after validation passes */\r\n @Output() fileSelected = new EventEmitter();\r\n /** Emits when the user clicks the remove badge */\r\n @Output() removed = new EventEmitter<void>();\r\n /** Emits a human-readable error string on validation failure */\r\n @Output() fileError = new EventEmitter<string>();\r\n\r\n initials = '';\r\n imageLoadFailed = false;\r\n corrupted = false;\r\n\r\n /** Local blob URL for instant preview before server upload completes */\r\n private previewUrl: string | null = null;\r\n\r\n // ---------- CVA Callbacks ----------\r\n private onChange = (_value: string | null) => {};\r\n private onTouched = () => {};\r\n\r\n writeValue(value: string | null): void {\r\n this.src = value || null;\r\n // When a new value arrives from the form (e.g. server URL after upload),\r\n // discard any stale local blob preview so displaySrc uses the real URL\r\n this.revokePreview();\r\n this.imageLoadFailed = false;\r\n this.corrupted = false;\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.editable = !isDisabled;\r\n }\r\n\r\n // ---------- Validator Implementation ----------\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (this.required && !control.value) {\r\n return { required: true };\r\n }\r\n return null;\r\n }\r\n\r\n // ---------- Lifecycle ----------\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.name) {\r\n this.initials = this.getInitials(this.name);\r\n }\r\n this.imageLoadFailed = false;\r\n this.corrupted = false;\r\n\r\n // When the parent updates [src] via @Input (non-CVA usage), discard the local preview,\r\n // except when the incoming value is the same preview URL.\r\n if (changes['src'] && this.previewUrl && this.src !== this.previewUrl) {\r\n this.revokePreview();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.revokePreview();\r\n }\r\n\r\n onImageError(): void {\r\n this.imageLoadFailed = true;\r\n }\r\n\r\n // ---------- Derived UI ----------\r\n /** The URL the template should display — local preview takes priority over the server src */\r\n get displaySrc(): string | null {\r\n return this.previewUrl ?? this.src;\r\n }\r\n\r\n get showInitials(): boolean {\r\n if (!this.name) return false;\r\n if (this.fallback === 'icon') return false;\r\n if (this.fallback === 'camera') return false;\r\n if (this.fallback === 'initials') return true;\r\n return true; // auto\r\n }\r\n\r\n get containerClasses(): string {\r\n const classes = ['avatar-profile', this.size];\r\n if (this.corrupted) classes.push('corrupted');\r\n return classes.join(' ');\r\n }\r\n\r\n get sizeClasses(): BkAvatarSize[] {\r\n return [this.size];\r\n }\r\n\r\n get showRemoveButton(): boolean {\r\n return this.removable && this.editable && !!(this.displaySrc) && !this.imageLoadFailed;\r\n }\r\n\r\n // ---------- File handling ----------\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files?.length) return;\r\n\r\n const file = input.files[0];\r\n const isHeicLike = this.isHeicFile(file);\r\n\r\n // Validate file type\r\n if (this.accept && !this.isFileTypeValid(file)) {\r\n this.fileError.emit(`Invalid file type. Accepted: ${this.accept}`);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Validate file size\r\n if (this.maxFileSizeKB > 0 && file.size > this.maxFileSizeKB * 1024) {\r\n this.fileError.emit(`File size exceeds ${this.maxFileSizeKB}KB limit.`);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Create a blob URL and verify the browser can actually decode it as an image\r\n this.revokePreview();\r\n const blobUrl = URL.createObjectURL(file);\r\n\r\n if (isHeicLike) {\r\n // HEIC/HEIF files are often valid but not decodable by the browser on Windows.\r\n // Do not attach a blob preview URL for these formats; some browsers emit\r\n // noisy blob fetch errors for unsupported decoders.\r\n URL.revokeObjectURL(blobUrl);\r\n this.corrupted = false;\r\n this.previewUrl = null;\r\n this.imageLoadFailed = false;\r\n this.onTouched();\r\n this.fileSelected.emit(event);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n this.validateImage(blobUrl).then(valid => {\r\n if (!valid) {\r\n // Corrupted / undecodable file — show corrupted state, do NOT emit\r\n URL.revokeObjectURL(blobUrl);\r\n this.corrupted = true;\r\n this.imageLoadFailed = false;\r\n this.previewUrl = null;\r\n this.fileError.emit('The selected file appears to be corrupted or is not a valid image.');\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Valid image — proceed with preview & emission\r\n this.corrupted = false;\r\n this.previewUrl = blobUrl;\r\n this.imageLoadFailed = false;\r\n\r\n // Push the preview URL as the form value so validation (e.g. required) passes\r\n this.onChange(this.previewUrl);\r\n this.onTouched();\r\n\r\n this.fileSelected.emit(event);\r\n input.value = ''; // reset so re-selecting the same file still triggers change\r\n });\r\n }\r\n\r\n /**\r\n * Attempts to load a URL into an off-screen Image element.\r\n * Resolves `true` if the browser can decode it, `false` otherwise.\r\n */\r\n private validateImage(url: string): Promise<boolean> {\r\n return new Promise(resolve => {\r\n const img = new Image();\r\n img.onload = () => resolve(true);\r\n img.onerror = () => resolve(false);\r\n img.src = url;\r\n });\r\n }\r\n\r\n onRemove(): void {\r\n this.revokePreview();\r\n this.src = null;\r\n this.corrupted = false;\r\n this.onChange(null);\r\n this.onTouched();\r\n this.removed.emit();\r\n }\r\n\r\n // ---------- Utils ----------\r\n /** Revoke the previous object URL to free memory */\r\n private revokePreview(): void {\r\n if (this.previewUrl) {\r\n URL.revokeObjectURL(this.previewUrl);\r\n this.previewUrl = null;\r\n }\r\n }\r\n\r\n private isFileTypeValid(file: File): boolean {\r\n const accepted = this.accept.split(',').map(t => t.trim().toLowerCase()).filter(Boolean);\r\n const fileType = (file.type || '').toLowerCase();\r\n const fileName = file.name.toLowerCase();\r\n const fileExtension = fileName.includes('.') ? fileName.slice(fileName.lastIndexOf('.') + 1) : '';\r\n\r\n return accepted.some(type => {\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.slice(0, -1));\r\n }\r\n\r\n if (type === 'image/heic' || type === 'image/heif' || type === '.heic' || type === '.heif' || type === 'heic' || type === 'heif') {\r\n return fileType === 'image/heic' || fileType === 'image/heif' || fileExtension === 'heic' || fileExtension === 'heif';\r\n }\r\n\r\n if (type.startsWith('.')) {\r\n return fileExtension === type.slice(1);\r\n }\r\n\r\n return fileType === type;\r\n });\r\n }\r\n\r\n private isHeicFile(file: File): boolean {\r\n const fileType = (file.type || '').toLowerCase();\r\n const fileName = file.name.toLowerCase();\r\n return fileType === 'image/heic' || fileType === 'image/heif' || fileName.endsWith('.heic') || fileName.endsWith('.heif');\r\n }\r\n\r\n private getInitials(name: string): string {\r\n const parts = name.trim().split(/\\s+/);\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts.at(-1)![0]).toUpperCase();\r\n }\r\n}\r\n","<div class=\"avatar-profile-container\" [ngClass]=\"sizeClasses\">\r\n @if (label) {\r\n <label class=\"avatar-profile-label\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"avatar-profile-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"flex gap-4 justify-end\">\r\n <div\r\n [ngClass]=\"containerClasses\"\r\n [bkTooltip]=\"name\"\r\n [bkTooltipPosition]=\"'top'\"\r\n >\r\n\r\n <!-- Loading overlay -->\r\n @if (loading) {\r\n <div class=\"absolute inset-0 flex items-center justify-center z-10 rounded-full bg-white/60\">\r\n <div class=\"w-5 h-5 border-2 border-[#141414] border-t-transparent rounded-full animate-spin\"></div>\r\n </div>\r\n }\r\n\r\n @if (corrupted) {\r\n <!-- Corrupted file indicator -->\r\n <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M19.3517 7.61665L15.3929 4.05375C14.2651 3.03868 13.7012 2.53114 13.0092 2.26562L13 5.00011C13 7.35713 13 8.53564 13.7322 9.26787C14.4645 10.0001 15.643 10.0001 18 10.0001H21.5801C21.2175 9.29588 20.5684 8.71164 19.3517 7.61665Z\" fill=\"#DC3545\"/>\r\n <path d=\"M14 22H10C6.22876 22 4.34315 22 3.17157 20.8284C2.72548 20.3823 2.44924 19.8327 2.27818 19.1149C2.15904 18.6149 2.09948 18.3649 2.21429 18.0728C2.32911 17.7806 2.58217 17.6119 3.08829 17.2745L3.71429 16.8571C4.49285 16.3381 5.50715 16.3381 6.28571 16.8571C7.3238 17.5492 8.6762 17.5492 9.71429 16.8571C10.4929 16.3381 11.5071 16.3381 12.2857 16.8571C13.3238 17.5492 14.6762 17.5492 15.7143 16.8571C16.4929 16.3381 17.5071 16.3381 18.2857 16.8571C19.3238 17.5492 20.6762 17.5492 21.7143 16.8571C21.8241 16.7839 21.9705 16.8681 21.965 17C21.8873 18.8723 21.6366 20.0203 20.8284 20.8284C19.6569 22 17.7712 22 14 22Z\" fill=\"#DC3545\"/>\r\n <path d=\"M2 10C2 6.22876 2 4.34315 3.17157 3.17157C4.34315 2 6.23869 2 10.0298 2C10.6358 2 11.1214 2 11.53 2.01666C11.5166 2.09659 11.5095 2.17813 11.5092 2.26057L11.5 5.09497C11.4999 6.19207 11.4998 7.16164 11.6049 7.94316C11.7188 8.79028 11.9803 9.63726 12.6716 10.3285C13.3628 11.0198 14.2098 11.2813 15.0569 11.3952C15.8385 11.5003 16.808 11.5002 17.9051 11.5001L18 11.5001H21.9934V12.3273C21.9973 12.5399 21.8912 12.7392 21.7143 12.8571C20.6762 13.5492 19.3238 13.5492 18.2857 12.8571C17.5071 12.3381 16.4929 12.3381 15.7143 12.8571C14.6762 13.5492 13.3238 13.5492 12.2857 12.8571C11.5071 12.3381 10.4929 12.3381 9.71429 12.8571C8.6762 13.5492 7.3238 13.5492 6.28571 12.8571C5.50715 12.3381 4.49285 12.3381 3.71429 12.8571L3.5547 12.9635C2.87033 13.4198 2.52814 13.6479 2.26407 13.5066C2 13.3653 2 12.954 2 12.1315V10Z\" fill=\"#DC3545\"/>\r\n </svg>\r\n }\r\n\r\n @else if (displaySrc && !imageLoadFailed) {\r\n <img\r\n [src]=\"displaySrc\"\r\n [alt]=\"alt\"\r\n class=\"avatar-img\"\r\n (error)=\"onImageError()\"\r\n />\r\n }\r\n\r\n @else if (fallback === 'camera') {\r\n <svg class=\"placeholder-icon\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M18.3843 4.66667C17.6726 4.66667 17.0193 4.25833 16.6926 3.62833L15.8526 1.93667C15.316 0.875 13.916 0 12.726 0H10.0543C8.85264 0 7.45264 0.875 6.91598 1.93667L6.07598 3.62833C5.74931 4.25833 5.09598 4.66667 4.38431 4.66667C1.85264 4.66667 -0.154023 6.80167 0.00931005 9.32167L0.615977 18.9583C0.755977 21.3617 2.05098 23.3333 5.27098 23.3333H17.4976C20.7176 23.3333 22.001 21.3617 22.1526 18.9583L22.7593 9.32167C22.9226 6.80167 20.916 4.66667 18.3843 4.66667ZM9.63431 6.125H13.1343C13.6126 6.125 14.0093 6.52167 14.0093 7C14.0093 7.47833 13.6126 7.875 13.1343 7.875H9.63431C9.15598 7.875 8.75931 7.47833 8.75931 7C8.75931 6.52167 9.15598 6.125 9.63431 6.125ZM11.3843 18.8067C9.21431 18.8067 7.44098 17.045 7.44098 14.8633C7.44098 12.6817 9.20264 10.92 11.3843 10.92C13.566 10.92 15.3276 12.6817 15.3276 14.8633C15.3276 17.045 13.5543 18.8067 11.3843 18.8067Z\" fill=\"#6B7080\"/>\r\n </svg>\r\n }\r\n\r\n @else if (showInitials) {\r\n <span class=\"avatar-text\">\r\n {{ initials }}\r\n </span>\r\n }\r\n\r\n @else {\r\n <svg class=\"placeholder-icon\" viewBox=\"0 0 32 32\" fill=\"none\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" > <g clip-path=\"url(#clip0)\"> <path d=\"M16 16c3.682 0 6.667-2.985 6.667-6.667S19.682 2.667 16 2.667 9.333 5.651 9.333 9.333 12.318 16 16 16Z\" stroke=\"#363C51\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /> <path d=\"M27.453 29.333C27.453 24.173 22.32 20 16 20S4.547 24.173 4.547 29.333\" stroke=\"#363C51\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /> </g> <defs> <clipPath id=\"clip0\"> <rect width=\"32\" height=\"32\" fill=\"white\" /> </clipPath> </defs> </svg>\r\n }\r\n\r\n <!-- Remove badge -->\r\n @if (showRemoveButton) {\r\n <button\r\n type=\"button\"\r\n class=\"remove-badge\"\r\n (click)=\"onRemove()\"\r\n aria-label=\"Remove avatar\"\r\n [bkTooltip]=\"removeableIconTooltip\"\r\n [bkTooltipPosition]=\"'top'\"\r\n >\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M1 1L9 9M9 1L1 9\" stroke=\"#6B7080\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n }\r\n\r\n </div>\r\n <div class=\"flex flex-col gap-2 justify-end items-start\">\r\n @if (editable) {\r\n <label class=\"upload-button cursor-pointer\">\r\n {{ uploadLabel }}\r\n <input\r\n type=\"file\"\r\n class=\"hidden\"\r\n [accept]=\"accept\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </label>\r\n }\r\n @if (!hasError && hint) {\r\n <p class=\"profile-size\">{{ hint }}</p>\r\n }\r\n @if (hasError && errorMessage) {\r\n <p class=\"avatar-profile-error\">{{ errorMessage }}</p>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n effect,\r\n ViewChild,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n forwardRef,\r\n AfterViewInit,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nimport {\r\n ColorAppearance,\r\n deriveAppearance,\r\n NEUTRAL_APPEARANCE\r\n} from '../shared/utilities/color-appearance';\r\n/** Generic hierarchical node; works with note types and any similar tree. */\r\nexport interface HierarchicalNode {\r\n [key: string]: any;\r\n childs?: HierarchicalNode[];\r\n children?: HierarchicalNode[];\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'bk-hierarchical-select',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BKTooltipDirective],\r\n templateUrl: './hierarchical-select.html',\r\n styleUrls: ['./hierarchical-select.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkHierarchicalSelect),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkHierarchicalSelect implements ControlValueAccessor , AfterViewInit, OnDestroy {\r\n /** Tree data (root-level array). */\r\n items = input<HierarchicalNode[]>([]);\r\n /** Key for display label (e.g. 'noteType'). */\r\n labelKey = input<string>('noteType');\r\n /** Key for value (e.g. 'noteTypeKey'). */\r\n valueKey = input<string>('noteTypeKey');\r\n /** Key for children array (e.g. 'childs' or 'children'). */\r\n childrenKey = input<string>('childs');\r\n clearTooltip = input<string>('');\r\n /** Key to check if node is disabled (e.g. 'active', 'disabled'). */\r\n // disabledKey = input<string>('disabled');\r\n /** Placeholder when nothing selected. */\r\n placeholder = input<string>('Select...');\r\n /** Label above the control. */\r\n label = input<string>('');\r\n /** Required indicator. */\r\n required = input<boolean>(false);\r\n /** Optional icon URL in the trigger. */\r\n iconSrc = input<string | undefined>(undefined);\r\n iconAlt = input<string>('icon');\r\n /** Disabled state (can also be set by form control via CVA). */\r\n disabled = input<boolean>(false);\r\n private disabledByForm = signal<boolean>(false);\r\n isDisabled = computed(() => this.disabled() || this.disabledByForm());\r\n /** Whether to allow selecting parent nodes that have children. Default: only leaf selection. */\r\n allowParentSelection = input<boolean>(false);\r\n /** Text for \"Back\" link (e.g. \"< Back to Main\"). */\r\n backToMainText = input<string>('Back to Main');\r\n /** Search placeholder. */\r\n searchPlaceholder = input<string>('Search');\r\n searchable = input<boolean>(false);\r\n /** When true, dropdown is positioned fixed and sized to the trigger (use inside modals/popups). */\r\n appendToBody = input<boolean>(false);\r\n /** Open above or below the trigger (also used when appendToBody is true for fixed coordinates). */\r\n dropdownPosition = input<'bottom' | 'top'>('bottom');\r\n /** Key for option color (e.g. \"color\"). When set, option label and selected value use this color. */\r\n colorKey = input<string>('');\r\n /** Whether to show clear button when a value is selected. */\r\n clearable = input<boolean>(true);\r\n /**\r\n * Show an accent dot beside each option, driven by `colorKey`, and tint the\r\n * control with the selected node's colour (same treatment as bk-status-select).\r\n */\r\n showDots = input<boolean>(false);\r\n\r\n /**\r\n * When true, a child with no colour of its own borrows its nearest coloured\r\n * ancestor's, keeping a branch visually related. Off by default so existing\r\n * trees render exactly as before.\r\n */\r\n inheritColor = input<boolean>(false);\r\n /** Optional anchor key to scope dropdown to one subtree (e.g. module/category key). */\r\n restrictKey = input<any>(null);\r\n hasError = input<boolean>(false);\r\n\r\n /** Emit full selected node. */\r\n selectionChange = output<HierarchicalNode | null>();\r\n /** Emit value only (e.g. noteTypeKey). */\r\n valueChange = output<any>();\r\n /** Emit when clear button is clicked. */\r\n clear = output<any>();\r\n\r\n\r\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\r\n @ViewChild('controlWrapper') controlWrapper!: ElementRef<HTMLDivElement>;\r\n @ViewChild('dropdownPanel') dropdownPanel?: ElementRef<HTMLDivElement>;\r\n\r\n private el = inject(ElementRef);\r\n\r\n // Side the panel is actually rendered on. Starts from the requested\r\n // `dropdownPosition` but is auto-flipped based on available viewport space.\r\n placement = signal<'bottom' | 'top'>('bottom');\r\n\r\n // When appendToBody is on we physically relocate the panel to <body> so it\r\n // escapes any transformed/overflow ancestor (e.g. an animated dialog). These\r\n // track its home so we can put it back before Angular removes it on close.\r\n private originalPanelParent: Node | null = null;\r\n private originalPanelAnchor: Node | null = null;\r\n private panelInBody = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n const list = this.items();\r\n const value = this.valueSignal();\r\n\r\n if (value == null) {\r\n this.selected.set(null);\r\n return;\r\n }\r\n\r\n const node = this.findNodeByValue(list ?? [], value);\r\n this.selected.set(node ?? null);\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Keep the panel glued to the control while any ancestor scrolls or the\r\n // window resizes. Capture phase (`true`) catches scrolling inside nested\r\n // overflow containers (e.g. a modal body), not just the window.\r\n window.addEventListener('scroll', this.reposition, true);\r\n window.addEventListener('resize', this.reposition);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n window.removeEventListener('scroll', this.reposition, true);\r\n window.removeEventListener('resize', this.reposition);\r\n // If we're torn down while open, don't leave the relocated panel orphaned in <body>.\r\n if (this.panelInBody) {\r\n this.dropdownPanel?.nativeElement.remove();\r\n this.panelInBody = false;\r\n }\r\n }\r\n\r\n // Re-evaluate placement as the page scrolls/resizes. For append-to-body this\r\n // recomputes the fixed coordinates so the panel follows the control while it's\r\n // visible, and closes once the control is fully scrolled out of view (viewport\r\n // OR any scroll container such as a modal body). Inline just re-flips up/down.\r\n private reposition = () => {\r\n if (!this.isOpen()) return;\r\n\r\n if (this.appendToBody()) {\r\n const rect = this.controlWrapper?.nativeElement.getBoundingClientRect();\r\n if (rect && this.isControlClipped(rect)) {\r\n this.closeDropdown();\r\n return;\r\n }\r\n }\r\n this.applyPlacement();\r\n };\r\n\r\n /**\r\n * True when the control is fully outside the visible area — either the\r\n * viewport or a scrollable/clipping ancestor (e.g. a dialog's scroll body).\r\n */\r\n private isControlClipped(rect: DOMRect): boolean {\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight ||\r\n rect.right <= 0 || rect.left >= window.innerWidth) {\r\n return true;\r\n }\r\n let el = this.controlWrapper?.nativeElement.parentElement;\r\n while (el && el !== document.body) {\r\n const style = getComputedStyle(el);\r\n const clips = /(auto|scroll|hidden|clip|overlay)/;\r\n if (clips.test(style.overflowY) || clips.test(style.overflowX)) {\r\n const r = el.getBoundingClientRect();\r\n if (rect.bottom <= r.top || rect.top >= r.bottom ||\r\n rect.right <= r.left || rect.left >= r.right) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Relocate the panel node to <body> so it truly escapes any transformed or\r\n * overflow-clipped ancestor (dialogs, drawers, overflow cards, etc.).\r\n */\r\n private movePanelToBody(): void {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || this.panelInBody) return;\r\n this.originalPanelParent = panel.parentNode;\r\n this.originalPanelAnchor = panel.nextSibling;\r\n document.body.appendChild(panel);\r\n this.panelInBody = true;\r\n }\r\n\r\n /** Return the panel to its original DOM position before Angular removes it. */\r\n private restorePanel(): void {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || !this.panelInBody) return;\r\n if (this.originalPanelParent) {\r\n this.originalPanelParent.insertBefore(panel, this.originalPanelAnchor);\r\n }\r\n this.panelInBody = false;\r\n this.originalPanelParent = null;\r\n this.originalPanelAnchor = null;\r\n }\r\n\r\n /** Runs after the panel has rendered: relocate (append mode) + position + focus. */\r\n private afterOpenInit(): void {\r\n if (this.appendToBody()) this.movePanelToBody();\r\n this.applyPlacement();\r\n this.searchInput?.nativeElement?.focus();\r\n }\r\n\r\n isOpen = signal(false);\r\n dropdownStyle = signal<{ top?: string; bottom?: string; left: string; width: string }>({\r\n left: '0px',\r\n width: 'auto',\r\n });\r\n searchTerm = signal('');\r\n /** Breadcrumb stack: each entry is the parent node we navigated into. */\r\n breadcrumb = signal<HierarchicalNode[]>([]);\r\n /** Currently selected node (leaf or parent if allowParentSelection). */\r\n selected = signal<HierarchicalNode | null>(null);\r\n\r\n /** Current level items: root or children of last breadcrumb. */\r\n currentLevelItems = computed(() => {\r\n const list = this.items();\r\n const stack = this.breadcrumb();\r\n if (!list?.length) return [];\r\n\r\n const restrictKey = this.restrictKey();\r\n if (restrictKey != null) {\r\n const anchorNode = this.findNodeByValue(list, restrictKey);\r\n if (!anchorNode) {\r\n return [];\r\n }\r\n\r\n // Start from anchor children only, so siblings outside this branch are hidden.\r\n let anchoredLevel: HierarchicalNode[] = this.getChildren(anchorNode) ?? [];\r\n for (const parent of stack) {\r\n const children = this.getChildren(parent);\r\n anchoredLevel = children ?? [];\r\n }\r\n return anchoredLevel;\r\n }\r\n\r\n let level: HierarchicalNode[] = list;\r\n for (const parent of stack) {\r\n const children = this.getChildren(parent);\r\n level = children ?? [];\r\n }\r\n return level;\r\n });\r\n\r\n /** Filtered by search (matches label in current level and descendants). */\r\n filteredItems = computed(() => {\r\n const term = this.searchTerm().toLowerCase().trim();\r\n const level = this.currentLevelItems();\r\n if (!term) return level;\r\n return level.filter((item) =>\r\n this.getLabel(item).toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n /** Display text in trigger: path \"Parent > Child\" or placeholder. */\r\n displayPath = computed(() => {\r\n const sel = this.selected();\r\n if (!sel) return [];\r\n\r\n const path = this.buildPathTo(sel);\r\n return path.length ? path : [sel];\r\n });\r\n\r\n\r\n /** Whether we're not at root (show Back). */\r\n showBack = computed(() => this.breadcrumb().length > 0);\r\n\r\n getLabel(node: HierarchicalNode): string {\r\n const key = this.labelKey();\r\n return (node && key && node[key]) ?? '';\r\n }\r\n\r\n /** Returns the color for the node (e.g. node.color) when colorKey is set. */\r\n resolveColor(node: HierarchicalNode | null): string | null {\r\n if (!node) return null;\r\n const key = this.colorKey();\r\n return key && typeof node === 'object' ? (node[key] as string) ?? null : null;\r\n }\r\n\r\n /**\r\n * Accent for the last node of a root→node path: its own colour, or — when\r\n * `inheritColor` is on — the nearest coloured ancestor's.\r\n */\r\n private colorAlong(path: HierarchicalNode[]): string | null {\r\n if (!path.length) return null;\r\n if (!this.inheritColor()) return this.resolveColor(path[path.length - 1]);\r\n for (let i = path.length - 1; i >= 0; i--) {\r\n const color = this.resolveColor(path[i]);\r\n if (color) return color;\r\n }\r\n return null;\r\n }\r\n\r\n /** Accent for a row in the level on screen — its ancestors are the breadcrumb. */\r\n private optionAccentColor(node: HierarchicalNode): string | null {\r\n return this.colorAlong([...this.breadcrumb(), node]);\r\n }\r\n\r\n /**\r\n * Colours for the control itself, from the selected node. Neutral unless\r\n * `showDots` is on, so existing usages are untouched.\r\n */\r\n controlAppearance = computed<ColorAppearance>(() => {\r\n if (!this.showDots()) return NEUTRAL_APPEARANCE;\r\n const sel = this.selected();\r\n if (!sel) return NEUTRAL_APPEARANCE;\r\n return deriveAppearance(this.colorAlong(this.buildPathTo(sel)), 'subtle');\r\n });\r\n\r\n /** Raw accent for a node's dot. */\r\n accentFor(node: HierarchicalNode): string | null {\r\n return deriveAppearance(this.optionAccentColor(node), 'subtle').dotColor;\r\n }\r\n\r\n /**\r\n * Label colour for an option. With showDots on, the accent is darkened until\r\n * legible; otherwise the raw colorKey value is used as before.\r\n */\r\n optionTextColor(node: HierarchicalNode): string | null {\r\n if (!this.showDots()) return this.resolveColor(node);\r\n return deriveAppearance(this.optionAccentColor(node), 'none').color;\r\n }\r\n\r\n\r\n getValue(node: HierarchicalNode): any {\r\n const key = this.valueKey();\r\n return key && node ? node[key] : node;\r\n }\r\n\r\n getChildren(node: HierarchicalNode): HierarchicalNode[] | undefined {\r\n const key = this.childrenKey();\r\n const raw = node?.[key];\r\n if (Array.isArray(raw) && raw.length > 0) return raw;\r\n const alt = node?.['children'];\r\n return Array.isArray(alt) && alt.length > 0 ? alt : undefined;\r\n }\r\n\r\n hasChildren(node: HierarchicalNode): boolean {\r\n const ch = this.getChildren(node);\r\n return !!ch?.length;\r\n }\r\n\r\n // isNodeDisabled(node: HierarchicalNode): boolean {\r\n // if (!node) return false;\r\n // const disabledProp = this.disabledKey();\r\n // if (!disabledProp || typeof node !== 'object') return false;\r\n\r\n // const value = node[disabledProp];\r\n // if (typeof value !== 'boolean') return value === true;\r\n\r\n // // Support both patterns:\r\n // // - disabled=true means disabled\r\n // // - active/enabled=false means disabled\r\n // const key = disabledProp.toLowerCase();\r\n // if (key.includes('active') || key.includes('enabled')) {\r\n // return !value;\r\n // }\r\n\r\n // return value;\r\n // }\r\n\r\n isSelected(node: HierarchicalNode): boolean {\r\n const sel = this.selected();\r\n if (!sel) return false;\r\n return this.getValue(sel) === this.getValue(node);\r\n }\r\n\r\n /** Build path from root to target (finds first occurrence). */\r\n private buildPathTo(target: HierarchicalNode): HierarchicalNode[] {\r\n const targetVal = this.getValue(target);\r\n const path: HierarchicalNode[] = [];\r\n const search = (list: HierarchicalNode[], parentPath: HierarchicalNode[]): boolean => {\r\n for (const node of list) {\r\n const currentPath = [...parentPath, node];\r\n if (this.getValue(node) === targetVal) {\r\n path.push(...currentPath);\r\n return true;\r\n }\r\n const children = this.getChildren(node);\r\n if (children?.length && search(children, currentPath)) return true;\r\n }\r\n return false;\r\n };\r\n search(this.items(), []);\r\n return path;\r\n }\r\n\r\n toggleDropdown(event?: Event): void {\r\n event?.preventDefault();\r\n event?.stopPropagation();\r\n if (this.isDisabled()) return;\r\n if (this.isOpen()) {\r\n this.closeDropdown();\r\n } else {\r\n this.openDropdown();\r\n }\r\n }\r\n\r\n openDropdown(): void {\r\n if (this.restrictKey() != null) {\r\n const restrictKey = this.restrictKey();\r\n const sel = this.selected();\r\n\r\n if (sel) {\r\n const selectedPath = this.buildPathTo(sel);\r\n const anchorIndex = selectedPath.findIndex(\r\n (node) => this.getValue(node) === restrictKey\r\n );\r\n\r\n if (anchorIndex >= 0) {\r\n const relativePath = selectedPath.slice(anchorIndex + 1);\r\n const selectedHasChildren = this.hasChildren(sel);\r\n\r\n // If selected has children, open at selected node so user can navigate deeper.\r\n // If selected is leaf, open at parent level so siblings are still visible/selectable.\r\n if (selectedHasChildren) {\r\n this.breadcrumb.set(relativePath);\r\n } else {\r\n this.breadcrumb.set(relativePath.slice(0, -1));\r\n }\r\n } else {\r\n this.breadcrumb.set([]);\r\n }\r\n } else {\r\n this.breadcrumb.set([]);\r\n }\r\n\r\n // Decide the initial side before the panel paints (estimated height;\r\n // corrected after render in afterOpenInit).\r\n this.applyPlacement();\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n setTimeout(() => this.afterOpenInit(), 0);\r\n return;\r\n }\r\n\r\n const sel = this.selected();\r\n if (sel) {\r\n const path = this.buildPathTo(sel);\r\n this.breadcrumb.set(path.slice(0, -1));\r\n } else {\r\n this.breadcrumb.set([]);\r\n }\r\n this.applyPlacement();\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n setTimeout(() => this.afterOpenInit(), 0);\r\n }\r\n\r\n /**\r\n * Decides which side the panel opens on (auto-flip) and, for append-to-body\r\n * mode, computes the fixed coordinates. Re-run on open and on scroll/resize so\r\n * the panel snaps to whichever side has room — honouring `dropdownPosition`\r\n * when it fits. Inline mode is positioned by CSS via the `placement` signal.\r\n */\r\n applyPlacement(): void {\r\n const el = this.controlWrapper?.nativeElement;\r\n if (!el) return;\r\n\r\n const rect = el.getBoundingClientRect();\r\n const gap = 4;\r\n const panelHeight = this.dropdownPanel?.nativeElement.offsetHeight || 300;\r\n\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const spaceAbove = rect.top - gap;\r\n\r\n const preferred = this.dropdownPosition();\r\n let placeTop: boolean;\r\n if (preferred === 'top') {\r\n placeTop = spaceAbove >= panelHeight || spaceAbove > spaceBelow;\r\n } else {\r\n placeTop = spaceBelow < panelHeight && spaceAbove > spaceBelow;\r\n }\r\n this.placement.set(placeTop ? 'top' : 'bottom');\r\n\r\n // Inline mode uses CSS (data-position) — the placement signal is enough.\r\n if (!this.appendToBody()) return;\r\n\r\n if (placeTop) {\r\n this.dropdownStyle.set({\r\n top: undefined,\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\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: `${rect.bottom + gap}px`,\r\n bottom: undefined,\r\n left: `${rect.left}px`,\r\n width: `${rect.width}px`,\r\n });\r\n }\r\n }\r\n\r\n /** Fixed positioning when appendToBody; inset placement uses CSS + .hierarchical-select-field. */\r\n getTop(): string | null {\r\n if (!this.appendToBody()) return null;\r\n return this.dropdownStyle().top ?? null;\r\n }\r\n\r\n getBottom(): string | null {\r\n if (!this.appendToBody()) return null;\r\n return this.dropdownStyle().bottom ?? null;\r\n }\r\n\r\n // Scroll/resize are handled by the capture-phase listeners in ngAfterViewInit\r\n // (see `reposition`): they keep the panel attached, re-flip it, and only close\r\n // it once the control scrolls fully out of view.\r\n\r\n closeDropdown(): void {\r\n const wasOpen = this.isOpen();\r\n // Put the panel back where Angular expects it before the @if removes it.\r\n this.restorePanel();\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.breadcrumb.set([]);\r\n if (wasOpen) {\r\n this.onTouched();\r\n }\r\n }\r\n\r\n goBack(): void {\r\n const stack = this.breadcrumb();\r\n if (stack.length === 0) return;\r\n this.breadcrumb.set(stack.slice(0, -1));\r\n }\r\n\r\n onSearchInput(event: Event): void {\r\n const value = (event.target as HTMLInputElement).value;\r\n this.searchTerm.set(value);\r\n }\r\n\r\n selectItem(node: HierarchicalNode, event?: Event): void {\r\n event?.stopPropagation();\r\n if (node.disabled) return;\r\n const hasChildren = this.hasChildren(node);\r\n if (hasChildren && !this.allowParentSelection()) {\r\n this.breadcrumb.update((stack) => [...stack, node]);\r\n return;\r\n }\r\n this.selected.set(node);\r\n const value = this.getValue(node);\r\n this._value = value;\r\n this.valueSignal.set(value);\r\n this.onChange(this.getValue(node));\r\n this.selectionChange.emit(node);\r\n this.valueChange.emit(value);\r\n this.closeDropdown();\r\n }\r\n\r\n openFromLabel(event: MouseEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (this.isDisabled()) return;\r\n this.controlWrapper?.nativeElement?.focus();\r\n this.openDropdown();\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(e: Event): void {\r\n const target = e.target as Node;\r\n // When appendToBody relocates the panel to <body>, it's no longer inside the\r\n // host element — treat clicks within the panel as \"inside\" too.\r\n if (this.el.nativeElement.contains(target)) return;\r\n if (this.dropdownPanel?.nativeElement.contains(target)) return;\r\n this.closeDropdown();\r\n }\r\n\r\n // --- ControlValueAccessor ---\r\n private _value: any = null;\r\n private valueSignal = signal<any>(null);\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n writeValue(value: any): void {\r\n this._value = value;\r\n this.valueSignal.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabledByForm.set(isDisabled);\r\n }\r\n\r\n private findNodeByValue(list: HierarchicalNode[], value: any): HierarchicalNode | null {\r\n for (const node of list) {\r\n if (this.getValue(node) === value) return node;\r\n const children = this.getChildren(node);\r\n if (children?.length) {\r\n const found = this.findNodeByValue(children, value);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n handleClear(event: Event): void {\r\n event.stopPropagation();\r\n this.selected.set(null);\r\n this._value = null;\r\n this.valueSignal.set(null);\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.valueChange.emit(null);\r\n this.clear.emit(null);\r\n }\r\n}\r\n","<div class=\"hierarchical-select-container\">\r\n @if (label()) {\r\n <label\r\n class=\"input-label\"\r\n (click)=\"openFromLabel($event)\">\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=\"hierarchical-select-field\">\r\n <div\r\n #controlWrapper\r\n class=\"hierarchical-select-control\"\r\n [ngClass]=\"{ 'hierarchical-select-control-has-error': hasError() }\"\r\n tabindex=\"0\"\r\n [class.focused]=\"isOpen()\"\r\n [class.disabled]=\"isDisabled()\"\r\n (mousedown)=\"toggleDropdown($event)\">\r\n @if (iconSrc()) {\r\n <img [src]=\"iconSrc()\" [alt]=\"iconAlt()\" class=\"shrink-0\" />\r\n }\r\n <div class=\"hierarchical-value-container\">\r\n @if (!selected()) {\r\n <div class=\"hierarchical-placeholder\">{{ placeholder() }}</div>\r\n } @else {\r\n <div class=\"hierarchical-value-label\" [style.color]=\"resolveColor(selected())\">\r\n @for (node of displayPath(); track getValue(node); let last = $last) {\r\n <span\r\n #breadNode\r\n class=\"hierarchical-breadcrumb-node\"\r\n [bkTooltip]=\"breadNode.scrollWidth > breadNode.clientWidth ? getLabel(node) : ''\"\r\n bkTooltipPosition=\"top\">{{ getLabel(node) }}</span>\r\n\r\n @if (!last) {\r\n <svg\r\n class=\"breadcrumb-separator\"\r\n width=\"5\"\r\n height=\"8\"\r\n viewBox=\"0 0 5 8\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M4.57142 4.00286C4.57185 3.92766 4.55744 3.85312 4.52901 3.78351C4.50057 3.71389 4.45868 3.65058 4.40572 3.59719L0.977497 0.169008C0.924381 0.115455 0.861186 0.0729493 0.79156 0.0439419C0.721933 0.0149346 0.647251 0 0.571824 0C0.496396 0 0.421714 0.0149346 0.352088 0.0439419C0.282461 0.0729493 0.219267 0.115455 0.16615 0.169008C0.059732 0.27606 0 0.420874 0 0.57182C0 0.722766 0.059732 0.867579 0.16615 0.974631L3.19442 4.00286L0.16615 7.02537C0.059732 7.13242 0 7.27723 0 7.42818C0 7.57913 0.059732 7.72394 0.16615 7.83099C0.219267 7.88454 0.282461 7.92705 0.352088 7.95606C0.421714 7.98507 0.496396 8 0.571824 8C0.647251 8 0.721933 7.98507 0.79156 7.95606C0.861186 7.92705 0.924381 7.88454 0.977497 7.83099L4.40572 4.40281C4.51128 4.29639 4.57079 4.15275 4.57142 4.00286Z\"\r\n fill=\"#BBBDC5\"/>\r\n </svg>\r\n }\r\n }\r\n </div>\r\n\r\n }\r\n </div>\r\n <div class=\"hierarchical-actions\">\r\n @if (clearable() && selected() && !isDisabled()) {\r\n <span class=\"hierarchical-clear-wrapper\" (mousedown)=\"handleClear($event)\" title=\"Clear\" [bkTooltip]=\"clearTooltip()\" bkTooltipPosition=\"top\">\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\">\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 </span>\r\n }\r\n <span class=\"hierarchical-arrow\" [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\">\r\n <path d=\"m6 9 6 6 6-6\"/>\r\n </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=\"hierarchical-dropdown-panel\"\r\n [attr.data-position]=\"placement()\"\r\n [class.hierarchical-dropdown-panel-fixed]=\"appendToBody()\"\r\n [style.position]=\"appendToBody() ? 'fixed' : 'absolute'\"\r\n [style.top]=\"appendToBody() ? getTop() : null\"\r\n [style.bottom]=\"appendToBody() ? getBottom() : null\"\r\n [style.left]=\"appendToBody() ? dropdownStyle().left : null\"\r\n [style.width]=\"appendToBody() ? dropdownStyle().width : '100%'\">\r\n @if (searchable()) {\r\n <div class=\"hierarchical-search\">\r\n <div class=\"hierarchical-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\r\n #searchInput\r\n type=\"text\"\r\n class=\"hierarchical-search-input\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"searchPlaceholder()\"\r\n (input)=\"onSearchInput($event)\"\r\n (click)=\"$event.stopPropagation()\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showBack()) {\r\n <button\r\n type=\"button\"\r\n class=\"hierarchical-back\"\r\n (click)=\"goBack(); $event.stopPropagation()\">\r\n <span>\r\n <svg width=\"6\" height=\"10\" viewBox=\"0 0 6 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M4.59961 0.599976L0.599609 4.59998L4.59961 8.59998\" stroke=\"#141414\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n\r\n </span>\r\n {{ backToMainText() }}\r\n </button>\r\n }\r\n\r\n <div class=\"hierarchical-options-list\">\r\n @for (item of filteredItems(); track getValue(item)) {\r\n <div\r\n class=\"hierarchical-option\"\r\n [class.selected]=\"isSelected(item)\"\r\n [class.disabled-item]=\"item.disabled\"\r\n [class.cursor-not-allowed]=\"item.disabled\"\r\n (mousedown)=\"selectItem(item, $event)\">\r\n <span\r\n #optLabel\r\n class=\"hierarchical-option-label\"\r\n [style.color]=\"resolveColor(item)\"\r\n [bkTooltip]=\"optLabel.scrollWidth > optLabel.clientWidth ? getLabel(item) : ''\"\r\n bkTooltipPosition=\"top\">{{ getLabel(item) }}</span>\r\n @if (hasChildren(item)) {\r\n <svg width=\"5\" height=\"8\" viewBox=\"0 0 5 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M4.57142 4.00286C4.57185 3.92766 4.55744 3.85312 4.52901 3.78351C4.50057 3.71389 4.45868 3.65058 4.40572 3.59719L0.977497 0.169008C0.924381 0.115455 0.861186 0.0729493 0.79156 0.0439419C0.721933 0.0149346 0.647251 0 0.571824 0C0.496396 0 0.421714 0.0149346 0.352088 0.0439419C0.282461 0.0729493 0.219267 0.115455 0.16615 0.169008C0.059732 0.27606 0 0.420874 0 0.57182C0 0.722766 0.059732 0.867579 0.16615 0.974631L3.19442 4.00286L0.16615 7.02537C0.059732 7.13242 0 7.27723 0 7.42818C0 7.57913 0.059732 7.72394 0.16615 7.83099C0.219267 7.88454 0.282461 7.92705 0.352088 7.95606C0.421714 7.98507 0.496396 8 0.571824 8C0.647251 8 0.721933 7.98507 0.79156 7.95606C0.861186 7.92705 0.924381 7.88454 0.977497 7.83099L4.40572 4.40281C4.51128 4.29639 4.57079 4.15275 4.57142 4.00286Z\" fill=\"#BBBDC5\"/>\r\n </svg>\r\n } @else if (isSelected(item)) {\r\n <svg width=\"10\" height=\"7\" viewBox=\"0 0 10 7\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M3.72939 6.28273C3.64166 6.28324 3.55468 6.26642 3.47346 6.23324C3.39223 6.20007 3.31835 6.15118 3.25606 6.08939L0.196061 3.00273C0.0705253 2.87719 -1.32274e-09 2.70693 0 2.52939C1.32273e-09 2.35186 0.0705253 2.1816 0.196061 2.05606C0.321597 1.93053 0.49186 1.86 0.669394 1.86C0.846929 1.86 1.01719 1.93053 1.14273 2.05606L3.72939 4.64939L8.17606 0.196061C8.3016 0.0705253 8.47186 -3.49963e-09 8.64939 0C8.82693 3.49963e-09 8.99719 0.0705253 9.12273 0.196061C9.24826 0.321597 9.31879 0.49186 9.31879 0.669395C9.31879 0.846929 9.24826 1.01719 9.12273 1.14273L4.20273 6.06273C4.07921 6.19434 3.90963 6.27316 3.72939 6.28273V6.28273Z\" fill=\"#141414\"/>\r\n </svg>\r\n }\r\n </div>\r\n }\r\n @if (filteredItems().length === 0) {\r\n <div class=\"hierarchical-option-empty\">No records found</div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Injectable, signal, computed, ApplicationRef, ComponentRef, createComponent, EnvironmentInjector } from '@angular/core';\r\nimport { BkToastr } from './toastr';\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type ToastSeverity = 'success' | 'error' | 'warn' | 'info' | 'default';\r\n\r\nexport type ToastPosition =\r\n | 'top-left'\r\n | 'top-right'\r\n | 'top-center'\r\n | 'bottom-left'\r\n | 'bottom-right'\r\n | 'bottom-center';\r\n\r\nexport interface ToastConfig {\r\n summary: string;\r\n detail?: string;\r\n severity?: ToastSeverity;\r\n timeOut?: number;\r\n sticky?: boolean;\r\n icon?: boolean;\r\n inline?: boolean;\r\n actionLabel?: string;\r\n actionCallback?: () => void;\r\n}\r\n\r\n/** Options for convenience methods (severity is set by the method itself) */\r\nexport interface ToastMethodOptions extends Omit<ToastConfig, 'severity'> {\r\n summary: string;\r\n}\r\n\r\nexport interface ToastMessage extends ToastConfig {\r\n readonly id: string;\r\n readonly severity: ToastSeverity;\r\n readonly timeOut: number;\r\n readonly sticky: boolean;\r\n readonly icon: boolean;\r\n readonly inline?: boolean;\r\n leaving: boolean;\r\n}\r\n\r\n// ─── Service ─────────────────────────────────────────────────────────────────\r\n\r\nlet _toastId = 0;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class BkToastrService {\r\n private readonly _toasts = signal<ToastMessage[]>([]);\r\n readonly toasts = computed(() => this._toasts());\r\n\r\n private readonly _position = signal<ToastPosition>('top-right');\r\n readonly position = computed(() => this._position());\r\n\r\n private componentRef: ComponentRef<BkToastr> | null = null;\r\n\r\n constructor(\r\n private readonly appRef: ApplicationRef,\r\n private readonly injector: EnvironmentInjector\r\n ) {}\r\n\r\n private initializeContainer(): void {\r\n if (this.componentRef) return;\r\n\r\n // Check if we're in browser environment\r\n if (typeof document === 'undefined' || !document.body) {\r\n // If document.body doesn't exist yet, wait for it\r\n setTimeout(() => this.initializeContainer(), 0);\r\n return;\r\n }\r\n\r\n // Create component dynamically\r\n this.componentRef = createComponent(BkToastr, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n // Attach to DOM\r\n document.body.appendChild(this.componentRef.location.nativeElement);\r\n\r\n // Register for change detection\r\n // Note: We don't call appRef.tick() here to avoid recursive tick calls\r\n // Angular will automatically detect changes for the attached view\r\n this.appRef.attachView(this.componentRef.hostView);\r\n }\r\n\r\n /** Show a toast with full config */\r\n show(config: ToastConfig): string {\r\n // Initialize container on first toast\r\n this.initializeContainer();\r\n\r\n const id = `toast-${++_toastId}`;\r\n\r\n const toast: ToastMessage = {\r\n ...config,\r\n id,\r\n severity: config.severity ?? 'info',\r\n timeOut: config.timeOut ?? 4000,\r\n sticky: config.sticky ?? false,\r\n icon: config.icon !== false,\r\n inline: config.inline !== false,\r\n leaving: false,\r\n };\r\n\r\n this._toasts.update(list => [...list, toast]);\r\n\r\n if (!toast.sticky) {\r\n setTimeout(() => this.close(id), toast.timeOut);\r\n }\r\n\r\n return id;\r\n }\r\n\r\n /** Convenience – info toast */\r\n info(options: ToastMethodOptions): string;\r\n info(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n info(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'info' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'info' });\r\n }\r\n\r\n /** Convenience – success toast */\r\n success(options: ToastMethodOptions): string;\r\n success(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n success(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'success' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'success' });\r\n }\r\n\r\n /** Convenience – error toast */\r\n error(options: ToastMethodOptions): string;\r\n error(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n error(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'error' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'error' });\r\n }\r\n\r\n /** Convenience – warning toast */\r\n warn(options: ToastMethodOptions): string;\r\n warn(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n warn(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'warn' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'warn' });\r\n }\r\n\r\n /** Convenience – default / neutral toast */\r\n default(options: ToastMethodOptions): string;\r\n default(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n default(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'default' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'default' });\r\n }\r\n\r\n /** Close a single toast (triggers leave animation first) */\r\n close(id: string): void {\r\n this._toasts.update(list =>\r\n list.map(t => (t.id === id ? { ...t, leaving: true } : t)),\r\n );\r\n setTimeout(() => {\r\n this._toasts.update(list => list.filter(t => t.id !== id));\r\n }, 300);\r\n }\r\n\r\n /** Clear every toast */\r\n clear(): void {\r\n this._toasts.update(list => list.map(t => ({ ...t, leaving: true })));\r\n setTimeout(() => this._toasts.set([]), 300);\r\n }\r\n\r\n /** Set the position for toast notifications */\r\n setPosition(position: ToastPosition): void {\r\n // Initialize container if not already created\r\n this.initializeContainer();\r\n this._position.set(position);\r\n }\r\n}\r\n","import { Component, inject, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport {\r\n BkToastrService,\r\n ToastMessage,\r\n ToastPosition,\r\n} from './toastr.service';\r\n\r\n@Component({\r\n selector: 'bk-toastr',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './toastr.html',\r\n styleUrl: './toastr.css',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class BkToastr {\r\n private readonly svc = inject(BkToastrService);\r\n\r\n /** Convert signal → Observable so AsyncPipe triggers change detection reliably */\r\n readonly toasts$ = toObservable(this.svc.toasts);\r\n readonly position$ = toObservable(this.svc.position);\r\n\r\n onClose(event: Event, id: string): void {\r\n event.stopPropagation();\r\n this.svc.close(id);\r\n }\r\n\r\n onAction(event: Event, t: ToastMessage): void {\r\n event.stopPropagation();\r\n t.actionCallback?.();\r\n }\r\n}\r\n","<!-- Toast Container – fixed overlay -->\r\n<div class=\"toast-container\" [attr.data-position]=\"position$ | async\">\r\n\r\n @for (toast of (toasts$ | async) ?? []; track toast.id) {\r\n <div\r\n class=\"toast-item\"\r\n [attr.data-severity]=\"toast.severity\"\r\n [class.toast-item-inline]=\"toast.inline\"\r\n [class.toast-enter]=\"!toast.leaving\"\r\n [class.toast-leave]=\"toast.leaving\">\r\n\r\n <!-- ── Icon ── -->\r\n @if (toast.icon) {\r\n <svg class=\"toast-icon shrink-0\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g [attr.clip-path]=\"'url(#clip_' + toast.id + ')'\">\r\n <path\r\n d=\"M10.0001 13.3334V10M10.0001 6.66671H10.0084M18.3334 10C18.3334 5.39767 14.6025 1.66671 10.0001 1.66671C5.39771 1.66671 1.66675 5.39767 1.66675 10C1.66675 14.6024 5.39771 18.3334 10.0001 18.3334C14.6025 18.3334 18.3334 14.6024 18.3334 10Z\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath [attr.id]=\"'clip_' + toast.id\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n }\r\n\r\n <!-- ── Content ── -->\r\n <div class=\"toast-content flex-1 min-w-0\">\r\n <p class=\"toast-summary\">{{ toast.summary }}</p>\r\n @if (toast.detail) {\r\n <p class=\"toast-detail\">{{ toast.detail }}</p>\r\n }\r\n </div>\r\n\r\n <!-- ── Action button ── -->\r\n @if (toast.actionLabel) {\r\n <button type=\"button\" class=\"toast-action\" (click)=\"onAction($event, toast)\">\r\n {{ toast.actionLabel }}\r\n </button>\r\n }\r\n\r\n <!-- ── Close button ── -->\r\n <button type=\"button\" class=\"toast-close\" (click)=\"onClose($event, toast.id)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M10.625 0.625L0.625 10.625M0.625 0.625L10.625 10.625\"\r\n stroke-width=\"1.25\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n </div>\r\n }\r\n\r\n</div>\r\n","export class ColumnFilterOption {\r\n columnName!: string;\r\n selected: boolean=true;\r\n\r\n constructor(columnName?: string, selected: boolean = false) {\r\n if (columnName) {\r\n this.columnName = columnName;\r\n }\r\n this.selected = selected;\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ColumnFilterOption } from '../models/column-filter-option';\r\n\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BkColumnFilterService {\r\n\r\n constructor() { }\r\n\r\n intializeColumnsFilter(key:string,fields:string[]):void {\r\n var columnsList: ColumnFilterOption[]= fields.map((f)=> new ColumnFilterOption(f,true));\r\n localStorage.setItem(key,JSON.stringify(columnsList));\r\n }\r\n\r\n getColumnsFilterList(key:string,fields:string[]):ColumnFilterOption[]|[] {\r\n let stored = localStorage.getItem(key);\r\n if(!fields || fields.length===0){\r\n return [];\r\n }\r\n if(!stored){\r\n this.intializeColumnsFilter(key,fields);\r\n stored = localStorage.getItem(key);\r\n }\r\n\r\n let storedColumns = stored ? (JSON.parse(stored) as ColumnFilterOption[]) : [];\r\n\r\n // Sync stored columns with current fields\r\n storedColumns = this.syncColumnsWithFields(storedColumns, fields);\r\n\r\n // Update localStorage with synced data\r\n localStorage.setItem(key, JSON.stringify(storedColumns));\r\n\r\n return storedColumns;\r\n // return stored ? (JSON.parse(stored) as ColumnFilterOption[]) : [];\r\n }\r\n\r\n private syncColumnsWithFields(storedColumns: ColumnFilterOption[], currentFields: string[]): ColumnFilterOption[] {\r\n // Map of existing columns for quick lookup\r\n const existingColumnsMap = new Map<string, ColumnFilterOption>();\r\n storedColumns.forEach(col => existingColumnsMap.set(col.columnName, col));\r\n\r\n // New list based on current fields\r\n const syncedColumns: ColumnFilterOption[] = [];\r\n\r\n currentFields.forEach(field => {\r\n if (existingColumnsMap.has(field)) {\r\n // Keep existing column with its selection state\r\n syncedColumns.push(existingColumnsMap.get(field)!);\r\n } else {\r\n // Add new column as selected by default\r\n syncedColumns.push(new ColumnFilterOption(field, true));\r\n }\r\n });\r\n\r\n return syncedColumns;\r\n }\r\n updateColumnFilterList(key:string,list:ColumnFilterOption[]): void {\r\n localStorage.removeItem(key);\r\n localStorage.setItem(key,JSON.stringify(list));\r\n }\r\n showColumn(field:string,columnsFilterList:ColumnFilterOption[]):boolean{\r\n return columnsFilterList.find((i)=> i.columnName===field)?.selected || false;\r\n }\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ViewChild,\r\n forwardRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkButton } from '../../../ui-button/ui-button';\r\nimport { BkCheckbox } from '../../../checkbox/checkbox';\r\nimport { BkInput } from '../../../input/input';\r\nimport { ColumnFilterOption } from '../../models/column-filter-option';\r\nimport { BkColumnFilterService } from '../../service/column-filter.service';\r\n\r\n@Component({\r\n selector: 'bk-column-select',\r\n imports: [FormsModule, BkButton, BkCheckbox, BkInput],\r\n standalone: true,\r\n templateUrl: './column-select.html',\r\n styleUrl: './column-select.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkColumnSelect),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkColumnSelect implements ControlValueAccessor, OnChanges {\r\n @Input() searchable = false;\r\n @Input() buttonClass : string = '';\r\n @Input() cacheKey!: string;\r\n @Input() columns: string[] = [];\r\n @Input() isOpened = false;\r\n @Input() label: string = 'Columns';\r\n @Input() lefticon: string = '../../../../assets/icons/select-column.svg';\r\n @Output() isOpenedChange = new EventEmitter<boolean>();\r\n @ViewChild('formBox') formBoxRef!: ElementRef;\r\n\r\n /** Value bound via ngModel – only updated when user ticks/unticks a checkbox, never on search. */\r\n columnsFilterList: ColumnFilterOption[] = [];\r\n search = '';\r\n\r\n private onChangeCallback: (value: ColumnFilterOption[]) => void = () => {};\r\n private onTouchedCallback: () => void = () => {};\r\n\r\n constructor(public columnFilterService: BkColumnFilterService) {}\r\n\r\n writeValue(value: ColumnFilterOption[] | null | undefined): void {\r\n const isEmpty = !value || !Array.isArray(value) || value.length === 0;\r\n if (isEmpty && this.shouldLoadFromService()) {\r\n this.loadColumnsFilterListFromService();\r\n } else {\r\n this.columnsFilterList = Array.isArray(value) ? value : [];\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const columnsChanged = changes['columns'] && !changes['columns'].firstChange;\r\n const cacheKeyChanged = changes['cacheKey'] && !changes['cacheKey'].firstChange;\r\n if ((columnsChanged || cacheKeyChanged) && this.columnsFilterList.length === 0 && this.shouldLoadFromService()) {\r\n this.loadColumnsFilterListFromService();\r\n }\r\n }\r\n\r\n private shouldLoadFromService(): boolean {\r\n return !!this.cacheKey && !!this.columns?.length;\r\n }\r\n\r\n private loadColumnsFilterListFromService(): void {\r\n this.columnsFilterList = this.columnFilterService.getColumnsFilterList(\r\n this.cacheKey,\r\n this.columns\r\n );\r\n this.onChangeCallback(this.columnsFilterList);\r\n }\r\n\r\n registerOnChange(fn: (value: ColumnFilterOption[]) => void): void {\r\n this.onChangeCallback = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouchedCallback = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n // Optional: disable button/dropdown when control is disabled\r\n }\r\n\r\n filterButtonClicked(event: Event): void {\r\n event.stopPropagation();\r\n const willOpen = !this.isOpened;\r\n if (!willOpen) {\r\n this.clearSearch();\r\n this.onTouchedCallback();\r\n }\r\n this.isOpenedChange.emit(willOpen);\r\n }\r\n\r\n /** Called only on checkbox tick/untick – not on search. Emits via CVA so ngModel updates. */\r\n onChangeColumnFilter(): void {\r\n this.columnFilterService.updateColumnFilterList(this.cacheKey, this.columnsFilterList);\r\n this.onChangeCallback(this.columnsFilterList);\r\n this.onTouchedCallback();\r\n }\r\n\r\n private clearSearch(): void {\r\n this.search = '';\r\n }\r\n\r\n private closeDropdown(): void {\r\n this.clearSearch();\r\n this.onTouchedCallback();\r\n this.isOpened = false;\r\n this.isOpenedChange.emit(this.isOpened);\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClick(event: Event): void {\r\n if (!this.isOpened) {\r\n return;\r\n }\r\n const formBox = this.formBoxRef?.nativeElement;\r\n if (formBox && formBox.contains(event.target as Node)) {\r\n return;\r\n }\r\n if (\r\n event.target instanceof HTMLElement &&\r\n event.target.classList.contains('ng-value-icon')\r\n ) {\r\n return;\r\n }\r\n if (\r\n event.target instanceof HTMLElement &&\r\n event.target.closest('.btn-light-primary-custom')\r\n ) {\r\n return;\r\n }\r\n this.closeDropdown();\r\n }\r\n\r\n get list():ColumnFilterOption[] {\r\n return this.columnsFilterList.filter((x)=> x.columnName.toLowerCase().includes(this.search.toLowerCase()));\r\n }\r\n\r\n\r\n}\r\n","<div class=\"relative\">\r\n\r\n <bk-button [size]=\"'xsm'\" [variant]=\"'secondary'\" [leftIcon]=\"lefticon\"\r\n (click)=\"filterButtonClicked($event)\" [label]=\"label\" [buttonClass]=\"`text-black ${buttonClass}`\"></bk-button>\r\n\r\n <!-- Dropdown Box -->\r\n @if(isOpened){\r\n\r\n <div #formBox\r\n class=\"absolute right-0 mt-2 w-[178px] bg-white border border-[#EFEFF1] rounded-xl shadow-xl p-3 pe-1 z-[9999]\">\r\n @if(searchable){\r\n <bk-input [id]=\"'search-input-1'\" [name]=\"'search-input-1'\"\r\n [iconSrc]=\"'../../../../assets/icons/search-input.svg'\" type=\"text\" [(ngModel)]=\"search\"\r\n placeholder=\"Search\"></bk-input>\r\n }\r\n <div class=\"column-select-options-list\">\r\n @for (column of list; track column.columnName; let i = $index) {\r\n <div class=\"flex items-center gap-2 px-3 py-2\">\r\n <bk-checkbox [label]=\"column.columnName\" id=\"columnsFilterList-{{column.columnName}}\" checkboxClass=\"sm\" [(ngModel)]=\"column.selected\" labelClass=\"!text-left\"\r\n (change)=\"onChangeColumnFilter()\">\r\n\r\n </bk-checkbox>\r\n\r\n <!-- <label class=\"text-xs cursor-pointer text-[#141414] select-none truncate font-medium\"\r\n for=\"columnsFilterList-{{column.columnName}}\">\r\n {{column.columnName}}\r\n </label> -->\r\n\r\n </div>\r\n }\r\n @if(!list.length){\r\n <p class=\"column-select-option-empty\">No records found</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\n@Component({\n selector: 'bk-file-picker',\n imports: [CommonModule],\n templateUrl: './file-picker.html',\n styleUrl: './file-picker.css',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => BkFilePicker),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => BkFilePicker),\n multi: true,\n },\n ],\n})\nexport class BkFilePicker implements ControlValueAccessor, Validator {\n @Input() id: string = '';\n @Input() name: string = '';\n @Input() accept: string = '';\n @Input() multi: boolean = false;\n // @Input() maxFileSizeKB: number | null = null;\n @Input() disable: boolean = false;\n @Input() errorMessage: string = '';\n @Input() hasError: boolean = false;\n @Input() draggable: boolean = true;\n @Input() description: string = '';\n @Input()\n set required(val: boolean) {\n this._required = val;\n this._onValidatorChange?.();\n }\n get required() {\n return this._required;\n }\n private _required = false;\n @Output() change = new EventEmitter<Event>();\n @Output() error = new EventEmitter<string>();\n @Output() cancel = new EventEmitter<void>();\n @ViewChild('fileInput') fileInputRef?: ElementRef<HTMLInputElement>;\n private _value: File | File[] | null = null;\n private _onValidatorChange?: () => void;\n private onChange: (value: File | File[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: File | File[] | null): void {\n this._value = value;\n\n if (!value && this.fileInputRef?.nativeElement) {\n this.fileInputRef.nativeElement.value = '';\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disable = isDisabled;\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n if (this.required && !this._value) {\n return { required: true };\n }\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this._onValidatorChange = fn;\n }\n\n get pickerState(): 'default' | 'active' | 'disabled' {\n if (this.disable) return 'disabled';\n return 'default';\n }\n\n onContainerClick(): void {\n if (this.disable) return;\n\n this.onTouched(); // ⭐ Touch on interaction start\n this.fileInputRef?.nativeElement?.click();\n }\n\n onFileChange(event: Event): void {\n // 1. Stop the native HTML change event from bubbling up to the <bk-file-picker> tag\n event.stopPropagation();\n\n const input = event.target as HTMLInputElement;\n const files = input.files;\n\n // 2. Case: User clicked 'Cancel' or no files selected\n // We update the form state (ngModel) but DO NOT emit the @Output() change\n if (!files?.length) {\n this._value = null;\n this.onChange(null);\n this.onTouched();\n return; // Exit without emitting change\n }\n\n const fileList = Array.from(files);\n\n // // 3. Case: File exceeds size limit\n // if (this.maxFileSizeKB != null) {\n // const maxBytes = this.maxFileSizeKB * 1024;\n // const oversized = fileList.filter((f) => f.size > maxBytes);\n\n // if (oversized.length > 0) {\n // this.error.emit(`File size exceeds ${this.maxFileSizeKB} KB limit.`);\n\n // // Reset internal state and form control\n // this._value = null;\n // this.onChange(null);\n // this.onTouched();\n\n // // Reset the physical input so the same file can be picked again later\n // input.value = '';\n\n // return; // Exit without emitting change\n // }\n // }\n\n // 4. Case: Valid selection\n const value = this.multi ? fileList : (fileList[0] ?? null);\n\n this._value = value;\n this.onChange(value); // Updates ngModel\n this.onTouched();\n\n // Only emit the custom @Output() now\n this.change.emit(event);\n }\n\n onCancel(): void {\n // Check if there is currently no file selected\n if (!this._value) {\n // Reset internal state and notify Angular Forms that the value is null\n this._value = null;\n this.onChange(null);\n\n // Mark the control as touched to trigger 'required' error visibility\n this.onTouched();\n\n // Force Angular to re-run the 'validate()' function immediately\n this._onValidatorChange?.();\n\n // Clear the native file input value to ensure the browser reset is in sync\n if (this.fileInputRef?.nativeElement) {\n this.fileInputRef.nativeElement.value = '';\n }\n\n // Clear any previous error messages (e.g., size limit errors)\n this.cancel.emit();\n }\n }\n\n onDragOver(event: DragEvent): void {\n if (this.disable) return;\n event.preventDefault();\n event.stopPropagation();\n }\n\n onDrop(event: DragEvent): void {\n if (this.disable) return;\n event.preventDefault();\n event.stopPropagation();\n const input = this.fileInputRef?.nativeElement;\n if (!input) return;\n const items = event.dataTransfer?.items;\n if (!items?.length) return;\n const files: File[] = [];\n for (let i = 0; i < items.length; i++) {\n const file = items[i].getAsFile();\n if (file) files.push(file);\n }\n if (files.length === 0) return;\n const dt = new DataTransfer();\n (this.multi ? files : [files[0]]).forEach((f) => dt.items.add(f));\n input.files = dt.files;\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n}\n","<div class=\"file-picker-wrapper\">\n <input\n #fileInput\n type=\"file\"\n [id]=\"id\"\n [name]=\"name\"\n [accept]=\"accept\"\n [multiple]=\"multi\"\n [disabled]=\"disable\"\n [required]=\"required\"\n class=\"file-picker__input\"\n (cancel)=\"onCancel()\"\n (change)=\"onFileChange($event)\"\n />\n\n <div\n class=\"file-picker\"\n [ngClass]=\"{\n 'file-picker--default': pickerState === 'default',\n 'file-picker--active': pickerState === 'active',\n 'file-picker--disabled': pickerState === 'disabled',\n 'file-picker-has-error': hasError\n }\"\n (click)=\"onContainerClick()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n [attr.aria-disabled]=\"disable\"\n tabindex=\"0\"\n>\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"file-picker__icon\">\n <rect\n x=\"3.57007\"\n y=\"3.56995\"\n width=\"40\"\n height=\"40\"\n rx=\"20\"\n [attr.fill]=\"pickerState === 'active' ? '#C7E2FF' : pickerState === 'disabled' ? '#F4F4F6' : '#F4F4F6'\"/>\n <rect\n x=\"3.57007\"\n y=\"3.56995\"\n width=\"40\"\n height=\"40\"\n rx=\"20\"\n [attr.stroke]=\"pickerState === 'active' ? '#E5F3FF' : pickerState === 'disabled' ? '#F9FAFA' : '#F9FAFA'\"\n stroke-width=\"7.14\"/>\n <g clip-path=\"url(#clip0_1_149094)\">\n <path\n d=\"M23.5702 20.2366V23.5699M23.5702 26.9032H23.5785M31.9035 23.5699C31.9035 28.1723 28.1725 31.9032 23.5702 31.9032C18.9678 31.9032 15.2368 28.1723 15.2368 23.5699C15.2368 18.9675 18.9678 15.2366 23.5702 15.2366C28.1725 15.2366 31.9035 18.9675 31.9035 23.5699Z\"\n [attr.stroke]=\"pickerState === 'active' ? '#1434CB' : pickerState === 'disabled' ? '#868997' : '#868997'\"\n stroke-width=\"1.66667\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1_149094\">\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13.5701 13.5699)\"/>\n </clipPath>\n </defs>\n </svg>\n <p\n class=\"file-picker__text-primary\"\n [ngClass]=\"{\n 'file-picker__text-primary--default': pickerState === 'default',\n 'file-picker__text-primary--active': pickerState === 'active',\n 'file-picker__text-primary--disabled': pickerState === 'disabled'\n }\">\n <span\n [ngClass]=\"{\n 'file-picker__text-primary-bold--default': pickerState === 'default',\n 'file-picker__text-primary-bold--active': pickerState === 'active',\n 'file-picker__text-primary-bold--disabled': pickerState === 'disabled'\n }\">Click to upload</span>{{draggable ? ' or drag and drop' : '' }}\n </p>\n <p\n class=\"file-picker__text-secondary\"\n [ngClass]=\"{\n 'file-picker__text-secondary--default': pickerState === 'default',\n 'file-picker__text-secondary--active': pickerState === 'active',\n 'file-picker__text-secondary--disabled': pickerState === 'disabled'\n }\">{{description}}</p>\n </div>\n\n @if (hasError) {\n @if (errorMessage) {\n <p class=\"file-picker-error\">{{ errorMessage }}</p>\n }\n }\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nexport type FileState = 'uploading' | 'uploaded' | 'failed';\r\n@Component({\r\n imports: [CommonModule,BKTooltipDirective],\r\n selector: 'bk-file-card',\r\n templateUrl: './file-card.html',\r\n styleUrl: './file-card.css',\r\n standalone: true\r\n})\r\nexport class BkFileCard implements OnInit {\r\n @Input() id: string ='';\r\n @Input() state: FileState = 'uploading';\r\n @Input() fileName: string = 'Tech design requirements.pdf';\r\n @Input() fileSize: string | null = '200 KB';\r\n @Input() progress: number = 65; // Progress percentage (0-100)\r\n @Input() errorMessage: string = 'Upload failed, please try again';\r\n @Output() remove = new EventEmitter<string>();\r\n\r\n /**\r\n *\r\n */\r\n constructor() {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n if(!this.id){\r\n this.id = crypto.randomUUID();\r\n }\r\n\r\n }\r\n onRemove() {\r\n this.remove.emit(this.id);\r\n }\r\n\r\n}\r\n","\r\n <div\r\n class=\"file-uploader\"\r\n [ngClass]=\"{\r\n 'file-uploader--uploading': state === 'uploading',\r\n 'file-uploader--uploaded': state === 'uploaded',\r\n 'file-uploader--failed': state === 'failed'\r\n }\">\r\n <!-- Icon Section -->\r\n <div class=\"file-uploader__icon-container\">\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 48 48\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"file-uploader__icon\">\r\n <rect\r\n x=\"3.57007\"\r\n y=\"3.56995\"\r\n width=\"40\"\r\n height=\"40\"\r\n rx=\"20\"\r\n [attr.fill]=\"state === 'uploading' ? '#C7E2FF' : state === 'uploaded' ? '#C7E2FF' : '#FECACA'\"/>\r\n <rect\r\n x=\"3.57007\"\r\n y=\"3.56995\"\r\n width=\"40\"\r\n height=\"40\"\r\n rx=\"20\"\r\n [attr.stroke]=\"state === 'uploading' ? '#E5F3FF' : state === 'uploaded' ? '#E5F3FF' : '#FEE2E2'\"\r\n stroke-width=\"7.14\"/>\r\n <g clip-path=\"url(#clip0_1_149094)\">\r\n <path\r\n d=\"M23.5702 20.2366V23.5699M23.5702 26.9032H23.5785M31.9035 23.5699C31.9035 28.1723 28.1725 31.9032 23.5702 31.9032C18.9678 31.9032 15.2368 28.1723 15.2368 23.5699C15.2368 18.9675 18.9678 15.2366 23.5702 15.2366C28.1725 15.2366 31.9035 18.9675 31.9035 23.5699Z\"\r\n [attr.stroke]=\"state === 'uploading' ? '#1434CB' : state === 'uploaded' ? '#1434CB' : '#EF4444'\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1_149094\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13.5701 13.5699)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n\r\n <!-- Content Section -->\r\n <div class=\"file-uploader__content\">\r\n <!-- Row 1: File Info + Delete -->\r\n <div class=\"file-uploader__row-1\">\r\n <div class=\"file-uploader__file-info\">\r\n <!-- Uploading State -->\r\n\r\n @if (state === 'uploading' || state === 'uploaded') {\r\n <ng-container>\r\n <span class=\"file-uploader__file-name\">{{ fileName }}</span>\r\n <span class=\"file-uploader__file-size\">{{ fileSize }}</span>\r\n </ng-container>\r\n }\r\n\r\n @if(state === 'failed'){\r\n <!-- Failed State -->\r\n <ng-container>\r\n <p class=\"file-uploader__error-message\">{{ errorMessage }}</p>\r\n <span class=\"file-uploader__file-name file-uploader__file-name--failed\">{{ fileName }}</span>\r\n <p class=\"file-uploader__error-message\">Try again</p>\r\n </ng-container>\r\n }\r\n </div>\r\n <img\r\n src=\"../../assets/icons/bin-gray.svg\"\r\n alt=\"Delete\"\r\n bkTooltip=\"Delete\"\r\n bkTooltipPosition=\"left\"\r\n class=\"file-uploader__delete-icon\"\r\n (click)=\"onRemove()\"\r\n >\r\n </div>\r\n\r\n <!-- Row 2: Progress Bar + Percentage -->\r\n <div class=\"file-uploader__row-2\">\r\n @if (state === 'uploading') {\r\n <!-- Uploading State -->\r\n <ng-container>\r\n <div class=\"file-uploader__progress-bar\">\r\n <div\r\n class=\"file-uploader__progress-fill\"\r\n [style.width.%]=\"progress\"></div>\r\n </div>\r\n <span class=\"file-uploader__progress-text\">{{ progress }}%</span>\r\n </ng-container>\r\n }\r\n @if(state === 'uploaded'){\r\n <!-- Uploaded State -->\r\n <ng-container>\r\n <div class=\"file-uploader__progress-bar\">\r\n <div class=\"file-uploader__progress-fill file-uploader__progress-fill--complete\"></div>\r\n </div>\r\n <img src=\"../../assets/icons/check-green.svg\" alt=\"\" class=\"file-uploader__checkmark\">\r\n </ng-container>\r\n }\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkSelect } from '../select/select';\r\nexport interface BkPageSize {\r\n key:number;\r\n value:number;\r\n}\r\n@Component({\r\n selector: 'bk-pagination',\r\n imports: [CommonModule,FormsModule,BkSelect],\r\n standalone:true,\r\n templateUrl: './pagination.html',\r\n styleUrl: './pagination.css',\r\n})\r\nexport class BkPagination implements OnChanges {\r\n\r\n @Input() public pageSize?: number = 10;\r\n @Input() public total?: number = 0;\r\n\r\n @Output() public changePageSize = new EventEmitter<number>();\r\n @Output() pageChanged: EventEmitter<number> = new EventEmitter();\r\n\r\n public pages: number[] = [];\r\n @Input() public activePage: number = 1;\r\n @Output() public activePageChange = new EventEmitter<number>();\r\n\r\n pager: number = 1;\r\n isMenuHovered = false;\r\n\r\n // ✅ Added\r\n startingPage:number = 0;\r\n endingPage: number = 0;\r\n pageSizesList:BkPageSize[] = [\r\n { key:25,value:25},\r\n { key:50,value:50},\r\n { key:75,value:75},\r\n { key:100,value:100},\r\n ];\r\n\r\n constructor() {\r\n const pageCount = this.getPageCount();\r\n this.pages = this.getArrayOfPage(pageCount);\r\n\r\n // ✅ Added\r\n this.updateStartEndPages();\r\n }\r\n\r\n ngOnChanges(): any {\r\n const pageCount = this.getPageCount();\r\n this.pages = this.getArrayOfPage(pageCount);\r\n\r\n if (this.activePage > pageCount) {\r\n this.activePage = pageCount || 1;\r\n this.activePageChange.emit(this.activePage);\r\n }\r\n\r\n if (this.activePage < 1) {\r\n this.activePage = 1;\r\n this.activePageChange.emit(this.activePage);\r\n }\r\n\r\n // ✅ Added\r\n this.updateStartEndPages();\r\n }\r\n\r\n getTotalPagesValue(){\r\n const totalPages = Math.ceil(this.total! / this.pageSize!);\r\n return totalPages;\r\n }\r\n\r\n // Visible window: startingPage/endingPage reflect the two page numbers shown in the control\r\n private updateStartEndPages(): void {\r\n const totalPages = this.getTotalPages();\r\n if (totalPages <= 0) {\r\n this.startingPage = 0;\r\n this.endingPage = 0;\r\n return;\r\n }\r\n if (totalPages === 1) {\r\n this.startingPage = 1;\r\n this.endingPage = 1;\r\n return;\r\n }\r\n this.startingPage = this.activePage;\r\n this.endingPage = Math.min(this.activePage + 1, totalPages);\r\n }\r\n\r\n private getPageCount(): number {\r\n let totalPage = 0;\r\n\r\n if (!!this.total && !!this.pageSize)\r\n if (this.total > 0 && this.pageSize > 0) {\r\n const pageCount = this.total / this.pageSize;\r\n const roundedPageCount = Math.floor(pageCount);\r\n totalPage = roundedPageCount < pageCount ? roundedPageCount + 1 : roundedPageCount;\r\n }\r\n\r\n return totalPage;\r\n }\r\n\r\n private getArrayOfPage(pageCount: number): number[] {\r\n const pageArray = [];\r\n if (pageCount > 0) {\r\n for (let i = 1; i <= pageCount; i++) pageArray.push(i);\r\n }\r\n return pageArray;\r\n }\r\n\r\n /** Returns exactly 2 visible page numbers: current and next (e.g. 1-2, then 2-3 on click of 2). */\r\n paginate(): number[] {\r\n const totalPages = this.getTotalPages();\r\n if (totalPages <= 0) return [];\r\n if (totalPages === 1) return [1];\r\n const start = this.activePage;\r\n const end = Math.min(this.activePage + 1, totalPages);\r\n return this.pages.slice(start - 1, end);\r\n }\r\n\r\n onClickPage(pageNumber: number): void {\r\n if (this.activePage !== pageNumber) {\r\n if (pageNumber >= 1 && pageNumber <= this.pages.length) {\r\n this.activePage = pageNumber;\r\n this.updateStartEndPages();\r\n this.pageChanged.emit(this.activePage);\r\n }\r\n }\r\n }\r\n\r\n changeSize(event: any) {\r\n this.activePage = 1;\r\n this.activePageChange.emit(this.activePage);\r\n this.changePageSize.emit(this.pageSize);\r\n\r\n // ✅ Recalculate pages on size change\r\n const pageCount = this.getPageCount();\r\n this.pages = this.getArrayOfPage(pageCount);\r\n this.updateStartEndPages();\r\n }\r\n\r\n get startIndex(): number {\r\n if (!this.total || this.total === 0) return 0;\r\n return (this.activePage - 1) * this.pageSize! + 1;\r\n }\r\n\r\n get endIndex(): number {\r\n if (!this.total || this.total === 0) return 0;\r\n const end = this.activePage * this.pageSize!;\r\n return end > this.total ? this.total : end;\r\n }\r\n\r\n get totalItems(): number {\r\n return this.total || 0;\r\n }\r\n\r\n // ✅ Added getTotalPages()\r\n getTotalPages(): number {\r\n return this.getPageCount();\r\n }\r\n\r\n}\r\n","<div class=\"md:px-4 px-2 md:py-3 py-2 border-t border-[#EBEDF3] rounded-b-xl\">\r\n <div class=\"flex flex-row items-center justify-between md:gap-3 gap-1\">\r\n\r\n <!-- Page size dropdown -->\r\n\r\n\r\n <div class=\"flex gap-3 items-center pagination\">\r\n <p class=\"text-xs text-[#141414] font-medium md:block hidden\">Rows per page</p>\r\n <bk-select\r\n [items]=\"pageSizesList\"\r\n [searchable]=\"false\"\r\n bindLabel=\"key\"\r\n bindValue=\"value\"\r\n [clearable]=\"false\"\r\n [(ngModel)]=\"pageSize\"\r\n [dropdownPosition]=\"'top'\"\r\n (change)=\"changeSize($event)\"\r\n [variation]=\"'sm'\"\r\n [isResponsive]=\"false\"\r\n class=\"!min-w-[90px] lg:!min-w-[131px]\"\r\n >\r\n </bk-select>\r\n </div>\r\n\r\n <!-- showing entries -->\r\n <p class=\"text-xs text-[#141414] font-medium md:block hidden\">\r\n Showing <span>{{ startIndex }}</span> to\r\n <span>{{ endIndex > totalItems ? totalItems : endIndex }}</span> of\r\n <span>{{ totalItems }}</span> Records\r\n </p>\r\n\r\n <!-- Pagination main -->\r\n <nav class=\"flex gap-1.5 items-center\">\r\n\r\n <!-- Page count (optional like DoPlanar top numbers) -->\r\n <p class=\"text-xs text-[#141414] font-medium md:block hidden\">\r\n <span>{{ startingPage || 0 }}</span> -\r\n <span>{{ endingPage || 0 }}</span> of\r\n <span>{{ getTotalPages() || 0 }}</span>\r\n </p>\r\n\r\n\r\n <!-- Page count (optional like DoPlanar top numbers) mobile version -->\r\n <p class=\"text-xs text-[#141414] font-medium md:hidden block\">\r\n <span>{{ startingPage || 0 }}</span> -\r\n <span>{{ endingPage || 0 }}</span> of\r\n <span>{{ getTotalPages() || 0 }}</span>\r\n </p>\r\n\r\n <ul class=\"flex items-center space-x-1 text-[13px] text-[#B9BBC6]\">\r\n\r\n <!-- Previous -->\r\n <li class=\"md:block hidden\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(1)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === 1}\"\r\n >\r\n @if(activePage === 1){\r\n <img\r\n src=\"../../assets/icons/arrow-left-double-gray.svg\"\r\n alt=\"Left Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== 1){\r\n <img\r\n src=\"../../assets/icons/arrow-left-double-black.svg\"\r\n alt=\"Left Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n <!-- Previous -->\r\n <li>\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(activePage - 1)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === 1}\"\r\n >\r\n @if(activePage === 1){\r\n <img\r\n src=\"../../assets/icons/pagination-left-gray.svg\"\r\n alt=\"Left Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== 1){\r\n <img\r\n src=\"../../assets/icons/pagination-left-black.svg\"\r\n alt=\"Left Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n\r\n <!-- Page Numbers -->\r\n <li *ngFor=\"let item of paginate()\">\r\n <a\r\n (click)=\"onClickPage(item)\"\r\n href=\"javascript:void(0)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 leading-6 rounded-lg\"\r\n [ngClass]=\"item === activePage\r\n ? 'text-[#15191E] bg-[#F8F8FA] hover:bg-[#F8F8FA]'\r\n : 'hover:bg-[#F8F8FA] hover:text-[#15191E]'\">\r\n {{ item }}\r\n </a>\r\n </li>\r\n\r\n <!-- Next -->\r\n <li>\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(activePage + 1)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === getTotalPages()}\"\r\n >\r\n @if(activePage === getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/pagination-right-gray.svg\"\r\n alt=\"Right Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/pagination-right-black.svg\"\r\n alt=\"Right Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n <!-- next double arrow -->\r\n <li class=\"md:block hidden\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(getTotalPages())\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === getTotalPages()}\"\r\n >\r\n @if(activePage === getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/arrow-right-double-gray.svg\"\r\n alt=\"Right Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/arrow-right-double-black.svg\"\r\n alt=\"Right Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n</div>\r\n","\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nexport type BkLoaderVariant = 'dots' | 'spinners';\r\n\r\n@Component({\r\n selector: 'bk-loader',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './loader.html',\r\n styleUrl: './loader.css',\r\n})\r\nexport class BkLoader {\r\n @Input() loading = false;\r\n @Input() variant: BkLoaderVariant = 'dots';\r\n frontAfter = false;\r\n constructor() {\r\n const duration = 2000;\r\n const pause = 500;\r\n\r\n setInterval(() => {\r\n setTimeout(() => (this.frontAfter = !this.frontAfter), pause);\r\n }, duration + pause);\r\n }\r\n}\r\n"," @if (loading) {\r\n <div\r\n class=\"lg:h-[calc(100vh-80px)] lg:w-[calc(100vw-79px)] h-[calc(100vh-76px)] w-[calc(100vw-33px)] top-[59px] lg:left-[58px] left-[17px] right-0 bottom-6 bg-[#00000047] backdrop-blur-[2px] flex justify-center flex-col gap-4 items-center fixed z-[99999] rounded-xl\"\r\n >\r\n @switch (variant) {\r\n @case ('dots') {\r\n <div class=\"grid-loader\" [class.front-after]=\"frontAfter\">\r\n <div class=\"grid-circle grid-filled\"></div>\r\n <div class=\"grid-circle grid-outline\"></div>\r\n </div>\r\n }\r\n\r\n @case ('spinners') {\r\n <div class=\"grid-spinner\"></div>\r\n }\r\n }\r\n </div>\r\n }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nexport type DropdownVariant = 'black' | 'white';\r\nexport type DropdownSize = 'sm' | 'md' | 'lg';\r\nexport type DropdownTrigger = 'click' | 'hover';\r\nexport type DropdownPlacement =\r\n | 'bottomLeft' | 'bottom' | 'bottomRight'\r\n | 'topLeft' | 'top' | 'topRight';\r\n\r\nexport interface DropdownItem {\r\n id?: string | number;\r\n label?: string;\r\n icon?: string; // optional leading icon (image src)\r\n disabled?: boolean;\r\n divider?: boolean; // render a divider line (label ignored)\r\n children?: DropdownItem[]; // submenu items → cascading menu\r\n}\r\n@Component({\r\n selector: 'bk-dropdown',\r\n\r\n imports: [CommonModule],\r\n standalone: true,\r\n templateUrl: './dropdown.html',\r\n styleUrl: './dropdown.css',\r\n})\r\nexport class BkDropdown {\r\n /** Text shown on the trigger button. */\r\n @Input() label: string = '';\r\n /** Menu items (supports divider / disabled / children). */\r\n @Input() items: DropdownItem[] = [];\r\n /** Black (dark) or white (light, bordered) — mirrors the segment-tab look. */\r\n @Input() variant: DropdownVariant = 'black';\r\n /** Trigger size. */\r\n @Input() size: DropdownSize = 'md';\r\n /** Open on click or on hover. */\r\n @Input() trigger: DropdownTrigger = 'click';\r\n /** One of 6 placements for the menu. */\r\n @Input() placement: DropdownPlacement = 'bottomLeft';\r\n /** Show the caret (▾) on the trigger. Rotates when open. */\r\n @Input() arrow: boolean = true;\r\n /** Split button: a primary action + a separate caret that opens the menu. */\r\n @Input() splitButton: boolean = false;\r\n /** Currently selected item id — the matching item shows a tick. */\r\n @Input() selectedId?: string | number;\r\n /** Disable the whole control. */\r\n @Input() disabled: boolean = false;\r\n /** Optional leading icon on the trigger. */\r\n @Input() iconSrc?: string;\r\n /** Extra classes appended to the trigger button. */\r\n @Input() customClass: string = '';\r\n\r\n /** Emits when a (non-disabled) leaf item is chosen. */\r\n @Output() select = new EventEmitter<DropdownItem>();\r\n /** Emits the open/closed state whenever it changes. */\r\n @Output() openChange = new EventEmitter<boolean>();\r\n /** Split button primary-action click. */\r\n @Output() buttonClick = new EventEmitter<Event>();\r\n\r\n open = false;\r\n private closeTimer: any = null;\r\n\r\n constructor(private readonly host: ElementRef<HTMLElement>) { }\r\n\r\n // ---- open/close ----------------------------------------------------------\r\n\r\n toggle(): void {\r\n if (this.disabled) return;\r\n this.setOpen(!this.open);\r\n }\r\n\r\n onPrimaryClick(event: Event): void {\r\n if (this.disabled) return;\r\n this.buttonClick.emit(event);\r\n }\r\n\r\n selectItem(item: DropdownItem, event: Event): void {\r\n if (item.disabled) return;\r\n // Parents with children act as submenu toggles, not selections.\r\n if (item.children?.length) {\r\n event.stopPropagation();\r\n return;\r\n }\r\n this.selectedId = item.id;\r\n this.select.emit(item);\r\n this.setOpen(false);\r\n }\r\n\r\n isSelected(item: DropdownItem): boolean {\r\n return item.id != null && item.id === this.selectedId;\r\n }\r\n\r\n // Only scroll flat menus — a scroll container would clip cascading submenus\r\n // (overflow-y:auto forces overflow-x to clip too).\r\n get hasSubmenus(): boolean {\r\n return this.items.some(i => !!i.children?.length);\r\n }\r\n\r\n private setOpen(value: boolean): void {\r\n if (this.open === value) return;\r\n this.open = value;\r\n this.openChange.emit(value);\r\n }\r\n\r\n // ---- hover trigger -------------------------------------------------------\r\n\r\n onHoverEnter(): void {\r\n if (this.trigger !== 'hover' || this.disabled) return;\r\n this.clearCloseTimer();\r\n this.setOpen(true);\r\n }\r\n\r\n onHoverLeave(): void {\r\n if (this.trigger !== 'hover') return;\r\n // small delay so moving across the gap to the menu doesn't close it\r\n this.clearCloseTimer();\r\n this.closeTimer = setTimeout(() => this.setOpen(false), 120);\r\n }\r\n\r\n // ---- cascading submenu flip ----------------------------------------------\r\n\r\n /**\r\n * When a parent item is hovered, decide whether its submenu should open to\r\n * the right (default) or flip to the left if it would overflow the viewport.\r\n */\r\n onSubmenuEnter(event: MouseEvent): void {\r\n const li = event.currentTarget as HTMLElement;\r\n const submenu = li.querySelector(':scope > .bk-dd-submenu') as HTMLElement | null;\r\n if (!submenu) return;\r\n\r\n const parentRect = li.getBoundingClientRect();\r\n const submenuWidth = submenu.offsetWidth || 160; // min-w-[10rem] fallback\r\n const spaceOnRight = window.innerWidth - parentRect.right;\r\n const flipLeft = spaceOnRight < submenuWidth + 8;\r\n\r\n li.classList.toggle('bk-dd-submenu--flip', flipLeft);\r\n }\r\n\r\n private clearCloseTimer(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n // ---- global listeners ----------------------------------------------------\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.open && !this.host.nativeElement.contains(event.target as Node)) {\r\n this.setOpen(false);\r\n }\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.open) this.setOpen(false);\r\n }\r\n\r\n // ---- class helpers -------------------------------------------------------\r\n\r\n get triggerClasses(): string {\r\n return [\r\n 'bk-dd-trigger',\r\n `bk-dd-trigger--${this.variant}`,\r\n `bk-dd-trigger--${this.size}`,\r\n this.customClass,\r\n ].join(' ').trim();\r\n }\r\n\r\n get caretSizeClass(): string {\r\n return this.size === 'sm' ? 'size-3' : this.size === 'lg' ? 'size-5' : 'size-4';\r\n }\r\n\r\n /** Position classes for the menu panel per placement. */\r\n get menuPositionClass(): string {\r\n switch (this.placement) {\r\n case 'bottomLeft': return 'top-full left-0 mt-1';\r\n case 'bottom': return 'top-full left-1/2 -translate-x-1/2 mt-1';\r\n case 'bottomRight': return 'top-full right-0 mt-1';\r\n case 'topLeft': return 'bottom-full left-0 mb-1';\r\n case 'top': return 'bottom-full left-1/2 -translate-x-1/2 mb-1';\r\n case 'topRight': return 'bottom-full right-0 mb-1';\r\n }\r\n }\r\n}\r\n","<div class=\"bk-dd\" [class.bk-dd--open]=\"open\" (mouseenter)=\"onHoverEnter()\" (mouseleave)=\"onHoverLeave()\">\r\n\r\n <!-- ============ Trigger ============ -->\r\n @if (splitButton) {\r\n <!-- Button with dropdown menu (split button) -->\r\n <div class=\"bk-dd-split\" [class.bk-dd-split--disabled]=\"disabled\">\r\n <button type=\"button\" [class]=\"triggerClasses\" class=\"bk-dd-split-main\" [disabled]=\"disabled\"\r\n (click)=\"onPrimaryClick($event)\">\r\n @if (iconSrc) { <img [src]=\"iconSrc\" alt=\"\" class=\"shrink-0 size-4\" /> }\r\n <span class=\"bk-dd-label\">{{ label }}</span>\r\n </button>\r\n <button type=\"button\" [class]=\"triggerClasses\" class=\"bk-dd-split-caret\" [disabled]=\"disabled\"\r\n [attr.aria-haspopup]=\"'menu'\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">\r\n <svg class=\"bk-dd-caret shrink-0\" [ngClass]=\"caretSizeClass\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n } @else {\r\n <button type=\"button\" [class]=\"triggerClasses\" [class.bk-dd-trigger--disabled]=\"disabled\" [disabled]=\"disabled\"\r\n [attr.aria-haspopup]=\"'menu'\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">\r\n @if (iconSrc) { <img [src]=\"iconSrc\" alt=\"\" class=\"shrink-0 size-4\" /> }\r\n <span class=\"bk-dd-label\">{{ label }}</span>\r\n @if (arrow) {\r\n <svg class=\"bk-dd-caret shrink-0\" [ngClass]=\"caretSizeClass\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n }\r\n\r\n <!-- ============ Menu ============ -->\r\n @if (open) {\r\n <div class=\"bk-dd-menu\" [ngClass]=\"menuPositionClass\" role=\"menu\">\r\n <ul class=\"bk-dd-list\" [class.bk-dd-list--scroll]=\"!hasSubmenus\">\r\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: items }\"></ng-container>\r\n </ul>\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- Recursive menu template (used for the root list and every submenu) -->\r\n<ng-template #menuList let-list>\r\n @for (item of list; track $index) {\r\n @if (item.divider) {\r\n <li class=\"bk-dd-divider\" role=\"separator\"></li>\r\n } @else {\r\n <li class=\"bk-dd-li\" [class.bk-dd-li--parent]=\"item.children?.length\" (mouseenter)=\"onSubmenuEnter($event)\"\r\n role=\"none\">\r\n <button type=\"button\" role=\"menuitem\" class=\"bk-dd-item\" [class.bk-dd-item--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\" (click)=\"selectItem(item, $event)\">\r\n @if (item.icon) { <img [src]=\"item.icon\" alt=\"\" class=\"shrink-0 size-4\" /> }\r\n <span class=\"bk-dd-item-label\">{{ item.label }}</span>\r\n @if (item.children?.length) {\r\n <svg class=\"bk-dd-item-caret shrink-0 size-3.5\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n } @else if (isSelected(item)) {\r\n <svg class=\"bk-dd-check shrink-0 size-4\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\">\r\n <path d=\"M3.5 8.5l3 3 6-6.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (item.children?.length) {\r\n <ul class=\"bk-dd-submenu\">\r\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: item.children }\"></ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n }\r\n</ng-template>","import { Component, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type MenuOrientation = 'horizontal' | 'vertical';\r\nexport type MenuSubmenuMode = 'inline' | 'popup';\r\n\r\nexport interface MenuItem {\r\n /** Unique id — matched against `activeItemId`. */\r\n id: string;\r\n /** Visible menu text. */\r\n label: string;\r\n /** Optional icon URL (tinted to the theme unless `tintIcons` is false). */\r\n icon?: string;\r\n /** Alt text for the icon; defaults to `label`. */\r\n iconAlt?: string;\r\n /** Disables just this item (and blocks opening its submenu). */\r\n disabled?: boolean;\r\n /** Nested items — presence of children turns this into an expandable node. */\r\n children?: MenuItem[];\r\n}\r\n\r\n/**\r\n * A simple, responsive navigation menu. Styled to match the default `bk-tabs`\r\n * theme (dark active pill, light hover).\r\n *\r\n * - Orientation: `vertical` (stacked) / `horizontal` (menubar row).\r\n * - Items with `children` are expandable, shown with a chevron that rotates\r\n * open/closed.\r\n * - Submenus render inline (accordion) or as pop-ups. Pop-ups adapt to the\r\n * orientation: they drop *below* a horizontal top-level item and fly out to\r\n * the *right* for vertical menus / deeper levels.\r\n */\r\n\r\n@Component({\r\n selector: 'bk-menu',\r\n imports: [CommonModule],\r\n templateUrl: './menu.html',\r\n styleUrl: './menu.css',\r\n})\r\nexport class BkMenu {\r\n @Input() items: MenuItem[] = [];\r\n @Input() orientation: MenuOrientation = 'vertical';\r\n @Input() submenuMode: MenuSubmenuMode = 'inline';\r\n /**\r\n * Keep only one submenu open per level: opening a parent collapses its\r\n * siblings (and their descendants) so the menu stays compact. Pop-up mode\r\n * always behaves this way; this input adds it to inline (accordion) mode.\r\n */\r\n @Input() singleOpen: boolean = false;\r\n /** Id of the currently selected leaf item. Two-way bindable. */\r\n @Input() activeItemId: string = '';\r\n /** Tint item icons: dark by default, white on the active (dark) row. */\r\n @Input() tintIcons: boolean = true;\r\n /**\r\n * Optional max height for the menu (e.g. '320px', '60vh', or a number of px).\r\n * When set, the item list scrolls vertically once it exceeds this height.\r\n * Pop-up fly-outs are positioned `fixed`, so they still escape the scroll box.\r\n */\r\n @Input() maxHeight: string | number | null = null;\r\n\r\n @Output() activeItemIdChange = new EventEmitter<string>();\r\n @Output() itemClick = new EventEmitter<MenuItem>();\r\n\r\n /** Ids of currently expanded/opened parent nodes. */\r\n private readonly openIds = new Set<string>();\r\n\r\n /** Viewport coordinates for each open fixed-position fly-out, keyed by id. */\r\n readonly popupPos = new Map<string, { top: number; left: number }>();\r\n\r\n constructor(private readonly host: ElementRef<HTMLElement>) {}\r\n\r\n get isVertical(): boolean { return this.orientation === 'vertical'; }\r\n get isPopup(): boolean { return this.submenuMode === 'popup'; }\r\n\r\n // CSS max-height value for the scroll container (accepts px number or string).\r\n get maxHeightStyle(): string | null {\r\n if (this.maxHeight == null) return null;\r\n return typeof this.maxHeight === 'number' ? `${this.maxHeight}px` : this.maxHeight;\r\n }\r\n\r\n // Fixed-position coordinates for an open fly-out (or null when not open/popup).\r\n popupTop(item: MenuItem): number | null {\r\n return this.isPopup ? (this.popupPos.get(item.id)?.top ?? null) : null;\r\n }\r\n popupLeft(item: MenuItem): number | null {\r\n return this.isPopup ? (this.popupPos.get(item.id)?.left ?? null) : null;\r\n }\r\n\r\n hasChildren(item: MenuItem): boolean {\r\n return !!item.children && item.children.length > 0;\r\n }\r\n\r\n isOpen(item: MenuItem): boolean {\r\n return this.openIds.has(item.id);\r\n }\r\n\r\n isActive(item: MenuItem): boolean {\r\n return this.activeItemId === item.id;\r\n }\r\n\r\n // True when the active leaf lives somewhere inside this item's subtree, so a\r\n // parent shows the active state even after its pop-up closes.\r\n isActiveAncestor(item: MenuItem): boolean {\r\n return !!item.children && item.children.some(\r\n child => child.id === this.activeItemId || this.isActiveAncestor(child),\r\n );\r\n }\r\n\r\n // Highlight = the item itself is active. In pop-up mode a parent also lights\r\n // up when one of its descendants is active (so the section stays marked after\r\n // the fly-out closes); inline mode highlights the selected leaf only.\r\n isHighlighted(item: MenuItem): boolean {\r\n return this.isActive(item) || (this.isPopup && this.isActiveAncestor(item));\r\n }\r\n\r\n // Left indent for inline nested items (vertical only).\r\n inlineIndent(level: number): number | null {\r\n return this.isVertical && !this.isPopup ? 16 + level * 16 : null;\r\n }\r\n\r\n // Handle a click on any menu button.\r\n // Leaves select + emit. Parents toggle in inline mode; in pop-up mode they\r\n // are opened by hover, so a click on a parent does nothing.\r\n onItemClick(item: MenuItem, siblings: MenuItem[], event: Event): void {\r\n event.stopPropagation();\r\n if (item.disabled) return;\r\n\r\n if (this.hasChildren(item)) {\r\n if (!this.isPopup) this.toggle(item, siblings);\r\n return;\r\n }\r\n\r\n this.activeItemId = item.id;\r\n this.activeItemIdChange.emit(item.id);\r\n this.itemClick.emit(item);\r\n if (this.isPopup) this.openIds.clear(); // dismiss pop-ups after picking a leaf\r\n }\r\n\r\n // Pop-up mode: open a parent's fly-out on hover (and close its siblings).\r\n onItemEnter(item: MenuItem, siblings: MenuItem[], event: MouseEvent, level: number): void {\r\n if (!this.isPopup || item.disabled || !this.hasChildren(item)) return;\r\n for (const sibling of siblings) {\r\n if (sibling.id !== item.id) this.closeBranch(sibling);\r\n }\r\n this.openIds.add(item.id);\r\n\r\n const li = event.currentTarget as HTMLElement;\r\n const trigger = (li.querySelector(':scope > .bk-menu__button') as HTMLElement) ?? li;\r\n const rect = trigger.getBoundingClientRect();\r\n const flyRight = this.isVertical || level > 0;\r\n // First pass with an estimated size, then refine once the panel has rendered\r\n // so we can flip/clamp against the real viewport edges.\r\n this.popupPos.set(item.id, this.computePopupPos(rect, flyRight, null));\r\n requestAnimationFrame(() => {\r\n if (!this.openIds.has(item.id)) return;\r\n const panel = li.querySelector(':scope > .bk-menu__submenu') as HTMLElement | null;\r\n if (!panel) return;\r\n this.popupPos.set(item.id, this.computePopupPos(\r\n rect, flyRight, { w: panel.offsetWidth, h: panel.offsetHeight },\r\n ));\r\n });\r\n }\r\n\r\n // Compute a fixed-position for a fly-out, flipping/clamping to stay on-screen.\r\n private computePopupPos(\r\n rect: DOMRect, flyRight: boolean, size: { w: number; h: number } | null,\r\n ): { top: number; left: number } {\r\n const gap = 4;\r\n const pad = 8;\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n const w = size?.w ?? 220;\r\n const h = size?.h ?? 0;\r\n\r\n let left: number;\r\n let top: number;\r\n if (flyRight) {\r\n left = rect.right + gap;\r\n if (left + w > vw - pad) left = rect.left - w - gap; // flip to the left\r\n top = rect.top;\r\n } else {\r\n top = rect.bottom + gap;\r\n left = rect.left;\r\n if (left + w > vw - pad) left = Math.max(pad, vw - pad - w);\r\n }\r\n if (left < pad) left = pad;\r\n if (h && top + h > vh - pad) top = Math.max(pad, vh - pad - h);\r\n return { top, left };\r\n }\r\n\r\n // Pop-up mode: close the fly-out (and any nested ones) when the pointer leaves.\r\n onItemLeave(item: MenuItem): void {\r\n if (!this.isPopup || !this.hasChildren(item)) return;\r\n this.closeBranch(item);\r\n }\r\n\r\n private toggle(item: MenuItem, siblings: MenuItem[]): void {\r\n const wasOpen = this.openIds.has(item.id);\r\n if (this.isPopup || this.singleOpen) {\r\n // Keep a single open branch per level — collapse siblings (and their\r\n // descendants) first so the menu stays compact.\r\n for (const sibling of siblings) this.closeBranch(sibling);\r\n }\r\n if (wasOpen) this.closeBranch(item);\r\n else this.openIds.add(item.id);\r\n }\r\n\r\n // Remove an item and all of its descendants from the open set.\r\n private closeBranch(item: MenuItem): void {\r\n this.openIds.delete(item.id);\r\n this.popupPos.delete(item.id);\r\n item.children?.forEach(child => this.closeBranch(child));\r\n }\r\n\r\n // Pop-up mode: click outside the menu closes any open fly-outs.\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.isPopup && !this.host.nativeElement.contains(event.target as Node)) {\r\n this.openIds.clear();\r\n this.popupPos.clear();\r\n }\r\n }\r\n\r\n // Positions become stale on scroll/resize — close fly-outs to avoid drift.\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n onViewportChange(): void {\r\n if (this.isPopup && this.openIds.size) {\r\n this.openIds.clear();\r\n this.popupPos.clear();\r\n }\r\n }\r\n}\r\n\r\n\r\n","<nav\r\n class=\"bk-menu\"\r\n [class.bk-menu--vertical]=\"isVertical\"\r\n [class.bk-menu--horizontal]=\"!isVertical\"\r\n [class.bk-menu--popup]=\"isPopup\"\r\n [class.bk-menu--tint]=\"tintIcons\"\r\n role=\"menubar\"\r\n [attr.aria-orientation]=\"orientation\">\r\n <ul\r\n class=\"bk-menu__list\"\r\n [class.bk-menu__list--scroll]=\"maxHeightStyle\"\r\n [style.maxHeight]=\"maxHeightStyle\">\r\n <ng-container *ngTemplateOutlet=\"itemTpl; context: { $implicit: items, level: 0 }\"></ng-container>\r\n </ul>\r\n</nav>\r\n\r\n<!-- Recursive item renderer. Context: $implicit = items at this level, level = depth. -->\r\n<ng-template #itemTpl let-items let-level=\"level\">\r\n @for (item of items; track item.id) {\r\n <li\r\n class=\"bk-menu__item\"\r\n [class.bk-menu__item--has-children]=\"hasChildren(item)\"\r\n [class.bk-menu__item--open]=\"isOpen(item)\"\r\n (mouseenter)=\"onItemEnter(item, items, $event, level)\"\r\n (mouseleave)=\"onItemLeave(item)\"\r\n role=\"none\">\r\n <button\r\n type=\"button\"\r\n class=\"bk-menu__button\"\r\n [class.bk-menu__button--active]=\"isHighlighted(item)\"\r\n [class.bk-menu__button--disabled]=\"item.disabled\"\r\n [class.bk-menu__button--parent]=\"hasChildren(item)\"\r\n [style.paddingLeft.px]=\"inlineIndent(level)\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-haspopup]=\"hasChildren(item) ? 'true' : null\"\r\n [attr.aria-expanded]=\"hasChildren(item) ? isOpen(item) : null\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item, items, $event)\">\r\n @if (item.icon) {\r\n <img class=\"bk-menu__icon\" [attr.src]=\"item.icon\" [alt]=\"item.iconAlt || item.label\" />\r\n }\r\n <span class=\"bk-menu__label\">{{ item.label }}</span>\r\n @if (hasChildren(item)) {\r\n <svg\r\n class=\"bk-menu__chevron\"\r\n [class.bk-menu__chevron--open]=\"!isPopup && isOpen(item)\"\r\n [class.bk-menu__chevron--right]=\"isPopup && (isVertical || level > 0)\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"16\"\r\n height=\"16\"\r\n fill=\"none\"\r\n aria-hidden=\"true\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (hasChildren(item)) {\r\n <ul\r\n class=\"bk-menu__submenu\"\r\n [class.bk-menu__submenu--inline]=\"!isPopup\"\r\n [class.bk-menu__submenu--popup]=\"isPopup\"\r\n [class.bk-menu__submenu--open]=\"isOpen(item)\"\r\n [class.bk-menu__submenu--popup-right]=\"isPopup && (isVertical || level > 0)\"\r\n [class.bk-menu__submenu--popup-down]=\"isPopup && !isVertical && level === 0\"\r\n [style.top.px]=\"popupTop(item)\"\r\n [style.left.px]=\"popupLeft(item)\"\r\n role=\"menu\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl; context: { $implicit: item.children, level: level + 1 }\">\r\n </ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n","/* =========================================================================\r\n Placement maths for bk-popover: turns an anchor rectangle plus a requested\r\n placement into viewport coordinates for the panel and its arrow.\r\n\r\n Kept free of the DOM so the rules stay readable and testable — the component\r\n measures, this decides.\r\n ========================================================================= */\r\n\r\n/** Which edge of the anchor the panel sits against. */\r\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\r\n\r\n/**\r\n * How the panel lines up along the side it sits on, in terms of that side's\r\n * cross axis. Internal: the public placements name the edge instead (see\r\n * PopoverPlacement), but every measurement below is axis-relative, so `start`\r\n * meaning \"left on a horizontal axis, top on a vertical one\" is what keeps the\r\n * maths from needing a switch on the side at every step.\r\n */\r\nexport type PopoverAlign = 'start' | 'center' | 'end';\r\n\r\n/**\r\n * The 12 placements: four sides x three alignments. A bare side (`top`) centres\r\n * the panel on the trigger; the suffixed forms name the edge the panel lines up\r\n * against, so the axis is always concrete — `top-left` aligns left edges, while\r\n * `left-top` aligns top edges. There is no `left-left`: alignment on the left\r\n * and right sides runs vertically.\r\n */\r\nexport type PopoverPlacement =\r\n | 'top' | 'top-left' | 'top-right'\r\n | 'bottom' | 'bottom-left' | 'bottom-right'\r\n | 'left' | 'left-top' | 'left-bottom'\r\n | 'right' | 'right-top' | 'right-bottom';\r\n\r\n/** Every placement, in the order a placement picker should show them. */\r\nexport const POPOVER_PLACEMENTS: readonly PopoverPlacement[] = [\r\n 'top-left', 'top', 'top-right',\r\n 'right-top', 'right', 'right-bottom',\r\n 'bottom-left', 'bottom', 'bottom-right',\r\n 'left-top', 'left', 'left-bottom'\r\n];\r\n\r\nexport interface Rect { top: number; left: number; width: number; height: number; }\r\nexport interface Size { width: number; height: number; }\r\n\r\nexport interface PopoverPositionOptions {\r\n /** Gap between the anchor and the panel, in px. */\r\n offset: number;\r\n /** Smallest gap to leave between the panel and the viewport edge, in px. */\r\n viewportPadding: number;\r\n /** Edge length of the (unrotated) arrow square, in px. */\r\n arrowSize: number;\r\n /** Whether a panel that doesn't fit may move to the opposite side. */\r\n flip: boolean;\r\n viewport: Size;\r\n}\r\n\r\nexport interface PopoverPosition {\r\n /** Viewport coordinates for the panel (it is positioned `fixed`). */\r\n top: number;\r\n left: number;\r\n /** Where the panel actually landed — not necessarily what was requested. */\r\n side: PopoverSide;\r\n align: PopoverAlign;\r\n placement: PopoverPlacement;\r\n /**\r\n * Distance from the panel's leading edge to the arrow's centre, along the\r\n * panel's cross axis (x for top/bottom, y for left/right).\r\n */\r\n arrowOffset: number;\r\n}\r\n\r\nconst OPPOSITE: Record<PopoverSide, PopoverSide> = {\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left'\r\n};\r\n\r\n/**\r\n * How close the arrow's centre may get to a panel corner. The panel is rounded,\r\n * so an arrow any nearer would grow out of the curve instead of a flat edge.\r\n */\r\nconst ARROW_CORNER_GAP = 14;\r\n\r\n/**\r\n * The edge each side's alignment words refer to. Top and bottom align across the\r\n * x axis, so their words are left/right; left and right align across y, so\r\n * theirs are top/bottom.\r\n */\r\nconst ALIGN_EDGES: Record<PopoverSide, { start: string; end: string }> = {\r\n top: { start: 'left', end: 'right' },\r\n bottom: { start: 'left', end: 'right' },\r\n left: { start: 'top', end: 'bottom' },\r\n right: { start: 'top', end: 'bottom' }\r\n};\r\n\r\n/** `top-left` → side `top`, align `start`. A bare side means centred. */\r\nexport function splitPlacement(placement: PopoverPlacement): { side: PopoverSide; align: PopoverAlign } {\r\n const [side, edge] = placement.split('-') as [PopoverSide, string | undefined];\r\n if (!edge) return { side, align: 'center' };\r\n return { side, align: edge === ALIGN_EDGES[side].start ? 'start' : 'end' };\r\n}\r\n\r\n/**\r\n * Inverse of splitPlacement — centred placements lose the suffix. Safe to call\r\n * after a flip: flipping only ever swaps a side for its opposite, which shares\r\n * the same cross axis, so the alignment word stays meaningful.\r\n */\r\nexport function joinPlacement(side: PopoverSide, align: PopoverAlign): PopoverPlacement {\r\n if (align === 'center') return side;\r\n return `${side}-${ALIGN_EDGES[side][align]}` as PopoverPlacement;\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n // min wins when the range is inverted (panel larger than the viewport), which\r\n // keeps the panel's leading edge on screen rather than its trailing one.\r\n return Math.max(min, Math.min(value, max));\r\n}\r\n\r\n/** Does the panel clear the viewport edge on this side of the anchor? */\r\nfunction fitsOnSide(\r\n side: PopoverSide,\r\n anchor: Rect,\r\n panel: Size,\r\n { offset, viewportPadding: pad, viewport }: PopoverPositionOptions\r\n): boolean {\r\n switch (side) {\r\n case 'top':\r\n return anchor.top - offset - panel.height >= pad;\r\n case 'bottom':\r\n return anchor.top + anchor.height + offset + panel.height <= viewport.height - pad;\r\n case 'left':\r\n return anchor.left - offset - panel.width >= pad;\r\n case 'right':\r\n return anchor.left + anchor.width + offset + panel.width <= viewport.width - pad;\r\n }\r\n}\r\n\r\n/** Leading edge of the panel along the cross axis, before any clamping. */\r\nfunction alignedStart(align: PopoverAlign, anchorStart: number, anchorSize: number, panelSize: number): number {\r\n switch (align) {\r\n case 'start':\r\n return anchorStart;\r\n case 'end':\r\n return anchorStart + anchorSize - panelSize;\r\n case 'center':\r\n return anchorStart + anchorSize / 2 - panelSize / 2;\r\n }\r\n}\r\n\r\n/**\r\n * Places the panel against the anchor, then keeps it on screen in two ways:\r\n *\r\n * - flip: a panel with no room on the requested side moves to the opposite one,\r\n * but only if it actually fits there — flipping into a second bad fit just\r\n * trades one clipped edge for another.\r\n * - shift: the panel slides along its cross axis to stay inside the viewport.\r\n * The arrow is measured against the *anchor*, not the panel, so it keeps\r\n * pointing at the trigger however far the panel had to slide.\r\n */\r\nexport function computePopoverPosition(\r\n anchor: Rect,\r\n panel: Size,\r\n placement: PopoverPlacement,\r\n options: PopoverPositionOptions\r\n): PopoverPosition {\r\n const { offset, viewportPadding: pad, arrowSize, flip, viewport } = options;\r\n let { side, align } = splitPlacement(placement);\r\n\r\n if (flip && !fitsOnSide(side, anchor, panel, options) && fitsOnSide(OPPOSITE[side], anchor, panel, options)) {\r\n side = OPPOSITE[side];\r\n }\r\n\r\n const vertical = side === 'top' || side === 'bottom';\r\n let top: number;\r\n let left: number;\r\n\r\n if (vertical) {\r\n top = side === 'top'\r\n ? anchor.top - panel.height - offset\r\n : anchor.top + anchor.height + offset;\r\n left = clamp(\r\n alignedStart(align, anchor.left, anchor.width, panel.width),\r\n pad,\r\n viewport.width - panel.width - pad\r\n );\r\n } else {\r\n left = side === 'left'\r\n ? anchor.left - panel.width - offset\r\n : anchor.left + anchor.width + offset;\r\n top = clamp(\r\n alignedStart(align, anchor.top, anchor.height, panel.height),\r\n pad,\r\n viewport.height - panel.height - pad\r\n );\r\n }\r\n\r\n const anchorCentre = vertical\r\n ? anchor.left + anchor.width / 2\r\n : anchor.top + anchor.height / 2;\r\n const panelStart = vertical ? left : top;\r\n const panelSize = vertical ? panel.width : panel.height;\r\n const arrowLimit = arrowSize / 2 + ARROW_CORNER_GAP;\r\n\r\n return {\r\n top,\r\n left,\r\n side,\r\n align,\r\n placement: joinPlacement(side, align),\r\n arrowOffset: clamp(anchorCentre - panelStart, arrowLimit, panelSize - arrowLimit)\r\n };\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n OnDestroy,\r\n ViewChild,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PopoverPlacement, PopoverPosition, splitPlacement, computePopoverPosition } from '../shared/utilities/popover-position';\r\n\r\n\r\n/** Edge length of the arrow square. Mirrored by --bk-popover-arrow in popover.css. */\r\nconst ARROW_SIZE = 10;\r\n\r\n@Component({\r\n selector: 'bk-popover',\r\n standalone: true,\r\n // exportAs lets a template grab the instance (#pop=\"bkPopover\") to drive it\r\n // imperatively — open()/close()/toggle() — or to read activePlacement().\r\n exportAs: 'bkPopover',\r\n imports: [CommonModule],\r\n templateUrl: './popover.html',\r\n styleUrls: ['./popover.css'],\r\n host: {\r\n // A static `title=\"…\"` lands on the input *and* stays on the host as a real\r\n // HTML attribute, which the browser would render as its own native tooltip\r\n // over the trigger. Stripping it here means the input can keep the obvious\r\n // name without consumers having to remember to bind it.\r\n '[attr.title]': 'null'\r\n }\r\n})\r\nexport class BkPopover implements AfterViewInit, OnDestroy {\r\n /**\r\n * One of the 12 placements (`top-left`, `right`, `bottom-right`, …). It is a\r\n * preference, not a guarantee: a panel with no room moves to the opposite\r\n * side (unless `flip` is off) and slides along the edge to stay on screen.\r\n * Read `activePlacement()` for where it actually landed.\r\n */\r\n placement = input<PopoverPlacement>('bottom');\r\n\r\n /**\r\n * `click` toggles and stays open until dismissed — the right choice for\r\n * anything interactive. `hover` opens on the way in and closes on the way\r\n * out, with a grace period so the pointer can travel into the panel.\r\n */\r\n trigger = input<'click' | 'hover'>('click');\r\n\r\n /** Optional heading. Empty hides the header row entirely. */\r\n title = input<string>('');\r\n\r\n /** Show the × in the header. Ignored without a `title` to put it in. */\r\n closable = input<boolean>(false);\r\n\r\n disabled = input<boolean>(false);\r\n showArrow = input<boolean>(true);\r\n\r\n /** Gap between the trigger and the panel, in px. The arrow spans most of it. */\r\n offset = input<number>(8);\r\n\r\n /** Allow moving to the opposite side when the requested one has no room. */\r\n flip = input<boolean>(true);\r\n\r\n closeOnClickOutside = input<boolean>(true);\r\n closeOnEscape = input<boolean>(true);\r\n\r\n /** Hover only: ms before opening / before closing once the pointer leaves.\r\n * The close delay is what makes the panel reachable — drop it to 0 and the\r\n * panel disappears as the pointer crosses the gap. */\r\n openDelay = input<number>(80);\r\n closeDelay = input<number>(150);\r\n\r\n maxWidth = input<string>('280px');\r\n panelClass = input<string>('');\r\n\r\n /**\r\n * Relocate the panel to <body> while open. `position: fixed` alone resolves\r\n * against a transformed ancestor rather than the viewport, so a popover\r\n * inside an animated dialog or a transformed card needs this to escape.\r\n */\r\n appendToBody = input<boolean>(false);\r\n\r\n opened = output<void>();\r\n closed = output<void>();\r\n openChange = output<boolean>();\r\n\r\n @ViewChild('anchor') anchorRef!: ElementRef<HTMLElement>;\r\n @ViewChild('panel') panelRef?: ElementRef<HTMLElement>;\r\n\r\n private static activeInstance: BkPopover | null = null;\r\n private readonly host = inject(ElementRef);\r\n\r\n isOpen = signal(false);\r\n\r\n /**\r\n * Null until the panel has been measured. The template keeps the panel\r\n * hidden while it is null: the first frame exists only to measure, and\r\n * showing it at 0,0 first would flash it in the corner.\r\n */\r\n position = signal<PopoverPosition | null>(null);\r\n\r\n /** Where the panel actually is, once positioned — may differ from `placement`. */\r\n activePlacement = computed<PopoverPlacement>(() => this.position()?.placement ?? this.placement());\r\n\r\n /** Side the panel sits on. Drives which edge the arrow hangs off (see CSS). */\r\n side = computed(() => this.position()?.side ?? splitPlacement(this.placement()).side);\r\n\r\n private openTimer: any = null;\r\n private closeTimer: any = null;\r\n private pointerInPanel = false;\r\n private resizeObserver?: ResizeObserver;\r\n\r\n // Panel's home in the DOM, so appendToBody can put it back before Angular's\r\n // @if removes it.\r\n private originalPanelParent: Node | null = null;\r\n private originalPanelAnchor: Node | null = null;\r\n private panelInBody = false;\r\n\r\n ngAfterViewInit(): void {\r\n // Capture phase catches scrolling inside nested overflow containers, which\r\n // a window:scroll listener would miss entirely.\r\n window.addEventListener('scroll', this.reposition, true);\r\n window.addEventListener('resize', this.reposition);\r\n\r\n // Content can change size while open (async data, an expanding section),\r\n // which moves every edge the panel is aligned against.\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(() => this.measure());\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearTimers();\r\n this.resizeObserver?.disconnect();\r\n document.removeEventListener('click', this.onDocumentClick);\r\n window.removeEventListener('scroll', this.reposition, true);\r\n window.removeEventListener('resize', this.reposition);\r\n // Don't leave a relocated panel orphaned in <body> if we're torn down open.\r\n if (this.panelInBody) {\r\n this.panelRef?.nativeElement.remove();\r\n this.panelInBody = false;\r\n }\r\n if (BkPopover.activeInstance === this) BkPopover.activeInstance = null;\r\n }\r\n\r\n // --- Public API ---\r\n\r\n open(): void {\r\n if (this.isOpen() || this.disabled()) return;\r\n\r\n // Two popovers open at once is nearly always an accident of a missed close.\r\n if (BkPopover.activeInstance && BkPopover.activeInstance !== this) {\r\n BkPopover.activeInstance.close();\r\n }\r\n BkPopover.activeInstance = this;\r\n\r\n this.clearTimers();\r\n this.position.set(null);\r\n this.isOpen.set(true);\r\n this.opened.emit();\r\n this.openChange.emit(true);\r\n\r\n // The panel doesn't exist until Angular renders it, and it can't be\r\n // measured before it does — so position on the next tick.\r\n setTimeout(() => {\r\n if (!this.isOpen()) return;\r\n if (this.appendToBody()) this.movePanelToBody();\r\n this.measure();\r\n if (this.panelRef) this.resizeObserver?.observe(this.panelRef.nativeElement);\r\n // Attached here, not on the host, so the very click that opened the panel\r\n // has finished bubbling first — otherwise a popover opened by anything\r\n // outside its own trigger (a toolbar button calling open()) would be shut\r\n // again by its own opening click.\r\n document.addEventListener('click', this.onDocumentClick);\r\n });\r\n }\r\n\r\n close(): void {\r\n if (!this.isOpen()) return;\r\n this.clearTimers();\r\n this.resizeObserver?.disconnect();\r\n document.removeEventListener('click', this.onDocumentClick);\r\n this.restorePanel();\r\n this.isOpen.set(false);\r\n this.position.set(null);\r\n this.pointerInPanel = false;\r\n this.closed.emit();\r\n this.openChange.emit(false);\r\n if (BkPopover.activeInstance === this) BkPopover.activeInstance = null;\r\n }\r\n\r\n toggle(): void {\r\n this.isOpen() ? this.close() : this.open();\r\n }\r\n\r\n // --- Trigger handling ---\r\n\r\n onAnchorClick(): void {\r\n if (this.trigger() !== 'click' || this.disabled()) return;\r\n this.toggle();\r\n }\r\n\r\n onAnchorEnter(): void {\r\n if (this.trigger() !== 'hover' || this.disabled()) return;\r\n this.cancelClose();\r\n this.openTimer = setTimeout(() => this.open(), this.openDelay());\r\n }\r\n\r\n onAnchorLeave(): void {\r\n if (this.trigger() !== 'hover') return;\r\n this.cancelOpen();\r\n this.scheduleClose();\r\n }\r\n\r\n onPanelEnter(): void {\r\n if (this.trigger() !== 'hover') return;\r\n this.pointerInPanel = true;\r\n this.cancelClose();\r\n }\r\n\r\n onPanelLeave(): void {\r\n if (this.trigger() !== 'hover') return;\r\n this.pointerInPanel = false;\r\n this.scheduleClose();\r\n }\r\n\r\n /** Only attached while open — see open(). Arrow fn so it can be removed. */\r\n private onDocumentClick = (event: Event) => {\r\n if (this.trigger() !== 'click' || !this.closeOnClickOutside()) return;\r\n const target = event.target as Node;\r\n if (this.host.nativeElement.contains(target)) return;\r\n // appendToBody moves the panel out of the host, so clicking inside it would\r\n // otherwise read as an outside click.\r\n if (this.panelRef?.nativeElement.contains(target)) return;\r\n this.close();\r\n };\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.isOpen() && this.closeOnEscape()) this.close();\r\n }\r\n\r\n // --- Positioning ---\r\n\r\n private reposition = () => {\r\n if (this.isOpen()) this.measure();\r\n };\r\n\r\n /** Measures the anchor and panel, then hands the maths to the utility. */\r\n private measure(): void {\r\n const anchor = this.anchorRef?.nativeElement;\r\n const panel = this.panelRef?.nativeElement;\r\n if (!anchor || !panel) return;\r\n\r\n const anchorRect = anchor.getBoundingClientRect();\r\n this.position.set(\r\n computePopoverPosition(\r\n {\r\n top: anchorRect.top,\r\n left: anchorRect.left,\r\n width: anchorRect.width,\r\n height: anchorRect.height\r\n },\r\n { width: panel.offsetWidth, height: panel.offsetHeight },\r\n this.placement(),\r\n {\r\n offset: this.offset(),\r\n viewportPadding: 8,\r\n arrowSize: ARROW_SIZE,\r\n flip: this.flip(),\r\n viewport: { width: window.innerWidth, height: window.innerHeight }\r\n }\r\n )\r\n );\r\n }\r\n\r\n /** Arrow offset along the panel's cross axis — x on top/bottom, y on left/right. */\r\n arrowLeft = computed<number | null>(() => {\r\n const pos = this.position();\r\n if (!pos) return null;\r\n return pos.side === 'top' || pos.side === 'bottom' ? pos.arrowOffset : null;\r\n });\r\n\r\n arrowTop = computed<number | null>(() => {\r\n const pos = this.position();\r\n if (!pos) return null;\r\n return pos.side === 'left' || pos.side === 'right' ? pos.arrowOffset : null;\r\n });\r\n\r\n private movePanelToBody(): void {\r\n const panel = this.panelRef?.nativeElement;\r\n if (!panel || this.panelInBody) return;\r\n this.originalPanelParent = panel.parentNode;\r\n this.originalPanelAnchor = panel.nextSibling;\r\n document.body.appendChild(panel);\r\n this.panelInBody = true;\r\n }\r\n\r\n private restorePanel(): void {\r\n const panel = this.panelRef?.nativeElement;\r\n if (!panel || !this.panelInBody) return;\r\n this.originalPanelParent?.insertBefore(panel, this.originalPanelAnchor);\r\n this.panelInBody = false;\r\n this.originalPanelParent = null;\r\n this.originalPanelAnchor = null;\r\n }\r\n\r\n // --- Timers ---\r\n\r\n private scheduleClose(): void {\r\n this.cancelClose();\r\n this.closeTimer = setTimeout(() => {\r\n if (!this.pointerInPanel) this.close();\r\n }, this.closeDelay());\r\n }\r\n\r\n private cancelOpen(): void {\r\n if (this.openTimer) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = null;\r\n }\r\n }\r\n\r\n private cancelClose(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n private clearTimers(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n }\r\n}\r\n","<!-- The anchor wraps the projected trigger so the popover has an element to\r\n measure and to listen on, whatever the consumer passes in. -->\r\n<span\r\n #anchor\r\n class=\"bk-popover-anchor\"\r\n (click)=\"onAnchorClick()\"\r\n (mouseenter)=\"onAnchorEnter()\"\r\n (mouseleave)=\"onAnchorLeave()\"\r\n>\r\n <ng-content select=\"[bkPopoverTrigger]\"></ng-content>\r\n</span>\r\n\r\n@if (isOpen()) {\r\n <!-- Hidden until position() lands: the first frame exists only so the panel\r\n can be measured, and painting it at 0,0 first flashes it in the corner. -->\r\n <div\r\n #panel\r\n class=\"bk-popover-panel\"\r\n [ngClass]=\"panelClass()\"\r\n role=\"dialog\"\r\n [attr.data-side]=\"side()\"\r\n [style.top.px]=\"position()?.top\"\r\n [style.left.px]=\"position()?.left\"\r\n [style.maxWidth]=\"maxWidth()\"\r\n [class.bk-popover-ready]=\"!!position()\"\r\n (mouseenter)=\"onPanelEnter()\"\r\n (mouseleave)=\"onPanelLeave()\"\r\n >\r\n @if (showArrow()) {\r\n <!-- A rotated square, not a border triangle: it inherits the panel's\r\n background and border, so the tip matches the panel on every side.\r\n Sits above the panel's own border, hiding the segment it crosses. -->\r\n <span\r\n class=\"bk-popover-arrow\"\r\n [style.left.px]=\"arrowLeft()\"\r\n [style.top.px]=\"arrowTop()\"\r\n ></span>\r\n }\r\n\r\n @if (title()) {\r\n <div class=\"bk-popover-header\">\r\n <span class=\"bk-popover-title\">{{ title() }}</span>\r\n @if (closable()) {\r\n <button type=\"button\" class=\"bk-popover-close\" aria-label=\"Close\" (click)=\"close()\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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 </div>\r\n }\r\n\r\n <div class=\"bk-popover-body\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AvatarSize, AvatarVariant, BkAvatar, DotPosition, DotStatus } from '../ui-avatar/ui-avatar';\r\n\r\n\r\n/** One entry in a stacked avatar group. Mirrors the display inputs of bk-avatar. */\r\nexport interface AvatarGroupItem {\r\n src?: string | null;\r\n name?: string;\r\n initialsOverride?: string;\r\n alt?: string;\r\n tooltipContent?: string | string[] | null;\r\n bgColor?: string | null;\r\n textColor?: string | null;\r\n variant?: AvatarVariant;\r\n dot?: DotStatus;\r\n dotPosition?: DotPosition;\r\n}\r\n\r\n/**\r\n * A stacked (\"avatar list\") group. Renders a set of overlapping `bk-avatar`s and\r\n * collapses any beyond `max` into a `+N` bubble whose tooltip lists the hidden\r\n * names. Uses bk-avatar for every slot, so image/initials/icon fallback, sizing\r\n * and status dots all come for free.\r\n */\r\n@Component({\r\n selector: 'bk-avatar-group',\r\n standalone: true,\r\n imports: [CommonModule, BkAvatar],\r\n templateUrl: './ui-avatar-group.html',\r\n styleUrls: ['./ui-avatar-group.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BkAvatarGroup {\r\n /** The people to stack. */\r\n @Input() avatars: AvatarGroupItem[] = [];\r\n /** Shared size for every avatar in the group. */\r\n @Input() size: AvatarSize = 'md';\r\n /** Max avatars shown before collapsing the rest into a +N bubble. */\r\n @Input() max = 3;\r\n /** Default variant for items that don't set their own. */\r\n @Input() variant: AvatarVariant = 'gray';\r\n /** Show the +N overflow bubble (otherwise extra avatars are just hidden). */\r\n @Input() showOverflow = true;\r\n\r\n get visibleAvatars(): AvatarGroupItem[] {\r\n return this.avatars.slice(0, this.max);\r\n }\r\n\r\n get overflowCount(): number {\r\n return Math.max(0, this.avatars.length - this.max);\r\n }\r\n\r\n get overflowLabel(): string {\r\n return `+${this.overflowCount}`;\r\n }\r\n\r\n /** Names of the hidden avatars, for the +N tooltip. */\r\n get overflowTooltip(): string {\r\n return this.avatars\r\n .slice(this.max)\r\n .map(a => a.name?.trim())\r\n .filter((n): n is string => !!n)\r\n .join(', ');\r\n }\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div class=\"bk-avatar-group\" [ngClass]=\"size\">\r\n @for (item of visibleAvatars; track trackByIndex($index)) {\r\n <span class=\"bk-avatar-group__item\">\r\n <bk-avatar\r\n [src]=\"item.src ?? null\"\r\n [name]=\"item.name ?? ''\"\r\n [initialsOverride]=\"item.initialsOverride ?? ''\"\r\n [alt]=\"item.alt ?? 'Avatar'\"\r\n [tooltipContent]=\"item.tooltipContent ?? null\"\r\n [bgColor]=\"item.bgColor ?? null\"\r\n [textColor]=\"item.textColor ?? null\"\r\n [size]=\"size\"\r\n [variant]=\"item.variant ?? variant\"\r\n [dot]=\"item.dot ?? 'none'\"\r\n [dotPosition]=\"item.dotPosition ?? 'bottom-right'\"\r\n ></bk-avatar>\r\n </span>\r\n }\r\n\r\n @if (showOverflow && overflowCount > 0) {\r\n <span class=\"bk-avatar-group__item bk-avatar-group__item--overflow\">\r\n <bk-avatar\r\n [name]=\"overflowLabel\"\r\n [initialsOverride]=\"overflowLabel\"\r\n [tooltipContent]=\"overflowTooltip\"\r\n [size]=\"size\"\r\n variant=\"gray\"\r\n bgColor=\"#F3F4F6\"\r\n textColor=\"#4A5565\"\r\n ></bk-avatar>\r\n </span>\r\n }\r\n</div>\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 { BkDialogService } from './lib/dialog/dialog.service';\r\nexport { BkDialogRef } from './lib/dialog/dialog-ref';\r\nexport { BK_DIALOG_DATA, BK_DIALOG_GLOBAL_CONFIG } from './lib/dialog/dialog.tokens';\r\nexport type { BkDialogConfig, BkDialogPosition, BkDialogAnimation } from './lib/dialog/dialog-config';\r\nexport { BK_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 { BkAnimationKeyframes } 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\r\n//Avatar Profile\r\nexport * from './lib/avatar-profile/avatar-profile';\r\n//Hierarchical Select\r\nexport * from './lib/hierarchical-select/hierarchical-select';\r\n//Toastr\r\nexport * from './lib/toastr/toastr';\r\nexport * from './lib/toastr/toastr.service';\r\n\r\n// UI Avatar\r\nexport * from './lib/ui-avatar/ui-avatar';\r\n//Column Select\r\nexport * from './lib/column-select/components/column-select/column-select';\r\nexport * from './lib/column-select/models/column-filter-option';\r\nexport * from './lib/column-select/service/column-filter.service';\r\n//File Picker & Card\r\nexport * from './lib/file-picker/file-picker';\r\nexport * from './lib/file-card/file-card';\r\n//Pagination\r\nexport * from './lib/pagination/pagination';\r\n//Loader\r\nexport * from './lib/loader/loader';\r\n//Dropdown\r\nexport * from './lib/dropdown/dropdown';\r\n//Menu\r\nexport * from './lib/menu/menu';\r\n//Popover\r\nexport * from './lib/popover/popover';\r\n//Color Appearance\r\nexport * from './lib/shared/utilities/color-appearance';\r\n//Popover Position\r\nexport * from './lib/shared/utilities/popover-position';\r\n//Avatar Group\r\nexport * from './lib/ui-avatar-group/ui-avatar-group';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.BkCalendarManagerService","i2","i1","i3","CDK_DIALOG_DATA","CdkDialogModule","i1.BkColumnFilterService"],"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/ui-avatar/ui-avatar.ts","../../../projects/brickclay-lib/src/lib/ui-avatar/ui-avatar.html","../../../projects/brickclay-lib/src/lib/shared/utilities/color-appearance.ts","../../../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/lib/avatar-profile/avatar-profile.ts","../../../projects/brickclay-lib/src/lib/avatar-profile/avatar-profile.html","../../../projects/brickclay-lib/src/lib/hierarchical-select/hierarchical-select.ts","../../../projects/brickclay-lib/src/lib/hierarchical-select/hierarchical-select.html","../../../projects/brickclay-lib/src/lib/toastr/toastr.service.ts","../../../projects/brickclay-lib/src/lib/toastr/toastr.ts","../../../projects/brickclay-lib/src/lib/toastr/toastr.html","../../../projects/brickclay-lib/src/lib/column-select/models/column-filter-option.ts","../../../projects/brickclay-lib/src/lib/column-select/service/column-filter.service.ts","../../../projects/brickclay-lib/src/lib/column-select/components/column-select/column-select.ts","../../../projects/brickclay-lib/src/lib/column-select/components/column-select/column-select.html","../../../projects/brickclay-lib/src/lib/file-picker/file-picker.ts","../../../projects/brickclay-lib/src/lib/file-picker/file-picker.html","../../../projects/brickclay-lib/src/lib/file-card/file-card.ts","../../../projects/brickclay-lib/src/lib/file-card/file-card.html","../../../projects/brickclay-lib/src/lib/pagination/pagination.ts","../../../projects/brickclay-lib/src/lib/pagination/pagination.html","../../../projects/brickclay-lib/src/lib/loader/loader.ts","../../../projects/brickclay-lib/src/lib/loader/loader.html","../../../projects/brickclay-lib/src/lib/dropdown/dropdown.ts","../../../projects/brickclay-lib/src/lib/dropdown/dropdown.html","../../../projects/brickclay-lib/src/lib/menu/menu.ts","../../../projects/brickclay-lib/src/lib/menu/menu.html","../../../projects/brickclay-lib/src/lib/shared/utilities/popover-position.ts","../../../projects/brickclay-lib/src/lib/popover/popover.ts","../../../projects/brickclay-lib/src/lib/popover/popover.html","../../../projects/brickclay-lib/src/lib/ui-avatar-group/ui-avatar-group.ts","../../../projects/brickclay-lib/src/lib/ui-avatar-group/ui-avatar-group.html","../../../projects/brickclay-lib/src/lib/table/table.model.ts","../../../projects/brickclay-lib/src/lib/table/table.ts","../../../projects/brickclay-lib/src/lib/table/table.html","../../../projects/brickclay-lib/src/lib/table/table-cell-base.ts","../../../projects/brickclay-lib/src/lib/table/table-th.ts","../../../projects/brickclay-lib/src/lib/table/table-th.html","../../../projects/brickclay-lib/src/lib/table/table-td.ts","../../../projects/brickclay-lib/src/lib/table/table-td.html","../../../projects/brickclay-lib/src/lib/table/table-row.ts","../../../projects/brickclay-lib/src/lib/table/table-drag.ts","../../../projects/brickclay-lib/src/lib/table/table-drag-handle.ts","../../../projects/brickclay-lib/src/lib/table/table-tree-drag.ts","../../../projects/brickclay-lib/src/lib/table/index.ts","../../../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/custom-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, OnDestroy, AfterViewInit, ViewChild, ElementRef, HostListener, SimpleChanges, forwardRef, Renderer2 } 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-time-picker',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './time-picker.component.html',\r\n styleUrls: ['./time-picker.component.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkTimePicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkTimePicker implements OnInit, OnChanges, OnDestroy, AfterViewInit, ControlValueAccessor {\r\n\r\n @Input() required: boolean = false;\r\n\r\n /** @deprecated Prefer [(ngModel)] */\r\n @Input() value: string | null = null;\r\n\r\n @Input() label: string = '';\r\n @Input() placeholder: string = 'Select time';\r\n @Input() clearable = false;\r\n @Input() position: 'left' | 'right' = 'left';\r\n @Input() variation: 'default' | 'lg' = 'default';\r\n @Input() pickerId: string = '';\r\n @Input() closePicker: number = 0;\r\n @Input() timeFormat: 12 | 24 = 12;\r\n @Input() showSeconds = false;\r\n /** When true, auto-flip the dropdown above/below and left/right based on available viewport space. */\r\n @Input() autoPosition = false;\r\n /** When true, position the dropdown with `fixed` so it escapes ancestor overflow (dialogs, scroll containers),\r\n * follows the trigger on scroll, and closes when the trigger is scrolled out of view. */\r\n @Input() appendToBody = false;\r\n\r\n @Output() change = new EventEmitter<string | null>();\r\n @Output() timeChange = new EventEmitter<string | null>();\r\n @Output() pickerOpened = new EventEmitter<string>();\r\n @Output() pickerClosed = new EventEmitter<string>();\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n @Input() disabled:boolean = false;\r\n\r\n @ViewChild('hourScroll') hourScrollEl?: ElementRef<HTMLElement>;\r\n @ViewChild('minuteScroll') minuteScrollEl?: ElementRef<HTMLElement>;\r\n @ViewChild('secondScroll') secondScrollEl?: ElementRef<HTMLElement>;\r\n\r\n /** The positioned trigger (its rect anchors the dropdown). */\r\n @ViewChild('tpWrapper') tpWrapper?: ElementRef<HTMLElement>;\r\n /** The dropdown panel element (measured for flip decisions). */\r\n @ViewChild('tpDropdown') tpDropdown?: ElementRef<HTMLElement>;\r\n\r\n /** Resolved placement state, driven by updatePosition(). */\r\n placeAbove = false;\r\n resolvedPosition: 'left' | 'right' = 'left';\r\n dropdownStyle: Record<string, string> = {};\r\n\r\n /** Row height in px. MUST match the .time-item height in CSS for the active variation. */\r\n private get ITEM_HEIGHT(): number {\r\n return this.variation === 'lg' ? 32 : 28;\r\n }\r\n\r\n /** Finite lists (no cyclic loop) — same as the hours column, so 00..59 has a hard start/end. */\r\n minutes: number[] = Array.from({ length: 60 }, (_, i) => i);\r\n seconds: number[] = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n showPicker = false;\r\n currentHour = 12;\r\n currentMinute = 0;\r\n currentSecond = 0;\r\n currentAMPM = 'PM';\r\n\r\n /**\r\n * Highlight that follows a column while scrolling. It is purely visual: scrolling moves it\r\n * but does NOT commit the value. The value is only selected/committed when the user clicks\r\n * an item (see onHourChange / onMinuteChange / onSecondChange).\r\n */\r\n activeHour = 12;\r\n activeMinute = 0;\r\n activeSecond = 0;\r\n\r\n private _modelValue: string | null = null;\r\n\r\n brickclayIcons = BrickclayIcons;\r\n\r\n constructor(private renderer: Renderer2) {}\r\n\r\n /* ---------------- appendToBody dropdown relocation ---------------- */\r\n\r\n /**\r\n * `appendToBody` anchors the dropdown with `position: fixed`, which only tracks the viewport when\r\n * NO ancestor establishes a containing block (transform / filter / perspective / will-change /\r\n * contain / backdrop-filter). Inside such an ancestor the fixed coordinates resolve against that\r\n * ancestor instead and the dropdown drifts off-position. To be robust we physically move the panel\r\n * to <body> while open (Angular keeps managing it by reference) and move it back before *ngIf\r\n * tears it down. The panel carries a `tp-compact` self-class so its `default`-variation sizing —\r\n * otherwise scoped under the `.time-input-group.default` ancestor it just left — still applies.\r\n */\r\n private dropdownMovedToBody = false;\r\n private dropdownOriginalParent: HTMLElement | null = null;\r\n\r\n private moveDropdownToBody(): void {\r\n const el = this.tpDropdown?.nativeElement;\r\n if (!el || this.dropdownMovedToBody) return;\r\n this.dropdownOriginalParent = el.parentElement;\r\n this.renderer.appendChild(document.body, el);\r\n this.dropdownMovedToBody = true;\r\n }\r\n\r\n /** Return the dropdown to its original slot so *ngIf can destroy it cleanly (safe to call twice). */\r\n private restoreDropdownFromBody(): void {\r\n if (!this.dropdownMovedToBody) return;\r\n const el = this.tpDropdown?.nativeElement;\r\n if (el && this.dropdownOriginalParent) {\r\n this.renderer.appendChild(this.dropdownOriginalParent, el);\r\n }\r\n this.dropdownMovedToBody = false;\r\n this.dropdownOriginalParent = null;\r\n }\r\n\r\n /* ---------------- CVA ---------------- */\r\n\r\n writeValue(value: string | null): void {\r\n\r\n if (!value) {\r\n this._modelValue = null;\r\n this.setDefaultsForDropdown();\r\n return;\r\n }\r\n\r\n this._modelValue = value;\r\n this.parseTimeValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): 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 /* ---------------- Display ---------------- */\r\n\r\n getDisplayValue(): string {\r\n\r\n if (!this._modelValue) return '';\r\n\r\n return this.formatTimeFromComponents(\r\n this.currentHour,\r\n this.currentMinute,\r\n this.currentSecond,\r\n this.currentAMPM\r\n );\r\n }\r\n\r\n get hasValue(): boolean {\r\n return !!this._modelValue;\r\n }\r\n\r\n /* ---------------- Defaults ---------------- */\r\n\r\n private setDefaultsForDropdown(): void {\r\n\r\n if (this.timeFormat === 24) {\r\n this.currentHour = 0;\r\n } else {\r\n this.currentHour = 12;\r\n this.currentAMPM = 'PM';\r\n }\r\n\r\n this.currentMinute = 0;\r\n this.currentSecond = 0;\r\n this.activeHour = this.currentHour;\r\n this.activeMinute = 0;\r\n this.activeSecond = 0;\r\n }\r\n\r\n clear(): void {\r\n\r\n this._modelValue = null;\r\n this.value = null;\r\n\r\n this.setDefaultsForDropdown();\r\n\r\n this.onChange(null);\r\n this.change.emit(null);\r\n this.timeChange.emit(null);\r\n\r\n this.markAsTouched();\r\n }\r\n\r\n markAsTouched(): void {\r\n this.onTouched();\r\n }\r\n\r\n /* ---------------- Lifecycle ---------------- */\r\n\r\n ngOnInit() {\r\n this.parseTimeValue(this._modelValue ?? this.value);\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n if (this.showPicker) {\r\n setTimeout(() => this.scrollToSelectedTimes(), 100);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes['value'] && !this._modelValue) {\r\n this.parseTimeValue(this.value);\r\n }\r\n\r\n if (changes['closePicker'] && this.showPicker) {\r\n\r\n const newCounter = changes['closePicker'].currentValue;\r\n\r\n if (newCounter > this.previousCloseCounter) {\r\n this.dismiss();\r\n this.previousCloseCounter = newCounter;\r\n }\r\n }\r\n }\r\n\r\n /* ---------------- Parse Logic ---------------- */\r\n\r\n parseTimeValue(timeStr?: string | null) {\r\n\r\n const str = timeStr ?? this._modelValue ?? this.value ?? '';\r\n\r\n if (!str) {\r\n this._modelValue = null;\r\n this.setDefaultsForDropdown();\r\n return;\r\n }\r\n\r\n this._modelValue = str;\r\n\r\n const parsed = this.parseTimeStringToComponents(str);\r\n\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 // Scroll highlight starts on the committed value.\r\n this.activeHour = parsed.hour;\r\n this.activeMinute = parsed.minute;\r\n this.activeSecond = parsed.second;\r\n }\r\n\r\n parseTimeStringToComponents(timeStr: string) {\r\n\r\n const parts = timeStr.trim().split(' ');\r\n const timePart = parts[0];\r\n let ampm = (parts[1] || '').toUpperCase();\r\n\r\n const [h, m, s] = timePart.split(':');\r\n\r\n let hour = parseInt(h || '0', 10);\r\n const minute = parseInt(m || '0', 10);\r\n const second = parseInt(s || '0', 10);\r\n\r\n if (this.timeFormat === 24) {\r\n\r\n return {\r\n hour: Math.min(Math.max(hour, 0), 23),\r\n minute: Math.min(Math.max(minute, 0), 59),\r\n second: Math.min(Math.max(second, 0), 59),\r\n ampm: ''\r\n };\r\n }\r\n\r\n if (!ampm) {\r\n\r\n if (hour >= 12) {\r\n ampm = 'PM';\r\n if (hour > 12) hour -= 12;\r\n } else {\r\n ampm = 'AM';\r\n if (hour === 0) hour = 12;\r\n }\r\n }\r\n\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,\r\n second,\r\n ampm\r\n };\r\n }\r\n\r\n formatTimeFromComponents(hour: number, minute: number, second: number, ampm: string): string {\r\n\r\n const hStr = hour.toString().padStart(2, '0');\r\n const mStr = minute.toString().padStart(2, '0');\r\n const sStr = second.toString().padStart(2, '0');\r\n\r\n if (this.timeFormat === 24) {\r\n return this.showSeconds ? `${hStr}:${mStr}:${sStr}` : `${hStr}:${mStr}`;\r\n }\r\n\r\n return this.showSeconds\r\n ? `${hour}:${mStr}:${sStr} ${ampm}`\r\n : `${hour}:${mStr} ${ampm}`;\r\n }\r\n\r\n /* ---------------- Picker ---------------- */\r\n\r\n togglePicker() {\r\n\r\n if (!this.showPicker) {\r\n\r\n this.showPicker = true;\r\n\r\n this.parseTimeValue(this._modelValue);\r\n\r\n this.pickerOpened.emit(this.pickerId);\r\n\r\n if (this.autoPosition || this.appendToBody) {\r\n this.attachViewportListeners();\r\n // Measure once the dropdown is in the DOM, before it becomes visible to the user.\r\n setTimeout(() => {\r\n // Relocate to <body> first so no transformed/overflow ancestor can re-anchor the fixed\r\n // dropdown, then compute viewport coordinates.\r\n if (this.appendToBody) this.moveDropdownToBody();\r\n this.updatePosition();\r\n }, 0);\r\n }\r\n\r\n setTimeout(() => this.scrollToSelectedTimes(), 100);\r\n\r\n } else {\r\n\r\n this.dismiss();\r\n }\r\n }\r\n\r\n /** Central close path so listeners are always detached and events emitted once. */\r\n private dismiss(): void {\r\n\r\n if (!this.showPicker) return;\r\n\r\n // Put the dropdown back before showPicker=false so *ngIf removes it from the right parent on the\r\n // next change-detection pass (avoids leaving an orphan node in <body>).\r\n this.restoreDropdownFromBody();\r\n this.showPicker = false;\r\n this.detachViewportListeners();\r\n this.markAsTouched();\r\n this.pickerClosed.emit(this.pickerId);\r\n }\r\n\r\n /* ---------------- Change handlers ---------------- */\r\n\r\n onHourChange(hour: number) {\r\n this.currentHour = hour;\r\n this.activeHour = hour;\r\n this.updateTime();\r\n }\r\n\r\n onMinuteChange(minute: number) {\r\n this.currentMinute = minute;\r\n this.activeMinute = minute;\r\n this.updateTime();\r\n }\r\n\r\n onSecondChange(second: number) {\r\n this.currentSecond = second;\r\n this.activeSecond = second;\r\n this.updateTime();\r\n }\r\n\r\n onAMPMChange(ampm: string) {\r\n this.currentAMPM = ampm;\r\n this.updateTime();\r\n }\r\n\r\n updateTime() {\r\n\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\r\n this._modelValue = newTime;\r\n this.value = newTime;\r\n\r\n this.onChange(newTime);\r\n this.change.emit(newTime);\r\n this.timeChange.emit(newTime);\r\n }\r\n\r\n /* ---------------- Scroll ---------------- */\r\n\r\n /** Position each column so the committed value sits at the top of its viewport. */\r\n scrollToSelectedTimes() {\r\n this.scrollColumnTo(this.hourScrollEl, this.getHours().indexOf(this.currentHour));\r\n this.scrollColumnTo(this.minuteScrollEl, this.currentMinute);\r\n if (this.showSeconds) this.scrollColumnTo(this.secondScrollEl, this.currentSecond);\r\n }\r\n\r\n private scrollColumnTo(ref: ElementRef<HTMLElement> | undefined, index: number): void {\r\n const el = ref?.nativeElement;\r\n if (!el || index < 0) return;\r\n // Center the value in the viewport; the browser clamps at the top/bottom edges, which\r\n // keeps the ~3 visible rows filled with real values instead of blank space.\r\n el.scrollTop = index * this.ITEM_HEIGHT - el.clientHeight / 2 + this.ITEM_HEIGHT / 2;\r\n }\r\n\r\n /** Item nearest the viewport center for the current scroll position, clamped to [0, count - 1]. */\r\n private scrollIndex(ref: ElementRef<HTMLElement> | undefined, count: number): number {\r\n const el = ref?.nativeElement;\r\n if (!el) return -1;\r\n const center = el.scrollTop + el.clientHeight / 2;\r\n const index = Math.round((center - this.ITEM_HEIGHT / 2) / this.ITEM_HEIGHT);\r\n return Math.min(Math.max(index, 0), count - 1);\r\n }\r\n\r\n /* ---------------- Outside click ---------------- */\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n\r\n if (!this.showPicker) return;\r\n\r\n const target = event.target as HTMLElement;\r\n\r\n // When appendToBody has relocated the dropdown to <body>, it is no longer inside\r\n // .time-picker-wrapper, so also treat clicks within the dropdown itself as \"inside\".\r\n const dropdownEl = this.tpDropdown?.nativeElement;\r\n const insideDropdown = !!dropdownEl && (dropdownEl === target || dropdownEl.contains(target));\r\n\r\n if (!target.closest('.time-picker-wrapper') && !insideDropdown) {\r\n\r\n this.dismiss();\r\n }\r\n }\r\n\r\n private previousCloseCounter = 0;\r\n\r\n getHours(): number[] {\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\ngetAMPMOptions(): string[] {\r\n return ['PM','AM'];\r\n}\r\n\r\n// Scrolling any column only moves its highlight; the value is committed on click.\r\nonHourScroll(): void {\r\n const idx = this.scrollIndex(this.hourScrollEl, this.getHours().length);\r\n if (idx < 0) return;\r\n this.activeHour = this.getHours()[idx];\r\n}\r\n\r\nonMinuteScroll(): void {\r\n const idx = this.scrollIndex(this.minuteScrollEl, this.minutes.length);\r\n if (idx < 0) return;\r\n this.activeMinute = idx;\r\n}\r\n\r\nonSecondScroll(): void {\r\n const idx = this.scrollIndex(this.secondScrollEl, this.seconds.length);\r\n if (idx < 0) return;\r\n this.activeSecond = idx;\r\n}\r\n\r\n /* ---------------- Overlay positioning (auto-flip / appendToBody) ---------------- */\r\n\r\n /**\r\n * Resolve the dropdown placement against the current viewport.\r\n * - autoPosition: flip above when there isn't room below, and flip the horizontal\r\n * side when the preferred side would overflow.\r\n * - appendToBody: additionally anchor with `position: fixed` (inline style) so the\r\n * dropdown escapes ancestor overflow and follows the trigger on scroll.\r\n */\r\n private updatePosition(): void {\r\n\r\n if (!this.showPicker) return;\r\n\r\n const trigger = this.tpWrapper?.nativeElement;\r\n const dropdown = this.tpDropdown?.nativeElement;\r\n if (!trigger || !dropdown) return;\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const height = dropdown.offsetHeight || 140;\r\n const width = dropdown.offsetWidth || 182;\r\n const margin = 8;\r\n const gap = 4;\r\n\r\n // Vertical: flip above only when there isn't enough room below and there's more room above.\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n this.placeAbove =\r\n this.autoPosition && spaceBelow < height + margin && spaceAbove > spaceBelow;\r\n\r\n // Horizontal: start from the requested side, flip if it would overflow that edge.\r\n const viewportW = window.innerWidth;\r\n let side: 'left' | 'right' = this.position;\r\n if (this.autoPosition) {\r\n if (side === 'left' && rect.left + width > viewportW - margin) side = 'right';\r\n else if (side === 'right' && rect.right - width < margin) side = 'left';\r\n }\r\n this.resolvedPosition = side;\r\n\r\n if (this.appendToBody) {\r\n let left = side === 'right' ? rect.right - width : rect.left;\r\n // Clamp so it never leaves the viewport, regardless of the flip decision above.\r\n left = Math.min(left, viewportW - width - margin);\r\n left = Math.max(left, margin);\r\n\r\n this.dropdownStyle = this.placeAbove\r\n ? {\r\n position: 'fixed',\r\n top: 'auto',\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\r\n left: `${left}px`,\r\n right: 'auto',\r\n 'z-index': '100000',\r\n }\r\n : {\r\n position: 'fixed',\r\n top: `${rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n right: 'auto',\r\n 'z-index': '100000',\r\n };\r\n } else {\r\n // Non-appendToBody stays absolute; placement is driven by CSS classes only.\r\n this.dropdownStyle = {};\r\n }\r\n }\r\n\r\n private viewportListenersAttached = false;\r\n private viewportRafId: number | null = null;\r\n\r\n private readonly onViewportChange = (): void => {\r\n if (this.viewportRafId != null) return;\r\n this.viewportRafId = requestAnimationFrame(() => {\r\n this.viewportRafId = null;\r\n this.handleViewportChange();\r\n });\r\n };\r\n\r\n private handleViewportChange(): void {\r\n\r\n if (!this.showPicker) return;\r\n\r\n if (this.appendToBody) {\r\n const rect = this.tpWrapper?.nativeElement?.getBoundingClientRect();\r\n if (!rect) return;\r\n if (this.isTriggerOutOfView(rect)) {\r\n this.dismiss();\r\n return;\r\n }\r\n }\r\n\r\n this.updatePosition();\r\n }\r\n\r\n /** True when the trigger has scrolled out of the viewport or out of any clipping ancestor. */\r\n private isTriggerOutOfView(rect: DOMRect): boolean {\r\n\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight) return true;\r\n\r\n let el = this.tpWrapper?.nativeElement?.parentElement ?? null;\r\n while (el && el !== document.body && el !== document.documentElement) {\r\n if (this.isScrollClippingContainer(el)) {\r\n const c = el.getBoundingClientRect();\r\n if (rect.bottom <= c.top || rect.top >= c.bottom || rect.right <= c.left || rect.left >= c.right) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n private isScrollClippingContainer(el: HTMLElement): boolean {\r\n const style = getComputedStyle(el);\r\n const clipsY = /(auto|scroll|hidden)/.test(style.overflowY) && el.scrollHeight > el.clientHeight;\r\n const clipsX = /(auto|scroll|hidden)/.test(style.overflowX) && el.scrollWidth > el.clientWidth;\r\n return clipsY || clipsX;\r\n }\r\n\r\n private attachViewportListeners(): void {\r\n if (this.viewportListenersAttached) return;\r\n // Capture phase so nested scroll containers (dialog bodies, panels) are caught too.\r\n document.addEventListener('scroll', this.onViewportChange, true);\r\n window.addEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = true;\r\n }\r\n\r\n private detachViewportListeners(): void {\r\n if (!this.viewportListenersAttached) return;\r\n document.removeEventListener('scroll', this.onViewportChange, true);\r\n window.removeEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = false;\r\n if (this.viewportRafId != null) {\r\n cancelAnimationFrame(this.viewportRafId);\r\n this.viewportRafId = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.detachViewportListeners();\r\n // If destroyed while open with the dropdown relocated to <body>, put it back so Angular's\r\n // teardown removes it from the expected parent instead of leaving an orphan node in <body>.\r\n this.restoreDropdownFromBody();\r\n }\r\n}\r\n","<div class=\"time-picker-wrapper\">\r\n <div class=\"time-input-group\" [ngClass]=\"variation\">\r\n @if (label) {\r\n <label>{{ label }}</label>\r\n }\r\n <div class=\"time-input-wrapper\" [class.has-value]=\"hasValue\" #tpWrapper>\r\n <input\r\n type=\"text\"\r\n class=\"time-input\"\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled ? true : null\"\r\n readonly\r\n (click)=\"!disabled && togglePicker()\"\r\n (blur)=\"markAsTouched()\"\r\n />\r\n <span class=\"time-icon\">\r\n <img alt=\"timer\" class=\"timer-icon\" [src]=\"brickclayIcons.timerIcon\" />\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"time-clear-btn\"\r\n *ngIf=\"clearable && hasValue && !disabled\"\r\n (click)=\"clear(); $event.stopPropagation()\"\r\n title=\"Clear time\"\r\n aria-label=\"Clear time\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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 <div class=\"custom-time-picker-dropdown\" *ngIf=\"showPicker\">\r\n <div\r\n #tpDropdown\r\n class=\"custom-time-picker\"\r\n [ngStyle]=\"dropdownStyle\"\r\n [class.tp-above]=\"placeAbove\"\r\n [class.append-to-body]=\"appendToBody\"\r\n [ngClass]=\"{\r\n 'left-position': resolvedPosition === 'left',\r\n 'right-position': resolvedPosition === 'right',\r\n 'format-24': timeFormat === 24,\r\n 'tp-compact': variation === 'default',\r\n }\"\r\n >\r\n <!-- Hours Column (finite list, no loop) -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #hourScroll (scroll)=\"onHourScroll()\">\r\n <div\r\n *ngFor=\"let h of getHours()\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentHour === h\"\r\n [class.active]=\"activeHour === h\"\r\n (click)=\"onHourChange(h)\"\r\n >\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 (finite list, no loop) -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #minuteScroll (scroll)=\"onMinuteScroll()\">\r\n <div\r\n *ngFor=\"let m of minutes\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentMinute === m\"\r\n [class.active]=\"activeMinute === m\"\r\n (click)=\"onMinuteChange(m)\"\r\n >\r\n {{ m.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n @if (showSeconds) {\r\n <span class=\"time-separator\">:</span>\r\n <!-- Seconds Column (finite list, no loop) -->\r\n <div class=\"time-column\">\r\n <div class=\"time-scroll\" #secondScroll (scroll)=\"onSecondScroll()\">\r\n <div\r\n *ngFor=\"let s of seconds\"\r\n class=\"time-item\"\r\n [class.selected]=\"currentSecond === s\"\r\n [class.active]=\"activeSecond === s\"\r\n (click)=\"onSecondChange(s)\"\r\n >\r\n {{ s.toString().padStart(2, '0') }}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <!-- AM/PM Column (only in 12-hour format) -->\r\n @if (timeFormat === 12) {\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-column ampm-column\">\r\n <div class=\"time-scroll\">\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 >\r\n {{ ap }}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface CalendarRange {\r\n start: Date;\r\n end: Date;\r\n}\r\n\r\nexport interface CustomRangesConfig {\r\n customRanges?: Record<string, CalendarRange>;\r\n rangeOrder: string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BkCalendarManagerService {\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 customRanges: Record<string, CalendarRange> = {};\r\n rangeOrder: string[] = [];\r\n\r\n constructor() {\r\n this.initializeDefaultRanges();\r\n }\r\n\r\n /**\r\n * Returns service-defined custom ranges and their display order.\r\n * Used when the calendar does not pass customRanges via @Input().\r\n */\r\n getCustomRanges(): CustomRangesConfig {\r\n this.initializeDefaultRanges();\r\n return {\r\n customRanges: { ...this.customRanges },\r\n rangeOrder: [...this.rangeOrder],\r\n };\r\n }\r\n\r\n initializeDefaultRanges(): void {\r\n const today = new Date();\r\n\r\n this.customRanges = {\r\n Today: {\r\n start: new Date(today.getFullYear(), today.getMonth(), today.getDate()),\r\n end: new Date(today.getFullYear(), today.getMonth(), today.getDate()),\r\n },\r\n Yesterday: {\r\n start: this.addDays(today, -1),\r\n end: this.addDays(today, -1),\r\n },\r\n 'Last 7 Days': {\r\n start: this.addDays(today, -6),\r\n end: today,\r\n },\r\n 'Last 30 Days': {\r\n start: this.addDays(today, -29),\r\n end: today,\r\n },\r\n 'This Month': {\r\n start: new Date(today.getFullYear(), today.getMonth(), 1),\r\n end: new Date(today.getFullYear(), today.getMonth() + 1, 0),\r\n },\r\n 'Last Month': {\r\n start: new Date(today.getFullYear(), today.getMonth() - 1, 1),\r\n end: new Date(today.getFullYear(), today.getMonth(), 0),\r\n },\r\n 'Custom Range': {\r\n start: new Date(),\r\n end: new Date(),\r\n },\r\n };\r\n\r\n this.rangeOrder = [\r\n 'Today',\r\n 'Yesterday',\r\n 'Last 7 Days',\r\n 'Last 30 Days',\r\n 'This Month',\r\n 'Last Month',\r\n 'Custom Range',\r\n ];\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 /**\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 getOnlyDate(input: string | Date): string {\r\n const date = new Date(input);\r\n\r\n const year = date.getFullYear();\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const day = date.getDate().toString().padStart(2, '0');\r\n\r\n return `${year}-${month}-${day}`;\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, OnChanges, SimpleChanges, ViewChild, ElementRef, forwardRef, Renderer2 } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule, Validator, AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { BkCalendarManagerService, CalendarRange } 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\n\r\nexport type { CalendarRange } from '../../services/calendar-manager.service';\r\n\r\nexport class CalendarSelection {\r\n startDate: string | null = null;\r\n endDate: string | null = null;\r\n /** Start time in 12-hour format with AM/PM (e.g. \"1:00 AM\"). */\r\n startTime: string | null = null;\r\n /** End time in 12-hour format with AM/PM (e.g. \"2:00 AM\"). */\r\n endTime: string | null = 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 providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkCustomCalendar),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => BkCustomCalendar),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkCustomCalendar implements OnInit, OnDestroy, OnChanges, ControlValueAccessor, Validator {\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 /** Vertical placement relative to the input. When explicitly set, overrides viewport-space detection entirely. */\r\n @Input() popupPosition?: 'top' | 'bottom';\r\n @Input() drop: 'up' | 'down' = 'down';\r\n @Input() dualCalendar = false;\r\n @Input() showRanges = true;\r\n @Input() timeFormat: 12 | 24 = 12;\r\n @Input() clearableTime: boolean = false;\r\n @Input() enableSeconds = false;\r\n @Input() customRanges?: Record<string, CalendarRange>;\r\n /** Column headers for weekdays; index 0 is the first column. Default Monday–Sunday. */\r\n @Input() weekDayLabels: string[] = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\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() compact = false; // NEW: Compact (smaller) layout variant. Default false keeps the original sizing.\r\n @Input() autoPosition = false; // NEW: When true, auto-flip popup above/below based on available viewport space. Default false.\r\n @Input() appendToBody = false; // When true, positions popup with fixed so it isn't clipped inside dialogs/overflow\r\n @Input() isDisplayCrossIcon = true; // NEW: Show/Hide clear (X) icon\r\n @Input() hasError = false; // NEW: Show/Hide clear (X) icon\r\n @Input() errorMessage = ''\r\n @Output() selected = new EventEmitter<CalendarSelection>();\r\n\r\n @ViewChild('inputWrapper') inputWrapper!: ElementRef<HTMLDivElement>;\r\n @ViewChild('calendarPopup') calendarPopupRef?: ElementRef<HTMLDivElement>;\r\n\r\n /** Used when appendToBody is true to position the popup in viewport coordinates */\r\n dropdownStyle: { top?: string; bottom?: string; left?: string } = {};\r\n /** Resolved after layout; used for CSS `drop-up` and appendToBody positioning with viewport flip */\r\n popupPlacementAbove = false;\r\n @Output() opened = new EventEmitter<void>();\r\n @Output() closed = new EventEmitter<void>();\r\n @Input() showCancelApply = true;\r\n /**\r\n * External value passed from parent / ngModel. When used with ngModel, this is the bound value.\r\n * Accepts { startDate: string|null, endDate: string|null, selectedDates?: string[] }\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 /** When true, the control is required (used with ngModel for validation: dirty, touched, invalid). */\r\n @Input() required = false;\r\n\r\n /** CVA: called when form control value is set (e.g. ngModel binding) */\r\n private onChange: (value: CalendarSelection | null) => void = () => {};\r\n /** CVA: called when control is touched (blur / close) */\r\n private onTouched: () => void = () => {};\r\n disabled = false;\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 startDate: Date | null = null;\r\n 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 /** Current start time string in 12-hour format with AM/PM (e.g. \"1:00 AM\"). Synced with ngModel/CalendarSelection. */\r\n startTime: string | null = null;\r\n /** Current end time string in 12-hour format with AM/PM (e.g. \"2:00 AM\"). Synced with ngModel/CalendarSelection. */\r\n endTime: string | null = null;\r\n\r\n /** ngModel binding for single-calendar time picker (null = no time). */\r\n singleTimeModel: string | null = null;\r\n /** ngModel binding for dual-calendar start time picker (null = no time). */\r\n startTimeModel: string | null = null;\r\n /** ngModel binding for dual-calendar end time picker (null = no time). */\r\n endTimeModel: string | null = null;\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 activeRange: string | null = null; // Track which range is currently active\r\n @Input() rangeOrder: string[] = []; // Maintain order of ranges\r\n\r\n /** Keyboard roving focus for date grid (local date, midnight) */\r\n keyboardFocusDate: Date | null = null;\r\n\r\n private unregisterFn?: () => void;\r\n private closeAllSubscription?: Subscription;\r\n private closeFn?: () => void;\r\n\r\n constructor(private calendarManager: BkCalendarManagerService, private renderer: Renderer2) {}\r\n\r\n /**\r\n * appendToBody popup relocation.\r\n *\r\n * `appendToBody` uses `position: fixed`, which only anchors to the viewport when NO ancestor\r\n * establishes a containing block (transform / filter / perspective / will-change / contain /\r\n * backdrop-filter). Consumers frequently place the calendar inside such an ancestor (an animated\r\n * panel, a CSS-transformed modal, etc.), which silently re-anchors the fixed popup and pushes it\r\n * off-position. To be robust everywhere we physically move the popup node to <body> while it is\r\n * open, then move it back before Angular's *ngIf tears it down. Angular keeps managing the node by\r\n * reference after the move, so its event bindings, change detection, and emulated-encapsulation\r\n * styles all continue to work.\r\n */\r\n private popupMovedToBody = false;\r\n private popupOriginalParent: HTMLElement | null = null;\r\n private popupOriginalNextSibling: Node | null = null;\r\n\r\n private movePopupToBody(): void {\r\n const el = this.calendarPopupRef?.nativeElement;\r\n if (!el || this.popupMovedToBody) return;\r\n this.popupOriginalParent = el.parentElement;\r\n this.popupOriginalNextSibling = el.nextSibling;\r\n this.renderer.appendChild(document.body, el);\r\n this.popupMovedToBody = true;\r\n }\r\n\r\n /** Return the popup to its original DOM slot so *ngIf can destroy it cleanly (safe to call twice). */\r\n private restorePopupFromBody(): void {\r\n if (!this.popupMovedToBody) return;\r\n const el = this.calendarPopupRef?.nativeElement;\r\n const parent = this.popupOriginalParent;\r\n if (el && parent) {\r\n const ref = this.popupOriginalNextSibling;\r\n if (ref && ref.parentNode === parent) {\r\n this.renderer.insertBefore(parent, el, ref);\r\n } else {\r\n this.renderer.appendChild(parent, el);\r\n }\r\n }\r\n this.popupMovedToBody = false;\r\n this.popupOriginalParent = null;\r\n this.popupOriginalNextSibling = null;\r\n }\r\n\r\n /** Weekday headers; falls back to Mon–Sun if the input is not length 7. */\r\n get resolvedWeekDayLabels(): string[] {\r\n const d = this.weekDayLabels;\r\n if (d?.length === 7) return d;\r\n return ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\r\n }\r\n\r\n /** When dual range mode, Apply is blocked until both endpoints exist. */\r\n get isDualRangeApplyBlocked(): boolean {\r\n if (!this.dualCalendar || this.singleDatePicker || this.multiDateSelection) return false;\r\n return !this.startDate || !this.endDate;\r\n }\r\n\r\n /**\r\n * Popup single-date with manual Apply: do not push to ngModel / (selected) until Apply.\r\n * Inline calendars have no Apply footer, so they always commit immediately.\r\n */\r\n private shouldDeferSingleDateCommit(): boolean {\r\n return this.singleDatePicker && !this.autoApply && !this.inline;\r\n }\r\n\r\n private emitSelectionUnlessSingleDateDeferred(): void {\r\n if (this.shouldDeferSingleDateCommit()) return;\r\n this.emitSelection();\r\n }\r\n\r\n /** Discard in-popup draft and restore last committed value from {@link selectedValue}. */\r\n private revertSingleDateDraftIfNeeded(): void {\r\n if (this.shouldDeferSingleDateCommit()) {\r\n this.applyValueToState(this.selectedValue ?? null);\r\n }\r\n }\r\n\r\n private finishPopupDismissal(): void {\r\n if (this.inline) return;\r\n this.detachViewportListeners();\r\n this.revertSingleDateDraftIfNeeded();\r\n // Put the popup back in its original slot BEFORE show=false so *ngIf removes it from the right\r\n // parent on the next change-detection pass (avoids leaving an orphan node in <body>).\r\n this.restorePopupFromBody();\r\n this.show = false;\r\n this.onTouched();\r\n this.closed.emit();\r\n }\r\n\r\n /** User preference before viewport adjustment (only used when popupPosition is not explicitly set). */\r\n private preferPopupAbove(): boolean {\r\n return this.drop === 'up';\r\n }\r\n\r\n private resolveCustomRangesFromInputsOrService(): void {\r\n const svc = this.calendarManager.getCustomRanges();\r\n if (!this.customRanges) {\r\n this.customRanges = { ...svc.customRanges! };\r\n this.rangeOrder = [...svc.rangeOrder];\r\n } else {\r\n if (!this.rangeOrder?.length) {\r\n const keys = Object.keys(this.customRanges);\r\n const ordered = svc.rangeOrder.filter(k => keys.includes(k));\r\n const rest = keys.filter(k => !ordered.includes(k));\r\n this.rangeOrder = [...ordered, ...rest];\r\n }\r\n if (!this.customRanges['Custom Range']) {\r\n this.customRanges['Custom Range'] = { start: new Date(), end: new Date() };\r\n }\r\n }\r\n }\r\n\r\n private labelToJsWeekday(label: string): number {\r\n const key = label.replace(/\\./g, '').trim().toLowerCase();\r\n const map: Record<string, number> = {\r\n sun: 0, sunday: 0, su: 0,\r\n mon: 1, monday: 1, mo: 1,\r\n tue: 2, tues: 2, tuesday: 2, tu: 2,\r\n wed: 3, wednesday: 3, we: 3,\r\n thu: 4, thur: 4, thurs: 4, thursday: 4, th: 4,\r\n fri: 5, friday: 5, fr: 5,\r\n sat: 6, saturday: 6, sa: 6,\r\n };\r\n return map[key] ?? 1;\r\n }\r\n\r\n private getWeekStartDayIndex(): number {\r\n return this.labelToJsWeekday(this.resolvedWeekDayLabels[0] ?? 'Mon');\r\n }\r\n\r\n // --- ControlValueAccessor implementation ---\r\n writeValue(value: CalendarSelection | null): void {\r\n this.selectedValue = value ?? null;\r\n this.applyValueToState(this.selectedValue);\r\n }\r\n\r\n registerOnChange(fn: (value: CalendarSelection | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): 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 /** Validator: when required is true, value must have a date selected. */\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (!this.required) return null;\r\n const value = control.value as CalendarSelection | null;\r\n if (!value) return { required: true };\r\n if (this.multiDateSelection) {\r\n if (!value.selectedDates || value.selectedDates.length === 0) return { required: true };\r\n } else {\r\n if (!value.startDate) return { required: true };\r\n }\r\n return null;\r\n }\r\n\r\n /** Call from template when control loses focus (for CVA touched state). */\r\n markAsTouched(): void {\r\n this.onTouched();\r\n }\r\n\r\n /** Clears embedded time picker ngModels, spinner state, raw minute typing, and forces dropdowns closed. */\r\n private resetEmbeddedTimePickerUiState(): void {\r\n this.singleTimeModel = null;\r\n this.startTimeModel = null;\r\n this.endTimeModel = null;\r\n this.selectedHour = 1;\r\n this.selectedMinute = 0;\r\n this.selectedSecond = 0;\r\n this.selectedAMPM = 'AM';\r\n this.startHour = 1;\r\n this.startMinute = 0;\r\n this.startSecond = 0;\r\n this.startAMPM = 'AM';\r\n this.endHour = 2;\r\n this.endMinute = 0;\r\n this.endSecond = 0;\r\n this.endAMPM = 'AM';\r\n this.minuteInputValues = {};\r\n this.openTimePickerId = null;\r\n for (const id of ['single-time', 'dual-start', 'dual-end'] as const) {\r\n this.closePickerCounter[id] = (this.closePickerCounter[id] || 0) + 1;\r\n }\r\n }\r\n\r\n /** Apply CalendarSelection to internal state (startDate, endDate, startTime, endTime, selectedDates, calendar view). */\r\n private applyValueToState(value: CalendarSelection | null): void {\r\n if (!value) {\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.startTime = null;\r\n this.endTime = null;\r\n this.selectedDates = [];\r\n this.activeRange = null;\r\n this.resetEmbeddedTimePickerUiState();\r\n this.month = this.today.getMonth();\r\n this.year = this.today.getFullYear();\r\n this.generateCalendar();\r\n if (this.dualCalendar) {\r\n this.initializeDual();\r\n }\r\n return;\r\n }\r\n const s = value;\r\n this.startDate = s.startDate ? this.parseDateString(s.startDate) : null;\r\n this.endDate = s.endDate ? this.parseDateString(s.endDate) : null;\r\n this.selectedDates = (s.selectedDates || []).map((d) => typeof d === 'string' ? this.parseDateString(d) : new Date(d));\r\n this.startTime = s.startTime ?? null;\r\n this.endTime = s.endTime ?? null;\r\n\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 if (this.startDate) {\r\n this.leftMonth = this.startDate.getMonth();\r\n this.leftYear = this.startDate.getFullYear();\r\n }\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 if (endMonth !== startMonth || endYear !== startYear) {\r\n this.rightMonth = endMonth;\r\n this.rightYear = endYear;\r\n } else {\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 this.rightMonth = this.endDate.getMonth();\r\n this.rightYear = this.endDate.getFullYear();\r\n } else {\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 this.generateDualCalendars();\r\n } else {\r\n this.generateCalendar();\r\n }\r\n\r\n if (this.startTime) {\r\n const startParsed = this.parsePickerTimeString(this.startTime);\r\n this.startHour = startParsed.hour12;\r\n this.startMinute = startParsed.minute;\r\n this.startAMPM = startParsed.ampm;\r\n if (this.startDate) {\r\n let h24 = startParsed.hour12;\r\n if (startParsed.ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (startParsed.ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.startDate.setHours(h24, startParsed.minute, this.startSecond);\r\n }\r\n this.selectedHour = this.startHour;\r\n this.selectedMinute = this.startMinute;\r\n this.selectedAMPM = this.startAMPM;\r\n } else if (this.startDate) {\r\n // Date-only committed value: keep startTime null; sync spinners for UX only (not emitted until user sets time).\r\n this.initializeTimeFromDate(this.startDate, true);\r\n if (!this.dualCalendar) {\r\n this.selectedHour = this.startHour;\r\n this.selectedMinute = this.startMinute;\r\n this.selectedAMPM = this.startAMPM;\r\n }\r\n }\r\n\r\n if (this.endTime) {\r\n const endParsed = this.parsePickerTimeString(this.endTime);\r\n this.endHour = endParsed.hour12;\r\n this.endMinute = endParsed.minute;\r\n this.endAMPM = endParsed.ampm;\r\n if (this.endDate) {\r\n let h24 = endParsed.hour12;\r\n if (endParsed.ampm === 'PM' && h24 < 12) h24 += 12;\r\n if (endParsed.ampm === 'AM' && h24 === 12) h24 = 0;\r\n this.endDate.setHours(h24, endParsed.minute, this.endSecond);\r\n }\r\n } else if (this.endDate) {\r\n this.initializeTimeFromDate(this.endDate, false);\r\n }\r\n\r\n if (this.startDate && this.endDate) {\r\n this.checkAndSetActiveRange();\r\n }\r\n\r\n // Sync ngModel values for embedded time pickers (null when no time set)\r\n if (!this.dualCalendar) {\r\n this.singleTimeModel = this.startTime ?? null;\r\n } else {\r\n this.startTimeModel = this.startTime ?? null;\r\n this.endTimeModel = this.endTime ?? null;\r\n }\r\n }\r\n\r\n /** Format to \"H:MM AM/PM\" string. */\r\n private formatTimeToAmPm(hour12: number, minute: number, ampm: string): string {\r\n const m = minute.toString().padStart(2, '0');\r\n return `${hour12}:${m} ${ampm}`;\r\n }\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 if (!this.show) return;\r\n const target = event.target as HTMLElement;\r\n // When appendToBody has relocated the popup to <body>, it is no longer a descendant of\r\n // .calendar-container, so also treat clicks within the popup element itself as \"inside\".\r\n const popupEl = this.calendarPopupRef?.nativeElement;\r\n const insidePopup = !!popupEl && (popupEl === target || popupEl.contains(target));\r\n if (!target.closest('.calendar-container') && !insidePopup) {\r\n this.close();\r\n }\r\n }\r\n\r\n /** True while capture-phase scroll + resize listeners are attached (only while the popup is open). */\r\n private viewportListenersAttached = false;\r\n /** Pending rAF id so bursts of scroll events collapse into one layout pass. */\r\n private viewportRafId: number | null = null;\r\n\r\n /**\r\n * Recipe steps 2 & 4: while the popup is open, keep it glued to the trigger as the page\r\n * (or any nested scroll container) scrolls, and dismiss it once the trigger leaves the viewport.\r\n * Throttled through requestAnimationFrame to avoid layout thrash during fast scrolling.\r\n */\r\n private readonly onViewportChange = (): void => {\r\n if (this.viewportRafId != null) return;\r\n this.viewportRafId = requestAnimationFrame(() => {\r\n this.viewportRafId = null;\r\n this.handleViewportChange();\r\n });\r\n };\r\n\r\n private handleViewportChange(): void {\r\n if (!this.show || this.inline) return;\r\n\r\n if (this.appendToBody) {\r\n const trigger = this.inputWrapper?.nativeElement;\r\n if (!trigger) return;\r\n const rect = trigger.getBoundingClientRect();\r\n // Step 4: trigger scrolled fully out of view → close instead of leaving a floating panel behind.\r\n if (this.isTriggerOutOfView(rect)) {\r\n this.close();\r\n return;\r\n }\r\n // Step 2: re-anchor (and re-flip) so the panel follows the trigger.\r\n this.updatePosition();\r\n } else {\r\n // Absolute-positioned popups track the trigger natively; just re-evaluate the flip.\r\n this.refreshPopupPlacement();\r\n }\r\n }\r\n\r\n /**\r\n * Trigger is no longer visible and the fixed popup should be dismissed. True when the trigger is\r\n * either entirely outside the viewport, or clipped out of ANY ancestor scroll container — e.g.\r\n * scrolled behind the header/footer of a modal body. This makes step 4 work both on the plain\r\n * page and inside a dialog when `appendToBody` positions the popup with `fixed`.\r\n */\r\n private isTriggerOutOfView(rect: DOMRect): boolean {\r\n // 1. Fully above or below the viewport.\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight) return true;\r\n\r\n // 2. Fully clipped out of a scrollable ancestor (the modal body, a scroll pane, etc.).\r\n let el = this.inputWrapper?.nativeElement?.parentElement ?? null;\r\n while (el && el !== document.body && el !== document.documentElement) {\r\n if (this.isScrollClippingContainer(el)) {\r\n const c = el.getBoundingClientRect();\r\n if (\r\n rect.bottom <= c.top ||\r\n rect.top >= c.bottom ||\r\n rect.right <= c.left ||\r\n rect.left >= c.right\r\n ) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n /** An ancestor that clips overflowing content on an axis where its content actually overflows. */\r\n private isScrollClippingContainer(el: HTMLElement): boolean {\r\n const style = getComputedStyle(el);\r\n const clipsY =\r\n /(auto|scroll|hidden)/.test(style.overflowY) && el.scrollHeight > el.clientHeight;\r\n const clipsX =\r\n /(auto|scroll|hidden)/.test(style.overflowX) && el.scrollWidth > el.clientWidth;\r\n return clipsY || clipsX;\r\n }\r\n\r\n private attachViewportListeners(): void {\r\n if (this.viewportListenersAttached) return;\r\n // capture = true so scrolling inside ANY ancestor container fires this, not only window scroll.\r\n document.addEventListener('scroll', this.onViewportChange, true);\r\n window.addEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = true;\r\n }\r\n\r\n private detachViewportListeners(): void {\r\n if (!this.viewportListenersAttached) return;\r\n document.removeEventListener('scroll', this.onViewportChange, true);\r\n window.removeEventListener('resize', this.onViewportChange);\r\n this.viewportListenersAttached = false;\r\n if (this.viewportRafId != null) {\r\n cancelAnimationFrame(this.viewportRafId);\r\n this.viewportRafId = null;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.resolveCustomRangesFromInputsOrService();\r\n if (this.dualCalendar) this.initializeDual();\r\n else this.generateCalendar();\r\n\r\n // Initialize spinner state from existing dates (does not set startTime/endTime — those stay null until user picks time).\r\n if (this.startDate) {\r\n this.initializeTimeFromDate(this.startDate, true);\r\n if (!this.dualCalendar) {\r\n this.selectedHour = this.startHour;\r\n this.selectedMinute = this.startMinute;\r\n this.selectedAMPM = this.startAMPM;\r\n }\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 setTimeout(() => this.initKeyboardFocus(), 0);\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']) {\r\n this.applyValueToState(this.selectedValue ?? null);\r\n }\r\n if (changes['customRanges'] || changes['rangeOrder']) {\r\n this.resolveCustomRangesFromInputsOrService();\r\n }\r\n if (changes['weekDayLabels'] && !changes['weekDayLabels'].firstChange) {\r\n this.regenerateCalendarsForWeekStart();\r\n }\r\n }\r\n\r\n private regenerateCalendarsForWeekStart(): void {\r\n if (this.dualCalendar) {\r\n this.generateDualCalendars();\r\n } else {\r\n this.generateCalendar();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Ensure global scroll/resize listeners never outlive the component\r\n this.detachViewportListeners();\r\n\r\n // If destroyed while open with the popup relocated to <body>, put it back so Angular's teardown\r\n // removes it from the expected parent instead of leaving an orphan node in <body>.\r\n this.restorePopupFromBody();\r\n\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 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 if (this.disabled) return;\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.attachViewportListeners();\r\n setTimeout(() => {\r\n this.initKeyboardFocus();\r\n this.calendarPopupRef?.nativeElement?.focus({ preventScroll: true });\r\n if (this.appendToBody && this.inputWrapper?.nativeElement) {\r\n // Move the popup out to <body> first so any transformed/overflow ancestor can no longer\r\n // re-anchor or clip its fixed positioning, then compute viewport coordinates.\r\n this.movePopupToBody();\r\n this.updatePosition();\r\n } else if (!this.inline) {\r\n this.refreshPopupPlacement();\r\n }\r\n }, 0);\r\n this.opened.emit();\r\n } else {\r\n this.finishPopupDismissal();\r\n }\r\n }\r\n\r\n /** Update popup position when appendToBody is true (fixed positioning relative to viewport). */\r\n updatePosition() {\r\n if (!this.inputWrapper?.nativeElement) return;\r\n const rect = this.inputWrapper.nativeElement.getBoundingClientRect();\r\n const popupEl = this.calendarPopupRef?.nativeElement;\r\n const popupH = popupEl?.offsetHeight ?? 360;\r\n const popupW = popupEl?.offsetWidth ?? 320;\r\n const placeAbove = this.computePlacementAbove(rect, popupH);\r\n this.popupPlacementAbove = placeAbove;\r\n const left = this.computePopupLeft(rect, popupW);\r\n const gap = 4;\r\n if (placeAbove) {\r\n this.dropdownStyle = {\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\r\n left: `${left}px`,\r\n };\r\n } else {\r\n this.dropdownStyle = {\r\n top: `${rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Horizontal placement for the fixed (appendToBody) popup.\r\n *\r\n * The base edge follows the author's {@link opens} preference:\r\n * • 'left' → align left edges, panel opens rightwards (default)\r\n * • 'right' → align right edges, panel opens leftwards\r\n * • 'center' → centred on the trigger\r\n * When {@link autoPosition} is on, the panel auto-flips to the opposite edge if the preferred\r\n * side would overflow the viewport, then clamps to an 8px margin so it can never leave the screen.\r\n * When autoPosition is off, the explicit `opens` value is honoured as-is.\r\n */\r\n private computePopupLeft(rect: DOMRect, popupWidth: number): number {\r\n const margin = 8;\r\n const viewportW = window.innerWidth;\r\n\r\n // 1. Base alignment from the user-provided `opens`.\r\n let left: number;\r\n if (this.opens === 'right') {\r\n left = rect.right - popupWidth; // align right edges → opens leftwards\r\n } else if (this.opens === 'center') {\r\n left = rect.left + rect.width / 2 - popupWidth / 2;\r\n } else {\r\n left = rect.left; // align left edges → opens rightwards\r\n }\r\n\r\n if (!this.autoPosition) return left;\r\n\r\n // 2. Auto-flip to the opposite edge when the preferred side overflows the viewport.\r\n if (left + popupWidth > viewportW - margin) {\r\n left = rect.right - popupWidth; // flip: open leftwards\r\n }\r\n if (left < margin) {\r\n left = rect.left; // flip back: open rightwards\r\n }\r\n\r\n // 3. Final clamp so the panel always stays fully on screen on both edges.\r\n left = Math.min(left, viewportW - popupWidth - margin);\r\n left = Math.max(left, margin);\r\n return left;\r\n }\r\n\r\n /** Non–append-to-body: set `popupPlacementAbove` for CSS `drop-up` with viewport flip. */\r\n refreshPopupPlacement(): void {\r\n if (!this.inputWrapper?.nativeElement) return;\r\n const rect = this.inputWrapper.nativeElement.getBoundingClientRect();\r\n const popupH = this.calendarPopupRef?.nativeElement?.offsetHeight ?? 360;\r\n this.popupPlacementAbove = this.computePlacementAbove(rect, popupH);\r\n }\r\n\r\n private computePlacementAbove(rect: DOMRect, popupHeight: number): boolean {\r\n // If the consumer explicitly set popupPosition, honour it — no space-check override.\r\n if (this.popupPosition === 'top') return true;\r\n if (this.popupPosition === 'bottom') return false;\r\n\r\n // Space-based auto-flip is opt-in. When disabled, just honour the `drop` preference.\r\n if (!this.autoPosition) {\r\n return this.preferPopupAbove();\r\n }\r\n\r\n // autoPosition enabled → auto-detect based on available viewport space.\r\n const gap = 12;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const spaceAbove = rect.top - gap;\r\n const preferAbove = this.preferPopupAbove();\r\n if (preferAbove) {\r\n return spaceAbove >= popupHeight || spaceAbove >= spaceBelow;\r\n }\r\n if (spaceBelow >= popupHeight || spaceBelow >= spaceAbove) return false;\r\n return true;\r\n }\r\n\r\n /** Normalize to local midnight and clamp to min/max selectable day. */\r\n private clampCalendarDayToSelectableRange(d: Date): Date {\r\n let x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n if (this.minDate) {\r\n const min = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n if (x < min) x = new Date(min.getFullYear(), min.getMonth(), min.getDate());\r\n }\r\n if (this.maxDate) {\r\n const max = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), this.maxDate.getDate());\r\n if (x > max) x = new Date(max.getFullYear(), max.getMonth(), max.getDate());\r\n }\r\n return x;\r\n }\r\n\r\n private initKeyboardFocus(): void {\r\n if (!this.inline && !this.show) return;\r\n const base =\r\n this.startDate ??\r\n this.endDate ??\r\n new Date(this.today.getFullYear(), this.today.getMonth(), this.today.getDate());\r\n const d = this.clampCalendarDayToSelectableRange(\r\n new Date(base.getFullYear(), base.getMonth(), base.getDate())\r\n );\r\n this.keyboardFocusDate = d;\r\n this.ensureKeyboardFocusVisible();\r\n }\r\n\r\n /**\r\n * After clearing values, drop stale keyboard highlight (was last start/end) and reset the\r\n * visible month(s) to today (clamped). Move DOM focus to the popup when open, else the input.\r\n */\r\n private resetCalendarFocusAfterClear(): void {\r\n const todayLocal = new Date(this.today.getFullYear(), this.today.getMonth(), this.today.getDate());\r\n this.keyboardFocusDate = this.clampCalendarDayToSelectableRange(todayLocal);\r\n\r\n if (this.dualCalendar) {\r\n this.leftMonth = this.keyboardFocusDate.getMonth();\r\n this.leftYear = this.keyboardFocusDate.getFullYear();\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 } else {\r\n this.month = this.keyboardFocusDate.getMonth();\r\n this.year = this.keyboardFocusDate.getFullYear();\r\n this.generateCalendar();\r\n }\r\n\r\n this.scheduleDomFocusAfterClear();\r\n }\r\n\r\n private scheduleDomFocusAfterClear(): void {\r\n setTimeout(() => {\r\n if (this.show || this.inline) {\r\n this.calendarPopupRef?.nativeElement?.focus({ preventScroll: true });\r\n return;\r\n }\r\n const inputEl = this.inputWrapper?.nativeElement?.querySelector<HTMLInputElement>('.calendar-input');\r\n inputEl?.focus({ preventScroll: true });\r\n }, 0);\r\n }\r\n\r\n private ensureKeyboardFocusVisible(): void {\r\n if (!this.keyboardFocusDate) return;\r\n const fd = this.keyboardFocusDate;\r\n if (!this.dualCalendar) {\r\n if (fd.getMonth() !== this.month || fd.getFullYear() !== this.year) {\r\n this.month = fd.getMonth();\r\n this.year = fd.getFullYear();\r\n this.generateCalendar();\r\n }\r\n return;\r\n }\r\n const fm = fd.getMonth();\r\n const fy = fd.getFullYear();\r\n const inLeft = fm === this.leftMonth && fy === this.leftYear;\r\n const inRight = fm === this.rightMonth && fy === this.rightYear;\r\n if (inLeft || inRight) return;\r\n this.leftMonth = fm;\r\n this.leftYear = fy;\r\n this.rightMonth = fm + 1;\r\n this.rightYear = fy;\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 private moveKeyboardFocus(deltaDays: number): void {\r\n if (!this.keyboardFocusDate) this.initKeyboardFocus();\r\n if (!this.keyboardFocusDate) return;\r\n let next = this.addDays(this.keyboardFocusDate, deltaDays);\r\n if (this.minDate) {\r\n const min = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n if (next < min) next = min;\r\n }\r\n if (this.maxDate) {\r\n const max = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), this.maxDate.getDate());\r\n if (next > max) next = max;\r\n }\r\n this.keyboardFocusDate = new Date(next.getFullYear(), next.getMonth(), next.getDate());\r\n this.ensureKeyboardFocusVisible();\r\n }\r\n\r\n /**\r\n * When focus is inside a real control (button, link, field), do not intercept keys here.\r\n * Otherwise this handler's preventDefault (Enter/Space) blocks native button activation and\r\n * bubbled Enter still runs applyKeyboardSelection — breaking keyboard parity with click.\r\n */\r\n private isKeyboardEventFromInteractiveDescendant(event: KeyboardEvent): boolean {\r\n const t = event.target;\r\n if (!(t instanceof Element)) return false;\r\n return !!t.closest(\r\n 'button, a[href], input, select, textarea, [contenteditable=\"true\"], bk-time-picker'\r\n );\r\n }\r\n\r\n onCalendarPopupKeydown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n if (event.key === 'Tab') return;\r\n if (this.isKeyboardEventFromInteractiveDescendant(event)) {\r\n return;\r\n }\r\n\r\n const k = event.key;\r\n if (k === 'ArrowLeft' || k === 'ArrowRight' || k === 'ArrowUp' || k === 'ArrowDown' || k === 'Enter' || k === ' ') {\r\n event.preventDefault();\r\n }\r\n if (k === 'ArrowLeft') this.moveKeyboardFocus(-1);\r\n else if (k === 'ArrowRight') this.moveKeyboardFocus(1);\r\n else if (k === 'ArrowUp') this.moveKeyboardFocus(-7);\r\n else if (k === 'ArrowDown') this.moveKeyboardFocus(7);\r\n else if (k === 'Enter' || k === ' ') this.applyKeyboardSelection();\r\n }\r\n\r\n private applyKeyboardSelection(): void {\r\n if (!this.keyboardFocusDate) return;\r\n const day = this.keyboardFocusDate.getDate();\r\n if (this.dualCalendar) {\r\n const fr = this.keyboardFocusDate.getMonth() === this.rightMonth && this.keyboardFocusDate.getFullYear() === this.rightYear;\r\n const fl = this.keyboardFocusDate.getMonth() === this.leftMonth && this.keyboardFocusDate.getFullYear() === this.leftYear;\r\n if (fr) this.selectDate(day, true);\r\n else if (fl) this.selectDate(day, false);\r\n else {\r\n this.ensureKeyboardFocusVisible();\r\n const fr2 = this.keyboardFocusDate.getMonth() === this.rightMonth && this.keyboardFocusDate.getFullYear() === this.rightYear;\r\n this.selectDate(day, fr2);\r\n }\r\n } else {\r\n this.selectDate(day, false);\r\n }\r\n }\r\n\r\n isKeyboardFocusedCell(year: number, month: number, day: number): boolean {\r\n if (!this.keyboardFocusDate || !day) return false;\r\n return (\r\n this.keyboardFocusDate.getFullYear() === year &&\r\n this.keyboardFocusDate.getMonth() === month &&\r\n this.keyboardFocusDate.getDate() === day\r\n );\r\n }\r\n\r\n onRangeButtonKeydown(event: KeyboardEvent, rangeKey: string): void {\r\n if (event.key === ' ' || event.key === 'Enter') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.chooseRange(rangeKey);\r\n }\r\n }\r\n\r\n close() {\r\n if (this.inline) {\r\n return;\r\n }\r\n this.finishPopupDismissal();\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 || this.disabled) 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 this.keyboardFocusDate = new Date(selected.getFullYear(), selected.getMonth(), selected.getDate());\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 only when user has already selected a time; otherwise keep time null (date at midnight)\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n const isStart = !this.startDate || !!this.endDate;\r\n if (isStart && this.startTime != null) this.applyTimeToDate(selected, true);\r\n else if (!isStart && this.endTime != null) this.applyTimeToDate(selected, false);\r\n else selected.setHours(0, 0, this.selectedSecond);\r\n } else {\r\n if (this.startTime != null) this.applyTimeToDate(selected, true);\r\n else selected.setHours(0, 0, this.selectedSecond);\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 only if user has already picked a time; otherwise keep time null\r\n if (this.enableTimepicker) {\r\n if (this.startTime != null) this.applyTimeToDate(this.startDate, true);\r\n else this.startDate.setHours(0, 0, this.selectedSecond);\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 this.emitSelectionUnlessSingleDateDeferred();\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 if (this.disabled) return;\r\n if (this.isDualRangeApplyBlocked) return;\r\n // Format minute inputs to 2 digits before applying\r\n this.formatAllMinuteInputs();\r\n\r\n // Apply time only when the user has an explicit time string (avoids inventing \"12:00 AM\" from picker defaults).\r\n if (this.enableTimepicker) {\r\n if (this.dualCalendar) {\r\n if (this.startDate && this.startTime != null) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate && this.endTime != null) {\r\n this.applyTimeToDate(this.endDate, false);\r\n }\r\n } else {\r\n if (this.startDate && this.startTime != null) {\r\n this.applyTimeToDate(this.startDate, true);\r\n }\r\n if (this.endDate && !this.singleDatePicker && this.startTime != null) {\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.onTouched();\r\n this.close();\r\n }\r\n\r\n cancel() {\r\n if (this.disabled) return;\r\n // if (this.shouldDeferSingleDateCommit()) {\r\n // this.finishPopupDismissal();\r\n // return;\r\n // }\r\n // this.startDate = null;\r\n // this.endDate = null;\r\n // this.selectedDates = [];\r\n // this.resetCalendarFocusAfterClear();\r\n this.close();\r\n }\r\n\r\n clear() {\r\n if (this.disabled) return;\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.startTime = null;\r\n this.endTime = null;\r\n this.selectedDates = [];\r\n this.activeRange = null;\r\n this.resetEmbeddedTimePickerUiState();\r\n\r\n this.resetCalendarFocusAfterClear();\r\n\r\n this.emitSelection();\r\n }\r\n\r\n chooseRange(key: string) {\r\n if (this.disabled || !this.customRanges) return;\r\n if (key === 'Custom Range') {\r\n this.activeRange = 'Custom Range';\r\n return;\r\n }\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 if (this.endDate) {\r\n this.keyboardFocusDate = new Date(this.endDate.getFullYear(), this.endDate.getMonth(), this.endDate.getDate());\r\n } else if (this.startDate) {\r\n this.keyboardFocusDate = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate());\r\n }\r\n\r\n // \"Custom Range\" returned above — here we only handle predefined presets.\r\n // Popup: quick-select preset → same as Apply (commit + close). Inline: keep prior emit / deferred rules.\r\n if (this.inline) {\r\n this.emitSelectionUnlessSingleDateDeferred();\r\n if (this.shouldDeferSingleDateCommit() && this.autoApply) {\r\n this.apply();\r\n }\r\n return;\r\n }\r\n this.apply();\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 hasValue =\r\n this.startDate != null ||\r\n this.endDate != null ||\r\n (this.multiDateSelection && this.selectedDates.length > 0);\r\n\r\n if (!hasValue) {\r\n this.selectedValue = null;\r\n this.onChange(null);\r\n this.selected.emit({\r\n startDate: null,\r\n endDate: null,\r\n startTime: null,\r\n endTime: null,\r\n selectedDates: [],\r\n });\r\n return;\r\n }\r\n\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 startTime: this.startTime ?? null,\r\n endTime: this.endTime ?? 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.selectedValue = selection;\r\n this.onChange(selection);\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 weekStart = this.getWeekStartDayIndex();\r\n const firstDayJs = new Date(year, month, 1).getDay();\r\n const offset = (firstDayJs - weekStart + 7) % 7;\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 for (let i = offset - 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 // Only show time when user has selected a time; use startTime/endTime strings so 12:00 AM shows as \"12:00 AM\" not \"00:00\"\r\n if (this.enableTimepicker && !this.dualCalendar && this.startTime != null) {\r\n dateStr += ` ${this.startTime}`;\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 && this.startTime != null) {\r\n dateStr += ` ${this.startTime}`;\r\n }\r\n if (this.endTime != null) {\r\n endStr += ` ${this.endTime}`;\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 | null) {\r\n if (time == null || time === '') {\r\n this.startTime = null;\r\n this.selectedHour = 1;\r\n this.selectedMinute = 0;\r\n this.selectedAMPM = 'AM';\r\n if (this.startDate) {\r\n this.startDate.setHours(0, 0, this.selectedSecond);\r\n }\r\n this.emitSelectionUnlessSingleDateDeferred();\r\n return;\r\n }\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 const timeStr = this.formatTimeToAmPm(hour12, minute, ampm);\r\n this.startTime = timeStr;\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 }\r\n\r\n this.emitSelectionUnlessSingleDateDeferred();\r\n }\r\n\r\n // NEW: Handle BkTimePicker change for dual calendar\r\n onDualTimePickerChange(time: string | null, isStart = true) {\r\n if (time == null || time === '') {\r\n if (isStart) {\r\n this.startTime = null;\r\n this.startHour = 1;\r\n this.startMinute = 0;\r\n this.startAMPM = 'AM';\r\n if (this.startDate) this.startDate.setHours(0, 0, this.startSecond);\r\n } else {\r\n this.endTime = null;\r\n this.endHour = 2;\r\n this.endMinute = 0;\r\n this.endAMPM = 'AM';\r\n if (this.endDate) this.endDate.setHours(0, 0, this.endSecond);\r\n }\r\n this.emitSelection();\r\n return;\r\n }\r\n const { hour12, minute, ampm } = this.parsePickerTimeString(time);\r\n const timeStr = this.formatTimeToAmPm(hour12, minute, ampm);\r\n\r\n if (isStart) {\r\n this.startHour = hour12;\r\n this.startMinute = minute;\r\n this.startAMPM = ampm;\r\n this.startTime = timeStr;\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 this.endTime = timeStr;\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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.emitSelectionUnlessSingleDateDeferred();\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 /**\r\n * Parse a date-only string (YYYY-MM-DD) as local date.\r\n * Using new Date('2026-02-21') would be UTC midnight and can show as previous day in local time.\r\n */\r\n private parseDateString(value: string): Date {\r\n if (!value || typeof value !== 'string') return new Date(value);\r\n const match = value.trim().match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\r\n if (match) {\r\n const y = parseInt(match[1], 10);\r\n const m = parseInt(match[2], 10) - 1;\r\n const d = parseInt(match[3], 10);\r\n if (m >= 0 && m <= 11 && d >= 1 && d <= 31) {\r\n return new Date(y, m, d);\r\n }\r\n }\r\n return new Date(value);\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\" [class.disabled]=\"disabled\">\r\n <!-- Input field -->\r\n <div #inputWrapper class=\"input-wrapper\" *ngIf=\"!inline\">\r\n <input\r\n type=\"text\"\r\n (click)=\"!disabled && toggle()\"\r\n (keydown.enter)=\"$event.preventDefault()\"\r\n (blur)=\"markAsTouched()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [attr.disabled]=\"disabled ? true : null\"\r\n [class.hasError]=\"hasError\"\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 type=\"button\" class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon && !disabled\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">×</button>\r\n </div>\r\n\r\n <!-- Calendar Popup / Inline -->\r\n <div #calendarPopup\r\n class=\"calendar-popup\"\r\n [class.inline-calendar]=\"inline\"\r\n [class.append-to-body]=\"appendToBody && !inline\"\r\n [style.position]=\"appendToBody && !inline ? 'fixed' : null\"\r\n [style.top]=\"appendToBody && !inline && !popupPlacementAbove ? dropdownStyle.top : null\"\r\n [style.bottom]=\"appendToBody && !inline && popupPlacementAbove ? dropdownStyle.bottom : null\"\r\n [style.left]=\"appendToBody && !inline ? dropdownStyle.left : null\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n [ngClass]=\"{\r\n 'position-right': !inline && !appendToBody && opens === 'right',\r\n 'position-center': !inline && !appendToBody && opens === 'center',\r\n 'drop-up': !inline && popupPlacementAbove,\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\"\r\n *ngIf=\"inline || show\">\r\n\r\n <!-- RANGES -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges\" role=\"listbox\" aria-label=\"Date ranges\">\r\n <button\r\n type=\"button\"\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n (keydown)=\"onRangeButtonKeydown($event, rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"activeRange === rangeKey\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges ? 'w-100 flex-grow-1 border-l border-[#eee]' : ''\">\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\" role=\"grid\" [attr.aria-label]=\"getMonthName(month) + ' ' + year\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\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-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(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 [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"singleTimeModel\"\r\n (ngModelChange)=\"onSingleTimePickerChange($event); singleTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\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\" role=\"grid\" [attr.aria-label]=\"getMonthName(leftMonth) + ' ' + leftYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\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-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(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 [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"startTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, true); startTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\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\" role=\"grid\" [attr.aria-label]=\"getMonthName(rightMonth) + ' ' + rightYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\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-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(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 [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"endTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, false); endTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\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 && showCancelApply\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\" [disabled]=\"disabled || isDualRangeApplyBlocked\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n@if (hasError){\r\n<p class=\"calender-error\">{{errorMessage}}</p>\r\n}\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 | null) {\r\n if (time == null) return;\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 | null) {\r\n if (time == null) return;\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 | null) {\r\n if (time == null || !this.multipleDates[index]) return;\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 onMultipleDateEndTimeChange(index: number, time: string | null) {\r\n if (time == null || !this.multipleDates[index]) return;\r\n this.multipleDates[index].endTime = time;\r\n this.emitScheduled();\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 | null) {\r\n if (time == null) return;\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 | null) {\r\n if (time == null) return;\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 const y = date.getFullYear();\r\n const m = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const d = date.getDate().toString().padStart(2, '0');\r\n return `${y}-${m}-${d}`;\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 (change)=\"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 (change)=\"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 (change)=\"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 (change)=\"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 (change)=\"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 (change)=\"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 * 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 ],\r\n exports: [\r\n BkCustomCalendar,\r\n BkScheduledDatePicker,\r\n BkTimePicker,\r\n\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>\r\n <div\r\n class=\"relative flex items-center justify-center border-2 transition-all duration-200 ease-in-out rounded 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 } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'bk-radio-button',\r\n standalone: true,\r\n imports: [CommonModule],\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 /**\r\n * The model value represented by this radio option.\r\n * Checked when the bound model `=== value`.\r\n */\r\n @Input() value: unknown;\r\n /**\r\n * Model value to write when de-selecting this radio (only when `allowDeselect` is true).\r\n */\r\n @Input() uncheckedValue: unknown = null;\r\n /**\r\n * If true, selecting an already-selected radio will clear the model to `uncheckedValue`.\r\n * Default false (standard radio behavior).\r\n */\r\n @Input() allowDeselect = false;\r\n @Input() disabled = false;\r\n @Input() variant: 'dot' | 'tick' = 'dot';\r\n\r\n @Output() change = new EventEmitter<unknown>();\r\n\r\n modelValue: unknown;\r\n\r\n onChange = (_: unknown) => {};\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 if (!this.allowDeselect) return;\r\n this.modelValue = this.uncheckedValue;\r\n this.onChange(this.uncheckedValue);\r\n this.onTouched();\r\n this.change.emit(this.uncheckedValue);\r\n return;\r\n }\r\n\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 get isChecked(): boolean {\r\n return this.modelValue === this.value;\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n this.modelValue = value;\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): 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 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 @Input() shadow: boolean = true;\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 [disabled]=\"disabled || loading\"\r\n (click)=\"onClick($event)\"\r\n class=\"{{buttonClasses}}\"\r\n [ngClass]=\"{ 'btn-shadow': shadow }\"\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 = 'xxxsm' | 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type IconButtonVariant = 'primary' | 'secondary' | 'none';\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 @Input() disabled: boolean = false;\r\n // Custom classes\r\n @Input() buttonClass: string = '';\r\n\r\n @Output() clicked = new EventEmitter<boolean>();\r\n @Output() hovered = 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 onMouseEnter() {\r\n if (!this.disabled) {\r\n this.hovered.emit(true);\r\n }\r\n }\r\n\r\n onMouseLeave() {\r\n if (!this.disabled) {\r\n this.hovered.emit(false);\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 (mouseenter)=\"onMouseEnter()\"\r\n (mouseleave)=\"onMouseLeave()\"\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 @if (label) {\r\n <label 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 [autocomplete]=\"autoComplete\"\r\n rows=\"{{ rows }}\"\r\n class=\"w-full px-3 py-2.5 text-sm border border-[#E3E3E7] outline-none transition-colors duration-200 bg-white resize-y placeholder:text-[#6B7080] rounded bk-textarea-shadow \"\r\n [ngClass]=\"{\r\n 'border-[#FA727A]': hasError && !disabled,\r\n 'focus:border-[#6B7080]': !hasError && !disabled,\r\n '!bg-[#F4F4F6] !text-[#A1A3AE] cursor-not-allowed !border-[#E3E3E7]': 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 <div class=\"flex-1\">\r\n @if (hasError) {\r\n <span class=\"font-medium text-xs leading-normal text-[#C10007] text-left\">\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 class=\"text-[#868997] tabular-nums flex-shrink-0\">\r\n {{ value.length }}/{{ maxlength }}\r\n </div>\r\n }\r\n </div>\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 @Input('bkTooltipScrollable') scrollable: boolean = false;\r\n @Input('bkTooltipMaxHeight') maxHeight: string = '300px';\r\n @Input('bkTooltipSize') tooltipSize: 'sm' | 'md' = 'md';\r\n @Input('bkTooltipAutoHeight') autoHeight: boolean = true; // Auto-adjust height based on available space\r\n\r\n private tooltipElement: HTMLElement | null = null;\r\n private contentWrapper: HTMLElement | null = null;\r\n private isHoveringTooltip: boolean = false;\r\n private hideTimeout: any = null;\r\n private tooltipListeners: (() => void)[] = [];\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 if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n this.cleanupTooltipListeners();\r\n this.removeTooltip();\r\n }\r\n\r\n\r\n updateTooltipContent() {\r\n // If content is now empty, destroy the tooltip so it no longer shows on hover\r\n if (this.isTooltipContentEmpty()) {\r\n this.removeTooltip();\r\n return;\r\n }\r\n\r\n // If tooltip doesn't exist yet and content is now available, create it\r\n if (!this.tooltipElement) {\r\n this.createTooltip();\r\n return;\r\n }\r\n\r\n // Update existing tooltip: remove old text nodes and re-append updated content\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 // Append to wrapper if scrollable, otherwise to tooltip directly\r\n const target = this.contentWrapper || this.tooltipElement;\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(target, div);\r\n });\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n // Clear any pending hide timeout\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n\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 // Don't hide immediately - wait a bit to see if mouse moves to tooltip\r\n // Only hide if not hovering over tooltip\r\n if (!this.isHoveringTooltip) {\r\n this.hideTimeout = setTimeout(() => {\r\n if (!this.isHoveringTooltip && this.tooltipElement) {\r\n this.hideTooltip();\r\n }\r\n }, 100); // Small delay to allow mouse to move to tooltip\r\n }\r\n }\r\n\r\n // private hideTooltip() {\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');\r\n // }\r\n // }\r\n\r\n // Hide tooltip the instant *any* mousedown happens, not just on this host:\r\n // otherwise a tooltip shown by hovering one element (e.g. a \"+N\" badge)\r\n // can still be mid-fade — mouseleave's hide is debounced 100ms and the\r\n // fade itself takes 300ms — when a click elsewhere opens something else\r\n // (a dropdown panel, another tooltip's host), so the two stack visibly.\r\n // Also covers CDK drag-drop, which steals the element before mouseleave fires.\r\n @HostListener('document:mousedown')\r\n @HostListener('touchstart')\r\n onInteract() {\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n this.hideTooltipInstant();\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\r\n /** Snap-hide with no fade: used when something else (a dropdown panel, another\r\n * tooltip) is opening right now, so the two never visibly overlap mid-fade. */\r\n private hideTooltipInstant() {\r\n if (this.tooltipElement) {\r\n this.renderer.setStyle(this.tooltipElement, 'transition', 'none');\r\n this.hideTooltip();\r\n requestAnimationFrame(() => {\r\n if (this.tooltipElement) this.renderer.removeStyle(this.tooltipElement, 'transition');\r\n });\r\n }\r\n this.isHoveringTooltip = false;\r\n }\r\n\r\n private hideTooltip() {\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 this.isHoveringTooltip = false;\r\n }\r\n\r\n private setupTooltipHoverListeners() {\r\n if (!this.tooltipElement) return;\r\n\r\n // Clean up existing listeners\r\n this.cleanupTooltipListeners();\r\n\r\n // Add mouseenter listener to tooltip\r\n const mouseEnterListener = this.renderer.listen(this.tooltipElement, 'mouseenter', () => {\r\n this.isHoveringTooltip = true;\r\n // Clear any pending hide timeout\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n // Ensure tooltip is visible\r\n if (this.tooltipElement) {\r\n this.setStyle(this.tooltipElement, {\r\n visibility: 'visible',\r\n opacity: '1',\r\n });\r\n }\r\n });\r\n\r\n // Add mouseleave listener to tooltip\r\n const mouseLeaveListener = this.renderer.listen(this.tooltipElement, 'mouseleave', () => {\r\n this.isHoveringTooltip = false;\r\n // Hide tooltip after a short delay\r\n this.hideTimeout = setTimeout(() => {\r\n this.hideTooltip();\r\n }, 100);\r\n });\r\n\r\n // Store listeners for cleanup\r\n this.tooltipListeners = [mouseEnterListener, mouseLeaveListener];\r\n }\r\n\r\n private cleanupTooltipListeners() {\r\n this.tooltipListeners.forEach(cleanup => cleanup());\r\n this.tooltipListeners = [];\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 this.renderer.addClass(this.tooltipElement, `bk-tooltip-${this.tooltipSize}`);\r\n\r\n // Add scrollable class if needed\r\n if (this.scrollable) {\r\n this.renderer.addClass(this.tooltipElement, 'bk-tooltip-scrollable');\r\n }\r\n\r\n // Create wrapper for content if scrollable\r\n if (this.scrollable) {\r\n this.contentWrapper = this.renderer.createElement('div');\r\n this.renderer.addClass(this.contentWrapper, 'bk-tooltip-content-wrapper');\r\n this.renderer.setStyle(this.contentWrapper, 'max-height', this.maxHeight);\r\n this.renderer.appendChild(this.tooltipElement, this.contentWrapper);\r\n }\r\n\r\n // Add content\r\n const contentLines = Array.isArray(this.tooltipContent)\r\n ? this.tooltipContent\r\n : [this.tooltipContent];\r\n\r\n const target = this.contentWrapper || this.tooltipElement;\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(target, 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 maxWidth: '300px',\r\n wordBreak: 'normal', // ← only break at spaces\r\n overflowWrap: 'normal', // ← don't force break\r\n whiteSpace: 'pre-wrap', // ← ← ← KEY: respects spaces, wraps at word boundaries\r\n boxSizing: 'border-box',\r\n });\r\n\r\n this.renderer.appendChild(document.body, this.tooltipElement);\r\n\r\n // Setup hover listeners for the tooltip itself\r\n this.setupTooltipHoverListeners();\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 let tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n\r\n const triangle = this.tooltipElement.querySelector('.bk-tooltip-triangle') as HTMLElement;\r\n const padding = 10;\r\n const viewportHeight = window.innerHeight;\r\n const viewportWidth = window.innerWidth;\r\n\r\n // Get content wrapper reference\r\n const contentWrapper = this.tooltipElement.querySelector('.bk-tooltip-content-wrapper') as HTMLElement;\r\n\r\n // Get actual content height first (without max-height constraint)\r\n let contentHeight = 0;\r\n\r\n if (contentWrapper && this.scrollable) {\r\n // Temporarily remove max-height to get actual content height\r\n const originalMaxHeight = contentWrapper.style.maxHeight;\r\n this.renderer.setStyle(contentWrapper, 'max-height', 'none');\r\n // Force reflow to get accurate scrollHeight\r\n contentWrapper.offsetHeight;\r\n contentHeight = contentWrapper.scrollHeight;\r\n // Restore original styles\r\n this.renderer.setStyle(contentWrapper, 'max-height', originalMaxHeight);\r\n }\r\n\r\n // Calculate available space and adjust max-height if scrollable and auto-height is enabled\r\n if (this.scrollable && this.autoHeight && contentWrapper && contentHeight > 0) {\r\n const spaceInfo = this.calculateAvailableSpace(\r\n hostRect,\r\n this.tooltipPosition,\r\n viewportHeight,\r\n viewportWidth,\r\n padding,\r\n contentHeight\r\n );\r\n\r\n if (spaceInfo.available > 0) {\r\n // Set optimal height\r\n const heightToUse = spaceInfo.optimalHeight;\r\n this.renderer.setStyle(contentWrapper, 'max-height', `${heightToUse}px`);\r\n\r\n // Only enable scroll if content exceeds available space\r\n if (spaceInfo.needsScroll) {\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', 'auto');\r\n } else {\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', 'hidden');\r\n }\r\n\r\n // Force a reflow to get updated dimensions\r\n contentWrapper.offsetHeight;\r\n }\r\n }\r\n\r\n // Recalculate tooltip dimensions after max-height adjustment\r\n tooltipRect = this.tooltipElement.getBoundingClientRect();\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 + hostRect.height / 2;\r\n left =\r\n this.tooltipPosition === 'right'\r\n ? hostRect.right + padding\r\n : hostRect.left - tooltipRect.width - padding;\r\n\r\n // Auto flip if out of viewport\r\n if (this.tooltipPosition === 'right' && left + tooltipRect.width > viewportWidth) {\r\n left = hostRect.left - tooltipRect.width - padding;\r\n } else if (this.tooltipPosition === 'left' && left < 0) {\r\n left = hostRect.right + 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);\r\n break;\r\n\r\n case 'top':\r\n case 'bottom':\r\n left = hostRect.left + hostRect.width / 2 - tooltipRect.width / 2;\r\n top = this.tooltipPosition === 'top'\r\n ? hostRect.top - tooltipRect.height - padding\r\n : hostRect.bottom + padding;\r\n\r\n // Prevent overflow\r\n left = Math.max(10, Math.min(left, viewportWidth - tooltipRect.width - 10));\r\n\r\n // Adjust vertically if tooltip goes out of viewport\r\n if (this.tooltipPosition === 'bottom' && top + tooltipRect.height > viewportHeight) {\r\n // Try positioning above instead\r\n if (hostRect.top - tooltipRect.height - padding >= 0) {\r\n top = hostRect.top - tooltipRect.height - padding;\r\n // Recalculate available space for top position\r\n if (this.scrollable && this.autoHeight && contentWrapper && contentHeight > 0) {\r\n const spaceInfo = this.calculateAvailableSpace(\r\n hostRect,\r\n 'top',\r\n viewportHeight,\r\n viewportWidth,\r\n padding,\r\n contentHeight\r\n );\r\n if (spaceInfo.available > 0) {\r\n this.renderer.setStyle(contentWrapper, 'max-height', `${spaceInfo.optimalHeight}px`);\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', spaceInfo.needsScroll ? 'auto' : 'hidden');\r\n contentWrapper.offsetHeight;\r\n tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n }\r\n }\r\n this.setTriangleStyles(triangle, 'top');\r\n }\r\n } else if (this.tooltipPosition === 'top' && top < 0) {\r\n // Try positioning below instead\r\n if (hostRect.bottom + tooltipRect.height + padding <= viewportHeight) {\r\n top = hostRect.bottom + padding;\r\n // Recalculate available space for bottom position\r\n if (this.scrollable && this.autoHeight && contentWrapper && contentHeight > 0) {\r\n const spaceInfo = this.calculateAvailableSpace(\r\n hostRect,\r\n 'bottom',\r\n viewportHeight,\r\n viewportWidth,\r\n padding,\r\n contentHeight\r\n );\r\n if (spaceInfo.available > 0) {\r\n this.renderer.setStyle(contentWrapper, 'max-height', `${spaceInfo.optimalHeight}px`);\r\n this.renderer.setStyle(contentWrapper, 'overflow-y', spaceInfo.needsScroll ? 'auto' : 'hidden');\r\n contentWrapper.offsetHeight;\r\n tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n }\r\n }\r\n this.setTriangleStyles(triangle, 'bottom');\r\n }\r\n } else {\r\n this.setTriangleStyles(triangle, this.tooltipPosition);\r\n }\r\n\r\n this.setStyle(this.tooltipElement, {\r\n transform: 'translateX(0)',\r\n });\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 /**\r\n * Calculates available space for tooltip based on position\r\n * Returns: { available: number, needsScroll: boolean, optimalHeight: number }\r\n */\r\n private calculateAvailableSpace(\r\n hostRect: DOMRect,\r\n tooltipPosition: 'left' | 'right' | 'top' | 'bottom',\r\n viewportHeight: number,\r\n viewportWidth: number,\r\n padding: number,\r\n contentHeight: number\r\n ): { available: number; needsScroll: boolean; optimalHeight: number } {\r\n if (!this.scrollable || !this.autoHeight) {\r\n return { available: 0, needsScroll: false, optimalHeight: 0 };\r\n }\r\n\r\n let availableSpace = 0;\r\n const minHeight = 100;\r\n const maxHeightLimit = parseInt(this.maxHeight) || 300;\r\n const buffer = 35; // Extra buffer to prevent cutting\r\n\r\n switch (tooltipPosition) {\r\n case 'bottom':\r\n const spaceBelow = viewportHeight - hostRect.bottom - padding - buffer;\r\n availableSpace = Math.max(minHeight, Math.min(spaceBelow, maxHeightLimit));\r\n break;\r\n\r\n case 'top':\r\n const spaceAbove = hostRect.top - padding - buffer;\r\n availableSpace = Math.max(minHeight, Math.min(spaceAbove, maxHeightLimit));\r\n break;\r\n\r\n case 'left':\r\n case 'right':\r\n const spaceBelowSide = viewportHeight - hostRect.bottom - padding - buffer;\r\n const spaceAboveSide = hostRect.top - padding - buffer;\r\n const maxVerticalSpace = Math.max(spaceBelowSide, spaceAboveSide);\r\n availableSpace = Math.max(minHeight, Math.min(maxVerticalSpace, maxHeightLimit));\r\n break;\r\n }\r\n\r\n // Check if content fits without scroll\r\n const needsScroll = contentHeight > availableSpace;\r\n // Optimal height: use content height if it fits, otherwise use available space\r\n const optimalHeight = needsScroll ? availableSpace : contentHeight;\r\n\r\n return { available: availableSpace, needsScroll, optimalHeight };\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 this.contentWrapper = 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\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { CdkDragDrop, moveItemInArray, CdkDragMove, CdkDragStart, CdkDrag, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { BKTooltipDirective } from '../../../tooltip/tooltip.directive';\r\nimport { BkBadge } from '../../../badge/badge';\r\nimport { TableAction, TableBadge, TableColumn, TableIcon } from '../../models/grid.model';\r\nimport { BkCheckbox } from '../../../checkbox/checkbox';\r\nexport type SortDirection = 'asc' | 'desc';\r\n@Component({\r\n selector: 'bk-grid',\r\n standalone: true,\r\n imports: [CommonModule,DragDropModule,ScrollingModule,BkBadge,BKTooltipDirective,BkCheckbox,FormsModule],\r\n templateUrl: './grid.html',\r\n styleUrl: './grid.css',\r\n})\r\nexport class BkGrid<T = any> {\r\n /* ================= Inputs ================= */\r\n\r\n @Input() draggable: boolean = false;\r\n @Input() columns: TableColumn<T>[] = [];\r\n @Input() result!: T[];\r\n @Input() actions: TableAction<T>[] | ((row: T) => TableAction<T>[]) = [];\r\n @Input() customClass: string = 'h-[calc(100vh-260px)]';\r\n @Input() actionIconClass: string = '';\r\n @Input() actionClass: string = '';\r\n @Input() showNoRecords: boolean = false;\r\n @Input() noRecordFoundHeight: string = '';\r\n /** Custom illustration for the empty state. Falls back to a built-in SVG when omitted. */\r\n @Input() noRecordImgUrl?: string;\r\n @Input() noRecordMessage: string = 'Data may be empty, or try adjusting your filter.';\r\n @Output() change = new EventEmitter<{\r\n row: T;\r\n column: TableColumn<T>\r\n }>();\r\n /* ================= Outputs ================= */\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\r\n @Output() dragDropChange = new EventEmitter<T[]>();\r\n\r\n /* ================= Sorting ================= */\r\n\r\n sortColumn?: keyof T;\r\n sortDirection: SortDirection = 'asc';\r\n\r\n /* ================= ViewChild ================= */\r\n\r\n @ViewChild('tableScrollContainer', { static: false })\r\n tableScrollContainer!: ElementRef<HTMLDivElement>;\r\n\r\n /* ================= Helpers ================= */\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\r\n /* ================= Sorting ================= */\r\n\r\n sort(column: TableColumn<T>, index: number) {\r\n if (!column.sortable || !column.field) return;\r\n\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 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\r\n isColumnVisible(column: TableColumn<T>): boolean {\r\n return column.visible !== false;\r\n }\r\n\r\n /* ================= Cell Value ================= */\r\n\r\n getCellValue(row: T, column: TableColumn<T>): string {\r\n if (column.formatter) {\r\n return column.formatter(row);\r\n }\r\n\r\n if (column.field) {\r\n return String(row[column.field] ?? '');\r\n }\r\n\r\n return '';\r\n }\r\n\r\n /* ================= Checkbox ================= */\r\n\r\n getCheckboxValue(row: T, column: TableColumn<T>): boolean {\r\n if (!column.field) return false;\r\n return !!(row as any)[column.field];\r\n }\r\n\r\n setCheckboxValue(row: T, column: TableColumn<T>, value: boolean): void {\r\n if (column.field){\r\n (row as any)[column.field] = value;\r\n this.change.emit({row: row,column:column});\r\n }\r\n }\r\n\r\n /* ================= Badges ================= */\r\n\r\n getBadge(row: T, column: TableColumn<T>): TableBadge | undefined {\r\n if (!column.badges) return undefined;\r\n const list = typeof column.badges === 'function' ? column.badges(row) : column.badges;\r\n return list.find((b) => b.label === this.getCellValue(row, column));\r\n }\r\n\r\n /* ================= Icons ================= */\r\n\r\n getIcons(row: T, column: TableColumn<T>): TableIcon[] {\r\n if (!column.icons) return [];\r\n\r\n return typeof column.icons === 'function' ? column.icons(row) : column.icons;\r\n }\r\n\r\n /* ================= Tooltip ================= */\r\n\r\n getTooltipValue(row: T, column: TableColumn<T>): string {\r\n if (column.toolTipField) {\r\n return String(row[column.toolTipField] ?? '');\r\n }\r\n return '';\r\n }\r\n /* ================= Actions ================= */\r\n\r\n getRowActions(row: T, column?: TableColumn<T>): TableAction<T>[] {\r\n const source = column?.actions ?? this.actions;\r\n\r\n if (!source) return [];\r\n\r\n return typeof source === 'function' ? source(row) : source;\r\n }\r\n\r\n isActionVisible(action: TableAction<T>, row: T): boolean {\r\n if (!action.hasPermission) return false;\r\n\r\n if (typeof action.visible === 'function') {\r\n return action.visible(row);\r\n }\r\n\r\n if (typeof action.visible === 'boolean') {\r\n return action.visible;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n isActionDisabled(action: TableAction<T>, row: T): boolean {\r\n if (typeof action.disabled === 'function') {\r\n return action.disabled(row);\r\n }\r\n\r\n return !!action.disabled;\r\n }\r\n\r\n emitAction(action: TableAction<T>, row: T) {\r\n if (action.onClick) {\r\n action.onClick(row);\r\n }\r\n\r\n this.actionClick.emit({\r\n action: action.name,\r\n row,\r\n });\r\n }\r\n\r\n /* ================= Drag Drop ================= */\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 this.result.forEach((item: any, index) => {\r\n item.sortOrder = index + 1;\r\n });\r\n\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 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 get noRecordImagePath(): string {\r\n return this.noRecordImgUrl || '../../../../assets/icons/no-data-found.jpg';\r\n }\r\n}\r\n\r\n","<div #tableScrollContainer cdkScrollable class=\"overflow-y-auto\" [ngClass]=\"customClass\">\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\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-[-1px]\"\r\n [class.cursor-pointer]=\"col.sortable\"\r\n [class.cursor-default]=\"!col.sortable\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n class=\"{{ col.headerClass }} {{ col.cellClass }}\"\r\n (click)=\"sort(col, i)\"\r\n >\r\n <!-- [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\" -->\r\n <span\r\n class=\"flex items-center gap-1\"\r\n [ngClass]=\"\r\n sortColumn === col.field\r\n ? sortDirection === 'asc'\r\n ? 'grid-asc'\r\n : 'grid-desc'\r\n : ''\r\n \"\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 {{actionClass}}\">Action</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=\"\"\r\n [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\r\n cdkDragHandle\r\n class=\"mr-2 text-gray-400\"\r\n [ngClass]=\"{ 'cursor-move': draggable }\"\r\n >☰</span\r\n >\r\n }\r\n @if (col.checkbox) {\r\n <bk-checkbox\r\n checkboxClass=\"sm\"\r\n [ngModel]=\"getCheckboxValue(row, col)\"\r\n (ngModelChange)=\"setCheckboxValue(row, col, $event)\"\r\n [disabled]=\"typeof col.checkboxDisabled === 'function' ? col.checkboxDisabled(row) : col.checkboxDisabled || false\"\r\n [bkTooltip]=\"typeof col.checkboxTooltip === 'function' ? col.checkboxTooltip(row) : col.checkboxTooltip || ''\"\r\n [bkTooltipPosition]=\"col.checkboxTooltipPosition || 'top'\"\r\n ></bk-checkbox>\r\n } @else if (col.badges) {\r\n @let badge = getBadge(row, col);\r\n @if (badge) {\r\n <bk-badge\r\n [label]=\"badge.label\"\r\n [variant]=\"badge.variant\"\r\n [size]=\"badge.size\"\r\n [color]=\"badge.color\"\r\n [dot]=\"badge.dot\"\r\n [customClass]=\"badge.customClass\"\r\n [bkTooltip]=\"badge.toolTipLabel || ''\"\r\n [bkTooltipPosition]=\"badge.tooltipPosition || 'top'\"\r\n ></bk-badge>\r\n }\r\n } @else if (col.icons) {\r\n @let iconsList = getIcons(row, col);\r\n <div class=\"flex justify-center items-center gap-2\">\r\n @for (icon of iconsList; track $index) {\r\n @if(icon.url){\r\n <img\r\n [src]=\"icon.url\"\r\n class=\"size-4\"\r\n [ngClass]=\"{ 'cursor-pointer': icon.url }\"\r\n [bkTooltip]=\"icon.toolTipLabel || []\"\r\n [bkTooltipPosition]=\"icon.tooltipPosition || 'top'\"\r\n />\r\n }\r\n }\r\n </div>\r\n } @else if (col.toolTipField) {\r\n <span\r\n [bkTooltip]=\"getTooltipValue(row, col)\"\r\n [bkTooltipPosition]=\"col.toolTipPosition || 'top'\"\r\n >\r\n {{ getCellValue(row, col) }}\r\n </span>\r\n } @else {\r\n {{ getCellValue(row, col) }}\r\n }\r\n </td>\r\n }\r\n }\r\n\r\n @if (getRowActions(row).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 getRowActions(row); track action.name) {\r\n @if (isActionVisible(action, row)) {\r\n <!-- <bk-icon-button\r\n [bkTooltip]=\"action.tooltip\"\r\n [size]=\"\"\r\n [bkTooltipPosition]=\"action?.tooltipPosition || 'top'\"\r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA]\"\r\n (clicked)=\"emitAction(action, row)\"\r\n [disabled]=\"isActionDisabled(action, row)\">\r\n </bk-icon-button> -->\r\n <button\r\n [bkTooltip]=\"action.tooltip\"\r\n [bkTooltipPosition]=\"action?.tooltipPosition || 'top'\"\r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA] {{actionIconClass}}\"\r\n (click)=\"emitAction(action, row)\"\r\n [disabled]=\"isActionDisabled(action, row)\"\r\n >\r\n <img [src]=\"action.icon\" width=\"14\" height=\"14\" alt=\"action-icon\" />\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n @if (showNoRecords) {\r\n <tr>\r\n <td\r\n [attr.colspan]=\"columns.length + (actions.length ? 1 : 0)\"\r\n class=\"text-center py-10 {{ noRecordFoundHeight }}\"\r\n >\r\n <div class=\"flex flex-col justify-center items-center w-full h-auto\">\r\n <img\r\n [src]=\"noRecordImagePath\"\r\n class=\"mb-3 w-96\"\r\n alt=\"No data found\"\r\n />\r\n\r\n <span class=\"block text-sm leading-3 text-center font-semibold text-[#60646C] mt-2\"\r\n >{{ noRecordMessage }}</span\r\n >\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, forwardRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\n\r\n\r\n/** `xxsm` (16px) fits inside an 18px text line box and inside a bordered chip —\r\n * use it inline in form controls so adding an avatar can't change the height. */\r\nexport type AvatarSize = 'xxsm' | 'xsm' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\nexport type AvatarVariant = 'gray' | 'colored';\r\nexport type DotStatus = 'active' | 'inactive' | 'notification' | 'none';\r\nexport type DotPosition = 'bottom-right' | 'top-left';\r\nexport type AvatarFallback = 'auto' | 'initials' | 'icon';\r\n\r\n@Component({\r\n selector: 'bk-avatar',\r\n standalone: true,\r\n imports: [CommonModule, BKTooltipDirective],\r\n templateUrl: './ui-avatar.html',\r\n styleUrls: ['./ui-avatar.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkAvatar),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkAvatar implements OnChanges, ControlValueAccessor {\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n // ---------- Display Inputs ----------\r\n @Input() src: string | null = null;\r\n @Input() alt = 'Avatar';\r\n @Input() name = '';\r\n @Input() initialsOverride = '';\r\n @Input() tooltipContent: string | string[] | null = null;\r\n @Input() bgColor: string | null = null;\r\n @Input() textColor: string | null = null;\r\n\r\n @Input() size: AvatarSize = 'md';\r\n @Input() variant: AvatarVariant = 'gray';\r\n @Input() fallback: AvatarFallback = 'auto';\r\n\r\n @Input() dot: DotStatus = 'none';\r\n @Input() dotPosition: DotPosition = 'bottom-right';\r\n\r\n // ---------- Outputs ----------\r\n /** Emits when the provided image URL fails to load */\r\n @Output() imageLoadError = new EventEmitter<void>();\r\n\r\n // ---------- Internal State ----------\r\n initials = '';\r\n imageLoadFailed = false;\r\n\r\n // ---------- CVA Callbacks ----------\r\n private onChange = (_value: string | null) => {};\r\n private onTouched = () => {};\r\n\r\n /**\r\n * Called by the forms system when the model value changes (ngModel / formControl).\r\n * Sets the src directly and tells OnPush to re-check the template.\r\n */\r\n writeValue(value: string | null): void {\r\n this.src = value || null;\r\n this.imageLoadFailed = false;\r\n // OnPush won't detect this change on its own because writeValue\r\n // is called programmatically by the forms system — not through an\r\n // @Input binding. markForCheck tells Angular: \"this component's\r\n // template might have changed, check it on the next CD cycle.\"\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(_isDisabled: boolean): void {\r\n // Display-only component — disabled doesn't change visual behaviour,\r\n // but we still honour the CVA contract.\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ---------- Lifecycle ----------\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['name'] || changes['initialsOverride']) {\r\n this.initials = this.initialsOverride || this.getInitials(this.name);\r\n }\r\n // Reset error state whenever a new src arrives via @Input\r\n if (changes['src']) {\r\n this.imageLoadFailed = false;\r\n }\r\n }\r\n\r\n onImageError(): void {\r\n this.imageLoadFailed = true;\r\n this.imageLoadError.emit();\r\n }\r\n\r\n // ---------- Derived UI ----------\r\n get showImage(): boolean {\r\n return !!(this.src) && !this.imageLoadFailed;\r\n }\r\n\r\n get showInitials(): boolean {\r\n if (this.showImage) return false;\r\n if (!this.name) return false;\r\n if (this.fallback === 'icon') return false;\r\n return true; // 'auto' and 'initials' both show initials when name is present\r\n }\r\n\r\n get showIcon(): boolean {\r\n return !this.showImage && !this.showInitials;\r\n }\r\n\r\n get containerClasses(): string {\r\n return [\r\n 'avatar',\r\n this.size,\r\n VARIANT_MAP[this.variant]\r\n ].join(' ');\r\n }\r\n\r\n get containerStyles(): Record<string, string> | null {\r\n const styles: Record<string, string> = {};\r\n if (this.bgColor) {\r\n styles['background'] = this.bgColor;\r\n }\r\n if (this.textColor) {\r\n styles['color'] = this.textColor;\r\n }\r\n return Object.keys(styles).length ? styles : null;\r\n }\r\n\r\n get resolvedTooltip(): string | string[] {\r\n return this.tooltipContent ?? this.name;\r\n }\r\n\r\n get dotClasses(): string {\r\n return [\r\n 'avatar-dot',\r\n this.size,\r\n DOT_COLOR_MAP[this.dot],\r\n DOT_POSITION_MAP[this.dotPosition]\r\n ].join(' ');\r\n }\r\n\r\n // ---------- Utils ----------\r\n private getInitials(name: string): string {\r\n if (!name?.trim()) return '';\r\n const normalized = name.includes(',')\r\n ? name.split(',').map(part => part.trim()).filter(Boolean).reverse().join(' ')\r\n : name.trim();\r\n const parts = normalized.split(/\\s+/);\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts.at(-1)![0]).toUpperCase();\r\n }\r\n}\r\n\r\n// ---------- Constants ----------\r\nconst VARIANT_MAP: Record<AvatarVariant, string> = {\r\n gray: 'bg-white border border-[#EFEFF1] text-[#363C51]',\r\n colored: 'bg-[#F63D68] border border-white text-white'\r\n};\r\n\r\nconst DOT_COLOR_MAP: Record<DotStatus, string> = {\r\n active: 'active',\r\n inactive: 'inactive',\r\n notification: 'notification',\r\n none: 'hidden'\r\n};\r\n\r\nconst DOT_POSITION_MAP: Record<DotPosition, string> = {\r\n 'bottom-right': 'bottom-0 right-0',\r\n 'top-left': 'top-0.5 -left-0.5'\r\n};\r\n","<div\r\n [ngClass]=\"containerClasses\"\r\n [ngStyle]=\"containerStyles\"\r\n [bkTooltip]=\"resolvedTooltip\"\r\n [bkTooltipPosition]=\"'top'\"\r\n>\r\n\r\n @if (showImage) {\r\n <img\r\n [src]=\"src\"\r\n [alt]=\"alt\"\r\n class=\"avatar-img\"\r\n (error)=\"onImageError()\"\r\n />\r\n }\r\n\r\n @else if (showInitials) {\r\n <span class=\"avatar-text\">\r\n {{ initials }}\r\n </span>\r\n }\r\n\r\n @else {\r\n <svg\r\n class=\"placeholder-icon\"\r\n viewBox=\"0 0 32 32\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M16 16c3.682 0 6.667-2.985 6.667-6.667S19.682 2.667 16 2.667 9.333 5.651 9.333 9.333 12.318 16 16 16Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M27.453 29.333C27.453 24.173 22.32 20 16 20S4.547 24.173 4.547 29.333\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n }\r\n\r\n @if (dot !== 'none') {\r\n <span [ngClass]=\"dotClasses\"></span>\r\n }\r\n\r\n</div>\r\n","/* =========================================================================\r\n Derives a full UI appearance (background / text / border / dot) from a\r\n single accent colour. Shared by bk-status-select, bk-select and\r\n bk-hierarchical-select so colour handling stays identical across all three.\r\n ========================================================================= */\r\n\r\n/** How an accent colour is applied to a control. */\r\nexport type ColorFill = 'subtle' | 'solid' | 'none';\r\n\r\n/** Resolved colours for one accent. */\r\nexport interface ColorAppearance {\r\n backgroundColor: string | null;\r\n color: string | null;\r\n borderColor: string | null;\r\n dotColor: string | null;\r\n}\r\n\r\ninterface Rgb { r: number; g: number; b: number; }\r\n\r\nconst BLACK: Rgb = { r: 0, g: 0, b: 0 };\r\nconst WHITE: Rgb = { r: 255, g: 255, b: 255 };\r\n\r\nconst HEX3 = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i;\r\nconst HEX6 = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\r\nconst RGB_FN = /^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i;\r\n// Accepts both the legacy comma form and the modern space form, and an optional\r\n// `deg` on the hue: hsl(210, 50%, 40%), hsl(210 50% 40%), hsla(210deg,50%,40%,.5).\r\nconst HSL_FN = /^hsla?\\(\\s*([\\d.]+)(?:deg)?\\s*[,\\s]\\s*([\\d.]+)%\\s*[,\\s]\\s*([\\d.]+)%/i;\r\n\r\n/** The neutral look used when there is no colour (or an unparseable one). */\r\nexport const NEUTRAL_APPEARANCE: ColorAppearance = {\r\n backgroundColor: null,\r\n color: null,\r\n borderColor: null,\r\n dotColor: null\r\n};\r\n\r\n/**\r\n * Parses hex, rgb()/rgba() and hsl()/hsla() colours. Named CSS colours (\"red\")\r\n * are not supported — they'd need a live DOM to resolve — and return null, which\r\n * makes the caller fall back to the neutral (uncoloured) appearance.\r\n */\r\nexport function parseColor(input: string | null | undefined): Rgb | null {\r\n if (!input) return null;\r\n const s = String(input).trim();\r\n\r\n let m = HEX3.exec(s);\r\n if (m) {\r\n return {\r\n r: parseInt(m[1] + m[1], 16),\r\n g: parseInt(m[2] + m[2], 16),\r\n b: parseInt(m[3] + m[3], 16)\r\n };\r\n }\r\n\r\n m = HEX6.exec(s);\r\n if (m) {\r\n return { r: parseInt(m[1], 16), g: parseInt(m[2], 16), b: parseInt(m[3], 16) };\r\n }\r\n\r\n m = RGB_FN.exec(s);\r\n if (m) {\r\n return { r: clampChannel(+m[1]), g: clampChannel(+m[2]), b: clampChannel(+m[3]) };\r\n }\r\n\r\n m = HSL_FN.exec(s);\r\n if (m) {\r\n return hslToRgb(+m[1], +m[2], +m[3]);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction clampChannel(v: number): number {\r\n return Math.max(0, Math.min(255, Math.round(v)));\r\n}\r\n\r\n/**\r\n * HSL → RGB. Everything downstream (luminance, mixing, tint alpha) works in RGB,\r\n * so hsl inputs are converted here at the boundary rather than special-cased\r\n * later. Hue wraps at 360; saturation and lightness are clamped to 0–100%.\r\n */\r\nfunction hslToRgb(h: number, s: number, l: number): Rgb {\r\n h = ((h % 360) + 360) % 360;\r\n s = Math.max(0, Math.min(100, s)) / 100;\r\n l = Math.max(0, Math.min(100, l)) / 100;\r\n\r\n const c = (1 - Math.abs(2 * l - 1)) * s;\r\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\r\n const min = l - c / 2;\r\n\r\n let r = 0, g = 0, b = 0;\r\n if (h < 60) { r = c; g = x; }\r\n else if (h < 120) { r = x; g = c; }\r\n else if (h < 180) { g = c; b = x; }\r\n else if (h < 240) { g = x; b = c; }\r\n else if (h < 300) { r = x; b = c; }\r\n else { r = c; b = x; }\r\n\r\n return {\r\n r: clampChannel((r + min) * 255),\r\n g: clampChannel((g + min) * 255),\r\n b: clampChannel((b + min) * 255)\r\n };\r\n}\r\n\r\n/** WCAG relative luminance — used to decide whether text needs to be light or dark. */\r\nfunction luminance({ r, g, b }: Rgb): number {\r\n const [lr, lg, lb] = [r, g, b].map(v => {\r\n const c = v / 255;\r\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\r\n });\r\n return 0.2126 * lr + 0.7152 * lg + 0.0722 * lb;\r\n}\r\n\r\n/** Linear blend of `c` toward `target`. amount 0 = c, 1 = target. */\r\nfunction mix(c: Rgb, target: Rgb, amount: number): Rgb {\r\n return {\r\n r: Math.round(c.r + (target.r - c.r) * amount),\r\n g: Math.round(c.g + (target.g - c.g) * amount),\r\n b: Math.round(c.b + (target.b - c.b) * amount)\r\n };\r\n}\r\n\r\n/**\r\n * Darkens a colour until it reads acceptably as text on a light tint. Pastel\r\n * accents (light yellows, mints) are unreadable at full strength, so they get\r\n * stepped toward black; already-dark accents pass through untouched.\r\n */\r\nfunction readableOnLight(c: Rgb): Rgb {\r\n let out = c;\r\n let guard = 0;\r\n while (luminance(out) > 0.4 && guard < 12) {\r\n out = mix(out, BLACK, 0.2);\r\n guard++;\r\n }\r\n return out;\r\n}\r\n\r\nfunction rgbString({ r, g, b }: Rgb): string {\r\n return `rgb(${r}, ${g}, ${b})`;\r\n}\r\n\r\nfunction rgbaString({ r, g, b }: Rgb, alpha: number): string {\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n}\r\n\r\n/**\r\n * Derives every colour the UI needs from a single accent colour.\r\n *\r\n * subtle → soft tint of the accent, accent-coloured (darkened if needed) text.\r\n * solid → accent as the background, white or near-black text by contrast.\r\n * none → no background; only the dot and text carry the accent.\r\n */\r\nexport function deriveAppearance(\r\n color: string | null | undefined,\r\n fill: ColorFill = 'subtle'\r\n): ColorAppearance {\r\n const rgb = parseColor(color);\r\n if (!rgb) return NEUTRAL_APPEARANCE;\r\n\r\n const dotColor = rgbString(rgb);\r\n\r\n if (fill === 'solid') {\r\n return {\r\n backgroundColor: dotColor,\r\n color: luminance(rgb) > 0.5 ? '#141414' : '#FFFFFF',\r\n borderColor: rgbString(mix(rgb, BLACK, 0.08)),\r\n // On a solid accent background the dot must contrast with the accent itself.\r\n dotColor: luminance(rgb) > 0.5 ? rgbaString(BLACK, 0.55) : rgbaString(WHITE, 0.85)\r\n };\r\n }\r\n\r\n const text = rgbString(readableOnLight(rgb));\r\n\r\n if (fill === 'none') {\r\n return { backgroundColor: null, color: text, borderColor: null, dotColor };\r\n }\r\n\r\n return {\r\n backgroundColor: rgbaString(rgb, 0.12),\r\n color: text,\r\n borderColor: rgbaString(rgb, 0.28),\r\n dotColor\r\n };\r\n}\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 AfterViewInit,\r\n OnDestroy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nimport { BkCheckbox } from '../checkbox/checkbox';\r\nimport { BkAvatar } from '../ui-avatar/ui-avatar';\r\nimport {\r\n ColorAppearance,\r\n deriveAppearance,\r\n NEUTRAL_APPEARANCE\r\n} from '../shared/utilities/color-appearance';\r\n\r\n@Component({\r\n selector: 'bk-select',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BKTooltipDirective,BkCheckbox,BkAvatar],\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, AfterViewInit, OnDestroy {\r\n // --- Inputs ---\r\n items = input<any[]>([]);\r\n bindLabel = input<string>('label');\r\n bindValue = input<string>('');\r\n bindIcon = input<string>(''); // key in item for icon URL\r\n isResponsive = input<boolean>(true)\r\n placeholder = input<string>('');\r\n notFoundText = input<string>('No records 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 /**\r\n * Show an accent dot beside each option, driven by `colorKey`.\r\n *\r\n * In single-select mode the control is also tinted with the selected option's\r\n * colour (same treatment as bk-status-select), unless `hasError` is set — an\r\n * errored control drops the accent for a soft red tint instead. Multi-select\r\n * never tints the control: one background can't represent several colours, so\r\n * the accents are carried on the chips instead.\r\n *\r\n * Only one leading visual renders per row — precedence is avatar > icon > dot\r\n * — so the dot appears only when `showAvatar` is off and the item has no icon.\r\n */\r\n showDots = input<boolean>(false);\r\n\r\n /**\r\n * Render an avatar before each option label: the `avatarKey` image when the\r\n * item has one, otherwise initials derived from the label (\"mtayyab\" → \"MT\").\r\n * Replaces the plain icon <img> in options and the single-select value.\r\n */\r\n showAvatar = input<boolean>(false);\r\n\r\n /**\r\n * Key holding the avatar image URL, used only when `showAvatar` is on.\r\n * Falls back to `bindIcon` when unset. Kept separate from `bindIcon` so the\r\n * plain icon feature stays independent — an item's icon should not appear\r\n * as a bare <img> just because it also has an avatar.\r\n */\r\n avatarKey = input<string>('');\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 @Input() variation: 'default' | 'sm' = 'default';\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 @ViewChild('dropdownPanel') dropdownPanel?: ElementRef<HTMLDivElement>;\r\n @ViewChild('chipsViewport') chipsViewport?: ElementRef<HTMLDivElement>;\r\n @ViewChildren('measureChip') measureChips?: QueryList<ElementRef<HTMLElement>>;\r\n @ViewChild('measurePlus') measurePlus?: ElementRef<HTMLElement>;\r\n\r\n // --- State ---\r\n private _value: any = null;\r\n private static activeInstance: BkSelect | null = null;\r\n isOpen = signal(false);\r\n selectedOptions = signal<any[]>([]);\r\n searchTerm = signal<string>('');\r\n markedIndex = signal(-1);\r\n\r\n // Side the panel is actually rendered on. Starts from the requested\r\n // `dropdownPosition` but is auto-flipped based on available viewport space\r\n // (see applyPlacement). Used by both append-to-body and inline modes.\r\n placement = signal<'bottom' | 'top'>('bottom');\r\n\r\n // When appendToBody is on we physically relocate the panel to <body> so it\r\n // escapes any transformed/overflow ancestor (e.g. an animated dialog, whose\r\n // residual transform would otherwise make position:fixed resolve against the\r\n // dialog and get clipped). These track the panel's home so we can put it back\r\n // before Angular removes it on close.\r\n private originalPanelParent: Node | null = null;\r\n private originalPanelAnchor: Node | null = null;\r\n private panelInBody = false;\r\n\r\n // Number of multi-select chips currently rendered before collapsing into \"+N\".\r\n // Computed dynamically from the available width (see recomputeVisibleChips()).\r\n visibleCount = signal<number>(0);\r\n private resizeObserver?: ResizeObserver;\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 /**\r\n * True when the user is allowed to change the selection. Both disabled and\r\n * readonly lock the control, so neither may offer a remove/clear affordance.\r\n */\r\n isEditable = computed(() => !this.disabled() && !this.readonly());\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 // Re-measure the chips whenever the selection (or mode) changes so the\r\n // number of visible chips always reflects the available space.\r\n effect(() => {\r\n this.selectedOptions();\r\n this.multiple();\r\n this.scheduleRecompute();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Recompute visible chips whenever the control is resized (responsive\r\n // layouts, manual width changes, container resizes, etc.).\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(() => this.scheduleRecompute());\r\n if (this.controlWrapper?.nativeElement) {\r\n this.resizeObserver.observe(this.controlWrapper.nativeElement);\r\n }\r\n }\r\n this.scheduleRecompute();\r\n\r\n // Keep the append-to-body (fixed) panel glued to the control while any\r\n // ancestor scrolls or the window resizes. Capture phase (`true`) is what\r\n // lets us catch scrolling inside nested overflow containers, not just the\r\n // window — @HostListener('window:scroll') would miss those.\r\n window.addEventListener('scroll', this.reposition, true);\r\n window.addEventListener('resize', this.reposition);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.resizeObserver?.disconnect();\r\n window.removeEventListener('scroll', this.reposition, true);\r\n window.removeEventListener('resize', this.reposition);\r\n // If we're torn down while open, don't leave the relocated panel orphaned in <body>.\r\n if (this.panelInBody) {\r\n this.dropdownPanel?.nativeElement.remove();\r\n this.panelInBody = false;\r\n }\r\n }\r\n\r\n // Re-evaluate placement as the page scrolls/resizes. For append-to-body this\r\n // recomputes the fixed coordinates so the panel follows the control while it's\r\n // visible, and closes once the control is fully scrolled out of view (by the\r\n // viewport OR any scroll container such as a modal body). Inline just re-flips.\r\n // Bound as an arrow fn so it can be add/removeEventListener'd.\r\n private reposition = () => {\r\n if (!this.isOpen()) return;\r\n\r\n if (this.appendToBody()) {\r\n const rect = this.controlWrapper?.nativeElement.getBoundingClientRect();\r\n if (rect && this.isControlClipped(rect)) {\r\n this.closeDropdown();\r\n return;\r\n }\r\n }\r\n this.applyPlacement();\r\n };\r\n\r\n /**\r\n * True when the control is fully outside the visible area — either the\r\n * viewport or a scrollable/clipping ancestor (e.g. a dialog's scroll body).\r\n * Used to close the floating (append-to-body) panel once its anchor is no\r\n * longer on screen, instead of leaving it hanging.\r\n */\r\n private isControlClipped(rect: DOMRect): boolean {\r\n // Outside the viewport.\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight ||\r\n rect.right <= 0 || rect.left >= window.innerWidth) {\r\n return true;\r\n }\r\n // Outside any clipping ancestor.\r\n let el = this.controlWrapper?.nativeElement.parentElement;\r\n while (el && el !== document.body) {\r\n const style = getComputedStyle(el);\r\n const clips = /(auto|scroll|hidden|clip|overlay)/;\r\n if (clips.test(style.overflowY) || clips.test(style.overflowX)) {\r\n const r = el.getBoundingClientRect();\r\n if (rect.bottom <= r.top || rect.top >= r.bottom ||\r\n rect.right <= r.left || rect.left >= r.right) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Relocate the panel node to <body> so it truly escapes any transformed or\r\n * overflow-clipped ancestor (dialogs, drawers, cards with overflow, etc.).\r\n * Setting position:fixed alone is not enough when an ancestor has a transform.\r\n */\r\n private movePanelToBody() {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || this.panelInBody) return;\r\n this.originalPanelParent = panel.parentNode;\r\n this.originalPanelAnchor = panel.nextSibling;\r\n document.body.appendChild(panel);\r\n this.panelInBody = true;\r\n }\r\n\r\n /**\r\n * Return the panel to its original DOM position so Angular's @if can remove\r\n * it cleanly on close. Must run before isOpen is set to false.\r\n */\r\n private restorePanel() {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || !this.panelInBody) return;\r\n if (this.originalPanelParent) {\r\n this.originalPanelParent.insertBefore(panel, this.originalPanelAnchor);\r\n }\r\n this.panelInBody = false;\r\n this.originalPanelParent = null;\r\n this.originalPanelAnchor = null;\r\n }\r\n\r\n private scheduleRecompute() {\r\n // Defer to the next frame so the hidden measurement row has been laid out.\r\n if (typeof requestAnimationFrame !== 'undefined') {\r\n requestAnimationFrame(() => this.recomputeVisibleChips());\r\n } else {\r\n setTimeout(() => this.recomputeVisibleChips());\r\n }\r\n }\r\n\r\n /**\r\n * Measures the off-screen chip row and works out how many chips fit on a\r\n * single line. If every chip fits, all of them are shown and no \"+N\" badge\r\n * is rendered. Otherwise it keeps as many chips as fit while reserving space\r\n * for the \"+N\" overflow badge.\r\n */\r\n private recomputeVisibleChips() {\r\n if (!this.multiple()) return;\r\n\r\n const total = this.selectedOptions().length;\r\n const viewport = this.chipsViewport?.nativeElement;\r\n const chips = this.measureChips?.toArray() ?? [];\r\n\r\n if (!viewport || total === 0 || chips.length === 0) {\r\n this.visibleCount.set(total);\r\n return;\r\n }\r\n\r\n const available = viewport.clientWidth;\r\n if (available <= 0) {\r\n // Not laid out yet — retry on the next frame.\r\n this.scheduleRecompute();\r\n return;\r\n }\r\n\r\n // Per-chip horizontal spacing: gap-0.5 (2px) + me-0.5 margin (2px).\r\n const spacing = 4;\r\n const steps = chips.map(c => c.nativeElement.offsetWidth + spacing);\r\n\r\n // How many chips fit when no overflow badge is needed.\r\n let used = 0;\r\n let count = 0;\r\n for (const step of steps) {\r\n if (used + step <= available) {\r\n used += step;\r\n count++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (count >= total) {\r\n // Everything fits — show all chips, no \"+N\".\r\n this.visibleCount.set(total);\r\n return;\r\n }\r\n\r\n // Overflow: reserve room for the \"+N\" badge and shrink until it fits.\r\n const plusWidth = (this.measurePlus?.nativeElement.offsetWidth ?? 24) + spacing;\r\n let prefix = steps.slice(0, count).reduce((a, b) => a + b, 0);\r\n while (count > 1 && prefix + plusWidth > available) {\r\n count--;\r\n prefix -= steps[count];\r\n }\r\n\r\n // Always keep at least one chip visible, even if the control is too narrow\r\n // to fit a full chip — it will simply truncate with an ellipsis.\r\n this.visibleCount.set(Math.max(count, 1));\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 isItemDisabled(item: any): boolean {\r\n return !!item?.disabled;\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 // Close previously opened dropdown\r\n if (BkSelect.activeInstance && BkSelect.activeInstance !== this) {\r\n BkSelect.activeInstance.closeDropdown();\r\n }\r\n\r\n BkSelect.activeInstance = this;\r\n\r\n // Decide the initial side before the panel paints (uses an estimated\r\n // height; corrected after render in the setTimeout below).\r\n this.applyPlacement();\r\n\r\n this.isOpen.set(true);\r\n this.open.emit();\r\n this.focus.emit();\r\n\r\n setTimeout(() => {\r\n // Panel is in the DOM now. In appendToBody mode, relocate it to <body>\r\n // so it escapes any transformed/overflow ancestor, then position it.\r\n if (this.appendToBody()) this.movePanelToBody();\r\n\r\n // Recompute with the panel's real height so the initial up/down flip is\r\n // accurate (openDropdown ran applyPlacement() before the panel existed,\r\n // using an estimated height).\r\n this.applyPlacement();\r\n\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\r\n // Put the panel back where Angular expects it before the @if removes it.\r\n this.restorePanel();\r\n\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 if (BkSelect.activeInstance === this) {\r\n BkSelect.activeInstance = null;\r\n }\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 — use the auto-flipped placement, not the raw input.\r\n return this.placement() === '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 — use the auto-flipped placement, not the raw input.\r\n return this.placement() === 'top' ? 'calc(100% + 4px)' : null;\r\n }\r\n\r\n\r\n /**\r\n * Decides which side the panel should open on (auto-flip) and, for\r\n * append-to-body mode, computes the fixed coordinates. Shared by both modes\r\n * and re-run on open and on every scroll/resize so the panel snaps to\r\n * whichever side has room — honouring `dropdownPosition` when it fits.\r\n */\r\n applyPlacement() {\r\n const control = this.controlWrapper?.nativeElement;\r\n if (!control) return;\r\n\r\n const rect = control.getBoundingClientRect();\r\n const gap = 4;\r\n\r\n // Actual panel height once it's rendered; fall back to a sensible estimate\r\n // on the very first open (panel isn't in the DOM yet at that point — a\r\n // follow-up call after render corrects it with the real height).\r\n const panelHeight = this.dropdownPanel?.nativeElement.offsetHeight || 300;\r\n\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const spaceAbove = rect.top - gap;\r\n\r\n // Honour the requested position when it fits; otherwise flip to wherever\r\n // there's more room.\r\n const preferred = this.dropdownPosition();\r\n let placeTop: boolean;\r\n if (preferred === 'top') {\r\n placeTop = spaceAbove >= panelHeight || spaceAbove > spaceBelow;\r\n } else {\r\n placeTop = spaceBelow < panelHeight && spaceAbove > spaceBelow;\r\n }\r\n this.placement.set(placeTop ? 'top' : 'bottom');\r\n\r\n // Inline (absolute) mode is positioned by CSS relative to the control, so\r\n // the placement signal above is all it needs. Only append-to-body needs\r\n // explicit fixed coordinates.\r\n if (!this.appendToBody()) return;\r\n\r\n if (placeTop) {\r\n this.dropdownStyle.set({\r\n top: undefined,\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\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: `${rect.bottom + gap}px`,\r\n bottom: undefined,\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 // Scroll/resize are handled by the capture-phase listeners wired up in\r\n // ngAfterViewInit (see `reposition`), which keep the panel attached to the\r\n // control and re-flip it up/down as space allows, instead of closing it.\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) && !this.isItemDisabled(fItem));\r\n });\r\n } else {\r\n filtered.forEach(item => {\r\n if (!this.isItemSelected(item) && !this.isItemDisabled(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.isItemDisabled(item)) return;\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 if (!this.isEditable()) return;\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 if (!this.isEditable()) return;\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()) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.openDropdown();\r\n }\r\n return;\r\n }\r\n const list = this.filteredItems();\r\n const current = this.markedIndex();\r\n switch (event.key) {\r\n case 'Tab':\r\n this.closeDropdown();\r\n break;\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 onTabPress(event: KeyboardEvent){\r\n if(event.key === 'Tab') {\r\n this.closeDropdown();\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 if (val === null || val === undefined) {\r\n this.selectedOptions.set([]);\r\n return;\r\n }\r\n const list = this.items();\r\n if (!list.length) return;\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 const target = e.target as Node;\r\n // When appendToBody relocates the panel to <body>, it's no longer inside\r\n // the host element — treat clicks within the panel as \"inside\" too so\r\n // interacting with the search box / scrollbar doesn't close it.\r\n if (this.el.nativeElement.contains(target)) return;\r\n if (this.dropdownPanel?.nativeElement.contains(target)) return;\r\n 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 * Colours for the control itself. Single-select only: with several chips\r\n * selected there is no single accent that could represent them, so multi\r\n * mode stays neutral and relies on per-chip dots.\r\n */\r\n controlAppearance = computed<ColorAppearance>(() => {\r\n if (!this.showDots() || this.multiple()) return NEUTRAL_APPEARANCE;\r\n const selected = this.selectedOptions()[0];\r\n if (!selected) return NEUTRAL_APPEARANCE;\r\n return deriveAppearance(this.resolveColor(selected), 'subtle');\r\n });\r\n\r\n /**\r\n * Tint for an errored control, derived from the same red as the error border\r\n * so the control reads as one state rather than a red outline over a colour.\r\n */\r\n private static readonly ERROR_APPEARANCE = deriveAppearance('#D11E14', 'subtle');\r\n\r\n /**\r\n * Colours actually applied to the control. An option's accent never survives\r\n * an error: the tint is swapped for a soft red one so the error can't be\r\n * mistaken for a status colour. Only tintable controls have anything to swap\r\n * — a multi-select is neutral either way, since one background can't stand in\r\n * for several chips.\r\n */\r\n controlStyle(): ColorAppearance {\r\n if (!this.hasError) return this.controlAppearance();\r\n return this.showDots() && !this.multiple()\r\n ? BkSelect.ERROR_APPEARANCE\r\n : NEUTRAL_APPEARANCE;\r\n }\r\n\r\n /** Raw accent for an option's dot. Null when the item has no usable colour. */\r\n accentFor(item: any): string | null {\r\n return deriveAppearance(this.resolveColor(item), 'subtle').dotColor;\r\n }\r\n\r\n /**\r\n * Label colour for an option/chip. With showDots on, the accent is darkened\r\n * until it stays legible (a pale accent as raw text is unreadable); otherwise\r\n * the raw colorKey value is used, preserving the previous behaviour.\r\n */\r\n optionTextColor(item: any): string | null {\r\n if (!this.showDots()) return this.resolveColor(item);\r\n return deriveAppearance(this.resolveColor(item), 'none').color;\r\n }\r\n\r\n /** Soft tint for an option's avatar, so it matches the option's accent. */\r\n avatarBgFor(item: any): string | null {\r\n return deriveAppearance(this.resolveColor(item), 'subtle').backgroundColor;\r\n }\r\n\r\n /** Readable text colour paired with avatarBgFor. */\r\n avatarTextFor(item: any): string | null {\r\n return deriveAppearance(this.resolveColor(item), 'subtle').color;\r\n }\r\n\r\n resolveIcon(item: any): string | null {\r\n if (!item) return null;\r\n const key = this.bindIcon();\r\n return key && typeof item === 'object' ? item[key] ?? null : null;\r\n }\r\n\r\n /** Image for the avatar. Prefers `avatarKey`, falling back to `bindIcon`. */\r\n resolveAvatarSrc(item: any): string | null {\r\n if (!item || typeof item !== 'object') return null;\r\n const key = this.avatarKey() || this.bindIcon();\r\n return key ? item[key] ?? null : null;\r\n }\r\n\r\n getRemainingItems(): string[] {\r\n return this.selectedOptions()\r\n .slice(this.visibleCount())\r\n .map((x) => this.resolveLabel(x));\r\n }\r\n\r\n getTooltipIfEllipsed(el: HTMLElement, text: string): string {\r\n if (!el) return '';\r\n return el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight ? text : '';\r\n }\r\n\r\n onOptionHover(index: number) {\r\n this.markedIndex.set(index);\r\n }\r\n}\r\n\r\n","<div class=\"bk-select-container\" [ngClass]=\"variation\">\r\n @if (label) {\r\n <label class=\"bk-select-label\" (click)=\"openFromLabel($event)\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"bk-select-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative\">\r\n <!-- controlStyle() resolves the tint: the selected option's accent normally,\r\n a soft red one while hasError. It's a method rather than a computed\r\n because hasError is a plain @Input, not a signal. -->\r\n <div\r\n #controlWrapper\r\n class=\"bk-select-control\"\r\n [ngClass]=\"{ 'bk-has-error': hasError }\"\r\n tabindex=\"0\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [class.bk-focused]=\"isOpen()\"\r\n [class.bk-disabled]=\"disabled()\"\r\n [class.bk-filled]=\"!!controlStyle().backgroundColor\"\r\n [style.backgroundColor]=\"controlStyle().backgroundColor\"\r\n [style.color]=\"controlStyle().color\"\r\n [style.borderColor]=\"controlStyle().borderColor\"\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=\"bk-value-container\">\r\n @if (selectedOptions().length === 0) {\r\n <div class=\"bk-placeholder\">{{ placeholder() }}</div>\r\n }\r\n @if (multiple() && selectedOptions().length > 0) {\r\n <div\r\n #chipsViewport\r\n class=\"bk-value-chips bk-chips-viewport flex gap-0.5 flex-nowrap overflow-hidden h-[18px]\"\r\n >\r\n @for (opt of selectedOptions().slice(0, visibleCount()); track $index) {\r\n <div class=\"bk-multi-badge-item me-0.5\" [class.bk-chip-has-avatar]=\"showAvatar()\">\r\n <!-- One leading visual only: avatar > icon > dot. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(opt)\"\r\n [name]=\"resolveLabel(opt)\"\r\n [alt]=\"iconAlt\"\r\n [bgColor]=\"avatarBgFor(opt)\"\r\n [textColor]=\"avatarTextFor(opt)\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(opt)) {\r\n <img [src]=\"resolveIcon(opt)!\" alt=\"icon\" class=\"bk-chip-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(opt)) {\r\n <span class=\"bk-chip-dot\" [style.backgroundColor]=\"accentFor(opt)\"></span>\r\n }\r\n <span #badgeTextEl class=\"bk-multi-badge-item-text\" [style.color]=\"optionTextColor(opt)\"\r\n [bkTooltip]=\"getTooltipIfEllipsed(badgeTextEl, resolveLabel(opt))\"\r\n bkTooltipPosition=\"top\">{{\r\n resolveLabel(opt)\r\n }}</span>\r\n\r\n <!-- A locked control must not offer a way to drop a value. -->\r\n @if (isEditable()) {\r\n <button type=\"button\" (mousedown)=\"removeOption(opt, $event)\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M6.625 0.625L0.625 6.625M0.625 0.625L6.625 6.625\"\r\n stroke=\"#BBBDC5\"\r\n stroke-width=\"1.25\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n }\r\n @if (visibleCount() < selectedOptions().length) {\r\n <div class=\"bk-multi-badge-item\">\r\n <span\r\n class=\"bk-multi-badge-item-text\"\r\n bkTooltipPosition=\"top\"\r\n [bkTooltip]=\"getRemainingItems()\"\r\n [bkTooltipScrollable]=\"true\"\r\n bkTooltipMaxHeight=\"240px\"\r\n >+{{ selectedOptions().length - visibleCount() }}</span\r\n >\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Hidden off-screen row used only to measure each chip's natural\r\n width so we can decide how many fit on a single line. -->\r\n <div class=\"bk-value-chips bk-chips-measure flex gap-0.5 flex-nowrap\" aria-hidden=\"true\">\r\n @for (opt of selectedOptions(); track $index) {\r\n <div #measureChip class=\"bk-multi-badge-item me-0.5\" [class.bk-chip-has-avatar]=\"showAvatar()\">\r\n <!-- Must mirror the visible chip exactly — same leading visual\r\n and same precedence — or the measured width is wrong and\r\n \"+N\" collapses at the wrong point. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(opt)\"\r\n [name]=\"resolveLabel(opt)\"\r\n [alt]=\"iconAlt\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(opt)) {\r\n <img [src]=\"resolveIcon(opt)!\" alt=\"icon\" class=\"bk-chip-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(opt)) {\r\n <span class=\"bk-chip-dot\"></span>\r\n }\r\n <span class=\"bk-multi-badge-item-text\">{{ resolveLabel(opt) }}</span>\r\n @if (isEditable()) {\r\n <button type=\"button\" tabindex=\"-1\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M6.625 0.625L0.625 6.625M0.625 0.625L6.625 6.625\"\r\n stroke=\"#BBBDC5\"\r\n stroke-width=\"1.25\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n }\r\n <div #measurePlus class=\"bk-multi-badge-item\">\r\n <span class=\"bk-multi-badge-item-text\">+{{ selectedOptions().length }}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (!multiple() && selectedOptions().length > 0) {\r\n <div class=\"flex items-center gap-1.5 min-w-0 w-full\">\r\n <!-- One leading visual only: avatar > icon > dot.\r\n `flex` on the host: bk-avatar's host is display:inline by\r\n default, so its inline-flex body sits on a baseline and the\r\n host gains descender space — which knocks the avatar out of\r\n vertical centre against the label. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(selectedOptions()[0])\"\r\n [name]=\"resolveLabel(selectedOptions()[0])\"\r\n [alt]=\"iconAlt\"\r\n [bgColor]=\"avatarBgFor(selectedOptions()[0])\"\r\n [textColor]=\"avatarTextFor(selectedOptions()[0])\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(selectedOptions()[0])) {\r\n <img [src]=\"resolveIcon(selectedOptions()[0])!\" alt=\"icon\" class=\"bk-option-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(selectedOptions()[0])) {\r\n <span class=\"bk-value-dot\" [style.backgroundColor]=\"accentFor(selectedOptions()[0])\"></span>\r\n }\r\n <div #singleValueEl class=\"bk-value-label-single\" [style.color]=\"controlStyle().color ?? resolveColor(selectedOptions()[0])\"\r\n [bkTooltip]=\"getTooltipIfEllipsed(singleValueEl, resolveLabel(selectedOptions()[0]))\"\r\n bkTooltipPosition=\"top\">\r\n {{ resolveLabel(selectedOptions()[0]) }}\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"bk-actions\">\r\n @if (clearable() && selectedOptions().length > 0 && isEditable()) {\r\n <span class=\"bk-clear-wrapper\" (mousedown)=\"handleClear($event)\" title=\"Clear\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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 </span>\r\n }\r\n <span class=\"bk-arrow-wrapper\" [class.bk-open]=\"isOpen()\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n @if (isOpen()) {\r\n <div\r\n #dropdownPanel\r\n tabindex=\"-1\"\r\n (keydown)=\"onTabPress($event)\"\r\n class=\"bk-dropdown-panel\"\r\n [attr.data-position]=\"placement()\"\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 [style.zIndex]=\"appendToBody() ? 10000 : null\"\r\n [class.bk-grouped]=\"groupBy()\"\r\n >\r\n @if (searchable()) {\r\n <div class=\"bk-dropdown-search mb-1\">\r\n <div class=\"bk-search-wrapper\">\r\n <svg\r\n class=\"text-[#BBBDC5] mr-2\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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\r\n #searchInput\r\n tabindex=\"-1\"\r\n type=\"text\"\r\n class=\"bk-search-input\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"'Search...'\"\r\n (input)=\"onSearchInput($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n <div\r\n #optionsListContainer\r\n tabindex=\"-1\"\r\n class=\"bk-options-list\"\r\n [class.bk-no-responsive]=\"!isResponsive()\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n @if (loading()) {\r\n <div class=\"bk-option-disabled\">{{ loadingText() }}</div>\r\n } @else {\r\n @if (allSelect()) {\r\n @if (multiple() && filteredItems().length > 0) {\r\n <div\r\n class=\"bk-option\"\r\n (mousedown)=\"toggleSelectAll($event)\"\r\n [class.bk-selected]=\"isAllSelected()\"\r\n >\r\n <div class=\"flex-1 flex items-center gap-2 min-w-0\">\r\n <!-- Reflects state only: pointer-events-none lets the row's\r\n mousedown own the toggle, so the box can't fire twice.\r\n standalone keeps this ngModel out of any parent <form>\r\n bk-select is rendered inside. -->\r\n <bk-checkbox\r\n class=\"pointer-events-none shrink-0 flex\"\r\n checkboxClass=\"sm\"\r\n [ngModel]=\"isAllSelected()\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n ></bk-checkbox>\r\n <span class=\"line-clamp-1\">Select All</span>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @for (group of groupedItems(); track $index) {\r\n @if (group.group) {\r\n <div class=\"bk-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\r\n #optionsRef\r\n tabindex=\"-1\"\r\n class=\"bk-option\"\r\n [class.bk-selected]=\"isItemSelected(item)\"\r\n [class.bk-marked]=\"$index === markedIndex()\"\r\n [class.bk-option-disabled]=\"isItemDisabled(item)\"\r\n [class.cursor-not-allowed]=\"isItemDisabled(item)\"\r\n (click)=\"handleSelection(item, $event)\"\r\n (mouseenter)=\"onOptionHover($index)\"\r\n >\r\n <div class=\"flex-1 flex justify-between gap-2 min-w-0\">\r\n <div class=\"flex items-center gap-2 min-w-0 flex-1\">\r\n <!-- One leading visual only: avatar > icon > dot. -->\r\n @if (showAvatar()) {\r\n <bk-avatar\r\n class=\"shrink-0 flex\"\r\n size=\"xxsm\"\r\n [src]=\"resolveAvatarSrc(item)\"\r\n [name]=\"resolveLabel(item)\"\r\n [alt]=\"iconAlt\"\r\n [bgColor]=\"avatarBgFor(item)\"\r\n [textColor]=\"avatarTextFor(item)\"\r\n ></bk-avatar>\r\n } @else if (resolveIcon(item)) {\r\n <img [src]=\"resolveIcon(item)!\" alt=\"icon\" class=\"bk-option-icon shrink-0\" />\r\n } @else if (showDots() && accentFor(item)) {\r\n <span class=\"bk-value-dot\" [style.backgroundColor]=\"accentFor(item)\"></span>\r\n }\r\n <span #optionLabelEl class=\"bk-option-label min-w-0\" [style.color]=\"optionTextColor(item)\"\r\n [bkTooltip]=\"getTooltipIfEllipsed(optionLabelEl, resolveLabel(item))\"\r\n bkTooltipPosition=\"top\">{{\r\n resolveLabel(item)\r\n }}</span>\r\n </div>\r\n\r\n @if (isItemSelected(item)) {\r\n <svg\r\n class=\"text-[#141414] shrink-0\"\r\n width=\"17\"\r\n height=\"17\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n >\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 @if (filteredItems().length === 0) {\r\n <div class=\"bk-option-disabled\">{{ notFoundText() }}</div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n @if (hasError) {\r\n @if (errorMessage) {\r\n <p class=\"bk-select-error\">{{ errorMessage }}</p>\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 AfterViewInit,\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 type BkInputSize = 'default' | 'sm';\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, AfterViewInit, 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() dropSpecialCharacters: boolean | string[] | readonly string[] = false;\r\n @Input() autoComplete : BkInputAutoComplete = 'off';\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() hint: string = '';\r\n @Input() required: boolean = false;\r\n @Input() type: BkInputType = 'text';\r\n /** 'sm' shrinks height, padding, font size and icon sizing for compact contexts (e.g. dropdown search boxes). */\r\n @Input() size: BkInputSize = 'default';\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 @ViewChild(NgxMaskDirective) maskDirective?: NgxMaskDirective;\r\n\r\n // =================== Internal State ===================\r\n isFocused: boolean = false;\r\n inputValue: string = '';\r\n isDropdownOpen: boolean = false;\r\n private pendingMaskedValue: string | null = null;\r\n private isPropagatingViewValue = 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 private applyDropSpecialCharacters(viewValue: string): string {\r\n if (!viewValue) return '';\r\n\r\n // Align with ngx-mask semantics: when enabled, remove special mask characters from model.\r\n if (this.dropSpecialCharacters) {\r\n return viewValue.replace(/[^0-9A-Za-z]/g, '');\r\n }\r\n\r\n if (Array.isArray(this.dropSpecialCharacters)) {\r\n if (this.dropSpecialCharacters.length === 0) return viewValue;\r\n const escaped = this.dropSpecialCharacters\r\n .map((c) => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\r\n .join('');\r\n const re = new RegExp(`[${escaped}]`, 'g');\r\n return viewValue.replace(re, '');\r\n }\r\n\r\n return viewValue;\r\n }\r\n\r\n writeValue(value: any): void {\r\n const str = (value === null || value === undefined) ? '' : String(value);\r\n this.value = str;\r\n if (!this.maskValue) {\r\n this.inputValue = str;\r\n this.pendingMaskedValue = null;\r\n return;\r\n }\r\n\r\n // When the value came from this component's own input event, the masked view is\r\n // already correct. Re-applying it here can reset the caret position.\r\n if (this.isPropagatingViewValue) return;\r\n\r\n void this.writeMaskedViewValue(str);\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 !== undefined && this.value !== null && this.value !== '') {\r\n this.inputValue = String(this.value);\r\n }\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 ngAfterViewInit(): void {\r\n if (this.maskValue) {\r\n void this.writeMaskedViewValue(this.pendingMaskedValue ?? this.value);\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 viewVal = (event.target as HTMLInputElement).value ?? '';\r\n // Keep the displayed value masked.\r\n this.inputValue = viewVal;\r\n\r\n // Decide what to write to the model.\r\n const modelRaw = this.applyDropSpecialCharacters(viewVal);\r\n this.value = modelRaw;\r\n\r\n const out =\r\n this.type === 'number'\r\n ? (modelRaw === '' ? null : Number(modelRaw))\r\n : modelRaw;\r\n this.isPropagatingViewValue = true;\r\n this.onChange(out);\r\n queueMicrotask(() => {\r\n this.isPropagatingViewValue = false;\r\n });\r\n this.input.emit(event);\r\n\r\n // If parent handlers mutate the underlying native input value (e.g. clamping/formatting),\r\n // resync our internal view-model from the real input to avoid visual \"append\" artifacts.\r\n queueMicrotask(() => {\r\n const nativeVal = this.inputField?.nativeElement?.value;\r\n if (nativeVal !== undefined && nativeVal !== null && nativeVal !== this.inputValue) {\r\n this.inputValue = nativeVal;\r\n }\r\n });\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 void this.writeMaskedViewValue(newPhone);\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 private async writeMaskedViewValue(value: string): Promise<void> {\r\n this.pendingMaskedValue = value;\r\n\r\n if (!this.maskValue || !this.maskDirective || !this.inputField?.nativeElement) {\r\n this.inputValue = value;\r\n return;\r\n }\r\n\r\n await this.maskDirective.writeValue(value);\r\n this.inputValue = this.inputField.nativeElement.value ?? '';\r\n this.pendingMaskedValue = null;\r\n }\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"input-container\" [class.input-container--sm]=\"size === 'sm'\">\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 @if (maskValue) {\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 [attr.pattern]=\"pattern\"\r\n [autocomplete]=\"autoComplete\"\r\n [value]=\"inputValue\"\r\n\r\n [mask]=\"maskValue\"\r\n [prefix]=\"maskPrefixValue\"\r\n [showMaskTyped]=\"false\"\r\n [dropSpecialCharacters]=\"dropSpecialCharacters\"\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 } @else {\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 [attr.pattern]=\"pattern\"\r\n [autocomplete]=\"autoComplete\"\r\n [value]=\"inputValue\"\r\n\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\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\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\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\n\r\nexport type TabIconDirection = 'left' | 'right'\r\nexport type TabsOrientation = 'horizontal' | 'vertical'\r\nexport type TabsVariant = 'default' | 'segmented'\r\n\r\n/**\r\n * Per-usage CSS classes for the 'segmented' variant.\r\n * Pass Tailwind classes (not raw colors). Because the component uses\r\n * emulated encapsulation, its default color rules out-specify plain\r\n * utilities — so use the important prefix, e.g. '!bg-white', '!text-black'.\r\n * Any field left undefined keeps the default design token from tabs.css.\r\n */\r\nexport interface TabsColors {\r\n wrapper?: string; // track background classes — default bg #54578E12\r\n active?: string; // active tab background classes — default bg #FFFFFF\r\n activeText?: string; // active tab text classes — default text #15191E\r\n inactive?: string; // inactive tab text classes — default text #6B7080\r\n}\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 direction?: TabIconDirection;\r\n iconTooltip?: string | string[];\r\n iconTooltipDirection?: 'left' | 'right' | 'top' | 'bottom';\r\n error?: boolean;\r\n /**\r\n * When the tab is in an error state, render an error icon (on the side given\r\n * by `direction`) with `iconTooltip` shown on hover of the icon.\r\n * When false/omitted, no error icon is drawn and `iconTooltip` falls back to\r\n * the tab button itself. Works for both variants and orientations.\r\n */\r\n showErrorIcon?: boolean;\r\n /**\r\n * Optional custom error icon URL. If omitted while `showErrorIcon` is true,\r\n * the component's default error icon is used.\r\n */\r\n errorIcon?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'bk-tabs',\r\n standalone: true,\r\n imports: [CommonModule, BKTooltipDirective],\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 @Input() orientation: TabsOrientation = 'horizontal';\r\n @Input() variant: TabsVariant = 'default';\r\n @Input() colors: TabsColors = {};\r\n\r\n /**\r\n * When true, if the currently active tab is in an error state, navigation to\r\n * the other tabs is blocked (they render disabled) until the error clears.\r\n * Optional — defaults to false, so navigation stays free unless opted in.\r\n */\r\n @Input() lockNavigationOnError: boolean = false;\r\n\r\n /** Fallback error icon used when a tab has `showErrorIcon` but no `errorIcon`. */\r\n private readonly defaultErrorIcon = '../../assets/icons/alert-circle-red.svg';\r\n\r\n // Convenience getters for template class bindings\r\n get isVertical(): boolean {\r\n return this.orientation === 'vertical';\r\n }\r\n\r\n get isSegmented(): boolean {\r\n return this.variant === 'segmented';\r\n }\r\n\r\n // Wrapper (track) classes — only for segmented; empty keeps the CSS default.\r\n get wrapperClass(): string {\r\n return this.isSegmented ? (this.colors.wrapper ?? '') : '';\r\n }\r\n\r\n // Per-tab color classes for the segmented variant.\r\n // Active tabs get background + text classes; inactive tabs get the text class.\r\n // Empty strings simply fall through to the default colors in tabs.css.\r\n segmentedTabClass(tab: TabItem): string {\r\n if (!this.isSegmented) return '';\r\n if (this.isActive(tab.id)) {\r\n return `${this.colors.active ?? ''} ${this.colors.activeText ?? ''}`.trim();\r\n }\r\n return this.colors.inactive ?? '';\r\n }\r\n\r\n @Output() change = new EventEmitter<TabItem>();\r\n\r\n // True when the currently active tab is flagged with an error.\r\n get activeTabHasError(): boolean {\r\n return this.list.some(t => t.id === this.activeTabId && !!t.error);\r\n }\r\n\r\n // A tab is locked when navigation-on-error is enabled, the active tab has an\r\n // error, and this tab is not the active one. Locked tabs render disabled.\r\n isLocked(tab: TabItem): boolean {\r\n return this.lockNavigationOnError && this.activeTabHasError && tab.id !== this.activeTabId;\r\n }\r\n\r\n // Set active tab and emit change event\r\n setActiveTab(tab:TabItem): void {\r\n if (tab?.disabled || this.disabled || this.isLocked(tab)) 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/error state.\r\n // In an error state, when the tab opts into an error icon, show the custom\r\n // `errorIcon` or the component default error icon — this replaces the tab's\r\n // own decorative `icon` so the error is always what's surfaced.\r\n getTabIcon(tab: TabItem): string | undefined {\r\n if (tab.error && tab.showErrorIcon) {\r\n return tab.errorIcon ?? this.defaultErrorIcon;\r\n }\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\r\n class=\"tabs-container\"\r\n [class.tabs-container--segmented]=\"isSegmented\"\r\n [ngClass]=\"isSegmented ? wrapperClass : (isVertical ? 'w-auto' : 'overflow-x-auto whitespace-nowrap')\">\r\n <ul\r\n class=\"tabs-list\"\r\n [class.tabs-list--segmented]=\"isSegmented\"\r\n [class.tabs-list--segmented-vertical]=\"isSegmented && isVertical\"\r\n [class.tabs-list--vertical]=\"isVertical && !isSegmented\"\r\n [attr.aria-orientation]=\"orientation\"\r\n role=\"tablist\">\r\n @for (tab of list; track tab.id; let i = $index) {\r\n <li class=\"tabs-item\" role=\"presentation\">\r\n <!--\r\n Tooltip logic:\r\n - Icon present (error or not) → tooltip on the icon, button gets no tooltip\r\n - No icon + error state → tooltip on the button\r\n - No icon + no error → no tooltip\r\n -->\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 || isLocked(tab)\"\r\n [class.tabs-button--active]=\"isActive(tab.id)\"\r\n [class.tabs-button--error]=\"tab.error\"\r\n [class.tabs-button--disabled]=\"disabled || tab.disabled || isLocked(tab)\"\r\n [class.tabs-button--icon-right]=\"tab.direction === 'right'\"\r\n [class.tabs-button--segmented]=\"isSegmented\"\r\n [ngClass]=\"[\r\n isSegmented ? segmentedTabClass(tab) : '',\r\n (isVertical && !isSegmented) ? 'w-full justify-start' : ''\r\n ]\"\r\n [bkTooltip]=\"(!getTabIcon(tab) && tab.error) ? (tab.iconTooltip || []) : []\"\r\n [bkTooltipPosition]=\"tab.iconTooltipDirection || 'top'\"\r\n class=\"tabs-button\"\r\n (click)=\"setActiveTab(tab)\"\r\n role=\"tab\">\r\n <!-- Left icon: tooltip lives on the icon when an icon is present -->\r\n <img\r\n [bkTooltip]=\"getTabIcon(tab) ? (tab.iconTooltip || []) : []\" [bkTooltipPosition]=\"tab.iconTooltipDirection || 'top'\"\r\n [attr.src]=\"getTabIcon(tab)\"\r\n [alt]=\"tab.iconAlt || tab.label\"\r\n [class.tabs-icon--hidden]=\"!getTabIcon(tab) || tab.direction === 'right'\"\r\n class=\"tabs-icon\">\r\n <span class=\"tabs-label\">{{ tab.label }}</span>\r\n <!-- Right icon: same tooltip rule, shown when direction is 'right' -->\r\n <img\r\n [bkTooltip]=\"getTabIcon(tab) ? (tab.iconTooltip || []) : []\" [bkTooltipPosition]=\"tab.iconTooltipDirection || 'top'\"\r\n [attr.src]=\"getTabIcon(tab)\"\r\n [alt]=\"tab.iconAlt || tab.label\"\r\n [class.tabs-icon--hidden]=\"!getTabIcon(tab) || tab.direction !== 'right'\"\r\n class=\"tabs-icon\">\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n</div>\r\n\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 `BkDialogConfig` (including animation fields) to the custom\r\n * `BkDialogContainerComponent`. 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 { BkDialogConfig } 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(BK_DIALOG_DATA) public data: MyDataType) {}\r\n * ```\r\n */\r\nexport const BK_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: BK_DIALOG_GLOBAL_CONFIG, useValue: { animation: 'zoom', width: '600px' } }\r\n * ]\r\n * ```\r\n */\r\nexport const BK_DIALOG_GLOBAL_CONFIG = new InjectionToken<BkDialogConfig>(\r\n 'BK_DIALOG_GLOBAL_CONFIG',\r\n);\r\n\r\n// ──── Internal ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Internal token that carries our full `BkDialogConfig` (with animation\r\n * settings, position offsets, etc.) into the `BkDialogContainerComponent`.\r\n *\r\n * @internal — not exported from the barrel; do not depend on it.\r\n */\r\nexport const BK_INTERNAL_DIALOG_CONFIG = new InjectionToken<BkDialogConfig>(\r\n 'BK_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 BkDialogContainerComponent plays these\r\n * via `element.animate()`.\r\n */\r\n\r\nimport { BkDialogAnimation } from './dialog-config';\r\n\r\nexport interface BkAnimationKeyframes {\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: BkDialogAnimation,\r\n enterDuration: number,\r\n leaveDuration: number\r\n): { enter: BkAnimationKeyframes; leave: BkAnimationKeyframes } {\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: BkAnimationKeyframes; leave: BkAnimationKeyframes } {\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 * BkDialogContainerComponent\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 `BkDialogService` 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 { BkDialogConfig } from './dialog-config';\r\nimport { BK_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 BkDialogContainerComponent extends CdkDialogContainer implements OnInit {\r\n\r\n /**\r\n * Our full config (including animation fields).\r\n * Provided by BkDialogService via the INTERNAL_DIALOG_CONFIG token.\r\n */\r\n private readonly _dialogConfig: BkDialogConfig = inject(BK_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 * `BkDialogService` subscribes via `.then()` to emit `afterOpened` on the\r\n * `BkDialogRef`.\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 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 = () => {\r\n // Cancel the animation so the persisted `transform` from\r\n // `fill: 'forwards'` is removed. A lingering transform (even\r\n // `scale(1)`) creates a new CSS containing block, which traps\r\n // absolutely-positioned descendants (e.g. dropdown panels)\r\n // inside `overflow: hidden` ancestors — causing UI distortion.\r\n // The element's default styles (opacity: 1, no transform) are\r\n // the same as the animation's final state, so cancelling is\r\n // visually seamless.\r\n anim.cancel();\r\n this._resolveOpened();\r\n };\r\n }\r\n\r\n /**\r\n * Play the leave animation. Returns a Promise that resolves when done.\r\n * Called by `BkDialogRef._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 * BkDialogRef — Handle returned to callers by `BkDialogService.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 `BkDialogContainerComponent` 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 BkDialogRef<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 BkDialogService) ──────────────────────────\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 `BkDialogConfig` 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 `BkDialogService.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 `BkDialogContainerComponent` 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 BkDialogAnimation =\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 BkDialogPosition {\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 BkDialogConfig<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?: BkDialogAnimation;\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?: BkDialogPosition;\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 BK_DEFAULT_DIALOG_CONFIG: BkDialogConfig = {\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 * BkDialogService — 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 `BkDialogContainerComponent` (extending\r\n * `CdkDialogContainer`) for WAAPI animations and panel styling.\r\n *\r\n * 3. We wrap CDK's `DialogRef` in our own `BkDialogRef` 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 BkDialogRef 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 { BkDialogConfig, BK_DEFAULT_DIALOG_CONFIG } from './dialog-config';\r\nimport { BkDialogRef } from './dialog-ref';\r\nimport { BkDialogContainerComponent } from './dialog-container';\r\nimport { BK_DIALOG_GLOBAL_CONFIG, BK_INTERNAL_DIALOG_CONFIG } from './dialog.tokens';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class BkDialogService {\r\n private readonly _cdkDialog = inject(Dialog);\r\n private readonly _overlay = inject(Overlay);\r\n private readonly _globalConfig: BkDialogConfig | null =\r\n inject(BK_DIALOG_GLOBAL_CONFIG, { optional: true });\r\n\r\n /** Stack of currently open dialog refs (most recent = last). */\r\n private readonly _openDialogRefs: BkDialogRef<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 `BkDialogRef` 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?: BkDialogConfig<D>,\r\n ): BkDialogRef<T, R> {\r\n // ── 1. Merge configs: DEFAULT ← GLOBAL ← per-call ──────────────\r\n const mergedConfig = {\r\n ...BK_DEFAULT_DIALOG_CONFIG,\r\n ...(this._globalConfig ?? {}),\r\n ...(config ?? {}),\r\n } as BkDialogConfig<D>;\r\n\r\n // ── 2. Prepare the return ref (set inside providers callback) ───\r\n let ourRef!: BkDialogRef<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: BkDialogContainerComponent,\r\n providers: () => [\r\n { provide: BK_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 `BkDialogRef` 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 BkDialogRef<T, R>(cdkRef);\r\n ourRef._containerInstance = containerInstance as BkDialogContainerComponent;\r\n\r\n // Wire up afterOpened emission.\r\n (containerInstance as BkDialogContainerComponent).opened\r\n .then(() => ourRef._emitOpened());\r\n\r\n return [\r\n { provide: BkDialogRef, 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 `BkDialogRef` of the most recently opened dialog,\r\n * or `undefined` if none are open.\r\n */\r\n getTopDialog(): BkDialogRef | 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): BkDialogRef | 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 `BkDialogRef` is not\r\n * available via injection (e.g. inside `<ng-template>`).\r\n */\r\n get openDialogsRef(): readonly BkDialogRef[] {\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 }): BkDialogRef<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 }): BkDialogRef<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: BkDialogRef, config: BkDialogConfig): void {\r\n if (config.disableClose) return;\r\n\r\n // Backdrop click\r\n if (config.closeOnBackdrop !== false) {\r\n ref.backdropClick().subscribe((event: any) => {\r\n // Only the top-most dialog should react to backdrop clicks\r\n if (this.getTopDialog() !== ref) {\r\n return;\r\n }\r\n\r\n // Prevent this click from leaking to underlying overlays\r\n try {\r\n if (event) {\r\n if (typeof event.preventDefault === 'function') event.preventDefault();\r\n if (typeof event.stopPropagation === 'function') event.stopPropagation();\r\n if (typeof event.stopImmediatePropagation === 'function') event.stopImmediatePropagation();\r\n }\r\n } catch {\r\n // no-op\r\n }\r\n\r\n // Defer close so CDK finishes dispatching this event on the top overlay\r\n setTimeout(() => ref.close());\r\n });\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 // Only the top-most dialog should react to ESC\r\n if (this.getTopDialog() !== ref) {\r\n return;\r\n }\r\n try {\r\n if (typeof e.preventDefault === 'function') e.preventDefault();\r\n if (typeof e.stopPropagation === 'function') e.stopPropagation();\r\n } catch {\r\n // no-op\r\n }\r\n setTimeout(() => 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: BkDialogConfig): 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: BkDialogConfig) {\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 { BkDialogRef } from './dialog-ref';\r\nimport { BkDialogService } 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 `BkDialogRef` 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 BkDialogRef[],\r\n): BkDialogRef | 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 `BkDialogRef` (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: BkDialogRef | null = inject(BkDialogRef, { optional: true });\r\n protected _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(BkDialogService);\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: BkDialogRef | null = inject(BkDialogRef, { optional: true });\r\n private _elementRef = inject(ElementRef<HTMLElement>);\r\n private _dialogService = inject(BkDialogService);\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 * • `BkDialogService` 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 { BkDialogContainerComponent } 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 BkDialogContainerComponent,\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\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 }\r\n @else if (showError) {\r\n <span>\r\n {{ errorMessage }}\r\n </span>\r\n }\r\n</span>\r\n","import { Component, EventEmitter, Input, OnDestroy, Output, SimpleChanges, forwardRef } from '@angular/core';\r\nimport { CommonModule, NgClass } from '@angular/common';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nexport type BkAvatarSize = 'sm' | 'md' | 'lg' | 'xl';\r\nexport type BkAvatarFallback = 'auto' | 'initials' | 'icon' | 'camera';\r\n\r\n@Component({\r\n selector: 'bk-avatar-uploader',\r\n imports: [NgClass, CommonModule, BKTooltipDirective],\r\n templateUrl: './avatar-profile.html',\r\n styleUrl: './avatar-profile.css',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkAvatarUploader),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => BkAvatarUploader),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class BkAvatarUploader implements OnDestroy, ControlValueAccessor, Validator {\r\n\r\n // ---------- Display inputs ----------\r\n @Input() src: string | null = null;\r\n @Input() alt = 'Avatar';\r\n @Input() name = '';\r\n @Input() size: BkAvatarSize = 'md';\r\n @Input() fallback: BkAvatarFallback = 'auto';\r\n\r\n // ---------- Functional inputs ----------\r\n /** Whether upload / remove actions are enabled */\r\n @Input() editable = true;\r\n /** Accepted file MIME types for the file picker */\r\n @Input() accept = 'image/jpeg, image/png, image/heic, image/heif, .heic, .heif';\r\n /** Max file size in KB (0 = no limit) */\r\n @Input() maxFileSizeKB = 0;\r\n /** Label shown on the upload button */\r\n @Input() uploadLabel = 'Upload';\r\n /** Hint text shown below the upload button */\r\n @Input() hint = '500x500 JPEG, PNG Image';\r\n /** External loading state (e.g. while uploading) */\r\n @Input() loading = false;\r\n /** Whether the remove badge is shown when an image is present */\r\n @Input() removable = false;\r\n @Input() removeableIconTooltip = 'Remove';\r\n\r\n // ---------- Form / CVA inputs ----------\r\n /** Label displayed above the avatar */\r\n @Input() label = '';\r\n /** Whether the field is required (shows asterisk) */\r\n @Input() required = false;\r\n /** External error state flag */\r\n @Input() hasError = false;\r\n /** Error message to display when hasError is true */\r\n @Input() errorMessage = '';\r\n /** Disabled state (also set via CVA setDisabledState) */\r\n @Input() disabled = false;\r\n\r\n // ---------- Outputs ----------\r\n /** Emits the selected File after validation passes */\r\n @Output() fileSelected = new EventEmitter();\r\n /** Emits when the user clicks the remove badge */\r\n @Output() removed = new EventEmitter<void>();\r\n /** Emits a human-readable error string on validation failure */\r\n @Output() fileError = new EventEmitter<string>();\r\n\r\n initials = '';\r\n imageLoadFailed = false;\r\n corrupted = false;\r\n\r\n /** Local blob URL for instant preview before server upload completes */\r\n private previewUrl: string | null = null;\r\n\r\n // ---------- CVA Callbacks ----------\r\n private onChange = (_value: string | null) => {};\r\n private onTouched = () => {};\r\n\r\n writeValue(value: string | null): void {\r\n this.src = value || null;\r\n // When a new value arrives from the form (e.g. server URL after upload),\r\n // discard any stale local blob preview so displaySrc uses the real URL\r\n this.revokePreview();\r\n this.imageLoadFailed = false;\r\n this.corrupted = false;\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.editable = !isDisabled;\r\n }\r\n\r\n // ---------- Validator Implementation ----------\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (this.required && !control.value) {\r\n return { required: true };\r\n }\r\n return null;\r\n }\r\n\r\n // ---------- Lifecycle ----------\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.name) {\r\n this.initials = this.getInitials(this.name);\r\n }\r\n this.imageLoadFailed = false;\r\n this.corrupted = false;\r\n\r\n // When the parent updates [src] via @Input (non-CVA usage), discard the local preview,\r\n // except when the incoming value is the same preview URL.\r\n if (changes['src'] && this.previewUrl && this.src !== this.previewUrl) {\r\n this.revokePreview();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.revokePreview();\r\n }\r\n\r\n onImageError(): void {\r\n this.imageLoadFailed = true;\r\n }\r\n\r\n // ---------- Derived UI ----------\r\n /** The URL the template should display — local preview takes priority over the server src */\r\n get displaySrc(): string | null {\r\n return this.previewUrl ?? this.src;\r\n }\r\n\r\n get showInitials(): boolean {\r\n if (!this.name) return false;\r\n if (this.fallback === 'icon') return false;\r\n if (this.fallback === 'camera') return false;\r\n if (this.fallback === 'initials') return true;\r\n return true; // auto\r\n }\r\n\r\n get containerClasses(): string {\r\n const classes = ['avatar-profile', this.size];\r\n if (this.corrupted) classes.push('corrupted');\r\n return classes.join(' ');\r\n }\r\n\r\n get sizeClasses(): BkAvatarSize[] {\r\n return [this.size];\r\n }\r\n\r\n get showRemoveButton(): boolean {\r\n return this.removable && this.editable && !!(this.displaySrc) && !this.imageLoadFailed;\r\n }\r\n\r\n // ---------- File handling ----------\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files?.length) return;\r\n\r\n const file = input.files[0];\r\n const isHeicLike = this.isHeicFile(file);\r\n\r\n // Validate file type\r\n if (this.accept && !this.isFileTypeValid(file)) {\r\n this.fileError.emit(`Invalid file type. Accepted: ${this.accept}`);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Validate file size\r\n if (this.maxFileSizeKB > 0 && file.size > this.maxFileSizeKB * 1024) {\r\n this.fileError.emit(`File size exceeds ${this.maxFileSizeKB}KB limit.`);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Create a blob URL and verify the browser can actually decode it as an image\r\n this.revokePreview();\r\n const blobUrl = URL.createObjectURL(file);\r\n\r\n if (isHeicLike) {\r\n // HEIC/HEIF files are often valid but not decodable by the browser on Windows.\r\n // Do not attach a blob preview URL for these formats; some browsers emit\r\n // noisy blob fetch errors for unsupported decoders.\r\n URL.revokeObjectURL(blobUrl);\r\n this.corrupted = false;\r\n this.previewUrl = null;\r\n this.imageLoadFailed = false;\r\n this.onTouched();\r\n this.fileSelected.emit(event);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n this.validateImage(blobUrl).then(valid => {\r\n if (!valid) {\r\n // Corrupted / undecodable file — show corrupted state, do NOT emit\r\n URL.revokeObjectURL(blobUrl);\r\n this.corrupted = true;\r\n this.imageLoadFailed = false;\r\n this.previewUrl = null;\r\n this.fileError.emit('The selected file appears to be corrupted or is not a valid image.');\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Valid image — proceed with preview & emission\r\n this.corrupted = false;\r\n this.previewUrl = blobUrl;\r\n this.imageLoadFailed = false;\r\n\r\n // Push the preview URL as the form value so validation (e.g. required) passes\r\n this.onChange(this.previewUrl);\r\n this.onTouched();\r\n\r\n this.fileSelected.emit(event);\r\n input.value = ''; // reset so re-selecting the same file still triggers change\r\n });\r\n }\r\n\r\n /**\r\n * Attempts to load a URL into an off-screen Image element.\r\n * Resolves `true` if the browser can decode it, `false` otherwise.\r\n */\r\n private validateImage(url: string): Promise<boolean> {\r\n return new Promise(resolve => {\r\n const img = new Image();\r\n img.onload = () => resolve(true);\r\n img.onerror = () => resolve(false);\r\n img.src = url;\r\n });\r\n }\r\n\r\n onRemove(): void {\r\n this.revokePreview();\r\n this.src = null;\r\n this.corrupted = false;\r\n this.onChange(null);\r\n this.onTouched();\r\n this.removed.emit();\r\n }\r\n\r\n // ---------- Utils ----------\r\n /** Revoke the previous object URL to free memory */\r\n private revokePreview(): void {\r\n if (this.previewUrl) {\r\n URL.revokeObjectURL(this.previewUrl);\r\n this.previewUrl = null;\r\n }\r\n }\r\n\r\n private isFileTypeValid(file: File): boolean {\r\n const accepted = this.accept.split(',').map(t => t.trim().toLowerCase()).filter(Boolean);\r\n const fileType = (file.type || '').toLowerCase();\r\n const fileName = file.name.toLowerCase();\r\n const fileExtension = fileName.includes('.') ? fileName.slice(fileName.lastIndexOf('.') + 1) : '';\r\n\r\n return accepted.some(type => {\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.slice(0, -1));\r\n }\r\n\r\n if (type === 'image/heic' || type === 'image/heif' || type === '.heic' || type === '.heif' || type === 'heic' || type === 'heif') {\r\n return fileType === 'image/heic' || fileType === 'image/heif' || fileExtension === 'heic' || fileExtension === 'heif';\r\n }\r\n\r\n if (type.startsWith('.')) {\r\n return fileExtension === type.slice(1);\r\n }\r\n\r\n return fileType === type;\r\n });\r\n }\r\n\r\n private isHeicFile(file: File): boolean {\r\n const fileType = (file.type || '').toLowerCase();\r\n const fileName = file.name.toLowerCase();\r\n return fileType === 'image/heic' || fileType === 'image/heif' || fileName.endsWith('.heic') || fileName.endsWith('.heif');\r\n }\r\n\r\n private getInitials(name: string): string {\r\n const parts = name.trim().split(/\\s+/);\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts.at(-1)![0]).toUpperCase();\r\n }\r\n}\r\n","<div class=\"avatar-profile-container\" [ngClass]=\"sizeClasses\">\r\n @if (label) {\r\n <label class=\"avatar-profile-label\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"avatar-profile-label-required\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"flex gap-4 justify-end\">\r\n <div\r\n [ngClass]=\"containerClasses\"\r\n [bkTooltip]=\"name\"\r\n [bkTooltipPosition]=\"'top'\"\r\n >\r\n\r\n <!-- Loading overlay -->\r\n @if (loading) {\r\n <div class=\"absolute inset-0 flex items-center justify-center z-10 rounded-full bg-white/60\">\r\n <div class=\"w-5 h-5 border-2 border-[#141414] border-t-transparent rounded-full animate-spin\"></div>\r\n </div>\r\n }\r\n\r\n @if (corrupted) {\r\n <!-- Corrupted file indicator -->\r\n <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M19.3517 7.61665L15.3929 4.05375C14.2651 3.03868 13.7012 2.53114 13.0092 2.26562L13 5.00011C13 7.35713 13 8.53564 13.7322 9.26787C14.4645 10.0001 15.643 10.0001 18 10.0001H21.5801C21.2175 9.29588 20.5684 8.71164 19.3517 7.61665Z\" fill=\"#DC3545\"/>\r\n <path d=\"M14 22H10C6.22876 22 4.34315 22 3.17157 20.8284C2.72548 20.3823 2.44924 19.8327 2.27818 19.1149C2.15904 18.6149 2.09948 18.3649 2.21429 18.0728C2.32911 17.7806 2.58217 17.6119 3.08829 17.2745L3.71429 16.8571C4.49285 16.3381 5.50715 16.3381 6.28571 16.8571C7.3238 17.5492 8.6762 17.5492 9.71429 16.8571C10.4929 16.3381 11.5071 16.3381 12.2857 16.8571C13.3238 17.5492 14.6762 17.5492 15.7143 16.8571C16.4929 16.3381 17.5071 16.3381 18.2857 16.8571C19.3238 17.5492 20.6762 17.5492 21.7143 16.8571C21.8241 16.7839 21.9705 16.8681 21.965 17C21.8873 18.8723 21.6366 20.0203 20.8284 20.8284C19.6569 22 17.7712 22 14 22Z\" fill=\"#DC3545\"/>\r\n <path d=\"M2 10C2 6.22876 2 4.34315 3.17157 3.17157C4.34315 2 6.23869 2 10.0298 2C10.6358 2 11.1214 2 11.53 2.01666C11.5166 2.09659 11.5095 2.17813 11.5092 2.26057L11.5 5.09497C11.4999 6.19207 11.4998 7.16164 11.6049 7.94316C11.7188 8.79028 11.9803 9.63726 12.6716 10.3285C13.3628 11.0198 14.2098 11.2813 15.0569 11.3952C15.8385 11.5003 16.808 11.5002 17.9051 11.5001L18 11.5001H21.9934V12.3273C21.9973 12.5399 21.8912 12.7392 21.7143 12.8571C20.6762 13.5492 19.3238 13.5492 18.2857 12.8571C17.5071 12.3381 16.4929 12.3381 15.7143 12.8571C14.6762 13.5492 13.3238 13.5492 12.2857 12.8571C11.5071 12.3381 10.4929 12.3381 9.71429 12.8571C8.6762 13.5492 7.3238 13.5492 6.28571 12.8571C5.50715 12.3381 4.49285 12.3381 3.71429 12.8571L3.5547 12.9635C2.87033 13.4198 2.52814 13.6479 2.26407 13.5066C2 13.3653 2 12.954 2 12.1315V10Z\" fill=\"#DC3545\"/>\r\n </svg>\r\n }\r\n\r\n @else if (displaySrc && !imageLoadFailed) {\r\n <img\r\n [src]=\"displaySrc\"\r\n [alt]=\"alt\"\r\n class=\"avatar-img\"\r\n (error)=\"onImageError()\"\r\n />\r\n }\r\n\r\n @else if (fallback === 'camera') {\r\n <svg class=\"placeholder-icon\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M18.3843 4.66667C17.6726 4.66667 17.0193 4.25833 16.6926 3.62833L15.8526 1.93667C15.316 0.875 13.916 0 12.726 0H10.0543C8.85264 0 7.45264 0.875 6.91598 1.93667L6.07598 3.62833C5.74931 4.25833 5.09598 4.66667 4.38431 4.66667C1.85264 4.66667 -0.154023 6.80167 0.00931005 9.32167L0.615977 18.9583C0.755977 21.3617 2.05098 23.3333 5.27098 23.3333H17.4976C20.7176 23.3333 22.001 21.3617 22.1526 18.9583L22.7593 9.32167C22.9226 6.80167 20.916 4.66667 18.3843 4.66667ZM9.63431 6.125H13.1343C13.6126 6.125 14.0093 6.52167 14.0093 7C14.0093 7.47833 13.6126 7.875 13.1343 7.875H9.63431C9.15598 7.875 8.75931 7.47833 8.75931 7C8.75931 6.52167 9.15598 6.125 9.63431 6.125ZM11.3843 18.8067C9.21431 18.8067 7.44098 17.045 7.44098 14.8633C7.44098 12.6817 9.20264 10.92 11.3843 10.92C13.566 10.92 15.3276 12.6817 15.3276 14.8633C15.3276 17.045 13.5543 18.8067 11.3843 18.8067Z\" fill=\"#6B7080\"/>\r\n </svg>\r\n }\r\n\r\n @else if (showInitials) {\r\n <span class=\"avatar-text\">\r\n {{ initials }}\r\n </span>\r\n }\r\n\r\n @else {\r\n <svg class=\"placeholder-icon\" viewBox=\"0 0 32 32\" fill=\"none\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" > <g clip-path=\"url(#clip0)\"> <path d=\"M16 16c3.682 0 6.667-2.985 6.667-6.667S19.682 2.667 16 2.667 9.333 5.651 9.333 9.333 12.318 16 16 16Z\" stroke=\"#363C51\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /> <path d=\"M27.453 29.333C27.453 24.173 22.32 20 16 20S4.547 24.173 4.547 29.333\" stroke=\"#363C51\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /> </g> <defs> <clipPath id=\"clip0\"> <rect width=\"32\" height=\"32\" fill=\"white\" /> </clipPath> </defs> </svg>\r\n }\r\n\r\n <!-- Remove badge -->\r\n @if (showRemoveButton) {\r\n <button\r\n type=\"button\"\r\n class=\"remove-badge\"\r\n (click)=\"onRemove()\"\r\n aria-label=\"Remove avatar\"\r\n [bkTooltip]=\"removeableIconTooltip\"\r\n [bkTooltipPosition]=\"'top'\"\r\n >\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M1 1L9 9M9 1L1 9\" stroke=\"#6B7080\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n }\r\n\r\n </div>\r\n <div class=\"flex flex-col gap-2 justify-end items-start\">\r\n @if (editable) {\r\n <label class=\"upload-button cursor-pointer\">\r\n {{ uploadLabel }}\r\n <input\r\n type=\"file\"\r\n class=\"hidden\"\r\n [accept]=\"accept\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </label>\r\n }\r\n @if (!hasError && hint) {\r\n <p class=\"profile-size\">{{ hint }}</p>\r\n }\r\n @if (hasError && errorMessage) {\r\n <p class=\"avatar-profile-error\">{{ errorMessage }}</p>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n effect,\r\n ViewChild,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n forwardRef,\r\n AfterViewInit,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nimport {\r\n ColorAppearance,\r\n deriveAppearance,\r\n NEUTRAL_APPEARANCE\r\n} from '../shared/utilities/color-appearance';\r\nimport { BkCheckbox } from '../../public-api';\r\n/** Generic hierarchical node; works with note types and any similar tree. */\r\nexport interface HierarchicalNode {\r\n [key: string]: any;\r\n childs?: HierarchicalNode[];\r\n children?: HierarchicalNode[];\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'bk-hierarchical-select',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BKTooltipDirective, BkCheckbox],\r\n templateUrl: './hierarchical-select.html',\r\n styleUrls: ['./hierarchical-select.css'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkHierarchicalSelect),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkHierarchicalSelect implements ControlValueAccessor, AfterViewInit, OnDestroy {\r\n /** Tree data (root-level array). */\r\n items = input<HierarchicalNode[]>([]);\r\n /** Key for display label (e.g. 'noteType'). */\r\n labelKey = input<string>('noteType');\r\n /** Key for value (e.g. 'noteTypeKey'). */\r\n valueKey = input<string>('noteTypeKey');\r\n /** Key for children array (e.g. 'childs' or 'children'). */\r\n childrenKey = input<string>('childs');\r\n clearTooltip = input<string>('');\r\n /** Key to check if node is disabled (e.g. 'active', 'disabled'). */\r\n // disabledKey = input<string>('disabled');\r\n /** Placeholder when nothing selected. */\r\n placeholder = input<string>('Select...');\r\n /** Label above the control. */\r\n label = input<string>('');\r\n /** Required indicator. */\r\n required = input<boolean>(false);\r\n /** Optional icon URL in the trigger. */\r\n iconSrc = input<string | undefined>(undefined);\r\n iconAlt = input<string>('icon');\r\n /** Disabled state (can also be set by form control via CVA). */\r\n disabled = input<boolean>(false);\r\n private disabledByForm = signal<boolean>(false);\r\n isDisabled = computed(() => this.disabled() || this.disabledByForm());\r\n /** Whether to allow selecting parent nodes that have children. Default: only leaf selection. */\r\n allowParentSelection = input<boolean>(false);\r\n /** Text for \"Back\" link (e.g. \"< Back to Main\"). */\r\n backToMainText = input<string>('Back to Main');\r\n /** Search placeholder. */\r\n searchPlaceholder = input<string>('Search');\r\n searchable = input<boolean>(false);\r\n /** When true, dropdown is positioned fixed and sized to the trigger (use inside modals/popups). */\r\n appendToBody = input<boolean>(false);\r\n /** Open above or below the trigger (also used when appendToBody is true for fixed coordinates). */\r\n dropdownPosition = input<'bottom' | 'top'>('bottom');\r\n /** Key for option color (e.g. \"color\"). When set, option label and selected value use this color. */\r\n colorKey = input<string>('');\r\n\r\n /**\r\n * Show an accent dot beside each option, driven by `colorKey`, and tint the\r\n * control with the selected node's colour (same treatment as bk-status-select).\r\n */\r\n showDots = input<boolean>(false);\r\n\r\n /**\r\n * When true, a child with no colour of its own borrows its nearest coloured\r\n * ancestor's, keeping a branch visually related. Off by default so existing\r\n * trees render exactly as before.\r\n */\r\n inheritColor = input<boolean>(false);\r\n /** Whether to show clear button when a value is selected. */\r\n clearable = input<boolean>(true);\r\n /** Optional anchor key to scope dropdown to one subtree (e.g. module/category key). */\r\n restrictKey = input<any>(null);\r\n hasError = input<boolean>(false);\r\n\r\n /** Emit full selected node. */\r\n selectionChange = output<HierarchicalNode | null>();\r\n /** Emit value only (e.g. noteTypeKey). */\r\n valueChange = output<any>();\r\n /** Emit when clear button is clicked. */\r\n clear = output<any>();\r\n\r\n\r\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\r\n @ViewChild('controlWrapper') controlWrapper!: ElementRef<HTMLDivElement>;\r\n @ViewChild('dropdownPanel') dropdownPanel?: ElementRef<HTMLDivElement>;\r\n\r\n private el = inject(ElementRef);\r\n\r\n // Side the panel is actually rendered on. Starts from the requested\r\n // `dropdownPosition` but is auto-flipped based on available viewport space.\r\n placement = signal<'bottom' | 'top'>('bottom');\r\n\r\n // When appendToBody is on we physically relocate the panel to <body> so it\r\n // escapes any transformed/overflow ancestor (e.g. an animated dialog). These\r\n // track its home so we can put it back before Angular removes it on close.\r\n private originalPanelParent: Node | null = null;\r\n private originalPanelAnchor: Node | null = null;\r\n private panelInBody = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n const list = this.items();\r\n const value = this.valueSignal();\r\n\r\n if (value == null) {\r\n this.selected.set(null);\r\n return;\r\n }\r\n\r\n const node = this.findNodeByValue(list ?? [], value);\r\n this.selected.set(node ?? null);\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Keep the panel glued to the control while any ancestor scrolls or the\r\n // window resizes. Capture phase (`true`) catches scrolling inside nested\r\n // overflow containers (e.g. a modal body), not just the window.\r\n window.addEventListener('scroll', this.reposition, true);\r\n window.addEventListener('resize', this.reposition);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n window.removeEventListener('scroll', this.reposition, true);\r\n window.removeEventListener('resize', this.reposition);\r\n // If we're torn down while open, don't leave the relocated panel orphaned in <body>.\r\n if (this.panelInBody) {\r\n this.dropdownPanel?.nativeElement.remove();\r\n this.panelInBody = false;\r\n }\r\n }\r\n\r\n // Re-evaluate placement as the page scrolls/resizes. For append-to-body this\r\n // recomputes the fixed coordinates so the panel follows the control while it's\r\n // visible, and closes once the control is fully scrolled out of view (viewport\r\n // OR any scroll container such as a modal body). Inline just re-flips up/down.\r\n private reposition = () => {\r\n if (!this.isOpen()) return;\r\n\r\n if (this.appendToBody()) {\r\n const rect = this.controlWrapper?.nativeElement.getBoundingClientRect();\r\n if (rect && this.isControlClipped(rect)) {\r\n this.closeDropdown();\r\n return;\r\n }\r\n }\r\n this.applyPlacement();\r\n };\r\n\r\n /**\r\n * True when the control is fully outside the visible area — either the\r\n * viewport or a scrollable/clipping ancestor (e.g. a dialog's scroll body).\r\n */\r\n private isControlClipped(rect: DOMRect): boolean {\r\n if (rect.bottom <= 0 || rect.top >= window.innerHeight ||\r\n rect.right <= 0 || rect.left >= window.innerWidth) {\r\n return true;\r\n }\r\n let el = this.controlWrapper?.nativeElement.parentElement;\r\n while (el && el !== document.body) {\r\n const style = getComputedStyle(el);\r\n const clips = /(auto|scroll|hidden|clip|overlay)/;\r\n if (clips.test(style.overflowY) || clips.test(style.overflowX)) {\r\n const r = el.getBoundingClientRect();\r\n if (rect.bottom <= r.top || rect.top >= r.bottom ||\r\n rect.right <= r.left || rect.left >= r.right) {\r\n return true;\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Relocate the panel node to <body> so it truly escapes any transformed or\r\n * overflow-clipped ancestor (dialogs, drawers, overflow cards, etc.).\r\n */\r\n private movePanelToBody(): void {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || this.panelInBody) return;\r\n this.originalPanelParent = panel.parentNode;\r\n this.originalPanelAnchor = panel.nextSibling;\r\n document.body.appendChild(panel);\r\n this.panelInBody = true;\r\n }\r\n\r\n /** Return the panel to its original DOM position before Angular removes it. */\r\n private restorePanel(): void {\r\n const panel = this.dropdownPanel?.nativeElement;\r\n if (!panel || !this.panelInBody) return;\r\n if (this.originalPanelParent) {\r\n this.originalPanelParent.insertBefore(panel, this.originalPanelAnchor);\r\n }\r\n this.panelInBody = false;\r\n this.originalPanelParent = null;\r\n this.originalPanelAnchor = null;\r\n }\r\n\r\n /** Runs after the panel has rendered: relocate (append mode) + position + focus. */\r\n private afterOpenInit(): void {\r\n if (this.appendToBody()) this.movePanelToBody();\r\n this.applyPlacement();\r\n this.searchInput?.nativeElement?.focus();\r\n }\r\n\r\n isOpen = signal(false);\r\n dropdownStyle = signal<{ top?: string; bottom?: string; left: string; width: string }>({\r\n left: '0px',\r\n width: 'auto',\r\n });\r\n searchTerm = signal('');\r\n /** Breadcrumb stack: each entry is the parent node we navigated into. */\r\n breadcrumb = signal<HierarchicalNode[]>([]);\r\n /** Currently selected node (leaf or parent if allowParentSelection). */\r\n selected = signal<HierarchicalNode | null>(null);\r\n\r\n /** Current level items: root or children of last breadcrumb. */\r\n currentLevelItems = computed(() => {\r\n const list = this.items();\r\n const stack = this.breadcrumb();\r\n if (!list?.length) return [];\r\n\r\n const restrictKey = this.restrictKey();\r\n if (restrictKey != null) {\r\n const anchorNode = this.findNodeByValue(list, restrictKey);\r\n if (!anchorNode) {\r\n return [];\r\n }\r\n\r\n // Start from anchor children only, so siblings outside this branch are hidden.\r\n let anchoredLevel: HierarchicalNode[] = this.getChildren(anchorNode) ?? [];\r\n for (const parent of stack) {\r\n const children = this.getChildren(parent);\r\n anchoredLevel = children ?? [];\r\n }\r\n return anchoredLevel;\r\n }\r\n\r\n let level: HierarchicalNode[] = list;\r\n for (const parent of stack) {\r\n const children = this.getChildren(parent);\r\n level = children ?? [];\r\n }\r\n return level;\r\n });\r\n\r\n /** Filtered by search (matches label in current level and descendants). */\r\n filteredItems = computed(() => {\r\n const term = this.searchTerm().toLowerCase().trim();\r\n const level = this.currentLevelItems();\r\n if (!term) return level;\r\n return level.filter((item) =>\r\n this.getLabel(item).toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n /** Display text in trigger: path \"Parent > Child\" or placeholder. */\r\n displayPath = computed(() => {\r\n const sel = this.selected();\r\n if (!sel) return [];\r\n\r\n const path = this.buildPathTo(sel);\r\n return path.length ? path : [sel];\r\n });\r\n\r\n\r\n /** Whether we're not at root (show Back). */\r\n showBack = computed(() => this.breadcrumb().length > 0);\r\n\r\n getLabel(node: HierarchicalNode): string {\r\n const key = this.labelKey();\r\n return (node && key && node[key]) ?? '';\r\n }\r\n\r\n /** Returns the color for the node (e.g. node.color) when colorKey is set. */\r\n resolveColor(node: HierarchicalNode | null): string | null {\r\n if (!node) return null;\r\n const key = this.colorKey();\r\n return key && typeof node === 'object' ? (node[key] as string) ?? null : null;\r\n }\r\n\r\n /**\r\n * Accent for the last node of a root→node path: its own colour, or — when\r\n * `inheritColor` is on — the nearest coloured ancestor's.\r\n */\r\n private colorAlong(path: HierarchicalNode[]): string | null {\r\n if (!path.length) return null;\r\n if (!this.inheritColor()) return this.resolveColor(path[path.length - 1]);\r\n for (let i = path.length - 1; i >= 0; i--) {\r\n const color = this.resolveColor(path[i]);\r\n if (color) return color;\r\n }\r\n return null;\r\n }\r\n\r\n /** Accent for a row in the level on screen — its ancestors are the breadcrumb. */\r\n private optionAccentColor(node: HierarchicalNode): string | null {\r\n return this.colorAlong([...this.breadcrumb(), node]);\r\n }\r\n\r\n /**\r\n * Colours for the control itself, from the selected node. Neutral unless\r\n * `showDots` is on, so existing usages are untouched.\r\n */\r\n controlAppearance = computed<ColorAppearance>(() => {\r\n if (!this.showDots()) return NEUTRAL_APPEARANCE;\r\n const sel = this.selected();\r\n if (!sel) return NEUTRAL_APPEARANCE;\r\n return deriveAppearance(this.colorAlong(this.buildPathTo(sel)), 'subtle');\r\n });\r\n\r\n /** Raw accent for a node's dot. */\r\n accentFor(node: HierarchicalNode): string | null {\r\n return deriveAppearance(this.optionAccentColor(node), 'subtle').dotColor;\r\n }\r\n\r\n /**\r\n * Label colour for an option. With showDots on, the accent is darkened until\r\n * legible; otherwise the raw colorKey value is used as before.\r\n */\r\n optionTextColor(node: HierarchicalNode): string | null {\r\n if (!this.showDots()) return this.resolveColor(node);\r\n return deriveAppearance(this.optionAccentColor(node), 'none').color;\r\n }\r\n\r\n\r\n getValue(node: HierarchicalNode): any {\r\n const key = this.valueKey();\r\n return key && node ? node[key] : node;\r\n }\r\n\r\n getChildren(node: HierarchicalNode): HierarchicalNode[] | undefined {\r\n const key = this.childrenKey();\r\n const raw = node?.[key];\r\n if (Array.isArray(raw) && raw.length > 0) return raw;\r\n const alt = node?.['children'];\r\n return Array.isArray(alt) && alt.length > 0 ? alt : undefined;\r\n }\r\n\r\n hasChildren(node: HierarchicalNode): boolean {\r\n const ch = this.getChildren(node);\r\n return !!ch?.length;\r\n }\r\n\r\n // isNodeDisabled(node: HierarchicalNode): boolean {\r\n // if (!node) return false;\r\n // const disabledProp = this.disabledKey();\r\n // if (!disabledProp || typeof node !== 'object') return false;\r\n\r\n // const value = node[disabledProp];\r\n // if (typeof value !== 'boolean') return value === true;\r\n\r\n // // Support both patterns:\r\n // // - disabled=true means disabled\r\n // // - active/enabled=false means disabled\r\n // const key = disabledProp.toLowerCase();\r\n // if (key.includes('active') || key.includes('enabled')) {\r\n // return !value;\r\n // }\r\n\r\n // return value;\r\n // }\r\n\r\n isSelected(node: HierarchicalNode): boolean {\r\n const sel = this.selected();\r\n if (!sel) return false;\r\n return this.getValue(sel) === this.getValue(node);\r\n }\r\n\r\n /** Build path from root to target (finds first occurrence). */\r\n private buildPathTo(target: HierarchicalNode): HierarchicalNode[] {\r\n const targetVal = this.getValue(target);\r\n const path: HierarchicalNode[] = [];\r\n const search = (list: HierarchicalNode[], parentPath: HierarchicalNode[]): boolean => {\r\n for (const node of list) {\r\n const currentPath = [...parentPath, node];\r\n if (this.getValue(node) === targetVal) {\r\n path.push(...currentPath);\r\n return true;\r\n }\r\n const children = this.getChildren(node);\r\n if (children?.length && search(children, currentPath)) return true;\r\n }\r\n return false;\r\n };\r\n search(this.items(), []);\r\n return path;\r\n }\r\n\r\n toggleDropdown(event?: Event): void {\r\n event?.preventDefault();\r\n event?.stopPropagation();\r\n if (this.isDisabled()) return;\r\n if (this.isOpen()) {\r\n this.closeDropdown();\r\n } else {\r\n this.openDropdown();\r\n }\r\n }\r\n\r\n openDropdown(): void {\r\n if (this.restrictKey() != null) {\r\n const restrictKey = this.restrictKey();\r\n const sel = this.selected();\r\n\r\n if (sel) {\r\n const selectedPath = this.buildPathTo(sel);\r\n const anchorIndex = selectedPath.findIndex(\r\n (node) => this.getValue(node) === restrictKey\r\n );\r\n\r\n if (anchorIndex >= 0) {\r\n const relativePath = selectedPath.slice(anchorIndex + 1);\r\n const selectedHasChildren = this.hasChildren(sel);\r\n\r\n // If selected has children, open at selected node so user can navigate deeper.\r\n // If selected is leaf, open at parent level so siblings are still visible/selectable.\r\n if (selectedHasChildren) {\r\n this.breadcrumb.set(relativePath);\r\n } else {\r\n this.breadcrumb.set(relativePath.slice(0, -1));\r\n }\r\n } else {\r\n this.breadcrumb.set([]);\r\n }\r\n } else {\r\n this.breadcrumb.set([]);\r\n }\r\n\r\n // Decide the initial side before the panel paints (estimated height;\r\n // corrected after render in afterOpenInit).\r\n this.applyPlacement();\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n setTimeout(() => this.afterOpenInit(), 0);\r\n return;\r\n }\r\n\r\n const sel = this.selected();\r\n if (sel) {\r\n const path = this.buildPathTo(sel);\r\n this.breadcrumb.set(path.slice(0, -1));\r\n } else {\r\n this.breadcrumb.set([]);\r\n }\r\n this.applyPlacement();\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n setTimeout(() => this.afterOpenInit(), 0);\r\n }\r\n\r\n /**\r\n * Decides which side the panel opens on (auto-flip) and, for append-to-body\r\n * mode, computes the fixed coordinates. Re-run on open and on scroll/resize so\r\n * the panel snaps to whichever side has room — honouring `dropdownPosition`\r\n * when it fits. Inline mode is positioned by CSS via the `placement` signal.\r\n */\r\n applyPlacement(): void {\r\n const el = this.controlWrapper?.nativeElement;\r\n if (!el) return;\r\n\r\n const rect = el.getBoundingClientRect();\r\n const gap = 4;\r\n const panelHeight = this.dropdownPanel?.nativeElement.offsetHeight || 300;\r\n\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const spaceAbove = rect.top - gap;\r\n\r\n const preferred = this.dropdownPosition();\r\n let placeTop: boolean;\r\n if (preferred === 'top') {\r\n placeTop = spaceAbove >= panelHeight || spaceAbove > spaceBelow;\r\n } else {\r\n placeTop = spaceBelow < panelHeight && spaceAbove > spaceBelow;\r\n }\r\n this.placement.set(placeTop ? 'top' : 'bottom');\r\n\r\n // Inline mode uses CSS (data-position) — the placement signal is enough.\r\n if (!this.appendToBody()) return;\r\n\r\n if (placeTop) {\r\n this.dropdownStyle.set({\r\n top: undefined,\r\n bottom: `${window.innerHeight - rect.top + gap}px`,\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: `${rect.bottom + gap}px`,\r\n bottom: undefined,\r\n left: `${rect.left}px`,\r\n width: `${rect.width}px`,\r\n });\r\n }\r\n }\r\n\r\n /** Fixed positioning when appendToBody; inset placement uses CSS + .hierarchical-select-field. */\r\n getTop(): string | null {\r\n if (!this.appendToBody()) return null;\r\n return this.dropdownStyle().top ?? null;\r\n }\r\n\r\n getBottom(): string | null {\r\n if (!this.appendToBody()) return null;\r\n return this.dropdownStyle().bottom ?? null;\r\n }\r\n\r\n // Scroll/resize are handled by the capture-phase listeners in ngAfterViewInit\r\n // (see `reposition`): they keep the panel attached, re-flip it, and only close\r\n // it once the control scrolls fully out of view.\r\n\r\n closeDropdown(): void {\r\n const wasOpen = this.isOpen();\r\n // Put the panel back where Angular expects it before the @if removes it.\r\n this.restorePanel();\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.breadcrumb.set([]);\r\n if (wasOpen) {\r\n this.onTouched();\r\n }\r\n }\r\n\r\n goBack(): void {\r\n const stack = this.breadcrumb();\r\n if (stack.length === 0) return;\r\n this.breadcrumb.set(stack.slice(0, -1));\r\n }\r\n\r\n onSearchInput(event: Event): void {\r\n const value = (event.target as HTMLInputElement).value;\r\n this.searchTerm.set(value);\r\n }\r\n\r\n selectItem(node: HierarchicalNode, event?: Event): void {\r\n event?.stopPropagation();\r\n if (node.disabled) return;\r\n // A parent row always navigates. When parents are selectable, that happens\r\n // through the row's checkbox instead (see `toggleParentSelection`).\r\n if (this.hasChildren(node)) {\r\n this.breadcrumb.update((stack) => [...stack, node]);\r\n return;\r\n }\r\n this.selected.set(node);\r\n const value = this.getValue(node);\r\n this._value = value;\r\n this.valueSignal.set(value);\r\n this.onChange(this.getValue(node));\r\n this.selectionChange.emit(node);\r\n this.valueChange.emit(value);\r\n this.closeDropdown();\r\n }\r\n\r\n /**\r\n * Select/deselect any node from its checkbox — parent, child or leaf, at any\r\n * depth. Stops the event so a parent row's own handler doesn't also navigate\r\n * into its children.\r\n */\r\n toggleParentSelection(node: HierarchicalNode, event?: Event): void {\r\n event?.stopPropagation();\r\n event?.preventDefault();\r\n if (node.disabled) return;\r\n\r\n if (this.isSelected(node)) {\r\n this.selected.set(null);\r\n this._value = null;\r\n this.valueSignal.set(null);\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.valueChange.emit(null);\r\n return;\r\n }\r\n\r\n this.selected.set(node);\r\n const value = this.getValue(node);\r\n this._value = value;\r\n this.valueSignal.set(value);\r\n this.onChange(value);\r\n this.selectionChange.emit(node);\r\n this.valueChange.emit(value);\r\n this.closeDropdown();\r\n }\r\n\r\n openFromLabel(event: MouseEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (this.isDisabled()) return;\r\n this.controlWrapper?.nativeElement?.focus();\r\n this.openDropdown();\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(e: Event): void {\r\n const target = e.target as Node;\r\n // When appendToBody relocates the panel to <body>, it's no longer inside the\r\n // host element — treat clicks within the panel as \"inside\" too.\r\n if (this.el.nativeElement.contains(target)) return;\r\n if (this.dropdownPanel?.nativeElement.contains(target)) return;\r\n this.closeDropdown();\r\n }\r\n\r\n // --- ControlValueAccessor ---\r\n private _value: any = null;\r\n private valueSignal = signal<any>(null);\r\n onChange: (value: any) => void = () => {};\r\n onTouched: () => void = () => {};\r\n\r\n writeValue(value: any): void {\r\n this._value = value;\r\n this.valueSignal.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabledByForm.set(isDisabled);\r\n }\r\n\r\n private findNodeByValue(list: HierarchicalNode[], value: any): HierarchicalNode | null {\r\n for (const node of list) {\r\n if (this.getValue(node) === value) return node;\r\n const children = this.getChildren(node);\r\n if (children?.length) {\r\n const found = this.findNodeByValue(children, value);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n handleClear(event: Event): void {\r\n event.stopPropagation();\r\n this.selected.set(null);\r\n this._value = null;\r\n this.valueSignal.set(null);\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.valueChange.emit(null);\r\n this.clear.emit(null);\r\n }\r\n}\r\n","<div class=\"hierarchical-select-container\">\r\n @if (label()) {\r\n <label\r\n class=\"input-label\"\r\n (click)=\"openFromLabel($event)\">\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=\"hierarchical-select-field\">\r\n <!-- With showDots on, the control is tinted by the selected node's accent.\r\n An errored control drops the tint entirely and goes neutral, so the red\r\n border reads as an error rather than competing with the accent. -->\r\n <div\r\n #controlWrapper\r\n class=\"hierarchical-select-control\"\r\n [ngClass]=\"{ 'hierarchical-select-control-has-error': hasError() }\"\r\n tabindex=\"0\"\r\n [class.focused]=\"isOpen()\"\r\n [class.disabled]=\"isDisabled()\"\r\n [class.filled]=\"!hasError() && !!controlAppearance().backgroundColor\"\r\n [style.backgroundColor]=\"hasError() ? null : controlAppearance().backgroundColor\"\r\n [style.color]=\"hasError() ? null : controlAppearance().color\"\r\n [style.borderColor]=\"hasError() ? null : controlAppearance().borderColor\"\r\n (mousedown)=\"toggleDropdown($event)\">\r\n @if (iconSrc()) {\r\n <img [src]=\"iconSrc()\" [alt]=\"iconAlt()\" class=\"shrink-0\" />\r\n }\r\n <div class=\"hierarchical-value-container\">\r\n @if (!selected()) {\r\n <div class=\"hierarchical-placeholder\">{{ placeholder() }}</div>\r\n } @else {\r\n <!-- Single row: the container is flex-wrap and the label is w-full, so\r\n a bare sibling dot would push the label onto a second line. -->\r\n <div class=\"hierarchical-value-row\">\r\n @if (showDots() && accentFor(selected()!)) {\r\n <span class=\"hierarchical-dot\" [style.backgroundColor]=\"accentFor(selected()!)\"></span>\r\n }\r\n <div class=\"hierarchical-value-label\" [style.color]=\"controlAppearance().color ?? resolveColor(selected())\">\r\n @for (node of displayPath(); track getValue(node); let last = $last) {\r\n <span\r\n #breadNode\r\n class=\"hierarchical-breadcrumb-node\"\r\n [bkTooltip]=\"breadNode.scrollWidth > breadNode.clientWidth ? getLabel(node) : ''\"\r\n bkTooltipPosition=\"top\">{{ getLabel(node) }}</span>\r\n\r\n @if (!last) {\r\n <svg\r\n class=\"breadcrumb-separator\"\r\n width=\"5\"\r\n height=\"8\"\r\n viewBox=\"0 0 5 8\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M4.57142 4.00286C4.57185 3.92766 4.55744 3.85312 4.52901 3.78351C4.50057 3.71389 4.45868 3.65058 4.40572 3.59719L0.977497 0.169008C0.924381 0.115455 0.861186 0.0729493 0.79156 0.0439419C0.721933 0.0149346 0.647251 0 0.571824 0C0.496396 0 0.421714 0.0149346 0.352088 0.0439419C0.282461 0.0729493 0.219267 0.115455 0.16615 0.169008C0.059732 0.27606 0 0.420874 0 0.57182C0 0.722766 0.059732 0.867579 0.16615 0.974631L3.19442 4.00286L0.16615 7.02537C0.059732 7.13242 0 7.27723 0 7.42818C0 7.57913 0.059732 7.72394 0.16615 7.83099C0.219267 7.88454 0.282461 7.92705 0.352088 7.95606C0.421714 7.98507 0.496396 8 0.571824 8C0.647251 8 0.721933 7.98507 0.79156 7.95606C0.861186 7.92705 0.924381 7.88454 0.977497 7.83099L4.40572 4.40281C4.51128 4.29639 4.57079 4.15275 4.57142 4.00286Z\"\r\n fill=\"#BBBDC5\"/>\r\n </svg>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n }\r\n </div>\r\n <div class=\"hierarchical-actions\">\r\n @if (clearable() && selected() && !isDisabled()) {\r\n <span class=\"hierarchical-clear-wrapper\" (mousedown)=\"handleClear($event)\" title=\"Clear\" [bkTooltip]=\"clearTooltip()\" bkTooltipPosition=\"top\">\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\">\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 </span>\r\n }\r\n <span class=\"hierarchical-arrow\" [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\">\r\n <path d=\"m6 9 6 6 6-6\"/>\r\n </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=\"hierarchical-dropdown-panel\"\r\n [attr.data-position]=\"placement()\"\r\n [class.hierarchical-dropdown-panel-fixed]=\"appendToBody()\"\r\n [style.position]=\"appendToBody() ? 'fixed' : 'absolute'\"\r\n [style.top]=\"appendToBody() ? getTop() : null\"\r\n [style.bottom]=\"appendToBody() ? getBottom() : null\"\r\n [style.left]=\"appendToBody() ? dropdownStyle().left : null\"\r\n [style.width]=\"appendToBody() ? dropdownStyle().width : '100%'\">\r\n @if (searchable()) {\r\n <div class=\"hierarchical-search\">\r\n <div class=\"hierarchical-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\r\n #searchInput\r\n type=\"text\"\r\n class=\"hierarchical-search-input\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"searchPlaceholder()\"\r\n (input)=\"onSearchInput($event)\"\r\n (click)=\"$event.stopPropagation()\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showBack()) {\r\n <button\r\n type=\"button\"\r\n class=\"hierarchical-back\"\r\n (click)=\"goBack(); $event.stopPropagation()\">\r\n <span>\r\n <svg width=\"6\" height=\"10\" viewBox=\"0 0 6 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M4.59961 0.599976L0.599609 4.59998L4.59961 8.59998\" stroke=\"#141414\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n\r\n </span>\r\n {{ backToMainText() }}\r\n </button>\r\n }\r\n\r\n <div class=\"hierarchical-options-list\">\r\n @for (item of filteredItems(); track getValue(item)) {\r\n <div\r\n class=\"hierarchical-option\"\r\n [class.selected]=\"isSelected(item)\"\r\n [class.disabled-item]=\"item.disabled\"\r\n [class.cursor-not-allowed]=\"item.disabled\"\r\n (mousedown)=\"selectItem(item, $event)\">\r\n <!-- Grouped so the row's justify-between still has exactly two\r\n children (body + trailing chevron/tick). -->\r\n <div class=\"hierarchical-option-body\">\r\n @if (allowParentSelection()) {\r\n @if (hasChildren(item)) {\r\n <!-- Only nodes with children get a box — a leaf is already\r\n selected by clicking its row. It owns its own mousedown so\r\n the row still navigates; the box itself is inert\r\n (pointer-events-none) so it can't toggle twice. standalone\r\n keeps this ngModel out of any parent <form> the select is\r\n rendered inside. -->\r\n <span\r\n class=\"hierarchical-option-checkbox\"\r\n role=\"button\"\r\n [attr.aria-label]=\"'Select ' + getLabel(item)\"\r\n (mousedown)=\"toggleParentSelection(item, $event)\">\r\n <bk-checkbox\r\n class=\"pointer-events-none shrink-0 flex\"\r\n checkboxClass=\"sm\"\r\n [disabled]=\"!!item.disabled\"\r\n [ngModel]=\"isSelected(item)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n ></bk-checkbox>\r\n </span>\r\n } @else {\r\n <!-- Holds the checkbox column open so leaf labels line up with\r\n the parents' above them. -->\r\n <span class=\"hierarchical-option-checkbox-spacer\" aria-hidden=\"true\"></span>\r\n }\r\n }\r\n @if (showDots() && accentFor(item)) {\r\n <span class=\"hierarchical-dot\" [style.backgroundColor]=\"accentFor(item)\"></span>\r\n }\r\n <span\r\n #optLabel\r\n class=\"hierarchical-option-label\"\r\n [style.color]=\"optionTextColor(item)\"\r\n [bkTooltip]=\"optLabel.scrollWidth > optLabel.clientWidth ? getLabel(item) : ''\"\r\n bkTooltipPosition=\"top\">{{ getLabel(item) }}</span>\r\n </div>\r\n @if (hasChildren(item)) {\r\n <svg width=\"5\" height=\"8\" viewBox=\"0 0 5 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M4.57142 4.00286C4.57185 3.92766 4.55744 3.85312 4.52901 3.78351C4.50057 3.71389 4.45868 3.65058 4.40572 3.59719L0.977497 0.169008C0.924381 0.115455 0.861186 0.0729493 0.79156 0.0439419C0.721933 0.0149346 0.647251 0 0.571824 0C0.496396 0 0.421714 0.0149346 0.352088 0.0439419C0.282461 0.0729493 0.219267 0.115455 0.16615 0.169008C0.059732 0.27606 0 0.420874 0 0.57182C0 0.722766 0.059732 0.867579 0.16615 0.974631L3.19442 4.00286L0.16615 7.02537C0.059732 7.13242 0 7.27723 0 7.42818C0 7.57913 0.059732 7.72394 0.16615 7.83099C0.219267 7.88454 0.282461 7.92705 0.352088 7.95606C0.421714 7.98507 0.496396 8 0.571824 8C0.647251 8 0.721933 7.98507 0.79156 7.95606C0.861186 7.92705 0.924381 7.88454 0.977497 7.83099L4.40572 4.40281C4.51128 4.29639 4.57079 4.15275 4.57142 4.00286Z\" fill=\"#BBBDC5\"/>\r\n </svg>\r\n } @else if (isSelected(item)) {\r\n <svg width=\"10\" height=\"7\" viewBox=\"0 0 10 7\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M3.72939 6.28273C3.64166 6.28324 3.55468 6.26642 3.47346 6.23324C3.39223 6.20007 3.31835 6.15118 3.25606 6.08939L0.196061 3.00273C0.0705253 2.87719 -1.32274e-09 2.70693 0 2.52939C1.32273e-09 2.35186 0.0705253 2.1816 0.196061 2.05606C0.321597 1.93053 0.49186 1.86 0.669394 1.86C0.846929 1.86 1.01719 1.93053 1.14273 2.05606L3.72939 4.64939L8.17606 0.196061C8.3016 0.0705253 8.47186 -3.49963e-09 8.64939 0C8.82693 3.49963e-09 8.99719 0.0705253 9.12273 0.196061C9.24826 0.321597 9.31879 0.49186 9.31879 0.669395C9.31879 0.846929 9.24826 1.01719 9.12273 1.14273L4.20273 6.06273C4.07921 6.19434 3.90963 6.27316 3.72939 6.28273V6.28273Z\" fill=\"#141414\"/>\r\n </svg>\r\n }\r\n </div>\r\n }\r\n @if (filteredItems().length === 0) {\r\n <div class=\"hierarchical-option-empty\">No records found</div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Injectable, signal, computed, ApplicationRef, ComponentRef, createComponent, EnvironmentInjector } from '@angular/core';\r\nimport { BkToastr } from './toastr';\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type ToastSeverity = 'success' | 'error' | 'warn' | 'info' | 'default';\r\n\r\nexport type ToastPosition =\r\n | 'top-left'\r\n | 'top-right'\r\n | 'top-center'\r\n | 'bottom-left'\r\n | 'bottom-right'\r\n | 'bottom-center';\r\n\r\nexport interface ToastConfig {\r\n summary: string;\r\n detail?: string;\r\n severity?: ToastSeverity;\r\n timeOut?: number;\r\n sticky?: boolean;\r\n icon?: boolean;\r\n inline?: boolean;\r\n actionLabel?: string;\r\n actionCallback?: () => void;\r\n}\r\n\r\n/** Options for convenience methods (severity is set by the method itself) */\r\nexport interface ToastMethodOptions extends Omit<ToastConfig, 'severity'> {\r\n summary: string;\r\n}\r\n\r\nexport interface ToastMessage extends ToastConfig {\r\n readonly id: string;\r\n readonly severity: ToastSeverity;\r\n readonly timeOut: number;\r\n readonly sticky: boolean;\r\n readonly icon: boolean;\r\n readonly inline?: boolean;\r\n leaving: boolean;\r\n}\r\n\r\n// ─── Service ─────────────────────────────────────────────────────────────────\r\n\r\nlet _toastId = 0;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class BkToastrService {\r\n private readonly _toasts = signal<ToastMessage[]>([]);\r\n readonly toasts = computed(() => this._toasts());\r\n\r\n private readonly _position = signal<ToastPosition>('top-right');\r\n readonly position = computed(() => this._position());\r\n\r\n private componentRef: ComponentRef<BkToastr> | null = null;\r\n\r\n constructor(\r\n private readonly appRef: ApplicationRef,\r\n private readonly injector: EnvironmentInjector\r\n ) {}\r\n\r\n private initializeContainer(): void {\r\n if (this.componentRef) return;\r\n\r\n // Check if we're in browser environment\r\n if (typeof document === 'undefined' || !document.body) {\r\n // If document.body doesn't exist yet, wait for it\r\n setTimeout(() => this.initializeContainer(), 0);\r\n return;\r\n }\r\n\r\n // Create component dynamically\r\n this.componentRef = createComponent(BkToastr, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n // Attach to DOM\r\n document.body.appendChild(this.componentRef.location.nativeElement);\r\n\r\n // Register for change detection\r\n // Note: We don't call appRef.tick() here to avoid recursive tick calls\r\n // Angular will automatically detect changes for the attached view\r\n this.appRef.attachView(this.componentRef.hostView);\r\n }\r\n\r\n /** Show a toast with full config */\r\n show(config: ToastConfig): string {\r\n // Initialize container on first toast\r\n this.initializeContainer();\r\n\r\n const id = `toast-${++_toastId}`;\r\n\r\n const toast: ToastMessage = {\r\n ...config,\r\n id,\r\n severity: config.severity ?? 'info',\r\n timeOut: config.timeOut ?? 4000,\r\n sticky: config.sticky ?? false,\r\n icon: config.icon !== false,\r\n inline: config.inline !== false,\r\n leaving: false,\r\n };\r\n\r\n this._toasts.update(list => [...list, toast]);\r\n\r\n if (!toast.sticky) {\r\n setTimeout(() => this.close(id), toast.timeOut);\r\n }\r\n\r\n return id;\r\n }\r\n\r\n /** Convenience – info toast */\r\n info(options: ToastMethodOptions): string;\r\n info(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n info(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'info' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'info' });\r\n }\r\n\r\n /** Convenience – success toast */\r\n success(options: ToastMethodOptions): string;\r\n success(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n success(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'success' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'success' });\r\n }\r\n\r\n /** Convenience – error toast */\r\n error(options: ToastMethodOptions): string;\r\n error(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n error(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'error' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'error' });\r\n }\r\n\r\n /** Convenience – warning toast */\r\n warn(options: ToastMethodOptions): string;\r\n warn(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n warn(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'warn' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'warn' });\r\n }\r\n\r\n /** Convenience – default / neutral toast */\r\n default(options: ToastMethodOptions): string;\r\n default(summary: string, detail?: string, extra?: Partial<ToastMethodOptions>): string;\r\n default(summaryOrOptions: string | ToastMethodOptions, detail?: string, extra?: Partial<ToastMethodOptions>): string {\r\n if (typeof summaryOrOptions === 'string') {\r\n return this.show({ ...extra, summary: summaryOrOptions, detail, severity: 'default' });\r\n }\r\n return this.show({ ...summaryOrOptions, severity: 'default' });\r\n }\r\n\r\n /** Close a single toast (triggers leave animation first) */\r\n close(id: string): void {\r\n this._toasts.update(list =>\r\n list.map(t => (t.id === id ? { ...t, leaving: true } : t)),\r\n );\r\n setTimeout(() => {\r\n this._toasts.update(list => list.filter(t => t.id !== id));\r\n }, 300);\r\n }\r\n\r\n /** Clear every toast */\r\n clear(): void {\r\n this._toasts.update(list => list.map(t => ({ ...t, leaving: true })));\r\n setTimeout(() => this._toasts.set([]), 300);\r\n }\r\n\r\n /** Set the position for toast notifications */\r\n setPosition(position: ToastPosition): void {\r\n // Initialize container if not already created\r\n this.initializeContainer();\r\n this._position.set(position);\r\n }\r\n}\r\n","import { Component, inject, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport {\r\n BkToastrService,\r\n ToastMessage,\r\n ToastPosition,\r\n} from './toastr.service';\r\n\r\n@Component({\r\n selector: 'bk-toastr',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './toastr.html',\r\n styleUrl: './toastr.css',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class BkToastr {\r\n private readonly svc = inject(BkToastrService);\r\n\r\n /** Convert signal → Observable so AsyncPipe triggers change detection reliably */\r\n readonly toasts$ = toObservable(this.svc.toasts);\r\n readonly position$ = toObservable(this.svc.position);\r\n\r\n onClose(event: Event, id: string): void {\r\n event.stopPropagation();\r\n this.svc.close(id);\r\n }\r\n\r\n onAction(event: Event, t: ToastMessage): void {\r\n event.stopPropagation();\r\n t.actionCallback?.();\r\n }\r\n}\r\n","<!-- Toast Container – fixed overlay -->\r\n<div class=\"toast-container\" [attr.data-position]=\"position$ | async\">\r\n\r\n @for (toast of (toasts$ | async) ?? []; track toast.id) {\r\n <div\r\n class=\"toast-item\"\r\n [attr.data-severity]=\"toast.severity\"\r\n [class.toast-item-inline]=\"toast.inline\"\r\n [class.toast-enter]=\"!toast.leaving\"\r\n [class.toast-leave]=\"toast.leaving\">\r\n\r\n <!-- ── Icon ── -->\r\n @if (toast.icon) {\r\n <svg class=\"toast-icon shrink-0\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g [attr.clip-path]=\"'url(#clip_' + toast.id + ')'\">\r\n <path\r\n d=\"M10.0001 13.3334V10M10.0001 6.66671H10.0084M18.3334 10C18.3334 5.39767 14.6025 1.66671 10.0001 1.66671C5.39771 1.66671 1.66675 5.39767 1.66675 10C1.66675 14.6024 5.39771 18.3334 10.0001 18.3334C14.6025 18.3334 18.3334 14.6024 18.3334 10Z\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath [attr.id]=\"'clip_' + toast.id\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n }\r\n\r\n <!-- ── Content ── -->\r\n <div class=\"toast-content flex-1 min-w-0\">\r\n <p class=\"toast-summary\">{{ toast.summary }}</p>\r\n @if (toast.detail) {\r\n <p class=\"toast-detail\">{{ toast.detail }}</p>\r\n }\r\n </div>\r\n\r\n <!-- ── Action button ── -->\r\n @if (toast.actionLabel) {\r\n <button type=\"button\" class=\"toast-action\" (click)=\"onAction($event, toast)\">\r\n {{ toast.actionLabel }}\r\n </button>\r\n }\r\n\r\n <!-- ── Close button ── -->\r\n <button type=\"button\" class=\"toast-close\" (click)=\"onClose($event, toast.id)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M10.625 0.625L0.625 10.625M0.625 0.625L10.625 10.625\"\r\n stroke-width=\"1.25\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n </div>\r\n }\r\n\r\n</div>\r\n","export class ColumnFilterOption {\r\n columnName!: string;\r\n selected: boolean=true;\r\n\r\n constructor(columnName?: string, selected: boolean = false) {\r\n if (columnName) {\r\n this.columnName = columnName;\r\n }\r\n this.selected = selected;\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ColumnFilterOption } from '../models/column-filter-option';\r\n\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BkColumnFilterService {\r\n\r\n constructor() { }\r\n\r\n intializeColumnsFilter(key:string,fields:string[]):void {\r\n var columnsList: ColumnFilterOption[]= fields.map((f)=> new ColumnFilterOption(f,true));\r\n localStorage.setItem(key,JSON.stringify(columnsList));\r\n }\r\n\r\n getColumnsFilterList(key:string,fields:string[]):ColumnFilterOption[]|[] {\r\n let stored = localStorage.getItem(key);\r\n if(!fields || fields.length===0){\r\n return [];\r\n }\r\n if(!stored){\r\n this.intializeColumnsFilter(key,fields);\r\n stored = localStorage.getItem(key);\r\n }\r\n\r\n let storedColumns = stored ? (JSON.parse(stored) as ColumnFilterOption[]) : [];\r\n\r\n // Sync stored columns with current fields\r\n storedColumns = this.syncColumnsWithFields(storedColumns, fields);\r\n\r\n // Update localStorage with synced data\r\n localStorage.setItem(key, JSON.stringify(storedColumns));\r\n\r\n return storedColumns;\r\n // return stored ? (JSON.parse(stored) as ColumnFilterOption[]) : [];\r\n }\r\n\r\n private syncColumnsWithFields(storedColumns: ColumnFilterOption[], currentFields: string[]): ColumnFilterOption[] {\r\n // Map of existing columns for quick lookup\r\n const existingColumnsMap = new Map<string, ColumnFilterOption>();\r\n storedColumns.forEach(col => existingColumnsMap.set(col.columnName, col));\r\n\r\n // New list based on current fields\r\n const syncedColumns: ColumnFilterOption[] = [];\r\n\r\n currentFields.forEach(field => {\r\n if (existingColumnsMap.has(field)) {\r\n // Keep existing column with its selection state\r\n syncedColumns.push(existingColumnsMap.get(field)!);\r\n } else {\r\n // Add new column as selected by default\r\n syncedColumns.push(new ColumnFilterOption(field, true));\r\n }\r\n });\r\n\r\n return syncedColumns;\r\n }\r\n updateColumnFilterList(key:string,list:ColumnFilterOption[]): void {\r\n localStorage.removeItem(key);\r\n localStorage.setItem(key,JSON.stringify(list));\r\n }\r\n showColumn(field:string,columnsFilterList:ColumnFilterOption[]):boolean{\r\n if (!Array.isArray(columnsFilterList)) {\r\n return false;\r\n }\r\n return columnsFilterList.find((i)=> i.columnName===field)?.selected || false;\r\n }\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ViewChild,\r\n forwardRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkButton } from '../../../ui-button/ui-button';\r\nimport { BkCheckbox } from '../../../checkbox/checkbox';\r\nimport { BkInput } from '../../../input/input';\r\nimport { ColumnFilterOption } from '../../models/column-filter-option';\r\nimport { BkColumnFilterService } from '../../service/column-filter.service';\r\n\r\ntype BkColumnSelectVertical = 'top' | 'bottom';\r\ntype BkColumnSelectHorizontal = 'left' | 'right';\r\nexport type BkColumnSelectPosition = `${BkColumnSelectVertical}-${BkColumnSelectHorizontal}`;\r\n\r\n/** Rough panel footprint used for auto-flip space checks (search input + option rows + padding). */\r\nconst PANEL_ESTIMATED_WIDTH = 190;\r\nconst PANEL_ESTIMATED_HEIGHT = 260;\r\n\r\n@Component({\r\n selector: 'bk-column-select',\r\n imports: [FormsModule, BkButton, BkCheckbox, BkInput],\r\n standalone: true,\r\n templateUrl: './column-select.html',\r\n styleUrl: './column-select.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BkColumnSelect),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BkColumnSelect implements ControlValueAccessor, OnChanges {\r\n @Input() searchable = false;\r\n @Input() buttonClass : string = '';\r\n @Input() cacheKey!: string;\r\n @Input() columns: string[] = [];\r\n @Input() isOpened = false;\r\n @Input() label: string = 'Columns';\r\n @Input() lefticon: string = '../../../../assets/icons/columns-black.svg';\r\n /** Corner the dropdown opens from, relative to the trigger button. */\r\n @Input() position: BkColumnSelectPosition = 'bottom-right';\r\n /** When true, flips each axis independently if there isn't enough viewport room for `position`. */\r\n @Input() autoFlip = true;\r\n @Output() isOpenedChange = new EventEmitter<boolean>();\r\n @ViewChild('formBox') formBoxRef!: ElementRef;\r\n @ViewChild('trigger', { read: ElementRef }) triggerRef?: ElementRef<HTMLElement>;\r\n\r\n /** Corner actually rendered on — starts from `position`, auto-flipped on open when needed. */\r\n resolvedPosition: BkColumnSelectPosition = 'bottom-right';\r\n\r\n /** Value bound via ngModel – only updated when user ticks/unticks a checkbox, never on search. */\r\n columnsFilterList: ColumnFilterOption[] = [];\r\n search = '';\r\n\r\n private onChangeCallback: (value: ColumnFilterOption[]) => void = () => {};\r\n private onTouchedCallback: () => void = () => {};\r\n\r\n constructor(public columnFilterService: BkColumnFilterService) {}\r\n\r\n writeValue(value: ColumnFilterOption[] | null | undefined): void {\r\n const isEmpty = !value || !Array.isArray(value) || value.length === 0;\r\n if (isEmpty && this.shouldLoadFromService()) {\r\n this.loadColumnsFilterListFromService();\r\n } else {\r\n this.columnsFilterList = Array.isArray(value) ? value : [];\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const columnsChanged = changes['columns'] && !changes['columns'].firstChange;\r\n const cacheKeyChanged = changes['cacheKey'] && !changes['cacheKey'].firstChange;\r\n if ((columnsChanged || cacheKeyChanged) && this.columnsFilterList.length === 0 && this.shouldLoadFromService()) {\r\n this.loadColumnsFilterListFromService();\r\n }\r\n\r\n if (changes['isOpened']?.currentValue) {\r\n this.resolvedPosition = this.computePlacement();\r\n }\r\n }\r\n\r\n /** Picks `position`, flipping each axis independently if the trigger doesn't have room for it. */\r\n private computePlacement(): BkColumnSelectPosition {\r\n const triggerEl = this.triggerRef?.nativeElement;\r\n const [vertical, horizontal] = this.position.split('-') as [BkColumnSelectVertical, BkColumnSelectHorizontal];\r\n if (!this.autoFlip || !triggerEl) {\r\n return this.position;\r\n }\r\n const rect = triggerEl.getBoundingClientRect();\r\n\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const resolvedVertical = this.flipIfShort(\r\n vertical, 'top', 'bottom',\r\n vertical === 'bottom' ? spaceBelow : spaceAbove,\r\n vertical === 'bottom' ? spaceAbove : spaceBelow,\r\n PANEL_ESTIMATED_HEIGHT,\r\n );\r\n\r\n // 'right' hangs the panel leftward from the trigger's right edge (room = rect.right);\r\n // 'left' hangs it rightward from the trigger's left edge (room = viewport width - rect.left).\r\n const spaceHangingLeft = rect.right;\r\n const spaceHangingRight = window.innerWidth - rect.left;\r\n const resolvedHorizontal = this.flipIfShort(\r\n horizontal, 'right', 'left',\r\n horizontal === 'right' ? spaceHangingLeft : spaceHangingRight,\r\n horizontal === 'right' ? spaceHangingRight : spaceHangingLeft,\r\n PANEL_ESTIMATED_WIDTH,\r\n );\r\n\r\n return `${resolvedVertical}-${resolvedHorizontal}`;\r\n }\r\n\r\n /** Flips `current` to its opposite when it doesn't have `needed` space and the opposite has more room. */\r\n private flipIfShort<T extends string>(current: T, a: T, b: T, spaceCurrent: number, spaceOpposite: number, needed: number): T {\r\n if (spaceCurrent < needed && spaceOpposite > spaceCurrent) {\r\n return current === a ? b : a;\r\n }\r\n return current;\r\n }\r\n\r\n /** Tailwind classes placing the panel on `resolvedPosition`'s corner of the trigger. */\r\n get panelPositionClass(): string {\r\n const [vertical, horizontal] = this.resolvedPosition.split('-') as [BkColumnSelectVertical, BkColumnSelectHorizontal];\r\n const verticalClass = vertical === 'top' ? 'bottom-full mb-2' : 'top-full mt-2';\r\n const horizontalClass = horizontal === 'left' ? 'left-0' : 'right-0';\r\n return `${verticalClass} ${horizontalClass}`;\r\n }\r\n\r\n private shouldLoadFromService(): boolean {\r\n return !!this.cacheKey && !!this.columns?.length;\r\n }\r\n\r\n private loadColumnsFilterListFromService(): void {\r\n this.columnsFilterList = this.columnFilterService.getColumnsFilterList(\r\n this.cacheKey,\r\n this.columns\r\n );\r\n this.onChangeCallback(this.columnsFilterList);\r\n }\r\n\r\n registerOnChange(fn: (value: ColumnFilterOption[]) => void): void {\r\n this.onChangeCallback = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouchedCallback = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n // Optional: disable button/dropdown when control is disabled\r\n }\r\n\r\n filterButtonClicked(event: Event): void {\r\n event.stopPropagation();\r\n const willOpen = !this.isOpened;\r\n if (!willOpen) {\r\n this.clearSearch();\r\n this.onTouchedCallback();\r\n }\r\n this.isOpenedChange.emit(willOpen);\r\n }\r\n\r\n /** Called only on checkbox tick/untick – not on search. Emits via CVA so ngModel updates. */\r\n onChangeColumnFilter(): void {\r\n this.columnFilterService.updateColumnFilterList(this.cacheKey, this.columnsFilterList);\r\n this.onChangeCallback(this.columnsFilterList);\r\n this.onTouchedCallback();\r\n }\r\n\r\n private clearSearch(): void {\r\n this.search = '';\r\n }\r\n\r\n private closeDropdown(): void {\r\n this.clearSearch();\r\n this.onTouchedCallback();\r\n this.isOpened = false;\r\n this.isOpenedChange.emit(this.isOpened);\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClick(event: Event): void {\r\n if (!this.isOpened) {\r\n return;\r\n }\r\n const formBox = this.formBoxRef?.nativeElement;\r\n if (formBox && formBox.contains(event.target as Node)) {\r\n return;\r\n }\r\n if (\r\n event.target instanceof HTMLElement &&\r\n event.target.classList.contains('ng-value-icon')\r\n ) {\r\n return;\r\n }\r\n if (\r\n event.target instanceof HTMLElement &&\r\n event.target.closest('.btn-light-primary-custom')\r\n ) {\r\n return;\r\n }\r\n this.closeDropdown();\r\n }\r\n\r\n get list():ColumnFilterOption[] {\r\n return this.columnsFilterList.filter((x)=> x.columnName.toLowerCase().includes(this.search.toLowerCase()));\r\n }\r\n\r\n\r\n}\r\n","<div class=\"relative\">\r\n\r\n <bk-button #trigger [size]=\"'xsm'\" [variant]=\"'secondary'\" [leftIcon]=\"lefticon\"\r\n (click)=\"filterButtonClicked($event)\" [label]=\"label\" [buttonClass]=\"`text-black ${buttonClass}`\"></bk-button>\r\n\r\n <!-- Dropdown Box -->\r\n @if(isOpened){\r\n\r\n <div #formBox\r\n class=\"absolute {{ panelPositionClass }} w-[178px] bg-white border border-[#EFEFF1] rounded-xl shadow-xl z-[9999]\">\r\n @if(searchable){\r\n <div class=\"px-3 py-1\">\r\n <bk-input [id]=\"'search-input-1'\" [name]=\"'search-input-1'\" [size]=\"'sm'\"\r\n [iconSrc]=\"'../../../../assets/icons/search-input.svg'\" type=\"text\" [(ngModel)]=\"search\"\r\n placeholder=\"Search\"></bk-input>\r\n </div>\r\n }\r\n <div class=\"column-select-options-list\">\r\n @for (column of list; track column.columnName; let i = $index) {\r\n <div class=\"flex items-center gap-2 px-3 py-1 hover:bg-gray-100 cursor-pointer\">\r\n <bk-checkbox [label]=\"column.columnName\" id=\"columnsFilterList-{{column.columnName}}\" checkboxClass=\"sm\" [(ngModel)]=\"column.selected\" labelClass=\"!text-left\"\r\n (change)=\"onChangeColumnFilter()\">\r\n\r\n </bk-checkbox>\r\n\r\n <!-- <label class=\"text-xs cursor-pointer text-[#141414] select-none truncate font-medium\"\r\n for=\"columnsFilterList-{{column.columnName}}\">\r\n {{column.columnName}}\r\n </label> -->\r\n\r\n </div>\r\n }\r\n @if(!list.length){\r\n <p class=\"column-select-option-empty\">No records found</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\n@Component({\n selector: 'bk-file-picker',\n imports: [CommonModule],\n templateUrl: './file-picker.html',\n styleUrl: './file-picker.css',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => BkFilePicker),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => BkFilePicker),\n multi: true,\n },\n ],\n})\nexport class BkFilePicker implements ControlValueAccessor, Validator {\n @Input() id: string = '';\n @Input() name: string = '';\n @Input() accept: string = '';\n @Input() multi: boolean = false;\n // @Input() maxFileSizeKB: number | null = null;\n @Input() disable: boolean = false;\n @Input() errorMessage: string = '';\n @Input() hasError: boolean = false;\n @Input() draggable: boolean = true;\n @Input() description: string = '';\n @Input()\n set required(val: boolean) {\n this._required = val;\n this._onValidatorChange?.();\n }\n get required() {\n return this._required;\n }\n private _required = false;\n @Output() change = new EventEmitter<Event>();\n @Output() error = new EventEmitter<string>();\n @Output() cancel = new EventEmitter<void>();\n @ViewChild('fileInput') fileInputRef?: ElementRef<HTMLInputElement>;\n private _value: File | File[] | null = null;\n private _onValidatorChange?: () => void;\n private onChange: (value: File | File[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: File | File[] | null): void {\n this._value = value;\n\n if (!value && this.fileInputRef?.nativeElement) {\n this.fileInputRef.nativeElement.value = '';\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disable = isDisabled;\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n if (this.required && !this._value) {\n return { required: true };\n }\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this._onValidatorChange = fn;\n }\n\n get pickerState(): 'default' | 'active' | 'disabled' {\n if (this.disable) return 'disabled';\n return 'default';\n }\n\n onContainerClick(): void {\n if (this.disable) return;\n\n this.onTouched(); // ⭐ Touch on interaction start\n this.fileInputRef?.nativeElement?.click();\n }\n\n onFileChange(event: Event): void {\n // 1. Stop the native HTML change event from bubbling up to the <bk-file-picker> tag\n event.stopPropagation();\n\n const input = event.target as HTMLInputElement;\n const files = input.files;\n\n // 2. Case: User clicked 'Cancel' or no files selected\n // We update the form state (ngModel) but DO NOT emit the @Output() change\n if (!files?.length) {\n this._value = null;\n this.onChange(null);\n this.onTouched();\n return; // Exit without emitting change\n }\n\n const fileList = Array.from(files);\n\n // // 3. Case: File exceeds size limit\n // if (this.maxFileSizeKB != null) {\n // const maxBytes = this.maxFileSizeKB * 1024;\n // const oversized = fileList.filter((f) => f.size > maxBytes);\n\n // if (oversized.length > 0) {\n // this.error.emit(`File size exceeds ${this.maxFileSizeKB} KB limit.`);\n\n // // Reset internal state and form control\n // this._value = null;\n // this.onChange(null);\n // this.onTouched();\n\n // // Reset the physical input so the same file can be picked again later\n // input.value = '';\n\n // return; // Exit without emitting change\n // }\n // }\n\n // 4. Case: Valid selection\n const value = this.multi ? fileList : (fileList[0] ?? null);\n\n this._value = value;\n this.onChange(value); // Updates ngModel\n this.onTouched();\n\n // Only emit the custom @Output() now\n this.change.emit(event);\n }\n\n onCancel(): void {\n // Check if there is currently no file selected\n if (!this._value) {\n // Reset internal state and notify Angular Forms that the value is null\n this._value = null;\n this.onChange(null);\n\n // Mark the control as touched to trigger 'required' error visibility\n this.onTouched();\n\n // Force Angular to re-run the 'validate()' function immediately\n this._onValidatorChange?.();\n\n // Clear the native file input value to ensure the browser reset is in sync\n if (this.fileInputRef?.nativeElement) {\n this.fileInputRef.nativeElement.value = '';\n }\n\n // Clear any previous error messages (e.g., size limit errors)\n this.cancel.emit();\n }\n }\n\n onDragOver(event: DragEvent): void {\n if (this.disable) return;\n event.preventDefault();\n event.stopPropagation();\n }\n\n onDrop(event: DragEvent): void {\n if (this.disable) return;\n event.preventDefault();\n event.stopPropagation();\n const input = this.fileInputRef?.nativeElement;\n if (!input) return;\n const items = event.dataTransfer?.items;\n if (!items?.length) return;\n const files: File[] = [];\n for (let i = 0; i < items.length; i++) {\n const file = items[i].getAsFile();\n if (file) files.push(file);\n }\n if (files.length === 0) return;\n const dt = new DataTransfer();\n (this.multi ? files : [files[0]]).forEach((f) => dt.items.add(f));\n input.files = dt.files;\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n}\n","<div class=\"file-picker-wrapper\">\n <input\n #fileInput\n type=\"file\"\n [id]=\"id\"\n [name]=\"name\"\n [accept]=\"accept\"\n [multiple]=\"multi\"\n [disabled]=\"disable\"\n [required]=\"required\"\n class=\"file-picker__input\"\n (cancel)=\"onCancel()\"\n (change)=\"onFileChange($event)\"\n />\n\n <div\n class=\"file-picker\"\n [ngClass]=\"{\n 'file-picker--default': pickerState === 'default',\n 'file-picker--active': pickerState === 'active',\n 'file-picker--disabled': pickerState === 'disabled',\n 'file-picker-has-error': hasError\n }\"\n (click)=\"onContainerClick()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n [attr.aria-disabled]=\"disable\"\n tabindex=\"0\"\n>\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"file-picker__icon\">\n <rect\n x=\"3.57007\"\n y=\"3.56995\"\n width=\"40\"\n height=\"40\"\n rx=\"20\"\n [attr.fill]=\"pickerState === 'active' ? '#C7E2FF' : pickerState === 'disabled' ? '#F4F4F6' : '#F4F4F6'\"/>\n <rect\n x=\"3.57007\"\n y=\"3.56995\"\n width=\"40\"\n height=\"40\"\n rx=\"20\"\n [attr.stroke]=\"pickerState === 'active' ? '#E5F3FF' : pickerState === 'disabled' ? '#F9FAFA' : '#F9FAFA'\"\n stroke-width=\"7.14\"/>\n <g clip-path=\"url(#clip0_1_149094)\">\n <path\n d=\"M23.5702 20.2366V23.5699M23.5702 26.9032H23.5785M31.9035 23.5699C31.9035 28.1723 28.1725 31.9032 23.5702 31.9032C18.9678 31.9032 15.2368 28.1723 15.2368 23.5699C15.2368 18.9675 18.9678 15.2366 23.5702 15.2366C28.1725 15.2366 31.9035 18.9675 31.9035 23.5699Z\"\n [attr.stroke]=\"pickerState === 'active' ? '#1434CB' : pickerState === 'disabled' ? '#868997' : '#868997'\"\n stroke-width=\"1.66667\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1_149094\">\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13.5701 13.5699)\"/>\n </clipPath>\n </defs>\n </svg>\n <p\n class=\"file-picker__text-primary\"\n [ngClass]=\"{\n 'file-picker__text-primary--default': pickerState === 'default',\n 'file-picker__text-primary--active': pickerState === 'active',\n 'file-picker__text-primary--disabled': pickerState === 'disabled'\n }\">\n <span\n [ngClass]=\"{\n 'file-picker__text-primary-bold--default': pickerState === 'default',\n 'file-picker__text-primary-bold--active': pickerState === 'active',\n 'file-picker__text-primary-bold--disabled': pickerState === 'disabled'\n }\">Click to upload</span>{{draggable ? ' or drag and drop' : '' }}\n </p>\n <p\n class=\"file-picker__text-secondary\"\n [ngClass]=\"{\n 'file-picker__text-secondary--default': pickerState === 'default',\n 'file-picker__text-secondary--active': pickerState === 'active',\n 'file-picker__text-secondary--disabled': pickerState === 'disabled'\n }\">{{description}}</p>\n </div>\n\n @if (hasError) {\n @if (errorMessage) {\n <p class=\"file-picker-error\">{{ errorMessage }}</p>\n }\n }\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nexport type FileState = 'uploading' | 'uploaded' | 'failed';\r\n@Component({\r\n imports: [CommonModule,BKTooltipDirective],\r\n selector: 'bk-file-card',\r\n templateUrl: './file-card.html',\r\n styleUrl: './file-card.css',\r\n standalone: true\r\n})\r\nexport class BkFileCard implements OnInit {\r\n @Input() id: string ='';\r\n @Input() state: FileState = 'uploading';\r\n @Input() fileName: string = 'Tech design requirements.pdf';\r\n @Input() fileSize: string | null = '200 KB';\r\n @Input() progress: number = 65; // Progress percentage (0-100)\r\n @Input() errorMessage: string = 'Upload failed, please try again';\r\n @Output() remove = new EventEmitter<string>();\r\n\r\n /**\r\n *\r\n */\r\n constructor() {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n if(!this.id){\r\n this.id = crypto.randomUUID();\r\n }\r\n\r\n }\r\n onRemove() {\r\n this.remove.emit(this.id);\r\n }\r\n\r\n}\r\n","\r\n <div\r\n class=\"file-uploader\"\r\n [ngClass]=\"{\r\n 'file-uploader--uploading': state === 'uploading',\r\n 'file-uploader--uploaded': state === 'uploaded',\r\n 'file-uploader--failed': state === 'failed'\r\n }\">\r\n <!-- Icon Section -->\r\n <div class=\"file-uploader__icon-container\">\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 48 48\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"file-uploader__icon\">\r\n <rect\r\n x=\"3.57007\"\r\n y=\"3.56995\"\r\n width=\"40\"\r\n height=\"40\"\r\n rx=\"20\"\r\n [attr.fill]=\"state === 'uploading' ? '#C7E2FF' : state === 'uploaded' ? '#C7E2FF' : '#FECACA'\"/>\r\n <rect\r\n x=\"3.57007\"\r\n y=\"3.56995\"\r\n width=\"40\"\r\n height=\"40\"\r\n rx=\"20\"\r\n [attr.stroke]=\"state === 'uploading' ? '#E5F3FF' : state === 'uploaded' ? '#E5F3FF' : '#FEE2E2'\"\r\n stroke-width=\"7.14\"/>\r\n <g clip-path=\"url(#clip0_1_149094)\">\r\n <path\r\n d=\"M23.5702 20.2366V23.5699M23.5702 26.9032H23.5785M31.9035 23.5699C31.9035 28.1723 28.1725 31.9032 23.5702 31.9032C18.9678 31.9032 15.2368 28.1723 15.2368 23.5699C15.2368 18.9675 18.9678 15.2366 23.5702 15.2366C28.1725 15.2366 31.9035 18.9675 31.9035 23.5699Z\"\r\n [attr.stroke]=\"state === 'uploading' ? '#1434CB' : state === 'uploaded' ? '#1434CB' : '#EF4444'\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1_149094\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13.5701 13.5699)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n\r\n <!-- Content Section -->\r\n <div class=\"file-uploader__content\">\r\n <!-- Row 1: File Info + Delete -->\r\n <div class=\"file-uploader__row-1\">\r\n <div class=\"file-uploader__file-info\">\r\n <!-- Uploading State -->\r\n\r\n @if (state === 'uploading' || state === 'uploaded') {\r\n <ng-container>\r\n <span class=\"file-uploader__file-name\">{{ fileName }}</span>\r\n <span class=\"file-uploader__file-size\">{{ fileSize }}</span>\r\n </ng-container>\r\n }\r\n\r\n @if(state === 'failed'){\r\n <!-- Failed State -->\r\n <ng-container>\r\n <p class=\"file-uploader__error-message\">{{ errorMessage }}</p>\r\n <span class=\"file-uploader__file-name file-uploader__file-name--failed\">{{ fileName }}</span>\r\n <p class=\"file-uploader__error-message\">Try again</p>\r\n </ng-container>\r\n }\r\n </div>\r\n <img\r\n src=\"../../assets/icons/bin-gray.svg\"\r\n alt=\"Delete\"\r\n bkTooltip=\"Delete\"\r\n bkTooltipPosition=\"left\"\r\n class=\"file-uploader__delete-icon\"\r\n (click)=\"onRemove()\"\r\n >\r\n </div>\r\n\r\n <!-- Row 2: Progress Bar + Percentage -->\r\n <div class=\"file-uploader__row-2\">\r\n @if (state === 'uploading') {\r\n <!-- Uploading State -->\r\n <ng-container>\r\n <div class=\"file-uploader__progress-bar\">\r\n <div\r\n class=\"file-uploader__progress-fill\"\r\n [style.width.%]=\"progress\"></div>\r\n </div>\r\n <span class=\"file-uploader__progress-text\">{{ progress }}%</span>\r\n </ng-container>\r\n }\r\n @if(state === 'uploaded'){\r\n <!-- Uploaded State -->\r\n <ng-container>\r\n <div class=\"file-uploader__progress-bar\">\r\n <div class=\"file-uploader__progress-fill file-uploader__progress-fill--complete\"></div>\r\n </div>\r\n <img src=\"../../assets/icons/check-green.svg\" alt=\"\" class=\"file-uploader__checkmark\">\r\n </ng-container>\r\n }\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkSelect } from '../select/select';\r\nexport interface BkPageSize {\r\n key:number;\r\n value:number;\r\n}\r\n@Component({\r\n selector: 'bk-pagination',\r\n imports: [CommonModule,FormsModule,BkSelect],\r\n standalone:true,\r\n templateUrl: './pagination.html',\r\n styleUrl: './pagination.css',\r\n})\r\nexport class BkPagination implements OnChanges {\r\n\r\n @Input() public pageSize?: number = 10;\r\n @Input() public total?: number = 0;\r\n\r\n @Output() public changePageSize = new EventEmitter<number>();\r\n @Output() pageChanged: EventEmitter<number> = new EventEmitter();\r\n\r\n public pages: number[] = [];\r\n @Input() public activePage: number = 1;\r\n @Output() public activePageChange = new EventEmitter<number>();\r\n\r\n pager: number = 1;\r\n isMenuHovered = false;\r\n\r\n // ✅ Added\r\n startingPage:number = 0;\r\n endingPage: number = 0;\r\n pageSizesList:BkPageSize[] = [\r\n { key:25,value:25},\r\n { key:50,value:50},\r\n { key:75,value:75},\r\n { key:100,value:100},\r\n ];\r\n\r\n constructor() {\r\n const pageCount = this.getPageCount();\r\n this.pages = this.getArrayOfPage(pageCount);\r\n\r\n // ✅ Added\r\n this.updateStartEndPages();\r\n }\r\n\r\n ngOnChanges(): any {\r\n const pageCount = this.getPageCount();\r\n this.pages = this.getArrayOfPage(pageCount);\r\n\r\n if (this.activePage > pageCount) {\r\n this.activePage = pageCount || 1;\r\n this.activePageChange.emit(this.activePage);\r\n }\r\n\r\n if (this.activePage < 1) {\r\n this.activePage = 1;\r\n this.activePageChange.emit(this.activePage);\r\n }\r\n\r\n // ✅ Added\r\n this.updateStartEndPages();\r\n }\r\n\r\n getTotalPagesValue(){\r\n const totalPages = Math.ceil(this.total! / this.pageSize!);\r\n return totalPages;\r\n }\r\n\r\n // Visible window: startingPage/endingPage reflect the two page numbers shown in the control\r\n private updateStartEndPages(): void {\r\n const totalPages = this.getTotalPages();\r\n if (totalPages <= 0) {\r\n this.startingPage = 0;\r\n this.endingPage = 0;\r\n return;\r\n }\r\n if (totalPages === 1) {\r\n this.startingPage = 1;\r\n this.endingPage = 1;\r\n return;\r\n }\r\n this.startingPage = this.activePage;\r\n this.endingPage = Math.min(this.activePage + 1, totalPages);\r\n }\r\n\r\n private getPageCount(): number {\r\n let totalPage = 0;\r\n\r\n if (!!this.total && !!this.pageSize)\r\n if (this.total > 0 && this.pageSize > 0) {\r\n const pageCount = this.total / this.pageSize;\r\n const roundedPageCount = Math.floor(pageCount);\r\n totalPage = roundedPageCount < pageCount ? roundedPageCount + 1 : roundedPageCount;\r\n }\r\n\r\n return totalPage;\r\n }\r\n\r\n private getArrayOfPage(pageCount: number): number[] {\r\n const pageArray = [];\r\n if (pageCount > 0) {\r\n for (let i = 1; i <= pageCount; i++) pageArray.push(i);\r\n }\r\n return pageArray;\r\n }\r\n\r\n /** Returns exactly 2 visible page numbers: current and next (e.g. 1-2, then 2-3 on click of 2). */\r\n paginate(): number[] {\r\n const totalPages = this.getTotalPages();\r\n if (totalPages <= 0) return [];\r\n if (totalPages === 1) return [1];\r\n const start = this.activePage;\r\n const end = Math.min(this.activePage + 1, totalPages);\r\n return this.pages.slice(start - 1, end);\r\n }\r\n\r\n onClickPage(pageNumber: number): void {\r\n if (this.activePage !== pageNumber) {\r\n if (pageNumber >= 1 && pageNumber <= this.pages.length) {\r\n this.activePage = pageNumber;\r\n this.updateStartEndPages();\r\n this.pageChanged.emit(this.activePage);\r\n }\r\n }\r\n }\r\n\r\n changeSize(event: any) {\r\n this.activePage = 1;\r\n this.activePageChange.emit(this.activePage);\r\n this.changePageSize.emit(this.pageSize);\r\n\r\n // ✅ Recalculate pages on size change\r\n const pageCount = this.getPageCount();\r\n this.pages = this.getArrayOfPage(pageCount);\r\n this.updateStartEndPages();\r\n }\r\n\r\n get startIndex(): number {\r\n if (!this.total || this.total === 0) return 0;\r\n return (this.activePage - 1) * this.pageSize! + 1;\r\n }\r\n\r\n get endIndex(): number {\r\n if (!this.total || this.total === 0) return 0;\r\n const end = this.activePage * this.pageSize!;\r\n return end > this.total ? this.total : end;\r\n }\r\n\r\n get totalItems(): number {\r\n return this.total || 0;\r\n }\r\n\r\n // ✅ Added getTotalPages()\r\n getTotalPages(): number {\r\n return this.getPageCount();\r\n }\r\n\r\n}\r\n","<div class=\"md:px-4 px-2 md:py-3 py-2 border-t border-[#EBEDF3] rounded-b-xl\">\r\n <div class=\"flex flex-row items-center justify-between md:gap-3 gap-1\">\r\n\r\n <!-- Page size dropdown -->\r\n\r\n\r\n <div class=\"flex gap-3 items-center pagination\">\r\n <p class=\"text-xs text-[#141414] font-medium md:block hidden\">Rows per page</p>\r\n <bk-select\r\n [items]=\"pageSizesList\"\r\n [searchable]=\"false\"\r\n bindLabel=\"key\"\r\n bindValue=\"value\"\r\n [clearable]=\"false\"\r\n [(ngModel)]=\"pageSize\"\r\n [dropdownPosition]=\"'top'\"\r\n (change)=\"changeSize($event)\"\r\n [variation]=\"'sm'\"\r\n [isResponsive]=\"false\"\r\n class=\"!min-w-[90px] lg:!min-w-[131px]\"\r\n >\r\n </bk-select>\r\n </div>\r\n\r\n <!-- showing entries -->\r\n <p class=\"text-xs text-[#141414] font-medium md:block hidden\">\r\n Showing <span>{{ startIndex }}</span> to\r\n <span>{{ endIndex > totalItems ? totalItems : endIndex }}</span> of\r\n <span>{{ totalItems }}</span> Records\r\n </p>\r\n\r\n <!-- Pagination main -->\r\n <nav class=\"flex gap-1.5 items-center\">\r\n\r\n <!-- Page count (optional like DoPlanar top numbers) -->\r\n <p class=\"text-xs text-[#141414] font-medium md:block hidden\">\r\n <span>{{ startingPage || 0 }}</span> -\r\n <span>{{ endingPage || 0 }}</span> of\r\n <span>{{ getTotalPages() || 0 }}</span>\r\n </p>\r\n\r\n\r\n <!-- Page count (optional like DoPlanar top numbers) mobile version -->\r\n <p class=\"text-xs text-[#141414] font-medium md:hidden block\">\r\n <span>{{ startingPage || 0 }}</span> -\r\n <span>{{ endingPage || 0 }}</span> of\r\n <span>{{ getTotalPages() || 0 }}</span>\r\n </p>\r\n\r\n <ul class=\"flex items-center space-x-1 text-[13px] text-[#B9BBC6]\">\r\n\r\n <!-- Previous -->\r\n <li class=\"md:block hidden\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(1)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === 1}\"\r\n >\r\n @if(activePage === 1){\r\n <img\r\n src=\"../../assets/icons/arrow-left-double-gray.svg\"\r\n alt=\"Left Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== 1){\r\n <img\r\n src=\"../../assets/icons/arrow-left-double-black.svg\"\r\n alt=\"Left Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n <!-- Previous -->\r\n <li>\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(activePage - 1)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === 1}\"\r\n >\r\n @if(activePage === 1){\r\n <img\r\n src=\"../../assets/icons/pagination-left-gray.svg\"\r\n alt=\"Left Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== 1){\r\n <img\r\n src=\"../../assets/icons/pagination-left-black.svg\"\r\n alt=\"Left Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n\r\n <!-- Page Numbers -->\r\n <li *ngFor=\"let item of paginate()\">\r\n <a\r\n (click)=\"onClickPage(item)\"\r\n href=\"javascript:void(0)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 leading-6 rounded-lg\"\r\n [ngClass]=\"item === activePage\r\n ? 'text-[#15191E] bg-[#F8F8FA] hover:bg-[#F8F8FA]'\r\n : 'hover:bg-[#F8F8FA] hover:text-[#15191E]'\">\r\n {{ item }}\r\n </a>\r\n </li>\r\n\r\n <!-- Next -->\r\n <li>\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(activePage + 1)\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === getTotalPages()}\"\r\n >\r\n @if(activePage === getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/pagination-right-gray.svg\"\r\n alt=\"Right Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/pagination-right-black.svg\"\r\n alt=\"Right Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n <!-- next double arrow -->\r\n <li class=\"md:block hidden\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClickPage(getTotalPages())\"\r\n class=\"flex items-center justify-center md:size-7 size-6 text-[13px] leading-6 text-[#15191E] rounded-md hover:bg-[#F8F8FA]\"\r\n [ngClass]=\"{'cursor-not-allowed': activePage === getTotalPages()}\"\r\n >\r\n @if(activePage === getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/arrow-right-double-gray.svg\"\r\n alt=\"Right Arrow Disabled\"\r\n />\r\n }\r\n @if(activePage !== getTotalPages()){\r\n <img\r\n src=\"../../assets/icons/arrow-right-double-black.svg\"\r\n alt=\"Right Arrow\"\r\n />\r\n }\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n</div>\r\n","\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nexport type BkLoaderVariant = 'dots' | 'spinners';\r\n\r\n@Component({\r\n selector: 'bk-loader',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './loader.html',\r\n styleUrl: './loader.css',\r\n})\r\nexport class BkLoader {\r\n @Input() loading = false;\r\n @Input() variant: BkLoaderVariant = 'dots';\r\n frontAfter = false;\r\n constructor() {\r\n const duration = 2000;\r\n const pause = 500;\r\n\r\n setInterval(() => {\r\n setTimeout(() => (this.frontAfter = !this.frontAfter), pause);\r\n }, duration + pause);\r\n }\r\n}\r\n"," @if (loading) {\r\n <div\r\n class=\"lg:h-[calc(100vh-80px)] lg:w-[calc(100vw-79px)] h-[calc(100vh-76px)] w-[calc(100vw-33px)] top-[59px] lg:left-[58px] left-[17px] right-0 bottom-6 bg-[#00000047] backdrop-blur-[2px] flex justify-center flex-col gap-4 items-center fixed z-[99999] rounded-xl\"\r\n >\r\n @switch (variant) {\r\n @case ('dots') {\r\n <div class=\"grid-loader\" [class.front-after]=\"frontAfter\">\r\n <div class=\"grid-circle grid-filled\"></div>\r\n <div class=\"grid-circle grid-outline\"></div>\r\n </div>\r\n }\r\n\r\n @case ('spinners') {\r\n <div class=\"grid-spinner\"></div>\r\n }\r\n }\r\n </div>\r\n }\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nexport type DropdownVariant = 'black' | 'white';\r\nexport type DropdownSize = 'sm' | 'md' | 'lg';\r\nexport type DropdownTrigger = 'click' | 'hover';\r\nexport type DropdownPlacement =\r\n | 'bottomLeft' | 'bottom' | 'bottomRight'\r\n | 'topLeft' | 'top' | 'topRight';\r\n\r\nexport interface DropdownItem {\r\n id?: string | number;\r\n label?: string;\r\n icon?: string; // optional leading icon (image src)\r\n disabled?: boolean;\r\n divider?: boolean; // render a divider line (label ignored)\r\n children?: DropdownItem[]; // submenu items → cascading menu\r\n}\r\n@Component({\r\n selector: 'bk-dropdown',\r\n\r\n imports: [CommonModule],\r\n standalone: true,\r\n templateUrl: './dropdown.html',\r\n styleUrl: './dropdown.css',\r\n})\r\nexport class BkDropdown {\r\n /** Text shown on the trigger button. */\r\n @Input() label: string = '';\r\n /** Menu items (supports divider / disabled / children). */\r\n @Input() items: DropdownItem[] = [];\r\n /** Black (dark) or white (light, bordered) — mirrors the segment-tab look. */\r\n @Input() variant: DropdownVariant = 'black';\r\n /** Trigger size. */\r\n @Input() size: DropdownSize = 'md';\r\n /** Open on click or on hover. */\r\n @Input() trigger: DropdownTrigger = 'click';\r\n /** One of 6 placements for the menu. */\r\n @Input() placement: DropdownPlacement = 'bottomLeft';\r\n /** Show the caret (▾) on the trigger. Rotates when open. */\r\n @Input() arrow: boolean = true;\r\n /** Split button: a primary action + a separate caret that opens the menu. */\r\n @Input() splitButton: boolean = false;\r\n /** Currently selected item id — the matching item shows a tick. */\r\n @Input() selectedId?: string | number;\r\n /** Disable the whole control. */\r\n @Input() disabled: boolean = false;\r\n /** Optional leading icon on the trigger. */\r\n @Input() iconSrc?: string;\r\n /** Extra classes appended to the trigger button. */\r\n @Input() customClass: string = '';\r\n\r\n /** Emits when a (non-disabled) leaf item is chosen. */\r\n @Output() select = new EventEmitter<DropdownItem>();\r\n /** Emits the open/closed state whenever it changes. */\r\n @Output() openChange = new EventEmitter<boolean>();\r\n /** Split button primary-action click. */\r\n @Output() buttonClick = new EventEmitter<Event>();\r\n\r\n open = false;\r\n private closeTimer: any = null;\r\n\r\n constructor(private readonly host: ElementRef<HTMLElement>) { }\r\n\r\n // ---- open/close ----------------------------------------------------------\r\n\r\n toggle(): void {\r\n if (this.disabled) return;\r\n this.setOpen(!this.open);\r\n }\r\n\r\n onPrimaryClick(event: Event): void {\r\n if (this.disabled) return;\r\n this.buttonClick.emit(event);\r\n }\r\n\r\n selectItem(item: DropdownItem, event: Event): void {\r\n if (item.disabled) return;\r\n // Parents with children act as submenu toggles, not selections.\r\n if (item.children?.length) {\r\n event.stopPropagation();\r\n return;\r\n }\r\n this.selectedId = item.id;\r\n this.select.emit(item);\r\n this.setOpen(false);\r\n }\r\n\r\n isSelected(item: DropdownItem): boolean {\r\n return item.id != null && item.id === this.selectedId;\r\n }\r\n\r\n // Only scroll flat menus — a scroll container would clip cascading submenus\r\n // (overflow-y:auto forces overflow-x to clip too).\r\n get hasSubmenus(): boolean {\r\n return this.items.some(i => !!i.children?.length);\r\n }\r\n\r\n private setOpen(value: boolean): void {\r\n if (this.open === value) return;\r\n this.open = value;\r\n this.openChange.emit(value);\r\n }\r\n\r\n // ---- hover trigger -------------------------------------------------------\r\n\r\n onHoverEnter(): void {\r\n if (this.trigger !== 'hover' || this.disabled) return;\r\n this.clearCloseTimer();\r\n this.setOpen(true);\r\n }\r\n\r\n onHoverLeave(): void {\r\n if (this.trigger !== 'hover') return;\r\n // small delay so moving across the gap to the menu doesn't close it\r\n this.clearCloseTimer();\r\n this.closeTimer = setTimeout(() => this.setOpen(false), 120);\r\n }\r\n\r\n // ---- cascading submenu flip ----------------------------------------------\r\n\r\n /**\r\n * When a parent item is hovered, decide whether its submenu should open to\r\n * the right (default) or flip to the left if it would overflow the viewport.\r\n */\r\n onSubmenuEnter(event: MouseEvent): void {\r\n const li = event.currentTarget as HTMLElement;\r\n const submenu = li.querySelector(':scope > .bk-dd-submenu') as HTMLElement | null;\r\n if (!submenu) return;\r\n\r\n const parentRect = li.getBoundingClientRect();\r\n const submenuWidth = submenu.offsetWidth || 160; // min-w-[10rem] fallback\r\n const spaceOnRight = window.innerWidth - parentRect.right;\r\n const flipLeft = spaceOnRight < submenuWidth + 8;\r\n\r\n li.classList.toggle('bk-dd-submenu--flip', flipLeft);\r\n }\r\n\r\n private clearCloseTimer(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n // ---- global listeners ----------------------------------------------------\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.open && !this.host.nativeElement.contains(event.target as Node)) {\r\n this.setOpen(false);\r\n }\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.open) this.setOpen(false);\r\n }\r\n\r\n // ---- class helpers -------------------------------------------------------\r\n\r\n get triggerClasses(): string {\r\n return [\r\n 'bk-dd-trigger',\r\n `bk-dd-trigger--${this.variant}`,\r\n `bk-dd-trigger--${this.size}`,\r\n this.customClass,\r\n ].join(' ').trim();\r\n }\r\n\r\n get caretSizeClass(): string {\r\n return this.size === 'sm' ? 'size-3' : this.size === 'lg' ? 'size-5' : 'size-4';\r\n }\r\n\r\n /** Position classes for the menu panel per placement. */\r\n get menuPositionClass(): string {\r\n switch (this.placement) {\r\n case 'bottomLeft': return 'top-full left-0 mt-1';\r\n case 'bottom': return 'top-full left-1/2 -translate-x-1/2 mt-1';\r\n case 'bottomRight': return 'top-full right-0 mt-1';\r\n case 'topLeft': return 'bottom-full left-0 mb-1';\r\n case 'top': return 'bottom-full left-1/2 -translate-x-1/2 mb-1';\r\n case 'topRight': return 'bottom-full right-0 mb-1';\r\n }\r\n }\r\n}\r\n","<div class=\"bk-dd\" [class.bk-dd--open]=\"open\" (mouseenter)=\"onHoverEnter()\" (mouseleave)=\"onHoverLeave()\">\r\n\r\n <!-- ============ Trigger ============ -->\r\n @if (splitButton) {\r\n <!-- Button with dropdown menu (split button) -->\r\n <div class=\"bk-dd-split\" [class.bk-dd-split--disabled]=\"disabled\">\r\n <button type=\"button\" [class]=\"triggerClasses\" class=\"bk-dd-split-main\" [disabled]=\"disabled\"\r\n (click)=\"onPrimaryClick($event)\">\r\n @if (iconSrc) { <img [src]=\"iconSrc\" alt=\"\" class=\"shrink-0 size-4\" /> }\r\n <span class=\"bk-dd-label\">{{ label }}</span>\r\n </button>\r\n <button type=\"button\" [class]=\"triggerClasses\" class=\"bk-dd-split-caret\" [disabled]=\"disabled\"\r\n [attr.aria-haspopup]=\"'menu'\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">\r\n <svg class=\"bk-dd-caret shrink-0\" [ngClass]=\"caretSizeClass\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n } @else {\r\n <button type=\"button\" [class]=\"triggerClasses\" [class.bk-dd-trigger--disabled]=\"disabled\" [disabled]=\"disabled\"\r\n [attr.aria-haspopup]=\"'menu'\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">\r\n @if (iconSrc) { <img [src]=\"iconSrc\" alt=\"\" class=\"shrink-0 size-4\" /> }\r\n <span class=\"bk-dd-label\">{{ label }}</span>\r\n @if (arrow) {\r\n <svg class=\"bk-dd-caret shrink-0\" [ngClass]=\"caretSizeClass\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n }\r\n\r\n <!-- ============ Menu ============ -->\r\n @if (open) {\r\n <div class=\"bk-dd-menu\" [ngClass]=\"menuPositionClass\" role=\"menu\">\r\n <ul class=\"bk-dd-list\" [class.bk-dd-list--scroll]=\"!hasSubmenus\">\r\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: items }\"></ng-container>\r\n </ul>\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- Recursive menu template (used for the root list and every submenu) -->\r\n<ng-template #menuList let-list>\r\n @for (item of list; track $index) {\r\n @if (item.divider) {\r\n <li class=\"bk-dd-divider\" role=\"separator\"></li>\r\n } @else {\r\n <li class=\"bk-dd-li\" [class.bk-dd-li--parent]=\"item.children?.length\" (mouseenter)=\"onSubmenuEnter($event)\"\r\n role=\"none\">\r\n <button type=\"button\" role=\"menuitem\" class=\"bk-dd-item\" [class.bk-dd-item--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\" (click)=\"selectItem(item, $event)\">\r\n @if (item.icon) { <img [src]=\"item.icon\" alt=\"\" class=\"shrink-0 size-4\" /> }\r\n <span class=\"bk-dd-item-label\">{{ item.label }}</span>\r\n @if (item.children?.length) {\r\n <svg class=\"bk-dd-item-caret shrink-0 size-3.5\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n } @else if (isSelected(item)) {\r\n <svg class=\"bk-dd-check shrink-0 size-4\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\">\r\n <path d=\"M3.5 8.5l3 3 6-6.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (item.children?.length) {\r\n <ul class=\"bk-dd-submenu\">\r\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: item.children }\"></ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n }\r\n</ng-template>","import {\r\n Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, Output, SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type MenuOrientation = 'horizontal' | 'vertical';\r\nexport type MenuSubmenuMode = 'inline' | 'popup';\r\nexport type MenuTrigger = 'hover' | 'click';\r\nexport type MenuSize = 'default' | 'compact';\r\n\r\n/** Side a fly-out ended up on, once measured against the viewport. */\r\nexport type MenuPopupSide = 'right' | 'left' | 'down' | 'up';\r\n\r\n/** Placement of an open fly-out: where it sits and how big it may grow. */\r\ninterface PopupBox {\r\n top: number;\r\n left: number;\r\n /** Room left in the viewport — the panel scrolls rather than overflowing it. */\r\n maxW: number;\r\n maxH: number;\r\n}\r\n\r\nexport interface MenuItem {\r\n /** Unique id — matched against `activeItemId`. */\r\n id: string;\r\n /** Visible menu text. */\r\n label: string;\r\n /** Optional icon URL (tinted to the theme unless `tintIcons` is false). */\r\n icon?: string;\r\n /** Alt text for the icon; defaults to `label`. */\r\n iconAlt?: string;\r\n /** Disables just this item (and blocks opening its submenu). */\r\n disabled?: boolean;\r\n /** Heading shown above this item's children, titling the group. */\r\n childrenLabel?: string;\r\n /**\r\n * Splits this item among its siblings into a labeled section — a heading\r\n * above the run of siblings that share the same `groupLabel`, with a rule\r\n * before each section after the first. Unlike `childrenLabel` (one heading\r\n * for a whole `children` array), this groups items within a single flat\r\n * list, so several named sections can sit in one always-visible panel (e.g.\r\n * a mega-menu). Siblings without a `groupLabel` render ungrouped, as today.\r\n */\r\n groupLabel?: string;\r\n /** Nested items — presence of children turns this into an expandable node. */\r\n children?: MenuItem[];\r\n}\r\n\r\n/**\r\n * A simple, responsive navigation menu. Styled to match the default `bk-tabs`\r\n * theme (dark active pill, light hover).\r\n *\r\n * - Orientation: `vertical` (stacked) / `horizontal` (menubar row).\r\n * - Items with `children` are expandable, shown with a chevron that rotates\r\n * open/closed.\r\n * - Submenus render inline (accordion) or as pop-ups, opened by hover or click.\r\n * Pop-ups adapt to the orientation: they drop *below* a horizontal top-level\r\n * item and fly out to the side for vertical menus / deeper levels. Side\r\n * fly-outs flip when the preferred side has no room; menubar drop-downs never\r\n * flip — they stay under their trigger and scroll instead.\r\n */\r\n@Component({\r\n selector: 'bk-menu',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './menu.html',\r\n styleUrl: './menu.css',\r\n})\r\nexport class BkMenu implements OnChanges, OnDestroy {\r\n @Input() items: MenuItem[] = [];\r\n @Input() orientation: MenuOrientation = 'vertical';\r\n @Input() submenuMode: MenuSubmenuMode = 'inline';\r\n /**\r\n * How pop-up submenus open: on `hover` (fly-out follows the pointer and\r\n * closes when it leaves) or on `click` (stays put until you click the parent\r\n * again, pick a leaf, or click outside). Inline submenus are always click.\r\n */\r\n @Input() trigger: MenuTrigger = 'hover';\r\n /** `compact` shrinks the type, padding and icons for dense layouts. */\r\n @Input() size: MenuSize = 'default';\r\n /** Fallback grace period for the pointer to cross the gap into a fly-out. */\r\n private static readonly HOVER_CLOSE_DELAY_MS = 400;\r\n\r\n /**\r\n * Hover mode only: how long (ms) a fly-out survives after the pointer leaves,\r\n * giving it time to cross the gap into the panel. Raise it for menus whose\r\n * fly-outs sit further from their trigger, or for touch-ish pointers.\r\n */\r\n @Input() hoverCloseDelay: number = BkMenu.HOVER_CLOSE_DELAY_MS;\r\n /**\r\n * Keep only one submenu open per level: opening a parent collapses its\r\n * siblings (and their descendants) so the menu stays compact. Pop-up mode\r\n * always behaves this way; this input adds it to inline (accordion) mode.\r\n */\r\n @Input() singleOpen: boolean = false;\r\n /**\r\n * Tints an inline (accordion) submenu's whole block — title + rows — with\r\n * the lightest gray token. Off by default. Pop-up submenus don't offer\r\n * this: their padding/insets are different, and the panel's own border\r\n * already sets it apart from the page.\r\n */\r\n @Input() submenuBackground: boolean = false;\r\n /** Id of the currently selected leaf item. Two-way bindable. */\r\n @Input() activeItemId: string = '';\r\n /** Tint item icons: dark by default, white on the active (dark) row. */\r\n @Input() tintIcons: boolean = true;\r\n /**\r\n * Optional max height for the menu (e.g. '320px', '60vh', or a number of px).\r\n * When set, the item list scrolls vertically once it exceeds this height.\r\n * Pop-up fly-outs are positioned `fixed`, so they still escape the scroll box.\r\n */\r\n @Input() maxHeight: string | number | null = null;\r\n\r\n @Output() activeItemIdChange = new EventEmitter<string>();\r\n @Output() itemClick = new EventEmitter<MenuItem>();\r\n\r\n /** Ids of currently expanded/opened parent nodes. */\r\n private readonly openIds = new Set<string>();\r\n\r\n /** Viewport box for each open fixed-position fly-out, keyed by id. */\r\n private readonly popupPos = new Map<string, PopupBox>();\r\n\r\n /** Side each open fly-out resolved to — drives the chevron and hover bridge. */\r\n private readonly popupSide = new Map<string, MenuPopupSide>();\r\n\r\n /**\r\n * Fly-outs whose real size has been measured. Until then the panel is in the\r\n * DOM (it has to be, to be measurable) but transparent, so the estimated\r\n * position never flashes on the wrong side.\r\n */\r\n private readonly measuredIds = new Set<string>();\r\n\r\n /** Floor for a fly-out's height cap, so a trigger near the bottom edge still\r\n * gets a usable (scrollable) panel rather than a sliver. */\r\n private static readonly MIN_POPUP_H = 120;\r\n\r\n /**\r\n * Ceiling for a fly-out's height — automatic, not a consumer input. Without\r\n * one, a popup with many items grows to fill nearly the whole viewport just\r\n * because the room is there. Same three-tier breakpoints bk-select uses for\r\n * its options list, so a \"large\" panel reads the same across the design\r\n * system regardless of which component renders it.\r\n */\r\n private static popupHeightCeiling(): number {\r\n const vh = window.innerHeight;\r\n if (vh <= 700) return 125;\r\n if (vh <= 900) return 166;\r\n return 210;\r\n }\r\n\r\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor(private readonly host: ElementRef<HTMLElement>) {}\r\n\r\n /**\r\n * Inline mode: whenever the active leaf is (re)set — including the very\r\n * first binding, so a deep link or a page refresh lands with the section\r\n * already open — expand every ancestor on its path. Pop-up fly-outs are\r\n * driven by hover/click, not by which leaf is active, so this is skipped\r\n * in `popup` mode.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.isPopup) return;\r\n if (changes['activeItemId'] || changes['items']) {\r\n this.expandAncestorsOfActive();\r\n }\r\n }\r\n\r\n private expandAncestorsOfActive(): void {\r\n if (!this.activeItemId) return;\r\n const chain = this.findAncestorChain(this.items, this.activeItemId);\r\n if (!chain) return;\r\n\r\n let siblings = this.items;\r\n for (const id of chain) {\r\n if (this.singleOpen) {\r\n for (const sibling of siblings) {\r\n if (sibling.id !== id) this.closeBranch(sibling);\r\n }\r\n }\r\n this.openIds.add(id);\r\n siblings = siblings.find(item => item.id === id)?.children ?? [];\r\n }\r\n }\r\n\r\n /** Ids of every ancestor leading to `targetId` (root-first), `[]` if it's top-level, or `null` if not found. */\r\n private findAncestorChain(items: MenuItem[], targetId: string): string[] | null {\r\n for (const item of items) {\r\n if (item.id === targetId) return [];\r\n if (item.children?.length) {\r\n const nested = this.findAncestorChain(item.children, targetId);\r\n if (nested) return [item.id, ...nested];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n get isVertical(): boolean { return this.orientation === 'vertical'; }\r\n get isPopup(): boolean { return this.submenuMode === 'popup'; }\r\n get isCompact(): boolean { return this.size === 'compact'; }\r\n get isHoverTrigger(): boolean { return this.isPopup && this.trigger === 'hover'; }\r\n\r\n // CSS max-height value for the scroll container (accepts px number or string).\r\n get maxHeightStyle(): string | null {\r\n if (this.maxHeight == null) return null;\r\n return typeof this.maxHeight === 'number' ? `${this.maxHeight}px` : this.maxHeight;\r\n }\r\n\r\n // Fixed-position coordinates for an open fly-out (or null when not open/popup).\r\n popupTop(item: MenuItem): number | null {\r\n return this.isPopup ? (this.popupPos.get(item.id)?.top ?? null) : null;\r\n }\r\n popupLeft(item: MenuItem): number | null {\r\n return this.isPopup ? (this.popupPos.get(item.id)?.left ?? null) : null;\r\n }\r\n\r\n // Size caps for an open fly-out. Width keeps the CSS cap as the upper bound and\r\n // only tightens it when the viewport is narrower; height is whatever room is\r\n // left below/beside the trigger, past which the panel scrolls.\r\n popupMaxWidth(item: MenuItem): string | null {\r\n const box = this.isPopup ? this.popupPos.get(item.id) : null;\r\n return box ? `min(var(--menu-popup-max-w), ${box.maxW}px)` : null;\r\n }\r\n popupMaxHeight(item: MenuItem): string | null {\r\n const box = this.isPopup ? this.popupPos.get(item.id) : null;\r\n return box ? `${box.maxH}px` : null;\r\n }\r\n\r\n // Labels are capped by the panel width and ellipsised; a tooltip would be noise\r\n // on the ones that fit, so it is attached on hover, only when actually clipped.\r\n onLabelEnter(event: MouseEvent): void {\r\n const el = event.currentTarget as HTMLElement;\r\n const text = (el.textContent ?? '').trim();\r\n if (el.scrollWidth > el.clientWidth + 1) el.setAttribute('title', text);\r\n else el.removeAttribute('title');\r\n }\r\n\r\n /** Resolved side of an open fly-out, or null before it has been placed. */\r\n submenuSide(item: MenuItem): MenuPopupSide | null {\r\n return this.isPopup ? (this.popupSide.get(item.id) ?? null) : null;\r\n }\r\n\r\n /** True while a fly-out is open but not yet measured — kept transparent. */\r\n isPlacing(item: MenuItem): boolean {\r\n return this.isPopup && this.isOpen(item) && !this.measuredIds.has(item.id);\r\n }\r\n\r\n /** Which way the parent's chevron points. */\r\n chevronDir(item: MenuItem, level: number): 'down' | 'right' | 'left' {\r\n if (!this.isPopup) return 'down';\r\n if (!this.isVertical && level === 0) return 'down';\r\n return this.popupSide.get(item.id) === 'left' ? 'left' : 'right';\r\n }\r\n\r\n hasChildren(item: MenuItem): boolean {\r\n return !!item.children && item.children.length > 0;\r\n }\r\n\r\n // Whether the item at `index` opens a new `groupLabel` section: it has one,\r\n // and it differs from the sibling right before it (the first item always\r\n // starts a section, so the very first group gets a heading but no divider).\r\n isGroupStart(items: MenuItem[], index: number): boolean {\r\n const item = items[index];\r\n if (!item.groupLabel) return false;\r\n return index === 0 || items[index - 1].groupLabel !== item.groupLabel;\r\n }\r\n\r\n isOpen(item: MenuItem): boolean {\r\n return this.openIds.has(item.id);\r\n }\r\n\r\n isActive(item: MenuItem): boolean {\r\n return this.activeItemId === item.id;\r\n }\r\n\r\n // True when the active leaf lives somewhere inside this item's subtree, so a\r\n // parent shows the active state even after its pop-up closes.\r\n isActiveAncestor(item: MenuItem): boolean {\r\n return !!item.children && item.children.some(\r\n child => child.id === this.activeItemId || this.isActiveAncestor(child),\r\n );\r\n }\r\n\r\n // Highlight = the item itself is active. In pop-up mode a parent also lights\r\n // up when one of its descendants is active (so the section stays marked after\r\n // the fly-out closes); inline mode highlights the selected leaf only.\r\n isHighlighted(item: MenuItem): boolean {\r\n return this.isActive(item) || (this.isPopup && this.isActiveAncestor(item));\r\n }\r\n\r\n // Left indent for inline nested items (vertical only).\r\n inlineIndent(level: number): number | null {\r\n if (!this.isVertical || this.isPopup) return null;\r\n const step = this.isCompact ? 12 : 16;\r\n return step + level * step;\r\n }\r\n\r\n // Inline group title, indented for its level but sitting a notch left of the\r\n // rows it heads so it reads as their heading rather than one of them. Pop-up\r\n // titles get the same outdent from CSS, where there is no level to track.\r\n groupTitleIndent(level: number): number | null {\r\n const rowIndent = this.inlineIndent(level + 1);\r\n return rowIndent === null ? null : rowIndent - (this.isCompact ? 6 : 8);\r\n }\r\n\r\n // Handle a click on any menu button.\r\n // Leaves select + emit. Parents toggle in inline mode; in pop-up mode they\r\n // toggle only when `trigger` is 'click' — hover mode opens them by pointer.\r\n onItemClick(\r\n item: MenuItem, siblings: MenuItem[], event: Event, level: number, parent: MenuItem | null,\r\n ): void {\r\n event.stopPropagation();\r\n if (item.disabled) return;\r\n\r\n if (this.hasChildren(item)) {\r\n if (!this.isPopup) {\r\n this.toggle(item, siblings);\r\n return;\r\n }\r\n if (this.trigger !== 'click') return;\r\n\r\n const wasOpen = this.isOpen(item);\r\n for (const sibling of siblings) this.closeBranch(sibling);\r\n if (wasOpen) return; // clicking an open parent closes it\r\n\r\n this.openIds.add(item.id);\r\n const li = (event.currentTarget as HTMLElement).closest('.bk-menu__item') as HTMLElement | null;\r\n if (li) this.placePopup(item, li, level, parent);\r\n return;\r\n }\r\n\r\n this.activeItemId = item.id;\r\n this.activeItemIdChange.emit(item.id);\r\n this.itemClick.emit(item);\r\n if (this.isPopup) this.closeAll(); // dismiss pop-ups after picking a leaf\r\n }\r\n\r\n // Pop-up mode: open a parent's fly-out on hover (and close its siblings).\r\n onItemEnter(\r\n item: MenuItem, siblings: MenuItem[], event: MouseEvent, level: number, parent: MenuItem | null,\r\n ): void {\r\n if (!this.isPopup || item.disabled || !this.hasChildren(item)) return;\r\n // Click mode still follows the pointer once a panel at this level is open,\r\n // the way a native menubar does — hovering a sibling switches without a\r\n // second click. With nothing open, hover does nothing.\r\n if (this.trigger === 'click'\r\n && !siblings.some(sibling => sibling.id !== item.id && this.isOpen(sibling))) return;\r\n\r\n // Re-entering after crossing the gap: keep what's already up rather than\r\n // tearing it down and re-placing it.\r\n this.cancelPendingClose();\r\n if (this.isOpen(item) && this.measuredIds.has(item.id)) return;\r\n\r\n for (const sibling of siblings) {\r\n if (sibling.id !== item.id) this.closeBranch(sibling);\r\n }\r\n this.openIds.add(item.id);\r\n this.placePopup(item, event.currentTarget as HTMLElement, level, parent);\r\n }\r\n\r\n // Pop-up mode: close the fly-out (and any nested ones) when the pointer leaves.\r\n // Deferred, because the gap between an item and its fly-out is outside both:\r\n // crossing it fires mouseleave, and closing on the spot would yank the panel\r\n // away mid-travel. Re-entering within the grace period cancels the close.\r\n onItemLeave(item: MenuItem): void {\r\n if (!this.isHoverTrigger || !this.hasChildren(item)) return;\r\n this.cancelPendingClose();\r\n this.closeTimer = setTimeout(() => {\r\n this.closeTimer = null;\r\n this.closeBranch(item);\r\n }, Math.max(0, this.hoverCloseDelay));\r\n }\r\n\r\n private cancelPendingClose(): void {\r\n if (this.closeTimer === null) return;\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cancelPendingClose();\r\n }\r\n\r\n // Position a fly-out: place it with an estimated size so it is roughly right\r\n // immediately, then re-place it against its real size on the next frame —\r\n // only then does it become visible, so a mis-flip is never seen.\r\n private placePopup(\r\n item: MenuItem, li: HTMLElement, level: number, parent: MenuItem | null,\r\n ): void {\r\n const trigger = (li.querySelector(':scope > .bk-menu__button') as HTMLElement) ?? li;\r\n const prefer = this.preferredSide(parent, level);\r\n this.applyPos(item, trigger.getBoundingClientRect(), prefer, null);\r\n\r\n requestAnimationFrame(() => {\r\n if (!this.openIds.has(item.id)) return;\r\n const panel = li.querySelector(':scope > .bk-menu__submenu') as HTMLElement | null;\r\n if (!panel) return;\r\n this.applyPos(item, trigger.getBoundingClientRect(), prefer, {\r\n w: panel.offsetWidth, h: panel.offsetHeight,\r\n });\r\n this.measuredIds.add(item.id);\r\n });\r\n }\r\n\r\n // Side a fly-out aims for before the viewport gets a say: horizontal top-level\r\n // items drop down; everything else flies sideways, keeping to whichever side\r\n // its parent ended up on so a flipped branch stays flipped instead of\r\n // doubling back over itself.\r\n private preferredSide(parent: MenuItem | null, level: number): MenuPopupSide {\r\n if (!this.isVertical && level === 0) return 'down';\r\n return (parent && this.popupSide.get(parent.id) === 'left') ? 'left' : 'right';\r\n }\r\n\r\n private applyPos(\r\n item: MenuItem, rect: DOMRect, prefer: MenuPopupSide, size: { w: number; h: number } | null,\r\n ): void {\r\n const { pos, side } = this.computePopupPos(rect, prefer, size);\r\n this.popupPos.set(item.id, pos);\r\n this.popupSide.set(item.id, side);\r\n }\r\n\r\n // Compute a fixed-position for a fly-out, flipping to the opposite side when\r\n // the preferred one can't fit it and clamping to stay on-screen.\r\n private computePopupPos(\r\n rect: DOMRect, prefer: MenuPopupSide, size: { w: number; h: number } | null,\r\n ): { pos: PopupBox; side: MenuPopupSide } {\r\n const gap = 4;\r\n const pad = 8;\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n const maxW = vw - pad * 2;\r\n const w = Math.min(size?.w ?? 220, maxW);\r\n const h = size?.h ?? 0;\r\n\r\n if (prefer === 'down' || prefer === 'up') {\r\n // Menubar drop-down: it always drops *down*, left-aligned to its trigger.\r\n // No flipping here — a top-level item is at the top of the page, so both\r\n // flips (up, and right-aligning) only ever tore the panel away from the\r\n // button it belongs to. Overflow is absorbed by clamping into the viewport\r\n // and scrolling inside the panel instead.\r\n const top = rect.bottom + gap;\r\n const left = this.clamp(rect.left, pad, vw - pad - w);\r\n const room = Math.max(BkMenu.MIN_POPUP_H, vh - pad - top);\r\n const maxH = Math.min(room, BkMenu.popupHeightCeiling());\r\n return { pos: { top, left, maxW, maxH }, side: 'down' };\r\n }\r\n\r\n // Sideways: take the preferred side if the panel fits, else the other one —\r\n // and if it fits on neither, the side with more room to be clamped into.\r\n const roomRight = (vw - pad) - (rect.right + gap);\r\n const roomLeft = (rect.left - gap) - pad;\r\n let side = prefer;\r\n if (side === 'right' && w > roomRight) {\r\n side = (w <= roomLeft || roomLeft > roomRight) ? 'left' : 'right';\r\n } else if (side === 'left' && w > roomLeft) {\r\n side = (w <= roomRight || roomRight > roomLeft) ? 'right' : 'left';\r\n }\r\n\r\n const left = side === 'right' ? rect.right + gap : rect.left - w - gap;\r\n let top = rect.top;\r\n if (h && top + h > vh - pad) top = Math.max(pad, vh - pad - h);\r\n const room = Math.max(BkMenu.MIN_POPUP_H, vh - pad - top);\r\n const maxH = Math.min(room, BkMenu.popupHeightCeiling());\r\n return { pos: { top, left: this.clamp(left, pad, vw - pad - w), maxW, maxH }, side };\r\n }\r\n\r\n private clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), Math.max(min, max));\r\n }\r\n\r\n private toggle(item: MenuItem, siblings: MenuItem[]): void {\r\n const wasOpen = this.openIds.has(item.id);\r\n if (this.isPopup || this.singleOpen) {\r\n // Keep a single open branch per level — collapse siblings (and their\r\n // descendants) first so the menu stays compact.\r\n for (const sibling of siblings) this.closeBranch(sibling);\r\n }\r\n if (wasOpen) this.closeBranch(item);\r\n else this.openIds.add(item.id);\r\n }\r\n\r\n // Remove an item and all of its descendants from the open set.\r\n private closeBranch(item: MenuItem): void {\r\n this.openIds.delete(item.id);\r\n this.popupPos.delete(item.id);\r\n this.popupSide.delete(item.id);\r\n this.measuredIds.delete(item.id);\r\n item.children?.forEach(child => this.closeBranch(child));\r\n }\r\n\r\n private closeAll(): void {\r\n this.cancelPendingClose();\r\n this.openIds.clear();\r\n this.popupPos.clear();\r\n this.popupSide.clear();\r\n this.measuredIds.clear();\r\n }\r\n\r\n // Pop-up mode: click outside the menu closes any open fly-outs.\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.isPopup && !this.host.nativeElement.contains(event.target as Node)) {\r\n this.closeAll();\r\n }\r\n }\r\n\r\n // Positions become stale on scroll/resize — close fly-outs to avoid drift.\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n onViewportChange(): void {\r\n if (this.isPopup && this.openIds.size) this.closeAll();\r\n }\r\n}\r\n","<nav\r\n class=\"bk-menu\"\r\n [class.bk-menu--vertical]=\"isVertical\"\r\n [class.bk-menu--horizontal]=\"!isVertical\"\r\n [class.bk-menu--popup]=\"isPopup\"\r\n [class.bk-menu--compact]=\"isCompact\"\r\n [class.bk-menu--tint]=\"tintIcons\"\r\n role=\"menubar\"\r\n [attr.aria-orientation]=\"orientation\">\r\n <ul\r\n class=\"bk-menu__list\"\r\n [class.bk-menu__list--scroll]=\"maxHeightStyle\"\r\n [style.maxHeight]=\"maxHeightStyle\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl; context: { $implicit: items, level: 0, parent: null }\">\r\n </ng-container>\r\n </ul>\r\n</nav>\r\n\r\n<!-- Recursive item renderer. Context: $implicit = items at this level,\r\n level = depth, parent = the item they hang off (null at the top). -->\r\n<ng-template #itemTpl let-items let-level=\"level\" let-parent=\"parent\">\r\n @for (item of items; track item.id; let i = $index) {\r\n @if (isGroupStart(items, i)) {\r\n <li\r\n class=\"bk-menu__group-title bk-menu__group-title--section\"\r\n [class.bk-menu__group-title--divider]=\"i > 0\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n role=\"presentation\">\r\n {{ item.groupLabel }}\r\n </li>\r\n }\r\n <li\r\n class=\"bk-menu__item\"\r\n [class.bk-menu__item--has-children]=\"hasChildren(item)\"\r\n [class.bk-menu__item--open]=\"isOpen(item)\"\r\n (mouseenter)=\"onItemEnter(item, items, $event, level, parent)\"\r\n (mouseleave)=\"onItemLeave(item)\"\r\n role=\"none\">\r\n <button\r\n type=\"button\"\r\n class=\"bk-menu__button\"\r\n [class.bk-menu__button--active]=\"isHighlighted(item)\"\r\n [class.bk-menu__button--disabled]=\"item.disabled\"\r\n [class.bk-menu__button--parent]=\"hasChildren(item)\"\r\n [style.paddingLeft.px]=\"inlineIndent(level)\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-haspopup]=\"hasChildren(item) ? 'true' : null\"\r\n [attr.aria-expanded]=\"hasChildren(item) ? isOpen(item) : null\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item, items, $event, level, parent)\">\r\n @if (item.icon) {\r\n <img class=\"bk-menu__icon\" [attr.src]=\"item.icon\" [alt]=\"item.iconAlt || item.label\" />\r\n }\r\n <span class=\"bk-menu__label\" (mouseenter)=\"onLabelEnter($event)\">{{ item.label }}</span>\r\n @if (hasChildren(item)) {\r\n <svg\r\n class=\"bk-menu__chevron\"\r\n [class.bk-menu__chevron--open]=\"!isPopup && isOpen(item)\"\r\n [class.bk-menu__chevron--right]=\"chevronDir(item, level) === 'right'\"\r\n [class.bk-menu__chevron--left]=\"chevronDir(item, level) === 'left'\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (hasChildren(item)) {\r\n <ul\r\n class=\"bk-menu__submenu\"\r\n [class.bk-menu__submenu--inline]=\"!isPopup\"\r\n [class.bk-menu__submenu--bg]=\"submenuBackground && !isPopup\"\r\n [class.bk-menu__submenu--popup]=\"isPopup\"\r\n [class.bk-menu__submenu--open]=\"isOpen(item)\"\r\n [class.bk-menu__submenu--placing]=\"isPlacing(item)\"\r\n [class.bk-menu__submenu--side-right]=\"submenuSide(item) === 'right'\"\r\n [class.bk-menu__submenu--side-left]=\"submenuSide(item) === 'left'\"\r\n [class.bk-menu__submenu--side-down]=\"submenuSide(item) === 'down'\"\r\n [class.bk-menu__submenu--side-up]=\"submenuSide(item) === 'up'\"\r\n [style.top.px]=\"popupTop(item)\"\r\n [style.left.px]=\"popupLeft(item)\"\r\n [style.maxWidth]=\"popupMaxWidth(item)\"\r\n [style.maxHeight]=\"popupMaxHeight(item)\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"item.childrenLabel || item.label\">\r\n @if (item.childrenLabel) {\r\n <li\r\n class=\"bk-menu__group-title\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n (mouseenter)=\"onLabelEnter($event)\"\r\n role=\"presentation\">\r\n {{ item.childrenLabel }}\r\n </li>\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl;\r\n context: { $implicit: item.children, level: level + 1, parent: item }\">\r\n </ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n","/* =========================================================================\r\n Placement maths for bk-popover: turns an anchor rectangle plus a requested\r\n placement into viewport coordinates for the panel and its arrow.\r\n\r\n Kept free of the DOM so the rules stay readable and testable — the component\r\n measures, this decides.\r\n ========================================================================= */\r\n\r\n/** Which edge of the anchor the panel sits against. */\r\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\r\n\r\n/**\r\n * How the panel lines up along the side it sits on, in terms of that side's\r\n * cross axis. Internal: the public placements name the edge instead (see\r\n * PopoverPlacement), but every measurement below is axis-relative, so `start`\r\n * meaning \"left on a horizontal axis, top on a vertical one\" is what keeps the\r\n * maths from needing a switch on the side at every step.\r\n */\r\nexport type PopoverAlign = 'start' | 'center' | 'end';\r\n\r\n/**\r\n * The 12 placements: four sides x three alignments. A bare side (`top`) centres\r\n * the panel on the trigger; the suffixed forms name the edge the panel lines up\r\n * against, so the axis is always concrete — `top-left` aligns left edges, while\r\n * `left-top` aligns top edges. There is no `left-left`: alignment on the left\r\n * and right sides runs vertically.\r\n */\r\nexport type PopoverPlacement =\r\n | 'top' | 'top-left' | 'top-right'\r\n | 'bottom' | 'bottom-left' | 'bottom-right'\r\n | 'left' | 'left-top' | 'left-bottom'\r\n | 'right' | 'right-top' | 'right-bottom';\r\n\r\n/** Every placement, in the order a placement picker should show them. */\r\nexport const POPOVER_PLACEMENTS: readonly PopoverPlacement[] = [\r\n 'top-left', 'top', 'top-right',\r\n 'right-top', 'right', 'right-bottom',\r\n 'bottom-left', 'bottom', 'bottom-right',\r\n 'left-top', 'left', 'left-bottom'\r\n];\r\n\r\nexport interface Rect { top: number; left: number; width: number; height: number; }\r\nexport interface Size { width: number; height: number; }\r\n\r\nexport interface PopoverPositionOptions {\r\n /** Gap between the anchor and the panel, in px. */\r\n offset: number;\r\n /** Smallest gap to leave between the panel and the viewport edge, in px. */\r\n viewportPadding: number;\r\n /** Edge length of the (unrotated) arrow square, in px. */\r\n arrowSize: number;\r\n /** Whether a panel that doesn't fit may move to the opposite side. */\r\n flip: boolean;\r\n viewport: Size;\r\n}\r\n\r\nexport interface PopoverPosition {\r\n /** Viewport coordinates for the panel (it is positioned `fixed`). */\r\n top: number;\r\n left: number;\r\n /** Where the panel actually landed — not necessarily what was requested. */\r\n side: PopoverSide;\r\n align: PopoverAlign;\r\n placement: PopoverPlacement;\r\n /**\r\n * Distance from the panel's leading edge to the arrow's centre, along the\r\n * panel's cross axis (x for top/bottom, y for left/right).\r\n */\r\n arrowOffset: number;\r\n}\r\n\r\nconst OPPOSITE: Record<PopoverSide, PopoverSide> = {\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left'\r\n};\r\n\r\n/**\r\n * How close the arrow's centre may get to a panel corner. The panel is rounded,\r\n * so an arrow any nearer would grow out of the curve instead of a flat edge.\r\n */\r\nconst ARROW_CORNER_GAP = 14;\r\n\r\n/**\r\n * The edge each side's alignment words refer to. Top and bottom align across the\r\n * x axis, so their words are left/right; left and right align across y, so\r\n * theirs are top/bottom.\r\n */\r\nconst ALIGN_EDGES: Record<PopoverSide, { start: string; end: string }> = {\r\n top: { start: 'left', end: 'right' },\r\n bottom: { start: 'left', end: 'right' },\r\n left: { start: 'top', end: 'bottom' },\r\n right: { start: 'top', end: 'bottom' }\r\n};\r\n\r\n/** `top-left` → side `top`, align `start`. A bare side means centred. */\r\nexport function splitPlacement(placement: PopoverPlacement): { side: PopoverSide; align: PopoverAlign } {\r\n const [side, edge] = placement.split('-') as [PopoverSide, string | undefined];\r\n if (!edge) return { side, align: 'center' };\r\n return { side, align: edge === ALIGN_EDGES[side].start ? 'start' : 'end' };\r\n}\r\n\r\n/**\r\n * Inverse of splitPlacement — centred placements lose the suffix. Safe to call\r\n * after a flip: flipping only ever swaps a side for its opposite, which shares\r\n * the same cross axis, so the alignment word stays meaningful.\r\n */\r\nexport function joinPlacement(side: PopoverSide, align: PopoverAlign): PopoverPlacement {\r\n if (align === 'center') return side;\r\n return `${side}-${ALIGN_EDGES[side][align]}` as PopoverPlacement;\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n // min wins when the range is inverted (panel larger than the viewport), which\r\n // keeps the panel's leading edge on screen rather than its trailing one.\r\n return Math.max(min, Math.min(value, max));\r\n}\r\n\r\n/** Does the panel clear the viewport edge on this side of the anchor? */\r\nfunction fitsOnSide(\r\n side: PopoverSide,\r\n anchor: Rect,\r\n panel: Size,\r\n { offset, viewportPadding: pad, viewport }: PopoverPositionOptions\r\n): boolean {\r\n switch (side) {\r\n case 'top':\r\n return anchor.top - offset - panel.height >= pad;\r\n case 'bottom':\r\n return anchor.top + anchor.height + offset + panel.height <= viewport.height - pad;\r\n case 'left':\r\n return anchor.left - offset - panel.width >= pad;\r\n case 'right':\r\n return anchor.left + anchor.width + offset + panel.width <= viewport.width - pad;\r\n }\r\n}\r\n\r\n/** Leading edge of the panel along the cross axis, before any clamping. */\r\nfunction alignedStart(align: PopoverAlign, anchorStart: number, anchorSize: number, panelSize: number): number {\r\n switch (align) {\r\n case 'start':\r\n return anchorStart;\r\n case 'end':\r\n return anchorStart + anchorSize - panelSize;\r\n case 'center':\r\n return anchorStart + anchorSize / 2 - panelSize / 2;\r\n }\r\n}\r\n\r\n/**\r\n * Places the panel against the anchor, then keeps it on screen in two ways:\r\n *\r\n * - flip: a panel with no room on the requested side moves to the opposite one,\r\n * but only if it actually fits there — flipping into a second bad fit just\r\n * trades one clipped edge for another.\r\n * - shift: the panel slides along its cross axis to stay inside the viewport.\r\n * The arrow is measured against the *anchor*, not the panel, so it keeps\r\n * pointing at the trigger however far the panel had to slide.\r\n */\r\nexport function computePopoverPosition(\r\n anchor: Rect,\r\n panel: Size,\r\n placement: PopoverPlacement,\r\n options: PopoverPositionOptions\r\n): PopoverPosition {\r\n const { offset, viewportPadding: pad, arrowSize, flip, viewport } = options;\r\n let { side, align } = splitPlacement(placement);\r\n\r\n if (flip && !fitsOnSide(side, anchor, panel, options) && fitsOnSide(OPPOSITE[side], anchor, panel, options)) {\r\n side = OPPOSITE[side];\r\n }\r\n\r\n const vertical = side === 'top' || side === 'bottom';\r\n let top: number;\r\n let left: number;\r\n\r\n if (vertical) {\r\n top = side === 'top'\r\n ? anchor.top - panel.height - offset\r\n : anchor.top + anchor.height + offset;\r\n left = clamp(\r\n alignedStart(align, anchor.left, anchor.width, panel.width),\r\n pad,\r\n viewport.width - panel.width - pad\r\n );\r\n } else {\r\n left = side === 'left'\r\n ? anchor.left - panel.width - offset\r\n : anchor.left + anchor.width + offset;\r\n top = clamp(\r\n alignedStart(align, anchor.top, anchor.height, panel.height),\r\n pad,\r\n viewport.height - panel.height - pad\r\n );\r\n }\r\n\r\n const anchorCentre = vertical\r\n ? anchor.left + anchor.width / 2\r\n : anchor.top + anchor.height / 2;\r\n const panelStart = vertical ? left : top;\r\n const panelSize = vertical ? panel.width : panel.height;\r\n const arrowLimit = arrowSize / 2 + ARROW_CORNER_GAP;\r\n\r\n return {\r\n top,\r\n left,\r\n side,\r\n align,\r\n placement: joinPlacement(side, align),\r\n arrowOffset: clamp(anchorCentre - panelStart, arrowLimit, panelSize - arrowLimit)\r\n };\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n OnDestroy,\r\n ViewChild,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PopoverPlacement, PopoverPosition, splitPlacement, computePopoverPosition } from '../shared/utilities/popover-position';\r\n\r\n\r\n/** Edge length of the arrow square. Mirrored by --bk-popover-arrow in popover.css. */\r\nconst ARROW_SIZE = 10;\r\n\r\n@Component({\r\n selector: 'bk-popover',\r\n standalone: true,\r\n // exportAs lets a template grab the instance (#pop=\"bkPopover\") to drive it\r\n // imperatively — open()/close()/toggle() — or to read activePlacement().\r\n exportAs: 'bkPopover',\r\n imports: [CommonModule],\r\n templateUrl: './popover.html',\r\n styleUrls: ['./popover.css'],\r\n host: {\r\n // A static `title=\"…\"` lands on the input *and* stays on the host as a real\r\n // HTML attribute, which the browser would render as its own native tooltip\r\n // over the trigger. Stripping it here means the input can keep the obvious\r\n // name without consumers having to remember to bind it.\r\n '[attr.title]': 'null'\r\n }\r\n})\r\nexport class BkPopover implements AfterViewInit, OnDestroy {\r\n /**\r\n * One of the 12 placements (`top-left`, `right`, `bottom-right`, …). It is a\r\n * preference, not a guarantee: a panel with no room moves to the opposite\r\n * side (unless `flip` is off) and slides along the edge to stay on screen.\r\n * Read `activePlacement()` for where it actually landed.\r\n */\r\n placement = input<PopoverPlacement>('bottom');\r\n\r\n /**\r\n * `click` toggles and stays open until dismissed — the right choice for\r\n * anything interactive. `hover` opens on the way in and closes on the way\r\n * out, with a grace period so the pointer can travel into the panel.\r\n */\r\n trigger = input<'click' | 'hover'>('click');\r\n\r\n /** Optional heading. Empty hides the header row entirely. */\r\n title = input<string>('');\r\n\r\n /** Show the × in the header. Ignored without a `title` to put it in. */\r\n closable = input<boolean>(false);\r\n\r\n disabled = input<boolean>(false);\r\n showArrow = input<boolean>(true);\r\n\r\n /** Gap between the trigger and the panel, in px. The arrow spans most of it. */\r\n offset = input<number>(8);\r\n\r\n /** Allow moving to the opposite side when the requested one has no room. */\r\n flip = input<boolean>(true);\r\n\r\n closeOnClickOutside = input<boolean>(true);\r\n closeOnEscape = input<boolean>(true);\r\n\r\n /** Hover only: ms before opening / before closing once the pointer leaves.\r\n * The close delay is what makes the panel reachable — drop it to 0 and the\r\n * panel disappears as the pointer crosses the gap. */\r\n openDelay = input<number>(80);\r\n closeDelay = input<number>(150);\r\n\r\n maxWidth = input<string>('280px');\r\n panelClass = input<string>('');\r\n\r\n /**\r\n * Relocate the panel to <body> while open. `position: fixed` alone resolves\r\n * against a transformed ancestor rather than the viewport, so a popover\r\n * inside an animated dialog or a transformed card needs this to escape.\r\n */\r\n appendToBody = input<boolean>(false);\r\n\r\n opened = output<void>();\r\n closed = output<void>();\r\n openChange = output<boolean>();\r\n\r\n @ViewChild('anchor') anchorRef!: ElementRef<HTMLElement>;\r\n @ViewChild('panel') panelRef?: ElementRef<HTMLElement>;\r\n\r\n private static activeInstance: BkPopover | null = null;\r\n private readonly host = inject(ElementRef);\r\n\r\n isOpen = signal(false);\r\n\r\n /**\r\n * Null until the panel has been measured. The template keeps the panel\r\n * hidden while it is null: the first frame exists only to measure, and\r\n * showing it at 0,0 first would flash it in the corner.\r\n */\r\n position = signal<PopoverPosition | null>(null);\r\n\r\n /** Where the panel actually is, once positioned — may differ from `placement`. */\r\n activePlacement = computed<PopoverPlacement>(() => this.position()?.placement ?? this.placement());\r\n\r\n /** Side the panel sits on. Drives which edge the arrow hangs off (see CSS). */\r\n side = computed(() => this.position()?.side ?? splitPlacement(this.placement()).side);\r\n\r\n private openTimer: any = null;\r\n private closeTimer: any = null;\r\n private pointerInPanel = false;\r\n private resizeObserver?: ResizeObserver;\r\n\r\n // Panel's home in the DOM, so appendToBody can put it back before Angular's\r\n // @if removes it.\r\n private originalPanelParent: Node | null = null;\r\n private originalPanelAnchor: Node | null = null;\r\n private panelInBody = false;\r\n\r\n ngAfterViewInit(): void {\r\n // Capture phase catches scrolling inside nested overflow containers, which\r\n // a window:scroll listener would miss entirely.\r\n window.addEventListener('scroll', this.reposition, true);\r\n window.addEventListener('resize', this.reposition);\r\n\r\n // Content can change size while open (async data, an expanding section),\r\n // which moves every edge the panel is aligned against.\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(() => this.measure());\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearTimers();\r\n this.resizeObserver?.disconnect();\r\n document.removeEventListener('click', this.onDocumentClick);\r\n window.removeEventListener('scroll', this.reposition, true);\r\n window.removeEventListener('resize', this.reposition);\r\n // Don't leave a relocated panel orphaned in <body> if we're torn down open.\r\n if (this.panelInBody) {\r\n this.panelRef?.nativeElement.remove();\r\n this.panelInBody = false;\r\n }\r\n if (BkPopover.activeInstance === this) BkPopover.activeInstance = null;\r\n }\r\n\r\n // --- Public API ---\r\n\r\n open(): void {\r\n if (this.isOpen() || this.disabled()) return;\r\n\r\n // Two popovers open at once is nearly always an accident of a missed close.\r\n if (BkPopover.activeInstance && BkPopover.activeInstance !== this) {\r\n BkPopover.activeInstance.close();\r\n }\r\n BkPopover.activeInstance = this;\r\n\r\n this.clearTimers();\r\n this.position.set(null);\r\n this.isOpen.set(true);\r\n this.opened.emit();\r\n this.openChange.emit(true);\r\n\r\n // The panel doesn't exist until Angular renders it, and it can't be\r\n // measured before it does — so position on the next tick.\r\n setTimeout(() => {\r\n if (!this.isOpen()) return;\r\n if (this.appendToBody()) this.movePanelToBody();\r\n this.measure();\r\n if (this.panelRef) this.resizeObserver?.observe(this.panelRef.nativeElement);\r\n // Attached here, not on the host, so the very click that opened the panel\r\n // has finished bubbling first — otherwise a popover opened by anything\r\n // outside its own trigger (a toolbar button calling open()) would be shut\r\n // again by its own opening click.\r\n document.addEventListener('click', this.onDocumentClick);\r\n });\r\n }\r\n\r\n close(): void {\r\n if (!this.isOpen()) return;\r\n this.clearTimers();\r\n this.resizeObserver?.disconnect();\r\n document.removeEventListener('click', this.onDocumentClick);\r\n this.restorePanel();\r\n this.isOpen.set(false);\r\n this.position.set(null);\r\n this.pointerInPanel = false;\r\n this.closed.emit();\r\n this.openChange.emit(false);\r\n if (BkPopover.activeInstance === this) BkPopover.activeInstance = null;\r\n }\r\n\r\n toggle(): void {\r\n this.isOpen() ? this.close() : this.open();\r\n }\r\n\r\n // --- Trigger handling ---\r\n\r\n onAnchorClick(): void {\r\n if (this.trigger() !== 'click' || this.disabled()) return;\r\n this.toggle();\r\n }\r\n\r\n onAnchorEnter(): void {\r\n if (this.trigger() !== 'hover' || this.disabled()) return;\r\n this.cancelClose();\r\n this.openTimer = setTimeout(() => this.open(), this.openDelay());\r\n }\r\n\r\n onAnchorLeave(): void {\r\n if (this.trigger() !== 'hover') return;\r\n this.cancelOpen();\r\n this.scheduleClose();\r\n }\r\n\r\n onPanelEnter(): void {\r\n if (this.trigger() !== 'hover') return;\r\n this.pointerInPanel = true;\r\n this.cancelClose();\r\n }\r\n\r\n onPanelLeave(): void {\r\n if (this.trigger() !== 'hover') return;\r\n this.pointerInPanel = false;\r\n this.scheduleClose();\r\n }\r\n\r\n /** Only attached while open — see open(). Arrow fn so it can be removed. */\r\n private onDocumentClick = (event: Event) => {\r\n if (this.trigger() !== 'click' || !this.closeOnClickOutside()) return;\r\n const target = event.target as Node;\r\n if (this.host.nativeElement.contains(target)) return;\r\n // appendToBody moves the panel out of the host, so clicking inside it would\r\n // otherwise read as an outside click.\r\n if (this.panelRef?.nativeElement.contains(target)) return;\r\n this.close();\r\n };\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.isOpen() && this.closeOnEscape()) this.close();\r\n }\r\n\r\n // --- Positioning ---\r\n\r\n private reposition = () => {\r\n if (this.isOpen()) this.measure();\r\n };\r\n\r\n /** Measures the anchor and panel, then hands the maths to the utility. */\r\n private measure(): void {\r\n const anchor = this.anchorRef?.nativeElement;\r\n const panel = this.panelRef?.nativeElement;\r\n if (!anchor || !panel) return;\r\n\r\n const anchorRect = anchor.getBoundingClientRect();\r\n this.position.set(\r\n computePopoverPosition(\r\n {\r\n top: anchorRect.top,\r\n left: anchorRect.left,\r\n width: anchorRect.width,\r\n height: anchorRect.height\r\n },\r\n { width: panel.offsetWidth, height: panel.offsetHeight },\r\n this.placement(),\r\n {\r\n offset: this.offset(),\r\n viewportPadding: 8,\r\n arrowSize: ARROW_SIZE,\r\n flip: this.flip(),\r\n viewport: { width: window.innerWidth, height: window.innerHeight }\r\n }\r\n )\r\n );\r\n }\r\n\r\n /** Arrow offset along the panel's cross axis — x on top/bottom, y on left/right. */\r\n arrowLeft = computed<number | null>(() => {\r\n const pos = this.position();\r\n if (!pos) return null;\r\n return pos.side === 'top' || pos.side === 'bottom' ? pos.arrowOffset : null;\r\n });\r\n\r\n arrowTop = computed<number | null>(() => {\r\n const pos = this.position();\r\n if (!pos) return null;\r\n return pos.side === 'left' || pos.side === 'right' ? pos.arrowOffset : null;\r\n });\r\n\r\n private movePanelToBody(): void {\r\n const panel = this.panelRef?.nativeElement;\r\n if (!panel || this.panelInBody) return;\r\n this.originalPanelParent = panel.parentNode;\r\n this.originalPanelAnchor = panel.nextSibling;\r\n document.body.appendChild(panel);\r\n this.panelInBody = true;\r\n }\r\n\r\n private restorePanel(): void {\r\n const panel = this.panelRef?.nativeElement;\r\n if (!panel || !this.panelInBody) return;\r\n this.originalPanelParent?.insertBefore(panel, this.originalPanelAnchor);\r\n this.panelInBody = false;\r\n this.originalPanelParent = null;\r\n this.originalPanelAnchor = null;\r\n }\r\n\r\n // --- Timers ---\r\n\r\n private scheduleClose(): void {\r\n this.cancelClose();\r\n this.closeTimer = setTimeout(() => {\r\n if (!this.pointerInPanel) this.close();\r\n }, this.closeDelay());\r\n }\r\n\r\n private cancelOpen(): void {\r\n if (this.openTimer) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = null;\r\n }\r\n }\r\n\r\n private cancelClose(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n private clearTimers(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n }\r\n}\r\n","<!-- The anchor wraps the projected trigger so the popover has an element to\r\n measure and to listen on, whatever the consumer passes in. -->\r\n<span\r\n #anchor\r\n class=\"bk-popover-anchor\"\r\n (click)=\"onAnchorClick()\"\r\n (mouseenter)=\"onAnchorEnter()\"\r\n (mouseleave)=\"onAnchorLeave()\"\r\n>\r\n <ng-content select=\"[bkPopoverTrigger]\"></ng-content>\r\n</span>\r\n\r\n@if (isOpen()) {\r\n <!-- Hidden until position() lands: the first frame exists only so the panel\r\n can be measured, and painting it at 0,0 first flashes it in the corner. -->\r\n <div\r\n #panel\r\n class=\"bk-popover-panel\"\r\n [ngClass]=\"panelClass()\"\r\n role=\"dialog\"\r\n [attr.data-side]=\"side()\"\r\n [style.top.px]=\"position()?.top\"\r\n [style.left.px]=\"position()?.left\"\r\n [style.maxWidth]=\"maxWidth()\"\r\n [class.bk-popover-ready]=\"!!position()\"\r\n (mouseenter)=\"onPanelEnter()\"\r\n (mouseleave)=\"onPanelLeave()\"\r\n >\r\n @if (showArrow()) {\r\n <!-- A rotated square, not a border triangle: it inherits the panel's\r\n background and border, so the tip matches the panel on every side.\r\n Sits above the panel's own border, hiding the segment it crosses. -->\r\n <span\r\n class=\"bk-popover-arrow\"\r\n [style.left.px]=\"arrowLeft()\"\r\n [style.top.px]=\"arrowTop()\"\r\n ></span>\r\n }\r\n\r\n @if (title()) {\r\n <div class=\"bk-popover-header\">\r\n <span class=\"bk-popover-title\">{{ title() }}</span>\r\n @if (closable()) {\r\n <button type=\"button\" class=\"bk-popover-close\" aria-label=\"Close\" (click)=\"close()\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\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 </div>\r\n }\r\n\r\n <div class=\"bk-popover-body\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AvatarSize, AvatarVariant, BkAvatar, DotPosition, DotStatus } from '../ui-avatar/ui-avatar';\r\n\r\n\r\n/** One entry in a stacked avatar group. Mirrors the display inputs of bk-avatar. */\r\nexport interface AvatarGroupItem {\r\n src?: string | null;\r\n name?: string;\r\n initialsOverride?: string;\r\n alt?: string;\r\n tooltipContent?: string | string[] | null;\r\n bgColor?: string | null;\r\n textColor?: string | null;\r\n variant?: AvatarVariant;\r\n dot?: DotStatus;\r\n dotPosition?: DotPosition;\r\n}\r\n\r\n/**\r\n * A stacked (\"avatar list\") group. Renders a set of overlapping `bk-avatar`s and\r\n * collapses any beyond `max` into a `+N` bubble whose tooltip lists the hidden\r\n * names. Uses bk-avatar for every slot, so image/initials/icon fallback, sizing\r\n * and status dots all come for free.\r\n */\r\n@Component({\r\n selector: 'bk-avatar-group',\r\n standalone: true,\r\n imports: [CommonModule, BkAvatar],\r\n templateUrl: './ui-avatar-group.html',\r\n styleUrls: ['./ui-avatar-group.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BkAvatarGroup {\r\n /** The people to stack. */\r\n @Input() avatars: AvatarGroupItem[] = [];\r\n /** Shared size for every avatar in the group. */\r\n @Input() size: AvatarSize = 'md';\r\n /** Max avatars shown before collapsing the rest into a +N bubble. */\r\n @Input() max = 3;\r\n /** Default variant for items that don't set their own. */\r\n @Input() variant: AvatarVariant = 'gray';\r\n /** Show the +N overflow bubble (otherwise extra avatars are just hidden). */\r\n @Input() showOverflow = true;\r\n\r\n get visibleAvatars(): AvatarGroupItem[] {\r\n return this.avatars.slice(0, this.max);\r\n }\r\n\r\n get overflowCount(): number {\r\n return Math.max(0, this.avatars.length - this.max);\r\n }\r\n\r\n get overflowLabel(): string {\r\n return `+${this.overflowCount}`;\r\n }\r\n\r\n /** Names of the hidden avatars, for the +N tooltip. */\r\n get overflowTooltip(): string {\r\n return this.avatars\r\n .slice(this.max)\r\n .map(a => a.name?.trim())\r\n .filter((n): n is string => !!n)\r\n .join(', ');\r\n }\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div class=\"bk-avatar-group\" [ngClass]=\"size\">\r\n @for (item of visibleAvatars; track trackByIndex($index)) {\r\n <span class=\"bk-avatar-group__item\">\r\n <bk-avatar\r\n [src]=\"item.src ?? null\"\r\n [name]=\"item.name ?? ''\"\r\n [initialsOverride]=\"item.initialsOverride ?? ''\"\r\n [alt]=\"item.alt ?? 'Avatar'\"\r\n [tooltipContent]=\"item.tooltipContent ?? null\"\r\n [bgColor]=\"item.bgColor ?? null\"\r\n [textColor]=\"item.textColor ?? null\"\r\n [size]=\"size\"\r\n [variant]=\"item.variant ?? variant\"\r\n [dot]=\"item.dot ?? 'none'\"\r\n [dotPosition]=\"item.dotPosition ?? 'bottom-right'\"\r\n ></bk-avatar>\r\n </span>\r\n }\r\n\r\n @if (showOverflow && overflowCount > 0) {\r\n <span class=\"bk-avatar-group__item bk-avatar-group__item--overflow\">\r\n <bk-avatar\r\n [name]=\"overflowLabel\"\r\n [initialsOverride]=\"overflowLabel\"\r\n [tooltipContent]=\"overflowTooltip\"\r\n [size]=\"size\"\r\n variant=\"gray\"\r\n bgColor=\"#F3F4F6\"\r\n textColor=\"#4A5565\"\r\n ></bk-avatar>\r\n </span>\r\n }\r\n</div>\r\n","/**\r\n * Types for bk-table.\r\n *\r\n * The control is template-driven: consumers write their own <thead>/<tbody>\r\n * markup and the component supplies behaviour. These types describe the\r\n * contracts passed *into* that markup — sorting, filtering and query state.\r\n */\r\n\r\n/** Ascending, descending, or unsorted. Matches the tri-state sort cycle. */\r\nexport type BkSortOrder = 'ascend' | 'descend' | null;\r\n\r\n/** Which orders a column cycles through, in order. `null` clears the sort. */\r\nexport type BkSortDirection = BkSortOrder;\r\n\r\n/**\r\n * How a column sorts.\r\n *\r\n * A comparator sorts client-side. `true` means \"this column is sortable but\r\n * the server does the work\" — the table emits queryParams and leaves the rows\r\n * untouched.\r\n */\r\nexport type BkSortFn<T = any> = ((a: T, b: T, sortOrder: BkSortOrder) => number) | boolean;\r\n\r\n/** One entry in a column's filter menu. */\r\nexport interface BkFilterOption {\r\n text: string;\r\n value: any;\r\n /** Pre-select this option on first render. */\r\n byDefault?: boolean;\r\n}\r\n\r\n/**\r\n * How a column filters.\r\n *\r\n * The predicate receives the selected values (always an array, even in single\r\n * mode) and a row, and returns whether the row survives. `true` defers to the\r\n * server, like the sort equivalent.\r\n */\r\nexport type BkFilterFn<T = any> = ((selected: any[], item: T) => boolean) | boolean;\r\n\r\n/** Everything the server needs to reproduce the current view. */\r\nexport interface BkTableQueryParams {\r\n pageIndex: number;\r\n pageSize: number;\r\n sort: { key: string; value: BkSortOrder }[];\r\n filter: { key: string; value: any[] }[];\r\n}\r\n\r\n/**\r\n * Table density, roomiest first: `lg`, `default`, `md`, `sm`.\r\n *\r\n * `sm` is the one to reach for inside a modal, where the surrounding chrome\r\n * has already spent most of the height. `middle` and `small` are ng-zorro's\r\n * names for `md` and `sm`, kept so existing markup keeps working.\r\n */\r\nexport type BkTableSize = 'lg' | 'default' | 'md' | 'sm' | 'middle' | 'small';\r\n\r\n/** The four real densities, once the ng-zorro aliases are resolved. */\r\nexport type BkTableSizeToken = 'lg' | 'default' | 'md' | 'sm';\r\n\r\nexport function normalizeBkTableSize(size: BkTableSize): BkTableSizeToken {\r\n if (size === 'middle') return 'md';\r\n if (size === 'small') return 'sm';\r\n return size;\r\n}\r\n\r\n/**\r\n * Fixed-header / fixed-column configuration.\r\n *\r\n * `x` sets a minimum table width so columns stop collapsing and scroll\r\n * horizontally instead; `y` caps body height and pins the header.\r\n */\r\nexport interface BkTableScroll {\r\n x?: string | null;\r\n y?: string | null;\r\n /**\r\n * `y` is a ceiling by default (`max-height`) — a table with fewer rows\r\n * than that shrinks to fit them, same as `nz-table`. Set `fill` to make it\r\n * a floor instead (`height`): the body always occupies that space, even\r\n * with one row, so surrounding layout (a pager below it, a page built\r\n * around a fixed grid height) doesn't shift with the row count.\r\n */\r\n fill?: boolean;\r\n}\r\n\r\n/** A custom entry in the select-all dropdown (e.g. \"Select odd rows\"). */\r\nexport interface BkTableSelection {\r\n text: string;\r\n onSelect: () => void;\r\n}\r\n\r\n/** Horizontal cell alignment. */\r\nexport type BkCellAlign = 'left' | 'center' | 'right';\r\n\r\n/**\r\n * Flattens a tree into the linear array a <tbody> can iterate, keeping only\r\n * the branches whose ancestors are all expanded.\r\n *\r\n * The table can't do this itself: it never sees the tree, only the rows you\r\n * hand it. Call this in your component whenever expansion state changes.\r\n *\r\n * @param root top-level nodes\r\n * @param childrenKey property holding each node's children\r\n * @param isExpanded whether a node's children should be visible\r\n */\r\nexport interface BkTreeRow<T> {\r\n data: T;\r\n level: number;\r\n /** Undefined at the root. Carrying it is what makes a drop resolvable. */\r\n parent?: T;\r\n}\r\n\r\nexport function flattenBkTreeData<T extends Record<string, any>>(\r\n root: T[],\r\n childrenKey: keyof T & string = 'children',\r\n isExpanded: (node: T) => boolean = (n) => !!n['expand']\r\n): BkTreeRow<T>[] {\r\n const out: BkTreeRow<T>[] = [];\r\n\r\n const walk = (nodes: T[], level: number, parent?: T) => {\r\n for (const node of nodes) {\r\n out.push({ data: node, level, parent });\r\n\r\n const children = node[childrenKey] as T[] | undefined;\r\n if (children?.length && isExpanded(node)) {\r\n walk(children, level + 1, node);\r\n }\r\n }\r\n };\r\n\r\n walk(root, 0);\r\n return out;\r\n}\r\n\r\n/**\r\n * Whether `node` sits anywhere inside `ancestor`'s subtree.\r\n *\r\n * The guard a tree drag cannot do without: dropping a node into its own\r\n * descendant detaches that whole branch from the tree, and nothing afterwards\r\n * can find it again.\r\n */\r\nexport function containsBkTreeNode<T extends Record<string, any>>(\r\n ancestor: T,\r\n node: T,\r\n childrenKey: keyof T & string = 'children'\r\n): boolean {\r\n const children = (ancestor[childrenKey] as T[] | undefined) ?? [];\r\n\r\n for (const child of children) {\r\n if (child === node || containsBkTreeNode(child, node, childrenKey)) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Where a tree drop lands relative to its target row: as the sibling before\r\n * it, the sibling after it, or as its child.\r\n */\r\nexport type BkTreeDropPosition = 'before' | 'after' | 'inside';\r\n\r\n/** What `BkTreeDrag` resolves a completed drag into. */\r\nexport interface BkTreeDropEvent<T = any> {\r\n dragged: BkTreeRow<T>;\r\n target: BkTreeRow<T>;\r\n position: BkTreeDropPosition;\r\n}\r\n\r\n/**\r\n * Applies a resolved tree drop to the tree behind the rows.\r\n *\r\n * `before` / `after` insert into the target's sibling list; `inside` makes the\r\n * dragged node the target's **first** child — first, not last, so the row\r\n * appears directly beneath the row it was dropped on rather than teleporting\r\n * to the bottom of a long branch.\r\n *\r\n * A node's subtree travels with it, because it is nested inside it. Dropping a\r\n * node into its own descendant is refused: that move would detach the branch\r\n * from the tree with nothing left pointing at it.\r\n *\r\n * Mutates `root` in place and reports whether anything moved; re-emit your\r\n * signal with a fresh array identity when it returns true.\r\n */\r\nexport function moveBkTreeNode<T extends Record<string, any>>(\r\n root: T[],\r\n dragged: BkTreeRow<T>,\r\n target: BkTreeRow<T>,\r\n position: BkTreeDropPosition,\r\n childrenKey: keyof T & string = 'children'\r\n): boolean {\r\n if (!dragged || !target || dragged.data === target.data) return false;\r\n if (containsBkTreeNode(dragged.data, target.data, childrenKey)) return false;\r\n\r\n const fromList = dragged.parent ? ((dragged.parent[childrenKey] as T[]) ?? []) : root;\r\n const fromIndex = fromList.indexOf(dragged.data);\r\n if (fromIndex < 0) return false;\r\n\r\n fromList.splice(fromIndex, 1);\r\n\r\n if (position === 'inside') {\r\n const children = (target.data[childrenKey] as T[] | undefined) ?? [];\r\n children.unshift(dragged.data);\r\n (target.data as Record<string, any>)[childrenKey] = children;\r\n return true;\r\n }\r\n\r\n const toList = target.parent ? ((target.parent[childrenKey] as T[]) ?? []) : root;\r\n\r\n // Located after the removal, so an index in the same list already accounts\r\n // for the gap the dragged node left behind.\r\n const toIndex = toList.indexOf(target.data);\r\n if (toIndex < 0) {\r\n fromList.splice(fromIndex, 0, dragged.data);\r\n return false;\r\n }\r\n\r\n toList.splice(position === 'after' ? toIndex + 1 : toIndex, 0, dragged.data);\r\n return true;\r\n}\r\n ","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ContentChild,\r\n Directive,\r\n ElementRef,\r\n NgZone,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewChild,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal\r\n} from '@angular/core';\r\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { BkPagination } from '../pagination/pagination';\r\nimport {\r\n BkSortOrder,\r\n BkTableQueryParams,\r\n BkTableScroll,\r\n BkTableSize,\r\n normalizeBkTableSize\r\n} from './table.model';\r\n\r\n/** Marks projected content as the table's title bar. */\r\n@Directive({ selector: '[bkTableTitle]', standalone: true })\r\nexport class BkTableTitle {}\r\n\r\n/** Marks projected content as the table's footer bar. */\r\n@Directive({ selector: '[bkTableFooter]', standalone: true })\r\nexport class BkTableFooter {}\r\n\r\n/**\r\n * Row template for virtual scroll mode.\r\n *\r\n * Virtual scrolling can't use a projected <tbody> — the rows have to be created\r\n * and destroyed by the viewport as it scrolls, so they must come from a\r\n * template the table instantiates itself:\r\n *\r\n * <tbody>\r\n * <ng-template bkVirtualScroll let-row let-i=\"index\">\r\n * <tr>…</tr>\r\n * </ng-template>\r\n * </tbody>\r\n */\r\n@Directive({ selector: '[bkVirtualScroll]', standalone: true })\r\nexport class BkVirtualScroll {\r\n constructor(public templateRef: TemplateRef<{ $implicit: any; index: number }>) {}\r\n}\r\n\r\n/**\r\n * Anything a column needs to expose so the table can sort and filter it.\r\n * `th[bk-th]` implements this and registers itself on construction; the\r\n * interface exists only to keep the two files from importing each other.\r\n */\r\nexport interface BkColumnRef {\r\n columnKey: string | null;\r\n width: string | null;\r\n sortOrder: WritableSignal<BkSortOrder>;\r\n sortPriority: number | null;\r\n clientSortFn: ((a: any, b: any, order: BkSortOrder) => number) | null;\r\n filterValue: WritableSignal<any[]>;\r\n clientFilterFn: ((selected: any[], item: any) => boolean) | null;\r\n clearSort(): void;\r\n clearFilter(): void;\r\n}\r\n\r\n/**\r\n * Template-driven table.\r\n *\r\n * Unlike `bk-grid`, this component renders none of your cells — you write the\r\n * `<thead>`/`<tbody>` markup and it supplies behaviour: sort and filter state,\r\n * pagination, sticky header and columns, virtual scrolling. That's what makes\r\n * colspan, nested tables, editable cells and grouped headers possible at all;\r\n * none of them can be expressed as a column config object.\r\n *\r\n * <bk-table #t [data]=\"rows\" [bordered]=\"true\" size=\"middle\">\r\n * <thead>\r\n * <tr><th bk-th [sortFn]=\"byName\">Name</th></tr>\r\n * </thead>\r\n * <tbody>\r\n * @for (row of t.renderData(); track row.id) {\r\n * <tr><td bk-td>{{ row.name }}</td></tr>\r\n * }\r\n * </tbody>\r\n * </bk-table>\r\n *\r\n * Client vs server work is decided per column, exactly like ng-zorro: pass a\r\n * comparator to `sortFn` and the table sorts; pass `true` and it only reports\r\n * the change through `queryParams` for you to handle.\r\n */\r\n@Component({\r\n selector: 'bk-table',\r\n standalone: true,\r\n exportAs: 'bkTable',\r\n imports: [CommonModule, ScrollingModule, BkPagination],\r\n templateUrl: './table.html',\r\n styleUrl: './table.css',\r\n // Cells are projected, so they are not in this component's emulated scope.\r\n // Styling them from here requires the styles to be global.\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'bk-table-host'\r\n }\r\n})\r\nexport class BkTable<T = any> implements AfterViewInit, OnDestroy {\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n private readonly zone = inject(NgZone);\r\n\r\n constructor() {\r\n // renderData is a computed, so the only way to push it out as an event is\r\n // to watch it. Consumers use this to keep a select-all checkbox or a\r\n // summary row in step with the rows actually on screen.\r\n effect(() => this.currentPageDataChange.emit(this.renderData()));\r\n\r\n // A path that failed shouldn't stay hidden forever if the consumer swaps\r\n // it for a different one — only the path that actually 404'd should be\r\n // treated as broken.\r\n effect(() => {\r\n this.noResultImage();\r\n this.emptyImageFailed.set(false);\r\n });\r\n\r\n // Freeze the column proportions once there are real rows to measure. Rows\r\n // arriving asynchronously are the common case, and widths measured against\r\n // an empty table would be frozen wrong forever.\r\n effect(() => {\r\n const columnCount = this.columns().length;\r\n\r\n // A column appearing or disappearing invalidates the frozen widths: they\r\n // no longer sum to the table, and the newcomer takes whatever is left\r\n // over. Drop them and let the next run measure the new set.\r\n if (this.layoutFixed() && columnCount !== this.frozenColumnCount) {\r\n this.remeasureColumns();\r\n return;\r\n }\r\n\r\n if (this.layoutFixed() || this.freezeScheduled) return;\r\n if (!this.stableColumnWidth() || this.isVirtual()) return;\r\n if (this.renderData().length === 0) return;\r\n\r\n // Measuring inside the effect would read a layout that hasn't happened\r\n // yet — these rows are only being rendered as a result of it. Columns\r\n // also register one at a time, so this run is rarely the last one.\r\n this.freezeScheduled = true;\r\n setTimeout(() => {\r\n this.freezeScheduled = false;\r\n this.freezeColumnWidths();\r\n });\r\n });\r\n }\r\n\r\n /* ================= Data ================= */\r\n\r\n /** Full row set. In server mode, only the current page's rows. */\r\n data = input<readonly T[]>([]);\r\n\r\n /* ================= Appearance ================= */\r\n\r\n /** Roomiest first: `lg`, `default`, `md`, `sm`. `sm` suits modals. */\r\n size = input<BkTableSize>('default');\r\n\r\n /** One class rather than a binding per size, and it resolves the aliases. */\r\n readonly sizeClass = computed(() => `bk-table-${normalizeBkTableSize(this.size())}`);\r\n bordered = input(false);\r\n\r\n /** Convenience alternative to projecting `[bkTableTitle]`. */\r\n title = input<string>('');\r\n /** Convenience alternative to projecting `[bkTableFooter]`. */\r\n footer = input<string>('');\r\n\r\n /**\r\n * `x` is a min-width that forces horizontal scrolling instead of column\r\n * collapse; `y` caps the body height and pins the header. Fixed columns\r\n * (`th[bk-th][left]`) need `x` set to have anything to scroll over.\r\n */\r\n scroll = input<BkTableScroll>({});\r\n\r\n loading = input(false);\r\n\r\n /**\r\n * `loading` always suppresses the empty state — a fetch in flight isn't\r\n * \"no data,\" and shouldn't flash that message just because the previous\r\n * page's rows haven't arrived yet. This is only about the *spinner*\r\n * overlay `loading` draws on top of the table. Turn it off when a\r\n * consumer already shows its own loading indicator elsewhere and doesn't\r\n * want a second one competing with it — `loading` keeps doing its other\r\n * job either way.\r\n */\r\n showLoadingOverlay = input(true);\r\n\r\n /** Shown when there are no rows to render. */\r\n noResultText = input('Data may be empty, or try adjusting your filter.');\r\n noResultImage = input('./assets/media/logos/no-data-found.jpg');\r\n\r\n /**\r\n * Set once `noResultImage()` fails to load, so the template can drop the\r\n * `<img>` instead of leaving the browser's broken-image glyph sitting next\r\n * to the empty-state text — bk-grid's empty state does exactly that on any\r\n * deployment where the asset path doesn't resolve. The text alone still\r\n * communicates \"no data\"; a broken icon just looks like the component is\r\n * broken.\r\n */\r\n readonly emptyImageFailed = signal(false);\r\n\r\n onEmptyImageError(): void {\r\n this.emptyImageFailed.set(true);\r\n }\r\n\r\n /* ================= Pagination ================= */\r\n\r\n showPagination = input(true);\r\n /**\r\n * When true the table slices `data` itself. Turn it off for server-side\r\n * paging and feed `total` instead.\r\n */\r\n frontPagination = input(true);\r\n pageIndex = model(1);\r\n /**\r\n * Defaults to 25 because that is the smallest size `bk-pagination` offers\r\n * (25/50/75/100). A value outside that list matches no option and leaves its\r\n * \"rows per page\" select rendering blank.\r\n */\r\n pageSize = model(25);\r\n /** Row count for server mode. Ignored when `frontPagination` is on. */\r\n total = input(0);\r\n\r\n /* ================= Virtual scroll ================= */\r\n\r\n /**\r\n * Row height in px. Required for virtual scroll — the viewport can't measure\r\n * rows it hasn't created. Rows must be uniform height, which is why virtual\r\n * scroll does not combine with rowspan, tree data or expandable rows.\r\n */\r\n virtualItemSize = input(0);\r\n virtualTrackBy = input<(index: number, item: T) => any>((index) => index);\r\n\r\n @ViewChild(CdkVirtualScrollViewport) private viewport?: CdkVirtualScrollViewport;\r\n\r\n /**\r\n * Scrolls the virtual viewport so the row at `index` (into `renderData()`)\r\n * lands at the top.\r\n *\r\n * Indexes are 0-based against the rendered rows, not the raw `data` input —\r\n * sorting/filtering already reduced it to what's actually on screen, and\r\n * jumping against the raw array would land on the wrong row the moment\r\n * either is active.\r\n */\r\n scrollToIndex(index: number, behavior: ScrollBehavior = 'smooth'): void {\r\n if (!this.isVirtual() || !this.viewport) return;\r\n if (index < 0 || index >= this.renderData().length) return;\r\n\r\n this.viewport.scrollToIndex(index, behavior);\r\n }\r\n\r\n /* ================= Column sizing ================= */\r\n\r\n /**\r\n * Hold the columns still once they have been measured.\r\n *\r\n * A table left on `table-layout: auto` sizes its columns from whatever\r\n * content is currently on screen, so sorting, filtering or paging — none of\r\n * which change the columns — visibly resizes them. Freezing the proportions\r\n * after the first real layout keeps the header from jumping under the\r\n * pointer that just clicked it.\r\n *\r\n * Turn it off if the content genuinely should drive the widths on every\r\n * change. Columns with an explicit `width` are never overwritten either way.\r\n */\r\n stableColumnWidth = input(true);\r\n\r\n /* ================= Outputs ================= */\r\n\r\n /** Everything the server needs to reproduce the current view. */\r\n queryParams = output<BkTableQueryParams>();\r\n /** The rows actually rendered, after filter/sort/paging. */\r\n currentPageDataChange = output<readonly T[]>();\r\n\r\n /* ================= Projected slots ================= */\r\n\r\n @ContentChild(BkTableTitle) titleContent?: BkTableTitle;\r\n @ContentChild(BkTableFooter) footerContent?: BkTableFooter;\r\n @ContentChild(BkVirtualScroll) virtualScroll?: BkVirtualScroll;\r\n\r\n /* ================= Column registry ================= */\r\n\r\n /**\r\n * Registered `th[bk-th]` instances. Sorting and filtering are driven by\r\n * column state, so the pipeline below reads through this signal — replacing\r\n * the array (rather than mutating it) is what makes the computeds re-run.\r\n */\r\n readonly columns = signal<BkColumnRef[]>([]);\r\n\r\n registerColumn(column: BkColumnRef): void {\r\n this.columns.update((list) => [...list, column]);\r\n }\r\n\r\n unregisterColumn(column: BkColumnRef): void {\r\n this.columns.update((list) => list.filter((c) => c !== column));\r\n }\r\n\r\n /**\r\n * Re-emits query params. Columns call this when their sort or filter\r\n * changes; the data pipeline reacts on its own through signals, so this\r\n * exists purely to notify the consumer.\r\n */\r\n onColumnStateChange(): void {\r\n // A filter narrowing the row set can strand the user past the last page.\r\n if (this.frontPagination() && this.pageIndex() !== 1) {\r\n this.pageIndex.set(1);\r\n }\r\n this.emitQueryParams();\r\n }\r\n\r\n /* ================= Data pipeline ================= */\r\n\r\n /**\r\n * Rows surviving every column's client-side filter. Columns whose filter is\r\n * handled server-side contribute nothing here.\r\n */\r\n private readonly filtered = computed<readonly T[]>(() => {\r\n const active = this.columns().filter(\r\n (c) => c.clientFilterFn && c.filterValue().length > 0\r\n );\r\n if (!active.length) return this.data();\r\n\r\n return this.data().filter((row) =>\r\n active.every((c) => c.clientFilterFn!(c.filterValue(), row))\r\n );\r\n });\r\n\r\n /**\r\n * Filtered rows in sort order.\r\n *\r\n * Multi-sort runs columns by descending `sortPriority`, and comparators are\r\n * applied in that order until one breaks the tie — so a priority-2 column\r\n * only orders rows a priority-3 column considers equal.\r\n */\r\n private readonly sorted = computed<readonly T[]>(() => {\r\n const active = this.columns()\r\n .filter((c) => c.clientSortFn && c.sortOrder() !== null)\r\n .sort((a, b) => (b.sortPriority ?? 0) - (a.sortPriority ?? 0));\r\n\r\n if (!active.length) return this.filtered();\r\n\r\n // Copy first: sort mutates, and the input array belongs to the consumer.\r\n return [...this.filtered()].sort((rowA, rowB) => {\r\n for (const column of active) {\r\n const order = column.sortOrder();\r\n const result = column.clientSortFn!(rowA, rowB, order);\r\n if (result !== 0) return order === 'descend' ? -result : result;\r\n }\r\n return 0;\r\n });\r\n });\r\n\r\n /** Row count before paging — what the pager needs to size itself. */\r\n readonly totalCount = computed(() =>\r\n this.frontPagination() ? this.sorted().length : this.total()\r\n );\r\n\r\n /**\r\n * The rows to render. Iterate this in your `<tbody>`, not the raw input:\r\n * it is the input after filtering, sorting and paging.\r\n */\r\n readonly renderData = computed<readonly T[]>(() => {\r\n // Virtual scroll windows the DOM itself — slicing to a page on top of that\r\n // would cap the viewport at `pageSize` rows and defeat the point of it.\r\n if (!this.frontPagination() || this.isVirtual()) return this.sorted();\r\n\r\n const size = this.pageSize();\r\n const start = (this.pageIndex() - 1) * size;\r\n return this.sorted().slice(start, start + size);\r\n });\r\n\r\n readonly isVirtual = computed(() => this.virtualItemSize() > 0);\r\n\r\n /**\r\n * Column widths for the virtual-scroll `<colgroup>`.\r\n *\r\n * Virtual scroll splits the header and body into two tables, so they can no\r\n * longer size each other — a shared colgroup is what keeps their columns\r\n * lined up, and it needs a declared width per column to do it.\r\n */\r\n readonly colWidths = computed(() => this.columns().map((c) => c.width));\r\n\r\n /* ================= Derived view state ================= */\r\n\r\n readonly hasTitle = computed(() => !!this.title() || !!this.titleContent);\r\n readonly hasFooter = computed(() => !!this.footer() || !!this.footerContent);\r\n readonly isEmpty = computed(() => !this.loading() && this.renderData().length === 0);\r\n\r\n /** Floor for the empty state's home: `.bk-table-empty` is absolutely\r\n * positioned against this container (see table.css), so without either\r\n * `scroll.y` or this fallback it'd have a ~0px-tall box to center in\r\n * (just the header row, since an empty `<tbody>` contributes nothing)\r\n * and get clipped by `overflow-auto`. */\r\n private static readonly EMPTY_STATE_MIN_HEIGHT = '350px';\r\n\r\n readonly containerStyle = computed(() => {\r\n const { y, fill } = this.scroll();\r\n if (!y) {\r\n return this.isEmpty() ? { 'min-height': BkTable.EMPTY_STATE_MIN_HEIGHT } : {};\r\n }\r\n return { [fill ? 'height' : 'max-height']: y, 'overflow-y': 'auto' };\r\n });\r\n\r\n /** Set once the columns have been measured and pinned. */\r\n readonly layoutFixed = signal(false);\r\n\r\n readonly tableStyle = computed(() => {\r\n const { x } = this.scroll();\r\n const style: Record<string, string> = {};\r\n\r\n // `min-width` alone regresses the table's floor from \"100% of container\"\r\n // (the `.bk-table` class's `min-w-full`) down to just `x`, because an\r\n // inline style always wins over a class rule for the same property — so\r\n // without an explicit `width` here too, a container wider than `x` left\r\n // the table (and every column sized off it) narrower than its own frame.\r\n if (x) {\r\n style['width'] = '100%';\r\n style['min-width'] = x;\r\n }\r\n // `fixed` is what actually stops content from resizing columns; a declared\r\n // scroll width implies it too, since the point of one is a stable grid.\r\n if (x || this.layoutFixed()) style['table-layout'] = 'fixed';\r\n\r\n return style;\r\n });\r\n\r\n /* ================= Layout measurement ================= */\r\n\r\n @ViewChild('virtualHead') virtualHead?: ElementRef<HTMLElement>;\r\n\r\n private headResizeObserver?: ResizeObserver;\r\n private layoutResizeObserver?: ResizeObserver;\r\n\r\n ngAfterViewInit(): void {\r\n this.observeHeaderHeight();\r\n this.observeTableVisibility();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.headResizeObserver?.disconnect();\r\n this.layoutResizeObserver?.disconnect();\r\n }\r\n\r\n /**\r\n * Publishes the first header row's height as `--bk-thead-row-1`.\r\n *\r\n * A grouped header's second row has to stick *below* the first, which means\r\n * knowing how tall the first is — and that changes with density, with font\r\n * loading, and with any header that wraps. Measuring it is the only offset\r\n * that stays correct; a constant is right for exactly one configuration.\r\n */\r\n private observeHeaderHeight(): void {\r\n const thead = this.host.nativeElement.querySelector('thead');\r\n if (!thead) return;\r\n\r\n const apply = () => {\r\n const firstRow = thead.querySelector('tr') as HTMLElement | null;\r\n if (!firstRow) return;\r\n this.host.nativeElement.style.setProperty(\r\n '--bk-thead-row-1',\r\n `${firstRow.offsetHeight}px`\r\n );\r\n };\r\n\r\n apply();\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.zone.runOutsideAngular(() => {\r\n this.headResizeObserver = new ResizeObserver(apply);\r\n this.headResizeObserver.observe(thead);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Two unrelated jobs that both boil down to \"re-check this whenever the\r\n * table's or the container's box size changes,\" so one `ResizeObserver`\r\n * watching both elements does them together.\r\n *\r\n * **Retries the column freeze.** A table that mounts inside a `[hidden]`\r\n * ancestor — a collapsed `tr[bkExpand]` holding a nested `bk-table`, most\r\n * commonly — measures 0 on its first freeze attempt, so\r\n * `freezeColumnWidths()` correctly declines to pin widths it can't see\r\n * (`if (!tableWidth) return;`). Nothing else ever asks it to try again: the\r\n * constructor effect only reruns when one of its own signals changes, and\r\n * none of them do just because the table became visible. Left alone, that\r\n * table stays on `table-layout: auto` forever — and an auto-layout cell\r\n * can't give a nested table's `min-width: 100%` a real number to resolve\r\n * against, which is what leaves a nested `bk-table` stuck at its own\r\n * shrink-to-fit width even after the row expands. Once `layoutFixed` is\r\n * true the call is a no-op, so this can just stay connected for the\r\n * table's life rather than tracking whether it still needs to be.\r\n *\r\n * **Tracks whether the rows fall short of the container.** See\r\n * `updateUnderfilled`.\r\n */\r\n private observeTableVisibility(): void {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n\r\n const table = this.host.nativeElement.querySelector('table.bk-table') as HTMLElement | null;\r\n const container = this.host.nativeElement.querySelector('.bk-table-container') as HTMLElement | null;\r\n if (!table) return;\r\n\r\n this.zone.runOutsideAngular(() => {\r\n this.layoutResizeObserver = new ResizeObserver(() => {\r\n if (\r\n !this.layoutFixed() &&\r\n this.stableColumnWidth() &&\r\n !this.isVirtual() &&\r\n this.renderData().length > 0\r\n ) {\r\n this.freezeColumnWidths();\r\n }\r\n this.updateUnderfilled(table, container);\r\n });\r\n this.layoutResizeObserver.observe(table);\r\n if (container) this.layoutResizeObserver.observe(container);\r\n });\r\n }\r\n\r\n /**\r\n * Marks the host when rows end well short of a reserved `scroll.y`\r\n * (`fill`, most commonly) height, so `.bk-table-underfilled` in the\r\n * stylesheet can close the real data off with a border instead of letting\r\n * it trail into blank reserved space with nothing marking where it\r\n * stopped. Left off whenever rows fill or overflow the container — the\r\n * frame's own border (or the scroll cutoff) already closes those cases,\r\n * and adding another border would double up against it.\r\n */\r\n private updateUnderfilled(table: HTMLElement, container: HTMLElement | null): void {\r\n if (!container) return;\r\n const underfilled = table.offsetHeight < container.clientHeight;\r\n this.host.nativeElement.classList.toggle('bk-table-underfilled', underfilled);\r\n }\r\n\r\n /**\r\n * Pins the columns at the proportions auto layout arrived at.\r\n *\r\n * Widths are stored as percentages, not pixels: under `table-layout: fixed`\r\n * a percentage resolves against the table, so the columns keep their\r\n * relationship when the container resizes. Pixels would freeze the table at\r\n * whatever width it happened to have when the rows first arrived.\r\n *\r\n * Only the first header row is written to — that is the row `table-layout:\r\n * fixed` reads widths from. A grouped header's second row inherits its share\r\n * of whatever the group above it was given.\r\n */\r\n private freezeColumnWidths(): void {\r\n const table = this.host.nativeElement.querySelector('table.bk-table') as HTMLTableElement | null;\r\n const row = table?.tHead?.rows[0];\r\n if (!table || !row?.cells.length) return;\r\n\r\n const tableWidth = table.offsetWidth;\r\n if (!tableWidth) return;\r\n\r\n const cells = Array.from(row.cells);\r\n // Read every width before writing any: the first write invalidates layout,\r\n // so measuring and assigning in one pass would size each column against\r\n // the columns already changed ahead of it.\r\n const widths = cells.map((cell) => cell.offsetWidth);\r\n\r\n cells.forEach((cell, index) => {\r\n // A declared `width` is an instruction, not a measurement. Leave it.\r\n if (cell.style.width) return;\r\n cell.style.width = `${((widths[index] / tableWidth) * 100).toFixed(4)}%`;\r\n this.frozenCells.push(cell);\r\n });\r\n\r\n this.frozenColumnCount = this.columns().length;\r\n this.layoutFixed.set(true);\r\n }\r\n\r\n /** The cells this component wrote a width to, so it can undo exactly those. */\r\n private frozenCells: HTMLTableCellElement[] = [];\r\n /** Column count the frozen widths were measured against. */\r\n private frozenColumnCount = -1;\r\n /** Guards against stacking timeouts while columns are still registering. */\r\n private freezeScheduled = false;\r\n\r\n /**\r\n * Drops the frozen widths so the columns are measured again. Call it after\r\n * replacing the dataset with one whose shape is different enough that the\r\n * old proportions no longer suit it.\r\n */\r\n remeasureColumns(): void {\r\n this.frozenCells.forEach((cell) => (cell.style.width = ''));\r\n this.frozenCells = [];\r\n this.frozenColumnCount = -1;\r\n this.layoutFixed.set(false);\r\n }\r\n\r\n /**\r\n * Keeps the detached virtual-scroll header aligned with the body it no\r\n * longer shares a table with.\r\n */\r\n onViewportScroll(event: Event): void {\r\n const head = this.virtualHead?.nativeElement;\r\n if (!head) return;\r\n head.scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n }\r\n\r\n /* ================= Pagination ================= */\r\n\r\n onPageIndexChange(index: number): void {\r\n if (index === this.pageIndex()) return;\r\n this.pageIndex.set(index);\r\n this.emitQueryParams();\r\n }\r\n\r\n onPageSizeChange(size: number): void {\r\n if (size === this.pageSize()) return;\r\n this.pageSize.set(size);\r\n // Row 1 of the old page size is rarely row 1 of the new one; restarting is\r\n // the only landing spot that is meaningful at any size.\r\n this.pageIndex.set(1);\r\n this.emitQueryParams();\r\n }\r\n\r\n /* ================= Reset ================= */\r\n\r\n /** Clears every column's sort. Backs \"reset sorters\" in the demo. */\r\n clearSort(): void {\r\n this.columns().forEach((c) => c.clearSort());\r\n this.emitQueryParams();\r\n }\r\n\r\n /** Clears every column's filter selection. */\r\n clearFilter(): void {\r\n this.columns().forEach((c) => c.clearFilter());\r\n this.emitQueryParams();\r\n }\r\n\r\n /** Clears sorts and filters together and returns to the first page. */\r\n reset(): void {\r\n this.columns().forEach((c) => {\r\n c.clearSort();\r\n c.clearFilter();\r\n });\r\n this.pageIndex.set(1);\r\n this.emitQueryParams();\r\n }\r\n\r\n /* ================= Query params ================= */\r\n\r\n private emitQueryParams(): void {\r\n const columns = this.columns();\r\n\r\n this.queryParams.emit({\r\n pageIndex: this.pageIndex(),\r\n pageSize: this.pageSize(),\r\n sort: columns\r\n .filter((c) => c.columnKey)\r\n .map((c) => ({ key: c.columnKey!, value: c.sortOrder() })),\r\n filter: columns\r\n .filter((c) => c.columnKey && c.filterValue().length)\r\n .map((c) => ({ key: c.columnKey!, value: c.filterValue() }))\r\n });\r\n }\r\n}\r\n","<!--\r\n Projection slots live inside <ng-template> rather than directly in the\r\n branches below. A given <ng-content> can only be declared once — repeating\r\n the same selector in both the virtual and normal branches would leave one of\r\n them permanently empty. Wrapping each slot in a template declares it once and\r\n lets an outlet place it wherever it is needed.\r\n-->\r\n<ng-template #headSlot><ng-content select=\"thead\"></ng-content></ng-template>\r\n<ng-template #bodySlot><ng-content select=\"tbody\"></ng-content></ng-template>\r\n<ng-template #footSlot><ng-content select=\"tfoot\"></ng-content></ng-template>\r\n\r\n<div\r\n class=\"bk-table-wrapper\"\r\n [class.bk-table-bordered]=\"bordered()\"\r\n [ngClass]=\"sizeClass()\"\r\n>\r\n <!--\r\n The frame is one box, and it is the only box that draws an outline or a\r\n corner. Radius on the header cells and border on the table (or on the title\r\n bar) means two boxes describing the same corner from different places, and\r\n they disagree the moment a title bar appears above the header. Everything\r\n inside here draws separators only; `overflow: hidden` clips them to the curve.\r\n -->\r\n <div class=\"bk-table-frame\">\r\n @if (hasTitle()) {\r\n <div class=\"bk-table-title-bar\">\r\n @if (title()) {\r\n {{ title() }}\r\n }\r\n <ng-content select=\"[bkTableTitle]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <div class=\"bk-table-container\" [ngStyle]=\"containerStyle()\">\r\n @if (isVirtual() && virtualScroll) {\r\n <!--\r\n Header and body are two separate tables here, which they are not in any\r\n other mode. The CDK viewport scrolls by translating its content wrapper,\r\n and a transformed ancestor takes over as the containing block for\r\n sticky descendants — so a header inside the viewport gets dragged along\r\n by the very transform it is supposed to stay still against. Lifting it\r\n out is the only way it stays put.\r\n\r\n The cost is that the two tables can no longer size each other, so a\r\n shared <colgroup> holds their columns in alignment and the body's\r\n horizontal scroll is mirrored onto the header by hand.\r\n -->\r\n <div #virtualHead class=\"bk-table-virtual-head\">\r\n <table class=\"bk-table\" [ngStyle]=\"tableStyle()\">\r\n <colgroup>\r\n @for (width of colWidths(); track $index) {\r\n <col [style.width]=\"width\" />\r\n }\r\n </colgroup>\r\n <ng-container [ngTemplateOutlet]=\"headSlot\"></ng-container>\r\n </table>\r\n </div>\r\n\r\n <cdk-virtual-scroll-viewport\r\n class=\"bk-table-viewport\"\r\n [itemSize]=\"virtualItemSize()\"\r\n [style.height]=\"scroll().y || '400px'\"\r\n (scroll)=\"onViewportScroll($event)\"\r\n >\r\n <table class=\"bk-table\" [ngStyle]=\"tableStyle()\">\r\n <colgroup>\r\n @for (width of colWidths(); track $index) {\r\n <col [style.width]=\"width\" />\r\n }\r\n </colgroup>\r\n <tbody>\r\n <ng-container\r\n *cdkVirtualFor=\"\r\n let row of renderData();\r\n let i = index;\r\n trackBy: virtualTrackBy()\r\n \"\r\n [ngTemplateOutlet]=\"virtualScroll.templateRef\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\r\n ></ng-container>\r\n </tbody>\r\n <ng-container [ngTemplateOutlet]=\"footSlot\"></ng-container>\r\n </table>\r\n </cdk-virtual-scroll-viewport>\r\n } @else {\r\n <table class=\"bk-table\" [ngStyle]=\"tableStyle()\">\r\n <ng-container [ngTemplateOutlet]=\"headSlot\"></ng-container>\r\n <ng-container [ngTemplateOutlet]=\"bodySlot\"></ng-container>\r\n <ng-container [ngTemplateOutlet]=\"footSlot\"></ng-container>\r\n </table>\r\n }\r\n\r\n @if (loading() && showLoadingOverlay()) {\r\n <div class=\"bk-table-loading\">\r\n <span class=\"bk-table-spinner\"></span>\r\n </div>\r\n }\r\n\r\n @if (isEmpty()) {\r\n <div class=\"bk-table-empty\">\r\n @if (!emptyImageFailed()) {\r\n <img\r\n [src]=\"noResultImage()\"\r\n class=\"bk-table-empty-img\"\r\n alt=\"No data found\"\r\n (error)=\"onEmptyImageError()\"\r\n />\r\n }\r\n <span class=\"bk-table-empty-text\">{{ noResultText() }}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (hasFooter()) {\r\n <div class=\"bk-table-footer-bar\">\r\n @if (footer()) {\r\n {{ footer() }}\r\n }\r\n <ng-content select=\"[bkTableFooter]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Inside the frame: the pager belongs to the table it drives, and the\r\n frame's bottom edge is what closes the card around both.\r\n\r\n `!isEmpty()`, not `totalCount() > 0`: in server mode `totalCount()`\r\n is just the `total` input, which can say more rows exist than are\r\n actually on screen right now (a search with no matches but a stale\r\n total, a page past the end) — the pager has nothing to page through\r\n either way, so it goes by what's actually rendered. -->\r\n @if (showPagination() && !isEmpty()) {\r\n <div class=\"bk-table-pagination\">\r\n <bk-pagination\r\n [total]=\"totalCount()\"\r\n [pageSize]=\"pageSize()\"\r\n [activePage]=\"pageIndex()\"\r\n (pageChanged)=\"onPageIndexChange($event)\"\r\n (changePageSize)=\"onPageSizeChange($event)\"\r\n ></bk-pagination>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n NgZone,\r\n OnDestroy,\r\n inject,\r\n input,\r\n signal\r\n} from '@angular/core';\r\nimport { BkCellAlign } from './table.model';\r\n\r\n/**\r\n * Behaviour shared by `th[bk-th]` and `td[bk-td]`: fixed columns, text\r\n * overflow handling and alignment.\r\n *\r\n * Fixed columns are `position: sticky`, which needs a pixel offset — and the\r\n * correct offset is the cell's distance from the edge of the table, which is\r\n * only knowable after layout. Subclasses get that measurement for free.\r\n */\r\n@Directive()\r\nexport abstract class BkCellBase implements AfterViewInit, OnDestroy {\r\n protected readonly el = inject(ElementRef<HTMLTableCellElement>);\r\n private readonly zone = inject(NgZone);\r\n\r\n /**\r\n * Pin this column to the left edge while the table scrolls horizontally.\r\n * `true` measures the offset; a string sets it explicitly.\r\n *\r\n * Pinned columns must be contiguous from the edge — a gap leaves the columns\r\n * beyond it overlapping as they scroll underneath.\r\n */\r\n left = input<boolean | string>(false);\r\n\r\n /** Pin to the right edge. Same rules as `left`. */\r\n right = input<boolean | string>(false);\r\n\r\n /**\r\n * Truncate overflow with an ellipsis instead of wrapping.\r\n *\r\n * Put it on the `td`, not the `th`. It works by setting `max-width: 0` on\r\n * whichever cell carries it, and `table-layout: fixed` sizes a column from\r\n * its header cell alone — a `max-width` on the header collapses the whole\r\n * column toward zero regardless of any declared `width`. A `td`'s own width\r\n * is never consulted by `fixed` layout, so the same rule there only clips\r\n * the content, which is the point.\r\n */\r\n ellipsis = input(false);\r\n\r\n /**\r\n * Allow breaks *inside* words. Without it a long unbroken string (a URL, an\r\n * ID) pushes past the cell instead of wrapping.\r\n */\r\n breakWord = input(false);\r\n\r\n align = input<BkCellAlign | null>(null);\r\n\r\n /** Resolved sticky offsets, written after measurement. */\r\n protected readonly stickyLeft = signal<string | null>(null);\r\n protected readonly stickyRight = signal<string | null>(null);\r\n\r\n private resizeObserver?: ResizeObserver;\r\n\r\n get isSticky(): boolean {\r\n return this.left() !== false || this.right() !== false;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.isSticky) return;\r\n\r\n // Measuring synchronously here reads a layout that hasn't happened yet.\r\n // A table with many rows registers hundreds of these cells in one\r\n // synchronous pass, before the browser has laid out any of them — an\r\n // immediate `offsetWidth` read comes back 0, not \"not yet available\",\r\n // so nothing downstream can tell the difference from a genuinely\r\n // zero-width column. Deferring past the current task is what\r\n // `BkTable.freezeColumnWidths()` already does for the identical\r\n // problem; a plain event listener wouldn't fire without a real resize\r\n // to trigger it, so it can't stand in for this first measurement.\r\n this.zone.runOutsideAngular(() => {\r\n setTimeout(() => this.measure());\r\n });\r\n\r\n // Column widths move with the table, not with Angular's change detection,\r\n // so the offsets have to be recomputed from a layout signal. Watching the\r\n // table (not the cell) catches sibling columns resizing too.\r\n const table = this.el.nativeElement.closest('table');\r\n if (table && typeof ResizeObserver !== 'undefined') {\r\n this.zone.runOutsideAngular(() => {\r\n this.resizeObserver = new ResizeObserver(() => this.measure());\r\n this.resizeObserver.observe(table);\r\n });\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.resizeObserver?.disconnect();\r\n }\r\n\r\n /**\r\n * Resolves the sticky offsets.\r\n *\r\n * Offsets are summed from sibling `offsetWidth`s rather than read from\r\n * `getBoundingClientRect()`: once a cell is sticky its rect reflects where it\r\n * has been *held*, not where the column sits, so measuring a scrolled table\r\n * that way feeds each cell its own displacement back. `offsetWidth` is\r\n * unaffected by the sticky shift.\r\n */\r\n protected measure(): void {\r\n const cell = this.el.nativeElement as HTMLTableCellElement;\r\n\r\n const leftInput = this.left();\r\n if (leftInput !== false) {\r\n this.stickyLeft.set(\r\n typeof leftInput === 'string' ? leftInput : `${this.sumWidths(cell, 'previous')}px`\r\n );\r\n }\r\n\r\n const rightInput = this.right();\r\n if (rightInput !== false) {\r\n this.stickyRight.set(\r\n typeof rightInput === 'string' ? rightInput : `${this.sumWidths(cell, 'next')}px`\r\n );\r\n }\r\n }\r\n\r\n private sumWidths(cell: HTMLElement, direction: 'previous' | 'next'): number {\r\n let total = 0;\r\n let sibling =\r\n direction === 'previous' ? cell.previousElementSibling : cell.nextElementSibling;\r\n\r\n while (sibling) {\r\n total += (sibling as HTMLElement).offsetWidth;\r\n sibling =\r\n direction === 'previous' ? sibling.previousElementSibling : sibling.nextElementSibling;\r\n }\r\n\r\n return total;\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, OnDestroy, OnInit, ViewEncapsulation, computed, inject, input, model, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkCheckbox } from '../checkbox/checkbox';\r\nimport { BkRadioButton } from '../radio/radio';\r\nimport { BkPopover } from '../popover/popover';\r\nimport { BkCellBase } from './table-cell-base';\r\nimport { BkTable, BkColumnRef } from './table';\r\nimport { BkFilterFn, BkFilterOption, BkSortFn, BkSortOrder, BkTableSelection } from './table.model';\r\n\r\n/**\r\n * Header cell.\r\n *\r\n * Carries a column's sort state, filter menu and select-all checkbox, and\r\n * registers itself with the parent `bk-table` so the table's data pipeline can\r\n * read them. It renders whatever you project as the label:\r\n *\r\n * <th bk-th [sortFn]=\"byName\" [filters]=\"statuses\" [filterFn]=\"byStatus\">\r\n * Name\r\n * </th>\r\n *\r\n * Use the native `colspan` / `rowspan` attributes for grouped headers — they\r\n * need no wrapper input.\r\n */\r\n@Component({\r\n selector: 'th[bk-th]',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BkCheckbox, BkRadioButton, BkPopover],\r\n templateUrl: './table-th.html',\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'bk-th',\r\n '[class.bk-th-sortable]': 'showSort()',\r\n '[class.bk-cell-selection]': 'checkbox()',\r\n '[class.bk-cell-sticky]': 'isSticky',\r\n '[class.bk-cell-sticky-left]': 'left() !== false',\r\n '[class.bk-cell-sticky-right]': 'right() !== false',\r\n '[class.bk-cell-ellipsis]': 'ellipsis()',\r\n '[class.bk-cell-break-word]': 'breakWord()',\r\n '[class.bk-th-align-right]': \"align() === 'right'\",\r\n '[class.bk-th-align-center]': \"align() === 'center'\",\r\n '[style.left]': 'stickyLeft()',\r\n '[style.right]': 'stickyRight()',\r\n '[style.width]': 'widthInput()',\r\n '[style.text-align]': 'align()'\r\n }\r\n})\r\nexport class BkTh extends BkCellBase implements BkColumnRef, OnInit, OnDestroy {\r\n /** Optional: the parent table only exists when the th is inside one. */\r\n private readonly table = inject(BkTable, { optional: true, host: false });\r\n\r\n /** Identifies the column in `queryParams`. Required for server-side work. */\r\n columnKeyInput = input<string | null>(null, { alias: 'columnKey' });\r\n\r\n /**\r\n * Column width. Required in virtual-scroll mode, where the header is a\r\n * separate table and has no body cells to size itself against.\r\n */\r\n widthInput = input<string | null>(null, { alias: 'width' });\r\n\r\n /** Plain-value views of the inputs, so the table can read them off BkColumnRef. */\r\n get columnKey(): string | null {\r\n return this.columnKeyInput();\r\n }\r\n\r\n get width(): string | null {\r\n return this.widthInput();\r\n }\r\n\r\n /* ================= Sorting ================= */\r\n\r\n /**\r\n * A comparator sorts client-side; `true` marks the column sortable but\r\n * leaves the sorting to the server.\r\n */\r\n sortFn = input<BkSortFn | null>(null);\r\n\r\n sortOrder = model<BkSortOrder>(null);\r\n\r\n /** The cycle the header steps through on each click. */\r\n sortDirections = input<BkSortOrder[]>(['ascend', 'descend', null]);\r\n\r\n /**\r\n * Ranks this column against other sorted columns — higher wins. Columns\r\n * without a priority sort in registration order after those with one.\r\n */\r\n sortPriorityInput = input<number | null>(null, { alias: 'sortPriority' });\r\n\r\n /* ================= Filtering ================= */\r\n\r\n /** Options for the filter menu. An empty list hides the funnel icon. */\r\n filters = input<BkFilterOption[]>([]);\r\n\r\n /** Predicate for client-side filtering, or `true` to defer to the server. */\r\n filterFn = input<BkFilterFn | null>(null);\r\n\r\n /** Multiple shows checkboxes; single shows radios and closes on pick. */\r\n filterMultiple = input(true);\r\n\r\n /* ================= Selection ================= */\r\n\r\n checkbox = input(false);\r\n checked = model(false);\r\n indeterminate = input(false);\r\n disabled = input(false);\r\n\r\n /**\r\n * Extra entries in the select-all dropdown (\"Select odd rows\", …). Providing\r\n * any adds a caret beside the checkbox.\r\n */\r\n selections = input<BkTableSelection[]>([]);\r\n\r\n /* ================= Expand column ================= */\r\n\r\n /** Reserves the narrow width used by the expand-icon column. */\r\n showExpand = input(false);\r\n\r\n /* ================= Internal state ================= */\r\n\r\n readonly filterValue = signal<any[]>([]);\r\n /** Menu selection while the popover is open, before OK is pressed. */\r\n readonly pendingFilter = signal<any[]>([]);\r\n\r\n readonly showSort = computed(() => this.sortFn() !== null);\r\n readonly showFilter = computed(() => this.filters().length > 0);\r\n readonly isFiltered = computed(() => this.filterValue().length > 0);\r\n\r\n /** Only comparators run in-process; `true` means the server sorts. */\r\n get clientSortFn(): ((a: any, b: any, order: BkSortOrder) => number) | null {\r\n const fn = this.sortFn();\r\n return typeof fn === 'function' ? fn : null;\r\n }\r\n\r\n get clientFilterFn(): ((selected: any[], item: any) => boolean) | null {\r\n const fn = this.filterFn();\r\n return typeof fn === 'function' ? fn : null;\r\n }\r\n\r\n get sortPriority(): number | null {\r\n return this.sortPriorityInput();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Options marked byDefault are active before the menu is ever opened.\r\n const defaults = this.filters().filter((f) => f.byDefault).map((f) => f.value);\r\n if (defaults.length) {\r\n this.filterValue.set(defaults);\r\n this.pendingFilter.set(defaults);\r\n }\r\n\r\n this.table?.registerColumn(this);\r\n }\r\n\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this.table?.unregisterColumn(this);\r\n }\r\n\r\n /* ================= Sort interaction ================= */\r\n\r\n /** Advances to the next order in `sortDirections`, wrapping at the end. */\r\n onSortClick(): void {\r\n if (!this.showSort()) return;\r\n\r\n const cycle = this.sortDirections();\r\n const next = cycle[(cycle.indexOf(this.sortOrder()) + 1) % cycle.length];\r\n\r\n this.sortOrder.set(next);\r\n this.table?.onColumnStateChange();\r\n }\r\n\r\n clearSort(): void {\r\n this.sortOrder.set(null);\r\n }\r\n\r\n /* ================= Filter interaction ================= */\r\n\r\n isPending(value: any): boolean {\r\n return this.pendingFilter().includes(value);\r\n }\r\n\r\n /**\r\n * Single-select view of the pending selection, for the radio list. The\r\n * underlying state stays an array in both modes so the filter predicate has\r\n * one shape to handle.\r\n */\r\n get singleFilter(): any {\r\n return this.pendingFilter()[0] ?? null;\r\n }\r\n\r\n set singleFilter(value: any) {\r\n this.pendingFilter.set(value === null || value === undefined ? [] : [value]);\r\n }\r\n\r\n toggleFilterOption(value: any, selected: boolean): void {\r\n if (!this.filterMultiple()) {\r\n this.pendingFilter.set(selected ? [value] : []);\r\n return;\r\n }\r\n\r\n this.pendingFilter.update((list) =>\r\n selected ? [...list, value] : list.filter((v) => v !== value)\r\n );\r\n }\r\n\r\n applyFilter(popover?: BkPopover): void {\r\n this.filterValue.set([...this.pendingFilter()]);\r\n this.table?.onColumnStateChange();\r\n popover?.close();\r\n }\r\n\r\n resetFilter(popover?: BkPopover): void {\r\n this.pendingFilter.set([]);\r\n this.filterValue.set([]);\r\n this.table?.onColumnStateChange();\r\n popover?.close();\r\n }\r\n\r\n clearFilter(): void {\r\n this.filterValue.set([]);\r\n this.pendingFilter.set([]);\r\n }\r\n\r\n /** Re-syncs the menu to the applied state so a cancelled edit doesn't stick. */\r\n onFilterMenuOpen(): void {\r\n this.pendingFilter.set([...this.filterValue()]);\r\n }\r\n\r\n /* ================= Selection interaction ================= */\r\n\r\n onCheckedChange(value: boolean): void {\r\n this.checked.set(value);\r\n }\r\n\r\n runSelection(selection: BkTableSelection, popover?: BkPopover): void {\r\n selection.onSelect();\r\n popover?.close();\r\n }\r\n}\r\n","@if (checkbox()) {\r\n <!-- Selection column: checkbox, plus a caret when custom selections exist. -->\r\n <div class=\"bk-th-selection\">\r\n <bk-checkbox\r\n checkboxClass=\"sm\"\r\n [ngModel]=\"checked()\"\r\n (ngModelChange)=\"onCheckedChange($event)\"\r\n [disabled]=\"disabled()\"\r\n [class.bk-checkbox-indeterminate]=\"indeterminate() && !checked()\"\r\n ></bk-checkbox>\r\n\r\n @if (selections().length) {\r\n <!-- appendToBody: see the filter popover below — same containment problem. -->\r\n <bk-popover\r\n #selectionPop=\"bkPopover\"\r\n trigger=\"click\"\r\n placement=\"bottom-left\"\r\n [showArrow]=\"false\"\r\n [appendToBody]=\"true\"\r\n >\r\n <button type=\"button\" bkPopoverTrigger class=\"bk-th-selection-caret\" aria-label=\"Selection options\">\r\n <svg width=\"8\" height=\"5\" viewBox=\"0 0 8 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M4 4.25c-.175 0-.292-.058-.408-.175L.675 1.158a.664.664 0 0 1 0-.817.664.664 0 0 1 .817 0L4 2.85 6.508.341a.664.664 0 0 1 .817 0 .664.664 0 0 1 0 .817L4.408 4.075C4.292 4.192 4.175 4.25 4 4.25Z\"\r\n fill=\"#78829D\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"bk-table-menu\">\r\n @for (selection of selections(); track selection.text) {\r\n <li>\r\n <button type=\"button\" class=\"bk-table-menu-item\" (click)=\"runSelection(selection, selectionPop)\">\r\n {{ selection.text }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </bk-popover>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"bk-th-content\" [class.bk-th-clickable]=\"showSort()\">\r\n <!--\r\n Only the label triggers sorting. The filter icon sits outside this span so\r\n opening the menu doesn't also flip the sort order.\r\n -->\r\n <span class=\"bk-th-label\" (click)=\"onSortClick()\">\r\n <ng-content></ng-content>\r\n\r\n @if (showSort()) {\r\n <span\r\n class=\"bk-sort-icon\"\r\n [class.bk-sort-asc]=\"sortOrder() === 'ascend'\"\r\n [class.bk-sort-desc]=\"sortOrder() === 'descend'\"\r\n ></span>\r\n }\r\n\r\n @if (showSort() && sortPriority !== null && sortOrder() !== null) {\r\n <!-- Rank badge: without it, multi-sort gives no clue which column wins. -->\r\n <span class=\"bk-sort-priority\">{{ sortPriority }}</span>\r\n }\r\n </span>\r\n\r\n @if (showFilter()) {\r\n <!--\r\n appendToBody is not optional here. The panel is `position: fixed`, and a\r\n table puts two things in its way: the header cell is inside\r\n `.bk-table-container`, which scrolls, and any transformed ancestor would\r\n turn the panel's viewport coordinates into cell-relative ones. Relocating\r\n it to <body> is the only placement that survives both.\r\n -->\r\n <bk-popover\r\n #filterPop=\"bkPopover\"\r\n trigger=\"click\"\r\n placement=\"bottom-right\"\r\n [showArrow]=\"false\"\r\n panelClass=\"bk-filter-popover\"\r\n [appendToBody]=\"true\"\r\n (opened)=\"onFilterMenuOpen()\"\r\n >\r\n <button\r\n type=\"button\"\r\n bkPopoverTrigger\r\n class=\"bk-filter-trigger\"\r\n [class.bk-filter-active]=\"isFiltered()\"\r\n aria-label=\"Filter column\"\r\n >\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M1.5 2.5h13L9.5 8.2v4.6l-3 1.7V8.2L1.5 2.5Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.3\"\r\n stroke-linejoin=\"round\"\r\n [attr.fill]=\"isFiltered() ? 'currentColor' : 'none'\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <div class=\"bk-filter-menu\">\r\n <ul class=\"bk-filter-list\">\r\n @for (option of filters(); track option.value) {\r\n <li class=\"bk-filter-option\">\r\n @if (filterMultiple()) {\r\n <bk-checkbox\r\n checkboxClass=\"sm\"\r\n [label]=\"option.text\"\r\n [ngModel]=\"isPending(option.value)\"\r\n (ngModelChange)=\"toggleFilterOption(option.value, $event)\"\r\n ></bk-checkbox>\r\n } @else {\r\n <bk-radio-button\r\n [label]=\"option.text\"\r\n [value]=\"option.value\"\r\n [ngModel]=\"singleFilter\"\r\n (ngModelChange)=\"singleFilter = $event\"\r\n ></bk-radio-button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n\r\n <div class=\"bk-filter-actions\">\r\n <button type=\"button\" class=\"bk-filter-btn bk-filter-btn-link\" (click)=\"resetFilter(filterPop)\">\r\n Reset\r\n </button>\r\n <button type=\"button\" class=\"bk-filter-btn bk-filter-btn-primary\" (click)=\"applyFilter(filterPop)\">\r\n OK\r\n </button>\r\n </div>\r\n </div>\r\n </bk-popover>\r\n }\r\n </div>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, NgZone, OnDestroy, TemplateRef, ViewChild, ViewEncapsulation, computed, inject, input, model, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BkCheckbox } from '../checkbox/checkbox';\r\nimport { BKTooltipDirective } from '../tooltip/tooltip.directive';\r\nimport { BkCellBase } from './table-cell-base';\r\n\r\n/**\r\n * Body cell.\r\n *\r\n * Handles the parts of a cell the consumer shouldn't have to rebuild each\r\n * time — row checkbox, expand toggle, tree indentation, sticky positioning —\r\n * and projects everything else through untouched:\r\n *\r\n * <td bk-td [(checked)]=\"row.checked\"></td>\r\n * <td bk-td [showExpand]=\"row.hasChildren\" [(expand)]=\"row.expand\"\r\n * [indentLevel]=\"row.level\" [indentSize]=\"20\">{{ row.name }}</td>\r\n *\r\n * Use the native `colspan` / `rowspan` attributes for spanning cells.\r\n */\r\n@Component({\r\n selector: 'td[bk-td]',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, BkCheckbox, BKTooltipDirective],\r\n templateUrl: './table-td.html',\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'bk-td',\r\n '[class.bk-cell-selection]': 'checkbox()',\r\n '[class.bk-cell-sticky]': 'isSticky',\r\n '[class.bk-cell-sticky-left]': 'left() !== false',\r\n '[class.bk-cell-sticky-right]': 'right() !== false',\r\n '[class.bk-cell-ellipsis]': 'ellipsis()',\r\n '[class.bk-cell-break-word]': 'breakWord()',\r\n '[style.left]': 'stickyLeft()',\r\n '[style.right]': 'stickyRight()',\r\n '[style.text-align]': 'align()'\r\n }\r\n})\r\nexport class BkTd extends BkCellBase implements AfterViewInit, OnDestroy {\r\n private readonly ngZone = inject(NgZone);\r\n private ellipsisResizeObserver?: ResizeObserver;\r\n\r\n /**\r\n * The tooltip's content, and the switch for whether it shows at all — see\r\n * `observeEllipsisTruncation()`. Bound in the template onto the innermost\r\n * `.bk-td-ellipsis-text` span wrapping the projected content, not the `td`\r\n * or `.bk-td-content`: both of those are wider than the actual (possibly\r\n * truncated) text, and the tooltip should point at what's actually there.\r\n */\r\n protected readonly truncatedTooltip = signal('');\r\n\r\n /** Forwarded to the content wrapper's `bkTooltip`. Override on a column whose default 'right' would run into its neighbour. */\r\n tooltipPosition = input<'left' | 'right' | 'top' | 'bottom'>('right');\r\n\r\n /** Only present when `ellipsis()` is true — see the `@else` branch in the template. */\r\n @ViewChild('ellipsisText') private ellipsisTextRef?: ElementRef<HTMLElement>;\r\n\r\n /* ================= Selection ================= */\r\n\r\n checkbox = input(false);\r\n checked = model(false);\r\n disabled = input(false);\r\n indeterminate = input(false);\r\n\r\n /* ================= Expansion ================= */\r\n\r\n /**\r\n * Renders the expand toggle. Set it false on leaf rows in a tree — the cell\r\n * still reserves the icon's width so labels stay aligned down the column.\r\n */\r\n showExpand = input(false);\r\n expand = model(false);\r\n\r\n /**\r\n * Custom expand icon. The template receives the open state as `$implicit`:\r\n *\r\n * <ng-template #icon let-expanded>{{ expanded ? '−' : '+' }}</ng-template>\r\n */\r\n expandIcon = input<TemplateRef<{ $implicit: boolean }> | null>(null);\r\n\r\n /* ================= Tree indentation ================= */\r\n\r\n /** Depth of this row in the tree. Multiplied by `indentSize`. */\r\n indentLevel = input(0);\r\n /** Pixels of indent per level. */\r\n indentSize = input(20);\r\n\r\n /**\r\n * Marks the column that carries the tree. Leaf rows in such a column get a\r\n * blank spacer where the toggle would be, so their labels line up with the\r\n * labels of siblings that do have children — including at depth 0, where\r\n * indentation alone gives nothing to align against.\r\n */\r\n treeCell = input(false);\r\n\r\n /**\r\n * The projected content is block-level and should fill the cell — a nested\r\n * `bk-table`, most commonly — rather than the default shrink-to-fit inline\r\n * box that lets ordinary text/icon content size to itself and still honour\r\n * `align` via `text-align`. Turning this on trades that `align` behaviour\r\n * away for whatever the block content does with the full width itself.\r\n */\r\n block = input(false);\r\n\r\n readonly indentPx = computed(() => this.indentLevel() * this.indentSize());\r\n\r\n /** A tree cell with no toggle of its own still reserves the toggle's width. */\r\n readonly isLeafSpacer = computed(() => this.treeCell() && !this.showExpand());\r\n\r\n onExpandClick(): void {\r\n this.expand.set(!this.expand());\r\n }\r\n\r\n onCheckedChange(value: boolean): void {\r\n this.checked.set(value);\r\n }\r\n\r\n override ngAfterViewInit(): void {\r\n super.ngAfterViewInit();\r\n this.observeEllipsisTruncation();\r\n }\r\n\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this.ellipsisResizeObserver?.disconnect();\r\n }\r\n\r\n /**\r\n * Drives `truncatedTooltip` from measured truncation rather than the\r\n * content being present unconditionally: `bkTooltip`'s own emptiness check\r\n * already suppresses the tooltip when there's nothing to show, so setting\r\n * it only when the cell is genuinely clipped (`scrollWidth > clientWidth`)\r\n * is what makes it show \"for the truncated item only\" — an `ellipsis` cell\r\n * whose text happens to fit never gets a tooltip at all.\r\n *\r\n * Measures the inner `.bk-td-ellipsis-text` span, not the `td` — that span\r\n * is now the element that actually owns `overflow: hidden` (see\r\n * `.bk-td-ellipsis-text` in table.css, and why: the ellipsis marker needs\r\n * a plain, non-flex element to render on at all). Because it clips its own\r\n * overflow, that overflow never reaches the `td`'s own `scrollWidth`\r\n * anymore — measuring the `td` here would read `scrollWidth ===\r\n * clientWidth` even when the text is visibly cut off, since the span\r\n * absorbs it first.\r\n *\r\n * Measured on resize, not on hover: `bkTooltip`'s own `mouseenter` listener\r\n * fires independently of this, so content has to already be correct\r\n * *before* any hover — computing it reactively to the hover would risk\r\n * showing whatever was last set instead of what's true at that moment.\r\n */\r\n private observeEllipsisTruncation(): void {\r\n if (!this.ellipsis() || typeof ResizeObserver === 'undefined') return;\r\n\r\n const textEl = this.ellipsisTextRef?.nativeElement;\r\n if (!textEl) return;\r\n\r\n const update = () => {\r\n const truncated = textEl.scrollWidth > textEl.clientWidth;\r\n this.truncatedTooltip.set(truncated ? (textEl.textContent ?? '').trim() : '');\r\n };\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.ellipsisResizeObserver = new ResizeObserver(update);\r\n this.ellipsisResizeObserver.observe(textEl);\r\n });\r\n }\r\n}\r\n","@if (checkbox()) {\r\n <bk-checkbox\r\n checkboxClass=\"sm\"\r\n [ngModel]=\"checked()\"\r\n (ngModelChange)=\"onCheckedChange($event)\"\r\n [disabled]=\"disabled()\"\r\n [class.bk-checkbox-indeterminate]=\"indeterminate() && !checked()\"\r\n ></bk-checkbox>\r\n} @else {\r\n <span\r\n class=\"bk-td-content\"\r\n [class.bk-td-content-block]=\"block()\"\r\n [class.bk-td-content-ellipsis]=\"ellipsis()\"\r\n >\r\n @if (indentPx() > 0) {\r\n <!-- Depth is expressed as blank width, so the cell keeps one text flow\r\n and long labels still wrap under themselves rather than under the\r\n indent. -->\r\n <span class=\"bk-td-indent\" [style.padding-left.px]=\"indentPx()\"></span>\r\n }\r\n\r\n @if (showExpand()) {\r\n <button\r\n type=\"button\"\r\n class=\"bk-td-expand\"\r\n [class.bk-td-expand-open]=\"expand()\"\r\n [attr.aria-expanded]=\"expand()\"\r\n aria-label=\"Toggle row\"\r\n (click)=\"onExpandClick()\"\r\n >\r\n @if (expandIcon()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"expandIcon()!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: expand() }\"\r\n ></ng-container>\r\n } @else {\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M4 4.25c-.175 0-.292-.058-.408-.175L.675 1.158a.664.664 0 0 1 0-.817.664.664 0 0 1 .817 0L4 2.85 6.508.341a.664.664 0 0 1 .817 0 .664.664 0 0 1 0 .817L4.408 4.075C4.292 4.192 4.175 4.25 4 4.25Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n }\r\n </button>\r\n } @else if (isLeafSpacer()) {\r\n <span class=\"bk-td-expand-spacer\"></span>\r\n }\r\n\r\n <span\r\n #ellipsisText\r\n [class.bk-td-ellipsis-text]=\"ellipsis()\"\r\n [bkTooltip]=\"truncatedTooltip()\"\r\n [bkTooltipPosition]=\"tooltipPosition()\"\r\n >\r\n <ng-content></ng-content>\r\n </span>\r\n </span>\r\n}\r\n","import { Directive, input } from '@angular/core';\r\n\r\n/**\r\n * A detail row that appears beneath its parent when expanded.\r\n *\r\n * <tr [bkExpand]=\"row.expand\">\r\n * <td colspan=\"5\">…anything…</td>\r\n * </tr>\r\n *\r\n * The row is hidden rather than destroyed, so state inside it (a scrolled\r\n * nested table, a half-filled form) survives being collapsed and reopened.\r\n * Wrap it in `@if` instead when the content is expensive enough that keeping\r\n * it alive costs more than rebuilding it.\r\n */\r\n@Directive({\r\n selector: 'tr[bkExpand]',\r\n standalone: true,\r\n host: {\r\n class: 'bk-expanded-row',\r\n '[hidden]': '!bkExpand()'\r\n }\r\n})\r\nexport class BkTrExpand {\r\n bkExpand = input(false);\r\n}\r\n\r\n/**\r\n * Summary / totals rows, placed in a `<tfoot>`.\r\n *\r\n * <tfoot bkTableSummary [fixed]=\"true\">\r\n * <tr><td bk-td>Total</td><td bk-td>{{ total }}</td></tr>\r\n * </tfoot>\r\n *\r\n * `fixed` pins the footer to the bottom of the scroll container so totals stay\r\n * visible while the body scrolls — the counterpart to the fixed header.\r\n */\r\n@Directive({\r\n selector: 'tfoot[bkTableSummary]',\r\n standalone: true,\r\n host: {\r\n class: 'bk-table-summary',\r\n '[class.bk-table-summary-fixed]': 'fixed()'\r\n }\r\n})\r\nexport class BkTableSummary {\r\n fixed = input(false);\r\n}\r\n","import { CdkDragMove, CdkDragStart } from '@angular/cdk/drag-drop';\r\nimport { Directive, ElementRef, inject } from '@angular/core';\r\n\r\n/**\r\n * Makes CDK row dragging behave inside a `<table>`.\r\n *\r\n * Two problems the CDK doesn't solve on its own, both carried over from\r\n * `bk-grid` where they were already working:\r\n *\r\n * 1. The drag preview is a detached copy of the `<tr>`, so it loses the column\r\n * widths the table gave it and collapses to its content. Widths are copied\r\n * across at drag start — from the *placeholder*, not the dragged row: by\r\n * the time `cdkDragStarted` fires, the CDK has already swapped the row out\r\n * for the placeholder and moved the row itself out to `<body>`, so the row\r\n * is no longer sitting inside the table and no longer reports the table's\r\n * widths. The placeholder is a clone left in the row's place, still inside\r\n * the table, so it's the one still telling the truth.\r\n * 2. Dragging to the edge of a scrolling table doesn't scroll it, so rows below\r\n * the fold are unreachable. Nearing an edge scrolls proportionally to how\r\n * close the pointer is.\r\n *\r\n * <div class=\"wrap\" #d=\"bkTableDrag\" bkTableDrag>\r\n * <bk-table>\r\n * <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n * @for (row of rows; track row.id) {\r\n * <tr cdkDrag cdkDragLockAxis=\"y\"\r\n * (cdkDragStarted)=\"d.onStart($event)\"\r\n * (cdkDragMoved)=\"d.onMove($event)\">\r\n *\r\n * The scroll container is resolved from the host, so put this on the element\r\n * that actually scrolls (or any ancestor of it).\r\n */\r\n@Directive({\r\n selector: '[bkTableDrag]',\r\n standalone: true,\r\n exportAs: 'bkTableDrag'\r\n})\r\nexport class BkTableDrag {\r\n private readonly el = inject(ElementRef<HTMLElement>);\r\n\r\n /** Distance from an edge, in px, at which auto-scroll kicks in. */\r\n private readonly edgeThreshold = 80;\r\n /** Fastest scroll step per move event, in px. */\r\n private readonly maxScrollSpeed = 25;\r\n\r\n onStart(event: CdkDragStart): void {\r\n // Both the placeholder and the preview already exist by the time this\r\n // fires — the CDK creates and inserts them, in that order, before it\r\n // emits `started`. No need to defer the read; doing it synchronously\r\n // also means the preview is sized correctly on its very first frame\r\n // instead of visibly snapping to the right widths a tick later.\r\n const placeholder = document.querySelector('.cdk-drag-placeholder') as HTMLElement | null;\r\n const preview = document.querySelector('.cdk-drag-preview') as HTMLElement | null;\r\n if (!placeholder || !preview) return;\r\n\r\n const placeholderCells = placeholder.querySelectorAll('td');\r\n const previewCells = preview.querySelectorAll('td');\r\n\r\n placeholderCells.forEach((cell, index) => {\r\n const width = `${cell.getBoundingClientRect().width}px`;\r\n const previewCell = previewCells[index] as HTMLElement | undefined;\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 onMove(event: CdkDragMove): void {\r\n const container = this.scrollContainer();\r\n if (!container) return;\r\n\r\n const rect = container.getBoundingClientRect();\r\n const pointerY = event.pointerPosition.y - rect.top;\r\n\r\n if (pointerY < this.edgeThreshold) {\r\n const intensity = 1 - pointerY / this.edgeThreshold;\r\n container.scrollTop -= Math.min(this.maxScrollSpeed, intensity * this.maxScrollSpeed);\r\n } else if (pointerY > rect.height - this.edgeThreshold) {\r\n const intensity = 1 - (rect.height - pointerY) / this.edgeThreshold;\r\n container.scrollTop += Math.min(this.maxScrollSpeed, intensity * this.maxScrollSpeed);\r\n }\r\n }\r\n\r\n /**\r\n * The nearest descendant that actually scrolls. `bk-table` puts the overflow\r\n * on an inner container, so the host itself usually isn't the scroller.\r\n * Protected so `BkTreeDrag` can position its drop indicator inside it.\r\n */\r\n protected scrollContainer(): HTMLElement | null {\r\n const host = this.el.nativeElement as HTMLElement;\r\n const inner = host.querySelector('.bk-table-container') as HTMLElement | null;\r\n return inner ?? host;\r\n }\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, TemplateRef, input } from '@angular/core';\r\nimport { CdkDragHandle } from '@angular/cdk/drag-drop';\r\n\r\n/**\r\n * The grip a row is dragged by — a reusable handle instead of a glyph copied\r\n * into every drag-sort table.\r\n *\r\n * `hostDirectives: [CdkDragHandle]` puts `cdkDragHandle` on the component's\r\n * own host element, so it registers as the drag origin the moment it appears\r\n * anywhere inside a `cdkDrag` row — no need to add the CDK directive by hand,\r\n * and no requirement about *where* in the row it sits:\r\n *\r\n * <!-- its own column -->\r\n * <td bk-td><bk-drag-handle></bk-drag-handle></td>\r\n * <td bk-td>{{ row.name }}</td>\r\n *\r\n * <!-- inline with the first column, no dedicated column at all -->\r\n * <td bk-td><bk-drag-handle></bk-drag-handle> {{ row.name }}</td>\r\n *\r\n * The icon is a default grip — swap it per table by passing a template:\r\n *\r\n * <ng-template #bars><svg>…</svg></ng-template>\r\n * <bk-drag-handle [icon]=\"bars\"></bk-drag-handle>\r\n *\r\n * Same shape as `expandIcon` on `td[bk-td]`: a `TemplateRef` input the\r\n * component falls back from when it's `null`, rather than a projected slot —\r\n * `<ng-content>` has no way to render a default only when nothing was\r\n * projected into it.\r\n */\r\n@Component({\r\n selector: 'bk-drag-handle',\r\n standalone: true,\r\n exportAs: 'bkDragHandle',\r\n imports: [NgTemplateOutlet],\r\n hostDirectives: [CdkDragHandle],\r\n host: {\r\n class: 'bk-drag-handle',\r\n role: 'button',\r\n '[attr.aria-label]': 'ariaLabel()'\r\n },\r\n template: `\r\n <ng-container [ngTemplateOutlet]=\"icon() ?? defaultIcon\"></ng-container>\r\n <ng-template #defaultIcon>\r\n <svg width=\"10\" height=\"16\" viewBox=\"0 0 10 16\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"3\" cy=\"2\" r=\"1.3\" />\r\n <circle cx=\"3\" cy=\"8\" r=\"1.3\" />\r\n <circle cx=\"3\" cy=\"14\" r=\"1.3\" />\r\n <circle cx=\"7\" cy=\"2\" r=\"1.3\" />\r\n <circle cx=\"7\" cy=\"8\" r=\"1.3\" />\r\n <circle cx=\"7\" cy=\"14\" r=\"1.3\" />\r\n </svg>\r\n </ng-template>\r\n `\r\n})\r\nexport class BkDragHandle {\r\n icon = input<TemplateRef<void> | null>(null);\r\n ariaLabel = input('Reorder row');\r\n}\r\n","import { CdkDragMove, CdkDragStart } from '@angular/cdk/drag-drop';\r\nimport { Directive, OnDestroy, input, output } from '@angular/core';\r\nimport { BkTableDrag } from './table-drag';\r\nimport { BkTreeDropEvent, BkTreeDropPosition, BkTreeRow } from './table.model';\r\n\r\n/**\r\n * How far a drag is allowed to travel through the tree.\r\n *\r\n * - `'anywhere'` — full re-parenting: before, after or inside any legal target\r\n * at any depth. Right for a generic outliner or file explorer, where the\r\n * levels carry no meaning of their own.\r\n * - `'siblings'` — reorder only, among the dragged node's current siblings.\r\n * No re-parenting, no nesting. Right whenever the levels *do* mean\r\n * something — an org chart, a category tree, a fixed-depth menu — where an\r\n * unrestricted drag lets you build a tree that violates whatever the levels\r\n * were supposed to represent. The cycle guard stops a node from swallowing\r\n * itself either way, but nothing else stops a leaf from ending up three\r\n * levels deep under an unrelated parent unless this is set.\r\n */\r\nexport type BkTreeDragScope = 'anywhere' | 'siblings';\r\n\r\n/**\r\n * Tree-aware row dragging: before / after / inside.\r\n *\r\n * A table flattens the tree into one list of `<tr>` — every row is a sibling\r\n * in the same `<tbody>` whatever its depth, so nested `cdkDropList`s have\r\n * nothing to nest on. Instead the CDK is kept for what it is good at (the\r\n * preview, the placeholder, returning the row on release) with its sorting\r\n * turned off, and this directive does the targeting: the pointer's position\r\n * within the row under it picks the relationship —\r\n *\r\n * top third insert BEFORE the target, as a sibling\r\n * middle third drop INSIDE the target, as its child\r\n * bottom third insert AFTER the target, as a sibling\r\n *\r\n * — drawn live as a line above, a line below, or a tinted row, so the drop\r\n * never lands somewhere the indicator didn't say it would. Illegal targets\r\n * (the dragged row itself, anything in its own subtree, anything the `canDrop`\r\n * predicate vetoes) simply show no indicator.\r\n *\r\n * Set `scope=\"siblings\"` to restrict dragging to reordering among the node's\r\n * current siblings — no re-parenting, no nesting, and no `inside` zone at all\r\n * (see `BkTreeDragScope`). That is the right default whenever the tree's\r\n * levels mean something specific; `canDrop` covers anything more particular\r\n * than the two built-in scopes.\r\n *\r\n * The directive never touches the tree. It resolves the drag into one event —\r\n * `{ dragged, target, position }` — and the consumer applies it, usually with\r\n * `moveBkTreeNode`. Hovering the middle of a row for `expandDelay` emits\r\n * `treeExpand` so collapsed branches can be opened mid-drag; acting on it is\r\n * likewise the consumer's call.\r\n *\r\n * <div bkTreeDrag #td=\"bkTreeDrag\" [treeRows]=\"t.renderData()\"\r\n * (treeDrop)=\"onDrop($event)\" (treeExpand)=\"open($event)\">\r\n * <bk-table #t [data]=\"rows()\">\r\n * <tbody cdkDropList [cdkDropListSortingDisabled]=\"true\">\r\n * @for (row of t.renderData(); track row.data.id) {\r\n * <tr cdkDrag cdkDragLockAxis=\"y\"\r\n * (cdkDragStarted)=\"td.onDragStart($event, row)\"\r\n * (cdkDragMoved)=\"td.onDragMove($event)\"\r\n * (cdkDragEnded)=\"td.onDragEnd()\">\r\n *\r\n * Sorting stays disabled on the drop list deliberately: with rows shuffling\r\n * under the pointer, an open branch's children sit still while their parent\r\n * moves. With a static list and an indicator, nothing lies.\r\n *\r\n * Extends `BkTableDrag`, so the preview keeps its column widths and dragging\r\n * near an edge still scrolls the table.\r\n */\r\n@Directive({\r\n selector: '[bkTreeDrag]',\r\n standalone: true,\r\n exportAs: 'bkTreeDrag'\r\n})\r\nexport class BkTreeDrag<T = any> extends BkTableDrag implements OnDestroy {\r\n /**\r\n * The flattened rows currently rendered, in render order — the same array\r\n * the `<tbody>` iterates. Row *i* of the tbody is entry *i* here; that\r\n * index mapping is the whole basis of the hit-testing.\r\n */\r\n treeRows = input<readonly BkTreeRow<T>[]>([]);\r\n\r\n /** See `BkTreeDragScope`. Defaults to full re-parenting. */\r\n scope = input<BkTreeDragScope>('anywhere');\r\n\r\n /**\r\n * Consumer veto over and above the built-in guards — e.g. \"a person cannot\r\n * contain a team\". Return false and the indicator never appears.\r\n */\r\n canDrop = input<\r\n ((dragged: BkTreeRow<T>, target: BkTreeRow<T>, position: BkTreeDropPosition) => boolean) | null\r\n >(null);\r\n\r\n /** How long the pointer rests on a row's middle before `treeExpand` fires. */\r\n expandDelay = input(700);\r\n\r\n treeDrop = output<BkTreeDropEvent<T>>();\r\n treeExpand = output<BkTreeRow<T>>();\r\n\r\n private dragged: BkTreeRow<T> | null = null;\r\n private target: BkTreeRow<T> | null = null;\r\n private position: BkTreeDropPosition | null = null;\r\n\r\n private line: HTMLElement | null = null;\r\n private insideRow: HTMLElement | null = null;\r\n\r\n private expandTimer: ReturnType<typeof setTimeout> | null = null;\r\n private expandFor: T | null = null;\r\n\r\n onDragStart(event: CdkDragStart, row: BkTreeRow<T>): void {\r\n super.onStart(event); // preview column widths\r\n this.dragged = row;\r\n }\r\n\r\n onDragMove(event: CdkDragMove): void {\r\n super.onMove(event); // edge auto-scroll\r\n if (!this.dragged) return;\r\n\r\n const container = this.scrollContainer();\r\n const tbody = container?.querySelector('tbody');\r\n if (!container || !tbody) return;\r\n\r\n const { y } = event.pointerPosition;\r\n const rows = Array.from(tbody.rows);\r\n\r\n // The dragged row stays in the DOM as the CDK's placeholder, so DOM order\r\n // still matches treeRows() one to one — including any rows a mid-drag\r\n // auto-expand has just added.\r\n const index = rows.findIndex((tr) => {\r\n const r = tr.getBoundingClientRect();\r\n return y >= r.top && y < r.bottom;\r\n });\r\n\r\n const target = index >= 0 ? this.treeRows()[index] ?? null : null;\r\n\r\n if (!target || !this.isLegal(target)) {\r\n this.setTarget(null, null, null, container);\r\n return;\r\n }\r\n\r\n const rect = rows[index].getBoundingClientRect();\r\n const fraction = (y - rect.top) / rect.height;\r\n\r\n // In 'siblings' scope there is no legal way to land inside a row — that\r\n // would make the dragged node a child of something it wasn't a child of\r\n // before, which is exactly what this scope rules out. The row splits in\r\n // half instead of thirds, so the whole target is reachable as before/after.\r\n const position: BkTreeDropPosition =\r\n this.scope() === 'siblings'\r\n ? fraction < 1 / 2\r\n ? 'before'\r\n : 'after'\r\n : fraction < 1 / 3\r\n ? 'before'\r\n : fraction > 2 / 3\r\n ? 'after'\r\n : 'inside';\r\n\r\n if (position !== 'inside' || this.canDropAt(target, 'inside')) {\r\n this.setTarget(target, position, rows[index], container);\r\n } else {\r\n this.setTarget(null, null, null, container);\r\n }\r\n }\r\n\r\n onDragEnd(): void {\r\n if (this.dragged && this.target && this.position) {\r\n this.treeDrop.emit({ dragged: this.dragged, target: this.target, position: this.position });\r\n }\r\n this.clearIndicator();\r\n this.clearExpandTimer();\r\n this.dragged = null;\r\n this.target = null;\r\n this.position = null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearIndicator();\r\n this.clearExpandTimer();\r\n }\r\n\r\n /* ================= Guards ================= */\r\n\r\n /**\r\n * Structural legality, before the zone is even known. Dropping a node\r\n * anywhere inside its own subtree would detach that branch from the tree\r\n * with nothing left pointing at it — walking the parent chain is cheaper\r\n * than searching the subtree, and `flattenBkTreeData` already carries it.\r\n *\r\n * In `'siblings'` scope, the only legal targets are the dragged node's\r\n * current siblings — same `parent` reference, root-level nodes included\r\n * (`undefined === undefined`). That alone also rules out every cycle: a\r\n * node's siblings can never be its own ancestor.\r\n */\r\n private isLegal(target: BkTreeRow<T>): boolean {\r\n if (!this.dragged || target.data === this.dragged.data) return false;\r\n\r\n if (this.scope() === 'siblings') {\r\n return target.parent === this.dragged.parent;\r\n }\r\n\r\n for (let p: T | undefined = target.parent; p; ) {\r\n if (p === this.dragged.data) return false;\r\n p = this.treeRows().find((r) => r.data === p)?.parent;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private canDropAt(target: BkTreeRow<T>, position: BkTreeDropPosition): boolean {\r\n const veto = this.canDrop();\r\n return !veto || veto(this.dragged!, target, position);\r\n }\r\n\r\n /* ================= Indicator ================= */\r\n\r\n private setTarget(\r\n target: BkTreeRow<T> | null,\r\n position: BkTreeDropPosition | null,\r\n rowEl: HTMLTableRowElement | null,\r\n container: HTMLElement\r\n ): void {\r\n const changed = target !== this.target || position !== this.position;\r\n this.target = target && position && this.canDropAt(target, position) ? target : null;\r\n this.position = this.target ? position : null;\r\n\r\n if (!changed) return;\r\n\r\n this.clearIndicator();\r\n\r\n if (!this.target || !rowEl) {\r\n this.clearExpandTimer();\r\n return;\r\n }\r\n\r\n if (this.position === 'inside') {\r\n rowEl.classList.add('bk-tree-drop-inside');\r\n this.insideRow = rowEl;\r\n this.armExpandTimer(this.target);\r\n } else {\r\n this.drawLine(rowEl, container, this.position === 'after');\r\n this.clearExpandTimer();\r\n }\r\n }\r\n\r\n private drawLine(rowEl: HTMLElement, container: HTMLElement, below: boolean): void {\r\n if (!this.line) {\r\n this.line = document.createElement('div');\r\n this.line.className = 'bk-tree-drop-line';\r\n container.appendChild(this.line);\r\n }\r\n\r\n const rowRect = rowEl.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n\r\n const edge = below ? rowRect.bottom : rowRect.top;\r\n this.line.style.top = `${edge - containerRect.top + container.scrollTop - 1}px`;\r\n this.line.style.left = `${rowRect.left - containerRect.left + container.scrollLeft}px`;\r\n this.line.style.width = `${rowRect.width}px`;\r\n }\r\n\r\n private clearIndicator(): void {\r\n this.line?.remove();\r\n this.line = null;\r\n this.insideRow?.classList.remove('bk-tree-drop-inside');\r\n this.insideRow = null;\r\n }\r\n\r\n /* ================= Auto-expand ================= */\r\n\r\n /**\r\n * One timer per hovered node: moving within the same row keeps it running,\r\n * moving to another row restarts it. The directive only reports the dwell —\r\n * whether the node has children to show is the consumer's knowledge.\r\n */\r\n private armExpandTimer(target: BkTreeRow<T>): void {\r\n if (this.expandFor === target.data) return;\r\n\r\n this.clearExpandTimer();\r\n this.expandFor = target.data;\r\n this.expandTimer = setTimeout(() => this.treeExpand.emit(target), this.expandDelay());\r\n }\r\n\r\n private clearExpandTimer(): void {\r\n if (this.expandTimer) clearTimeout(this.expandTimer);\r\n this.expandTimer = null;\r\n this.expandFor = null;\r\n }\r\n}\r\n","/**\r\n * bk-table public surface.\r\n *\r\n * `BK_TABLE` is the convenience bundle — spread it into a standalone\r\n * component's `imports` rather than listing eight symbols by hand:\r\n *\r\n * imports: [...BK_TABLE]\r\n */\r\nexport * from './table.model';\r\nexport * from './table';\r\nexport * from './table-th';\r\nexport * from './table-td';\r\nexport * from './table-row';\r\nexport * from './table-drag';\r\nexport * from './table-drag-handle';\r\nexport * from './table-tree-drag';\r\n\r\nimport { BkTable, BkTableTitle, BkTableFooter, BkVirtualScroll } from './table';\r\nimport { BkTh } from './table-th';\r\nimport { BkTd } from './table-td';\r\nimport { BkTrExpand, BkTableSummary } from './table-row';\r\nimport { BkTableDrag } from './table-drag';\r\nimport { BkDragHandle } from './table-drag-handle';\r\nimport { BkTreeDrag } from './table-tree-drag';\r\n\r\nexport const BK_TABLE = [\r\n BkTable,\r\n BkTableTitle,\r\n BkTableFooter,\r\n BkVirtualScroll,\r\n BkTh,\r\n BkTd,\r\n BkTrExpand,\r\n BkTableSummary,\r\n BkTableDrag,\r\n BkDragHandle,\r\n BkTreeDrag\r\n] as const;\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 { BkDialogService } from './lib/dialog/dialog.service';\r\nexport { BkDialogRef } from './lib/dialog/dialog-ref';\r\nexport { BK_DIALOG_DATA, BK_DIALOG_GLOBAL_CONFIG } from './lib/dialog/dialog.tokens';\r\nexport type { BkDialogConfig, BkDialogPosition, BkDialogAnimation } from './lib/dialog/dialog-config';\r\nexport { BK_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 { BkAnimationKeyframes } 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\r\n//Avatar Profile\r\nexport * from './lib/avatar-profile/avatar-profile';\r\n//Hierarchical Select\r\nexport * from './lib/hierarchical-select/hierarchical-select';\r\n//Toastr\r\nexport * from './lib/toastr/toastr';\r\nexport * from './lib/toastr/toastr.service';\r\n\r\n// UI Avatar\r\nexport * from './lib/ui-avatar/ui-avatar';\r\n//Column Select\r\nexport * from './lib/column-select/components/column-select/column-select';\r\nexport * from './lib/column-select/models/column-filter-option';\r\nexport * from './lib/column-select/service/column-filter.service';\r\n//File Picker & Card\r\nexport * from './lib/file-picker/file-picker';\r\nexport * from './lib/file-card/file-card';\r\n//Pagination\r\nexport * from './lib/pagination/pagination';\r\n//Loader\r\nexport * from './lib/loader/loader';\r\n//Dropdown\r\nexport * from './lib/dropdown/dropdown';\r\n//Menu\r\nexport * from './lib/menu/menu';\r\n//Popover\r\nexport * from './lib/popover/popover';\r\n//Color Appearance\r\nexport * from './lib/shared/utilities/color-appearance';\r\n//Popover Position\r\nexport * from './lib/shared/utilities/popover-position';\r\n//Avatar Group\r\nexport * from './lib/ui-avatar-group/ui-avatar-group';\r\n//bk-table (template-driven table)\r\nexport * from './lib/table';\r\nexport * from './lib/table/table.model';\r\nexport * from './lib/table/table';\r\nexport * from './lib/table/table-th';\r\nexport * from './lib/table/table-td';\r\nexport * from './lib/table/table-row';\r\nexport * from './lib/table/table-drag';\r\nexport * from './lib/table/table-drag-handle';\r\nexport * from './lib/table/table-tree-drag';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.BkCalendarManagerService","i2","i1","i3","CDK_DIALOG_DATA","CdkDialogModule","i1.BkColumnFilterService"],"mappings":"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"}