ngx-datex 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-datex.mjs +488 -58
- package/fesm2022/ngx-datex.mjs.map +1 -0
- package/package.json +1 -1
- package/types/ngx-datex.d.ts +441 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-datex.mjs","sources":["../../../ngx-datex/src/lib/utils/date.utils.ts","../../../ngx-datex/src/lib/constants/defaults.ts","../../../ngx-datex/src/lib/services/ngx-datex.service.ts","../../../ngx-datex/src/lib/services/overlay.service.ts","../../../ngx-datex/src/lib/services/time-picker.service.ts","../../../ngx-datex/src/lib/services/calendar.service.ts","../../../ngx-datex/src/lib/ngx-datex.component.ts","../../../ngx-datex/src/lib/ngx-datex.component.html","../../../ngx-datex/src/index.ts","../../../ngx-datex/src/ngx-datex.ts"],"sourcesContent":["import {\r\n addDay,\r\n addMonth,\r\n sameDay,\r\n sameYear,\r\n isBefore,\r\n format as formatDate,\r\n parse as parseDate,\r\n} from '@formkit/tempo';\r\n\r\n/**\r\n * @fileoverview Date utility functions for NgxDatex component.\r\n * Provides date manipulation, formatting, and validation utilities.\r\n * Built on top of @formkit/tempo for reliable date operations.\r\n */\r\n\r\n/**\r\n * Adds the specified number of days to a date.\r\n *\r\n * @param date - The base date\r\n * @param days - Number of days to add (can be negative)\r\n * @returns New date with days added\r\n *\r\n * @example\r\n * ```typescript\r\n * const tomorrow = addDays(new Date(), 1);\r\n * const lastWeek = addDays(new Date(), -7);\r\n * ```\r\n */\r\nexport function addDays(date: Date, days: number): Date {\r\n return addDay(date, days);\r\n}\r\n\r\n/**\r\n * Adds the specified number of months to a date.\r\n *\r\n * @param date - The base date\r\n * @param months - Number of months to add (can be negative)\r\n * @returns New date with months added\r\n *\r\n * @example\r\n * ```typescript\r\n * const nextMonth = addMonths(new Date(), 1);\r\n * const lastYear = addMonths(new Date(), -12);\r\n * ```\r\n */\r\nexport function addMonths(date: Date, months: number): Date {\r\n return addMonth(date, months);\r\n}\r\n\r\n/**\r\n * Returns a new date set to the start of the day (00:00:00.000).\r\n *\r\n * @param date - The input date\r\n * @returns New date at start of day\r\n *\r\n * @example\r\n * ```typescript\r\n * const today = startOfDay(new Date()); // Today at 00:00:00\r\n * ```\r\n */\r\nexport function startOfDay(date: Date): Date {\r\n const result = new Date(date);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a new date set to the end of the day (23:59:59.999).\r\n *\r\n * @param date - The input date\r\n * @returns New date at end of day\r\n *\r\n * @example\r\n * ```typescript\r\n * const endToday = endOfDay(new Date()); // Today at 23:59:59.999\r\n * ```\r\n */\r\nexport function endOfDay(date: Date): Date {\r\n const result = new Date(date);\r\n result.setHours(23, 59, 59, 999);\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a new date set to the first day of the month.\r\n *\r\n * @param date - The input date\r\n * @returns New date at start of month\r\n *\r\n * @example\r\n * ```typescript\r\n * const monthStart = startOfMonth(new Date()); // 1st day of current month\r\n * ```\r\n */\r\nexport function startOfMonth(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n}\r\n\r\n/**\r\n * Returns a new date set to the start of the week.\r\n *\r\n * @param date - The input date\r\n * @param firstDay - First day of week (0 = Sunday, 1 = Monday, etc.)\r\n * @returns New date at start of week\r\n *\r\n * @example\r\n * ```typescript\r\n * const mondayStart = startOfWeek(new Date(), 1); // Start of week (Monday)\r\n * const sundayStart = startOfWeek(new Date(), 0); // Start of week (Sunday)\r\n * ```\r\n */\r\nexport function startOfWeek(date: Date, firstDay = 1): Date {\r\n const day = date.getDay();\r\n const daysBack = (day - firstDay + 7) % 7;\r\n const result = new Date(date);\r\n result.setDate(date.getDate() - daysBack);\r\n return result;\r\n}\r\n\r\n/**\r\n * Checks if two dates represent the same day.\r\n *\r\n * @param date1 - First date to compare\r\n * @param date2 - Second date to compare\r\n * @returns True if dates are on the same day\r\n *\r\n * @example\r\n * ```typescript\r\n * const today = new Date();\r\n * const todayEvening = new Date();\r\n * todayEvening.setHours(23, 59, 59);\r\n *\r\n * isSameDay(today, todayEvening); // true\r\n * ```\r\n */\r\nexport function isSameDay(date1: Date, date2: Date): boolean {\r\n return sameDay(date1, date2);\r\n}\r\n\r\n/**\r\n * Checks if two dates are in the same month and year.\r\n *\r\n * @param date1 - First date to compare\r\n * @param date2 - Second date to compare\r\n * @returns True if dates are in the same month\r\n *\r\n * @example\r\n * ```typescript\r\n * const jan1 = new Date(2024, 0, 1);\r\n * const jan31 = new Date(2024, 0, 31);\r\n *\r\n * isSameMonth(jan1, jan31); // true\r\n * ```\r\n */\r\nexport function isSameMonth(date1: Date, date2: Date): boolean {\r\n return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();\r\n}\r\n\r\n/**\r\n * Checks if two dates are in the same year.\r\n *\r\n * @param date1 - First date to compare\r\n * @param date2 - Second date to compare\r\n * @returns True if dates are in the same year\r\n *\r\n * @example\r\n * ```typescript\r\n * const jan2024 = new Date(2024, 0, 1);\r\n * const dec2024 = new Date(2024, 11, 31);\r\n *\r\n * isSameYear(jan2024, dec2024); // true\r\n * ```\r\n */\r\nexport function isSameYear(date1: Date, date2: Date): boolean {\r\n return sameYear(date1, date2);\r\n}\r\n\r\n/**\r\n * Formats a date using the specified format string and locale.\r\n * Follows vanilla-daterangepicker logic by always using locale.format.\r\n *\r\n * @param date - The date to format\r\n * @param formatStr - Format string (e.g., 'DD/MM/YYYY', 'MM/DD/YYYY HH:mm')\r\n * @param locale - Optional locale string (e.g., 'es-ES', 'en-US')\r\n * @returns Formatted date string\r\n *\r\n * @example\r\n * ```typescript\r\n * const date = new Date('2024-01-15 14:30:00');\r\n * formatDateValue(date, 'DD/MM/YYYY'); // '15/01/2024'\r\n * formatDateValue(date, 'MM/DD/YYYY hh:mm A'); // '01/15/2024 02:30 PM'\r\n * formatDateValue(date, 'DD/MM/YYYY HH:mm', 'es-ES'); // '15/01/2024 14:30'\r\n * ```\r\n */\r\nexport function formatDateValue(date: Date, formatStr: string, locale?: string): string {\r\n try {\r\n // Use @formkit/tempo with locale support (following vanilla-daterangepicker pattern)\r\n return formatDate(date, formatStr, locale);\r\n } catch {\r\n // Fallback to manual formatting if tempo fails\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours24 = date.getHours();\r\n const hours12 = hours24 === 0 ? 12 : hours24 > 12 ? hours24 - 12 : hours24;\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n const ampm = hours24 >= 12 ? 'PM' : 'AM';\r\n\r\n return formatStr\r\n .replace(/YYYY/g, String(year))\r\n .replace(/MM/g, month)\r\n .replace(/DD/g, day)\r\n .replace(/HH/g, String(hours24).padStart(2, '0'))\r\n .replace(/hh/g, String(hours12).padStart(2, '0'))\r\n .replace(/mm/g, minutes)\r\n .replace(/ss/g, seconds)\r\n .replace(/A/g, ampm);\r\n }\r\n}\r\n\r\n/**\r\n * Parses a date string using the specified format string and locale.\r\n * Follows vanilla-daterangepicker logic by always using locale.format.\r\n *\r\n * @param dateStr - The date string to parse\r\n * @param formatStr - Format string (e.g., 'DD/MM/YYYY', 'MM/DD/YYYY HH:mm')\r\n * @param locale - Optional locale string (e.g., 'es-ES', 'en-US')\r\n * @returns Parsed Date object\r\n *\r\n * @example\r\n * ```typescript\r\n * const date1 = parseDateValue('15/01/2024', 'DD/MM/YYYY'); // January 15, 2024\r\n * const date2 = parseDateValue('01/15/2024 02:30 PM', 'MM/DD/YYYY hh:mm A'); // January 15, 2024 14:30\r\n * const date3 = parseDateValue('15/01/2024 14:30', 'DD/MM/YYYY HH:mm', 'es-ES'); // January 15, 2024 14:30\r\n * ```\r\n */\r\nexport function parseDateValue(dateStr: string, formatStr: string, locale?: string): Date {\r\n try {\r\n // Use @formkit/tempo with locale support (following vanilla-daterangepicker pattern)\r\n const parsed = parseDate(dateStr, formatStr, locale);\r\n if (isValidDate(parsed)) {\r\n return parsed;\r\n }\r\n } catch {\r\n // Fallback to manual parsing\r\n }\r\n\r\n // Manual parsing fallback for common formats\r\n if (formatStr === 'YYYY-MM-DD') {\r\n const parts = dateStr.split('-');\r\n if (parts.length === 3) {\r\n const year = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1;\r\n const day = parseInt(parts[2], 10);\r\n return new Date(year, month, day);\r\n }\r\n return new Date(dateStr);\r\n }\r\n\r\n if (formatStr === 'DD/MM/YYYY' || formatStr.startsWith('DD/MM/YYYY')) {\r\n const parts = dateStr.split(' ');\r\n const datePart = parts[0];\r\n const timePart = parts[1];\r\n\r\n const dateComponents = datePart.split('/');\r\n if (dateComponents.length === 3) {\r\n const day = parseInt(dateComponents[0], 10);\r\n const month = parseInt(dateComponents[1], 10) - 1;\r\n const year = parseInt(dateComponents[2], 10);\r\n const date = new Date(year, month, day);\r\n\r\n if (timePart) {\r\n const timeComponents = timePart.split(':');\r\n if (timeComponents.length >= 2) {\r\n let hours = parseInt(timeComponents[0], 10);\r\n const minutes = parseInt(timeComponents[1], 10);\r\n\r\n if (timePart.includes('PM') && hours !== 12) {\r\n hours += 12;\r\n } else if (timePart.includes('AM') && hours === 12) {\r\n hours = 0;\r\n }\r\n\r\n date.setHours(hours, minutes, 0, 0);\r\n }\r\n }\r\n\r\n return date;\r\n }\r\n }\r\n\r\n // Final fallback to native Date parsing\r\n return new Date(dateStr);\r\n}\r\n\r\nexport function isSameDate(\r\n date1: Date,\r\n date2: Date,\r\n unit: 'day' | 'month' | 'year' | 'minute' | 'second' = 'day',\r\n): boolean {\r\n if (!date1 || !date2) return false;\r\n\r\n switch (unit) {\r\n case 'day':\r\n return isSameDay(date1, date2);\r\n case 'month':\r\n return isSameMonth(date1, date2);\r\n case 'year':\r\n return isSameYear(date1, date2);\r\n case 'minute':\r\n return (\r\n isSameDay(date1, date2) &&\r\n date1.getHours() === date2.getHours() &&\r\n date1.getMinutes() === date2.getMinutes()\r\n );\r\n case 'second':\r\n return (\r\n isSameDay(date1, date2) &&\r\n date1.getHours() === date2.getHours() &&\r\n date1.getMinutes() === date2.getMinutes() &&\r\n date1.getSeconds() === date2.getSeconds()\r\n );\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\nexport function isValidDate(date: Date | null | undefined): date is Date {\r\n return date instanceof Date && !isNaN(date.getTime());\r\n}\r\n\r\nexport function isBeforeDate(date1: Date, date2: Date): boolean {\r\n return isBefore(date1, date2);\r\n}\r\n\r\nexport function getStartOfMonth(date: Date): Date {\r\n return startOfMonth(date);\r\n}\r\n\r\nexport function getStartOfWeek(date: Date, firstDay = 1): Date {\r\n return startOfWeek(date, firstDay);\r\n}\r\n\r\nexport function isMobileDevice(): boolean {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n}\r\n","import { NgxDatexLocale, NgxDatexTheme } from '../types/ngx-datex.types';\r\nimport { startOfDay, endOfDay } from '../utils/date.utils';\r\n\r\n/**\r\n * @fileoverview Default configurations for NgxDatex component.\r\n *\r\n * This file contains predefined locales, themes, and date ranges\r\n * that can be used out-of-the-box or as starting points for customization.\r\n */\r\n\r\n/**\r\n * Default Spanish locale configuration.\r\n *\r\n * Provides Spanish language support with DD/MM/YYYY format,\r\n * Spanish day/month names, and Monday as the first day of the week.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [locale]=\"SPANISH_LOCALE\"></ngx-datex>\r\n * ```\r\n */\r\nexport const SPANISH_LOCALE: NgxDatexLocale = {\r\n locale: 'es-ES',\r\n direction: 'ltr',\r\n format: 'DD/MM/YYYY',\r\n separator: ' - ',\r\n applyLabel: 'Aplicar',\r\n cancelLabel: 'Cancelar',\r\n weekLabel: 'S',\r\n customRangeLabel: 'Personalizado',\r\n daysOfWeek: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],\r\n monthNames: [\r\n 'Enero',\r\n 'Febrero',\r\n 'Marzo',\r\n 'Abril',\r\n 'Mayo',\r\n 'Junio',\r\n 'Julio',\r\n 'Agosto',\r\n 'Septiembre',\r\n 'Octubre',\r\n 'Noviembre',\r\n 'Diciembre',\r\n ],\r\n firstDay: 1, // Lunes como primer día\r\n};\r\n\r\n/**\r\n * Spanish locale with time picker support (24-hour format).\r\n *\r\n * Same as SPANISH_LOCALE but with DD/MM/YYYY HH:mm format for time picker usage.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [locale]=\"SPANISH_LOCALE_WITH_TIME\" [timePicker]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\nexport const SPANISH_LOCALE_WITH_TIME: NgxDatexLocale = {\r\n ...SPANISH_LOCALE,\r\n format: 'DD/MM/YYYY HH:mm',\r\n};\r\n\r\n/**\r\n * Spanish locale with time picker support (12-hour format).\r\n *\r\n * Same as SPANISH_LOCALE but with DD/MM/YYYY hh:mm A format for 12-hour time picker.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [locale]=\"SPANISH_LOCALE_WITH_TIME_12H\" [timePicker]=\"true\" [timePicker24Hour]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\nexport const SPANISH_LOCALE_WITH_TIME_12H: NgxDatexLocale = {\r\n ...SPANISH_LOCALE,\r\n format: 'DD/MM/YYYY hh:mm A',\r\n};\r\n\r\n/**\r\n * US English locale configuration.\r\n *\r\n * Provides English language support with MM/DD/YYYY format,\r\n * English day/month names, and Sunday as the first day of the week.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [locale]=\"US_ENGLISH_LOCALE\"></ngx-datex>\r\n * ```\r\n */\r\nexport const US_ENGLISH_LOCALE: NgxDatexLocale = {\r\n locale: 'en-US',\r\n direction: 'ltr',\r\n format: 'MM/DD/YYYY',\r\n separator: ' - ',\r\n applyLabel: 'Apply',\r\n cancelLabel: 'Cancel',\r\n weekLabel: 'W',\r\n customRangeLabel: 'Custom Range',\r\n daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\r\n monthNames: [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n ],\r\n firstDay: 0, // Sunday as first day\r\n};\r\n\r\n/**\r\n * US English locale with time picker support (12-hour format).\r\n *\r\n * Same as US_ENGLISH_LOCALE but with MM/DD/YYYY hh:mm A format for time picker usage.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [locale]=\"US_ENGLISH_LOCALE_WITH_TIME\" [timePicker]=\"true\" [timePicker24Hour]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\nexport const US_ENGLISH_LOCALE_WITH_TIME: NgxDatexLocale = {\r\n ...US_ENGLISH_LOCALE,\r\n format: 'MM/DD/YYYY hh:mm A',\r\n};\r\n\r\n/**\r\n * ISO format locale configuration.\r\n *\r\n * Provides YYYY-MM-DD format commonly used in APIs and databases,\r\n * with English labels and Monday as the first day of the week.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [locale]=\"ISO_LOCALE\"></ngx-datex>\r\n * ```\r\n */\r\nexport const ISO_LOCALE: NgxDatexLocale = {\r\n locale: 'en-US',\r\n direction: 'ltr',\r\n format: 'YYYY-MM-DD',\r\n separator: ' / ',\r\n applyLabel: 'Apply',\r\n cancelLabel: 'Cancel',\r\n weekLabel: 'W',\r\n customRangeLabel: 'Custom Range',\r\n daysOfWeek: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],\r\n monthNames: [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n ],\r\n firstDay: 1, // Monday as first day\r\n};\r\n\r\n/**\r\n * ISO format locale with time picker support (24-hour format).\r\n *\r\n * Same as ISO_LOCALE but with YYYY-MM-DD HH:mm format for time picker usage.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [locale]=\"ISO_LOCALE_WITH_TIME\" [timePicker]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\nexport const ISO_LOCALE_WITH_TIME: NgxDatexLocale = {\r\n ...ISO_LOCALE,\r\n format: 'YYYY-MM-DD HH:mm',\r\n};\r\n\r\n/**\r\n * Default Material Design light theme.\r\n *\r\n * A clean, modern theme following Material Design principles\r\n * with blue primary colors and proper contrast ratios.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [theme]=\"MATERIAL_LIGHT_THEME\"></ngx-datex>\r\n * ```\r\n */\r\nexport const MATERIAL_LIGHT_THEME: NgxDatexTheme = {\r\n name: 'material-light',\r\n colors: {\r\n primary: '#1976d2',\r\n secondary: '#424242',\r\n accent: '#82b1ff',\r\n background: '#fafafa',\r\n surface: '#ffffff',\r\n text: '#212121',\r\n textSecondary: '#757575',\r\n border: '#e0e0e0',\r\n hover: '#f5f5f5',\r\n selected: '#1976d2',\r\n selectedText: '#ffffff',\r\n disabled: '#bdbdbd',\r\n error: '#f44336',\r\n success: '#4caf50',\r\n warning: '#ff9800',\r\n },\r\n typography: {\r\n fontFamily: 'Roboto, sans-serif',\r\n fontSize: '14px',\r\n fontWeight: '400',\r\n lineHeight: '1.5',\r\n },\r\n spacing: {\r\n xs: '4px',\r\n sm: '8px',\r\n md: '16px',\r\n lg: '24px',\r\n xl: '32px',\r\n },\r\n borderRadius: {\r\n sm: '4px',\r\n md: '8px',\r\n lg: '12px',\r\n },\r\n shadows: {\r\n sm: '0 1px 3px rgba(0,0,0,0.12)',\r\n md: '0 4px 6px rgba(0,0,0,0.16)',\r\n lg: '0 10px 20px rgba(0,0,0,0.19)',\r\n },\r\n};\r\n\r\n/**\r\n * Default predefined date ranges in Spanish.\r\n *\r\n * Provides commonly used date ranges like \"Today\", \"Last 7 days\", etc.\r\n * All ranges are calculated dynamically based on the current date.\r\n *\r\n * @example\r\n * ```typescript\r\n * <ngx-datex [ranges]=\"DEFAULT_RANGES\"></ngx-datex>\r\n *\r\n * // Or customize with your own ranges\r\n * const customRanges = {\r\n * ...DEFAULT_RANGES,\r\n * 'Custom Range': [startDate, endDate]\r\n * };\r\n * ```\r\n */\r\nexport const DEFAULT_RANGES: Record<string, [Date, Date]> = {\r\n Hoy: [startOfDay(new Date()), endOfDay(new Date())],\r\n Ayer: [\r\n (() => {\r\n const yesterday = new Date();\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n return startOfDay(yesterday);\r\n })(),\r\n (() => {\r\n const yesterday = new Date();\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n return endOfDay(yesterday);\r\n })(),\r\n ],\r\n 'Últimos 5 días': [\r\n (() => {\r\n const date = new Date();\r\n date.setDate(date.getDate() - 4);\r\n return startOfDay(date);\r\n })(),\r\n endOfDay(new Date()),\r\n ],\r\n 'Últimos 7 días': [\r\n (() => {\r\n const date = new Date();\r\n date.setDate(date.getDate() - 6);\r\n return startOfDay(date);\r\n })(),\r\n endOfDay(new Date()),\r\n ],\r\n 'Últimos 10 días': [\r\n (() => {\r\n const date = new Date();\r\n date.setDate(date.getDate() - 9);\r\n return startOfDay(date);\r\n })(),\r\n endOfDay(new Date()),\r\n ],\r\n 'Últimos 15 días': [\r\n (() => {\r\n const date = new Date();\r\n date.setDate(date.getDate() - 14);\r\n return startOfDay(date);\r\n })(),\r\n endOfDay(new Date()),\r\n ],\r\n 'Últimos 30 días': [\r\n (() => {\r\n const date = new Date();\r\n date.setDate(date.getDate() - 29);\r\n return startOfDay(date);\r\n })(),\r\n endOfDay(new Date()),\r\n ],\r\n 'Esta semana': [\r\n (() => {\r\n const today = new Date();\r\n const dayOfWeek = today.getDay();\r\n const mondayOffset = dayOfWeek === 0 ? -6 : 1 - dayOfWeek; // Monday as first day\r\n const monday = new Date(today);\r\n monday.setDate(today.getDate() + mondayOffset);\r\n return startOfDay(monday);\r\n })(),\r\n endOfDay(new Date()),\r\n ],\r\n 'Este mes': [\r\n startOfDay(new Date(new Date().getFullYear(), new Date().getMonth(), 1)),\r\n (() => {\r\n const lastDayOfCurrentMonth = new Date(\r\n new Date().getFullYear(),\r\n new Date().getMonth() + 1,\r\n 0,\r\n );\r\n return endOfDay(lastDayOfCurrentMonth);\r\n })(),\r\n ],\r\n 'El mes pasado': [\r\n startOfDay(new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1)),\r\n (() => {\r\n const lastDayOfPrevMonth = new Date(new Date().getFullYear(), new Date().getMonth(), 0);\r\n return endOfDay(lastDayOfPrevMonth);\r\n })(),\r\n ],\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n NgxDatexConfig,\r\n NgxDatexLocale,\r\n NgxDatexValue,\r\n NgxDatexValidationResult,\r\n} from '../types/ngx-datex.types';\r\nimport { SPANISH_LOCALE } from '../constants/defaults';\r\nimport { formatDateValue, getStartOfMonth, getStartOfWeek } from '../utils/date.utils';\r\n\r\n/**\r\n * Core service for NgxDatex component operations.\r\n *\r\n * Provides essential functionality for:\r\n * - Configuration management\r\n * - Locale handling\r\n * - Date formatting\r\n * - Calendar matrix generation\r\n * - Date validation\r\n *\r\n * @example\r\n * ```typescript\r\n * // Inject the service\r\n * constructor(private datexService: NgxDatexService) {}\r\n *\r\n * // Update configuration\r\n * this.datexService.updateConfig({\r\n * firstDayOfWeek: 1,\r\n * businessDaysOnly: true\r\n * });\r\n *\r\n * // Format a date range\r\n * const formatted = this.datexService.formatDateValue(dateRange, 'DD/MM/YYYY');\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgxDatexService {\r\n private config: NgxDatexConfig = {};\r\n private locale: NgxDatexLocale = SPANISH_LOCALE;\r\n\r\n /**\r\n * Updates the component configuration.\r\n *\r\n * @param config - Partial configuration object to merge with existing config\r\n *\r\n * @example\r\n * ```typescript\r\n * this.datexService.updateConfig({\r\n * firstDayOfWeek: 0, // Sunday\r\n * businessDaysOnly: true,\r\n * showWeekNumbers: true\r\n * });\r\n * ```\r\n */\r\n updateConfig(config: NgxDatexConfig): void {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n /**\r\n * Sets the locale configuration for internationalization.\r\n *\r\n * @param locale - Locale configuration object\r\n *\r\n * @example\r\n * ```typescript\r\n * this.datexService.setLocale({\r\n * format: 'DD/MM/YYYY',\r\n * daysOfWeek: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],\r\n * monthNames: ['Enero', 'Febrero', ...],\r\n * applyLabel: 'Aplicar',\r\n * cancelLabel: 'Cancelar'\r\n * });\r\n * ```\r\n */\r\n setLocale(locale: NgxDatexLocale): void {\r\n this.locale = { ...this.locale, ...locale };\r\n }\r\n\r\n /**\r\n * Formats a date range value into a display string.\r\n *\r\n * @param value - The date range value to format\r\n * @param format - Optional format string (uses locale format if not provided)\r\n * @returns Formatted date string\r\n *\r\n * @example\r\n * ```typescript\r\n * const dateRange: NgxDatexValue = {\r\n * startDate: new Date('2024-01-01'),\r\n * endDate: new Date('2024-01-31')\r\n * };\r\n *\r\n * const formatted = this.datexService.formatDateValue(dateRange, 'DD/MM/YYYY');\r\n * // Returns: \"01/01/2024 - 31/01/2024\"\r\n * ```\r\n */\r\n formatDateValue(value: NgxDatexValue | null, format?: string): string {\r\n if (!value) return '';\r\n\r\n const dateFormat = format || this.locale.format || 'DD/MM/YYYY';\r\n const start = formatDateValue(value.startDate, dateFormat);\r\n\r\n if (!value.endDate || value.startDate.getTime() === value.endDate.getTime()) {\r\n return start;\r\n }\r\n\r\n const end = formatDateValue(value.endDate, dateFormat);\r\n return `${start}${this.locale.separator || ' - '}${end}`;\r\n }\r\n\r\n buildCalendarMatrix(month: Date): Date[][] {\r\n const firstDay = getStartOfMonth(month);\r\n const firstDayOfWeek = this.locale.firstDay || 1;\r\n const startCalendar = getStartOfWeek(firstDay, firstDayOfWeek);\r\n\r\n const calendarDays: Date[][] = [];\r\n let currentWeek: Date[] = [];\r\n const startDate = new Date(startCalendar);\r\n\r\n for (let i = 0; i < 42; i++) {\r\n if (i > 0 && i % 7 === 0) {\r\n calendarDays.push(currentWeek);\r\n currentWeek = [];\r\n }\r\n\r\n const currentDate = new Date(startDate);\r\n currentDate.setDate(startDate.getDate() + i);\r\n currentDate.setHours(12, 0, 0, 0);\r\n currentWeek.push(currentDate);\r\n }\r\n\r\n if (currentWeek.length > 0) {\r\n calendarDays.push(currentWeek);\r\n }\r\n\r\n return calendarDays;\r\n }\r\n\r\n validateDate(date: Date): NgxDatexValidationResult {\r\n if (!date || isNaN(date.getTime())) {\r\n return { isValid: false, error: 'Fecha inválida', errorCode: 'INVALID_DATE' };\r\n }\r\n return { isValid: true };\r\n }\r\n}\r\n","/**\r\n * @fileoverview NgxDatex Overlay Service\r\n *\r\n * Service responsible for managing the calendar overlay positioning, creation, and lifecycle.\r\n * Handles both desktop and mobile overlay strategies with proper event management.\r\n */\r\n\r\nimport { Injectable, ElementRef, ViewContainerRef, TemplateRef, inject } from '@angular/core';\r\nimport {\r\n Overlay,\r\n OverlayRef,\r\n OverlayConfig,\r\n ConnectedPosition,\r\n FlexibleConnectedPositionStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { NgxDatexLocale, NgxDatexOverlayPosition } from '../types/ngx-datex.types';\r\nimport { isMobileDevice } from '../utils/date.utils';\r\n\r\n/**\r\n * Service for managing calendar overlay positioning and lifecycle.\r\n *\r\n * Provides methods to create, position, and manage the calendar overlay\r\n * with support for both desktop and mobile layouts. Handles click outside\r\n * detection, keyboard events, and responsive positioning.\r\n *\r\n * @example\r\n * ```typescript\r\n * // In component\r\n * constructor(private overlayService: NgxDatexOverlayService) {}\r\n *\r\n * openCalendar() {\r\n * this.overlayService.createOverlay(\r\n * this.inputElement,\r\n * this.calendarTemplate,\r\n * this.viewContainerRef,\r\n * this.locale,\r\n * 'center',\r\n * 'auto',\r\n * () => this.closeCalendar(),\r\n * (event) => this.handleKeydown(event),\r\n * (position) => this.updatePosition(position)\r\n * );\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class NgxDatexOverlayService {\r\n private overlayRef?: OverlayRef;\r\n private readonly overlay = inject(Overlay);\r\n\r\n /**\r\n * Creates and configures the calendar overlay.\r\n *\r\n * Sets up the overlay with appropriate positioning strategy, event handlers,\r\n * and responsive behavior. Reuses existing overlay if already created.\r\n *\r\n * @param inputElement - Reference to the input element for positioning\r\n * @param calendarTemplate - Template reference for the calendar content\r\n * @param viewContainerRef - View container for template portal\r\n * @param locale - Localization settings for RTL/LTR direction\r\n * @param opens - Horizontal alignment preference\r\n * @param drops - Vertical alignment preference\r\n * @param onOutsideClick - Callback for clicks outside the overlay\r\n * @param onKeydown - Callback for keyboard events\r\n * @param onPositionChange - Callback for position updates\r\n * @returns The created or existing overlay reference\r\n *\r\n * @example\r\n * ```typescript\r\n * const overlayRef = this.overlayService.createOverlay(\r\n * this.inputElement,\r\n * this.calendarTemplate,\r\n * this.viewContainerRef,\r\n * this.locale(),\r\n * this.opens(),\r\n * this.drops(),\r\n * () => this.closeCalendar(),\r\n * (event) => {\r\n * if (event.key === 'Escape') {\r\n * this.closeCalendar();\r\n * }\r\n * },\r\n * (position) => this.updateArrowPosition(position)\r\n * );\r\n * ```\r\n */\r\n createOverlay(\r\n inputElement: ElementRef<HTMLInputElement>,\r\n calendarTemplate: TemplateRef<unknown>,\r\n viewContainerRef: ViewContainerRef,\r\n locale: NgxDatexLocale,\r\n opens: 'left' | 'right' | 'center',\r\n drops: 'up' | 'down' | 'auto',\r\n onOutsideClick: () => void,\r\n onKeydown: (event: KeyboardEvent) => void,\r\n onPositionChange: (position: NgxDatexOverlayPosition) => void,\r\n ): OverlayRef {\r\n if (this.overlayRef && this.overlayRef.hasAttached()) {\r\n return this.overlayRef;\r\n }\r\n\r\n if (!this.overlayRef) {\r\n const config = this.getOverlayConfig(inputElement, locale, opens, drops, onPositionChange);\r\n this.overlayRef = this.overlay.create(config);\r\n\r\n this.setupOverlayEvents(inputElement, onOutsideClick, onKeydown);\r\n }\r\n\r\n if (!this.overlayRef.hasAttached()) {\r\n const portal = new TemplatePortal(calendarTemplate, viewContainerRef);\r\n this.overlayRef.attach(portal);\r\n }\r\n\r\n return this.overlayRef;\r\n }\r\n\r\n /**\r\n * Closes the calendar overlay without disposing it.\r\n *\r\n * Detaches the overlay content while keeping the overlay reference\r\n * for potential reuse. The overlay can be reopened without recreation.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Close the overlay\r\n * this.overlayService.closeOverlay();\r\n * ```\r\n */\r\n closeOverlay(): void {\r\n if (this.overlayRef && this.overlayRef.hasAttached()) {\r\n this.overlayRef.detach();\r\n }\r\n }\r\n\r\n /**\r\n * Completely disposes of the overlay and cleans up resources.\r\n *\r\n * Detaches content, disposes the overlay reference, and cleans up\r\n * all associated resources. Should be called during component destruction.\r\n *\r\n * @example\r\n * ```typescript\r\n * ngOnDestroy() {\r\n * this.overlayService.disposeOverlay();\r\n * }\r\n * ```\r\n */\r\n disposeOverlay(): void {\r\n if (this.overlayRef) {\r\n if (this.overlayRef.hasAttached()) {\r\n this.overlayRef.detach();\r\n }\r\n this.overlayRef.dispose();\r\n this.overlayRef = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Sets up event listeners for the overlay.\r\n *\r\n * Configures click outside detection and keyboard event handling\r\n * with different strategies for desktop and mobile devices.\r\n *\r\n * @private\r\n * @param inputElement - Reference to the input element\r\n * @param onOutsideClick - Callback for outside clicks\r\n * @param onKeydown - Callback for keyboard events\r\n */\r\n private setupOverlayEvents(\r\n inputElement: ElementRef<HTMLInputElement>,\r\n onOutsideClick: () => void,\r\n onKeydown: (event: KeyboardEvent) => void,\r\n ): void {\r\n if (!this.overlayRef) return;\r\n\r\n if (!isMobileDevice()) {\r\n this.overlayRef.outsidePointerEvents().subscribe((event) => {\r\n const target = event.target as Element;\r\n const inputEl = inputElement?.nativeElement;\r\n\r\n // Check if click was inside calendar or input\r\n if (\r\n (inputEl && inputEl.contains(target)) ||\r\n target.closest('.ngx-datex-overlay') ||\r\n target.closest('.ngx-datex-calendar-grid') ||\r\n target.closest('.ngx-datex-time-picker') ||\r\n target.closest('.ngx-datex-ranges-sidebar') ||\r\n target.closest('.ngx-datex-footer-buttons') ||\r\n target.closest('.ngx-datex-mobile-header-buttons')\r\n ) {\r\n return;\r\n }\r\n\r\n onOutsideClick();\r\n });\r\n } else {\r\n this.overlayRef.backdropClick().subscribe(() => {\r\n onOutsideClick();\r\n });\r\n }\r\n\r\n this.overlayRef.keydownEvents().subscribe((event) => {\r\n onKeydown(event);\r\n });\r\n }\r\n\r\n /**\r\n * Creates the overlay configuration based on device type and preferences.\r\n *\r\n * Returns different configurations for mobile and desktop devices,\r\n * with appropriate positioning strategies and styling.\r\n *\r\n * @private\r\n * @param inputElement - Reference to the input element\r\n * @param locale - Localization settings\r\n * @param opens - Horizontal alignment preference\r\n * @param drops - Vertical alignment preference\r\n * @param onPositionChange - Callback for position updates\r\n * @returns Overlay configuration object\r\n */\r\n private getOverlayConfig(\r\n inputElement: ElementRef<HTMLInputElement>,\r\n locale: NgxDatexLocale,\r\n opens: 'left' | 'right' | 'center',\r\n drops: 'up' | 'down' | 'auto',\r\n onPositionChange: (position: NgxDatexOverlayPosition) => void,\r\n ): OverlayConfig {\r\n const positionStrategy = this.getPositionStrategy(inputElement, opens, drops, onPositionChange);\r\n\r\n if (isMobileDevice()) {\r\n return new OverlayConfig({\r\n positionStrategy: this.overlay.position().global().bottom('0').centerHorizontally(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n panelClass: ['ngx-datex-overlay-panel', 'ngx-datex-mobile-overlay'],\r\n scrollStrategy: this.overlay.scrollStrategies.block(),\r\n direction: locale.direction || 'ltr',\r\n width: '100vw',\r\n maxHeight: '85vh',\r\n });\r\n }\r\n\r\n return new OverlayConfig({\r\n positionStrategy,\r\n hasBackdrop: false,\r\n backdropClass: '',\r\n panelClass: 'ngx-datex-overlay-panel',\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n direction: locale.direction || 'ltr',\r\n });\r\n }\r\n\r\n /**\r\n * Creates the flexible positioning strategy for desktop overlays.\r\n *\r\n * Configures multiple fallback positions based on user preferences\r\n * and available space, with automatic repositioning on scroll.\r\n *\r\n * @private\r\n * @param inputElement - Reference to the input element\r\n * @param opens - Horizontal alignment preference\r\n * @param drops - Vertical alignment preference\r\n * @param onPositionChange - Callback for position updates\r\n * @returns Flexible connected position strategy\r\n */\r\n private getPositionStrategy(\r\n inputElement: ElementRef<HTMLInputElement>,\r\n opens: 'left' | 'right' | 'center',\r\n drops: 'up' | 'down' | 'auto',\r\n onPositionChange: (position: NgxDatexOverlayPosition) => void,\r\n ): FlexibleConnectedPositionStrategy {\r\n const positions = this.getPositions(opens, drops);\r\n\r\n const strategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(inputElement)\r\n .withPositions(positions)\r\n .withFlexibleDimensions(true)\r\n .withPush(true)\r\n .withGrowAfterOpen(true)\r\n .withViewportMargin(8);\r\n\r\n strategy.positionChanges.subscribe((change) => {\r\n if (change.connectionPair) {\r\n onPositionChange({\r\n originX: change.connectionPair.originX,\r\n originY: change.connectionPair.originY,\r\n overlayX: change.connectionPair.overlayX,\r\n overlayY: change.connectionPair.overlayY,\r\n });\r\n }\r\n });\r\n\r\n return strategy;\r\n }\r\n\r\n /**\r\n * Generates position configurations based on user preferences.\r\n *\r\n * Creates an array of connected positions with fallbacks,\r\n * prioritizing user preferences while providing alternatives\r\n * when space is limited.\r\n *\r\n * @private\r\n * @param opens - Horizontal alignment preference\r\n * @param drops - Vertical alignment preference\r\n * @returns Array of connected position configurations\r\n */\r\n private getPositions(\r\n opens: 'left' | 'right' | 'center',\r\n drops: 'up' | 'down' | 'auto',\r\n ): ConnectedPosition[] {\r\n let positions: ConnectedPosition[] = [];\r\n\r\n if (drops === 'auto') {\r\n if (opens === 'left') {\r\n positions = [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n } else if (opens === 'right') {\r\n positions = [\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n } else {\r\n positions = [\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 4 },\r\n {\r\n originX: 'center',\r\n originY: 'top',\r\n overlayX: 'center',\r\n overlayY: 'bottom',\r\n offsetY: -4,\r\n },\r\n ];\r\n }\r\n } else if (drops === 'up') {\r\n if (opens === 'left') {\r\n positions = [\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n } else if (opens === 'right') {\r\n positions = [\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n } else {\r\n positions = [\r\n {\r\n originX: 'center',\r\n originY: 'top',\r\n overlayX: 'center',\r\n overlayY: 'bottom',\r\n offsetY: -4,\r\n },\r\n ];\r\n }\r\n } else {\r\n if (opens === 'left') {\r\n positions = [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n ];\r\n } else if (opens === 'right') {\r\n positions = [\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\r\n ];\r\n } else {\r\n positions = [\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 4 },\r\n ];\r\n }\r\n }\r\n\r\n return positions;\r\n }\r\n}\r\n","/**\r\n * @fileoverview NgxDatex Time Picker Service\r\n *\r\n * Service responsible for managing time picker functionality including time validation,\r\n * time component updates, and availability calculations based on date constraints.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NgxDatexTimeValue } from '../types/ngx-datex.types';\r\nimport { isSameDate } from '../utils/date.utils';\r\n\r\n/**\r\n * Service for managing time picker operations and validations.\r\n *\r\n * Handles time component updates, validates time selections against date constraints,\r\n * and provides available time options based on minimum/maximum date restrictions.\r\n * Supports both 12-hour and 24-hour time formats with proper AM/PM handling.\r\n *\r\n * @example\r\n * ```typescript\r\n * // In component\r\n * constructor(private timePickerService: NgxDatexTimePickerService) {}\r\n *\r\n * onTimeChange(side: 'start' | 'end', component: 'hour' | 'minute', value: number) {\r\n * this.timePickerService.updateTimeFromPicker(\r\n * this.currentStartDate,\r\n * this.currentEndDate,\r\n * side,\r\n * component,\r\n * value,\r\n * this.startTime,\r\n * this.endTime,\r\n * this.timePicker24Hour,\r\n * this.singleDatePicker,\r\n * (date) => this.setStartDate(date),\r\n * (date) => this.setEndDate(date),\r\n * (side, time) => this.updateTimeSignal(side, time)\r\n * );\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class NgxDatexTimePickerService {\r\n /**\r\n * Updates time from picker component changes and applies to dates.\r\n *\r\n * Handles time component updates (hour, minute, AM/PM) and applies the changes\r\n * to the corresponding dates. Manages single date picker logic and ensures\r\n * end dates don't precede start dates on the same day.\r\n *\r\n * @param currentStartDate - Current start date\r\n * @param currentEndDate - Current end date (can be null)\r\n * @param side - Which time picker is being updated ('start' or 'end')\r\n * @param component - Which time component is changing ('hour', 'minute', or 'ampm')\r\n * @param value - New value for the time component\r\n * @param startTime - Current start time value\r\n * @param endTime - Current end time value\r\n * @param timePicker24Hour - Whether using 24-hour format\r\n * @param singleDatePicker - Whether in single date picker mode\r\n * @param onStartDateChange - Callback for start date changes\r\n * @param onEndDateChange - Callback for end date changes\r\n * @param onTimeChange - Callback for time signal updates\r\n *\r\n * @example\r\n * ```typescript\r\n * // Update start hour to 14 (2 PM)\r\n * this.timePickerService.updateTimeFromPicker(\r\n * this.startDate,\r\n * this.endDate,\r\n * 'start',\r\n * 'hour',\r\n * 14,\r\n * this.startTime,\r\n * this.endTime,\r\n * true, // 24-hour format\r\n * false, // range picker\r\n * (date) => this.updateStartDate(date),\r\n * (date) => this.updateEndDate(date),\r\n * (side, time) => this.updateTimeSignal(side, time)\r\n * );\r\n * ```\r\n */\r\n updateTimeFromPicker(\r\n currentStartDate: Date,\r\n currentEndDate: Date | null,\r\n side: 'start' | 'end',\r\n component: 'hour' | 'minute' | 'ampm',\r\n value: string | number,\r\n startTime: NgxDatexTimeValue,\r\n endTime: NgxDatexTimeValue,\r\n timePicker24Hour: boolean,\r\n singleDatePicker: boolean,\r\n onStartDateChange: (date: Date) => void,\r\n onEndDateChange: (date: Date) => void,\r\n onTimeChange: (side: 'start' | 'end', time: NgxDatexTimeValue) => void,\r\n ): void {\r\n if (!currentStartDate) return;\r\n\r\n // Update the time signal\r\n if (side === 'start') {\r\n const newStartTime = { ...startTime, [component]: value };\r\n onTimeChange('start', newStartTime);\r\n\r\n // Apply time to date\r\n const newStartDate = this.applyTimeToDate(currentStartDate, newStartTime, timePicker24Hour);\r\n onStartDateChange(newStartDate);\r\n\r\n // Handle single date picker\r\n if (singleDatePicker) {\r\n onEndDateChange(new Date(newStartDate));\r\n } else if (\r\n currentEndDate &&\r\n isSameDate(currentEndDate, newStartDate, 'day') &&\r\n currentEndDate < newStartDate\r\n ) {\r\n onEndDateChange(new Date(newStartDate));\r\n }\r\n } else if (currentEndDate) {\r\n const newEndTime = { ...endTime, [component]: value };\r\n onTimeChange('end', newEndTime);\r\n\r\n // Apply time to date\r\n const newEndDate = this.applyTimeToDate(currentEndDate, newEndTime, timePicker24Hour);\r\n onEndDateChange(newEndDate);\r\n }\r\n }\r\n\r\n /**\r\n * Applies time values to a date object.\r\n *\r\n * Creates a new date with the specified time components applied.\r\n * Handles 12-hour to 24-hour conversion and ensures proper time formatting.\r\n *\r\n * @private\r\n * @param date - Base date to apply time to\r\n * @param time - Time value with hour, minute, and AM/PM\r\n * @param is24Hour - Whether using 24-hour format\r\n * @returns New date with applied time\r\n *\r\n * @example\r\n * ```typescript\r\n * const date = new Date('2024-01-15');\r\n * const time = { hour: 2, minute: 30, ampm: 'PM' };\r\n * const result = this.applyTimeToDate(date, time, false);\r\n * // Result: 2024-01-15 14:30:00\r\n * ```\r\n */\r\n private applyTimeToDate(date: Date, time: NgxDatexTimeValue, is24Hour: boolean): Date {\r\n const newDate = new Date(date);\r\n let hour24 = time.hour;\r\n\r\n if (!is24Hour) {\r\n if (time.ampm === 'PM' && time.hour < 12) hour24 += 12;\r\n if (time.ampm === 'AM' && time.hour === 12) hour24 = 0;\r\n }\r\n\r\n newDate.setHours(hour24, time.minute, 0, 0);\r\n return newDate;\r\n }\r\n\r\n /**\r\n * Extracts time components from a date object.\r\n *\r\n * Converts a date to time picker format, handling both 12-hour and 24-hour\r\n * formats with proper AM/PM designation.\r\n *\r\n * @param date - Date to extract time from\r\n * @param timePicker24Hour - Whether using 24-hour format\r\n * @returns Time value object with hour, minute, and AM/PM\r\n *\r\n * @example\r\n * ```typescript\r\n * const date = new Date('2024-01-15 14:30:00');\r\n *\r\n * // 24-hour format\r\n * const time24 = this.updateTimeSignalsFromDate(date, true);\r\n * // Result: { hour: 14, minute: 30, ampm: 'AM' }\r\n *\r\n * // 12-hour format\r\n * const time12 = this.updateTimeSignalsFromDate(date, false);\r\n * // Result: { hour: 2, minute: 30, ampm: 'PM' }\r\n * ```\r\n */\r\n updateTimeSignalsFromDate(date: Date, timePicker24Hour: boolean): NgxDatexTimeValue {\r\n const hour24 = date.getHours();\r\n const minute = date.getMinutes();\r\n\r\n if (timePicker24Hour) {\r\n return { hour: hour24, minute, ampm: 'AM' };\r\n } else {\r\n const hour12 = hour24 === 0 ? 12 : hour24 > 12 ? hour24 - 12 : hour24;\r\n const ampm = hour24 >= 12 ? 'PM' : 'AM';\r\n return { hour: hour12, minute, ampm };\r\n }\r\n }\r\n\r\n /**\r\n * Gets available hours based on date constraints.\r\n *\r\n * Returns an array of hour options with disabled state based on minimum/maximum\r\n * date restrictions and start date constraints for end time selection.\r\n *\r\n * @param date - Date to get hours for\r\n * @param minDate - Minimum allowed date\r\n * @param maxDate - Maximum allowed date\r\n * @param timePicker24Hour - Whether using 24-hour format\r\n * @param timeValue - Current time value for AM/PM context\r\n * @param isEndTime - Whether this is for end time selection\r\n * @param startDate - Start date for end time validation\r\n * @returns Array of hour options with availability status\r\n *\r\n * @example\r\n * ```typescript\r\n * const availableHours = this.timePickerService.getAvailableHours(\r\n * new Date('2024-01-15'),\r\n * new Date('2024-01-15 10:00:00'), // minDate\r\n * new Date('2024-01-15 18:00:00'), // maxDate\r\n * false, // 12-hour format\r\n * { hour: 2, minute: 0, ampm: 'PM' },\r\n * false, // start time\r\n * );\r\n * // Result: [\r\n * // { value: 1, disabled: true }, // Before minDate\r\n * // { value: 2, disabled: false }, // Available\r\n * // { value: 6, disabled: true }, // After maxDate\r\n * // ]\r\n * ```\r\n */\r\n getAvailableHours(\r\n date: Date | null,\r\n minDate: Date | null,\r\n maxDate: Date | null,\r\n timePicker24Hour: boolean,\r\n timeValue: NgxDatexTimeValue,\r\n isEndTime = false,\r\n startDate?: Date,\r\n ): { value: number; disabled: boolean }[] {\r\n if (!date) return [];\r\n\r\n const hours = timePicker24Hour\r\n ? Array.from({ length: 24 }, (_, i) => i)\r\n : Array.from({ length: 12 }, (_, i) => i + 1);\r\n\r\n return hours.map((hour) => {\r\n let hour24 = hour;\r\n if (!timePicker24Hour) {\r\n hour24 =\r\n timeValue.ampm === 'PM' && hour !== 12\r\n ? hour + 12\r\n : timeValue.ampm === 'AM' && hour === 12\r\n ? 0\r\n : hour;\r\n }\r\n\r\n const testDate = new Date(date);\r\n testDate.setHours(hour24, 59, 59, 999);\r\n const testDateMin = new Date(date);\r\n testDateMin.setHours(hour24, 0, 0, 0);\r\n\r\n let disabled = false;\r\n if (minDate && testDate < minDate) disabled = true;\r\n if (maxDate && testDateMin > maxDate) disabled = true;\r\n\r\n // For end time, check against start date\r\n if (isEndTime && startDate && isSameDate(startDate, date, 'day')) {\r\n if (testDate < startDate) disabled = true;\r\n }\r\n\r\n return { value: hour, disabled };\r\n });\r\n }\r\n\r\n /**\r\n * Gets available minutes based on date and hour constraints.\r\n *\r\n * Returns an array of minute options with disabled state based on minimum/maximum\r\n * date restrictions, time picker increment, and start date constraints.\r\n *\r\n * @param date - Date to get minutes for\r\n * @param minDate - Minimum allowed date\r\n * @param maxDate - Maximum allowed date\r\n * @param timeValue - Current time value for hour context\r\n * @param timePickerIncrement - Minute increment step\r\n * @param timePicker24Hour - Whether using 24-hour format\r\n * @param isEndTime - Whether this is for end time selection\r\n * @param startDate - Start date for end time validation\r\n * @returns Array of minute options with availability status\r\n *\r\n * @example\r\n * ```typescript\r\n * const availableMinutes = this.timePickerService.getAvailableMinutes(\r\n * new Date('2024-01-15'),\r\n * new Date('2024-01-15 14:15:00'), // minDate\r\n * new Date('2024-01-15 14:45:00'), // maxDate\r\n * { hour: 14, minute: 30, ampm: 'PM' },\r\n * 15, // 15-minute increments\r\n * true, // 24-hour format\r\n * false, // start time\r\n * );\r\n * // Result: [\r\n * // { value: 0, disabled: true }, // Before minDate\r\n * // { value: 15, disabled: false }, // Available\r\n * // { value: 30, disabled: false }, // Available\r\n * // { value: 45, disabled: false }, // Available\r\n * // ]\r\n * ```\r\n */\r\n getAvailableMinutes(\r\n date: Date | null,\r\n minDate: Date | null,\r\n maxDate: Date | null,\r\n timeValue: NgxDatexTimeValue,\r\n timePickerIncrement: number,\r\n timePicker24Hour: boolean,\r\n isEndTime = false,\r\n startDate?: Date,\r\n ): { value: number; disabled: boolean }[] {\r\n if (!date) return [];\r\n\r\n const minutes: number[] = [];\r\n for (let i = 0; i < 60; i += timePickerIncrement) {\r\n minutes.push(i);\r\n }\r\n\r\n // Convert current hour to 24h format\r\n let hour24 = timeValue.hour;\r\n if (!timePicker24Hour) {\r\n hour24 =\r\n timeValue.ampm === 'PM' && timeValue.hour !== 12\r\n ? timeValue.hour + 12\r\n : timeValue.ampm === 'AM' && timeValue.hour === 12\r\n ? 0\r\n : timeValue.hour;\r\n }\r\n\r\n return minutes.map((minute) => {\r\n const testDate = new Date(date);\r\n testDate.setHours(hour24, minute, 59, 999);\r\n const testDateMin = new Date(date);\r\n testDateMin.setHours(hour24, minute, 0, 0);\r\n\r\n let disabled = false;\r\n if (minDate && testDate < minDate) disabled = true;\r\n if (maxDate && testDateMin > maxDate) disabled = true;\r\n\r\n // For end time, check against start date\r\n if (isEndTime && startDate && isSameDate(startDate, date, 'day')) {\r\n const startHour = startDate.getHours();\r\n if (hour24 === startHour) {\r\n if (minute < startDate.getMinutes()) disabled = true;\r\n } else if (hour24 < startHour) {\r\n disabled = true;\r\n }\r\n }\r\n\r\n return { value: minute, disabled };\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n addMonths,\r\n addDays,\r\n startOfDay,\r\n endOfDay,\r\n isSameDate,\r\n isBeforeDate,\r\n} from '../utils/date.utils';\r\n\r\n@Injectable()\r\nexport class NgxDatexCalendarService {\r\n updateMonthsInView(\r\n startDate: Date,\r\n endDate: Date | null,\r\n currentLeftMonth: Date,\r\n currentRightMonth: Date,\r\n singleDatePicker: boolean,\r\n linkedCalendars: boolean,\r\n maxDate: Date | null,\r\n onLeftMonthChange: (month: Date) => void,\r\n onRightMonthChange: (month: Date) => void,\r\n ): void {\r\n if (!startDate) return;\r\n\r\n if (endDate) {\r\n // Check if both dates are already visible\r\n if (!singleDatePicker && currentLeftMonth && currentRightMonth) {\r\n const startYearMonth = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}`;\r\n const endYearMonth = `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}`;\r\n const leftYearMonth = `${currentLeftMonth.getFullYear()}-${String(currentLeftMonth.getMonth() + 1).padStart(2, '0')}`;\r\n const rightYearMonth = `${currentRightMonth.getFullYear()}-${String(currentRightMonth.getMonth() + 1).padStart(2, '0')}`;\r\n\r\n if (\r\n (startYearMonth === leftYearMonth || startYearMonth === rightYearMonth) &&\r\n (endYearMonth === leftYearMonth || endYearMonth === rightYearMonth)\r\n ) {\r\n return;\r\n }\r\n }\r\n\r\n // Set left calendar to start date month\r\n const newLeftMonth = new Date(startDate.getFullYear(), startDate.getMonth(), 1);\r\n onLeftMonthChange(newLeftMonth);\r\n\r\n if (\r\n !linkedCalendars &&\r\n (endDate.getMonth() !== startDate.getMonth() ||\r\n endDate.getFullYear() !== startDate.getFullYear())\r\n ) {\r\n // Show end date month on right\r\n const newRightMonth = new Date(endDate.getFullYear(), endDate.getMonth(), 1);\r\n onRightMonthChange(newRightMonth);\r\n } else {\r\n // Show next month on right\r\n const nextMonth = addMonths(newLeftMonth, 1);\r\n onRightMonthChange(nextMonth);\r\n }\r\n } else {\r\n // Only start date - navigate if not visible\r\n const startYearMonth = `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}`;\r\n const leftYearMonth = currentLeftMonth\r\n ? `${currentLeftMonth.getFullYear()}-${String(currentLeftMonth.getMonth() + 1).padStart(2, '0')}`\r\n : '';\r\n const rightYearMonth = currentRightMonth\r\n ? `${currentRightMonth.getFullYear()}-${String(currentRightMonth.getMonth() + 1).padStart(2, '0')}`\r\n : '';\r\n\r\n if (leftYearMonth !== startYearMonth && rightYearMonth !== startYearMonth) {\r\n const newLeftMonth = new Date(startDate.getFullYear(), startDate.getMonth(), 1);\r\n onLeftMonthChange(newLeftMonth);\r\n\r\n const nextMonth = addMonths(newLeftMonth, 1);\r\n onRightMonthChange(nextMonth);\r\n }\r\n }\r\n\r\n // Check max date limits\r\n if (maxDate && linkedCalendars && !singleDatePicker && currentRightMonth > maxDate) {\r\n const maxRightMonth = new Date(maxDate.getFullYear(), maxDate.getMonth(), 1);\r\n const maxLeftMonth = addMonths(maxRightMonth, -1);\r\n\r\n onRightMonthChange(maxRightMonth);\r\n onLeftMonthChange(maxLeftMonth);\r\n }\r\n }\r\n\r\n setStartDate(\r\n startDate: Date,\r\n minDate: Date | null,\r\n maxDate: Date | null,\r\n timePicker: boolean,\r\n timePickerIncrement: number,\r\n currentStartDate?: Date | null,\r\n ): Date {\r\n let newStartDate = new Date(startDate);\r\n\r\n if (!timePicker) {\r\n newStartDate = startOfDay(newStartDate);\r\n } else if (currentStartDate && timePicker) {\r\n // When timePicker is enabled, preserve existing time if only date is changing\r\n if (\r\n newStartDate.getFullYear() !== currentStartDate.getFullYear() ||\r\n newStartDate.getMonth() !== currentStartDate.getMonth() ||\r\n newStartDate.getDate() !== currentStartDate.getDate()\r\n ) {\r\n // Only date changed, preserve time\r\n newStartDate.setHours(\r\n currentStartDate.getHours(),\r\n currentStartDate.getMinutes(),\r\n currentStartDate.getSeconds(),\r\n currentStartDate.getMilliseconds(),\r\n );\r\n }\r\n }\r\n\r\n if (timePicker && timePickerIncrement) {\r\n const minutes = newStartDate.getMinutes();\r\n const roundedMinutes = Math.round(minutes / timePickerIncrement) * timePickerIncrement;\r\n newStartDate.setMinutes(roundedMinutes);\r\n }\r\n\r\n if (minDate && isBeforeDate(newStartDate, minDate)) {\r\n newStartDate = new Date(minDate);\r\n if (timePicker && timePickerIncrement) {\r\n const minutes = newStartDate.getMinutes();\r\n const roundedMinutes = Math.round(minutes / timePickerIncrement) * timePickerIncrement;\r\n newStartDate.setMinutes(roundedMinutes);\r\n }\r\n }\r\n\r\n if (maxDate && newStartDate > maxDate) {\r\n newStartDate = new Date(maxDate);\r\n if (timePicker && timePickerIncrement) {\r\n const minutes = newStartDate.getMinutes();\r\n const flooredMinutes = Math.floor(minutes / timePickerIncrement) * timePickerIncrement;\r\n newStartDate.setMinutes(flooredMinutes);\r\n }\r\n }\r\n\r\n return newStartDate;\r\n }\r\n\r\n setEndDate(\r\n endDate: Date,\r\n startDate: Date,\r\n maxDate: Date | null,\r\n maxSpan: { [key: string]: number } | null,\r\n timePicker: boolean,\r\n timePickerIncrement: number,\r\n currentEndDate?: Date | null,\r\n ): Date {\r\n let newEndDate = new Date(endDate);\r\n\r\n if (!timePicker) {\r\n newEndDate = endOfDay(newEndDate);\r\n } else if (currentEndDate && timePicker) {\r\n // When timePicker is enabled, preserve existing time if only date is changing\r\n if (\r\n newEndDate.getFullYear() !== currentEndDate.getFullYear() ||\r\n newEndDate.getMonth() !== currentEndDate.getMonth() ||\r\n newEndDate.getDate() !== currentEndDate.getDate()\r\n ) {\r\n // Only date changed, preserve time\r\n newEndDate.setHours(\r\n currentEndDate.getHours(),\r\n currentEndDate.getMinutes(),\r\n currentEndDate.getSeconds(),\r\n currentEndDate.getMilliseconds(),\r\n );\r\n }\r\n }\r\n\r\n if (timePicker && timePickerIncrement) {\r\n const minutes = newEndDate.getMinutes();\r\n const roundedMinutes = Math.round(minutes / timePickerIncrement) * timePickerIncrement;\r\n newEndDate.setMinutes(roundedMinutes);\r\n }\r\n\r\n if (startDate && isBeforeDate(newEndDate, startDate)) {\r\n newEndDate = new Date(startDate);\r\n }\r\n\r\n if (maxDate && newEndDate > maxDate) {\r\n newEndDate = new Date(maxDate);\r\n }\r\n\r\n // Validate maxSpan\r\n if (maxSpan && startDate) {\r\n const maxLimit = addDays(startDate, this.getMaxSpanDays(maxSpan));\r\n if (newEndDate > maxLimit) {\r\n newEndDate = new Date(maxLimit);\r\n }\r\n }\r\n\r\n return newEndDate;\r\n }\r\n\r\n private getMaxSpanDays(maxSpan: { [key: string]: number }): number {\r\n let days = 0;\r\n if (maxSpan['days']) days += maxSpan['days'];\r\n if (maxSpan['weeks']) days += maxSpan['weeks'] * 7;\r\n if (maxSpan['months']) days += maxSpan['months'] * 30;\r\n if (maxSpan['years']) days += maxSpan['years'] * 365;\r\n return days;\r\n }\r\n\r\n isDateDisabled(\r\n date: Date,\r\n minDate: Date | null,\r\n maxDate: Date | null,\r\n maxSpan: { [key: string]: number } | null,\r\n currentStartDate: Date | null,\r\n currentEndDate: Date | null,\r\n singleDatePicker: boolean,\r\n isInvalidDateFn: ((date: Date) => boolean) | null,\r\n ): boolean {\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n\r\n if (maxSpan && !singleDatePicker && currentStartDate && !currentEndDate) {\r\n const maxLimit = addDays(currentStartDate, this.getMaxSpanDays(maxSpan));\r\n if (date > maxLimit) return true;\r\n }\r\n\r\n if (isInvalidDateFn && isInvalidDateFn(date)) return true;\r\n\r\n return false;\r\n }\r\n\r\n isDateSelected(\r\n date: Date,\r\n currentStartDate: Date | null,\r\n currentEndDate: Date | null,\r\n singleDatePicker: boolean,\r\n ): boolean {\r\n if (!currentStartDate) return false;\r\n\r\n if (singleDatePicker) {\r\n return isSameDate(date, currentStartDate, 'day');\r\n }\r\n\r\n return (\r\n isSameDate(date, currentStartDate, 'day') ||\r\n (currentEndDate !== null && isSameDate(date, currentEndDate, 'day'))\r\n );\r\n }\r\n\r\n isDateInRange(\r\n date: Date,\r\n currentStartDate: Date | null,\r\n currentEndDate: Date | null,\r\n singleDatePicker: boolean,\r\n ): boolean {\r\n if (!currentStartDate || !currentEndDate || singleDatePicker) return false;\r\n return date > currentStartDate && date < currentEndDate;\r\n }\r\n\r\n isDateRangeStart(date: Date, currentStartDate: Date | null): boolean {\r\n if (!currentStartDate) return false;\r\n return isSameDate(date, currentStartDate, 'day');\r\n }\r\n\r\n isDateRangeEnd(date: Date, currentEndDate: Date | null): boolean {\r\n if (!currentEndDate) return false;\r\n return isSameDate(date, currentEndDate, 'day');\r\n }\r\n}\r\n","/**\r\n * @fileoverview NgxDatex - Advanced Angular Date Range Picker Component\r\n *\r\n * A comprehensive date picker component for Angular applications that supports:\r\n * - Single date and date range selection\r\n * - Time picker integration\r\n * - Predefined date ranges\r\n * - Multiple themes and localization\r\n * - Mobile-responsive design\r\n * - Accessibility features\r\n * - Form integration with ControlValueAccessor\r\n *\r\n * Based on the popular vanilla daterangepicker library but built specifically for Angular\r\n * with modern Angular patterns including signals, standalone components, and CDK overlays.\r\n *\r\n * @example\r\n * Basic usage:\r\n * ```html\r\n * <ngx-datex\r\n * [(ngModel)]=\"selectedRange\"\r\n * [ranges]=\"predefinedRanges\"\r\n * [locale]=\"spanishLocale\">\r\n * </ngx-datex>\r\n * ```\r\n *\r\n * @example\r\n * Advanced configuration:\r\n * ```html\r\n * <ngx-datex\r\n * [singleDatePicker]=\"false\"\r\n * [timePicker]=\"true\"\r\n * [autoApply]=\"true\"\r\n * [showDropdowns]=\"true\"\r\n * [linkedCalendars]=\"true\"\r\n * [minDate]=\"minDate\"\r\n * [maxDate]=\"maxDate\"\r\n * (dateChange)=\"onDateChange($event)\"\r\n * (rangeChange)=\"onRangeChange($event)\">\r\n * </ngx-datex>\r\n * ```\r\n */\r\n\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n afterNextRender,\r\n ElementRef,\r\n ViewChild,\r\n OnInit,\r\n OnDestroy,\r\n forwardRef,\r\n inject,\r\n ChangeDetectionStrategy,\r\n TemplateRef,\r\n PLATFORM_ID,\r\n OutputEmitterRef,\r\n Signal,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { NgClass, isPlatformBrowser } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\n\r\n// Types and interfaces\r\nimport {\r\n NgxDatexValue,\r\n NgxDatexConfig,\r\n NgxDatexLocale,\r\n NgxDatexTheme,\r\n NgxDatexTimeValue,\r\n NgxDatexOverlayPosition,\r\n} from './types/ngx-datex.types';\r\n\r\n// Constants\r\nimport { SPANISH_LOCALE, MATERIAL_LIGHT_THEME, DEFAULT_RANGES } from './constants/defaults';\r\n\r\n// Services\r\nimport { NgxDatexService } from './services/ngx-datex.service';\r\nimport { NgxDatexOverlayService } from './services/overlay.service';\r\nimport { NgxDatexTimePickerService } from './services/time-picker.service';\r\nimport { NgxDatexCalendarService } from './services/calendar.service';\r\n\r\n// Utils\r\nimport {\r\n addMonths,\r\n startOfDay,\r\n endOfDay,\r\n isSameDate,\r\n isBeforeDate,\r\n formatDateValue,\r\n parseDateValue,\r\n isValidDate,\r\n isMobileDevice,\r\n} from './utils/date.utils';\r\n\r\n/**\r\n * NgxDatex - Advanced Angular Date Range Picker Component\r\n *\r\n * A feature-rich, accessible date picker component that provides both single date\r\n * and date range selection capabilities. Built with Angular signals for optimal\r\n * performance and modern Angular patterns.\r\n *\r\n * ## Key Features\r\n * - 📅 Single date and date range selection\r\n * - ⏰ Optional time picker with 12/24 hour formats\r\n * - 🎨 Customizable themes and styling\r\n * - 🌍 Full internationalization support\r\n * - 📱 Mobile-responsive design\r\n * - ♿ WCAG accessibility compliant\r\n * - 🔧 Extensive configuration options\r\n * - 📋 Angular Forms integration (ControlValueAccessor)\r\n *\r\n * ## Basic Usage\r\n * ```html\r\n * <ngx-datex\r\n * [(ngModel)]=\"selectedRange\"\r\n * [locale]=\"locale\"\r\n * [ranges]=\"predefinedRanges\">\r\n * </ngx-datex>\r\n * ```\r\n *\r\n * ## Advanced Configuration\r\n * ```typescript\r\n * // Component\r\n * export class MyComponent {\r\n * selectedRange: NgxDatexValue | null = null;\r\n *\r\n * customRanges = {\r\n * 'Today': [startOfDay(new Date()), endOfDay(new Date())],\r\n * 'Last 7 Days': [startOfDay(subDays(new Date(), 6)), endOfDay(new Date())]\r\n * };\r\n *\r\n * onDateChange(value: NgxDatexValue | null) {\r\n * console.log('Selected range:', value);\r\n * }\r\n * }\r\n * ```\r\n *\r\n * ```html\r\n * <!-- Template -->\r\n * <ngx-datex\r\n * [singleDatePicker]=\"false\"\r\n * [timePicker]=\"true\"\r\n * [autoApply]=\"false\"\r\n * [showDropdowns]=\"true\"\r\n * [ranges]=\"customRanges\"\r\n * [minDate]=\"minDate\"\r\n * [maxDate]=\"maxDate\"\r\n * (dateChange)=\"onDateChange($event)\"\r\n * (rangeChange)=\"onRangeChange($event)\">\r\n * </ngx-datex>\r\n * ```\r\n *\r\n * @see {@link NgxDatexValue} for the value interface\r\n * @see {@link NgxDatexConfig} for configuration options\r\n * @see {@link NgxDatexLocale} for localization settings\r\n * @see {@link NgxDatexTheme} for theming options\r\n */\r\n@Component({\r\n selector: 'ngx-datex',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatFormFieldModule,\r\n MatCheckboxModule,\r\n NgClass,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxDatex),\r\n multi: true,\r\n },\r\n NgxDatexOverlayService,\r\n NgxDatexTimePickerService,\r\n NgxDatexCalendarService,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './ngx-datex.component.html',\r\n styleUrl: './ngx-datex.component.scss',\r\n})\r\nexport class NgxDatex implements OnInit, OnDestroy, ControlValueAccessor {\r\n @ViewChild('inputElement') inputElement!: ElementRef<HTMLInputElement>;\r\n @ViewChild('calendarTemplate') calendarTemplate!: TemplateRef<unknown>;\r\n\r\n // Services\r\n private readonly datexService = inject(NgxDatexService);\r\n private readonly overlayService = inject(NgxDatexOverlayService);\r\n private readonly timePickerService = inject(NgxDatexTimePickerService);\r\n private readonly calendarService = inject(NgxDatexCalendarService);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n // Configuration inputs\r\n\r\n /**\r\n * General configuration options for the date picker.\r\n *\r\n * @example\r\n * ```typescript\r\n * const config: NgxDatexConfig = {\r\n * firstDayOfWeek: 1,\r\n * businessDaysOnly: true,\r\n * showWeekNumbers: true\r\n * };\r\n * ```\r\n */\r\n config = input<NgxDatexConfig>({});\r\n\r\n /**\r\n * Localization settings for internationalization.\r\n * Controls language, date formats, UI text, and regional preferences.\r\n *\r\n * This is the primary configuration for adapting the date picker to different\r\n * languages, regions, and cultural conventions. The most important property\r\n * is `format`, which controls how dates are displayed and parsed.\r\n *\r\n * @default SPANISH_LOCALE\r\n *\r\n * ## Key Properties:\r\n *\r\n * - **`format`**: Date format string (REQUIRED for timePicker usage)\r\n * - **`locale`**: Locale code for @formkit/tempo formatting\r\n * - **`separator`**: Text between start and end dates\r\n * - **`daysOfWeek`**: Short day names array\r\n * - **`monthNames`**: Full month names array\r\n * - **`applyLabel`**: Apply button text\r\n * - **`cancelLabel`**: Cancel button text\r\n *\r\n * ## Format Examples:\r\n *\r\n * ### Date Only Formats:\r\n * ```typescript\r\n * // European format (DD/MM/YYYY)\r\n * const europeanLocale: NgxDatexLocale = {\r\n * locale: 'es-ES',\r\n * format: 'DD/MM/YYYY', // 15/01/2024\r\n * separator: ' - ',\r\n * daysOfWeek: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],\r\n * monthNames: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\r\n * 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],\r\n * applyLabel: 'Aplicar',\r\n * cancelLabel: 'Cancelar',\r\n * firstDay: 1 // Monday first\r\n * };\r\n *\r\n * // US format (MM/DD/YYYY)\r\n * const usLocale: NgxDatexLocale = {\r\n * locale: 'en-US',\r\n * format: 'MM/DD/YYYY', // 01/15/2024\r\n * separator: ' - ',\r\n * daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\r\n * monthNames: ['January', 'February', 'March', 'April', 'May', 'June',\r\n * 'July', 'August', 'September', 'October', 'November', 'December'],\r\n * applyLabel: 'Apply',\r\n * cancelLabel: 'Cancel',\r\n * firstDay: 0 // Sunday first\r\n * };\r\n *\r\n * // ISO format (YYYY-MM-DD)\r\n * const isoLocale: NgxDatexLocale = {\r\n * locale: 'en-US',\r\n * format: 'YYYY-MM-DD', // 2024-01-15\r\n * separator: ' / ',\r\n * daysOfWeek: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],\r\n * monthNames: ['January', 'February', 'March', 'April', 'May', 'June',\r\n * 'July', 'August', 'September', 'October', 'November', 'December'],\r\n * applyLabel: 'Apply',\r\n * cancelLabel: 'Cancel',\r\n * firstDay: 1 // Monday first\r\n * };\r\n * ```\r\n *\r\n * ### Time Picker Formats:\r\n * ```typescript\r\n * // Spanish with 24-hour time\r\n * const spanishWithTime: NgxDatexLocale = {\r\n * locale: 'es-ES',\r\n * format: 'DD/MM/YYYY HH:mm', // 15/01/2024 14:30\r\n * separator: ' - ',\r\n * daysOfWeek: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],\r\n * monthNames: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\r\n * 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],\r\n * applyLabel: 'Aplicar',\r\n * cancelLabel: 'Cancelar'\r\n * };\r\n *\r\n * // US with 12-hour time\r\n * const usWithTime: NgxDatexLocale = {\r\n * locale: 'en-US',\r\n * format: 'MM/DD/YYYY hh:mm A', // 01/15/2024 02:30 PM\r\n * separator: ' - ',\r\n * daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\r\n * monthNames: ['January', 'February', 'March', 'April', 'May', 'June',\r\n * 'July', 'August', 'September', 'October', 'November', 'December'],\r\n * applyLabel: 'Apply',\r\n * cancelLabel: 'Cancel'\r\n * };\r\n *\r\n * // French locale\r\n * const frenchLocale: NgxDatexLocale = {\r\n * locale: 'fr-FR',\r\n * format: 'DD/MM/YYYY',\r\n * separator: ' au ',\r\n * daysOfWeek: ['Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di'],\r\n * monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\r\n * 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],\r\n * applyLabel: 'Appliquer',\r\n * cancelLabel: 'Annuler',\r\n * customRangeLabel: 'Plage personnalisée',\r\n * firstDay: 1\r\n * };\r\n *\r\n * // German locale\r\n * const germanLocale: NgxDatexLocale = {\r\n * locale: 'de-DE',\r\n * format: 'DD.MM.YYYY',\r\n * separator: ' bis ',\r\n * daysOfWeek: ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'],\r\n * monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',\r\n * 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\r\n * applyLabel: 'Anwenden',\r\n * cancelLabel: 'Abbrechen',\r\n * customRangeLabel: 'Benutzerdefiniert',\r\n * firstDay: 1\r\n * };\r\n * ```\r\n *\r\n * ## Component Usage:\r\n * ```html\r\n * <!-- Spanish date picker -->\r\n * <ngx-datex [locale]=\"spanishLocale\"></ngx-datex>\r\n *\r\n * <!-- US date picker with time -->\r\n * <ngx-datex\r\n * [locale]=\"usWithTime\"\r\n * [timePicker]=\"true\"\r\n * [timePicker24Hour]=\"false\">\r\n * </ngx-datex>\r\n *\r\n * <!-- French date picker -->\r\n * <ngx-datex [locale]=\"frenchLocale\"></ngx-datex>\r\n *\r\n * <!-- Using predefined locales -->\r\n * <ngx-datex [locale]=\"SPANISH_LOCALE\"></ngx-datex>\r\n * <ngx-datex [locale]=\"US_ENGLISH_LOCALE\"></ngx-datex>\r\n * <ngx-datex [locale]=\"SPANISH_LOCALE_WITH_TIME\"></ngx-datex>\r\n * ```\r\n *\r\n * ## Important Notes:\r\n *\r\n * 1. **TimePicker Format**: When `timePicker=true`, you MUST include time tokens in the format\r\n * 2. **Locale Code**: The `locale` property affects @formkit/tempo formatting behavior\r\n * 3. **Day Order**: `daysOfWeek` array should match your `firstDay` setting\r\n * 4. **Separator**: Used between start and end dates in range display\r\n * 5. **Predefined Locales**: Use exported constants like `SPANISH_LOCALE`, `US_ENGLISH_LOCALE`\r\n *\r\n * @see {@link NgxDatexLocale} for complete interface documentation\r\n * @see {@link SPANISH_LOCALE} for default Spanish configuration\r\n * @see {@link US_ENGLISH_LOCALE} for US English configuration\r\n * @see {@link SPANISH_LOCALE_WITH_TIME} for Spanish with time support\r\n */\r\n locale = input<NgxDatexLocale>(SPANISH_LOCALE);\r\n\r\n /**\r\n * Theme configuration for styling the date picker.\r\n * Defines colors, typography, spacing, and visual appearance.\r\n *\r\n * @default MATERIAL_LIGHT_THEME\r\n *\r\n * @example\r\n * ```typescript\r\n * const darkTheme: NgxDatexTheme = {\r\n * name: 'dark',\r\n * colors: { primary: '#bb86fc', background: '#121212', ... }\r\n * };\r\n * ```\r\n */\r\n theme = input<NgxDatexTheme>(MATERIAL_LIGHT_THEME);\r\n\r\n // Appearance inputs\r\n\r\n /**\r\n * Material form field appearance style.\r\n *\r\n * @default 'outline'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex appearance=\"fill\"></ngx-datex>\r\n * <ngx-datex appearance=\"outline\"></ngx-datex>\r\n * ```\r\n */\r\n appearance = input<'fill' | 'outline'>('outline');\r\n\r\n /**\r\n * Controls when the form field label should float.\r\n *\r\n * @default 'auto'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex floatLabel=\"always\"></ngx-datex>\r\n * <ngx-datex floatLabel=\"auto\"></ngx-datex>\r\n * ```\r\n */\r\n floatLabel = input<'always' | 'auto'>('auto');\r\n\r\n /**\r\n * Label text displayed above the input field.\r\n *\r\n * @default ''\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex label=\"Select Date Range\"></ngx-datex>\r\n * ```\r\n */\r\n label = input<string>('');\r\n\r\n /**\r\n * Placeholder text shown when no date is selected.\r\n *\r\n * @default 'Seleccionar fecha'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex placeholder=\"Choose your dates\"></ngx-datex>\r\n * ```\r\n */\r\n placeholder = input<string>('Seleccionar fecha');\r\n\r\n /**\r\n * Material icon name for the calendar icon.\r\n *\r\n * @default 'calendar_today'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex calendarIcon=\"event\" [showCalendarIcon]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n calendarIcon = input<string>('calendar_today');\r\n\r\n /**\r\n * Whether to display the calendar icon.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showCalendarIcon]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n showCalendarIcon = input<boolean>(false);\r\n\r\n /**\r\n * Position of the calendar icon relative to the input.\r\n *\r\n * @default 'suffix'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showCalendarIcon]=\"true\" calendarIconPosition=\"prefix\"></ngx-datex>\r\n * ```\r\n */\r\n calendarIconPosition = input<'prefix' | 'suffix'>('suffix');\r\n\r\n /**\r\n * Whether to display a checkbox alongside the input.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showCheckbox]=\"true\" (checkboxChange)=\"onCheckboxChange($event)\"></ngx-datex>\r\n * ```\r\n */\r\n showCheckbox = input<boolean>(false);\r\n\r\n /**\r\n * Position of the checkbox relative to the input.\r\n *\r\n * @default 'prefix'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showCheckbox]=\"true\" checkboxPosition=\"suffix\"></ngx-datex>\r\n * ```\r\n */\r\n checkboxPosition = input<'prefix' | 'suffix'>('prefix');\r\n\r\n /**\r\n * Whether the input field is readonly.\r\n * When true, users can only interact with the calendar popup.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [readonly]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n readonly = input<boolean>(false);\r\n\r\n /**\r\n * Whether the entire component is disabled.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [disabled]=\"isFormDisabled\"></ngx-datex>\r\n * ```\r\n */\r\n disabled = input<boolean>(false);\r\n\r\n /**\r\n * Whether to show the calendar header with navigation controls.\r\n *\r\n * @default true\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showHeader]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\n showHeader = input<boolean>(true);\r\n\r\n /**\r\n * Whether to show the calendar footer with apply/cancel buttons.\r\n *\r\n * @default true\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showFooter]=\"false\" [autoApply]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n showFooter = input<boolean>(true);\r\n\r\n // Behavior inputs\r\n\r\n /**\r\n * Whether to use single date selection mode instead of date range selection.\r\n * When true, only one date can be selected at a time.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Single date picker -->\r\n * <ngx-datex [singleDatePicker]=\"true\"></ngx-datex>\r\n *\r\n * <!-- Date range picker (default) -->\r\n * <ngx-datex [singleDatePicker]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\n singleDatePicker = input<boolean>(false);\r\n\r\n /**\r\n * Whether to automatically apply the selection without requiring the Apply button.\r\n * When true, selections are applied immediately. Automatically disabled when timePicker is enabled.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Auto-apply selections -->\r\n * <ngx-datex [autoApply]=\"true\"></ngx-datex>\r\n *\r\n * <!-- Require Apply button -->\r\n * <ngx-datex [autoApply]=\"false\" [showFooter]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n autoApply = input<boolean>(false);\r\n\r\n /**\r\n * Whether to show month and year dropdown selectors in the calendar header.\r\n * Allows quick navigation to distant dates.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showDropdowns]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n showDropdowns = input<boolean>(false);\r\n\r\n /**\r\n * Whether to enable time selection alongside date selection.\r\n * Adds time picker controls to the calendar.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Date and time picker -->\r\n * <ngx-datex [timePicker]=\"true\" [timePicker24Hour]=\"true\"></ngx-datex>\r\n *\r\n * <!-- Date only picker -->\r\n * <ngx-datex [timePicker]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\n timePicker = input<boolean>(false);\r\n\r\n /**\r\n * Whether to use 24-hour time format instead of 12-hour AM/PM format.\r\n * Only applies when timePicker is enabled.\r\n *\r\n * @default true\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 24-hour format: 14:30 -->\r\n * <ngx-datex [timePicker]=\"true\" [timePicker24Hour]=\"true\"></ngx-datex>\r\n *\r\n * <!-- 12-hour format: 2:30 PM -->\r\n * <ngx-datex [timePicker]=\"true\" [timePicker24Hour]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\n timePicker24Hour = input<boolean>(true);\r\n\r\n /**\r\n * The increment step for minute selection in the time picker.\r\n * Minutes will be rounded to the nearest increment.\r\n *\r\n * @default 1\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 15-minute increments: 00, 15, 30, 45 -->\r\n * <ngx-datex [timePicker]=\"true\" [timePickerIncrement]=\"15\"></ngx-datex>\r\n *\r\n * <!-- 5-minute increments: 00, 05, 10, 15, 20... -->\r\n * <ngx-datex [timePicker]=\"true\" [timePickerIncrement]=\"5\"></ngx-datex>\r\n * ```\r\n */\r\n timePickerIncrement = input<number>(1);\r\n\r\n /**\r\n * Whether to show seconds in the time picker.\r\n * Only applies when timePicker is enabled.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [timePicker]=\"true\" [timePickerSeconds]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n timePickerSeconds = input<boolean>(false);\r\n\r\n /**\r\n * Whether the left and right calendars should be linked for navigation.\r\n * When true, navigating one calendar automatically updates the other.\r\n *\r\n * @default true\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Linked navigation -->\r\n * <ngx-datex [linkedCalendars]=\"true\"></ngx-datex>\r\n *\r\n * <!-- Independent navigation -->\r\n * <ngx-datex [linkedCalendars]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\n linkedCalendars = input<boolean>(true);\r\n\r\n /**\r\n * Whether to automatically update the input field with the selected value.\r\n * When false, the input remains unchanged until manually updated.\r\n *\r\n * @default true\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Auto-update input -->\r\n * <ngx-datex [autoUpdateInput]=\"true\"></ngx-datex>\r\n *\r\n * <!-- Manual input updates -->\r\n * <ngx-datex [autoUpdateInput]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\n autoUpdateInput = input<boolean>(true);\r\n\r\n /**\r\n * Whether to always show both calendars even in single date picker mode.\r\n * Useful for consistent layout regardless of picker mode.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [singleDatePicker]=\"true\" [alwaysShowCalendars]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n alwaysShowCalendars = input<boolean>(false);\r\n\r\n /**\r\n * Whether to show the \"Custom Range\" option in the predefined ranges list.\r\n * Only applies when ranges are configured.\r\n *\r\n * @default true\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Show custom range option -->\r\n * <ngx-datex [ranges]=\"predefinedRanges\" [showCustomRangeLabel]=\"true\"></ngx-datex>\r\n *\r\n * <!-- Hide custom range option -->\r\n * <ngx-datex [ranges]=\"predefinedRanges\" [showCustomRangeLabel]=\"false\"></ngx-datex>\r\n * ```\r\n */\r\n showCustomRangeLabel = input<boolean>(true);\r\n\r\n // Computed autoApply following vanilla daterangepicker logic\r\n readonly effectiveAutoApply: Signal<boolean> = computed(() => {\r\n const autoApplyInput = this.autoApply();\r\n const timePickerEnabled = this.timePicker();\r\n return timePickerEnabled ? false : autoApplyInput;\r\n });\r\n\r\n // Date range inputs\r\n\r\n /**\r\n * The initial start date for the date picker.\r\n * If not provided, defaults to today.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```typescript\r\n * const startDate = new Date('2024-01-01');\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [startDate]=\"startDate\" [endDate]=\"endDate\"></ngx-datex>\r\n * ```\r\n */\r\n startDate = input<Date | null>(null);\r\n\r\n /**\r\n * The initial end date for the date picker.\r\n * If not provided, defaults to the start date (single date) or today (range).\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```typescript\r\n * const endDate = new Date('2024-01-31');\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [startDate]=\"startDate\" [endDate]=\"endDate\"></ngx-datex>\r\n * ```\r\n */\r\n endDate = input<Date | null>(null);\r\n\r\n /**\r\n * The minimum selectable date.\r\n * Users cannot select dates before this date.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```typescript\r\n * // Restrict to dates from today onwards\r\n * const minDate = new Date();\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [minDate]=\"minDate\"></ngx-datex>\r\n * ```\r\n */\r\n minDate = input<Date | null>(null);\r\n\r\n /**\r\n * The maximum selectable date.\r\n * Users cannot select dates after this date.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```typescript\r\n * // Restrict to dates within the next year\r\n * const maxDate = new Date();\r\n * maxDate.setFullYear(maxDate.getFullYear() + 1);\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [maxDate]=\"maxDate\"></ngx-datex>\r\n * ```\r\n */\r\n maxDate = input<Date | null>(null);\r\n\r\n /**\r\n * The maximum allowed span between start and end dates.\r\n * Prevents users from selecting ranges that exceed the specified duration.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```typescript\r\n * // Limit to 30 days maximum\r\n * const maxSpan = { days: 30 };\r\n *\r\n * // Limit to 3 months maximum\r\n * const maxSpan = { months: 3 };\r\n *\r\n * // Limit to 1 year maximum\r\n * const maxSpan = { years: 1 };\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [maxSpan]=\"maxSpan\"></ngx-datex>\r\n * ```\r\n */\r\n maxSpan = input<{ [key: string]: number } | null>(null);\r\n\r\n /**\r\n * Whether to show week numbers in the calendar.\r\n * Displays ISO week numbers on the left side of each week row.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showWeekNumbers]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n showWeekNumbers = input<boolean>(false);\r\n\r\n /**\r\n * Whether to show ISO week numbers instead of standard week numbers.\r\n * Only applies when showWeekNumbers is true.\r\n *\r\n * @default false\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showWeekNumbers]=\"true\" [showISOWeekNumbers]=\"true\"></ngx-datex>\r\n * ```\r\n */\r\n showISOWeekNumbers = input<boolean>(false);\r\n\r\n /**\r\n * CSS classes to apply to calendar buttons.\r\n * Used for styling navigation and action buttons.\r\n *\r\n * @default 'btn btn-sm'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex buttonClasses=\"btn btn-outline-primary btn-sm\"></ngx-datex>\r\n * ```\r\n */\r\n buttonClasses = input<string>('btn btn-sm');\r\n\r\n /**\r\n * CSS classes to apply to the Apply button.\r\n * Combined with buttonClasses for the final styling.\r\n *\r\n * @default 'btn-success'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex applyButtonClasses=\"btn-primary\"></ngx-datex>\r\n * ```\r\n */\r\n applyButtonClasses = input<string>('btn-success');\r\n\r\n /**\r\n * CSS classes to apply to the Cancel button.\r\n * Combined with buttonClasses for the final styling.\r\n *\r\n * @default 'btn-danger'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex cancelButtonClasses=\"btn-secondary\"></ngx-datex>\r\n * ```\r\n */\r\n cancelButtonClasses = input<string>('btn-danger');\r\n\r\n /**\r\n * Function to determine if a specific date should be disabled.\r\n * Return true to disable the date, false to enable it.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```typescript\r\n * // Disable weekends\r\n * const isInvalidDate = (date: Date): boolean => {\r\n * const day = date.getDay();\r\n * return day === 0 || day === 6; // Sunday or Saturday\r\n * };\r\n *\r\n * // Disable specific dates\r\n * const blackoutDates = [new Date('2024-12-25'), new Date('2024-01-01')];\r\n * const isInvalidDate = (date: Date): boolean => {\r\n * return blackoutDates.some(blackout =>\r\n * date.toDateString() === blackout.toDateString()\r\n * );\r\n * };\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [isInvalidDate]=\"isInvalidDate\"></ngx-datex>\r\n * ```\r\n */\r\n isInvalidDate = input<((date: Date) => boolean) | null>(null);\r\n\r\n /**\r\n * Function to apply custom CSS classes to specific dates.\r\n * Return a string or array of strings for CSS classes, or false for no custom styling.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```typescript\r\n * // Highlight holidays\r\n * const isCustomDate = (date: Date): string | string[] | false => {\r\n * const holidays = [new Date('2024-12-25'), new Date('2024-01-01')];\r\n * if (holidays.some(holiday => date.toDateString() === holiday.toDateString())) {\r\n * return 'holiday-date';\r\n * }\r\n * return false;\r\n * };\r\n *\r\n * // Multiple classes for different date types\r\n * const isCustomDate = (date: Date): string | string[] | false => {\r\n * if (date.getDay() === 0) return ['weekend', 'sunday'];\r\n * if (date.getDay() === 6) return ['weekend', 'saturday'];\r\n * return false;\r\n * };\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [isCustomDate]=\"isCustomDate\"></ngx-datex>\r\n * ```\r\n */\r\n isCustomDate = input<((date: Date) => string | string[] | false) | null>(null);\r\n\r\n /**\r\n * The minimum year to show in the year dropdown.\r\n * Only applies when showDropdowns is true.\r\n *\r\n * @default Current year - 100\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showDropdowns]=\"true\" [minYear]=\"2020\" [maxYear]=\"2030\"></ngx-datex>\r\n * ```\r\n */\r\n minYear = input<number>(new Date().getFullYear() - 100);\r\n\r\n /**\r\n * The maximum year to show in the year dropdown.\r\n * Only applies when showDropdowns is true.\r\n *\r\n * @default Current year + 100\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showDropdowns]=\"true\" [minYear]=\"2020\" [maxYear]=\"2030\"></ngx-datex>\r\n * ```\r\n */\r\n maxYear = input<number>(new Date().getFullYear() + 100);\r\n\r\n /**\r\n * Predefined date ranges that users can quickly select.\r\n * Displayed as a sidebar list for easy access to common date ranges.\r\n *\r\n * @default DEFAULT_RANGES\r\n *\r\n * @example\r\n * ```typescript\r\n * const customRanges = {\r\n * 'Today': [startOfDay(new Date()), endOfDay(new Date())],\r\n * 'Yesterday': [\r\n * startOfDay(subDays(new Date(), 1)),\r\n * endOfDay(subDays(new Date(), 1))\r\n * ],\r\n * 'Last 7 Days': [\r\n * startOfDay(subDays(new Date(), 6)),\r\n * endOfDay(new Date())\r\n * ],\r\n * 'Last 30 Days': [\r\n * startOfDay(subDays(new Date(), 29)),\r\n * endOfDay(new Date())\r\n * ],\r\n * 'This Month': [\r\n * startOfMonth(new Date()),\r\n * endOfMonth(new Date())\r\n * ]\r\n * };\r\n * ```\r\n *\r\n * ```html\r\n * <ngx-datex [ranges]=\"customRanges\"></ngx-datex>\r\n * ```\r\n */\r\n ranges = input<Record<string, [Date, Date]>>(DEFAULT_RANGES);\r\n\r\n // Positioning inputs\r\n\r\n /**\r\n * The horizontal alignment of the calendar overlay relative to the input.\r\n * Controls where the calendar appears horizontally.\r\n *\r\n * @default 'center'\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Calendar opens to the left of the input -->\r\n * <ngx-datex opens=\"left\"></ngx-datex>\r\n *\r\n * <!-- Calendar opens to the right of the input -->\r\n * <ngx-datex opens=\"right\"></ngx-datex>\r\n *\r\n * <!-- Calendar opens centered on the input -->\r\n * <ngx-datex opens=\"center\"></ngx-datex>\r\n * ```\r\n */\r\n opens = input<'left' | 'right' | 'center'>('center');\r\n\r\n /**\r\n * The vertical alignment of the calendar overlay relative to the input.\r\n * Controls where the calendar appears vertically.\r\n *\r\n * @default 'auto'\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Calendar always opens below the input -->\r\n * <ngx-datex drops=\"down\"></ngx-datex>\r\n *\r\n * <!-- Calendar always opens above the input -->\r\n * <ngx-datex drops=\"up\"></ngx-datex>\r\n *\r\n * <!-- Calendar opens in the best available space -->\r\n * <ngx-datex drops=\"auto\"></ngx-datex>\r\n * ```\r\n */\r\n drops = input<'up' | 'down' | 'auto'>('auto');\r\n\r\n // Template inputs\r\n\r\n /**\r\n * Custom template for the calendar header.\r\n * Allows complete customization of the header area including navigation controls.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [headerTemplate]=\"customHeader\">\r\n * </ngx-datex>\r\n *\r\n * <ng-template #customHeader>\r\n * <div class=\"custom-header\">\r\n * <button (click)=\"previousMonth()\">Previous</button>\r\n * <span>{{ currentMonth }}</span>\r\n * <button (click)=\"nextMonth()\">Next</button>\r\n * </div>\r\n * </ng-template>\r\n * ```\r\n */\r\n headerTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n /**\r\n * Custom template for the calendar footer.\r\n * Allows complete customization of the footer area including action buttons.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [footerTemplate]=\"customFooter\">\r\n * </ngx-datex>\r\n *\r\n * <ng-template #customFooter>\r\n * <div class=\"custom-footer\">\r\n * <button (click)=\"clearSelection()\">Clear</button>\r\n * <button (click)=\"applySelection()\">Apply</button>\r\n * </div>\r\n * </ng-template>\r\n * ```\r\n */\r\n footerTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n /**\r\n * Custom template for individual calendar day cells.\r\n * Allows complete customization of how each date is displayed.\r\n *\r\n * @default null\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [dayTemplate]=\"customDay\">\r\n * </ngx-datex>\r\n *\r\n * <ng-template #customDay let-date=\"date\" let-isSelected=\"isSelected\">\r\n * <div class=\"custom-day\" [class.selected]=\"isSelected\">\r\n * <span>{{ date.getDate() }}</span>\r\n * <small *ngIf=\"hasEvent(date)\">•</small>\r\n * </div>\r\n * </ng-template>\r\n * ```\r\n */\r\n dayTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n // Accessibility inputs\r\n\r\n /**\r\n * ARIA label for the date picker input.\r\n * Provides accessible description for screen readers.\r\n *\r\n * @default 'Date picker'\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex ariaLabel=\"Select booking dates\"></ngx-datex>\r\n * <ngx-datex ariaLabel=\"Choose event date range\"></ngx-datex>\r\n * ```\r\n */\r\n ariaLabel = input<string>('Date picker');\r\n\r\n /**\r\n * ARIA described-by attribute for the date picker input.\r\n * References additional descriptive text for screen readers.\r\n *\r\n * @default ''\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex ariaDescribedBy=\"date-help-text\"></ngx-datex>\r\n * <div id=\"date-help-text\">Select your preferred date range</div>\r\n * ```\r\n */\r\n ariaDescribedBy = input<string>('');\r\n\r\n // Outputs\r\n\r\n /**\r\n * Emitted when the selected date or date range changes.\r\n * Provides the complete NgxDatexValue with start and end dates.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (dateChange)=\"onDateChange($event)\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onDateChange(value: NgxDatexValue | null) {\r\n * if (value) {\r\n * console.log('Start:', value.startDate);\r\n * console.log('End:', value.endDate);\r\n * }\r\n * }\r\n * ```\r\n */\r\n dateChange: OutputEmitterRef<NgxDatexValue | null> = output<NgxDatexValue | null>();\r\n\r\n /**\r\n * Emitted when a date range is selected (not for single date picker).\r\n * Provides start and end dates separately for convenience.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (rangeChange)=\"onRangeChange($event)\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onRangeChange(range: { startDate: Date; endDate: Date | null }) {\r\n * console.log('Range selected:', range.startDate, 'to', range.endDate);\r\n * }\r\n * ```\r\n */\r\n rangeChange: OutputEmitterRef<{ startDate: Date; endDate: Date | null }> = output<{\r\n startDate: Date;\r\n endDate: Date | null;\r\n }>();\r\n\r\n /**\r\n * Emitted when the calendar overlay is opened.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (openEvent)=\"onCalendarOpen()\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onCalendarOpen() {\r\n * console.log('Calendar opened');\r\n * // Perform actions when calendar opens\r\n * }\r\n * ```\r\n */\r\n openEvent: OutputEmitterRef<void> = output<void>();\r\n\r\n /**\r\n * Emitted when the calendar overlay is closed.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (closeEvent)=\"onCalendarClose()\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onCalendarClose() {\r\n * console.log('Calendar closed');\r\n * // Perform cleanup or validation\r\n * }\r\n * ```\r\n */\r\n closeEvent: OutputEmitterRef<void> = output<void>();\r\n\r\n /**\r\n * Emitted when the displayed month changes in the calendar.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (monthChange)=\"onMonthChange($event)\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onMonthChange(date: Date) {\r\n * console.log('Month changed to:', date.getMonth() + 1, date.getFullYear());\r\n * }\r\n * ```\r\n */\r\n monthChange: OutputEmitterRef<Date> = output<Date>();\r\n\r\n /**\r\n * Emitted when the displayed year changes in the calendar.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (yearChange)=\"onYearChange($event)\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onYearChange(year: number) {\r\n * console.log('Year changed to:', year);\r\n * }\r\n * ```\r\n */\r\n yearChange: OutputEmitterRef<number> = output<number>();\r\n\r\n /**\r\n * Emitted when a date is hovered in the calendar.\r\n * Useful for showing preview information or highlighting date ranges.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (dateHover)=\"onDateHover($event)\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onDateHover(date: Date) {\r\n * console.log('Hovering over:', date);\r\n * // Show preview or update UI\r\n * }\r\n * ```\r\n */\r\n dateHover: OutputEmitterRef<Date> = output<Date>();\r\n\r\n /**\r\n * Emitted when a validation error occurs.\r\n * Provides error message and optional error code for handling.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex (validationError)=\"onValidationError($event)\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onValidationError(error: { error: string; errorCode?: string }) {\r\n * console.error('Validation error:', error.error);\r\n * if (error.errorCode) {\r\n * // Handle specific error types\r\n * switch (error.errorCode) {\r\n * case 'MIN_DATE':\r\n * // Handle minimum date error\r\n * break;\r\n * case 'MAX_DATE':\r\n * // Handle maximum date error\r\n * break;\r\n * }\r\n * }\r\n * }\r\n * ```\r\n */\r\n validationError: OutputEmitterRef<{ error: string; errorCode?: string }> = output<{\r\n error: string;\r\n errorCode?: string;\r\n }>();\r\n\r\n /**\r\n * Emitted when the checkbox state changes (if showCheckbox is enabled).\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-datex [showCheckbox]=\"true\" (checkboxChange)=\"onCheckboxChange($event)\"></ngx-datex>\r\n * ```\r\n *\r\n * ```typescript\r\n * onCheckboxChange(checked: boolean) {\r\n * console.log('Checkbox is now:', checked ? 'checked' : 'unchecked');\r\n * }\r\n * ```\r\n */\r\n checkboxChange: OutputEmitterRef<boolean> = output<boolean>();\r\n\r\n // Internal state signals\r\n private readonly _isOpen = signal(false);\r\n private readonly _currentValue = signal<NgxDatexValue | null>(null);\r\n private readonly _leftCalendarMonth = signal(new Date());\r\n private readonly _rightCalendarMonth = signal(new Date());\r\n private readonly _hoverDate = signal<Date | null>(null);\r\n private readonly _errorMessage = signal<string>('');\r\n private readonly _startTime = signal<NgxDatexTimeValue>({ hour: 0, minute: 0, ampm: 'AM' });\r\n private readonly _endTime = signal<NgxDatexTimeValue>({ hour: 0, minute: 0, ampm: 'AM' });\r\n private readonly _overlayPosition = signal<NgxDatexOverlayPosition | null>(null);\r\n private readonly _inputFocused = signal(false);\r\n private readonly _displayValue = signal<string>('');\r\n private readonly _checkboxValue = signal<boolean>(false);\r\n private readonly _leftCalendarMatrix = signal<Date[][]>([]);\r\n private readonly _rightCalendarMatrix = signal<Date[][]>([]);\r\n\r\n // Internal date properties following vanilla daterangepicker pattern\r\n private _internalStartDate: Date = new Date();\r\n private _internalEndDate: Date | null = null;\r\n private oldStartDate: Date | null = null;\r\n private oldEndDate: Date | null = null;\r\n private previousRightTime: Date | null = null;\r\n\r\n // Public getters for current dates\r\n get currentStartDate(): Date {\r\n return this._internalStartDate;\r\n }\r\n\r\n set currentStartDate(value: Date) {\r\n this._internalStartDate = value;\r\n }\r\n\r\n get currentEndDate(): Date | null {\r\n return this._internalEndDate;\r\n }\r\n\r\n set currentEndDate(value: Date | null) {\r\n this._internalEndDate = value;\r\n }\r\n\r\n // Computed signals for template\r\n readonly isOpen: Signal<boolean> = this._isOpen.asReadonly();\r\n readonly currentValue: Signal<NgxDatexValue | null> = this._currentValue.asReadonly();\r\n readonly displayValue: Signal<string> = this._displayValue.asReadonly();\r\n readonly hasStartDate: Signal<boolean> = computed(() => !!this.currentStartDate);\r\n readonly hasEndDate: Signal<boolean> = computed(() => !!this.currentEndDate);\r\n readonly leftCalendarMonth: Signal<Date> = this._leftCalendarMonth.asReadonly();\r\n readonly rightCalendarMonth: Signal<Date> = this._rightCalendarMonth.asReadonly();\r\n readonly leftCalendarMatrix: Signal<Date[][]> = this._leftCalendarMatrix.asReadonly();\r\n readonly rightCalendarMatrix: Signal<Date[][]> = this._rightCalendarMatrix.asReadonly();\r\n readonly errorMessage: Signal<string> = this._errorMessage.asReadonly();\r\n readonly hasError: Signal<boolean> = computed(() => this._errorMessage().length > 0);\r\n readonly checkboxValue: Signal<boolean> = this._checkboxValue.asReadonly();\r\n\r\n // Calendar computed values\r\n readonly leftCalendarMonthValue: Signal<number> = computed(() =>\r\n this._leftCalendarMonth().getMonth(),\r\n );\r\n readonly leftCalendarYearValue: Signal<number> = computed(() =>\r\n this._leftCalendarMonth().getFullYear(),\r\n );\r\n readonly rightCalendarMonthValue: Signal<number> = computed(() =>\r\n this._rightCalendarMonth().getMonth(),\r\n );\r\n readonly rightCalendarYearValue: Signal<number> = computed(() =>\r\n this._rightCalendarMonth().getFullYear(),\r\n );\r\n\r\n // Locale and theme computed values\r\n readonly monthNames: Signal<string[]> = computed(\r\n () => this.locale().monthNames || SPANISH_LOCALE.monthNames || [],\r\n );\r\n readonly daysOfWeek: Signal<string[]> = computed(() => {\r\n const days = this.locale().daysOfWeek || SPANISH_LOCALE.daysOfWeek || [];\r\n return days.slice(0, 7);\r\n });\r\n readonly availableYears: Signal<number[]> = computed(() => {\r\n const years: number[] = [];\r\n const minYear = this.minYear();\r\n const maxYear = this.maxYear();\r\n for (let year = minYear; year <= maxYear; year++) {\r\n years.push(year);\r\n }\r\n return years;\r\n });\r\n\r\n // Range computed values\r\n readonly rangeEntries: Signal<{ label: string; range: [Date, Date] }[]> = computed(() => {\r\n const ranges = this.ranges();\r\n return Object.entries(ranges).map(([label, range]) => ({ label, range }));\r\n });\r\n readonly showRanges: Signal<boolean> = computed(() => {\r\n const ranges = this.ranges();\r\n return ranges && Object.keys(ranges).length > 0;\r\n });\r\n\r\n // Device and UI computed values\r\n readonly isMobileDevice: Signal<boolean> = computed(\r\n () => isPlatformBrowser(this.platformId) && isMobileDevice(),\r\n );\r\n readonly headerTitle: Signal<string> = computed(() =>\r\n this.singleDatePicker() ? 'Seleccionar fecha' : 'Seleccionar rango de fechas',\r\n );\r\n readonly canApplyValue: Signal<boolean> = computed(() => {\r\n const startDate = this.currentStartDate;\r\n const endDate = this.currentEndDate;\r\n if (!startDate) return false;\r\n if (this.singleDatePicker()) return !!startDate;\r\n return !!(startDate && endDate);\r\n });\r\n\r\n // Arrow positioning computed values\r\n readonly arrowDirection: Signal<'up' | 'down' | 'left' | 'right'> = computed(() => {\r\n const position = this._overlayPosition();\r\n if (!position) return 'down';\r\n\r\n if (position.originY === 'top' && position.overlayY === 'bottom') {\r\n return 'up';\r\n } else if (position.originY === 'bottom' && position.overlayY === 'top') {\r\n return 'down';\r\n } else if (position.originX === 'end' && position.overlayX === 'start') {\r\n return 'left';\r\n } else if (position.originX === 'start' && position.overlayX === 'end') {\r\n return 'right';\r\n }\r\n\r\n return 'down';\r\n });\r\n\r\n readonly arrowAlignment: Signal<'start' | 'center' | 'end'> = computed(() => {\r\n const position = this._overlayPosition();\r\n if (!position) return 'center';\r\n\r\n if (this.arrowDirection() === 'up' || this.arrowDirection() === 'down') {\r\n if (position.overlayX === 'start') return 'start';\r\n if (position.overlayX === 'end') return 'end';\r\n return 'center';\r\n } else {\r\n if (position.overlayY === 'top') return 'start';\r\n if (position.overlayY === 'bottom') return 'end';\r\n return 'center';\r\n }\r\n });\r\n\r\n // Formatted range display\r\n readonly formattedSelectedRange: Signal<string> = computed(() => {\r\n const startDate = this.currentStartDate;\r\n const endDate = this.currentEndDate;\r\n\r\n if (!startDate) return '';\r\n\r\n const locale = this.locale();\r\n const format = locale.format || 'DD/MM/YYYY';\r\n // Following vanilla-daterangepicker: ALWAYS use locale.format as-is\r\n // User must configure format to include time if timePicker is enabled\r\n\r\n const start = formatDateValue(startDate, format, locale.locale);\r\n\r\n if (this.singleDatePicker()) {\r\n return start;\r\n }\r\n\r\n if (!endDate) {\r\n return start;\r\n }\r\n\r\n const end = formatDateValue(endDate, format, locale.locale);\r\n return `${start} - ${end}`;\r\n });\r\n\r\n // Current label for selected range\r\n readonly currentLabel: Signal<string> = computed(() => {\r\n const startDate = this.currentStartDate;\r\n const endDate = this.currentEndDate;\r\n\r\n if (!startDate) return '';\r\n if (!endDate) return '';\r\n\r\n let customRange = true;\r\n const ranges = this.ranges();\r\n const locale = this.locale();\r\n\r\n for (const [label, [rangeStart, rangeEnd]] of Object.entries(ranges)) {\r\n let startMatches: boolean;\r\n let endMatches: boolean;\r\n\r\n if (this.timePicker()) {\r\n const format = this.timePickerSeconds() ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm';\r\n const startFormatted = formatDateValue(startDate, format, locale.locale);\r\n const endFormatted = formatDateValue(endDate, format, locale.locale);\r\n const rangeStartFormatted = formatDateValue(rangeStart, format, locale.locale);\r\n const rangeEndFormatted = formatDateValue(rangeEnd, format, locale.locale);\r\n\r\n startMatches = startFormatted === rangeStartFormatted;\r\n endMatches = endFormatted === rangeEndFormatted;\r\n } else {\r\n startMatches = isSameDate(startDate, rangeStart, 'day');\r\n endMatches = isSameDate(endDate, rangeEnd, 'day');\r\n }\r\n\r\n if (startMatches && endMatches) {\r\n customRange = false;\r\n return label;\r\n }\r\n }\r\n\r\n if (customRange) {\r\n return locale.customRangeLabel || 'Rango Personalizado';\r\n }\r\n\r\n return '';\r\n });\r\n\r\n readonly isCustomRange: Signal<boolean> = computed(() => {\r\n const startDate = this.currentStartDate;\r\n const endDate = this.currentEndDate;\r\n\r\n if (!startDate || !endDate) return false;\r\n\r\n const ranges = this.ranges();\r\n const locale = this.locale();\r\n\r\n for (const [rangeStart, rangeEnd] of Object.values(ranges)) {\r\n let startMatches: boolean;\r\n let endMatches: boolean;\r\n\r\n if (this.timePicker()) {\r\n const format = this.timePickerSeconds() ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm';\r\n const startFormatted = formatDateValue(startDate, format, locale.locale);\r\n const endFormatted = formatDateValue(endDate, format, locale.locale);\r\n const rangeStartFormatted = formatDateValue(rangeStart, format, locale.locale);\r\n const rangeEndFormatted = formatDateValue(rangeEnd, format, locale.locale);\r\n\r\n startMatches = startFormatted === rangeStartFormatted;\r\n endMatches = endFormatted === rangeEndFormatted;\r\n } else {\r\n startMatches = isSameDate(startDate, rangeStart, 'day');\r\n endMatches = isSameDate(endDate, rangeEnd, 'day');\r\n }\r\n\r\n if (startMatches && endMatches) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n });\r\n\r\n // Time picker computed values\r\n readonly selectedStartHour: Signal<number> = computed(() => this._startTime().hour);\r\n readonly selectedStartMinute: Signal<number> = computed(() => this._startTime().minute);\r\n readonly selectedStartAmPm: Signal<string> = computed(() => this._startTime().ampm);\r\n readonly selectedEndHour: Signal<number> = computed(() => this._endTime().hour);\r\n readonly selectedEndMinute: Signal<number> = computed(() => this._endTime().minute);\r\n readonly selectedEndAmPm: Signal<string> = computed(() => this._endTime().ampm);\r\n\r\n readonly hours24: Signal<number[]> = computed(() => Array.from({ length: 24 }, (_, i) => i));\r\n readonly hours12: Signal<number[]> = computed(() => Array.from({ length: 12 }, (_, i) => i + 1));\r\n readonly minutes: Signal<number[]> = computed(() => {\r\n const increment = this.timePickerIncrement();\r\n const minutes: number[] = [];\r\n for (let i = 0; i < 60; i += increment) {\r\n minutes.push(i);\r\n }\r\n return minutes;\r\n });\r\n\r\n // Available time options\r\n readonly availableStartHours: Signal<{ value: number; disabled: boolean }[]> = computed(() => {\r\n return this.timePickerService.getAvailableHours(\r\n this.currentStartDate,\r\n this.minDate(),\r\n this.maxDate(),\r\n this.timePicker24Hour(),\r\n this._startTime(),\r\n false,\r\n );\r\n });\r\n\r\n readonly availableEndHours: Signal<{ value: number; disabled: boolean }[]> = computed(() => {\r\n return this.timePickerService.getAvailableHours(\r\n this.currentEndDate,\r\n this.minDate(),\r\n this.maxDate(),\r\n this.timePicker24Hour(),\r\n this._endTime(),\r\n true,\r\n this.currentStartDate,\r\n );\r\n });\r\n\r\n readonly availableStartMinutes: Signal<{ value: number; disabled: boolean }[]> = computed(() => {\r\n return this.timePickerService.getAvailableMinutes(\r\n this.currentStartDate,\r\n this.minDate(),\r\n this.maxDate(),\r\n this._startTime(),\r\n this.timePickerIncrement(),\r\n this.timePicker24Hour(),\r\n false,\r\n );\r\n });\r\n\r\n readonly availableEndMinutes: Signal<{ value: number; disabled: boolean }[]> = computed(() => {\r\n return this.timePickerService.getAvailableMinutes(\r\n this.currentEndDate,\r\n this.minDate(),\r\n this.maxDate(),\r\n this._endTime(),\r\n this.timePickerIncrement(),\r\n this.timePicker24Hour(),\r\n true,\r\n this.currentStartDate,\r\n );\r\n });\r\n\r\n // ControlValueAccessor implementation\r\n private onChange: (value: NgxDatexValue | null) => void = () => {\r\n // Implementation provided by registerOnChange\r\n };\r\n private onTouched: () => void = () => {\r\n // Implementation provided by registerOnTouched\r\n };\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n this.initializeComponent();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.datexService.updateConfig(this.config());\r\n this.datexService.setLocale(this.locale());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._isOpen.set(false);\r\n this.overlayService.disposeOverlay();\r\n }\r\n\r\n // ControlValueAccessor methods\r\n writeValue(value: NgxDatexValue | null): void {\r\n if (value) {\r\n this.currentStartDate = new Date(value.startDate);\r\n this.currentEndDate = value.endDate ? new Date(value.endDate) : null;\r\n this._currentValue.set(value);\r\n\r\n if (value.startDate) {\r\n this.updateMonthsInView();\r\n }\r\n\r\n if (this.timePicker()) {\r\n // Always update time signals from the provided dates to ensure sync\r\n this.updateTimeSignalsFromDate(value.startDate, 'start');\r\n if (value.endDate) {\r\n this.updateTimeSignalsFromDate(value.endDate, 'end');\r\n }\r\n }\r\n\r\n this.updateElement();\r\n } else {\r\n this.initializeDefaultDates();\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: NgxDatexValue | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n // Implementation for disabled state\r\n void isDisabled;\r\n }\r\n\r\n // Public methods\r\n\r\n /**\r\n * Toggles the calendar visibility.\r\n * Opens the calendar if closed, closes it if open.\r\n * Does nothing if the component is disabled or readonly.\r\n *\r\n * @example\r\n * ```typescript\r\n * // In component\r\n * @ViewChild(NgxDatex) datePicker!: NgxDatex;\r\n *\r\n * togglePicker() {\r\n * this.datePicker.toggle();\r\n * }\r\n * ```\r\n */\r\n toggle(): void {\r\n console.log('se ejecuta toggle');\r\n if (this.disabled() || this.readonly()) return;\r\n if (this._isOpen()) {\r\n this.closeCalendar();\r\n } else {\r\n this.openCalendar();\r\n }\r\n }\r\n\r\n /**\r\n * Opens the calendar overlay.\r\n * Saves current state for potential cancellation and initializes the calendar view.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Programmatically open the calendar\r\n * this.datePicker.openCalendar();\r\n * ```\r\n */\r\n openCalendar(): void {\r\n if (this.disabled() || this.readonly() || this._isOpen()) return;\r\n\r\n // Save old values for potential cancellation (following vanilla daterangepicker)\r\n this.oldStartDate = new Date(this.currentStartDate);\r\n this.oldEndDate = this.currentEndDate ? new Date(this.currentEndDate) : null;\r\n this.previousRightTime = this.currentEndDate ? new Date(this.currentEndDate) : null;\r\n\r\n this.createOverlay();\r\n this._isOpen.set(true);\r\n\r\n // Sync time signals with current dates when opening (don't modify the dates)\r\n if (this.timePicker()) {\r\n this.updateTimeSignalsFromDate(this.currentStartDate, 'start');\r\n if (this.currentEndDate) {\r\n this.updateTimeSignalsFromDate(this.currentEndDate, 'end');\r\n }\r\n }\r\n\r\n this.updateView();\r\n this.openEvent.emit();\r\n }\r\n\r\n /**\r\n * Closes the calendar overlay.\r\n * Handles incomplete selections and emits change events if values have changed.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Programmatically close the calendar\r\n * this.datePicker.closeCalendar();\r\n * ```\r\n */\r\n closeCalendar(): void {\r\n console.log('ouscerrando');\r\n this._isOpen.set(false);\r\n this._hoverDate.set(null);\r\n console.log(!this.currentEndDate && this.oldStartDate && this.oldEndDate);\r\n console.log(this.currentEndDate, this.oldStartDate, this.oldEndDate);\r\n\r\n // Handle incomplete selection (following vanilla daterangepicker logic)\r\n if (!this.currentEndDate && this.oldStartDate && this.oldEndDate) {\r\n this.currentStartDate = this.oldStartDate;\r\n this.currentEndDate = this.oldEndDate;\r\n this.updateCurrentValue();\r\n return;\r\n }\r\n\r\n console.log('segunda vez se ejecuta');\r\n // Check for changes using appropriate precision based on timePicker\r\n if (this.oldStartDate && this.oldEndDate) {\r\n const precision = this.timePicker() ? 'minute' : 'day';\r\n const hasChanges =\r\n !isSameDate(this.currentStartDate, this.oldStartDate, precision) ||\r\n (this.currentEndDate && !isSameDate(this.currentEndDate, this.oldEndDate, precision));\r\n\r\n if (hasChanges && this.currentEndDate) {\r\n this.emitValueChange();\r\n }\r\n }\r\n\r\n this.updateElement();\r\n this.overlayService.closeOverlay();\r\n this.closeEvent.emit();\r\n }\r\n\r\n /**\r\n * Applies the current selection and closes the calendar.\r\n * Only works if there's a valid selection to apply.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Apply current selection programmatically\r\n * if (this.datePicker.canApplyValue()) {\r\n * this.datePicker.apply();\r\n * }\r\n * ```\r\n */\r\n apply(): void {\r\n if (!this.canApplyValue()) return;\r\n\r\n // Ensure time values are applied to the dates before closing\r\n if (this.timePicker()) {\r\n const startTime = this._startTime();\r\n const endTime = this._endTime();\r\n\r\n // Apply start time\r\n let startHour = startTime.hour;\r\n if (!this.timePicker24Hour()) {\r\n if (startTime.ampm === 'PM' && startHour < 12) startHour += 12;\r\n if (startTime.ampm === 'AM' && startHour === 12) startHour = 0;\r\n }\r\n this.currentStartDate.setHours(startHour, startTime.minute, 0, 0);\r\n\r\n // Apply end time if exists\r\n if (this.currentEndDate) {\r\n let endHour = endTime.hour;\r\n if (!this.timePicker24Hour()) {\r\n if (endTime.ampm === 'PM' && endHour < 12) endHour += 12;\r\n if (endTime.ampm === 'AM' && endHour === 12) endHour = 0;\r\n }\r\n this.currentEndDate.setHours(endHour, endTime.minute, 0, 0);\r\n }\r\n\r\n this.updateCurrentValue();\r\n }\r\n console.log('apply');\r\n this.updateElement();\r\n this.closeCalendar();\r\n }\r\n\r\n /**\r\n * Cancels the current selection and reverts to the previous values.\r\n * Closes the calendar without applying changes.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Cancel current selection\r\n * this.datePicker.cancel();\r\n * ```\r\n */\r\n cancel(): void {\r\n console.log('calcelll');\r\n if (this.oldStartDate && this.oldEndDate) {\r\n this.currentStartDate = this.oldStartDate;\r\n this.currentEndDate = this.oldEndDate;\r\n this.updateCurrentValue();\r\n }\r\n this.closeCalendar();\r\n }\r\n\r\n /**\r\n * Selects a specific date in the calendar.\r\n * Handles both single date and range selection logic.\r\n *\r\n * @param date - The date to select\r\n *\r\n * @example\r\n * ```typescript\r\n * // Programmatically select a date\r\n * const today = new Date();\r\n * this.datePicker.selectDate(today);\r\n * ```\r\n */\r\n selectDate(date: Date): void {\r\n if (this.isDisabled(date)) return;\r\n\r\n const validation = this.datexService.validateDate(date);\r\n if (!validation.isValid) {\r\n this._errorMessage.set(validation.error || '');\r\n this.validationError.emit({\r\n error: validation.error || '',\r\n errorCode: validation.errorCode,\r\n });\r\n return;\r\n }\r\n\r\n this._errorMessage.set('');\r\n this._hoverDate.set(null);\r\n\r\n if (this.singleDatePicker()) {\r\n this.setStartDate(date);\r\n this.setEndDate(date);\r\n\r\n if (this.effectiveAutoApply()) {\r\n this.emitValueChange();\r\n }\r\n\r\n if (!this.timePicker() && this.effectiveAutoApply()) {\r\n this.closeCalendar();\r\n }\r\n } else {\r\n // Range selection logic following vanilla daterangepicker\r\n if (\r\n this.currentEndDate ||\r\n (this.currentStartDate && isBeforeDate(date, this.currentStartDate))\r\n ) {\r\n // Picking start\r\n const startDate = new Date(date);\r\n if (this.timePicker()) {\r\n const startTime = this._startTime();\r\n let hour = startTime.hour;\r\n if (!this.timePicker24Hour()) {\r\n if (startTime.ampm === 'PM' && hour < 12) hour += 12;\r\n if (startTime.ampm === 'AM' && hour === 12) hour = 0;\r\n }\r\n startDate.setHours(hour, startTime.minute, 0, 0);\r\n }\r\n this.currentEndDate = null;\r\n this.setStartDate(startDate);\r\n } else {\r\n // Picking end\r\n const endDate = new Date(date);\r\n if (this.timePicker()) {\r\n const endTime = this._endTime();\r\n let hour = endTime.hour;\r\n if (!this.timePicker24Hour()) {\r\n if (endTime.ampm === 'PM' && hour < 12) hour += 12;\r\n if (endTime.ampm === 'AM' && hour === 12) hour = 0;\r\n }\r\n endDate.setHours(hour, endTime.minute, 0, 0);\r\n }\r\n this.setEndDate(endDate);\r\n\r\n if (this.effectiveAutoApply()) {\r\n this.emitValueChange();\r\n this.closeCalendar();\r\n }\r\n }\r\n }\r\n\r\n this.updateView();\r\n }\r\n\r\n /**\r\n * Selects a predefined date range by label.\r\n *\r\n * @param label - The label of the range to select (must exist in ranges configuration)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Select \"Last 7 days\" range\r\n * this.datePicker.selectRange('Last 7 days');\r\n * ```\r\n */\r\n selectRange(label: string): void {\r\n const ranges = this.ranges();\r\n const range = ranges[label];\r\n if (!range) return;\r\n\r\n const [rangeStart, rangeEnd] = range;\r\n\r\n if (this.timePicker()) {\r\n // When timePicker is enabled, preserve the exact time from the range\r\n this.currentStartDate = new Date(rangeStart);\r\n this.currentEndDate = new Date(rangeEnd);\r\n\r\n // Update time signals to match the selected range\r\n this.updateTimeSignalsFromDate(this.currentStartDate, 'start');\r\n this.updateTimeSignalsFromDate(this.currentEndDate, 'end');\r\n } else {\r\n // When timePicker is disabled, use start/end of day\r\n this.currentStartDate = startOfDay(new Date(rangeStart));\r\n this.currentEndDate = endOfDay(new Date(rangeEnd));\r\n }\r\n\r\n this.updateCurrentValue();\r\n this.updateMonthsInView();\r\n this.apply();\r\n }\r\n\r\n selectCustomRange(): void {\r\n // Custom range selection logic - mainly visual\r\n }\r\n\r\n // Event handlers\r\n onInputClick(): void {\r\n if (this.readonly()) return;\r\n if (this._inputFocused() && this._isOpen()) return;\r\n if (!this._isOpen()) {\r\n this.openCalendar();\r\n }\r\n }\r\n\r\n onInputFocus(): void {\r\n this._inputFocused.set(true);\r\n this.onTouched();\r\n }\r\n\r\n onInputBlur(): void {\r\n this._inputFocused.set(false);\r\n this.elementChanged();\r\n }\r\n\r\n onInputKeydown(event: KeyboardEvent): void {\r\n console.log('aquuiii');\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.toggle();\r\n } else if (event.key === 'Escape') {\r\n if (!this._inputFocused() || (this._inputFocused() && this._isOpen())) {\r\n this.closeCalendar();\r\n }\r\n } else if (event.key === 'Tab' || event.key === 'Enter') {\r\n if (this._isOpen()) {\r\n this.closeCalendar();\r\n }\r\n }\r\n }\r\n\r\n onInputKeyup(): void {\r\n this.elementChanged();\r\n }\r\n\r\n onDateHover(date: Date): void {\r\n if (!this.currentEndDate && !this.singleDatePicker() && this.currentStartDate) {\r\n if (!isBeforeDate(date, this.currentStartDate)) {\r\n this._hoverDate.set(date);\r\n this.dateHover.emit(date);\r\n }\r\n }\r\n }\r\n\r\n onCalendarMouseLeave(): void {\r\n this._hoverDate.set(null);\r\n }\r\n\r\n onCalendarKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && !this._inputFocused()) {\r\n console.log('close outside');\r\n this.closeCalendar();\r\n }\r\n }\r\n\r\n onCheckboxChange(checked: boolean): void {\r\n this._checkboxValue.set(checked);\r\n this.checkboxChange.emit(checked);\r\n }\r\n\r\n // Calendar navigation\r\n previousMonth(calendar: 'left' | 'right'): void {\r\n if (calendar === 'left') {\r\n const current = this._leftCalendarMonth();\r\n const newMonth = addMonths(current, -1);\r\n this._leftCalendarMonth.set(newMonth);\r\n this.updateLeftCalendarMatrix();\r\n\r\n if (this.linkedCalendars() && !this.singleDatePicker()) {\r\n const rightMonth = addMonths(newMonth, 1);\r\n this._rightCalendarMonth.set(rightMonth);\r\n this.updateRightCalendarMatrix();\r\n }\r\n } else {\r\n const current = this._rightCalendarMonth();\r\n const newMonth = addMonths(current, -1);\r\n this._rightCalendarMonth.set(newMonth);\r\n this.updateRightCalendarMatrix();\r\n\r\n if (this.linkedCalendars()) {\r\n const leftMonth = addMonths(newMonth, -1);\r\n this._leftCalendarMonth.set(leftMonth);\r\n this.updateLeftCalendarMatrix();\r\n }\r\n }\r\n }\r\n\r\n nextMonth(calendar: 'left' | 'right'): void {\r\n if (calendar === 'left') {\r\n const current = this._leftCalendarMonth();\r\n const newMonth = addMonths(current, 1);\r\n this._leftCalendarMonth.set(newMonth);\r\n this.updateLeftCalendarMatrix();\r\n\r\n if (this.linkedCalendars() && !this.singleDatePicker()) {\r\n const rightMonth = addMonths(newMonth, 1);\r\n this._rightCalendarMonth.set(rightMonth);\r\n this.updateRightCalendarMatrix();\r\n }\r\n } else {\r\n const current = this._rightCalendarMonth();\r\n const newMonth = addMonths(current, 1);\r\n this._rightCalendarMonth.set(newMonth);\r\n this.updateRightCalendarMatrix();\r\n\r\n if (this.linkedCalendars()) {\r\n const leftMonth = addMonths(newMonth, -1);\r\n this._leftCalendarMonth.set(leftMonth);\r\n this.updateLeftCalendarMatrix();\r\n }\r\n }\r\n }\r\n\r\n // Navigation methods\r\n canNavigatePrevious(calendar: 'left' | 'right'): boolean {\r\n const month = calendar === 'left' ? this._leftCalendarMonth() : this._rightCalendarMonth();\r\n const minDate = this.minDate();\r\n if (minDate) {\r\n return month > minDate;\r\n }\r\n return true;\r\n }\r\n\r\n canNavigateNext(calendar: 'left' | 'right'): boolean {\r\n const month = calendar === 'left' ? this._leftCalendarMonth() : this._rightCalendarMonth();\r\n const maxDate = this.maxDate();\r\n if (maxDate) {\r\n return month < maxDate;\r\n }\r\n return true;\r\n }\r\n\r\n onMonthChange(calendar: 'left' | 'right', event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const monthIndex = parseInt(target.value, 10);\r\n\r\n if (calendar === 'left') {\r\n const current = this._leftCalendarMonth();\r\n let newMonth = new Date(current.getFullYear(), monthIndex, 1);\r\n\r\n const minDate = this.minDate();\r\n const maxDate = this.maxDate();\r\n\r\n if (\r\n minDate &&\r\n (newMonth.getFullYear() < minDate.getFullYear() ||\r\n (newMonth.getFullYear() === minDate.getFullYear() && monthIndex < minDate.getMonth()))\r\n ) {\r\n newMonth = new Date(minDate.getFullYear(), minDate.getMonth(), 1);\r\n }\r\n\r\n if (\r\n maxDate &&\r\n (newMonth.getFullYear() > maxDate.getFullYear() ||\r\n (newMonth.getFullYear() === maxDate.getFullYear() && monthIndex > maxDate.getMonth()))\r\n ) {\r\n newMonth = new Date(maxDate.getFullYear(), maxDate.getMonth(), 1);\r\n }\r\n\r\n this._leftCalendarMonth.set(newMonth);\r\n this.updateLeftCalendarMatrix();\r\n\r\n if (this.linkedCalendars() && !this.singleDatePicker()) {\r\n const rightMonth = addMonths(newMonth, 1);\r\n this._rightCalendarMonth.set(rightMonth);\r\n this.updateRightCalendarMatrix();\r\n }\r\n } else {\r\n const current = this._rightCalendarMonth();\r\n let newMonth = new Date(current.getFullYear(), monthIndex, 1);\r\n\r\n const startDate = this.currentStartDate;\r\n if (\r\n startDate &&\r\n (newMonth.getFullYear() < startDate.getFullYear() ||\r\n (newMonth.getFullYear() === startDate.getFullYear() && monthIndex < startDate.getMonth()))\r\n ) {\r\n newMonth = new Date(startDate.getFullYear(), startDate.getMonth(), 1);\r\n }\r\n\r\n this._rightCalendarMonth.set(newMonth);\r\n this.updateRightCalendarMatrix();\r\n\r\n if (this.linkedCalendars()) {\r\n const leftMonth = addMonths(newMonth, -1);\r\n this._leftCalendarMonth.set(leftMonth);\r\n this.updateLeftCalendarMatrix();\r\n }\r\n }\r\n }\r\n\r\n onYearChange(calendar: 'left' | 'right', event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const year = parseInt(target.value, 10);\r\n\r\n if (calendar === 'left') {\r\n const current = this._leftCalendarMonth();\r\n let newMonth = new Date(year, current.getMonth(), 1);\r\n\r\n const minDate = this.minDate();\r\n const maxDate = this.maxDate();\r\n\r\n if (\r\n minDate &&\r\n (year < minDate.getFullYear() ||\r\n (year === minDate.getFullYear() && current.getMonth() < minDate.getMonth()))\r\n ) {\r\n newMonth = new Date(minDate.getFullYear(), minDate.getMonth(), 1);\r\n }\r\n\r\n if (\r\n maxDate &&\r\n (year > maxDate.getFullYear() ||\r\n (year === maxDate.getFullYear() && current.getMonth() > maxDate.getMonth()))\r\n ) {\r\n newMonth = new Date(maxDate.getFullYear(), maxDate.getMonth(), 1);\r\n }\r\n\r\n this._leftCalendarMonth.set(newMonth);\r\n this.updateLeftCalendarMatrix();\r\n\r\n if (this.linkedCalendars() && !this.singleDatePicker()) {\r\n const rightMonth = addMonths(newMonth, 1);\r\n this._rightCalendarMonth.set(rightMonth);\r\n this.updateRightCalendarMatrix();\r\n }\r\n } else {\r\n const current = this._rightCalendarMonth();\r\n let newMonth = new Date(year, current.getMonth(), 1);\r\n\r\n const startDate = this.currentStartDate;\r\n if (\r\n startDate &&\r\n (year < startDate.getFullYear() ||\r\n (year === startDate.getFullYear() && current.getMonth() < startDate.getMonth()))\r\n ) {\r\n newMonth = new Date(startDate.getFullYear(), startDate.getMonth(), 1);\r\n }\r\n\r\n this._rightCalendarMonth.set(newMonth);\r\n this.updateRightCalendarMatrix();\r\n\r\n if (this.linkedCalendars()) {\r\n const leftMonth = addMonths(newMonth, -1);\r\n this._leftCalendarMonth.set(leftMonth);\r\n this.updateLeftCalendarMatrix();\r\n }\r\n }\r\n }\r\n\r\n // Helper methods for template\r\n isRangeActive(label: string): boolean {\r\n if (!this.currentStartDate) return false;\r\n\r\n const ranges = this.ranges();\r\n const range = ranges[label];\r\n if (!range) return false;\r\n\r\n const [rangeStart, rangeEnd] = range;\r\n const startMatches = isSameDate(this.currentStartDate, rangeStart, 'day');\r\n const endMatches = this.currentEndDate\r\n ? isSameDate(this.currentEndDate, rangeEnd, 'day')\r\n : isSameDate(this.currentStartDate, rangeEnd, 'day');\r\n\r\n return startMatches && endMatches;\r\n }\r\n\r\n isDisabled(date: Date): boolean {\r\n return this.calendarService.isDateDisabled(\r\n date,\r\n this.minDate(),\r\n this.maxDate(),\r\n this.maxSpan(),\r\n this.currentStartDate,\r\n this.currentEndDate,\r\n this.singleDatePicker(),\r\n this.isInvalidDate(),\r\n );\r\n }\r\n\r\n isSelected(date: Date): boolean {\r\n return this.calendarService.isDateSelected(\r\n date,\r\n this.currentStartDate,\r\n this.currentEndDate,\r\n this.singleDatePicker(),\r\n );\r\n }\r\n\r\n isInRange(date: Date): boolean {\r\n return this.calendarService.isDateInRange(\r\n date,\r\n this.currentStartDate,\r\n this.currentEndDate,\r\n this.singleDatePicker(),\r\n );\r\n }\r\n\r\n isRangeStart(date: Date): boolean {\r\n return this.calendarService.isDateRangeStart(date, this.currentStartDate);\r\n }\r\n\r\n isRangeEnd(date: Date): boolean {\r\n return this.calendarService.isDateRangeEnd(date, this.currentEndDate);\r\n }\r\n\r\n isToday(date: Date): boolean {\r\n const today = new Date();\r\n return isSameDate(date, today, 'day');\r\n }\r\n\r\n isOtherMonth(date: Date, calendarMonth: Date): boolean {\r\n return (\r\n date.getMonth() !== calendarMonth.getMonth() ||\r\n date.getFullYear() !== calendarMonth.getFullYear()\r\n );\r\n }\r\n\r\n // Hover methods\r\n isHovered(date: Date): boolean {\r\n const hoverDate = this._hoverDate();\r\n if (!hoverDate) return false;\r\n\r\n if (!this.currentStartDate || this.currentEndDate || this.singleDatePicker()) return false;\r\n\r\n const startDate = this.currentStartDate;\r\n const rangeStart = hoverDate < startDate ? hoverDate : startDate;\r\n const rangeEnd = hoverDate < startDate ? startDate : hoverDate;\r\n\r\n const dateTime = startOfDay(date).getTime();\r\n const rangeStartTime = startOfDay(rangeStart).getTime();\r\n const rangeEndTime = startOfDay(rangeEnd).getTime();\r\n\r\n return dateTime > rangeStartTime && dateTime < rangeEndTime;\r\n }\r\n\r\n isHoverStart(date: Date): boolean {\r\n const hoverDate = this._hoverDate();\r\n if (!hoverDate) return false;\r\n\r\n if (!this.currentStartDate || this.currentEndDate || this.singleDatePicker()) return false;\r\n\r\n const startDate = this.currentStartDate;\r\n const rangeStart = hoverDate < startDate ? hoverDate : startDate;\r\n\r\n return isSameDate(date, rangeStart, 'day');\r\n }\r\n\r\n isHoverEnd(date: Date): boolean {\r\n const hoverDate = this._hoverDate();\r\n if (!hoverDate) return false;\r\n\r\n if (!this.currentStartDate || this.currentEndDate || this.singleDatePicker()) return false;\r\n\r\n const startDate = this.currentStartDate;\r\n const rangeEnd = hoverDate < startDate ? startDate : hoverDate;\r\n\r\n return isSameDate(date, rangeEnd, 'day');\r\n }\r\n\r\n formatDateForAria(date: Date): string {\r\n const dayNames = ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'];\r\n const monthNames = this.monthNames();\r\n\r\n return `${dayNames[date.getDay()]}, ${date.getDate()} de ${monthNames[date.getMonth()]} de ${date.getFullYear()}`;\r\n }\r\n\r\n // Time picker event handlers\r\n onStartHourChange(event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const hour = parseInt(target.value, 10);\r\n this.updateTimeFromPicker('start', 'hour', hour);\r\n }\r\n\r\n onStartMinuteChange(event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const minute = parseInt(target.value, 10);\r\n this.updateTimeFromPicker('start', 'minute', minute);\r\n }\r\n\r\n onStartAmPmChange(event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const ampm = target.value;\r\n this.updateTimeFromPicker('start', 'ampm', ampm);\r\n }\r\n\r\n onEndHourChange(event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const hour = parseInt(target.value, 10);\r\n this.updateTimeFromPicker('end', 'hour', hour);\r\n }\r\n\r\n onEndMinuteChange(event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const minute = parseInt(target.value, 10);\r\n this.updateTimeFromPicker('end', 'minute', minute);\r\n }\r\n\r\n onEndAmPmChange(event: Event): void {\r\n const target = event.target as HTMLSelectElement;\r\n const ampm = target.value;\r\n this.updateTimeFromPicker('end', 'ampm', ampm);\r\n }\r\n\r\n // Private methods\r\n private initializeComponent(): void {\r\n const inputStartDate = this.startDate();\r\n const inputEndDate = this.endDate();\r\n\r\n if (!inputStartDate && !inputEndDate) {\r\n this.initializeDefaultDates();\r\n } else {\r\n this.initializeWithInputDates(inputStartDate, inputEndDate);\r\n }\r\n\r\n this.datexService.updateConfig(this.config());\r\n this.datexService.setLocale(this.locale());\r\n this.updateElement();\r\n }\r\n\r\n private initializeDefaultDates(): void {\r\n const today = new Date();\r\n\r\n // Following vanilla daterangepicker: always start with startOf/endOf day\r\n // moment().startOf('day') = 00:00:00\r\n // moment().endOf('day') = 23:59:59\r\n const startDate = startOfDay(today);\r\n const endDate = this.singleDatePicker() ? startOfDay(today) : endOfDay(today);\r\n\r\n // When timePicker is enabled, preserve these default times\r\n // (vanilla daterangepicker doesn't modify them when timePicker=true)\r\n if (this.timePicker()) {\r\n // Initialize time signals from the default dates\r\n this.updateTimeSignalsFromDate(startDate, 'start');\r\n if (endDate) {\r\n this.updateTimeSignalsFromDate(endDate, 'end');\r\n }\r\n }\r\n\r\n this.currentStartDate = startDate;\r\n this.currentEndDate = endDate;\r\n\r\n this.initializeCalendars(startDate, endDate);\r\n this.updateCurrentValue();\r\n }\r\n\r\n private initializeWithInputDates(inputStartDate: Date | null, inputEndDate: Date | null): void {\r\n let startDate: Date;\r\n let endDate: Date;\r\n\r\n if (this.timePicker()) {\r\n // When timePicker is enabled, preserve the full date-time or use appropriate defaults\r\n if (inputStartDate) {\r\n startDate = new Date(inputStartDate);\r\n // If the input date doesn't have specific time (is at 00:00:00), keep it as is\r\n // Otherwise preserve the provided time\r\n } else {\r\n startDate = new Date();\r\n startDate.setHours(0, 0, 0, 0); // Default start time: 00:00\r\n }\r\n\r\n if (this.singleDatePicker()) {\r\n endDate = new Date(startDate);\r\n } else if (inputEndDate) {\r\n endDate = new Date(inputEndDate);\r\n // If the input end date doesn't have specific time (is at 00:00:00), set to end of day\r\n if (endDate.getHours() === 0 && endDate.getMinutes() === 0 && endDate.getSeconds() === 0) {\r\n endDate.setHours(23, 59, 0, 0);\r\n }\r\n } else {\r\n endDate = new Date(startDate);\r\n endDate.setHours(23, 59, 0, 0); // Default end time: 23:59\r\n }\r\n } else {\r\n // When timePicker is disabled, use start/end of day\r\n startDate = inputStartDate ? startOfDay(new Date(inputStartDate)) : startOfDay(new Date());\r\n endDate = this.singleDatePicker()\r\n ? new Date(startDate)\r\n : inputEndDate\r\n ? endOfDay(new Date(inputEndDate))\r\n : endOfDay(startDate);\r\n }\r\n\r\n this.currentStartDate = startDate;\r\n this.currentEndDate = endDate;\r\n\r\n this.initializeCalendars(startDate, endDate);\r\n this.updateCurrentValue();\r\n\r\n if (this.timePicker()) {\r\n this.updateTimeSignalsFromDate(startDate, 'start');\r\n if (endDate) {\r\n this.updateTimeSignalsFromDate(endDate, 'end');\r\n }\r\n }\r\n }\r\n\r\n private initializeCalendars(startDate: Date, endDate: Date): void {\r\n this._leftCalendarMonth.set(new Date(startDate.getFullYear(), startDate.getMonth(), 1));\r\n this.updateLeftCalendarMatrix();\r\n\r\n if (!this.singleDatePicker()) {\r\n if (this.linkedCalendars()) {\r\n const nextMonth = addMonths(new Date(startDate.getFullYear(), startDate.getMonth(), 1), 1);\r\n this._rightCalendarMonth.set(nextMonth);\r\n } else if (\r\n endDate &&\r\n (endDate.getMonth() !== startDate.getMonth() ||\r\n endDate.getFullYear() !== startDate.getFullYear())\r\n ) {\r\n this._rightCalendarMonth.set(new Date(endDate.getFullYear(), endDate.getMonth(), 1));\r\n } else {\r\n const nextMonth = addMonths(new Date(startDate.getFullYear(), startDate.getMonth(), 1), 1);\r\n this._rightCalendarMonth.set(nextMonth);\r\n }\r\n this.updateRightCalendarMatrix();\r\n }\r\n }\r\n\r\n private updateMonthsInView(): void {\r\n this.calendarService.updateMonthsInView(\r\n this.currentStartDate,\r\n this.currentEndDate,\r\n this._leftCalendarMonth(),\r\n this._rightCalendarMonth(),\r\n this.singleDatePicker(),\r\n this.linkedCalendars(),\r\n this.maxDate(),\r\n (month) => {\r\n this._leftCalendarMonth.set(month);\r\n this.updateLeftCalendarMatrix();\r\n },\r\n (month) => {\r\n this._rightCalendarMonth.set(month);\r\n this.updateRightCalendarMatrix();\r\n },\r\n );\r\n }\r\n\r\n private updateLeftCalendarMatrix(): void {\r\n const matrix = this.datexService.buildCalendarMatrix(this._leftCalendarMonth());\r\n this._leftCalendarMatrix.set(matrix);\r\n }\r\n\r\n private updateRightCalendarMatrix(): void {\r\n const matrix = this.datexService.buildCalendarMatrix(this._rightCalendarMonth());\r\n this._rightCalendarMatrix.set(matrix);\r\n }\r\n\r\n private updateTimeSignalsFromDate(date: Date, type: 'start' | 'end'): void {\r\n const timeValue = this.timePickerService.updateTimeSignalsFromDate(\r\n date,\r\n this.timePicker24Hour(),\r\n );\r\n if (type === 'start') {\r\n this._startTime.set(timeValue);\r\n } else {\r\n this._endTime.set(timeValue);\r\n }\r\n }\r\n\r\n private setStartDate(startDate: Date): void {\r\n const newStartDate = this.calendarService.setStartDate(\r\n startDate,\r\n this.minDate(),\r\n this.maxDate(),\r\n this.timePicker(),\r\n this.timePickerIncrement(),\r\n this.currentStartDate, // Pass current date for time preservation\r\n );\r\n\r\n this.currentStartDate = newStartDate;\r\n this.updateCurrentValue();\r\n this.updateMonthsInView();\r\n\r\n if (!this._isOpen()) {\r\n this.updateElement();\r\n }\r\n }\r\n\r\n private setEndDate(endDate: Date): void {\r\n const newEndDate = this.calendarService.setEndDate(\r\n endDate,\r\n this.currentStartDate,\r\n this.maxDate(),\r\n this.maxSpan(),\r\n this.timePicker(),\r\n this.timePickerIncrement(),\r\n this.currentEndDate, // Pass current date for time preservation\r\n );\r\n\r\n this.previousRightTime = new Date(newEndDate);\r\n this.currentEndDate = newEndDate;\r\n this.updateCurrentValue();\r\n this.updateMonthsInView();\r\n\r\n if (!this._isOpen()) {\r\n this.updateElement();\r\n }\r\n }\r\n\r\n private updateElement(): void {\r\n if (!this.autoUpdateInput()) return;\r\n\r\n const startDate = this._internalStartDate;\r\n const endDate = this._internalEndDate;\r\n\r\n if (!startDate) return;\r\n\r\n const locale = this.locale();\r\n const format = locale.format || 'DD/MM/YYYY';\r\n const separator = locale.separator || ' - ';\r\n\r\n // Following vanilla-daterangepicker: ALWAYS use locale.format as-is\r\n // User must configure format to include time if timePicker is enabled\r\n\r\n let newValue = formatDateValue(startDate, format, locale.locale);\r\n\r\n if (!this.singleDatePicker() && endDate) {\r\n newValue += separator + formatDateValue(endDate, format, locale.locale);\r\n }\r\n\r\n this._displayValue.set(newValue);\r\n }\r\n\r\n private updateCurrentValue(): void {\r\n const value: NgxDatexValue = {\r\n startDate: this.currentStartDate,\r\n endDate: this.currentEndDate,\r\n };\r\n console.log(value, 'updateCurrentValue ');\r\n this._currentValue.set(value);\r\n }\r\n\r\n private emitValueChange(): void {\r\n const value: NgxDatexValue = {\r\n startDate: this.currentStartDate,\r\n endDate: this.currentEndDate,\r\n };\r\n\r\n this._currentValue.set(value);\r\n this.onChange(value);\r\n this.dateChange.emit(value);\r\n\r\n if (this.currentEndDate) {\r\n this.rangeChange.emit({\r\n startDate: this.currentStartDate,\r\n endDate: this.currentEndDate,\r\n });\r\n }\r\n }\r\n\r\n private updateView(): void {\r\n if (this.timePicker()) {\r\n this.updateTimePickers();\r\n }\r\n this.updateLeftCalendarMatrix();\r\n this.updateRightCalendarMatrix();\r\n }\r\n\r\n private updateTimePickers(): void {\r\n // Time picker update logic handled by service\r\n }\r\n\r\n private updateTimeFromPicker(\r\n side: 'start' | 'end',\r\n component: 'hour' | 'minute' | 'ampm',\r\n value: string | number,\r\n ): void {\r\n this.timePickerService.updateTimeFromPicker(\r\n this.currentStartDate,\r\n this.currentEndDate,\r\n side,\r\n component,\r\n value,\r\n this._startTime(),\r\n this._endTime(),\r\n this.timePicker24Hour(),\r\n this.singleDatePicker(),\r\n (date) => this.setStartDate(date),\r\n (date) => this.setEndDate(date),\r\n (side, time) => {\r\n if (side === 'start') {\r\n this._startTime.set(time);\r\n } else {\r\n this._endTime.set(time);\r\n }\r\n },\r\n );\r\n this.updateView();\r\n }\r\n\r\n private elementChanged(): void {\r\n const input = this.inputElement?.nativeElement;\r\n if (!input || !input.value || !input.value.length) return;\r\n\r\n const inputValue = input.value;\r\n const separator = this.locale().separator || ' - ';\r\n const dateString = inputValue.split(separator);\r\n let start: Date | null = null;\r\n let end: Date | null = null;\r\n console.log(dateString);\r\n if (dateString.length === 2) {\r\n console.log(this.parseInputDate(dateString[1].trim()));\r\n start = this.parseInputDate(dateString[0].trim());\r\n end = this.parseInputDate(dateString[1].trim());\r\n }\r\n\r\n if (this.singleDatePicker() || start === null || end === null) {\r\n start = this.parseInputDate(inputValue);\r\n end = start;\r\n }\r\n\r\n if (!start || !isValidDate(start) || !end || !isValidDate(end)) {\r\n this._errorMessage.set('Formato de fecha inválido');\r\n return;\r\n }\r\n\r\n this._errorMessage.set('');\r\n\r\n try {\r\n this.setStartDate(start);\r\n this.setEndDate(end);\r\n this.updateView();\r\n\r\n if (!this._isOpen()) {\r\n this.emitValueChange();\r\n }\r\n } catch {\r\n this._errorMessage.set('Fecha fuera del rango permitido');\r\n }\r\n }\r\n\r\n private parseInputDate(dateStr: string): Date | null {\r\n if (!dateStr) return null;\r\n\r\n const locale = this.locale();\r\n console.log(locale);\r\n const format = locale.format || 'DD/MM/YYYY';\r\n\r\n try {\r\n const date = parseDateValue(dateStr, format, locale.locale);\r\n if (isValidDate(date)) {\r\n return date;\r\n }\r\n\r\n const nativeDate = new Date(dateStr);\r\n if (isValidDate(nativeDate)) {\r\n return nativeDate;\r\n }\r\n\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private createOverlay(): void {\r\n this.overlayService.createOverlay(\r\n this.inputElement,\r\n this.calendarTemplate,\r\n this.viewContainerRef,\r\n this.locale(),\r\n this.opens(),\r\n this.drops(),\r\n () => this.closeCalendar(),\r\n (event) => {\r\n if (event.key === 'Escape' && !this._inputFocused()) {\r\n this.closeCalendar();\r\n }\r\n },\r\n (position) => this._overlayPosition.set(position),\r\n );\r\n }\r\n}\r\n","<div class=\"ngx-datex-container\" [class.ngx-datex-mobile]=\"isMobileDevice()\">\r\n <!-- Input Field -->\r\n <mat-form-field\r\n [appearance]=\"appearance()\"\r\n [floatLabel]=\"floatLabel()\"\r\n class=\"ngx-datex-input-field\"\r\n >\r\n @if (label()) {\r\n <mat-label>{{ label() }}</mat-label>\r\n }\r\n\r\n <!-- Checkbox como prefix -->\r\n @if (showCheckbox() && checkboxPosition() === 'prefix') {\r\n <mat-checkbox\r\n matPrefix\r\n [checked]=\"checkboxValue()\"\r\n (change)=\"onCheckboxChange($event.checked)\"\r\n class=\"ngx-datex-checkbox ngx-datex-checkbox-prefix\"\r\n >\r\n </mat-checkbox>\r\n }\r\n\r\n <!-- Ícono como prefix -->\r\n @if (showCalendarIcon() && calendarIconPosition() === 'prefix') {\r\n <mat-icon\r\n matPrefix\r\n class=\"ngx-datex-calendar-icon\"\r\n [class.ngx-datex-icon-active]=\"isOpen()\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle()\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n >\r\n {{ calendarIcon() }}\r\n </mat-icon>\r\n }\r\n\r\n <input\r\n matInput\r\n #inputElement\r\n [value]=\"displayValue()\"\r\n [placeholder]=\"placeholder()\"\r\n [readonly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-describedby]=\"ariaDescribedBy()\"\r\n (click)=\"onInputClick()\"\r\n (focus)=\"onInputFocus()\"\r\n (blur)=\"onInputBlur()\"\r\n (keydown)=\"onInputKeydown($event)\"\r\n (keyup)=\"onInputKeyup()\"\r\n autocomplete=\"off\"\r\n />\r\n\r\n <!-- Ícono como suffix -->\r\n @if (showCalendarIcon() && calendarIconPosition() === 'suffix') {\r\n <mat-icon\r\n matSuffix\r\n class=\"ngx-datex-calendar-icon\"\r\n [class.ngx-datex-icon-active]=\"isOpen()\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle()\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n >\r\n {{ calendarIcon() }}\r\n </mat-icon>\r\n }\r\n\r\n <!-- Checkbox como suffix -->\r\n @if (showCheckbox() && checkboxPosition() === 'suffix') {\r\n <mat-checkbox\r\n matSuffix\r\n [checked]=\"checkboxValue()\"\r\n (change)=\"onCheckboxChange($event.checked)\"\r\n class=\"ngx-datex-checkbox ngx-datex-checkbox-suffix\"\r\n >\r\n </mat-checkbox>\r\n }\r\n\r\n @if (hasError()) {\r\n <mat-error>{{ errorMessage() }}</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- Calendar Template for CDK Overlay -->\r\n <ng-template #calendarTemplate>\r\n <div\r\n class=\"ngx-datex-overlay\"\r\n [class.ngx-datex-overlay-mobile]=\"isMobileDevice()\"\r\n [class.ngx-datex-single]=\"singleDatePicker()\"\r\n [class.ngx-datex-arrow-up]=\"arrowDirection() === 'up'\"\r\n [class.ngx-datex-arrow-down]=\"arrowDirection() === 'down'\"\r\n [class.ngx-datex-arrow-left]=\"arrowDirection() === 'left'\"\r\n [class.ngx-datex-arrow-right]=\"arrowDirection() === 'right'\"\r\n [class.ngx-datex-arrow-align-start]=\"arrowAlignment() === 'start'\"\r\n [class.ngx-datex-arrow-align-center]=\"arrowAlignment() === 'center'\"\r\n [class.ngx-datex-arrow-align-end]=\"arrowAlignment() === 'end'\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"headerTitle()\"\r\n tabindex=\"-1\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"onCalendarKeydown($event)\"\r\n >\r\n <!-- Mobile Header (only shown on mobile) -->\r\n @if (isMobileDevice()) {\r\n <div class=\"ngx-datex-mobile-header\">\r\n <div class=\"ngx-datex-mobile-header-content\">\r\n <div class=\"ngx-datex-mobile-selected-range\">\r\n @if (hasStartDate()) {\r\n {{ formattedSelectedRange() }}\r\n } @else {\r\n Selecciona un rango de fechas\r\n }\r\n </div>\r\n <div class=\"ngx-datex-mobile-range-label\">\r\n @if (currentLabel()) {\r\n {{ currentLabel() }}\r\n }\r\n </div>\r\n </div>\r\n <div class=\"ngx-datex-mobile-header-buttons\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-mobile-cancel-button\"\r\n [ngClass]=\"[buttonClasses(), cancelButtonClasses()]\"\r\n (click)=\"cancel()\"\r\n >\r\n {{ locale().cancelLabel || 'Cancelar' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-mobile-apply-button\"\r\n [ngClass]=\"[buttonClasses(), applyButtonClasses()]\"\r\n [disabled]=\"!canApplyValue()\"\r\n (click)=\"apply()\"\r\n >\r\n {{ locale().applyLabel || 'Aplicar' }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"ngx-datex-content\">\r\n <!-- Predefined Ranges - Desktop: Sidebar, Mobile: Horizontal Chips -->\r\n @if (showRanges()) {\r\n <!-- Desktop Ranges Sidebar -->\r\n @if (!isMobileDevice()) {\r\n <div class=\"ngx-datex-ranges-sidebar\">\r\n @for (rangeEntry of rangeEntries(); track rangeEntry.label) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-range-item\"\r\n [class.ngx-datex-range-active]=\"isRangeActive(rangeEntry.label)\"\r\n (click)=\"selectRange(rangeEntry.label)\"\r\n >\r\n {{ rangeEntry.label }}\r\n </button>\r\n }\r\n <!-- Rango Personalizado -->\r\n @if (showCustomRangeLabel()) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-range-item\"\r\n [class.ngx-datex-range-active]=\"isCustomRange()\"\r\n (click)=\"selectCustomRange()\"\r\n >\r\n {{ locale().customRangeLabel || 'Rango Personalizado' }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Mobile Ranges Chips -->\r\n @if (isMobileDevice()) {\r\n <div class=\"ngx-datex-ranges-chips\">\r\n <div class=\"ngx-datex-ranges-chips-container\">\r\n @for (rangeEntry of rangeEntries(); track rangeEntry.label) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-range-chip\"\r\n [class.ngx-datex-range-chip-active]=\"isRangeActive(rangeEntry.label)\"\r\n (click)=\"selectRange(rangeEntry.label)\"\r\n >\r\n {{ rangeEntry.label }}\r\n </button>\r\n }\r\n <!-- Rango Personalizado -->\r\n @if (showCustomRangeLabel()) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-range-chip\"\r\n [class.ngx-datex-range-chip-active]=\"isCustomRange()\"\r\n (click)=\"selectCustomRange()\"\r\n >\r\n {{ locale().customRangeLabel || 'Personalizado' }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Calendar Section -->\r\n <div class=\"ngx-datex-calendar-section\">\r\n <!-- Calendar Container -->\r\n <div class=\"ngx-datex-calendars\" (mouseleave)=\"onCalendarMouseLeave()\">\r\n <!-- Left Calendar -->\r\n <div\r\n class=\"ngx-datex-calendar ngx-datex-calendar-left\"\r\n [class.ngx-datex-calendar-single]=\"singleDatePicker()\"\r\n >\r\n <div class=\"ngx-datex-calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-nav-button\"\r\n (click)=\"previousMonth('left')\"\r\n [disabled]=\"!canNavigatePrevious('left')\"\r\n aria-label=\"Mes anterior\"\r\n >\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n\r\n <div class=\"ngx-datex-month-year\">\r\n @if (showDropdowns()) {\r\n <select\r\n class=\"ngx-datex-month-select\"\r\n [value]=\"leftCalendarMonthValue()\"\r\n (change)=\"onMonthChange('left', $event)\"\r\n aria-label=\"Seleccionar mes\"\r\n >\r\n @for (month of monthNames(); track $index) {\r\n <option [value]=\"$index\">{{ month }}</option>\r\n }\r\n </select>\r\n\r\n <select\r\n class=\"ngx-datex-year-select\"\r\n [value]=\"leftCalendarYearValue()\"\r\n (change)=\"onYearChange('left', $event)\"\r\n aria-label=\"Seleccionar año\"\r\n >\r\n @for (year of availableYears(); track year) {\r\n <option [value]=\"year\">{{ year }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <span class=\"ngx-datex-month-year-display\">\r\n {{ monthNames()[leftCalendarMonthValue()] }} {{ leftCalendarYearValue() }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-nav-button\"\r\n (click)=\"nextMonth('left')\"\r\n [disabled]=\"!canNavigateNext('left')\"\r\n aria-label=\"Mes siguiente\"\r\n >\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Days of Week Header -->\r\n <div class=\"ngx-datex-days-header\">\r\n <div class=\"ngx-datex-days-header-row\">\r\n @for (day of daysOfWeek(); track day) {\r\n <div class=\"ngx-datex-day-header\">{{ day }}</div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"ngx-datex-calendar-grid\">\r\n @for (week of leftCalendarMatrix(); track $index) {\r\n <div class=\"ngx-datex-week\">\r\n @for (date of week; track date.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-day\"\r\n [class.ngx-datex-day-other-month]=\"isOtherMonth(date, leftCalendarMonth())\"\r\n [class.ngx-datex-day-today]=\"isToday(date)\"\r\n [class.ngx-datex-day-selected]=\"isSelected(date)\"\r\n [class.ngx-datex-day-active]=\"isSelected(date)\"\r\n [class.ngx-datex-day-in-range]=\"isInRange(date)\"\r\n [class.ngx-datex-day-range-start]=\"isRangeStart(date)\"\r\n [class.ngx-datex-day-range-end]=\"isRangeEnd(date)\"\r\n [class.ngx-datex-day-hover-range]=\"\r\n isHovered(date) && !isHoverStart(date) && !isHoverEnd(date)\r\n \"\r\n [class.ngx-datex-day-hover-start]=\"isHoverStart(date)\"\r\n [class.ngx-datex-day-hover-end]=\"isHoverEnd(date)\"\r\n [class.ngx-datex-day-disabled]=\"isDisabled(date)\"\r\n [disabled]=\"isDisabled(date)\"\r\n (click)=\"selectDate(date)\"\r\n (mouseenter)=\"onDateHover(date)\"\r\n [attr.aria-label]=\"formatDateForAria(date)\"\r\n >\r\n {{ date.getDate() }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Time Picker for Left Calendar -->\r\n @if (timePicker()) {\r\n <div class=\"ngx-datex-time-picker\">\r\n <div class=\"ngx-datex-time-controls\">\r\n <select\r\n class=\"ngx-datex-time-select ngx-datex-hour-select\"\r\n [value]=\"selectedStartHour()\"\r\n (change)=\"onStartHourChange($event)\"\r\n aria-label=\"Seleccionar hora\"\r\n >\r\n @if (timePicker24Hour()) {\r\n @for (hourOption of availableStartHours(); track hourOption.value) {\r\n <option\r\n [value]=\"hourOption.value\"\r\n [selected]=\"selectedStartHour() === hourOption.value\"\r\n [disabled]=\"hourOption.disabled\"\r\n >\r\n {{ hourOption.value.toString().padStart(2, '0') }}\r\n </option>\r\n }\r\n } @else {\r\n @for (hourOption of availableStartHours(); track hourOption.value) {\r\n <option\r\n [value]=\"hourOption.value\"\r\n [selected]=\"selectedStartHour() === hourOption.value\"\r\n [disabled]=\"hourOption.disabled\"\r\n >\r\n {{ hourOption.value }}\r\n </option>\r\n }\r\n }\r\n </select>\r\n\r\n <span class=\"ngx-datex-time-separator\">:</span>\r\n\r\n <select\r\n class=\"ngx-datex-time-select ngx-datex-minute-select\"\r\n [value]=\"selectedStartMinute()\"\r\n (change)=\"onStartMinuteChange($event)\"\r\n aria-label=\"Seleccionar minuto\"\r\n >\r\n @for (minuteOption of availableStartMinutes(); track minuteOption.value) {\r\n <option\r\n [value]=\"minuteOption.value\"\r\n [selected]=\"selectedStartMinute() === minuteOption.value\"\r\n [disabled]=\"minuteOption.disabled\"\r\n >\r\n {{ minuteOption.value.toString().padStart(2, '0') }}\r\n </option>\r\n }\r\n </select>\r\n\r\n @if (!timePicker24Hour()) {\r\n <select\r\n class=\"ngx-datex-time-select ngx-datex-ampm-select\"\r\n [value]=\"selectedStartAmPm()\"\r\n (change)=\"onStartAmPmChange($event)\"\r\n aria-label=\"Seleccionar AM/PM\"\r\n >\r\n <option value=\"AM\">AM</option>\r\n <option value=\"PM\">PM</option>\r\n </select>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Right Calendar (for range picker) -->\r\n @if (!singleDatePicker()) {\r\n <div class=\"ngx-datex-calendar ngx-datex-calendar-right\">\r\n <div class=\"ngx-datex-calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-nav-button\"\r\n (click)=\"previousMonth('right')\"\r\n [disabled]=\"!canNavigatePrevious('right')\"\r\n aria-label=\"Mes anterior\"\r\n >\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n\r\n <div class=\"ngx-datex-month-year\">\r\n @if (showDropdowns()) {\r\n <select\r\n class=\"ngx-datex-month-select\"\r\n [value]=\"rightCalendarMonthValue()\"\r\n (change)=\"onMonthChange('right', $event)\"\r\n aria-label=\"Seleccionar mes\"\r\n >\r\n @for (month of monthNames(); track $index) {\r\n <option [value]=\"$index\">{{ month }}</option>\r\n }\r\n </select>\r\n\r\n <select\r\n class=\"ngx-datex-year-select\"\r\n [value]=\"rightCalendarYearValue()\"\r\n (change)=\"onYearChange('right', $event)\"\r\n aria-label=\"Seleccionar año\"\r\n >\r\n @for (year of availableYears(); track year) {\r\n <option [value]=\"year\">{{ year }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <span class=\"ngx-datex-month-year-display\">\r\n {{ monthNames()[rightCalendarMonthValue()] }} {{ rightCalendarYearValue() }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-nav-button\"\r\n (click)=\"nextMonth('right')\"\r\n [disabled]=\"!canNavigateNext('right')\"\r\n aria-label=\"Mes siguiente\"\r\n >\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Days of Week Header -->\r\n <div class=\"ngx-datex-days-header\">\r\n <div class=\"ngx-datex-days-header-row\">\r\n @for (day of daysOfWeek(); track day) {\r\n <div class=\"ngx-datex-day-header\">{{ day }}</div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"ngx-datex-calendar-grid\">\r\n @for (week of rightCalendarMatrix(); track $index) {\r\n <div class=\"ngx-datex-week\">\r\n @for (date of week; track date.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-day\"\r\n [class.ngx-datex-day-other-month]=\"\r\n isOtherMonth(date, rightCalendarMonth())\r\n \"\r\n [class.ngx-datex-day-today]=\"isToday(date)\"\r\n [class.ngx-datex-day-selected]=\"isSelected(date)\"\r\n [class.ngx-datex-day-active]=\"isSelected(date)\"\r\n [class.ngx-datex-day-in-range]=\"isInRange(date)\"\r\n [class.ngx-datex-day-range-start]=\"isRangeStart(date)\"\r\n [class.ngx-datex-day-range-end]=\"isRangeEnd(date)\"\r\n [class.ngx-datex-day-hover-range]=\"\r\n isHovered(date) && !isHoverStart(date) && !isHoverEnd(date)\r\n \"\r\n [class.ngx-datex-day-hover-start]=\"isHoverStart(date)\"\r\n [class.ngx-datex-day-hover-end]=\"isHoverEnd(date)\"\r\n [class.ngx-datex-day-disabled]=\"isDisabled(date)\"\r\n [disabled]=\"isDisabled(date)\"\r\n (click)=\"selectDate(date)\"\r\n (mouseenter)=\"onDateHover(date)\"\r\n [attr.aria-label]=\"formatDateForAria(date)\"\r\n >\r\n {{ date.getDate() }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Time Picker for Right Calendar -->\r\n @if (timePicker() && !singleDatePicker()) {\r\n <div class=\"ngx-datex-time-picker\">\r\n <div class=\"ngx-datex-time-controls\">\r\n <select\r\n class=\"ngx-datex-time-select ngx-datex-hour-select\"\r\n [value]=\"selectedEndHour()\"\r\n [disabled]=\"!hasEndDate()\"\r\n (change)=\"onEndHourChange($event)\"\r\n aria-label=\"Seleccionar hora\"\r\n >\r\n @if (timePicker24Hour()) {\r\n @for (hourOption of availableEndHours(); track hourOption.value) {\r\n <option\r\n [value]=\"hourOption.value\"\r\n [selected]=\"selectedEndHour() === hourOption.value\"\r\n [disabled]=\"hourOption.disabled\"\r\n >\r\n {{ hourOption.value.toString().padStart(2, '0') }}\r\n </option>\r\n }\r\n } @else {\r\n @for (hourOption of availableEndHours(); track hourOption.value) {\r\n <option\r\n [value]=\"hourOption.value\"\r\n [selected]=\"selectedEndHour() === hourOption.value\"\r\n [disabled]=\"hourOption.disabled\"\r\n >\r\n {{ hourOption.value }}\r\n </option>\r\n }\r\n }\r\n </select>\r\n\r\n <span class=\"ngx-datex-time-separator\">:</span>\r\n\r\n <select\r\n class=\"ngx-datex-time-select ngx-datex-minute-select\"\r\n [value]=\"selectedEndMinute()\"\r\n [disabled]=\"!hasEndDate()\"\r\n (change)=\"onEndMinuteChange($event)\"\r\n aria-label=\"Seleccionar minuto\"\r\n >\r\n @for (minuteOption of availableEndMinutes(); track minuteOption.value) {\r\n <option\r\n [value]=\"minuteOption.value\"\r\n [selected]=\"selectedEndMinute() === minuteOption.value\"\r\n [disabled]=\"minuteOption.disabled\"\r\n >\r\n {{ minuteOption.value.toString().padStart(2, '0') }}\r\n </option>\r\n }\r\n </select>\r\n\r\n @if (!timePicker24Hour()) {\r\n <select\r\n class=\"ngx-datex-time-select ngx-datex-ampm-select\"\r\n [value]=\"selectedEndAmPm()\"\r\n [disabled]=\"!hasEndDate()\"\r\n (change)=\"onEndAmPmChange($event)\"\r\n aria-label=\"Seleccionar AM/PM\"\r\n >\r\n <option value=\"AM\">AM</option>\r\n <option value=\"PM\">PM</option>\r\n </select>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Footer with selected range and buttons (desktop only) -->\r\n @if (!isMobileDevice()) {\r\n <div class=\"ngx-datex-footer\">\r\n <div class=\"ngx-datex-selected-range\">\r\n @if (hasStartDate()) {\r\n {{ formattedSelectedRange() }}\r\n } @else {\r\n Selecciona un rango de fechas\r\n }\r\n </div>\r\n <div class=\"ngx-datex-footer-buttons\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-cancel-button\"\r\n [ngClass]=\"[buttonClasses(), cancelButtonClasses()]\"\r\n (click)=\"cancel()\"\r\n >\r\n {{ locale().cancelLabel || 'Cancelar' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"ngx-datex-apply-button\"\r\n [ngClass]=\"[buttonClasses(), applyButtonClasses()]\"\r\n [disabled]=\"!canApplyValue()\"\r\n (click)=\"apply()\"\r\n >\r\n {{ locale().applyLabel || 'Aplicar' }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</div>\r\n","/*\r\n * Public API Surface of ngx-datex\r\n */\r\n\r\n// Main component\r\nexport * from './lib/ngx-datex.component';\r\nexport * from './lib/types/ngx-datex.types';\r\nexport * from './lib/constants/defaults';\r\nexport * from './lib/services/ngx-datex.service';\r\nexport * from './lib/services/overlay.service';\r\nexport * from './lib/services/time-picker.service';\r\nexport * from './lib/services/calendar.service';\r\nexport * from './lib/utils/date.utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["formatDate","parseDate"],"mappings":"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"}
|