@oneluiz/dual-datepicker 4.0.1 → 4.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"oneluiz-dual-datepicker.mjs","sources":["../../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/preset-providers.ts","../../src/core/public.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.ts","../../src/core/calendar-grid/range-highlighter.cache.ts","../../src/core/calendar-grid/virtual-weeks.logic.ts","../../src/core/testing/fixed-clock.ts","../../src/core/testing/date.helpers.ts","../../src/core/testing/index.ts","../../src/core/internal.ts","../../src/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/public-api.ts","../../src/oneluiz-dual-datepicker.ts"],"sourcesContent":["/**\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 // Update _rightMonth to correct value after adapter is available\n this._rightMonth.set(this.getNextMonth(new Date()));\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>(new Date()); // Temporary value, updated in constructor\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.getDate(date); // FIX: use getDate() not getDay()\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 * 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 * PUBLIC API for @oneluiz/dual-datepicker\n * \n * This file defines the stable public API contract.\n * Exports from this barrel are guaranteed to follow semantic versioning.\n * \n * @public\n * @packageDocumentation\n * @module @oneluiz/dual-datepicker/core\n * @since v4.0.0\n */\n\n// ============================================================================\n// HEADLESS STORE\n// ============================================================================\n\n/**\n * DualDateRangeStore - Signal-based headless date range store\n * \n * Core reactive store for managing date range state without UI dependencies.\n * Perfect for SSR, global state, and custom UI implementations.\n * \n * @public\n * @since v3.5.0\n */\nexport { DualDateRangeStore } from './dual-date-range.store';\n\n// ============================================================================\n// DATE ADAPTER SYSTEM\n// ============================================================================\n\n/**\n * DateAdapter - Abstract date manipulation interface\n * \n * Provides timezone-safe date operations.\n * Implement this interface for custom date libraries (Luxon, date-fns, etc.)\n * \n * @public\n * @since v1.0.0\n */\nexport type { DateAdapter } from './date-adapter';\nexport { DATE_ADAPTER } from './date-adapter';\n\n/**\n * NativeDateAdapter - Built-in implementation using native Date\n * \n * Default adapter that uses JavaScript's native Date object.\n * Provides timezone-safe operations without external dependencies.\n * \n * @public\n * @since v1.0.0\n */\nexport { NativeDateAdapter } from './native-date-adapter';\n\n// ============================================================================\n// PRESET PLUGIN SYSTEM (v3.6.0+)\n// ============================================================================\n\n/**\n * RangePresetPlugin - Interface for extensible date range presets\n * \n * Implement this interface to create custom preset plugins.\n * Supports dynamic ranges, validation, and custom logic.\n * \n * @public\n * @since v3.6.0\n */\nexport type {\n RangePresetPlugin\n} from './range-preset.plugin';\n\n/**\n * PresetRegistry - Plugin management and lifecycle\n * \n * Injectable service that manages preset plugins.\n * Handles registration, resolution, and validation.\n * \n * @public\n * @since v3.6.0\n */\nexport { PresetRegistry } from './preset-registry';\n\n/**\n * Built-in Presets - Standard date range presets as plugins\n * \n * Pre-configured plugins for common use cases:\n * - TODAY, YESTERDAY\n * - LAST_7_DAYS, LAST_30_DAYS\n * - THIS_WEEK, LAST_WEEK\n * - THIS_MONTH, LAST_MONTH\n * - THIS_YEAR, LAST_YEAR\n * \n * @public\n * @since v3.6.0\n */\nexport {\n BUILT_IN_PRESETS,\n TODAY_PRESET,\n YESTERDAY_PRESET,\n LAST_7_DAYS_PRESET,\n LAST_30_DAYS_PRESET,\n THIS_WEEK_PRESET,\n LAST_WEEK_PRESET,\n THIS_MONTH_PRESET,\n LAST_MONTH_PRESET,\n THIS_YEAR_PRESET,\n LAST_YEAR_PRESET\n} from './built-in-presets';\n\n/**\n * Provider Functions - Dependency injection helpers\n * \n * Functions for configuring the library via Angular DI:\n * - provideCustomPresets() - Custom preset plugins\n * - providePresetPackage() - Preset packages\n * \n * @public\n * @since v3.6.0\n */\nexport {\n provideCustomPresets,\n providePresetPackage\n} from './preset-providers';\n\n// ============================================================================\n// VALIDATION & UTILITIES\n// ============================================================================\n\n/**\n * Range Validation Utilities\n * \n * Pure functions for date range validation logic.\n * Used internally but exposed for custom implementations.\n * \n * @public\n * @since v3.5.0\n */\nexport {\n validateRangeOrder,\n applyBounds,\n isDateDisabled,\n type ValidationResult\n} from './range.validator';\n\n/**\n * Preset Engine - Preset resolution and management\n * \n * Core engine that handles preset plugin execution.\n * Used internally but exposed for advanced use cases.\n * \n * @public\n * @since v3.6.0\n */\nexport { PresetEngine } from './preset.engine';\n\n// ============================================================================\n// TYPE EXPORTS (for TypeScript users)\n// ============================================================================\n\n/**\n * Re-export types for convenience\n * \n * These types are already exported by their respective modules,\n * but we re-export them here for easier imports.\n */\nexport type {\n // From range.validator\n ValidationResult as RangeValidationResult\n} from './range.validator';\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 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 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 * Fixed Clock for Deterministic Testing\n * \n * Implements DateClock interface with a fixed date.\n * \n * Usage:\n * ```typescript\n * const clock = new FixedClock(new Date(2026, 1, 21)); // Feb 21, 2026\n * const now = clock.now(); // Always returns Feb 21, 2026 (cloned)\n * ```\n * \n * Why clone?\n * - Prevents test pollution if consumer mutates the returned date\n * - Each call to now() returns a fresh Date instance\n */\n\nimport { DateClock } from '../date-clock';\n\nexport class FixedClock implements DateClock {\n constructor(private readonly fixedDate: Date) {}\n\n /**\n * Returns a cloned copy of the fixed date\n * \n * Cloning prevents test pollution from mutations\n */\n now(): Date {\n return new Date(this.fixedDate);\n }\n}\n","/**\n * Date Test Helpers\n * \n * Utilities for creating deterministic dates in tests.\n */\n\n/**\n * Create a Date in local timezone\n * \n * @param year - Full year (e.g., 2026)\n * @param month - Month 1-12 (natural notation)\n * @param day - Day of month 1-31\n * @returns Date at 00:00:00.000 local time\n * \n * @example\n * makeDate(2026, 2, 21) // Feb 21, 2026 00:00:00.000\n */\nexport function makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month - 1, day); // month-1 because Date uses 0-indexed months\n}\n\n/**\n * Create ISO date string (YYYY-MM-DD)\n * \n * @param year - Full year (e.g., 2026)\n * @param month - Month 1-12 (natural notation)\n * @param day - Day of month 1-31\n * @returns ISO date string\n * \n * @example\n * iso(2026, 2, 21) // '2026-02-21'\n */\nexport function iso(year: number, month: number, day: number): string {\n const y = String(year).padStart(4, '0');\n const m = String(month).padStart(2, '0');\n const d = String(day).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n/**\n * Compare two dates for equality (ignoring time)\n * \n * @param a - First date\n * @param b - Second date\n * @returns true if same calendar day\n */\nexport function isSameCalendarDay(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 * Testing Utilities\n * \n * Helpers for deterministic date range testing.\n */\n\nexport { FixedClock } from './fixed-clock';\nexport { makeDate, iso, isSameCalendarDay } from './date.helpers';\n","/**\n * INTERNAL API for @oneluiz/dual-datepicker\n * \n * This file exports implementation details required by the component itself.\n * These exports are NOT part of the public API and may change without notice.\n * \n * ⚠️ DO NOT import from this file in your application code.\n * ⚠️ Use the public API from '@oneluiz/dual-datepicker/core' instead.\n * \n * @internal\n * @packageDocumentation\n * @since v4.0.0\n */\n\n// ============================================================================\n// CALENDAR GRID SYSTEM (v3.7.0+)\n// ============================================================================\n\n/**\n * Calendar Grid Types\n * \n * Core types for 42-cell calendar grid structure.\n * Used by the component for rendering month views.\n * \n * @internal\n */\nexport type {\n CalendarGrid,\n CalendarCell,\n CalendarGridCacheKey\n} from './calendar-grid/calendar-grid.types';\n\n/**\n * CalendarGridFactory - Deterministic grid generation\n * \n * Creates normalized 42-cell grids (6 weeks × 7 days).\n * Pure function approach with no side effects.\n * \n * @internal\n */\nexport { CalendarGridFactory } from './calendar-grid/calendar-grid.factory';\n\n/**\n * CalendarGridCache - LRU cache for grid structures\n * \n * Memoizes calendar grids by month/weekStart/locale.\n * Prevents redundant grid generation on re-renders.\n * \n * @internal\n */\nexport { CalendarGridCache } from './calendar-grid/calendar-grid.cache';\n\n// ============================================================================\n// RANGE HIGHLIGHTING SYSTEM (v3.8.0+)\n// ============================================================================\n\n/**\n * Range Highlighter Types\n * \n * Types for decorated grids with range highlighting.\n * Used by the component for visual decorations.\n * \n * @internal\n */\nexport type {\n DecoratedGrid,\n DecoratedCell,\n RangeDecorationParams,\n DecoratedGridCacheKey\n} from './calendar-grid/range-highlighter.types';\n\n/**\n * RangeHighlighter - Pure decoration logic\n * \n * Applies range highlighting to calendar grids.\n * Handles start/end/hover/disabled states.\n * \n * @internal\n */\nexport { RangeHighlighter } from './calendar-grid/range-highlighter';\n\n/**\n * RangeHighlighterCache - LRU cache for decorated grids\n * \n * Memoizes decorated grids by range parameters.\n * Eliminates redundant decoration computations.\n * \n * @internal\n */\nexport { RangeHighlighterCache } from './calendar-grid/range-highlighter.cache';\n\n// ============================================================================\n// VIRTUAL WEEKS SYSTEM (v3.9.0+)\n// ============================================================================\n\n/**\n * Virtual Weeks Types\n * \n * Types for windowed rendering of calendar weeks.\n * Reduces DOM complexity for large calendars.\n * \n * @internal\n */\nexport type {\n VirtualWeeksConfig,\n VirtualWeekWindow\n} from './calendar-grid/virtual-weeks.types';\n\n/**\n * Virtual Weeks Logic\n * \n * Functions for calculating visible week windows.\n * Enables progressive rendering and infinite scroll.\n * \n * @internal\n */\nexport {\n getVisibleWeeks,\n navigateWeekWindow,\n isVirtualWeeksEnabled\n} from './calendar-grid/virtual-weeks.logic';\n\n// ============================================================================\n// CACHE CONFIGURATION (v3.9.2+)\n// ============================================================================\n\n/**\n * Cache Configuration\n * \n * Shared cache size limits for memory safety.\n * MAX_CACHE_ENTRIES = 48 (4 years of navigation)\n * \n * @internal\n */\nexport { MAX_CACHE_ENTRIES } from './calendar-grid/cache.config';\n\n// ============================================================================\n// DATE CLOCK SYSTEM\n// ============================================================================\n\n/**\n * DateClock - Abstract time source\n * \n * Interface for injecting custom time sources.\n * Enables deterministic testing and SSR.\n * \n * @internal\n */\nexport type { DateClock } from './date-clock';\n\n/**\n * SystemClock - Default implementation\n * \n * Uses native Date.now() and new Date().\n * Default time source for production.\n * \n * @internal\n */\nexport { SystemClock } from './system-clock';\n\n// ============================================================================\n// TESTING UTILITIES\n// ============================================================================\n\n/**\n * Testing Helpers\n * \n * Utilities for writing deterministic tests.\n * FixedClock, makeDate, etc.\n * \n * @internal\n */\nexport * from './testing';\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';\n\n// Public API imports\nimport { DateAdapter, DATE_ADAPTER } from './core/public';\nimport { NativeDateAdapter } from './core/public';\nimport { DualDateRangeStore } from './core/public';\nimport { PresetRegistry } from './core/public';\nimport { BUILT_IN_PRESETS } from './core/public';\n\n// Internal API imports (component implementation)\nimport {\n CalendarGridCache,\n CalendarGrid,\n CalendarCell,\n RangeHighlighterCache,\n DecoratedCell,\n VirtualWeeksConfig,\n getVisibleWeeks,\n navigateWeekWindow,\n isVirtualWeeksEnabled\n} from './core/internal';\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.parseISODate(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.parseISODate(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.normalize(new Date()));\n previousMonth = signal(this.dateAdapter.normalize(new Date()));\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.toISODate(this.dateAdapter.normalize(new Date()));\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.toISODate(this.dateAdapter.normalize(new Date()));\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.toISODate(this.dateAdapter.normalize(new Date()));\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.parseISODate(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.parseISODate(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.parseISODate(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.parseISODate(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.normalize(new Date(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.normalize(new Date(currentYear + direction, currentMonth, 1)));\n this.previousMonth.set(this.dateAdapter.normalize(new Date(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.parseISODate(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (this.endDate) {\n const date = this.dateAdapter.parseISODate(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.parseISODate(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (changes['endDate'] && this.endDate) {\n const date = this.dateAdapter.parseISODate(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.parseISODate(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.normalize(new Date(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.parseISODate(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.normalize(new Date(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.normalize(new Date(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.parseISODate(range.start);\n const endDate = this.dateAdapter.parseISODate(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","/**\n * Public API Surface of @oneluiz/dual-datepicker\n * \n * v4.0.0: Formalized Public API\n * - Only stable, documented APIs are exported\n * - Internal implementation details removed\n * - Backward compatibility maintained where possible\n * \n * @public\n * @packageDocumentation\n * @module @oneluiz/dual-datepicker\n */\n\n// ============================================================================\n// UI COMPONENT\n// ============================================================================\n\n/**\n * DualDatepickerComponent - Main Angular component\n * \n * Standalone component for dual-calendar date range selection.\n * Supports reactive forms, signals, themes, and extensive customization.\n * \n * @public\n * @since v1.0.0\n */\nexport { DualDatepickerComponent } from './dual-datepicker.component';\n\n/**\n * Component Types\n * \n * TypeScript types for component inputs/outputs.\n * \n * @public\n */\nexport type {\n DateRange,\n MultiDateRange,\n PresetConfig,\n PresetRange,\n LocaleConfig,\n ThemeType\n} from './dual-datepicker.component';\n\n// ============================================================================\n// HEADLESS CORE (v3.5.0+)\n// ============================================================================\n\n/**\n * Headless Core API\n * \n * Signal-based headless store, preset plugins, and date adapter system.\n * Use without UI for:\n * - SSR applications\n * - Global state management\n * - Dashboard filters\n * - Custom UI implementations\n * \n * @public\n * @since v3.5.0\n */\nexport * from './core/public';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CalendarGridFactory"],"mappings":"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"}
1
+ {"version":3,"file":"oneluiz-dual-datepicker.mjs","sources":["../../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/preset-providers.ts","../../src/core/public.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.ts","../../src/core/calendar-grid/range-highlighter.cache.ts","../../src/core/calendar-grid/virtual-weeks.logic.ts","../../src/core/testing/fixed-clock.ts","../../src/core/testing/date.helpers.ts","../../src/core/testing/index.ts","../../src/core/internal.ts","../../src/dual-datepicker.component.ts","../../src/dual-datepicker.component.html","../../src/public-api.ts","../../src/oneluiz-dual-datepicker.ts"],"sourcesContent":["/**\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 // Update _rightMonth to correct value after adapter is available\n this._rightMonth.set(this.getNextMonth(new Date()));\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>(new Date()); // Temporary value, updated in constructor\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.getDate(date); // FIX: use getDate() not getDay()\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 * 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 * PUBLIC API for @oneluiz/dual-datepicker\n * \n * This file defines the stable public API contract.\n * Exports from this barrel are guaranteed to follow semantic versioning.\n * \n * @public\n * @packageDocumentation\n * @module @oneluiz/dual-datepicker/core\n * @since v4.0.0\n */\n\n// ============================================================================\n// HEADLESS STORE\n// ============================================================================\n\n/**\n * DualDateRangeStore - Signal-based headless date range store\n * \n * Core reactive store for managing date range state without UI dependencies.\n * Perfect for SSR, global state, and custom UI implementations.\n * \n * @public\n * @since v3.5.0\n */\nexport { DualDateRangeStore } from './dual-date-range.store';\n\n// ============================================================================\n// DATE ADAPTER SYSTEM\n// ============================================================================\n\n/**\n * DateAdapter - Abstract date manipulation interface\n * \n * Provides timezone-safe date operations.\n * Implement this interface for custom date libraries (Luxon, date-fns, etc.)\n * \n * @public\n * @since v1.0.0\n */\nexport type { DateAdapter } from './date-adapter';\nexport { DATE_ADAPTER } from './date-adapter';\n\n/**\n * NativeDateAdapter - Built-in implementation using native Date\n * \n * Default adapter that uses JavaScript's native Date object.\n * Provides timezone-safe operations without external dependencies.\n * \n * @public\n * @since v1.0.0\n */\nexport { NativeDateAdapter } from './native-date-adapter';\n\n// ============================================================================\n// PRESET PLUGIN SYSTEM (v3.6.0+)\n// ============================================================================\n\n/**\n * RangePresetPlugin - Interface for extensible date range presets\n * \n * Implement this interface to create custom preset plugins.\n * Supports dynamic ranges, validation, and custom logic.\n * \n * @public\n * @since v3.6.0\n */\nexport type {\n RangePresetPlugin\n} from './range-preset.plugin';\n\n/**\n * PresetRegistry - Plugin management and lifecycle\n * \n * Injectable service that manages preset plugins.\n * Handles registration, resolution, and validation.\n * \n * @public\n * @since v3.6.0\n */\nexport { PresetRegistry } from './preset-registry';\n\n/**\n * Built-in Presets - Standard date range presets as plugins\n * \n * Pre-configured plugins for common use cases:\n * - TODAY, YESTERDAY\n * - LAST_7_DAYS, LAST_30_DAYS\n * - THIS_WEEK, LAST_WEEK\n * - THIS_MONTH, LAST_MONTH\n * - THIS_YEAR, LAST_YEAR\n * \n * @public\n * @since v3.6.0\n */\nexport {\n BUILT_IN_PRESETS,\n TODAY_PRESET,\n YESTERDAY_PRESET,\n LAST_7_DAYS_PRESET,\n LAST_30_DAYS_PRESET,\n THIS_WEEK_PRESET,\n LAST_WEEK_PRESET,\n THIS_MONTH_PRESET,\n LAST_MONTH_PRESET,\n THIS_YEAR_PRESET,\n LAST_YEAR_PRESET\n} from './built-in-presets';\n\n/**\n * Provider Functions - Dependency injection helpers\n * \n * Functions for configuring the library via Angular DI:\n * - provideCustomPresets() - Custom preset plugins\n * - providePresetPackage() - Preset packages\n * \n * @public\n * @since v3.6.0\n */\nexport {\n provideCustomPresets,\n providePresetPackage\n} from './preset-providers';\n\n// ============================================================================\n// VALIDATION & UTILITIES\n// ============================================================================\n\n/**\n * Range Validation Utilities\n * \n * Pure functions for date range validation logic.\n * Used internally but exposed for custom implementations.\n * \n * @public\n * @since v3.5.0\n */\nexport {\n validateRangeOrder,\n applyBounds,\n isDateDisabled,\n type ValidationResult\n} from './range.validator';\n\n/**\n * Preset Engine - Preset resolution and management\n * \n * Core engine that handles preset plugin execution.\n * Used internally but exposed for advanced use cases.\n * \n * @public\n * @since v3.6.0\n */\nexport { PresetEngine } from './preset.engine';\n\n// ============================================================================\n// TYPE EXPORTS (for TypeScript users)\n// ============================================================================\n\n/**\n * Re-export types for convenience\n * \n * These types are already exported by their respective modules,\n * but we re-export them here for easier imports.\n */\nexport type {\n // From range.validator\n ValidationResult as RangeValidationResult\n} from './range.validator';\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, Optional } from '@angular/core';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarCell, CalendarGrid } from './calendar-grid.types';\nimport { NativeDateAdapter } from '../native-date-adapter';\n\n@Injectable({ providedIn: 'root' })\nexport class CalendarGridFactory {\n private adapter: DateAdapter;\n\n constructor(\n @Optional() @Inject(DATE_ADAPTER) adapter?: DateAdapter\n ) {\n this.adapter = adapter ?? new NativeDateAdapter();\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 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 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 * Fixed Clock for Deterministic Testing\n * \n * Implements DateClock interface with a fixed date.\n * \n * Usage:\n * ```typescript\n * const clock = new FixedClock(new Date(2026, 1, 21)); // Feb 21, 2026\n * const now = clock.now(); // Always returns Feb 21, 2026 (cloned)\n * ```\n * \n * Why clone?\n * - Prevents test pollution if consumer mutates the returned date\n * - Each call to now() returns a fresh Date instance\n */\n\nimport { DateClock } from '../date-clock';\n\nexport class FixedClock implements DateClock {\n constructor(private readonly fixedDate: Date) {}\n\n /**\n * Returns a cloned copy of the fixed date\n * \n * Cloning prevents test pollution from mutations\n */\n now(): Date {\n return new Date(this.fixedDate);\n }\n}\n","/**\n * Date Test Helpers\n * \n * Utilities for creating deterministic dates in tests.\n */\n\n/**\n * Create a Date in local timezone\n * \n * @param year - Full year (e.g., 2026)\n * @param month - Month 1-12 (natural notation)\n * @param day - Day of month 1-31\n * @returns Date at 00:00:00.000 local time\n * \n * @example\n * makeDate(2026, 2, 21) // Feb 21, 2026 00:00:00.000\n */\nexport function makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month - 1, day); // month-1 because Date uses 0-indexed months\n}\n\n/**\n * Create ISO date string (YYYY-MM-DD)\n * \n * @param year - Full year (e.g., 2026)\n * @param month - Month 1-12 (natural notation)\n * @param day - Day of month 1-31\n * @returns ISO date string\n * \n * @example\n * iso(2026, 2, 21) // '2026-02-21'\n */\nexport function iso(year: number, month: number, day: number): string {\n const y = String(year).padStart(4, '0');\n const m = String(month).padStart(2, '0');\n const d = String(day).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n/**\n * Compare two dates for equality (ignoring time)\n * \n * @param a - First date\n * @param b - Second date\n * @returns true if same calendar day\n */\nexport function isSameCalendarDay(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 * Testing Utilities\n * \n * Helpers for deterministic date range testing.\n */\n\nexport { FixedClock } from './fixed-clock';\nexport { makeDate, iso, isSameCalendarDay } from './date.helpers';\n","/**\n * INTERNAL API for @oneluiz/dual-datepicker\n * \n * This file exports implementation details required by the component itself.\n * These exports are NOT part of the public API and may change without notice.\n * \n * ⚠️ DO NOT import from this file in your application code.\n * ⚠️ Use the public API from '@oneluiz/dual-datepicker/core' instead.\n * \n * @internal\n * @packageDocumentation\n * @since v4.0.0\n */\n\n// ============================================================================\n// CALENDAR GRID SYSTEM (v3.7.0+)\n// ============================================================================\n\n/**\n * Calendar Grid Types\n * \n * Core types for 42-cell calendar grid structure.\n * Used by the component for rendering month views.\n * \n * @internal\n */\nexport type {\n CalendarGrid,\n CalendarCell,\n CalendarGridCacheKey\n} from './calendar-grid/calendar-grid.types';\n\n/**\n * CalendarGridFactory - Deterministic grid generation\n * \n * Creates normalized 42-cell grids (6 weeks × 7 days).\n * Pure function approach with no side effects.\n * \n * @internal\n */\nexport { CalendarGridFactory } from './calendar-grid/calendar-grid.factory';\n\n/**\n * CalendarGridCache - LRU cache for grid structures\n * \n * Memoizes calendar grids by month/weekStart/locale.\n * Prevents redundant grid generation on re-renders.\n * \n * @internal\n */\nexport { CalendarGridCache } from './calendar-grid/calendar-grid.cache';\n\n// ============================================================================\n// RANGE HIGHLIGHTING SYSTEM (v3.8.0+)\n// ============================================================================\n\n/**\n * Range Highlighter Types\n * \n * Types for decorated grids with range highlighting.\n * Used by the component for visual decorations.\n * \n * @internal\n */\nexport type {\n DecoratedGrid,\n DecoratedCell,\n RangeDecorationParams,\n DecoratedGridCacheKey\n} from './calendar-grid/range-highlighter.types';\n\n/**\n * RangeHighlighter - Pure decoration logic\n * \n * Applies range highlighting to calendar grids.\n * Handles start/end/hover/disabled states.\n * \n * @internal\n */\nexport { RangeHighlighter } from './calendar-grid/range-highlighter';\n\n/**\n * RangeHighlighterCache - LRU cache for decorated grids\n * \n * Memoizes decorated grids by range parameters.\n * Eliminates redundant decoration computations.\n * \n * @internal\n */\nexport { RangeHighlighterCache } from './calendar-grid/range-highlighter.cache';\n\n// ============================================================================\n// VIRTUAL WEEKS SYSTEM (v3.9.0+)\n// ============================================================================\n\n/**\n * Virtual Weeks Types\n * \n * Types for windowed rendering of calendar weeks.\n * Reduces DOM complexity for large calendars.\n * \n * @internal\n */\nexport type {\n VirtualWeeksConfig,\n VirtualWeekWindow\n} from './calendar-grid/virtual-weeks.types';\n\n/**\n * Virtual Weeks Logic\n * \n * Functions for calculating visible week windows.\n * Enables progressive rendering and infinite scroll.\n * \n * @internal\n */\nexport {\n getVisibleWeeks,\n navigateWeekWindow,\n isVirtualWeeksEnabled\n} from './calendar-grid/virtual-weeks.logic';\n\n// ============================================================================\n// CACHE CONFIGURATION (v3.9.2+)\n// ============================================================================\n\n/**\n * Cache Configuration\n * \n * Shared cache size limits for memory safety.\n * MAX_CACHE_ENTRIES = 48 (4 years of navigation)\n * \n * @internal\n */\nexport { MAX_CACHE_ENTRIES } from './calendar-grid/cache.config';\n\n// ============================================================================\n// DATE CLOCK SYSTEM\n// ============================================================================\n\n/**\n * DateClock - Abstract time source\n * \n * Interface for injecting custom time sources.\n * Enables deterministic testing and SSR.\n * \n * @internal\n */\nexport type { DateClock } from './date-clock';\n\n/**\n * SystemClock - Default implementation\n * \n * Uses native Date.now() and new Date().\n * Default time source for production.\n * \n * @internal\n */\nexport { SystemClock } from './system-clock';\n\n// ============================================================================\n// TESTING UTILITIES\n// ============================================================================\n\n/**\n * Testing Helpers\n * \n * Utilities for writing deterministic tests.\n * FixedClock, makeDate, etc.\n * \n * @internal\n */\nexport * from './testing';\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';\n\n// Public API imports\nimport { DateAdapter, DATE_ADAPTER } from './core/public';\nimport { NativeDateAdapter } from './core/public';\nimport { DualDateRangeStore } from './core/public';\nimport { PresetRegistry } from './core/public';\nimport { BUILT_IN_PRESETS } from './core/public';\n\n// Internal API imports (component implementation)\nimport {\n CalendarGridCache,\n CalendarGrid,\n CalendarCell,\n RangeHighlighterCache,\n DecoratedCell,\n VirtualWeeksConfig,\n getVisibleWeeks,\n navigateWeekWindow,\n isVirtualWeeksEnabled\n} from './core/internal';\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.parseISODate(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.parseISODate(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.normalize(new Date()));\n previousMonth = signal(this.dateAdapter.normalize(new Date()));\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.toISODate(this.dateAdapter.normalize(new Date()));\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.toISODate(this.dateAdapter.normalize(new Date()));\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.toISODate(this.dateAdapter.normalize(new Date()));\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.parseISODate(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.parseISODate(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.parseISODate(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.parseISODate(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.normalize(new Date(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.normalize(new Date(currentYear + direction, currentMonth, 1)));\n this.previousMonth.set(this.dateAdapter.normalize(new Date(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.parseISODate(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (this.endDate) {\n const date = this.dateAdapter.parseISODate(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.parseISODate(this.startDate);\n if (date) this.rangeStore.setStart(date);\n }\n if (changes['endDate'] && this.endDate) {\n const date = this.dateAdapter.parseISODate(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.parseISODate(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.normalize(new Date(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.parseISODate(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.normalize(new Date(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.normalize(new Date(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.parseISODate(range.start);\n const endDate = this.dateAdapter.parseISODate(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","/**\n * Public API Surface of @oneluiz/dual-datepicker\n * \n * v4.0.0: Formalized Public API\n * - Only stable, documented APIs are exported\n * - Internal implementation details removed\n * - Backward compatibility maintained where possible\n * \n * @public\n * @packageDocumentation\n * @module @oneluiz/dual-datepicker\n */\n\n// ============================================================================\n// UI COMPONENT\n// ============================================================================\n\n/**\n * DualDatepickerComponent - Main Angular component\n * \n * Standalone component for dual-calendar date range selection.\n * Supports reactive forms, signals, themes, and extensive customization.\n * \n * @public\n * @since v1.0.0\n */\nexport { DualDatepickerComponent } from './dual-datepicker.component';\n\n/**\n * Component Types\n * \n * TypeScript types for component inputs/outputs.\n * \n * @public\n */\nexport type {\n DateRange,\n MultiDateRange,\n PresetConfig,\n PresetRange,\n LocaleConfig,\n ThemeType\n} from './dual-datepicker.component';\n\n// ============================================================================\n// HEADLESS CORE (v3.5.0+)\n// ============================================================================\n\n/**\n * Headless Core API\n * \n * Signal-based headless store, preset plugins, and date adapter system.\n * Use without UI for:\n * - SSR applications\n * - Global state management\n * - Dashboard filters\n * - Custom UI implementations\n * \n * @public\n * @since v3.5.0\n */\nexport * from './core/public';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CalendarGridFactory"],"mappings":"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"}