@oneluiz/dual-datepicker 3.9.0 → 3.9.2
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/core/calendar-grid/cache.config.d.ts +34 -0
- package/core/calendar-grid/index.d.ts +6 -0
- package/core/calendar-grid/range-highlighter.cache.d.ts +6 -5
- package/esm2022/core/calendar-grid/cache.config.mjs +35 -0
- package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +9 -3
- package/esm2022/core/calendar-grid/index.mjs +7 -1
- package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +10 -8
- package/fesm2022/oneluiz-dual-datepicker.mjs +56 -10
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneluiz-dual-datepicker.mjs","sources":["../../src/date-adapter.ts","../../src/native-date-adapter.ts","../../src/core/range.validator.ts","../../src/core/date-clock.ts","../../src/core/system-clock.ts","../../src/core/date-adapter.ts","../../src/core/native-date-adapter.ts","../../src/core/range-preset.plugin.ts","../../src/core/preset-registry.ts","../../src/core/preset.engine.ts","../../src/core/dual-date-range.store.ts","../../src/core/built-in-presets.ts","../../src/core/calendar-grid/calendar-grid.types.ts","../../src/core/calendar-grid/calendar-grid.factory.ts","../../src/core/calendar-grid/calendar-grid.cache.ts","../../src/core/calendar-grid/range-highlighter.types.ts","../../src/core/calendar-grid/range-highlighter.ts","../../src/core/calendar-grid/range-highlighter.cache.ts","../../src/core/calendar-grid/virtual-weeks.types.ts","../../src/core/calendar-grid/virtual-weeks.logic.ts","../../src/core/calendar-grid/index.ts","../../src/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/preset-utils.ts","../../src/core/preset-providers.ts","../../src/core/index.ts","../../src/public-api.ts","../../src/oneluiz-dual-datepicker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Abstract class for date adapters.\n * Allows the component to work with different date libraries (Date, DayJS, date-fns, Luxon, etc.)\n */\nexport abstract class DateAdapter<T = any> {\n /**\n * Parses a value into a date object\n * @param value - Value to parse (string, number, or date object)\n * @returns Parsed date object\n */\n abstract parse(value: any): T | null;\n\n /**\n * Formats a date object into a string\n * @param date - Date object to format\n * @param format - Optional format string\n * @returns Formatted date string\n */\n abstract format(date: T, format?: string): string;\n\n /**\n * Adds days to a date\n * @param date - Date object\n * @param days - Number of days to add (can be negative)\n * @returns New date object\n */\n abstract addDays(date: T, days: number): T;\n\n /**\n * Adds months to a date\n * @param date - Date object\n * @param months - Number of months to add (can be negative)\n * @returns New date object\n */\n abstract addMonths(date: T, months: number): T;\n\n /**\n * Gets the year from a date\n * @param date - Date object\n * @returns Year number\n */\n abstract getYear(date: T): number;\n\n /**\n * Gets the month from a date (0-11)\n * @param date - Date object\n * @returns Month number (0-11)\n */\n abstract getMonth(date: T): number;\n\n /**\n * Gets the day of month from a date\n * @param date - Date object\n * @returns Day of month (1-31)\n */\n abstract getDate(date: T): number;\n\n /**\n * Gets the day of week from a date (0-6, Sunday = 0)\n * @param date - Date object\n * @returns Day of week (0-6)\n */\n abstract getDay(date: T): number;\n\n /**\n * Creates a new date object\n * @param year - Year\n * @param month - Month (0-11)\n * @param date - Day of month (1-31)\n * @returns New date object\n */\n abstract createDate(year: number, month: number, date: number): T;\n\n /**\n * Gets today's date\n * @returns Today's date object\n */\n abstract today(): T;\n\n /**\n * Checks if two dates are the same day\n * @param a - First date\n * @param b - Second date\n * @returns True if same day\n */\n abstract isSameDay(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is before another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is before b\n */\n abstract isBefore(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is after another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is after b\n */\n abstract isAfter(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is between two other dates\n * @param date - Date to check\n * @param start - Start date\n * @param end - End date\n * @returns True if date is between start and end\n */\n abstract isBetween(date: T | null, start: T | null, end: T | null): boolean;\n\n /**\n * Clones a date object\n * @param date - Date to clone\n * @returns Cloned date object\n */\n abstract clone(date: T): T;\n\n /**\n * Checks if a value is a valid date\n * @param date - Value to check\n * @returns True if valid date\n */\n abstract isValid(date: any): boolean;\n}\n\n/**\n * Injection token for DateAdapter\n */\nexport const DATE_ADAPTER = new InjectionToken<DateAdapter>('DATE_ADAPTER');\n","import { Injectable } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\n\n/**\n * Date adapter implementation for native JavaScript Date objects\n * This is the default adapter used by the component\n */\n@Injectable()\nexport class NativeDateAdapter extends DateAdapter<Date> {\n parse(value: any): Date | null {\n if (!value) return null;\n \n if (value instanceof Date) {\n return new Date(value);\n }\n \n if (typeof value === 'string' || typeof value === 'number') {\n // Fix timezone issues: parse YYYY-MM-DD as local date, not UTC\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, month - 1, day);\n }\n \n const date = new Date(value);\n return this.isValid(date) ? date : null;\n }\n \n return null;\n }\n\n format(date: Date, format: string = 'YYYY-MM-DD'): string {\n if (!this.isValid(date)) return '';\n \n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n \n // Simple format implementation\n switch (format) {\n case 'YYYY-MM-DD':\n return `${year}-${month}-${day}`;\n case 'MM/DD/YYYY':\n return `${month}/${day}/${year}`;\n case 'DD/MM/YYYY':\n return `${day}/${month}/${year}`;\n default:\n return `${year}-${month}-${day}`;\n }\n }\n\n addDays(date: Date, days: number): Date {\n const result = this.clone(date);\n result.setDate(result.getDate() + days);\n return result;\n }\n\n addMonths(date: Date, months: number): Date {\n const result = this.clone(date);\n result.setMonth(result.getMonth() + months);\n return result;\n }\n\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n getDate(date: Date): number {\n return date.getDate();\n }\n\n getDay(date: Date): number {\n return date.getDay();\n }\n\n createDate(year: number, month: number, date: number): Date {\n return new Date(year, month, date);\n }\n\n today(): Date {\n return new Date();\n }\n\n isSameDay(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n isBefore(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() < b.getTime();\n }\n\n isAfter(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() > b.getTime();\n }\n\n isBetween(date: Date | null, start: Date | null, end: Date | null): boolean {\n if (!date || !start || !end) return false;\n if (!this.isValid(date) || !this.isValid(start) || !this.isValid(end)) return false;\n \n const dateTime = date.getTime();\n const startTime = start.getTime();\n const endTime = end.getTime();\n \n return dateTime >= startTime && dateTime <= endTime;\n }\n\n clone(date: Date): Date {\n return new Date(date.getTime());\n }\n\n isValid(date: any): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n }\n}\n","/**\n * Pure validation functions for date ranges\n * No dependencies, no side effects - just logic\n * Perfect for SSR, testing, and reusability\n */\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Validate that end date is not before start date\n */\nexport function validateRangeOrder(start: Date | null, end: Date | null): ValidationResult {\n if (!start || !end) {\n return { valid: true }; // Allow incomplete selection\n }\n\n if (end < start) {\n return {\n valid: false,\n error: 'End date cannot be before start date'\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate that date is within min/max bounds\n */\nexport function validateDateBounds(\n date: Date | null,\n minDate?: Date,\n maxDate?: Date\n): ValidationResult {\n if (!date) {\n return { valid: true };\n }\n\n if (minDate && date < minDate) {\n return {\n valid: false,\n error: `Date cannot be before ${minDate.toISOString().split('T')[0]}`\n };\n }\n\n if (maxDate && date > maxDate) {\n return {\n valid: false,\n error: `Date cannot be after ${maxDate.toISOString().split('T')[0]}`\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate that a range is within bounds\n */\nexport function validateRangeBounds(\n start: Date | null,\n end: Date | null,\n minDate?: Date,\n maxDate?: Date\n): ValidationResult {\n const startValidation = validateDateBounds(start, minDate, maxDate);\n if (!startValidation.valid) {\n return startValidation;\n }\n\n const endValidation = validateDateBounds(end, minDate, maxDate);\n if (!endValidation.valid) {\n return endValidation;\n }\n\n return { valid: true };\n}\n\n/**\n * Check if a date is disabled\n */\nexport function isDateDisabled(\n date: Date,\n disabledDates?: Date[] | ((date: Date) => boolean)\n): boolean {\n if (!disabledDates) {\n return false;\n }\n\n if (typeof disabledDates === 'function') {\n return disabledDates(date);\n }\n\n // Array of disabled dates - compare by date string\n const dateStr = date.toISOString().split('T')[0];\n return disabledDates.some(\n d => d.toISOString().split('T')[0] === dateStr\n );\n}\n\n/**\n * Apply bounds to a date (clamp it)\n */\nexport function applyBounds(date: Date, minDate?: Date, maxDate?: Date): Date {\n let result = date;\n\n if (minDate && result < minDate) {\n result = minDate;\n }\n\n if (maxDate && result > maxDate) {\n result = maxDate;\n }\n\n return result;\n}\n\n/**\n * Parse ISO date string to Date object (deterministic)\n */\nexport function parseISODate(dateStr: string): Date | null {\n if (!dateStr) return null;\n\n const [year, month, day] = dateStr.split('-').map(Number);\n if (!year || !month || !day) return null;\n\n return new Date(year, month - 1, day);\n}\n\n/**\n * Format Date to ISO string (YYYY-MM-DD)\n */\nexport function formatISODate(date: Date | null): string {\n if (!date) return '';\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n","/**\n * Date Clock Abstraction for SSR-Safe Date Resolution\n * \n * Problem:\n * Presets like \"Last 7 Days\" or \"This Month\" use new Date() which causes:\n * - SSR hydration mismatch\n * - Server renders \"2026-02-14\", client renders \"2026-02-15\"\n * - Different filters in dashboards\n * - Different queries in ERP/BI\n * - Cache inconsistency\n * \n * Solution:\n * Inject a DateClock to control time deterministically:\n * \n * Server (SSR):\n * provide(DATE_CLOCK, {\n * useValue: { now: () => new Date('2026-02-21T00:00:00Z') }\n * })\n * \n * Client (Browser):\n * Uses SystemClock by default (new Date())\n * \n * Testing:\n * provide(DATE_CLOCK, {\n * useValue: { now: () => new Date('2026-01-15T10:30:00Z') }\n * })\n * \n * Architecture:\n * - PresetEngine receives DateClock via DI\n * - All preset calculations use clock.now() instead of new Date()\n * - Deterministic: Same clock.now() → Same preset result\n * - SSR-compatible: Server and client resolve identical ranges\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Clock abstraction for deterministic date resolution\n * \n * Use cases:\n * - SSR: Ensure server and client generate identical presets\n * - Testing: Control time for predictable test results\n * - Replay: Reproduce exact user state from past sessions\n * - Demo: Freeze time for reproducible demos\n */\nexport interface DateClock {\n /**\n * Get current date/time\n * \n * Default implementation returns new Date()\n * Override for SSR, testing, or time-travel scenarios\n */\n now(): Date;\n}\n\n/**\n * Injection token for DateClock\n * \n * Usage:\n * ```typescript\n * // Default (uses SystemClock)\n * bootstrapApplication(AppComponent);\n * \n * // SSR Override\n * bootstrapApplication(AppComponent, {\n * providers: [\n * {\n * provide: DATE_CLOCK,\n * useValue: { now: () => new Date('2026-02-21T00:00:00Z') }\n * }\n * ]\n * });\n * \n * // Testing Override\n * TestBed.configureTestingModule({\n * providers: [\n * {\n * provide: DATE_CLOCK,\n * useValue: { now: () => new Date('2026-01-15T12:00:00Z') }\n * }\n * ]\n * });\n * ```\n */\nexport const DATE_CLOCK = new InjectionToken<DateClock>('DATE_CLOCK');\n","/**\n * System Clock Implementation\n * \n * Default DateClock implementation that uses system time (new Date())\n * \n * This is the default behavior users expect:\n * - \"Today\" → actual today\n * - \"Last 7 Days\" → actual last 7 days\n * \n * In SSR scenarios, this should be overridden to ensure\n * server and client generate identical date ranges.\n */\n\nimport { Injectable } from '@angular/core';\nimport { DateClock } from './date-clock';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SystemClock implements DateClock {\n /**\n * Returns current system time\n * \n * This is the standard behavior for client-side applications.\n * For SSR, override DATE_CLOCK token with a fixed Date.\n */\n now(): Date {\n return new Date();\n }\n}\n","/**\n * Date Adapter Abstraction for Timezone-Safe Date Operations\n * \n * Problem:\n * Using Date natively in calendar/range logic causes enterprise bugs:\n * - Date ranges shift by 1 day due to timezone/DST\n * - Server (UTC) vs Client (local timezone) discrepancies\n * - Inconsistent reporting in BI/ERP/invoicing/hotel systems\n * \n * Solution:\n * All date calculations go through an adapter layer.\n * This allows:\n * - Timezone-safe operations by default (NativeDateAdapter normalizes to day boundaries)\n * - Optional integration with Luxon/DayJS/date-fns for advanced timezone handling\n * - Consistent behavior across SSR and client\n * - Migration path to timezone-aware libraries without breaking changes\n * \n * Architecture:\n * ```\n * DualDateRangeStore\n * ↓ uses\n * DateAdapter ← Inject via DATE_ADAPTER token\n * ↓ implements\n * NativeDateAdapter (default, zero deps)\n * LuxonDateAdapter (optional, full timezone support)\n * DayJSDateAdapter (optional, lightweight)\n * ```\n * \n * Usage:\n * ```typescript\n * // Default (NativeDateAdapter)\n * bootstrapApplication(AppComponent);\n * \n * // Advanced (Luxon with timezone)\n * import { LuxonDateAdapter } from '@oneluiz/dual-datepicker/luxon';\n * \n * bootstrapApplication(AppComponent, {\n * providers: [\n * { provide: DATE_ADAPTER, useClass: LuxonDateAdapter }\n * ]\n * });\n * ```\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Date adapter interface for all calendar/range operations\n * \n * All methods operate on \"calendar day\" level, ignoring time components.\n * Implementations must ensure timezone-safe behavior.\n * \n * Implementations:\n * - NativeDateAdapter: Default, zero dependencies, uses Date with normalization\n * - LuxonDateAdapter: Optional, full timezone support with Luxon\n * - DayJSDateAdapter: Optional, lightweight timezone support\n * - Custom: Implement for your specific backend/timezone requirements\n */\nexport interface DateAdapter {\n /**\n * Normalize date to start of day (00:00:00.000)\n * \n * Critical for timezone-safe comparisons.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21T15:30:00');\n * const normalized = adapter.normalize(date);\n * // → 2026-02-21T00:00:00.000 (in local timezone)\n * ```\n * \n * @param date - Date to normalize\n * @returns Date with time set to 00:00:00.000\n */\n normalize(date: Date): Date;\n\n /**\n * Check if two dates represent the same calendar day\n * \n * Ignores time component. Timezone-safe.\n * \n * Example:\n * ```typescript\n * const a = new Date('2026-02-21T23:59:59');\n * const b = new Date('2026-02-21T00:00:01');\n * adapter.isSameDay(a, b); // → true\n * ```\n */\n isSameDay(a: Date, b: Date): boolean;\n\n /**\n * Check if date A is before date B (calendar day level)\n * \n * Example:\n * ```typescript\n * adapter.isBeforeDay(new Date('2026-02-20'), new Date('2026-02-21')); // → true\n * adapter.isBeforeDay(new Date('2026-02-21'), new Date('2026-02-21')); // → false\n * ```\n */\n isBeforeDay(a: Date, b: Date): boolean;\n\n /**\n * Check if date A is after date B (calendar day level)\n * \n * Example:\n * ```typescript\n * adapter.isAfterDay(new Date('2026-02-22'), new Date('2026-02-21')); // → true\n * adapter.isAfterDay(new Date('2026-02-21'), new Date('2026-02-21')); // → false\n * ```\n */\n isAfterDay(a: Date, b: Date): boolean;\n\n /**\n * Add days to a date\n * \n * Must handle DST transitions correctly.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const future = adapter.addDays(date, 7);\n * // → 2026-02-28\n * ```\n */\n addDays(date: Date, days: number): Date;\n\n /**\n * Add months to a date\n * \n * Must handle month overflow (e.g., Jan 31 + 1 month → Feb 28).\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-01-31');\n * const next = adapter.addMonths(date, 1);\n * // → 2026-02-28 (not March 3rd)\n * ```\n */\n addMonths(date: Date, months: number): Date;\n\n /**\n * Get start of day (00:00:00.000)\n * \n * Similar to normalize() but explicit intent.\n */\n startOfDay(date: Date): Date;\n\n /**\n * Get end of day (23:59:59.999)\n * \n * Useful for range queries that need to include entire day.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const end = adapter.endOfDay(date);\n * // → 2026-02-21T23:59:59.999\n * ```\n */\n endOfDay(date: Date): Date;\n\n /**\n * Get first day of month (00:00:00.000)\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const start = adapter.startOfMonth(date);\n * // → 2026-02-01T00:00:00.000\n * ```\n */\n startOfMonth(date: Date): Date;\n\n /**\n * Get last day of month (23:59:59.999)\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const end = adapter.endOfMonth(date);\n * // → 2026-02-28T23:59:59.999\n * ```\n */\n endOfMonth(date: Date): Date;\n\n /**\n * Get year (4-digit)\n * \n * Example:\n * ```typescript\n * adapter.getYear(new Date('2026-02-21')); // → 2026\n * ```\n */\n getYear(date: Date): number;\n\n /**\n * Get month (0-11, where 0 = January)\n * \n * Example:\n * ```typescript\n * adapter.getMonth(new Date('2026-02-21')); // → 1 (February)\n * ```\n */\n getMonth(date: Date): number;\n\n /**\n * Get day of month (1-31)\n * \n * Example:\n * ```typescript\n * adapter.getDate(new Date('2026-02-21')); // → 21\n * ```\n */\n getDate(date: Date): number;\n\n /**\n * Get day of week (0-6, where 0 = Sunday)\n * \n * Example:\n * ```typescript\n * adapter.getDay(new Date('2026-02-21')); // → 6 (Saturday)\n * ```\n */\n getDay(date: Date): number;\n\n /**\n * Convert Date to ISO date string (YYYY-MM-DD)\n * \n * CRITICAL: Must be timezone-safe!\n * DO NOT use date.toISOString() as it converts to UTC.\n * \n * Example:\n * ```typescript\n * // Local timezone GMT-6 (CST)\n * const date = new Date('2026-02-21T23:00:00'); // 11 PM CST\n * \n * // ❌ WRONG: date.toISOString().split('T')[0]\n * // Returns \"2026-02-22\" (shifted to UTC!)\n * \n * // ✅ CORRECT: adapter.toISODate(date)\n * // Returns \"2026-02-21\" (local date preserved)\n * ```\n * \n * @param date - Date to format (or null)\n * @returns ISO date string in YYYY-MM-DD format (local timezone), empty string if null\n */\n toISODate(date: Date | null): string;\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Date\n * \n * CRITICAL: Must be timezone-safe!\n * DO NOT use new Date(isoString) as it may parse as UTC.\n * \n * Example:\n * ```typescript\n * // ❌ WRONG: new Date('2026-02-21')\n * // May parse as UTC midnight, which is previous day in some timezones\n * \n * // ✅ CORRECT: adapter.parseISODate('2026-02-21')\n * // Returns Date representing 2026-02-21 00:00:00 in local timezone\n * ```\n * \n * @param isoDate - ISO date string (YYYY-MM-DD) or null\n * @returns Date object or null if invalid\n */\n parseISODate(isoDate: string | null): Date | null;\n\n /**\n * Get week start day for locale\n * \n * 0 = Sunday, 1 = Monday, etc.\n * \n * Example:\n * ```typescript\n * adapter.getWeekStart('en-US'); // → 0 (Sunday)\n * adapter.getWeekStart('en-GB'); // → 1 (Monday)\n * ```\n * \n * @param locale - Locale string (e.g., 'en-US', 'es-ES')\n * @returns Day number (0-6)\n */\n getWeekStart(locale?: string): 0 | 1 | 2 | 3 | 4 | 5 | 6;\n}\n\n/**\n * Injection token for DateAdapter\n * \n * Default: NativeDateAdapter (zero dependencies)\n * \n * Override for advanced timezone handling:\n * \n * ```typescript\n * // Luxon with timezone\n * import { LuxonDateAdapter } from '@oneluiz/dual-datepicker/luxon';\n * \n * bootstrapApplication(AppComponent, {\n * providers: [\n * {\n * provide: DATE_ADAPTER,\n * useClass: LuxonDateAdapter\n * }\n * ]\n * });\n * ```\n * \n * Custom implementation:\n * \n * ```typescript\n * class CustomDateAdapter implements DateAdapter {\n * // Your implementation for backend-specific date handling\n * }\n * \n * provide(DATE_ADAPTER, { useClass: CustomDateAdapter });\n * ```\n */\nexport const DATE_ADAPTER = new InjectionToken<DateAdapter>('DATE_ADAPTER');\n","/**\n * Native Date Adapter Implementation\n * \n * Default adapter using JavaScript Date with timezone-safe operations.\n * \n * Zero dependencies. Conservative implementation that:\n * - Normalizes all dates to start of day (00:00:00.000)\n * - Uses manual YYYY-MM-DD construction (avoids toISOString() timezone shift)\n * - Parses ISO dates to local timezone (avoids UTC interpretation)\n * - Handles month overflow correctly (Jan 31 + 1 month = Feb 28, not Mar 3)\n * - All comparisons work on normalized dates\n * \n * Limitations:\n * - No timezone awareness (all operations in local timezone)\n * - No DST-safe calculations across timezone changes\n * - For advanced timezone needs, use LuxonDateAdapter or DayJSDateAdapter\n * \n * Perfect for:\n * ✅ Most enterprise apps (ERP, POS, BI) where local timezone is sufficient\n * ✅ Applications without cross-timezone requirements\n * ✅ Minimizing bundle size (zero deps)\n * ✅ Simple, predictable date handling\n */\n\nimport { Injectable } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NativeDateAdapter implements DateAdapter {\n /**\n * Normalize date to start of day (00:00:00.000) in local timezone\n * \n * This is the foundation of timezone-safe operations.\n * All other methods use normalized dates for comparisons.\n */\n normalize(date: Date): Date {\n const normalized = new Date(date);\n normalized.setHours(0, 0, 0, 0);\n return normalized;\n }\n\n /**\n * Check if two dates are the same calendar day\n * \n * Implementation: Compare YYYY-MM-DD components directly\n * Avoids timezone issues from valueOf() comparisons\n */\n isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n /**\n * Check if date A is before date B (calendar day level)\n * \n * Implementation: Compare normalized dates using valueOf()\n */\n isBeforeDay(a: Date, b: Date): boolean {\n return this.normalize(a).valueOf() < this.normalize(b).valueOf();\n }\n\n /**\n * Check if date A is after date B (calendar day level)\n * \n * Implementation: Compare normalized dates using valueOf()\n */\n isAfterDay(a: Date, b: Date): boolean {\n return this.normalize(a).valueOf() > this.normalize(b).valueOf();\n }\n\n /**\n * Add days to a date\n * \n * Implementation: Use setDate() which handles month rollover automatically\n * \n * Example:\n * Jan 31 + 3 days → Feb 3 ✅\n * Feb 28 + 1 day → Mar 1 ✅ (non-leap year)\n */\n addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return this.normalize(result);\n }\n\n /**\n * Add months to a date\n * \n * CRITICAL: Handles month overflow correctly\n * \n * Algorithm:\n * 1. Add months using setMonth()\n * 2. If day-of-month changed (overflow), set to last day of target month\n * \n * Examples:\n * - Jan 31 + 1 month → Feb 28 (or Feb 29 in leap year) ✅\n * - Jan 31 + 2 months → Mar 31 ✅\n * - Mar 31 + 1 month → Apr 30 ✅\n * - Dec 31 + 1 month → Jan 31 (next year) ✅\n */\n addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n const originalDay = result.getDate();\n \n // Add months\n result.setMonth(result.getMonth() + months);\n \n // Check for day overflow (e.g., Jan 31 → Feb 31 becomes Mar 3)\n if (result.getDate() !== originalDay) {\n // Overflow detected: set to last day of target month\n // Go to 1st of next month, then subtract 1 day\n result.setDate(0); // Sets to last day of previous month\n }\n \n return this.normalize(result);\n }\n\n /**\n * Get start of day (00:00:00.000)\n * \n * Alias for normalize() with explicit intent\n */\n startOfDay(date: Date): Date {\n return this.normalize(date);\n }\n\n /**\n * Get end of day (23:59:59.999)\n * \n * Useful for inclusive range queries\n */\n endOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n }\n\n /**\n * Get first day of month (00:00:00.000)\n */\n startOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setDate(1);\n return this.normalize(result);\n }\n\n /**\n * Get last day of month (23:59:59.999)\n * \n * Algorithm: Go to 1st of next month, subtract 1 day\n */\n endOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + 1, 0); // Day 0 = last day of previous month\n return this.endOfDay(result);\n }\n\n /**\n * Get year (4-digit)\n */\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n /**\n * Get month (0-11)\n */\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n /**\n * Get day of month (1-31)\n */\n getDate(date: Date): number {\n return date.getDate();\n }\n\n /**\n * Get day of week (0-6, Sunday=0)\n */\n getDay(date: Date): number {\n return date.getDay();\n }\n\n /**\n * Convert Date to ISO date string (YYYY-MM-DD)\n * \n * CRITICAL: DO NOT use toISOString() - it converts to UTC!\n * \n * Manual construction ensures local timezone is preserved:\n * \n * Example problem with toISOString():\n * ```\n * // Local timezone: GMT-6 (CST)\n * const date = new Date('2026-02-21T23:00:00'); // 11 PM Feb 21 local\n * \n * // WRONG ❌\n * date.toISOString().split('T')[0]\n * // Returns \"2026-02-22\" (converted to UTC = Feb 22 05:00 AM)\n * \n * // CORRECT ✅\n * toISODate(date)\n * // Returns \"2026-02-21\" (local date preserved)\n * ```\n * \n * Implementation: Build YYYY-MM-DD manually from local date components\n */\n toISODate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Date\n * \n * CRITICAL: DO NOT use new Date(isoString) - may parse as UTC!\n * \n * Example problem with Date constructor:\n * ```\n * // Local timezone: GMT-6 (CST)\n * \n * // WRONG ❌\n * new Date('2026-02-21')\n * // Parsed as UTC: 2026-02-21T00:00:00Z\n * // In local timezone: Feb 20, 2026 6:00 PM (previous day!)\n * \n * // CORRECT ✅\n * parseISODate('2026-02-21')\n * // Returns: 2026-02-21T00:00:00 local time\n * ```\n * \n * Implementation: Parse components and construct Date in local timezone\n */\n parseISODate(isoDate: string): Date | null {\n if (!isoDate || typeof isoDate !== 'string') {\n return null;\n }\n\n // Match YYYY-MM-DD format\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(isoDate.trim());\n \n if (!match) {\n return null;\n }\n\n const year = parseInt(match[1], 10);\n const month = parseInt(match[2], 10) - 1; // 0-indexed\n const day = parseInt(match[3], 10);\n\n // Validate ranges\n if (month < 0 || month > 11) {\n return null;\n }\n\n if (day < 1 || day > 31) {\n return null;\n }\n\n // Construct date in local timezone\n const date = new Date(year, month, day);\n \n // Verify date is valid (e.g., Feb 31 would roll to Mar 3)\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return this.normalize(date);\n }\n\n /**\n * Get week start day for locale\n * \n * Default: Sunday (0) for most locales\n * Monday (1) for Europe, ISO 8601\n * \n * Implementation: Simple locale detection\n * For advanced needs, use Intl.Locale or external library\n */\n getWeekStart(locale?: string): 0 | 1 | 2 | 3 | 4 | 5 | 6 {\n if (!locale) {\n locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US';\n }\n\n // ISO 8601: Monday start\n const mondayStartLocales = [\n 'en-GB', 'en-IE', 'en-AU', 'en-NZ', 'en-CA',\n 'es', 'es-ES', 'es-MX',\n 'fr', 'fr-FR', 'fr-CA',\n 'de', 'de-DE', 'de-AT', 'de-CH',\n 'it', 'it-IT',\n 'pt', 'pt-PT', 'pt-BR',\n 'nl', 'nl-NL', 'nl-BE',\n 'ru', 'ru-RU',\n 'zh', 'zh-CN', 'zh-TW',\n 'ja', 'ja-JP',\n 'ko', 'ko-KR'\n ];\n\n const normalizedLocale = locale.toLowerCase();\n const startsWithMonday = mondayStartLocales.some(loc => \n normalizedLocale.startsWith(loc.toLowerCase())\n );\n\n return startsWithMonday ? 1 : 0;\n }\n}\n","/**\n * Range Preset Plugin System\n * \n * Version: 3.6.0\n * \n * Plugin-based architecture for date range presets following Open/Closed Principle.\n * \n * WHY THIS EXISTS:\n * - Enterprise apps need industry-specific presets (fiscal, hotel, logistics)\n * - Presets should be distributable as external packages\n * - Core should NOT know about all possible presets\n * - Users should extend presets without modifying library code\n * \n * ARCHITECTURE:\n * ```\n * RangePresetPlugin (interface) - Contract for all presets\n * ↓\n * PresetRegistry (service) - Manages plugin registration\n * ↓\n * PresetEngine (refactored) - Resolves presets via registry\n * ↓\n * DualDateRangeStore - No changes, backward compatible\n * ```\n * \n * USAGE:\n * ```typescript\n * // Built-in presets work automatically\n * store.applyPreset('LAST_7_DAYS'); // ✅ Works\n * \n * // Register custom preset\n * const registry = inject(PresetRegistry);\n * registry.register({\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const fiscalStart = adapter.startOfMonth(now);\n * const fiscalEnd = adapter.endOfMonth(now);\n * return { start: fiscalStart, end: fiscalEnd };\n * }\n * });\n * \n * // Use custom preset\n * store.applyPreset('THIS_FISCAL_QUARTER'); // ✅ Works\n * ```\n * \n * EXTERNAL PACKAGES:\n * ```typescript\n * // @acme/fiscal-presets package\n * export const FISCAL_PRESETS: RangePresetPlugin[] = [\n * { key: 'FISCAL_Q1', resolve: ... },\n * { key: 'FISCAL_Q2', resolve: ... }\n * ];\n * \n * // In app\n * FISCAL_PRESETS.forEach(p => registry.register(p));\n * ```\n */\n\nimport { DateClock } from './date-clock';\nimport { DateAdapter } from './date-adapter';\n\n/**\n * Date range returned by preset plugins\n */\nexport interface DateRange {\n /**\n * Start date of the range (inclusive)\n */\n start: Date;\n\n /**\n * End date of the range (inclusive)\n */\n end: Date;\n}\n\n/**\n * Range Preset Plugin Interface\n * \n * All date range presets (built-in or external) implement this interface.\n * \n * DESIGN PRINCIPLES:\n * - **Deterministic**: Given the same clock.now(), always returns same range\n * - **Timezone-safe**: Uses DateAdapter for all date operations\n * - **SSR-compatible**: Uses DateClock injection, no global Date()\n * - **Testable**: Pure function, no side effects\n * \n * EXAMPLE - Built-in preset:\n * ```typescript\n * const todayPreset: RangePresetPlugin = {\n * key: 'TODAY',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const normalized = adapter.normalize(now);\n * return { start: normalized, end: normalized };\n * }\n * };\n * ```\n * \n * EXAMPLE - Custom fiscal preset:\n * ```typescript\n * const fiscalQuarterPreset: RangePresetPlugin = {\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const month = adapter.getMonth(now); // 0-11\n * \n * // Fiscal year starts in April (month 3)\n * const fiscalMonth = (month + 9) % 12; // Offset to fiscal calendar\n * const quarterStartMonth = Math.floor(fiscalMonth / 3) * 3;\n * const adjustedMonth = (quarterStartMonth - 9 + 12) % 12;\n * \n * const yearOffset = month < 3 ? -1 : 0;\n * const year = adapter.getYear(now) + yearOffset;\n * \n * const start = new Date(year, adjustedMonth, 1);\n * const end = new Date(year, adjustedMonth + 3, 0);\n * \n * return {\n * start: adapter.normalize(start),\n * end: adapter.normalize(end)\n * };\n * }\n * };\n * ```\n * \n * EXAMPLE - Hotel industry preset:\n * ```typescript\n * const checkInWeekPreset: RangePresetPlugin = {\n * key: 'CHECK_IN_WEEK',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * // Hotel check-ins are Friday to Friday\n * const dayOfWeek = adapter.getDayOfWeek(now);\n * const daysToFriday = dayOfWeek <= 5 ? 5 - dayOfWeek : 7 - dayOfWeek + 5;\n * \n * const nextFriday = adapter.addDays(now, daysToFriday);\n * const followingFriday = adapter.addDays(nextFriday, 7);\n * \n * return { start: nextFriday, end: followingFriday };\n * }\n * };\n * ```\n */\nexport interface RangePresetPlugin {\n /**\n * Unique identifier for the preset\n * \n * Convention: SCREAMING_SNAKE_CASE\n * \n * Examples:\n * - Built-in: 'TODAY', 'LAST_7_DAYS', 'THIS_MONTH'\n * - Fiscal: 'FISCAL_Q1', 'FISCAL_YEAR_TO_DATE'\n * - Hotel: 'CHECK_IN_WEEK', 'NEXT_30_NIGHTS'\n * - Logistics: 'SHIPPING_WEEK', 'DELIVERY_WINDOW'\n */\n key: string;\n\n /**\n * Resolve the date range for this preset\n * \n * MUST use:\n * - `clock.now()` for current time (SSR-safe, deterministic)\n * - `adapter.*` for all date operations (timezone-safe)\n * \n * MUST NOT use:\n * - `new Date()` directly (breaks SSR determinism)\n * - `date.toISOString()` (timezone bugs)\n * - `date.setDate()` (mutates, use adapter.addDays() instead)\n * \n * @param clock - Injected DateClock for SSR-safe time access\n * @param adapter - Injected DateAdapter for timezone-safe operations\n * @returns Date range with start and end dates (both inclusive)\n * \n * @example\n * ```typescript\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const start = adapter.addDays(now, -7);\n * const end = adapter.normalize(now);\n * return { start, end };\n * }\n * ```\n */\n resolve(clock: DateClock, adapter: DateAdapter): DateRange;\n}\n\n/**\n * Type guard to check if object is a valid RangePresetPlugin\n * \n * @param obj - Object to check\n * @returns true if object implements RangePresetPlugin interface\n */\nexport function isRangePresetPlugin(obj: any): obj is RangePresetPlugin {\n return (\n obj &&\n typeof obj === 'object' &&\n typeof obj.key === 'string' &&\n typeof obj.resolve === 'function'\n );\n}\n","/**\n * Preset Registry Service\n * \n * Version: 3.6.0\n * \n * Central registry for all date range preset plugins (built-in and custom).\n * \n * ARCHITECTURE:\n * - Singleton service (providedIn: 'root')\n * - Manages Map<string, RangePresetPlugin>\n * - Thread-safe registration\n * - Supports plugin override (useful for testing)\n * \n * USAGE:\n * ```typescript\n * // In app\n * const registry = inject(PresetRegistry);\n * \n * // Register custom preset\n * registry.register({\n * key: 'MY_CUSTOM_PRESET',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * return { start: now, end: now };\n * }\n * });\n * \n * // Check if preset exists\n * if (registry.has('MY_CUSTOM_PRESET')) {\n * store.applyPreset('MY_CUSTOM_PRESET');\n * }\n * \n * // Get all registered presets\n * const allPresets = registry.getAll();\n * console.log('Available presets:', allPresets.map(p => p.key));\n * ```\n * \n * EXTERNAL PACKAGES:\n * ```typescript\n * // @acme/fiscal-presets\n * export function provideFiscalPresets() {\n * return {\n * provide: APP_INITIALIZER,\n * multi: true,\n * useFactory: (registry: PresetRegistry) => {\n * return () => {\n * FISCAL_PRESETS.forEach(p => registry.register(p));\n * };\n * },\n * deps: [PresetRegistry]\n * };\n * }\n * ```\n */\n\nimport { Injectable } from '@angular/core';\nimport { RangePresetPlugin, isRangePresetPlugin } from './range-preset.plugin';\n\n/**\n * Preset Registry Service\n * \n * Manages registration and retrieval of date range preset plugins.\n * \n * DESIGN:\n * - Uses Map for O(1) lookups\n * - Immutable getAll() returns copy\n * - Supports plugin override (last registration wins)\n * - Validates plugins before registration\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PresetRegistry {\n /**\n * Internal map of registered presets\n * Key: preset key (e.g., 'TODAY', 'LAST_7_DAYS')\n * Value: RangePresetPlugin instance\n */\n private readonly presets = new Map<string, RangePresetPlugin>();\n\n /**\n * Register a date range preset plugin\n * \n * If a preset with the same key already exists, it will be overridden.\n * This is useful for:\n * - Testing (override built-in presets with mocks)\n * - Customization (replace default behavior)\n * - Hot-reload scenarios\n * \n * @param plugin - The preset plugin to register\n * @throws Error if plugin is invalid (missing key or resolve function)\n * \n * @example\n * ```typescript\n * registry.register({\n * key: 'LAST_BUSINESS_WEEK',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const dayOfWeek = adapter.getDayOfWeek(now);\n * \n * // Go back to last Friday\n * const daysToLastFriday = dayOfWeek === 0 ? 2 : (dayOfWeek + 2) % 7;\n * const lastFriday = adapter.addDays(now, -daysToLastFriday);\n * \n * // Business week: Monday to Friday\n * const monday = adapter.addDays(lastFriday, -4);\n * \n * return { start: monday, end: lastFriday };\n * }\n * });\n * ```\n */\n register(plugin: RangePresetPlugin): void {\n // Validate plugin\n if (!isRangePresetPlugin(plugin)) {\n throw new Error(\n `Invalid preset plugin: must have 'key' (string) and 'resolve' (function). ` +\n `Received: ${JSON.stringify(plugin)}`\n );\n }\n\n // Validate key is not empty\n if (!plugin.key || plugin.key.trim().length === 0) {\n throw new Error('Preset plugin key cannot be empty');\n }\n\n // Register (override if exists)\n const key = plugin.key.toUpperCase(); // Normalize to uppercase\n \n // Warn if overriding\n if (this.presets.has(key)) {\n console.warn(\n `[PresetRegistry] Overriding existing preset: \"${key}\". ` +\n `This is normal if you're customizing built-in presets.`\n );\n }\n\n this.presets.set(key, plugin);\n }\n\n /**\n * Register multiple preset plugins at once\n * \n * Convenience method for bulk registration.\n * Useful when importing preset packages.\n * \n * @param plugins - Array of preset plugins to register\n * \n * @example\n * ```typescript\n * import { FISCAL_PRESETS } from '@acme/fiscal-presets';\n * \n * registry.registerAll(FISCAL_PRESETS);\n * ```\n */\n registerAll(plugins: RangePresetPlugin[]): void {\n plugins.forEach(plugin => this.register(plugin));\n }\n\n /**\n * Get a preset plugin by key\n * \n * @param key - Preset key (case-insensitive, e.g., 'today' or 'TODAY')\n * @returns The preset plugin or undefined if not found\n * \n * @example\n * ```typescript\n * const preset = registry.get('LAST_7_DAYS');\n * if (preset) {\n * const range = preset.resolve(clock, adapter);\n * console.log('Range:', range);\n * }\n * ```\n */\n get(key: string): RangePresetPlugin | undefined {\n return this.presets.get(key.toUpperCase());\n }\n\n /**\n * Check if a preset exists in the registry\n * \n * @param key - Preset key (case-insensitive)\n * @returns true if preset exists, false otherwise\n * \n * @example\n * ```typescript\n * if (registry.has('THIS_FISCAL_QUARTER')) {\n * store.applyPreset('THIS_FISCAL_QUARTER');\n * } else {\n * console.error('Fiscal quarter preset not registered');\n * }\n * ```\n */\n has(key: string): boolean {\n return this.presets.has(key.toUpperCase());\n }\n\n /**\n * Get all registered preset plugins\n * \n * Returns a NEW array (immutable) to prevent external modification.\n * \n * @returns Array of all registered preset plugins\n * \n * @example\n * ```typescript\n * const allPresets = registry.getAll();\n * console.log('Available presets:');\n * allPresets.forEach(preset => {\n * console.log(`- ${preset.key}`);\n * });\n * ```\n */\n getAll(): RangePresetPlugin[] {\n return Array.from(this.presets.values());\n }\n\n /**\n * Get all preset keys\n * \n * Convenience method to list available preset identifiers.\n * \n * @returns Array of preset keys (uppercase)\n * \n * @example\n * ```typescript\n * const keys = registry.getAllKeys();\n * // ['TODAY', 'YESTERDAY', 'LAST_7_DAYS', 'THIS_MONTH', ...]\n * ```\n */\n getAllKeys(): string[] {\n return Array.from(this.presets.keys());\n }\n\n /**\n * Get count of registered presets\n * \n * @returns Number of registered presets\n * \n * @example\n * ```typescript\n * console.log(`${registry.count()} presets available`);\n * ```\n */\n count(): number {\n return this.presets.size;\n }\n\n /**\n * Unregister a preset plugin\n * \n * Useful for:\n * - Testing cleanup\n * - Dynamic preset management\n * - Removing deprecated presets\n * \n * @param key - Preset key to remove (case-insensitive)\n * @returns true if preset was removed, false if it didn't exist\n * \n * @example\n * ```typescript\n * registry.unregister('MY_TEMPORARY_PRESET');\n * ```\n */\n unregister(key: string): boolean {\n return this.presets.delete(key.toUpperCase());\n }\n\n /**\n * Clear all registered presets\n * \n * ⚠️ USE WITH CAUTION: This removes ALL presets including built-ins.\n * \n * Useful for:\n * - Test teardown\n * - Complete re-initialization scenarios\n * \n * @example\n * ```typescript\n * // In test cleanup\n * afterEach(() => {\n * registry.clear();\n * });\n * ```\n */\n clear(): void {\n this.presets.clear();\n }\n}\n","/**\n * Headless Preset Engine\n * Pure functions that resolve date ranges WITHOUT render dependency\n * Perfect for SSR, global state, dashboard filters\n * \n * v3.5.0: SSR-Safe via Clock Injection\n * All date calculations use DateClock instead of new Date()\n * This ensures server and client resolve identical presets\n * \n * v3.5.1: Timezone-Safe via DateAdapter\n * All date operations use DateAdapter for consistent behavior\n * Fixes timezone bugs common in ERP/BI/POS systems\n * \n * v3.6.0: Plugin-Driven Architecture\n * Preset Engine now uses PresetRegistry for plugin-based extensibility\n * Follows Open/Closed Principle - extend without modifying core\n * Supports external preset packages for industry-specific needs\n */\n\nimport { Injectable, inject } from '@angular/core';\nimport { DateClock, DATE_CLOCK } from './date-clock';\nimport { SystemClock } from './system-clock';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\nimport { PresetRegistry } from './preset-registry';\n\n/**\n * @deprecated Use RangePresetPlugin from './range-preset.plugin' instead\n * Kept for backward compatibility\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 * Preset Engine - Plugin-Driven Architecture\n * \n * ARCHITECTURE (v3.6.0):\n * - NO longer contains presets internally\n * - Uses PresetRegistry for plugin management\n * - Injects DateClock for SSR-safe time\n * - Injects DateAdapter for timezone-safe operations\n * - Follows Open/Closed Principle\n * \n * BACKWARD COMPATIBILITY:\n * - Old API unchanged: resolve(), register(), getPresetKeys()\n * - Built-in presets auto-registered via provider\n * - Existing code continues to work\n * \n * EXTENSIBILITY:\n * ```typescript\n * // Register custom preset via registry\n * const registry = inject(PresetRegistry);\n * registry.register({\n * key: 'MY_PRESET',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * return { start: now, end: now };\n * }\n * });\n * \n * // Use via engine\n * const engine = inject(PresetEngine);\n * const range = engine.resolve('MY_PRESET');\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PresetEngine {\n private clock: DateClock;\n private adapter: DateAdapter;\n private registry: PresetRegistry;\n\n constructor() {\n // Inject dependencies with fallbacks\n try {\n this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();\n this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();\n this.registry = inject(PresetRegistry);\n } catch {\n // Fallback if inject() fails outside injection context\n this.clock = new SystemClock();\n this.adapter = new NativeDateAdapter();\n this.registry = new PresetRegistry();\n }\n }\n\n /**\n * Register a custom preset\n * \n * @deprecated Use PresetRegistry.register() directly for new code\n * Kept for backward compatibility\n * \n * @param key - Preset key (e.g., 'MY_CUSTOM_PRESET')\n * @param preset - Legacy RangePreset object\n */\n register(key: string, preset: RangePreset): void {\n // Convert legacy RangePreset to RangePresetPlugin\n this.registry.register({\n key: key,\n resolve: (clock, adapter) => {\n const now = clock.now();\n return preset.resolve(now);\n }\n });\n }\n\n /**\n * Resolve a preset to date range\n * \n * Plugin Architecture:\n * 1. Looks up plugin in PresetRegistry\n * 2. Calls plugin.resolve(clock, adapter)\n * 3. Returns ISO date range\n * \n * SSR Note: Uses injected DateClock for deterministic resolution\n * Timezone Note: Uses injected DateAdapter for consistent operations\n * \n * @param key - Preset key (e.g., 'TODAY', 'LAST_7_DAYS')\n * @param now - Optional override for current date (defaults to clock.now())\n * @returns ISO date range or null if preset not found\n */\n resolve(key: string, now?: Date): PresetRange | null {\n const plugin = this.registry.get(key);\n \n if (!plugin) {\n console.warn(`[PresetEngine] Preset \"${key}\" not found in registry`);\n return null;\n }\n\n // Create temporary clock if now is provided\n const effectiveClock = now \n ? { now: () => now } \n : this.clock;\n\n // Resolve via plugin\n const { start, end } = plugin.resolve(effectiveClock, this.adapter);\n\n // Convert to ISO format\n return {\n start: this.adapter.toISODate(start),\n end: this.adapter.toISODate(end)\n };\n }\n\n /**\n * Get all available preset keys\n * \n * Delegates to PresetRegistry\n * \n * @returns Array of registered preset keys\n */\n getPresetKeys(): string[] {\n return this.registry.getAllKeys();\n }\n\n /**\n * Check if a preset exists\n * \n * @param key - Preset key to check\n * @returns true if preset is registered\n */\n hasPreset(key: string): boolean {\n return this.registry.has(key);\n }\n}\n\n/**\n * Create a custom preset from a function\n * \n * @deprecated Use RangePresetPlugin interface instead\n * Kept for backward compatibility\n */\nexport function createPreset(\n resolver: (now: Date) => { start: Date; end: Date }\n): RangePreset {\n return { resolve: resolver };\n}\n\n/**\n * @deprecated Use dependency injection instead:\n * ```typescript\n * private engine = inject(PresetEngine);\n * ```\n * \n * Singleton preset engine instance for backward compatibility\n * \n * WARNING: This singleton uses SystemClock directly and is NOT SSR-safe.\n * For SSR applications, inject PresetEngine and override DATE_CLOCK token.\n * \n * This export will be removed in v4.0.0\n */\nexport const presetEngine = new PresetEngine();\n","/**\n * Headless Date Range Store using Angular Signals\n * \n * Version: 3.5.1\n * \n * Architecture:\n * - State lives HERE, not in UI component\n * - Deterministic: no hidden side effects\n * - SSR-compatible: no window/document dependencies\n * - Timezone-safe: uses DateAdapter for all date operations\n * - Testable: pure signal-based state\n * - Reusable: inject anywhere (services, components, guards)\n * \n * Usage:\n * ```typescript\n * // In component\n * const rangeStore = inject(DualDateRangeStore);\n * rangeStore.applyPreset('THIS_MONTH');\n * \n * // In service (headless!)\n * const store = inject(DualDateRangeStore);\n * const range = store.range();\n * this.http.get(`/api/sales?start=${range.start}&end=${range.end}`);\n * ```\n */\n\nimport { Injectable, signal, computed, effect, inject } from '@angular/core';\nimport { \n validateRangeOrder, \n validateRangeBounds, \n isDateDisabled,\n applyBounds,\n parseISODate,\n formatISODate\n} from './range.validator';\nimport { PresetEngine, PresetRange } from './preset.engine';\nimport { DateClock, DATE_CLOCK } from './date-clock';\nimport { SystemClock } from './system-clock';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\n\nexport interface DateRangeState {\n start: string; // ISO date\n end: string; // ISO date\n startTime?: string; // HH:mm\n endTime?: string; // HH:mm\n}\n\nexport interface DateRangeConfig {\n minDate?: Date;\n maxDate?: Date;\n disabledDates?: Date[] | ((date: Date) => boolean);\n enableTimePicker?: boolean;\n defaultStartTime?: string;\n defaultEndTime?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DualDateRangeStore {\n // Dependency Injection - SSR-Safe & Timezone-Safe\n private presetEngine = inject(PresetEngine);\n private clock: DateClock;\n private adapter: DateAdapter;\n\n constructor() {\n // Try to inject DATE_CLOCK, fallback to SystemClock if not provided\n try {\n this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();\n } catch {\n // In case inject() fails (e.g., called outside injection context)\n this.clock = new SystemClock();\n }\n\n // Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided\n try {\n this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();\n } catch {\n this.adapter = new NativeDateAdapter();\n }\n }\n\n // Configuration\n private config = signal<DateRangeConfig>({\n enableTimePicker: false,\n defaultStartTime: '00:00',\n defaultEndTime: '23:59'\n });\n\n // Core state - using signals\n private _startDate = signal<Date | null>(null);\n private _endDate = signal<Date | null>(null);\n private _leftMonth = signal<Date>(new Date());\n private _rightMonth = signal<Date>(this.getNextMonth(new Date()));\n private _selectingStart = signal<boolean>(true);\n\n // Time state\n private _startTime = signal<string>('00:00');\n private _endTime = signal<string>('23:59');\n\n // Pending state for requireApply mode\n private _pendingStart = signal<Date | null>(null);\n private _pendingEnd = signal<Date | null>(null);\n private _hasPendingChanges = signal<boolean>(false);\n\n // Public read-only signals\n readonly startDate = this._startDate.asReadonly();\n readonly endDate = this._endDate.asReadonly();\n readonly leftMonth = this._leftMonth.asReadonly();\n readonly rightMonth = this._rightMonth.asReadonly();\n readonly selectingStart = this._selectingStart.asReadonly();\n readonly startTime = this._startTime.asReadonly();\n readonly endTime = this._endTime.asReadonly();\n readonly hasPendingChanges = this._hasPendingChanges.asReadonly();\n\n // Computed: ISO range for API consumption\n readonly range = computed<DateRangeState>(() => {\n const start = this._startDate();\n const end = this._endDate();\n const cfg = this.config();\n\n const result: DateRangeState = {\n start: this.adapter.toISODate(start),\n end: this.adapter.toISODate(end)\n };\n\n if (cfg.enableTimePicker) {\n result.startTime = this._startTime();\n result.endTime = this._endTime();\n }\n\n return result;\n });\n\n // Computed: validation state\n readonly isValid = computed(() => {\n const start = this._startDate();\n const end = this._endDate();\n const cfg = this.config();\n\n const orderValidation = validateRangeOrder(start, end);\n if (!orderValidation.valid) return false;\n\n const boundsValidation = validateRangeBounds(\n start,\n end,\n cfg.minDate,\n cfg.maxDate\n );\n return boundsValidation.valid;\n });\n\n // Computed: range text for display\n readonly rangeText = computed(() => {\n const start = this._startDate();\n const end = this._endDate();\n\n if (!start && !end) return '';\n if (!start) return `? - ${this.formatDateShort(end!)}`;\n if (!end) return `${this.formatDateShort(start)}`;\n\n return `${this.formatDateShort(start)} - ${this.formatDateShort(end)}`;\n });\n\n /**\n * Configure the store\n */\n configure(config: Partial<DateRangeConfig>): void {\n this.config.update(current => ({ ...current, ...config }));\n }\n\n /**\n * Set start date (with validation)\n */\n setStart(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n \n if (parsedDate) {\n const cfg = this.config();\n \n // Apply bounds\n const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);\n \n // Check if disabled\n if (isDateDisabled(boundedDate, cfg.disabledDates)) {\n console.warn('Cannot select disabled date');\n return;\n }\n\n this._startDate.set(boundedDate);\n this._selectingStart.set(false);\n\n // Auto-adjust end if it becomes invalid\n const end = this._endDate();\n if (end && end < boundedDate) {\n this._endDate.set(null);\n }\n } else {\n this._startDate.set(null);\n }\n }\n\n /**\n * Set end date (with validation)\n */\n setEnd(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n \n if (parsedDate) {\n const cfg = this.config();\n \n // Apply bounds\n const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);\n \n // Check if disabled\n if (isDateDisabled(boundedDate, cfg.disabledDates)) {\n console.warn('Cannot select disabled date');\n return;\n }\n\n // Validate order\n const start = this._startDate();\n if (start && boundedDate < start) {\n console.warn('End date cannot be before start date');\n return;\n }\n\n this._endDate.set(boundedDate);\n this._selectingStart.set(true); // Ready for next selection\n } else {\n this._endDate.set(null);\n }\n }\n\n /**\n * Set complete range at once\n */\n setRange(start: Date | string | null, end: Date | string | null): void {\n this.setStart(start);\n this.setEnd(end);\n }\n\n /**\n * Set pending selection (for requireApply mode)\n */\n setPendingStart(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n this._pendingStart.set(parsedDate);\n this._hasPendingChanges.set(true);\n }\n\n setPendingEnd(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n this._pendingEnd.set(parsedDate);\n this._hasPendingChanges.set(true);\n }\n\n /**\n * Apply pending changes\n */\n applyPending(): void {\n const pendingStart = this._pendingStart();\n const pendingEnd = this._pendingEnd();\n\n if (pendingStart) this.setStart(pendingStart);\n if (pendingEnd) this.setEnd(pendingEnd);\n\n this.clearPending();\n }\n\n /**\n * Cancel pending changes\n */\n cancelPending(): void {\n this.clearPending();\n }\n\n private clearPending(): void {\n this._pendingStart.set(null);\n this._pendingEnd.set(null);\n this._hasPendingChanges.set(false);\n }\n\n /**\n * Reset to empty state\n */\n reset(): void {\n this._startDate.set(null);\n this._endDate.set(null);\n this._selectingStart.set(true);\n this.clearPending();\n }\n\n /**\n * Apply a preset by key\n * \n * SSR-Safe: Uses injected DateClock for deterministic resolution\n * \n * @param presetKey - Preset identifier (e.g., 'TODAY', 'LAST_7_DAYS')\n * @param now - Optional date override (defaults to clock.now())\n */\n applyPreset(presetKey: string, now?: Date): void {\n const currentDate = now ?? this.clock.now();\n const range = this.presetEngine.resolve(presetKey, currentDate);\n \n if (range) {\n this.setRange(range.start, range.end);\n } else {\n console.warn(`Preset \"${presetKey}\" not found`);\n }\n }\n\n /**\n * Navigate left calendar month\n */\n setLeftMonth(date: Date): void {\n this._leftMonth.set(date);\n \n // Ensure right month is always after left\n const right = this._rightMonth();\n if (right <= date) {\n this._rightMonth.set(this.getNextMonth(date));\n }\n }\n\n /**\n * Navigate right calendar month\n */\n setRightMonth(date: Date): void {\n this._rightMonth.set(date);\n \n // Ensure left month is always before right\n const left = this._leftMonth();\n if (left >= date) {\n this._leftMonth.set(this.getPreviousMonth(date));\n }\n }\n\n /**\n * Set time values\n */\n setStartTime(time: string): void {\n this._startTime.set(time);\n }\n\n setEndTime(time: string): void {\n this._endTime.set(time);\n }\n\n /**\n * Get current state as snapshot\n */\n getSnapshot(): DateRangeState {\n return this.range();\n }\n\n /**\n * Load state from snapshot\n */\n loadSnapshot(snapshot: DateRangeState): void {\n this.setRange(snapshot.start, snapshot.end);\n \n if (snapshot.startTime) {\n this.setStartTime(snapshot.startTime);\n }\n \n if (snapshot.endTime) {\n this.setEndTime(snapshot.endTime);\n }\n }\n\n // Helper methods - using DateAdapter for timezone safety\n private parseDate(date: Date | string | null): Date | null {\n if (!date) return null;\n if (date instanceof Date) return this.adapter.normalize(date);\n return this.adapter.parseISODate(date);\n }\n\n private getNextMonth(date: Date): Date {\n return this.adapter.addMonths(date, 1);\n }\n\n private getPreviousMonth(date: Date): Date {\n return this.adapter.addMonths(date, -1);\n }\n\n private formatDateShort(date: Date): string {\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const month = this.adapter.getMonth(date);\n const day = this.adapter.getDay(date);\n return `${day} ${months[month]}`;\n }\n}\n","/**\n * Built-in Date Range Preset Plugins\n * \n * Version: 3.6.0\n * \n * Standard presets provided by the library.\n * All presets use DateClock and DateAdapter for SSR-safety and timezone-safety.\n * \n * PRESETS INCLUDED:\n * - TODAY, YESTERDAY\n * - LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, LAST_60_DAYS, LAST_90_DAYS\n * - THIS_WEEK, LAST_WEEK\n * - THIS_MONTH, LAST_MONTH, MONTH_TO_DATE\n * - THIS_QUARTER, LAST_QUARTER, QUARTER_TO_DATE\n * - THIS_YEAR, LAST_YEAR, YEAR_TO_DATE\n */\n\nimport { RangePresetPlugin } from './range-preset.plugin';\n\n/**\n * TODAY - Current day\n */\nexport const TODAY_PRESET: RangePresetPlugin = {\n key: 'TODAY',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const normalized = adapter.normalize(now);\n return { start: normalized, end: normalized };\n }\n};\n\n/**\n * YESTERDAY - Previous day\n */\nexport const YESTERDAY_PRESET: RangePresetPlugin = {\n key: 'YESTERDAY',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const date = adapter.addDays(now, -1);\n return { start: date, end: date };\n }\n};\n\n/**\n * LAST_7_DAYS - Last 7 days including today\n */\nexport const LAST_7_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_7_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -6);\n return { start, end };\n }\n};\n\n/**\n * LAST_14_DAYS - Last 14 days including today\n */\nexport const LAST_14_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_14_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -13);\n return { start, end };\n }\n};\n\n/**\n * LAST_30_DAYS - Last 30 days including today\n */\nexport const LAST_30_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_30_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -29);\n return { start, end };\n }\n};\n\n/**\n * LAST_60_DAYS - Last 60 days including today\n */\nexport const LAST_60_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_60_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -59);\n return { start, end };\n }\n};\n\n/**\n * LAST_90_DAYS - Last 90 days including today\n */\nexport const LAST_90_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_90_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -89);\n return { start, end };\n }\n};\n\n/**\n * THIS_WEEK - Current week (Monday to Sunday)\n */\nexport const THIS_WEEK_PRESET: RangePresetPlugin = {\n key: 'THIS_WEEK',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const dayOfWeek = adapter.getDay(now);\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const start = adapter.addDays(now, -daysToMonday);\n const end = adapter.addDays(start, 6);\n return { start, end };\n }\n};\n\n/**\n * LAST_WEEK - Previous week (Monday to Sunday)\n */\nexport const LAST_WEEK_PRESET: RangePresetPlugin = {\n key: 'LAST_WEEK',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const dayOfWeek = adapter.getDay(now);\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const lastMonday = adapter.addDays(now, -daysToMonday - 7);\n const lastSunday = adapter.addDays(lastMonday, 6);\n return { start: lastMonday, end: lastSunday };\n }\n};\n\n/**\n * THIS_MONTH - Current calendar month (1st to last day)\n */\nexport const THIS_MONTH_PRESET: RangePresetPlugin = {\n key: 'THIS_MONTH',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const start = adapter.startOfMonth(now);\n const end = adapter.endOfMonth(now);\n return { start, end };\n }\n};\n\n/**\n * LAST_MONTH - Previous calendar month\n */\nexport const LAST_MONTH_PRESET: RangePresetPlugin = {\n key: 'LAST_MONTH',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const lastMonth = adapter.addMonths(now, -1);\n const start = adapter.startOfMonth(lastMonth);\n const end = adapter.endOfMonth(lastMonth);\n return { start, end };\n }\n};\n\n/**\n * MONTH_TO_DATE - From start of current month to today\n */\nexport const MONTH_TO_DATE_PRESET: RangePresetPlugin = {\n key: 'MONTH_TO_DATE',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const start = adapter.startOfMonth(now);\n const end = adapter.normalize(now);\n return { start, end };\n }\n};\n\n/**\n * THIS_QUARTER - Current quarter (Q1: Jan-Mar, Q2: Apr-Jun, Q3: Jul-Sep, Q4: Oct-Dec)\n */\nexport const THIS_QUARTER_PRESET: RangePresetPlugin = {\n key: 'THIS_QUARTER',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const currentMonth = adapter.getMonth(now);\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const year = adapter.getYear(now);\n \n const start = new Date(year, quarterStartMonth, 1);\n const normalizedStart = adapter.normalize(start);\n \n const end = new Date(year, quarterStartMonth + 3, 0);\n const normalizedEnd = adapter.normalize(end);\n \n return { start: normalizedStart, end: normalizedEnd };\n }\n};\n\n/**\n * LAST_QUARTER - Previous quarter\n */\nexport const LAST_QUARTER_PRESET: RangePresetPlugin = {\n key: 'LAST_QUARTER',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const currentMonth = adapter.getMonth(now);\n const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;\n const year = adapter.getYear(now);\n \n const adjustedYear = lastQuarterStartMonth < 0 ? year - 1 : year;\n const adjustedMonth = lastQuarterStartMonth < 0 ? 9 : lastQuarterStartMonth;\n \n const start = new Date(adjustedYear, adjustedMonth, 1);\n const normalizedStart = adapter.normalize(start);\n \n const end = new Date(adjustedYear, adjustedMonth + 3, 0);\n const normalizedEnd = adapter.normalize(end);\n \n return { start: normalizedStart, end: normalizedEnd };\n }\n};\n\n/**\n * QUARTER_TO_DATE - From start of current quarter to today\n */\nexport const QUARTER_TO_DATE_PRESET: RangePresetPlugin = {\n key: 'QUARTER_TO_DATE',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const currentMonth = adapter.getMonth(now);\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const year = adapter.getYear(now);\n \n const start = new Date(year, quarterStartMonth, 1);\n const normalizedStart = adapter.normalize(start);\n const end = adapter.normalize(now);\n \n return { start: normalizedStart, end };\n }\n};\n\n/**\n * THIS_YEAR - Current calendar year (Jan 1 to Dec 31)\n */\nexport const THIS_YEAR_PRESET: RangePresetPlugin = {\n key: 'THIS_YEAR',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const year = adapter.getYear(now);\n const start = new Date(year, 0, 1);\n const end = new Date(year, 11, 31);\n return { \n start: adapter.normalize(start), \n end: adapter.normalize(end) \n };\n }\n};\n\n/**\n * LAST_YEAR - Previous calendar year\n */\nexport const LAST_YEAR_PRESET: RangePresetPlugin = {\n key: 'LAST_YEAR',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const year = adapter.getYear(now);\n const start = new Date(year - 1, 0, 1);\n const end = new Date(year - 1, 11, 31);\n return { \n start: adapter.normalize(start), \n end: adapter.normalize(end) \n };\n }\n};\n\n/**\n * YEAR_TO_DATE - From start of current year to today\n */\nexport const YEAR_TO_DATE_PRESET: RangePresetPlugin = {\n key: 'YEAR_TO_DATE',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const year = adapter.getYear(now);\n const start = new Date(year, 0, 1);\n const end = adapter.normalize(now);\n return { start: adapter.normalize(start), end };\n }\n};\n\n/**\n * All built-in presets as an array\n * \n * Use this to register all built-in presets at once:\n * ```typescript\n * BUILT_IN_PRESETS.forEach(preset => registry.register(preset));\n * ```\n */\nexport const BUILT_IN_PRESETS: RangePresetPlugin[] = [\n TODAY_PRESET,\n YESTERDAY_PRESET,\n LAST_7_DAYS_PRESET,\n LAST_14_DAYS_PRESET,\n LAST_30_DAYS_PRESET,\n LAST_60_DAYS_PRESET,\n LAST_90_DAYS_PRESET,\n THIS_WEEK_PRESET,\n LAST_WEEK_PRESET,\n THIS_MONTH_PRESET,\n LAST_MONTH_PRESET,\n MONTH_TO_DATE_PRESET,\n THIS_QUARTER_PRESET,\n LAST_QUARTER_PRESET,\n QUARTER_TO_DATE_PRESET,\n THIS_YEAR_PRESET,\n LAST_YEAR_PRESET,\n YEAR_TO_DATE_PRESET\n];\n","/**\n * Calendar Grid Types\n *\n * Defines the structure for memoized calendar month grids.\n * Separates base grid structure (cacheable) from decorations (dynamic).\n */\n\n/**\n * A single calendar cell representing one day\n */\nexport interface CalendarCell {\n /** Date object (normalized to start of day) */\n date: Date;\n\n /** Whether this day belongs to the current rendered month */\n inCurrentMonth: boolean;\n\n /** ISO string 'YYYY-MM-DD' (timezone-safe via DateAdapter) */\n iso: string;\n\n /** Day of month (1-31) */\n day: number;\n\n /** Month (0-11, JavaScript convention) */\n month: number;\n\n /** Full year */\n year: number;\n\n /** Day of week (0 = Sunday, 6 = Saturday) */\n dayOfWeek: number;\n}\n\n/**\n * A calendar grid representing one month\n *\n * Grid is always 6 weeks x 7 days (42 cells) for layout stability.\n * Includes padding days from previous/next month.\n */\nexport interface CalendarGrid {\n /** Month identifier */\n month: {\n /** Year */\n year: number;\n /** Month 0-11 */\n month: number;\n };\n\n /** Week start day (0 = Sunday, 1 = Monday, etc.) */\n weekStart: number;\n\n /** Locale (for future i18n, optional) */\n locale?: string;\n\n /** 6 weeks x 7 days matrix */\n weeks: CalendarCell[][];\n\n /** Flat array of all cells (convenience accessor) */\n cells: CalendarCell[];\n}\n\n/**\n * Cache key for calendar grids\n */\nexport interface CalendarGridCacheKey {\n year: number;\n month: number;\n weekStart: number;\n locale?: string;\n}\n","/**\n * Calendar Grid Factory\n *\n * Generates calendar month grids using DateAdapter for deterministic,\n * timezone-safe date operations.\n *\n * Grid structure:\n * - Always 6 weeks x 7 days (42 cells) for layout stability\n * - Includes padding days from previous/next month\n * - No decorations (selected, disabled, etc.) - those are applied separately\n */\n\nimport { Injectable, Inject } from '@angular/core';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarCell, CalendarGrid } from './calendar-grid.types';\n\n@Injectable({ providedIn: 'root' })\nexport class CalendarGridFactory {\n constructor(\n @Inject(DATE_ADAPTER) private adapter: DateAdapter\n ) {}\n\n /**\n * Create a calendar grid for a given month\n *\n * @param monthDate - Any date within the target month (will be normalized to start of month)\n * @param weekStart - First day of week (0 = Sunday, 1 = Monday, etc.)\n * @param locale - Locale identifier (optional, for future use)\n * @returns CalendarGrid - 6 weeks x 7 days grid\n */\n createGrid(monthDate: Date, weekStart: number = 0, locale?: string): CalendarGrid {\n // Normalize to start of month\n const year = this.adapter.getYear(monthDate);\n const month = this.adapter.getMonth(monthDate);\n const firstDayOfMonth = new Date(year, month, 1);\n const normalizedFirst = this.adapter.normalize(firstDayOfMonth);\n\n // Get days in month (day 0 of next month = last day of current month)\n const lastDayOfMonth = new Date(year, month + 1, 0);\n const daysInMonth = this.adapter.getDate(lastDayOfMonth);\n\n // Get first day of week offset\n const firstDayOfWeek = this.adapter.getDay(normalizedFirst);\n const offset = this.calculateOffset(firstDayOfWeek, weekStart);\n\n // Generate 42 cells (6 weeks x 7 days)\n const cells: CalendarCell[] = [];\n let currentDate = this.adapter.addDays(normalizedFirst, -offset);\n\n for (let i = 0; i < 42; i++) {\n const cellDate = this.adapter.normalize(currentDate);\n const cellYear = this.adapter.getYear(cellDate);\n const cellMonth = this.adapter.getMonth(cellDate);\n const cellDay = this.adapter.getDate(cellDate);\n const cellDayOfWeek = this.adapter.getDay(cellDate);\n\n cells.push({\n date: cellDate,\n inCurrentMonth: cellYear === year && cellMonth === month,\n iso: this.adapter.toISODate(cellDate),\n day: cellDay,\n month: cellMonth,\n year: cellYear,\n dayOfWeek: cellDayOfWeek\n });\n\n currentDate = this.adapter.addDays(currentDate, 1);\n }\n\n // Split into weeks\n const weeks: CalendarCell[][] = [];\n for (let i = 0; i < 6; i++) {\n weeks.push(cells.slice(i * 7, (i + 1) * 7));\n }\n\n return {\n month: { year, month },\n weekStart,\n locale,\n weeks,\n cells\n };\n }\n\n /**\n * Calculate offset (number of padding days from previous month)\n *\n * @param firstDayOfWeek - Day of week for first day of month (0-6)\n * @param weekStart - Desired week start (0-6)\n * @returns Number of padding days needed\n */\n private calculateOffset(firstDayOfWeek: number, weekStart: number): number {\n let offset = firstDayOfWeek - weekStart;\n if (offset < 0) {\n offset += 7;\n }\n return offset;\n }\n}\n","/**\n * Calendar Grid Cache\n *\n * LRU cache for calendar month grids to avoid recomputing the same month grid\n * multiple times when only decorations (selected dates, hover, etc.) change.\n *\n * Strategy:\n * - Key: year-month-weekStart-locale\n * - LRU eviction (least recently used) when limit is reached\n * - Default limit: 24 months (covers 1 year forward + 1 year back)\n *\n * Performance impact:\n * - Eliminates ~90% of grid recalculations in typical usage\n * - Memory footprint: ~10KB per cached month (negligible)\n */\n\nimport { Injectable } from '@angular/core';\nimport { CalendarGridFactory } from './calendar-grid.factory';\nimport { CalendarGrid, CalendarGridCacheKey } from './calendar-grid.types';\n\n@Injectable({ providedIn: 'root' })\nexport class CalendarGridCache {\n private cache = new Map<string, CalendarGrid>();\n private readonly maxSize: number = 24;\n\n constructor(private factory: CalendarGridFactory) {}\n\n /**\n * Get or create a calendar grid\n *\n * @param monthDate - Any date within the target month\n * @param weekStart - First day of week (0 = Sunday, 1 = Monday, etc.)\n * @param locale - Locale identifier (optional)\n * @returns CalendarGrid - cached or newly created\n */\n get(monthDate: Date, weekStart: number = 0, locale?: string): CalendarGrid {\n const key = this.buildKey(monthDate, weekStart, locale);\n\n // Check cache\n const cached = this.cache.get(key);\n if (cached) {\n // Move to end (LRU)\n this.cache.delete(key);\n this.cache.set(key, cached);\n return cached;\n }\n\n // Generate new grid\n const grid = this.factory.createGrid(monthDate, weekStart, locale);\n\n // Store in cache\n this.cache.set(key, grid);\n\n // Evict oldest if over limit (LRU)\n if (this.cache.size > this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\n }\n\n return grid;\n }\n\n /**\n * Build cache key from month parameters\n *\n * Format: \"year-month-weekStart-locale\"\n * Example: \"2026-1-0-en\" (Feb 2026, Sunday start, English)\n */\n private buildKey(monthDate: Date, weekStart: number, locale?: string): string {\n const year = monthDate.getFullYear();\n const month = monthDate.getMonth();\n return `${year}-${month}-${weekStart}${locale ? '-' + locale : ''}`;\n }\n\n /**\n * Clear entire cache (for testing or manual reset)\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache size (for debugging/testing)\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * Check if a specific month is cached\n */\n has(monthDate: Date, weekStart: number = 0, locale?: string): boolean {\n const key = this.buildKey(monthDate, weekStart, locale);\n return this.cache.has(key);\n }\n}\n","/**\n * Range Highlighter Types\n * \n * Type definitions for calendar cell decorations with range highlighting.\n * Used by RangeHighlighter to cache decorated grids and avoid recomputations.\n * \n * @module core/calendar-grid/range-highlighter.types\n * @version 3.8.0\n */\n\nimport { CalendarCell, CalendarGrid } from './calendar-grid.types';\n\n/**\n * Calendar cell with range highlight decorations\n * \n * Extends base CalendarCell with computed properties for:\n * - Start/end markers (selected range boundaries)\n * - Range membership (cell within selected range)\n * - Hover preview (temporary range during mouse hover)\n * - Disabled state (constraints, custom predicates)\n */\nexport interface DecoratedCell extends CalendarCell {\n /**\n * True if this cell is the selected start date\n */\n isSelectedStart: boolean;\n\n /**\n * True if this cell is the selected end date\n */\n isSelectedEnd: boolean;\n\n /**\n * True if this cell is within the selected range (inclusive)\n */\n isInRange: boolean;\n\n /**\n * True if this cell is within the hover preview range\n */\n isInHoverRange: boolean;\n\n /**\n * True if this cell is disabled (via constraints or custom logic)\n */\n isDisabled: boolean;\n}\n\n/**\n * Calendar grid with decorated cells\n * \n * Contains:\n * - base: Original CalendarGrid (from CalendarGridCache)\n * - weeks: 2D array of decorated cells (6 × 7)\n * - cells: Flat array of decorated cells (42 cells)\n */\nexport interface DecoratedGrid {\n /**\n * Base grid structure (memoized by CalendarGridCache)\n */\n base: CalendarGrid;\n\n /**\n * Decorated cells organized as weeks (6 weeks × 7 days)\n */\n weeks: DecoratedCell[][];\n\n /**\n * Decorated cells as flat array (42 cells for layout stability)\n */\n cells: DecoratedCell[];\n}\n\n/**\n * Parameters for range decoration\n * \n * All dates must be Date objects (pre-parsed by component).\n * Cache key is built from ISO dates (via DateAdapter.toISODate).\n * \n * Constraints:\n * - start/end: Selected range boundaries (null if not selected)\n * - minDate/maxDate: Hard constraints (optional, for future use)\n * - hoverDate: Current hover date (null if not hovering)\n * - disabledDates: Array of disabled dates OR function predicate\n */\nexport interface RangeDecorationParams {\n /**\n * Selected start date (null if not selected yet)\n */\n start: Date | null;\n\n /**\n * Selected end date (null if not selected yet)\n */\n end: Date | null;\n\n /**\n * Minimum allowed date (optional, for future constraint support)\n * All dates before this will be disabled.\n */\n minDate?: Date | null;\n\n /**\n * Maximum allowed date (optional, for future constraint support)\n * All dates after this will be disabled.\n */\n maxDate?: Date | null;\n\n /**\n * Current hover date (null if not hovering)\n * Used to calculate hover preview range.\n */\n hoverDate?: string | null;\n\n /**\n * Disabled dates specification\n * \n * Can be one of:\n * - Array of Date objects to disable (exact matches)\n * - Function predicate (date) => boolean\n * - undefined/null (no dates disabled)\n * \n * NOTE: Functions cannot be cached reliably (no stable key).\n * If using function, cache will be bypassed for isDisabled computation.\n */\n disabledDates?: Date[] | ((date: Date) => boolean) | null;\n\n /**\n * Multi-range mode flag (affects hover range behavior)\n * Default: false\n */\n multiRange?: boolean;\n\n /**\n * Currently selecting start date (affects hover preview)\n * Default: false\n */\n selectingStartDate?: boolean;\n}\n\n/**\n * Cache key for decorated grid\n * \n * Built from:\n * - monthKey: `${year}-${month}-${weekStart}-${locale}`\n * - startISO, endISO: ISO dates or 'null'\n * - minISO, maxISO: ISO dates or 'null' (optional)\n * - hoverISO: ISO date or 'null'\n * - disabledSignature: Hash of disabled dates (or 'none' / 'function')\n * \n * Example:\n * \"2026-1-0-|2026-01-15|2026-01-25|null|null|2026-01-20|2026-01-10,2026-01-11\"\n * \n * Segment breakdown:\n * 1. 2026-1-0- (month: Jan 2026, weekStart: Sunday, no locale)\n * 2. 2026-01-15 (start date)\n * 3. 2026-01-25 (end date)\n * 4. null (no minDate)\n * 5. null (no maxDate)\n * 6. 2026-01-20 (hovering over Jan 20)\n * 7. 2026-01-10,2026-01-11 (disabled dates: Jan 10 & 11)\n */\nexport interface DecoratedGridCacheKey {\n /**\n * Combined month key (from base grid)\n */\n monthKey: string;\n\n /**\n * Start date ISO (YYYY-MM-DD) or 'null'\n */\n startISO: string;\n\n /**\n * End date ISO (YYYY-MM-DD) or 'null'\n */\n endISO: string;\n\n /**\n * Min date ISO (YYYY-MM-DD) or 'null'\n */\n minISO: string;\n\n /**\n * Max date ISO (YYYY-MM-DD) or 'null'\n */\n maxISO: string;\n\n /**\n * Hover date ISO (YYYY-MM-DD) or 'null'\n */\n hoverISO: string;\n\n /**\n * Disabled dates signature\n * \n * - 'none': No dates disabled\n * - 'function': Using predicate function (not cacheable)\n * - sorted ISO string: \"2026-01-10,2026-01-11,...\" (for array)\n */\n disabledSignature: string;\n\n /**\n * Full cache key (concatenation of all segments)\n */\n full: string;\n}\n","/**\n * Range Highlighter Service\n * \n * Decorates calendar grids with range highlights, hover previews, and disabled states.\n * Pure computation layer - no caching (see RangeHighlighterCache for memoization).\n * \n * @module core/calendar-grid/range-highlighter\n * @version 3.8.0\n */\n\nimport { Injectable, Inject } from '@angular/core';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarGrid, CalendarCell } from './calendar-grid.types';\nimport { DecoratedGrid, DecoratedCell, RangeDecorationParams } from './range-highlighter.types';\n\n/**\n * Range Highlighter\n * \n * Applies decorations to calendar grids:\n * - isSelectedStart, isSelectedEnd (range boundaries)\n * - isInRange (cells within selected range)\n * - isInHoverRange (hover preview)\n * - isDisabled (constraints, custom predicates)\n * \n * Design:\n * - Pure functions (same input = same output)\n * - Uses DateAdapter for all date operations (SSR-safe)\n * - No side effects, no state\n * - Fast (~1ms for 42 cells on mobile)\n * \n * Usage:\n * ```typescript\n * const grid = calendarGridCache.get(monthDate, 0);\n * const decorated = rangeHighlighter.decorate(grid, {\n * start: startDate,\n * end: endDate,\n * hoverDate: '2026-01-20',\n * disabledDates: [...]\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class RangeHighlighter {\n constructor(\n @Inject(DATE_ADAPTER) private adapter: DateAdapter\n ) {}\n\n /**\n * Decorate calendar grid with range highlights\n * \n * @param grid Base calendar grid (from CalendarGridCache)\n * @param params Decoration parameters (start, end, hover, disabled, etc.)\n * @returns Decorated grid with computed properties\n */\n decorate(\n grid: CalendarGrid,\n params: RangeDecorationParams\n ): DecoratedGrid {\n // Normalize dates (ensure start of day, consistent ISO strings)\n const startISO = params.start ? this.adapter.toISODate(params.start) : null;\n const endISO = params.end ? this.adapter.toISODate(params.end) : null;\n const minISO = params.minDate ? this.adapter.toISODate(params.minDate) : null;\n const maxISO = params.maxDate ? this.adapter.toISODate(params.maxDate) : null;\n const hoverISO = params.hoverDate || null;\n\n // Compute hover range boundaries (if applicable)\n const hoverRange = this.computeHoverRange(\n startISO,\n hoverISO,\n params.selectingStartDate || false,\n params.multiRange || false\n );\n\n // Decorate all cells\n const decoratedCells = grid.cells.map((cell: CalendarCell): DecoratedCell => {\n // Padding cells (previous/next month) get default decorations\n if (!cell.inCurrentMonth) {\n return {\n ...cell,\n isSelectedStart: false,\n isSelectedEnd: false,\n isInRange: false,\n isInHoverRange: false,\n isDisabled: false\n };\n }\n\n // Current month cells: apply full decoration logic\n const cellISO = cell.iso;\n\n return {\n ...cell,\n isSelectedStart: startISO === cellISO,\n isSelectedEnd: endISO === cellISO,\n isInRange: this.isInRange(cellISO, startISO, endISO),\n isInHoverRange: this.isInHoverRange(cellISO, hoverRange),\n isDisabled: this.isDisabled(cell.date, minISO, maxISO, params.disabledDates)\n };\n });\n\n // Organize cells into weeks (6 × 7)\n const weeks: DecoratedCell[][] = [];\n for (let i = 0; i < decoratedCells.length; i += 7) {\n weeks.push(decoratedCells.slice(i, i + 7));\n }\n\n return {\n base: grid,\n cells: decoratedCells,\n weeks\n };\n }\n\n /**\n * Check if cell is within selected range\n * \n * @param cellISO Cell date (ISO format)\n * @param startISO Start date (ISO or null)\n * @param endISO End date (ISO or null)\n * @returns True if cell is in range [start, end] (inclusive)\n */\n private isInRange(\n cellISO: string,\n startISO: string | null,\n endISO: string | null\n ): boolean {\n if (!startISO || !endISO) return false;\n return cellISO >= startISO && cellISO <= endISO;\n }\n\n /**\n * Check if cell is within hover preview range\n * \n * @param cellISO Cell date (ISO format)\n * @param hoverRange Hover range boundaries (or null)\n * @returns True if cell is in hover range\n */\n private isInHoverRange(\n cellISO: string,\n hoverRange: { min: string; max: string } | null\n ): boolean {\n if (!hoverRange) return false;\n return cellISO >= hoverRange.min && cellISO <= hoverRange.max;\n }\n\n /**\n * Check if cell is disabled\n * \n * @param date Cell date object\n * @param minISO Minimum allowed date (ISO or null)\n * @param maxISO Maximum allowed date (ISO or null)\n * @param disabledDates Disabled dates (array, function, or null)\n * @returns True if cell is disabled\n */\n private isDisabled(\n date: Date,\n minISO: string | null,\n maxISO: string | null,\n disabledDates?: Date[] | ((date: Date) => boolean) | null\n ): boolean {\n const dateISO = this.adapter.toISODate(date);\n\n // Check min/max constraints\n if (minISO && dateISO < minISO) return true;\n if (maxISO && dateISO > maxISO) return true;\n\n // Check disabled dates\n if (!disabledDates) return false;\n\n if (typeof disabledDates === 'function') {\n // Custom predicate\n return disabledDates(date);\n } else if (Array.isArray(disabledDates)) {\n // Array of disabled dates (exact day match)\n return disabledDates.some(disabledDate => {\n return this.adapter.getYear(date) === this.adapter.getYear(disabledDate) &&\n this.adapter.getMonth(date) === this.adapter.getMonth(disabledDate) &&\n this.adapter.getDate(date) === this.adapter.getDate(disabledDate);\n });\n }\n\n return false;\n }\n\n /**\n * Compute hover preview range\n * \n * When user hovers over a date (and not selecting start):\n * - Show preview range from start to hover\n * - Range is always [min, max] where min <= max\n * \n * @param startISO Current start date (ISO or null)\n * @param hoverISO Hovered date (ISO or null)\n * @param selectingStart True if selecting start date (hover disabled)\n * @param multiRange True if in multi-range mode\n * @returns Hover range boundaries or null\n */\n private computeHoverRange(\n startISO: string | null,\n hoverISO: string | null,\n selectingStart: boolean,\n multiRange: boolean\n ): { min: string; max: string } | null {\n // No hover preview when selecting start\n if (selectingStart || !hoverISO || !startISO) return null;\n\n // Compute min/max (always normalized order)\n const min = startISO < hoverISO ? startISO : hoverISO;\n const max = startISO > hoverISO ? startISO : hoverISO;\n\n return { min, max };\n }\n}\n","/**\n * Range Highlighter Cache\n * \n * LRU cache for decorated calendar grids.\n * Eliminates redundant decoration computations when range/constraints don't change.\n * \n * @module core/calendar-grid/range-highlighter.cache\n * @version 3.8.0\n */\n\nimport { Injectable, Inject } from '@angular/core';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarGrid } from './calendar-grid.types';\nimport { DecoratedGrid, RangeDecorationParams, DecoratedGridCacheKey } from './range-highlighter.types';\nimport { RangeHighlighter } from './range-highlighter';\n\n/**\n * Range Highlighter Cache\n * \n * Memoizes decorated grids to avoid recomputing decorations.\n * \n * Cache strategy:\n * - LRU eviction (Map preserves insertion order)\n * - Max 48 entries (~1-2 years of decorated grids)\n * - Key: month + start + end + hover + disabled signature\n * \n * Performance:\n * - Cache hit: ~0.1ms (object lookup)\n * - Cache miss: ~1ms (decoration + store)\n * - Hit rate: Expected >80% in typical usage\n * \n * Memory:\n * - ~15KB per decorated grid\n * - Max 48 grids = ~720KB\n * - Auto-eviction prevents leaks\n * \n * Edge cases handled:\n * - Function predicates: Not cacheable (recompute every time)\n * - Large disabled arrays: Sorted + joined for stable key\n * - Hover changes: Separate cache entries\n * - Multi-range mode: Included in key\n * \n * Usage:\n * ```typescript\n * const grid = calendarGridCache.get(monthDate, 0);\n * const decorated = rangeHighlighterCache.get(grid, {\n * start: startDate,\n * end: endDate,\n * hoverDate: '2026-01-20',\n * disabledDates: [...]\n * });\n * // Same params = same object reference (===)\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class RangeHighlighterCache {\n private cache = new Map<string, DecoratedGrid>();\n private maxSize = 48; // ~1-2 years of decorated grids\n\n constructor(\n private highlighter: RangeHighlighter,\n @Inject(DATE_ADAPTER) private adapter: DateAdapter\n ) {}\n\n /**\n * Get decorated grid (cached or computed)\n * \n * If cache hit: Returns existing DecoratedGrid (same object reference)\n * If cache miss: Computes decorations, stores in cache, returns new grid\n * \n * @param grid Base calendar grid (from CalendarGridCache)\n * @param params Decoration parameters\n * @returns Decorated grid with range highlights\n */\n get(\n grid: CalendarGrid,\n params: RangeDecorationParams\n ): DecoratedGrid {\n // Build cache key\n const cacheKey = this.buildKey(grid, params);\n\n // Check cache (function predicates can't be cached reliably)\n const hasFunction = typeof params.disabledDates === 'function';\n if (!hasFunction && this.cache.has(cacheKey.full)) {\n // Cache hit: Return existing grid\n const cached = this.cache.get(cacheKey.full)!;\n \n // LRU update: Delete and re-insert (moves to end)\n this.cache.delete(cacheKey.full);\n this.cache.set(cacheKey.full, cached);\n \n return cached;\n }\n\n // Cache miss: Compute decorations\n const decorated = this.highlighter.decorate(grid, params);\n\n // Store in cache (only if not using function predicate)\n if (!hasFunction) {\n this.cache.set(cacheKey.full, decorated);\n\n // Evict oldest if over limit\n if (this.cache.size > this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n }\n\n return decorated;\n }\n\n /**\n * Build cache key from grid and params\n * \n * Key structure:\n * `${monthKey}|${startISO}|${endISO}|${minISO}|${maxISO}|${hoverISO}|${disabledSig}`\n * \n * Example:\n * \"2026-1-0-|2026-01-15|2026-01-25|null|null|2026-01-20|2026-01-10,2026-01-11\"\n * \n * @param grid Base calendar grid\n * @param params Decoration parameters\n * @returns Cache key components\n */\n private buildKey(\n grid: CalendarGrid,\n params: RangeDecorationParams\n ): DecoratedGridCacheKey {\n // Month key (from base grid)\n const monthKey = `${grid.month.year}-${grid.month.month}-${grid.weekStart}-${grid.locale || ''}`;\n\n // Date ISOs (null if not provided)\n const startISO = params.start ? this.adapter.toISODate(params.start) : 'null';\n const endISO = params.end ? this.adapter.toISODate(params.end) : 'null';\n const minISO = params.minDate ? this.adapter.toISODate(params.minDate) : 'null';\n const maxISO = params.maxDate ? this.adapter.toISODate(params.maxDate) : 'null';\n const hoverISO = params.hoverDate || 'null';\n\n // Disabled dates signature\n const disabledSignature = this.buildDisabledSignature(params.disabledDates);\n\n // Multi-range flag (affects hover behavior)\n const multiRangeFlag = params.multiRange ? '1' : '0';\n const selectingStartFlag = params.selectingStartDate ? '1' : '0';\n\n // Full key (pipe-separated for readability)\n const full = `${monthKey}|${startISO}|${endISO}|${minISO}|${maxISO}|${hoverISO}|${disabledSignature}|${multiRangeFlag}|${selectingStartFlag}`;\n\n return {\n monthKey,\n startISO,\n endISO,\n minISO,\n maxISO,\n hoverISO,\n disabledSignature,\n full\n };\n }\n\n /**\n * Build signature for disabled dates\n * \n * Strategies:\n * - null/undefined: 'none'\n * - Function: 'function' (not cacheable)\n * - Array: Sorted ISO dates joined with commas\n * \n * @param disabledDates Disabled dates specification\n * @returns Signature string for cache key\n */\n private buildDisabledSignature(\n disabledDates?: Date[] | ((date: Date) => boolean) | null\n ): string {\n if (!disabledDates) return 'none';\n\n if (typeof disabledDates === 'function') {\n return 'function';\n }\n\n if (Array.isArray(disabledDates)) {\n if (disabledDates.length === 0) return 'none';\n\n // Convert to ISO dates, sort, join\n const isoArray = disabledDates\n .map(date => this.adapter.toISODate(date))\n .sort();\n\n return isoArray.join(',');\n }\n\n return 'none';\n }\n\n /**\n * Clear all cached grids\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get current cache size\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * Check if key is cached\n * \n * @param grid Base calendar grid\n * @param params Decoration parameters\n * @returns True if this grid+params is cached\n */\n has(grid: CalendarGrid, params: RangeDecorationParams): boolean {\n const key = this.buildKey(grid, params);\n return this.cache.has(key.full);\n }\n}\n","/**\n * Virtual Weeks Types\n * \n * Type definitions for windowed week rendering (virtual scrolling).\n * Reduces DOM nodes by rendering only visible weeks instead of full month.\n * \n * @module core/calendar-grid/virtual-weeks.types\n * @version 3.9.0\n */\n\n/**\n * Virtual weeks configuration\n * \n * Controls how many weeks to render at once (windowed rendering).\n * Reduces DOM complexity for better mobile performance.\n * \n * Example:\n * ```typescript\n * <ngx-dual-datepicker\n * [virtualWeeks]=\"{ windowSize: 3 }\"\n * </ngx-dual-datepicker>\n * ```\n * \n * With windowSize=3:\n * - Renders only 3 weeks at a time (21 cells vs 42 cells)\n * - User can navigate between week windows\n * - ~50% reduction in DOM nodes per calendar\n * - ~50% reduction in reflow/repaint cost\n */\nexport interface VirtualWeeksConfig {\n /**\n * Number of weeks to render at once\n * \n * Default: undefined (render all 6 weeks - backward compatible)\n * \n * Recommended values:\n * - 3: Good balance (21 cells)\n * - 4: More context (28 cells)\n * - 2: Minimal (14 cells, may feel cramped)\n */\n windowSize: number;\n}\n\n/**\n * Virtual week window state\n * \n * Tracks which weeks are currently visible in the window.\n * Managed by component signals.\n */\nexport interface VirtualWeekWindow {\n /**\n * Start index of visible week range (0-based)\n * \n * Range: [0, totalWeeks - windowSize]\n */\n startIndex: number;\n\n /**\n * Window size (how many weeks visible)\n */\n windowSize: number;\n\n /**\n * Total weeks available in month (usually 6, sometimes 5)\n */\n totalWeeks: number;\n\n /**\n * Whether user can scroll/navigate up (to earlier weeks)\n */\n canNavigateUp: boolean;\n\n /**\n * Whether user can scroll/navigate down (to later weeks)\n */\n canNavigateDown: boolean;\n}\n","/**\n * Virtual Weeks Logic (Pure Functions)\n * \n * Pure computation layer for windowed week rendering.\n * No side effects, fully testable with node:test.\n * \n * @module core/calendar-grid/virtual-weeks.logic\n * @version 3.9.0\n */\n\nimport { VirtualWeekWindow } from './virtual-weeks.types';\n\n/**\n * Get visible weeks from total weeks array\n * \n * Pure function: Given weeks array and window config, returns visible slice.\n * \n * @param weeks Total weeks array (usually 6 weeks)\n * @param startIndex Start index of visible window (0-based)\n * @param windowSize How many weeks to show\n * @returns Visible weeks slice\n * \n * @example\n * ```typescript\n * const allWeeks = [week0, week1, week2, week3, week4, week5]; // 6 weeks\n * const visible = getVisibleWeeks(allWeeks, 0, 3);\n * // Returns [week0, week1, week2]\n * \n * const visible2 = getVisibleWeeks(allWeeks, 3, 3);\n * // Returns [week3, week4, week5]\n * ```\n */\nexport function getVisibleWeeks<T>(\n weeks: T[],\n startIndex: number,\n windowSize: number\n): T[] {\n if (!weeks || weeks.length === 0) {\n return [];\n }\n\n // If no windowing (windowSize undefined or >= total weeks), return all\n if (windowSize === undefined || windowSize >= weeks.length) {\n return weeks;\n }\n\n // Clamp startIndex to valid range\n const clampedStart = clampWeekStart(startIndex, weeks.length, windowSize);\n\n // Return slice\n return weeks.slice(clampedStart, clampedStart + windowSize);\n}\n\n/**\n * Clamp week start index to valid range\n * \n * Ensures startIndex is within bounds [0, totalWeeks - windowSize].\n * Prevents scrolling beyond available weeks.\n * \n * @param startIndex Desired start index\n * @param totalWeeks Total weeks available\n * @param windowSize Window size\n * @returns Clamped start index\n * \n * @example\n * ```typescript\n * clampWeekStart(0, 6, 3); // 0 (valid)\n * clampWeekStart(3, 6, 3); // 3 (valid, shows weeks 3-5)\n * clampWeekStart(4, 6, 3); // 3 (clamped, can't show beyond week 5)\n * clampWeekStart(-1, 6, 3); // 0 (clamped, can't go negative)\n * ```\n */\nexport function clampWeekStart(\n startIndex: number,\n totalWeeks: number,\n windowSize: number\n): number {\n if (windowSize >= totalWeeks) {\n return 0; // No windowing needed\n }\n\n const maxStart = totalWeeks - windowSize;\n return Math.max(0, Math.min(startIndex, maxStart));\n}\n\n/**\n * Navigate week window (scroll up/down)\n * \n * Returns new start index after navigation.\n * Handles clamping automatically.\n * \n * @param currentStart Current start index\n * @param direction Navigation direction (+1 = down/later, -1 = up/earlier)\n * @param totalWeeks Total weeks available\n * @param windowSize Window size\n * @returns New start index after navigation\n * \n * @example\n * ```typescript\n * // Start at week 0, navigate down\n * navigateWeekWindow(0, 1, 6, 3); // Returns 1 (now showing weeks 1-3)\n * \n * // At week 3 (last valid position), navigate down\n * navigateWeekWindow(3, 1, 6, 3); // Returns 3 (can't go further)\n * \n * // At week 1, navigate up\n * navigateWeekWindow(1, -1, 6, 3); // Returns 0 (now showing weeks 0-2)\n * ```\n */\nexport function navigateWeekWindow(\n currentStart: number,\n direction: number,\n totalWeeks: number,\n windowSize: number\n): number {\n const newStart = currentStart + direction;\n return clampWeekStart(newStart, totalWeeks, windowSize);\n}\n\n/**\n * Get virtual week window state\n * \n * Computes full window state including navigation capabilities.\n * \n * @param startIndex Current start index\n * @param totalWeeks Total weeks available\n * @param windowSize Window size\n * @returns Complete window state\n * \n * @example\n * ```typescript\n * const state = getVirtualWeekWindow(0, 6, 3);\n * // {\n * // startIndex: 0,\n * // windowSize: 3,\n * // totalWeeks: 6,\n * // canNavigateUp: false, // Already at top\n * // canNavigateDown: true // Can scroll down\n * // }\n * \n * const state2 = getVirtualWeekWindow(3, 6, 3);\n * // {\n * // startIndex: 3,\n * // windowSize: 3,\n * // totalWeeks: 6,\n * // canNavigateUp: true, // Can scroll up\n * // canNavigateDown: false // Already at bottom\n * // }\n * ```\n */\nexport function getVirtualWeekWindow(\n startIndex: number,\n totalWeeks: number,\n windowSize: number\n): VirtualWeekWindow {\n const clampedStart = clampWeekStart(startIndex, totalWeeks, windowSize);\n const maxStart = Math.max(0, totalWeeks - windowSize);\n\n return {\n startIndex: clampedStart,\n windowSize,\n totalWeeks,\n canNavigateUp: clampedStart > 0,\n canNavigateDown: clampedStart < maxStart\n };\n}\n\n/**\n * Check if virtual weeks mode is enabled\n * \n * @param windowSize Window size from config (undefined = disabled)\n * @param totalWeeks Total weeks available\n * @returns True if windowing should be applied\n */\nexport function isVirtualWeeksEnabled(\n windowSize: number | undefined,\n totalWeeks: number\n): boolean {\n return windowSize !== undefined && windowSize < totalWeeks;\n}\n","/**\n * Calendar Grid Module\n *\n * Performance-optimized calendar month grid generation with memoization.\n *\n * v3.7.0: Grid Structure Cache\n * - CalendarGridFactory for deterministic 42-cell grids\n * - CalendarGridCache with LRU (24 months)\n * \n * v3.8.0: Range Highlight Cache\n * - RangeHighlighter for decoration logic\n * - RangeHighlighterCache with LRU (48 grids)\n * - Separates grid structure from decorations\n * \n * v3.9.0: Virtual Weeks (Windowed Rendering)\n * - Virtual-weeks logic for reduced DOM complexity\n * - Render only visible weeks (configurable window)\n * - ~50% reduction in DOM nodes with windowSize=3\n *\n * Usage:\n * ```typescript\n * constructor(\n * private gridCache: CalendarGridCache,\n * private highlighterCache: RangeHighlighterCache\n * ) {}\n *\n * const grid = this.gridCache.get(monthDate, weekStart);\n * const decorated = this.highlighterCache.get(grid, {\n * start, end, hoverDate, disabledDates\n * });\n * \n * // Optional: Windowed rendering (v3.9.0+)\n * const windowSize = 3; // Render only 3 weeks\n * const visibleWeeks = getVisibleWeeks(\n * decorated.weeks, \n * weekStartIndex, \n * windowSize\n * );\n * // decorated.cells[0].iso => '2026-02-01'\n * // decorated.cells[0].isInRange => true\n * ```\n */\n\nexport * from './calendar-grid.types';\nexport * from './calendar-grid.factory';\nexport * from './calendar-grid.cache';\nexport * from './range-highlighter.types';\nexport * from './range-highlighter';\nexport * from './range-highlighter.cache';\nexport * from './virtual-weeks.types';\nexport * from './virtual-weeks.logic';\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, HostListener, ElementRef, forwardRef, signal, computed, effect, inject, APP_INITIALIZER } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\nimport { DualDateRangeStore } from './core/dual-date-range.store';\nimport { PresetRegistry } from './core/preset-registry';\nimport { BUILT_IN_PRESETS } from './core/built-in-presets';\nimport { CalendarGridCache, CalendarGrid, CalendarCell, RangeHighlighterCache, DecoratedCell, VirtualWeeksConfig, getVisibleWeeks, navigateWeekWindow, isVirtualWeeksEnabled } from './core/calendar-grid';\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 provide: APP_INITIALIZER,\n multi: true,\n useFactory: (registry: PresetRegistry) => {\n return () => {\n // Auto-register built-in presets\n BUILT_IN_PRESETS.forEach(preset => registry.register(preset));\n };\n },\n deps: [PresetRegistry]\n }\n ]\n})\nexport class DualDatepickerComponent implements OnInit, OnChanges, ControlValueAccessor {\n @Input() placeholder: string = 'Select date range';\n @Input() set startDate(value: string) {\n if (value) {\n const date = this.dateAdapter.parse(value);\n if (date) this.rangeStore.setStart(date);\n }\n }\n get startDate(): string {\n const date = this.rangeStore.startDate();\n return date ? this.formatDate(date) : '';\n }\n \n @Input() set endDate(value: string) {\n if (value) {\n const date = this.dateAdapter.parse(value);\n if (date) this.rangeStore.setEnd(date);\n }\n }\n get endDate(): string {\n const date = this.rangeStore.endDate();\n return date ? this.formatDate(date) : '';\n }\n @Input() showPresets: boolean = true;\n @Input() showClearButton: boolean = false;\n @Input() multiRange: boolean = false;\n @Input() closeOnSelection: boolean = true;\n @Input() closeOnPresetSelection: boolean = true;\n @Input() closeOnClickOutside: boolean = true;\n @Input() enableKeyboardNavigation: boolean = true;\n @Input() presets: PresetConfig[] = [];\n @Input() theme: ThemeType = 'default';\n @Input() inputBackgroundColor: string = '#fff';\n @Input() inputTextColor: string = '#495057';\n @Input() inputBorderColor: string = '#ced4da';\n @Input() inputBorderColorHover: string = '#ced4da';\n @Input() inputBorderColorFocus: string = '#80bdff';\n @Input() inputPadding: string = '0.375rem 0.75rem';\n @Input() locale: LocaleConfig = {};\n @Input() disabledDates: Date[] | ((date: Date) => boolean) | undefined;\n @Input() displayFormat: string = 'D MMM'; // Format for displaying dates in input\n @Input() requireApply: boolean = false; // Require Apply button confirmation\n @Input() enableTimePicker: boolean = false; // Enable time selection\n @Input() timeFormat: '12h' | '24h' = '24h'; // Time format\n @Input() minuteStep: number = 15; // Step for minute selector (1, 5, 15, 30)\n @Input() defaultStartTime: string = '00:00'; // Default start time HH:mm\n @Input() defaultEndTime: string = '23:59'; // Default end time HH:mm\n \n /**\n * Virtual Weeks Configuration (v3.9.0+)\n * \n * Enables windowed rendering to reduce DOM complexity and improve mobile performance.\n * Only renders a subset of calendar weeks instead of all 6.\n * \n * Example: `{ windowSize: 3 }` renders only 3 weeks (21 cells) instead of 6 weeks (42 cells),\n * reducing DOM nodes by ~50% per calendar.\n * \n * @default undefined (disabled - renders all 6 weeks for backward compatibility)\n * \n * Example:\n * ```html\n * <ngx-dual-datepicker\n * [virtualWeeks]=\"{ windowSize: 3 }\">\n * </ngx-dual-datepicker>\n * ```\n */\n @Input() virtualWeeks?: VirtualWeeksConfig;\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 // Calendar grid cache (v3.7.0+) - memoizes month grid generation\n private gridCache = inject(CalendarGridCache);\n \n // Range highlighter cache (v3.8.0+) - memoizes decorations\n private highlighterCache = inject(RangeHighlighterCache);\n \n // Headless store for date range state (v3.5.0+)\n protected readonly rangeStore = inject(DualDateRangeStore);\n\n // UI-only signals\n showDatePicker = signal(false);\n currentMonth = signal(this.dateAdapter.today());\n previousMonth = signal(this.dateAdapter.today());\n currentMonthDays = signal<any[]>([]);\n previousMonthDays = signal<any[]>([]);\n isDisabled = signal(false);\n showStartTimePicker = signal(false);\n showEndTimePicker = signal(false);\n hoverDate = signal<string | null>(null);\n \n /**\n * Virtual Weeks State (v3.9.0+)\n * \n * Signals to track which week window is currently visible for each calendar.\n * - weekStart = 0: Shows first N weeks (windowSize)\n * - weekStart = 1: Shows weeks 1 to N+1, etc.\n * \n * Reset to 0 when month changes for consistent UX.\n */\n previousMonthWeekStart = signal(0);\n currentMonthWeekStart = signal(0);\n \n /**\n * Computed: Visible weeks for windowed rendering (v3.9.0+)\n * \n * If virtualWeeks is enabled, returns only the visible subset of weeks.\n * Otherwise, returns all weeks for backward compatibility.\n * \n * Example: If windowSize=3 and weekStart=0, returns first 3 weeks (rows 0-2).\n */\n previousMonthVisibleDays = computed(() => {\n const allDays = this.previousMonthDays();\n if (!this.virtualWeeks || !isVirtualWeeksEnabled(this.virtualWeeks.windowSize, 6)) {\n return allDays;\n }\n \n // Calendar has 6 weeks (42 cells = 7 days × 6 weeks)\n const allWeeks: any[][] = [];\n for (let i = 0; i < 6; i++) {\n allWeeks.push(allDays.slice(i * 7, (i + 1) * 7));\n }\n \n const visibleWeeks = getVisibleWeeks(\n allWeeks,\n this.previousMonthWeekStart(),\n this.virtualWeeks.windowSize\n );\n \n return visibleWeeks.flat();\n });\n \n currentMonthVisibleDays = computed(() => {\n const allDays = this.currentMonthDays();\n if (!this.virtualWeeks || !isVirtualWeeksEnabled(this.virtualWeeks.windowSize, 6)) {\n return allDays;\n }\n \n // Calendar has 6 weeks (42 cells = 7 days × 6 weeks)\n const allWeeks: any[][] = [];\n for (let i = 0; i < 6; i++) {\n allWeeks.push(allDays.slice(i * 7, (i + 1) * 7));\n }\n \n const visibleWeeks = getVisibleWeeks(\n allWeeks,\n this.currentMonthWeekStart(),\n this.virtualWeeks.windowSize\n );\n \n return visibleWeeks.flat();\n });\n \n // Computed time properties from store\n get startHour(): number {\n const time = this.rangeStore.startTime();\n return this.parseTime(time).hour;\n }\n \n get startMinute(): number {\n const time = this.rangeStore.startTime();\n return this.parseTime(time).minute;\n }\n \n get endHour(): number {\n const time = this.rangeStore.endTime();\n return this.parseTime(time).hour;\n }\n \n get endMinute(): number {\n const time = this.rangeStore.endTime();\n return this.parseTime(time).minute;\n }\n \n private setStartHourMinute(hour: number, minute: number): void {\n const timeStr = this.formatTime(hour, minute);\n this.rangeStore.setStartTime(timeStr);\n }\n \n private setEndHourMinute(hour: number, minute: number): void {\n const timeStr = this.formatTime(hour, minute);\n this.rangeStore.setEndTime(timeStr);\n }\n \n // Multi-range support (UI-specific)\n selectedRanges = signal<DateRange[]>([]);\n currentRangeIndex = signal<number>(-1);\n\n // Keyboard navigation (UI-specific)\n focusedDay = signal<{ date: string; monthIndex: number } | null>(null);\n \n // Computed values\n currentMonthName = computed(() => this.getMonthName(this.currentMonth()));\n previousMonthName = computed(() => this.getMonthName(this.previousMonth()));\n weekDayNames = computed(() => this.getDayNames());\n \n // Computed from store\n dateRangeText = computed(() => this.rangeStore.rangeText());\n selectingStartDate = computed(() => this.rangeStore.selectingStart());\n hasPendingChanges = computed(() => this.rangeStore.hasPendingChanges());\n \n // Computed for template access to pending dates (requireApply mode)\n get pendingStartDate(): string {\n // In requireApply mode, store keeps pending values\n // For now, use actual store values as pending (store handles this)\n if (!this.requireApply) return '';\n const date = this.rangeStore.startDate();\n return date && this.hasPendingChanges() ? this.formatDate(date) : '';\n }\n \n get pendingEndDate(): string {\n if (!this.requireApply) return '';\n const date = this.rangeStore.endDate();\n return date && this.hasPendingChanges() ? this.formatDate(date) : '';\n }\n\n private readonly defaultMonthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n private readonly defaultMonthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n private readonly defaultDayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n private readonly defaultDayNamesShort = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\n // ControlValueAccessor callbacks\n private onChange: (value: DateRange | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(private elementRef: ElementRef) {\n // Effect to emit changes when dates change in store\n effect(() => {\n const range = this.rangeStore.range();\n if (range.start || range.end) {\n this.onChange(this.getDateRangeValue());\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (this.showDatePicker() && this.closeOnClickOutside) {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.closeDatePicker();\n }\n }\n }\n\n @HostListener('keydown', ['$event'])\n handleKeyboardNavigation(event: KeyboardEvent): void {\n if (!this.enableKeyboardNavigation) {\n return;\n }\n\n if (!this.showDatePicker()) {\n // When picker is closed, allow Enter/Space to open it\n if (event.key === 'Enter' || event.key === ' ') {\n const target = event.target as HTMLElement;\n if (target.classList.contains('datepicker-input')) {\n event.preventDefault();\n this.toggleDatePicker();\n }\n }\n return;\n }\n\n // When picker is open\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closeDatePicker();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.moveFocusVertical(-1);\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.moveFocusVertical(1);\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.moveFocusHorizontal(-1);\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n this.moveFocusHorizontal(1);\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.selectFocusedDay();\n break;\n\n case 'Home':\n event.preventDefault();\n this.moveFocusToFirstDay();\n break;\n\n case 'End':\n event.preventDefault();\n this.moveFocusToLastDay();\n break;\n\n case 'PageUp':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(-1);\n } else {\n this.changeMonth(-1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n\n case 'PageDown':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(1);\n } else {\n this.changeMonth(1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n }\n }\n\n // Keyboard navigation methods\n private initializeFocus(): void {\n // Set initial focus to start date, end date, or first available day\n if (this.startDate) {\n const inPrevMonth = this.isDateInMonth(this.startDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.startDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.startDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // startDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else if (this.endDate) {\n const inPrevMonth = this.isDateInMonth(this.endDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.endDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.endDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // endDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else {\n // Focus on today if visible, otherwise first day of current month\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n // Today is not in current month, focus on first day of current month\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n }\n\n private isDateInMonth(dateStr: string, monthDate: Date): boolean {\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return false;\n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const monthYear = this.dateAdapter.getYear(monthDate);\n const monthMonth = this.dateAdapter.getMonth(monthDate);\n return year === monthYear && month === monthMonth;\n }\n\n private moveFocusHorizontal(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction);\n const newDateStr = this.formatDate(newDate);\n\n // Determine which month the new date belongs to\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Date is outside visible months, navigate month\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusVertical(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction * 7); // Move by week\n const newDateStr = this.formatDate(newDate);\n\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Navigate to month containing the new date\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusToFirstDay(): void {\n const prevMonthDays = this.previousMonthDays();\n const firstDay = prevMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 0 });\n }\n }\n\n private moveFocusToLastDay(): void {\n const currMonthDays = this.currentMonthDays();\n const validDays = currMonthDays.filter(day => day.isCurrentMonth);\n const lastDay = validDays[validDays.length - 1];\n if (lastDay) {\n this.focusedDay.set({ date: lastDay.date, monthIndex: 1 });\n }\n }\n\n private moveFocusYear(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const currentYear = this.dateAdapter.getYear(currentDate);\n const currentMonth = this.dateAdapter.getMonth(currentDate);\n const currentDay = this.dateAdapter.getDate(currentDate);\n \n const newDate = this.dateAdapter.createDate(currentYear + direction, currentMonth, currentDay);\n const newDateStr = this.formatDate(newDate);\n\n // Update months to show the new year\n this.currentMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth, 1));\n this.previousMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth - 1, 1));\n this.generateCalendars();\n\n const inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n }\n\n private adjustFocusAfterMonthChange(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const inPrevMonth = this.isDateInMonth(focused.date, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(focused.date, this.currentMonth());\n\n if (!inPrevMonth && !inCurrMonth) {\n // Focused day is no longer visible, move to equivalent day in visible months\n this.initializeFocus();\n } else {\n // Update month index if needed\n this.focusedDay.set({\n date: focused.date,\n monthIndex: inPrevMonth ? 0 : 1\n });\n }\n }\n\n private selectFocusedDay(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const monthDays = focused.monthIndex === 0 ? this.previousMonthDays() : this.currentMonthDays();\n const dayObj = monthDays.find(day => day.date === focused.date && day.isCurrentMonth);\n \n if (dayObj) {\n this.selectDay(dayObj);\n }\n }\n\n hasKeyboardFocus(date: string, monthIndex: number): boolean {\n const focused = this.focusedDay();\n return focused !== null && focused.date === date && focused.monthIndex === monthIndex;\n }\n\n ngOnInit(): void {\n // Configure the headless store\n this.rangeStore.configure({\n enableTimePicker: this.enableTimePicker,\n defaultStartTime: this.defaultStartTime,\n defaultEndTime: this.defaultEndTime,\n disabledDates: this.disabledDates\n });\n \n // Initialize dates in store if provided\n if (this.startDate) {\n const date = this.dateAdapter.parse(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (this.endDate) {\n const date = this.dateAdapter.parse(this.endDate);\n if (date) this.rangeStore.setEnd(date);\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['startDate'] || changes['endDate']) {\n // Sync with store\n if (changes['startDate'] && this.startDate) {\n const date = this.dateAdapter.parse(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (changes['endDate'] && this.endDate) {\n const date = this.dateAdapter.parse(this.endDate);\n if (date) this.rangeStore.setEnd(date);\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n }\n \n // Update store configuration if relevant inputs change\n if (changes['enableTimePicker'] || changes['defaultStartTime'] || \n changes['defaultEndTime'] || changes['disabledDates']) {\n this.rangeStore.configure({\n enableTimePicker: this.enableTimePicker,\n defaultStartTime: this.defaultStartTime,\n defaultEndTime: this.defaultEndTime,\n disabledDates: this.disabledDates\n });\n }\n }\n\n formatDate(date: Date): string {\n const year = this.dateAdapter.getYear(date);\n const month = String(this.dateAdapter.getMonth(date) + 1).padStart(2, '0');\n const day = String(this.dateAdapter.getDate(date)).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n formatDateDisplay(dateStr: string): string {\n if (!dateStr) return '';\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return '';\n \n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const day = this.dateAdapter.getDate(date);\n \n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n const monthNamesShort = this.locale.monthNamesShort || this.defaultMonthNamesShort;\n \n // Replace format tokens with values\n let formatted = this.displayFormat;\n \n // Year tokens\n formatted = formatted.replace(/YYYY/g, String(year));\n formatted = formatted.replace(/YY/g, String(year).slice(-2));\n \n // Month tokens (order matters: MMMM before MMM before MM before M)\n formatted = formatted.replace(/MMMM/g, monthNames[month]);\n formatted = formatted.replace(/MMM/g, monthNamesShort[month]);\n formatted = formatted.replace(/MM/g, String(month + 1).padStart(2, '0'));\n formatted = formatted.replace(/M/g, String(month + 1));\n \n // Day tokens (order matters: DD before D)\n formatted = formatted.replace(/DD/g, String(day).padStart(2, '0'));\n formatted = formatted.replace(/D/g, String(day));\n \n return formatted;\n }\n\n // Note: updateDateRangeText is now handled by computed dateRangeText from store\n // Keeping this method for backward compatibility but it's a no-op\n updateDateRangeText(): void {\n // Text is now automatically computed from store.rangeText()\n }\n\n toggleDatePicker(): void {\n this.showDatePicker.update(value => !value);\n if (this.showDatePicker()) {\n // selectingStart is managed by store, no need to set here\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const previousMonthDate = this.dateAdapter.createDate(year, month - 1, 1);\n this.previousMonth.set(previousMonthDate);\n this.generateCalendars();\n // Initialize keyboard focus only if keyboard navigation is enabled\n if (this.enableKeyboardNavigation) {\n this.initializeFocus();\n }\n } else {\n // Clear focus when closing\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n }\n this.onTouched();\n }\n\n closeDatePicker(): void {\n this.showDatePicker.set(false);\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n this.onTouched();\n }\n\n generateCalendars(): void {\n this.previousMonthDays.set(this.generateMonthCalendar(this.previousMonth()));\n this.currentMonthDays.set(this.generateMonthCalendar(this.currentMonth()));\n \n // Reset virtual week windows when month changes (v3.9.0+)\n // Always start at first week for consistent UX\n if (this.virtualWeeks) {\n this.previousMonthWeekStart.set(0);\n this.currentMonthWeekStart.set(0);\n }\n }\n\n /**\n * Generate calendar grid with decorations (v3.8.0+)\n * \n * Uses CalendarGridCache for base grid structure (memoized by month),\n * then uses RangeHighlighterCache for decorations (memoized by range/constraints).\n * \n * Performance:\n * - Grid structure: Cached by month (same month = same grid object)\n * - Decorations: Cached by range+hover+disabled (same state = same decorated grid)\n * - Result: ~95% cache hit rate in typical usage\n * \n * Cache keys:\n * - Grid: `${year}-${month}-${weekStart}`\n * - Decorations: `${monthKey}|${start}|${end}|${hover}|${disabled}`\n */\n generateMonthCalendar(date: Date): any[] {\n // Get base grid from cache (weekStart = 0 for Sunday, no locale for now)\n const grid: CalendarGrid = this.gridCache.get(date, 0);\n \n // Get dates from store\n const startDate = this.rangeStore.startDate();\n const endDate = this.rangeStore.endDate();\n const hoverISO = this.hoverDate();\n \n // Get decorated grid from cache (handles all decoration logic)\n const decorated = this.highlighterCache.get(grid, {\n start: startDate,\n end: endDate,\n hoverDate: hoverISO,\n disabledDates: this.disabledDates,\n multiRange: this.multiRange,\n selectingStartDate: this.selectingStartDate()\n // minDate/maxDate omitted for now (not in current API)\n });\n \n // Map decorated cells to legacy format (for backward compatibility)\n const monthDays = decorated.cells.map((cell: DecoratedCell) => {\n if (!cell.inCurrentMonth) {\n // Padding cell (previous/next month)\n return { day: null, isCurrentMonth: false };\n }\n \n // Current month cell - use cached decorations\n return {\n day: cell.day,\n date: cell.iso,\n isCurrentMonth: true,\n isStart: cell.isSelectedStart,\n isEnd: cell.isSelectedEnd,\n inRange: cell.isInRange,\n inHoverRange: cell.isInHoverRange,\n isDisabled: cell.isDisabled\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 /**\n * Virtual Weeks Navigation (v3.9.0+)\n * \n * Navigate the visible week window up/down for windowed rendering.\n * \n * @param monthIndex 0 = previous month, 1 = current month\n * @param direction -1 = scroll up (previous weeks), +1 = scroll down (next weeks)\n * \n * Example: If windowSize=3 and weekStart=0, navigateWeeks(0, +1) shows weeks 1-3.\n */\n navigateWeeks(monthIndex: number, direction: number): void {\n if (!this.virtualWeeks) return;\n \n const totalWeeks = 6; // Standard calendar grid has 6 weeks\n const currentStart = monthIndex === 0 \n ? this.previousMonthWeekStart() \n : this.currentMonthWeekStart();\n \n const newStart = navigateWeekWindow(\n currentStart,\n direction,\n totalWeeks,\n this.virtualWeeks.windowSize\n );\n \n if (monthIndex === 0) {\n this.previousMonthWeekStart.set(newStart);\n } else {\n this.currentMonthWeekStart.set(newStart);\n }\n }\n\n /**\n * Check if week navigation is available (v3.9.0+)\n * \n * @param monthIndex 0 = previous month, 1 = current month\n * @param direction -1 = up (can scroll to previous weeks?), +1 = down (can scroll to next weeks?)\n * @returns true if navigation is available in that direction\n */\n canNavigateWeeks(monthIndex: number, direction: number): boolean {\n if (!this.virtualWeeks) return false;\n \n const totalWeeks = 6;\n const currentStart = monthIndex === 0 \n ? this.previousMonthWeekStart() \n : this.currentMonthWeekStart();\n \n if (direction < 0) {\n // Can scroll up if not at start\n return currentStart > 0;\n } else {\n // Can scroll down if window doesn't extend past end\n return currentStart + this.virtualWeeks.windowSize < totalWeeks;\n }\n }\n\n isDateDisabled(date: Date): boolean {\n if (!this.disabledDates) return false;\n\n if (typeof this.disabledDates === 'function') {\n // If it's a function, call it with the date\n return this.disabledDates(date);\n } else if (Array.isArray(this.disabledDates)) {\n // If it's an array, check if the date matches any disabled date\n return this.disabledDates.some(disabledDate => {\n return this.dateAdapter.getYear(date) === this.dateAdapter.getYear(disabledDate) &&\n this.dateAdapter.getMonth(date) === this.dateAdapter.getMonth(disabledDate) &&\n this.dateAdapter.getDate(date) === this.dateAdapter.getDate(disabledDate);\n });\n }\n \n return false;\n }\n\n isInHoverRange(dateStr: string): boolean {\n const hover = this.hoverDate();\n if (!hover) return false;\n\n // In multiRange mode, only show hover preview when selecting end date\n if (this.multiRange) {\n if (this.selectingStartDate()) return false;\n const currentStart = this.startDate;\n if (!currentStart) return false;\n const minDate = currentStart < hover ? currentStart : hover;\n const maxDate = currentStart > hover ? currentStart : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // In single range mode \n if (this.selectingStartDate()) return false;\n \n if (this.requireApply) {\n // Use pending dates from store\n const pendingStart = this.rangeStore.startDate();\n if (!pendingStart) return false;\n const pendingStartStr = this.formatDate(pendingStart);\n const minDate = pendingStartStr < hover ? pendingStartStr : hover;\n const maxDate = pendingStartStr > hover ? pendingStartStr : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // Use actual dates\n const currentStart = this.startDate;\n if (!currentStart) return false;\n const minDate = currentStart < hover ? currentStart : hover;\n const maxDate = currentStart > hover ? currentStart : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n }\n }\n }\n\n onDayHover(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) {\n this.hoverDate.set(null);\n return;\n }\n this.hoverDate.set(dayObj.date);\n this.generateCalendars();\n }\n\n clearDayHover(): void {\n this.hoverDate.set(null);\n this.generateCalendars();\n }\n\n selectDay(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) return;\n \n const selectedDate = this.dateAdapter.parse(dayObj.date);\n if (!selectedDate) return;\n\n if (this.multiRange) {\n // Multi-range mode: add ranges to array\n if (this.selectingStartDate()) {\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(null);\n } else {\n const currentStart = this.rangeStore.startDate();\n if (currentStart && selectedDate < currentStart) {\n // Swap: selected becomes start, current start becomes end\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(currentStart);\n } else {\n this.rangeStore.setEnd(selectedDate);\n }\n \n // Add the new range to the array\n const range = this.rangeStore.range();\n const newRange: DateRange = {\n startDate: range.start,\n endDate: range.end,\n rangeText: this.formatDateDisplay(range.start) + ' – ' + this.formatDateDisplay(range.end),\n ...(this.enableTimePicker && { startTime: range.startTime, endTime: range.endTime })\n };\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.push(newRange);\n this.selectedRanges.set(currentRanges);\n \n // Reset for next range selection\n this.rangeStore.reset();\n \n // Update display text\n this.updateMultiRangeText();\n \n // Don't close if multiRange, allow adding more ranges\n if (this.closeOnSelection && !this.multiRange) {\n this.showDatePicker.set(false);\n }\n \n this.emitMultiChange();\n this.emitMultiSelection();\n }\n this.generateCalendars();\n } else {\n // Single range mode\n if (this.requireApply) {\n // Apply mode: use pending dates, don't emit until Apply is clicked\n if (this.selectingStartDate()) {\n this.rangeStore.setPendingStart(selectedDate);\n this.rangeStore.setPendingEnd(null);\n } else {\n const pendingStart = this.rangeStore.startDate();\n if (pendingStart && selectedDate < pendingStart) {\n // Swap\n this.rangeStore.setPendingStart(selectedDate);\n this.rangeStore.setPendingEnd(pendingStart);\n } else {\n this.rangeStore.setPendingEnd(selectedDate);\n }\n }\n this.generateCalendars();\n } else {\n // Immediate mode: emit changes immediately\n if (this.selectingStartDate()) {\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(null);\n this.emitChange();\n } else {\n const currentStart = this.rangeStore.startDate();\n if (currentStart && selectedDate < currentStart) {\n // Swap\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(currentStart);\n } else {\n this.rangeStore.setEnd(selectedDate);\n }\n \n if (this.closeOnSelection) {\n this.showDatePicker.set(false);\n }\n this.emitChange();\n this.emitSelection();\n }\n this.generateCalendars();\n }\n }\n }\n\n applySelection(): void {\n if (!this.hasPendingChanges()) return;\n \n // Apply pending dates through store\n this.rangeStore.applyPending();\n \n // Emit changes\n this.emitChange();\n this.emitSelection();\n \n // Close picker\n this.showDatePicker.set(false);\n }\n\n cancelSelection(): void {\n // Discard pending changes through store\n this.rangeStore.cancelPending();\n \n // Regenerate calendars to clear pending visual state\n this.generateCalendars();\n }\n\n changeMonth(direction: number): void {\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const newCurrentMonth = this.dateAdapter.createDate(year, month + direction, 1);\n this.currentMonth.set(newCurrentMonth);\n \n const newYear = this.dateAdapter.getYear(newCurrentMonth);\n const newMonth = this.dateAdapter.getMonth(newCurrentMonth);\n const newPreviousMonth = this.dateAdapter.createDate(newYear, newMonth - 1, 1);\n this.previousMonth.set(newPreviousMonth);\n this.generateCalendars();\n }\n\n getMonthName(date: Date): string {\n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n return `${monthNames[this.dateAdapter.getMonth(date)]} ${this.dateAdapter.getYear(date)}`;\n }\n\n getDayNames(): string[] {\n return this.locale.dayNamesShort || this.defaultDayNamesShort;\n }\n\n selectPresetRange(preset: PresetConfig): void {\n if (!preset.getValue) {\n console.error('PresetConfig must have getValue() function');\n return;\n }\n\n const range = preset.getValue();\n const startDate = this.dateAdapter.parse(range.start);\n const endDate = this.dateAdapter.parse(range.end);\n \n if (startDate && endDate) {\n this.rangeStore.setRange(startDate, endDate);\n }\n \n this.generateCalendars();\n if (this.closeOnPresetSelection) {\n this.showDatePicker.set(false);\n }\n this.emitSelection();\n }\n\n clear(): void {\n this.rangeStore.reset();\n this.showDatePicker.set(false);\n \n if (this.multiRange) {\n this.selectedRanges.set([]);\n this.currentRangeIndex.set(-1);\n this.emitMultiChange();\n } else {\n this.emitChange();\n }\n \n this.onTouched();\n this.generateCalendars();\n }\n \n removeRange(index: number): void {\n if (!this.multiRange) return;\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.splice(index, 1);\n this.selectedRanges.set(currentRanges);\n \n this.updateMultiRangeText();\n this.emitMultiChange();\n this.emitMultiSelection();\n this.generateCalendars();\n }\n \n private updateMultiRangeText(): void {\n const count = this.selectedRanges().length;\n // Note: dateRangeText is now computed from store, this is for multi-range UI only\n // We could store this in a separate signal if needed, but for now just track ranges count\n }\n\n private emitChange(): void {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n this.dateRangeChange.emit(range);\n }\n\n private emitSelection(): void {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n this.dateRangeSelected.emit(range);\n }\n \n private emitMultiChange(): void {\n this.multiDateRangeChange.emit({\n ranges: this.selectedRanges()\n });\n }\n \n private emitMultiSelection(): void {\n this.multiDateRangeSelected.emit({\n ranges: this.selectedRanges()\n });\n }\n\n private getDateRangeValue(): DateRange {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n return range;\n }\n\n // Time Picker Methods\n toggleStartTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showStartTimePicker.set(!this.showStartTimePicker());\n this.showEndTimePicker.set(false);\n }\n\n toggleEndTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showEndTimePicker.set(!this.showEndTimePicker());\n this.showStartTimePicker.set(false);\n }\n\n incrementStartHour(): void {\n const newHour = (this.startHour + 1) % 24;\n this.setStartHourMinute(newHour, this.startMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementStartHour(): void {\n const newHour = this.startHour === 0 ? 23 : this.startHour - 1;\n this.setStartHourMinute(newHour, this.startMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementStartMinute(): void {\n const newMinute = (this.startMinute + this.minuteStep) % 60;\n this.setStartHourMinute(this.startHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementStartMinute(): void {\n let newMinute = this.startMinute - this.minuteStep;\n if (newMinute < 0) {\n newMinute = 60 - this.minuteStep;\n }\n this.setStartHourMinute(this.startHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementEndHour(): void {\n const newHour = (this.endHour + 1) % 24;\n this.setEndHourMinute(newHour, this.endMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementEndHour(): void {\n const newHour = this.endHour === 0 ? 23 : this.endHour - 1;\n this.setEndHourMinute(newHour, this.endMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementEndMinute(): void {\n const newMinute = (this.endMinute + this.minuteStep) % 60;\n this.setEndHourMinute(this.endHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementEndMinute(): void {\n let newMinute = this.endMinute - this.minuteStep;\n if (newMinute < 0) {\n newMinute = 60 - this.minuteStep;\n }\n this.setEndHourMinute(this.endHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n formatTime(hour: number, minute: number): string {\n const h = hour.toString().padStart(2, '0');\n const m = minute.toString().padStart(2, '0');\n \n if (this.timeFormat === '12h') {\n const isPM = hour >= 12;\n const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const period = isPM ? 'PM' : 'AM';\n return `${hour12.toString().padStart(2, '0')}:${m} ${period}`;\n }\n \n return `${h}:${m}`;\n }\n\n parseTime(timeString: string): { hour: number; minute: number } {\n if (!timeString) return { hour: 0, minute: 0 };\n \n const time12hRegex = /^(\\d{1,2}):(\\d{2})\\s?(AM|PM)$/i;\n const time24hRegex = /^(\\d{1,2}):(\\d{2})$/;\n \n let match = timeString.match(time12hRegex);\n if (match) {\n let hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3].toUpperCase();\n \n if (period === 'PM' && hour !== 12) hour += 12;\n if (period === 'AM' && hour === 12) hour = 0;\n \n return { hour, minute };\n }\n \n match = timeString.match(time24hRegex);\n if (match) {\n return {\n hour: parseInt(match[1], 10),\n minute: parseInt(match[2], 10)\n };\n }\n \n return { hour: 0, minute: 0 };\n }\n\n // ControlValueAccessor implementation\n writeValue(value: DateRange | null): void {\n if (value) {\n // Use setters which delegate to store\n this.startDate = value.startDate || '';\n this.endDate = value.endDate || '';\n \n if (this.enableTimePicker) {\n if (value.startTime) {\n this.rangeStore.setStartTime(value.startTime);\n }\n if (value.endTime) {\n this.rangeStore.setEndTime(value.endTime);\n }\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n } else {\n this.rangeStore.reset();\n }\n }\n\n registerOnChange(fn: (value: DateRange | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthVisibleDays(); 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 currentMonthVisibleDays(); 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 * Provider Functions for Built-in Presets\n * \n * Version: 3.6.0\n * \n * Automatic registration of built-in date range presets.\n * These providers ensure backward compatibility by auto-registering\n * all standard presets (TODAY, LAST_7_DAYS, THIS_MONTH, etc.)\n * \n * USAGE IN LIBRARY (Internal):\n * Built-in presets are registered automatically via Angular providers.\n * Library consumers don't need to do anything.\n * \n * USAGE IN APP (Custom Presets):\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * // ... other providers\n * provideCustomPresets([\n * {\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * // ... fiscal logic\n * return { start, end };\n * }\n * }\n * ])\n * ]\n * };\n * ```\n */\n\nimport { APP_INITIALIZER, EnvironmentProviders, makeEnvironmentProviders, inject } from '@angular/core';\nimport { PresetRegistry } from './preset-registry';\nimport { BUILT_IN_PRESETS } from './built-in-presets';\nimport { RangePresetPlugin } from './range-preset.plugin';\n\n/**\n * Initializer function that registers built-in presets\n * \n * Runs at application startup (APP_INITIALIZER)\n * \n * @param registry - PresetRegistry instance\n * @returns Initialization function\n */\nfunction initializeBuiltInPresets(registry: PresetRegistry): () => void {\n return () => {\n // Register all built-in presets\n BUILT_IN_PRESETS.forEach(preset => {\n registry.register(preset);\n });\n\n // Log registration for debugging (can be removed in production)\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(\n `[ng-dual-datepicker] Registered ${BUILT_IN_PRESETS.length} built-in presets:`,\n BUILT_IN_PRESETS.map(p => p.key).join(', ')\n );\n }\n };\n}\n\n/**\n * Provide built-in date range presets\n * \n * This provider is automatically included in the library's root providers.\n * Library consumers don't need to add this manually.\n * \n * @returns EnvironmentProviders for built-in presets\n * \n * @internal\n */\nexport function provideBuiltInPresets(): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: initializeBuiltInPresets,\n deps: [PresetRegistry]\n }\n ]);\n}\n\n/**\n * Provide custom date range presets\n * \n * Use this to register your own industry-specific presets:\n * - Fiscal presets\n * - Hotel/hospitality presets\n * - Logistics presets\n * - Custom business logic\n * \n * @param presets - Array of custom RangePresetPlugin implementations\n * @returns EnvironmentProviders for custom presets\n * \n * @example\n * ```typescript\n * // Fiscal presets\n * const FISCAL_PRESETS: RangePresetPlugin[] = [\n * {\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const month = adapter.getMonth(now);\n * \n * // Fiscal year starts April (month 3)\n * const fiscalMonth = (month + 9) % 12;\n * const quarterStart = Math.floor(fiscalMonth / 3) * 3;\n * const calendarMonth = (quarterStart - 9 + 12) % 12;\n * \n * const year = adapter.getYear(now);\n * const fiscalYear = month < 3 ? year - 1 : year;\n * \n * const start = new Date(fiscalYear, calendarMonth, 1);\n * const end = new Date(fiscalYear, calendarMonth + 3, 0);\n * \n * return {\n * start: adapter.normalize(start),\n * end: adapter.normalize(end)\n * };\n * }\n * },\n * {\n * key: 'FISCAL_YEAR_TO_DATE',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const month = adapter.getMonth(now);\n * const year = adapter.getYear(now);\n * \n * // Fiscal year starts April 1\n * const fiscalYearStart = month >= 3 \n * ? new Date(year, 3, 1)\n * : new Date(year - 1, 3, 1);\n * \n * return {\n * start: adapter.normalize(fiscalYearStart),\n * end: adapter.normalize(now)\n * };\n * }\n * }\n * ];\n * \n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideCustomPresets(FISCAL_PRESETS)\n * ]\n * };\n * \n * // Use in components\n * store.applyPreset('THIS_FISCAL_QUARTER');\n * store.applyPreset('FISCAL_YEAR_TO_DATE');\n * ```\n * \n * @example\n * ```typescript\n * // Hotel presets\n * const HOTEL_PRESETS: RangePresetPlugin[] = [\n * {\n * key: 'CHECK_IN_WEEK',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const dayOfWeek = adapter.getDayOfWeek(now);\n * \n * // Check-in week: Friday to Friday\n * const daysToNextFriday = dayOfWeek <= 5 \n * ? 5 - dayOfWeek \n * : 7 - dayOfWeek + 5;\n * \n * const nextFriday = adapter.addDays(now, daysToNextFriday);\n * const followingFriday = adapter.addDays(nextFriday, 7);\n * \n * return { start: nextFriday, end: followingFriday };\n * }\n * },\n * {\n * key: 'NEXT_30_NIGHTS',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const tomorrow = adapter.addDays(now, 1);\n * const end = adapter.addDays(tomorrow, 30);\n * return { start: tomorrow, end };\n * }\n * }\n * ];\n * \n * providers: [provideCustomPresets(HOTEL_PRESETS)]\n * ```\n */\nexport function provideCustomPresets(presets: RangePresetPlugin[]): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (registry: PresetRegistry) => {\n return () => {\n presets.forEach(preset => {\n registry.register(preset);\n });\n\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(\n `[ng-dual-datepicker] Registered ${presets.length} custom presets:`,\n presets.map(p => p.key).join(', ')\n );\n }\n };\n },\n deps: [PresetRegistry]\n }\n ]);\n}\n\n/**\n * Provide preset package\n * \n * Convenience function for external preset packages.\n * \n * @param packageName - Name of the preset package (for logging)\n * @param presets - Array of presets from the package\n * @returns EnvironmentProviders\n * \n * @example\n * ```typescript\n * // @acme/fiscal-presets package\n * export function provideFiscalPresets(): EnvironmentProviders {\n * return providePresetPackage('@acme/fiscal-presets', FISCAL_PRESETS);\n * }\n * \n * // In app\n * import { provideFiscalPresets } from '@acme/fiscal-presets';\n * \n * providers: [provideFiscalPresets()]\n * ```\n */\nexport function providePresetPackage(\n packageName: string,\n presets: RangePresetPlugin[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (registry: PresetRegistry) => {\n return () => {\n presets.forEach(preset => {\n registry.register(preset);\n });\n\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(\n `[${packageName}] Registered ${presets.length} presets:`,\n presets.map(p => p.key).join(', ')\n );\n }\n };\n },\n deps: [PresetRegistry]\n }\n ]);\n}\n","/**\n * Core headless date range logic\n * \n * v3.6.0: Plugin Architecture\n * - RangePresetPlugin interface for extensible presets\n * - PresetRegistry for plugin management\n * - Built-in presets as plugins\n * - Provider functions for custom presets\n * \n * v3.7.0: Calendar Grid Cache\n * - CalendarGridFactory for deterministic grid generation\n * - CalendarGridCache with LRU memoization\n * - Separates grid structure from decorations for performance\n * \n * v3.8.0: Range Highlight Cache\n * - RangeHighlighter for decoration logic (pure computation)\n * - RangeHighlighterCache with LRU (48 grids)\n * - Eliminates redundant decoration recomputations\n * \n * Import from here for clean barrel exports\n */\n\nexport * from './dual-date-range.store';\nexport * from './preset.engine';\nexport * from './range.validator';\nexport * from './date-clock';\nexport * from './system-clock';\nexport * from './date-adapter';\nexport * from './native-date-adapter';\n\n// v3.6.0: Plugin System\nexport * from './range-preset.plugin';\nexport * from './preset-registry';\nexport * from './built-in-presets';\nexport * from './preset-providers';\n\n// v3.7.0: Calendar Grid Cache\n// v3.8.0: Range Highlight Cache\nexport * from './calendar-grid';\n","/**\n * Public API Surface of @oneluiz/dual-datepicker\n */\n\nexport { DualDatepickerComponent } from './dual-datepicker.component';\nexport type { DateRange, MultiDateRange, PresetConfig, PresetRange, LocaleConfig, ThemeType } from './dual-datepicker.component';\n\n// Date Adapter System\nexport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nexport { NativeDateAdapter } from './native-date-adapter';\n\n// Preset Utilities (deprecated - use core/preset.engine instead)\nexport * from './preset-utils';\n\n// NEW v3.5.0: Headless Core - Use without UI\n// Perfect for SSR, global state, dashboard filters\nexport * from './core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DATE_ADAPTER","NativeDateAdapter","i1.CalendarGridFactory"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oneluiz-dual-datepicker.mjs","sources":["../../src/date-adapter.ts","../../src/native-date-adapter.ts","../../src/core/range.validator.ts","../../src/core/date-clock.ts","../../src/core/system-clock.ts","../../src/core/date-adapter.ts","../../src/core/native-date-adapter.ts","../../src/core/range-preset.plugin.ts","../../src/core/preset-registry.ts","../../src/core/preset.engine.ts","../../src/core/dual-date-range.store.ts","../../src/core/built-in-presets.ts","../../src/core/calendar-grid/calendar-grid.types.ts","../../src/core/calendar-grid/calendar-grid.factory.ts","../../src/core/calendar-grid/cache.config.ts","../../src/core/calendar-grid/calendar-grid.cache.ts","../../src/core/calendar-grid/range-highlighter.types.ts","../../src/core/calendar-grid/range-highlighter.ts","../../src/core/calendar-grid/range-highlighter.cache.ts","../../src/core/calendar-grid/virtual-weeks.types.ts","../../src/core/calendar-grid/virtual-weeks.logic.ts","../../src/core/calendar-grid/index.ts","../../src/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/preset-utils.ts","../../src/core/preset-providers.ts","../../src/core/index.ts","../../src/public-api.ts","../../src/oneluiz-dual-datepicker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Abstract class for date adapters.\n * Allows the component to work with different date libraries (Date, DayJS, date-fns, Luxon, etc.)\n */\nexport abstract class DateAdapter<T = any> {\n /**\n * Parses a value into a date object\n * @param value - Value to parse (string, number, or date object)\n * @returns Parsed date object\n */\n abstract parse(value: any): T | null;\n\n /**\n * Formats a date object into a string\n * @param date - Date object to format\n * @param format - Optional format string\n * @returns Formatted date string\n */\n abstract format(date: T, format?: string): string;\n\n /**\n * Adds days to a date\n * @param date - Date object\n * @param days - Number of days to add (can be negative)\n * @returns New date object\n */\n abstract addDays(date: T, days: number): T;\n\n /**\n * Adds months to a date\n * @param date - Date object\n * @param months - Number of months to add (can be negative)\n * @returns New date object\n */\n abstract addMonths(date: T, months: number): T;\n\n /**\n * Gets the year from a date\n * @param date - Date object\n * @returns Year number\n */\n abstract getYear(date: T): number;\n\n /**\n * Gets the month from a date (0-11)\n * @param date - Date object\n * @returns Month number (0-11)\n */\n abstract getMonth(date: T): number;\n\n /**\n * Gets the day of month from a date\n * @param date - Date object\n * @returns Day of month (1-31)\n */\n abstract getDate(date: T): number;\n\n /**\n * Gets the day of week from a date (0-6, Sunday = 0)\n * @param date - Date object\n * @returns Day of week (0-6)\n */\n abstract getDay(date: T): number;\n\n /**\n * Creates a new date object\n * @param year - Year\n * @param month - Month (0-11)\n * @param date - Day of month (1-31)\n * @returns New date object\n */\n abstract createDate(year: number, month: number, date: number): T;\n\n /**\n * Gets today's date\n * @returns Today's date object\n */\n abstract today(): T;\n\n /**\n * Checks if two dates are the same day\n * @param a - First date\n * @param b - Second date\n * @returns True if same day\n */\n abstract isSameDay(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is before another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is before b\n */\n abstract isBefore(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is after another\n * @param a - First date\n * @param b - Second date\n * @returns True if a is after b\n */\n abstract isAfter(a: T | null, b: T | null): boolean;\n\n /**\n * Checks if a date is between two other dates\n * @param date - Date to check\n * @param start - Start date\n * @param end - End date\n * @returns True if date is between start and end\n */\n abstract isBetween(date: T | null, start: T | null, end: T | null): boolean;\n\n /**\n * Clones a date object\n * @param date - Date to clone\n * @returns Cloned date object\n */\n abstract clone(date: T): T;\n\n /**\n * Checks if a value is a valid date\n * @param date - Value to check\n * @returns True if valid date\n */\n abstract isValid(date: any): boolean;\n}\n\n/**\n * Injection token for DateAdapter\n */\nexport const DATE_ADAPTER = new InjectionToken<DateAdapter>('DATE_ADAPTER');\n","import { Injectable } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\n\n/**\n * Date adapter implementation for native JavaScript Date objects\n * This is the default adapter used by the component\n */\n@Injectable()\nexport class NativeDateAdapter extends DateAdapter<Date> {\n parse(value: any): Date | null {\n if (!value) return null;\n \n if (value instanceof Date) {\n return new Date(value);\n }\n \n if (typeof value === 'string' || typeof value === 'number') {\n // Fix timezone issues: parse YYYY-MM-DD as local date, not UTC\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, month - 1, day);\n }\n \n const date = new Date(value);\n return this.isValid(date) ? date : null;\n }\n \n return null;\n }\n\n format(date: Date, format: string = 'YYYY-MM-DD'): string {\n if (!this.isValid(date)) return '';\n \n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n \n // Simple format implementation\n switch (format) {\n case 'YYYY-MM-DD':\n return `${year}-${month}-${day}`;\n case 'MM/DD/YYYY':\n return `${month}/${day}/${year}`;\n case 'DD/MM/YYYY':\n return `${day}/${month}/${year}`;\n default:\n return `${year}-${month}-${day}`;\n }\n }\n\n addDays(date: Date, days: number): Date {\n const result = this.clone(date);\n result.setDate(result.getDate() + days);\n return result;\n }\n\n addMonths(date: Date, months: number): Date {\n const result = this.clone(date);\n result.setMonth(result.getMonth() + months);\n return result;\n }\n\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n getDate(date: Date): number {\n return date.getDate();\n }\n\n getDay(date: Date): number {\n return date.getDay();\n }\n\n createDate(year: number, month: number, date: number): Date {\n return new Date(year, month, date);\n }\n\n today(): Date {\n return new Date();\n }\n\n isSameDay(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n isBefore(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() < b.getTime();\n }\n\n isAfter(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n if (!this.isValid(a) || !this.isValid(b)) return false;\n \n return a.getTime() > b.getTime();\n }\n\n isBetween(date: Date | null, start: Date | null, end: Date | null): boolean {\n if (!date || !start || !end) return false;\n if (!this.isValid(date) || !this.isValid(start) || !this.isValid(end)) return false;\n \n const dateTime = date.getTime();\n const startTime = start.getTime();\n const endTime = end.getTime();\n \n return dateTime >= startTime && dateTime <= endTime;\n }\n\n clone(date: Date): Date {\n return new Date(date.getTime());\n }\n\n isValid(date: any): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n }\n}\n","/**\n * Pure validation functions for date ranges\n * No dependencies, no side effects - just logic\n * Perfect for SSR, testing, and reusability\n */\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Validate that end date is not before start date\n */\nexport function validateRangeOrder(start: Date | null, end: Date | null): ValidationResult {\n if (!start || !end) {\n return { valid: true }; // Allow incomplete selection\n }\n\n if (end < start) {\n return {\n valid: false,\n error: 'End date cannot be before start date'\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate that date is within min/max bounds\n */\nexport function validateDateBounds(\n date: Date | null,\n minDate?: Date,\n maxDate?: Date\n): ValidationResult {\n if (!date) {\n return { valid: true };\n }\n\n if (minDate && date < minDate) {\n return {\n valid: false,\n error: `Date cannot be before ${minDate.toISOString().split('T')[0]}`\n };\n }\n\n if (maxDate && date > maxDate) {\n return {\n valid: false,\n error: `Date cannot be after ${maxDate.toISOString().split('T')[0]}`\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate that a range is within bounds\n */\nexport function validateRangeBounds(\n start: Date | null,\n end: Date | null,\n minDate?: Date,\n maxDate?: Date\n): ValidationResult {\n const startValidation = validateDateBounds(start, minDate, maxDate);\n if (!startValidation.valid) {\n return startValidation;\n }\n\n const endValidation = validateDateBounds(end, minDate, maxDate);\n if (!endValidation.valid) {\n return endValidation;\n }\n\n return { valid: true };\n}\n\n/**\n * Check if a date is disabled\n */\nexport function isDateDisabled(\n date: Date,\n disabledDates?: Date[] | ((date: Date) => boolean)\n): boolean {\n if (!disabledDates) {\n return false;\n }\n\n if (typeof disabledDates === 'function') {\n return disabledDates(date);\n }\n\n // Array of disabled dates - compare by date string\n const dateStr = date.toISOString().split('T')[0];\n return disabledDates.some(\n d => d.toISOString().split('T')[0] === dateStr\n );\n}\n\n/**\n * Apply bounds to a date (clamp it)\n */\nexport function applyBounds(date: Date, minDate?: Date, maxDate?: Date): Date {\n let result = date;\n\n if (minDate && result < minDate) {\n result = minDate;\n }\n\n if (maxDate && result > maxDate) {\n result = maxDate;\n }\n\n return result;\n}\n\n/**\n * Parse ISO date string to Date object (deterministic)\n */\nexport function parseISODate(dateStr: string): Date | null {\n if (!dateStr) return null;\n\n const [year, month, day] = dateStr.split('-').map(Number);\n if (!year || !month || !day) return null;\n\n return new Date(year, month - 1, day);\n}\n\n/**\n * Format Date to ISO string (YYYY-MM-DD)\n */\nexport function formatISODate(date: Date | null): string {\n if (!date) return '';\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n","/**\n * Date Clock Abstraction for SSR-Safe Date Resolution\n * \n * Problem:\n * Presets like \"Last 7 Days\" or \"This Month\" use new Date() which causes:\n * - SSR hydration mismatch\n * - Server renders \"2026-02-14\", client renders \"2026-02-15\"\n * - Different filters in dashboards\n * - Different queries in ERP/BI\n * - Cache inconsistency\n * \n * Solution:\n * Inject a DateClock to control time deterministically:\n * \n * Server (SSR):\n * provide(DATE_CLOCK, {\n * useValue: { now: () => new Date('2026-02-21T00:00:00Z') }\n * })\n * \n * Client (Browser):\n * Uses SystemClock by default (new Date())\n * \n * Testing:\n * provide(DATE_CLOCK, {\n * useValue: { now: () => new Date('2026-01-15T10:30:00Z') }\n * })\n * \n * Architecture:\n * - PresetEngine receives DateClock via DI\n * - All preset calculations use clock.now() instead of new Date()\n * - Deterministic: Same clock.now() → Same preset result\n * - SSR-compatible: Server and client resolve identical ranges\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Clock abstraction for deterministic date resolution\n * \n * Use cases:\n * - SSR: Ensure server and client generate identical presets\n * - Testing: Control time for predictable test results\n * - Replay: Reproduce exact user state from past sessions\n * - Demo: Freeze time for reproducible demos\n */\nexport interface DateClock {\n /**\n * Get current date/time\n * \n * Default implementation returns new Date()\n * Override for SSR, testing, or time-travel scenarios\n */\n now(): Date;\n}\n\n/**\n * Injection token for DateClock\n * \n * Usage:\n * ```typescript\n * // Default (uses SystemClock)\n * bootstrapApplication(AppComponent);\n * \n * // SSR Override\n * bootstrapApplication(AppComponent, {\n * providers: [\n * {\n * provide: DATE_CLOCK,\n * useValue: { now: () => new Date('2026-02-21T00:00:00Z') }\n * }\n * ]\n * });\n * \n * // Testing Override\n * TestBed.configureTestingModule({\n * providers: [\n * {\n * provide: DATE_CLOCK,\n * useValue: { now: () => new Date('2026-01-15T12:00:00Z') }\n * }\n * ]\n * });\n * ```\n */\nexport const DATE_CLOCK = new InjectionToken<DateClock>('DATE_CLOCK');\n","/**\n * System Clock Implementation\n * \n * Default DateClock implementation that uses system time (new Date())\n * \n * This is the default behavior users expect:\n * - \"Today\" → actual today\n * - \"Last 7 Days\" → actual last 7 days\n * \n * In SSR scenarios, this should be overridden to ensure\n * server and client generate identical date ranges.\n */\n\nimport { Injectable } from '@angular/core';\nimport { DateClock } from './date-clock';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SystemClock implements DateClock {\n /**\n * Returns current system time\n * \n * This is the standard behavior for client-side applications.\n * For SSR, override DATE_CLOCK token with a fixed Date.\n */\n now(): Date {\n return new Date();\n }\n}\n","/**\n * Date Adapter Abstraction for Timezone-Safe Date Operations\n * \n * Problem:\n * Using Date natively in calendar/range logic causes enterprise bugs:\n * - Date ranges shift by 1 day due to timezone/DST\n * - Server (UTC) vs Client (local timezone) discrepancies\n * - Inconsistent reporting in BI/ERP/invoicing/hotel systems\n * \n * Solution:\n * All date calculations go through an adapter layer.\n * This allows:\n * - Timezone-safe operations by default (NativeDateAdapter normalizes to day boundaries)\n * - Optional integration with Luxon/DayJS/date-fns for advanced timezone handling\n * - Consistent behavior across SSR and client\n * - Migration path to timezone-aware libraries without breaking changes\n * \n * Architecture:\n * ```\n * DualDateRangeStore\n * ↓ uses\n * DateAdapter ← Inject via DATE_ADAPTER token\n * ↓ implements\n * NativeDateAdapter (default, zero deps)\n * LuxonDateAdapter (optional, full timezone support)\n * DayJSDateAdapter (optional, lightweight)\n * ```\n * \n * Usage:\n * ```typescript\n * // Default (NativeDateAdapter)\n * bootstrapApplication(AppComponent);\n * \n * // Advanced (Luxon with timezone)\n * import { LuxonDateAdapter } from '@oneluiz/dual-datepicker/luxon';\n * \n * bootstrapApplication(AppComponent, {\n * providers: [\n * { provide: DATE_ADAPTER, useClass: LuxonDateAdapter }\n * ]\n * });\n * ```\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Date adapter interface for all calendar/range operations\n * \n * All methods operate on \"calendar day\" level, ignoring time components.\n * Implementations must ensure timezone-safe behavior.\n * \n * Implementations:\n * - NativeDateAdapter: Default, zero dependencies, uses Date with normalization\n * - LuxonDateAdapter: Optional, full timezone support with Luxon\n * - DayJSDateAdapter: Optional, lightweight timezone support\n * - Custom: Implement for your specific backend/timezone requirements\n */\nexport interface DateAdapter {\n /**\n * Normalize date to start of day (00:00:00.000)\n * \n * Critical for timezone-safe comparisons.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21T15:30:00');\n * const normalized = adapter.normalize(date);\n * // → 2026-02-21T00:00:00.000 (in local timezone)\n * ```\n * \n * @param date - Date to normalize\n * @returns Date with time set to 00:00:00.000\n */\n normalize(date: Date): Date;\n\n /**\n * Check if two dates represent the same calendar day\n * \n * Ignores time component. Timezone-safe.\n * \n * Example:\n * ```typescript\n * const a = new Date('2026-02-21T23:59:59');\n * const b = new Date('2026-02-21T00:00:01');\n * adapter.isSameDay(a, b); // → true\n * ```\n */\n isSameDay(a: Date, b: Date): boolean;\n\n /**\n * Check if date A is before date B (calendar day level)\n * \n * Example:\n * ```typescript\n * adapter.isBeforeDay(new Date('2026-02-20'), new Date('2026-02-21')); // → true\n * adapter.isBeforeDay(new Date('2026-02-21'), new Date('2026-02-21')); // → false\n * ```\n */\n isBeforeDay(a: Date, b: Date): boolean;\n\n /**\n * Check if date A is after date B (calendar day level)\n * \n * Example:\n * ```typescript\n * adapter.isAfterDay(new Date('2026-02-22'), new Date('2026-02-21')); // → true\n * adapter.isAfterDay(new Date('2026-02-21'), new Date('2026-02-21')); // → false\n * ```\n */\n isAfterDay(a: Date, b: Date): boolean;\n\n /**\n * Add days to a date\n * \n * Must handle DST transitions correctly.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const future = adapter.addDays(date, 7);\n * // → 2026-02-28\n * ```\n */\n addDays(date: Date, days: number): Date;\n\n /**\n * Add months to a date\n * \n * Must handle month overflow (e.g., Jan 31 + 1 month → Feb 28).\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-01-31');\n * const next = adapter.addMonths(date, 1);\n * // → 2026-02-28 (not March 3rd)\n * ```\n */\n addMonths(date: Date, months: number): Date;\n\n /**\n * Get start of day (00:00:00.000)\n * \n * Similar to normalize() but explicit intent.\n */\n startOfDay(date: Date): Date;\n\n /**\n * Get end of day (23:59:59.999)\n * \n * Useful for range queries that need to include entire day.\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const end = adapter.endOfDay(date);\n * // → 2026-02-21T23:59:59.999\n * ```\n */\n endOfDay(date: Date): Date;\n\n /**\n * Get first day of month (00:00:00.000)\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const start = adapter.startOfMonth(date);\n * // → 2026-02-01T00:00:00.000\n * ```\n */\n startOfMonth(date: Date): Date;\n\n /**\n * Get last day of month (23:59:59.999)\n * \n * Example:\n * ```typescript\n * const date = new Date('2026-02-21');\n * const end = adapter.endOfMonth(date);\n * // → 2026-02-28T23:59:59.999\n * ```\n */\n endOfMonth(date: Date): Date;\n\n /**\n * Get year (4-digit)\n * \n * Example:\n * ```typescript\n * adapter.getYear(new Date('2026-02-21')); // → 2026\n * ```\n */\n getYear(date: Date): number;\n\n /**\n * Get month (0-11, where 0 = January)\n * \n * Example:\n * ```typescript\n * adapter.getMonth(new Date('2026-02-21')); // → 1 (February)\n * ```\n */\n getMonth(date: Date): number;\n\n /**\n * Get day of month (1-31)\n * \n * Example:\n * ```typescript\n * adapter.getDate(new Date('2026-02-21')); // → 21\n * ```\n */\n getDate(date: Date): number;\n\n /**\n * Get day of week (0-6, where 0 = Sunday)\n * \n * Example:\n * ```typescript\n * adapter.getDay(new Date('2026-02-21')); // → 6 (Saturday)\n * ```\n */\n getDay(date: Date): number;\n\n /**\n * Convert Date to ISO date string (YYYY-MM-DD)\n * \n * CRITICAL: Must be timezone-safe!\n * DO NOT use date.toISOString() as it converts to UTC.\n * \n * Example:\n * ```typescript\n * // Local timezone GMT-6 (CST)\n * const date = new Date('2026-02-21T23:00:00'); // 11 PM CST\n * \n * // ❌ WRONG: date.toISOString().split('T')[0]\n * // Returns \"2026-02-22\" (shifted to UTC!)\n * \n * // ✅ CORRECT: adapter.toISODate(date)\n * // Returns \"2026-02-21\" (local date preserved)\n * ```\n * \n * @param date - Date to format (or null)\n * @returns ISO date string in YYYY-MM-DD format (local timezone), empty string if null\n */\n toISODate(date: Date | null): string;\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Date\n * \n * CRITICAL: Must be timezone-safe!\n * DO NOT use new Date(isoString) as it may parse as UTC.\n * \n * Example:\n * ```typescript\n * // ❌ WRONG: new Date('2026-02-21')\n * // May parse as UTC midnight, which is previous day in some timezones\n * \n * // ✅ CORRECT: adapter.parseISODate('2026-02-21')\n * // Returns Date representing 2026-02-21 00:00:00 in local timezone\n * ```\n * \n * @param isoDate - ISO date string (YYYY-MM-DD) or null\n * @returns Date object or null if invalid\n */\n parseISODate(isoDate: string | null): Date | null;\n\n /**\n * Get week start day for locale\n * \n * 0 = Sunday, 1 = Monday, etc.\n * \n * Example:\n * ```typescript\n * adapter.getWeekStart('en-US'); // → 0 (Sunday)\n * adapter.getWeekStart('en-GB'); // → 1 (Monday)\n * ```\n * \n * @param locale - Locale string (e.g., 'en-US', 'es-ES')\n * @returns Day number (0-6)\n */\n getWeekStart(locale?: string): 0 | 1 | 2 | 3 | 4 | 5 | 6;\n}\n\n/**\n * Injection token for DateAdapter\n * \n * Default: NativeDateAdapter (zero dependencies)\n * \n * Override for advanced timezone handling:\n * \n * ```typescript\n * // Luxon with timezone\n * import { LuxonDateAdapter } from '@oneluiz/dual-datepicker/luxon';\n * \n * bootstrapApplication(AppComponent, {\n * providers: [\n * {\n * provide: DATE_ADAPTER,\n * useClass: LuxonDateAdapter\n * }\n * ]\n * });\n * ```\n * \n * Custom implementation:\n * \n * ```typescript\n * class CustomDateAdapter implements DateAdapter {\n * // Your implementation for backend-specific date handling\n * }\n * \n * provide(DATE_ADAPTER, { useClass: CustomDateAdapter });\n * ```\n */\nexport const DATE_ADAPTER = new InjectionToken<DateAdapter>('DATE_ADAPTER');\n","/**\n * Native Date Adapter Implementation\n * \n * Default adapter using JavaScript Date with timezone-safe operations.\n * \n * Zero dependencies. Conservative implementation that:\n * - Normalizes all dates to start of day (00:00:00.000)\n * - Uses manual YYYY-MM-DD construction (avoids toISOString() timezone shift)\n * - Parses ISO dates to local timezone (avoids UTC interpretation)\n * - Handles month overflow correctly (Jan 31 + 1 month = Feb 28, not Mar 3)\n * - All comparisons work on normalized dates\n * \n * Limitations:\n * - No timezone awareness (all operations in local timezone)\n * - No DST-safe calculations across timezone changes\n * - For advanced timezone needs, use LuxonDateAdapter or DayJSDateAdapter\n * \n * Perfect for:\n * ✅ Most enterprise apps (ERP, POS, BI) where local timezone is sufficient\n * ✅ Applications without cross-timezone requirements\n * ✅ Minimizing bundle size (zero deps)\n * ✅ Simple, predictable date handling\n */\n\nimport { Injectable } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NativeDateAdapter implements DateAdapter {\n /**\n * Normalize date to start of day (00:00:00.000) in local timezone\n * \n * This is the foundation of timezone-safe operations.\n * All other methods use normalized dates for comparisons.\n */\n normalize(date: Date): Date {\n const normalized = new Date(date);\n normalized.setHours(0, 0, 0, 0);\n return normalized;\n }\n\n /**\n * Check if two dates are the same calendar day\n * \n * Implementation: Compare YYYY-MM-DD components directly\n * Avoids timezone issues from valueOf() comparisons\n */\n isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n /**\n * Check if date A is before date B (calendar day level)\n * \n * Implementation: Compare normalized dates using valueOf()\n */\n isBeforeDay(a: Date, b: Date): boolean {\n return this.normalize(a).valueOf() < this.normalize(b).valueOf();\n }\n\n /**\n * Check if date A is after date B (calendar day level)\n * \n * Implementation: Compare normalized dates using valueOf()\n */\n isAfterDay(a: Date, b: Date): boolean {\n return this.normalize(a).valueOf() > this.normalize(b).valueOf();\n }\n\n /**\n * Add days to a date\n * \n * Implementation: Use setDate() which handles month rollover automatically\n * \n * Example:\n * Jan 31 + 3 days → Feb 3 ✅\n * Feb 28 + 1 day → Mar 1 ✅ (non-leap year)\n */\n addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return this.normalize(result);\n }\n\n /**\n * Add months to a date\n * \n * CRITICAL: Handles month overflow correctly\n * \n * Algorithm:\n * 1. Add months using setMonth()\n * 2. If day-of-month changed (overflow), set to last day of target month\n * \n * Examples:\n * - Jan 31 + 1 month → Feb 28 (or Feb 29 in leap year) ✅\n * - Jan 31 + 2 months → Mar 31 ✅\n * - Mar 31 + 1 month → Apr 30 ✅\n * - Dec 31 + 1 month → Jan 31 (next year) ✅\n */\n addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n const originalDay = result.getDate();\n \n // Add months\n result.setMonth(result.getMonth() + months);\n \n // Check for day overflow (e.g., Jan 31 → Feb 31 becomes Mar 3)\n if (result.getDate() !== originalDay) {\n // Overflow detected: set to last day of target month\n // Go to 1st of next month, then subtract 1 day\n result.setDate(0); // Sets to last day of previous month\n }\n \n return this.normalize(result);\n }\n\n /**\n * Get start of day (00:00:00.000)\n * \n * Alias for normalize() with explicit intent\n */\n startOfDay(date: Date): Date {\n return this.normalize(date);\n }\n\n /**\n * Get end of day (23:59:59.999)\n * \n * Useful for inclusive range queries\n */\n endOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n }\n\n /**\n * Get first day of month (00:00:00.000)\n */\n startOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setDate(1);\n return this.normalize(result);\n }\n\n /**\n * Get last day of month (23:59:59.999)\n * \n * Algorithm: Go to 1st of next month, subtract 1 day\n */\n endOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + 1, 0); // Day 0 = last day of previous month\n return this.endOfDay(result);\n }\n\n /**\n * Get year (4-digit)\n */\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n /**\n * Get month (0-11)\n */\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n /**\n * Get day of month (1-31)\n */\n getDate(date: Date): number {\n return date.getDate();\n }\n\n /**\n * Get day of week (0-6, Sunday=0)\n */\n getDay(date: Date): number {\n return date.getDay();\n }\n\n /**\n * Convert Date to ISO date string (YYYY-MM-DD)\n * \n * CRITICAL: DO NOT use toISOString() - it converts to UTC!\n * \n * Manual construction ensures local timezone is preserved:\n * \n * Example problem with toISOString():\n * ```\n * // Local timezone: GMT-6 (CST)\n * const date = new Date('2026-02-21T23:00:00'); // 11 PM Feb 21 local\n * \n * // WRONG ❌\n * date.toISOString().split('T')[0]\n * // Returns \"2026-02-22\" (converted to UTC = Feb 22 05:00 AM)\n * \n * // CORRECT ✅\n * toISODate(date)\n * // Returns \"2026-02-21\" (local date preserved)\n * ```\n * \n * Implementation: Build YYYY-MM-DD manually from local date components\n */\n toISODate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Date\n * \n * CRITICAL: DO NOT use new Date(isoString) - may parse as UTC!\n * \n * Example problem with Date constructor:\n * ```\n * // Local timezone: GMT-6 (CST)\n * \n * // WRONG ❌\n * new Date('2026-02-21')\n * // Parsed as UTC: 2026-02-21T00:00:00Z\n * // In local timezone: Feb 20, 2026 6:00 PM (previous day!)\n * \n * // CORRECT ✅\n * parseISODate('2026-02-21')\n * // Returns: 2026-02-21T00:00:00 local time\n * ```\n * \n * Implementation: Parse components and construct Date in local timezone\n */\n parseISODate(isoDate: string): Date | null {\n if (!isoDate || typeof isoDate !== 'string') {\n return null;\n }\n\n // Match YYYY-MM-DD format\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(isoDate.trim());\n \n if (!match) {\n return null;\n }\n\n const year = parseInt(match[1], 10);\n const month = parseInt(match[2], 10) - 1; // 0-indexed\n const day = parseInt(match[3], 10);\n\n // Validate ranges\n if (month < 0 || month > 11) {\n return null;\n }\n\n if (day < 1 || day > 31) {\n return null;\n }\n\n // Construct date in local timezone\n const date = new Date(year, month, day);\n \n // Verify date is valid (e.g., Feb 31 would roll to Mar 3)\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return this.normalize(date);\n }\n\n /**\n * Get week start day for locale\n * \n * Default: Sunday (0) for most locales\n * Monday (1) for Europe, ISO 8601\n * \n * Implementation: Simple locale detection\n * For advanced needs, use Intl.Locale or external library\n */\n getWeekStart(locale?: string): 0 | 1 | 2 | 3 | 4 | 5 | 6 {\n if (!locale) {\n locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US';\n }\n\n // ISO 8601: Monday start\n const mondayStartLocales = [\n 'en-GB', 'en-IE', 'en-AU', 'en-NZ', 'en-CA',\n 'es', 'es-ES', 'es-MX',\n 'fr', 'fr-FR', 'fr-CA',\n 'de', 'de-DE', 'de-AT', 'de-CH',\n 'it', 'it-IT',\n 'pt', 'pt-PT', 'pt-BR',\n 'nl', 'nl-NL', 'nl-BE',\n 'ru', 'ru-RU',\n 'zh', 'zh-CN', 'zh-TW',\n 'ja', 'ja-JP',\n 'ko', 'ko-KR'\n ];\n\n const normalizedLocale = locale.toLowerCase();\n const startsWithMonday = mondayStartLocales.some(loc => \n normalizedLocale.startsWith(loc.toLowerCase())\n );\n\n return startsWithMonday ? 1 : 0;\n }\n}\n","/**\n * Range Preset Plugin System\n * \n * Version: 3.6.0\n * \n * Plugin-based architecture for date range presets following Open/Closed Principle.\n * \n * WHY THIS EXISTS:\n * - Enterprise apps need industry-specific presets (fiscal, hotel, logistics)\n * - Presets should be distributable as external packages\n * - Core should NOT know about all possible presets\n * - Users should extend presets without modifying library code\n * \n * ARCHITECTURE:\n * ```\n * RangePresetPlugin (interface) - Contract for all presets\n * ↓\n * PresetRegistry (service) - Manages plugin registration\n * ↓\n * PresetEngine (refactored) - Resolves presets via registry\n * ↓\n * DualDateRangeStore - No changes, backward compatible\n * ```\n * \n * USAGE:\n * ```typescript\n * // Built-in presets work automatically\n * store.applyPreset('LAST_7_DAYS'); // ✅ Works\n * \n * // Register custom preset\n * const registry = inject(PresetRegistry);\n * registry.register({\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const fiscalStart = adapter.startOfMonth(now);\n * const fiscalEnd = adapter.endOfMonth(now);\n * return { start: fiscalStart, end: fiscalEnd };\n * }\n * });\n * \n * // Use custom preset\n * store.applyPreset('THIS_FISCAL_QUARTER'); // ✅ Works\n * ```\n * \n * EXTERNAL PACKAGES:\n * ```typescript\n * // @acme/fiscal-presets package\n * export const FISCAL_PRESETS: RangePresetPlugin[] = [\n * { key: 'FISCAL_Q1', resolve: ... },\n * { key: 'FISCAL_Q2', resolve: ... }\n * ];\n * \n * // In app\n * FISCAL_PRESETS.forEach(p => registry.register(p));\n * ```\n */\n\nimport { DateClock } from './date-clock';\nimport { DateAdapter } from './date-adapter';\n\n/**\n * Date range returned by preset plugins\n */\nexport interface DateRange {\n /**\n * Start date of the range (inclusive)\n */\n start: Date;\n\n /**\n * End date of the range (inclusive)\n */\n end: Date;\n}\n\n/**\n * Range Preset Plugin Interface\n * \n * All date range presets (built-in or external) implement this interface.\n * \n * DESIGN PRINCIPLES:\n * - **Deterministic**: Given the same clock.now(), always returns same range\n * - **Timezone-safe**: Uses DateAdapter for all date operations\n * - **SSR-compatible**: Uses DateClock injection, no global Date()\n * - **Testable**: Pure function, no side effects\n * \n * EXAMPLE - Built-in preset:\n * ```typescript\n * const todayPreset: RangePresetPlugin = {\n * key: 'TODAY',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const normalized = adapter.normalize(now);\n * return { start: normalized, end: normalized };\n * }\n * };\n * ```\n * \n * EXAMPLE - Custom fiscal preset:\n * ```typescript\n * const fiscalQuarterPreset: RangePresetPlugin = {\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const month = adapter.getMonth(now); // 0-11\n * \n * // Fiscal year starts in April (month 3)\n * const fiscalMonth = (month + 9) % 12; // Offset to fiscal calendar\n * const quarterStartMonth = Math.floor(fiscalMonth / 3) * 3;\n * const adjustedMonth = (quarterStartMonth - 9 + 12) % 12;\n * \n * const yearOffset = month < 3 ? -1 : 0;\n * const year = adapter.getYear(now) + yearOffset;\n * \n * const start = new Date(year, adjustedMonth, 1);\n * const end = new Date(year, adjustedMonth + 3, 0);\n * \n * return {\n * start: adapter.normalize(start),\n * end: adapter.normalize(end)\n * };\n * }\n * };\n * ```\n * \n * EXAMPLE - Hotel industry preset:\n * ```typescript\n * const checkInWeekPreset: RangePresetPlugin = {\n * key: 'CHECK_IN_WEEK',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * // Hotel check-ins are Friday to Friday\n * const dayOfWeek = adapter.getDayOfWeek(now);\n * const daysToFriday = dayOfWeek <= 5 ? 5 - dayOfWeek : 7 - dayOfWeek + 5;\n * \n * const nextFriday = adapter.addDays(now, daysToFriday);\n * const followingFriday = adapter.addDays(nextFriday, 7);\n * \n * return { start: nextFriday, end: followingFriday };\n * }\n * };\n * ```\n */\nexport interface RangePresetPlugin {\n /**\n * Unique identifier for the preset\n * \n * Convention: SCREAMING_SNAKE_CASE\n * \n * Examples:\n * - Built-in: 'TODAY', 'LAST_7_DAYS', 'THIS_MONTH'\n * - Fiscal: 'FISCAL_Q1', 'FISCAL_YEAR_TO_DATE'\n * - Hotel: 'CHECK_IN_WEEK', 'NEXT_30_NIGHTS'\n * - Logistics: 'SHIPPING_WEEK', 'DELIVERY_WINDOW'\n */\n key: string;\n\n /**\n * Resolve the date range for this preset\n * \n * MUST use:\n * - `clock.now()` for current time (SSR-safe, deterministic)\n * - `adapter.*` for all date operations (timezone-safe)\n * \n * MUST NOT use:\n * - `new Date()` directly (breaks SSR determinism)\n * - `date.toISOString()` (timezone bugs)\n * - `date.setDate()` (mutates, use adapter.addDays() instead)\n * \n * @param clock - Injected DateClock for SSR-safe time access\n * @param adapter - Injected DateAdapter for timezone-safe operations\n * @returns Date range with start and end dates (both inclusive)\n * \n * @example\n * ```typescript\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const start = adapter.addDays(now, -7);\n * const end = adapter.normalize(now);\n * return { start, end };\n * }\n * ```\n */\n resolve(clock: DateClock, adapter: DateAdapter): DateRange;\n}\n\n/**\n * Type guard to check if object is a valid RangePresetPlugin\n * \n * @param obj - Object to check\n * @returns true if object implements RangePresetPlugin interface\n */\nexport function isRangePresetPlugin(obj: any): obj is RangePresetPlugin {\n return (\n obj &&\n typeof obj === 'object' &&\n typeof obj.key === 'string' &&\n typeof obj.resolve === 'function'\n );\n}\n","/**\n * Preset Registry Service\n * \n * Version: 3.6.0\n * \n * Central registry for all date range preset plugins (built-in and custom).\n * \n * ARCHITECTURE:\n * - Singleton service (providedIn: 'root')\n * - Manages Map<string, RangePresetPlugin>\n * - Thread-safe registration\n * - Supports plugin override (useful for testing)\n * \n * USAGE:\n * ```typescript\n * // In app\n * const registry = inject(PresetRegistry);\n * \n * // Register custom preset\n * registry.register({\n * key: 'MY_CUSTOM_PRESET',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * return { start: now, end: now };\n * }\n * });\n * \n * // Check if preset exists\n * if (registry.has('MY_CUSTOM_PRESET')) {\n * store.applyPreset('MY_CUSTOM_PRESET');\n * }\n * \n * // Get all registered presets\n * const allPresets = registry.getAll();\n * console.log('Available presets:', allPresets.map(p => p.key));\n * ```\n * \n * EXTERNAL PACKAGES:\n * ```typescript\n * // @acme/fiscal-presets\n * export function provideFiscalPresets() {\n * return {\n * provide: APP_INITIALIZER,\n * multi: true,\n * useFactory: (registry: PresetRegistry) => {\n * return () => {\n * FISCAL_PRESETS.forEach(p => registry.register(p));\n * };\n * },\n * deps: [PresetRegistry]\n * };\n * }\n * ```\n */\n\nimport { Injectable } from '@angular/core';\nimport { RangePresetPlugin, isRangePresetPlugin } from './range-preset.plugin';\n\n/**\n * Preset Registry Service\n * \n * Manages registration and retrieval of date range preset plugins.\n * \n * DESIGN:\n * - Uses Map for O(1) lookups\n * - Immutable getAll() returns copy\n * - Supports plugin override (last registration wins)\n * - Validates plugins before registration\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PresetRegistry {\n /**\n * Internal map of registered presets\n * Key: preset key (e.g., 'TODAY', 'LAST_7_DAYS')\n * Value: RangePresetPlugin instance\n */\n private readonly presets = new Map<string, RangePresetPlugin>();\n\n /**\n * Register a date range preset plugin\n * \n * If a preset with the same key already exists, it will be overridden.\n * This is useful for:\n * - Testing (override built-in presets with mocks)\n * - Customization (replace default behavior)\n * - Hot-reload scenarios\n * \n * @param plugin - The preset plugin to register\n * @throws Error if plugin is invalid (missing key or resolve function)\n * \n * @example\n * ```typescript\n * registry.register({\n * key: 'LAST_BUSINESS_WEEK',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const dayOfWeek = adapter.getDayOfWeek(now);\n * \n * // Go back to last Friday\n * const daysToLastFriday = dayOfWeek === 0 ? 2 : (dayOfWeek + 2) % 7;\n * const lastFriday = adapter.addDays(now, -daysToLastFriday);\n * \n * // Business week: Monday to Friday\n * const monday = adapter.addDays(lastFriday, -4);\n * \n * return { start: monday, end: lastFriday };\n * }\n * });\n * ```\n */\n register(plugin: RangePresetPlugin): void {\n // Validate plugin\n if (!isRangePresetPlugin(plugin)) {\n throw new Error(\n `Invalid preset plugin: must have 'key' (string) and 'resolve' (function). ` +\n `Received: ${JSON.stringify(plugin)}`\n );\n }\n\n // Validate key is not empty\n if (!plugin.key || plugin.key.trim().length === 0) {\n throw new Error('Preset plugin key cannot be empty');\n }\n\n // Register (override if exists)\n const key = plugin.key.toUpperCase(); // Normalize to uppercase\n \n // Warn if overriding\n if (this.presets.has(key)) {\n console.warn(\n `[PresetRegistry] Overriding existing preset: \"${key}\". ` +\n `This is normal if you're customizing built-in presets.`\n );\n }\n\n this.presets.set(key, plugin);\n }\n\n /**\n * Register multiple preset plugins at once\n * \n * Convenience method for bulk registration.\n * Useful when importing preset packages.\n * \n * @param plugins - Array of preset plugins to register\n * \n * @example\n * ```typescript\n * import { FISCAL_PRESETS } from '@acme/fiscal-presets';\n * \n * registry.registerAll(FISCAL_PRESETS);\n * ```\n */\n registerAll(plugins: RangePresetPlugin[]): void {\n plugins.forEach(plugin => this.register(plugin));\n }\n\n /**\n * Get a preset plugin by key\n * \n * @param key - Preset key (case-insensitive, e.g., 'today' or 'TODAY')\n * @returns The preset plugin or undefined if not found\n * \n * @example\n * ```typescript\n * const preset = registry.get('LAST_7_DAYS');\n * if (preset) {\n * const range = preset.resolve(clock, adapter);\n * console.log('Range:', range);\n * }\n * ```\n */\n get(key: string): RangePresetPlugin | undefined {\n return this.presets.get(key.toUpperCase());\n }\n\n /**\n * Check if a preset exists in the registry\n * \n * @param key - Preset key (case-insensitive)\n * @returns true if preset exists, false otherwise\n * \n * @example\n * ```typescript\n * if (registry.has('THIS_FISCAL_QUARTER')) {\n * store.applyPreset('THIS_FISCAL_QUARTER');\n * } else {\n * console.error('Fiscal quarter preset not registered');\n * }\n * ```\n */\n has(key: string): boolean {\n return this.presets.has(key.toUpperCase());\n }\n\n /**\n * Get all registered preset plugins\n * \n * Returns a NEW array (immutable) to prevent external modification.\n * \n * @returns Array of all registered preset plugins\n * \n * @example\n * ```typescript\n * const allPresets = registry.getAll();\n * console.log('Available presets:');\n * allPresets.forEach(preset => {\n * console.log(`- ${preset.key}`);\n * });\n * ```\n */\n getAll(): RangePresetPlugin[] {\n return Array.from(this.presets.values());\n }\n\n /**\n * Get all preset keys\n * \n * Convenience method to list available preset identifiers.\n * \n * @returns Array of preset keys (uppercase)\n * \n * @example\n * ```typescript\n * const keys = registry.getAllKeys();\n * // ['TODAY', 'YESTERDAY', 'LAST_7_DAYS', 'THIS_MONTH', ...]\n * ```\n */\n getAllKeys(): string[] {\n return Array.from(this.presets.keys());\n }\n\n /**\n * Get count of registered presets\n * \n * @returns Number of registered presets\n * \n * @example\n * ```typescript\n * console.log(`${registry.count()} presets available`);\n * ```\n */\n count(): number {\n return this.presets.size;\n }\n\n /**\n * Unregister a preset plugin\n * \n * Useful for:\n * - Testing cleanup\n * - Dynamic preset management\n * - Removing deprecated presets\n * \n * @param key - Preset key to remove (case-insensitive)\n * @returns true if preset was removed, false if it didn't exist\n * \n * @example\n * ```typescript\n * registry.unregister('MY_TEMPORARY_PRESET');\n * ```\n */\n unregister(key: string): boolean {\n return this.presets.delete(key.toUpperCase());\n }\n\n /**\n * Clear all registered presets\n * \n * ⚠️ USE WITH CAUTION: This removes ALL presets including built-ins.\n * \n * Useful for:\n * - Test teardown\n * - Complete re-initialization scenarios\n * \n * @example\n * ```typescript\n * // In test cleanup\n * afterEach(() => {\n * registry.clear();\n * });\n * ```\n */\n clear(): void {\n this.presets.clear();\n }\n}\n","/**\n * Headless Preset Engine\n * Pure functions that resolve date ranges WITHOUT render dependency\n * Perfect for SSR, global state, dashboard filters\n * \n * v3.5.0: SSR-Safe via Clock Injection\n * All date calculations use DateClock instead of new Date()\n * This ensures server and client resolve identical presets\n * \n * v3.5.1: Timezone-Safe via DateAdapter\n * All date operations use DateAdapter for consistent behavior\n * Fixes timezone bugs common in ERP/BI/POS systems\n * \n * v3.6.0: Plugin-Driven Architecture\n * Preset Engine now uses PresetRegistry for plugin-based extensibility\n * Follows Open/Closed Principle - extend without modifying core\n * Supports external preset packages for industry-specific needs\n */\n\nimport { Injectable, inject } from '@angular/core';\nimport { DateClock, DATE_CLOCK } from './date-clock';\nimport { SystemClock } from './system-clock';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\nimport { PresetRegistry } from './preset-registry';\n\n/**\n * @deprecated Use RangePresetPlugin from './range-preset.plugin' instead\n * Kept for backward compatibility\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 * Preset Engine - Plugin-Driven Architecture\n * \n * ARCHITECTURE (v3.6.0):\n * - NO longer contains presets internally\n * - Uses PresetRegistry for plugin management\n * - Injects DateClock for SSR-safe time\n * - Injects DateAdapter for timezone-safe operations\n * - Follows Open/Closed Principle\n * \n * BACKWARD COMPATIBILITY:\n * - Old API unchanged: resolve(), register(), getPresetKeys()\n * - Built-in presets auto-registered via provider\n * - Existing code continues to work\n * \n * EXTENSIBILITY:\n * ```typescript\n * // Register custom preset via registry\n * const registry = inject(PresetRegistry);\n * registry.register({\n * key: 'MY_PRESET',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * return { start: now, end: now };\n * }\n * });\n * \n * // Use via engine\n * const engine = inject(PresetEngine);\n * const range = engine.resolve('MY_PRESET');\n * ```\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PresetEngine {\n private clock: DateClock;\n private adapter: DateAdapter;\n private registry: PresetRegistry;\n\n constructor() {\n // Inject dependencies with fallbacks\n try {\n this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();\n this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();\n this.registry = inject(PresetRegistry);\n } catch {\n // Fallback if inject() fails outside injection context\n this.clock = new SystemClock();\n this.adapter = new NativeDateAdapter();\n this.registry = new PresetRegistry();\n }\n }\n\n /**\n * Register a custom preset\n * \n * @deprecated Use PresetRegistry.register() directly for new code\n * Kept for backward compatibility\n * \n * @param key - Preset key (e.g., 'MY_CUSTOM_PRESET')\n * @param preset - Legacy RangePreset object\n */\n register(key: string, preset: RangePreset): void {\n // Convert legacy RangePreset to RangePresetPlugin\n this.registry.register({\n key: key,\n resolve: (clock, adapter) => {\n const now = clock.now();\n return preset.resolve(now);\n }\n });\n }\n\n /**\n * Resolve a preset to date range\n * \n * Plugin Architecture:\n * 1. Looks up plugin in PresetRegistry\n * 2. Calls plugin.resolve(clock, adapter)\n * 3. Returns ISO date range\n * \n * SSR Note: Uses injected DateClock for deterministic resolution\n * Timezone Note: Uses injected DateAdapter for consistent operations\n * \n * @param key - Preset key (e.g., 'TODAY', 'LAST_7_DAYS')\n * @param now - Optional override for current date (defaults to clock.now())\n * @returns ISO date range or null if preset not found\n */\n resolve(key: string, now?: Date): PresetRange | null {\n const plugin = this.registry.get(key);\n \n if (!plugin) {\n console.warn(`[PresetEngine] Preset \"${key}\" not found in registry`);\n return null;\n }\n\n // Create temporary clock if now is provided\n const effectiveClock = now \n ? { now: () => now } \n : this.clock;\n\n // Resolve via plugin\n const { start, end } = plugin.resolve(effectiveClock, this.adapter);\n\n // Convert to ISO format\n return {\n start: this.adapter.toISODate(start),\n end: this.adapter.toISODate(end)\n };\n }\n\n /**\n * Get all available preset keys\n * \n * Delegates to PresetRegistry\n * \n * @returns Array of registered preset keys\n */\n getPresetKeys(): string[] {\n return this.registry.getAllKeys();\n }\n\n /**\n * Check if a preset exists\n * \n * @param key - Preset key to check\n * @returns true if preset is registered\n */\n hasPreset(key: string): boolean {\n return this.registry.has(key);\n }\n}\n\n/**\n * Create a custom preset from a function\n * \n * @deprecated Use RangePresetPlugin interface instead\n * Kept for backward compatibility\n */\nexport function createPreset(\n resolver: (now: Date) => { start: Date; end: Date }\n): RangePreset {\n return { resolve: resolver };\n}\n\n/**\n * @deprecated Use dependency injection instead:\n * ```typescript\n * private engine = inject(PresetEngine);\n * ```\n * \n * Singleton preset engine instance for backward compatibility\n * \n * WARNING: This singleton uses SystemClock directly and is NOT SSR-safe.\n * For SSR applications, inject PresetEngine and override DATE_CLOCK token.\n * \n * This export will be removed in v4.0.0\n */\nexport const presetEngine = new PresetEngine();\n","/**\n * Headless Date Range Store using Angular Signals\n * \n * Version: 3.5.1\n * \n * Architecture:\n * - State lives HERE, not in UI component\n * - Deterministic: no hidden side effects\n * - SSR-compatible: no window/document dependencies\n * - Timezone-safe: uses DateAdapter for all date operations\n * - Testable: pure signal-based state\n * - Reusable: inject anywhere (services, components, guards)\n * \n * Usage:\n * ```typescript\n * // In component\n * const rangeStore = inject(DualDateRangeStore);\n * rangeStore.applyPreset('THIS_MONTH');\n * \n * // In service (headless!)\n * const store = inject(DualDateRangeStore);\n * const range = store.range();\n * this.http.get(`/api/sales?start=${range.start}&end=${range.end}`);\n * ```\n */\n\nimport { Injectable, signal, computed, effect, inject } from '@angular/core';\nimport { \n validateRangeOrder, \n validateRangeBounds, \n isDateDisabled,\n applyBounds,\n parseISODate,\n formatISODate\n} from './range.validator';\nimport { PresetEngine, PresetRange } from './preset.engine';\nimport { DateClock, DATE_CLOCK } from './date-clock';\nimport { SystemClock } from './system-clock';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\n\nexport interface DateRangeState {\n start: string; // ISO date\n end: string; // ISO date\n startTime?: string; // HH:mm\n endTime?: string; // HH:mm\n}\n\nexport interface DateRangeConfig {\n minDate?: Date;\n maxDate?: Date;\n disabledDates?: Date[] | ((date: Date) => boolean);\n enableTimePicker?: boolean;\n defaultStartTime?: string;\n defaultEndTime?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DualDateRangeStore {\n // Dependency Injection - SSR-Safe & Timezone-Safe\n private presetEngine = inject(PresetEngine);\n private clock: DateClock;\n private adapter: DateAdapter;\n\n constructor() {\n // Try to inject DATE_CLOCK, fallback to SystemClock if not provided\n try {\n this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();\n } catch {\n // In case inject() fails (e.g., called outside injection context)\n this.clock = new SystemClock();\n }\n\n // Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided\n try {\n this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();\n } catch {\n this.adapter = new NativeDateAdapter();\n }\n }\n\n // Configuration\n private config = signal<DateRangeConfig>({\n enableTimePicker: false,\n defaultStartTime: '00:00',\n defaultEndTime: '23:59'\n });\n\n // Core state - using signals\n private _startDate = signal<Date | null>(null);\n private _endDate = signal<Date | null>(null);\n private _leftMonth = signal<Date>(new Date());\n private _rightMonth = signal<Date>(this.getNextMonth(new Date()));\n private _selectingStart = signal<boolean>(true);\n\n // Time state\n private _startTime = signal<string>('00:00');\n private _endTime = signal<string>('23:59');\n\n // Pending state for requireApply mode\n private _pendingStart = signal<Date | null>(null);\n private _pendingEnd = signal<Date | null>(null);\n private _hasPendingChanges = signal<boolean>(false);\n\n // Public read-only signals\n readonly startDate = this._startDate.asReadonly();\n readonly endDate = this._endDate.asReadonly();\n readonly leftMonth = this._leftMonth.asReadonly();\n readonly rightMonth = this._rightMonth.asReadonly();\n readonly selectingStart = this._selectingStart.asReadonly();\n readonly startTime = this._startTime.asReadonly();\n readonly endTime = this._endTime.asReadonly();\n readonly hasPendingChanges = this._hasPendingChanges.asReadonly();\n\n // Computed: ISO range for API consumption\n readonly range = computed<DateRangeState>(() => {\n const start = this._startDate();\n const end = this._endDate();\n const cfg = this.config();\n\n const result: DateRangeState = {\n start: this.adapter.toISODate(start),\n end: this.adapter.toISODate(end)\n };\n\n if (cfg.enableTimePicker) {\n result.startTime = this._startTime();\n result.endTime = this._endTime();\n }\n\n return result;\n });\n\n // Computed: validation state\n readonly isValid = computed(() => {\n const start = this._startDate();\n const end = this._endDate();\n const cfg = this.config();\n\n const orderValidation = validateRangeOrder(start, end);\n if (!orderValidation.valid) return false;\n\n const boundsValidation = validateRangeBounds(\n start,\n end,\n cfg.minDate,\n cfg.maxDate\n );\n return boundsValidation.valid;\n });\n\n // Computed: range text for display\n readonly rangeText = computed(() => {\n const start = this._startDate();\n const end = this._endDate();\n\n if (!start && !end) return '';\n if (!start) return `? - ${this.formatDateShort(end!)}`;\n if (!end) return `${this.formatDateShort(start)}`;\n\n return `${this.formatDateShort(start)} - ${this.formatDateShort(end)}`;\n });\n\n /**\n * Configure the store\n */\n configure(config: Partial<DateRangeConfig>): void {\n this.config.update(current => ({ ...current, ...config }));\n }\n\n /**\n * Set start date (with validation)\n */\n setStart(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n \n if (parsedDate) {\n const cfg = this.config();\n \n // Apply bounds\n const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);\n \n // Check if disabled\n if (isDateDisabled(boundedDate, cfg.disabledDates)) {\n console.warn('Cannot select disabled date');\n return;\n }\n\n this._startDate.set(boundedDate);\n this._selectingStart.set(false);\n\n // Auto-adjust end if it becomes invalid\n const end = this._endDate();\n if (end && end < boundedDate) {\n this._endDate.set(null);\n }\n } else {\n this._startDate.set(null);\n }\n }\n\n /**\n * Set end date (with validation)\n */\n setEnd(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n \n if (parsedDate) {\n const cfg = this.config();\n \n // Apply bounds\n const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);\n \n // Check if disabled\n if (isDateDisabled(boundedDate, cfg.disabledDates)) {\n console.warn('Cannot select disabled date');\n return;\n }\n\n // Validate order\n const start = this._startDate();\n if (start && boundedDate < start) {\n console.warn('End date cannot be before start date');\n return;\n }\n\n this._endDate.set(boundedDate);\n this._selectingStart.set(true); // Ready for next selection\n } else {\n this._endDate.set(null);\n }\n }\n\n /**\n * Set complete range at once\n */\n setRange(start: Date | string | null, end: Date | string | null): void {\n this.setStart(start);\n this.setEnd(end);\n }\n\n /**\n * Set pending selection (for requireApply mode)\n */\n setPendingStart(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n this._pendingStart.set(parsedDate);\n this._hasPendingChanges.set(true);\n }\n\n setPendingEnd(date: Date | string | null): void {\n const parsedDate = this.parseDate(date);\n this._pendingEnd.set(parsedDate);\n this._hasPendingChanges.set(true);\n }\n\n /**\n * Apply pending changes\n */\n applyPending(): void {\n const pendingStart = this._pendingStart();\n const pendingEnd = this._pendingEnd();\n\n if (pendingStart) this.setStart(pendingStart);\n if (pendingEnd) this.setEnd(pendingEnd);\n\n this.clearPending();\n }\n\n /**\n * Cancel pending changes\n */\n cancelPending(): void {\n this.clearPending();\n }\n\n private clearPending(): void {\n this._pendingStart.set(null);\n this._pendingEnd.set(null);\n this._hasPendingChanges.set(false);\n }\n\n /**\n * Reset to empty state\n */\n reset(): void {\n this._startDate.set(null);\n this._endDate.set(null);\n this._selectingStart.set(true);\n this.clearPending();\n }\n\n /**\n * Apply a preset by key\n * \n * SSR-Safe: Uses injected DateClock for deterministic resolution\n * \n * @param presetKey - Preset identifier (e.g., 'TODAY', 'LAST_7_DAYS')\n * @param now - Optional date override (defaults to clock.now())\n */\n applyPreset(presetKey: string, now?: Date): void {\n const currentDate = now ?? this.clock.now();\n const range = this.presetEngine.resolve(presetKey, currentDate);\n \n if (range) {\n this.setRange(range.start, range.end);\n } else {\n console.warn(`Preset \"${presetKey}\" not found`);\n }\n }\n\n /**\n * Navigate left calendar month\n */\n setLeftMonth(date: Date): void {\n this._leftMonth.set(date);\n \n // Ensure right month is always after left\n const right = this._rightMonth();\n if (right <= date) {\n this._rightMonth.set(this.getNextMonth(date));\n }\n }\n\n /**\n * Navigate right calendar month\n */\n setRightMonth(date: Date): void {\n this._rightMonth.set(date);\n \n // Ensure left month is always before right\n const left = this._leftMonth();\n if (left >= date) {\n this._leftMonth.set(this.getPreviousMonth(date));\n }\n }\n\n /**\n * Set time values\n */\n setStartTime(time: string): void {\n this._startTime.set(time);\n }\n\n setEndTime(time: string): void {\n this._endTime.set(time);\n }\n\n /**\n * Get current state as snapshot\n */\n getSnapshot(): DateRangeState {\n return this.range();\n }\n\n /**\n * Load state from snapshot\n */\n loadSnapshot(snapshot: DateRangeState): void {\n this.setRange(snapshot.start, snapshot.end);\n \n if (snapshot.startTime) {\n this.setStartTime(snapshot.startTime);\n }\n \n if (snapshot.endTime) {\n this.setEndTime(snapshot.endTime);\n }\n }\n\n // Helper methods - using DateAdapter for timezone safety\n private parseDate(date: Date | string | null): Date | null {\n if (!date) return null;\n if (date instanceof Date) return this.adapter.normalize(date);\n return this.adapter.parseISODate(date);\n }\n\n private getNextMonth(date: Date): Date {\n return this.adapter.addMonths(date, 1);\n }\n\n private getPreviousMonth(date: Date): Date {\n return this.adapter.addMonths(date, -1);\n }\n\n private formatDateShort(date: Date): string {\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const month = this.adapter.getMonth(date);\n const day = this.adapter.getDay(date);\n return `${day} ${months[month]}`;\n }\n}\n","/**\n * Built-in Date Range Preset Plugins\n * \n * Version: 3.6.0\n * \n * Standard presets provided by the library.\n * All presets use DateClock and DateAdapter for SSR-safety and timezone-safety.\n * \n * PRESETS INCLUDED:\n * - TODAY, YESTERDAY\n * - LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, LAST_60_DAYS, LAST_90_DAYS\n * - THIS_WEEK, LAST_WEEK\n * - THIS_MONTH, LAST_MONTH, MONTH_TO_DATE\n * - THIS_QUARTER, LAST_QUARTER, QUARTER_TO_DATE\n * - THIS_YEAR, LAST_YEAR, YEAR_TO_DATE\n */\n\nimport { RangePresetPlugin } from './range-preset.plugin';\n\n/**\n * TODAY - Current day\n */\nexport const TODAY_PRESET: RangePresetPlugin = {\n key: 'TODAY',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const normalized = adapter.normalize(now);\n return { start: normalized, end: normalized };\n }\n};\n\n/**\n * YESTERDAY - Previous day\n */\nexport const YESTERDAY_PRESET: RangePresetPlugin = {\n key: 'YESTERDAY',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const date = adapter.addDays(now, -1);\n return { start: date, end: date };\n }\n};\n\n/**\n * LAST_7_DAYS - Last 7 days including today\n */\nexport const LAST_7_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_7_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -6);\n return { start, end };\n }\n};\n\n/**\n * LAST_14_DAYS - Last 14 days including today\n */\nexport const LAST_14_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_14_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -13);\n return { start, end };\n }\n};\n\n/**\n * LAST_30_DAYS - Last 30 days including today\n */\nexport const LAST_30_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_30_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -29);\n return { start, end };\n }\n};\n\n/**\n * LAST_60_DAYS - Last 60 days including today\n */\nexport const LAST_60_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_60_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -59);\n return { start, end };\n }\n};\n\n/**\n * LAST_90_DAYS - Last 90 days including today\n */\nexport const LAST_90_DAYS_PRESET: RangePresetPlugin = {\n key: 'LAST_90_DAYS',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const end = adapter.normalize(now);\n const start = adapter.addDays(now, -89);\n return { start, end };\n }\n};\n\n/**\n * THIS_WEEK - Current week (Monday to Sunday)\n */\nexport const THIS_WEEK_PRESET: RangePresetPlugin = {\n key: 'THIS_WEEK',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const dayOfWeek = adapter.getDay(now);\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const start = adapter.addDays(now, -daysToMonday);\n const end = adapter.addDays(start, 6);\n return { start, end };\n }\n};\n\n/**\n * LAST_WEEK - Previous week (Monday to Sunday)\n */\nexport const LAST_WEEK_PRESET: RangePresetPlugin = {\n key: 'LAST_WEEK',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const dayOfWeek = adapter.getDay(now);\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const lastMonday = adapter.addDays(now, -daysToMonday - 7);\n const lastSunday = adapter.addDays(lastMonday, 6);\n return { start: lastMonday, end: lastSunday };\n }\n};\n\n/**\n * THIS_MONTH - Current calendar month (1st to last day)\n */\nexport const THIS_MONTH_PRESET: RangePresetPlugin = {\n key: 'THIS_MONTH',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const start = adapter.startOfMonth(now);\n const end = adapter.endOfMonth(now);\n return { start, end };\n }\n};\n\n/**\n * LAST_MONTH - Previous calendar month\n */\nexport const LAST_MONTH_PRESET: RangePresetPlugin = {\n key: 'LAST_MONTH',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const lastMonth = adapter.addMonths(now, -1);\n const start = adapter.startOfMonth(lastMonth);\n const end = adapter.endOfMonth(lastMonth);\n return { start, end };\n }\n};\n\n/**\n * MONTH_TO_DATE - From start of current month to today\n */\nexport const MONTH_TO_DATE_PRESET: RangePresetPlugin = {\n key: 'MONTH_TO_DATE',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const start = adapter.startOfMonth(now);\n const end = adapter.normalize(now);\n return { start, end };\n }\n};\n\n/**\n * THIS_QUARTER - Current quarter (Q1: Jan-Mar, Q2: Apr-Jun, Q3: Jul-Sep, Q4: Oct-Dec)\n */\nexport const THIS_QUARTER_PRESET: RangePresetPlugin = {\n key: 'THIS_QUARTER',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const currentMonth = adapter.getMonth(now);\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const year = adapter.getYear(now);\n \n const start = new Date(year, quarterStartMonth, 1);\n const normalizedStart = adapter.normalize(start);\n \n const end = new Date(year, quarterStartMonth + 3, 0);\n const normalizedEnd = adapter.normalize(end);\n \n return { start: normalizedStart, end: normalizedEnd };\n }\n};\n\n/**\n * LAST_QUARTER - Previous quarter\n */\nexport const LAST_QUARTER_PRESET: RangePresetPlugin = {\n key: 'LAST_QUARTER',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const currentMonth = adapter.getMonth(now);\n const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;\n const year = adapter.getYear(now);\n \n const adjustedYear = lastQuarterStartMonth < 0 ? year - 1 : year;\n const adjustedMonth = lastQuarterStartMonth < 0 ? 9 : lastQuarterStartMonth;\n \n const start = new Date(adjustedYear, adjustedMonth, 1);\n const normalizedStart = adapter.normalize(start);\n \n const end = new Date(adjustedYear, adjustedMonth + 3, 0);\n const normalizedEnd = adapter.normalize(end);\n \n return { start: normalizedStart, end: normalizedEnd };\n }\n};\n\n/**\n * QUARTER_TO_DATE - From start of current quarter to today\n */\nexport const QUARTER_TO_DATE_PRESET: RangePresetPlugin = {\n key: 'QUARTER_TO_DATE',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const currentMonth = adapter.getMonth(now);\n const quarterStartMonth = Math.floor(currentMonth / 3) * 3;\n const year = adapter.getYear(now);\n \n const start = new Date(year, quarterStartMonth, 1);\n const normalizedStart = adapter.normalize(start);\n const end = adapter.normalize(now);\n \n return { start: normalizedStart, end };\n }\n};\n\n/**\n * THIS_YEAR - Current calendar year (Jan 1 to Dec 31)\n */\nexport const THIS_YEAR_PRESET: RangePresetPlugin = {\n key: 'THIS_YEAR',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const year = adapter.getYear(now);\n const start = new Date(year, 0, 1);\n const end = new Date(year, 11, 31);\n return { \n start: adapter.normalize(start), \n end: adapter.normalize(end) \n };\n }\n};\n\n/**\n * LAST_YEAR - Previous calendar year\n */\nexport const LAST_YEAR_PRESET: RangePresetPlugin = {\n key: 'LAST_YEAR',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const year = adapter.getYear(now);\n const start = new Date(year - 1, 0, 1);\n const end = new Date(year - 1, 11, 31);\n return { \n start: adapter.normalize(start), \n end: adapter.normalize(end) \n };\n }\n};\n\n/**\n * YEAR_TO_DATE - From start of current year to today\n */\nexport const YEAR_TO_DATE_PRESET: RangePresetPlugin = {\n key: 'YEAR_TO_DATE',\n resolve: (clock, adapter) => {\n const now = clock.now();\n const year = adapter.getYear(now);\n const start = new Date(year, 0, 1);\n const end = adapter.normalize(now);\n return { start: adapter.normalize(start), end };\n }\n};\n\n/**\n * All built-in presets as an array\n * \n * Use this to register all built-in presets at once:\n * ```typescript\n * BUILT_IN_PRESETS.forEach(preset => registry.register(preset));\n * ```\n */\nexport const BUILT_IN_PRESETS: RangePresetPlugin[] = [\n TODAY_PRESET,\n YESTERDAY_PRESET,\n LAST_7_DAYS_PRESET,\n LAST_14_DAYS_PRESET,\n LAST_30_DAYS_PRESET,\n LAST_60_DAYS_PRESET,\n LAST_90_DAYS_PRESET,\n THIS_WEEK_PRESET,\n LAST_WEEK_PRESET,\n THIS_MONTH_PRESET,\n LAST_MONTH_PRESET,\n MONTH_TO_DATE_PRESET,\n THIS_QUARTER_PRESET,\n LAST_QUARTER_PRESET,\n QUARTER_TO_DATE_PRESET,\n THIS_YEAR_PRESET,\n LAST_YEAR_PRESET,\n YEAR_TO_DATE_PRESET\n];\n","/**\n * Calendar Grid Types\n *\n * Defines the structure for memoized calendar month grids.\n * Separates base grid structure (cacheable) from decorations (dynamic).\n */\n\n/**\n * A single calendar cell representing one day\n */\nexport interface CalendarCell {\n /** Date object (normalized to start of day) */\n date: Date;\n\n /** Whether this day belongs to the current rendered month */\n inCurrentMonth: boolean;\n\n /** ISO string 'YYYY-MM-DD' (timezone-safe via DateAdapter) */\n iso: string;\n\n /** Day of month (1-31) */\n day: number;\n\n /** Month (0-11, JavaScript convention) */\n month: number;\n\n /** Full year */\n year: number;\n\n /** Day of week (0 = Sunday, 6 = Saturday) */\n dayOfWeek: number;\n}\n\n/**\n * A calendar grid representing one month\n *\n * Grid is always 6 weeks x 7 days (42 cells) for layout stability.\n * Includes padding days from previous/next month.\n */\nexport interface CalendarGrid {\n /** Month identifier */\n month: {\n /** Year */\n year: number;\n /** Month 0-11 */\n month: number;\n };\n\n /** Week start day (0 = Sunday, 1 = Monday, etc.) */\n weekStart: number;\n\n /** Locale (for future i18n, optional) */\n locale?: string;\n\n /** 6 weeks x 7 days matrix */\n weeks: CalendarCell[][];\n\n /** Flat array of all cells (convenience accessor) */\n cells: CalendarCell[];\n}\n\n/**\n * Cache key for calendar grids\n */\nexport interface CalendarGridCacheKey {\n year: number;\n month: number;\n weekStart: number;\n locale?: string;\n}\n","/**\n * Calendar Grid Factory\n *\n * Generates calendar month grids using DateAdapter for deterministic,\n * timezone-safe date operations.\n *\n * Grid structure:\n * - Always 6 weeks x 7 days (42 cells) for layout stability\n * - Includes padding days from previous/next month\n * - No decorations (selected, disabled, etc.) - those are applied separately\n */\n\nimport { Injectable, Inject } from '@angular/core';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarCell, CalendarGrid } from './calendar-grid.types';\n\n@Injectable({ providedIn: 'root' })\nexport class CalendarGridFactory {\n constructor(\n @Inject(DATE_ADAPTER) private adapter: DateAdapter\n ) {}\n\n /**\n * Create a calendar grid for a given month\n *\n * @param monthDate - Any date within the target month (will be normalized to start of month)\n * @param weekStart - First day of week (0 = Sunday, 1 = Monday, etc.)\n * @param locale - Locale identifier (optional, for future use)\n * @returns CalendarGrid - 6 weeks x 7 days grid\n */\n createGrid(monthDate: Date, weekStart: number = 0, locale?: string): CalendarGrid {\n // Normalize to start of month\n const year = this.adapter.getYear(monthDate);\n const month = this.adapter.getMonth(monthDate);\n const firstDayOfMonth = new Date(year, month, 1);\n const normalizedFirst = this.adapter.normalize(firstDayOfMonth);\n\n // Get days in month (day 0 of next month = last day of current month)\n const lastDayOfMonth = new Date(year, month + 1, 0);\n const daysInMonth = this.adapter.getDate(lastDayOfMonth);\n\n // Get first day of week offset\n const firstDayOfWeek = this.adapter.getDay(normalizedFirst);\n const offset = this.calculateOffset(firstDayOfWeek, weekStart);\n\n // Generate 42 cells (6 weeks x 7 days)\n const cells: CalendarCell[] = [];\n let currentDate = this.adapter.addDays(normalizedFirst, -offset);\n\n for (let i = 0; i < 42; i++) {\n const cellDate = this.adapter.normalize(currentDate);\n const cellYear = this.adapter.getYear(cellDate);\n const cellMonth = this.adapter.getMonth(cellDate);\n const cellDay = this.adapter.getDate(cellDate);\n const cellDayOfWeek = this.adapter.getDay(cellDate);\n\n cells.push({\n date: cellDate,\n inCurrentMonth: cellYear === year && cellMonth === month,\n iso: this.adapter.toISODate(cellDate),\n day: cellDay,\n month: cellMonth,\n year: cellYear,\n dayOfWeek: cellDayOfWeek\n });\n\n currentDate = this.adapter.addDays(currentDate, 1);\n }\n\n // Split into weeks\n const weeks: CalendarCell[][] = [];\n for (let i = 0; i < 6; i++) {\n weeks.push(cells.slice(i * 7, (i + 1) * 7));\n }\n\n return {\n month: { year, month },\n weekStart,\n locale,\n weeks,\n cells\n };\n }\n\n /**\n * Calculate offset (number of padding days from previous month)\n *\n * @param firstDayOfWeek - Day of week for first day of month (0-6)\n * @param weekStart - Desired week start (0-6)\n * @returns Number of padding days needed\n */\n private calculateOffset(firstDayOfWeek: number, weekStart: number): number {\n let offset = firstDayOfWeek - weekStart;\n if (offset < 0) {\n offset += 7;\n }\n return offset;\n }\n}\n","/**\n * Cache Configuration\n * \n * Centralized cache limits for memory safety.\n * \n * @module core/calendar-grid/cache.config\n * @version 3.9.2\n */\n\n/**\n * Maximum cache entries before FIFO eviction\n * \n * Applied to both:\n * - CalendarGridCache: Raw month grids\n * - RangeHighlighterCache: Decorated grids\n * \n * Memory footprint:\n * - CalendarGrid (raw): ~10KB each\n * - DecoratedGrid: ~15KB each\n * - Total worst case: (10KB + 15KB) × 48 = ~1.2MB\n * \n * Coverage:\n * - 48 months = 4 years of navigation\n * - Sufficient for long-running sessions\n * \n * Critical for:\n * - ERP systems (invoice date selection)\n * - BI dashboards (date range filters)\n * - Hotel reservation systems (availability calendars)\n * - Point-of-sale systems (report generation)\n * \n * @constant\n * @since v3.9.2\n */\nexport const MAX_CACHE_ENTRIES = 48;\n","/**\n * Calendar Grid Cache\n *\n * LRU cache for calendar month grids to avoid recomputing the same month grid\n * multiple times when only decorations (selected dates, hover, etc.) change.\n *\n * Strategy:\n * - Key: year-month-weekStart-locale\n * - LRU eviction (least recently used) when limit is reached\n * - Default limit: 48 months (covers 2 years of navigation)\n *\n * Performance impact:\n * - Eliminates ~90% of grid recalculations in typical usage\n * - Memory footprint: ~10KB per cached month (negligible)\n * \n * Memory safety (v3.9.2):\n * - MAX_CACHE_ENTRIES prevents unbounded growth in long-running sessions\n * - Critical for: ERP, BI dashboards, hotel reservation systems\n * - FIFO eviction when limit exceeded\n */\n\nimport { Injectable } from '@angular/core';\nimport { CalendarGridFactory } from './calendar-grid.factory';\nimport { CalendarGrid, CalendarGridCacheKey } from './calendar-grid.types';\nimport { MAX_CACHE_ENTRIES } from './cache.config';\n\n@Injectable({ providedIn: 'root' })\nexport class CalendarGridCache {\n private cache = new Map<string, CalendarGrid>();\n private readonly maxSize: number = MAX_CACHE_ENTRIES;\n\n constructor(private factory: CalendarGridFactory) {}\n\n /**\n * Get or create a calendar grid\n *\n * @param monthDate - Any date within the target month\n * @param weekStart - First day of week (0 = Sunday, 1 = Monday, etc.)\n * @param locale - Locale identifier (optional)\n * @returns CalendarGrid - cached or newly created\n */\n get(monthDate: Date, weekStart: number = 0, locale?: string): CalendarGrid {\n const key = this.buildKey(monthDate, weekStart, locale);\n\n // Check cache\n const cached = this.cache.get(key);\n if (cached) {\n // Move to end (LRU)\n this.cache.delete(key);\n this.cache.set(key, cached);\n return cached;\n }\n\n // Generate new grid\n const grid = this.factory.createGrid(monthDate, weekStart, locale);\n\n // Store in cache\n this.cache.set(key, grid);\n\n // Evict oldest if over limit (LRU)\n if (this.cache.size > this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\n }\n\n return grid;\n }\n\n /**\n * Build cache key from month parameters\n *\n * Format: \"year-month-weekStart-locale\"\n * Example: \"2026-1-0-en\" (Feb 2026, Sunday start, English)\n */\n private buildKey(monthDate: Date, weekStart: number, locale?: string): string {\n const year = monthDate.getFullYear();\n const month = monthDate.getMonth();\n return `${year}-${month}-${weekStart}${locale ? '-' + locale : ''}`;\n }\n\n /**\n * Clear entire cache (for testing or manual reset)\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache size (for debugging/testing)\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * Check if a specific month is cached\n */\n has(monthDate: Date, weekStart: number = 0, locale?: string): boolean {\n const key = this.buildKey(monthDate, weekStart, locale);\n return this.cache.has(key);\n }\n}\n","/**\n * Range Highlighter Types\n * \n * Type definitions for calendar cell decorations with range highlighting.\n * Used by RangeHighlighter to cache decorated grids and avoid recomputations.\n * \n * @module core/calendar-grid/range-highlighter.types\n * @version 3.8.0\n */\n\nimport { CalendarCell, CalendarGrid } from './calendar-grid.types';\n\n/**\n * Calendar cell with range highlight decorations\n * \n * Extends base CalendarCell with computed properties for:\n * - Start/end markers (selected range boundaries)\n * - Range membership (cell within selected range)\n * - Hover preview (temporary range during mouse hover)\n * - Disabled state (constraints, custom predicates)\n */\nexport interface DecoratedCell extends CalendarCell {\n /**\n * True if this cell is the selected start date\n */\n isSelectedStart: boolean;\n\n /**\n * True if this cell is the selected end date\n */\n isSelectedEnd: boolean;\n\n /**\n * True if this cell is within the selected range (inclusive)\n */\n isInRange: boolean;\n\n /**\n * True if this cell is within the hover preview range\n */\n isInHoverRange: boolean;\n\n /**\n * True if this cell is disabled (via constraints or custom logic)\n */\n isDisabled: boolean;\n}\n\n/**\n * Calendar grid with decorated cells\n * \n * Contains:\n * - base: Original CalendarGrid (from CalendarGridCache)\n * - weeks: 2D array of decorated cells (6 × 7)\n * - cells: Flat array of decorated cells (42 cells)\n */\nexport interface DecoratedGrid {\n /**\n * Base grid structure (memoized by CalendarGridCache)\n */\n base: CalendarGrid;\n\n /**\n * Decorated cells organized as weeks (6 weeks × 7 days)\n */\n weeks: DecoratedCell[][];\n\n /**\n * Decorated cells as flat array (42 cells for layout stability)\n */\n cells: DecoratedCell[];\n}\n\n/**\n * Parameters for range decoration\n * \n * All dates must be Date objects (pre-parsed by component).\n * Cache key is built from ISO dates (via DateAdapter.toISODate).\n * \n * Constraints:\n * - start/end: Selected range boundaries (null if not selected)\n * - minDate/maxDate: Hard constraints (optional, for future use)\n * - hoverDate: Current hover date (null if not hovering)\n * - disabledDates: Array of disabled dates OR function predicate\n */\nexport interface RangeDecorationParams {\n /**\n * Selected start date (null if not selected yet)\n */\n start: Date | null;\n\n /**\n * Selected end date (null if not selected yet)\n */\n end: Date | null;\n\n /**\n * Minimum allowed date (optional, for future constraint support)\n * All dates before this will be disabled.\n */\n minDate?: Date | null;\n\n /**\n * Maximum allowed date (optional, for future constraint support)\n * All dates after this will be disabled.\n */\n maxDate?: Date | null;\n\n /**\n * Current hover date (null if not hovering)\n * Used to calculate hover preview range.\n */\n hoverDate?: string | null;\n\n /**\n * Disabled dates specification\n * \n * Can be one of:\n * - Array of Date objects to disable (exact matches)\n * - Function predicate (date) => boolean\n * - undefined/null (no dates disabled)\n * \n * NOTE: Functions cannot be cached reliably (no stable key).\n * If using function, cache will be bypassed for isDisabled computation.\n */\n disabledDates?: Date[] | ((date: Date) => boolean) | null;\n\n /**\n * Multi-range mode flag (affects hover range behavior)\n * Default: false\n */\n multiRange?: boolean;\n\n /**\n * Currently selecting start date (affects hover preview)\n * Default: false\n */\n selectingStartDate?: boolean;\n}\n\n/**\n * Cache key for decorated grid\n * \n * Built from:\n * - monthKey: `${year}-${month}-${weekStart}-${locale}`\n * - startISO, endISO: ISO dates or 'null'\n * - minISO, maxISO: ISO dates or 'null' (optional)\n * - hoverISO: ISO date or 'null'\n * - disabledSignature: Hash of disabled dates (or 'none' / 'function')\n * \n * Example:\n * \"2026-1-0-|2026-01-15|2026-01-25|null|null|2026-01-20|2026-01-10,2026-01-11\"\n * \n * Segment breakdown:\n * 1. 2026-1-0- (month: Jan 2026, weekStart: Sunday, no locale)\n * 2. 2026-01-15 (start date)\n * 3. 2026-01-25 (end date)\n * 4. null (no minDate)\n * 5. null (no maxDate)\n * 6. 2026-01-20 (hovering over Jan 20)\n * 7. 2026-01-10,2026-01-11 (disabled dates: Jan 10 & 11)\n */\nexport interface DecoratedGridCacheKey {\n /**\n * Combined month key (from base grid)\n */\n monthKey: string;\n\n /**\n * Start date ISO (YYYY-MM-DD) or 'null'\n */\n startISO: string;\n\n /**\n * End date ISO (YYYY-MM-DD) or 'null'\n */\n endISO: string;\n\n /**\n * Min date ISO (YYYY-MM-DD) or 'null'\n */\n minISO: string;\n\n /**\n * Max date ISO (YYYY-MM-DD) or 'null'\n */\n maxISO: string;\n\n /**\n * Hover date ISO (YYYY-MM-DD) or 'null'\n */\n hoverISO: string;\n\n /**\n * Disabled dates signature\n * \n * - 'none': No dates disabled\n * - 'function': Using predicate function (not cacheable)\n * - sorted ISO string: \"2026-01-10,2026-01-11,...\" (for array)\n */\n disabledSignature: string;\n\n /**\n * Full cache key (concatenation of all segments)\n */\n full: string;\n}\n","/**\n * Range Highlighter Service\n * \n * Decorates calendar grids with range highlights, hover previews, and disabled states.\n * Pure computation layer - no caching (see RangeHighlighterCache for memoization).\n * \n * @module core/calendar-grid/range-highlighter\n * @version 3.8.0\n */\n\nimport { Injectable, Inject } from '@angular/core';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarGrid, CalendarCell } from './calendar-grid.types';\nimport { DecoratedGrid, DecoratedCell, RangeDecorationParams } from './range-highlighter.types';\n\n/**\n * Range Highlighter\n * \n * Applies decorations to calendar grids:\n * - isSelectedStart, isSelectedEnd (range boundaries)\n * - isInRange (cells within selected range)\n * - isInHoverRange (hover preview)\n * - isDisabled (constraints, custom predicates)\n * \n * Design:\n * - Pure functions (same input = same output)\n * - Uses DateAdapter for all date operations (SSR-safe)\n * - No side effects, no state\n * - Fast (~1ms for 42 cells on mobile)\n * \n * Usage:\n * ```typescript\n * const grid = calendarGridCache.get(monthDate, 0);\n * const decorated = rangeHighlighter.decorate(grid, {\n * start: startDate,\n * end: endDate,\n * hoverDate: '2026-01-20',\n * disabledDates: [...]\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class RangeHighlighter {\n constructor(\n @Inject(DATE_ADAPTER) private adapter: DateAdapter\n ) {}\n\n /**\n * Decorate calendar grid with range highlights\n * \n * @param grid Base calendar grid (from CalendarGridCache)\n * @param params Decoration parameters (start, end, hover, disabled, etc.)\n * @returns Decorated grid with computed properties\n */\n decorate(\n grid: CalendarGrid,\n params: RangeDecorationParams\n ): DecoratedGrid {\n // Normalize dates (ensure start of day, consistent ISO strings)\n const startISO = params.start ? this.adapter.toISODate(params.start) : null;\n const endISO = params.end ? this.adapter.toISODate(params.end) : null;\n const minISO = params.minDate ? this.adapter.toISODate(params.minDate) : null;\n const maxISO = params.maxDate ? this.adapter.toISODate(params.maxDate) : null;\n const hoverISO = params.hoverDate || null;\n\n // Compute hover range boundaries (if applicable)\n const hoverRange = this.computeHoverRange(\n startISO,\n hoverISO,\n params.selectingStartDate || false,\n params.multiRange || false\n );\n\n // Decorate all cells\n const decoratedCells = grid.cells.map((cell: CalendarCell): DecoratedCell => {\n // Padding cells (previous/next month) get default decorations\n if (!cell.inCurrentMonth) {\n return {\n ...cell,\n isSelectedStart: false,\n isSelectedEnd: false,\n isInRange: false,\n isInHoverRange: false,\n isDisabled: false\n };\n }\n\n // Current month cells: apply full decoration logic\n const cellISO = cell.iso;\n\n return {\n ...cell,\n isSelectedStart: startISO === cellISO,\n isSelectedEnd: endISO === cellISO,\n isInRange: this.isInRange(cellISO, startISO, endISO),\n isInHoverRange: this.isInHoverRange(cellISO, hoverRange),\n isDisabled: this.isDisabled(cell.date, minISO, maxISO, params.disabledDates)\n };\n });\n\n // Organize cells into weeks (6 × 7)\n const weeks: DecoratedCell[][] = [];\n for (let i = 0; i < decoratedCells.length; i += 7) {\n weeks.push(decoratedCells.slice(i, i + 7));\n }\n\n return {\n base: grid,\n cells: decoratedCells,\n weeks\n };\n }\n\n /**\n * Check if cell is within selected range\n * \n * @param cellISO Cell date (ISO format)\n * @param startISO Start date (ISO or null)\n * @param endISO End date (ISO or null)\n * @returns True if cell is in range [start, end] (inclusive)\n */\n private isInRange(\n cellISO: string,\n startISO: string | null,\n endISO: string | null\n ): boolean {\n if (!startISO || !endISO) return false;\n return cellISO >= startISO && cellISO <= endISO;\n }\n\n /**\n * Check if cell is within hover preview range\n * \n * @param cellISO Cell date (ISO format)\n * @param hoverRange Hover range boundaries (or null)\n * @returns True if cell is in hover range\n */\n private isInHoverRange(\n cellISO: string,\n hoverRange: { min: string; max: string } | null\n ): boolean {\n if (!hoverRange) return false;\n return cellISO >= hoverRange.min && cellISO <= hoverRange.max;\n }\n\n /**\n * Check if cell is disabled\n * \n * @param date Cell date object\n * @param minISO Minimum allowed date (ISO or null)\n * @param maxISO Maximum allowed date (ISO or null)\n * @param disabledDates Disabled dates (array, function, or null)\n * @returns True if cell is disabled\n */\n private isDisabled(\n date: Date,\n minISO: string | null,\n maxISO: string | null,\n disabledDates?: Date[] | ((date: Date) => boolean) | null\n ): boolean {\n const dateISO = this.adapter.toISODate(date);\n\n // Check min/max constraints\n if (minISO && dateISO < minISO) return true;\n if (maxISO && dateISO > maxISO) return true;\n\n // Check disabled dates\n if (!disabledDates) return false;\n\n if (typeof disabledDates === 'function') {\n // Custom predicate\n return disabledDates(date);\n } else if (Array.isArray(disabledDates)) {\n // Array of disabled dates (exact day match)\n return disabledDates.some(disabledDate => {\n return this.adapter.getYear(date) === this.adapter.getYear(disabledDate) &&\n this.adapter.getMonth(date) === this.adapter.getMonth(disabledDate) &&\n this.adapter.getDate(date) === this.adapter.getDate(disabledDate);\n });\n }\n\n return false;\n }\n\n /**\n * Compute hover preview range\n * \n * When user hovers over a date (and not selecting start):\n * - Show preview range from start to hover\n * - Range is always [min, max] where min <= max\n * \n * @param startISO Current start date (ISO or null)\n * @param hoverISO Hovered date (ISO or null)\n * @param selectingStart True if selecting start date (hover disabled)\n * @param multiRange True if in multi-range mode\n * @returns Hover range boundaries or null\n */\n private computeHoverRange(\n startISO: string | null,\n hoverISO: string | null,\n selectingStart: boolean,\n multiRange: boolean\n ): { min: string; max: string } | null {\n // No hover preview when selecting start\n if (selectingStart || !hoverISO || !startISO) return null;\n\n // Compute min/max (always normalized order)\n const min = startISO < hoverISO ? startISO : hoverISO;\n const max = startISO > hoverISO ? startISO : hoverISO;\n\n return { min, max };\n }\n}\n","/**\n * Range Highlighter Cache\n * \n * LRU cache for decorated calendar grids.\n * Eliminates redundant decoration computations when range/constraints don't change.\n * \n * @module core/calendar-grid/range-highlighter.cache\n * @version 3.9.2\n */\n\nimport { Injectable, Inject } from '@angular/core';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarGrid } from './calendar-grid.types';\nimport { DecoratedGrid, RangeDecorationParams, DecoratedGridCacheKey } from './range-highlighter.types';\nimport { RangeHighlighter } from './range-highlighter';\nimport { MAX_CACHE_ENTRIES } from './cache.config';\n\n/**\n * Range Highlighter Cache\n * \n * Memoizes decorated grids to avoid recomputing decorations.\n * \n * Cache strategy:\n * - LRU eviction (Map preserves insertion order)\n * - Max 48 entries (v3.9.2: Memory safety for long-running sessions)\n * - Key: month + start + end + hover + disabled signature\n * \n * Performance:\n * - Cache hit: ~0.1ms (object lookup)\n * - Cache miss: ~1ms (decoration + store)\n * - Hit rate: Expected >80% in typical usage\n * \n * Memory safety (v3.9.2):\n * - MAX_CACHE_ENTRIES prevents unbounded growth\n * - Critical for: ERP, BI dashboards, hotel systems\n * - FIFO eviction when limit exceeded\n * - ~720KB max memory footprint\n * \n * Edge cases handled:\n * - Function predicates: Not cacheable (recompute every time)\n * - Large disabled arrays: Sorted + joined for stable key\n * - Hover changes: Separate cache entries\n * - Multi-range mode: Included in key\n * \n * Usage:\n * ```typescript\n * const grid = calendarGridCache.get(monthDate, 0);\n * const decorated = rangeHighlighterCache.get(grid, {\n * start: startDate,\n * end: endDate,\n * hoverDate: '2026-01-20',\n * disabledDates: [...]\n * });\n * // Same params = same object reference (===)\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class RangeHighlighterCache {\n private cache = new Map<string, DecoratedGrid>();\n private maxSize = MAX_CACHE_ENTRIES;\n\n constructor(\n private highlighter: RangeHighlighter,\n @Inject(DATE_ADAPTER) private adapter: DateAdapter\n ) {}\n\n /**\n * Get decorated grid (cached or computed)\n * \n * If cache hit: Returns existing DecoratedGrid (same object reference)\n * If cache miss: Computes decorations, stores in cache, returns new grid\n * \n * @param grid Base calendar grid (from CalendarGridCache)\n * @param params Decoration parameters\n * @returns Decorated grid with range highlights\n */\n get(\n grid: CalendarGrid,\n params: RangeDecorationParams\n ): DecoratedGrid {\n // Build cache key\n const cacheKey = this.buildKey(grid, params);\n\n // Check cache (function predicates can't be cached reliably)\n const hasFunction = typeof params.disabledDates === 'function';\n if (!hasFunction && this.cache.has(cacheKey.full)) {\n // Cache hit: Return existing grid\n const cached = this.cache.get(cacheKey.full)!;\n \n // LRU update: Delete and re-insert (moves to end)\n this.cache.delete(cacheKey.full);\n this.cache.set(cacheKey.full, cached);\n \n return cached;\n }\n\n // Cache miss: Compute decorations\n const decorated = this.highlighter.decorate(grid, params);\n\n // Store in cache (only if not using function predicate)\n if (!hasFunction) {\n this.cache.set(cacheKey.full, decorated);\n\n // Evict oldest if over limit\n if (this.cache.size > this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n }\n\n return decorated;\n }\n\n /**\n * Build cache key from grid and params\n * \n * Key structure:\n * `${monthKey}|${startISO}|${endISO}|${minISO}|${maxISO}|${hoverISO}|${disabledSig}`\n * \n * Example:\n * \"2026-1-0-|2026-01-15|2026-01-25|null|null|2026-01-20|2026-01-10,2026-01-11\"\n * \n * @param grid Base calendar grid\n * @param params Decoration parameters\n * @returns Cache key components\n */\n private buildKey(\n grid: CalendarGrid,\n params: RangeDecorationParams\n ): DecoratedGridCacheKey {\n // Month key (from base grid)\n const monthKey = `${grid.month.year}-${grid.month.month}-${grid.weekStart}-${grid.locale || ''}`;\n\n // Date ISOs (null if not provided)\n const startISO = params.start ? this.adapter.toISODate(params.start) : 'null';\n const endISO = params.end ? this.adapter.toISODate(params.end) : 'null';\n const minISO = params.minDate ? this.adapter.toISODate(params.minDate) : 'null';\n const maxISO = params.maxDate ? this.adapter.toISODate(params.maxDate) : 'null';\n const hoverISO = params.hoverDate || 'null';\n\n // Disabled dates signature\n const disabledSignature = this.buildDisabledSignature(params.disabledDates);\n\n // Multi-range flag (affects hover behavior)\n const multiRangeFlag = params.multiRange ? '1' : '0';\n const selectingStartFlag = params.selectingStartDate ? '1' : '0';\n\n // Full key (pipe-separated for readability)\n const full = `${monthKey}|${startISO}|${endISO}|${minISO}|${maxISO}|${hoverISO}|${disabledSignature}|${multiRangeFlag}|${selectingStartFlag}`;\n\n return {\n monthKey,\n startISO,\n endISO,\n minISO,\n maxISO,\n hoverISO,\n disabledSignature,\n full\n };\n }\n\n /**\n * Build signature for disabled dates\n * \n * Strategies:\n * - null/undefined: 'none'\n * - Function: 'function' (not cacheable)\n * - Array: Sorted ISO dates joined with commas\n * \n * @param disabledDates Disabled dates specification\n * @returns Signature string for cache key\n */\n private buildDisabledSignature(\n disabledDates?: Date[] | ((date: Date) => boolean) | null\n ): string {\n if (!disabledDates) return 'none';\n\n if (typeof disabledDates === 'function') {\n return 'function';\n }\n\n if (Array.isArray(disabledDates)) {\n if (disabledDates.length === 0) return 'none';\n\n // Convert to ISO dates, sort, join\n const isoArray = disabledDates\n .map(date => this.adapter.toISODate(date))\n .sort();\n\n return isoArray.join(',');\n }\n\n return 'none';\n }\n\n /**\n * Clear all cached grids\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get current cache size\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * Check if key is cached\n * \n * @param grid Base calendar grid\n * @param params Decoration parameters\n * @returns True if this grid+params is cached\n */\n has(grid: CalendarGrid, params: RangeDecorationParams): boolean {\n const key = this.buildKey(grid, params);\n return this.cache.has(key.full);\n }\n}\n","/**\n * Virtual Weeks Types\n * \n * Type definitions for windowed week rendering (virtual scrolling).\n * Reduces DOM nodes by rendering only visible weeks instead of full month.\n * \n * @module core/calendar-grid/virtual-weeks.types\n * @version 3.9.0\n */\n\n/**\n * Virtual weeks configuration\n * \n * Controls how many weeks to render at once (windowed rendering).\n * Reduces DOM complexity for better mobile performance.\n * \n * Example:\n * ```typescript\n * <ngx-dual-datepicker\n * [virtualWeeks]=\"{ windowSize: 3 }\"\n * </ngx-dual-datepicker>\n * ```\n * \n * With windowSize=3:\n * - Renders only 3 weeks at a time (21 cells vs 42 cells)\n * - User can navigate between week windows\n * - ~50% reduction in DOM nodes per calendar\n * - ~50% reduction in reflow/repaint cost\n */\nexport interface VirtualWeeksConfig {\n /**\n * Number of weeks to render at once\n * \n * Default: undefined (render all 6 weeks - backward compatible)\n * \n * Recommended values:\n * - 3: Good balance (21 cells)\n * - 4: More context (28 cells)\n * - 2: Minimal (14 cells, may feel cramped)\n */\n windowSize: number;\n}\n\n/**\n * Virtual week window state\n * \n * Tracks which weeks are currently visible in the window.\n * Managed by component signals.\n */\nexport interface VirtualWeekWindow {\n /**\n * Start index of visible week range (0-based)\n * \n * Range: [0, totalWeeks - windowSize]\n */\n startIndex: number;\n\n /**\n * Window size (how many weeks visible)\n */\n windowSize: number;\n\n /**\n * Total weeks available in month (usually 6, sometimes 5)\n */\n totalWeeks: number;\n\n /**\n * Whether user can scroll/navigate up (to earlier weeks)\n */\n canNavigateUp: boolean;\n\n /**\n * Whether user can scroll/navigate down (to later weeks)\n */\n canNavigateDown: boolean;\n}\n","/**\n * Virtual Weeks Logic (Pure Functions)\n * \n * Pure computation layer for windowed week rendering.\n * No side effects, fully testable with node:test.\n * \n * @module core/calendar-grid/virtual-weeks.logic\n * @version 3.9.0\n */\n\nimport { VirtualWeekWindow } from './virtual-weeks.types';\n\n/**\n * Get visible weeks from total weeks array\n * \n * Pure function: Given weeks array and window config, returns visible slice.\n * \n * @param weeks Total weeks array (usually 6 weeks)\n * @param startIndex Start index of visible window (0-based)\n * @param windowSize How many weeks to show\n * @returns Visible weeks slice\n * \n * @example\n * ```typescript\n * const allWeeks = [week0, week1, week2, week3, week4, week5]; // 6 weeks\n * const visible = getVisibleWeeks(allWeeks, 0, 3);\n * // Returns [week0, week1, week2]\n * \n * const visible2 = getVisibleWeeks(allWeeks, 3, 3);\n * // Returns [week3, week4, week5]\n * ```\n */\nexport function getVisibleWeeks<T>(\n weeks: T[],\n startIndex: number,\n windowSize: number\n): T[] {\n if (!weeks || weeks.length === 0) {\n return [];\n }\n\n // If no windowing (windowSize undefined or >= total weeks), return all\n if (windowSize === undefined || windowSize >= weeks.length) {\n return weeks;\n }\n\n // Clamp startIndex to valid range\n const clampedStart = clampWeekStart(startIndex, weeks.length, windowSize);\n\n // Return slice\n return weeks.slice(clampedStart, clampedStart + windowSize);\n}\n\n/**\n * Clamp week start index to valid range\n * \n * Ensures startIndex is within bounds [0, totalWeeks - windowSize].\n * Prevents scrolling beyond available weeks.\n * \n * @param startIndex Desired start index\n * @param totalWeeks Total weeks available\n * @param windowSize Window size\n * @returns Clamped start index\n * \n * @example\n * ```typescript\n * clampWeekStart(0, 6, 3); // 0 (valid)\n * clampWeekStart(3, 6, 3); // 3 (valid, shows weeks 3-5)\n * clampWeekStart(4, 6, 3); // 3 (clamped, can't show beyond week 5)\n * clampWeekStart(-1, 6, 3); // 0 (clamped, can't go negative)\n * ```\n */\nexport function clampWeekStart(\n startIndex: number,\n totalWeeks: number,\n windowSize: number\n): number {\n if (windowSize >= totalWeeks) {\n return 0; // No windowing needed\n }\n\n const maxStart = totalWeeks - windowSize;\n return Math.max(0, Math.min(startIndex, maxStart));\n}\n\n/**\n * Navigate week window (scroll up/down)\n * \n * Returns new start index after navigation.\n * Handles clamping automatically.\n * \n * @param currentStart Current start index\n * @param direction Navigation direction (+1 = down/later, -1 = up/earlier)\n * @param totalWeeks Total weeks available\n * @param windowSize Window size\n * @returns New start index after navigation\n * \n * @example\n * ```typescript\n * // Start at week 0, navigate down\n * navigateWeekWindow(0, 1, 6, 3); // Returns 1 (now showing weeks 1-3)\n * \n * // At week 3 (last valid position), navigate down\n * navigateWeekWindow(3, 1, 6, 3); // Returns 3 (can't go further)\n * \n * // At week 1, navigate up\n * navigateWeekWindow(1, -1, 6, 3); // Returns 0 (now showing weeks 0-2)\n * ```\n */\nexport function navigateWeekWindow(\n currentStart: number,\n direction: number,\n totalWeeks: number,\n windowSize: number\n): number {\n const newStart = currentStart + direction;\n return clampWeekStart(newStart, totalWeeks, windowSize);\n}\n\n/**\n * Get virtual week window state\n * \n * Computes full window state including navigation capabilities.\n * \n * @param startIndex Current start index\n * @param totalWeeks Total weeks available\n * @param windowSize Window size\n * @returns Complete window state\n * \n * @example\n * ```typescript\n * const state = getVirtualWeekWindow(0, 6, 3);\n * // {\n * // startIndex: 0,\n * // windowSize: 3,\n * // totalWeeks: 6,\n * // canNavigateUp: false, // Already at top\n * // canNavigateDown: true // Can scroll down\n * // }\n * \n * const state2 = getVirtualWeekWindow(3, 6, 3);\n * // {\n * // startIndex: 3,\n * // windowSize: 3,\n * // totalWeeks: 6,\n * // canNavigateUp: true, // Can scroll up\n * // canNavigateDown: false // Already at bottom\n * // }\n * ```\n */\nexport function getVirtualWeekWindow(\n startIndex: number,\n totalWeeks: number,\n windowSize: number\n): VirtualWeekWindow {\n const clampedStart = clampWeekStart(startIndex, totalWeeks, windowSize);\n const maxStart = Math.max(0, totalWeeks - windowSize);\n\n return {\n startIndex: clampedStart,\n windowSize,\n totalWeeks,\n canNavigateUp: clampedStart > 0,\n canNavigateDown: clampedStart < maxStart\n };\n}\n\n/**\n * Check if virtual weeks mode is enabled\n * \n * @param windowSize Window size from config (undefined = disabled)\n * @param totalWeeks Total weeks available\n * @returns True if windowing should be applied\n */\nexport function isVirtualWeeksEnabled(\n windowSize: number | undefined,\n totalWeeks: number\n): boolean {\n return windowSize !== undefined && windowSize < totalWeeks;\n}\n","/**\n * Calendar Grid Module\n *\n * Performance-optimized calendar month grid generation with memoization.\n *\n * v3.7.0: Grid Structure Cache\n * - CalendarGridFactory for deterministic 42-cell grids\n * - CalendarGridCache with LRU (24 months)\n * \n * v3.8.0: Range Highlight Cache\n * - RangeHighlighter for decoration logic\n * - RangeHighlighterCache with LRU (48 grids)\n * - Separates grid structure from decorations\n * \n * v3.9.0: Virtual Weeks (Windowed Rendering)\n * - Virtual-weeks logic for reduced DOM complexity\n * - Render only visible weeks (configurable window)\n * - ~50% reduction in DOM nodes with windowSize=3\n * \n * v3.9.2: Cache Bounds (Memory Safety)\n * - MAX_CACHE_ENTRIES = 48 prevents unbounded growth\n * - FIFO eviction for long-running sessions\n * - Critical for ERP, BI, hotel systems\n *\n * Usage:\n * ```typescript\n * constructor(\n * private gridCache: CalendarGridCache,\n * private highlighterCache: RangeHighlighterCache\n * ) {}\n *\n * const grid = this.gridCache.get(monthDate, weekStart);\n * const decorated = this.highlighterCache.get(grid, {\n * start, end, hoverDate, disabledDates\n * });\n * \n * // Optional: Windowed rendering (v3.9.0+)\n * const windowSize = 3; // Render only 3 weeks\n * const visibleWeeks = getVisibleWeeks(\n * decorated.weeks, \n * weekStartIndex, \n * windowSize\n * );\n * // decorated.cells[0].iso => '2026-02-01'\n * // decorated.cells[0].isInRange => true\n * ```\n */\n\nexport * from './calendar-grid.types';\nexport * from './calendar-grid.factory';\nexport * from './calendar-grid.cache';\nexport * from './range-highlighter.types';\nexport * from './range-highlighter';\nexport * from './range-highlighter.cache';\nexport * from './virtual-weeks.types';\nexport * from './virtual-weeks.logic';\nexport * from './cache.config';\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, HostListener, ElementRef, forwardRef, signal, computed, effect, inject, APP_INITIALIZER } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport { NativeDateAdapter } from './native-date-adapter';\nimport { DualDateRangeStore } from './core/dual-date-range.store';\nimport { PresetRegistry } from './core/preset-registry';\nimport { BUILT_IN_PRESETS } from './core/built-in-presets';\nimport { CalendarGridCache, CalendarGrid, CalendarCell, RangeHighlighterCache, DecoratedCell, VirtualWeeksConfig, getVisibleWeeks, navigateWeekWindow, isVirtualWeeksEnabled } from './core/calendar-grid';\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 provide: APP_INITIALIZER,\n multi: true,\n useFactory: (registry: PresetRegistry) => {\n return () => {\n // Auto-register built-in presets\n BUILT_IN_PRESETS.forEach(preset => registry.register(preset));\n };\n },\n deps: [PresetRegistry]\n }\n ]\n})\nexport class DualDatepickerComponent implements OnInit, OnChanges, ControlValueAccessor {\n @Input() placeholder: string = 'Select date range';\n @Input() set startDate(value: string) {\n if (value) {\n const date = this.dateAdapter.parse(value);\n if (date) this.rangeStore.setStart(date);\n }\n }\n get startDate(): string {\n const date = this.rangeStore.startDate();\n return date ? this.formatDate(date) : '';\n }\n \n @Input() set endDate(value: string) {\n if (value) {\n const date = this.dateAdapter.parse(value);\n if (date) this.rangeStore.setEnd(date);\n }\n }\n get endDate(): string {\n const date = this.rangeStore.endDate();\n return date ? this.formatDate(date) : '';\n }\n @Input() showPresets: boolean = true;\n @Input() showClearButton: boolean = false;\n @Input() multiRange: boolean = false;\n @Input() closeOnSelection: boolean = true;\n @Input() closeOnPresetSelection: boolean = true;\n @Input() closeOnClickOutside: boolean = true;\n @Input() enableKeyboardNavigation: boolean = true;\n @Input() presets: PresetConfig[] = [];\n @Input() theme: ThemeType = 'default';\n @Input() inputBackgroundColor: string = '#fff';\n @Input() inputTextColor: string = '#495057';\n @Input() inputBorderColor: string = '#ced4da';\n @Input() inputBorderColorHover: string = '#ced4da';\n @Input() inputBorderColorFocus: string = '#80bdff';\n @Input() inputPadding: string = '0.375rem 0.75rem';\n @Input() locale: LocaleConfig = {};\n @Input() disabledDates: Date[] | ((date: Date) => boolean) | undefined;\n @Input() displayFormat: string = 'D MMM'; // Format for displaying dates in input\n @Input() requireApply: boolean = false; // Require Apply button confirmation\n @Input() enableTimePicker: boolean = false; // Enable time selection\n @Input() timeFormat: '12h' | '24h' = '24h'; // Time format\n @Input() minuteStep: number = 15; // Step for minute selector (1, 5, 15, 30)\n @Input() defaultStartTime: string = '00:00'; // Default start time HH:mm\n @Input() defaultEndTime: string = '23:59'; // Default end time HH:mm\n \n /**\n * Virtual Weeks Configuration (v3.9.0+)\n * \n * Enables windowed rendering to reduce DOM complexity and improve mobile performance.\n * Only renders a subset of calendar weeks instead of all 6.\n * \n * Example: `{ windowSize: 3 }` renders only 3 weeks (21 cells) instead of 6 weeks (42 cells),\n * reducing DOM nodes by ~50% per calendar.\n * \n * @default undefined (disabled - renders all 6 weeks for backward compatibility)\n * \n * Example:\n * ```html\n * <ngx-dual-datepicker\n * [virtualWeeks]=\"{ windowSize: 3 }\">\n * </ngx-dual-datepicker>\n * ```\n */\n @Input() virtualWeeks?: VirtualWeeksConfig;\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 // Calendar grid cache (v3.7.0+) - memoizes month grid generation\n private gridCache = inject(CalendarGridCache);\n \n // Range highlighter cache (v3.8.0+) - memoizes decorations\n private highlighterCache = inject(RangeHighlighterCache);\n \n // Headless store for date range state (v3.5.0+)\n protected readonly rangeStore = inject(DualDateRangeStore);\n\n // UI-only signals\n showDatePicker = signal(false);\n currentMonth = signal(this.dateAdapter.today());\n previousMonth = signal(this.dateAdapter.today());\n currentMonthDays = signal<any[]>([]);\n previousMonthDays = signal<any[]>([]);\n isDisabled = signal(false);\n showStartTimePicker = signal(false);\n showEndTimePicker = signal(false);\n hoverDate = signal<string | null>(null);\n \n /**\n * Virtual Weeks State (v3.9.0+)\n * \n * Signals to track which week window is currently visible for each calendar.\n * - weekStart = 0: Shows first N weeks (windowSize)\n * - weekStart = 1: Shows weeks 1 to N+1, etc.\n * \n * Reset to 0 when month changes for consistent UX.\n */\n previousMonthWeekStart = signal(0);\n currentMonthWeekStart = signal(0);\n \n /**\n * Computed: Visible weeks for windowed rendering (v3.9.0+)\n * \n * If virtualWeeks is enabled, returns only the visible subset of weeks.\n * Otherwise, returns all weeks for backward compatibility.\n * \n * Example: If windowSize=3 and weekStart=0, returns first 3 weeks (rows 0-2).\n */\n previousMonthVisibleDays = computed(() => {\n const allDays = this.previousMonthDays();\n if (!this.virtualWeeks || !isVirtualWeeksEnabled(this.virtualWeeks.windowSize, 6)) {\n return allDays;\n }\n \n // Calendar has 6 weeks (42 cells = 7 days × 6 weeks)\n const allWeeks: any[][] = [];\n for (let i = 0; i < 6; i++) {\n allWeeks.push(allDays.slice(i * 7, (i + 1) * 7));\n }\n \n const visibleWeeks = getVisibleWeeks(\n allWeeks,\n this.previousMonthWeekStart(),\n this.virtualWeeks.windowSize\n );\n \n return visibleWeeks.flat();\n });\n \n currentMonthVisibleDays = computed(() => {\n const allDays = this.currentMonthDays();\n if (!this.virtualWeeks || !isVirtualWeeksEnabled(this.virtualWeeks.windowSize, 6)) {\n return allDays;\n }\n \n // Calendar has 6 weeks (42 cells = 7 days × 6 weeks)\n const allWeeks: any[][] = [];\n for (let i = 0; i < 6; i++) {\n allWeeks.push(allDays.slice(i * 7, (i + 1) * 7));\n }\n \n const visibleWeeks = getVisibleWeeks(\n allWeeks,\n this.currentMonthWeekStart(),\n this.virtualWeeks.windowSize\n );\n \n return visibleWeeks.flat();\n });\n \n // Computed time properties from store\n get startHour(): number {\n const time = this.rangeStore.startTime();\n return this.parseTime(time).hour;\n }\n \n get startMinute(): number {\n const time = this.rangeStore.startTime();\n return this.parseTime(time).minute;\n }\n \n get endHour(): number {\n const time = this.rangeStore.endTime();\n return this.parseTime(time).hour;\n }\n \n get endMinute(): number {\n const time = this.rangeStore.endTime();\n return this.parseTime(time).minute;\n }\n \n private setStartHourMinute(hour: number, minute: number): void {\n const timeStr = this.formatTime(hour, minute);\n this.rangeStore.setStartTime(timeStr);\n }\n \n private setEndHourMinute(hour: number, minute: number): void {\n const timeStr = this.formatTime(hour, minute);\n this.rangeStore.setEndTime(timeStr);\n }\n \n // Multi-range support (UI-specific)\n selectedRanges = signal<DateRange[]>([]);\n currentRangeIndex = signal<number>(-1);\n\n // Keyboard navigation (UI-specific)\n focusedDay = signal<{ date: string; monthIndex: number } | null>(null);\n \n // Computed values\n currentMonthName = computed(() => this.getMonthName(this.currentMonth()));\n previousMonthName = computed(() => this.getMonthName(this.previousMonth()));\n weekDayNames = computed(() => this.getDayNames());\n \n // Computed from store\n dateRangeText = computed(() => this.rangeStore.rangeText());\n selectingStartDate = computed(() => this.rangeStore.selectingStart());\n hasPendingChanges = computed(() => this.rangeStore.hasPendingChanges());\n \n // Computed for template access to pending dates (requireApply mode)\n get pendingStartDate(): string {\n // In requireApply mode, store keeps pending values\n // For now, use actual store values as pending (store handles this)\n if (!this.requireApply) return '';\n const date = this.rangeStore.startDate();\n return date && this.hasPendingChanges() ? this.formatDate(date) : '';\n }\n \n get pendingEndDate(): string {\n if (!this.requireApply) return '';\n const date = this.rangeStore.endDate();\n return date && this.hasPendingChanges() ? this.formatDate(date) : '';\n }\n\n private readonly defaultMonthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n private readonly defaultMonthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n private readonly defaultDayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n private readonly defaultDayNamesShort = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\n // ControlValueAccessor callbacks\n private onChange: (value: DateRange | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(private elementRef: ElementRef) {\n // Effect to emit changes when dates change in store\n effect(() => {\n const range = this.rangeStore.range();\n if (range.start || range.end) {\n this.onChange(this.getDateRangeValue());\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (this.showDatePicker() && this.closeOnClickOutside) {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.closeDatePicker();\n }\n }\n }\n\n @HostListener('keydown', ['$event'])\n handleKeyboardNavigation(event: KeyboardEvent): void {\n if (!this.enableKeyboardNavigation) {\n return;\n }\n\n if (!this.showDatePicker()) {\n // When picker is closed, allow Enter/Space to open it\n if (event.key === 'Enter' || event.key === ' ') {\n const target = event.target as HTMLElement;\n if (target.classList.contains('datepicker-input')) {\n event.preventDefault();\n this.toggleDatePicker();\n }\n }\n return;\n }\n\n // When picker is open\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closeDatePicker();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.moveFocusVertical(-1);\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.moveFocusVertical(1);\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n this.moveFocusHorizontal(-1);\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n this.moveFocusHorizontal(1);\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.selectFocusedDay();\n break;\n\n case 'Home':\n event.preventDefault();\n this.moveFocusToFirstDay();\n break;\n\n case 'End':\n event.preventDefault();\n this.moveFocusToLastDay();\n break;\n\n case 'PageUp':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(-1);\n } else {\n this.changeMonth(-1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n\n case 'PageDown':\n event.preventDefault();\n if (event.shiftKey) {\n this.moveFocusYear(1);\n } else {\n this.changeMonth(1);\n this.adjustFocusAfterMonthChange();\n }\n break;\n }\n }\n\n // Keyboard navigation methods\n private initializeFocus(): void {\n // Set initial focus to start date, end date, or first available day\n if (this.startDate) {\n const inPrevMonth = this.isDateInMonth(this.startDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.startDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.startDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // startDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else if (this.endDate) {\n const inPrevMonth = this.isDateInMonth(this.endDate, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(this.endDate, this.currentMonth());\n \n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ date: this.endDate, monthIndex: inPrevMonth ? 0 : 1 });\n } else {\n // endDate is not visible, focus on today if visible\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n } else {\n // Focus on today if visible, otherwise first day of current month\n const today = this.dateAdapter.format(this.dateAdapter.today(), 'yyyy-MM-dd');\n const inCurrMonth = this.isDateInMonth(today, this.currentMonth());\n \n if (inCurrMonth) {\n this.focusedDay.set({ date: today, monthIndex: 1 });\n } else {\n // Today is not in current month, focus on first day of current month\n const currentMonthDays = this.currentMonthDays();\n const firstDay = currentMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 1 });\n }\n }\n }\n }\n\n private isDateInMonth(dateStr: string, monthDate: Date): boolean {\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return false;\n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const monthYear = this.dateAdapter.getYear(monthDate);\n const monthMonth = this.dateAdapter.getMonth(monthDate);\n return year === monthYear && month === monthMonth;\n }\n\n private moveFocusHorizontal(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction);\n const newDateStr = this.formatDate(newDate);\n\n // Determine which month the new date belongs to\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Date is outside visible months, navigate month\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusVertical(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const newDate = this.dateAdapter.addDays(currentDate, direction * 7); // Move by week\n const newDateStr = this.formatDate(newDate);\n\n let inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n let inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n\n if (inPrevMonth || inCurrMonth) {\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n } else {\n // Navigate to month containing the new date\n if (direction > 0) {\n this.changeMonth(1);\n } else {\n this.changeMonth(-1);\n }\n \n // Recalculate after month change\n inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n inCurrMonth = this.isDateInMonth(newDateStr, this.currentMonth());\n \n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : (inCurrMonth ? 1 : 0)\n });\n }\n }\n\n private moveFocusToFirstDay(): void {\n const prevMonthDays = this.previousMonthDays();\n const firstDay = prevMonthDays.find(day => day.isCurrentMonth);\n if (firstDay) {\n this.focusedDay.set({ date: firstDay.date, monthIndex: 0 });\n }\n }\n\n private moveFocusToLastDay(): void {\n const currMonthDays = this.currentMonthDays();\n const validDays = currMonthDays.filter(day => day.isCurrentMonth);\n const lastDay = validDays[validDays.length - 1];\n if (lastDay) {\n this.focusedDay.set({ date: lastDay.date, monthIndex: 1 });\n }\n }\n\n private moveFocusYear(direction: number): void {\n const focused = this.focusedDay();\n if (!focused) {\n this.initializeFocus();\n return;\n }\n\n const currentDate = this.dateAdapter.parse(focused.date);\n if (!currentDate) return;\n\n const currentYear = this.dateAdapter.getYear(currentDate);\n const currentMonth = this.dateAdapter.getMonth(currentDate);\n const currentDay = this.dateAdapter.getDate(currentDate);\n \n const newDate = this.dateAdapter.createDate(currentYear + direction, currentMonth, currentDay);\n const newDateStr = this.formatDate(newDate);\n\n // Update months to show the new year\n this.currentMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth, 1));\n this.previousMonth.set(this.dateAdapter.createDate(currentYear + direction, currentMonth - 1, 1));\n this.generateCalendars();\n\n const inPrevMonth = this.isDateInMonth(newDateStr, this.previousMonth());\n this.focusedDay.set({ \n date: newDateStr, \n monthIndex: inPrevMonth ? 0 : 1 \n });\n }\n\n private adjustFocusAfterMonthChange(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const inPrevMonth = this.isDateInMonth(focused.date, this.previousMonth());\n const inCurrMonth = this.isDateInMonth(focused.date, this.currentMonth());\n\n if (!inPrevMonth && !inCurrMonth) {\n // Focused day is no longer visible, move to equivalent day in visible months\n this.initializeFocus();\n } else {\n // Update month index if needed\n this.focusedDay.set({\n date: focused.date,\n monthIndex: inPrevMonth ? 0 : 1\n });\n }\n }\n\n private selectFocusedDay(): void {\n const focused = this.focusedDay();\n if (!focused) return;\n\n const monthDays = focused.monthIndex === 0 ? this.previousMonthDays() : this.currentMonthDays();\n const dayObj = monthDays.find(day => day.date === focused.date && day.isCurrentMonth);\n \n if (dayObj) {\n this.selectDay(dayObj);\n }\n }\n\n hasKeyboardFocus(date: string, monthIndex: number): boolean {\n const focused = this.focusedDay();\n return focused !== null && focused.date === date && focused.monthIndex === monthIndex;\n }\n\n ngOnInit(): void {\n // Configure the headless store\n this.rangeStore.configure({\n enableTimePicker: this.enableTimePicker,\n defaultStartTime: this.defaultStartTime,\n defaultEndTime: this.defaultEndTime,\n disabledDates: this.disabledDates\n });\n \n // Initialize dates in store if provided\n if (this.startDate) {\n const date = this.dateAdapter.parse(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (this.endDate) {\n const date = this.dateAdapter.parse(this.endDate);\n if (date) this.rangeStore.setEnd(date);\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['startDate'] || changes['endDate']) {\n // Sync with store\n if (changes['startDate'] && this.startDate) {\n const date = this.dateAdapter.parse(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (changes['endDate'] && this.endDate) {\n const date = this.dateAdapter.parse(this.endDate);\n if (date) this.rangeStore.setEnd(date);\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n }\n \n // Update store configuration if relevant inputs change\n if (changes['enableTimePicker'] || changes['defaultStartTime'] || \n changes['defaultEndTime'] || changes['disabledDates']) {\n this.rangeStore.configure({\n enableTimePicker: this.enableTimePicker,\n defaultStartTime: this.defaultStartTime,\n defaultEndTime: this.defaultEndTime,\n disabledDates: this.disabledDates\n });\n }\n }\n\n formatDate(date: Date): string {\n const year = this.dateAdapter.getYear(date);\n const month = String(this.dateAdapter.getMonth(date) + 1).padStart(2, '0');\n const day = String(this.dateAdapter.getDate(date)).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n formatDateDisplay(dateStr: string): string {\n if (!dateStr) return '';\n const date = this.dateAdapter.parse(dateStr);\n if (!date) return '';\n \n const year = this.dateAdapter.getYear(date);\n const month = this.dateAdapter.getMonth(date);\n const day = this.dateAdapter.getDate(date);\n \n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n const monthNamesShort = this.locale.monthNamesShort || this.defaultMonthNamesShort;\n \n // Replace format tokens with values\n let formatted = this.displayFormat;\n \n // Year tokens\n formatted = formatted.replace(/YYYY/g, String(year));\n formatted = formatted.replace(/YY/g, String(year).slice(-2));\n \n // Month tokens (order matters: MMMM before MMM before MM before M)\n formatted = formatted.replace(/MMMM/g, monthNames[month]);\n formatted = formatted.replace(/MMM/g, monthNamesShort[month]);\n formatted = formatted.replace(/MM/g, String(month + 1).padStart(2, '0'));\n formatted = formatted.replace(/M/g, String(month + 1));\n \n // Day tokens (order matters: DD before D)\n formatted = formatted.replace(/DD/g, String(day).padStart(2, '0'));\n formatted = formatted.replace(/D/g, String(day));\n \n return formatted;\n }\n\n // Note: updateDateRangeText is now handled by computed dateRangeText from store\n // Keeping this method for backward compatibility but it's a no-op\n updateDateRangeText(): void {\n // Text is now automatically computed from store.rangeText()\n }\n\n toggleDatePicker(): void {\n this.showDatePicker.update(value => !value);\n if (this.showDatePicker()) {\n // selectingStart is managed by store, no need to set here\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const previousMonthDate = this.dateAdapter.createDate(year, month - 1, 1);\n this.previousMonth.set(previousMonthDate);\n this.generateCalendars();\n // Initialize keyboard focus only if keyboard navigation is enabled\n if (this.enableKeyboardNavigation) {\n this.initializeFocus();\n }\n } else {\n // Clear focus when closing\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n }\n this.onTouched();\n }\n\n closeDatePicker(): void {\n this.showDatePicker.set(false);\n if (this.enableKeyboardNavigation) {\n this.focusedDay.set(null);\n }\n this.onTouched();\n }\n\n generateCalendars(): void {\n this.previousMonthDays.set(this.generateMonthCalendar(this.previousMonth()));\n this.currentMonthDays.set(this.generateMonthCalendar(this.currentMonth()));\n \n // Reset virtual week windows when month changes (v3.9.0+)\n // Always start at first week for consistent UX\n if (this.virtualWeeks) {\n this.previousMonthWeekStart.set(0);\n this.currentMonthWeekStart.set(0);\n }\n }\n\n /**\n * Generate calendar grid with decorations (v3.8.0+)\n * \n * Uses CalendarGridCache for base grid structure (memoized by month),\n * then uses RangeHighlighterCache for decorations (memoized by range/constraints).\n * \n * Performance:\n * - Grid structure: Cached by month (same month = same grid object)\n * - Decorations: Cached by range+hover+disabled (same state = same decorated grid)\n * - Result: ~95% cache hit rate in typical usage\n * \n * Cache keys:\n * - Grid: `${year}-${month}-${weekStart}`\n * - Decorations: `${monthKey}|${start}|${end}|${hover}|${disabled}`\n */\n generateMonthCalendar(date: Date): any[] {\n // Get base grid from cache (weekStart = 0 for Sunday, no locale for now)\n const grid: CalendarGrid = this.gridCache.get(date, 0);\n \n // Get dates from store\n const startDate = this.rangeStore.startDate();\n const endDate = this.rangeStore.endDate();\n const hoverISO = this.hoverDate();\n \n // Get decorated grid from cache (handles all decoration logic)\n const decorated = this.highlighterCache.get(grid, {\n start: startDate,\n end: endDate,\n hoverDate: hoverISO,\n disabledDates: this.disabledDates,\n multiRange: this.multiRange,\n selectingStartDate: this.selectingStartDate()\n // minDate/maxDate omitted for now (not in current API)\n });\n \n // Map decorated cells to legacy format (for backward compatibility)\n const monthDays = decorated.cells.map((cell: DecoratedCell) => {\n if (!cell.inCurrentMonth) {\n // Padding cell (previous/next month)\n return { day: null, isCurrentMonth: false };\n }\n \n // Current month cell - use cached decorations\n return {\n day: cell.day,\n date: cell.iso,\n isCurrentMonth: true,\n isStart: cell.isSelectedStart,\n isEnd: cell.isSelectedEnd,\n inRange: cell.isInRange,\n inHoverRange: cell.isInHoverRange,\n isDisabled: cell.isDisabled\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 /**\n * Virtual Weeks Navigation (v3.9.0+)\n * \n * Navigate the visible week window up/down for windowed rendering.\n * \n * @param monthIndex 0 = previous month, 1 = current month\n * @param direction -1 = scroll up (previous weeks), +1 = scroll down (next weeks)\n * \n * Example: If windowSize=3 and weekStart=0, navigateWeeks(0, +1) shows weeks 1-3.\n */\n navigateWeeks(monthIndex: number, direction: number): void {\n if (!this.virtualWeeks) return;\n \n const totalWeeks = 6; // Standard calendar grid has 6 weeks\n const currentStart = monthIndex === 0 \n ? this.previousMonthWeekStart() \n : this.currentMonthWeekStart();\n \n const newStart = navigateWeekWindow(\n currentStart,\n direction,\n totalWeeks,\n this.virtualWeeks.windowSize\n );\n \n if (monthIndex === 0) {\n this.previousMonthWeekStart.set(newStart);\n } else {\n this.currentMonthWeekStart.set(newStart);\n }\n }\n\n /**\n * Check if week navigation is available (v3.9.0+)\n * \n * @param monthIndex 0 = previous month, 1 = current month\n * @param direction -1 = up (can scroll to previous weeks?), +1 = down (can scroll to next weeks?)\n * @returns true if navigation is available in that direction\n */\n canNavigateWeeks(monthIndex: number, direction: number): boolean {\n if (!this.virtualWeeks) return false;\n \n const totalWeeks = 6;\n const currentStart = monthIndex === 0 \n ? this.previousMonthWeekStart() \n : this.currentMonthWeekStart();\n \n if (direction < 0) {\n // Can scroll up if not at start\n return currentStart > 0;\n } else {\n // Can scroll down if window doesn't extend past end\n return currentStart + this.virtualWeeks.windowSize < totalWeeks;\n }\n }\n\n isDateDisabled(date: Date): boolean {\n if (!this.disabledDates) return false;\n\n if (typeof this.disabledDates === 'function') {\n // If it's a function, call it with the date\n return this.disabledDates(date);\n } else if (Array.isArray(this.disabledDates)) {\n // If it's an array, check if the date matches any disabled date\n return this.disabledDates.some(disabledDate => {\n return this.dateAdapter.getYear(date) === this.dateAdapter.getYear(disabledDate) &&\n this.dateAdapter.getMonth(date) === this.dateAdapter.getMonth(disabledDate) &&\n this.dateAdapter.getDate(date) === this.dateAdapter.getDate(disabledDate);\n });\n }\n \n return false;\n }\n\n isInHoverRange(dateStr: string): boolean {\n const hover = this.hoverDate();\n if (!hover) return false;\n\n // In multiRange mode, only show hover preview when selecting end date\n if (this.multiRange) {\n if (this.selectingStartDate()) return false;\n const currentStart = this.startDate;\n if (!currentStart) return false;\n const minDate = currentStart < hover ? currentStart : hover;\n const maxDate = currentStart > hover ? currentStart : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // In single range mode \n if (this.selectingStartDate()) return false;\n \n if (this.requireApply) {\n // Use pending dates from store\n const pendingStart = this.rangeStore.startDate();\n if (!pendingStart) return false;\n const pendingStartStr = this.formatDate(pendingStart);\n const minDate = pendingStartStr < hover ? pendingStartStr : hover;\n const maxDate = pendingStartStr > hover ? pendingStartStr : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n } else {\n // Use actual dates\n const currentStart = this.startDate;\n if (!currentStart) return false;\n const minDate = currentStart < hover ? currentStart : hover;\n const maxDate = currentStart > hover ? currentStart : hover;\n return dateStr >= minDate && dateStr <= maxDate;\n }\n }\n }\n\n onDayHover(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) {\n this.hoverDate.set(null);\n return;\n }\n this.hoverDate.set(dayObj.date);\n this.generateCalendars();\n }\n\n clearDayHover(): void {\n this.hoverDate.set(null);\n this.generateCalendars();\n }\n\n selectDay(dayObj: any): void {\n if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled) return;\n \n const selectedDate = this.dateAdapter.parse(dayObj.date);\n if (!selectedDate) return;\n\n if (this.multiRange) {\n // Multi-range mode: add ranges to array\n if (this.selectingStartDate()) {\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(null);\n } else {\n const currentStart = this.rangeStore.startDate();\n if (currentStart && selectedDate < currentStart) {\n // Swap: selected becomes start, current start becomes end\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(currentStart);\n } else {\n this.rangeStore.setEnd(selectedDate);\n }\n \n // Add the new range to the array\n const range = this.rangeStore.range();\n const newRange: DateRange = {\n startDate: range.start,\n endDate: range.end,\n rangeText: this.formatDateDisplay(range.start) + ' – ' + this.formatDateDisplay(range.end),\n ...(this.enableTimePicker && { startTime: range.startTime, endTime: range.endTime })\n };\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.push(newRange);\n this.selectedRanges.set(currentRanges);\n \n // Reset for next range selection\n this.rangeStore.reset();\n \n // Update display text\n this.updateMultiRangeText();\n \n // Don't close if multiRange, allow adding more ranges\n if (this.closeOnSelection && !this.multiRange) {\n this.showDatePicker.set(false);\n }\n \n this.emitMultiChange();\n this.emitMultiSelection();\n }\n this.generateCalendars();\n } else {\n // Single range mode\n if (this.requireApply) {\n // Apply mode: use pending dates, don't emit until Apply is clicked\n if (this.selectingStartDate()) {\n this.rangeStore.setPendingStart(selectedDate);\n this.rangeStore.setPendingEnd(null);\n } else {\n const pendingStart = this.rangeStore.startDate();\n if (pendingStart && selectedDate < pendingStart) {\n // Swap\n this.rangeStore.setPendingStart(selectedDate);\n this.rangeStore.setPendingEnd(pendingStart);\n } else {\n this.rangeStore.setPendingEnd(selectedDate);\n }\n }\n this.generateCalendars();\n } else {\n // Immediate mode: emit changes immediately\n if (this.selectingStartDate()) {\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(null);\n this.emitChange();\n } else {\n const currentStart = this.rangeStore.startDate();\n if (currentStart && selectedDate < currentStart) {\n // Swap\n this.rangeStore.setStart(selectedDate);\n this.rangeStore.setEnd(currentStart);\n } else {\n this.rangeStore.setEnd(selectedDate);\n }\n \n if (this.closeOnSelection) {\n this.showDatePicker.set(false);\n }\n this.emitChange();\n this.emitSelection();\n }\n this.generateCalendars();\n }\n }\n }\n\n applySelection(): void {\n if (!this.hasPendingChanges()) return;\n \n // Apply pending dates through store\n this.rangeStore.applyPending();\n \n // Emit changes\n this.emitChange();\n this.emitSelection();\n \n // Close picker\n this.showDatePicker.set(false);\n }\n\n cancelSelection(): void {\n // Discard pending changes through store\n this.rangeStore.cancelPending();\n \n // Regenerate calendars to clear pending visual state\n this.generateCalendars();\n }\n\n changeMonth(direction: number): void {\n const currentMonthValue = this.currentMonth();\n const year = this.dateAdapter.getYear(currentMonthValue);\n const month = this.dateAdapter.getMonth(currentMonthValue);\n const newCurrentMonth = this.dateAdapter.createDate(year, month + direction, 1);\n this.currentMonth.set(newCurrentMonth);\n \n const newYear = this.dateAdapter.getYear(newCurrentMonth);\n const newMonth = this.dateAdapter.getMonth(newCurrentMonth);\n const newPreviousMonth = this.dateAdapter.createDate(newYear, newMonth - 1, 1);\n this.previousMonth.set(newPreviousMonth);\n this.generateCalendars();\n }\n\n getMonthName(date: Date): string {\n const monthNames = this.locale.monthNames || this.defaultMonthNames;\n return `${monthNames[this.dateAdapter.getMonth(date)]} ${this.dateAdapter.getYear(date)}`;\n }\n\n getDayNames(): string[] {\n return this.locale.dayNamesShort || this.defaultDayNamesShort;\n }\n\n selectPresetRange(preset: PresetConfig): void {\n if (!preset.getValue) {\n console.error('PresetConfig must have getValue() function');\n return;\n }\n\n const range = preset.getValue();\n const startDate = this.dateAdapter.parse(range.start);\n const endDate = this.dateAdapter.parse(range.end);\n \n if (startDate && endDate) {\n this.rangeStore.setRange(startDate, endDate);\n }\n \n this.generateCalendars();\n if (this.closeOnPresetSelection) {\n this.showDatePicker.set(false);\n }\n this.emitSelection();\n }\n\n clear(): void {\n this.rangeStore.reset();\n this.showDatePicker.set(false);\n \n if (this.multiRange) {\n this.selectedRanges.set([]);\n this.currentRangeIndex.set(-1);\n this.emitMultiChange();\n } else {\n this.emitChange();\n }\n \n this.onTouched();\n this.generateCalendars();\n }\n \n removeRange(index: number): void {\n if (!this.multiRange) return;\n \n const currentRanges = [...this.selectedRanges()];\n currentRanges.splice(index, 1);\n this.selectedRanges.set(currentRanges);\n \n this.updateMultiRangeText();\n this.emitMultiChange();\n this.emitMultiSelection();\n this.generateCalendars();\n }\n \n private updateMultiRangeText(): void {\n const count = this.selectedRanges().length;\n // Note: dateRangeText is now computed from store, this is for multi-range UI only\n // We could store this in a separate signal if needed, but for now just track ranges count\n }\n\n private emitChange(): void {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n this.dateRangeChange.emit(range);\n }\n\n private emitSelection(): void {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n this.dateRangeSelected.emit(range);\n }\n \n private emitMultiChange(): void {\n this.multiDateRangeChange.emit({\n ranges: this.selectedRanges()\n });\n }\n \n private emitMultiSelection(): void {\n this.multiDateRangeSelected.emit({\n ranges: this.selectedRanges()\n });\n }\n\n private getDateRangeValue(): DateRange {\n const storeRange = this.rangeStore.range();\n const range: DateRange = {\n startDate: storeRange.start,\n endDate: storeRange.end,\n rangeText: this.dateRangeText()\n };\n \n if (this.enableTimePicker) {\n range.startTime = storeRange.startTime;\n range.endTime = storeRange.endTime;\n }\n \n return range;\n }\n\n // Time Picker Methods\n toggleStartTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showStartTimePicker.set(!this.showStartTimePicker());\n this.showEndTimePicker.set(false);\n }\n\n toggleEndTimePicker(): void {\n if (!this.enableTimePicker) return;\n this.showEndTimePicker.set(!this.showEndTimePicker());\n this.showStartTimePicker.set(false);\n }\n\n incrementStartHour(): void {\n const newHour = (this.startHour + 1) % 24;\n this.setStartHourMinute(newHour, this.startMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementStartHour(): void {\n const newHour = this.startHour === 0 ? 23 : this.startHour - 1;\n this.setStartHourMinute(newHour, this.startMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementStartMinute(): void {\n const newMinute = (this.startMinute + this.minuteStep) % 60;\n this.setStartHourMinute(this.startHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementStartMinute(): void {\n let newMinute = this.startMinute - this.minuteStep;\n if (newMinute < 0) {\n newMinute = 60 - this.minuteStep;\n }\n this.setStartHourMinute(this.startHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementEndHour(): void {\n const newHour = (this.endHour + 1) % 24;\n this.setEndHourMinute(newHour, this.endMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementEndHour(): void {\n const newHour = this.endHour === 0 ? 23 : this.endHour - 1;\n this.setEndHourMinute(newHour, this.endMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n incrementEndMinute(): void {\n const newMinute = (this.endMinute + this.minuteStep) % 60;\n this.setEndHourMinute(this.endHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n decrementEndMinute(): void {\n let newMinute = this.endMinute - this.minuteStep;\n if (newMinute < 0) {\n newMinute = 60 - this.minuteStep;\n }\n this.setEndHourMinute(this.endHour, newMinute);\n if (!this.requireApply) {\n this.emitChange();\n }\n }\n\n formatTime(hour: number, minute: number): string {\n const h = hour.toString().padStart(2, '0');\n const m = minute.toString().padStart(2, '0');\n \n if (this.timeFormat === '12h') {\n const isPM = hour >= 12;\n const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const period = isPM ? 'PM' : 'AM';\n return `${hour12.toString().padStart(2, '0')}:${m} ${period}`;\n }\n \n return `${h}:${m}`;\n }\n\n parseTime(timeString: string): { hour: number; minute: number } {\n if (!timeString) return { hour: 0, minute: 0 };\n \n const time12hRegex = /^(\\d{1,2}):(\\d{2})\\s?(AM|PM)$/i;\n const time24hRegex = /^(\\d{1,2}):(\\d{2})$/;\n \n let match = timeString.match(time12hRegex);\n if (match) {\n let hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3].toUpperCase();\n \n if (period === 'PM' && hour !== 12) hour += 12;\n if (period === 'AM' && hour === 12) hour = 0;\n \n return { hour, minute };\n }\n \n match = timeString.match(time24hRegex);\n if (match) {\n return {\n hour: parseInt(match[1], 10),\n minute: parseInt(match[2], 10)\n };\n }\n \n return { hour: 0, minute: 0 };\n }\n\n // ControlValueAccessor implementation\n writeValue(value: DateRange | null): void {\n if (value) {\n // Use setters which delegate to store\n this.startDate = value.startDate || '';\n this.endDate = value.endDate || '';\n \n if (this.enableTimePicker) {\n if (value.startTime) {\n this.rangeStore.setStartTime(value.startTime);\n }\n if (value.endTime) {\n this.rangeStore.setEndTime(value.endTime);\n }\n }\n \n if (this.startDate && this.endDate) {\n this.generateCalendars();\n }\n } else {\n this.rangeStore.reset();\n }\n }\n\n registerOnChange(fn: (value: DateRange | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n}\n","<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n ×\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthVisibleDays(); 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 currentMonthVisibleDays(); 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 * Provider Functions for Built-in Presets\n * \n * Version: 3.6.0\n * \n * Automatic registration of built-in date range presets.\n * These providers ensure backward compatibility by auto-registering\n * all standard presets (TODAY, LAST_7_DAYS, THIS_MONTH, etc.)\n * \n * USAGE IN LIBRARY (Internal):\n * Built-in presets are registered automatically via Angular providers.\n * Library consumers don't need to do anything.\n * \n * USAGE IN APP (Custom Presets):\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * // ... other providers\n * provideCustomPresets([\n * {\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * // ... fiscal logic\n * return { start, end };\n * }\n * }\n * ])\n * ]\n * };\n * ```\n */\n\nimport { APP_INITIALIZER, EnvironmentProviders, makeEnvironmentProviders, inject } from '@angular/core';\nimport { PresetRegistry } from './preset-registry';\nimport { BUILT_IN_PRESETS } from './built-in-presets';\nimport { RangePresetPlugin } from './range-preset.plugin';\n\n/**\n * Initializer function that registers built-in presets\n * \n * Runs at application startup (APP_INITIALIZER)\n * \n * @param registry - PresetRegistry instance\n * @returns Initialization function\n */\nfunction initializeBuiltInPresets(registry: PresetRegistry): () => void {\n return () => {\n // Register all built-in presets\n BUILT_IN_PRESETS.forEach(preset => {\n registry.register(preset);\n });\n\n // Log registration for debugging (can be removed in production)\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(\n `[ng-dual-datepicker] Registered ${BUILT_IN_PRESETS.length} built-in presets:`,\n BUILT_IN_PRESETS.map(p => p.key).join(', ')\n );\n }\n };\n}\n\n/**\n * Provide built-in date range presets\n * \n * This provider is automatically included in the library's root providers.\n * Library consumers don't need to add this manually.\n * \n * @returns EnvironmentProviders for built-in presets\n * \n * @internal\n */\nexport function provideBuiltInPresets(): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: initializeBuiltInPresets,\n deps: [PresetRegistry]\n }\n ]);\n}\n\n/**\n * Provide custom date range presets\n * \n * Use this to register your own industry-specific presets:\n * - Fiscal presets\n * - Hotel/hospitality presets\n * - Logistics presets\n * - Custom business logic\n * \n * @param presets - Array of custom RangePresetPlugin implementations\n * @returns EnvironmentProviders for custom presets\n * \n * @example\n * ```typescript\n * // Fiscal presets\n * const FISCAL_PRESETS: RangePresetPlugin[] = [\n * {\n * key: 'THIS_FISCAL_QUARTER',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const month = adapter.getMonth(now);\n * \n * // Fiscal year starts April (month 3)\n * const fiscalMonth = (month + 9) % 12;\n * const quarterStart = Math.floor(fiscalMonth / 3) * 3;\n * const calendarMonth = (quarterStart - 9 + 12) % 12;\n * \n * const year = adapter.getYear(now);\n * const fiscalYear = month < 3 ? year - 1 : year;\n * \n * const start = new Date(fiscalYear, calendarMonth, 1);\n * const end = new Date(fiscalYear, calendarMonth + 3, 0);\n * \n * return {\n * start: adapter.normalize(start),\n * end: adapter.normalize(end)\n * };\n * }\n * },\n * {\n * key: 'FISCAL_YEAR_TO_DATE',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const month = adapter.getMonth(now);\n * const year = adapter.getYear(now);\n * \n * // Fiscal year starts April 1\n * const fiscalYearStart = month >= 3 \n * ? new Date(year, 3, 1)\n * : new Date(year - 1, 3, 1);\n * \n * return {\n * start: adapter.normalize(fiscalYearStart),\n * end: adapter.normalize(now)\n * };\n * }\n * }\n * ];\n * \n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideCustomPresets(FISCAL_PRESETS)\n * ]\n * };\n * \n * // Use in components\n * store.applyPreset('THIS_FISCAL_QUARTER');\n * store.applyPreset('FISCAL_YEAR_TO_DATE');\n * ```\n * \n * @example\n * ```typescript\n * // Hotel presets\n * const HOTEL_PRESETS: RangePresetPlugin[] = [\n * {\n * key: 'CHECK_IN_WEEK',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const dayOfWeek = adapter.getDayOfWeek(now);\n * \n * // Check-in week: Friday to Friday\n * const daysToNextFriday = dayOfWeek <= 5 \n * ? 5 - dayOfWeek \n * : 7 - dayOfWeek + 5;\n * \n * const nextFriday = adapter.addDays(now, daysToNextFriday);\n * const followingFriday = adapter.addDays(nextFriday, 7);\n * \n * return { start: nextFriday, end: followingFriday };\n * }\n * },\n * {\n * key: 'NEXT_30_NIGHTS',\n * resolve: (clock, adapter) => {\n * const now = clock.now();\n * const tomorrow = adapter.addDays(now, 1);\n * const end = adapter.addDays(tomorrow, 30);\n * return { start: tomorrow, end };\n * }\n * }\n * ];\n * \n * providers: [provideCustomPresets(HOTEL_PRESETS)]\n * ```\n */\nexport function provideCustomPresets(presets: RangePresetPlugin[]): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (registry: PresetRegistry) => {\n return () => {\n presets.forEach(preset => {\n registry.register(preset);\n });\n\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(\n `[ng-dual-datepicker] Registered ${presets.length} custom presets:`,\n presets.map(p => p.key).join(', ')\n );\n }\n };\n },\n deps: [PresetRegistry]\n }\n ]);\n}\n\n/**\n * Provide preset package\n * \n * Convenience function for external preset packages.\n * \n * @param packageName - Name of the preset package (for logging)\n * @param presets - Array of presets from the package\n * @returns EnvironmentProviders\n * \n * @example\n * ```typescript\n * // @acme/fiscal-presets package\n * export function provideFiscalPresets(): EnvironmentProviders {\n * return providePresetPackage('@acme/fiscal-presets', FISCAL_PRESETS);\n * }\n * \n * // In app\n * import { provideFiscalPresets } from '@acme/fiscal-presets';\n * \n * providers: [provideFiscalPresets()]\n * ```\n */\nexport function providePresetPackage(\n packageName: string,\n presets: RangePresetPlugin[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (registry: PresetRegistry) => {\n return () => {\n presets.forEach(preset => {\n registry.register(preset);\n });\n\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(\n `[${packageName}] Registered ${presets.length} presets:`,\n presets.map(p => p.key).join(', ')\n );\n }\n };\n },\n deps: [PresetRegistry]\n }\n ]);\n}\n","/**\n * Core headless date range logic\n * \n * v3.6.0: Plugin Architecture\n * - RangePresetPlugin interface for extensible presets\n * - PresetRegistry for plugin management\n * - Built-in presets as plugins\n * - Provider functions for custom presets\n * \n * v3.7.0: Calendar Grid Cache\n * - CalendarGridFactory for deterministic grid generation\n * - CalendarGridCache with LRU memoization\n * - Separates grid structure from decorations for performance\n * \n * v3.8.0: Range Highlight Cache\n * - RangeHighlighter for decoration logic (pure computation)\n * - RangeHighlighterCache with LRU (48 grids)\n * - Eliminates redundant decoration recomputations\n * \n * Import from here for clean barrel exports\n */\n\nexport * from './dual-date-range.store';\nexport * from './preset.engine';\nexport * from './range.validator';\nexport * from './date-clock';\nexport * from './system-clock';\nexport * from './date-adapter';\nexport * from './native-date-adapter';\n\n// v3.6.0: Plugin System\nexport * from './range-preset.plugin';\nexport * from './preset-registry';\nexport * from './built-in-presets';\nexport * from './preset-providers';\n\n// v3.7.0: Calendar Grid Cache\n// v3.8.0: Range Highlight Cache\nexport * from './calendar-grid';\n","/**\n * Public API Surface of @oneluiz/dual-datepicker\n */\n\nexport { DualDatepickerComponent } from './dual-datepicker.component';\nexport type { DateRange, MultiDateRange, PresetConfig, PresetRange, LocaleConfig, ThemeType } from './dual-datepicker.component';\n\n// Date Adapter System\nexport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nexport { NativeDateAdapter } from './native-date-adapter';\n\n// Preset Utilities (deprecated - use core/preset.engine instead)\nexport * from './preset-utils';\n\n// NEW v3.5.0: Headless Core - Use without UI\n// Perfect for SSR, global state, dashboard filters\nexport * from './core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DATE_ADAPTER","NativeDateAdapter","i1.CalendarGridFactory"],"mappings":"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"}
|