@mngh/jalali-datepicker 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +665 -8
  2. package/dist/a11y/aria-helpers.d.ts +7 -0
  3. package/dist/a11y/aria-helpers.d.ts.map +1 -0
  4. package/dist/a11y/keyboard-navigation.d.ts +3 -0
  5. package/dist/a11y/keyboard-navigation.d.ts.map +1 -0
  6. package/dist/a11y/types.d.ts +20 -0
  7. package/dist/a11y/types.d.ts.map +1 -0
  8. package/dist/a11y/useCalendarKeyboard.d.ts +9 -0
  9. package/dist/a11y/useCalendarKeyboard.d.ts.map +1 -0
  10. package/dist/components/DayCell.d.ts +32 -0
  11. package/dist/components/DayCell.d.ts.map +1 -0
  12. package/dist/components/Header.d.ts +11 -0
  13. package/dist/components/Header.d.ts.map +1 -0
  14. package/dist/components/JalaliDatePicker.d.ts +52 -0
  15. package/dist/components/JalaliDatePicker.d.ts.map +1 -0
  16. package/dist/components/MonthYearPicker.d.ts +9 -0
  17. package/dist/components/MonthYearPicker.d.ts.map +1 -0
  18. package/dist/components/Weekdays.d.ts +10 -0
  19. package/dist/components/Weekdays.d.ts.map +1 -0
  20. package/dist/components/dual-calendar/DualMonthCalendar.d.ts +4 -0
  21. package/dist/components/dual-calendar/DualMonthCalendar.d.ts.map +1 -0
  22. package/dist/components/dual-calendar/index.d.ts +3 -0
  23. package/dist/components/dual-calendar/index.d.ts.map +1 -0
  24. package/dist/components/dual-calendar/types.d.ts +29 -0
  25. package/dist/components/dual-calendar/types.d.ts.map +1 -0
  26. package/dist/components/footer/CalendarFooter.d.ts +16 -0
  27. package/dist/components/footer/CalendarFooter.d.ts.map +1 -0
  28. package/dist/components/footer/types.d.ts +28 -0
  29. package/dist/components/footer/types.d.ts.map +1 -0
  30. package/dist/components/masked-input/MaskedDateInput.d.ts +4 -0
  31. package/dist/components/masked-input/MaskedDateInput.d.ts.map +1 -0
  32. package/dist/components/masked-input/index.d.ts +4 -0
  33. package/dist/components/masked-input/index.d.ts.map +1 -0
  34. package/dist/components/masked-input/mask-utils.d.ts +11 -0
  35. package/dist/components/masked-input/mask-utils.d.ts.map +1 -0
  36. package/dist/components/masked-input/types.d.ts +37 -0
  37. package/dist/components/masked-input/types.d.ts.map +1 -0
  38. package/dist/core/calendar-grid.d.ts +10 -0
  39. package/dist/core/calendar-grid.d.ts.map +1 -0
  40. package/dist/core/constants.d.ts +14 -0
  41. package/dist/core/constants.d.ts.map +1 -0
  42. package/dist/core/jalali-helpers.d.ts +35 -0
  43. package/dist/core/jalali-helpers.d.ts.map +1 -0
  44. package/dist/core/jalali-math.d.ts +27 -0
  45. package/dist/core/jalali-math.d.ts.map +1 -0
  46. package/dist/core/types.d.ts +62 -0
  47. package/dist/core/types.d.ts.map +1 -0
  48. package/dist/events/event-utils.d.ts +7 -0
  49. package/dist/events/event-utils.d.ts.map +1 -0
  50. package/dist/events/index.d.ts +3 -0
  51. package/dist/events/index.d.ts.map +1 -0
  52. package/dist/events/types.d.ts +17 -0
  53. package/dist/events/types.d.ts.map +1 -0
  54. package/dist/formatters/jalali-formatter.d.ts +18 -0
  55. package/dist/formatters/jalali-formatter.d.ts.map +1 -0
  56. package/dist/formatters/persian-digits.d.ts +9 -0
  57. package/dist/formatters/persian-digits.d.ts.map +1 -0
  58. package/dist/holidays/index.d.ts +3 -0
  59. package/dist/holidays/index.d.ts.map +1 -0
  60. package/dist/holidays/iran-holidays.d.ts +11 -0
  61. package/dist/holidays/iran-holidays.d.ts.map +1 -0
  62. package/dist/holidays/types.d.ts +21 -0
  63. package/dist/holidays/types.d.ts.map +1 -0
  64. package/dist/hooks/types.d.ts +53 -0
  65. package/dist/hooks/types.d.ts.map +1 -0
  66. package/dist/hooks/useJalaliDatePicker.d.ts +17 -0
  67. package/dist/hooks/useJalaliDatePicker.d.ts.map +1 -0
  68. package/dist/index.cjs +1 -1
  69. package/dist/index.cjs.map +1 -1
  70. package/dist/index.d.ts +27 -1
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.mjs +922 -1156
  73. package/dist/index.mjs.map +1 -1
  74. package/dist/plugins/time-picker/TimePicker.d.ts +21 -0
  75. package/dist/plugins/time-picker/TimePicker.d.ts.map +1 -0
  76. package/dist/plugins/time-picker/index.d.ts +4 -0
  77. package/dist/plugins/time-picker/index.d.ts.map +1 -0
  78. package/dist/plugins/time-picker/time-utils.d.ts +18 -0
  79. package/dist/plugins/time-picker/time-utils.d.ts.map +1 -0
  80. package/dist/plugins/time-picker/types.d.ts +36 -0
  81. package/dist/plugins/time-picker/types.d.ts.map +1 -0
  82. package/dist/theme/ThemeProvider.d.ts +15 -0
  83. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  84. package/dist/theme/style-slots.d.ts +46 -0
  85. package/dist/theme/style-slots.d.ts.map +1 -0
  86. package/dist/theme/tokens.d.ts +8 -0
  87. package/dist/theme/tokens.d.ts.map +1 -0
  88. package/dist/theme/types.d.ts +62 -0
  89. package/dist/theme/types.d.ts.map +1 -0
  90. package/package.json +39 -6
  91. package/dist/favicon.svg +0 -1
  92. package/dist/icons.svg +0 -24
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/constants.ts","../src/core/jalali-math.ts","../src/core/calendar-grid.ts","../src/core/jalali-helpers.ts","../src/hooks/useJalaliDatePicker.ts","../src/a11y/keyboard-navigation.ts","../src/a11y/aria-helpers.ts","../src/a11y/useCalendarKeyboard.ts","../src/formatters/persian-digits.ts","../src/formatters/jalali-formatter.ts","../src/theme/tokens.ts","../src/theme/ThemeProvider.tsx","../src/components/Header.tsx","../src/components/Weekdays.tsx","../src/components/DayCell.tsx","../src/components/MonthYearPicker.tsx","../src/plugins/time-picker/time-utils.ts","../src/components/footer/CalendarFooter.tsx","../src/plugins/time-picker/TimePicker.tsx","../src/plugins/presets/default-presets.ts","../src/plugins/presets/PresetsBar.tsx","../src/components/masked-input/mask-utils.ts","../src/components/masked-input/MaskedDateInput.tsx","../src/events/event-utils.ts","../src/holidays/iran-holidays.ts","../src/components/JalaliDatePicker.tsx","../src/components/dual-calendar/DualMonthCalendar.tsx"],"sourcesContent":["/**\n * Persian (Farsi) month names.\n */\nexport const PERSIAN_MONTH_NAMES = [\n \"فروردین\",\n \"اردیبهشت\",\n \"خرداد\",\n \"تیر\",\n \"مرداد\",\n \"شهریور\",\n \"مهر\",\n \"آبان\",\n \"آذر\",\n \"دی\",\n \"بهمن\",\n \"اسفند\",\n] as const;\n\n/**\n * Phonetic English month names for Jalali calendar.\n */\nexport const JALALI_MONTH_NAMES_EN = [\n \"Farvardin\",\n \"Ordibehesht\",\n \"Khordad\",\n \"Tir\",\n \"Mordad\",\n \"Shahrivar\",\n \"Mehr\",\n \"Aban\",\n \"Azar\",\n \"Dey\",\n \"Bahman\",\n \"Esfand\",\n] as const;\n\n/**\n * Persian weekday headers starting from Saturday (شنبه).\n */\nexport const PERSIAN_WEEK_DAYS_SHORT = [\n \"ش\",\n \"ی\",\n \"د\",\n \"س\",\n \"چ\",\n \"پ\",\n \"ج\",\n] as const;\nexport const PERSIAN_WEEK_DAYS_LONG = [\n \"شنبه\",\n \"یکشنبه\",\n \"دوشنبه\",\n \"سه‌شنبه\",\n \"چهارشنبه\",\n \"پنج‌شنبه\",\n \"جمعه\",\n] as const;\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\n\n/**\n * Determines if a Jalali year is a leap year (کبیسه).\n * Uses the Birashk 2820-year cycle algorithm.\n */\nexport function isJalaliLeapYear(year: number): boolean {\n const breaks = [\n -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097,\n 2192, 2262, 2324, 2394, 2456, 3178,\n ];\n\n let jp = breaks[0];\n let jump = 0;\n\n if (year < jp || year >= breaks[breaks.length - 1]) {\n throw new Error(`Jalali year ${year} is outside supported range.`);\n }\n\n for (let i = 1; i < breaks.length; i++) {\n const jm = breaks[i];\n jump = jm - jp;\n if (year < jm) break;\n jp = jm;\n }\n\n let n = year - jp;\n if (jump - n < 6) n = n - jump + ((jump + 4) / 33) * 33;\n let leap = ((n + 1) % 33) - 1;\n if (leap === -1) leap = 4;\n\n return leap % 4 === 0;\n}\n\n/**\n * Returns the number of days in a specific Jalali month.\n */\nexport function getDaysInJalaliMonth(\n year: number,\n month: JalaliMonthIndex,\n): number {\n if (month < 0 || month > 11) {\n throw new RangeError(\n \"Month index must be between 0 (Farvardin) and 11 (Esfand).\",\n );\n }\n // Months 0 to 5 (Farvardin - Shahrivar) have 31 days\n if (month <= 5) return 31;\n // Months 6 to 10 (Mehr - Bahman) have 30 days\n if (month <= 10) return 30;\n // Month 11 (Esfand) has 30 in leap years, 29 in regular years\n return isJalaliLeapYear(year) ? 30 : 29;\n}\n\n/**\n * Converts a Gregorian date (Year, Month, Day) to Jalali date.\n */\nexport function gregorianToJalali(\n gy: number,\n gm: number,\n gd: number,\n): JalaliDate {\n const g_d_m = [\n 0,\n 31,\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n let jy: number;\n let jm: number;\n let jd: number;\n\n let gy2 = gm > 2 ? gy + 1 : gy;\n let days =\n 355666 +\n 365 * gy +\n Math.floor((gy2 + 3) / 4) -\n Math.floor((gy2 + 99) / 100) +\n Math.floor((gy2 + 399) / 400) +\n gd;\n\n for (let i = 0; i < gm; ++i) days += g_d_m[i];\n\n jy = -1595 + 33 * Math.floor(days / 12053);\n days %= 12053;\n\n jy += 4 * Math.floor(days / 1461);\n days %= 1461;\n\n if (days > 365) {\n jy += Math.floor((days - 1) / 365);\n days = (days - 1) % 365;\n }\n\n if (days < 186) {\n jm = Math.floor(days / 31);\n jd = 1 + (days % 31);\n } else {\n jm = 6 + Math.floor((days - 186) / 30);\n jd = 1 + ((days - 186) % 30);\n }\n\n return { year: jy, month: jm as JalaliMonthIndex, day: jd };\n}\n\n/**\n * Converts a Jalali date to a Gregorian Date.\n */\nexport function jalaliToGregorian(\n jy: number,\n jm: JalaliMonthIndex,\n jd: number,\n): Date {\n let gy: number;\n let gm: number;\n let gd: number;\n\n let jy2 = jy + 1595;\n let days =\n -355668 +\n 365 * jy2 +\n Math.floor(jy2 / 33) * 8 +\n Math.floor(((jy2 % 33) + 3) / 4) +\n jd +\n (jm < 6 ? jm * 31 : (jm - 6) * 30 + 186);\n\n gy = 400 * Math.floor(days / 146097);\n days %= 146097;\n\n if (days > 36524) {\n gy += 100 * Math.floor(--days / 36524);\n days %= 36524;\n if (days >= 365) days++;\n }\n\n gy += 4 * Math.floor(days / 1461);\n days %= 1461;\n\n if (days > 365) {\n gy += Math.floor((days - 1) / 365);\n days = (days - 1) % 365;\n }\n\n gd = days + 1;\n const sal_a = [\n 0,\n 31,\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n\n for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) {\n gd -= sal_a[gm];\n }\n\n const result = new Date(gy, gm - 1, gd);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\n/**\n * Returns today's date in Jalali format.\n */\nexport function getTodayJalali(): JalaliDate {\n const now = new Date();\n return gregorianToJalali(\n now.getFullYear(),\n now.getMonth() + 1,\n now.getDate(),\n );\n}\n\n/**\n * Checks if two Jalali dates are identical.\n */\nexport function isSameJalaliDay(\n a?: JalaliDate | null,\n b?: JalaliDate | null,\n): boolean {\n if (!a || !b) return false;\n return a.year === b.year && a.month === b.month && a.day === b.day;\n}\n","import type {\n JalaliCalendarCell,\n JalaliGridOptions,\n JalaliDate,\n JalaliMonthIndex,\n} from \"./types\";\nimport {\n jalaliToGregorian,\n gregorianToJalali,\n getDaysInJalaliMonth,\n getTodayJalali,\n isSameJalaliDay,\n} from \"./jalali-math\";\n\n/**\n * Normalizes input date (Date or JalaliDate) into JalaliDate object.\n */\nexport function toJalaliDate(input: Date | JalaliDate): JalaliDate {\n if (input instanceof Date) {\n return gregorianToJalali(\n input.getFullYear(),\n input.getMonth() + 1,\n input.getDate(),\n );\n }\n return input;\n}\n\n/**\n * Generates a 42-cell (6 rows x 7 columns) matrix for a given Jalali month.\n */\nexport function generateJalaliCalendarGrid(\n options: JalaliGridOptions,\n): JalaliCalendarCell[] {\n const {\n year,\n month,\n firstDayOfWeek = 0, // 0 = Saturday (شنبه)\n selectedDate,\n minDate,\n maxDate,\n isDateDisabled,\n } = options;\n\n const cells: JalaliCalendarCell[] = [];\n const todayJalali = getTodayJalali();\n const activeSelected = selectedDate ? toJalaliDate(selectedDate) : null;\n const minJalali = minDate ? toJalaliDate(minDate) : null;\n const maxJalali = maxDate ? toJalaliDate(maxDate) : null;\n\n // Convert Jalali 1st of month to Gregorian to read weekday\n const firstDayGregorian = jalaliToGregorian(year, month, 1);\n\n // JS getDay(): 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat\n // Map standard JS getDay() to Jalali index: 6(Sat)->0, 0(Sun)->1, ..., 5(Fri)->6\n const jsDay = firstDayGregorian.getDay();\n const rawJalaliWeekDay = (jsDay + 1) % 7;\n\n const leadingPaddingCount = (rawJalaliWeekDay - firstDayOfWeek + 7) % 7;\n\n // 1. Previous month trailing days\n const prevMonth = (month === 0 ? 11 : month - 1) as JalaliMonthIndex;\n const prevYear = month === 0 ? year - 1 : year;\n const daysInPrevMonth = getDaysInJalaliMonth(prevYear, prevMonth);\n\n for (let i = leadingPaddingCount - 1; i >= 0; i--) {\n const day = daysInPrevMonth - i;\n const jDate: JalaliDate = { year: prevYear, month: prevMonth, day };\n cells.push(buildCell(jDate, false));\n }\n\n // 2. Current month days\n const totalDays = getDaysInJalaliMonth(year, month);\n for (let d = 1; d <= totalDays; d++) {\n const jDate: JalaliDate = { year, month, day: d };\n cells.push(buildCell(jDate, true));\n }\n\n // 3. Next month leading days (completing 42 cells)\n const nextMonth = (month === 11 ? 0 : month + 1) as JalaliMonthIndex;\n const nextYear = month === 11 ? year + 1 : year;\n const trailingPaddingCount = 42 - cells.length;\n\n for (let d = 1; d <= trailingPaddingCount; d++) {\n const jDate: JalaliDate = { year: nextYear, month: nextMonth, day: d };\n cells.push(buildCell(jDate, false));\n }\n\n function buildCell(\n jDate: JalaliDate,\n isCurrentMonth: boolean,\n ): JalaliCalendarCell {\n const gregDate = jalaliToGregorian(jDate.year, jDate.month, jDate.day);\n const isToday = isSameJalaliDay(jDate, todayJalali);\n const isSelected = activeSelected\n ? isSameJalaliDay(jDate, activeSelected)\n : false;\n\n let isDisabled = false;\n if (minJalali) {\n const minG = jalaliToGregorian(\n minJalali.year,\n minJalali.month,\n minJalali.day,\n );\n if (gregDate.getTime() < minG.getTime()) isDisabled = true;\n }\n if (maxJalali) {\n const maxG = jalaliToGregorian(\n maxJalali.year,\n maxJalali.month,\n maxJalali.day,\n );\n if (gregDate.getTime() > maxG.getTime()) isDisabled = true;\n }\n if (isDateDisabled && isDateDisabled(jDate, gregDate)) {\n isDisabled = true;\n }\n\n return {\n jalali: jDate,\n gregorianDate: gregDate,\n dayNumber: jDate.day,\n isCurrentMonth,\n isToday,\n isSelected,\n isDisabled,\n };\n }\n\n return cells;\n}\n","import type { JalaliDate, JalaliDayOfWeek, JalaliMonthIndex } from \"./types\";\nimport {\n jalaliToGregorian,\n gregorianToJalali,\n getDaysInJalaliMonth,\n} from \"./jalali-math\";\n\n/**\n * Calculates day of week in Jalali calendar (0 = شنبه, ..., 6 = جمعه).\n */\nexport function getJalaliDayOfWeek(\n year: number,\n month: number,\n day: number,\n): JalaliDayOfWeek {\n const g = jalaliToGregorian(year, month as JalaliMonthIndex, day);\n const jsDay = g.getDay(); // 0 = Sunday, 6 = Saturday\n return ((jsDay + 1) % 7) as JalaliDayOfWeek;\n}\n\n/**\n * Adds or subtracts days to/from a Jalali date across month/year boundaries.\n */\nexport function addDaysToJalali(date: JalaliDate, days: number): JalaliDate {\n const g = jalaliToGregorian(date.year, date.month, date.day);\n g.setDate(g.getDate() + days);\n // تبدیل getMonth() از 0-indexed به 1-indexed برای gregorianToJalali\n return gregorianToJalali(g.getFullYear(), g.getMonth() + 1, g.getDate());\n}\n\n/**\n * Alias for addDaysToJalali\n */\nexport const addJalaliDays = addDaysToJalali;\n\n/**\n * Compares two Jalali dates:\n * - Returns -1 if d1 < d2\n * - Returns 1 if d1 > d2\n * - Returns 0 if d1 == d2\n */\nexport function compareJalaliDates(d1: JalaliDate, d2: JalaliDate): number {\n if (d1.year !== d2.year) return d1.year < d2.year ? -1 : 1;\n if (d1.month !== d2.month) return d1.month < d2.month ? -1 : 1;\n if (d1.day !== d2.day) return d1.day < d2.day ? -1 : 1;\n return 0;\n}\n\n/**\n * Checks if a target date falls strictly or inclusively between two dates.\n */\nexport function isJalaliDateBetween(\n target: JalaliDate,\n start: JalaliDate,\n end: JalaliDate,\n inclusive = true,\n): boolean {\n const minDate = compareJalaliDates(start, end) <= 0 ? start : end;\n const maxDate = compareJalaliDates(start, end) <= 0 ? end : start;\n\n const cmpMin = compareJalaliDates(target, minDate);\n const cmpMax = compareJalaliDates(target, maxDate);\n\n if (inclusive) {\n return cmpMin >= 0 && cmpMax <= 0;\n }\n return cmpMin > 0 && cmpMax < 0;\n}\n\n/**\n * Calculates the full Jalali week range starting Saturday and ending Friday.\n */\nexport function getJalaliWeekRange(date: JalaliDate): [JalaliDate, JalaliDate] {\n const dayOfWeek = getJalaliDayOfWeek(date.year, date.month, date.day);\n const startOfWeek = addDaysToJalali(date, -dayOfWeek); // شنبه\n const endOfWeek = addDaysToJalali(startOfWeek, 6); // جمعه\n return [startOfWeek, endOfWeek];\n}\n\n/**\n * Calculates full month range from day 1 to last day of that month.\n */\nexport function getJalaliMonthRange(\n date: JalaliDate,\n): [JalaliDate, JalaliDate] {\n const daysInMonth = getDaysInJalaliMonth(date.year, date.month);\n const start: JalaliDate = { year: date.year, month: date.month, day: 1 };\n const end: JalaliDate = {\n year: date.year,\n month: date.month,\n day: daysInMonth,\n };\n return [start, end];\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport type {\n JalaliDate,\n JalaliMonthIndex,\n JalaliCalendarCell,\n} from \"../core/types\";\nimport type {\n UseJalaliDatePickerOptions,\n UseJalaliDatePickerReturn,\n SelectionMode,\n DatePickerValue,\n JalaliDateRange,\n} from \"./types\";\nimport { getTodayJalali, isSameJalaliDay } from \"../core/jalali-math\";\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\nimport {\n compareJalaliDates,\n isJalaliDateBetween,\n} from \"../core/jalali-helpers\";\n\nexport function useJalaliDatePicker<M extends SelectionMode = \"single\">(\n options: UseJalaliDatePickerOptions<M> = {},\n): UseJalaliDatePickerReturn<M> {\n const {\n mode = \"single\" as M,\n value: controlledValue,\n defaultValue,\n onChange,\n initialViewDate,\n firstDayOfWeek = 0,\n minDate,\n maxDate,\n isDateDisabled,\n } = options;\n\n // 1. Selection State (Controlled vs Uncontrolled)\n const [internalValue, setInternalValue] = useState<DatePickerValue<M>>(() => {\n if (defaultValue !== undefined) return defaultValue;\n if (mode === \"single\") return null as DatePickerValue<M>;\n if (mode === \"range\") return [null, null] as DatePickerValue<M>;\n return [] as unknown as DatePickerValue<M>;\n });\n\n const selected = (\n controlledValue !== undefined ? controlledValue : internalValue\n ) as DatePickerValue<M>;\n\n // 2. Range Hover State (for dynamic preview)\n const [hoverDate, setHoverDate] = useState<JalaliDate | null>(null);\n\n // 3. Active View (Month & Year)\n const today = useMemo(() => getTodayJalali(), []);\n const [viewState, setViewState] = useState<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (initialViewDate) return initialViewDate;\n if (mode === \"single\" && selected)\n return {\n year: (selected as JalaliDate).year,\n month: (selected as JalaliDate).month,\n };\n if (mode === \"range\" && (selected as JalaliDateRange)?.[0]) {\n const start = (selected as JalaliDateRange)[0]!;\n return { year: start.year, month: start.month };\n }\n return { year: today.year, month: today.month };\n });\n\n // 4. View Navigation\n const goToNextMonth = useCallback(() => {\n setViewState((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: (prev.month + 1) as JalaliMonthIndex };\n });\n }, []);\n\n const goToPrevMonth = useCallback(() => {\n setViewState((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: (prev.month - 1) as JalaliMonthIndex };\n });\n }, []);\n\n const setView = useCallback((year: number, month: JalaliMonthIndex) => {\n setViewState({ year, month });\n }, []);\n\n const goToToday = useCallback(() => {\n setViewState({ year: today.year, month: today.month });\n }, [today]);\n\n // 5. Selection Checks\n const isDateSelected = useCallback(\n (target: JalaliDate): boolean => {\n if (mode === \"single\") {\n return isSameJalaliDay(selected as JalaliDate | null, target);\n }\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n return isSameJalaliDay(start, target) || isSameJalaliDay(end, target);\n }\n if (mode === \"multiple\") {\n const list = (selected as JalaliDate[]) || [];\n return list.some((d) => isSameJalaliDay(d, target));\n }\n return false;\n },\n [mode, selected],\n );\n\n // 6. Selection Handler\n const updateSelection = useCallback(\n (newValue: DatePickerValue<M>) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n },\n [controlledValue, onChange],\n );\n\n const selectDate = useCallback(\n (target: JalaliDate) => {\n if (mode === \"single\") {\n updateSelection(target as DatePickerValue<M>);\n } else if (mode === \"multiple\") {\n const currentList = (selected as JalaliDate[]) || [];\n const exists = currentList.some((d) => isSameJalaliDay(d, target));\n const updated = exists\n ? currentList.filter((d) => !isSameJalaliDay(d, target))\n : [...currentList, target].sort(compareJalaliDates);\n updateSelection(updated as unknown as DatePickerValue<M>);\n } else if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n\n // Step 1: Start fresh range\n if (!start || (start && end)) {\n updateSelection([target, null] as unknown as DatePickerValue<M>);\n }\n // Step 2: Complete existing range\n else {\n if (compareJalaliDates(target, start) < 0) {\n // Target is earlier than start: make target the start date\n updateSelection([target, start] as unknown as DatePickerValue<M>);\n } else {\n updateSelection([start, target] as unknown as DatePickerValue<M>);\n }\n setHoverDate(null);\n }\n }\n },\n [mode, selected, updateSelection],\n );\n\n const clear = useCallback(() => {\n if (mode === \"single\") updateSelection(null as DatePickerValue<M>);\n else if (mode === \"range\")\n updateSelection([null, null] as unknown as DatePickerValue<M>);\n else updateSelection([] as unknown as DatePickerValue<M>);\n }, [mode, updateSelection]);\n\n // 7. Month Grid Construction with Range & Multiple Metadata\n const rawGrid = useMemo(() => {\n return generateJalaliCalendarGrid({\n year: viewState.year,\n month: viewState.month,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n });\n }, [\n viewState.year,\n viewState.month,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n ]);\n\n // Enrich cells with active selection/range flags\n const grid = useMemo((): JalaliCalendarCell[] => {\n const rangeStart =\n mode === \"range\" ? (selected as JalaliDateRange)?.[0] : null;\n const rangeEnd =\n mode === \"range\" ? (selected as JalaliDateRange)?.[1] : null;\n const effectiveEnd =\n rangeEnd ?? (rangeStart && hoverDate ? hoverDate : null);\n\n return rawGrid.map((cell) => {\n const isSelected = isDateSelected(cell.jalali);\n let isInRange = false;\n let isRangeStart = false;\n let isRangeEnd = false;\n\n if (mode === \"range\" && rangeStart) {\n isRangeStart = isSameJalaliDay(cell.jalali, rangeStart);\n isRangeEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n\n if (effectiveEnd) {\n isInRange = isJalaliDateBetween(\n cell.jalali,\n rangeStart,\n effectiveEnd,\n );\n }\n }\n\n return {\n ...cell,\n isSelected,\n isInRange,\n isRangeStart,\n isRangeEnd,\n };\n });\n }, [rawGrid, mode, selected, hoverDate, isDateSelected]);\n\n return {\n selected,\n viewYear: viewState.year,\n viewMonth: viewState.month,\n grid,\n goToPrevMonth,\n goToNextMonth,\n setView,\n goToToday,\n selectDate,\n setHoverDate,\n clear,\n isDateSelected,\n hoverDate,\n };\n}\n","import type { JalaliMonthIndex } from \"../core/types\";\nimport { getDaysInJalaliMonth } from \"../core/jalali-math\";\nimport type { NavigateOptions, NavigationResult } from \"./types\";\n\nexport function calculateNextFocusedDate(\n options: NavigateOptions,\n): NavigationResult {\n const { currentFocused, key, isRtl = true } = options;\n let { year, month, day } = currentFocused;\n let viewChanged = false;\n let handled = true;\n\n // Handle RTL vs LTR arrow directions\n const stepLeft = isRtl ? 1 : -1;\n const stepRight = isRtl ? -1 : 1;\n\n switch (key) {\n case \"ArrowRight\":\n day += stepRight;\n break;\n\n case \"ArrowLeft\":\n day += stepLeft;\n break;\n\n case \"ArrowUp\":\n day -= 7;\n break;\n\n case \"ArrowDown\":\n day += 7;\n break;\n\n case \"Home\":\n day = 1;\n break;\n\n case \"End\":\n day = getDaysInJalaliMonth(year, month);\n break;\n\n case \"PageUp\":\n // Previous Month\n if (month === 0) {\n year -= 1;\n month = 11;\n } else {\n month = (month - 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n break;\n\n case \"PageDown\":\n // Next Month\n if (month === 11) {\n year += 1;\n month = 0;\n } else {\n month = (month + 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n break;\n\n default:\n handled = false;\n return { nextDate: currentFocused, viewChanged: false, handled: false };\n }\n\n // Normalize days falling outside current month boundary\n while (day < 1) {\n if (month === 0) {\n year -= 1;\n month = 11;\n } else {\n month = (month - 1) as JalaliMonthIndex;\n }\n day += getDaysInJalaliMonth(year, month);\n viewChanged = true;\n }\n\n while (day > getDaysInJalaliMonth(year, month)) {\n day -= getDaysInJalaliMonth(year, month);\n if (month === 11) {\n year += 1;\n month = 0;\n } else {\n month = (month + 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n }\n\n return {\n nextDate: { year, month, day },\n viewChanged,\n handled,\n };\n}\n","import type { JalaliDate } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\n\n/**\n * Creates an accessible full Persian string for screen readers.\n * Example: \"شنبه، ۱ فروردین ۱۴۰۵\"\n */\nexport function getAriaDayLabel(date: JalaliDate): string {\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\n const jsDay = gregorian.getDay();\n const jalaliDayOfWeek = (jsDay + 1) % 7; // 0 = Sat, 1 = Sun, ...\n\n const weekDayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\n const monthName = PERSIAN_MONTH_NAMES[date.month];\n\n return `${weekDayName}، ${date.day} ${monthName} ${date.year}`;\n}\n","import { useState, useCallback } from \"react\";\nimport type { JalaliDate } from \"../core/types\";\nimport { calculateNextFocusedDate } from \"./keyboard-navigation\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { UseCalendarKeyboardProps } from \"./types\";\n\nexport function useCalendarKeyboard(props: UseCalendarKeyboardProps) {\n const {\n viewYear,\n viewMonth,\n selectedDate,\n onSelectDate,\n onViewChange,\n isRtl = true,\n } = props;\n\n const [focusedDate, setFocusedDate] = useState<JalaliDate>(() => {\n return selectedDate ?? { year: viewYear, month: viewMonth, day: 1 };\n });\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelectDate(focusedDate);\n return;\n }\n\n const result = calculateNextFocusedDate({\n currentFocused: focusedDate,\n key: e.key,\n isRtl,\n });\n\n if (result.handled) {\n e.preventDefault();\n setFocusedDate(result.nextDate);\n\n if (result.viewChanged) {\n onViewChange(result.nextDate.year, result.nextDate.month);\n }\n }\n },\n [focusedDate, isRtl, onSelectDate, onViewChange],\n );\n\n const getCellTabIndex = useCallback(\n (cellDate: JalaliDate): number => {\n return isSameJalaliDay(cellDate, focusedDate) ? 0 : -1;\n },\n [focusedDate],\n );\n\n return {\n focusedDate,\n setFocusedDate,\n handleKeyDown,\n getCellTabIndex,\n };\n}\n","const PERSIAN_DIGITS = [\"۰\", \"۱\", \"۲\", \"۳\", \"۴\", \"۵\", \"۶\", \"۷\", \"۸\", \"۹\"];\nconst LATIN_DIGITS: Record<string, string> = {\n \"۰\": \"0\",\n \"۱\": \"1\",\n \"۲\": \"2\",\n \"۳\": \"3\",\n \"۴\": \"4\",\n \"۵\": \"5\",\n \"۶\": \"6\",\n \"۷\": \"7\",\n \"۸\": \"8\",\n \"۹\": \"9\",\n \"٠\": \"0\",\n \"١\": \"1\",\n \"٢\": \"2\",\n \"٣\": \"3\",\n \"٤\": \"4\", // Arabic-indic fallbacks\n \"٥\": \"5\",\n \"٦\": \"6\",\n \"٧\": \"7\",\n \"٨\": \"8\",\n \"٩\": \"9\",\n};\n\n/**\n * Converts Latin digits (0-9) to Persian digits (۰-۹).\n */\nexport function toPersianDigits(input: string | number): string {\n return String(input).replace(/[0-9]/g, (w) => PERSIAN_DIGITS[+w]);\n}\n\n/**\n * Converts Persian/Arabic digits to standard ASCII Latin digits (0-9).\n */\nexport function toLatinDigits(input: string): string {\n return input.replace(/[۰-۹٠-٩]/g, (char) => LATIN_DIGITS[char] ?? char);\n}\n","import type { JalaliDate } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\nimport { toPersianDigits } from \"./persian-digits\";\n\nexport interface FormatJalaliOptions {\n /** Output digits format. Defaults to 'persian'. */\n digitType?: \"persian\" | \"latin\";\n}\n\n/**\n * Formats a JalaliDate using standard format pattern tokens:\n * - YYYY: 4-digit year (1405)\n * - YY: 2-digit year (05)\n * - MMMM: Full month name (فروردین)\n * - MM: 2-digit month (01-12)\n * - M: 1-digit month (1-12)\n * - dddd: Full weekday name (شنبه)\n * - DD: 2-digit day (01-31)\n * - D: 1-digit day (1-31)\n */\nexport function formatJalaliDate(\n date: JalaliDate | null | undefined,\n pattern = \"YYYY/MM/DD\",\n options: FormatJalaliOptions = {},\n): string {\n if (!date) return \"\";\n\n const { digitType = \"persian\" } = options;\n\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\n const jsDay = gregorian.getDay();\n const jalaliDayOfWeek = (jsDay + 1) % 7;\n\n const yearStr = String(date.year);\n const shortYearStr = yearStr.slice(-2);\n const monthNum = date.month + 1;\n const monthStr = monthNum < 10 ? `0${monthNum}` : String(monthNum);\n const monthName = PERSIAN_MONTH_NAMES[date.month];\n const dayStr = date.day < 10 ? `0${date.day}` : String(date.day);\n const weekdayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\n\n let formatted = pattern\n .replace(/\\bYYYY\\b/g, yearStr)\n .replace(/\\bYY\\b/g, shortYearStr)\n .replace(/\\bMMMM\\b/g, monthName)\n .replace(/\\bMM\\b/g, monthStr)\n .replace(/\\bM\\b/g, String(monthNum))\n .replace(/\\bdddd\\b/g, weekdayName)\n .replace(/\\bDD\\b/g, dayStr)\n .replace(/\\bD\\b/g, String(date.day));\n\n if (digitType === \"persian\") {\n // Convert numeric matches while preserving month/weekday strings\n formatted = formatted.replace(/\\d+/g, (num) => toPersianDigits(num));\n }\n\n return formatted;\n}\n","import type { DatePickerTokens } from \"./types\";\n\nexport const lightThemeTokens: DatePickerTokens = {\n primaryColor: \"#0284c7\", // Sky-600\n primaryHover: \"#0369a1\",\n primaryActive: \"#075985\",\n primaryContrastText: \"#ffffff\",\n\n rangeBetweenBg: \"#e0f2fe\", // Sky-100\n rangeBetweenText: \"#0369a1\",\n\n surfaceBg: \"#ffffff\",\n surfaceBorder: \"#e2e8f0\",\n headerBg: \"#f8fafc\",\n\n textPrimary: \"#0f172a\",\n textSecondary: \"#475569\",\n textMuted: \"#94a3b8\",\n textDisabled: \"#cbd5e1\",\n\n todayIndicatorColor: \"#0284c7\",\n\n borderRadius: \"8px\",\n cellSize: \"36px\",\n shadow: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n fontFamily: \"inherit\",\n};\n\nexport const darkThemeTokens: DatePickerTokens = {\n primaryColor: \"#38bdf8\", // Sky-400\n primaryHover: \"#7dd3fc\",\n primaryActive: \"#bae6fd\",\n primaryContrastText: \"#0f172a\",\n\n rangeBetweenBg: \"#082f49\", // Sky-950\n rangeBetweenText: \"#7dd3fc\",\n\n surfaceBg: \"#0f172a\",\n surfaceBorder: \"#334155\",\n headerBg: \"#1e293b\",\n\n textPrimary: \"#f8fafc\",\n textSecondary: \"#cbd5e1\",\n textMuted: \"#64748b\",\n textDisabled: \"#475569\",\n\n todayIndicatorColor: \"#38bdf8\",\n\n borderRadius: \"8px\",\n cellSize: \"36px\",\n shadow: \"0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.5)\",\n fontFamily: \"inherit\",\n};\n\n/**\n * Maps camelCase tokens to kebab-case CSS variables for injection.\n */\nexport function tokensToCssVariables(\n tokens: Partial<DatePickerTokens>,\n): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(tokens)) {\n if (value !== undefined) {\n const cssVarName = `--pdp-${key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}`;\n vars[cssVarName] = value;\n }\n }\n return vars;\n}\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport {\n lightThemeTokens,\n darkThemeTokens,\n tokensToCssVariables,\n} from \"./tokens\";\nimport type { DatePickerThemeProviderProps, ThemeContextValue } from \"./types\";\n\nconst ThemeContext = createContext<ThemeContextValue>({\n tokens: lightThemeTokens,\n mode: \"light\",\n});\n\nexport const DatePickerThemeProvider: React.FC<\n DatePickerThemeProviderProps\n> = ({ mode = \"light\", customTokens, children }) => {\n const tokens = useMemo(() => {\n const base = mode === \"dark\" ? darkThemeTokens : lightThemeTokens;\n return { ...base, ...customTokens };\n }, [mode, customTokens]);\n\n const cssVariables = useMemo(() => tokensToCssVariables(tokens), [tokens]);\n\n return (\n <ThemeContext.Provider value={{ tokens, mode }}>\n <div\n className=\"pdp-theme-root\"\n dir=\"rtl\"\n style={{\n ...(cssVariables as React.CSSProperties),\n display: \"inline-block\",\n fontFamily: tokens.fontFamily,\n }}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n};\n\nexport const useDatePickerTheme = (): ThemeContextValue =>\n useContext(ThemeContext);\n","import React from \"react\";\nimport type { JalaliMonthIndex } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface HeaderProps {\n year: number;\n month: JalaliMonthIndex;\n onPrevMonth: () => void;\n onNextMonth: () => void;\n onTogglePicker: () => void;\n onGoToToday: () => void;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const Header: React.FC<HeaderProps> = ({\n year,\n month,\n onPrevMonth,\n onNextMonth,\n onTogglePicker,\n classNames,\n styles,\n}) => {\n return (\n <div\n className={classNames?.header}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"12px\",\n padding: \"0 4px\",\n height: \"28px\",\n ...styles?.header,\n }}\n >\n <button\n type=\"button\"\n aria-label=\"ماه قبل\"\n onClick={onPrevMonth}\n className={classNames?.navButton}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n ...styles?.navButton,\n }}\n >\n ›\n </button>\n\n <button\n type=\"button\"\n onClick={onTogglePicker}\n className={classNames?.headerTitle}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"15px\",\n fontWeight: 600,\n color: \"var(--pdp-text-primary, #0f172a)\",\n display: \"flex\",\n gap: \"6px\",\n ...styles?.headerTitle,\n }}\n >\n <span>{PERSIAN_MONTH_NAMES[month]}</span>\n <span>{toPersianDigits(year)}</span>\n </button>\n\n <button\n type=\"button\"\n aria-label=\"ماه بعد\"\n onClick={onNextMonth}\n className={classNames?.navButton}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n ...styles?.navButton,\n }}\n >\n ‹\n </button>\n </div>\n );\n};\n","import React from \"react\";\nimport type { JalaliDayOfWeek } from \"../core/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { PERSIAN_WEEK_DAYS_SHORT } from \"../core/constants\";\n\nexport interface WeekdaysProps {\n firstDayOfWeek?: JalaliDayOfWeek;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const Weekdays: React.FC<WeekdaysProps> = ({\n firstDayOfWeek = 0,\n classNames,\n styles,\n}) => {\n const orderedWeekdays = [\n ...PERSIAN_WEEK_DAYS_SHORT.slice(firstDayOfWeek),\n ...PERSIAN_WEEK_DAYS_SHORT.slice(0, firstDayOfWeek),\n ];\n\n return (\n <div\n role=\"row\"\n aria-label=\"روزهای هفته\"\n className={classNames?.weekdays}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 36px))\",\n gap: \"4px\",\n marginBottom: \"6px\",\n textAlign: \"center\",\n ...styles?.weekdays,\n }}\n >\n {orderedWeekdays.map((name, idx) => (\n <div\n key={idx}\n role=\"columnheader\"\n className={classNames?.weekdayCell}\n style={{\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"var(--pdp-text-muted, #94a3b8)\",\n userSelect: \"none\",\n ...styles?.weekdayCell,\n }}\n >\n {name}\n </div>\n ))}\n </div>\n );\n};\n","import React, { useState } from \"react\";\nimport type { JalaliCalendarCell, JalaliDate } from \"../core/types\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport { getAriaDayLabel } from \"../a11y/aria-helpers\";\nimport type { CalendarEvent } from \"../events/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface DayCellProps {\n cell: JalaliCalendarCell;\n tabIndex: number;\n digitType?: \"persian\" | \"latin\";\n isHoliday?: boolean;\n holidayTitle?: string;\n events?: CalendarEvent[];\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n onSelect: (date: JalaliDate) => void;\n onHover?: (date: JalaliDate | null) => void;\n onFocus?: (date: JalaliDate) => void;\n}\n\nexport const DayCell: React.FC<DayCellProps> = ({\n cell,\n tabIndex,\n digitType = \"persian\",\n isHoliday = false,\n holidayTitle,\n events = [],\n classNames,\n styles,\n onSelect,\n onHover,\n onFocus,\n}) => {\n const {\n jalali,\n isCurrentMonth,\n isToday,\n isSelected,\n isDisabled,\n isInRange,\n isRangeStart,\n isRangeEnd,\n } = cell;\n\n const [isHovered, setIsHovered] = useState(false);\n\n const dayDisplay =\n digitType === \"persian\" ? toPersianDigits(cell.dayNumber) : cell.dayNumber;\n let ariaLabel = getAriaDayLabel(jalali);\n\n if (isHoliday && holidayTitle) {\n ariaLabel += ` (${holidayTitle})`;\n }\n\n // Base Dynamic Styles\n let backgroundColor = \"transparent\";\n let textColor = isCurrentMonth\n ? isHoliday\n ? \"var(--pdp-holiday-color, #ef4444)\"\n : \"var(--pdp-text-primary, #0f172a)\"\n : \"var(--pdp-text-disabled, #cbd5e1)\";\n\n if (isInRange && !isSelected) {\n backgroundColor = \"var(--pdp-range-between-bg, #e0f2fe)\";\n textColor = \"var(--pdp-range-between-text, #0369a1)\";\n }\n\n if (isSelected || isRangeStart || isRangeEnd) {\n backgroundColor = \"var(--pdp-primary-color, #0284c7)\";\n textColor = \"var(--pdp-primary-contrast-text, #ffffff)\";\n }\n\n // Aggregate dynamic classNames\n const combinedClasses = [\n classNames?.dayCell,\n isToday && classNames?.todayCell,\n isSelected && classNames?.selectedCell,\n isInRange && !isSelected && classNames?.rangeBetweenCell,\n isDisabled && classNames?.disabledCell,\n isHoliday && classNames?.holidayCell,\n ]\n .filter(Boolean)\n .join(\" \");\n\n // Aggregate dynamic custom styles\n const combinedStyles: React.CSSProperties = {\n width: \"var(--pdp-cell-size, 36px)\",\n height: \"var(--pdp-cell-size, 36px)\",\n display: \"inline-flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius:\n isRangeStart || isRangeEnd || (!isInRange && isSelected)\n ? \"var(--pdp-border-radius, 8px)\"\n : \"4px\",\n border:\n isToday && !isSelected\n ? \"1px solid var(--pdp-today-indicator-color, #0284c7)\"\n : \"none\",\n backgroundColor,\n color: textColor,\n fontWeight: isToday || isSelected || isHoliday ? 700 : 400,\n fontSize: \"14px\",\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.4 : 1,\n transition: \"background-color 0.15s ease, color 0.15s ease\",\n outline: \"none\",\n position: \"relative\",\n ...styles?.dayCell,\n ...(isToday ? styles?.todayCell : {}),\n ...(isSelected ? styles?.selectedCell : {}),\n ...(isInRange && !isSelected ? styles?.rangeBetweenCell : {}),\n ...(isDisabled ? styles?.disabledCell : {}),\n ...(isHoliday ? styles?.holidayCell : {}),\n };\n\n const hasEvents = events.length > 0;\n const primaryBadgeColor = hasEvents\n ? (events[0].color ?? \"var(--pdp-primary-color, #0284c7)\")\n : undefined;\n\n return (\n <div\n style={{ position: \"relative\", display: \"inline-flex\" }}\n onMouseEnter={() => {\n setIsHovered(true);\n if (!isDisabled) onHover?.(jalali);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n onHover?.(null);\n }}\n >\n <button\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isDisabled ? -1 : tabIndex}\n aria-selected={isSelected || isRangeStart || isRangeEnd}\n aria-disabled={isDisabled}\n aria-label={ariaLabel}\n disabled={isDisabled}\n onClick={() => !isDisabled && onSelect(jalali)}\n onFocus={() => !isDisabled && onFocus?.(jalali)}\n className={combinedClasses || undefined}\n style={combinedStyles}\n >\n <span style={{ lineHeight: 1 }}>{dayDisplay}</span>\n\n {hasEvents && !isSelected && (\n <div\n className={classNames?.eventBadge}\n style={{\n display: \"flex\",\n gap: \"2px\",\n position: \"absolute\",\n bottom: \"3px\",\n ...styles?.eventBadge,\n }}\n >\n {events.slice(0, 3).map((ev, idx) => (\n <span\n key={idx}\n style={{\n width: \"4px\",\n height: \"4px\",\n borderRadius: \"50%\",\n backgroundColor: ev.color ?? primaryBadgeColor,\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n )}\n </button>\n\n {/* Hover Tooltip */}\n {isHovered && (hasEvents || (isHoliday && holidayTitle)) && (\n <div\n role=\"tooltip\"\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 6px)\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 100,\n backgroundColor: \"#0f172a\",\n color: \"#f8fafc\",\n padding: \"6px 10px\",\n borderRadius: \"6px\",\n fontSize: \"11px\",\n whiteSpace: \"nowrap\",\n boxShadow: \"0 4px 6px -1px rgb(0 0 0 / 0.3)\",\n pointerEvents: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n minWidth: \"max-content\",\n maxWidth: \"200px\",\n textAlign: \"center\",\n }}\n >\n {isHoliday && holidayTitle && (\n <div style={{ color: \"#f87171\", fontWeight: 600 }}>\n {holidayTitle}\n </div>\n )}\n {events.map((ev) => (\n <div\n key={ev.id}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n justifyContent: \"center\",\n }}\n >\n {ev.color && (\n <span\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: ev.color,\n display: \"inline-block\",\n }}\n />\n )}\n <span style={{ fontWeight: 500 }}>{ev.title}</span>\n </div>\n ))}\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n borderWidth: \"4px\",\n borderStyle: \"solid\",\n borderColor: \"#0f172a transparent transparent transparent\",\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","import React, { useState } from \"react\";\nimport type { JalaliMonthIndex } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\n\nexport interface MonthYearPickerProps {\n currentYear: number;\n currentMonth: JalaliMonthIndex;\n onSelectMonth: (month: JalaliMonthIndex) => void;\n onSelectYear: (year: number) => void;\n onClose: () => void;\n}\n\nexport const MonthYearPicker: React.FC<MonthYearPickerProps> = ({\n currentYear,\n currentMonth,\n onSelectMonth,\n onSelectYear,\n onClose,\n}) => {\n const [viewMode, setViewMode] = useState<\"months\" | \"years\">(\"months\");\n const [yearPageStart, setYearPageStart] = useState(\n Math.floor(currentYear / 12) * 12,\n );\n\n const years = Array.from({ length: 12 }, (_, i) => yearPageStart + i);\n\n return (\n <div\n style={{\n padding: \"8px\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n }}\n >\n {/* Header Selector Switch */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"12px\",\n }}\n >\n <button\n type=\"button\"\n onClick={() =>\n viewMode === \"years\" ? setYearPageStart((y) => y - 12) : null\n }\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"16px\",\n color: \"var(--pdp-text-primary)\",\n }}\n >\n ‹\n </button>\n\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <button\n type=\"button\"\n onClick={() => setViewMode(\"months\")}\n style={{\n fontWeight: viewMode === \"months\" ? 700 : 400,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--pdp-primary-color, #0284c7)\",\n }}\n >\n {PERSIAN_MONTH_NAMES[currentMonth]}\n </button>\n <button\n type=\"button\"\n onClick={() => setViewMode(\"years\")}\n style={{\n fontWeight: viewMode === \"years\" ? 700 : 400,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--pdp-primary-color, #0284c7)\",\n }}\n >\n {toPersianDigits(currentYear)}\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() =>\n viewMode === \"years\" ? setYearPageStart((y) => y + 12) : null\n }\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"16px\",\n color: \"var(--pdp-text-primary)\",\n }}\n >\n ›\n </button>\n </div>\n\n {/* Grid of Months */}\n {viewMode === \"months\" && (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"8px\",\n }}\n >\n {PERSIAN_MONTH_NAMES.map((name, index) => (\n <button\n key={name}\n type=\"button\"\n onClick={() => {\n onSelectMonth(index as JalaliMonthIndex);\n onClose();\n }}\n style={{\n padding: \"8px 4px\",\n borderRadius: \"6px\",\n border: \"none\",\n cursor: \"pointer\",\n backgroundColor:\n currentMonth === index\n ? \"var(--pdp-primary-color, #0284c7)\"\n : \"transparent\",\n color:\n currentMonth === index\n ? \"#ffffff\"\n : \"var(--pdp-text-primary, #0f172a)\",\n fontSize: \"13px\",\n }}\n >\n {name}\n </button>\n ))}\n </div>\n )}\n\n {/* Grid of Years */}\n {viewMode === \"years\" && (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"8px\",\n }}\n >\n {years.map((yr) => (\n <button\n key={yr}\n type=\"button\"\n onClick={() => {\n onSelectYear(yr);\n setViewMode(\"months\");\n }}\n style={{\n padding: \"8px 4px\",\n borderRadius: \"6px\",\n border: \"none\",\n cursor: \"pointer\",\n backgroundColor:\n currentYear === yr\n ? \"var(--pdp-primary-color, #0284c7)\"\n : \"transparent\",\n color:\n currentYear === yr\n ? \"#ffffff\"\n : \"var(--pdp-text-primary, #0f172a)\",\n fontSize: \"13px\",\n }}\n >\n {toPersianDigits(yr)}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import type { JalaliTime } from \"./types\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\n\n/**\n * Formats a single time segment (e.g. hour/minute) as a 2-digit padded string.\n */\nexport function formatTimeSegment(\n val: number,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n const padded = val < 10 ? `0${val}` : `${val}`;\n return digitType === \"persian\" ? toPersianDigits(padded) : padded;\n}\n\n/**\n * Retrieves the current local machine time as a JalaliTime structure.\n */\nexport function getCurrentTime(): JalaliTime {\n const now = new Date();\n return {\n hour: now.getHours(),\n minute: now.getMinutes(),\n second: now.getSeconds(),\n };\n}\n\n/**\n * Clamps hour, minute, and second within valid boundary ranges.\n */\nexport function clampTime(time: JalaliTime): JalaliTime {\n return {\n hour: Math.max(0, Math.min(23, time.hour)),\n minute: Math.max(0, Math.min(59, time.minute)),\n second:\n time.second !== undefined\n ? Math.max(0, Math.min(59, time.second))\n : undefined,\n };\n}\n\n/**\n * Formats a JalaliTime object into a display string (e.g., \"14:30\" or \"۱۴:۳۰\").\n */\nexport function formatTimeString(\n time: JalaliTime | null | undefined,\n showSeconds = false,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n if (!time) return \"\";\n const h = formatTimeSegment(time.hour, digitType);\n const m = formatTimeSegment(time.minute, digitType);\n if (showSeconds && time.second !== undefined) {\n const s = formatTimeSegment(time.second, digitType);\n return `${h}:${m}:${s}`;\n }\n return `${h}:${m}`;\n}\n","import React from \"react\";\nimport type { CalendarFooterProps } from \"./types\";\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\nimport { formatTimeString } from \"../../plugins/time-picker/time-utils\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../../theme/style-slots\";\n\nexport interface ExtendedCalendarFooterProps extends CalendarFooterProps {\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const CalendarFooter: React.FC<ExtendedCalendarFooterProps> = ({\n selectedDate,\n selectedRange,\n selectedDates,\n selectedTime,\n mode = \"single\",\n digitType = \"persian\",\n showStatusText = true,\n showActions = true,\n onToday,\n onClear,\n onConfirm,\n classNames,\n styles,\n}) => {\n const getStatusText = (): string => {\n let text = \"هیچ تاریخی انتخاب نشده است\";\n\n if (mode === \"single\" && selectedDate) {\n text = formatJalaliDate(selectedDate, \"dddd D MMMM YYYY\", { digitType });\n if (selectedTime) {\n text += ` - ${formatTimeString(selectedTime, false, digitType)}`;\n }\n } else if (mode === \"range\") {\n const [start, end] = selectedRange || [null, null];\n if (start && end) {\n text = `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} تا ${formatJalaliDate(end, \"YYYY/MM/DD\", { digitType })}`;\n } else if (start) {\n text = `شروع: ${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} (پایان را انتخاب کنید)`;\n }\n } else if (\n mode === \"multiple\" &&\n selectedDates &&\n selectedDates.length > 0\n ) {\n const countStr =\n digitType === \"persian\"\n ? toPersianDigits(selectedDates.length)\n : selectedDates.length;\n text = `${countStr} روز انتخاب شده`;\n }\n\n return text;\n };\n\n return (\n <div\n className={classNames?.footer}\n style={{\n marginTop: \"8px\",\n paddingTop: \"8px\",\n borderTop: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n ...styles?.footer,\n }}\n >\n {showStatusText && (\n <div\n aria-live=\"polite\"\n style={{\n fontSize: \"12px\",\n color: \"var(--pdp-text-secondary, #475569)\",\n textAlign: \"center\",\n minHeight: \"18px\",\n fontWeight: 500,\n }}\n >\n {getStatusText()}\n </div>\n )}\n\n {showActions && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n {onToday && (\n <button\n type=\"button\"\n onClick={onToday}\n style={{\n padding: \"3px 8px\",\n fontSize: \"11px\",\n borderRadius: \"4px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"transparent\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n }}\n >\n امروز\n </button>\n )}\n {onClear && (\n <button\n type=\"button\"\n onClick={onClear}\n style={{\n padding: \"3px 8px\",\n fontSize: \"11px\",\n borderRadius: \"4px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"transparent\",\n color: \"var(--pdp-text-muted, #94a3b8)\",\n cursor: \"pointer\",\n }}\n >\n پاک کردن\n </button>\n )}\n </div>\n\n {onConfirm && (\n <button\n type=\"button\"\n onClick={onConfirm}\n style={{\n padding: \"4px 12px\",\n fontSize: \"12px\",\n fontWeight: 600,\n borderRadius: \"6px\",\n border: \"none\",\n backgroundColor: \"var(--pdp-primary-color, #0284c7)\",\n color: \"var(--pdp-primary-contrast-text, #ffffff)\",\n cursor: \"pointer\",\n }}\n >\n تایید\n </button>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback } from \"react\";\nimport type { TimePickerProps, JalaliTime } from \"./types\";\nimport { formatTimeSegment, getCurrentTime, clampTime } from \"./time-utils\";\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n defaultValue,\n onChange,\n minuteStep = 1,\n hourStep = 1,\n showSeconds = false,\n digitType = \"persian\",\n disabled = false,\n styles,\n classNames,\n}) => {\n // Internal state for uncontrolled usage\n const [internalTime, setInternalTime] = React.useState<JalaliTime>(\n defaultValue ?? getCurrentTime(),\n );\n\n // Active time resolution (controlled vs uncontrolled)\n const activeTime =\n value !== undefined ? (value ?? getCurrentTime()) : internalTime;\n\n // Handles state updates and triggers onChange\n const updateTime = useCallback(\n (newTime: JalaliTime) => {\n const clamped = clampTime(newTime);\n if (value === undefined) {\n setInternalTime(clamped);\n }\n onChange?.(clamped);\n },\n [value, onChange],\n );\n\n // Hour increment / decrement\n const changeHour = (delta: number) => {\n const newHour = (activeTime.hour + delta * hourStep + 24) % 24;\n updateTime({ ...activeTime, hour: newHour });\n };\n\n // Minute increment / decrement\n const changeMinute = (delta: number) => {\n const newMinute = (activeTime.minute + delta * minuteStep + 60) % 60;\n updateTime({ ...activeTime, minute: newMinute });\n };\n\n // Second increment / decrement\n const changeSecond = (delta: number) => {\n if (!showSeconds) return;\n const currentSec = activeTime.second ?? 0;\n const newSecond = (currentSec + delta + 60) % 60;\n updateTime({ ...activeTime, second: newSecond });\n };\n\n const buttonStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n color: \"var(--pdp-primary-color, #0284c7)\",\n fontSize: \"12px\",\n padding: \"2px 6px\",\n lineHeight: 1,\n };\n\n const segmentStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n const digitStyle: React.CSSProperties = {\n fontSize: \"15px\",\n fontWeight: 600,\n color: \"var(--pdp-text-primary, #0f172a)\",\n minWidth: \"24px\",\n textAlign: \"center\",\n };\n\n return (\n <div\n role=\"group\"\n aria-label=\"Time Selection\"\n className={classNames?.timePicker}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"6px\",\n padding: \"8px 12px\",\n borderTop: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-header-bg, #f8fafc)\",\n borderRadius:\n \"0 0 var(--pdp-border-radius, 8px) var(--pdp-border-radius, 8px)\",\n direction: \"ltr\", // Preserves standard (HH:MM:SS) layout direction ,\n ...styles?.timePicker,\n }}\n >\n {/* Hours Column */}\n <div style={segmentStyle}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => changeHour(1)}\n style={buttonStyle}\n aria-label=\"Increase Hour\"\n >\n ▼\n </button>\n <span style={digitStyle}>\n {formatTimeSegment(activeTime.hour, digitType)}\n </span>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => changeHour(-1)}\n style={buttonStyle}\n aria-label=\"Decrease Hour\"\n >\n ▲\n </button>\n </div>\n\n <span\n style={{ fontWeight: 700, color: \"var(--pdp-text-secondary, #475569)\" }}\n >\n :\n </span>\n\n {/* Minutes Column */}\n <div style={segmentStyle}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => changeMinute(1)}\n style={buttonStyle}\n aria-label=\"Increase Minute\"\n >\n ▲\n </button>\n <span style={digitStyle}>\n {formatTimeSegment(activeTime.minute, digitType)}\n </span>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => changeMinute(-1)}\n style={buttonStyle}\n aria-label=\"Decrease Minute\"\n >\n ▼\n </button>\n </div>\n\n {/* Seconds Column (Optional) */}\n {showSeconds && (\n <>\n <span\n style={{\n fontWeight: 700,\n color: \"var(--pdp-text-secondary, #475569)\",\n }}\n >\n :\n </span>\n <div style={segmentStyle}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => changeSecond(1)}\n style={buttonStyle}\n aria-label=\"Increase Second\"\n >\n ▲\n </button>\n <span style={digitStyle}>\n {formatTimeSegment(activeTime.second ?? 0, digitType)}\n </span>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => changeSecond(-1)}\n style={buttonStyle}\n aria-label=\"Decrease Second\"\n >\n ▼\n </button>\n </div>\n </>\n )}\n </div>\n );\n};\n","import type { DatePickerPreset } from \"./types\";\nimport { getTodayJalali, getDaysInJalaliMonth } from \"../../core/jalali-math\";\nimport {\n addDaysToJalali,\n getJalaliWeekRange,\n getJalaliMonthRange,\n} from \"../../core/jalali-helpers\";\nimport type { JalaliMonthIndex } from \"../../core/types\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\n\n// Re-export helpers so tests importing from presets find them directly\nexport { addDaysToJalali, getJalaliWeekRange, getJalaliMonthRange };\n\nexport function getDefaultJalaliPresets(\n digitType: \"persian\" | \"latin\" = \"persian\",\n): DatePickerPreset[] {\n const formatNum = (n: number | string) =>\n digitType === \"persian\" ? toPersianDigits(n) : `${n}`;\n\n return [\n {\n id: \"today\",\n label: \"امروز\",\n getValue: () => getTodayJalali(),\n },\n {\n id: \"this_week\",\n label: \"این هفته\",\n getValue: () => getJalaliWeekRange(getTodayJalali()),\n },\n {\n id: \"last_7_days\",\n label: `${formatNum(7)} روز گذشته`,\n getValue: () => {\n const today = getTodayJalali();\n return [addDaysToJalali(today, -6), today];\n },\n },\n {\n id: \"this_month\",\n label: \"این ماه\",\n getValue: () => getJalaliMonthRange(getTodayJalali()),\n },\n {\n id: \"last_month\",\n label: \"ماه گذشته\",\n getValue: () => {\n const today = getTodayJalali();\n let prevYear = today.year;\n let prevMonth = (today.month - 1) as JalaliMonthIndex;\n\n if (prevMonth < 0) {\n prevMonth = 11;\n prevYear -= 1;\n }\n\n const daysInPrevMonth = getDaysInJalaliMonth(prevYear, prevMonth);\n return [\n { year: prevYear, month: prevMonth, day: 1 },\n { year: prevYear, month: prevMonth, day: daysInPrevMonth },\n ];\n },\n },\n {\n id: \"last_30_days\",\n label: `${formatNum(30)} روز گذشته`,\n getValue: () => {\n const today = getTodayJalali();\n return [addDaysToJalali(today, -29), today];\n },\n },\n ];\n}\n\nexport const DEFAULT_DATE_PICKER_PRESETS = getDefaultJalaliPresets(\"persian\");\n","import React, { useMemo } from \"react\";\nimport type { PresetsBarProps, DatePickerPreset } from \"./types\";\nimport { getDefaultJalaliPresets } from \"./default-presets\";\nimport { isSameJalaliDay } from \"../../core/jalali-math\";\nimport type { JalaliDate } from \"../../core/types\";\nimport type { JalaliDateRange } from \"../../hooks/types\";\n\nexport const PresetsBar: React.FC<PresetsBarProps> = ({\n presets,\n onSelectPreset,\n selectedValue,\n orientation = \"vertical\",\n digitType = \"persian\",\n disabled = false,\n classNames,\n styles,\n}) => {\n const activePresets: DatePickerPreset[] = useMemo(() => {\n return presets ?? getDefaultJalaliPresets(digitType);\n }, [presets, digitType]);\n\n const isPresetActive = (preset: DatePickerPreset): boolean => {\n if (!selectedValue) return false;\n const val = preset.getValue();\n\n if (!Array.isArray(val) && !Array.isArray(selectedValue)) {\n return isSameJalaliDay(val as JalaliDate, selectedValue as JalaliDate);\n }\n\n if (Array.isArray(val) && Array.isArray(selectedValue)) {\n const [vStart, vEnd] = val as JalaliDateRange;\n const [sStart, sEnd] = selectedValue as JalaliDateRange;\n if (!vStart || !vEnd || !sStart || !sEnd) return false;\n return isSameJalaliDay(vStart, sStart) && isSameJalaliDay(vEnd, sEnd);\n }\n\n return false;\n };\n\n const containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: orientation === \"vertical\" ? \"column\" : \"row\",\n gap: \"4px\",\n padding: \"8px\",\n backgroundColor: \"var(--pdp-header-bg, #f8fafc)\",\n borderLeft:\n orientation === \"vertical\"\n ? \"1px solid var(--pdp-surface-border, #e2e8f0)\"\n : \"none\",\n borderBottom:\n orientation === \"horizontal\"\n ? \"1px solid var(--pdp-surface-border, #e2e8f0)\"\n : \"none\",\n overflowX: orientation === \"horizontal\" ? \"auto\" : \"visible\",\n maxHeight: orientation === \"vertical\" ? \"280px\" : \"none\",\n overflowY: orientation === \"vertical\" ? \"auto\" : \"visible\",\n minWidth: orientation === \"vertical\" ? \"110px\" : \"auto\",\n ...styles?.presetsBar,\n };\n\n return (\n <div\n role=\"group\"\n aria-label=\"کلیدهای میانبر تاریخ\"\n className={classNames?.presetsBar}\n style={containerStyle}\n >\n {activePresets.map((preset: DatePickerPreset) => {\n const active = isPresetActive(preset);\n return (\n <button\n key={preset.id}\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelectPreset(preset.getValue())}\n style={{\n padding: \"6px 10px\",\n fontSize: \"12px\",\n fontWeight: active ? 600 : 400,\n textAlign: \"right\",\n border: \"none\",\n borderRadius: \"var(--pdp-border-radius, 6px)\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n backgroundColor: active\n ? \"var(--pdp-primary-color, #0284c7)\"\n : \"transparent\",\n color: active\n ? \"var(--pdp-primary-contrast-text, #ffffff)\"\n : \"var(--pdp-text-primary, #0f172a)\",\n whiteSpace: \"nowrap\",\n transition: \"background-color 0.15s ease, color 0.15s ease\",\n }}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n );\n};\n","import type { JalaliDate, JalaliMonthIndex } from \"../../core/types\";\nimport type { DateParseResult } from \"./types\";\nimport {\n toLatinDigits,\n toPersianDigits,\n} from \"../../formatters/persian-digits\";\nimport { getDaysInJalaliMonth } from \"../../core/jalali-math\";\nimport { compareJalaliDates } from \"../../core/jalali-helpers\";\n\n/**\n * Strips all non-digit characters and applies the 'YYYY/MM/DD' mask structure.\n */\nexport function applyDateMask(\n rawInput: string,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n // Normalize all Persian/Arabic digits to ASCII 0-9\n const cleanDigits = toLatinDigits(rawInput).replace(/\\D/g, \"\").slice(0, 8);\n\n let masked = \"\";\n if (cleanDigits.length > 0) {\n masked = cleanDigits.slice(0, 4); // Year (YYYY)\n }\n if (cleanDigits.length >= 5) {\n masked += `/${cleanDigits.slice(4, 6)}`; // Month (MM)\n }\n if (cleanDigits.length >= 7) {\n masked += `/${cleanDigits.slice(6, 8)}`; // Day (DD)\n }\n\n return digitType === \"persian\" ? toPersianDigits(masked) : masked;\n}\n\n/**\n * Validates and parses a masked string into a valid JalaliDate object.\n */\nexport function parseAndValidateJalaliString(\n input: string,\n minDate?: JalaliDate,\n maxDate?: JalaliDate,\n isDateDisabled?: (date: JalaliDate) => boolean,\n): DateParseResult {\n const normalized = toLatinDigits(input).trim();\n\n if (!normalized) {\n return { isValid: true, date: null };\n }\n\n const parts = normalized.split(\"/\");\n if (\n parts.length !== 3 ||\n parts[0].length !== 4 ||\n parts[1].length !== 2 ||\n parts[2].length !== 2\n ) {\n return { isValid: false, date: null, error: \"INVALID_FORMAT\" };\n }\n\n const year = parseInt(parts[0], 10);\n const monthNum = parseInt(parts[1], 10);\n const day = parseInt(parts[2], 10);\n\n // Validate Month Range (1 to 12)\n if (monthNum < 1 || monthNum > 12) {\n return { isValid: false, date: null, error: \"INVALID_MONTH\" };\n }\n\n const monthIndex = (monthNum - 1) as JalaliMonthIndex;\n const maxDays = getDaysInJalaliMonth(year, monthIndex);\n\n // Validate Day Range (1 to 29/30/31 based on month & leap year)\n if (day < 1 || day > maxDays) {\n return { isValid: false, date: null, error: \"INVALID_DAY\" };\n }\n\n const jalaliDate: JalaliDate = { year, month: monthIndex, day };\n\n // Min / Max range validations\n if (minDate && compareJalaliDates(jalaliDate, minDate) < 0) {\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MIN_BOUNDS\" };\n }\n\n if (maxDate && compareJalaliDates(jalaliDate, maxDate) > 0) {\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MAX_BOUNDS\" };\n }\n\n // Custom disable rule\n if (isDateDisabled && isDateDisabled(jalaliDate)) {\n return { isValid: false, date: jalaliDate, error: \"DISABLED_DATE\" };\n }\n\n return { isValid: true, date: jalaliDate };\n}\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { MaskedDateInputProps, DateValidationError } from \"./types\";\nimport { applyDateMask, parseAndValidateJalaliString } from \"./mask-utils\";\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\nimport type { JalaliDate } from \"../../core/types\";\n\nexport const MaskedDateInput: React.FC<MaskedDateInputProps> = ({\n value,\n defaultValue = null,\n onChange,\n onValidationError,\n digitType = \"persian\",\n minDate,\n maxDate,\n isDateDisabled,\n clearable = true,\n placeholder = \"۱۴۰۵/۰۱/۱۵\",\n disabled = false,\n style,\n ...restProps\n}) => {\n const [internalValue, setInternalValue] = useState<JalaliDate | null>(\n defaultValue,\n );\n const activeDate = value !== undefined ? value : internalValue;\n\n const [text, setText] = useState<string>(() => {\n return activeDate\n ? formatJalaliDate(activeDate, \"YYYY/MM/DD\", { digitType })\n : \"\";\n });\n\n const [hasError, setHasError] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Sync text input with incoming controlled value updates\n useEffect(() => {\n if (value !== undefined) {\n setText(\n value ? formatJalaliDate(value, \"YYYY/MM/DD\", { digitType }) : \"\",\n );\n setHasError(false);\n }\n }, [value, digitType]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawVal = e.target.value;\n const maskedVal = applyDateMask(rawVal, digitType);\n setText(maskedVal);\n\n // Validate only if complete date is typed (10 chars: YYYY/MM/DD) or empty\n if (maskedVal.length === 10 || maskedVal.length === 0) {\n const result = parseAndValidateJalaliString(\n maskedVal,\n minDate,\n maxDate,\n isDateDisabled,\n );\n\n if (result.isValid) {\n setHasError(false);\n onValidationError?.(null);\n if (value === undefined) {\n setInternalValue(result.date);\n }\n onChange?.(result.date);\n } else {\n setHasError(true);\n onValidationError?.(result.error as DateValidationError);\n }\n } else {\n // Incomplete state\n setHasError(false);\n onValidationError?.(null);\n }\n };\n\n const handleClear = useCallback(() => {\n setText(\"\");\n setHasError(false);\n onValidationError?.(null);\n if (value === undefined) {\n setInternalValue(null);\n }\n onChange?.(null);\n inputRef.current?.focus();\n }, [value, onChange, onValidationError]);\n\n return (\n <div\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n direction: \"rtl\",\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n disabled={disabled}\n placeholder={digitType === \"persian\" ? placeholder : \"1405/01/15\"}\n value={text}\n onChange={handleInputChange}\n style={{\n width: \"180px\",\n padding: \"8px 12px\",\n paddingLeft: clearable && text ? \"32px\" : \"12px\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n border: `1px solid ${hasError ? \"#ef4444\" : \"var(--pdp-surface-border, #e2e8f0)\"}`,\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n outline: \"none\",\n textAlign: \"center\",\n letterSpacing: \"1px\",\n transition: \"border-color 0.15s ease\",\n ...style,\n }}\n {...restProps}\n />\n\n {/* Clear Button */}\n {clearable && text && !disabled && (\n <button\n type=\"button\"\n aria-label=\"پاک کردن\"\n onClick={handleClear}\n style={{\n position: \"absolute\",\n left: \"8px\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--pdp-text-muted, #94a3b8)\",\n fontSize: \"14px\",\n lineHeight: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2px\",\n }}\n >\n ✕\n </button>\n )}\n </div>\n );\n};\n","import type { JalaliDate } from \"../core/types\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { CalendarEvent } from \"./types\";\n\n/**\n * Filters and returns all events matching a specific Jalali date.\n */\nexport function getEventsForDate(\n date: JalaliDate,\n events?: CalendarEvent[],\n): CalendarEvent[] {\n if (!events || events.length === 0) return [];\n return events.filter((e) => isSameJalaliDay(e.date, date));\n}\n","import type { JalaliDate } from \"../core/types\";\nimport type { OfficialHoliday, CustomHolidayRule } from \"./types\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\n\n/**\n * Fixed Solar Calendar Holidays in Iran:\n * Key format: `${monthIndex}-${day}` (Month index is 0-based: 0 = Farvardin, 11 = Esfand)\n */\nconst FIXED_SOLAR_HOLIDAYS: Record<string, string> = {\n \"0-1\": \"جشن نوروز / سال نو\",\n \"0-2\": \"عید نوروز\",\n \"0-3\": \"عید نوروز\",\n \"0-4\": \"عید نوروز\",\n \"0-12\": \"روز جمهوری اسلامی ایران\",\n \"0-13\": \"روز طبیعت (سیزده‌بدر)\",\n \"2-14\": \"رحلت امام خمینی\",\n \"2-15\": \"قیام ۱۵ خرداد\",\n \"10-22\": \"پیروزی انقلاب اسلامی\",\n \"11-29\": \"روز ملی شدن صنعت نفت\",\n};\n\n/**\n * Checks if a given Jalali date is Friday (جمعه).\n */\nexport function isJalaliFriday(date: JalaliDate): boolean {\n const g = jalaliToGregorian(date.year, date.month, date.day);\n return g.getDay() === 5; // In JS Date.getDay(), 5 represents Friday\n}\n\n/**\n * Resolves holiday info for a JalaliDate based purely on solar calendar rules and custom overrides.\n */\nexport function getOfficialHoliday(\n date: JalaliDate,\n customHolidays?: CustomHolidayRule[],\n): OfficialHoliday | null {\n // 1. Check Custom User-Defined Holidays\n if (customHolidays && customHolidays.length > 0) {\n const custom = customHolidays.find(\n (h) =>\n h.date.year === date.year &&\n h.date.month === date.month &&\n h.date.day === date.day,\n );\n if (custom) {\n return {\n title: custom.title,\n type: \"custom\",\n isOff: custom.isOff ?? true,\n };\n }\n }\n\n // 2. Check Fixed Solar Holidays (O(1) Hash Map Lookup)\n const solarKey = `${date.month}-${date.day}`;\n if (FIXED_SOLAR_HOLIDAYS[solarKey]) {\n return {\n title: FIXED_SOLAR_HOLIDAYS[solarKey],\n type: \"solar\",\n isOff: true,\n };\n }\n\n // 3. Check Friday (End of Week)\n if (isJalaliFriday(date)) {\n return { title: \"جمعه (تعطیل پایان هفته)\", type: \"solar\", isOff: true };\n }\n\n return null;\n}\n","import React, {\n useState,\n useRef,\n useCallback,\n useMemo,\n useEffect,\n} from \"react\";\nimport { useJalaliDatePicker } from \"../hooks/useJalaliDatePicker\";\nimport { useCalendarKeyboard } from \"../a11y/useCalendarKeyboard\";\nimport type {\n UseJalaliDatePickerOptions,\n SelectionMode,\n JalaliDateRange,\n} from \"../hooks/types\";\nimport { Header } from \"./Header\";\nimport { Weekdays } from \"./Weekdays\";\nimport { DayCell } from \"./DayCell\";\nimport { MonthYearPicker } from \"./MonthYearPicker\";\nimport type {\n JalaliDate,\n JalaliMonthIndex,\n JalaliCalendarCell,\n} from \"../core/types\";\nimport { formatJalaliDate } from \"../formatters/jalali-formatter\";\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport { CalendarFooter } from \"./footer/CalendarFooter\";\nimport { TimePicker } from \"../plugins/time-picker/TimePicker\";\nimport type { JalaliTime } from \"../plugins/time-picker/types\";\nimport {\n formatTimeString,\n getCurrentTime,\n} from \"../plugins/time-picker/time-utils\";\nimport { PresetsBar } from \"../plugins/presets/PresetsBar\";\nimport type { DatePickerPreset, PresetValue } from \"../plugins/presets/types\";\nimport { MaskedDateInput } from \"./masked-input/MaskedDateInput\";\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\nimport { isJalaliDateBetween } from \"../core/jalali-helpers\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { CalendarEvent } from \"../events/types\";\nimport { getEventsForDate } from \"../events/event-utils\";\nimport { getOfficialHoliday } from \"../holidays\";\nimport type { CustomHolidayRule } from \"../holidays/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface JalaliDatePickerProps<\n M extends SelectionMode = \"single\",\n> extends UseJalaliDatePickerOptions<M> {\n /** Output digit presentation ('persian' or 'latin') */\n digitType?: \"persian\" | \"latin\";\n /** Layout presentation style: 'inline', 'popover' dropdown, or 'modal' dialog */\n variant?: \"inline\" | \"popover\" | \"modal\";\n /** Placeholder text for popover and modal input trigger */\n placeholder?: string;\n\n // --- Granular Style & Class Customization ---\n /** Root wrapper CSS class */\n className?: string;\n /** Root wrapper inline styles */\n style?: React.CSSProperties;\n /** Slot-based CSS class mapping */\n classNames?: DatePickerClassNames;\n /** Slot-based inline styles mapping */\n styles?: DatePickerStyles;\n\n // --- Built-in Footer & Status Props ---\n /** Whether to render the built-in footer status & actions (default: false) */\n showFooter?: boolean;\n /** Toggle status text inside footer (default: true) */\n showStatusText?: boolean;\n /** Toggle action buttons (Today, Clear, Confirm) inside footer (default: true) */\n showActions?: boolean;\n /** Callback fired when user clicks Confirm in footer */\n onConfirm?: () => void;\n\n // --- Time Picker Integration Props ---\n /** Enable embedded time picker below calendar grid */\n enableTime?: boolean;\n /** Controlled time value */\n timeValue?: JalaliTime | null;\n /** Default uncontrolled time value */\n defaultTimeValue?: JalaliTime;\n /** Callback fired when selected time changes */\n onTimeChange?: (time: JalaliTime) => void;\n /** Step increment for minutes (default: 1) */\n minuteStep?: number;\n /** Step increment for hours (default: 1) */\n hourStep?: number;\n /** Show seconds segment in time picker */\n showSeconds?: boolean;\n\n // --- Shortcuts & Presets Props ---\n /** Enable shortcut presets bar */\n enablePresets?: boolean;\n /** Custom presets array */\n presets?: DatePickerPreset[];\n /** Orientation of presets bar ('vertical' or 'horizontal') */\n presetsOrientation?: \"vertical\" | \"horizontal\";\n\n // --- Dual Calendar View Props ---\n /** Number of months shown side-by-side (1 or 2, default: 1) */\n numberOfMonths?: 1 | 2;\n\n // --- Masked Input Integration ---\n /** Use live-masked typing input when variant is 'popover' */\n useMaskedInput?: boolean;\n\n // --- Events & Badges Props ---\n /** Array of registered calendar events with badges and tooltips */\n events?: CalendarEvent[];\n\n // --- Holidays Props ---\n /** Highlight Iranian national solar holidays and Fridays in red (default: false) */\n showHolidays?: boolean;\n /** Custom additional holidays array */\n customHolidays?: CustomHolidayRule[];\n}\n\nexport function JalaliDatePicker<M extends SelectionMode = \"single\">({\n variant = \"inline\",\n placeholder = \"انتخاب تاریخ...\",\n digitType = \"persian\",\n className,\n style,\n classNames,\n styles,\n showFooter = false,\n showStatusText = true,\n showActions = true,\n onConfirm,\n defaultValue,\n // Time Picker\n enableTime = false,\n timeValue,\n defaultTimeValue,\n onTimeChange,\n minuteStep = 1,\n hourStep = 1,\n showSeconds = false,\n // Presets\n enablePresets = false,\n presets,\n presetsOrientation = \"vertical\",\n // Multi Month\n numberOfMonths = 1,\n // Masked Input\n useMaskedInput = false,\n // Events\n events,\n // Holidays\n showHolidays = false,\n customHolidays,\n\n ...hookOptions\n}: JalaliDatePickerProps<M>) {\n const [isOpen, setIsOpen] = useState(variant === \"inline\");\n const [showMonthYearPicker, setShowMonthYearPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const isModal = variant === \"modal\";\n\n // 1. Time State Management\n const [internalTime, setInternalTime] = useState<JalaliTime>(\n () => defaultTimeValue ?? getCurrentTime(),\n );\n const activeTime =\n timeValue !== undefined ? (timeValue ?? getCurrentTime()) : internalTime;\n\n const handleTimeChange = useCallback(\n (newTime: JalaliTime) => {\n if (timeValue === undefined) {\n setInternalTime(newTime);\n }\n onTimeChange?.(newTime);\n },\n [timeValue, onTimeChange],\n );\n\n // 2. Date State Management via Hook\n const {\n selected,\n viewYear,\n viewMonth,\n grid,\n goToPrevMonth,\n goToNextMonth,\n setView,\n goToToday,\n selectDate,\n setHoverDate,\n hoverDate,\n clear,\n } = useJalaliDatePicker({\n defaultValue,\n ...hookOptions,\n });\n\n const singleSelectedDate =\n hookOptions.mode === \"single\" ? (selected as JalaliDate | null) : null;\n\n const handleDateSelect = (d: JalaliDate) => {\n selectDate(d);\n if (variant === \"popover\" && hookOptions.mode === \"single\" && !enableTime) {\n setIsOpen(false);\n }\n };\n\n // Keyboard navigation\n const { handleKeyDown, getCellTabIndex, setFocusedDate } =\n useCalendarKeyboard({\n viewYear,\n viewMonth,\n selectedDate: singleSelectedDate,\n onSelectDate: handleDateSelect,\n onViewChange: setView,\n isRtl: true,\n });\n\n // 3. Modal ESC & Body Scroll Lock\n useEffect(() => {\n if (!isModal || !isOpen) return;\n\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n window.addEventListener(\"keydown\", handleGlobalKeyDown);\n return () => {\n document.body.style.overflow = originalOverflow;\n window.removeEventListener(\"keydown\", handleGlobalKeyDown);\n };\n }, [isModal, isOpen]);\n\n // 4. Preset Selection Handler\n const handlePresetSelect = (presetVal: PresetValue) => {\n if (hookOptions.mode === \"single\" && !Array.isArray(presetVal)) {\n selectDate(presetVal as JalaliDate);\n setView(presetVal.year, presetVal.month);\n if (variant === \"popover\" && !enableTime) setIsOpen(false);\n } else if (hookOptions.mode === \"range\" && Array.isArray(presetVal)) {\n const [start, end] = presetVal as JalaliDateRange;\n if (start && end) {\n selectDate(start);\n selectDate(end);\n setView(start.year, start.month);\n }\n }\n };\n\n // 5. Multi-Month calculations\n const nextMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewMonth === 11) {\n return { year: viewYear + 1, month: 0 };\n }\n return { year: viewYear, month: (viewMonth + 1) as JalaliMonthIndex };\n }, [viewYear, viewMonth]);\n\n const secondGrid = useMemo<JalaliCalendarCell[]>(() => {\n if (numberOfMonths !== 2) return [];\n\n const rawGrid = generateJalaliCalendarGrid({\n year: nextMonthState.year,\n month: nextMonthState.month,\n firstDayOfWeek: hookOptions.firstDayOfWeek ?? 0,\n minDate: hookOptions.minDate,\n maxDate: hookOptions.maxDate,\n isDateDisabled: hookOptions.isDateDisabled,\n });\n\n if (hookOptions.mode !== \"range\") return rawGrid;\n\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n }, [numberOfMonths, nextMonthState, hookOptions, selected, hoverDate]);\n\n // 6. Input Value String Formatter\n const formattedInputValue = useMemo(() => {\n if (!selected) return \"\";\n if (hookOptions.mode === \"single\") {\n const datePart = formatJalaliDate(selected as JalaliDate, \"YYYY/MM/DD\", {\n digitType,\n });\n if (enableTime && activeTime) {\n const timePart = formatTimeString(activeTime, showSeconds, digitType);\n return `${datePart} ${timePart}`;\n }\n return datePart;\n }\n if (hookOptions.mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n if (start && end) {\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ${formatJalaliDate(end, \"YYYY/MM/DD\", { digitType })}`;\n }\n if (start) {\n return formatJalaliDate(start, \"YYYY/MM/DD\", { digitType });\n }\n }\n return \"\";\n }, [\n selected,\n hookOptions.mode,\n digitType,\n enableTime,\n activeTime,\n showSeconds,\n ]);\n\n // Calendar Pane Renderer\n const renderCalendarPane = (\n y: number,\n m: JalaliMonthIndex,\n paneGrid: JalaliCalendarCell[],\n showPrevArrow: boolean = true,\n showNextArrow: boolean = true,\n ) => (\n <div style={{ minWidth: \"270px\" }}>\n <Header\n year={y}\n month={m}\n onPrevMonth={showPrevArrow ? goToPrevMonth : () => {}}\n onNextMonth={showNextArrow ? goToNextMonth : () => {}}\n onTogglePicker={() =>\n numberOfMonths === 1 && setShowMonthYearPicker(true)\n }\n onGoToToday={goToToday}\n classNames={classNames}\n styles={styles}\n />\n\n <Weekdays\n firstDayOfWeek={hookOptions.firstDayOfWeek}\n classNames={classNames}\n styles={styles}\n />\n\n <div\n role=\"grid\"\n aria-label={`${PERSIAN_MONTH_NAMES[m]} ${toPersianDigits(y)}`}\n className={classNames?.grid}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 36px))\",\n gap: \"4px\",\n ...styles?.grid,\n }}\n >\n {paneGrid.map((cell, index) => {\n const holidayInfo = showHolidays\n ? getOfficialHoliday(cell.jalali, customHolidays)\n : null;\n\n const dayEvents = getEventsForDate(cell.jalali, events);\n\n return (\n <DayCell\n key={index}\n cell={cell}\n digitType={digitType}\n isHoliday={Boolean(holidayInfo)}\n holidayTitle={holidayInfo?.title}\n events={dayEvents}\n classNames={classNames}\n styles={styles}\n tabIndex={getCellTabIndex(cell.jalali)}\n onSelect={handleDateSelect}\n onHover={setHoverDate}\n onFocus={setFocusedDate}\n />\n );\n })}\n </div>\n </div>\n );\n\n // Core Calendar Box\n const calendarContent = (\n <div\n role={isModal ? \"dialog\" : \"region\"}\n aria-modal={isModal ? true : undefined}\n aria-label=\"تقویم شمسی\"\n onKeyDown={handleKeyDown}\n onClick={(e) => isModal && e.stopPropagation()}\n className={classNames?.calendar}\n style={{\n position:\n variant === \"popover\" ? \"absolute\" : isModal ? \"relative\" : \"static\",\n top: variant === \"popover\" ? \"calc(100% + 4px)\" : undefined,\n right: variant === \"popover\" ? 0 : undefined,\n zIndex: isModal ? 1001 : 50,\n padding: \"16px\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n borderRadius: \"var(--pdp-border-radius, 12px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n boxShadow: isModal\n ? \"0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.3)\"\n : \"var(--pdp-shadow)\",\n width: \"fit-content\",\n userSelect: \"none\",\n display: \"flex\",\n flexDirection: presetsOrientation === \"horizontal\" ? \"column\" : \"row\",\n gap: \"12px\",\n ...styles?.calendar,\n }}\n >\n {/* Modal Close Button */}\n {isModal && (\n <button\n type=\"button\"\n aria-label=\"بستن\"\n onClick={() => setIsOpen(false)}\n style={{\n position: \"absolute\",\n top: \"10px\",\n left: \"10px\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"16px\",\n color: \"var(--pdp-text-muted, #94a3b8)\",\n lineHeight: 1,\n zIndex: 10,\n }}\n >\n ✕\n </button>\n )}\n\n {/* Shortcuts Presets Bar */}\n {enablePresets && (\n <PresetsBar\n presets={presets}\n orientation={presetsOrientation}\n digitType={digitType}\n selectedValue={selected as PresetValue}\n onSelectPreset={handlePresetSelect}\n classNames={classNames}\n styles={styles}\n />\n )}\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\n {showMonthYearPicker ? (\n <MonthYearPicker\n currentYear={viewYear}\n currentMonth={viewMonth}\n onSelectMonth={(m) => setView(viewYear, m)}\n onSelectYear={(y) => setView(y, viewMonth)}\n onClose={() => setShowMonthYearPicker(false)}\n />\n ) : (\n <>\n {/* Multi-Month Calendar Panes */}\n <div\n style={{\n display: \"flex\",\n gap: \"16px\",\n alignItems: \"flex-start\",\n }}\n >\n {renderCalendarPane(\n viewYear,\n viewMonth,\n grid,\n true,\n numberOfMonths === 1,\n )}\n\n {numberOfMonths === 2 && (\n <>\n <div\n style={{\n width: \"1px\",\n backgroundColor: \"var(--pdp-surface-border, #e2e8f0)\",\n alignSelf: \"stretch\",\n }}\n />\n {renderCalendarPane(\n nextMonthState.year,\n nextMonthState.month,\n secondGrid,\n false,\n true,\n )}\n </>\n )}\n </div>\n\n {/* Embedded Time Picker */}\n {enableTime && (\n <TimePicker\n value={activeTime}\n onChange={handleTimeChange}\n minuteStep={minuteStep}\n hourStep={hourStep}\n showSeconds={showSeconds}\n digitType={digitType}\n classNames={classNames}\n styles={styles}\n />\n )}\n\n {/* Built-in Status & Actions Footer */}\n {showFooter && (\n <CalendarFooter\n mode={hookOptions.mode}\n digitType={digitType}\n showStatusText={showStatusText}\n showActions={showActions}\n selectedDate={\n hookOptions.mode === \"single\"\n ? (selected as JalaliDate | null)\n : null\n }\n selectedRange={\n hookOptions.mode === \"range\"\n ? (selected as JalaliDateRange)\n : undefined\n }\n selectedDates={\n hookOptions.mode === \"multiple\"\n ? (selected as JalaliDate[])\n : undefined\n }\n selectedTime={enableTime ? activeTime : undefined}\n onToday={goToToday}\n onClear={clear}\n onConfirm={() => {\n if (variant !== \"inline\") setIsOpen(false);\n onConfirm?.();\n }}\n classNames={classNames}\n styles={styles}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={className ?? classNames?.root}\n style={{\n position: \"relative\",\n display: \"inline-block\",\n ...style,\n ...styles?.root,\n }}\n >\n {/* Popover / Modal Trigger Input */}\n {variant !== \"inline\" &&\n (useMaskedInput &&\n hookOptions.mode === \"single\" &&\n variant === \"popover\" ? (\n <MaskedDateInput\n value={singleSelectedDate}\n digitType={digitType}\n placeholder={placeholder}\n onChange={(d) => {\n if (d) {\n selectDate(d);\n setView(d.year, d.month);\n } else {\n clear();\n }\n }}\n onClick={() => setIsOpen(true)}\n className={classNames?.input}\n style={styles?.input}\n />\n ) : (\n <input\n type=\"text\"\n readOnly\n placeholder={placeholder}\n value={formattedInputValue}\n onClick={() => setIsOpen(true)}\n className={classNames?.input}\n style={{\n padding: \"8px 12px\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n textAlign: \"right\",\n direction: \"rtl\",\n fontSize: \"14px\",\n minWidth: enableTime\n ? \"200px\"\n : numberOfMonths === 2\n ? \"240px\"\n : \"150px\",\n ...styles?.input,\n }}\n />\n ))}\n\n {/* Render Modal Overlay with Backdrop vs Standard Container */}\n {isOpen &&\n (isModal ? (\n <div\n role=\"presentation\"\n onClick={() => setIsOpen(false)}\n className={classNames?.modalBackdrop}\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(15, 23, 42, 0.6)\",\n backdropFilter: \"blur(4px)\",\n zIndex: 1000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n direction: \"rtl\",\n ...styles?.modalBackdrop,\n }}\n >\n {calendarContent}\n </div>\n ) : (\n calendarContent\n ))}\n </div>\n );\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport type { DualMonthCalendarProps } from \"./types\";\nimport type {\n JalaliDate,\n JalaliMonthIndex,\n JalaliCalendarCell,\n} from \"../../core/types\";\nimport type { JalaliDateRange } from \"../../hooks/types\";\nimport { getTodayJalali, isSameJalaliDay } from \"../../core/jalali-math\";\nimport { generateJalaliCalendarGrid } from \"../../core/calendar-grid\";\nimport {\n compareJalaliDates,\n isJalaliDateBetween,\n} from \"../../core/jalali-helpers\";\nimport { PERSIAN_MONTH_NAMES } from \"../../core/constants\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\nimport { Weekdays } from \"../Weekdays\";\nimport { DayCell } from \"../DayCell\";\n\nexport const DualMonthCalendar: React.FC<DualMonthCalendarProps> = ({\n value,\n defaultValue = [null, null],\n onChange,\n initialViewDate,\n firstDayOfWeek = 0,\n digitType = \"persian\",\n minDate,\n maxDate,\n isDateDisabled,\n}) => {\n // 1. Selection State (Controlled vs Uncontrolled)\n const [internalRange, setInternalRange] =\n useState<JalaliDateRange>(defaultValue);\n const activeRange = value !== undefined ? value : internalRange;\n\n // 2. Hover state for range preview\n const [hoveredDate, setHoveredDate] = useState<JalaliDate | null>(null);\n\n // 3. View state for First Month (Left)\n const today = useMemo(() => getTodayJalali(), []);\n const [viewState, setViewState] = useState<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (initialViewDate) return initialViewDate;\n if (activeRange[0])\n return { year: activeRange[0].year, month: activeRange[0].month };\n return { year: today.year, month: today.month };\n });\n\n // Calculate Second Month (Right)\n const nextMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewState.month === 11) {\n return { year: viewState.year + 1, month: 0 };\n }\n return {\n year: viewState.year,\n month: (viewState.month + 1) as JalaliMonthIndex,\n };\n }, [viewState]);\n\n // 4. Synchronized Navigation (moves both months together)\n const handlePrevMonth = () => {\n setViewState((prev) => {\n if (prev.month === 0) return { year: prev.year - 1, month: 11 };\n return { year: prev.year, month: (prev.month - 1) as JalaliMonthIndex };\n });\n };\n\n const handleNextMonth = () => {\n setViewState((prev) => {\n if (prev.month === 11) return { year: prev.year + 1, month: 0 };\n return { year: prev.year, month: (prev.month + 1) as JalaliMonthIndex };\n });\n };\n\n // 5. Date Selection Handler\n const handleDateSelect = useCallback(\n (target: JalaliDate) => {\n const [start, end] = activeRange;\n let newRange: JalaliDateRange;\n\n if (!start || (start && end)) {\n newRange = [target, null];\n } else {\n if (compareJalaliDates(target, start) < 0) {\n newRange = [target, start];\n } else {\n newRange = [start, target];\n }\n setHoveredDate(null);\n }\n\n if (value === undefined) {\n setInternalRange(newRange);\n }\n onChange?.(newRange);\n },\n [activeRange, value, onChange],\n );\n\n // 6. Enrich cells with cross-month range metadata\n const enrichGridCells = useCallback(\n (year: number, month: JalaliMonthIndex): JalaliCalendarCell[] => {\n const rawGrid = generateJalaliCalendarGrid({\n year,\n month,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n });\n\n const [start, end] = activeRange;\n const effectiveEnd = end ?? (start && hoveredDate ? hoveredDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n },\n [\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n activeRange,\n hoveredDate,\n ],\n );\n\n const leftGrid = useMemo(\n () => enrichGridCells(viewState.year, viewState.month),\n [enrichGridCells, viewState.year, viewState.month],\n );\n\n const rightGrid = useMemo(\n () => enrichGridCells(nextMonthState.year, nextMonthState.month),\n [enrichGridCells, nextMonthState.year, nextMonthState.month],\n );\n\n const renderMonthPane = (\n year: number,\n month: JalaliMonthIndex,\n grid: JalaliCalendarCell[],\n isLeftPane: boolean,\n ) => (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n minWidth: \"270px\",\n }}\n >\n {/* Pane Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 4px\",\n height: \"32px\",\n }}\n >\n {isLeftPane ? (\n <button\n type=\"button\"\n aria-label=\"ماه قبل\"\n onClick={handlePrevMonth}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n }}\n >\n ›\n </button>\n ) : (\n <div style={{ width: \"28px\" }} />\n )}\n\n <div\n style={{\n fontWeight: 600,\n fontSize: \"14px\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n }}\n >\n {PERSIAN_MONTH_NAMES[month]} {toPersianDigits(year)}\n </div>\n\n {!isLeftPane ? (\n <button\n type=\"button\"\n aria-label=\"ماه بعد\"\n onClick={handleNextMonth}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n }}\n >\n ‹\n </button>\n ) : (\n <div style={{ width: \"28px\" }} />\n )}\n </div>\n\n <Weekdays firstDayOfWeek={firstDayOfWeek} />\n\n {/* Grid */}\n <div\n role=\"grid\"\n aria-label={`${PERSIAN_MONTH_NAMES[month]} ${toPersianDigits(year)}`}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 36px))\",\n gap: \"4px\",\n }}\n >\n {grid.map((cell, idx) => (\n <DayCell\n key={idx}\n cell={cell}\n digitType={digitType}\n tabIndex={0}\n onSelect={handleDateSelect}\n onHover={setHoveredDate}\n />\n ))}\n </div>\n </div>\n );\n\n return (\n <div\n role=\"region\"\n aria-label=\"تقویم دوقلو شمسی\"\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"24px\",\n padding: \"16px\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n boxShadow: \"var(--pdp-shadow)\",\n width: \"fit-content\",\n direction: \"rtl\",\n }}\n >\n {renderMonthPane(viewState.year, viewState.month, leftGrid, true)}\n <div\n style={{\n width: \"1px\",\n backgroundColor: \"var(--pdp-surface-border, #e2e8f0)\",\n }}\n />\n {renderMonthPane(\n nextMonthState.year,\n nextMonthState.month,\n rightGrid,\n false,\n )}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/constants.ts","../src/core/jalali-math.ts","../src/core/calendar-grid.ts","../src/core/jalali-helpers.ts","../src/hooks/useJalaliDatePicker.ts","../src/a11y/keyboard-navigation.ts","../src/a11y/aria-helpers.ts","../src/a11y/useCalendarKeyboard.ts","../src/formatters/persian-digits.ts","../src/formatters/jalali-formatter.ts","../src/theme/tokens.ts","../src/theme/ThemeProvider.tsx","../src/components/Header.tsx","../src/components/Weekdays.tsx","../src/components/DayCell.tsx","../src/components/MonthYearPicker.tsx","../src/components/footer/CalendarFooter.tsx","../src/plugins/time-picker/TimePicker.tsx","../src/plugins/time-picker/time-utils.ts","../src/components/masked-input/mask-utils.ts","../src/components/masked-input/MaskedDateInput.tsx","../src/events/event-utils.ts","../src/holidays/iran-holidays.ts","../src/components/JalaliDatePicker.tsx","../src/components/dual-calendar/DualMonthCalendar.tsx"],"sourcesContent":["/**\n * Persian (Farsi) month names.\n */\nexport const PERSIAN_MONTH_NAMES = [\n \"فروردین\",\n \"اردیبهشت\",\n \"خرداد\",\n \"تیر\",\n \"مرداد\",\n \"شهریور\",\n \"مهر\",\n \"آبان\",\n \"آذر\",\n \"دی\",\n \"بهمن\",\n \"اسفند\",\n] as const;\n\n/**\n * Phonetic English month names for Jalali calendar.\n */\nexport const JALALI_MONTH_NAMES_EN = [\n \"Farvardin\",\n \"Ordibehesht\",\n \"Khordad\",\n \"Tir\",\n \"Mordad\",\n \"Shahrivar\",\n \"Mehr\",\n \"Aban\",\n \"Azar\",\n \"Dey\",\n \"Bahman\",\n \"Esfand\",\n] as const;\n\n/**\n * Persian weekday headers starting from Saturday (شنبه).\n */\nexport const PERSIAN_WEEK_DAYS_SHORT = [\n \"ش\",\n \"ی\",\n \"د\",\n \"س\",\n \"چ\",\n \"پ\",\n \"ج\",\n] as const;\nexport const PERSIAN_WEEK_DAYS_LONG = [\n \"شنبه\",\n \"یکشنبه\",\n \"دوشنبه\",\n \"سه‌شنبه\",\n \"چهارشنبه\",\n \"پنج‌شنبه\",\n \"جمعه\",\n] as const;\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\n\n/**\n * Determines if a Jalali year is a leap year (کبیسه).\n * Uses the Birashk 2820-year cycle algorithm.\n */\nexport function isJalaliLeapYear(year: number): boolean {\n const breaks = [\n -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097,\n 2192, 2262, 2324, 2394, 2456, 3178,\n ];\n\n let jp = breaks[0];\n let jump = 0;\n\n if (year < jp || year >= breaks[breaks.length - 1]) {\n throw new Error(`Jalali year ${year} is outside supported range.`);\n }\n\n for (let i = 1; i < breaks.length; i++) {\n const jm = breaks[i];\n jump = jm - jp;\n if (year < jm) break;\n jp = jm;\n }\n\n let n = year - jp;\n if (jump - n < 6) n = n - jump + ((jump + 4) / 33) * 33;\n let leap = ((n + 1) % 33) - 1;\n if (leap === -1) leap = 4;\n\n return leap % 4 === 0;\n}\n\n/**\n * Returns the number of days in a specific Jalali month.\n */\nexport function getDaysInJalaliMonth(\n year: number,\n month: JalaliMonthIndex,\n): number {\n if (month < 0 || month > 11) {\n throw new RangeError(\n \"Month index must be between 0 (Farvardin) and 11 (Esfand).\",\n );\n }\n // Months 0 to 5 (Farvardin - Shahrivar) have 31 days\n if (month <= 5) return 31;\n // Months 6 to 10 (Mehr - Bahman) have 30 days\n if (month <= 10) return 30;\n // Month 11 (Esfand) has 30 in leap years, 29 in regular years\n return isJalaliLeapYear(year) ? 30 : 29;\n}\n\n/**\n * Converts a Gregorian date (Year, Month, Day) to Jalali date.\n */\nexport function gregorianToJalali(\n gy: number,\n gm: number,\n gd: number,\n): JalaliDate {\n const g_d_m = [\n 0,\n 31,\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n let jy: number;\n let jm: number;\n let jd: number;\n\n let gy2 = gm > 2 ? gy + 1 : gy;\n let days =\n 355666 +\n 365 * gy +\n Math.floor((gy2 + 3) / 4) -\n Math.floor((gy2 + 99) / 100) +\n Math.floor((gy2 + 399) / 400) +\n gd;\n\n for (let i = 0; i < gm; ++i) days += g_d_m[i];\n\n jy = -1595 + 33 * Math.floor(days / 12053);\n days %= 12053;\n\n jy += 4 * Math.floor(days / 1461);\n days %= 1461;\n\n if (days > 365) {\n jy += Math.floor((days - 1) / 365);\n days = (days - 1) % 365;\n }\n\n if (days < 186) {\n jm = Math.floor(days / 31);\n jd = 1 + (days % 31);\n } else {\n jm = 6 + Math.floor((days - 186) / 30);\n jd = 1 + ((days - 186) % 30);\n }\n\n return { year: jy, month: jm as JalaliMonthIndex, day: jd };\n}\n\n/**\n * Converts a Jalali date to a Gregorian Date.\n */\nexport function jalaliToGregorian(\n jy: number,\n jm: JalaliMonthIndex,\n jd: number,\n): Date {\n let gy: number;\n let gm: number;\n let gd: number;\n\n let jy2 = jy + 1595;\n let days =\n -355668 +\n 365 * jy2 +\n Math.floor(jy2 / 33) * 8 +\n Math.floor(((jy2 % 33) + 3) / 4) +\n jd +\n (jm < 6 ? jm * 31 : (jm - 6) * 30 + 186);\n\n gy = 400 * Math.floor(days / 146097);\n days %= 146097;\n\n if (days > 36524) {\n gy += 100 * Math.floor(--days / 36524);\n days %= 36524;\n if (days >= 365) days++;\n }\n\n gy += 4 * Math.floor(days / 1461);\n days %= 1461;\n\n if (days > 365) {\n gy += Math.floor((days - 1) / 365);\n days = (days - 1) % 365;\n }\n\n gd = days + 1;\n const sal_a = [\n 0,\n 31,\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n\n for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) {\n gd -= sal_a[gm];\n }\n\n const result = new Date(gy, gm - 1, gd);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\n/**\n * Returns today's date in Jalali format.\n */\nexport function getTodayJalali(): JalaliDate {\n const now = new Date();\n return gregorianToJalali(\n now.getFullYear(),\n now.getMonth() + 1,\n now.getDate(),\n );\n}\n\n/**\n * Checks if two Jalali dates are identical.\n */\nexport function isSameJalaliDay(\n a?: JalaliDate | null,\n b?: JalaliDate | null,\n): boolean {\n if (!a || !b) return false;\n return a.year === b.year && a.month === b.month && a.day === b.day;\n}\n","import type {\n JalaliCalendarCell,\n JalaliGridOptions,\n JalaliDate,\n JalaliMonthIndex,\n} from \"./types\";\nimport {\n jalaliToGregorian,\n gregorianToJalali,\n getDaysInJalaliMonth,\n getTodayJalali,\n isSameJalaliDay,\n} from \"./jalali-math\";\n\n/**\n * Normalizes input date (Date or JalaliDate) into JalaliDate object.\n */\nexport function toJalaliDate(input: Date | JalaliDate): JalaliDate {\n if (input instanceof Date) {\n return gregorianToJalali(\n input.getFullYear(),\n input.getMonth() + 1,\n input.getDate(),\n );\n }\n return input;\n}\n\n/**\n * Generates a 42-cell (6 rows x 7 columns) matrix for a given Jalali month.\n */\nexport function generateJalaliCalendarGrid(\n options: JalaliGridOptions,\n): JalaliCalendarCell[] {\n const {\n year,\n month,\n firstDayOfWeek = 0, // 0 = Saturday (شنبه)\n selectedDate,\n minDate,\n maxDate,\n isDateDisabled,\n } = options;\n\n const cells: JalaliCalendarCell[] = [];\n const todayJalali = getTodayJalali();\n const activeSelected = selectedDate ? toJalaliDate(selectedDate) : null;\n const minJalali = minDate ? toJalaliDate(minDate) : null;\n const maxJalali = maxDate ? toJalaliDate(maxDate) : null;\n\n // Convert Jalali 1st of month to Gregorian to read weekday\n const firstDayGregorian = jalaliToGregorian(year, month, 1);\n\n // JS getDay(): 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat\n // Map standard JS getDay() to Jalali index: 6(Sat)->0, 0(Sun)->1, ..., 5(Fri)->6\n const jsDay = firstDayGregorian.getDay();\n const rawJalaliWeekDay = (jsDay + 1) % 7;\n\n const leadingPaddingCount = (rawJalaliWeekDay - firstDayOfWeek + 7) % 7;\n\n // 1. Previous month trailing days\n const prevMonth = (month === 0 ? 11 : month - 1) as JalaliMonthIndex;\n const prevYear = month === 0 ? year - 1 : year;\n const daysInPrevMonth = getDaysInJalaliMonth(prevYear, prevMonth);\n\n for (let i = leadingPaddingCount - 1; i >= 0; i--) {\n const day = daysInPrevMonth - i;\n const jDate: JalaliDate = { year: prevYear, month: prevMonth, day };\n cells.push(buildCell(jDate, false));\n }\n\n // 2. Current month days\n const totalDays = getDaysInJalaliMonth(year, month);\n for (let d = 1; d <= totalDays; d++) {\n const jDate: JalaliDate = { year, month, day: d };\n cells.push(buildCell(jDate, true));\n }\n\n // 3. Next month leading days (completing 42 cells)\n const nextMonth = (month === 11 ? 0 : month + 1) as JalaliMonthIndex;\n const nextYear = month === 11 ? year + 1 : year;\n const trailingPaddingCount = 42 - cells.length;\n\n for (let d = 1; d <= trailingPaddingCount; d++) {\n const jDate: JalaliDate = { year: nextYear, month: nextMonth, day: d };\n cells.push(buildCell(jDate, false));\n }\n\n function buildCell(\n jDate: JalaliDate,\n isCurrentMonth: boolean,\n ): JalaliCalendarCell {\n const gregDate = jalaliToGregorian(jDate.year, jDate.month, jDate.day);\n const isToday = isSameJalaliDay(jDate, todayJalali);\n const isSelected = activeSelected\n ? isSameJalaliDay(jDate, activeSelected)\n : false;\n\n let isDisabled = false;\n if (minJalali) {\n const minG = jalaliToGregorian(\n minJalali.year,\n minJalali.month,\n minJalali.day,\n );\n if (gregDate.getTime() < minG.getTime()) isDisabled = true;\n }\n if (maxJalali) {\n const maxG = jalaliToGregorian(\n maxJalali.year,\n maxJalali.month,\n maxJalali.day,\n );\n if (gregDate.getTime() > maxG.getTime()) isDisabled = true;\n }\n if (isDateDisabled && isDateDisabled(jDate, gregDate)) {\n isDisabled = true;\n }\n\n return {\n jalali: jDate,\n gregorianDate: gregDate,\n dayNumber: jDate.day,\n isCurrentMonth,\n isToday,\n isSelected,\n isDisabled,\n };\n }\n\n return cells;\n}\n","import type { JalaliDate, JalaliDayOfWeek, JalaliMonthIndex } from \"./types\";\nimport {\n jalaliToGregorian,\n gregorianToJalali,\n getDaysInJalaliMonth,\n} from \"./jalali-math\";\n\nexport function jsDateToJalali(d: Date): JalaliDate {\n return gregorianToJalali(d.getFullYear(), d.getMonth() + 1, d.getDate());\n}\n\nexport function jalaliToJsDate(\n j: JalaliDate,\n hours = 0,\n minutes = 0,\n seconds = 0,\n): Date {\n const g = jalaliToGregorian(j.year, j.month, j.day);\n g.setHours(hours, minutes, seconds, 0);\n return g;\n}\n\n/**\n * Calculates day of week in Jalali calendar (0 = شنبه, ..., 6 = جمعه).\n */\nexport function getJalaliDayOfWeek(\n year: number,\n month: number,\n day: number,\n): JalaliDayOfWeek {\n const g = jalaliToGregorian(year, month as JalaliMonthIndex, day);\n const jsDay = g.getDay(); // 0 = Sunday, 6 = Saturday\n return ((jsDay + 1) % 7) as JalaliDayOfWeek;\n}\n\n/**\n * Adds or subtracts days to/from a Jalali date across month/year boundaries.\n */\nexport function addDaysToJalali(date: JalaliDate, days: number): JalaliDate {\n const g = jalaliToGregorian(date.year, date.month, date.day);\n g.setDate(g.getDate() + days);\n // تبدیل getMonth() از 0-indexed به 1-indexed برای gregorianToJalali\n return gregorianToJalali(g.getFullYear(), g.getMonth() + 1, g.getDate());\n}\n\n/**\n * Alias for addDaysToJalali\n */\nexport const addJalaliDays = addDaysToJalali;\n\n/**\n * Compares two Jalali dates:\n * - Returns -1 if d1 < d2\n * - Returns 1 if d1 > d2\n * - Returns 0 if d1 == d2\n */\nexport function compareJalaliDates(d1: JalaliDate, d2: JalaliDate): number {\n if (d1.year !== d2.year) return d1.year < d2.year ? -1 : 1;\n if (d1.month !== d2.month) return d1.month < d2.month ? -1 : 1;\n if (d1.day !== d2.day) return d1.day < d2.day ? -1 : 1;\n return 0;\n}\n\n/**\n * Checks if a target date falls strictly or inclusively between two dates.\n */\nexport function isJalaliDateBetween(\n target: JalaliDate,\n start: JalaliDate,\n end: JalaliDate,\n inclusive = true,\n): boolean {\n const minDate = compareJalaliDates(start, end) <= 0 ? start : end;\n const maxDate = compareJalaliDates(start, end) <= 0 ? end : start;\n\n const cmpMin = compareJalaliDates(target, minDate);\n const cmpMax = compareJalaliDates(target, maxDate);\n\n if (inclusive) {\n return cmpMin >= 0 && cmpMax <= 0;\n }\n return cmpMin > 0 && cmpMax < 0;\n}\n\n/**\n * Calculates the full Jalali week range starting Saturday and ending Friday.\n */\nexport function getJalaliWeekRange(date: JalaliDate): [JalaliDate, JalaliDate] {\n const dayOfWeek = getJalaliDayOfWeek(date.year, date.month, date.day);\n const startOfWeek = addDaysToJalali(date, -dayOfWeek); // شنبه\n const endOfWeek = addDaysToJalali(startOfWeek, 6); // جمعه\n return [startOfWeek, endOfWeek];\n}\n\n/**\n * Calculates full month range from day 1 to last day of that month.\n */\nexport function getJalaliMonthRange(\n date: JalaliDate,\n): [JalaliDate, JalaliDate] {\n const daysInMonth = getDaysInJalaliMonth(date.year, date.month);\n const start: JalaliDate = { year: date.year, month: date.month, day: 1 };\n const end: JalaliDate = {\n year: date.year,\n month: date.month,\n day: daysInMonth,\n };\n return [start, end];\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport type {\n UseJalaliDatePickerOptions,\n SelectionMode,\n InternalSelectedValue,\n JalaliDateRange,\n} from \"./types\";\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\nimport { getTodayJalali, isSameJalaliDay } from \"../core/jalali-math\";\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\nimport { isJalaliDateBetween } from \"../core/jalali-helpers\";\n\nexport function useJalaliDatePicker<M extends SelectionMode = \"single\">(\n options: UseJalaliDatePickerOptions<M> = {},\n) {\n const {\n mode = \"single\" as M,\n value: controlledValue,\n defaultValue,\n initialViewDate,\n onChange,\n minDate,\n maxDate,\n isDateDisabled,\n firstDayOfWeek = 0,\n } = options;\n\n const today = useMemo(() => getTodayJalali(), []);\n\n const [internalValue, setInternalValue] = useState<InternalSelectedValue<M>>(\n () => {\n if (defaultValue !== undefined) return defaultValue;\n if (mode === \"single\") return null as InternalSelectedValue<M>;\n if (mode === \"range\")\n return [null, null] as unknown as InternalSelectedValue<M>;\n return [] as unknown as InternalSelectedValue<M>;\n },\n );\n\n const selected =\n controlledValue !== undefined ? controlledValue : internalValue;\n\n const [viewYear, setViewYear] = useState<number>(() => {\n if (initialViewDate) return initialViewDate.year;\n if (defaultValue && !Array.isArray(defaultValue))\n return (defaultValue as JalaliDate).year;\n return today.year;\n });\n\n const [viewMonth, setViewMonth] = useState<JalaliMonthIndex>(() => {\n if (initialViewDate) return initialViewDate.month;\n if (defaultValue && !Array.isArray(defaultValue))\n return (defaultValue as JalaliDate).month;\n return today.month;\n });\n\n const [hoverDate, setHoverDate] = useState<JalaliDate | null>(null);\n\n const setView = useCallback((year: number, month: JalaliMonthIndex) => {\n setViewYear(year);\n setViewMonth(month);\n }, []);\n\n const goToPrevMonth = useCallback(() => {\n if (viewMonth === 0) {\n setViewYear((y) => y - 1);\n setViewMonth(11);\n } else {\n setViewMonth((m) => (m - 1) as JalaliMonthIndex);\n }\n }, [viewMonth]);\n\n const goToNextMonth = useCallback(() => {\n if (viewMonth === 11) {\n setViewYear((y) => y + 1);\n setViewMonth(0);\n } else {\n setViewMonth((m) => (m + 1) as JalaliMonthIndex);\n }\n }, [viewMonth]);\n\n const goToToday = useCallback(() => {\n const t = getTodayJalali();\n setViewYear(t.year);\n setViewMonth(t.month);\n }, []);\n\n const selectDate = useCallback(\n (date: JalaliDate) => {\n let nextValue: InternalSelectedValue<M>;\n\n if (mode === \"single\") {\n nextValue = date as InternalSelectedValue<M>;\n } else if (mode === \"range\") {\n const currentRange = (selected as JalaliDateRange) || [null, null];\n const [start, end] = currentRange;\n\n if (!start || (start && end)) {\n nextValue = [date, null] as unknown as InternalSelectedValue<M>;\n } else {\n if (\n date.year < start.year ||\n (date.year === start.year && date.month < start.month) ||\n (date.year === start.year &&\n date.month === start.month &&\n date.day < start.day)\n ) {\n nextValue = [date, start] as unknown as InternalSelectedValue<M>;\n } else {\n nextValue = [start, date] as unknown as InternalSelectedValue<M>;\n }\n }\n } else {\n const currentList = (selected as JalaliDate[]) || [];\n const exists = currentList.some((d) => isSameJalaliDay(d, date));\n if (exists) {\n nextValue = currentList.filter(\n (d) => !isSameJalaliDay(d, date),\n ) as InternalSelectedValue<M>;\n } else {\n nextValue = [...currentList, date] as InternalSelectedValue<M>;\n }\n }\n\n if (controlledValue === undefined) {\n setInternalValue(nextValue);\n }\n onChange?.(nextValue);\n },\n [mode, selected, controlledValue, onChange],\n );\n\n const clear = useCallback(() => {\n const emptyValue = (\n mode === \"single\" ? null : mode === \"range\" ? [null, null] : []\n ) as InternalSelectedValue<M>;\n\n if (controlledValue === undefined) {\n setInternalValue(emptyValue);\n }\n onChange?.(emptyValue);\n }, [mode, controlledValue, onChange]);\n\n const grid = useMemo(() => {\n const rawGrid = generateJalaliCalendarGrid({\n year: viewYear,\n month: viewMonth,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n });\n\n if (mode === \"single\") {\n const singleSelected = selected as JalaliDate | null;\n return rawGrid.map((cell) => ({\n ...cell,\n isSelected: singleSelected\n ? isSameJalaliDay(cell.jalali, singleSelected)\n : false,\n }));\n }\n\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n }\n\n if (mode === \"multiple\") {\n const list = (selected as JalaliDate[]) || [];\n return rawGrid.map((cell) => ({\n ...cell,\n isSelected: list.some((d) => isSameJalaliDay(d, cell.jalali)),\n }));\n }\n\n return rawGrid;\n }, [\n viewYear,\n viewMonth,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n mode,\n selected,\n hoverDate,\n ]);\n\n return {\n selected,\n viewYear,\n viewMonth,\n grid,\n goToPrevMonth,\n goToNextMonth,\n goToToday,\n setView,\n selectDate,\n setHoverDate,\n hoverDate,\n clear,\n };\n}\n","import type { JalaliMonthIndex } from \"../core/types\";\nimport { getDaysInJalaliMonth } from \"../core/jalali-math\";\nimport type { NavigateOptions, NavigationResult } from \"./types\";\n\nexport function calculateNextFocusedDate(\n options: NavigateOptions,\n): NavigationResult {\n const { currentFocused, key, isRtl = true } = options;\n let { year, month, day } = currentFocused;\n let viewChanged = false;\n let handled = true;\n\n // Handle RTL vs LTR arrow directions\n const stepLeft = isRtl ? 1 : -1;\n const stepRight = isRtl ? -1 : 1;\n\n switch (key) {\n case \"ArrowRight\":\n day += stepRight;\n break;\n\n case \"ArrowLeft\":\n day += stepLeft;\n break;\n\n case \"ArrowUp\":\n day -= 7;\n break;\n\n case \"ArrowDown\":\n day += 7;\n break;\n\n case \"Home\":\n day = 1;\n break;\n\n case \"End\":\n day = getDaysInJalaliMonth(year, month);\n break;\n\n case \"PageUp\":\n // Previous Month\n if (month === 0) {\n year -= 1;\n month = 11;\n } else {\n month = (month - 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n break;\n\n case \"PageDown\":\n // Next Month\n if (month === 11) {\n year += 1;\n month = 0;\n } else {\n month = (month + 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n break;\n\n default:\n handled = false;\n return { nextDate: currentFocused, viewChanged: false, handled: false };\n }\n\n // Normalize days falling outside current month boundary\n while (day < 1) {\n if (month === 0) {\n year -= 1;\n month = 11;\n } else {\n month = (month - 1) as JalaliMonthIndex;\n }\n day += getDaysInJalaliMonth(year, month);\n viewChanged = true;\n }\n\n while (day > getDaysInJalaliMonth(year, month)) {\n day -= getDaysInJalaliMonth(year, month);\n if (month === 11) {\n year += 1;\n month = 0;\n } else {\n month = (month + 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n }\n\n return {\n nextDate: { year, month, day },\n viewChanged,\n handled,\n };\n}\n","import type { JalaliDate } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\n\n/**\n * Creates an accessible full Persian string for screen readers.\n * Example: \"شنبه، ۱ فروردین ۱۴۰۵\"\n */\nexport function getAriaDayLabel(date: JalaliDate): string {\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\n const jsDay = gregorian.getDay();\n const jalaliDayOfWeek = (jsDay + 1) % 7; // 0 = Sat, 1 = Sun, ...\n\n const weekDayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\n const monthName = PERSIAN_MONTH_NAMES[date.month];\n\n return `${weekDayName}، ${date.day} ${monthName} ${date.year}`;\n}\n","import { useState, useCallback } from \"react\";\nimport type { JalaliDate } from \"../core/types\";\nimport { calculateNextFocusedDate } from \"./keyboard-navigation\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { UseCalendarKeyboardProps } from \"./types\";\n\nexport function useCalendarKeyboard(props: UseCalendarKeyboardProps) {\n const {\n viewYear,\n viewMonth,\n selectedDate,\n onSelectDate,\n onViewChange,\n isRtl = true,\n } = props;\n\n const [focusedDate, setFocusedDate] = useState<JalaliDate>(() => {\n return selectedDate ?? { year: viewYear, month: viewMonth, day: 1 };\n });\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelectDate(focusedDate);\n return;\n }\n\n const result = calculateNextFocusedDate({\n currentFocused: focusedDate,\n key: e.key,\n isRtl,\n });\n\n if (result.handled) {\n e.preventDefault();\n setFocusedDate(result.nextDate);\n\n if (result.viewChanged) {\n onViewChange(result.nextDate.year, result.nextDate.month);\n }\n }\n },\n [focusedDate, isRtl, onSelectDate, onViewChange],\n );\n\n const getCellTabIndex = useCallback(\n (cellDate: JalaliDate): number => {\n return isSameJalaliDay(cellDate, focusedDate) ? 0 : -1;\n },\n [focusedDate],\n );\n\n return {\n focusedDate,\n setFocusedDate,\n handleKeyDown,\n getCellTabIndex,\n };\n}\n","const PERSIAN_DIGITS = [\"۰\", \"۱\", \"۲\", \"۳\", \"۴\", \"۵\", \"۶\", \"۷\", \"۸\", \"۹\"];\nconst LATIN_DIGITS: Record<string, string> = {\n \"۰\": \"0\",\n \"۱\": \"1\",\n \"۲\": \"2\",\n \"۳\": \"3\",\n \"۴\": \"4\",\n \"۵\": \"5\",\n \"۶\": \"6\",\n \"۷\": \"7\",\n \"۸\": \"8\",\n \"۹\": \"9\",\n \"٠\": \"0\",\n \"١\": \"1\",\n \"٢\": \"2\",\n \"٣\": \"3\",\n \"٤\": \"4\", // Arabic-indic fallbacks\n \"٥\": \"5\",\n \"٦\": \"6\",\n \"٧\": \"7\",\n \"٨\": \"8\",\n \"٩\": \"9\",\n};\n\n/**\n * Converts Latin digits (0-9) to Persian digits (۰-۹).\n */\nexport function toPersianDigits(input: string | number): string {\n return String(input).replace(/[0-9]/g, (w) => PERSIAN_DIGITS[+w]);\n}\n\n/**\n * Converts Persian/Arabic digits to standard ASCII Latin digits (0-9).\n */\nexport function toLatinDigits(input: string): string {\n return input.replace(/[۰-۹٠-٩]/g, (char) => LATIN_DIGITS[char] ?? char);\n}\n","import type { JalaliDate } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\nimport { toPersianDigits } from \"./persian-digits\";\n\nexport interface FormatJalaliOptions {\n /** Output digits format. Defaults to 'persian'. */\n digitType?: \"persian\" | \"latin\";\n}\n\n/**\n * Formats a JalaliDate using standard format pattern tokens:\n * - YYYY: 4-digit year (1405)\n * - YY: 2-digit year (05)\n * - MMMM: Full month name (فروردین)\n * - MM: 2-digit month (01-12)\n * - M: 1-digit month (1-12)\n * - dddd: Full weekday name (شنبه)\n * - DD: 2-digit day (01-31)\n * - D: 1-digit day (1-31)\n */\nexport function formatJalaliDate(\n date: JalaliDate | null | undefined,\n pattern = \"YYYY/MM/DD\",\n options: FormatJalaliOptions = {},\n): string {\n if (!date) return \"\";\n\n const { digitType = \"persian\" } = options;\n\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\n const jsDay = gregorian.getDay();\n const jalaliDayOfWeek = (jsDay + 1) % 7;\n\n const yearStr = String(date.year);\n const shortYearStr = yearStr.slice(-2);\n const monthNum = date.month + 1;\n const monthStr = monthNum < 10 ? `0${monthNum}` : String(monthNum);\n const monthName = PERSIAN_MONTH_NAMES[date.month];\n const dayStr = date.day < 10 ? `0${date.day}` : String(date.day);\n const weekdayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\n\n let formatted = pattern\n .replace(/\\bYYYY\\b/g, yearStr)\n .replace(/\\bYY\\b/g, shortYearStr)\n .replace(/\\bMMMM\\b/g, monthName)\n .replace(/\\bMM\\b/g, monthStr)\n .replace(/\\bM\\b/g, String(monthNum))\n .replace(/\\bdddd\\b/g, weekdayName)\n .replace(/\\bDD\\b/g, dayStr)\n .replace(/\\bD\\b/g, String(date.day));\n\n if (digitType === \"persian\") {\n // Convert numeric matches while preserving month/weekday strings\n formatted = formatted.replace(/\\d+/g, (num) => toPersianDigits(num));\n }\n\n return formatted;\n}\n","import type { DatePickerTokens } from \"./types\";\n\nimport { Theme } from \"./types\";\n\nexport const lightTheme: Theme = {\n mode: \"light\",\n colors: {\n primary: \"#2563eb\",\n primaryHover: \"#1d4ed8\",\n primaryText: \"#ffffff\",\n background: \"#ffffff\",\n backgroundHover: \"#f1f5f9\",\n surface: \"#f8fafc\",\n border: \"#e2e8f0\",\n textPrimary: \"#0f172a\",\n textSecondary: \"#64748b\",\n textDisabled: \"#cbd5e1\",\n holiday: \"#ef4444\",\n holidayBackground: \"#fef2f2\",\n rangeBackground: \"#dbeafe\",\n todayBorder: \"#3b82f6\",\n },\n radii: {\n sm: \"4px\",\n md: \"8px\",\n lg: \"12px\",\n full: \"9999px\",\n },\n shadows: {\n sm: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.1)\",\n },\n};\n\nexport const darkTheme: Theme = {\n mode: \"dark\",\n colors: {\n primary: \"#3b82f6\",\n primaryHover: \"#60a5fa\",\n primaryText: \"#ffffff\",\n background: \"#0f172a\",\n backgroundHover: \"#1e293b\",\n surface: \"#1e293b\",\n border: \"#334155\",\n textPrimary: \"#f8fafc\",\n textSecondary: \"#94a3b8\",\n textDisabled: \"#475569\",\n holiday: \"#f87171\",\n holidayBackground: \"#451a1a\",\n rangeBackground: \"#1e3a8a\",\n todayBorder: \"#60a5fa\",\n },\n radii: {\n sm: \"4px\",\n md: \"8px\",\n lg: \"12px\",\n full: \"9999px\",\n },\n shadows: {\n sm: \"0 1px 2px 0 rgba(0, 0, 0, 0.3)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.4)\",\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.5)\",\n },\n};\n\n/**\n * Maps camelCase tokens to kebab-case CSS variables for injection.\n */\nexport function tokensToCssVariables(\n tokens: Partial<DatePickerTokens>,\n): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(tokens)) {\n if (value !== undefined) {\n const cssVarName = `--pdp-${key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}`;\n vars[cssVarName] = value;\n }\n }\n return vars;\n}\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport { lightTheme, darkTheme } from \"./tokens\";\nimport type { Theme, ThemeMode, DeepPartial } from \"./types\";\n\ninterface ThemeContextType {\n theme: Theme;\n mode: ThemeMode;\n}\n\nconst ThemeContext = createContext<ThemeContextType>({\n theme: lightTheme,\n mode: \"light\",\n});\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n return { theme: lightTheme, mode: \"light\" };\n }\n return context;\n};\n\nexport interface DatePickerThemeProviderProps {\n children: React.ReactNode;\n mode?: ThemeMode;\n customTheme?: DeepPartial<Theme>;\n}\n\nexport const DatePickerThemeProvider: React.FC<\n DatePickerThemeProviderProps\n> = ({ children, mode = \"light\", customTheme }) => {\n const baseTheme = mode === \"dark\" ? darkTheme : lightTheme;\n\n const value = useMemo<ThemeContextType>(() => {\n if (!customTheme) {\n return { theme: baseTheme, mode };\n }\n\n return {\n mode,\n theme: {\n ...baseTheme,\n ...customTheme,\n mode,\n colors: {\n ...baseTheme.colors,\n ...(customTheme.colors || {}),\n },\n radii: {\n ...baseTheme.radii,\n ...(customTheme.radii || {}),\n },\n shadows: {\n ...baseTheme.shadows,\n ...(customTheme.shadows || {}),\n },\n },\n };\n }, [baseTheme, customTheme, mode]);\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n","import React from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\n\nexport interface HeaderProps {\n year: number;\n monthName: string;\n onPrevMonth: () => void;\n onNextMonth: () => void;\n onTitleClick?: () => void;\n isPickerOpen?: boolean;\n}\n\nexport const Header: React.FC<HeaderProps> = ({\n year,\n monthName,\n onPrevMonth,\n onNextMonth,\n onTitleClick,\n isPickerOpen,\n}) => {\n const { theme } = useTheme();\n\n const arrowButtonStyle: React.CSSProperties = {\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"6px\",\n borderRadius: theme.radii.md,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: theme.colors.textPrimary,\n transition: \"all 0.15s cubic-bezier(0.4, 0, 0.2, 1)\",\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n borderBottom: `1px solid ${theme.colors.border}`,\n userSelect: \"none\",\n height: \"42px\",\n boxSizing: \"border-box\",\n }}\n >\n {/* در محیط RTL: فلش راست برای ماه قبل */}\n <button\n type=\"button\"\n onClick={onPrevMonth}\n aria-label=\"ماه قبل\"\n style={arrowButtonStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundHover;\n e.currentTarget.style.transform = \"scale(1.1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n\n {/* دکمه باز/بسته کردن انتخابگر ماه و سال */}\n <button\n type=\"button\"\n onClick={onTitleClick}\n style={{\n background: isPickerOpen\n ? theme.colors.backgroundHover\n : \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"6px 10px\",\n borderRadius: theme.radii.md,\n fontSize: \"0.9rem\",\n fontWeight: 700,\n color: theme.colors.textPrimary,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundHover;\n }}\n onMouseLeave={(e) => {\n if (!isPickerOpen)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <span>\n {monthName} {toPersianDigits(year)}\n </span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transform: isPickerOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n\n {/* در محیط RTL: فلش چپ برای ماه بعد */}\n <button\n type=\"button\"\n onClick={onNextMonth}\n aria-label=\"ماه بعد\"\n style={arrowButtonStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.backgroundHover;\n e.currentTarget.style.transform = \"scale(1.1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n </div>\n );\n};\n","import React from \"react\";\nimport type { JalaliDayOfWeek } from \"../core/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { PERSIAN_WEEK_DAYS_SHORT } from \"../core/constants\";\n\nexport interface WeekdaysProps {\n firstDayOfWeek?: JalaliDayOfWeek;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const Weekdays: React.FC<WeekdaysProps> = ({\n firstDayOfWeek = 0,\n classNames,\n styles,\n}) => {\n const orderedWeekdays = [\n ...PERSIAN_WEEK_DAYS_SHORT.slice(firstDayOfWeek),\n ...PERSIAN_WEEK_DAYS_SHORT.slice(0, firstDayOfWeek),\n ];\n\n return (\n <div\n role=\"row\"\n aria-label=\"روزهای هفته\"\n className={classNames?.weekdays}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 36px))\",\n gap: \"4px\",\n marginBottom: \"6px\",\n textAlign: \"center\",\n ...styles?.weekdays,\n }}\n >\n {orderedWeekdays.map((name, idx) => (\n <div\n key={idx}\n role=\"columnheader\"\n className={classNames?.weekdayCell}\n style={{\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"var(--pdp-text-muted, #94a3b8)\",\n userSelect: \"none\",\n ...styles?.weekdayCell,\n }}\n >\n {name}\n </div>\n ))}\n </div>\n );\n};\n","import React from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport type { JalaliDate, JalaliCalendarCell } from \"../core/types\";\nimport type { CalendarEvent } from \"../events/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface DayCellProps {\n cell?:\n | JalaliCalendarCell\n | (Partial<JalaliCalendarCell> & {\n day?: number;\n isHoliday?: boolean;\n isDisabled?: boolean;\n });\n day?: number;\n isCurrentMonth?: boolean;\n isSelected?: boolean;\n isToday?: boolean;\n isHoliday?: boolean;\n isInRange?: boolean;\n isRangeStart?: boolean;\n isRangeEnd?: boolean;\n disabled?: boolean;\n digitType?: \"persian\" | \"latin\";\n holidayTitle?: string;\n events?: CalendarEvent[];\n tabIndex?: number;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n onSelect?: (target: JalaliDate) => void;\n onHover?: (target: JalaliDate | null) => void;\n onFocus?: (target: JalaliDate) => void;\n onClick?: () => void;\n}\n\nexport const DayCell: React.FC<DayCellProps> = (props) => {\n const { theme } = useTheme();\n\n const cell = props.cell;\n const jalaliDate: JalaliDate = cell?.jalali ?? {\n year: 1403,\n month: 1,\n day: props.day ?? (cell && \"day\" in cell ? (cell as any).day : 1),\n };\n\n const dayNumber = jalaliDate.day;\n const isCurrentMonth = cell?.isCurrentMonth ?? props.isCurrentMonth ?? true;\n const isSelected = cell?.isSelected ?? props.isSelected ?? false;\n const isToday = cell?.isToday ?? props.isToday ?? false;\n const isHoliday =\n props.isHoliday ??\n (cell && \"isHoliday\" in cell ? (cell as any).isHoliday : false);\n const isInRange = cell?.isInRange ?? props.isInRange ?? false;\n const isRangeStart = cell?.isRangeStart ?? props.isRangeStart ?? false;\n const isRangeEnd = cell?.isRangeEnd ?? props.isRangeEnd ?? false;\n const disabled = cell?.isDisabled ?? props.disabled ?? false;\n\n let backgroundColor = \"transparent\";\n let textColor = isCurrentMonth\n ? theme.colors.textPrimary\n : theme.colors.textDisabled;\n\n if (isInRange && isCurrentMonth) {\n backgroundColor = theme.colors.rangeBackground;\n }\n\n if (isSelected || isRangeStart || isRangeEnd) {\n backgroundColor = theme.colors.primary;\n textColor = theme.colors.primaryText;\n } else if (isHoliday && isCurrentMonth) {\n textColor = theme.colors.holiday;\n }\n\n const handleClick = () => {\n if (disabled || !isCurrentMonth) return;\n if (props.onClick) props.onClick();\n if (props.onSelect) props.onSelect(jalaliDate);\n };\n\n return (\n <button\n type=\"button\"\n tabIndex={props.tabIndex ?? 0}\n disabled={disabled || !isCurrentMonth}\n onClick={handleClick}\n onFocus={() => props.onFocus?.(jalaliDate)}\n style={{\n width: \"36px\",\n height: \"36px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border:\n isToday && !isSelected && !isRangeStart && !isRangeEnd\n ? `1.5px solid ${theme.colors.todayBorder}`\n : \"none\",\n borderRadius:\n isRangeStart || isRangeEnd || isSelected\n ? theme.radii.md\n : isInRange\n ? \"0px\"\n : theme.radii.md,\n backgroundColor,\n color: textColor,\n cursor: disabled || !isCurrentMonth ? \"default\" : \"pointer\",\n fontSize: \"0.85rem\",\n fontWeight: isSelected || isToday ? 700 : 500,\n transition: \"all 0.15s cubic-bezier(0.4, 0, 0.2, 1)\",\n opacity: !isCurrentMonth ? 0.3 : 1,\n outline: \"none\",\n ...props.styles?.dayCell,\n }}\n onMouseEnter={(e) => {\n props.onHover?.(jalaliDate);\n if (\n isCurrentMonth &&\n !disabled &&\n !isSelected &&\n !isRangeStart &&\n !isRangeEnd\n ) {\n e.currentTarget.style.backgroundColor = isHoliday\n ? theme.colors.holidayBackground\n : theme.colors.backgroundHover;\n e.currentTarget.style.transform = \"scale(1.08)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected && !isRangeStart && !isRangeEnd) {\n e.currentTarget.style.backgroundColor = isInRange\n ? theme.colors.rangeBackground\n : \"transparent\";\n e.currentTarget.style.transform = \"scale(1)\";\n }\n }}\n >\n {props.digitType === \"latin\" ? dayNumber : toPersianDigits(dayNumber)}\n </button>\n );\n};\n","import React, { useRef, useEffect } from \"react\";\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\n\nexport interface MonthYearPickerProps {\n currentYear: number;\n currentMonth: number;\n onSelectMonth: (month: number) => void;\n onSelectYear: (year: number) => void;\n}\n\nexport const MonthYearPicker: React.FC<MonthYearPickerProps> = ({\n currentYear,\n currentMonth,\n onSelectMonth,\n onSelectYear,\n}) => {\n const { theme } = useTheme();\n const selectedYearRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n if (selectedYearRef.current) {\n selectedYearRef.current.scrollIntoView({\n behavior: \"smooth\",\n inline: \"center\",\n block: \"nearest\",\n });\n }\n }, [currentYear]);\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n padding: \"12px\",\n width: \"100%\",\n height: \"280px\",\n boxSizing: \"border-box\",\n justifyContent: \"space-between\",\n }}\n >\n {/* اسکرول افقی سال‌ها */}\n <div\n style={{\n display: \"flex\",\n gap: \"6px\",\n overflowX: \"auto\",\n paddingBottom: \"4px\",\n scrollbarWidth: \"none\",\n }}\n >\n {Array.from({ length: 35 }, (_, i) => currentYear - 17 + i).map(\n (year) => {\n const isSelected = year === currentYear;\n return (\n <button\n key={year}\n ref={isSelected ? selectedYearRef : undefined}\n type=\"button\"\n onClick={() => onSelectYear(year)}\n style={{\n padding: \"6px 12px\",\n borderRadius: theme.radii.md,\n border: \"none\",\n background: isSelected ? theme.colors.primary : \"transparent\",\n color: isSelected\n ? theme.colors.primaryText\n : theme.colors.textPrimary,\n cursor: \"pointer\",\n fontWeight: isSelected ? 700 : 500,\n fontSize: \"0.85rem\",\n whiteSpace: \"nowrap\",\n transition: \"all 0.15s ease\",\n flexShrink: 0,\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundHover;\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n {toPersianDigits(year)}\n </button>\n );\n },\n )}\n </div>\n\n {/* ماتریس ۳ در ۴ ماه‌های سال */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gridTemplateRows: \"repeat(4, 1fr)\",\n gap: \"8px\",\n flex: 1,\n }}\n >\n {PERSIAN_MONTH_NAMES.map((name, index) => {\n const isSelected = index + 1 === currentMonth;\n return (\n <button\n key={name}\n type=\"button\"\n onClick={() => onSelectMonth(index + 1)}\n style={{\n borderRadius: theme.radii.md,\n border: \"none\",\n background: isSelected\n ? theme.colors.primary\n : theme.colors.surface,\n color: isSelected\n ? theme.colors.primaryText\n : theme.colors.textPrimary,\n cursor: \"pointer\",\n fontWeight: isSelected ? 700 : 500,\n fontSize: \"0.85rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundHover;\n e.currentTarget.style.transform = \"translateY(-1px)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = theme.colors.surface;\n e.currentTarget.style.transform = \"translateY(0)\";\n }\n }}\n >\n {name}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n","// src/components/footer/CalendarFooter.tsx\nimport React from \"react\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\n\nexport interface CalendarFooterProps {\n onTodayClick?: () => void;\n onClearClick?: () => void;\n showClear?: boolean;\n mode?: any;\n digitType?: \"persian\" | \"latin\";\n showStatusText?: boolean;\n showActions?: boolean;\n selectedDate?: any;\n selectedRange?: any;\n styles?: any;\n [key: string]: any;\n}\n\nexport const CalendarFooter: React.FC<CalendarFooterProps> = ({\n onTodayClick,\n onClearClick,\n showClear = true,\n}) => {\n const { theme } = useTheme();\n\n const buttonStyle: React.CSSProperties = {\n padding: \"6px 14px\",\n borderRadius: theme.radii.md,\n border: `1px solid ${theme.colors.border}`,\n background: \"transparent\",\n color: theme.colors.textPrimary,\n fontSize: \"0.8rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 12px\",\n borderTop: `1px solid ${theme.colors.border}`,\n marginTop: \"6px\",\n }}\n >\n {onTodayClick && (\n <button\n type=\"button\"\n onClick={onTodayClick}\n style={{\n ...buttonStyle,\n borderColor: theme.colors.primary,\n color: theme.colors.primary,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundHover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n برو به امروز\n </button>\n )}\n\n {showClear && onClearClick && (\n <button\n type=\"button\"\n onClick={onClearClick}\n style={buttonStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundHover;\n e.currentTarget.style.color = theme.colors.holiday;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.color = theme.colors.textPrimary;\n }}\n >\n پاک کردن\n </button>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport type { JalaliTime } from \"./types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../../theme/style-slots\";\n\nexport interface TimePickerProps {\n value?: JalaliTime;\n hours?: number;\n minutes?: number;\n seconds?: number;\n hour?: number;\n minute?: number;\n second?: number;\n minuteStep?: number;\n hourStep?: number;\n showSeconds?: boolean;\n digitType?: \"persian\" | \"latin\";\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n onChange: (time: JalaliTime) => void;\n}\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n hours,\n minutes,\n seconds,\n hour = value?.hour ?? hours ?? 0,\n minute = value?.minute ?? minutes ?? 0,\n second = value?.second ?? seconds ?? 0,\n minuteStep = 1,\n hourStep = 1,\n showSeconds = false,\n onChange,\n}) => {\n const { theme } = useTheme();\n\n const handleHourChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ hour: parseInt(e.target.value, 10), minute, second });\n };\n\n const handleMinuteChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ hour, minute: parseInt(e.target.value, 10), second });\n };\n\n const handleSecondChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ hour, minute, second: parseInt(e.target.value, 10) });\n };\n\n const selectStyle: React.CSSProperties = {\n background: theme.colors.surface,\n color: theme.colors.textPrimary,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radii.sm,\n padding: \"4px 6px\",\n fontSize: \"0.85rem\",\n fontWeight: 600,\n outline: \"none\",\n cursor: \"pointer\",\n direction: \"ltr\",\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"6px\",\n padding: \"8px 12px\",\n borderTop: `1px solid ${theme.colors.border}`,\n direction: \"ltr\",\n }}\n >\n <span\n style={{\n fontSize: \"0.8rem\",\n color: theme.colors.textSecondary,\n marginRight: \"4px\",\n }}\n >\n زمان:\n </span>\n\n <select value={hour} onChange={handleHourChange} style={selectStyle}>\n {Array.from(\n { length: Math.ceil(24 / hourStep) },\n (_, i) => i * hourStep,\n ).map((h) => (\n <option key={h} value={h}>\n {String(h).padStart(2, \"0\")}\n </option>\n ))}\n </select>\n\n <span style={{ color: theme.colors.textSecondary, fontWeight: 700 }}>\n :\n </span>\n\n <select value={minute} onChange={handleMinuteChange} style={selectStyle}>\n {Array.from(\n { length: Math.ceil(60 / minuteStep) },\n (_, i) => i * minuteStep,\n ).map((m) => (\n <option key={m} value={m}>\n {String(m).padStart(2, \"0\")}\n </option>\n ))}\n </select>\n\n {showSeconds && (\n <>\n <span style={{ color: theme.colors.textSecondary, fontWeight: 700 }}>\n :\n </span>\n <select\n value={second}\n onChange={handleSecondChange}\n style={selectStyle}\n >\n {Array.from({ length: 60 }, (_, i) => (\n <option key={i} value={i}>\n {String(i).padStart(2, \"0\")}\n </option>\n ))}\n </select>\n </>\n )}\n </div>\n );\n};\n","import type { JalaliTime } from \"./types\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\n\n/**\n * Formats a single time segment (e.g. hour/minute) as a 2-digit padded string.\n */\nexport function formatTimeSegment(\n val: number,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n const padded = val < 10 ? `0${val}` : `${val}`;\n return digitType === \"persian\" ? toPersianDigits(padded) : padded;\n}\n\n/**\n * Retrieves the current local machine time as a JalaliTime structure.\n */\nexport function getCurrentTime(): JalaliTime {\n const now = new Date();\n return {\n hour: now.getHours(),\n minute: now.getMinutes(),\n second: now.getSeconds(),\n };\n}\n\n/**\n * Clamps hour, minute, and second within valid boundary ranges.\n */\nexport function clampTime(time: JalaliTime): JalaliTime {\n return {\n hour: Math.max(0, Math.min(23, time.hour)),\n minute: Math.max(0, Math.min(59, time.minute)),\n second:\n time.second !== undefined\n ? Math.max(0, Math.min(59, time.second))\n : undefined,\n };\n}\n\n/**\n * Formats a JalaliTime object into a display string (e.g., \"14:30\" or \"۱۴:۳۰\").\n */\nexport function formatTimeString(\n time: JalaliTime | null | undefined,\n showSeconds = false,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n if (!time) return \"\";\n const h = formatTimeSegment(time.hour, digitType);\n const m = formatTimeSegment(time.minute, digitType);\n if (showSeconds && time.second !== undefined) {\n const s = formatTimeSegment(time.second, digitType);\n return `${h}:${m}:${s}`;\n }\n return `${h}:${m}`;\n}\n","import type { JalaliDate, JalaliMonthIndex } from \"../../core/types\";\nimport type { DateParseResult } from \"./types\";\nimport {\n toLatinDigits,\n toPersianDigits,\n} from \"../../formatters/persian-digits\";\nimport { getDaysInJalaliMonth } from \"../../core/jalali-math\";\nimport { compareJalaliDates } from \"../../core/jalali-helpers\";\n\n/**\n * Strips all non-digit characters and applies the 'YYYY/MM/DD' mask structure.\n */\nexport function applyDateMask(\n rawInput: string,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n // Normalize all Persian/Arabic digits to ASCII 0-9\n const cleanDigits = toLatinDigits(rawInput).replace(/\\D/g, \"\").slice(0, 8);\n\n let masked = \"\";\n if (cleanDigits.length > 0) {\n masked = cleanDigits.slice(0, 4); // Year (YYYY)\n }\n if (cleanDigits.length >= 5) {\n masked += `/${cleanDigits.slice(4, 6)}`; // Month (MM)\n }\n if (cleanDigits.length >= 7) {\n masked += `/${cleanDigits.slice(6, 8)}`; // Day (DD)\n }\n\n return digitType === \"persian\" ? toPersianDigits(masked) : masked;\n}\n\n/**\n * Validates and parses a masked string into a valid JalaliDate object.\n */\nexport function parseAndValidateJalaliString(\n input: string,\n minDate?: JalaliDate,\n maxDate?: JalaliDate,\n isDateDisabled?: (date: JalaliDate) => boolean,\n): DateParseResult {\n const normalized = toLatinDigits(input).trim();\n\n if (!normalized) {\n return { isValid: true, date: null };\n }\n\n const parts = normalized.split(\"/\");\n if (\n parts.length !== 3 ||\n parts[0].length !== 4 ||\n parts[1].length !== 2 ||\n parts[2].length !== 2\n ) {\n return { isValid: false, date: null, error: \"INVALID_FORMAT\" };\n }\n\n const year = parseInt(parts[0], 10);\n const monthNum = parseInt(parts[1], 10);\n const day = parseInt(parts[2], 10);\n\n // Validate Month Range (1 to 12)\n if (monthNum < 1 || monthNum > 12) {\n return { isValid: false, date: null, error: \"INVALID_MONTH\" };\n }\n\n const monthIndex = (monthNum - 1) as JalaliMonthIndex;\n const maxDays = getDaysInJalaliMonth(year, monthIndex);\n\n // Validate Day Range (1 to 29/30/31 based on month & leap year)\n if (day < 1 || day > maxDays) {\n return { isValid: false, date: null, error: \"INVALID_DAY\" };\n }\n\n const jalaliDate: JalaliDate = { year, month: monthIndex, day };\n\n // Min / Max range validations\n if (minDate && compareJalaliDates(jalaliDate, minDate) < 0) {\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MIN_BOUNDS\" };\n }\n\n if (maxDate && compareJalaliDates(jalaliDate, maxDate) > 0) {\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MAX_BOUNDS\" };\n }\n\n // Custom disable rule\n if (isDateDisabled && isDateDisabled(jalaliDate)) {\n return { isValid: false, date: jalaliDate, error: \"DISABLED_DATE\" };\n }\n\n return { isValid: true, date: jalaliDate };\n}\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { MaskedDateInputProps, DateValidationError } from \"./types\";\nimport { applyDateMask, parseAndValidateJalaliString } from \"./mask-utils\";\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\nimport type { JalaliDate } from \"../../core/types\";\n\nexport const MaskedDateInput: React.FC<MaskedDateInputProps> = ({\n value,\n defaultValue = null,\n onChange,\n onValidationError,\n digitType = \"persian\",\n minDate,\n maxDate,\n isDateDisabled,\n clearable = true,\n placeholder = \"۱۴۰۵/۰۱/۱۵\",\n disabled = false,\n style,\n ...restProps\n}) => {\n const [internalValue, setInternalValue] = useState<JalaliDate | null>(\n defaultValue,\n );\n const activeDate = value !== undefined ? value : internalValue;\n\n const [text, setText] = useState<string>(() => {\n return activeDate\n ? formatJalaliDate(activeDate, \"YYYY/MM/DD\", { digitType })\n : \"\";\n });\n\n const [hasError, setHasError] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Sync text input with incoming controlled value updates\n useEffect(() => {\n if (value !== undefined) {\n setText(\n value ? formatJalaliDate(value, \"YYYY/MM/DD\", { digitType }) : \"\",\n );\n setHasError(false);\n }\n }, [value, digitType]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawVal = e.target.value;\n const maskedVal = applyDateMask(rawVal, digitType);\n setText(maskedVal);\n\n // Validate only if complete date is typed (10 chars: YYYY/MM/DD) or empty\n if (maskedVal.length === 10 || maskedVal.length === 0) {\n const result = parseAndValidateJalaliString(\n maskedVal,\n minDate,\n maxDate,\n isDateDisabled,\n );\n\n if (result.isValid) {\n setHasError(false);\n onValidationError?.(null);\n if (value === undefined) {\n setInternalValue(result.date);\n }\n onChange?.(result.date);\n } else {\n setHasError(true);\n onValidationError?.(result.error as DateValidationError);\n }\n } else {\n // Incomplete state\n setHasError(false);\n onValidationError?.(null);\n }\n };\n\n const handleClear = useCallback(() => {\n setText(\"\");\n setHasError(false);\n onValidationError?.(null);\n if (value === undefined) {\n setInternalValue(null);\n }\n onChange?.(null);\n inputRef.current?.focus();\n }, [value, onChange, onValidationError]);\n\n return (\n <div\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n direction: \"rtl\",\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n disabled={disabled}\n placeholder={digitType === \"persian\" ? placeholder : \"1405/01/15\"}\n value={text}\n onChange={handleInputChange}\n style={{\n width: \"180px\",\n padding: \"8px 12px\",\n paddingLeft: clearable && text ? \"32px\" : \"12px\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n border: `1px solid ${hasError ? \"#ef4444\" : \"var(--pdp-surface-border, #e2e8f0)\"}`,\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n outline: \"none\",\n textAlign: \"center\",\n letterSpacing: \"1px\",\n transition: \"border-color 0.15s ease\",\n ...style,\n }}\n {...restProps}\n />\n\n {/* Clear Button */}\n {clearable && text && !disabled && (\n <button\n type=\"button\"\n aria-label=\"پاک کردن\"\n onClick={handleClear}\n style={{\n position: \"absolute\",\n left: \"8px\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--pdp-text-muted, #94a3b8)\",\n fontSize: \"14px\",\n lineHeight: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2px\",\n }}\n >\n ✕\n </button>\n )}\n </div>\n );\n};\n","import type { JalaliDate } from \"../core/types\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { CalendarEvent } from \"./types\";\n\n/**\n * Filters and returns all events matching a specific Jalali date.\n */\nexport function getEventsForDate(\n date: JalaliDate,\n events?: CalendarEvent[],\n): CalendarEvent[] {\n if (!events || events.length === 0) return [];\n return events.filter((e) => isSameJalaliDay(e.date, date));\n}\n","import type { JalaliDate } from \"../core/types\";\nimport type { OfficialHoliday, CustomHolidayRule } from \"./types\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\n\n/**\n * Fixed Solar Calendar Holidays in Iran:\n * Key format: `${monthIndex}-${day}` (Month index is 0-based: 0 = Farvardin, 11 = Esfand)\n */\nconst FIXED_SOLAR_HOLIDAYS: Record<string, string> = {\n \"0-1\": \"جشن نوروز / سال نو\",\n \"0-2\": \"عید نوروز\",\n \"0-3\": \"عید نوروز\",\n \"0-4\": \"عید نوروز\",\n \"0-12\": \"روز جمهوری اسلامی ایران\",\n \"0-13\": \"روز طبیعت (سیزده‌بدر)\",\n \"2-14\": \"رحلت امام خمینی\",\n \"2-15\": \"قیام ۱۵ خرداد\",\n \"10-22\": \"پیروزی انقلاب اسلامی\",\n \"11-29\": \"روز ملی شدن صنعت نفت\",\n};\n\n/**\n * Checks if a given Jalali date is Friday (جمعه).\n */\nexport function isJalaliFriday(date: JalaliDate): boolean {\n const g = jalaliToGregorian(date.year, date.month, date.day);\n return g.getDay() === 5; // In JS Date.getDay(), 5 represents Friday\n}\n\n/**\n * Resolves holiday info for a JalaliDate based purely on solar calendar rules and custom overrides.\n */\nexport function getOfficialHoliday(\n date: JalaliDate,\n customHolidays?: CustomHolidayRule[],\n): OfficialHoliday | null {\n // 1. Check Custom User-Defined Holidays\n if (customHolidays && customHolidays.length > 0) {\n const custom = customHolidays.find(\n (h) =>\n h.date.year === date.year &&\n h.date.month === date.month &&\n h.date.day === date.day,\n );\n if (custom) {\n return {\n title: custom.title,\n type: \"custom\",\n isOff: custom.isOff ?? true,\n };\n }\n }\n\n // 2. Check Fixed Solar Holidays (O(1) Hash Map Lookup)\n const solarKey = `${date.month}-${date.day}`;\n if (FIXED_SOLAR_HOLIDAYS[solarKey]) {\n return {\n title: FIXED_SOLAR_HOLIDAYS[solarKey],\n type: \"solar\",\n isOff: true,\n };\n }\n\n // 3. Check Friday (End of Week)\n if (isJalaliFriday(date)) {\n return { title: \"جمعه (تعطیل پایان هفته)\", type: \"solar\", isOff: true };\n }\n\n return null;\n}\n","import React, {\n useState,\n useRef,\n useCallback,\n useMemo,\n useEffect,\n} from \"react\";\nimport { useJalaliDatePicker } from \"../hooks/useJalaliDatePicker\";\nimport { useCalendarKeyboard } from \"../a11y/useCalendarKeyboard\";\nimport type {\n SelectionMode,\n JalaliDateRange,\n InternalSelectedValue,\n SelectedDateValue,\n DateRange,\n} from \"../hooks/types\";\nimport { Header } from \"./Header\";\nimport { Weekdays } from \"./Weekdays\";\nimport { DayCell } from \"./DayCell\";\nimport { MonthYearPicker } from \"./MonthYearPicker\";\nimport type {\n JalaliDate,\n JalaliMonthIndex,\n JalaliCalendarCell,\n} from \"../core/types\";\nimport { formatJalaliDate } from \"../formatters/jalali-formatter\";\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport { CalendarFooter } from \"./footer/CalendarFooter\";\nimport { TimePicker } from \"../plugins/time-picker/TimePicker\";\nimport type { JalaliTime } from \"../plugins/time-picker/types\";\nimport {\n formatTimeString,\n getCurrentTime,\n} from \"../plugins/time-picker/time-utils\";\nimport { MaskedDateInput } from \"./masked-input/MaskedDateInput\";\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\nimport {\n isJalaliDateBetween,\n jsDateToJalali,\n jalaliToJsDate,\n} from \"../core/jalali-helpers\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { CalendarEvent } from \"../events/types\";\nimport { getEventsForDate } from \"../events/event-utils\";\nimport { getOfficialHoliday } from \"../holidays\";\nimport type { CustomHolidayRule } from \"../holidays/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface JalaliDatePickerProps<M extends SelectionMode = \"single\"> {\n /** حالت انتخاب تاریخ: single | range | multiple */\n mode?: M;\n /** مقدار تاریخ کنترل‌شده (شیء Date جاوااسکریپت) */\n value?: SelectedDateValue<M>;\n /** مقدار اولیه غیرکنترل‌شده (شیء Date جاوااسکریپت) */\n defaultValue?: SelectedDateValue<M>;\n /** خروجی انتخاب تاریخ (شیء Date جاوااسکریپت) */\n onChange?: (val: SelectedDateValue<M>) => void;\n\n /** حداقل تاریخ مجاز */\n minDate?: Date;\n /** حداکثر تاریخ مجاز */\n maxDate?: Date;\n /** غیرفعال‌سازی روزها بر اساس شرط */\n isDateDisabled?: (date: Date) => boolean;\n\n /** نوع ارقام: persian یا latin */\n digitType?: \"persian\" | \"latin\";\n /** نوع نمایش: inline | popover | modal */\n variant?: \"inline\" | \"popover\" | \"modal\";\n /** متن Placeholder */\n placeholder?: string;\n /** شروع هفته (۰ = شنبه) */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n // استایل‌دهی\n className?: string;\n style?: React.CSSProperties;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n\n // فوتر\n showFooter?: boolean;\n showStatusText?: boolean;\n showActions?: boolean;\n onConfirm?: () => void;\n\n // زمان\n enableTime?: boolean;\n timeValue?: JalaliTime | null;\n defaultTimeValue?: JalaliTime;\n onTimeChange?: (time: JalaliTime) => void;\n minuteStep?: number;\n hourStep?: number;\n showSeconds?: boolean;\n\n // تقویم دو ماهه و اینپوت ماسک‌دار\n numberOfMonths?: 1 | 2;\n useMaskedInput?: boolean;\n\n // رویدادها و تعطیلات\n events?: CalendarEvent[];\n showHolidays?: boolean;\n customHolidays?: CustomHolidayRule[];\n}\n\nexport function JalaliDatePicker<M extends SelectionMode = \"single\">({\n mode = \"single\" as M,\n value,\n defaultValue,\n onChange,\n minDate,\n maxDate,\n isDateDisabled,\n firstDayOfWeek = 0,\n variant = \"inline\",\n placeholder = \"انتخاب تاریخ...\",\n digitType = \"persian\",\n className,\n style,\n classNames,\n styles,\n showFooter = false,\n showStatusText = true,\n showActions = true,\n onConfirm,\n enableTime = false,\n timeValue,\n defaultTimeValue,\n onTimeChange,\n minuteStep = 1,\n hourStep = 1,\n showSeconds = false,\n numberOfMonths = 1,\n useMaskedInput = false,\n events,\n showHolidays = false,\n customHolidays,\n}: JalaliDatePickerProps<M>) {\n const [isOpen, setIsOpen] = useState(variant === \"inline\");\n const [showMonthYearPicker, setShowMonthYearPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const isModal = variant === \"modal\";\n\n // ۱. تبدیل ورودی‌های Date به JalaliDate برای هوک داخلی\n const internalJalaliValue = useMemo<\n InternalSelectedValue<M> | undefined\n >(() => {\n if (value === undefined) return undefined;\n if (!value) return null as InternalSelectedValue<M>;\n if (value instanceof Date) {\n return jsDateToJalali(value) as InternalSelectedValue<M>;\n }\n if (Array.isArray(value)) {\n if (mode === \"range\") {\n const [start, end] = value as DateRange;\n return [\n start ? jsDateToJalali(start) : null,\n end ? jsDateToJalali(end) : null,\n ] as InternalSelectedValue<M>;\n }\n if (mode === \"multiple\") {\n return (value as Date[]).map((d) =>\n jsDateToJalali(d),\n ) as InternalSelectedValue<M>;\n }\n }\n return null as InternalSelectedValue<M>;\n }, [value, mode]);\n\n const internalDefaultJalaliValue = useMemo<\n InternalSelectedValue<M> | undefined\n >(() => {\n if (defaultValue === undefined) return undefined;\n if (!defaultValue) return null as InternalSelectedValue<M>;\n if (defaultValue instanceof Date) {\n return jsDateToJalali(defaultValue) as InternalSelectedValue<M>;\n }\n if (Array.isArray(defaultValue)) {\n if (mode === \"range\") {\n const [start, end] = defaultValue as DateRange;\n return [\n start ? jsDateToJalali(start) : null,\n end ? jsDateToJalali(end) : null,\n ] as InternalSelectedValue<M>;\n }\n if (mode === \"multiple\") {\n return (defaultValue as Date[]).map((d) =>\n jsDateToJalali(d),\n ) as InternalSelectedValue<M>;\n }\n }\n return null as InternalSelectedValue<M>;\n }, [defaultValue, mode]);\n\n const internalMinDate = useMemo(\n () => (minDate ? jsDateToJalali(minDate) : undefined),\n [minDate],\n );\n const internalMaxDate = useMemo(\n () => (maxDate ? jsDateToJalali(maxDate) : undefined),\n [maxDate],\n );\n\n // ۲. مدیریت زمان\n const [internalTime, setInternalTime] = useState<JalaliTime>(\n () => defaultTimeValue ?? getCurrentTime(),\n );\n const activeTime =\n timeValue !== undefined ? (timeValue ?? getCurrentTime()) : internalTime;\n\n const handleTimeChange = useCallback(\n (newTime: JalaliTime) => {\n if (timeValue === undefined) setInternalTime(newTime);\n onTimeChange?.(newTime);\n },\n [timeValue, onTimeChange],\n );\n\n // ۳. تبدیل خروجی JalaliDate به Date استاندارد JS\n const convertJalaliToDateOutput = useCallback(\n (jVal: InternalSelectedValue<M>): SelectedDateValue<M> => {\n if (!jVal) return null as SelectedDateValue<M>;\n\n const h = enableTime ? activeTime.hour : 0;\n const m = enableTime ? activeTime.minute : 0;\n const s = enableTime && showSeconds ? (activeTime.second ?? 0) : 0;\n\n if (mode === \"single\" && !Array.isArray(jVal)) {\n return jalaliToJsDate(\n jVal as JalaliDate,\n h,\n m,\n s,\n ) as SelectedDateValue<M>;\n }\n\n if (mode === \"range\" && Array.isArray(jVal)) {\n const [start, end] = jVal as JalaliDateRange;\n return [\n start ? jalaliToJsDate(start, 0, 0, 0) : null,\n end ? jalaliToJsDate(end, 23, 59, 59) : null,\n ] as SelectedDateValue<M>;\n }\n\n if (mode === \"multiple\" && Array.isArray(jVal)) {\n return (jVal as JalaliDate[]).map((d) =>\n jalaliToJsDate(d, h, m, s),\n ) as SelectedDateValue<M>;\n }\n\n return null as SelectedDateValue<M>;\n },\n [mode, enableTime, activeTime, showSeconds],\n );\n\n // ۴. اتصال به هوک هسته\n const {\n selected,\n viewYear,\n viewMonth,\n grid,\n goToPrevMonth,\n goToNextMonth,\n setView,\n goToToday,\n selectDate,\n setHoverDate,\n hoverDate,\n clear,\n } = useJalaliDatePicker({\n mode,\n value: internalJalaliValue,\n defaultValue: internalDefaultJalaliValue,\n minDate: internalMinDate,\n maxDate: internalMaxDate,\n firstDayOfWeek,\n isDateDisabled: isDateDisabled\n ? (jDate: JalaliDate) => isDateDisabled(jalaliToJsDate(jDate))\n : undefined,\n onChange: (val) => {\n onChange?.(convertJalaliToDateOutput(val));\n },\n });\n\n const singleSelectedDate =\n mode === \"single\" ? (selected as JalaliDate | null) : null;\n\n const handleDateSelect = (d: JalaliDate) => {\n selectDate(d);\n if (variant === \"popover\" && mode === \"single\" && !enableTime) {\n setIsOpen(false);\n }\n };\n\n // کیبورد\n const { handleKeyDown, getCellTabIndex, setFocusedDate } =\n useCalendarKeyboard({\n viewYear,\n viewMonth,\n selectedDate: singleSelectedDate,\n onSelectDate: handleDateSelect,\n onViewChange: setView,\n isRtl: true,\n });\n\n // بستن مدال با Esc\n useEffect(() => {\n if (!isModal || !isOpen) return;\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n\n window.addEventListener(\"keydown\", handleGlobalKeyDown);\n return () => {\n document.body.style.overflow = originalOverflow;\n window.removeEventListener(\"keydown\", handleGlobalKeyDown);\n };\n }, [isModal, isOpen]);\n\n // محاسبات تقویم دو ماهه\n const nextMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewMonth === 11) return { year: viewYear + 1, month: 0 };\n return { year: viewYear, month: (viewMonth + 1) as JalaliMonthIndex };\n }, [viewYear, viewMonth]);\n\n const secondGrid = useMemo<JalaliCalendarCell[]>(() => {\n if (numberOfMonths !== 2) return [];\n\n const rawGrid = generateJalaliCalendarGrid({\n year: nextMonthState.year,\n month: nextMonthState.month,\n firstDayOfWeek,\n minDate: internalMinDate,\n maxDate: internalMaxDate,\n });\n\n if (mode !== \"range\") return rawGrid;\n\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n }, [\n numberOfMonths,\n nextMonthState,\n firstDayOfWeek,\n internalMinDate,\n internalMaxDate,\n mode,\n selected,\n hoverDate,\n ]);\n\n // متن نمایشی اینپوت\n const formattedInputValue = useMemo(() => {\n if (!selected) return \"\";\n if (mode === \"single\") {\n const datePart = formatJalaliDate(selected as JalaliDate, \"YYYY/MM/DD\", {\n digitType,\n });\n if (enableTime && activeTime) {\n const timePart = formatTimeString(activeTime, showSeconds, digitType);\n return `${datePart} ${timePart}`;\n }\n return datePart;\n }\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n if (start && end) {\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ${formatJalaliDate(end, \"YYYY/MM/DD\", { digitType })}`;\n }\n if (start) return formatJalaliDate(start, \"YYYY/MM/DD\", { digitType });\n }\n return \"\";\n }, [selected, mode, digitType, enableTime, activeTime, showSeconds]);\n\n const renderCalendarPane = (\n y: number,\n m: JalaliMonthIndex,\n paneGrid: JalaliCalendarCell[],\n showPrevArrow = true,\n showNextArrow = true,\n ) => (\n <div style={{ minWidth: \"270px\" }}>\n <Header\n year={y}\n monthName={PERSIAN_MONTH_NAMES[m]}\n onPrevMonth={showPrevArrow ? goToPrevMonth : () => {}}\n onNextMonth={showNextArrow ? goToNextMonth : () => {}}\n onTitleClick={() => setShowMonthYearPicker((prev) => !prev)}\n isPickerOpen={showMonthYearPicker}\n />\n\n <Weekdays\n firstDayOfWeek={firstDayOfWeek}\n classNames={classNames}\n styles={styles}\n />\n\n <div\n role=\"grid\"\n aria-label={`${PERSIAN_MONTH_NAMES[m]} ${toPersianDigits(y)}`}\n className={classNames?.grid}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 36px))\",\n gap: \"4px\",\n ...styles?.grid,\n }}\n >\n {paneGrid.map((cell, index) => {\n const holidayInfo = showHolidays\n ? getOfficialHoliday(cell.jalali, customHolidays)\n : null;\n const dayEvents = getEventsForDate(cell.jalali, events);\n\n return (\n <DayCell\n key={index}\n cell={cell}\n digitType={digitType}\n isHoliday={Boolean(holidayInfo)}\n holidayTitle={holidayInfo?.title}\n events={dayEvents}\n classNames={classNames}\n styles={styles}\n tabIndex={getCellTabIndex(cell.jalali)}\n onSelect={handleDateSelect}\n onHover={setHoverDate}\n onFocus={setFocusedDate}\n />\n );\n })}\n </div>\n </div>\n );\n\n const calendarContent = (\n <div\n role={isModal ? \"dialog\" : \"region\"}\n aria-modal={isModal ? true : undefined}\n aria-label=\"تقویم شمسی\"\n onKeyDown={handleKeyDown}\n onClick={(e) => isModal && e.stopPropagation()}\n className={classNames?.calendar}\n style={{\n position:\n variant === \"popover\" ? \"absolute\" : isModal ? \"relative\" : \"static\",\n top: variant === \"popover\" ? \"calc(100% + 4px)\" : undefined,\n right: variant === \"popover\" ? 0 : undefined,\n zIndex: isModal ? 1001 : 50,\n padding: \"16px\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n borderRadius: \"var(--pdp-border-radius, 12px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n boxShadow: isModal\n ? \"0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.3)\"\n : \"var(--pdp-shadow)\",\n width: \"fit-content\",\n userSelect: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n ...styles?.calendar,\n }}\n >\n {isModal && (\n <button\n type=\"button\"\n aria-label=\"بستن\"\n onClick={() => setIsOpen(false)}\n style={{\n position: \"absolute\",\n top: \"10px\",\n left: \"10px\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"16px\",\n color: \"var(--pdp-text-muted, #94a3b8)\",\n lineHeight: 1,\n zIndex: 10,\n }}\n >\n ✕\n </button>\n )}\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\n {showMonthYearPicker ? (\n <MonthYearPicker\n currentYear={viewYear}\n currentMonth={viewMonth}\n onSelectMonth={(m) => {\n setView(viewYear, m as JalaliMonthIndex);\n setShowMonthYearPicker(false);\n }}\n onSelectYear={(y) => setView(y, viewMonth)}\n />\n ) : (\n <>\n <div\n style={{\n display: \"flex\",\n gap: \"16px\",\n alignItems: \"flex-start\",\n }}\n >\n {renderCalendarPane(\n viewYear,\n viewMonth,\n grid,\n true,\n numberOfMonths === 1,\n )}\n\n {numberOfMonths === 2 && (\n <>\n <div\n style={{\n width: \"1px\",\n backgroundColor: \"var(--pdp-surface-border, #e2e8f0)\",\n alignSelf: \"stretch\",\n }}\n />\n {renderCalendarPane(\n nextMonthState.year,\n nextMonthState.month,\n secondGrid,\n false,\n true,\n )}\n </>\n )}\n </div>\n\n {enableTime && (\n <TimePicker\n value={activeTime}\n onChange={handleTimeChange}\n minuteStep={minuteStep}\n hourStep={hourStep}\n showSeconds={showSeconds}\n digitType={digitType}\n classNames={classNames}\n styles={styles}\n />\n )}\n\n {showFooter && (\n <CalendarFooter\n mode={mode}\n digitType={digitType}\n showStatusText={showStatusText}\n showActions={showActions}\n selectedDate={\n mode === \"single\" ? (selected as JalaliDate | null) : null\n }\n selectedRange={\n mode === \"range\" ? (selected as JalaliDateRange) : undefined\n }\n selectedDates={\n mode === \"multiple\" ? (selected as JalaliDate[]) : undefined\n }\n selectedTime={enableTime ? activeTime : undefined}\n onToday={goToToday}\n onClear={clear}\n onConfirm={() => {\n if (variant !== \"inline\") setIsOpen(false);\n onConfirm?.();\n }}\n classNames={classNames}\n styles={styles}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={className ?? classNames?.root}\n style={{\n position: \"relative\",\n display: \"inline-block\",\n ...style,\n ...styles?.root,\n }}\n >\n {variant !== \"inline\" &&\n (useMaskedInput && mode === \"single\" && variant === \"popover\" ? (\n <MaskedDateInput\n value={singleSelectedDate}\n digitType={digitType}\n placeholder={placeholder}\n onChange={(d) => {\n if (d) {\n selectDate(d);\n setView(d.year, d.month);\n } else {\n clear();\n }\n }}\n onClick={() => setIsOpen(true)}\n className={classNames?.input}\n style={styles?.input}\n />\n ) : (\n <input\n type=\"text\"\n readOnly\n placeholder={placeholder}\n value={formattedInputValue}\n onClick={() => setIsOpen(true)}\n className={classNames?.input}\n style={{\n padding: \"8px 12px\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n textAlign: \"right\",\n direction: \"rtl\",\n fontSize: \"14px\",\n minWidth: enableTime\n ? \"200px\"\n : numberOfMonths === 2\n ? \"240px\"\n : \"150px\",\n ...styles?.input,\n }}\n />\n ))}\n\n {isOpen &&\n (isModal ? (\n <div\n role=\"presentation\"\n onClick={() => setIsOpen(false)}\n className={classNames?.modalBackdrop}\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(15, 23, 42, 0.6)\",\n backdropFilter: \"blur(4px)\",\n zIndex: 1000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n direction: \"rtl\",\n ...styles?.modalBackdrop,\n }}\n >\n {calendarContent}\n </div>\n ) : (\n calendarContent\n ))}\n </div>\n );\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport type { DualMonthCalendarProps } from \"./types\";\nimport type {\n JalaliDate,\n JalaliMonthIndex,\n JalaliCalendarCell,\n} from \"../../core/types\";\nimport type { JalaliDateRange } from \"../../hooks/types\";\nimport { getTodayJalali, isSameJalaliDay } from \"../../core/jalali-math\";\nimport { generateJalaliCalendarGrid } from \"../../core/calendar-grid\";\nimport {\n compareJalaliDates,\n isJalaliDateBetween,\n} from \"../../core/jalali-helpers\";\nimport { PERSIAN_MONTH_NAMES } from \"../../core/constants\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\nimport { Weekdays } from \"../Weekdays\";\nimport { DayCell } from \"../DayCell\";\n\nexport const DualMonthCalendar: React.FC<DualMonthCalendarProps> = ({\n value,\n defaultValue = [null, null],\n onChange,\n initialViewDate,\n firstDayOfWeek = 0,\n digitType = \"persian\",\n minDate,\n maxDate,\n isDateDisabled,\n}) => {\n // 1. Selection State (Controlled vs Uncontrolled)\n const [internalRange, setInternalRange] =\n useState<JalaliDateRange>(defaultValue);\n const activeRange = value !== undefined ? value : internalRange;\n\n // 2. Hover state for range preview\n const [hoveredDate, setHoveredDate] = useState<JalaliDate | null>(null);\n\n // 3. View state for First Month (Left)\n const today = useMemo(() => getTodayJalali(), []);\n const [viewState, setViewState] = useState<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (initialViewDate) return initialViewDate;\n if (activeRange[0])\n return { year: activeRange[0].year, month: activeRange[0].month };\n return { year: today.year, month: today.month };\n });\n\n // Calculate Second Month (Right)\n const nextMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewState.month === 11) {\n return { year: viewState.year + 1, month: 0 };\n }\n return {\n year: viewState.year,\n month: (viewState.month + 1) as JalaliMonthIndex,\n };\n }, [viewState]);\n\n // 4. Synchronized Navigation (moves both months together)\n const handlePrevMonth = () => {\n setViewState((prev) => {\n if (prev.month === 0) return { year: prev.year - 1, month: 11 };\n return { year: prev.year, month: (prev.month - 1) as JalaliMonthIndex };\n });\n };\n\n const handleNextMonth = () => {\n setViewState((prev) => {\n if (prev.month === 11) return { year: prev.year + 1, month: 0 };\n return { year: prev.year, month: (prev.month + 1) as JalaliMonthIndex };\n });\n };\n\n // 5. Date Selection Handler\n const handleDateSelect = useCallback(\n (target: JalaliDate) => {\n const [start, end] = activeRange;\n let newRange: JalaliDateRange;\n\n if (!start || (start && end)) {\n newRange = [target, null];\n } else {\n if (compareJalaliDates(target, start) < 0) {\n newRange = [target, start];\n } else {\n newRange = [start, target];\n }\n setHoveredDate(null);\n }\n\n if (value === undefined) {\n setInternalRange(newRange);\n }\n onChange?.(newRange);\n },\n [activeRange, value, onChange],\n );\n\n // 6. Enrich cells with cross-month range metadata\n const enrichGridCells = useCallback(\n (year: number, month: JalaliMonthIndex): JalaliCalendarCell[] => {\n const rawGrid = generateJalaliCalendarGrid({\n year,\n month,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n });\n\n const [start, end] = activeRange;\n const effectiveEnd = end ?? (start && hoveredDate ? hoveredDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n },\n [\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n activeRange,\n hoveredDate,\n ],\n );\n\n const leftGrid = useMemo(\n () => enrichGridCells(viewState.year, viewState.month),\n [enrichGridCells, viewState.year, viewState.month],\n );\n\n const rightGrid = useMemo(\n () => enrichGridCells(nextMonthState.year, nextMonthState.month),\n [enrichGridCells, nextMonthState.year, nextMonthState.month],\n );\n\n const renderMonthPane = (\n year: number,\n month: JalaliMonthIndex,\n grid: JalaliCalendarCell[],\n isLeftPane: boolean,\n ) => (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n minWidth: \"270px\",\n }}\n >\n {/* Pane Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 4px\",\n height: \"32px\",\n }}\n >\n {isLeftPane ? (\n <button\n type=\"button\"\n aria-label=\"ماه قبل\"\n onClick={handlePrevMonth}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n }}\n >\n ›\n </button>\n ) : (\n <div style={{ width: \"28px\" }} />\n )}\n\n <div\n style={{\n fontWeight: 600,\n fontSize: \"14px\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n }}\n >\n {PERSIAN_MONTH_NAMES[month]} {toPersianDigits(year)}\n </div>\n\n {!isLeftPane ? (\n <button\n type=\"button\"\n aria-label=\"ماه بعد\"\n onClick={handleNextMonth}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n }}\n >\n ‹\n </button>\n ) : (\n <div style={{ width: \"28px\" }} />\n )}\n </div>\n\n <Weekdays firstDayOfWeek={firstDayOfWeek} />\n\n {/* Grid */}\n <div\n role=\"grid\"\n aria-label={`${PERSIAN_MONTH_NAMES[month]} ${toPersianDigits(year)}`}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 36px))\",\n gap: \"4px\",\n }}\n >\n {grid.map((cell, idx) => (\n <DayCell\n key={idx}\n cell={cell}\n digitType={digitType}\n tabIndex={0}\n onSelect={handleDateSelect}\n onHover={setHoveredDate}\n />\n ))}\n </div>\n </div>\n );\n\n return (\n <div\n role=\"region\"\n aria-label=\"تقویم دوقلو شمسی\"\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"24px\",\n padding: \"16px\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n boxShadow: \"var(--pdp-shadow)\",\n width: \"fit-content\",\n direction: \"rtl\",\n }}\n >\n {renderMonthPane(viewState.year, viewState.month, leftGrid, true)}\n <div\n style={{\n width: \"1px\",\n backgroundColor: \"var(--pdp-surface-border, #e2e8f0)\",\n }}\n />\n {renderMonthPane(\n nextMonthState.year,\n nextMonthState.month,\n rightGrid,\n false,\n )}\n </div>\n );\n};\n"],"mappings":"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"}