@oneluiz/dual-datepicker 3.3.0 → 3.5.0
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 +220 -7
- package/core/dual-date-range.store.d.ts +104 -0
- package/core/index.d.ts +7 -0
- package/core/preset.engine.d.ts +54 -0
- package/core/range.validator.d.ts +37 -0
- package/dual-datepicker.component.d.ts +29 -1
- package/esm2022/core/dual-date-range.store.mjs +293 -0
- package/esm2022/core/index.mjs +8 -0
- package/esm2022/core/preset.engine.mjs +209 -0
- package/esm2022/core/range.validator.mjs +105 -0
- package/esm2022/dual-datepicker.component.mjs +194 -9
- package/esm2022/public-api.mjs +5 -2
- package/fesm2022/oneluiz-dual-datepicker.mjs +801 -9
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +2 -2
- 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}\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\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 // 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 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 this.dateRangeChange.emit({\n startDate: this.startDate,\n endDate: this.endDate,\n rangeText: this.dateRangeText()\n });\n }\n\n private emitSelection(): void {\n this.dateRangeSelected.emit({\n startDate: this.startDate,\n endDate: this.endDate,\n rangeText: this.dateRangeText()\n });\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 return {\n startDate: this.startDate,\n endDate: this.endDate,\n rangeText: this.dateRangeText()\n };\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 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 <!-- 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/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/preset-utils.ts","../../src/core/range.validator.ts","../../src/core/preset.engine.ts","../../src/core/dual-date-range.store.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","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 * 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 * Headless Preset Engine\n * Pure functions that resolve date ranges WITHOUT render dependency\n * Perfect for SSR, global state, dashboard filters\n */\n\nimport { formatISODate } from './range.validator';\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 */\nexport class PresetEngine {\n private presets = new Map<string, RangePreset>();\n\n constructor() {\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 resolve(key: string, now: Date = new Date()): PresetRange | null {\n const preset = this.presets.get(key);\n if (!preset) return null;\n\n const { start, end } = preset.resolve(now);\n return {\n start: formatISODate(start),\n end: formatISODate(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 private registerBuiltInPresets(): void {\n // Today\n this.register('TODAY', {\n resolve: (now) => ({ start: now, end: now })\n });\n\n // Yesterday\n this.register('YESTERDAY', {\n resolve: (now) => {\n const date = new Date(now);\n date.setDate(date.getDate() - 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 = new Date(now);\n const start = new Date(now);\n start.setDate(start.getDate() - 6);\n return { start, end };\n }\n });\n\n this.register('LAST_14_DAYS', {\n resolve: (now) => {\n const end = new Date(now);\n const start = new Date(now);\n start.setDate(start.getDate() - 13);\n return { start, end };\n }\n });\n\n this.register('LAST_30_DAYS', {\n resolve: (now) => {\n const end = new Date(now);\n const start = new Date(now);\n start.setDate(start.getDate() - 29);\n return { start, end };\n }\n });\n\n this.register('LAST_60_DAYS', {\n resolve: (now) => {\n const end = new Date(now);\n const start = new Date(now);\n start.setDate(start.getDate() - 59);\n return { start, end };\n }\n });\n\n this.register('LAST_90_DAYS', {\n resolve: (now) => {\n const end = new Date(now);\n const start = new Date(now);\n start.setDate(start.getDate() - 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 = now.getDay();\n const start = new Date(now);\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 { start, end };\n }\n });\n\n // Last Week\n this.register('LAST_WEEK', {\n resolve: (now) => {\n const dayOfWeek = now.getDay();\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n\n const lastMonday = new Date(now);\n lastMonday.setDate(lastMonday.getDate() - daysToMonday - 7);\n\n const lastSunday = new Date(lastMonday);\n lastSunday.setDate(lastSunday.getDate() + 6);\n\n return { start: lastMonday, end: lastSunday };\n }\n });\n\n // This Month\n this.register('THIS_MONTH', {\n resolve: (now) => {\n const start = new Date(now.getFullYear(), now.getMonth(), 1);\n const end = new Date(now.getFullYear(), now.getMonth() + 1, 0);\n return { start, end };\n }\n });\n\n // Last Month\n this.register('LAST_MONTH', {\n resolve: (now) => {\n const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);\n const end = new Date(now.getFullYear(), now.getMonth(), 0);\n return { start, end };\n }\n });\n\n // Month to Date\n this.register('MONTH_TO_DATE', {\n resolve: (now) => {\n const start = new Date(now.getFullYear(), now.getMonth(), 1);\n return { start, end: now };\n }\n });\n\n // This Quarter\n this.register('THIS_QUARTER', {\n resolve: (now) => {\n const currentMonth = now.getMonth();\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const start = new Date(now.getFullYear(), quarterStartMonth, 1);\n const end = new Date(now.getFullYear(), quarterStartMonth + 3, 0);\n return { start, end };\n }\n });\n\n // Last Quarter\n this.register('LAST_QUARTER', {\n resolve: (now) => {\n const currentMonth = now.getMonth();\n const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;\n const start = new Date(now.getFullYear(), lastQuarterStartMonth, 1);\n const end = new Date(now.getFullYear(), lastQuarterStartMonth + 3, 0);\n return { start, end };\n }\n });\n\n // Quarter to Date\n this.register('QUARTER_TO_DATE', {\n resolve: (now) => {\n const currentMonth = now.getMonth();\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const start = new Date(now.getFullYear(), quarterStartMonth, 1);\n return { start, end: now };\n }\n });\n\n // This Year\n this.register('THIS_YEAR', {\n resolve: (now) => {\n const start = new Date(now.getFullYear(), 0, 1);\n const end = new Date(now.getFullYear(), 11, 31);\n return { start, end };\n }\n });\n\n // Last Year\n this.register('LAST_YEAR', {\n resolve: (now) => {\n const start = new Date(now.getFullYear() - 1, 0, 1);\n const end = new Date(now.getFullYear() - 1, 11, 31);\n return { start, end };\n }\n });\n\n // Year to Date\n this.register('YEAR_TO_DATE', {\n resolve: (now) => {\n const start = new Date(now.getFullYear(), 0, 1);\n return { start, end: now };\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 * Singleton preset engine instance\n */\nexport const presetEngine = new PresetEngine();\n","/**\n * Headless Date Range Store using Angular Signals\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 * - 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';\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 // 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: formatISODate(start),\n end: formatISODate(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 applyPreset(presetKey: string, now: Date = new Date()): void {\n const range = presetEngine.resolve(presetKey, now);\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\n private parseDate(date: Date | string | null): Date | null {\n if (!date) return null;\n if (date instanceof Date) return date;\n return parseISODate(date);\n }\n\n private getNextMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 1);\n }\n\n private getPreviousMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() - 1, 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 return `${date.getDate()} ${months[date.getMonth()]}`;\n }\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';\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":[],"mappings":"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"}
|