{"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 {\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  forwardRef,\r\n  HostBinding,\r\n  HostListener,\r\n  inject,\r\n  Input,\r\n  OnChanges,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n  ChangeDetectionStrategy,\r\n  OnDestroy,\r\n  ChangeDetectorRef,\r\n} from '@angular/core';\r\nimport {CommonModule, DatePipe} from '@angular/common';\r\nimport {\r\n  ControlValueAccessor,\r\n  FormsModule,\r\n  NG_VALUE_ACCESSOR,\r\n  ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport {\r\n  getStartOfDay,\r\n  addMonths,\r\n  normalizeDate,\r\n  DateInput,\r\n} from './utils/date.utils';\r\nimport {\r\n  HolidayProvider,\r\n  DateRange,\r\n  DatepickerValue,\r\n  generateMonthOptions,\r\n  generateYearOptions,\r\n  generateTimeOptions,\r\n  generateWeekDays,\r\n  getFirstDayOfWeek,\r\n  get24Hour,\r\n  update12HourState,\r\n  processDateRanges,\r\n} from './utils/calendar.utils';\r\nimport { CustomSelectComponent } from './components/custom-select.component';\r\nimport { createDateComparator } from './utils/performance.utils';\r\n\r\n\r\n@Component({\r\n  selector: 'ngxsmk-datepicker',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule, CustomSelectComponent, DatePipe, ReactiveFormsModule],\r\n  providers: [{\r\n    provide: NG_VALUE_ACCESSOR,\r\n    useExisting: forwardRef(() => NgxsmkDatepickerComponent),\r\n    multi: true\r\n  }],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  styleUrls: ['./styles/datepicker.css'],\r\n  template: `\r\n    <div class=\"ngxsmk-datepicker-wrapper\" [class.ngxsmk-inline-mode]=\"isInlineMode\">\r\n      @if (!isInlineMode) {\r\n        <div class=\"ngxsmk-input-group\" (click)=\"toggleCalendar()\" [class.disabled]=\"disabled\">\r\n          <input type=\"text\" \r\n                 [value]=\"displayValue\" \r\n                 [placeholder]=\"placeholder\" \r\n                 readonly \r\n                 [disabled]=\"disabled\"\r\n                 class=\"ngxsmk-display-input\">\r\n          <button type=\"button\" class=\"ngxsmk-clear-button\" (click)=\"clearValue($event)\" [disabled]=\"disabled\" *ngIf=\"displayValue\">\r\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>\r\n          </button>\r\n        </div>\r\n      }\r\n\r\n      @if (isCalendarVisible) {\r\n        <div class=\"ngxsmk-popover-container\" [class.ngxsmk-inline-container]=\"isInlineMode\">\r\n          <div class=\"ngxsmk-datepicker-container\">\r\n            @if (showRanges && rangesArray.length > 0 && mode === 'range') {\r\n              <div class=\"ngxsmk-ranges-container\">\r\n                <ul>\r\n                  @for (range of rangesArray; track trackByRange($index, range)) {\r\n                    <li (click)=\"selectRange(range.value)\" [class.disabled]=\"disabled\">{{ range.key }}</li>\r\n                  }\r\n                </ul>\r\n              </div>\r\n            }\r\n            <div class=\"ngxsmk-calendar-container\">\r\n              <div class=\"ngxsmk-header\">\r\n                <div class=\"ngxsmk-month-year-selects\">\r\n                  <ngxsmk-custom-select class=\"month-select\" [options]=\"monthOptions\"\r\n                                    [(value)]=\"currentMonth\" [disabled]=\"disabled\"></ngxsmk-custom-select>\r\n                  <ngxsmk-custom-select class=\"year-select\" [options]=\"yearOptions\" [(value)]=\"currentYear\" [disabled]=\"disabled\"></ngxsmk-custom-select>\r\n                </div>\r\n                <div class=\"ngxsmk-nav-buttons\">\r\n                  <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"disabled || isBackArrowDisabled\">\r\n                    <svg 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=\"M328 112L184 256l144 144\"/>\r\n                    </svg>\r\n                  </button>\r\n                  <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"disabled\">\r\n                    <svg 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=\"M184 112l144 144-144 144\"/>\r\n                    </svg>\r\n                  </button>\r\n                </div>\r\n              </div>\r\n              <div class=\"ngxsmk-days-grid-wrapper\">\r\n                <div class=\"ngxsmk-days-grid\">\r\n                  @for (day of weekDays; track day) {\r\n                    <div class=\"ngxsmk-day-name\">{{ day }}</div>\r\n                  }\r\n                  @for (day of daysInMonth; track trackByDay($index, day)) {\r\n                    <div class=\"ngxsmk-day-cell\"\r\n                        [class.empty]=\"!isCurrentMonthMemo(day)\" [class.disabled]=\"isDateDisabledMemo(day)\" \r\n                        [class.today]=\"isSameDayMemo(day, today)\"\r\n                        [class.holiday]=\"isHolidayMemo(day)\"\r\n                        [class.selected]=\"mode === 'single' && isSameDayMemo(day, selectedDate)\"\r\n                        [class.multiple-selected]=\"mode === 'multiple' && isMultipleSelected(day)\"\r\n                        [class.start-date]=\"mode === 'range' && isSameDayMemo(day, startDate)\"\r\n                        [class.end-date]=\"mode === 'range' && isSameDayMemo(day, endDate)\"\r\n                        [class.in-range]=\"mode === 'range' && isInRange(day)\"\r\n                        [class.preview-range]=\"isPreviewInRange(day)\"\r\n                        (click)=\"onDateClick(day)\" (mouseenter)=\"onDateHover(day)\">\r\n                      @if (day) {\r\n                        <div class=\"ngxsmk-day-number\" [attr.title]=\"getHolidayLabelMemo(day)\">{{ day | date : 'd' }}</div>\r\n                      }\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              @if (showTime) {\r\n                <div class=\"ngxsmk-time-selection\">\r\n                  <span class=\"ngxsmk-time-label\">Time:</span>\r\n                  <ngxsmk-custom-select\r\n                    class=\"hour-select\"\r\n                    [options]=\"hourOptions\"\r\n                    [(value)]=\"currentDisplayHour\"\r\n                    (valueChange)=\"onTimeChange()\"\r\n                    [disabled]=\"disabled\"\r\n                  ></ngxsmk-custom-select>\r\n                  <span class=\"ngxsmk-time-separator\">:</span>\r\n                  <ngxsmk-custom-select\r\n                    class=\"minute-select\"\r\n                    [options]=\"minuteOptions\"\r\n                    [(value)]=\"currentMinute\"\r\n                    (valueChange)=\"onTimeChange()\"\r\n                    [disabled]=\"disabled\"\r\n                  ></ngxsmk-custom-select>\r\n                  <ngxsmk-custom-select\r\n                    class=\"ampm-select\"\r\n                    [options]=\"ampmOptions\"\r\n                    [(value)]=\"isPm\"\r\n                    (valueChange)=\"onTimeChange()\"\r\n                    [disabled]=\"disabled\"\r\n                  ></ngxsmk-custom-select>\r\n                </div>\r\n              }\r\n              \r\n              <div class=\"ngxsmk-footer\" *ngIf=\"!isInlineMode\">\r\n                <button type=\"button\" class=\"ngxsmk-clear-button-footer\" (click)=\"clearValue($event)\" [disabled]=\"disabled\">\r\n                  Clear\r\n                </button>\r\n                <button type=\"button\" class=\"ngxsmk-close-button\" (click)=\"isCalendarOpen = false\" [disabled]=\"disabled\">\r\n                  Close\r\n                </button>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      }\r\n    </div>\r\n  `,\r\n})\r\nexport class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, ControlValueAccessor {\r\n  @Input() mode: 'single' | 'range' | 'multiple' = 'single';\r\n  @Input() isInvalidDate: (date: Date) => boolean = () => false;\r\n  @Input() showRanges: boolean = true;\r\n  @Input() showTime: boolean = false;\r\n  @Input() minuteInterval: number = 1;\r\n  @Input() holidayProvider: HolidayProvider | null = null;\r\n  @Input() disableHolidays: boolean = false;\r\n  @Input() disabledDates: (string | Date)[] = [];\r\n  @Input() placeholder: string = 'Select Date';\r\n  @Input() inline: boolean | 'always' | 'auto' = false;\r\n  public isCalendarOpen: boolean = false;\r\n\r\n  public _internalValue: DatepickerValue = null;\r\n\r\n  private _startAtDate: Date | null = null;\r\n  @Input() set startAt(value: DateInput | null) { this._startAtDate = this._normalizeDate(value); }\r\n\r\n  private _locale: string = 'en-US';\r\n  @Input() set locale(value: string) { this._locale = value; }\r\n  get locale(): string { return this._locale; }\r\n\r\n  @Input() theme: 'light' | 'dark' = 'light';\r\n  @HostBinding('class.dark-theme') get isDarkMode() { return this.theme === 'dark'; }\r\n\r\n  private onChange = (_: any) => {};\r\n  private onTouched = () => {};\r\n  public disabled = false;\r\n  @Input() set disabledState(isDisabled: boolean) { this.disabled = isDisabled; }\r\n\r\n  @Output() valueChange = new EventEmitter<DatepickerValue>();\r\n  @Output() action = new EventEmitter<{ type: string; payload?: any }>();\r\n\r\n  private _minDate: Date | null = null;\r\n  @Input() set minDate(value: DateInput | null) { this._minDate = this._normalizeDate(value); }\r\n\r\n  private _maxDate: Date | null = null;\r\n  @Input() set maxDate(value: DateInput | null) { this._maxDate = this._normalizeDate(value); }\r\n\r\n  private _ranges: { [key: string]: [Date, Date] } | null = null;\r\n  @Input() set ranges(value: DateRange | null) {\r\n    this._ranges = processDateRanges(value);\r\n    this.updateRangesArray();\r\n  }\r\n\r\n  public currentDate: Date = new Date();\r\n  public daysInMonth: (Date | null)[] = [];\r\n  public weekDays: string[] = [];\r\n  public readonly today: Date = getStartOfDay(new Date());\r\n  public selectedDate: Date | null = null;\r\n  public selectedDates: Date[] = [];\r\n  public startDate: Date | null = null;\r\n  public endDate: Date | null = null;\r\n  public hoveredDate: Date | null = null;\r\n  public rangesArray: { key: string; value: [Date, Date] }[] = [];\r\n\r\n  private _currentMonth: number = this.currentDate.getMonth();\r\n  private _currentYear: number = this.currentDate.getFullYear();\r\n\r\n  public monthOptions: { label: string; value: number }[] = [];\r\n  public yearOptions: { label: string; value: number }[] = [];\r\n  private firstDayOfWeek: number = 0;\r\n\r\n  public currentHour: number = 0;\r\n  public currentMinute: number = 0;\r\n  public currentDisplayHour: number = 12;\r\n  public isPm: boolean = false;\r\n\r\n  public hourOptions: { label: string; value: number }[] = [];\r\n  public minuteOptions: { label: string; value: number }[] = [];\r\n  public ampmOptions: { label: string; value: boolean }[] = [\r\n    {label: 'AM', value: false},\r\n    {label: 'PM', value: true}\r\n  ];\r\n\r\n  private readonly elementRef: ElementRef = inject(ElementRef);\r\n  private readonly cdr: ChangeDetectorRef = inject(ChangeDetectorRef);\r\n  private readonly dateComparator = createDateComparator();\r\n  \r\n  get isInlineMode(): boolean {\r\n    return this.inline === true || this.inline === 'always' || \r\n           (this.inline === 'auto' && typeof window !== 'undefined' && window.matchMedia('(min-width: 768px)').matches);\r\n  }\r\n\r\n  get isCalendarVisible(): boolean {\r\n    return this.isInlineMode || this.isCalendarOpen;\r\n  }\r\n  \r\n  get displayValue(): string {\r\n    if (this.mode === 'single' && this.selectedDate) {\r\n      const options: Intl.DateTimeFormatOptions = { \r\n        year: 'numeric', \r\n        month: 'short', \r\n        day: '2-digit'\r\n      };\r\n      \r\n      if (this.showTime) {\r\n        options.hour = '2-digit';\r\n        options.minute = '2-digit';\r\n      }\r\n      \r\n      return this.selectedDate.toLocaleString(this.locale, options);\r\n    } else if (this.mode === 'range' && this.startDate && this.endDate) {\r\n      const options: Intl.DateTimeFormatOptions = { \r\n        year: 'numeric', \r\n        month: 'short', \r\n        day: '2-digit' \r\n      };\r\n      const start = this.startDate.toLocaleString(this.locale, options);\r\n      const end = this.endDate.toLocaleString(this.locale, options);\r\n      return `${start} - ${end}`;\r\n    } else if (this.mode === 'multiple' && this.selectedDates.length > 0) {\r\n      return `${this.selectedDates.length} dates selected`;\r\n    }\r\n    return '';\r\n  }\r\n\r\n  get isBackArrowDisabled(): boolean {\r\n    if (!this._minDate) return false;\r\n    const firstDayOfCurrentMonth = new Date(this.currentYear, this.currentMonth, 1);\r\n    return firstDayOfCurrentMonth <= this._minDate;\r\n  }\r\n  get isCurrentMonthMemo(): (day: Date | null) => boolean {\r\n    return (day: Date | null) => {\r\n      if (!day) return false;\r\n      return day.getMonth() === this._currentMonth && day.getFullYear() === this._currentYear;\r\n    };\r\n  }\r\n\r\n  get isDateDisabledMemo(): (day: Date | null) => boolean {\r\n    return (day: Date | null) => {\r\n      if (!day) return false;\r\n      return this.isDateDisabled(day);\r\n    };\r\n  }\r\n\r\n  get isSameDayMemo(): (d1: Date | null, d2: Date | null) => boolean {\r\n    return (d1: Date | null, d2: Date | null) => this.dateComparator(d1, d2);\r\n  }\r\n\r\n  get isHolidayMemo(): (day: Date | null) => boolean {\r\n    return (day: Date | null) => {\r\n      if (!day || !this.holidayProvider) return false;\r\n      const dateOnly = getStartOfDay(day);\r\n      return this.holidayProvider.isHoliday(dateOnly);\r\n    };\r\n  }\r\n\r\n  get getHolidayLabelMemo(): (day: Date | null) => string | null {\r\n    return (day: Date | null) => {\r\n      if (!day || !this.holidayProvider || !this.isHolidayMemo(day)) return null;\r\n      return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(day)) : 'Holiday';\r\n    };\r\n  }\r\n\r\n  trackByDay(index: number, day: Date | null): string {\r\n    return day ? day.getTime().toString() : `empty-${index}`;\r\n  }\r\n\r\n  trackByRange(_index: number, range: { key: string; value: [Date, Date] }): string {\r\n    return range.key;\r\n  }\r\n  \r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: MouseEvent): void {\r\n    if (!this.isInlineMode && this.isCalendarOpen && !this.elementRef.nativeElement.contains(event.target)) {\r\n      this.isCalendarOpen = false;\r\n      this.cdr.markForCheck();\r\n    }\r\n  }\r\n\r\n\r\n  writeValue(val: DatepickerValue): void {\r\n    this._internalValue = val;\r\n    this.initializeValue(val);\r\n    this.generateCalendar();\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  private emitValue(val: DatepickerValue) {\r\n    this._internalValue = val;\r\n    this.valueChange.emit(val);\r\n    this.onChange(val);\r\n    this.onTouched();\r\n    \r\n    if (!this.isInlineMode && val !== null) {\r\n      if (this.mode === 'single' || (this.mode === 'range' && this.startDate && this.endDate)) {\r\n        this.isCalendarOpen = false;\r\n      }\r\n    }\r\n  }\r\n  \r\n  public toggleCalendar(): void {\r\n    if (this.disabled || this.isInlineMode) return;\r\n    this.isCalendarOpen = !this.isCalendarOpen;\r\n    this.cdr.markForCheck();\r\n  }\r\n  \r\n  public clearValue(event?: MouseEvent): void {\r\n    if (event) event.stopPropagation();\r\n    if (this.disabled) return;\r\n    \r\n    this.selectedDate = null;\r\n    this.selectedDates = [];\r\n    this.startDate = null;\r\n    this.endDate = null;\r\n    this.hoveredDate = null;\r\n    this.isCalendarOpen = false;\r\n    \r\n    this.emitValue(null);\r\n    this.action.emit({type: 'clear', payload: null});\r\n    this.currentDate = new Date();\r\n    this._currentMonth = this.currentDate.getMonth();\r\n    this._currentYear = this.currentDate.getFullYear();\r\n    this.generateCalendar();\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  get currentMonth(): number { return this._currentMonth; }\r\n\r\n  set currentMonth(month: number) {\r\n    if (this.disabled) return;\r\n    if (this._currentMonth !== month) {\r\n      this._currentMonth = month;\r\n      this.currentDate.setMonth(month);\r\n      this.generateCalendar();\r\n      this.cdr.markForCheck();\r\n    }\r\n  }\r\n\r\n  get currentYear(): number { return this._currentYear; }\r\n\r\n  set currentYear(year: number) {\r\n    if (this.disabled) return;\r\n    if (this._currentYear !== year) {\r\n      this._currentYear = year;\r\n      this.currentDate.setFullYear(year);\r\n      this.generateCalendar();\r\n      this.cdr.markForCheck();\r\n    }\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    if (this._locale === 'en-US' && typeof navigator !== 'undefined') {\r\n      this._locale = navigator.language;\r\n    }\r\n\r\n    this.today.setHours(0, 0, 0, 0);\r\n    this.generateLocaleData();\r\n    this.generateTimeOptions();\r\n\r\n    if (this.showTime && !this._internalValue) {\r\n      const now = new Date();\r\n      this.currentHour = now.getHours();\r\n      this.currentMinute = Math.floor(now.getMinutes() / this.minuteInterval) * this.minuteInterval;\r\n\r\n      if (this.currentMinute === 60) {\r\n        this.currentMinute = 0;\r\n        this.currentHour = (this.currentHour + 1) % 24;\r\n      }\r\n      this.update12HourState(this.currentHour);\r\n    }\r\n\r\n    if (this._internalValue) {\r\n      this.initializeValue(this._internalValue);\r\n    } else {\r\n      this.initializeValue(null);\r\n    }\r\n    this.generateCalendar();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['locale']) {\r\n      this.generateLocaleData();\r\n      this.generateCalendar();\r\n    }\r\n\r\n    if (changes['minuteInterval']) {\r\n      this.generateTimeOptions();\r\n      this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\r\n      this.onTimeChange();\r\n    }\r\n\r\n    if (changes['value'] && changes['value'].currentValue !== changes['value'].previousValue) {\r\n      this.writeValue(changes['value'].currentValue);\r\n    }\r\n    \r\n    // Rerun calendar generation if provider changes to refresh disabled states\r\n    if (changes['holidayProvider'] || changes['disableHolidays'] || changes['disabledDates']) {\r\n        this.generateCalendar();\r\n    }\r\n\r\n    if (changes['startAt']) {\r\n      if (!this._internalValue && this._startAtDate) {\r\n        this.currentDate = new Date(this._startAtDate);\r\n        this._currentMonth = this.currentDate.getMonth();\r\n        this._currentYear = this.currentDate.getFullYear();\r\n        this.generateCalendar();\r\n      }\r\n    }\r\n\r\n    // Handle minDate changes - if minDate is set and is in the future, \r\n    // and we don't have a current value, update the view to show minDate's month\r\n    if (changes['minDate'] && !this._internalValue) {\r\n      if (this._minDate) {\r\n        const today = new Date();\r\n        const minDateOnly = getStartOfDay(this._minDate);\r\n        const todayOnly = getStartOfDay(today);\r\n        \r\n        // If minDate is in the future, update the view to show minDate's month\r\n        if (minDateOnly.getTime() > todayOnly.getTime()) {\r\n          this.currentDate = new Date(this._minDate);\r\n          this._currentMonth = this.currentDate.getMonth();\r\n          this._currentYear = this.currentDate.getFullYear();\r\n          this.generateCalendar();\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private get24Hour(displayHour: number, isPm: boolean): number {\r\n    return get24Hour(displayHour, isPm);\r\n  }\r\n\r\n  private update12HourState(fullHour: number): void {\r\n    const state = update12HourState(fullHour);\r\n    this.isPm = state.isPm;\r\n    this.currentDisplayHour = state.displayHour;\r\n  }\r\n\r\n  private applyCurrentTime(date: Date): Date {\r\n    this.currentHour = this.get24Hour(this.currentDisplayHour, this.isPm);\r\n    date.setHours(this.currentHour, this.currentMinute, 0, 0);\r\n    return date;\r\n  }\r\n\r\n  private initializeValue(value: DatepickerValue): void {\r\n    let initialDate: Date | null = null;\r\n\r\n    this.selectedDate = null;\r\n    this.startDate = null;\r\n    this.endDate = null;\r\n    this.selectedDates = [];\r\n\r\n    if (value) {\r\n      if (this.mode === 'single' && value instanceof Date) {\r\n        this.selectedDate = this._normalizeDate(value);\r\n        initialDate = this.selectedDate;\r\n      } else if (this.mode === 'range' && typeof value === 'object' && 'start' in value && 'end' in value) {\r\n        this.startDate = this._normalizeDate((value as {start: Date, end: Date}).start);\r\n        this.endDate = this._normalizeDate((value as {start: Date, end: Date}).end);\r\n        initialDate = this.startDate;\r\n      } else if (this.mode === 'multiple' && Array.isArray(value)) {\r\n        this.selectedDates = (value as Date[]).map(d => this._normalizeDate(d)).filter((d): d is Date => d !== null);\r\n        initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1]! : null;\r\n      }\r\n    }\r\n\r\n    // Determine the initial view date\r\n    let viewCenterDate = initialDate || this._startAtDate;\r\n    \r\n    // If no specific date is set and minDate is in the future, use minDate's month\r\n    if (!viewCenterDate && this._minDate) {\r\n      const today = new Date();\r\n      const minDateOnly = getStartOfDay(this._minDate);\r\n      const todayOnly = getStartOfDay(today);\r\n      \r\n      // If minDate is in the future, use minDate as the initial view\r\n      if (minDateOnly.getTime() > todayOnly.getTime()) {\r\n        viewCenterDate = this._minDate;\r\n      }\r\n    }\r\n    \r\n    // Fallback to current date if no other date is determined\r\n    if (!viewCenterDate) {\r\n      viewCenterDate = new Date();\r\n    }\r\n\r\n    if (viewCenterDate) {\r\n      this.currentDate = new Date(viewCenterDate);\r\n      this._currentMonth = viewCenterDate.getMonth();\r\n      this._currentYear = viewCenterDate.getFullYear();\r\n      this.currentHour = viewCenterDate.getHours();\r\n      this.currentMinute = viewCenterDate.getMinutes();\r\n      this.update12HourState(this.currentHour);\r\n      this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\r\n    }\r\n  }\r\n\r\n  private _normalizeDate(date: DateInput | null): Date | null {\r\n    return normalizeDate(date);\r\n  }\r\n\r\n  private parseDateString(dateString: string): Date | null {\r\n    try {\r\n      // Handle MM/DD/YYYY format\r\n      const date = new Date(dateString);\r\n      if (isNaN(date.getTime())) {\r\n        return null;\r\n      }\r\n      return getStartOfDay(date);\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  private generateTimeOptions(): void {\r\n    const { hourOptions, minuteOptions } = generateTimeOptions(this.minuteInterval);\r\n    this.hourOptions = hourOptions;\r\n    this.minuteOptions = minuteOptions;\r\n  }\r\n\r\n  private generateLocaleData(): void {\r\n    const year = new Date().getFullYear();\r\n    this.monthOptions = generateMonthOptions(this.locale, year);\r\n    this.firstDayOfWeek = getFirstDayOfWeek(this.locale);\r\n    this.weekDays = generateWeekDays(this.locale, this.firstDayOfWeek);\r\n  }\r\n\r\n  private updateRangesArray(): void {\r\n    this.rangesArray = this._ranges ? Object.entries(this._ranges).map(([key, value]) => ({key, value})) : [];\r\n  }\r\n\r\n  public selectRange(range: [Date, Date]): void {\r\n    if (this.disabled) return;\r\n    this.startDate = this.applyCurrentTime(range[0]);\r\n    this.endDate = this.applyCurrentTime(range[1]);\r\n\r\n    if (this.startDate && this.endDate) {\r\n      this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n    }\r\n\r\n    this.currentDate = new Date(this.startDate);\r\n    this.initializeValue({start: this.startDate, end: this.endDate});\r\n    this.generateCalendar();\r\n    this.action.emit({type: 'rangeSelected', payload: {start: this.startDate, end: this.endDate, key: this.rangesArray.find(r => r.value === range)?.key}});\r\n    this.cdr.markForCheck();\r\n  }\r\n  \r\n  // NEW: Check if a date is a holiday\r\n  public isHoliday(date: Date | null): boolean {\r\n    if (!date || !this.holidayProvider) return false;\r\n    const dateOnly = getStartOfDay(date);\r\n    return this.holidayProvider.isHoliday(dateOnly);\r\n  }\r\n  \r\n  // NEW: Get holiday label\r\n  public getHolidayLabel(date: Date | null): string | null {\r\n    if (!date || !this.holidayProvider || !this.isHoliday(date)) return null;\r\n    return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(date)) : 'Holiday';\r\n  }\r\n\r\n  public isDateDisabled(date: Date | null): boolean {\r\n    if (!date) return false;\r\n\r\n    const dateOnly = getStartOfDay(date);\r\n\r\n    // 1. Check disabled dates array\r\n    if (this.disabledDates.length > 0) {\r\n      for (const disabledDate of this.disabledDates) {\r\n        let parsedDate: Date | null;\r\n        \r\n        if (typeof disabledDate === 'string') {\r\n          parsedDate = this.parseDateString(disabledDate);\r\n        } else {\r\n          parsedDate = getStartOfDay(disabledDate);\r\n        }\r\n        \r\n        if (parsedDate && dateOnly.getTime() === parsedDate.getTime()) {\r\n          return true;\r\n        }\r\n      }\r\n    }\r\n\r\n    // 2. Check holiday provider for disabling\r\n    if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {\r\n      return true;\r\n    }\r\n\r\n    // 3. Check min/max date\r\n    if (this._minDate) {\r\n      const minDateOnly = getStartOfDay(this._minDate);\r\n      if (dateOnly.getTime() < minDateOnly.getTime()) return true;\r\n    }\r\n    if (this._maxDate) {\r\n      const maxDateOnly = getStartOfDay(this._maxDate);\r\n      if (dateOnly.getTime() > maxDateOnly.getTime()) return true;\r\n    }\r\n    \r\n    // 4. Check custom invalid date function\r\n    return this.isInvalidDate(date);\r\n  }\r\n\r\n  public isMultipleSelected(d: Date | null): boolean {\r\n    if (!d || this.mode !== 'multiple') return false;\r\n    const dTime = getStartOfDay(d).getTime();\r\n    return this.selectedDates.some(selected => getStartOfDay(selected).getTime() === dTime);\r\n  }\r\n\r\n  public onTimeChange(): void {\r\n    if (this.disabled) return;\r\n    if (this.mode === 'single' && this.selectedDate) {\r\n      this.selectedDate = this.applyCurrentTime(this.selectedDate);\r\n      this.emitValue(this.selectedDate);\r\n    } else if (this.mode === 'range' && this.startDate && this.endDate) {\r\n      this.startDate = this.applyCurrentTime(this.startDate);\r\n      this.endDate = this.applyCurrentTime(this.endDate);\r\n      this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n    } else if (this.mode === 'range' && this.startDate && !this.endDate) {\r\n      this.startDate = this.applyCurrentTime(this.startDate);\r\n    } else if (this.mode === 'multiple') {\r\n      this.selectedDates = this.selectedDates.map(date => {\r\n        const newDate = getStartOfDay(date);\r\n        return this.applyCurrentTime(newDate);\r\n      });\r\n      this.emitValue([...this.selectedDates]);\r\n    }\r\n\r\n    this.action.emit({type: 'timeChanged', payload: {hour: this.currentHour, minute: this.currentMinute}});\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  public onDateClick(day: Date | null): void {\r\n    if (!day || this.disabled) return;\r\n    \r\n    // Only check isDateDisabled for current month days\r\n    if (this.isCurrentMonth(day) && this.isDateDisabled(day)) return;\r\n\r\n    const dateToToggle = getStartOfDay(day);\r\n\r\n    if (this.mode === 'single') {\r\n      this.selectedDate = this.applyCurrentTime(day);\r\n      this.emitValue(this.selectedDate);\r\n    } else if (this.mode === 'range') {\r\n      if (!this.startDate || (this.startDate && this.endDate)) {\r\n        this.startDate = this.applyCurrentTime(day);\r\n        this.endDate = null;\r\n      } else if (day && this.startDate && day >= this.startDate) {\r\n        this.endDate = this.applyCurrentTime(day);\r\n        this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n      } else {\r\n        this.startDate = this.applyCurrentTime(day);\r\n        this.endDate = null;\r\n      }\r\n      this.hoveredDate = null;\r\n    } else if (this.mode === 'multiple') {\r\n      const existingIndex = this.selectedDates.findIndex(d => this.isSameDay(d, dateToToggle));\r\n\r\n      if (existingIndex > -1) {\r\n        this.selectedDates.splice(existingIndex, 1);\r\n      } else {\r\n        const dateWithTime = this.applyCurrentTime(dateToToggle);\r\n        this.selectedDates.push(dateWithTime);\r\n        this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\r\n      }\r\n      this.emitValue([...this.selectedDates]);\r\n    }\r\n\r\n    const dateToSync = this.mode === 'single' ? this.selectedDate :\r\n      this.mode === 'range' ? this.startDate :\r\n        this.mode === 'multiple' && this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;\r\n\r\n    if (dateToSync) {\r\n      this.update12HourState(dateToSync.getHours());\r\n      this.currentMinute = dateToSync.getMinutes();\r\n    }\r\n\r\n    this.action.emit({\r\n      type: 'dateSelected',\r\n      payload: {\r\n        mode: this.mode,\r\n        value: this._internalValue,\r\n        date: day\r\n      }\r\n    });\r\n    \r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  public onDateHover(day: Date | null): void {\r\n    if (this.mode === 'range' && this.startDate && !this.endDate && day) {\r\n      this.hoveredDate = day;\r\n      this.cdr.markForCheck();\r\n    }\r\n  }\r\n\r\n  public isPreviewInRange(day: Date | null): boolean {\r\n    if (this.mode !== 'range' || !this.startDate || this.endDate || !this.hoveredDate || !day) return false;\r\n    const start = getStartOfDay(this.startDate).getTime();\r\n    const end = getStartOfDay(this.hoveredDate).getTime();\r\n    const time = getStartOfDay(day).getTime();\r\n    return time > Math.min(start, end) && time < Math.max(start, end);\r\n  }\r\n\r\n  public generateCalendar(): void {\r\n    this.daysInMonth = [];\r\n    const year = this.currentDate.getFullYear();\r\n    const month = this.currentDate.getMonth();\r\n    this._currentMonth = month;\r\n    this._currentYear = year;\r\n    this.generateDropdownOptions();\r\n    const firstDayOfMonth = new Date(year, month, 1);\r\n    const lastDayOfMonth = new Date(year, month + 1, 0);\r\n    const startDayOfWeek = firstDayOfMonth.getDay();\r\n    const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;\r\n\r\n    // Add previous month's days instead of null values\r\n    const previousMonth = month === 0 ? 11 : month - 1;\r\n    const previousYear = month === 0 ? year - 1 : year;\r\n    const lastDayOfPreviousMonth = new Date(previousYear, previousMonth + 1, 0);\r\n    \r\n    for (let i = 0; i < emptyCellCount; i++) {\r\n      const dayNumber = lastDayOfPreviousMonth.getDate() - emptyCellCount + i + 1;\r\n      this.daysInMonth.push(this._normalizeDate(new Date(previousYear, previousMonth, dayNumber)));\r\n    }\r\n    for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\r\n      this.daysInMonth.push(this._normalizeDate(new Date(year, month, i)));\r\n    }\r\n\r\n    this.cdr.markForCheck();\r\n\r\n    this.action.emit({\r\n      type: 'calendarGenerated',\r\n      payload: {\r\n        month: month,\r\n        year: year,\r\n        days: this.daysInMonth.filter(d => d !== null)\r\n      }\r\n    });\r\n  }\r\n\r\n  private generateDropdownOptions(): void {\r\n    this.yearOptions = generateYearOptions(this._currentYear);\r\n  }\r\n\r\n  public changeMonth(delta: number): void {\r\n    if (this.disabled) return;\r\n\r\n    // Check if going back is disabled due to minDate constraint\r\n    if (delta < 0 && this.isBackArrowDisabled) return;\r\n\r\n    const newDate = addMonths(this.currentDate, delta);\r\n\r\n    // Update the data immediately (no animation)\r\n    this.currentDate = newDate;\r\n    this._currentMonth = newDate.getMonth();\r\n    this._currentYear = newDate.getFullYear();\r\n\r\n    // Generate new calendar view\r\n    this.generateCalendar();\r\n\r\n    this.action.emit({type: 'monthChanged', payload: { delta: delta }});\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  public isSameDay(d1: Date | null, d2: Date | null): boolean {\r\n    return this.dateComparator(d1, d2);\r\n  }\r\n\r\n  public isCurrentMonth(day: Date | null): boolean {\r\n    if (!day) return false;\r\n    return day.getMonth() === this._currentMonth && day.getFullYear() === this._currentYear;\r\n  }\r\n\r\n  public isInRange(d: Date | null): boolean {\r\n    if (!d || !this.startDate || !this.endDate) return false;\r\n\r\n    const dTime = getStartOfDay(d).getTime();\r\n    const startDayTime = getStartOfDay(this.startDate).getTime();\r\n    const endDayTime = getStartOfDay(this.endDate).getTime();\r\n\r\n    const startTime = Math.min(startDayTime, endDayTime);\r\n    const endTime = Math.max(startDayTime, endDayTime);\r\n\r\n    return dTime > startTime && dTime < endTime;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    // Clean up any subscriptions or timers if needed\r\n    this.selectedDate = null;\r\n    this.selectedDates = [];\r\n    this.startDate = null;\r\n    this.endDate = null;\r\n    this.hoveredDate = null;\r\n    this._internalValue = null;\r\n    \r\n    // Clear any cached data\r\n    if (this.dateComparator && typeof this.dateComparator === 'function') {\r\n      // Clear any internal caches if they exist\r\n    }\r\n  }\r\n}","/*\r\n * Public API Surface of ngxsmk-datepicker\r\n */\r\n\r\nexport * from './lib/ngxsmk-datepicker';\r\nexport * from './lib/components/custom-select.component';\r\nexport * from './lib/utils/date.utils';\r\nexport * from './lib/utils/calendar.utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}