{"version":3,"file":"ngxsmk-datepicker.mjs","sources":["../../../projects/ngxsmk-datepicker/src/lib/utils/date.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/utils/calendar.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/components/custom-select.component.ts","../../../projects/ngxsmk-datepicker/src/lib/utils/performance.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/ngxsmk-datepicker.ts","../../../projects/ngxsmk-datepicker/src/public-api.ts","../../../projects/ngxsmk-datepicker/src/ngxsmk-datepicker.ts"],"sourcesContent":["/**\r\n * Date utility functions for ngxsmk-datepicker\r\n * Extracted to improve tree-shaking and reduce bundle size\r\n */\r\n\r\nexport function getStartOfDay(d: Date): Date {\r\n  return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);\r\n}\r\n\r\nexport function getEndOfDay(d: Date): Date {\r\n  return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59, 999);\r\n}\r\n\r\nexport function addMonths(d: Date, months: number): Date {\r\n  const newDate = new Date(d);\r\n  newDate.setMonth(d.getMonth() + months);\r\n  return newDate;\r\n}\r\n\r\nexport function subtractDays(d: Date, days: number): Date {\r\n  const newDate = new Date(d);\r\n  newDate.setDate(d.getDate() - days);\r\n  return newDate;\r\n}\r\n\r\nexport function getStartOfMonth(d: Date): Date {\r\n  return new Date(d.getFullYear(), d.getMonth(), 1);\r\n}\r\n\r\nexport function getEndOfMonth(d: Date): Date {\r\n  return new Date(d.getFullYear(), d.getMonth() + 1, 0);\r\n}\r\n\r\nexport function isSameDay(d1: Date | null, d2: Date | null): boolean {\r\n  if (!d1 || !d2) return false;\r\n  return (\r\n    d1.getFullYear() === d2.getFullYear() &&\r\n    d1.getMonth() === d2.getMonth() &&\r\n    d1.getDate() === d2.getDate()\r\n  );\r\n}\r\n\r\nexport function normalizeDate(date: DateInput | null): Date | null {\r\n  if (!date) return null;\r\n  const d = (date instanceof Date) ? new Date(date.getTime()) : new Date((date as any).toDate ? (date as any).toDate() : date as any);\r\n  if (isNaN(d.getTime())) return null;\r\n  return d;\r\n}\r\n\r\nexport type DateInput = Date | string | { toDate: () => Date; _isAMomentObject?: boolean; $d?: Date };\r\n\r\n\r\n","/**\r\n * Calendar utility functions for ngxsmk-datepicker\r\n * Optimized for performance and tree-shaking\r\n */\r\n\r\nimport { DateInput, normalizeDate } from './date.utils';\r\n\r\nexport interface HolidayProvider {\r\n  /**\r\n   * Returns true if the given date is a holiday.\r\n   * The date passed will be at the start of the day (00:00:00).\r\n   */\r\n  isHoliday(date: Date): boolean;\r\n  \r\n  /**\r\n   * Optional: Returns a label or reason for the holiday.\r\n   */\r\n  getHolidayLabel?(date: Date): string | null;\r\n}\r\n\r\nexport interface DateRange {\r\n  [key: string]: [DateInput, DateInput];\r\n}\r\n\r\nexport type DatepickerValue = Date | { start: Date, end: Date } | Date[] | null;\r\n\r\n/**\r\n * Generate month options for dropdown\r\n */\r\nexport function generateMonthOptions(locale: string, year: number): { label: string; value: number }[] {\r\n  return Array.from({length: 12}).map((_, i) => ({\r\n    label: new Date(year, i, 1).toLocaleDateString(locale, {month: 'long'}),\r\n    value: i,\r\n  }));\r\n}\r\n\r\n/**\r\n * Generate year options for dropdown\r\n */\r\nexport function generateYearOptions(currentYear: number, range: number = 10): { label: string; value: number }[] {\r\n  const startYear = currentYear - range;\r\n  const endYear = currentYear + range;\r\n  const options: { label: string; value: number }[] = [];\r\n  \r\n  for (let i = startYear; i <= endYear; i++) {\r\n    options.push({label: `${i}`, value: i});\r\n  }\r\n  \r\n  return options;\r\n}\r\n\r\n/**\r\n * Generate time options for hour/minute dropdowns\r\n */\r\nexport function generateTimeOptions(minuteInterval: number = 1): {\r\n  hourOptions: { label: string; value: number }[];\r\n  minuteOptions: { label: string; value: number }[];\r\n} {\r\n  const hourOptions = Array.from({length: 12}).map((_, i) => ({\r\n    label: (i + 1).toString().padStart(2, '0'),\r\n    value: i + 1,\r\n  }));\r\n\r\n  const minuteOptions: { label: string; value: number }[] = [];\r\n  for (let i = 0; i < 60; i += minuteInterval) {\r\n    minuteOptions.push({\r\n      label: i.toString().padStart(2, '0'),\r\n      value: i,\r\n    });\r\n  }\r\n\r\n  return { hourOptions, minuteOptions };\r\n}\r\n\r\n/**\r\n * Generate week days for calendar header\r\n */\r\nexport function generateWeekDays(locale: string, firstDayOfWeek: number = 0): string[] {\r\n  const day = new Date(2024, 0, 7 + firstDayOfWeek);\r\n  return Array.from({length: 7}).map(() => {\r\n    const weekDay = new Date(day).toLocaleDateString(locale, {weekday: 'short'});\r\n    day.setDate(day.getDate() + 1);\r\n    return weekDay;\r\n  });\r\n}\r\n\r\n/**\r\n * Get first day of week for locale\r\n */\r\nexport function getFirstDayOfWeek(locale: string): number {\r\n  try {\r\n    return ((new Intl.Locale(locale) as any).weekInfo?.firstDay || 0) % 7;\r\n  } catch (e) {\r\n    return 0;\r\n  }\r\n}\r\n\r\n/**\r\n * Convert 12-hour to 24-hour format\r\n */\r\nexport function get24Hour(displayHour: number, isPm: boolean): number {\r\n  if (isPm) { return displayHour === 12 ? 12 : displayHour + 12; }\r\n  return displayHour === 12 ? 0 : displayHour;\r\n}\r\n\r\n/**\r\n * Convert 24-hour to 12-hour format\r\n */\r\nexport function update12HourState(fullHour: number): { isPm: boolean; displayHour: number } {\r\n  return {\r\n    isPm: fullHour >= 12,\r\n    displayHour: fullHour % 12 || 12\r\n  };\r\n}\r\n\r\n/**\r\n * Process date ranges input\r\n */\r\nexport function processDateRanges(ranges: DateRange | null): { [key: string]: [Date, Date] } | null {\r\n  if (!ranges) return null;\r\n  \r\n  return Object.entries(ranges).reduce((acc, [key, dates]) => {\r\n    const start = normalizeDate(dates[0]);\r\n    const end = normalizeDate(dates[1]);\r\n    if (start && end) acc[key] = [start, end];\r\n    return acc;\r\n  }, {} as { [key: string]: [Date, Date] });\r\n}\r\n\r\n\r\n","import { Component, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n  selector: 'ngxsmk-custom-select',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  template: `\r\n    <div class=\"ngxsmk-select-container\" (click)=\"toggleDropdown()\">\r\n      <button type=\"button\" class=\"ngxsmk-select-display\" [disabled]=\"disabled\">\r\n        <span>{{ displayValue }}</span>\r\n        <svg class=\"ngxsmk-arrow-icon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\r\n          <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\r\n                d=\"M112 184l144 144 144-144\"/>\r\n        </svg>\r\n      </button>\r\n      @if (isOpen) {\r\n        <div class=\"ngxsmk-options-panel\">\r\n          <ul>\r\n            @for (option of options; track option.value) {\r\n              <li [class.selected]=\"option.value === value\" (click)=\"selectOption(option); $event.stopPropagation()\">\r\n                {{ option.label }}\r\n              </li>\r\n            }\r\n          </ul>\r\n        </div>\r\n      }\r\n    </div>\r\n  `,\r\n  styles: [`\r\n    :host { position: relative; display: inline-block; }\r\n    .ngxsmk-select-container { cursor: pointer; }\r\n    .ngxsmk-select-display {\r\n      display: flex; align-items: center; justify-content: space-between;\r\n      width: var(--custom-select-width, 115px); background: var(--datepicker-background, #fff);\r\n      border: 1px solid var(--datepicker-border-color, #ccc); color: var(--datepicker-text-color, #333);\r\n      border-radius: 4px; padding: 4px 8px; font-size: 14px; text-align: left; height: 30px;\r\n    }\r\n    .ngxsmk-select-display:disabled {\r\n      background-color: var(--datepicker-hover-background, #f0f0f0);\r\n      cursor: not-allowed;\r\n      opacity: 0.7;\r\n    }\r\n    .ngxsmk-arrow-icon { width: 12px; height: 12px; margin-left: 8px; }\r\n    .ngxsmk-options-panel {\r\n      position: absolute; top: 110%; left: 0; width: 100%;\r\n      background: var(--datepicker-background, #fff); border: 1px solid var(--datepicker-border-color, #ccc);\r\n      color: var(--datepicker-text-color, #333); border-radius: 4px;\r\n      box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); max-height: 200px; overflow-y: auto; z-index: 9999;\r\n    }\r\n    .ngxsmk-options-panel ul { list-style: none; padding: 4px; margin: 0; }\r\n    .ngxsmk-options-panel li { padding: 8px 12px; border-radius: 4px; cursor: pointer; }\r\n    .ngxsmk-options-panel li:hover { background-color: var(--datepicker-hover-background, #f0f0f0); }\r\n    .ngxsmk-options-panel li.selected {\r\n      background-color: var(--datepicker-primary-color, #3880ff); color: var(--datepicker-primary-contrast, #fff);\r\n    }\r\n  `],\r\n})\r\nexport class CustomSelectComponent {\r\n  @Input() options: { label: string; value: any }[] = [];\r\n  @Input() value: any;\r\n  @Input() disabled: boolean = false;\r\n  @Output() valueChange = new EventEmitter<any>();\r\n  public isOpen = false;\r\n\r\n  private readonly elementRef: ElementRef = inject(ElementRef);\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: MouseEvent): void {\r\n    if (!this.elementRef.nativeElement.contains(event.target)) this.isOpen = false;\r\n  }\r\n\r\n  get displayValue(): string {\r\n    const selectedOption = this.options.find((opt) => opt.value === this.value);\r\n    return selectedOption ? selectedOption.label : '';\r\n  }\r\n\r\n  toggleDropdown(): void {\r\n    if (this.disabled) return;\r\n    this.isOpen = !this.isOpen;\r\n  }\r\n\r\n  selectOption(option: { label: string; value: any }): void {\r\n    this.value = option.value;\r\n    this.valueChange.emit(this.value);\r\n    this.isOpen = false;\r\n  }\r\n}\r\n\r\n\r\n","/**\r\n * Performance utilities for ngxsmk-datepicker\r\n * Optimized for better runtime performance\r\n */\r\n\r\n/**\r\n * Memoization decorator for expensive computations\r\n */\r\nexport function memoize<T extends (...args: any[]) => any>(\r\n  fn: T,\r\n  keyGenerator?: (...args: Parameters<T>) => string\r\n): T {\r\n  const cache = new Map<string, ReturnType<T>>();\r\n  \r\n  return ((...args: Parameters<T>) => {\r\n    const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args);\r\n    \r\n    if (cache.has(key)) {\r\n      return cache.get(key)!;\r\n    }\r\n    \r\n    const result = fn(...args);\r\n    cache.set(key, result);\r\n    return result;\r\n  }) as T;\r\n}\r\n\r\n/**\r\n * Debounce function for performance optimization\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n  func: T,\r\n  wait: number\r\n): (...args: Parameters<T>) => void {\r\n  let timeout: number | null = null;\r\n  \r\n  return (...args: Parameters<T>) => {\r\n    if (timeout) {\r\n      clearTimeout(timeout);\r\n    }\r\n    \r\n    timeout = window.setTimeout(() => {\r\n      func(...args);\r\n    }, wait);\r\n  };\r\n}\r\n\r\n/**\r\n * Throttle function for performance optimization\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n  func: T,\r\n  limit: number\r\n): (...args: Parameters<T>) => void {\r\n  let inThrottle: boolean = false;\r\n  \r\n  return (...args: Parameters<T>) => {\r\n    if (!inThrottle) {\r\n      func(...args);\r\n      inThrottle = true;\r\n      window.setTimeout(() => (inThrottle = false), limit);\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * Create a shallow comparison function for objects\r\n */\r\nexport function shallowEqual<T extends Record<string, any>>(a: T, b: T): boolean {\r\n  const keysA = Object.keys(a);\r\n  const keysB = Object.keys(b);\r\n  \r\n  if (keysA.length !== keysB.length) {\r\n    return false;\r\n  }\r\n  \r\n  for (const key of keysA) {\r\n    if (a[key] !== b[key]) {\r\n      return false;\r\n    }\r\n  }\r\n  \r\n  return true;\r\n}\r\n\r\n/**\r\n * Optimized date comparison for calendar rendering\r\n */\r\nexport function createDateComparator() {\r\n  const cache = new Map<string, boolean>();\r\n  const MAX_CACHE_SIZE = 1000; // Prevent memory leaks\r\n  \r\n  return (date1: Date | null, date2: Date | null): boolean => {\r\n    if (!date1 || !date2) return date1 === date2;\r\n    \r\n    const key = `${date1.getTime()}-${date2.getTime()}`;\r\n    if (cache.has(key)) {\r\n      return cache.get(key)!;\r\n    }\r\n    \r\n    const result = (\r\n      date1.getFullYear() === date2.getFullYear() &&\r\n      date1.getMonth() === date2.getMonth() &&\r\n      date1.getDate() === date2.getDate()\r\n    );\r\n    \r\n    // Prevent cache from growing too large\r\n    if (cache.size >= MAX_CACHE_SIZE) {\r\n      const firstKey = cache.keys().next().value;\r\n      if (firstKey !== undefined) {\r\n        cache.delete(firstKey);\r\n      }\r\n    }\r\n    \r\n    cache.set(key, result);\r\n    return result;\r\n  };\r\n}\r\n\r\n/**\r\n * Optimized array filtering with caching\r\n */\r\nexport function createFilteredArray<T>(\r\n  source: T[],\r\n  filterFn: (item: T) => boolean,\r\n  cacheKey?: string\r\n): T[] {\r\n  const cache = new Map<string, T[]>();\r\n  const key = cacheKey || JSON.stringify(source);\r\n  \r\n  if (cache.has(key)) {\r\n    return cache.get(key)!;\r\n  }\r\n  \r\n  const result = source.filter(filterFn);\r\n  cache.set(key, result);\r\n  return result;\r\n}\r\n\r\n/**\r\n * Clear all caches to prevent memory leaks\r\n */\r\nexport function clearAllCaches(): void {\r\n  // This would be called from the component's ngOnDestroy\r\n  // Implementation depends on how caches are managed globally\r\n}\r\n\r\n\r\n","import {\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  HostBinding,\n  HostListener,\n  inject,\n  Input,\n  OnChanges,\n  OnInit,\n  Output,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  OnDestroy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport {CommonModule, DatePipe} from '@angular/common';\nimport {\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALUE_ACCESSOR,\n  ReactiveFormsModule,\n} from '@angular/forms';\nimport {\n  getStartOfDay,\n  addMonths,\n  normalizeDate,\n  DateInput,\n} from './utils/date.utils';\nimport {\n  HolidayProvider,\n  DateRange,\n  DatepickerValue,\n  generateMonthOptions,\n  generateYearOptions,\n  generateTimeOptions,\n  generateWeekDays,\n  getFirstDayOfWeek,\n  get24Hour,\n  update12HourState,\n  processDateRanges,\n} from './utils/calendar.utils';\nimport { CustomSelectComponent } from './components/custom-select.component';\nimport { createDateComparator } from './utils/performance.utils';\n\n\n@Component({\n  selector: 'ngxsmk-datepicker',\n  standalone: true,\n  imports: [CommonModule, FormsModule, CustomSelectComponent, DatePipe, ReactiveFormsModule],\n  providers: [{\n    provide: NG_VALUE_ACCESSOR,\n    useExisting: forwardRef(() => NgxsmkDatepickerComponent),\n    multi: true\n  }],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  styleUrls: ['./styles/datepicker.css'],\n  template: `\n    <div class=\"ngxsmk-datepicker-wrapper\" [class.ngxsmk-inline-mode]=\"isInlineMode\">\n      @if (!isInlineMode) {\n        <div class=\"ngxsmk-input-group\" (click)=\"toggleCalendar()\" [class.disabled]=\"disabled\">\n          <input type=\"text\" \n                 [value]=\"displayValue\" \n                 [placeholder]=\"placeholder\" \n                 readonly \n                 [disabled]=\"disabled\"\n                 class=\"ngxsmk-display-input\">\n          <button type=\"button\" class=\"ngxsmk-clear-button\" (click)=\"clearValue($event)\" [disabled]=\"disabled\" *ngIf=\"displayValue\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"32\" d=\"M368 368L144 144M368 144L144 368\"/></svg>\n          </button>\n        </div>\n      }\n\n      @if (isCalendarVisible) {\n        <div class=\"ngxsmk-popover-container\" [class.ngxsmk-inline-container]=\"isInlineMode\">\n          <div class=\"ngxsmk-datepicker-container\">\n            @if (showRanges && rangesArray.length > 0 && mode === 'range') {\n              <div class=\"ngxsmk-ranges-container\">\n                <ul>\n                  @for (range of rangesArray; track trackByRange($index, range)) {\n                    <li (click)=\"selectRange(range.value)\" [class.disabled]=\"disabled\">{{ range.key }}</li>\n                  }\n                </ul>\n              </div>\n            }\n            <div class=\"ngxsmk-calendar-container\">\n              <div class=\"ngxsmk-header\">\n                <div class=\"ngxsmk-month-year-selects\">\n                  <ngxsmk-custom-select class=\"month-select\" [options]=\"monthOptions\"\n                                    [(value)]=\"currentMonth\" [disabled]=\"disabled\"></ngxsmk-custom-select>\n                  <ngxsmk-custom-select class=\"year-select\" [options]=\"yearOptions\" [(value)]=\"currentYear\" [disabled]=\"disabled\"></ngxsmk-custom-select>\n                </div>\n                <div class=\"ngxsmk-nav-buttons\">\n                  <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"disabled || isBackArrowDisabled\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n                      <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\n                            d=\"M328 112L184 256l144 144\"/>\n                    </svg>\n                  </button>\n                  <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"disabled\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n                      <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\n                            d=\"M184 112l144 144-144 144\"/>\n                    </svg>\n                  </button>\n                </div>\n              </div>\n              <div class=\"ngxsmk-days-grid-wrapper\">\n                <div class=\"ngxsmk-days-grid\">\n                  @for (day of weekDays; track day) {\n                    <div class=\"ngxsmk-day-name\">{{ day }}</div>\n                  }\n                  @for (day of daysInMonth; track trackByDay($index, day)) {\n                    <div class=\"ngxsmk-day-cell\"\n                        [class.empty]=\"!isCurrentMonthMemo(day)\" [class.disabled]=\"isDateDisabledMemo(day)\" \n                        [class.today]=\"isSameDayMemo(day, today)\"\n                        [class.holiday]=\"isHolidayMemo(day)\"\n                        [class.selected]=\"mode === 'single' && isSameDayMemo(day, selectedDate)\"\n                        [class.multiple-selected]=\"mode === 'multiple' && isMultipleSelected(day)\"\n                        [class.start-date]=\"mode === 'range' && isSameDayMemo(day, startDate)\"\n                        [class.end-date]=\"mode === 'range' && isSameDayMemo(day, endDate)\"\n                        [class.in-range]=\"mode === 'range' && isInRange(day)\"\n                        [class.preview-range]=\"isPreviewInRange(day)\"\n                        (click)=\"onDateClick(day)\" (mouseenter)=\"onDateHover(day)\">\n                      @if (day) {\n                        <div class=\"ngxsmk-day-number\" [attr.title]=\"getHolidayLabelMemo(day)\">{{ day | date : 'd' }}</div>\n                      }\n                    </div>\n                  }\n                </div>\n              </div>\n\n              @if (showTime) {\n                <div class=\"ngxsmk-time-selection\">\n                  <span class=\"ngxsmk-time-label\">Time:</span>\n                  <ngxsmk-custom-select\n                    class=\"hour-select\"\n                    [options]=\"hourOptions\"\n                    [(value)]=\"currentDisplayHour\"\n                    (valueChange)=\"onTimeChange()\"\n                    [disabled]=\"disabled\"\n                  ></ngxsmk-custom-select>\n                  <span class=\"ngxsmk-time-separator\">:</span>\n                  <ngxsmk-custom-select\n                    class=\"minute-select\"\n                    [options]=\"minuteOptions\"\n                    [(value)]=\"currentMinute\"\n                    (valueChange)=\"onTimeChange()\"\n                    [disabled]=\"disabled\"\n                  ></ngxsmk-custom-select>\n                  <ngxsmk-custom-select\n                    class=\"ampm-select\"\n                    [options]=\"ampmOptions\"\n                    [(value)]=\"isPm\"\n                    (valueChange)=\"onTimeChange()\"\n                    [disabled]=\"disabled\"\n                  ></ngxsmk-custom-select>\n                </div>\n              }\n              \n              <div class=\"ngxsmk-footer\" *ngIf=\"!isInlineMode\">\n                <button type=\"button\" class=\"ngxsmk-clear-button-footer\" (click)=\"clearValue($event)\" [disabled]=\"disabled\">\n                  Clear\n                </button>\n                <button type=\"button\" class=\"ngxsmk-close-button\" (click)=\"isCalendarOpen = false\" [disabled]=\"disabled\">\n                  Close\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, ControlValueAccessor {\n  @Input() mode: 'single' | 'range' | 'multiple' = 'single';\n  @Input() isInvalidDate: (date: Date) => boolean = () => false;\n  @Input() showRanges: boolean = true;\n  @Input() showTime: boolean = false;\n  @Input() minuteInterval: number = 1;\n  \n  // NEW: Holiday Provider Inputs\n  @Input() holidayProvider: HolidayProvider | null = null;\n  @Input() disableHolidays: boolean = false;\n  \n  // NEW: Disabled Dates Input\n  @Input() disabledDates: (string | Date)[] = [];\n  \n  // Popover/Input Mode\n  @Input() placeholder: string = 'Select Date';\n  @Input() inline: boolean | 'always' | 'auto' = false;\n  public isCalendarOpen: boolean = false;\n\n  public _internalValue: DatepickerValue = null;\n\n  private _startAtDate: Date | null = null;\n  @Input() set startAt(value: DateInput | null) { this._startAtDate = this._normalizeDate(value); }\n\n  private _locale: string = 'en-US';\n  @Input() set locale(value: string) { this._locale = value; }\n  get locale(): string { return this._locale; }\n\n  @Input() theme: 'light' | 'dark' = 'light';\n  @HostBinding('class.dark-theme') get isDarkMode() { return this.theme === 'dark'; }\n\n  private onChange = (_: any) => {};\n  private onTouched = () => {};\n  public disabled = false;\n  @Input() set disabledState(isDisabled: boolean) { this.disabled = isDisabled; }\n\n  @Output() valueChange = new EventEmitter<DatepickerValue>();\n  @Output() action = new EventEmitter<{ type: string; payload?: any }>();\n\n  private _minDate: Date | null = null;\n  @Input() set minDate(value: DateInput | null) { this._minDate = this._normalizeDate(value); }\n\n  private _maxDate: Date | null = null;\n  @Input() set maxDate(value: DateInput | null) { this._maxDate = this._normalizeDate(value); }\n\n  private _ranges: { [key: string]: [Date, Date] } | null = null;\n  @Input() set ranges(value: DateRange | null) {\n    this._ranges = processDateRanges(value);\n    this.updateRangesArray();\n  }\n\n  public currentDate: Date = new Date();\n  public daysInMonth: (Date | null)[] = [];\n  public weekDays: string[] = [];\n  public readonly today: Date = getStartOfDay(new Date());\n  public selectedDate: Date | null = null;\n  public selectedDates: Date[] = [];\n  public startDate: Date | null = null;\n  public endDate: Date | null = null;\n  public hoveredDate: Date | null = null;\n  public rangesArray: { key: string; value: [Date, Date] }[] = [];\n\n  private _currentMonth: number = this.currentDate.getMonth();\n  private _currentYear: number = this.currentDate.getFullYear();\n\n  public monthOptions: { label: string; value: number }[] = [];\n  public yearOptions: { label: string; value: number }[] = [];\n  private firstDayOfWeek: number = 0;\n\n  public currentHour: number = 0;\n  public currentMinute: number = 0;\n  public currentDisplayHour: number = 12;\n  public isPm: boolean = false;\n\n  public hourOptions: { label: string; value: number }[] = [];\n  public minuteOptions: { label: string; value: number }[] = [];\n  public ampmOptions: { label: string; value: boolean }[] = [\n    {label: 'AM', value: false},\n    {label: 'PM', value: true}\n  ];\n\n  // Animation state properties\n  \n  private readonly elementRef: ElementRef = inject(ElementRef);\n  private readonly cdr: ChangeDetectorRef = inject(ChangeDetectorRef);\n  private readonly dateComparator = createDateComparator();\n  \n  get isInlineMode(): boolean {\n    return this.inline === true || this.inline === 'always' || \n           (this.inline === 'auto' && typeof window !== 'undefined' && window.matchMedia('(min-width: 768px)').matches);\n  }\n\n  get isCalendarVisible(): boolean {\n    return this.isInlineMode || this.isCalendarOpen;\n  }\n  \n  get displayValue(): string {\n    if (this.mode === 'single' && this.selectedDate) {\n      const options: Intl.DateTimeFormatOptions = { \n        year: 'numeric', \n        month: 'short', \n        day: '2-digit'\n      };\n      \n      if (this.showTime) {\n        options.hour = '2-digit';\n        options.minute = '2-digit';\n      }\n      \n      return this.selectedDate.toLocaleString(this.locale, options);\n    } else if (this.mode === 'range' && this.startDate && this.endDate) {\n      const options: Intl.DateTimeFormatOptions = { \n        year: 'numeric', \n        month: 'short', \n        day: '2-digit' \n      };\n      const start = this.startDate.toLocaleString(this.locale, options);\n      const end = this.endDate.toLocaleString(this.locale, options);\n      return `${start} - ${end}`;\n    } else if (this.mode === 'multiple' && this.selectedDates.length > 0) {\n      return `${this.selectedDates.length} dates selected`;\n    }\n    return '';\n  }\n\n  get isBackArrowDisabled(): boolean {\n    if (!this._minDate) return false;\n    \n    // Get the first day of the current month\n    const firstDayOfCurrentMonth = new Date(this.currentYear, this.currentMonth, 1);\n    \n    // Check if the first day of current month is before or equal to minDate\n    return firstDayOfCurrentMonth <= this._minDate;\n  }\n\n  // Optimized getters for template performance\n  get isCurrentMonthMemo(): (day: Date | null) => boolean {\n    return (day: Date | null) => {\n      if (!day) return false;\n      return day.getMonth() === this._currentMonth && day.getFullYear() === this._currentYear;\n    };\n  }\n\n  get isDateDisabledMemo(): (day: Date | null) => boolean {\n    return (day: Date | null) => {\n      if (!day) return false;\n      return this.isDateDisabled(day);\n    };\n  }\n\n  get isSameDayMemo(): (d1: Date | null, d2: Date | null) => boolean {\n    return (d1: Date | null, d2: Date | null) => this.dateComparator(d1, d2);\n  }\n\n  get isHolidayMemo(): (day: Date | null) => boolean {\n    return (day: Date | null) => {\n      if (!day || !this.holidayProvider) return false;\n      const dateOnly = getStartOfDay(day);\n      return this.holidayProvider.isHoliday(dateOnly);\n    };\n  }\n\n  get getHolidayLabelMemo(): (day: Date | null) => string | null {\n    return (day: Date | null) => {\n      if (!day || !this.holidayProvider || !this.isHolidayMemo(day)) return null;\n      return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(day)) : 'Holiday';\n    };\n  }\n\n  // TrackBy functions for better performance\n  trackByDay(index: number, day: Date | null): string {\n    return day ? day.getTime().toString() : `empty-${index}`;\n  }\n\n  trackByRange(_index: number, range: { key: string; value: [Date, Date] }): string {\n    return range.key;\n  }\n  \n  @HostListener('document:click', ['$event'])\n  onDocumentClick(event: MouseEvent): void {\n    if (!this.isInlineMode && this.isCalendarOpen && !this.elementRef.nativeElement.contains(event.target)) {\n      this.isCalendarOpen = false;\n      this.cdr.markForCheck();\n    }\n  }\n\n\n  writeValue(val: DatepickerValue): void {\n    this._internalValue = val;\n    this.initializeValue(val);\n    this.generateCalendar();\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.disabled = isDisabled;\n  }\n\n  private emitValue(val: DatepickerValue) {\n    this._internalValue = val;\n    this.valueChange.emit(val);\n    this.onChange(val);\n    this.onTouched();\n    \n    // Auto-close popover when a selection is complete\n    if (!this.isInlineMode && val !== null) {\n      if (this.mode === 'single' || (this.mode === 'range' && this.startDate && this.endDate)) {\n        this.isCalendarOpen = false;\n      }\n    }\n  }\n  \n  public toggleCalendar(): void {\n    if (this.disabled || this.isInlineMode) return;\n    this.isCalendarOpen = !this.isCalendarOpen;\n    this.cdr.markForCheck();\n  }\n  \n  public clearValue(event?: MouseEvent): void {\n    if (event) event.stopPropagation();\n    if (this.disabled) return;\n    \n    this.selectedDate = null;\n    this.selectedDates = [];\n    this.startDate = null;\n    this.endDate = null;\n    this.hoveredDate = null;\n    this.isCalendarOpen = false;\n    \n    this.emitValue(null);\n    this.action.emit({type: 'clear', payload: null});\n    \n    // Reset view to today after clearing\n    this.currentDate = new Date();\n    this._currentMonth = this.currentDate.getMonth();\n    this._currentYear = this.currentDate.getFullYear();\n    this.generateCalendar();\n    this.cdr.markForCheck();\n  }\n\n  get currentMonth(): number { return this._currentMonth; }\n\n  set currentMonth(month: number) {\n    if (this.disabled) return;\n    if (this._currentMonth !== month) {\n      this._currentMonth = month;\n      this.currentDate.setMonth(month);\n      this.generateCalendar();\n      this.cdr.markForCheck();\n    }\n  }\n\n  get currentYear(): number { return this._currentYear; }\n\n  set currentYear(year: number) {\n    if (this.disabled) return;\n    if (this._currentYear !== year) {\n      this._currentYear = year;\n      this.currentDate.setFullYear(year);\n      this.generateCalendar();\n      this.cdr.markForCheck();\n    }\n  }\n\n  ngOnInit(): void {\n    if (this._locale === 'en-US' && typeof navigator !== 'undefined') {\n      this._locale = navigator.language;\n    }\n\n    this.today.setHours(0, 0, 0, 0);\n    this.generateLocaleData();\n    this.generateTimeOptions();\n\n    if (this.showTime && !this._internalValue) {\n      const now = new Date();\n      this.currentHour = now.getHours();\n      this.currentMinute = Math.floor(now.getMinutes() / this.minuteInterval) * this.minuteInterval;\n\n      if (this.currentMinute === 60) {\n        this.currentMinute = 0;\n        this.currentHour = (this.currentHour + 1) % 24;\n      }\n      this.update12HourState(this.currentHour);\n    }\n\n    if (this._internalValue) {\n      this.initializeValue(this._internalValue);\n    } else {\n      this.initializeValue(null);\n    }\n    this.generateCalendar();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['locale']) {\n      this.generateLocaleData();\n      this.generateCalendar();\n    }\n\n    if (changes['minuteInterval']) {\n      this.generateTimeOptions();\n      this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\n      this.onTimeChange();\n    }\n\n    if (changes['value'] && changes['value'].currentValue !== changes['value'].previousValue) {\n      this.writeValue(changes['value'].currentValue);\n    }\n    \n    // Rerun calendar generation if provider changes to refresh disabled states\n    if (changes['holidayProvider'] || changes['disableHolidays'] || changes['disabledDates']) {\n        this.generateCalendar();\n    }\n\n    if (changes['startAt']) {\n      if (!this._internalValue && this._startAtDate) {\n        this.currentDate = new Date(this._startAtDate);\n        this._currentMonth = this.currentDate.getMonth();\n        this._currentYear = this.currentDate.getFullYear();\n        this.generateCalendar();\n      }\n    }\n\n    // Handle minDate changes - if minDate is set and is in the future, \n    // and we don't have a current value, update the view to show minDate's month\n    if (changes['minDate'] && !this._internalValue) {\n      if (this._minDate) {\n        const today = new Date();\n        const minDateOnly = getStartOfDay(this._minDate);\n        const todayOnly = getStartOfDay(today);\n        \n        // If minDate is in the future, update the view to show minDate's month\n        if (minDateOnly.getTime() > todayOnly.getTime()) {\n          this.currentDate = new Date(this._minDate);\n          this._currentMonth = this.currentDate.getMonth();\n          this._currentYear = this.currentDate.getFullYear();\n          this.generateCalendar();\n        }\n      }\n    }\n  }\n\n  private get24Hour(displayHour: number, isPm: boolean): number {\n    return get24Hour(displayHour, isPm);\n  }\n\n  private update12HourState(fullHour: number): void {\n    const state = update12HourState(fullHour);\n    this.isPm = state.isPm;\n    this.currentDisplayHour = state.displayHour;\n  }\n\n  private applyCurrentTime(date: Date): Date {\n    this.currentHour = this.get24Hour(this.currentDisplayHour, this.isPm);\n    date.setHours(this.currentHour, this.currentMinute, 0, 0);\n    return date;\n  }\n\n  private initializeValue(value: DatepickerValue): void {\n    let initialDate: Date | null = null;\n\n    this.selectedDate = null;\n    this.startDate = null;\n    this.endDate = null;\n    this.selectedDates = [];\n\n    if (value) {\n      if (this.mode === 'single' && value instanceof Date) {\n        this.selectedDate = this._normalizeDate(value);\n        initialDate = this.selectedDate;\n      } else if (this.mode === 'range' && typeof value === 'object' && 'start' in value && 'end' in value) {\n        this.startDate = this._normalizeDate((value as {start: Date, end: Date}).start);\n        this.endDate = this._normalizeDate((value as {start: Date, end: Date}).end);\n        initialDate = this.startDate;\n      } else if (this.mode === 'multiple' && Array.isArray(value)) {\n        this.selectedDates = (value as Date[]).map(d => this._normalizeDate(d)).filter((d): d is Date => d !== null);\n        initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1]! : null;\n      }\n    }\n\n    // Determine the initial view date\n    let viewCenterDate = initialDate || this._startAtDate;\n    \n    // If no specific date is set and minDate is in the future, use minDate's month\n    if (!viewCenterDate && this._minDate) {\n      const today = new Date();\n      const minDateOnly = getStartOfDay(this._minDate);\n      const todayOnly = getStartOfDay(today);\n      \n      // If minDate is in the future, use minDate as the initial view\n      if (minDateOnly.getTime() > todayOnly.getTime()) {\n        viewCenterDate = this._minDate;\n      }\n    }\n    \n    // Fallback to current date if no other date is determined\n    if (!viewCenterDate) {\n      viewCenterDate = new Date();\n    }\n\n    if (viewCenterDate) {\n      this.currentDate = new Date(viewCenterDate);\n      this._currentMonth = viewCenterDate.getMonth();\n      this._currentYear = viewCenterDate.getFullYear();\n      this.currentHour = viewCenterDate.getHours();\n      this.currentMinute = viewCenterDate.getMinutes();\n      this.update12HourState(this.currentHour);\n      this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\n    }\n  }\n\n  private _normalizeDate(date: DateInput | null): Date | null {\n    return normalizeDate(date);\n  }\n\n  private parseDateString(dateString: string): Date | null {\n    try {\n      // Handle MM/DD/YYYY format\n      const date = new Date(dateString);\n      if (isNaN(date.getTime())) {\n        return null;\n      }\n      return getStartOfDay(date);\n    } catch (error) {\n      return null;\n    }\n  }\n\n  private generateTimeOptions(): void {\n    const { hourOptions, minuteOptions } = generateTimeOptions(this.minuteInterval);\n    this.hourOptions = hourOptions;\n    this.minuteOptions = minuteOptions;\n  }\n\n  private generateLocaleData(): void {\n    const year = new Date().getFullYear();\n    this.monthOptions = generateMonthOptions(this.locale, year);\n    this.firstDayOfWeek = getFirstDayOfWeek(this.locale);\n    this.weekDays = generateWeekDays(this.locale, this.firstDayOfWeek);\n  }\n\n  private updateRangesArray(): void {\n    this.rangesArray = this._ranges ? Object.entries(this._ranges).map(([key, value]) => ({key, value})) : [];\n  }\n\n  public selectRange(range: [Date, Date]): void {\n    if (this.disabled) return;\n    this.startDate = this.applyCurrentTime(range[0]);\n    this.endDate = this.applyCurrentTime(range[1]);\n\n    if (this.startDate && this.endDate) {\n      this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n    }\n\n    this.currentDate = new Date(this.startDate);\n    this.initializeValue({start: this.startDate, end: this.endDate});\n    this.generateCalendar();\n    this.action.emit({type: 'rangeSelected', payload: {start: this.startDate, end: this.endDate, key: this.rangesArray.find(r => r.value === range)?.key}});\n    this.cdr.markForCheck();\n  }\n  \n  // NEW: Check if a date is a holiday\n  public isHoliday(date: Date | null): boolean {\n    if (!date || !this.holidayProvider) return false;\n    const dateOnly = getStartOfDay(date);\n    return this.holidayProvider.isHoliday(dateOnly);\n  }\n  \n  // NEW: Get holiday label\n  public getHolidayLabel(date: Date | null): string | null {\n    if (!date || !this.holidayProvider || !this.isHoliday(date)) return null;\n    return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(date)) : 'Holiday';\n  }\n\n  public isDateDisabled(date: Date | null): boolean {\n    if (!date) return false;\n\n    const dateOnly = getStartOfDay(date);\n\n    // 1. Check disabled dates array\n    if (this.disabledDates.length > 0) {\n      for (const disabledDate of this.disabledDates) {\n        let parsedDate: Date | null;\n        \n        if (typeof disabledDate === 'string') {\n          parsedDate = this.parseDateString(disabledDate);\n        } else {\n          parsedDate = getStartOfDay(disabledDate);\n        }\n        \n        if (parsedDate && dateOnly.getTime() === parsedDate.getTime()) {\n          return true;\n        }\n      }\n    }\n\n    // 2. Check holiday provider for disabling\n    if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {\n      return true;\n    }\n\n    // 3. Check min/max date\n    if (this._minDate) {\n      const minDateOnly = getStartOfDay(this._minDate);\n      if (dateOnly.getTime() < minDateOnly.getTime()) return true;\n    }\n    if (this._maxDate) {\n      const maxDateOnly = getStartOfDay(this._maxDate);\n      if (dateOnly.getTime() > maxDateOnly.getTime()) return true;\n    }\n    \n    // 4. Check custom invalid date function\n    return this.isInvalidDate(date);\n  }\n\n  public isMultipleSelected(d: Date | null): boolean {\n    if (!d || this.mode !== 'multiple') return false;\n    const dTime = getStartOfDay(d).getTime();\n    return this.selectedDates.some(selected => getStartOfDay(selected).getTime() === dTime);\n  }\n\n  public onTimeChange(): void {\n    if (this.disabled) return;\n    if (this.mode === 'single' && this.selectedDate) {\n      this.selectedDate = this.applyCurrentTime(this.selectedDate);\n      this.emitValue(this.selectedDate);\n    } else if (this.mode === 'range' && this.startDate && this.endDate) {\n      this.startDate = this.applyCurrentTime(this.startDate);\n      this.endDate = this.applyCurrentTime(this.endDate);\n      this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n    } else if (this.mode === 'range' && this.startDate && !this.endDate) {\n      this.startDate = this.applyCurrentTime(this.startDate);\n    } else if (this.mode === 'multiple') {\n      this.selectedDates = this.selectedDates.map(date => {\n        const newDate = getStartOfDay(date);\n        return this.applyCurrentTime(newDate);\n      });\n      this.emitValue([...this.selectedDates]);\n    }\n\n    this.action.emit({type: 'timeChanged', payload: {hour: this.currentHour, minute: this.currentMinute}});\n    this.cdr.markForCheck();\n  }\n\n  public onDateClick(day: Date | null): void {\n    if (!day || this.disabled) return;\n    \n    // Only check isDateDisabled for current month days\n    if (this.isCurrentMonth(day) && this.isDateDisabled(day)) return;\n\n    const dateToToggle = getStartOfDay(day);\n\n    if (this.mode === 'single') {\n      this.selectedDate = this.applyCurrentTime(day);\n      this.emitValue(this.selectedDate);\n    } else if (this.mode === 'range') {\n      if (!this.startDate || (this.startDate && this.endDate)) {\n        this.startDate = this.applyCurrentTime(day);\n        this.endDate = null;\n      } else if (day && this.startDate && day >= this.startDate) {\n        this.endDate = this.applyCurrentTime(day);\n        this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n      } else {\n        this.startDate = this.applyCurrentTime(day);\n        this.endDate = null;\n      }\n      this.hoveredDate = null;\n    } else if (this.mode === 'multiple') {\n      const existingIndex = this.selectedDates.findIndex(d => this.isSameDay(d, dateToToggle));\n\n      if (existingIndex > -1) {\n        this.selectedDates.splice(existingIndex, 1);\n      } else {\n        const dateWithTime = this.applyCurrentTime(dateToToggle);\n        this.selectedDates.push(dateWithTime);\n        this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\n      }\n      this.emitValue([...this.selectedDates]);\n    }\n\n    const dateToSync = this.mode === 'single' ? this.selectedDate :\n      this.mode === 'range' ? this.startDate :\n        this.mode === 'multiple' && this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;\n\n    if (dateToSync) {\n      this.update12HourState(dateToSync.getHours());\n      this.currentMinute = dateToSync.getMinutes();\n    }\n\n    this.action.emit({\n      type: 'dateSelected',\n      payload: {\n        mode: this.mode,\n        value: this._internalValue,\n        date: day\n      }\n    });\n    \n    this.cdr.markForCheck();\n  }\n\n  public onDateHover(day: Date | null): void {\n    if (this.mode === 'range' && this.startDate && !this.endDate && day) {\n      this.hoveredDate = day;\n      this.cdr.markForCheck();\n    }\n  }\n\n  public isPreviewInRange(day: Date | null): boolean {\n    if (this.mode !== 'range' || !this.startDate || this.endDate || !this.hoveredDate || !day) return false;\n    const start = getStartOfDay(this.startDate).getTime();\n    const end = getStartOfDay(this.hoveredDate).getTime();\n    const time = getStartOfDay(day).getTime();\n    return time > Math.min(start, end) && time < Math.max(start, end);\n  }\n\n  public generateCalendar(): void {\n    this.daysInMonth = [];\n    const year = this.currentDate.getFullYear();\n    const month = this.currentDate.getMonth();\n    this._currentMonth = month;\n    this._currentYear = year;\n    this.generateDropdownOptions();\n    const firstDayOfMonth = new Date(year, month, 1);\n    const lastDayOfMonth = new Date(year, month + 1, 0);\n    const startDayOfWeek = firstDayOfMonth.getDay();\n    const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;\n\n    // Add previous month's days instead of null values\n    const previousMonth = month === 0 ? 11 : month - 1;\n    const previousYear = month === 0 ? year - 1 : year;\n    const lastDayOfPreviousMonth = new Date(previousYear, previousMonth + 1, 0);\n    \n    for (let i = 0; i < emptyCellCount; i++) {\n      const dayNumber = lastDayOfPreviousMonth.getDate() - emptyCellCount + i + 1;\n      this.daysInMonth.push(this._normalizeDate(new Date(previousYear, previousMonth, dayNumber)));\n    }\n    for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\n      this.daysInMonth.push(this._normalizeDate(new Date(year, month, i)));\n    }\n\n    this.cdr.markForCheck();\n\n    this.action.emit({\n      type: 'calendarGenerated',\n      payload: {\n        month: month,\n        year: year,\n        days: this.daysInMonth.filter(d => d !== null)\n      }\n    });\n  }\n\n  private generateDropdownOptions(): void {\n    this.yearOptions = generateYearOptions(this._currentYear);\n  }\n\n  public changeMonth(delta: number): void {\n    if (this.disabled) return;\n\n    // Check if going back is disabled due to minDate constraint\n    if (delta < 0 && this.isBackArrowDisabled) return;\n\n    const newDate = addMonths(this.currentDate, delta);\n\n    // Update the data immediately (no animation)\n    this.currentDate = newDate;\n    this._currentMonth = newDate.getMonth();\n    this._currentYear = newDate.getFullYear();\n\n    // Generate new calendar view\n    this.generateCalendar();\n\n    this.action.emit({type: 'monthChanged', payload: { delta: delta }});\n    this.cdr.markForCheck();\n  }\n\n  public isSameDay(d1: Date | null, d2: Date | null): boolean {\n    return this.dateComparator(d1, d2);\n  }\n\n  public isCurrentMonth(day: Date | null): boolean {\n    if (!day) return false;\n    return day.getMonth() === this._currentMonth && day.getFullYear() === this._currentYear;\n  }\n\n  public isInRange(d: Date | null): boolean {\n    if (!d || !this.startDate || !this.endDate) return false;\n\n    const dTime = getStartOfDay(d).getTime();\n    const startDayTime = getStartOfDay(this.startDate).getTime();\n    const endDayTime = getStartOfDay(this.endDate).getTime();\n\n    const startTime = Math.min(startDayTime, endDayTime);\n    const endTime = Math.max(startDayTime, endDayTime);\n\n    return dTime > startTime && dTime < endTime;\n  }\n\n  ngOnDestroy(): void {\n    // Clean up any subscriptions or timers if needed\n    this.selectedDate = null;\n    this.selectedDates = [];\n    this.startDate = null;\n    this.endDate = null;\n    this.hoveredDate = null;\n    this._internalValue = null;\n    \n    // Clear any cached data\n    if (this.dateComparator && typeof this.dateComparator === 'function') {\n      // Clear any internal caches if they exist\n    }\n  }\n}","/*\n * Public API Surface of ngxsmk-datepicker\n */\n\nexport * from './lib/ngxsmk-datepicker';\nexport * from './lib/components/custom-select.component';\nexport * from './lib/utils/date.utils';\nexport * from './lib/utils/calendar.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}