@oneluiz/dual-datepicker 3.4.0 → 3.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +134 -1
- package/core/date-adapter.d.ts +298 -0
- package/core/date-clock.d.ts +82 -0
- package/core/dual-date-range.store.d.ts +113 -0
- package/core/index.d.ts +11 -0
- package/core/native-date-adapter.d.ts +152 -0
- package/core/preset.engine.d.ts +88 -0
- package/core/range.validator.d.ts +37 -0
- package/core/system-clock.d.ts +13 -0
- package/dual-datepicker.component.d.ts +17 -11
- package/esm2022/core/date-adapter.mjs +77 -0
- package/esm2022/core/date-clock.mjs +65 -0
- package/esm2022/core/dual-date-range.store.mjs +329 -0
- package/esm2022/core/index.mjs +12 -0
- package/esm2022/core/native-date-adapter.mjs +286 -0
- package/esm2022/core/preset.engine.mjs +303 -0
- package/esm2022/core/range.validator.mjs +105 -0
- package/esm2022/core/system-clock.mjs +34 -0
- package/esm2022/dual-datepicker.component.mjs +239 -195
- package/esm2022/public-api.mjs +5 -2
- package/fesm2022/oneluiz-dual-datepicker.mjs +1431 -204
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +5 -3
- package/public-api.d.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneluiz-dual-datepicker.mjs","sources":["../../src/date-adapter.ts","../../src/native-date-adapter.ts","../../src/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/preset-utils.ts","../../src/public-api.ts","../../src/oneluiz-dual-datepicker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Abstract class for date adapters.\n * Allows the component to work with different date libraries (Date, DayJS, date-fns, Luxon, etc.)\n */\nexport abstract class DateAdapter<T = any> {\n /**\n * Parses a value into a date object\n * @param value - Value to parse (string, number, or date object)\n * @returns Parsed date object\n */\n abstract parse(value: any): T | null;\n\n /**\n * Formats a date object into a string\n * @param date - Date object to format\n * @param format - Optional format string\n * @returns Formatted date string\n */\n abstract format(date: T, format?: string): string;\n\n /**\n * Adds days to a date\n * @param date - Date object\n * @param days - Number of days to add (can be negative)\n * @returns New date object\n */\n abstract addDays(date: T, days: number): T;\n\n /**\n * Adds months to a date\n * @param date - Date object\n * @param months - Number of months to add (can be negative)\n * @returns New date object\n */\n abstract addMonths(date: T, months: number): T;\n\n /**\n * Gets the year from a date\n * @param date - Date object\n * @returns Year number\n */\n abstract getYear(date: T): number;\n\n /**\n * Gets the month from a date (0-11)\n * @param date - Date object\n * @returns Month number (0-11)\n */\n abstract getMonth(date: T): number;\n\n /**\n * Gets the day of month from a date\n * @param date - Date object\n * @returns Day of month (1-31)\n */\n abstract getDate(date: T): number;\n\n /**\n * Gets the day of week from a date (0-6, Sunday = 0)\n * @param date - Date object\n * @returns Day of week (0-6)\n */\n abstract getDay(date: T): number;\n\n /**\n * Creates a new date object\n * @param year - Year\n * @param month - Month (0-11)\n * @param date - Day of month (1-31)\n * @returns New date object\n */\n abstract createDate(year: number, month: number, date: number): T;\n\n /**\n * Gets today's date\n * @returns Today's date object\n */\n abstract today(): T;\n\n /**\n * Checks if two dates are the same day\n * @param a - First date\n * @param b - Second date\n * @returns True if same day\n */\n abstract isSameDay(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is before another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is before b\n */\n abstract isBefore(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is after another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is after b\n */\n abstract isAfter(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is between two other dates\n * @param date - Date to check\n * @param start - Start date\n * @param end - End date\n * @returns True if date is between start and end\n */\n abstract isBetween(date: T | null, start: T | null, end: T | null): boolean;\n\n /**\n * Clones a date object\n * @param date - Date to clone\n * @returns Cloned date object\n */\n abstract clone(date: T): T;\n\n /**\n * Checks if a value is a valid date\n * @param date - Value to check\n * @returns True if valid date\n */\n abstract isValid(date: any): boolean;\n}\n\n/**\n * Injection token for DateAdapter\n */\nexport const DATE_ADAPTER = new InjectionToken<DateAdapter>('DATE_ADAPTER');\n","import { Injectable } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\n\n/**\n * Date adapter implementation for native JavaScript Date objects\n * This is the default adapter used by the component\n */\n@Injectable()\nexport class NativeDateAdapter extends DateAdapter<Date> {\n parse(value: any): Date | null {\n if (!value) return null;\n \n if (value instanceof Date) {\n return new Date(value);\n }\n \n if (typeof value === 'string' || typeof value === 'number') {\n // Fix timezone issues: parse YYYY-MM-DD as local date, not UTC\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, month - 1, day);\n }\n \n const date = new Date(value);\n return this.isValid(date) ? date : null;\n }\n \n return null;\n }\n\n format(date: Date, format: string = 'YYYY-MM-DD'): string {\n if (!this.isValid(date)) return '';\n \n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n \n // Simple format implementation\n switch (format) {\n case 'YYYY-MM-DD':\n return `${year}-${month}-${day}`;\n case 'MM/DD/YYYY':\n return `${month}/${day}/${year}`;\n case 'DD/MM/YYYY':\n return `${day}/${month}/${year}`;\n default:\n return `${year}-${month}-${day}`;\n }\n }\n\n addDays(date: Date, days: number): Date {\n const result = this.clone(date);\n result.setDate(result.getDate() + days);\n return result;\n }\n\n addMonths(date: Date, months: number): Date {\n const result = this.clone(date);\n result.setMonth(result.getMonth() + months);\n return result;\n }\n\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n getDate(date: Date): number {\n return date.getDate();\n }\n\n getDay(date: Date): number {\n return date.getDay();\n }\n\n createDate(year: number, month: number, date: number): Date {\n return new Date(year, month, date);\n }\n\n today(): Date {\n return new Date();\n }\n\n isSameDay(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n isBefore(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() < b.getTime();\n }\n\n isAfter(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() > b.getTime();\n }\n\n isBetween(date: Date | null, start: Date | null, end: Date | null): boolean {\n if (!date || !start || !end) return false;\n if (!this.isValid(date) || !this.isValid(start) || !this.isValid(end)) return false;\n \n const dateTime = date.getTime();\n const startTime = start.getTime();\n const endTime = end.getTime();\n \n return dateTime >= startTime && dateTime <= endTime;\n }\n\n clone(date: Date): Date {\n return new Date(date.getTime());\n }\n\n isValid(date: any): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, HostListener, ElementRef, forwardRef, signal, computed, effect, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\n\nexport interface DateRange {\n startDate: string;\n endDate: string;\n rangeText: string;\n startTime?: string; // HH:mm format (optional)\n endTime?: string; // HH:mm format (optional)\n}\n\nexport interface MultiDateRange {\n ranges: DateRange[];\n}\n\nexport interface PresetRange {\n start: string;\n end: string;\n}\n\nexport interface PresetConfig {\n label: string;\n getValue: () => PresetRange;\n}\n\nexport interface LocaleConfig {\n monthNames?: string[];\n monthNamesShort?: string[];\n dayNames?: string[];\n dayNamesShort?: string[];\n firstDayOfWeek?: number; // 0 = Sunday, 1 = Monday, etc.\n}\n\nexport type ThemeType = 'default' | 'bootstrap' | 'bulma' | 'foundation' | 'tailwind' | 'custom';\n\n@Component({\n selector: 'ngx-dual-datepicker',\n standalone: true,\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\n templateUrl: './dual-datepicker.component.html',\n styleUrl: './dual-datepicker.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DualDatepickerComponent),\n multi: true\n },\n {\n provide: DATE_ADAPTER,\n useClass: NativeDateAdapter\n }\n ]\n})\nexport class DualDatepickerComponent implements OnInit, OnChanges, ControlValueAccessor {\n @Input() placeholder: string = 'Select date range';\n @Input() startDate: string = '';\n @Input() endDate: string = '';\n @Input() showPresets: boolean = true;\n @Input() showClearButton: boolean = false;\n @Input() multiRange: boolean = false;\n @Input() closeOnSelection: boolean = true;\n @Input() closeOnPresetSelection: boolean = true;\n @Input() closeOnClickOutside: boolean = true;\n @Input() enableKeyboardNavigation: boolean = true;\n @Input() presets: PresetConfig[] = [];\n @Input() theme: ThemeType = 'default';\n @Input() inputBackgroundColor: string = '#fff';\n @Input() inputTextColor: string = '#495057';\n @Input() inputBorderColor: string = '#ced4da';\n @Input() inputBorderColorHover: string = '#ced4da';\n @Input() inputBorderColorFocus: string = '#80bdff';\n @Input() inputPadding: string = '0.375rem 0.75rem';\n @Input() locale: LocaleConfig = {};\n @Input() disabledDates: Date[] | ((date: Date) => boolean) | undefined;\n @Input() displayFormat: string = 'D MMM'; // Format for displaying dates in input\n @Input() requireApply: boolean = false; // Require Apply button confirmation\n @Input() enableTimePicker: boolean = false; // Enable time selection\n @Input() timeFormat: '12h' | '24h' = '24h'; // Time format\n @Input() minuteStep: number = 15; // Step for minute selector (1, 5, 15, 30)\n @Input() defaultStartTime: string = '00:00'; // Default start time HH:mm\n @Input() defaultEndTime: string = '23:59'; // Default end time HH:mm\n\n @Output() dateRangeChange = new EventEmitter<DateRange>();\n @Output() dateRangeSelected = new EventEmitter<DateRange>();\n @Output() multiDateRangeChange = new EventEmitter<MultiDateRange>();\n @Output() multiDateRangeSelected = new EventEmitter<MultiDateRange>();\n\n // Date adapter injection\n private dateAdapter = inject<DateAdapter>(DATE_ADAPTER);\n\n // Signals for reactive state\n showDatePicker = signal(false);\n dateRangeText = signal('');\n selectingStartDate = signal(true);\n currentMonth = signal(this.dateAdapter.today());\n previousMonth = signal(this.dateAdapter.today());\n currentMonthDays = signal<any[]>([]);\n previousMonthDays = signal<any[]>([]);\n isDisabled = signal(false);\n \n // Apply/Confirm support\n pendingStartDate: string = '';\n pendingEndDate: string = '';\n hasPendingChanges = signal(false);\n \n // Time picker support\n startHour: number = 0;\n startMinute: number = 0;\n endHour: number = 23;\n endMinute: number = 59;\n showStartTimePicker = signal(false);\n showEndTimePicker = signal(false);\n \n // Hover range preview\n hoverDate = signal<string | null>(null);\n \n // Multi-range support\n selectedRanges = signal<DateRange[]>([]);\n currentRangeIndex = signal<number>(-1);\n\n // Keyboard navigation\n focusedDay = signal<{ date: string; monthIndex: number } | null>(null); // monthIndex: 0 = previous, 1 = current\n \n // Computed values\n currentMonthName = computed(() => this.getMonthName(this.currentMonth()));\n previousMonthName = computed(() => this.getMonthName(this.previousMonth()));\n weekDayNames = computed(() => this.getDayNames());\n\n private readonly defaultMonthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n private readonly defaultMonthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n private readonly defaultDayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n private readonly defaultDayNamesShort = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\n // ControlValueAccessor callbacks\n private onChange: (value: DateRange | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(private elementRef: ElementRef) {\n // Effect to emit changes when dates change\n effect(() => {\n const range = this.dateRangeText();\n if (this.startDate || this.endDate) {\n this.onChange(this.getDateRangeValue());\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (this.showDatePicker() && this.closeOnClickOutside) {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.closeDatePicker();\n }\n }\n }\n\n @HostListener('keydown', ['$event'])\n handleKeyboardNavigation(event: KeyboardEvent): void {\n if (!this.enableKeyboardNavigation) {\n return;\n }\n\n if (!this.showDatePicker()) {\n // When picker is closed, allow Enter/Space to open it\n if (event.key === 'Enter' || event.key === ' ') {\n const target = event.target as HTMLElement;\n if (target.classList.contains('datepicker-input')) {\n event.preventDefault();\n this.toggleDatePicker();\n }\n }\n return;\n }\n\n // When picker is open\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closeDatePicker();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.moveFocusVertical(-1);\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.moveFocusVertical(1);\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.moveFocusHorizontal(-1);\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n this.moveFocusHorizontal(1);\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.selectFocusedDay();\n break;\n\n case 'Home':\n event.preventDefault();\n this.moveFocusToFirstDay();\n break;\n\n case 'End':\n event.preventDefault();\n this.moveFocusToLastDay();\n break;\n\n case 'PageUp':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(-1);\n } else {\n this.changeMonth(-1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n\n case 'PageDown':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(1);\n } else {\n this.changeMonth(1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n }\n }\n\n // Keyboard navigation methods\n private initializeFocus(): void {\n // Set initial focus to start date, end date, or first available day\n if (this.startDate) {\n const inPrevMonth = this.isDateInMonth(this.startDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.startDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.startDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // startDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else if (this.endDate) {\n const inPrevMonth = this.isDateInMonth(this.endDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.endDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.endDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // endDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else {\n // Focus on today if visible, otherwise first day of current month\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n // Today is not in current month, focus on first day of current month\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n }\n\n private isDateInMonth(dateStr: string, monthDate: Date): boolean {\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return false;\n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const monthYear = this.dateAdapter.getYear(monthDate);\n const monthMonth = this.dateAdapter.getMonth(monthDate);\n return year === monthYear && month === monthMonth;\n }\n\n private moveFocusHorizontal(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction);\n const newDateStr = this.formatDate(newDate);\n\n // Determine which month the new date belongs to\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Date is outside visible months, navigate month\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusVertical(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction * 7); // Move by week\n const newDateStr = this.formatDate(newDate);\n\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Navigate to month containing the new date\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusToFirstDay(): void {\n const prevMonthDays = this.previousMonthDays();\n const firstDay = prevMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 0 });\n }\n }\n\n private moveFocusToLastDay(): void {\n const currMonthDays = this.currentMonthDays();\n const validDays = currMonthDays.filter(day => day.isCurrentMonth);\n const lastDay = validDays[validDays.length - 1];\n if (lastDay) {\n this.focusedDay.set({ date: lastDay.date, monthIndex: 1 });\n }\n }\n\n private moveFocusYear(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const currentYear = this.dateAdapter.getYear(currentDate);\n const currentMonth = this.dateAdapter.getMonth(currentDate);\n const currentDay = this.dateAdapter.getDate(currentDate);\n \n const newDate = this.dateAdapter.createDate(currentYear + direction, currentMonth, currentDay);\n const newDateStr = this.formatDate(newDate);\n\n // Update months to show the new year\n this.currentMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth, 1));\n this.previousMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth - 1, 1));\n this.generateCalendars();\n\n const inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n }\n\n private adjustFocusAfterMonthChange(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const inPrevMonth = this.isDateInMonth(focused.date, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(focused.date, this.currentMonth());\n\n if (!inPrevMonth && !inCurrMonth) {\n // Focused day is no longer visible, move to equivalent day in visible months\n this.initializeFocus();\n } else {\n // Update month index if needed\n this.focusedDay.set({\n date: focused.date,\n monthIndex: inPrevMonth ? 0 : 1\n });\n }\n }\n\n private selectFocusedDay(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const monthDays = focused.monthIndex === 0 ? this.previousMonthDays() : this.currentMonthDays();\n const dayObj = monthDays.find(day => day.date === focused.date && day.isCurrentMonth);\n \n if (dayObj) {\n this.selectDay(dayObj);\n }\n }\n\n hasKeyboardFocus(date: string, monthIndex: number): boolean {\n const focused = this.focusedDay();\n return focused !== null && focused.date === date && focused.monthIndex === monthIndex;\n }\n\n ngOnInit(): void {\n // Initialize time picker with default times\n if (this.enableTimePicker) {\n const startTime = this.parseTime(this.defaultStartTime);\n this.startHour = startTime.hour;\n this.startMinute = startTime.minute;\n \n const endTime = this.parseTime(this.defaultEndTime);\n this.endHour = endTime.hour;\n this.endMinute = endTime.minute;\n }\n \n if (this.startDate && this.endDate) {\n this.updateDateRangeText();\n this.generateCalendars();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['startDate'] || changes['endDate']) {\n if (this.startDate && this.endDate) {\n this.updateDateRangeText();\n this.generateCalendars();\n } else if (!this.startDate && !this.endDate) {\n this.dateRangeText.set('');\n }\n }\n }\n\n formatDate(date: Date): string {\n const year = this.dateAdapter.getYear(date);\n const month = String(this.dateAdapter.getMonth(date) + 1).padStart(2, '0');\n const day = String(this.dateAdapter.getDate(date)).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n formatDateDisplay(dateStr: string): string {\n if (!dateStr) return '';\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return '';\n \n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const day = this.dateAdapter.getDate(date);\n \n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n const monthNamesShort = this.locale.monthNamesShort || this.defaultMonthNamesShort;\n \n // Replace format tokens with values\n let formatted = this.displayFormat;\n \n // Year tokens\n formatted = formatted.replace(/YYYY/g, String(year));\n formatted = formatted.replace(/YY/g, String(year).slice(-2));\n \n // Month tokens (order matters: MMMM before MMM before MM before M)\n formatted = formatted.replace(/MMMM/g, monthNames[month]);\n formatted = formatted.replace(/MMM/g, monthNamesShort[month]);\n formatted = formatted.replace(/MM/g, String(month + 1).padStart(2, '0'));\n formatted = formatted.replace(/M/g, String(month + 1));\n \n // Day tokens (order matters: DD before D)\n formatted = formatted.replace(/DD/g, String(day).padStart(2, '0'));\n formatted = formatted.replace(/D/g, String(day));\n \n return formatted;\n }\n\n updateDateRangeText(): void {\n if (this.startDate && this.endDate) {\n const start = this.formatDateDisplay(this.startDate);\n const end = this.formatDateDisplay(this.endDate);\n this.dateRangeText.set(`${start} - ${end}`);\n } else {\n this.dateRangeText.set('');\n }\n }\n\n toggleDatePicker(): void {\n this.showDatePicker.update(value => !value);\n if (this.showDatePicker()) {\n this.selectingStartDate.set(true);\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const previousMonthDate = this.dateAdapter.createDate(year, month - 1, 1);\n this.previousMonth.set(previousMonthDate);\n this.generateCalendars();\n // Initialize keyboard focus only if keyboard navigation is enabled\n if (this.enableKeyboardNavigation) {\n this.initializeFocus();\n }\n } else {\n // Clear focus when closing\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n }\n this.onTouched();\n }\n\n closeDatePicker(): void {\n this.showDatePicker.set(false);\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n this.onTouched();\n }\n\n generateCalendars(): void {\n this.previousMonthDays.set(this.generateMonthCalendar(this.previousMonth()));\n this.currentMonthDays.set(this.generateMonthCalendar(this.currentMonth()));\n }\n\n generateMonthCalendar(date: Date): any[] {\n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const firstDay = this.dateAdapter.createDate(year, month, 1);\n const lastDay = this.dateAdapter.createDate(year, month + 1, 0);\n const daysInMonth = this.dateAdapter.getDate(lastDay);\n const firstDayOfWeek = this.dateAdapter.getDay(firstDay);\n\n const monthDays = [];\n\n for (let i = 0; i < firstDayOfWeek; i++) {\n monthDays.push({ day: null, isCurrentMonth: false });\n }\n\n for (let day = 1; day <= daysInMonth; day++) {\n const dayDate = this.dateAdapter.createDate(year, month, day);\n const dateStr = this.formatDate(dayDate);\n \n // Check if date is in pending range (for requireApply mode)\n const isPendingStart = this.requireApply && this.pendingStartDate === dateStr;\n const isPendingEnd = this.requireApply && this.pendingEndDate === dateStr;\n const inPendingRange = this.requireApply && this.pendingStartDate && this.pendingEndDate &&\n dateStr >= this.pendingStartDate && dateStr <= this.pendingEndDate;\n \n // Check if date is in hover preview range\n const inHoverRange = this.isInHoverRange(dateStr);\n \n monthDays.push({\n day: day,\n date: dateStr,\n isCurrentMonth: true,\n isStart: this.startDate === dateStr || isPendingStart,\n isEnd: this.endDate === dateStr || isPendingEnd,\n inRange: this.isInRange(dateStr) || inPendingRange,\n inHoverRange: inHoverRange,\n isDisabled: this.isDateDisabled(dayDate)\n });\n }\n\n return monthDays;\n }\n\n isInRange(dateStr: string): boolean {\n if (this.multiRange) {\n // Check if date is in any of the selected ranges\n return this.selectedRanges().some(range => {\n return dateStr >= range.startDate && dateStr <= range.endDate;\n });\n } else {\n if (!this.startDate || !this.endDate) return false;\n return dateStr >= this.startDate && dateStr <= this.endDate;\n }\n }\n\n isDateDisabled(date: Date): boolean {\n if (!this.disabledDates) return false;\n\n if (typeof this.disabledDates === 'function') {\n // If it's a function, call it with the date\n return this.disabledDates(date);\n } else if (Array.isArray(this.disabledDates)) {\n // If it's an array, check if the date matches any disabled date\n return this.disabledDates.some(disabledDate => {\n return this.dateAdapter.getYear(date) === this.dateAdapter.getYear(disabledDate) &&\n this.dateAdapter.getMonth(date) === this.dateAdapter.getMonth(disabledDate) &&\n this.dateAdapter.getDate(date) === this.dateAdapter.getDate(disabledDate);\n });\n }\n \n return false;\n }\n\n isInHoverRange(dateStr: string): boolean {\n const hover = this.hoverDate();\n if (!hover) return false;\n\n // In multiRange mode, only show hover preview when selecting end date\n if (this.multiRange) {\n if (this.selectingStartDate()) return false;\n if (!this.startDate) return false;\n const minDate = this.startDate < hover ? this.startDate : hover;\n const maxDate = this.startDate > hover ? this.startDate : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // In single range mode with requireApply\n if (this.requireApply) {\n if (this.selectingStartDate()) return false;\n if (!this.pendingStartDate) return false;\n const minDate = this.pendingStartDate < hover ? this.pendingStartDate : hover;\n const maxDate = this.pendingStartDate > hover ? this.pendingStartDate : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // In single range mode without requireApply\n if (this.selectingStartDate()) return false;\n if (!this.startDate) return false;\n const minDate = this.startDate < hover ? this.startDate : hover;\n const maxDate = this.startDate > hover ? this.startDate : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n }\n }\n }\n\n onDayHover(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) {\n this.hoverDate.set(null);\n return;\n }\n this.hoverDate.set(dayObj.date);\n this.generateCalendars();\n }\n\n clearDayHover(): void {\n this.hoverDate.set(null);\n this.generateCalendars();\n }\n\n selectDay(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) return;\n\n if (this.multiRange) {\n // Multi-range mode: add ranges to array\n if (this.selectingStartDate()) {\n this.startDate = dayObj.date;\n this.endDate = '';\n this.dateRangeText.set('');\n this.selectingStartDate.set(false);\n } else {\n if (dayObj.date < this.startDate) {\n this.endDate = this.startDate;\n this.startDate = dayObj.date;\n } else {\n this.endDate = dayObj.date;\n }\n \n // Add the new range to the array\n const newRange: DateRange = {\n startDate: this.startDate,\n endDate: this.endDate,\n rangeText: this.formatDateDisplay(this.startDate) + ' – ' + this.formatDateDisplay(this.endDate)\n };\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.push(newRange);\n this.selectedRanges.set(currentRanges);\n \n // Reset for next range selection\n this.startDate = '';\n this.endDate = '';\n this.selectingStartDate.set(true);\n \n // Update display text\n this.updateMultiRangeText();\n \n // Don't close if multiRange, allow adding more ranges\n if (this.closeOnSelection && !this.multiRange) {\n this.showDatePicker.set(false);\n }\n \n this.emitMultiChange();\n this.emitMultiSelection();\n }\n this.generateCalendars();\n } else {\n // Single range mode (original behavior)\n if (this.requireApply) {\n // Apply mode: use pending dates, don't emit until Apply is clicked\n if (this.selectingStartDate()) {\n this.pendingStartDate = dayObj.date;\n this.pendingEndDate = '';\n this.selectingStartDate.set(false);\n this.hasPendingChanges.set(true);\n } else {\n if (dayObj.date < this.pendingStartDate) {\n this.pendingEndDate = this.pendingStartDate;\n this.pendingStartDate = dayObj.date;\n } else {\n this.pendingEndDate = dayObj.date;\n }\n this.selectingStartDate.set(true);\n this.hasPendingChanges.set(true);\n }\n this.generateCalendars();\n } else {\n // Immediate mode: emit changes immediately\n if (this.selectingStartDate()) {\n this.startDate = dayObj.date;\n this.endDate = '';\n this.dateRangeText.set('');\n this.selectingStartDate.set(false);\n this.emitChange();\n } else {\n if (dayObj.date < this.startDate) {\n this.endDate = this.startDate;\n this.startDate = dayObj.date;\n } else {\n this.endDate = dayObj.date;\n }\n this.updateDateRangeText();\n if (this.closeOnSelection) {\n this.showDatePicker.set(false);\n }\n this.selectingStartDate.set(true);\n this.emitChange();\n this.emitSelection();\n }\n this.generateCalendars();\n }\n }\n }\n\n applySelection(): void {\n if (!this.hasPendingChanges()) return;\n \n // Apply pending dates\n this.startDate = this.pendingStartDate;\n this.endDate = this.pendingEndDate;\n this.updateDateRangeText();\n \n // Clear pending state\n this.pendingStartDate = '';\n this.pendingEndDate = '';\n this.hasPendingChanges.set(false);\n \n // Emit changes\n this.emitChange();\n this.emitSelection();\n \n // Close picker\n this.showDatePicker.set(false);\n this.selectingStartDate.set(true);\n }\n\n cancelSelection(): void {\n // Discard pending changes\n this.pendingStartDate = '';\n this.pendingEndDate = '';\n this.hasPendingChanges.set(false);\n this.selectingStartDate.set(true);\n \n // Regenerate calendars to clear pending visual state\n this.generateCalendars();\n }\n\n changeMonth(direction: number): void {\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const newCurrentMonth = this.dateAdapter.createDate(year, month + direction, 1);\n this.currentMonth.set(newCurrentMonth);\n \n const newYear = this.dateAdapter.getYear(newCurrentMonth);\n const newMonth = this.dateAdapter.getMonth(newCurrentMonth);\n const newPreviousMonth = this.dateAdapter.createDate(newYear, newMonth - 1, 1);\n this.previousMonth.set(newPreviousMonth);\n this.generateCalendars();\n }\n\n getMonthName(date: Date): string {\n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n return `${monthNames[this.dateAdapter.getMonth(date)]} ${this.dateAdapter.getYear(date)}`;\n }\n\n getDayNames(): string[] {\n return this.locale.dayNamesShort || this.defaultDayNamesShort;\n }\n\n selectPresetRange(preset: PresetConfig): void {\n if (!preset.getValue) {\n console.error('PresetConfig must have getValue() function');\n return;\n }\n\n const range = preset.getValue();\n this.startDate = range.start;\n this.endDate = range.end;\n this.updateDateRangeText();\n this.generateCalendars();\n if (this.closeOnPresetSelection) {\n this.showDatePicker.set(false);\n }\n this.emitSelection();\n }\n\n clear(): void {\n this.startDate = '';\n this.endDate = '';\n this.dateRangeText.set('');\n this.showDatePicker.set(false);\n this.selectingStartDate.set(true);\n \n if (this.multiRange) {\n this.selectedRanges.set([]);\n this.currentRangeIndex.set(-1);\n this.emitMultiChange();\n } else {\n this.emitChange();\n }\n \n this.onTouched();\n this.generateCalendars();\n }\n \n removeRange(index: number): void {\n if (!this.multiRange) return;\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.splice(index, 1);\n this.selectedRanges.set(currentRanges);\n \n this.updateMultiRangeText();\n this.emitMultiChange();\n this.emitMultiSelection();\n this.generateCalendars();\n }\n \n private updateMultiRangeText(): void {\n const count = this.selectedRanges().length;\n if (count === 0) {\n this.dateRangeText.set('');\n } else if (count === 1) {\n this.dateRangeText.set('1 range selected');\n } else {\n this.dateRangeText.set(`${count} ranges selected`);\n }\n }\n\n private emitChange(): void {\n const range: DateRange = {\n startDate: this.startDate,\n endDate: this.endDate,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = this.formatTime(this.startHour, this.startMinute);\n range.endTime = this.formatTime(this.endHour, this.endMinute);\n }\n \n this.dateRangeChange.emit(range);\n }\n\n private emitSelection(): void {\n const range: DateRange = {\n startDate: this.startDate,\n endDate: this.endDate,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = this.formatTime(this.startHour, this.startMinute);\n range.endTime = this.formatTime(this.endHour, this.endMinute);\n }\n \n this.dateRangeSelected.emit(range);\n }\n \n private emitMultiChange(): void {\n this.multiDateRangeChange.emit({\n ranges: this.selectedRanges()\n });\n }\n \n private emitMultiSelection(): void {\n this.multiDateRangeSelected.emit({\n ranges: this.selectedRanges()\n });\n }\n\n private getDateRangeValue(): DateRange {\n const range: DateRange = {\n startDate: this.startDate,\n endDate: this.endDate,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = this.formatTime(this.startHour, this.startMinute);\n range.endTime = this.formatTime(this.endHour, this.endMinute);\n }\n \n return range;\n }\n\n // Time Picker Methods\n toggleStartTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showStartTimePicker.set(!this.showStartTimePicker());\n this.showEndTimePicker.set(false);\n }\n\n toggleEndTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showEndTimePicker.set(!this.showEndTimePicker());\n this.showStartTimePicker.set(false);\n }\n\n incrementStartHour(): void {\n this.startHour = (this.startHour + 1) % 24;\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n decrementStartHour(): void {\n this.startHour = this.startHour === 0 ? 23 : this.startHour - 1;\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n incrementStartMinute(): void {\n this.startMinute = (this.startMinute + this.minuteStep) % 60;\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n decrementStartMinute(): void {\n this.startMinute = this.startMinute - this.minuteStep;\n if (this.startMinute < 0) {\n this.startMinute = 60 - this.minuteStep;\n }\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n incrementEndHour(): void {\n this.endHour = (this.endHour + 1) % 24;\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n decrementEndHour(): void {\n this.endHour = this.endHour === 0 ? 23 : this.endHour - 1;\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n incrementEndMinute(): void {\n this.endMinute = (this.endMinute + this.minuteStep) % 60;\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n decrementEndMinute(): void {\n this.endMinute = this.endMinute - this.minuteStep;\n if (this.endMinute < 0) {\n this.endMinute = 60 - this.minuteStep;\n }\n if (this.requireApply) {\n this.hasPendingChanges.set(true);\n } else {\n this.emitChange();\n }\n }\n\n formatTime(hour: number, minute: number): string {\n const h = hour.toString().padStart(2, '0');\n const m = minute.toString().padStart(2, '0');\n \n if (this.timeFormat === '12h') {\n const isPM = hour >= 12;\n const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const period = isPM ? 'PM' : 'AM';\n return `${hour12.toString().padStart(2, '0')}:${m} ${period}`;\n }\n \n return `${h}:${m}`;\n }\n\n parseTime(timeString: string): { hour: number; minute: number } {\n if (!timeString) return { hour: 0, minute: 0 };\n \n const time12hRegex = /^(\\d{1,2}):(\\d{2})\\s?(AM|PM)$/i;\n const time24hRegex = /^(\\d{1,2}):(\\d{2})$/;\n \n let match = timeString.match(time12hRegex);\n if (match) {\n let hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3].toUpperCase();\n \n if (period === 'PM' && hour !== 12) hour += 12;\n if (period === 'AM' && hour === 12) hour = 0;\n \n return { hour, minute };\n }\n \n match = timeString.match(time24hRegex);\n if (match) {\n return {\n hour: parseInt(match[1], 10),\n minute: parseInt(match[2], 10)\n };\n }\n \n return { hour: 0, minute: 0 };\n }\n\n // ControlValueAccessor implementation\n writeValue(value: DateRange | null): void {\n if (value) {\n this.startDate = value.startDate || '';\n this.endDate = value.endDate || '';\n \n if (this.enableTimePicker) {\n if (value.startTime) {\n const startTime = this.parseTime(value.startTime);\n this.startHour = startTime.hour;\n this.startMinute = startTime.minute;\n }\n if (value.endTime) {\n const endTime = this.parseTime(value.endTime);\n this.endHour = endTime.hour;\n this.endMinute = endTime.minute;\n }\n }\n \n if (this.startDate && this.endDate) {\n this.updateDateRangeText();\n this.generateCalendars();\n }\n } else {\n this.startDate = '';\n this.endDate = '';\n this.dateRangeText.set('');\n }\n }\n\n registerOnChange(fn: (value: DateRange | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 0)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 0) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ currentMonthName() }}</span>\n <button type=\"button\" (click)=\"changeMonth(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of currentMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 1)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 1) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangeText }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"removeRange($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Time Picker -->\n @if (enableTimePicker) {\n <div class=\"time-picker-container\">\n <!-- Start Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">Start Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startHour.toString().padStart(2, '0')\"\n readonly\n title=\"Start hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startMinute.toString().padStart(2, '0')\"\n readonly\n title=\"Start minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ startHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n\n <!-- Separator -->\n <div class=\"time-separator-vertical\"></div>\n\n <!-- End Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">End Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endHour.toString().padStart(2, '0')\"\n readonly\n title=\"End hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endMinute.toString().padStart(2, '0')\"\n readonly\n title=\"End minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ endHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer with buttons -->\n @if (showClearButton || multiRange || requireApply) {\n <div class=\"date-picker-footer\">\n @if (requireApply && !multiRange) {\n <div class=\"apply-footer-actions\">\n <button \n type=\"button\" \n class=\"btn-cancel\" \n (click)=\"cancelSelection()\" \n [disabled]=\"!hasPendingChanges()\"\n title=\"Cancel selection\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn-apply\" \n (click)=\"applySelection()\" \n [disabled]=\"!hasPendingChanges() || !pendingStartDate || !pendingEndDate\"\n title=\"Apply selection\">\n Apply\n </button>\n </div>\n }\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"closeDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && !requireApply && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n","import { PresetConfig, PresetRange } from './dual-datepicker.component';\n\n/**\n * Utility functions for creating common date range presets\n * Perfect for dashboards, reporting, POS, BI apps, and ERP systems\n */\n\n/**\n * Format a date as YYYY-MM-DD string\n */\nfunction formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Get the start of today\n */\nexport function getToday(): PresetRange {\n const today = new Date();\n return {\n start: formatDate(today),\n end: formatDate(today)\n };\n}\n\n/**\n * Get yesterday's date range\n */\nexport function getYesterday(): PresetRange {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n return {\n start: formatDate(yesterday),\n end: formatDate(yesterday)\n };\n}\n\n/**\n * Get last N days (including today)\n */\nexport function getLastNDays(days: number): PresetRange {\n const end = new Date();\n const start = new Date();\n start.setDate(start.getDate() - days + 1);\n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get this week (Monday to Sunday)\n */\nexport function getThisWeek(): PresetRange {\n const today = new Date();\n const dayOfWeek = today.getDay();\n const start = new Date(today);\n // Adjust to Monday (1) as first day of week\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n start.setDate(start.getDate() - daysToMonday);\n \n const end = new Date(start);\n end.setDate(end.getDate() + 6);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last week (Monday to Sunday)\n */\nexport function getLastWeek(): PresetRange {\n const today = new Date();\n const dayOfWeek = today.getDay();\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n \n const lastMonday = new Date(today);\n lastMonday.setDate(lastMonday.getDate() - daysToMonday - 7);\n \n const lastSunday = new Date(lastMonday);\n lastSunday.setDate(lastSunday.getDate() + 6);\n \n return {\n start: formatDate(lastMonday),\n end: formatDate(lastSunday)\n };\n}\n\n/**\n * Get this month (1st to last day)\n */\nexport function getThisMonth(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), 1);\n const end = new Date(today.getFullYear(), today.getMonth() + 1, 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last month (1st to last day)\n */\nexport function getLastMonth(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth() - 1, 1);\n const end = new Date(today.getFullYear(), today.getMonth(), 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get month to date (1st of current month to today)\n */\nexport function getMonthToDate(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), 1);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get this quarter (Q1, Q2, Q3, or Q4)\n */\nexport function getThisQuarter(): PresetRange {\n const today = new Date();\n const currentMonth = today.getMonth();\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n \n const start = new Date(today.getFullYear(), quarterStartMonth, 1);\n const end = new Date(today.getFullYear(), quarterStartMonth + 3, 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last quarter\n */\nexport function getLastQuarter(): PresetRange {\n const today = new Date();\n const currentMonth = today.getMonth();\n const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;\n \n const start = new Date(today.getFullYear(), lastQuarterStartMonth, 1);\n const end = new Date(today.getFullYear(), lastQuarterStartMonth + 3, 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get quarter to date (start of current quarter to today)\n */\nexport function getQuarterToDate(): PresetRange {\n const today = new Date();\n const currentMonth = today.getMonth();\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n \n const start = new Date(today.getFullYear(), quarterStartMonth, 1);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get this year (January 1 to December 31)\n */\nexport function getThisYear(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), 0, 1);\n const end = new Date(today.getFullYear(), 11, 31);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last year\n */\nexport function getLastYear(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear() - 1, 0, 1);\n const end = new Date(today.getFullYear() - 1, 11, 31);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get year to date (January 1 to today)\n */\nexport function getYearToDate(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), 0, 1);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get last N months (including current partial month)\n */\nexport function getLastNMonths(months: number): PresetRange {\n const today = new Date();\n const start = new Date(today);\n start.setMonth(start.getMonth() - months);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get last N years\n */\nexport function getLastNYears(years: number): PresetRange {\n const today = new Date();\n const start = new Date(today);\n start.setFullYear(start.getFullYear() - years);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Pre-built preset configurations for common use cases\n * Import and use these directly in your component\n */\nexport const CommonPresets = {\n /**\n * Dashboard presets - Perfect for analytics dashboards\n */\n dashboard: [\n { label: 'Today', getValue: getToday },\n { label: 'Yesterday', getValue: getYesterday },\n { label: 'Last 7 days', getValue: () => getLastNDays(7) },\n { label: 'Last 30 days', getValue: () => getLastNDays(30) },\n { label: 'This month', getValue: getThisMonth },\n { label: 'Last month', getValue: getLastMonth }\n ] as PresetConfig[],\n\n /**\n * Reporting presets - Perfect for business reporting\n */\n reporting: [\n { label: 'Today', getValue: getToday },\n { label: 'This week', getValue: getThisWeek },\n { label: 'Last week', getValue: getLastWeek },\n { label: 'This month', getValue: getThisMonth },\n { label: 'Last month', getValue: getLastMonth },\n { label: 'This quarter', getValue: getThisQuarter },\n { label: 'Last quarter', getValue: getLastQuarter }\n ] as PresetConfig[],\n\n /**\n * Financial presets - Perfect for ERP and accounting systems\n */\n financial: [\n { label: 'Month to date', getValue: getMonthToDate },\n { label: 'Quarter to date', getValue: getQuarterToDate },\n { label: 'Year to date', getValue: getYearToDate },\n { label: 'Last month', getValue: getLastMonth },\n { label: 'Last quarter', getValue: getLastQuarter },\n { label: 'Last year', getValue: getLastYear }\n ] as PresetConfig[],\n\n /**\n * Analytics presets - Perfect for BI and data analysis\n */\n analytics: [\n { label: 'Last 7 days', getValue: () => getLastNDays(7) },\n { label: 'Last 14 days', getValue: () => getLastNDays(14) },\n { label: 'Last 30 days', getValue: () => getLastNDays(30) },\n { label: 'Last 60 days', getValue: () => getLastNDays(60) },\n { label: 'Last 90 days', getValue: () => getLastNDays(90) },\n { label: 'Last 180 days', getValue: () => getLastNDays(180) },\n { label: 'Last 365 days', getValue: () => getLastNDays(365) }\n ] as PresetConfig[],\n\n /**\n * Simple presets - Basic common ranges\n */\n simple: [\n { label: 'Today', getValue: getToday },\n { label: 'Last 7 days', getValue: () => getLastNDays(7) },\n { label: 'Last 30 days', getValue: () => getLastNDays(30) },\n { label: 'This year', getValue: getThisYear }\n ] as PresetConfig[]\n};\n","/**\n * Public API Surface of @oneluiz/dual-datepicker\n */\n\nexport { DualDatepickerComponent } from './dual-datepicker.component';\nexport type { DateRange, MultiDateRange, PresetConfig, PresetRange, LocaleConfig, ThemeType } from './dual-datepicker.component';\n\n// Date Adapter System\nexport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nexport { NativeDateAdapter } from './native-date-adapter';\n\n// Preset Utilities\nexport * from './preset-utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oneluiz-dual-datepicker.mjs","sources":["../../src/date-adapter.ts","../../src/native-date-adapter.ts","../../src/core/range.validator.ts","../../src/core/date-clock.ts","../../src/core/system-clock.ts","../../src/core/date-adapter.ts","../../src/core/native-date-adapter.ts","../../src/core/preset.engine.ts","../../src/core/dual-date-range.store.ts","../../src/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/preset-utils.ts","../../src/core/index.ts","../../src/public-api.ts","../../src/oneluiz-dual-datepicker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Abstract class for date adapters.\n * Allows the component to work with different date libraries (Date, DayJS, date-fns, Luxon, etc.)\n */\nexport abstract class DateAdapter<T = any> {\n /**\n * Parses a value into a date object\n * @param value - Value to parse (string, number, or date object)\n * @returns Parsed date object\n */\n abstract parse(value: any): T | null;\n\n /**\n * Formats a date object into a string\n * @param date - Date object to format\n * @param format - Optional format string\n * @returns Formatted date string\n */\n abstract format(date: T, format?: string): string;\n\n /**\n * Adds days to a date\n * @param date - Date object\n * @param days - Number of days to add (can be negative)\n * @returns New date object\n */\n abstract addDays(date: T, days: number): T;\n\n /**\n * Adds months to a date\n * @param date - Date object\n * @param months - Number of months to add (can be negative)\n * @returns New date object\n */\n abstract addMonths(date: T, months: number): T;\n\n /**\n * Gets the year from a date\n * @param date - Date object\n * @returns Year number\n */\n abstract getYear(date: T): number;\n\n /**\n * Gets the month from a date (0-11)\n * @param date - Date object\n * @returns Month number (0-11)\n */\n abstract getMonth(date: T): number;\n\n /**\n * Gets the day of month from a date\n * @param date - Date object\n * @returns Day of month (1-31)\n */\n abstract getDate(date: T): number;\n\n /**\n * Gets the day of week from a date (0-6, Sunday = 0)\n * @param date - Date object\n * @returns Day of week (0-6)\n */\n abstract getDay(date: T): number;\n\n /**\n * Creates a new date object\n * @param year - Year\n * @param month - Month (0-11)\n * @param date - Day of month (1-31)\n * @returns New date object\n */\n abstract createDate(year: number, month: number, date: number): T;\n\n /**\n * Gets today's date\n * @returns Today's date object\n */\n abstract today(): T;\n\n /**\n * Checks if two dates are the same day\n * @param a - First date\n * @param b - Second date\n * @returns True if same day\n */\n abstract isSameDay(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is before another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is before b\n */\n abstract isBefore(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is after another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is after b\n */\n abstract isAfter(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is between two other dates\n * @param date - Date to check\n * @param start - Start date\n * @param end - End date\n * @returns True if date is between start and end\n */\n abstract isBetween(date: T | null, start: T | null, end: T | null): boolean;\n\n /**\n * Clones a date object\n * @param date - Date to clone\n * @returns Cloned date object\n */\n abstract clone(date: T): T;\n\n /**\n * Checks if a value is a valid date\n * @param date - Value to check\n * @returns True if valid date\n */\n abstract isValid(date: any): boolean;\n}\n\n/**\n * Injection token for DateAdapter\n */\nexport const DATE_ADAPTER = new InjectionToken<DateAdapter>('DATE_ADAPTER');\n","import { Injectable } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\n\n/**\n * Date adapter implementation for native JavaScript Date objects\n * This is the default adapter used by the component\n */\n@Injectable()\nexport class NativeDateAdapter extends DateAdapter<Date> {\n parse(value: any): Date | null {\n if (!value) return null;\n \n if (value instanceof Date) {\n return new Date(value);\n }\n \n if (typeof value === 'string' || typeof value === 'number') {\n // Fix timezone issues: parse YYYY-MM-DD as local date, not UTC\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, month - 1, day);\n }\n \n const date = new Date(value);\n return this.isValid(date) ? date : null;\n }\n \n return null;\n }\n\n format(date: Date, format: string = 'YYYY-MM-DD'): string {\n if (!this.isValid(date)) return '';\n \n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n \n // Simple format implementation\n switch (format) {\n case 'YYYY-MM-DD':\n return `${year}-${month}-${day}`;\n case 'MM/DD/YYYY':\n return `${month}/${day}/${year}`;\n case 'DD/MM/YYYY':\n return `${day}/${month}/${year}`;\n default:\n return `${year}-${month}-${day}`;\n }\n }\n\n addDays(date: Date, days: number): Date {\n const result = this.clone(date);\n result.setDate(result.getDate() + days);\n return result;\n }\n\n addMonths(date: Date, months: number): Date {\n const result = this.clone(date);\n result.setMonth(result.getMonth() + months);\n return result;\n }\n\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n getDate(date: Date): number {\n return date.getDate();\n }\n\n getDay(date: Date): number {\n return date.getDay();\n }\n\n createDate(year: number, month: number, date: number): Date {\n return new Date(year, month, date);\n }\n\n today(): Date {\n return new Date();\n }\n\n isSameDay(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n isBefore(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() < b.getTime();\n }\n\n isAfter(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() > b.getTime();\n }\n\n isBetween(date: Date | null, start: Date | null, end: Date | null): boolean {\n if (!date || !start || !end) return false;\n if (!this.isValid(date) || !this.isValid(start) || !this.isValid(end)) return false;\n \n const dateTime = date.getTime();\n const startTime = start.getTime();\n const endTime = end.getTime();\n \n return dateTime >= startTime && dateTime <= endTime;\n }\n\n clone(date: Date): Date {\n return new Date(date.getTime());\n }\n\n isValid(date: any): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n }\n}\n","/**\n * Pure validation functions for date ranges\n * No dependencies, no side effects - just logic\n * Perfect for SSR, testing, and reusability\n */\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Validate that end date is not before start date\n */\nexport function validateRangeOrder(start: Date | null, end: Date | null): ValidationResult {\n if (!start || !end) {\n return { valid: true }; // Allow incomplete selection\n }\n\n if (end < start) {\n return {\n valid: false,\n error: 'End date cannot be before start date'\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate that date is within min/max bounds\n */\nexport function validateDateBounds(\n date: Date | null,\n minDate?: Date,\n maxDate?: Date\n): ValidationResult {\n if (!date) {\n return { valid: true };\n }\n\n if (minDate && date < minDate) {\n return {\n valid: false,\n error: `Date cannot be before ${minDate.toISOString().split('T')[0]}`\n };\n }\n\n if (maxDate && date > maxDate) {\n return {\n valid: false,\n error: `Date cannot be after ${maxDate.toISOString().split('T')[0]}`\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate that a range is within bounds\n */\nexport function validateRangeBounds(\n start: Date | null,\n end: Date | null,\n minDate?: Date,\n maxDate?: Date\n): ValidationResult {\n const startValidation = validateDateBounds(start, minDate, maxDate);\n if (!startValidation.valid) {\n return startValidation;\n }\n\n const endValidation = validateDateBounds(end, minDate, maxDate);\n if (!endValidation.valid) {\n return endValidation;\n }\n\n return { valid: true };\n}\n\n/**\n * Check if a date is disabled\n */\nexport function isDateDisabled(\n date: Date,\n disabledDates?: Date[] | ((date: Date) => boolean)\n): boolean {\n if (!disabledDates) {\n return false;\n }\n\n if (typeof disabledDates === 'function') {\n return disabledDates(date);\n }\n\n // Array of disabled dates - compare by date string\n const dateStr = date.toISOString().split('T')[0];\n return disabledDates.some(\n d => d.toISOString().split('T')[0] === dateStr\n );\n}\n\n/**\n * Apply bounds to a date (clamp it)\n */\nexport function applyBounds(date: Date, minDate?: Date, maxDate?: Date): Date {\n let result = date;\n\n if (minDate && result < minDate) {\n result = minDate;\n }\n\n if (maxDate && result > maxDate) {\n result = maxDate;\n }\n\n return result;\n}\n\n/**\n * Parse ISO date string to Date object (deterministic)\n */\nexport function parseISODate(dateStr: string): Date | null {\n if (!dateStr) return null;\n\n const [year, month, day] = dateStr.split('-').map(Number);\n if (!year || !month || !day) return null;\n\n return new Date(year, month - 1, day);\n}\n\n/**\n * Format Date to ISO string (YYYY-MM-DD)\n */\nexport function formatISODate(date: Date | null): string {\n if (!date) return '';\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n","/**\n * Date Clock Abstraction for SSR-Safe Date Resolution\n * \n * Problem:\n * Presets like \"Last 7 Days\" or \"This Month\" use new Date() which causes:\n * - SSR hydration mismatch\n * - Server renders \"2026-02-14\", client renders \"2026-02-15\"\n * - Different filters in dashboards\n * - Different queries in ERP/BI\n * - Cache inconsistency\n * \n * Solution:\n * Inject a DateClock to control time deterministically:\n * \n * Server (SSR):\n * provide(DATE_CLOCK, {\n * useValue: { now: () => new Date('2026-02-21T00:00:00Z') }\n * })\n * \n * Client (Browser):\n * Uses SystemClock by default (new Date())\n * \n * Testing:\n * provide(DATE_CLOCK, {\n * useValue: { now: () => new Date('2026-01-15T10:30:00Z') }\n * })\n * \n * Architecture:\n * - PresetEngine receives DateClock via DI\n * - All preset calculations use clock.now() instead of new Date()\n * - Deterministic: Same clock.now() → Same preset result\n * - SSR-compatible: Server and client resolve identical ranges\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Clock abstraction for deterministic date resolution\n * \n * Use cases:\n * - SSR: Ensure server and client generate identical presets\n * - Testing: Control time for predictable test results\n * - Replay: Reproduce exact user state from past sessions\n * - Demo: Freeze time for reproducible demos\n */\nexport interface DateClock {\n /**\n * Get current date/time\n * \n * Default implementation returns new Date()\n * Override for SSR, testing, or time-travel scenarios\n */\n now(): Date;\n}\n\n/**\n * Injection token for DateClock\n * \n * Usage:\n * ```typescript\n * // Default (uses SystemClock)\n * bootstrapApplication(AppComponent);\n * \n * // SSR Override\n * bootstrapApplication(AppComponent, {\n * providers: [\n * {\n * provide: DATE_CLOCK,\n * useValue: { now: () => new Date('2026-02-21T00:00:00Z') }\n * }\n * ]\n * });\n * \n * // Testing Override\n * TestBed.configureTestingModule({\n * providers: [\n * {\n * provide: DATE_CLOCK,\n * useValue: { now: () => new Date('2026-01-15T12:00:00Z') }\n * }\n * ]\n * });\n * ```\n */\nexport const DATE_CLOCK = new InjectionToken<DateClock>('DATE_CLOCK');\n","/**\n * System Clock Implementation\n * \n * Default DateClock implementation that uses system time (new Date())\n * \n * This is the default behavior users expect:\n * - \"Today\" → actual today\n * - \"Last 7 Days\" → actual last 7 days\n * \n * In SSR scenarios, this should be overridden to ensure\n * server and client generate identical date ranges.\n */\n\nimport { Injectable } from '@angular/core';\nimport { DateClock } from './date-clock';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SystemClock implements DateClock {\n /**\n * Returns current system time\n * \n * This is the standard behavior for client-side applications.\n * For SSR, override DATE_CLOCK token with a fixed Date.\n */\n now(): Date {\n return new Date();\n }\n}\n","/**\n * Date Adapter Abstraction for Timezone-Safe Date Operations\n * \n * Problem:\n * Using Date natively in calendar/range logic causes enterprise bugs:\n * - Date ranges shift by 1 day due to timezone/DST\n * - Server (UTC) vs Client (local timezone) discrepancies\n * - Inconsistent reporting in BI/ERP/invoicing/hotel systems\n * \n * Solution:\n * All date calculations go through an adapter layer.\n * This allows:\n * - Timezone-safe operations by default (NativeDateAdapter normalizes to day boundaries)\n * - Optional integration with Luxon/DayJS/date-fns for advanced timezone handling\n * - Consistent behavior across SSR and client\n * - Migration path to timezone-aware libraries without breaking changes\n * \n * Architecture:\n * ```\n * DualDateRangeStore\n * ↓ uses\n * DateAdapter ← Inject via DATE_ADAPTER token\n * ↓ implements\n * NativeDateAdapter (default, zero deps)\n * LuxonDateAdapter (optional, full timezone support)\n * DayJSDateAdapter (optional, lightweight)\n * ```\n * \n * Usage:\n * ```typescript\n * // Default (NativeDateAdapter)\n * bootstrapApplication(AppComponent);\n * \n * // Advanced (Luxon with timezone)\n * import { LuxonDateAdapter } from '@oneluiz/dual-datepicker/luxon';\n * \n * bootstrapApplication(AppComponent, {\n * providers: [\n * { provide: DATE_ADAPTER, useClass: LuxonDateAdapter }\n * ]\n * });\n * ```\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Date adapter interface for all calendar/range operations\n * \n * All methods operate on \"calendar day\" level, ignoring time components.\n * Implementations must ensure timezone-safe behavior.\n * \n * Implementations:\n * - NativeDateAdapter: Default, zero dependencies, uses Date with normalization\n * - LuxonDateAdapter: Optional, full timezone support with Luxon\n * - DayJSDateAdapter: Optional, lightweight timezone support\n * - Custom: Implement for your specific backend/timezone requirements\n */\nexport interface DateAdapter {\n /**\n * Normalize date to start of day (00:00:00.000)\n * \n * Critical for timezone-safe comparisons.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21T15:30:00');\n * const normalized = adapter.normalize(date);\n * // → 2026-02-21T00:00:00.000 (in local timezone)\n * ```\n * \n * @param date - Date to normalize\n * @returns Date with time set to 00:00:00.000\n */\n normalize(date: Date): Date;\n\n /**\n * Check if two dates represent the same calendar day\n * \n * Ignores time component. Timezone-safe.\n * \n * Example:\n * ```typescript\n * const a = new Date('2026-02-21T23:59:59');\n * const b = new Date('2026-02-21T00:00:01');\n * adapter.isSameDay(a, b); // → true\n * ```\n */\n isSameDay(a: Date, b: Date): boolean;\n\n /**\n * Check if date A is before date B (calendar day level)\n * \n * Example:\n * ```typescript\n * adapter.isBeforeDay(new Date('2026-02-20'), new Date('2026-02-21')); // → true\n * adapter.isBeforeDay(new Date('2026-02-21'), new Date('2026-02-21')); // → false\n * ```\n */\n isBeforeDay(a: Date, b: Date): boolean;\n\n /**\n * Check if date A is after date B (calendar day level)\n * \n * Example:\n * ```typescript\n * adapter.isAfterDay(new Date('2026-02-22'), new Date('2026-02-21')); // → true\n * adapter.isAfterDay(new Date('2026-02-21'), new Date('2026-02-21')); // → false\n * ```\n */\n isAfterDay(a: Date, b: Date): boolean;\n\n /**\n * Add days to a date\n * \n * Must handle DST transitions correctly.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const future = adapter.addDays(date, 7);\n * // → 2026-02-28\n * ```\n */\n addDays(date: Date, days: number): Date;\n\n /**\n * Add months to a date\n * \n * Must handle month overflow (e.g., Jan 31 + 1 month → Feb 28).\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-01-31');\n * const next = adapter.addMonths(date, 1);\n * // → 2026-02-28 (not March 3rd)\n * ```\n */\n addMonths(date: Date, months: number): Date;\n\n /**\n * Get start of day (00:00:00.000)\n * \n * Similar to normalize() but explicit intent.\n */\n startOfDay(date: Date): Date;\n\n /**\n * Get end of day (23:59:59.999)\n * \n * Useful for range queries that need to include entire day.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const end = adapter.endOfDay(date);\n * // → 2026-02-21T23:59:59.999\n * ```\n */\n endOfDay(date: Date): Date;\n\n /**\n * Get first day of month (00:00:00.000)\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const start = adapter.startOfMonth(date);\n * // → 2026-02-01T00:00:00.000\n * ```\n */\n startOfMonth(date: Date): Date;\n\n /**\n * Get last day of month (23:59:59.999)\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const end = adapter.endOfMonth(date);\n * // → 2026-02-28T23:59:59.999\n * ```\n */\n endOfMonth(date: Date): Date;\n\n /**\n * Get year (4-digit)\n * \n * Example:\n * ```typescript\n * adapter.getYear(new Date('2026-02-21')); // → 2026\n * ```\n */\n getYear(date: Date): number;\n\n /**\n * Get month (0-11, where 0 = January)\n * \n * Example:\n * ```typescript\n * adapter.getMonth(new Date('2026-02-21')); // → 1 (February)\n * ```\n */\n getMonth(date: Date): number;\n\n /**\n * Get day of month (1-31)\n * \n * Example:\n * ```typescript\n * adapter.getDate(new Date('2026-02-21')); // → 21\n * ```\n */\n getDate(date: Date): number;\n\n /**\n * Get day of week (0-6, where 0 = Sunday)\n * \n * Example:\n * ```typescript\n * adapter.getDay(new Date('2026-02-21')); // → 6 (Saturday)\n * ```\n */\n getDay(date: Date): number;\n\n /**\n * Convert Date to ISO date string (YYYY-MM-DD)\n * \n * CRITICAL: Must be timezone-safe!\n * DO NOT use date.toISOString() as it converts to UTC.\n * \n * Example:\n * ```typescript\n * // Local timezone GMT-6 (CST)\n * const date = new Date('2026-02-21T23:00:00'); // 11 PM CST\n * \n * // ❌ WRONG: date.toISOString().split('T')[0]\n * // Returns \"2026-02-22\" (shifted to UTC!)\n * \n * // ✅ CORRECT: adapter.toISODate(date)\n * // Returns \"2026-02-21\" (local date preserved)\n * ```\n * \n * @param date - Date to format (or null)\n * @returns ISO date string in YYYY-MM-DD format (local timezone), empty string if null\n */\n toISODate(date: Date | null): string;\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Date\n * \n * CRITICAL: Must be timezone-safe!\n * DO NOT use new Date(isoString) as it may parse as UTC.\n * \n * Example:\n * ```typescript\n * // ❌ WRONG: new Date('2026-02-21')\n * // May parse as UTC midnight, which is previous day in some timezones\n * \n * // ✅ CORRECT: adapter.parseISODate('2026-02-21')\n * // Returns Date representing 2026-02-21 00:00:00 in local timezone\n * ```\n * \n * @param isoDate - ISO date string (YYYY-MM-DD) or null\n * @returns Date object or null if invalid\n */\n parseISODate(isoDate: string | null): Date | null;\n\n /**\n * Get week start day for locale\n * \n * 0 = Sunday, 1 = Monday, etc.\n * \n * Example:\n * ```typescript\n * adapter.getWeekStart('en-US'); // → 0 (Sunday)\n * adapter.getWeekStart('en-GB'); // → 1 (Monday)\n * ```\n * \n * @param locale - Locale string (e.g., 'en-US', 'es-ES')\n * @returns Day number (0-6)\n */\n getWeekStart(locale?: string): 0 | 1 | 2 | 3 | 4 | 5 | 6;\n}\n\n/**\n * Injection token for DateAdapter\n * \n * Default: NativeDateAdapter (zero dependencies)\n * \n * Override for advanced timezone handling:\n * \n * ```typescript\n * // Luxon with timezone\n * import { LuxonDateAdapter } from '@oneluiz/dual-datepicker/luxon';\n * \n * bootstrapApplication(AppComponent, {\n * providers: [\n * {\n * provide: DATE_ADAPTER,\n * useClass: LuxonDateAdapter\n * }\n * ]\n * });\n * ```\n * \n * Custom implementation:\n * \n * ```typescript\n * class CustomDateAdapter implements DateAdapter {\n * // Your implementation for backend-specific date handling\n * }\n * \n * provide(DATE_ADAPTER, { useClass: CustomDateAdapter });\n * ```\n */\nexport const DATE_ADAPTER = new InjectionToken<DateAdapter>('DATE_ADAPTER');\n","/**\n * Native Date Adapter Implementation\n * \n * Default adapter using JavaScript Date with timezone-safe operations.\n * \n * Zero dependencies. Conservative implementation that:\n * - Normalizes all dates to start of day (00:00:00.000)\n * - Uses manual YYYY-MM-DD construction (avoids toISOString() timezone shift)\n * - Parses ISO dates to local timezone (avoids UTC interpretation)\n * - Handles month overflow correctly (Jan 31 + 1 month = Feb 28, not Mar 3)\n * - All comparisons work on normalized dates\n * \n * Limitations:\n * - No timezone awareness (all operations in local timezone)\n * - No DST-safe calculations across timezone changes\n * - For advanced timezone needs, use LuxonDateAdapter or DayJSDateAdapter\n * \n * Perfect for:\n * ✅ Most enterprise apps (ERP, POS, BI) where local timezone is sufficient\n * ✅ Applications without cross-timezone requirements\n * ✅ Minimizing bundle size (zero deps)\n * ✅ Simple, predictable date handling\n */\n\nimport { Injectable } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NativeDateAdapter implements DateAdapter {\n /**\n * Normalize date to start of day (00:00:00.000) in local timezone\n * \n * This is the foundation of timezone-safe operations.\n * All other methods use normalized dates for comparisons.\n */\n normalize(date: Date): Date {\n const normalized = new Date(date);\n normalized.setHours(0, 0, 0, 0);\n return normalized;\n }\n\n /**\n * Check if two dates are the same calendar day\n * \n * Implementation: Compare YYYY-MM-DD components directly\n * Avoids timezone issues from valueOf() comparisons\n */\n isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n /**\n * Check if date A is before date B (calendar day level)\n * \n * Implementation: Compare normalized dates using valueOf()\n */\n isBeforeDay(a: Date, b: Date): boolean {\n return this.normalize(a).valueOf() < this.normalize(b).valueOf();\n }\n\n /**\n * Check if date A is after date B (calendar day level)\n * \n * Implementation: Compare normalized dates using valueOf()\n */\n isAfterDay(a: Date, b: Date): boolean {\n return this.normalize(a).valueOf() > this.normalize(b).valueOf();\n }\n\n /**\n * Add days to a date\n * \n * Implementation: Use setDate() which handles month rollover automatically\n * \n * Example:\n * Jan 31 + 3 days → Feb 3 ✅\n * Feb 28 + 1 day → Mar 1 ✅ (non-leap year)\n */\n addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return this.normalize(result);\n }\n\n /**\n * Add months to a date\n * \n * CRITICAL: Handles month overflow correctly\n * \n * Algorithm:\n * 1. Add months using setMonth()\n * 2. If day-of-month changed (overflow), set to last day of target month\n * \n * Examples:\n * - Jan 31 + 1 month → Feb 28 (or Feb 29 in leap year) ✅\n * - Jan 31 + 2 months → Mar 31 ✅\n * - Mar 31 + 1 month → Apr 30 ✅\n * - Dec 31 + 1 month → Jan 31 (next year) ✅\n */\n addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n const originalDay = result.getDate();\n \n // Add months\n result.setMonth(result.getMonth() + months);\n \n // Check for day overflow (e.g., Jan 31 → Feb 31 becomes Mar 3)\n if (result.getDate() !== originalDay) {\n // Overflow detected: set to last day of target month\n // Go to 1st of next month, then subtract 1 day\n result.setDate(0); // Sets to last day of previous month\n }\n \n return this.normalize(result);\n }\n\n /**\n * Get start of day (00:00:00.000)\n * \n * Alias for normalize() with explicit intent\n */\n startOfDay(date: Date): Date {\n return this.normalize(date);\n }\n\n /**\n * Get end of day (23:59:59.999)\n * \n * Useful for inclusive range queries\n */\n endOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n }\n\n /**\n * Get first day of month (00:00:00.000)\n */\n startOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setDate(1);\n return this.normalize(result);\n }\n\n /**\n * Get last day of month (23:59:59.999)\n * \n * Algorithm: Go to 1st of next month, subtract 1 day\n */\n endOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + 1, 0); // Day 0 = last day of previous month\n return this.endOfDay(result);\n }\n\n /**\n * Get year (4-digit)\n */\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n /**\n * Get month (0-11)\n */\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n /**\n * Get day of month (1-31)\n */\n getDate(date: Date): number {\n return date.getDate();\n }\n\n /**\n * Get day of week (0-6, Sunday=0)\n */\n getDay(date: Date): number {\n return date.getDay();\n }\n\n /**\n * Convert Date to ISO date string (YYYY-MM-DD)\n * \n * CRITICAL: DO NOT use toISOString() - it converts to UTC!\n * \n * Manual construction ensures local timezone is preserved:\n * \n * Example problem with toISOString():\n * ```\n * // Local timezone: GMT-6 (CST)\n * const date = new Date('2026-02-21T23:00:00'); // 11 PM Feb 21 local\n * \n * // WRONG ❌\n * date.toISOString().split('T')[0]\n * // Returns \"2026-02-22\" (converted to UTC = Feb 22 05:00 AM)\n * \n * // CORRECT ✅\n * toISODate(date)\n * // Returns \"2026-02-21\" (local date preserved)\n * ```\n * \n * Implementation: Build YYYY-MM-DD manually from local date components\n */\n toISODate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Date\n * \n * CRITICAL: DO NOT use new Date(isoString) - may parse as UTC!\n * \n * Example problem with Date constructor:\n * ```\n * // Local timezone: GMT-6 (CST)\n * \n * // WRONG ❌\n * new Date('2026-02-21')\n * // Parsed as UTC: 2026-02-21T00:00:00Z\n * // In local timezone: Feb 20, 2026 6:00 PM (previous day!)\n * \n * // CORRECT ✅\n * parseISODate('2026-02-21')\n * // Returns: 2026-02-21T00:00:00 local time\n * ```\n * \n * Implementation: Parse components and construct Date in local timezone\n */\n parseISODate(isoDate: string): Date | null {\n if (!isoDate || typeof isoDate !== 'string') {\n return null;\n }\n\n // Match YYYY-MM-DD format\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(isoDate.trim());\n \n if (!match) {\n return null;\n }\n\n const year = parseInt(match[1], 10);\n const month = parseInt(match[2], 10) - 1; // 0-indexed\n const day = parseInt(match[3], 10);\n\n // Validate ranges\n if (month < 0 || month > 11) {\n return null;\n }\n\n if (day < 1 || day > 31) {\n return null;\n }\n\n // Construct date in local timezone\n const date = new Date(year, month, day);\n \n // Verify date is valid (e.g., Feb 31 would roll to Mar 3)\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return this.normalize(date);\n }\n\n /**\n * Get week start day for locale\n * \n * Default: Sunday (0) for most locales\n * Monday (1) for Europe, ISO 8601\n * \n * Implementation: Simple locale detection\n * For advanced needs, use Intl.Locale or external library\n */\n getWeekStart(locale?: string): 0 | 1 | 2 | 3 | 4 | 5 | 6 {\n if (!locale) {\n locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US';\n }\n\n // ISO 8601: Monday start\n const mondayStartLocales = [\n 'en-GB', 'en-IE', 'en-AU', 'en-NZ', 'en-CA',\n 'es', 'es-ES', 'es-MX',\n 'fr', 'fr-FR', 'fr-CA',\n 'de', 'de-DE', 'de-AT', 'de-CH',\n 'it', 'it-IT',\n 'pt', 'pt-PT', 'pt-BR',\n 'nl', 'nl-NL', 'nl-BE',\n 'ru', 'ru-RU',\n 'zh', 'zh-CN', 'zh-TW',\n 'ja', 'ja-JP',\n 'ko', 'ko-KR'\n ];\n\n const normalizedLocale = locale.toLowerCase();\n const startsWithMonday = mondayStartLocales.some(loc => \n normalizedLocale.startsWith(loc.toLowerCase())\n );\n\n return startsWithMonday ? 1 : 0;\n }\n}\n","/**\n * Headless Preset Engine\n * Pure functions that resolve date ranges WITHOUT render dependency\n * Perfect for SSR, global state, dashboard filters\n * \n * v3.5.0: SSR-Safe via Clock Injection\n * All date calculations use DateClock instead of new Date()\n * This ensures server and client resolve identical presets\n * \n * v3.5.1: Timezone-Safe via DateAdapter\n * All date operations use DateAdapter for consistent behavior\n * Fixes timezone bugs common in ERP/BI/POS systems\n */\n\nimport { Injectable, inject, Optional } from '@angular/core';\nimport { DateClock, DATE_CLOCK } from './date-clock';\nimport { SystemClock } from './system-clock';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\n\nexport interface RangePreset {\n /**\n * Resolve preset to actual date range\n * @param now - Current date for deterministic calculation\n */\n resolve(now: Date): { start: Date; end: Date };\n}\n\nexport interface PresetRange {\n start: string; // ISO format\n end: string; // ISO format\n}\n\n/**\n * Registry of built-in presets\n * Can be extended by consumers\n * \n * SSR-Safe Architecture:\n * - Injects DateClock via DI\n * - All presets use clock.now() instead of new Date()\n * - Deterministic: same clock.now() → same preset\n * - Override DATE_CLOCK token in SSR to ensure consistency\n * \n * Timezone-Safe Architecture:\n * - Injects DateAdapter via DI\n * - All date operations use adapter methods\n * - Prevents timezone bugs in cross-timezone scenarios\n * - Override DATE_ADAPTER for Luxon/DayJS/custom implementations\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PresetEngine {\n private presets = new Map<string, RangePreset>();\n private clock: DateClock;\n private adapter: DateAdapter;\n\n constructor() {\n // Try to inject DATE_CLOCK, fallback to SystemClock if not provided\n try {\n this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();\n } catch {\n // In case inject() fails (e.g., called outside injection context)\n this.clock = new SystemClock();\n }\n\n // Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided\n try {\n this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();\n } catch {\n // In case inject() fails (e.g., called outside injection context)\n this.adapter = new NativeDateAdapter();\n }\n\n this.registerBuiltInPresets();\n }\n\n /**\n * Register a custom preset\n */\n register(key: string, preset: RangePreset): void {\n this.presets.set(key, preset);\n }\n\n /**\n * Resolve a preset to date range\n * \n * SSR Note: Uses injected DateClock for deterministic resolution\n * Timezone Note: Uses injected DateAdapter for consistent date operations\n * \n * Override tokens in SSR scenarios:\n * - DATE_CLOCK: Control current time\n * - DATE_ADAPTER: Control date operations (e.g., Luxon for timezone support)\n * \n * @param key - Preset key (e.g., 'TODAY', 'LAST_7_DAYS')\n * @param now - Optional override for current date (defaults to clock.now())\n */\n resolve(key: string, now?: Date): PresetRange | null {\n const preset = this.presets.get(key);\n if (!preset) return null;\n\n const currentDate = now ?? this.clock.now();\n const { start, end } = preset.resolve(currentDate);\n return {\n start: this.adapter.toISODate(start),\n end: this.adapter.toISODate(end)\n };\n }\n\n /**\n * Get all available preset keys\n */\n getPresetKeys(): string[] {\n return Array.from(this.presets.keys());\n }\n\n /**\n * Register all built-in presets\n * \n * All presets now use DateAdapter for timezone-safe operations\n */\n private registerBuiltInPresets(): void {\n const adapter = this.adapter;\n\n // Today\n this.register('TODAY', {\n resolve: (now) => {\n const normalized = adapter.normalize(now);\n return { start: normalized, end: normalized };\n }\n });\n\n // Yesterday\n this.register('YESTERDAY', {\n resolve: (now) => {\n const date = adapter.addDays(now, -1);\n return { start: date, end: date };\n }\n });\n\n // Last N Days\n this.register('LAST_7_DAYS', {\n resolve: (now) => {\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -6);\n return { start, end };\n }\n });\n\n this.register('LAST_14_DAYS', {\n resolve: (now) => {\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -13);\n return { start, end };\n }\n });\n\n this.register('LAST_30_DAYS', {\n resolve: (now) => {\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -29);\n return { start, end };\n }\n });\n\n this.register('LAST_60_DAYS', {\n resolve: (now) => {\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -59);\n return { start, end };\n }\n });\n\n this.register('LAST_90_DAYS', {\n resolve: (now) => {\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -89);\n return { start, end };\n }\n });\n\n // This Week (Monday to Sunday)\n this.register('THIS_WEEK', {\n resolve: (now) => {\n const dayOfWeek = adapter.getDay(now);\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const start = adapter.addDays(now, -daysToMonday);\n const end = adapter.addDays(start, 6);\n return { start, end };\n }\n });\n\n // Last Week\n this.register('LAST_WEEK', {\n resolve: (now) => {\n const dayOfWeek = adapter.getDay(now);\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const lastMonday = adapter.addDays(now, -daysToMonday - 7);\n const lastSunday = adapter.addDays(lastMonday, 6);\n return { start: lastMonday, end: lastSunday };\n }\n });\n\n // This Month\n this.register('THIS_MONTH', {\n resolve: (now) => {\n const start = adapter.startOfMonth(now);\n const end = adapter.endOfMonth(now);\n return { start, end };\n }\n });\n\n // Last Month\n this.register('LAST_MONTH', {\n resolve: (now) => {\n const lastMonth = adapter.addMonths(now, -1);\n const start = adapter.startOfMonth(lastMonth);\n const end = adapter.endOfMonth(lastMonth);\n return { start, end };\n }\n });\n\n // Month to Date\n this.register('MONTH_TO_DATE', {\n resolve: (now) => {\n const start = adapter.startOfMonth(now);\n const end = adapter.normalize(now);\n return { start, end };\n }\n });\n\n // This Quarter\n this.register('THIS_QUARTER', {\n resolve: (now) => {\n const currentMonth = adapter.getMonth(now);\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const year = adapter.getYear(now);\n \n // Construct start of quarter\n const start = new Date(year, quarterStartMonth, 1);\n const normalizedStart = adapter.normalize(start);\n \n // Construct end of quarter (last day of 3rd month)\n const end = new Date(year, quarterStartMonth + 3, 0);\n const normalizedEnd = adapter.normalize(end);\n \n return { start: normalizedStart, end: normalizedEnd };\n }\n });\n\n // Last Quarter\n this.register('LAST_QUARTER', {\n resolve: (now) => {\n const currentMonth = adapter.getMonth(now);\n const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;\n const year = adapter.getYear(now);\n \n // Handle year rollover (Q1 - 1 = Q4 of previous year)\n const adjustedYear = lastQuarterStartMonth < 0 ? year - 1 : year;\n const adjustedMonth = lastQuarterStartMonth < 0 ? 9 : lastQuarterStartMonth;\n \n const start = new Date(adjustedYear, adjustedMonth, 1);\n const normalizedStart = adapter.normalize(start);\n \n const end = new Date(adjustedYear, adjustedMonth + 3, 0);\n const normalizedEnd = adapter.normalize(end);\n \n return { start: normalizedStart, end: normalizedEnd };\n }\n });\n\n // Quarter to Date\n this.register('QUARTER_TO_DATE', {\n resolve: (now) => {\n const currentMonth = adapter.getMonth(now);\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const year = adapter.getYear(now);\n \n const start = new Date(year, quarterStartMonth, 1);\n const normalizedStart = adapter.normalize(start);\n const end = adapter.normalize(now);\n \n return { start: normalizedStart, end };\n }\n });\n\n // This Year\n this.register('THIS_YEAR', {\n resolve: (now) => {\n const year = adapter.getYear(now);\n const start = new Date(year, 0, 1);\n const end = new Date(year, 11, 31);\n return { \n start: adapter.normalize(start), \n end: adapter.normalize(end) \n };\n }\n });\n\n // Last Year\n this.register('LAST_YEAR', {\n resolve: (now) => {\n const year = adapter.getYear(now);\n const start = new Date(year - 1, 0, 1);\n const end = new Date(year - 1, 11, 31);\n return { \n start: adapter.normalize(start), \n end: adapter.normalize(end) \n };\n }\n });\n\n // Year to Date\n this.register('YEAR_TO_DATE', {\n resolve: (now) => {\n const year = adapter.getYear(now);\n const start = new Date(year, 0, 1);\n const end = adapter.normalize(now);\n return { start: adapter.normalize(start), end };\n }\n });\n }\n}\n\n/**\n * Create a custom preset from a function\n */\nexport function createPreset(\n resolver: (now: Date) => { start: Date; end: Date }\n): RangePreset {\n return { resolve: resolver };\n}\n\n/**\n * @deprecated Use dependency injection instead:\n * ```typescript\n * private engine = inject(PresetEngine);\n * ```\n * \n * Singleton preset engine instance for backward compatibility\n * \n * WARNING: This singleton uses SystemClock directly and is NOT SSR-safe.\n * For SSR applications, inject PresetEngine and override DATE_CLOCK token.\n * \n * This export will be removed in v4.0.0\n */\nexport const presetEngine = new PresetEngine();\n","/**\n * Headless Date Range Store using Angular Signals\n * \n * Version: 3.5.1\n * \n * Architecture:\n * - State lives HERE, not in UI component\n * - Deterministic: no hidden side effects\n * - SSR-compatible: no window/document dependencies\n * - Timezone-safe: uses DateAdapter for all date operations\n * - Testable: pure signal-based state\n * - Reusable: inject anywhere (services, components, guards)\n * \n * Usage:\n * ```typescript\n * // In component\n * const rangeStore = inject(DualDateRangeStore);\n * rangeStore.applyPreset('THIS_MONTH');\n * \n * // In service (headless!)\n * const store = inject(DualDateRangeStore);\n * const range = store.range();\n * this.http.get(`/api/sales?start=${range.start}&end=${range.end}`);\n * ```\n */\n\nimport { Injectable, signal, computed, effect, inject } from '@angular/core';\nimport { \n validateRangeOrder, \n validateRangeBounds, \n isDateDisabled,\n applyBounds,\n parseISODate,\n formatISODate\n} from './range.validator';\nimport { PresetEngine, PresetRange } from './preset.engine';\nimport { DateClock, DATE_CLOCK } from './date-clock';\nimport { SystemClock } from './system-clock';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\n\nexport interface DateRangeState {\n start: string; // ISO date\n end: string; // ISO date\n startTime?: string; // HH:mm\n endTime?: string; // HH:mm\n}\n\nexport interface DateRangeConfig {\n minDate?: Date;\n maxDate?: Date;\n disabledDates?: Date[] | ((date: Date) => boolean);\n enableTimePicker?: boolean;\n defaultStartTime?: string;\n defaultEndTime?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DualDateRangeStore {\n // Dependency Injection - SSR-Safe & Timezone-Safe\n private presetEngine = inject(PresetEngine);\n private clock: DateClock;\n private adapter: DateAdapter;\n\n constructor() {\n // Try to inject DATE_CLOCK, fallback to SystemClock if not provided\n try {\n this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();\n } catch {\n // In case inject() fails (e.g., called outside injection context)\n this.clock = new SystemClock();\n }\n\n // Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided\n try {\n this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();\n } catch {\n this.adapter = new NativeDateAdapter();\n }\n }\n\n // Configuration\n private config = signal<DateRangeConfig>({\n enableTimePicker: false,\n defaultStartTime: '00:00',\n defaultEndTime: '23:59'\n });\n\n // Core state - using signals\n private _startDate = signal<Date | null>(null);\n private _endDate = signal<Date | null>(null);\n private _leftMonth = signal<Date>(new Date());\n private _rightMonth = signal<Date>(this.getNextMonth(new Date()));\n private _selectingStart = signal<boolean>(true);\n\n // Time state\n private _startTime = signal<string>('00:00');\n private _endTime = signal<string>('23:59');\n\n // Pending state for requireApply mode\n private _pendingStart = signal<Date | null>(null);\n private _pendingEnd = signal<Date | null>(null);\n private _hasPendingChanges = signal<boolean>(false);\n\n // Public read-only signals\n readonly startDate = this._startDate.asReadonly();\n readonly endDate = this._endDate.asReadonly();\n readonly leftMonth = this._leftMonth.asReadonly();\n readonly rightMonth = this._rightMonth.asReadonly();\n readonly selectingStart = this._selectingStart.asReadonly();\n readonly startTime = this._startTime.asReadonly();\n readonly endTime = this._endTime.asReadonly();\n readonly hasPendingChanges = this._hasPendingChanges.asReadonly();\n\n // Computed: ISO range for API consumption\n readonly range = computed<DateRangeState>(() => {\n const start = this._startDate();\n const end = this._endDate();\n const cfg = this.config();\n\n const result: DateRangeState = {\n start: this.adapter.toISODate(start),\n end: this.adapter.toISODate(end)\n };\n\n if (cfg.enableTimePicker) {\n result.startTime = this._startTime();\n result.endTime = this._endTime();\n }\n\n return result;\n });\n\n // Computed: validation state\n readonly isValid = computed(() => {\n const start = this._startDate();\n const end = this._endDate();\n const cfg = this.config();\n\n const orderValidation = validateRangeOrder(start, end);\n if (!orderValidation.valid) return false;\n\n const boundsValidation = validateRangeBounds(\n start,\n end,\n cfg.minDate,\n cfg.maxDate\n );\n return boundsValidation.valid;\n });\n\n // Computed: range text for display\n readonly rangeText = computed(() => {\n const start = this._startDate();\n const end = this._endDate();\n\n if (!start && !end) return '';\n if (!start) return `? - ${this.formatDateShort(end!)}`;\n if (!end) return `${this.formatDateShort(start)}`;\n\n return `${this.formatDateShort(start)} - ${this.formatDateShort(end)}`;\n });\n\n /**\n * Configure the store\n */\n configure(config: Partial<DateRangeConfig>): void {\n this.config.update(current => ({ ...current, ...config }));\n }\n\n /**\n * Set start date (with validation)\n */\n setStart(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n \n if (parsedDate) {\n const cfg = this.config();\n \n // Apply bounds\n const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);\n \n // Check if disabled\n if (isDateDisabled(boundedDate, cfg.disabledDates)) {\n console.warn('Cannot select disabled date');\n return;\n }\n\n this._startDate.set(boundedDate);\n this._selectingStart.set(false);\n\n // Auto-adjust end if it becomes invalid\n const end = this._endDate();\n if (end && end < boundedDate) {\n this._endDate.set(null);\n }\n } else {\n this._startDate.set(null);\n }\n }\n\n /**\n * Set end date (with validation)\n */\n setEnd(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n \n if (parsedDate) {\n const cfg = this.config();\n \n // Apply bounds\n const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);\n \n // Check if disabled\n if (isDateDisabled(boundedDate, cfg.disabledDates)) {\n console.warn('Cannot select disabled date');\n return;\n }\n\n // Validate order\n const start = this._startDate();\n if (start && boundedDate < start) {\n console.warn('End date cannot be before start date');\n return;\n }\n\n this._endDate.set(boundedDate);\n this._selectingStart.set(true); // Ready for next selection\n } else {\n this._endDate.set(null);\n }\n }\n\n /**\n * Set complete range at once\n */\n setRange(start: Date | string | null, end: Date | string | null): void {\n this.setStart(start);\n this.setEnd(end);\n }\n\n /**\n * Set pending selection (for requireApply mode)\n */\n setPendingStart(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n this._pendingStart.set(parsedDate);\n this._hasPendingChanges.set(true);\n }\n\n setPendingEnd(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n this._pendingEnd.set(parsedDate);\n this._hasPendingChanges.set(true);\n }\n\n /**\n * Apply pending changes\n */\n applyPending(): void {\n const pendingStart = this._pendingStart();\n const pendingEnd = this._pendingEnd();\n\n if (pendingStart) this.setStart(pendingStart);\n if (pendingEnd) this.setEnd(pendingEnd);\n\n this.clearPending();\n }\n\n /**\n * Cancel pending changes\n */\n cancelPending(): void {\n this.clearPending();\n }\n\n private clearPending(): void {\n this._pendingStart.set(null);\n this._pendingEnd.set(null);\n this._hasPendingChanges.set(false);\n }\n\n /**\n * Reset to empty state\n */\n reset(): void {\n this._startDate.set(null);\n this._endDate.set(null);\n this._selectingStart.set(true);\n this.clearPending();\n }\n\n /**\n * Apply a preset by key\n * \n * SSR-Safe: Uses injected DateClock for deterministic resolution\n * \n * @param presetKey - Preset identifier (e.g., 'TODAY', 'LAST_7_DAYS')\n * @param now - Optional date override (defaults to clock.now())\n */\n applyPreset(presetKey: string, now?: Date): void {\n const currentDate = now ?? this.clock.now();\n const range = this.presetEngine.resolve(presetKey, currentDate);\n \n if (range) {\n this.setRange(range.start, range.end);\n } else {\n console.warn(`Preset \"${presetKey}\" not found`);\n }\n }\n\n /**\n * Navigate left calendar month\n */\n setLeftMonth(date: Date): void {\n this._leftMonth.set(date);\n \n // Ensure right month is always after left\n const right = this._rightMonth();\n if (right <= date) {\n this._rightMonth.set(this.getNextMonth(date));\n }\n }\n\n /**\n * Navigate right calendar month\n */\n setRightMonth(date: Date): void {\n this._rightMonth.set(date);\n \n // Ensure left month is always before right\n const left = this._leftMonth();\n if (left >= date) {\n this._leftMonth.set(this.getPreviousMonth(date));\n }\n }\n\n /**\n * Set time values\n */\n setStartTime(time: string): void {\n this._startTime.set(time);\n }\n\n setEndTime(time: string): void {\n this._endTime.set(time);\n }\n\n /**\n * Get current state as snapshot\n */\n getSnapshot(): DateRangeState {\n return this.range();\n }\n\n /**\n * Load state from snapshot\n */\n loadSnapshot(snapshot: DateRangeState): void {\n this.setRange(snapshot.start, snapshot.end);\n \n if (snapshot.startTime) {\n this.setStartTime(snapshot.startTime);\n }\n \n if (snapshot.endTime) {\n this.setEndTime(snapshot.endTime);\n }\n }\n\n // Helper methods - using DateAdapter for timezone safety\n private parseDate(date: Date | string | null): Date | null {\n if (!date) return null;\n if (date instanceof Date) return this.adapter.normalize(date);\n return this.adapter.parseISODate(date);\n }\n\n private getNextMonth(date: Date): Date {\n return this.adapter.addMonths(date, 1);\n }\n\n private getPreviousMonth(date: Date): Date {\n return this.adapter.addMonths(date, -1);\n }\n\n private formatDateShort(date: Date): string {\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const month = this.adapter.getMonth(date);\n const day = this.adapter.getDay(date);\n return `${day} ${months[month]}`;\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, HostListener, ElementRef, forwardRef, signal, computed, effect, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\nimport { DualDateRangeStore } from './core/dual-date-range.store';\n\nexport interface DateRange {\n startDate: string;\n endDate: string;\n rangeText: string;\n startTime?: string; // HH:mm format (optional)\n endTime?: string; // HH:mm format (optional)\n}\n\nexport interface MultiDateRange {\n ranges: DateRange[];\n}\n\nexport interface PresetRange {\n start: string;\n end: string;\n}\n\nexport interface PresetConfig {\n label: string;\n getValue: () => PresetRange;\n}\n\nexport interface LocaleConfig {\n monthNames?: string[];\n monthNamesShort?: string[];\n dayNames?: string[];\n dayNamesShort?: string[];\n firstDayOfWeek?: number; // 0 = Sunday, 1 = Monday, etc.\n}\n\nexport type ThemeType = 'default' | 'bootstrap' | 'bulma' | 'foundation' | 'tailwind' | 'custom';\n\n@Component({\n selector: 'ngx-dual-datepicker',\n standalone: true,\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\n templateUrl: './dual-datepicker.component.html',\n styleUrl: './dual-datepicker.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DualDatepickerComponent),\n multi: true\n },\n {\n provide: DATE_ADAPTER,\n useClass: NativeDateAdapter\n }\n ]\n})\nexport class DualDatepickerComponent implements OnInit, OnChanges, ControlValueAccessor {\n @Input() placeholder: string = 'Select date range';\n @Input() set startDate(value: string) {\n if (value) {\n const date = this.dateAdapter.parse(value);\n if (date) this.rangeStore.setStart(date);\n }\n }\n get startDate(): string {\n const date = this.rangeStore.startDate();\n return date ? this.formatDate(date) : '';\n }\n \n @Input() set endDate(value: string) {\n if (value) {\n const date = this.dateAdapter.parse(value);\n if (date) this.rangeStore.setEnd(date);\n }\n }\n get endDate(): string {\n const date = this.rangeStore.endDate();\n return date ? this.formatDate(date) : '';\n }\n @Input() showPresets: boolean = true;\n @Input() showClearButton: boolean = false;\n @Input() multiRange: boolean = false;\n @Input() closeOnSelection: boolean = true;\n @Input() closeOnPresetSelection: boolean = true;\n @Input() closeOnClickOutside: boolean = true;\n @Input() enableKeyboardNavigation: boolean = true;\n @Input() presets: PresetConfig[] = [];\n @Input() theme: ThemeType = 'default';\n @Input() inputBackgroundColor: string = '#fff';\n @Input() inputTextColor: string = '#495057';\n @Input() inputBorderColor: string = '#ced4da';\n @Input() inputBorderColorHover: string = '#ced4da';\n @Input() inputBorderColorFocus: string = '#80bdff';\n @Input() inputPadding: string = '0.375rem 0.75rem';\n @Input() locale: LocaleConfig = {};\n @Input() disabledDates: Date[] | ((date: Date) => boolean) | undefined;\n @Input() displayFormat: string = 'D MMM'; // Format for displaying dates in input\n @Input() requireApply: boolean = false; // Require Apply button confirmation\n @Input() enableTimePicker: boolean = false; // Enable time selection\n @Input() timeFormat: '12h' | '24h' = '24h'; // Time format\n @Input() minuteStep: number = 15; // Step for minute selector (1, 5, 15, 30)\n @Input() defaultStartTime: string = '00:00'; // Default start time HH:mm\n @Input() defaultEndTime: string = '23:59'; // Default end time HH:mm\n\n @Output() dateRangeChange = new EventEmitter<DateRange>();\n @Output() dateRangeSelected = new EventEmitter<DateRange>();\n @Output() multiDateRangeChange = new EventEmitter<MultiDateRange>();\n @Output() multiDateRangeSelected = new EventEmitter<MultiDateRange>();\n\n // Date adapter injection\n private dateAdapter = inject<DateAdapter>(DATE_ADAPTER);\n \n // Headless store for date range state (v3.5.0+)\n protected readonly rangeStore = inject(DualDateRangeStore);\n\n // UI-only signals\n showDatePicker = signal(false);\n currentMonth = signal(this.dateAdapter.today());\n previousMonth = signal(this.dateAdapter.today());\n currentMonthDays = signal<any[]>([]);\n previousMonthDays = signal<any[]>([]);\n isDisabled = signal(false);\n showStartTimePicker = signal(false);\n showEndTimePicker = signal(false);\n hoverDate = signal<string | null>(null);\n \n // Computed time properties from store\n get startHour(): number {\n const time = this.rangeStore.startTime();\n return this.parseTime(time).hour;\n }\n \n get startMinute(): number {\n const time = this.rangeStore.startTime();\n return this.parseTime(time).minute;\n }\n \n get endHour(): number {\n const time = this.rangeStore.endTime();\n return this.parseTime(time).hour;\n }\n \n get endMinute(): number {\n const time = this.rangeStore.endTime();\n return this.parseTime(time).minute;\n }\n \n private setStartHourMinute(hour: number, minute: number): void {\n const timeStr = this.formatTime(hour, minute);\n this.rangeStore.setStartTime(timeStr);\n }\n \n private setEndHourMinute(hour: number, minute: number): void {\n const timeStr = this.formatTime(hour, minute);\n this.rangeStore.setEndTime(timeStr);\n }\n \n // Multi-range support (UI-specific)\n selectedRanges = signal<DateRange[]>([]);\n currentRangeIndex = signal<number>(-1);\n\n // Keyboard navigation (UI-specific)\n focusedDay = signal<{ date: string; monthIndex: number } | null>(null);\n \n // Computed values\n currentMonthName = computed(() => this.getMonthName(this.currentMonth()));\n previousMonthName = computed(() => this.getMonthName(this.previousMonth()));\n weekDayNames = computed(() => this.getDayNames());\n \n // Computed from store\n dateRangeText = computed(() => this.rangeStore.rangeText());\n selectingStartDate = computed(() => this.rangeStore.selectingStart());\n hasPendingChanges = computed(() => this.rangeStore.hasPendingChanges());\n \n // Computed for template access to pending dates (requireApply mode)\n get pendingStartDate(): string {\n // In requireApply mode, store keeps pending values\n // For now, use actual store values as pending (store handles this)\n if (!this.requireApply) return '';\n const date = this.rangeStore.startDate();\n return date && this.hasPendingChanges() ? this.formatDate(date) : '';\n }\n \n get pendingEndDate(): string {\n if (!this.requireApply) return '';\n const date = this.rangeStore.endDate();\n return date && this.hasPendingChanges() ? this.formatDate(date) : '';\n }\n\n private readonly defaultMonthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n private readonly defaultMonthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n private readonly defaultDayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n private readonly defaultDayNamesShort = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\n // ControlValueAccessor callbacks\n private onChange: (value: DateRange | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(private elementRef: ElementRef) {\n // Effect to emit changes when dates change in store\n effect(() => {\n const range = this.rangeStore.range();\n if (range.start || range.end) {\n this.onChange(this.getDateRangeValue());\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (this.showDatePicker() && this.closeOnClickOutside) {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.closeDatePicker();\n }\n }\n }\n\n @HostListener('keydown', ['$event'])\n handleKeyboardNavigation(event: KeyboardEvent): void {\n if (!this.enableKeyboardNavigation) {\n return;\n }\n\n if (!this.showDatePicker()) {\n // When picker is closed, allow Enter/Space to open it\n if (event.key === 'Enter' || event.key === ' ') {\n const target = event.target as HTMLElement;\n if (target.classList.contains('datepicker-input')) {\n event.preventDefault();\n this.toggleDatePicker();\n }\n }\n return;\n }\n\n // When picker is open\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closeDatePicker();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.moveFocusVertical(-1);\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.moveFocusVertical(1);\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.moveFocusHorizontal(-1);\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n this.moveFocusHorizontal(1);\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.selectFocusedDay();\n break;\n\n case 'Home':\n event.preventDefault();\n this.moveFocusToFirstDay();\n break;\n\n case 'End':\n event.preventDefault();\n this.moveFocusToLastDay();\n break;\n\n case 'PageUp':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(-1);\n } else {\n this.changeMonth(-1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n\n case 'PageDown':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(1);\n } else {\n this.changeMonth(1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n }\n }\n\n // Keyboard navigation methods\n private initializeFocus(): void {\n // Set initial focus to start date, end date, or first available day\n if (this.startDate) {\n const inPrevMonth = this.isDateInMonth(this.startDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.startDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.startDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // startDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else if (this.endDate) {\n const inPrevMonth = this.isDateInMonth(this.endDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.endDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.endDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // endDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else {\n // Focus on today if visible, otherwise first day of current month\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n // Today is not in current month, focus on first day of current month\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n }\n\n private isDateInMonth(dateStr: string, monthDate: Date): boolean {\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return false;\n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const monthYear = this.dateAdapter.getYear(monthDate);\n const monthMonth = this.dateAdapter.getMonth(monthDate);\n return year === monthYear && month === monthMonth;\n }\n\n private moveFocusHorizontal(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction);\n const newDateStr = this.formatDate(newDate);\n\n // Determine which month the new date belongs to\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Date is outside visible months, navigate month\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusVertical(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction * 7); // Move by week\n const newDateStr = this.formatDate(newDate);\n\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Navigate to month containing the new date\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusToFirstDay(): void {\n const prevMonthDays = this.previousMonthDays();\n const firstDay = prevMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 0 });\n }\n }\n\n private moveFocusToLastDay(): void {\n const currMonthDays = this.currentMonthDays();\n const validDays = currMonthDays.filter(day => day.isCurrentMonth);\n const lastDay = validDays[validDays.length - 1];\n if (lastDay) {\n this.focusedDay.set({ date: lastDay.date, monthIndex: 1 });\n }\n }\n\n private moveFocusYear(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const currentYear = this.dateAdapter.getYear(currentDate);\n const currentMonth = this.dateAdapter.getMonth(currentDate);\n const currentDay = this.dateAdapter.getDate(currentDate);\n \n const newDate = this.dateAdapter.createDate(currentYear + direction, currentMonth, currentDay);\n const newDateStr = this.formatDate(newDate);\n\n // Update months to show the new year\n this.currentMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth, 1));\n this.previousMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth - 1, 1));\n this.generateCalendars();\n\n const inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n }\n\n private adjustFocusAfterMonthChange(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const inPrevMonth = this.isDateInMonth(focused.date, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(focused.date, this.currentMonth());\n\n if (!inPrevMonth && !inCurrMonth) {\n // Focused day is no longer visible, move to equivalent day in visible months\n this.initializeFocus();\n } else {\n // Update month index if needed\n this.focusedDay.set({\n date: focused.date,\n monthIndex: inPrevMonth ? 0 : 1\n });\n }\n }\n\n private selectFocusedDay(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const monthDays = focused.monthIndex === 0 ? this.previousMonthDays() : this.currentMonthDays();\n const dayObj = monthDays.find(day => day.date === focused.date && day.isCurrentMonth);\n \n if (dayObj) {\n this.selectDay(dayObj);\n }\n }\n\n hasKeyboardFocus(date: string, monthIndex: number): boolean {\n const focused = this.focusedDay();\n return focused !== null && focused.date === date && focused.monthIndex === monthIndex;\n }\n\n ngOnInit(): void {\n // Configure the headless store\n this.rangeStore.configure({\n enableTimePicker: this.enableTimePicker,\n defaultStartTime: this.defaultStartTime,\n defaultEndTime: this.defaultEndTime,\n disabledDates: this.disabledDates\n });\n \n // Initialize dates in store if provided\n if (this.startDate) {\n const date = this.dateAdapter.parse(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (this.endDate) {\n const date = this.dateAdapter.parse(this.endDate);\n if (date) this.rangeStore.setEnd(date);\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['startDate'] || changes['endDate']) {\n // Sync with store\n if (changes['startDate'] && this.startDate) {\n const date = this.dateAdapter.parse(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (changes['endDate'] && this.endDate) {\n const date = this.dateAdapter.parse(this.endDate);\n if (date) this.rangeStore.setEnd(date);\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n }\n \n // Update store configuration if relevant inputs change\n if (changes['enableTimePicker'] || changes['defaultStartTime'] || \n changes['defaultEndTime'] || changes['disabledDates']) {\n this.rangeStore.configure({\n enableTimePicker: this.enableTimePicker,\n defaultStartTime: this.defaultStartTime,\n defaultEndTime: this.defaultEndTime,\n disabledDates: this.disabledDates\n });\n }\n }\n\n formatDate(date: Date): string {\n const year = this.dateAdapter.getYear(date);\n const month = String(this.dateAdapter.getMonth(date) + 1).padStart(2, '0');\n const day = String(this.dateAdapter.getDate(date)).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n formatDateDisplay(dateStr: string): string {\n if (!dateStr) return '';\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return '';\n \n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const day = this.dateAdapter.getDate(date);\n \n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n const monthNamesShort = this.locale.monthNamesShort || this.defaultMonthNamesShort;\n \n // Replace format tokens with values\n let formatted = this.displayFormat;\n \n // Year tokens\n formatted = formatted.replace(/YYYY/g, String(year));\n formatted = formatted.replace(/YY/g, String(year).slice(-2));\n \n // Month tokens (order matters: MMMM before MMM before MM before M)\n formatted = formatted.replace(/MMMM/g, monthNames[month]);\n formatted = formatted.replace(/MMM/g, monthNamesShort[month]);\n formatted = formatted.replace(/MM/g, String(month + 1).padStart(2, '0'));\n formatted = formatted.replace(/M/g, String(month + 1));\n \n // Day tokens (order matters: DD before D)\n formatted = formatted.replace(/DD/g, String(day).padStart(2, '0'));\n formatted = formatted.replace(/D/g, String(day));\n \n return formatted;\n }\n\n // Note: updateDateRangeText is now handled by computed dateRangeText from store\n // Keeping this method for backward compatibility but it's a no-op\n updateDateRangeText(): void {\n // Text is now automatically computed from store.rangeText()\n }\n\n toggleDatePicker(): void {\n this.showDatePicker.update(value => !value);\n if (this.showDatePicker()) {\n // selectingStart is managed by store, no need to set here\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const previousMonthDate = this.dateAdapter.createDate(year, month - 1, 1);\n this.previousMonth.set(previousMonthDate);\n this.generateCalendars();\n // Initialize keyboard focus only if keyboard navigation is enabled\n if (this.enableKeyboardNavigation) {\n this.initializeFocus();\n }\n } else {\n // Clear focus when closing\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n }\n this.onTouched();\n }\n\n closeDatePicker(): void {\n this.showDatePicker.set(false);\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n this.onTouched();\n }\n\n generateCalendars(): void {\n this.previousMonthDays.set(this.generateMonthCalendar(this.previousMonth()));\n this.currentMonthDays.set(this.generateMonthCalendar(this.currentMonth()));\n }\n\n generateMonthCalendar(date: Date): any[] {\n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const firstDay = this.dateAdapter.createDate(year, month, 1);\n const lastDay = this.dateAdapter.createDate(year, month + 1, 0);\n const daysInMonth = this.dateAdapter.getDate(lastDay);\n const firstDayOfWeek = this.dateAdapter.getDay(firstDay);\n\n const monthDays = [];\n\n for (let i = 0; i < firstDayOfWeek; i++) {\n monthDays.push({ day: null, isCurrentMonth: false });\n }\n\n for (let day = 1; day <= daysInMonth; day++) {\n const dayDate = this.dateAdapter.createDate(year, month, day);\n const dateStr = this.formatDate(dayDate);\n \n // Get pending dates from store (for requireApply mode)\n const pendingStart = this.rangeStore.startDate(); // In pending mode, store holds pending values\n const pendingEnd = this.rangeStore.endDate();\n const pendingStartStr = pendingStart ? this.formatDate(pendingStart) : '';\n const pendingEndStr = pendingEnd ? this.formatDate(pendingEnd) : '';\n \n const isPendingStart = this.requireApply && pendingStartStr === dateStr;\n const isPendingEnd = this.requireApply && pendingEndStr === dateStr;\n const inPendingRange = this.requireApply && pendingStartStr && pendingEndStr &&\n dateStr >= pendingStartStr && dateStr <= pendingEndStr;\n \n // Check if date is in hover preview range\n const inHoverRange = this.isInHoverRange(dateStr);\n \n monthDays.push({\n day: day,\n date: dateStr,\n isCurrentMonth: true,\n isStart: this.startDate === dateStr || isPendingStart,\n isEnd: this.endDate === dateStr || isPendingEnd,\n inRange: this.isInRange(dateStr) || inPendingRange,\n inHoverRange: inHoverRange,\n isDisabled: this.isDateDisabled(dayDate)\n });\n }\n\n return monthDays;\n }\n\n isInRange(dateStr: string): boolean {\n if (this.multiRange) {\n // Check if date is in any of the selected ranges\n return this.selectedRanges().some(range => {\n return dateStr >= range.startDate && dateStr <= range.endDate;\n });\n } else {\n if (!this.startDate || !this.endDate) return false;\n return dateStr >= this.startDate && dateStr <= this.endDate;\n }\n }\n\n isDateDisabled(date: Date): boolean {\n if (!this.disabledDates) return false;\n\n if (typeof this.disabledDates === 'function') {\n // If it's a function, call it with the date\n return this.disabledDates(date);\n } else if (Array.isArray(this.disabledDates)) {\n // If it's an array, check if the date matches any disabled date\n return this.disabledDates.some(disabledDate => {\n return this.dateAdapter.getYear(date) === this.dateAdapter.getYear(disabledDate) &&\n this.dateAdapter.getMonth(date) === this.dateAdapter.getMonth(disabledDate) &&\n this.dateAdapter.getDate(date) === this.dateAdapter.getDate(disabledDate);\n });\n }\n \n return false;\n }\n\n isInHoverRange(dateStr: string): boolean {\n const hover = this.hoverDate();\n if (!hover) return false;\n\n // In multiRange mode, only show hover preview when selecting end date\n if (this.multiRange) {\n if (this.selectingStartDate()) return false;\n const currentStart = this.startDate;\n if (!currentStart) return false;\n const minDate = currentStart < hover ? currentStart : hover;\n const maxDate = currentStart > hover ? currentStart : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // In single range mode \n if (this.selectingStartDate()) return false;\n \n if (this.requireApply) {\n // Use pending dates from store\n const pendingStart = this.rangeStore.startDate();\n if (!pendingStart) return false;\n const pendingStartStr = this.formatDate(pendingStart);\n const minDate = pendingStartStr < hover ? pendingStartStr : hover;\n const maxDate = pendingStartStr > hover ? pendingStartStr : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // Use actual dates\n const currentStart = this.startDate;\n if (!currentStart) return false;\n const minDate = currentStart < hover ? currentStart : hover;\n const maxDate = currentStart > hover ? currentStart : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n }\n }\n }\n\n onDayHover(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) {\n this.hoverDate.set(null);\n return;\n }\n this.hoverDate.set(dayObj.date);\n this.generateCalendars();\n }\n\n clearDayHover(): void {\n this.hoverDate.set(null);\n this.generateCalendars();\n }\n\n selectDay(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) return;\n \n const selectedDate = this.dateAdapter.parse(dayObj.date);\n if (!selectedDate) return;\n\n if (this.multiRange) {\n // Multi-range mode: add ranges to array\n if (this.selectingStartDate()) {\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(null);\n } else {\n const currentStart = this.rangeStore.startDate();\n if (currentStart && selectedDate < currentStart) {\n // Swap: selected becomes start, current start becomes end\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(currentStart);\n } else {\n this.rangeStore.setEnd(selectedDate);\n }\n \n // Add the new range to the array\n const range = this.rangeStore.range();\n const newRange: DateRange = {\n startDate: range.start,\n endDate: range.end,\n rangeText: this.formatDateDisplay(range.start) + ' – ' + this.formatDateDisplay(range.end),\n ...(this.enableTimePicker && { startTime: range.startTime, endTime: range.endTime })\n };\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.push(newRange);\n this.selectedRanges.set(currentRanges);\n \n // Reset for next range selection\n this.rangeStore.reset();\n \n // Update display text\n this.updateMultiRangeText();\n \n // Don't close if multiRange, allow adding more ranges\n if (this.closeOnSelection && !this.multiRange) {\n this.showDatePicker.set(false);\n }\n \n this.emitMultiChange();\n this.emitMultiSelection();\n }\n this.generateCalendars();\n } else {\n // Single range mode\n if (this.requireApply) {\n // Apply mode: use pending dates, don't emit until Apply is clicked\n if (this.selectingStartDate()) {\n this.rangeStore.setPendingStart(selectedDate);\n this.rangeStore.setPendingEnd(null);\n } else {\n const pendingStart = this.rangeStore.startDate();\n if (pendingStart && selectedDate < pendingStart) {\n // Swap\n this.rangeStore.setPendingStart(selectedDate);\n this.rangeStore.setPendingEnd(pendingStart);\n } else {\n this.rangeStore.setPendingEnd(selectedDate);\n }\n }\n this.generateCalendars();\n } else {\n // Immediate mode: emit changes immediately\n if (this.selectingStartDate()) {\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(null);\n this.emitChange();\n } else {\n const currentStart = this.rangeStore.startDate();\n if (currentStart && selectedDate < currentStart) {\n // Swap\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(currentStart);\n } else {\n this.rangeStore.setEnd(selectedDate);\n }\n \n if (this.closeOnSelection) {\n this.showDatePicker.set(false);\n }\n this.emitChange();\n this.emitSelection();\n }\n this.generateCalendars();\n }\n }\n }\n\n applySelection(): void {\n if (!this.hasPendingChanges()) return;\n \n // Apply pending dates through store\n this.rangeStore.applyPending();\n \n // Emit changes\n this.emitChange();\n this.emitSelection();\n \n // Close picker\n this.showDatePicker.set(false);\n }\n\n cancelSelection(): void {\n // Discard pending changes through store\n this.rangeStore.cancelPending();\n \n // Regenerate calendars to clear pending visual state\n this.generateCalendars();\n }\n\n changeMonth(direction: number): void {\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const newCurrentMonth = this.dateAdapter.createDate(year, month + direction, 1);\n this.currentMonth.set(newCurrentMonth);\n \n const newYear = this.dateAdapter.getYear(newCurrentMonth);\n const newMonth = this.dateAdapter.getMonth(newCurrentMonth);\n const newPreviousMonth = this.dateAdapter.createDate(newYear, newMonth - 1, 1);\n this.previousMonth.set(newPreviousMonth);\n this.generateCalendars();\n }\n\n getMonthName(date: Date): string {\n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n return `${monthNames[this.dateAdapter.getMonth(date)]} ${this.dateAdapter.getYear(date)}`;\n }\n\n getDayNames(): string[] {\n return this.locale.dayNamesShort || this.defaultDayNamesShort;\n }\n\n selectPresetRange(preset: PresetConfig): void {\n if (!preset.getValue) {\n console.error('PresetConfig must have getValue() function');\n return;\n }\n\n const range = preset.getValue();\n const startDate = this.dateAdapter.parse(range.start);\n const endDate = this.dateAdapter.parse(range.end);\n \n if (startDate && endDate) {\n this.rangeStore.setRange(startDate, endDate);\n }\n \n this.generateCalendars();\n if (this.closeOnPresetSelection) {\n this.showDatePicker.set(false);\n }\n this.emitSelection();\n }\n\n clear(): void {\n this.rangeStore.reset();\n this.showDatePicker.set(false);\n \n if (this.multiRange) {\n this.selectedRanges.set([]);\n this.currentRangeIndex.set(-1);\n this.emitMultiChange();\n } else {\n this.emitChange();\n }\n \n this.onTouched();\n this.generateCalendars();\n }\n \n removeRange(index: number): void {\n if (!this.multiRange) return;\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.splice(index, 1);\n this.selectedRanges.set(currentRanges);\n \n this.updateMultiRangeText();\n this.emitMultiChange();\n this.emitMultiSelection();\n this.generateCalendars();\n }\n \n private updateMultiRangeText(): void {\n const count = this.selectedRanges().length;\n // Note: dateRangeText is now computed from store, this is for multi-range UI only\n // We could store this in a separate signal if needed, but for now just track ranges count\n }\n\n private emitChange(): void {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n this.dateRangeChange.emit(range);\n }\n\n private emitSelection(): void {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n this.dateRangeSelected.emit(range);\n }\n \n private emitMultiChange(): void {\n this.multiDateRangeChange.emit({\n ranges: this.selectedRanges()\n });\n }\n \n private emitMultiSelection(): void {\n this.multiDateRangeSelected.emit({\n ranges: this.selectedRanges()\n });\n }\n\n private getDateRangeValue(): DateRange {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n return range;\n }\n\n // Time Picker Methods\n toggleStartTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showStartTimePicker.set(!this.showStartTimePicker());\n this.showEndTimePicker.set(false);\n }\n\n toggleEndTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showEndTimePicker.set(!this.showEndTimePicker());\n this.showStartTimePicker.set(false);\n }\n\n incrementStartHour(): void {\n const newHour = (this.startHour + 1) % 24;\n this.setStartHourMinute(newHour, this.startMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementStartHour(): void {\n const newHour = this.startHour === 0 ? 23 : this.startHour - 1;\n this.setStartHourMinute(newHour, this.startMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementStartMinute(): void {\n const newMinute = (this.startMinute + this.minuteStep) % 60;\n this.setStartHourMinute(this.startHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementStartMinute(): void {\n let newMinute = this.startMinute - this.minuteStep;\n if (newMinute < 0) {\n newMinute = 60 - this.minuteStep;\n }\n this.setStartHourMinute(this.startHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementEndHour(): void {\n const newHour = (this.endHour + 1) % 24;\n this.setEndHourMinute(newHour, this.endMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementEndHour(): void {\n const newHour = this.endHour === 0 ? 23 : this.endHour - 1;\n this.setEndHourMinute(newHour, this.endMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementEndMinute(): void {\n const newMinute = (this.endMinute + this.minuteStep) % 60;\n this.setEndHourMinute(this.endHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementEndMinute(): void {\n let newMinute = this.endMinute - this.minuteStep;\n if (newMinute < 0) {\n newMinute = 60 - this.minuteStep;\n }\n this.setEndHourMinute(this.endHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n formatTime(hour: number, minute: number): string {\n const h = hour.toString().padStart(2, '0');\n const m = minute.toString().padStart(2, '0');\n \n if (this.timeFormat === '12h') {\n const isPM = hour >= 12;\n const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const period = isPM ? 'PM' : 'AM';\n return `${hour12.toString().padStart(2, '0')}:${m} ${period}`;\n }\n \n return `${h}:${m}`;\n }\n\n parseTime(timeString: string): { hour: number; minute: number } {\n if (!timeString) return { hour: 0, minute: 0 };\n \n const time12hRegex = /^(\\d{1,2}):(\\d{2})\\s?(AM|PM)$/i;\n const time24hRegex = /^(\\d{1,2}):(\\d{2})$/;\n \n let match = timeString.match(time12hRegex);\n if (match) {\n let hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3].toUpperCase();\n \n if (period === 'PM' && hour !== 12) hour += 12;\n if (period === 'AM' && hour === 12) hour = 0;\n \n return { hour, minute };\n }\n \n match = timeString.match(time24hRegex);\n if (match) {\n return {\n hour: parseInt(match[1], 10),\n minute: parseInt(match[2], 10)\n };\n }\n \n return { hour: 0, minute: 0 };\n }\n\n // ControlValueAccessor implementation\n writeValue(value: DateRange | null): void {\n if (value) {\n // Use setters which delegate to store\n this.startDate = value.startDate || '';\n this.endDate = value.endDate || '';\n \n if (this.enableTimePicker) {\n if (value.startTime) {\n this.rangeStore.setStartTime(value.startTime);\n }\n if (value.endTime) {\n this.rangeStore.setEndTime(value.endTime);\n }\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n } else {\n this.rangeStore.reset();\n }\n }\n\n registerOnChange(fn: (value: DateRange | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 0)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 0) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ currentMonthName() }}</span>\n <button type=\"button\" (click)=\"changeMonth(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of currentMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 1)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 1) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangeText }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"removeRange($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Time Picker -->\n @if (enableTimePicker) {\n <div class=\"time-picker-container\">\n <!-- Start Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">Start Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startHour.toString().padStart(2, '0')\"\n readonly\n title=\"Start hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startMinute.toString().padStart(2, '0')\"\n readonly\n title=\"Start minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ startHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n\n <!-- Separator -->\n <div class=\"time-separator-vertical\"></div>\n\n <!-- End Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">End Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endHour.toString().padStart(2, '0')\"\n readonly\n title=\"End hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endMinute.toString().padStart(2, '0')\"\n readonly\n title=\"End minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ endHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer with buttons -->\n @if (showClearButton || multiRange || requireApply) {\n <div class=\"date-picker-footer\">\n @if (requireApply && !multiRange) {\n <div class=\"apply-footer-actions\">\n <button \n type=\"button\" \n class=\"btn-cancel\" \n (click)=\"cancelSelection()\" \n [disabled]=\"!hasPendingChanges()\"\n title=\"Cancel selection\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn-apply\" \n (click)=\"applySelection()\" \n [disabled]=\"!hasPendingChanges() || !pendingStartDate || !pendingEndDate\"\n title=\"Apply selection\">\n Apply\n </button>\n </div>\n }\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"closeDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && !requireApply && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n","import { PresetConfig, PresetRange } from './dual-datepicker.component';\n\n/**\n * Utility functions for creating common date range presets\n * Perfect for dashboards, reporting, POS, BI apps, and ERP systems\n */\n\n/**\n * Format a date as YYYY-MM-DD string\n */\nfunction formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Get the start of today\n */\nexport function getToday(): PresetRange {\n const today = new Date();\n return {\n start: formatDate(today),\n end: formatDate(today)\n };\n}\n\n/**\n * Get yesterday's date range\n */\nexport function getYesterday(): PresetRange {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n return {\n start: formatDate(yesterday),\n end: formatDate(yesterday)\n };\n}\n\n/**\n * Get last N days (including today)\n */\nexport function getLastNDays(days: number): PresetRange {\n const end = new Date();\n const start = new Date();\n start.setDate(start.getDate() - days + 1);\n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get this week (Monday to Sunday)\n */\nexport function getThisWeek(): PresetRange {\n const today = new Date();\n const dayOfWeek = today.getDay();\n const start = new Date(today);\n // Adjust to Monday (1) as first day of week\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n start.setDate(start.getDate() - daysToMonday);\n \n const end = new Date(start);\n end.setDate(end.getDate() + 6);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last week (Monday to Sunday)\n */\nexport function getLastWeek(): PresetRange {\n const today = new Date();\n const dayOfWeek = today.getDay();\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n \n const lastMonday = new Date(today);\n lastMonday.setDate(lastMonday.getDate() - daysToMonday - 7);\n \n const lastSunday = new Date(lastMonday);\n lastSunday.setDate(lastSunday.getDate() + 6);\n \n return {\n start: formatDate(lastMonday),\n end: formatDate(lastSunday)\n };\n}\n\n/**\n * Get this month (1st to last day)\n */\nexport function getThisMonth(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), 1);\n const end = new Date(today.getFullYear(), today.getMonth() + 1, 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last month (1st to last day)\n */\nexport function getLastMonth(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth() - 1, 1);\n const end = new Date(today.getFullYear(), today.getMonth(), 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get month to date (1st of current month to today)\n */\nexport function getMonthToDate(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), 1);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get this quarter (Q1, Q2, Q3, or Q4)\n */\nexport function getThisQuarter(): PresetRange {\n const today = new Date();\n const currentMonth = today.getMonth();\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n \n const start = new Date(today.getFullYear(), quarterStartMonth, 1);\n const end = new Date(today.getFullYear(), quarterStartMonth + 3, 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last quarter\n */\nexport function getLastQuarter(): PresetRange {\n const today = new Date();\n const currentMonth = today.getMonth();\n const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;\n \n const start = new Date(today.getFullYear(), lastQuarterStartMonth, 1);\n const end = new Date(today.getFullYear(), lastQuarterStartMonth + 3, 0);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get quarter to date (start of current quarter to today)\n */\nexport function getQuarterToDate(): PresetRange {\n const today = new Date();\n const currentMonth = today.getMonth();\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n \n const start = new Date(today.getFullYear(), quarterStartMonth, 1);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get this year (January 1 to December 31)\n */\nexport function getThisYear(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), 0, 1);\n const end = new Date(today.getFullYear(), 11, 31);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get last year\n */\nexport function getLastYear(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear() - 1, 0, 1);\n const end = new Date(today.getFullYear() - 1, 11, 31);\n \n return {\n start: formatDate(start),\n end: formatDate(end)\n };\n}\n\n/**\n * Get year to date (January 1 to today)\n */\nexport function getYearToDate(): PresetRange {\n const today = new Date();\n const start = new Date(today.getFullYear(), 0, 1);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get last N months (including current partial month)\n */\nexport function getLastNMonths(months: number): PresetRange {\n const today = new Date();\n const start = new Date(today);\n start.setMonth(start.getMonth() - months);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Get last N years\n */\nexport function getLastNYears(years: number): PresetRange {\n const today = new Date();\n const start = new Date(today);\n start.setFullYear(start.getFullYear() - years);\n \n return {\n start: formatDate(start),\n end: formatDate(today)\n };\n}\n\n/**\n * Pre-built preset configurations for common use cases\n * Import and use these directly in your component\n */\nexport const CommonPresets = {\n /**\n * Dashboard presets - Perfect for analytics dashboards\n */\n dashboard: [\n { label: 'Today', getValue: getToday },\n { label: 'Yesterday', getValue: getYesterday },\n { label: 'Last 7 days', getValue: () => getLastNDays(7) },\n { label: 'Last 30 days', getValue: () => getLastNDays(30) },\n { label: 'This month', getValue: getThisMonth },\n { label: 'Last month', getValue: getLastMonth }\n ] as PresetConfig[],\n\n /**\n * Reporting presets - Perfect for business reporting\n */\n reporting: [\n { label: 'Today', getValue: getToday },\n { label: 'This week', getValue: getThisWeek },\n { label: 'Last week', getValue: getLastWeek },\n { label: 'This month', getValue: getThisMonth },\n { label: 'Last month', getValue: getLastMonth },\n { label: 'This quarter', getValue: getThisQuarter },\n { label: 'Last quarter', getValue: getLastQuarter }\n ] as PresetConfig[],\n\n /**\n * Financial presets - Perfect for ERP and accounting systems\n */\n financial: [\n { label: 'Month to date', getValue: getMonthToDate },\n { label: 'Quarter to date', getValue: getQuarterToDate },\n { label: 'Year to date', getValue: getYearToDate },\n { label: 'Last month', getValue: getLastMonth },\n { label: 'Last quarter', getValue: getLastQuarter },\n { label: 'Last year', getValue: getLastYear }\n ] as PresetConfig[],\n\n /**\n * Analytics presets - Perfect for BI and data analysis\n */\n analytics: [\n { label: 'Last 7 days', getValue: () => getLastNDays(7) },\n { label: 'Last 14 days', getValue: () => getLastNDays(14) },\n { label: 'Last 30 days', getValue: () => getLastNDays(30) },\n { label: 'Last 60 days', getValue: () => getLastNDays(60) },\n { label: 'Last 90 days', getValue: () => getLastNDays(90) },\n { label: 'Last 180 days', getValue: () => getLastNDays(180) },\n { label: 'Last 365 days', getValue: () => getLastNDays(365) }\n ] as PresetConfig[],\n\n /**\n * Simple presets - Basic common ranges\n */\n simple: [\n { label: 'Today', getValue: getToday },\n { label: 'Last 7 days', getValue: () => getLastNDays(7) },\n { label: 'Last 30 days', getValue: () => getLastNDays(30) },\n { label: 'This year', getValue: getThisYear }\n ] as PresetConfig[]\n};\n","/**\n * Core headless date range logic\n * Import from here for clean barrel exports\n */\n\nexport * from './dual-date-range.store';\nexport * from './preset.engine';\nexport * from './range.validator';\nexport * from './date-clock';\nexport * from './system-clock';\nexport * from './date-adapter';\nexport * from './native-date-adapter';\n","/**\n * Public API Surface of @oneluiz/dual-datepicker\n */\n\nexport { DualDatepickerComponent } from './dual-datepicker.component';\nexport type { DateRange, MultiDateRange, PresetConfig, PresetRange, LocaleConfig, ThemeType } from './dual-datepicker.component';\n\n// Date Adapter System\nexport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nexport { NativeDateAdapter } from './native-date-adapter';\n\n// Preset Utilities (deprecated - use core/preset.engine instead)\nexport * from './preset-utils';\n\n// NEW v3.5.0: Headless Core - Use without UI\n// Perfect for SSR, global state, dashboard filters\nexport * from './core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DATE_ADAPTER","NativeDateAdapter"],"mappings":"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"}
|