@mngh/jalali-datepicker 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/JalaliDatePicker.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +467 -422
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -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/core/date-availability.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/theme/style-utils.ts","../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/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":["/**\r\n * Persian (Farsi) month names.\r\n */\r\nexport const PERSIAN_MONTH_NAMES = [\r\n \"فروردین\",\r\n \"اردیبهشت\",\r\n \"خرداد\",\r\n \"تیر\",\r\n \"مرداد\",\r\n \"شهریور\",\r\n \"مهر\",\r\n \"آبان\",\r\n \"آذر\",\r\n \"دی\",\r\n \"بهمن\",\r\n \"اسفند\",\r\n] as const;\r\n\r\n/**\r\n * Phonetic English month names for Jalali calendar.\r\n */\r\nexport const JALALI_MONTH_NAMES_EN = [\r\n \"Farvardin\",\r\n \"Ordibehesht\",\r\n \"Khordad\",\r\n \"Tir\",\r\n \"Mordad\",\r\n \"Shahrivar\",\r\n \"Mehr\",\r\n \"Aban\",\r\n \"Azar\",\r\n \"Dey\",\r\n \"Bahman\",\r\n \"Esfand\",\r\n] as const;\r\n\r\n/**\r\n * Persian weekday headers starting from Saturday (شنبه).\r\n */\r\nexport const PERSIAN_WEEK_DAYS_SHORT = [\r\n \"ش\",\r\n \"ی\",\r\n \"د\",\r\n \"س\",\r\n \"چ\",\r\n \"پ\",\r\n \"ج\",\r\n] as const;\r\nexport const PERSIAN_WEEK_DAYS_LONG = [\r\n \"شنبه\",\r\n \"یکشنبه\",\r\n \"دوشنبه\",\r\n \"سهشنبه\",\r\n \"چهارشنبه\",\r\n \"پنجشنبه\",\r\n \"جمعه\",\r\n] as const;\r\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\r\n\r\n/**\r\n * Determines if a Jalali year is a leap year (کبیسه).\r\n * Uses the Birashk 2820-year cycle algorithm.\r\n */\r\nexport function isJalaliLeapYear(year: number): boolean {\r\n const breaks = [\r\n -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097,\r\n 2192, 2262, 2324, 2394, 2456, 3178,\r\n ];\r\n\r\n let jp = breaks[0];\r\n let jump = 0;\r\n\r\n if (year < jp || year >= breaks[breaks.length - 1]) {\r\n throw new Error(`Jalali year ${year} is outside supported range.`);\r\n }\r\n\r\n for (let i = 1; i < breaks.length; i++) {\r\n const jm = breaks[i];\r\n jump = jm - jp;\r\n if (year < jm) break;\r\n jp = jm;\r\n }\r\n\r\n let n = year - jp;\r\n if (jump - n < 6) n = n - jump + ((jump + 4) / 33) * 33;\r\n let leap = ((n + 1) % 33) - 1;\r\n if (leap === -1) leap = 4;\r\n\r\n return leap % 4 === 0;\r\n}\r\n\r\n/**\r\n * Returns the number of days in a specific Jalali month.\r\n */\r\nexport function getDaysInJalaliMonth(\r\n year: number,\r\n month: JalaliMonthIndex,\r\n): number {\r\n if (month < 0 || month > 11) {\r\n throw new RangeError(\r\n \"Month index must be between 0 (Farvardin) and 11 (Esfand).\",\r\n );\r\n }\r\n // Months 0 to 5 (Farvardin - Shahrivar) have 31 days\r\n if (month <= 5) return 31;\r\n // Months 6 to 10 (Mehr - Bahman) have 30 days\r\n if (month <= 10) return 30;\r\n // Month 11 (Esfand) has 30 in leap years, 29 in regular years\r\n return isJalaliLeapYear(year) ? 30 : 29;\r\n}\r\n\r\n/**\r\n * Converts a Gregorian date (Year, Month, Day) to Jalali date.\r\n */\r\nexport function gregorianToJalali(\r\n gy: number,\r\n gm: number,\r\n gd: number,\r\n): JalaliDate {\r\n const g_d_m = [\r\n 0,\r\n 31,\r\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n ];\r\n let jy: number;\r\n let jm: number;\r\n let jd: number;\r\n\r\n let gy2 = gm > 2 ? gy + 1 : gy;\r\n let days =\r\n 355666 +\r\n 365 * gy +\r\n Math.floor((gy2 + 3) / 4) -\r\n Math.floor((gy2 + 99) / 100) +\r\n Math.floor((gy2 + 399) / 400) +\r\n gd;\r\n\r\n for (let i = 0; i < gm; ++i) days += g_d_m[i];\r\n\r\n jy = -1595 + 33 * Math.floor(days / 12053);\r\n days %= 12053;\r\n\r\n jy += 4 * Math.floor(days / 1461);\r\n days %= 1461;\r\n\r\n if (days > 365) {\r\n jy += Math.floor((days - 1) / 365);\r\n days = (days - 1) % 365;\r\n }\r\n\r\n if (days < 186) {\r\n jm = Math.floor(days / 31);\r\n jd = 1 + (days % 31);\r\n } else {\r\n jm = 6 + Math.floor((days - 186) / 30);\r\n jd = 1 + ((days - 186) % 30);\r\n }\r\n\r\n return { year: jy, month: jm as JalaliMonthIndex, day: jd };\r\n}\r\n\r\n/**\r\n * Converts a Jalali date to a Gregorian Date.\r\n */\r\nexport function jalaliToGregorian(\r\n jy: number,\r\n jm: JalaliMonthIndex,\r\n jd: number,\r\n): Date {\r\n let gy: number;\r\n let gm: number;\r\n let gd: number;\r\n\r\n let jy2 = jy + 1595;\r\n let days =\r\n -355668 +\r\n 365 * jy2 +\r\n Math.floor(jy2 / 33) * 8 +\r\n Math.floor(((jy2 % 33) + 3) / 4) +\r\n jd +\r\n (jm < 6 ? jm * 31 : (jm - 6) * 30 + 186);\r\n\r\n gy = 400 * Math.floor(days / 146097);\r\n days %= 146097;\r\n\r\n if (days > 36524) {\r\n gy += 100 * Math.floor(--days / 36524);\r\n days %= 36524;\r\n if (days >= 365) days++;\r\n }\r\n\r\n gy += 4 * Math.floor(days / 1461);\r\n days %= 1461;\r\n\r\n if (days > 365) {\r\n gy += Math.floor((days - 1) / 365);\r\n days = (days - 1) % 365;\r\n }\r\n\r\n gd = days + 1;\r\n const sal_a = [\r\n 0,\r\n 31,\r\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n ];\r\n\r\n for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) {\r\n gd -= sal_a[gm];\r\n }\r\n\r\n const result = new Date(gy, gm - 1, gd);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns today's date in Jalali format.\r\n */\r\nexport function getTodayJalali(): JalaliDate {\r\n const now = new Date();\r\n return gregorianToJalali(\r\n now.getFullYear(),\r\n now.getMonth() + 1,\r\n now.getDate(),\r\n );\r\n}\r\n\r\n/**\r\n * Checks if two Jalali dates are identical.\r\n */\r\nexport function isSameJalaliDay(\r\n a?: JalaliDate | null,\r\n b?: JalaliDate | null,\r\n): boolean {\r\n if (!a || !b) return false;\r\n return a.year === b.year && a.month === b.month && a.day === b.day;\r\n}\r\n","import type {\r\n JalaliCalendarCell,\r\n JalaliGridOptions,\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n} from \"./types\";\r\nimport {\r\n jalaliToGregorian,\r\n gregorianToJalali,\r\n getDaysInJalaliMonth,\r\n getTodayJalali,\r\n isSameJalaliDay,\r\n} from \"./jalali-math\";\r\n\r\n/**\r\n * Normalizes input date (Date or JalaliDate) into JalaliDate object.\r\n */\r\nexport function toJalaliDate(input: Date | JalaliDate): JalaliDate {\r\n if (input instanceof Date) {\r\n return gregorianToJalali(\r\n input.getFullYear(),\r\n input.getMonth() + 1,\r\n input.getDate(),\r\n );\r\n }\r\n return input;\r\n}\r\n\r\n/**\r\n * Generates a 42-cell (6 rows x 7 columns) matrix for a given Jalali month.\r\n */\r\nexport function generateJalaliCalendarGrid(\r\n options: JalaliGridOptions,\r\n): JalaliCalendarCell[] {\r\n const {\r\n year,\r\n month,\r\n firstDayOfWeek = 0, // 0 = Saturday (شنبه)\r\n selectedDate,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n } = options;\r\n\r\n const cells: JalaliCalendarCell[] = [];\r\n const todayJalali = getTodayJalali();\r\n const activeSelected = selectedDate ? toJalaliDate(selectedDate) : null;\r\n const minJalali = minDate ? toJalaliDate(minDate) : null;\r\n const maxJalali = maxDate ? toJalaliDate(maxDate) : null;\r\n\r\n // Convert Jalali 1st of month to Gregorian to read weekday\r\n const firstDayGregorian = jalaliToGregorian(year, month, 1);\r\n\r\n // JS getDay(): 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat\r\n // Map standard JS getDay() to Jalali index: 6(Sat)->0, 0(Sun)->1, ..., 5(Fri)->6\r\n const jsDay = firstDayGregorian.getDay();\r\n const rawJalaliWeekDay = (jsDay + 1) % 7;\r\n\r\n const leadingPaddingCount = (rawJalaliWeekDay - firstDayOfWeek + 7) % 7;\r\n\r\n // 1. Previous month trailing days\r\n const prevMonth = (month === 0 ? 11 : month - 1) as JalaliMonthIndex;\r\n const prevYear = month === 0 ? year - 1 : year;\r\n const daysInPrevMonth = getDaysInJalaliMonth(prevYear, prevMonth);\r\n\r\n for (let i = leadingPaddingCount - 1; i >= 0; i--) {\r\n const day = daysInPrevMonth - i;\r\n const jDate: JalaliDate = { year: prevYear, month: prevMonth, day };\r\n cells.push(buildCell(jDate, false));\r\n }\r\n\r\n // 2. Current month days\r\n const totalDays = getDaysInJalaliMonth(year, month);\r\n for (let d = 1; d <= totalDays; d++) {\r\n const jDate: JalaliDate = { year, month, day: d };\r\n cells.push(buildCell(jDate, true));\r\n }\r\n\r\n // 3. Next month leading days (completing 42 cells)\r\n const nextMonth = (month === 11 ? 0 : month + 1) as JalaliMonthIndex;\r\n const nextYear = month === 11 ? year + 1 : year;\r\n const trailingPaddingCount = 42 - cells.length;\r\n\r\n for (let d = 1; d <= trailingPaddingCount; d++) {\r\n const jDate: JalaliDate = { year: nextYear, month: nextMonth, day: d };\r\n cells.push(buildCell(jDate, false));\r\n }\r\n\r\n function buildCell(\r\n jDate: JalaliDate,\r\n isCurrentMonth: boolean,\r\n ): JalaliCalendarCell {\r\n const gregDate = jalaliToGregorian(jDate.year, jDate.month, jDate.day);\r\n const isToday = isSameJalaliDay(jDate, todayJalali);\r\n const isSelected = activeSelected\r\n ? isSameJalaliDay(jDate, activeSelected)\r\n : false;\r\n\r\n let isDisabled = false;\r\n if (minJalali) {\r\n const minG = jalaliToGregorian(\r\n minJalali.year,\r\n minJalali.month,\r\n minJalali.day,\r\n );\r\n if (gregDate.getTime() < minG.getTime()) isDisabled = true;\r\n }\r\n if (maxJalali) {\r\n const maxG = jalaliToGregorian(\r\n maxJalali.year,\r\n maxJalali.month,\r\n maxJalali.day,\r\n );\r\n if (gregDate.getTime() > maxG.getTime()) isDisabled = true;\r\n }\r\n if (isDateDisabled && isDateDisabled(jDate, gregDate)) {\r\n isDisabled = true;\r\n }\r\n\r\n return {\r\n jalali: jDate,\r\n gregorianDate: gregDate,\r\n dayNumber: jDate.day,\r\n isCurrentMonth,\r\n isToday,\r\n isSelected,\r\n isDisabled,\r\n };\r\n }\r\n\r\n return cells;\r\n}\r\n","import type { JalaliDate, JalaliDayOfWeek, JalaliMonthIndex } from \"./types\";\r\nimport {\r\n jalaliToGregorian,\r\n gregorianToJalali,\r\n getDaysInJalaliMonth,\r\n} from \"./jalali-math\";\r\n\r\nexport function jsDateToJalali(d: Date): JalaliDate {\r\n return gregorianToJalali(d.getFullYear(), d.getMonth() + 1, d.getDate());\r\n}\r\n\r\nexport function jalaliToJsDate(\r\n j: JalaliDate,\r\n hours = 0,\r\n minutes = 0,\r\n seconds = 0,\r\n): Date {\r\n const g = jalaliToGregorian(j.year, j.month, j.day);\r\n g.setHours(hours, minutes, seconds, 0);\r\n return g;\r\n}\r\n\r\n/**\r\n * Calculates day of week in Jalali calendar (0 = شنبه, ..., 6 = جمعه).\r\n */\r\nexport function getJalaliDayOfWeek(\r\n year: number,\r\n month: number,\r\n day: number,\r\n): JalaliDayOfWeek {\r\n const g = jalaliToGregorian(year, month as JalaliMonthIndex, day);\r\n const jsDay = g.getDay(); // 0 = Sunday, 6 = Saturday\r\n return ((jsDay + 1) % 7) as JalaliDayOfWeek;\r\n}\r\n\r\n/**\r\n * Adds or subtracts days to/from a Jalali date across month/year boundaries.\r\n */\r\nexport function addDaysToJalali(date: JalaliDate, days: number): JalaliDate {\r\n const g = jalaliToGregorian(date.year, date.month, date.day);\r\n g.setDate(g.getDate() + days);\r\n // تبدیل getMonth() از 0-indexed به 1-indexed برای gregorianToJalali\r\n return gregorianToJalali(g.getFullYear(), g.getMonth() + 1, g.getDate());\r\n}\r\n\r\n/**\r\n * Alias for addDaysToJalali\r\n */\r\nexport const addJalaliDays = addDaysToJalali;\r\n\r\n/**\r\n * Compares two Jalali dates:\r\n * - Returns -1 if d1 < d2\r\n * - Returns 1 if d1 > d2\r\n * - Returns 0 if d1 == d2\r\n */\r\nexport function compareJalaliDates(d1: JalaliDate, d2: JalaliDate): number {\r\n if (d1.year !== d2.year) return d1.year < d2.year ? -1 : 1;\r\n if (d1.month !== d2.month) return d1.month < d2.month ? -1 : 1;\r\n if (d1.day !== d2.day) return d1.day < d2.day ? -1 : 1;\r\n return 0;\r\n}\r\n\r\n/**\r\n * Checks if a target date falls strictly or inclusively between two dates.\r\n */\r\nexport function isJalaliDateBetween(\r\n target: JalaliDate,\r\n start: JalaliDate,\r\n end: JalaliDate,\r\n inclusive = true,\r\n): boolean {\r\n const minDate = compareJalaliDates(start, end) <= 0 ? start : end;\r\n const maxDate = compareJalaliDates(start, end) <= 0 ? end : start;\r\n\r\n const cmpMin = compareJalaliDates(target, minDate);\r\n const cmpMax = compareJalaliDates(target, maxDate);\r\n\r\n if (inclusive) {\r\n return cmpMin >= 0 && cmpMax <= 0;\r\n }\r\n return cmpMin > 0 && cmpMax < 0;\r\n}\r\n\r\n/**\r\n * Calculates the full Jalali week range starting Saturday and ending Friday.\r\n */\r\nexport function getJalaliWeekRange(date: JalaliDate): [JalaliDate, JalaliDate] {\r\n const dayOfWeek = getJalaliDayOfWeek(date.year, date.month, date.day);\r\n const startOfWeek = addDaysToJalali(date, -dayOfWeek); // شنبه\r\n const endOfWeek = addDaysToJalali(startOfWeek, 6); // جمعه\r\n return [startOfWeek, endOfWeek];\r\n}\r\n\r\n/**\r\n * Calculates full month range from day 1 to last day of that month.\r\n */\r\nexport function getJalaliMonthRange(\r\n date: JalaliDate,\r\n): [JalaliDate, JalaliDate] {\r\n const daysInMonth = getDaysInJalaliMonth(date.year, date.month);\r\n const start: JalaliDate = { year: date.year, month: date.month, day: 1 };\r\n const end: JalaliDate = {\r\n year: date.year,\r\n month: date.month,\r\n day: daysInMonth,\r\n };\r\n return [start, end];\r\n}\r\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\nimport { compareJalaliDates } from \"./jalali-helpers\";\nimport { getDaysInJalaliMonth } from \"./jalali-math\";\n\nexport interface JalaliDateConstraints {\n minDate?: JalaliDate;\n maxDate?: JalaliDate;\n isDateDisabled?: (date: JalaliDate) => boolean;\n}\n\nexport function isJalaliDateSelectable(\n date: JalaliDate,\n constraints: JalaliDateConstraints = {},\n): boolean {\n const { minDate, maxDate, isDateDisabled } = constraints;\n if (minDate && compareJalaliDates(date, minDate) < 0) return false;\n if (maxDate && compareJalaliDates(date, maxDate) > 0) return false;\n return !isDateDisabled?.(date);\n}\n\nexport function isJalaliMonthSelectable(\n year: number,\n month: JalaliMonthIndex,\n constraints: JalaliDateConstraints = {},\n): boolean {\n const firstDay: JalaliDate = { year, month, day: 1 };\n const lastDay: JalaliDate = {\n year,\n month,\n day: getDaysInJalaliMonth(year, month),\n };\n\n if (\n (constraints.minDate &&\n compareJalaliDates(lastDay, constraints.minDate) < 0) ||\n (constraints.maxDate &&\n compareJalaliDates(firstDay, constraints.maxDate) > 0)\n ) {\n return false;\n }\n\n if (!constraints.isDateDisabled) return true;\n for (let day = 1; day <= lastDay.day; day += 1) {\n if (isJalaliDateSelectable({ year, month, day }, constraints)) return true;\n }\n return false;\n}\n\nexport function isJalaliYearSelectable(\n year: number,\n constraints: JalaliDateConstraints = {},\n): boolean {\n for (let month = 0; month < 12; month += 1) {\n if (\n isJalaliMonthSelectable(\n year,\n month as JalaliMonthIndex,\n constraints,\n )\n ) {\n return true;\n }\n }\n return false;\n}\n","import { useState, useCallback, useMemo } from \"react\";\r\nimport type {\r\n UseJalaliDatePickerOptions,\r\n SelectionMode,\r\n InternalSelectedValue,\r\n JalaliDateRange,\r\n} from \"./types\";\r\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\r\nimport { getTodayJalali, isSameJalaliDay } from \"../core/jalali-math\";\r\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\r\nimport { isJalaliDateBetween } from \"../core/jalali-helpers\";\nimport { isJalaliDateSelectable } from \"../core/date-availability\";\n\r\nexport function useJalaliDatePicker<M extends SelectionMode = \"single\">(\r\n options: UseJalaliDatePickerOptions<M> = {},\r\n) {\r\n const {\r\n mode = \"single\" as M,\r\n value: controlledValue,\r\n defaultValue,\r\n initialViewDate,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n firstDayOfWeek = 0,\r\n } = options;\r\n\r\n const today = useMemo(() => getTodayJalali(), []);\r\n\r\n const [internalValue, setInternalValue] = useState<InternalSelectedValue<M>>(\r\n () => {\r\n if (defaultValue !== undefined) return defaultValue;\r\n if (mode === \"single\") return null as InternalSelectedValue<M>;\r\n if (mode === \"range\")\r\n return [null, null] as unknown as InternalSelectedValue<M>;\r\n return [] as unknown as InternalSelectedValue<M>;\r\n },\r\n );\r\n\r\n const selected =\r\n controlledValue !== undefined ? controlledValue : internalValue;\r\n\r\n const [viewYear, setViewYear] = useState<number>(() => {\r\n if (initialViewDate) return initialViewDate.year;\r\n if (defaultValue && !Array.isArray(defaultValue))\r\n return (defaultValue as JalaliDate).year;\r\n return today.year;\r\n });\r\n\r\n const [viewMonth, setViewMonth] = useState<JalaliMonthIndex>(() => {\r\n if (initialViewDate) return initialViewDate.month;\r\n if (defaultValue && !Array.isArray(defaultValue))\r\n return (defaultValue as JalaliDate).month;\r\n return today.month;\r\n });\r\n\r\n const [hoverDate, setHoverDate] = useState<JalaliDate | null>(null);\n\n const canSelectDate = useCallback(\n (date: JalaliDate) =>\n isJalaliDateSelectable(date, {\n minDate,\n maxDate,\n isDateDisabled,\n }),\n [minDate, maxDate, isDateDisabled],\n );\n\r\n const setView = useCallback((year: number, month: JalaliMonthIndex) => {\r\n setViewYear(year);\r\n setViewMonth(month);\r\n }, []);\r\n\r\n const goToPrevMonth = useCallback(() => {\r\n if (viewMonth === 0) {\r\n setViewYear((y) => y - 1);\r\n setViewMonth(11);\r\n } else {\r\n setViewMonth((m) => (m - 1) as JalaliMonthIndex);\r\n }\r\n }, [viewMonth]);\r\n\r\n const goToNextMonth = useCallback(() => {\r\n if (viewMonth === 11) {\r\n setViewYear((y) => y + 1);\r\n setViewMonth(0);\r\n } else {\r\n setViewMonth((m) => (m + 1) as JalaliMonthIndex);\r\n }\r\n }, [viewMonth]);\r\n\r\n const goToToday = useCallback(() => {\r\n const t = getTodayJalali();\r\n setViewYear(t.year);\r\n setViewMonth(t.month);\r\n }, []);\r\n\r\n const selectDate = useCallback(\n (date: JalaliDate) => {\n if (!canSelectDate(date)) return;\n\n let nextValue: InternalSelectedValue<M>;\r\n\r\n if (mode === \"single\") {\r\n nextValue = date as InternalSelectedValue<M>;\r\n } else if (mode === \"range\") {\r\n const currentRange = (selected as JalaliDateRange) || [null, null];\r\n const [start, end] = currentRange;\r\n\r\n if (!start || (start && end)) {\r\n nextValue = [date, null] as unknown as InternalSelectedValue<M>;\r\n } else {\r\n if (\r\n date.year < start.year ||\r\n (date.year === start.year && date.month < start.month) ||\r\n (date.year === start.year &&\r\n date.month === start.month &&\r\n date.day < start.day)\r\n ) {\r\n nextValue = [date, start] as unknown as InternalSelectedValue<M>;\r\n } else {\r\n nextValue = [start, date] as unknown as InternalSelectedValue<M>;\r\n }\r\n }\r\n } else {\r\n const currentList = (selected as JalaliDate[]) || [];\r\n const exists = currentList.some((d) => isSameJalaliDay(d, date));\r\n if (exists) {\r\n nextValue = currentList.filter(\r\n (d) => !isSameJalaliDay(d, date),\r\n ) as InternalSelectedValue<M>;\r\n } else {\r\n nextValue = [...currentList, date] as InternalSelectedValue<M>;\r\n }\r\n }\r\n\r\n if (controlledValue === undefined) {\r\n setInternalValue(nextValue);\r\n }\r\n onChange?.(nextValue);\r\n },\r\n [mode, selected, controlledValue, onChange, canSelectDate],\n );\n\n const isDateSelected = useCallback(\n (date: JalaliDate): boolean => {\n if (mode === \"single\") {\n return isSameJalaliDay(selected as JalaliDate | null, date);\n }\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n return Boolean(\n (start && isSameJalaliDay(start, date)) ||\n (end && isSameJalaliDay(end, date)),\n );\n }\n return ((selected as JalaliDate[]) || []).some((item) =>\n isSameJalaliDay(item, date),\n );\n },\n [mode, selected],\n );\n\r\n const clear = useCallback(() => {\r\n const emptyValue = (\r\n mode === \"single\" ? null : mode === \"range\" ? [null, null] : []\r\n ) as InternalSelectedValue<M>;\r\n\r\n if (controlledValue === undefined) {\r\n setInternalValue(emptyValue);\r\n }\r\n onChange?.(emptyValue);\r\n }, [mode, controlledValue, onChange]);\r\n\r\n const grid = useMemo(() => {\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year: viewYear,\r\n month: viewMonth,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n });\r\n\r\n if (mode === \"single\") {\r\n const singleSelected = selected as JalaliDate | null;\r\n return rawGrid.map((cell) => ({\r\n ...cell,\r\n isSelected: singleSelected\r\n ? isSameJalaliDay(cell.jalali, singleSelected)\r\n : false,\r\n }));\r\n }\r\n\r\n if (mode === \"range\") {\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n }\r\n\r\n if (mode === \"multiple\") {\r\n const list = (selected as JalaliDate[]) || [];\r\n return rawGrid.map((cell) => ({\r\n ...cell,\r\n isSelected: list.some((d) => isSameJalaliDay(d, cell.jalali)),\r\n }));\r\n }\r\n\r\n return rawGrid;\r\n }, [\r\n viewYear,\r\n viewMonth,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n mode,\r\n selected,\r\n hoverDate,\r\n ]);\r\n\r\n return {\r\n selected,\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n goToPrevMonth,\r\n goToNextMonth,\r\n goToToday,\r\n setView,\r\n selectDate,\n isDateSelected,\n setHoverDate,\r\n hoverDate,\r\n clear,\r\n };\r\n}\r\n","import type { JalaliMonthIndex } from \"../core/types\";\r\nimport { getDaysInJalaliMonth } from \"../core/jalali-math\";\r\nimport type { NavigateOptions, NavigationResult } from \"./types\";\r\n\r\nexport function calculateNextFocusedDate(\r\n options: NavigateOptions,\r\n): NavigationResult {\r\n const { currentFocused, key, isRtl = true } = options;\r\n let { year, month, day } = currentFocused;\r\n let viewChanged = false;\r\n let handled = true;\r\n\r\n // Handle RTL vs LTR arrow directions\r\n const stepLeft = isRtl ? 1 : -1;\r\n const stepRight = isRtl ? -1 : 1;\r\n\r\n switch (key) {\r\n case \"ArrowRight\":\r\n day += stepRight;\r\n break;\r\n\r\n case \"ArrowLeft\":\r\n day += stepLeft;\r\n break;\r\n\r\n case \"ArrowUp\":\r\n day -= 7;\r\n break;\r\n\r\n case \"ArrowDown\":\r\n day += 7;\r\n break;\r\n\r\n case \"Home\":\r\n day = 1;\r\n break;\r\n\r\n case \"End\":\r\n day = getDaysInJalaliMonth(year, month);\r\n break;\r\n\r\n case \"PageUp\":\r\n // Previous Month\r\n if (month === 0) {\r\n year -= 1;\r\n month = 11;\r\n } else {\r\n month = (month - 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n break;\r\n\r\n case \"PageDown\":\r\n // Next Month\r\n if (month === 11) {\r\n year += 1;\r\n month = 0;\r\n } else {\r\n month = (month + 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n break;\r\n\r\n default:\r\n handled = false;\r\n return { nextDate: currentFocused, viewChanged: false, handled: false };\r\n }\r\n\r\n // Normalize days falling outside current month boundary\r\n while (day < 1) {\r\n if (month === 0) {\r\n year -= 1;\r\n month = 11;\r\n } else {\r\n month = (month - 1) as JalaliMonthIndex;\r\n }\r\n day += getDaysInJalaliMonth(year, month);\r\n viewChanged = true;\r\n }\r\n\r\n while (day > getDaysInJalaliMonth(year, month)) {\r\n day -= getDaysInJalaliMonth(year, month);\r\n if (month === 11) {\r\n year += 1;\r\n month = 0;\r\n } else {\r\n month = (month + 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n }\r\n\r\n return {\r\n nextDate: { year, month, day },\r\n viewChanged,\r\n handled,\r\n };\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\n\r\n/**\r\n * Creates an accessible full Persian string for screen readers.\r\n * Example: \"شنبه، ۱ فروردین ۱۴۰۵\"\r\n */\r\nexport function getAriaDayLabel(date: JalaliDate): string {\r\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\r\n const jsDay = gregorian.getDay();\r\n const jalaliDayOfWeek = (jsDay + 1) % 7; // 0 = Sat, 1 = Sun, ...\r\n\r\n const weekDayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\r\n const monthName = PERSIAN_MONTH_NAMES[date.month];\r\n\r\n return `${weekDayName}، ${date.day} ${monthName} ${date.year}`;\r\n}\r\n","import { useState, useCallback } from \"react\";\r\nimport type { JalaliDate } from \"../core/types\";\r\nimport { calculateNextFocusedDate } from \"./keyboard-navigation\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { UseCalendarKeyboardProps } from \"./types\";\r\n\r\nexport function useCalendarKeyboard(props: UseCalendarKeyboardProps) {\r\n const {\r\n viewYear,\r\n viewMonth,\r\n selectedDate,\r\n onSelectDate,\r\n onViewChange,\r\n isRtl = true,\r\n } = props;\r\n\r\n const [focusedDate, setFocusedDate] = useState<JalaliDate>(() => {\r\n return selectedDate ?? { year: viewYear, month: viewMonth, day: 1 };\r\n });\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n onSelectDate(focusedDate);\r\n return;\r\n }\r\n\r\n const result = calculateNextFocusedDate({\r\n currentFocused: focusedDate,\r\n key: e.key,\r\n isRtl,\r\n });\r\n\r\n if (result.handled) {\r\n e.preventDefault();\r\n setFocusedDate(result.nextDate);\r\n\r\n if (result.viewChanged) {\r\n onViewChange(result.nextDate.year, result.nextDate.month);\r\n }\r\n }\r\n },\r\n [focusedDate, isRtl, onSelectDate, onViewChange],\r\n );\r\n\r\n const getCellTabIndex = useCallback(\r\n (cellDate: JalaliDate): number => {\r\n return isSameJalaliDay(cellDate, focusedDate) ? 0 : -1;\r\n },\r\n [focusedDate],\r\n );\r\n\r\n return {\r\n focusedDate,\r\n setFocusedDate,\r\n handleKeyDown,\r\n getCellTabIndex,\r\n };\r\n}\r\n","const PERSIAN_DIGITS = [\"۰\", \"۱\", \"۲\", \"۳\", \"۴\", \"۵\", \"۶\", \"۷\", \"۸\", \"۹\"];\r\nconst LATIN_DIGITS: Record<string, string> = {\r\n \"۰\": \"0\",\r\n \"۱\": \"1\",\r\n \"۲\": \"2\",\r\n \"۳\": \"3\",\r\n \"۴\": \"4\",\r\n \"۵\": \"5\",\r\n \"۶\": \"6\",\r\n \"۷\": \"7\",\r\n \"۸\": \"8\",\r\n \"۹\": \"9\",\r\n \"٠\": \"0\",\r\n \"١\": \"1\",\r\n \"٢\": \"2\",\r\n \"٣\": \"3\",\r\n \"٤\": \"4\", // Arabic-indic fallbacks\r\n \"٥\": \"5\",\r\n \"٦\": \"6\",\r\n \"٧\": \"7\",\r\n \"٨\": \"8\",\r\n \"٩\": \"9\",\r\n};\r\n\r\n/**\r\n * Converts Latin digits (0-9) to Persian digits (۰-۹).\r\n */\r\nexport function toPersianDigits(input: string | number): string {\r\n return String(input).replace(/[0-9]/g, (w) => PERSIAN_DIGITS[+w]);\r\n}\r\n\r\n/**\r\n * Converts Persian/Arabic digits to standard ASCII Latin digits (0-9).\r\n */\r\nexport function toLatinDigits(input: string): string {\r\n return input.replace(/[۰-۹٠-٩]/g, (char) => LATIN_DIGITS[char] ?? char);\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\nimport { toPersianDigits } from \"./persian-digits\";\r\n\r\nexport interface FormatJalaliOptions {\r\n /** Output digits format. Defaults to 'persian'. */\r\n digitType?: \"persian\" | \"latin\";\r\n}\r\n\r\n/**\r\n * Formats a JalaliDate using standard format pattern tokens:\r\n * - YYYY: 4-digit year (1405)\r\n * - YY: 2-digit year (05)\r\n * - MMMM: Full month name (فروردین)\r\n * - MM: 2-digit month (01-12)\r\n * - M: 1-digit month (1-12)\r\n * - dddd: Full weekday name (شنبه)\r\n * - DD: 2-digit day (01-31)\r\n * - D: 1-digit day (1-31)\r\n */\r\nexport function formatJalaliDate(\r\n date: JalaliDate | null | undefined,\r\n pattern = \"YYYY/MM/DD\",\r\n options: FormatJalaliOptions = {},\r\n): string {\r\n if (!date) return \"\";\r\n\r\n const { digitType = \"persian\" } = options;\r\n\r\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\r\n const jsDay = gregorian.getDay();\r\n const jalaliDayOfWeek = (jsDay + 1) % 7;\r\n\r\n const yearStr = String(date.year);\r\n const shortYearStr = yearStr.slice(-2);\r\n const monthNum = date.month + 1;\r\n const monthStr = monthNum < 10 ? `0${monthNum}` : String(monthNum);\r\n const monthName = PERSIAN_MONTH_NAMES[date.month];\r\n const dayStr = date.day < 10 ? `0${date.day}` : String(date.day);\r\n const weekdayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\r\n\r\n let formatted = pattern\r\n .replace(/\\bYYYY\\b/g, yearStr)\r\n .replace(/\\bYY\\b/g, shortYearStr)\r\n .replace(/\\bMMMM\\b/g, monthName)\r\n .replace(/\\bMM\\b/g, monthStr)\r\n .replace(/\\bM\\b/g, String(monthNum))\r\n .replace(/\\bdddd\\b/g, weekdayName)\r\n .replace(/\\bDD\\b/g, dayStr)\r\n .replace(/\\bD\\b/g, String(date.day));\r\n\r\n if (digitType === \"persian\") {\r\n // Convert numeric matches while preserving month/weekday strings\r\n formatted = formatted.replace(/\\d+/g, (num) => toPersianDigits(num));\r\n }\r\n\r\n return formatted;\r\n}\r\n","// src/theme/tokens.ts\r\nimport type { Theme } from './types';\r\n\r\nexport const lightTheme: Theme = {\r\n mode: 'light',\r\n colors: {\r\n primary: '#4f46e5', // Indigo-600\r\n primaryHover: '#4338ca', // Indigo-700\r\n primaryText: '#ffffff', // متن سفید روی رنگ اصلی\r\n background: '#ffffff', // پسزمینه اصلی تقویم و اینپوت\r\n backgroundHover: '#f1f5f9', // Slate-100 برای هاور دکمهها\r\n surface: '#f8fafc', // Slate-50 برای فوتر و کادرهای فرعی\r\n border: '#e2e8f0', // Slate-200 برای خطوط و بردرها\r\n textPrimary: '#0f172a', // Slate-900 (مشکی تیره برای روزها و عناوین)\r\n textSecondary: '#64748b', // Slate-500 (خاکستری برای نام روزهای هفته و متون کمکی)\r\n textDisabled: '#cbd5e1', // Slate-300 (برای روزهای ماه قبل و بعد)\r\n holiday: '#e11d48', // Rose-600 (رنگ جمعهها و روزهای تعطیل)\r\n holidayBackground: '#fff1f2', // Rose-50 (هاور روزهای تعطیل)\r\n rangeBackground: '#e0e7ff', // Indigo-100 (پسزمینه بازه انتخابشده)\r\n todayBorder: '#4f46e5', // حاشیه دور روز جاری\r\n },\r\n radii: {\r\n sm: '6px',\r\n md: '8px',\r\n lg: '12px',\r\n full: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.04)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.05)',\r\n },\r\n};\r\n\r\nexport const darkTheme: Theme = {\r\n mode: 'dark',\r\n colors: {\r\n primary: '#6366f1',\r\n primaryHover: '#4f46e5',\r\n primaryText: '#ffffff',\r\n background: '#0f172a',\r\n backgroundHover: '#1e293b',\r\n surface: '#1e293b',\r\n border: '#334155',\r\n textPrimary: '#f8fafc',\r\n textSecondary: '#94a3b8',\r\n textDisabled: '#475569',\r\n holiday: '#fb7185',\r\n holidayBackground: '#4c0519',\r\n rangeBackground: '#312e81',\r\n todayBorder: '#818cf8',\r\n },\r\n radii: {\r\n sm: '6px',\r\n md: '8px',\r\n lg: '12px',\r\n full: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.4)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.5)',\r\n },\r\n};\r\n","import React, { createContext, useContext, useMemo } from \"react\";\r\nimport { lightTheme, darkTheme } from \"./tokens\";\r\nimport type { Theme, ThemeMode, DeepPartial } from \"./types\";\r\n\r\ninterface ThemeContextType {\r\n theme: Theme;\r\n mode: ThemeMode;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType>({\r\n theme: lightTheme,\r\n mode: \"light\",\r\n});\r\n\r\nexport const useTheme = (): ThemeContextType => {\r\n const context = useContext(ThemeContext);\r\n if (!context) {\r\n return { theme: lightTheme, mode: \"light\" };\r\n }\r\n return context;\r\n};\r\n\r\nexport interface DatePickerThemeProviderProps {\r\n children: React.ReactNode;\r\n mode?: ThemeMode;\r\n customTheme?: DeepPartial<Theme>;\r\n}\r\n\r\nexport const DatePickerThemeProvider: React.FC<\r\n DatePickerThemeProviderProps\r\n> = ({ children, mode = \"light\", customTheme }) => {\r\n const baseTheme = mode === \"dark\" ? darkTheme : lightTheme;\r\n\r\n const value = useMemo<ThemeContextType>(() => {\r\n if (!customTheme) {\r\n return { theme: baseTheme, mode };\r\n }\r\n\r\n return {\r\n mode,\r\n theme: {\r\n ...baseTheme,\r\n ...customTheme,\r\n mode,\r\n colors: {\r\n ...baseTheme.colors,\r\n ...(customTheme.colors || {}),\r\n },\r\n radii: {\r\n ...baseTheme.radii,\r\n ...(customTheme.radii || {}),\r\n },\r\n shadows: {\r\n ...baseTheme.shadows,\r\n ...(customTheme.shadows || {}),\r\n },\r\n },\r\n };\r\n }, [baseTheme, customTheme, mode]);\r\n\r\n return (\r\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\r\n );\r\n};\r\n","export function mergeClassNames(\r\n ...classNames: Array<string | null | undefined | false>\r\n): string | undefined {\r\n const merged = classNames.filter(Boolean).join(\" \");\r\n return merged || undefined;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\r\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface HeaderProps {\r\n year: number;\r\n monthName: string;\r\n onPrevMonth: () => void;\r\n onNextMonth: () => void;\r\n onTitleClick?: () => void;\r\n isPickerOpen?: boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n direction?: \"rtl\" | \"ltr\";\n isPrevDisabled?: boolean;\n isNextDisabled?: boolean;\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\ntype HoverTarget = \"prev\" | \"title\" | \"next\" | null;\r\n\r\nexport const Header: React.FC<HeaderProps> = ({\r\n year,\r\n monthName,\r\n onPrevMonth,\r\n onNextMonth,\r\n onTitleClick,\r\n isPickerOpen = false,\r\n digitType = \"persian\",\r\n direction = \"rtl\",\n isPrevDisabled = false,\n isNextDisabled = false,\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n const [hovered, setHovered] = useState<HoverTarget>(null);\r\n const displayYear =\r\n digitType === \"persian\" ? toPersianDigits(year) : String(year);\r\n\r\n const navStyle = (\n target: Exclude<HoverTarget, \"title\" | null>,\n disabled: boolean,\n ) => ({\n width: \"32px\",\r\n height: \"32px\",\r\n padding: 0,\r\n borderRadius: theme.radii.md,\r\n border: \"none\",\r\n backgroundColor:\r\n hovered === target ? theme.colors.backgroundHover : \"transparent\",\r\n color: theme.colors.textPrimary,\r\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.38 : 1,\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"background-color 0.15s ease, color 0.15s ease\",\r\n ...styles?.navButton,\n ...(disabled ? styles?.disabledNavButton : undefined),\n });\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={classNames?.header}\r\n style={{\r\n display: \"flex\",\r\n minHeight: \"40px\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: \"8px\",\r\n padding: \"4px 0 10px\",\r\n borderBottom: `1px solid ${theme.colors.border}`,\r\n userSelect: \"none\",\r\n ...styles?.header,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\n onClick={onPrevMonth}\n disabled={isPrevDisabled}\n aria-disabled={isPrevDisabled}\n aria-label=\"ماه قبل\"\n className={mergeClassNames(\n classNames?.navButton,\n isPrevDisabled && classNames?.disabledNavButton,\n )}\n style={navStyle(\"prev\", isPrevDisabled)}\n onMouseEnter={() => setHovered(\"prev\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onTitleClick}\r\n aria-expanded={isPickerOpen}\r\n className={classNames?.headerTitle}\r\n style={{\r\n minHeight: \"32px\",\r\n padding: \"6px 12px\",\r\n borderRadius: theme.radii.md,\r\n border: \"none\",\r\n backgroundColor:\r\n isPickerOpen || hovered === \"title\"\r\n ? theme.colors.backgroundHover\r\n : \"transparent\",\r\n color: theme.colors.textPrimary,\r\n cursor: onTitleClick ? \"pointer\" : \"default\",\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: \"6px\",\r\n fontSize: \"0.95rem\",\r\n fontWeight: 700,\r\n whiteSpace: \"nowrap\",\r\n transition: \"background-color 0.15s ease\",\r\n ...styles?.headerTitle,\r\n }}\r\n onMouseEnter={() => setHovered(\"title\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <span>\r\n {monthName} {displayYear}\r\n </span>\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{\r\n transform: isPickerOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\r\n transition: \"transform 0.2s ease\",\r\n }}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\n onClick={onNextMonth}\n disabled={isNextDisabled}\n aria-disabled={isNextDisabled}\n aria-label=\"ماه بعد\"\n className={mergeClassNames(\n classNames?.navButton,\n isNextDisabled && classNames?.disabledNavButton,\n )}\n style={navStyle(\"next\", isNextDisabled)}\n onMouseEnter={() => setHovered(\"next\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n );\r\n};\r\n","// src/components/Weekdays.tsx\r\nimport React from \"react\";\r\nimport { PERSIAN_WEEK_DAYS_SHORT } from \"../core/constants\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\r\n\r\nexport interface WeekdaysProps {\r\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const Weekdays: React.FC<WeekdaysProps> = ({\r\n firstDayOfWeek = 0,\r\n classNames,\r\n styles,\r\n}) => {\r\n // مرتبسازی روزهای هفته بر اساس firstDayOfWeek\r\n const weekdays = React.useMemo(() => {\r\n const days = [...PERSIAN_WEEK_DAYS_SHORT];\r\n const rotated = [\r\n ...days.slice(firstDayOfWeek),\r\n ...days.slice(0, firstDayOfWeek),\r\n ];\r\n return rotated;\r\n }, [firstDayOfWeek]);\r\n\r\n return (\r\n <div\r\n role=\"row\"\r\n className={classNames?.weekdays}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"4px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n marginBottom: \"6px\",\r\n userSelect: \"none\",\r\n ...styles?.weekdays,\r\n }}\r\n >\r\n {weekdays.map((day, idx) => {\r\n // اگر جمعه باشد (در حالت شنبه تا جمعه، آخرین ایندکس ۶ است)\r\n const isFriday = (idx + firstDayOfWeek) % 7 === 6;\r\n\r\n return (\r\n <div\r\n key={day}\r\n role=\"columnheader\"\r\n aria-label={day}\r\n className={classNames?.weekdayCell}\r\n style={{\r\n width: \"100%\",\n minWidth: 0,\n height: \"24px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"11.5px\",\r\n fontWeight: 700,\r\n color: isFriday\r\n ? \"var(--pdp-holiday-color, #e11d48)\"\r\n : \"var(--pdp-text-muted, #94a3b8)\",\r\n textAlign: \"center\",\r\n ...styles?.weekdayCell,\r\n }}\r\n >\r\n {day}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","// src/components/DayCell.tsx\r\nimport React, { useState } from \"react\";\r\nimport type { JalaliCalendarCell, JalaliDate } from \"../core/types\";\r\nimport { toPersianDigits, toLatinDigits } from \"../formatters/persian-digits\";\r\nimport type { CalendarEvent } from \"../events/types\";\r\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface DayCellProps {\r\n cell: JalaliCalendarCell;\r\n digitType?: \"persian\" | \"latin\";\r\n isHoliday?: boolean;\r\n holidayTitle?: string;\r\n events?: CalendarEvent[];\r\n tabIndex?: number;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n onSelect: (date: JalaliDate) => void;\r\n onHover?: (date: JalaliDate | null) => void;\r\n onFocus?: (date: JalaliDate) => void;\r\n}\r\n\r\nexport const DayCell: React.FC<DayCellProps> = ({\r\n cell,\r\n digitType = \"persian\",\r\n isHoliday = false,\r\n holidayTitle,\r\n events = [],\r\n tabIndex = -1,\r\n classNames,\r\n styles,\r\n onSelect,\r\n onHover,\r\n onFocus,\r\n}) => {\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [isPressed, setIsPressed] = useState(false);\r\n\r\n const {\r\n jalali,\r\n dayNumber,\r\n isCurrentMonth,\r\n isToday,\r\n isSelected,\r\n isDisabled,\r\n isInRange,\r\n isRangeStart,\r\n isRangeEnd,\r\n } = cell;\r\n\r\n const formattedDay =\r\n digitType === \"persian\"\r\n ? toPersianDigits(dayNumber)\r\n : toLatinDigits(dayNumber.toString());\r\n\r\n const isInteractive = !isDisabled && isCurrentMonth;\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (isInteractive) {\r\n onSelect(jalali);\r\n }\r\n };\r\n\r\n const handleMouseEnter = () => {\r\n setIsHovered(true);\r\n if (isInteractive && onHover) {\r\n onHover(jalali);\r\n }\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setIsHovered(false);\r\n setIsPressed(false);\r\n if (onHover) {\r\n onHover(null);\r\n }\r\n };\r\n\r\n const handleFocus = () => {\r\n if (isInteractive && onFocus) {\r\n onFocus(jalali);\r\n }\r\n };\r\n\r\n // رنگبندی پسزمینه و متن در حالتهای مختلف\r\n let cellBg = \"transparent\";\r\n let textColor = isCurrentMonth\r\n ? \"var(--pdp-text-primary, #0f172a)\"\r\n : \"var(--pdp-text-disabled, #cbd5e1)\";\r\n\r\n const isEdgeOfRange = isRangeStart || isRangeEnd;\r\n\r\n if (isSelected || isEdgeOfRange) {\n cellBg = \"var(--pdp-primary, #4f46e5)\";\r\n textColor = \"#ffffff\";\r\n } else if (isInRange) {\r\n cellBg = \"var(--pdp-range-between-bg, rgba(79, 70, 229, 0.12))\";\r\n } else if (isHovered && isInteractive) {\r\n cellBg = \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }\r\n\r\n // رنگ روزهای تعطیل در صورت عدم انتخاب\r\n if (\n isHoliday &&\n isCurrentMonth &&\n !isDisabled &&\n !isSelected &&\n !isEdgeOfRange\n ) {\n textColor = \"var(--pdp-holiday-color, #e11d48)\";\n }\n\n if (isDisabled) {\n cellBg = \"var(--pdp-disabled-bg, #f1f5f9)\";\n textColor = \"var(--pdp-text-disabled, #94a3b8)\";\n }\n\n const stateClassName = mergeClassNames(\n classNames?.dayCell,\n isToday && classNames?.todayCell,\n isSelected && classNames?.selectedCell,\n isInRange && classNames?.rangeBetweenCell,\n isRangeStart && classNames?.rangeStartCell,\n isRangeEnd && classNames?.rangeEndCell,\n isDisabled && classNames?.disabledCell,\n !isCurrentMonth && classNames?.outsideMonthCell,\n isHoliday && classNames?.holidayCell,\n );\n\n const stateStyles: React.CSSProperties = {\n ...(isToday ? styles?.todayCell : undefined),\n ...(isSelected ? styles?.selectedCell : undefined),\n ...(isInRange ? styles?.rangeBetweenCell : undefined),\n ...(isRangeStart ? styles?.rangeStartCell : undefined),\n ...(isRangeEnd ? styles?.rangeEndCell : undefined),\n ...(!isCurrentMonth ? styles?.outsideMonthCell : undefined),\n ...(isHoliday ? styles?.holidayCell : undefined),\n ...(isDisabled ? styles?.disabledCell : undefined),\n };\n\r\n // انیمیشن transform بر اساس حالتهای مختلف\r\n let transform = \"scale(1)\";\r\n if (isInteractive) {\r\n if (isPressed) {\r\n transform = \"scale(0.92)\";\r\n } else if (isHovered && !isInRange) {\r\n transform = \"scale(1.08)\";\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\n minWidth: 0,\n aspectRatio: \"1 / 1\",\n margin: 0,\r\n padding: 0,\r\n boxSizing: \"border-box\",\r\n }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <button\r\n type=\"button\"\r\n role=\"gridcell\"\r\n tabIndex={tabIndex}\r\n disabled={isDisabled || !isCurrentMonth}\n aria-disabled={isDisabled || !isCurrentMonth}\n aria-selected={isSelected}\r\n aria-label={`${jalali.year}/${jalali.month + 1}/${jalali.day}${\r\n holidayTitle ? ` - ${holidayTitle}` : \"\"\r\n }`}\r\n onClick={handleClick}\r\n onFocus={handleFocus}\r\n onMouseDown={() => isInteractive && setIsPressed(true)}\r\n onMouseUp={() => isInteractive && setIsPressed(false)}\r\n className={stateClassName}\n style={{\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: isRangeStart\r\n ? \"0 8px 8px 0\"\r\n : isRangeEnd\r\n ? \"8px 0 0 8px\"\r\n : isInRange\r\n ? \"0\"\r\n : \"8px\",\r\n border:\r\n isToday && !isSelected\r\n ? \"1px solid var(--pdp-primary, #4f46e5)\"\r\n : \"none\",\r\n backgroundColor: cellBg,\r\n color: textColor,\r\n cursor: isDisabled ? \"not-allowed\" : isInteractive ? \"pointer\" : \"default\",\n fontSize: \"13px\",\r\n fontWeight: isSelected || isToday ? 700 : 500,\r\n outline: \"none\",\r\n position: \"relative\",\r\n padding: 0,\r\n margin: 0,\r\n boxSizing: \"border-box\",\r\n // انیمیشنهای نرم هاور، اسکیل و رنگ\r\n transform,\r\n boxShadow:\r\n isHovered && isInteractive && !isInRange && !isSelected\r\n ? \"0 2px 6px rgba(0, 0, 0, 0.08)\"\r\n : \"none\",\r\n transition:\r\n \"transform 0.16s cubic-bezier(0.34, 1.56, 0.64, 1), background-color 0.14s ease, color 0.14s ease, box-shadow 0.16s ease\",\r\n zIndex: isHovered && isInteractive ? 2 : 1,\n opacity: isDisabled ? 0.42 : isCurrentMonth ? 1 : 0.55,\n filter: isDisabled ? \"grayscale(0.65)\" : undefined,\n ...styles?.dayCell,\n ...stateStyles,\n }}\r\n >\r\n <span>{formattedDay}</span>\r\n\r\n {/* نقاط ایونتها */}\r\n {events.length > 0 && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"3px\",\r\n display: \"flex\",\r\n gap: \"2px\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"transform 0.14s ease\",\r\n transform:\r\n isHovered && isInteractive ? \"translateY(1px)\" : \"none\",\r\n }}\r\n >\r\n {events.slice(0, 3).map((ev) => (\r\n <span\r\n key={ev.id}\r\n style={{\r\n width: \"3.5px\",\r\n height: \"3.5px\",\r\n borderRadius: \"50%\",\r\n backgroundColor: isSelected\r\n ? \"#ffffff\"\r\n : ev.color || \"var(--pdp-primary, #4f46e5)\",\r\n transition: \"background-color 0.14s ease\",\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </button>\r\n\r\n {/* تولتیپ شناور روز با انیمیشن Fade-in / Slide-up */}\r\n {isHovered && isCurrentMonth && (isHoliday || events.length > 0) && (\r\n <div\r\n role=\"tooltip\"\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"calc(100% + 7px)\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n zIndex: 1050,\r\n pointerEvents: \"none\",\r\n whiteSpace: \"nowrap\",\r\n backgroundColor: \"var(--pdp-tooltip-bg, #0f172a)\",\r\n color: \"var(--pdp-tooltip-text, #ffffff)\",\r\n padding: \"5px 9px\",\r\n borderRadius: \"6px\",\r\n fontSize: \"11.5px\",\r\n fontWeight: 600,\r\n lineHeight: 1.3,\r\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.25)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"2px\",\r\n textAlign: \"center\",\r\n animation:\r\n \"pdpTooltipFade 0.15s cubic-bezier(0.16, 1, 0.3, 1) forwards\",\r\n }}\r\n >\r\n {isHoliday && holidayTitle && (\r\n <span style={{ color: \"#fda4af\" }}>{holidayTitle}</span>\r\n )}\r\n\r\n {events.map((ev) => (\r\n <span key={ev.id} style={{ color: \"#e2e8f0\" }}>\r\n • {ev.title}\r\n </span>\r\n ))}\r\n\r\n {/* فلش جهتنمای تولتیپ */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: \"100%\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n borderWidth: \"4px\",\r\n borderStyle: \"solid\",\r\n borderColor:\r\n \"var(--pdp-tooltip-bg, #0f172a) transparent transparent transparent\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// src/components/MonthYearPicker.tsx\r\nimport React, { useState } from \"react\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\nimport {\n isJalaliMonthSelectable,\n isJalaliYearSelectable,\n type JalaliDateConstraints,\n} from \"../core/date-availability\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface MonthYearPickerProps {\r\n currentYear: number;\r\n currentMonth: number;\r\n onSelectMonth: (month: JalaliMonthIndex) => void;\r\n onSelectYear: (year: number) => void;\n minDate?: JalaliDate;\n maxDate?: JalaliDate;\n isDateDisabled?: (date: JalaliDate) => boolean;\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const MonthYearPicker: React.FC<MonthYearPickerProps> = ({\r\n currentYear,\r\n currentMonth,\r\n onSelectMonth,\r\n onSelectYear,\n minDate,\n maxDate,\n isDateDisabled,\n classNames,\r\n styles,\r\n}) => {\r\n const [viewLevel, setViewLevel] = useState<\"months\" | \"years\">(\"months\");\r\n const [decadeStartYear, setDecadeStartYear] = useState<number>(\r\n () => Math.floor(currentYear / 10) * 10,\r\n );\r\n const [activeYear, setActiveYear] = useState<number>(currentYear);\r\n\r\n const decadeYears = Array.from(\n { length: 12 },\r\n (_, i) => decadeStartYear - 1 + i,\r\n );\n\n const constraints: JalaliDateConstraints = {\n minDate,\n maxDate,\n isDateDisabled,\n };\n const canSelectYear = (year: number) =>\n isJalaliYearSelectable(year, constraints);\n const canSelectMonth = (year: number, month: JalaliMonthIndex) =>\n isJalaliMonthSelectable(year, month, constraints);\n const previousPeriodDisabled =\n viewLevel === \"months\"\n ? !canSelectYear(activeYear - 1)\n : !Array.from({ length: 10 }, (_, i) => decadeStartYear - 10 + i).some(\n canSelectYear,\n );\n const nextPeriodDisabled =\n viewLevel === \"months\"\n ? !canSelectYear(activeYear + 1)\n : !Array.from({ length: 10 }, (_, i) => decadeStartYear + 10 + i).some(\n canSelectYear,\n );\n\r\n const handlePrev = () => {\n if (previousPeriodDisabled) return;\n if (viewLevel === \"months\") {\r\n const prevY = activeYear - 1;\r\n setActiveYear(prevY);\r\n onSelectYear(prevY);\r\n } else {\r\n setDecadeStartYear((prev) => prev - 10);\r\n }\r\n };\r\n\r\n const handleNext = () => {\n if (nextPeriodDisabled) return;\n if (viewLevel === \"months\") {\r\n const nextY = activeYear + 1;\r\n setActiveYear(nextY);\r\n onSelectYear(nextY);\r\n } else {\r\n setDecadeStartYear((prev) => prev + 10);\r\n }\r\n };\r\n\r\n const navBtnStyle: React.CSSProperties = {\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n padding: \"6px\",\r\n borderRadius: \"8px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n transition: \"all 0.15s ease\",\r\n };\r\n\r\n const cellBtnBaseStyle: React.CSSProperties = {\r\n height: \"46px\",\r\n borderRadius: \"10px\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n fontSize: \"13.5px\",\r\n fontWeight: 600,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"all 0.15s ease\",\r\n background: \"transparent\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n userSelect: \"none\",\r\n };\r\n\r\n return (\r\n <div\r\n className={classNames?.calendar}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"10px\",\r\n width: \"100%\",\r\n minWidth: 0,\n maxWidth: \"100%\",\n height: \"260px\",\r\n padding: \"6px\",\r\n boxSizing: \"border-box\",\r\n justifyContent: \"space-between\",\r\n userSelect: \"none\",\r\n ...styles?.calendar,\r\n }}\r\n >\r\n {/* Header Bar */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 4px\",\r\n height: \"38px\",\r\n }}\r\n >\r\n {/* Right Arrow (Previous in RTL) */}\r\n <button\n type=\"button\"\n onClick={handlePrev}\n disabled={previousPeriodDisabled}\n aria-disabled={previousPeriodDisabled}\n aria-label=\"Previous\"\n className={mergeClassNames(\n classNames?.navButton,\n previousPeriodDisabled && classNames?.disabledNavButton,\n )}\n style={{\n ...navBtnStyle,\n cursor: previousPeriodDisabled ? \"not-allowed\" : \"pointer\",\n opacity: previousPeriodDisabled ? 0.38 : 1,\n ...(previousPeriodDisabled\n ? styles?.disabledNavButton\n : undefined),\n }}\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Header Year Button (Clearly Interactive) */}\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (viewLevel === \"months\") {\r\n setDecadeStartYear(Math.floor(activeYear / 10) * 10);\r\n setViewLevel(\"years\");\r\n }\r\n }}\r\n style={{\r\n background:\r\n viewLevel === \"months\"\r\n ? \"var(--pdp-surface-subtle, #f1f5f9)\"\r\n : \"transparent\",\r\n border:\r\n viewLevel === \"months\"\r\n ? \"1px solid var(--pdp-surface-border, #e2e8f0)\"\r\n : \"none\",\r\n cursor: viewLevel === \"months\" ? \"pointer\" : \"default\",\r\n fontSize: \"13.5px\",\r\n fontWeight: 700,\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n padding: \"5px 12px\",\r\n borderRadius: \"8px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"6px\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (viewLevel === \"months\") {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #e2e8f0)\";\r\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (viewLevel === \"months\") {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-surface-subtle, #f1f5f9)\";\r\n e.currentTarget.style.borderColor =\r\n \"var(--pdp-surface-border, #e2e8f0)\";\r\n }\r\n }}\r\n >\r\n <span>\r\n {viewLevel === \"months\"\r\n ? toPersianDigits(activeYear)\r\n : `${toPersianDigits(decadeStartYear)} - ${toPersianDigits(decadeStartYear + 9)}`}\r\n </span>\r\n\r\n {viewLevel === \"months\" && (\r\n <svg\r\n width=\"13\"\r\n height=\"13\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{ opacity: 0.7 }}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n )}\r\n </button>\r\n\r\n {/* Left Arrow (Next in RTL) */}\r\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={nextPeriodDisabled}\n aria-disabled={nextPeriodDisabled}\n aria-label=\"Next\"\n className={mergeClassNames(\n classNames?.navButton,\n nextPeriodDisabled && classNames?.disabledNavButton,\n )}\n style={{\n ...navBtnStyle,\n cursor: nextPeriodDisabled ? \"not-allowed\" : \"pointer\",\n opacity: nextPeriodDisabled ? 0.38 : 1,\n ...(nextPeriodDisabled ? styles?.disabledNavButton : undefined),\n }}\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Grid Content: 4 Columns x 3 Rows */}\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(4, 1fr)\",\r\n gridTemplateRows: \"repeat(3, 1fr)\",\r\n gap: \"8px 6px\",\r\n flex: 1,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {viewLevel === \"months\"\r\n ? PERSIAN_MONTH_NAMES.map((name, index) => {\n const isSelected =\n index === currentMonth && activeYear === currentYear;\n const isDisabled = !canSelectMonth(\n activeYear,\n index as JalaliMonthIndex,\n );\n return (\n <button\n key={name}\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n onClick={() => onSelectMonth(index as JalaliMonthIndex)}\n className={mergeClassNames(\n classNames?.monthButton,\n isSelected && classNames?.selectedMonthButton,\n isDisabled && classNames?.disabledMonthButton,\n )}\n style={{\n ...cellBtnBaseStyle,\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontWeight: isSelected ? 700 : 500,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n ...(styles?.monthButton ?? {}),\n ...(isSelected ? styles?.selectedMonthButton : undefined),\n ...(isDisabled ? styles?.disabledMonthButton : undefined),\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {name}\r\n </button>\r\n );\r\n })\r\n : decadeYears.map((year, idx) => {\n const isOutlier = idx === 0 || idx === 11;\n const isSelected = year === activeYear;\n const isDisabled = !canSelectYear(year);\n\r\n return (\r\n <button\r\n key={year}\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n className={mergeClassNames(\n classNames?.yearButton,\n isSelected && classNames?.selectedYearButton,\n isDisabled && classNames?.disabledYearButton,\n )}\n onClick={() => {\r\n setActiveYear(year);\r\n onSelectYear(year);\r\n setViewLevel(\"months\");\r\n }}\r\n style={{\r\n ...cellBtnBaseStyle,\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : isOutlier\r\n ? \"var(--pdp-text-disabled, #94a3b8)\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontWeight: isSelected ? 700 : 500,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.3 : isOutlier ? 0.4 : 1,\n ...(styles?.yearButton ?? {}),\n ...(isSelected ? styles?.selectedYearButton : undefined),\n ...(isDisabled ? styles?.disabledYearButton : undefined),\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {toPersianDigits(year)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import type { JalaliTime } from \"./types\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\n\r\n/**\r\n * Formats a single time segment (e.g. hour/minute) as a 2-digit padded string.\r\n */\r\nexport function formatTimeSegment(\r\n val: number,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n const padded = val < 10 ? `0${val}` : `${val}`;\r\n return digitType === \"persian\" ? toPersianDigits(padded) : padded;\r\n}\r\n\r\n/**\r\n * Retrieves the current local machine time as a JalaliTime structure.\r\n */\r\nexport function getCurrentTime(): JalaliTime {\r\n const now = new Date();\r\n return {\r\n hour: now.getHours(),\r\n minute: now.getMinutes(),\r\n second: now.getSeconds(),\r\n };\r\n}\r\n\r\n/**\r\n * Clamps hour, minute, and second within valid boundary ranges.\r\n */\r\nexport function clampTime(time: JalaliTime): JalaliTime {\r\n return {\r\n hour: Math.max(0, Math.min(23, time.hour)),\r\n minute: Math.max(0, Math.min(59, time.minute)),\r\n second:\r\n time.second !== undefined\r\n ? Math.max(0, Math.min(59, time.second))\r\n : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Formats a JalaliTime object into a display string (e.g., \"14:30\" or \"۱۴:۳۰\").\r\n */\r\nexport function formatTimeString(\r\n time: JalaliTime | null | undefined,\r\n showSeconds = false,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n if (!time) return \"\";\r\n const h = formatTimeSegment(time.hour, digitType);\r\n const m = formatTimeSegment(time.minute, digitType);\r\n if (showSeconds && time.second !== undefined) {\r\n const s = formatTimeSegment(time.second, digitType);\r\n return `${h}:${m}:${s}`;\r\n }\r\n return `${h}:${m}`;\r\n}\r\n","import React from \"react\";\r\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport { formatTimeString } from \"../../plugins/time-picker/time-utils\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\nimport type { CalendarFooterProps } from \"./types\";\r\n\r\nexport const CalendarFooter: React.FC<CalendarFooterProps> = ({\r\n selectedDate,\r\n selectedRange,\r\n selectedDates,\r\n selectedTime,\r\n showSeconds = false,\r\n mode = \"single\",\r\n digitType = \"persian\",\r\n showStatusText = true,\r\n showActions = true,\r\n onToday,\r\n onClear,\r\n onConfirm,\r\n direction = \"rtl\",\r\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n\r\n const statusText = (() => {\r\n if (mode === \"single\") {\r\n if (!selectedDate) return \"تاریخی انتخاب نشده\";\r\n const date = formatJalaliDate(selectedDate, \"YYYY/MM/DD\", { digitType });\r\n const time = selectedTime\r\n ? formatTimeString(selectedTime, showSeconds, digitType)\r\n : \"\";\r\n return time ? `${date}، ${time}` : date;\r\n }\r\n\r\n if (mode === \"range\") {\r\n const [start, end] = selectedRange ?? [null, null];\r\n if (!start) return \"بازهای انتخاب نشده\";\r\n const startText = formatJalaliDate(start, \"YYYY/MM/DD\", { digitType });\r\n if (!end) return `${startText} تا …`;\r\n const endText = formatJalaliDate(end, \"YYYY/MM/DD\", { digitType });\r\n return `${startText} تا ${endText}`;\r\n }\r\n\r\n const count = selectedDates?.length ?? 0;\r\n const displayCount =\r\n digitType === \"persian\" ? toPersianDigits(count) : String(count);\r\n return count ? `${displayCount} تاریخ انتخاب شده` : \"تاریخی انتخاب نشده\";\r\n })();\r\n\r\n const actionButtonStyle: React.CSSProperties = {\r\n minHeight: \"34px\",\r\n padding: \"5px 12px\",\r\n borderRadius: theme.radii.sm,\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textSecondary,\r\n cursor: \"pointer\",\r\n fontFamily: \"inherit\",\r\n fontSize: \"0.78rem\",\r\n fontWeight: 600,\r\n };\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={classNames?.footer}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: showStatusText ? \"space-between\" : \"flex-end\",\r\n flexWrap: \"wrap\",\n gap: \"8px\",\n width: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n padding: \"10px 0 0\",\r\n borderTop: `1px solid ${theme.colors.border}`,\r\n color: theme.colors.textPrimary,\r\n ...styles?.footer,\r\n }}\r\n >\r\n {showStatusText && (\r\n <span\r\n className={classNames?.footerStatus}\r\n style={{\r\n color: theme.colors.textSecondary,\r\n fontSize: \"0.78rem\",\n lineHeight: 1.5,\n minWidth: 0,\n overflowWrap: \"anywhere\",\n ...styles?.footerStatus,\r\n }}\r\n >\r\n {statusText}\r\n </span>\r\n )}\r\n\r\n {showActions && (\r\n <div\r\n className={classNames?.footerActions}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n flexWrap: \"wrap\",\r\n gap: \"6px\",\r\n ...styles?.footerActions,\r\n }}\r\n >\r\n {onToday && (\r\n <button\r\n type=\"button\"\r\n onClick={onToday}\r\n className={classNames?.todayButton}\r\n style={{\r\n ...actionButtonStyle,\r\n color: theme.colors.primary,\r\n ...styles?.todayButton,\r\n }}\r\n >\r\n امروز\r\n </button>\r\n )}\r\n {onClear && (\r\n <button\r\n type=\"button\"\r\n onClick={onClear}\r\n className={classNames?.clearButton}\r\n style={{ ...actionButtonStyle, ...styles?.clearButton }}\r\n >\r\n پاک کردن\r\n </button>\r\n )}\r\n {onConfirm && (\r\n <button\r\n type=\"button\"\r\n onClick={onConfirm}\r\n className={classNames?.confirmButton}\r\n style={{\r\n ...actionButtonStyle,\r\n borderColor: theme.colors.primary,\r\n backgroundColor: theme.colors.primary,\r\n color: theme.colors.primaryText,\r\n ...styles?.confirmButton,\r\n }}\r\n >\r\n تأیید\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// src/plugins/time-picker/TimePicker.tsx\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport type { JalaliTime } from \"./types\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../../theme/style-slots\";\r\n\r\nexport interface TimePickerProps {\r\n value: JalaliTime;\r\n onChange: (time: JalaliTime) => void;\r\n minuteStep?: number;\r\n hourStep?: number;\r\n showSeconds?: boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const TimePicker: React.FC<TimePickerProps> = ({\r\n value,\r\n onChange,\r\n minuteStep = 1,\r\n hourStep = 1,\r\n showSeconds = false,\r\n digitType = \"persian\",\r\n classNames,\r\n styles,\r\n}) => {\r\n const [openDropdown, setOpenDropdown] = useState<\r\n \"hour\" | \"minute\" | \"second\" | null\r\n >(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const hours = Array.from(\r\n { length: Math.ceil(24 / hourStep) },\r\n (_, i) => i * hourStep,\r\n );\r\n const minutes = Array.from(\r\n { length: Math.ceil(60 / minuteStep) },\r\n (_, i) => i * minuteStep,\r\n );\r\n const seconds = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n // Close dropdown on outside click\r\n useEffect(() => {\r\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n setOpenDropdown(null);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleOutsideClick);\r\n document.addEventListener(\"touchstart\", handleOutsideClick);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleOutsideClick);\r\n document.removeEventListener(\"touchstart\", handleOutsideClick);\r\n };\r\n }, []);\r\n\r\n const formatNum = (n: number) => {\r\n const formatted = String(n).padStart(2, \"0\");\r\n return digitType === \"persian\" ? toPersianDigits(formatted) : formatted;\r\n };\r\n\r\n const renderSelectColumn = (\r\n type: \"hour\" | \"minute\" | \"second\",\r\n currentVal: number,\r\n options: number[],\r\n onSelect: (val: number) => void,\r\n ) => {\r\n const isOpen = openDropdown === type;\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n {/* Clickable Badge Trigger */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setOpenDropdown(isOpen ? null : type)}\r\n style={{\r\n minWidth: \"40px\",\r\n height: \"30px\",\r\n padding: \"0 6px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: \"6px\",\r\n backgroundColor: isOpen\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"var(--pdp-surface-bg, #ffffff)\",\r\n color: isOpen ? \"#ffffff\" : \"var(--pdp-text-primary, #0f172a)\",\r\n border: `1px solid ${isOpen ? \"var(--pdp-primary, #4f46e5)\" : \"var(--pdp-surface-border, #e2e8f0)\"}`,\r\n fontSize: \"13px\",\r\n fontWeight: 700,\r\n cursor: \"pointer\",\r\n transition: \"all 0.15s ease\",\r\n boxShadow: isOpen ? \"0 0 0 2px rgba(79, 70, 229, 0.2)\" : \"none\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isOpen) {\r\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isOpen) {\r\n e.currentTarget.style.borderColor =\r\n \"var(--pdp-surface-border, #e2e8f0)\";\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-surface-bg, #ffffff)\";\r\n }\r\n }}\r\n >\r\n {formatNum(currentVal)}\r\n </button>\r\n\r\n {/* Scrollable Dropdown List */}\r\n {isOpen && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"calc(100% + 4px)\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n maxHeight: \"140px\",\r\n width: \"52px\",\r\n overflowY: \"auto\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n borderRadius: \"8px\",\r\n boxShadow:\r\n \"var(--pdp-shadow, 0 10px 15px -3px rgba(0, 0, 0, 0.15))\",\r\n zIndex: 1050,\r\n padding: \"4px 2px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"2px\",\r\n }}\r\n >\r\n {options.map((opt) => {\r\n const isSelected = opt === currentVal;\r\n return (\r\n <button\r\n key={opt}\r\n type=\"button\"\r\n onClick={() => {\r\n onSelect(opt);\r\n setOpenDropdown(null);\r\n }}\r\n style={{\r\n padding: \"4px 0\",\r\n border: \"none\",\r\n borderRadius: \"4px\",\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontSize: \"12px\",\r\n fontWeight: isSelected ? 700 : 500,\r\n cursor: \"pointer\",\r\n transition: \"background 0.12s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {formatNum(opt)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={classNames?.timePicker}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n gap: \"6px\",\r\n padding: \"6px 12px\",\r\n borderTop: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n backgroundColor: \"var(--pdp-surface-subtle, #f8fafc)\",\r\n borderRadius:\r\n \"0 0 var(--pdp-border-radius, 10px) var(--pdp-border-radius, 10px)\",\r\n direction: \"ltr\",\r\n userSelect: \"none\",\n width: \"100%\",\n maxWidth: \"100%\",\n boxSizing: \"border-box\",\n ...styles?.timePicker,\r\n }}\r\n >\r\n {/* ساعت */}\r\n {renderSelectColumn(\"hour\", value.hour, hours, (h) =>\r\n onChange({ ...value, hour: h }),\r\n )}\r\n\r\n <span\r\n style={{\r\n fontWeight: 800,\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n fontSize: \"14px\",\r\n }}\r\n >\r\n :\r\n </span>\r\n\r\n {/* دقیقه */}\r\n {renderSelectColumn(\"minute\", value.minute, minutes, (m) =>\r\n onChange({ ...value, minute: m }),\r\n )}\r\n\r\n {/* ثانیه */}\r\n {showSeconds && (\r\n <>\r\n <span\r\n style={{\r\n fontWeight: 800,\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n fontSize: \"14px\",\r\n }}\r\n >\r\n :\r\n </span>\r\n {renderSelectColumn(\"second\", value.second ?? 0, seconds, (s) =>\r\n onChange({ ...value, second: s }),\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import type { JalaliDate, JalaliMonthIndex } from \"../../core/types\";\r\nimport type { DateParseResult } from \"./types\";\r\nimport {\r\n toLatinDigits,\r\n toPersianDigits,\r\n} from \"../../formatters/persian-digits\";\r\nimport { getDaysInJalaliMonth } from \"../../core/jalali-math\";\r\nimport { compareJalaliDates } from \"../../core/jalali-helpers\";\r\n\r\n/**\r\n * Strips all non-digit characters and applies the 'YYYY/MM/DD' mask structure.\r\n */\r\nexport function applyDateMask(\r\n rawInput: string,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n // Normalize all Persian/Arabic digits to ASCII 0-9\r\n const cleanDigits = toLatinDigits(rawInput).replace(/\\D/g, \"\").slice(0, 8);\r\n\r\n let masked = \"\";\r\n if (cleanDigits.length > 0) {\r\n masked = cleanDigits.slice(0, 4); // Year (YYYY)\r\n }\r\n if (cleanDigits.length >= 5) {\r\n masked += `/${cleanDigits.slice(4, 6)}`; // Month (MM)\r\n }\r\n if (cleanDigits.length >= 7) {\r\n masked += `/${cleanDigits.slice(6, 8)}`; // Day (DD)\r\n }\r\n\r\n return digitType === \"persian\" ? toPersianDigits(masked) : masked;\r\n}\r\n\r\n/**\r\n * Validates and parses a masked string into a valid JalaliDate object.\r\n */\r\nexport function parseAndValidateJalaliString(\r\n input: string,\r\n minDate?: JalaliDate,\r\n maxDate?: JalaliDate,\r\n isDateDisabled?: (date: JalaliDate) => boolean,\r\n): DateParseResult {\r\n const normalized = toLatinDigits(input).trim();\r\n\r\n if (!normalized) {\r\n return { isValid: true, date: null };\r\n }\r\n\r\n const parts = normalized.split(\"/\");\r\n if (\r\n parts.length !== 3 ||\r\n parts[0].length !== 4 ||\r\n parts[1].length !== 2 ||\r\n parts[2].length !== 2\r\n ) {\r\n return { isValid: false, date: null, error: \"INVALID_FORMAT\" };\r\n }\r\n\r\n const year = parseInt(parts[0], 10);\r\n const monthNum = parseInt(parts[1], 10);\r\n const day = parseInt(parts[2], 10);\r\n\r\n // Validate Month Range (1 to 12)\r\n if (monthNum < 1 || monthNum > 12) {\r\n return { isValid: false, date: null, error: \"INVALID_MONTH\" };\r\n }\r\n\r\n const monthIndex = (monthNum - 1) as JalaliMonthIndex;\r\n const maxDays = getDaysInJalaliMonth(year, monthIndex);\r\n\r\n // Validate Day Range (1 to 29/30/31 based on month & leap year)\r\n if (day < 1 || day > maxDays) {\r\n return { isValid: false, date: null, error: \"INVALID_DAY\" };\r\n }\r\n\r\n const jalaliDate: JalaliDate = { year, month: monthIndex, day };\r\n\r\n // Min / Max range validations\r\n if (minDate && compareJalaliDates(jalaliDate, minDate) < 0) {\r\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MIN_BOUNDS\" };\r\n }\r\n\r\n if (maxDate && compareJalaliDates(jalaliDate, maxDate) > 0) {\r\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MAX_BOUNDS\" };\r\n }\r\n\r\n // Custom disable rule\r\n if (isDateDisabled && isDateDisabled(jalaliDate)) {\r\n return { isValid: false, date: jalaliDate, error: \"DISABLED_DATE\" };\r\n }\r\n\r\n return { isValid: true, date: jalaliDate };\r\n}\r\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\r\nimport type { MaskedDateInputProps, DateValidationError } from \"./types\";\r\nimport { applyDateMask, parseAndValidateJalaliString } from \"./mask-utils\";\r\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\r\nimport type { JalaliDate } from \"../../core/types\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\n\r\nexport const MaskedDateInput: React.FC<MaskedDateInputProps> = ({\r\n value,\r\n defaultValue = null,\r\n onChange,\r\n onValidationError,\r\n digitType = \"persian\",\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n clearable = true,\r\n placeholder = \"۱۴۰۵/۰۱/۱۵\",\r\n disabled = false,\r\n direction = \"rtl\",\r\n wrapperClassName,\r\n wrapperStyle,\r\n clearButtonClassName,\r\n clearButtonStyle,\r\n style,\r\n ...restProps\r\n}) => {\r\n const { theme } = useTheme();\r\n const [internalValue, setInternalValue] = useState<JalaliDate | null>(\r\n defaultValue,\r\n );\r\n const activeDate = value !== undefined ? value : internalValue;\r\n\r\n const [text, setText] = useState<string>(() => {\r\n return activeDate\r\n ? formatJalaliDate(activeDate, \"YYYY/MM/DD\", { digitType })\r\n : \"\";\r\n });\r\n\r\n const [hasError, setHasError] = useState<boolean>(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Sync text input with incoming controlled value updates\r\n useEffect(() => {\r\n if (value !== undefined) {\r\n setText(\r\n value ? formatJalaliDate(value, \"YYYY/MM/DD\", { digitType }) : \"\",\r\n );\r\n setHasError(false);\r\n }\r\n }, [value, digitType]);\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const rawVal = e.target.value;\r\n const maskedVal = applyDateMask(rawVal, digitType);\r\n setText(maskedVal);\r\n\r\n // Validate only if complete date is typed (10 chars: YYYY/MM/DD) or empty\r\n if (maskedVal.length === 10 || maskedVal.length === 0) {\r\n const result = parseAndValidateJalaliString(\r\n maskedVal,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n );\r\n\r\n if (result.isValid) {\r\n setHasError(false);\r\n onValidationError?.(null);\r\n if (value === undefined) {\r\n setInternalValue(result.date);\r\n }\r\n onChange?.(result.date);\r\n } else {\r\n setHasError(true);\r\n onValidationError?.(result.error as DateValidationError);\r\n }\r\n } else {\r\n // Incomplete state\r\n setHasError(false);\r\n onValidationError?.(null);\r\n }\r\n };\r\n\r\n const handleClear = useCallback(() => {\r\n setText(\"\");\r\n setHasError(false);\r\n onValidationError?.(null);\r\n if (value === undefined) {\r\n setInternalValue(null);\r\n }\r\n onChange?.(null);\r\n inputRef.current?.focus();\r\n }, [value, onChange, onValidationError]);\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={wrapperClassName}\r\n style={{\r\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n width: \"100%\",\n maxWidth: \"180px\",\n ...wrapperStyle,\r\n }}\r\n >\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n disabled={disabled}\r\n placeholder={digitType === \"persian\" ? placeholder : \"1405/01/15\"}\r\n value={text}\r\n onChange={handleInputChange}\r\n style={{\r\n width: \"180px\",\n maxWidth: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n padding: \"8px 12px\",\r\n paddingInlineEnd: clearable && text ? \"32px\" : \"12px\",\r\n borderRadius: theme.radii.sm,\r\n border: `1px solid ${hasError ? theme.colors.holiday : theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n fontSize: \"14px\",\r\n fontFamily: \"inherit\",\r\n outlineColor: theme.colors.primary,\r\n textAlign: \"center\",\r\n letterSpacing: \"1px\",\r\n transition: \"border-color 0.15s ease\",\r\n ...style,\r\n }}\r\n {...restProps}\r\n />\r\n\r\n {/* Clear Button */}\r\n {clearable && text && !disabled && (\r\n <button\r\n type=\"button\"\r\n aria-label=\"پاک کردن\"\r\n onClick={handleClear}\r\n className={clearButtonClassName}\r\n style={{\r\n position: \"absolute\",\r\n insetInlineEnd: \"8px\",\r\n background: \"none\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n color: theme.colors.textSecondary,\r\n fontSize: \"14px\",\r\n lineHeight: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"2px\",\r\n ...clearButtonStyle,\r\n }}\r\n >\r\n ✕\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { CalendarEvent } from \"./types\";\r\n\r\n/**\r\n * Filters and returns all events matching a specific Jalali date.\r\n */\r\nexport function getEventsForDate(\r\n date: JalaliDate,\r\n events?: CalendarEvent[],\r\n): CalendarEvent[] {\r\n if (!events || events.length === 0) return [];\r\n return events.filter((e) => isSameJalaliDay(e.date, date));\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport type { OfficialHoliday, CustomHolidayRule } from \"./types\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\n\r\n/**\r\n * Fixed Solar Calendar Holidays in Iran:\r\n * Key format: `${monthIndex}-${day}` (Month index is 0-based: 0 = Farvardin, 11 = Esfand)\r\n */\r\nconst FIXED_SOLAR_HOLIDAYS: Record<string, string> = {\r\n \"0-1\": \"جشن نوروز / سال نو\",\r\n \"0-2\": \"عید نوروز\",\r\n \"0-3\": \"عید نوروز\",\r\n \"0-4\": \"عید نوروز\",\r\n \"0-12\": \"روز جمهوری اسلامی ایران\",\r\n \"0-13\": \"روز طبیعت (سیزدهبدر)\",\r\n \"2-14\": \"رحلت امام خمینی\",\r\n \"2-15\": \"قیام ۱۵ خرداد\",\r\n \"10-22\": \"پیروزی انقلاب اسلامی\",\r\n \"11-29\": \"روز ملی شدن صنعت نفت\",\r\n};\r\n\r\n/**\r\n * Checks if a given Jalali date is Friday (جمعه).\r\n */\r\nexport function isJalaliFriday(date: JalaliDate): boolean {\r\n const g = jalaliToGregorian(date.year, date.month, date.day);\r\n return g.getDay() === 5; // In JS Date.getDay(), 5 represents Friday\r\n}\r\n\r\n/**\r\n * Resolves holiday info for a JalaliDate based purely on solar calendar rules and custom overrides.\r\n */\r\nexport function getOfficialHoliday(\r\n date: JalaliDate,\r\n customHolidays?: CustomHolidayRule[],\r\n): OfficialHoliday | null {\r\n // 1. Check Custom User-Defined Holidays\r\n if (customHolidays && customHolidays.length > 0) {\r\n const custom = customHolidays.find(\r\n (h) =>\r\n h.date.year === date.year &&\r\n h.date.month === date.month &&\r\n h.date.day === date.day,\r\n );\r\n if (custom) {\r\n return {\r\n title: custom.title,\r\n type: \"custom\",\r\n isOff: custom.isOff ?? true,\r\n };\r\n }\r\n }\r\n\r\n // 2. Check Fixed Solar Holidays (O(1) Hash Map Lookup)\r\n const solarKey = `${date.month}-${date.day}`;\r\n if (FIXED_SOLAR_HOLIDAYS[solarKey]) {\r\n return {\r\n title: FIXED_SOLAR_HOLIDAYS[solarKey],\r\n type: \"solar\",\r\n isOff: true,\r\n };\r\n }\r\n\r\n // 3. Check Friday (End of Week)\r\n if (isJalaliFriday(date)) {\r\n return { title: \"جمعه (تعطیل پایان هفته)\", type: \"solar\", isOff: true };\r\n }\r\n\r\n return null;\r\n}\r\n","// src/components/JalaliDatePicker.tsx\r\nimport React, {\r\n useState,\r\n useRef,\r\n useCallback,\r\n useMemo,\r\n useEffect,\r\n} from \"react\";\r\nimport { useJalaliDatePicker } from \"../hooks/useJalaliDatePicker\";\r\nimport { useCalendarKeyboard } from \"../a11y/useCalendarKeyboard\";\r\nimport type {\r\n SelectionMode,\r\n JalaliDateRange,\r\n InternalSelectedValue,\r\n SelectedDateValue,\r\n DateRange,\r\n} from \"../hooks/types\";\r\nimport { Header } from \"./Header\";\r\nimport { Weekdays } from \"./Weekdays\";\r\nimport { DayCell } from \"./DayCell\";\r\nimport { MonthYearPicker } from \"./MonthYearPicker\";\r\nimport type {\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n JalaliCalendarCell,\r\n} from \"../core/types\";\r\nimport { formatJalaliDate } from \"../formatters/jalali-formatter\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport { CalendarFooter } from \"./footer/CalendarFooter\";\r\nimport { TimePicker } from \"../plugins/time-picker/TimePicker\";\r\nimport type { JalaliTime } from \"../plugins/time-picker/types\";\r\nimport {\r\n formatTimeString,\r\n getCurrentTime,\r\n} from \"../plugins/time-picker/time-utils\";\r\nimport { MaskedDateInput } from \"./masked-input/MaskedDateInput\";\r\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\r\nimport {\r\n isJalaliDateBetween,\r\n jsDateToJalali,\r\n jalaliToJsDate,\r\n} from \"../core/jalali-helpers\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { CalendarEvent } from \"../events/types\";\r\nimport { getEventsForDate } from \"../events/event-utils\";\r\nimport { getOfficialHoliday } from \"../holidays\";\r\nimport type { CustomHolidayRule } from \"../holidays/types\";\r\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { isJalaliMonthSelectable } from \"../core/date-availability\";\n\r\nexport interface JalaliDatePickerProps<M extends SelectionMode = \"single\"> {\r\n mode?: M;\r\n value?: SelectedDateValue<M>;\r\n defaultValue?: SelectedDateValue<M>;\r\n onChange?: (val: SelectedDateValue<M>) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n isDateDisabled?: (date: Date) => boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n variant?: \"inline\" | \"popover\" | \"modal\";\r\n placeholder?: string;\r\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n showFooter?: boolean;\r\n showStatusText?: boolean;\r\n allowClear?: boolean;\r\n enableTime?: boolean;\r\n timeValue?: JalaliTime | null;\r\n defaultTimeValue?: JalaliTime;\r\n onTimeChange?: (time: JalaliTime) => void;\r\n minuteStep?: number;\r\n hourStep?: number;\r\n showSeconds?: boolean;\r\n numberOfMonths?: 1 | 2;\r\n useMaskedInput?: boolean;\r\n events?: CalendarEvent[];\r\n showHolidays?: boolean;\r\n customHolidays?: CustomHolidayRule[];\r\n zIndex?: number;\r\n}\r\n\r\nexport function JalaliDatePicker<M extends SelectionMode = \"single\">({\r\n mode = \"single\" as M,\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n firstDayOfWeek = 0,\r\n variant = \"popover\",\r\n placeholder = \"YYYY/MM/DD\",\r\n digitType = \"persian\",\r\n className,\r\n style,\r\n classNames,\r\n styles,\r\n showFooter = true,\r\n showStatusText = true,\r\n allowClear = true,\r\n enableTime = false,\r\n timeValue,\r\n defaultTimeValue,\r\n onTimeChange,\r\n minuteStep = 1,\r\n hourStep = 1,\r\n showSeconds = false,\r\n numberOfMonths = 1,\r\n useMaskedInput = false,\r\n events,\r\n showHolidays = false,\r\n customHolidays,\r\n zIndex = 9999,\r\n}: JalaliDatePickerProps<M>) {\r\n const [isOpen, setIsOpen] = useState(variant === \"inline\");\r\n const [showMonthYearPicker, setShowMonthYearPicker] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const isModal = variant === \"modal\";\r\n\r\n useEffect(() => {\r\n if (variant === \"inline\") {\r\n setIsOpen(true);\r\n }\r\n }, [variant]);\r\n\r\n const initialTime = useMemo<JalaliTime>(() => {\r\n if (defaultTimeValue) return defaultTimeValue;\r\n if (value instanceof Date) {\r\n return {\r\n hour: value.getHours(),\r\n minute: value.getMinutes(),\r\n second: value.getSeconds(),\r\n };\r\n }\r\n if (defaultValue instanceof Date) {\r\n return {\r\n hour: defaultValue.getHours(),\r\n minute: defaultValue.getMinutes(),\r\n second: defaultValue.getSeconds(),\r\n };\r\n }\r\n return getCurrentTime();\r\n }, [defaultTimeValue, value, defaultValue]);\r\n\r\n const [internalTime, setInternalTime] = useState<JalaliTime>(initialTime);\r\n const activeTime =\r\n timeValue !== undefined ? (timeValue ?? getCurrentTime()) : internalTime;\r\n\r\n useEffect(() => {\r\n if (variant === \"inline\" || !isOpen) return;\r\n\r\n const handleClickOutside = (e: MouseEvent | TouchEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n setShowMonthYearPicker(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"touchstart\", handleClickOutside, {\r\n passive: true,\r\n });\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"touchstart\", handleClickOutside);\r\n };\r\n }, [variant, isOpen]);\r\n\r\n const internalJalaliValue = useMemo<\r\n InternalSelectedValue<M> | undefined\r\n >(() => {\r\n if (value === undefined) return undefined;\r\n if (!value) return null as InternalSelectedValue<M>;\r\n if (value instanceof Date) {\r\n return jsDateToJalali(value) as InternalSelectedValue<M>;\r\n }\r\n if (Array.isArray(value)) {\r\n if (mode === \"range\") {\r\n const [start, end] = value as DateRange;\r\n return [\r\n start ? jsDateToJalali(start) : null,\r\n end ? jsDateToJalali(end) : null,\r\n ] as InternalSelectedValue<M>;\r\n }\r\n if (mode === \"multiple\") {\r\n return (value as Date[]).map((d) =>\r\n jsDateToJalali(d),\r\n ) as InternalSelectedValue<M>;\r\n }\r\n }\r\n return null as InternalSelectedValue<M>;\r\n }, [value, mode]);\r\n\r\n const internalDefaultJalaliValue = useMemo<\r\n InternalSelectedValue<M> | undefined\r\n >(() => {\r\n if (defaultValue === undefined) return undefined;\r\n if (!defaultValue) return null as InternalSelectedValue<M>;\r\n if (defaultValue instanceof Date) {\r\n return jsDateToJalali(defaultValue) as InternalSelectedValue<M>;\r\n }\r\n if (Array.isArray(defaultValue)) {\r\n if (mode === \"range\") {\r\n const [start, end] = defaultValue as DateRange;\r\n return [\r\n start ? jsDateToJalali(start) : null,\r\n end ? jsDateToJalali(end) : null,\r\n ] as InternalSelectedValue<M>;\r\n }\r\n if (mode === \"multiple\") {\r\n return (defaultValue as Date[]).map((d) =>\r\n jsDateToJalali(d),\r\n ) as InternalSelectedValue<M>;\r\n }\r\n }\r\n return null as InternalSelectedValue<M>;\r\n }, [defaultValue, mode]);\r\n\r\n const internalMinDate = useMemo(\r\n () => (minDate ? jsDateToJalali(minDate) : undefined),\r\n [minDate],\r\n );\r\n const internalMaxDate = useMemo(\n () => (maxDate ? jsDateToJalali(maxDate) : undefined),\r\n [maxDate],\r\n );\n\n const internalIsDateDisabled = useCallback(\n (jDate: JalaliDate) =>\n isDateDisabled ? isDateDisabled(jalaliToJsDate(jDate)) : false,\n [isDateDisabled],\n );\n\r\n const convertJalaliToDateOutput = useCallback(\r\n (\r\n jVal: InternalSelectedValue<M>,\r\n specificTime?: JalaliTime,\r\n ): SelectedDateValue<M> => {\r\n if (!jVal) return null as SelectedDateValue<M>;\r\n\r\n const t = specificTime ?? activeTime;\r\n const h = enableTime ? t.hour : 0;\r\n const m = enableTime ? t.minute : 0;\r\n const s = enableTime && showSeconds ? (t.second ?? 0) : 0;\r\n\r\n if (mode === \"single\" && !Array.isArray(jVal)) {\r\n return jalaliToJsDate(\r\n jVal as JalaliDate,\r\n h,\r\n m,\r\n s,\r\n ) as SelectedDateValue<M>;\r\n }\r\n\r\n if (mode === \"range\" && Array.isArray(jVal)) {\r\n const [start, end] = jVal as JalaliDateRange;\r\n return [\r\n start ? jalaliToJsDate(start, 0, 0, 0) : null,\r\n end ? jalaliToJsDate(end, 23, 59, 59) : null,\r\n ] as SelectedDateValue<M>;\r\n }\r\n\r\n if (mode === \"multiple\" && Array.isArray(jVal)) {\r\n return (jVal as JalaliDate[]).map((d) =>\r\n jalaliToJsDate(d, h, m, s),\r\n ) as SelectedDateValue<M>;\r\n }\r\n\r\n return null as SelectedDateValue<M>;\r\n },\r\n [mode, enableTime, activeTime, showSeconds],\r\n );\r\n\r\n const {\r\n selected,\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n goToPrevMonth,\r\n goToNextMonth,\r\n setView,\r\n goToToday,\r\n selectDate,\r\n setHoverDate,\r\n hoverDate,\r\n clear,\r\n } = useJalaliDatePicker({\r\n mode,\r\n value: internalJalaliValue,\r\n defaultValue: internalDefaultJalaliValue,\r\n minDate: internalMinDate,\r\n maxDate: internalMaxDate,\r\n firstDayOfWeek,\r\n isDateDisabled: isDateDisabled ? internalIsDateDisabled : undefined,\n onChange: (val) => {\r\n onChange?.(convertJalaliToDateOutput(val));\r\n },\r\n });\r\n\r\n const handleTimeChange = useCallback(\r\n (newTime: JalaliTime) => {\r\n if (timeValue === undefined) setInternalTime(newTime);\r\n onTimeChange?.(newTime);\r\n\r\n if (selected && onChange) {\r\n onChange(convertJalaliToDateOutput(selected, newTime));\r\n }\r\n },\r\n [timeValue, onTimeChange, selected, onChange, convertJalaliToDateOutput],\r\n );\r\n\r\n const singleSelectedDate =\r\n mode === \"single\" ? (selected as JalaliDate | null) : null;\r\n\r\n const handleDateSelect = (d: JalaliDate) => {\r\n selectDate(d);\r\n if (variant === \"popover\" && mode === \"single\" && !enableTime) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handleClearClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n clear();\r\n };\r\n\r\n const { handleKeyDown, getCellTabIndex, setFocusedDate } =\r\n useCalendarKeyboard({\r\n viewYear,\r\n viewMonth,\r\n selectedDate: singleSelectedDate,\r\n onSelectDate: handleDateSelect,\r\n onViewChange: setView,\r\n isRtl: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (!isModal || !isOpen) return;\r\n const originalOverflow = document.body.style.overflow;\r\n document.body.style.overflow = \"hidden\";\r\n\r\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") setIsOpen(false);\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleGlobalKeyDown);\r\n return () => {\r\n document.body.style.overflow = originalOverflow;\r\n window.removeEventListener(\"keydown\", handleGlobalKeyDown);\r\n };\r\n }, [isModal, isOpen]);\r\n\r\n const nextMonthState = useMemo<{\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (viewMonth === 11) return { year: viewYear + 1, month: 0 };\r\n return { year: viewYear, month: (viewMonth + 1) as JalaliMonthIndex };\r\n }, [viewYear, viewMonth]);\n\n const prevMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewMonth === 0) return { year: viewYear - 1, month: 11 };\n return { year: viewYear, month: (viewMonth - 1) as JalaliMonthIndex };\n }, [viewYear, viewMonth]);\n\n const isPrevMonthDisabled = !isJalaliMonthSelectable(\n prevMonthState.year,\n prevMonthState.month,\n { minDate: internalMinDate, maxDate: internalMaxDate },\n );\n const nextNavigationState =\n numberOfMonths === 2\n ? nextMonthState.month === 11\n ? { year: nextMonthState.year + 1, month: 0 as JalaliMonthIndex }\n : {\n year: nextMonthState.year,\n month: (nextMonthState.month + 1) as JalaliMonthIndex,\n }\n : nextMonthState;\n const isNextMonthDisabled = !isJalaliMonthSelectable(\n nextNavigationState.year,\n nextNavigationState.month,\n { minDate: internalMinDate, maxDate: internalMaxDate },\n );\n\r\n const secondGrid = useMemo<JalaliCalendarCell[]>(() => {\r\n if (numberOfMonths !== 2) return [];\r\n\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year: nextMonthState.year,\r\n month: nextMonthState.month,\r\n firstDayOfWeek,\r\n minDate: internalMinDate,\r\n maxDate: internalMaxDate,\r\n });\r\n\r\n if (mode !== \"range\") return rawGrid;\r\n\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n }, [\r\n numberOfMonths,\r\n nextMonthState,\r\n firstDayOfWeek,\r\n internalMinDate,\r\n internalMaxDate,\r\n mode,\r\n selected,\r\n hoverDate,\r\n ]);\r\n\r\n const formattedInputValue = useMemo(() => {\r\n if (!selected) return \"\";\r\n if (mode === \"single\") {\r\n const datePart = formatJalaliDate(selected as JalaliDate, \"YYYY/MM/DD\", {\r\n digitType,\r\n });\r\n if (enableTime && activeTime) {\r\n const timePart = formatTimeString(activeTime, showSeconds, digitType);\r\n return `${datePart} ${timePart}`;\r\n }\r\n return datePart;\r\n }\r\n if (mode === \"range\") {\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n if (start && end) {\r\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ${formatJalaliDate(end, \"YYYY/MM/DD\", { digitType })}`;\r\n }\r\n if (start)\r\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ...`;\r\n }\r\n if (mode === \"multiple\" && Array.isArray(selected)) {\r\n return `${toPersianDigits((selected as JalaliDate[]).length)} تاریخ انتخاب شده`;\r\n }\r\n return \"\";\r\n }, [selected, mode, digitType, enableTime, activeTime, showSeconds]);\r\n\r\n const hasValue = Boolean(\r\n mode === \"single\"\r\n ? selected\r\n : mode === \"range\"\r\n ? (selected as JalaliDateRange)?.[0]\r\n : (selected as JalaliDate[])?.length,\r\n );\r\n\r\n const renderCalendarPane = (\r\n y: number,\r\n m: JalaliMonthIndex,\r\n paneGrid: JalaliCalendarCell[],\r\n showPrevArrow = true,\r\n showNextArrow = true,\r\n ) => (\n <div\n className={classNames?.calendarPane}\n style={{\n width: \"calc(7 * var(--pdp-cell-size, 34px) + 6 * 4px)\",\n maxWidth: \"100%\",\n minWidth: 0,\n flex: \"1 1 calc(7 * var(--pdp-cell-size, 34px) + 6 * 4px)\",\n ...styles?.calendarPane,\n }}\r\n >\r\n <Header\r\n year={y}\r\n monthName={PERSIAN_MONTH_NAMES[m]}\r\n onPrevMonth={showPrevArrow ? goToPrevMonth : () => {}}\r\n onNextMonth={showNextArrow ? goToNextMonth : () => {}}\r\n onTitleClick={() => setShowMonthYearPicker((prev) => !prev)}\r\n isPickerOpen={showMonthYearPicker}\n isPrevDisabled={showPrevArrow ? isPrevMonthDisabled : true}\n isNextDisabled={showNextArrow ? isNextMonthDisabled : true}\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n <Weekdays\r\n firstDayOfWeek={firstDayOfWeek}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n <div\r\n role=\"grid\"\r\n aria-label={`${PERSIAN_MONTH_NAMES[m]} ${toPersianDigits(y)}`}\r\n className={classNames?.grid}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"4px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n ...styles?.grid,\r\n }}\r\n >\r\n {paneGrid.map((cell, index) => {\r\n const holidayInfo = showHolidays\r\n ? getOfficialHoliday(cell.jalali, customHolidays)\r\n : null;\r\n const dayEvents = getEventsForDate(cell.jalali, events);\r\n\r\n return (\r\n <DayCell\r\n key={index}\r\n cell={cell}\r\n digitType={digitType}\r\n isHoliday={Boolean(holidayInfo)}\r\n holidayTitle={holidayInfo?.title}\r\n events={dayEvents}\r\n classNames={classNames}\r\n styles={styles}\r\n tabIndex={getCellTabIndex(cell.jalali)}\r\n onSelect={handleDateSelect}\r\n onHover={setHoverDate}\r\n onFocus={setFocusedDate}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n\r\n const calendarContent = (\r\n <div\r\n role={isModal ? \"dialog\" : \"region\"}\r\n aria-modal={isModal ? true : undefined}\r\n aria-label=\"تقویم شمسی\"\r\n onKeyDown={handleKeyDown}\r\n onClick={(e) => e.stopPropagation()}\r\n className={classNames?.calendar}\r\n style={{\r\n position:\r\n variant === \"popover\" ? \"absolute\" : isModal ? \"relative\" : \"static\",\r\n top: variant === \"popover\" ? \"calc(100% + 6px)\" : undefined,\r\n left: variant === \"popover\" ? 0 : undefined,\r\n zIndex: isModal ? zIndex + 1 : zIndex,\r\n padding: \"12px\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n borderRadius: \"var(--pdp-border-radius, 12px)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n boxShadow: isModal\n ? \"0 20px 25px -5px rgb(0 0 0 / 0.3)\"\r\n : \"0 10px 25px -5px rgba(0, 0, 0, 0.15), 0 8px 10px -6px rgba(0, 0, 0, 0.1)\",\r\n width: \"max-content\",\n maxWidth:\n variant === \"inline\" ? \"100%\" : \"calc(100vw - 24px)\",\n maxHeight: isModal ? \"calc(100dvh - 32px)\" : undefined,\n overflowY: isModal ? \"auto\" : undefined,\n overflowX: \"hidden\",\n userSelect: \"none\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\r\n direction: \"rtl\",\r\n boxSizing: \"border-box\",\r\n ...styles?.calendar,\r\n }}\r\n >\r\n {showMonthYearPicker ? (\r\n <MonthYearPicker\r\n currentYear={viewYear}\r\n currentMonth={viewMonth}\r\n onSelectMonth={(m) => {\r\n setView(viewYear, m);\r\n setShowMonthYearPicker(false);\r\n }}\r\n onSelectYear={(y) => setView(y, viewMonth)}\n minDate={internalMinDate}\n maxDate={internalMaxDate}\n isDateDisabled={\n isDateDisabled ? internalIsDateDisabled : undefined\n }\n classNames={classNames}\r\n styles={styles}\r\n />\r\n ) : (\r\n <>\r\n <div\n className={classNames?.calendarPanes}\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n gap: \"20px\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n width: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n ...styles?.calendarPanes,\n }}\r\n >\r\n {renderCalendarPane(\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n true,\r\n numberOfMonths === 1,\r\n )}\r\n\r\n {numberOfMonths === 2 && (\n <>\n {renderCalendarPane(\n nextMonthState.year,\r\n nextMonthState.month,\r\n secondGrid,\r\n false,\r\n true,\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {enableTime && (\r\n <TimePicker\r\n value={activeTime}\r\n onChange={handleTimeChange}\r\n minuteStep={minuteStep}\r\n hourStep={hourStep}\r\n showSeconds={showSeconds}\r\n digitType={digitType}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n )}\r\n\r\n {showFooter && (\r\n <CalendarFooter\r\n mode={mode}\r\n digitType={digitType}\r\n showStatusText={showStatusText}\r\n selectedDate={\r\n mode === \"single\" ? (selected as JalaliDate | null) : null\r\n }\r\n selectedRange={\r\n mode === \"range\" ? (selected as JalaliDateRange) : undefined\r\n }\r\n selectedDates={\r\n mode === \"multiple\" ? (selected as JalaliDate[]) : undefined\r\n }\r\n selectedTime={enableTime ? activeTime : undefined}\r\n onToday={goToToday}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={className ?? classNames?.root}\r\n style={{\r\n position: \"relative\",\n display: \"inline-block\",\n maxWidth: \"100%\",\n verticalAlign: \"top\",\n zIndex: isOpen && variant === \"popover\" ? zIndex : 1,\r\n ...style,\r\n ...styles?.root,\r\n }}\r\n >\r\n {variant !== \"inline\" &&\r\n (useMaskedInput && mode === \"single\" && variant === \"popover\" ? (\r\n <MaskedDateInput\r\n value={singleSelectedDate}\r\n digitType={digitType}\r\n placeholder={placeholder}\r\n onChange={(d) => {\r\n if (d) {\r\n selectDate(d);\r\n setView(d.year, d.month);\r\n } else {\r\n clear();\r\n }\r\n }}\r\n onClick={() => setIsOpen(true)}\r\n className={classNames?.input}\r\n style={{\r\n direction: \"ltr\",\r\n textAlign: \"left\",\r\n ...styles?.input,\r\n }}\r\n />\r\n ) : (\r\n <div\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setIsOpen((prev) => !prev);\r\n }}\r\n style={{\r\n position: \"relative\",\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n direction: \"ltr\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\r\n >\r\n <input\r\n type=\"text\"\r\n readOnly\r\n placeholder={placeholder}\r\n value={formattedInputValue}\r\n className={classNames?.input}\r\n style={{\r\n direction: \"ltr\",\r\n textAlign: \"left\",\r\n padding: \"8px 30px 8px 12px\",\r\n borderRadius: \"var(--pdp-border-radius, 8px)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n cursor: \"pointer\",\r\n fontSize: \"13.5px\",\n minWidth: enableTime ? \"190px\" : \"150px\",\n width: \"100%\",\n maxWidth: \"100%\",\n boxSizing: \"border-box\",\r\n ...styles?.input,\r\n }}\r\n />\r\n\r\n {allowClear && hasValue && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClearClick}\r\n aria-label=\"Clear value\"\r\n style={{\r\n position: \"absolute\",\r\n right: \"8px\",\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n padding: \"2px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"14px\",\r\n fontWeight: 700,\r\n lineHeight: 1,\r\n borderRadius: \"50%\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.color =\r\n \"var(--pdp-holiday-color, #e11d48)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.color =\r\n \"var(--pdp-text-muted, #94a3b8)\";\r\n }}\r\n >\r\n ✕\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n\r\n {isOpen &&\r\n (isModal ? (\r\n <div\r\n role=\"presentation\"\r\n onClick={() => setIsOpen(false)}\r\n className={classNames?.modalBackdrop}\r\n style={{\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: \"rgba(15, 23, 42, 0.6)\",\r\n backdropFilter: \"blur(4px)\",\r\n zIndex: zIndex,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n overflowY: \"auto\",\n direction: \"rtl\",\r\n ...styles?.modalBackdrop,\r\n }}\r\n >\r\n {calendarContent}\r\n </div>\r\n ) : (\r\n calendarContent\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useMemo, useCallback } from \"react\";\r\nimport type { DualMonthCalendarProps } from \"./types\";\r\nimport type {\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n JalaliCalendarCell,\r\n} from \"../../core/types\";\r\nimport type { JalaliDateRange } from \"../../hooks/types\";\r\nimport { getTodayJalali, isSameJalaliDay } from \"../../core/jalali-math\";\r\nimport {\n generateJalaliCalendarGrid,\n toJalaliDate,\n} from \"../../core/calendar-grid\";\nimport {\r\n compareJalaliDates,\r\n isJalaliDateBetween,\r\n} from \"../../core/jalali-helpers\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../../core/constants\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport { Weekdays } from \"../Weekdays\";\r\nimport { DayCell } from \"../DayCell\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\nimport { mergeClassNames } from \"../../theme/style-utils\";\nimport { isJalaliMonthSelectable } from \"../../core/date-availability\";\n\r\nexport const DualMonthCalendar: React.FC<DualMonthCalendarProps> = ({\r\n value,\r\n defaultValue = [null, null],\r\n onChange,\r\n initialViewDate,\r\n firstDayOfWeek = 0,\r\n digitType = \"persian\",\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n direction = \"rtl\",\r\n className,\r\n style,\r\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n // 1. Selection State (Controlled vs Uncontrolled)\r\n const [internalRange, setInternalRange] =\r\n useState<JalaliDateRange>(defaultValue);\r\n const activeRange = value !== undefined ? value : internalRange;\r\n\r\n // 2. Hover state for range preview\r\n const [hoveredDate, setHoveredDate] = useState<JalaliDate | null>(null);\r\n const formatNumber = (value: number) =>\r\n digitType === \"persian\" ? toPersianDigits(value) : String(value);\r\n\r\n // 3. View state for First Month (Left)\r\n const today = useMemo(() => getTodayJalali(), []);\r\n const [viewState, setViewState] = useState<{\r\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (initialViewDate) return initialViewDate;\r\n if (activeRange[0])\r\n return { year: activeRange[0].year, month: activeRange[0].month };\r\n return { year: today.year, month: today.month };\r\n });\r\n\r\n // Calculate Second Month (Right)\r\n const nextMonthState = useMemo<{\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (viewState.month === 11) {\r\n return { year: viewState.year + 1, month: 0 };\r\n }\r\n return {\r\n year: viewState.year,\r\n month: (viewState.month + 1) as JalaliMonthIndex,\r\n };\r\n }, [viewState]);\n\n const prevMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewState.month === 0) {\n return { year: viewState.year - 1, month: 11 };\n }\n return {\n year: viewState.year,\n month: (viewState.month - 1) as JalaliMonthIndex,\n };\n }, [viewState]);\n\n const minJalali = useMemo(\n () => (minDate ? toJalaliDate(minDate) : undefined),\n [minDate],\n );\n const maxJalali = useMemo(\n () => (maxDate ? toJalaliDate(maxDate) : undefined),\n [maxDate],\n );\n const isPrevDisabled = !isJalaliMonthSelectable(\n prevMonthState.year,\n prevMonthState.month,\n { minDate: minJalali, maxDate: maxJalali },\n );\n const monthAfterSecond =\n nextMonthState.month === 11\n ? { year: nextMonthState.year + 1, month: 0 as JalaliMonthIndex }\n : {\n year: nextMonthState.year,\n month: (nextMonthState.month + 1) as JalaliMonthIndex,\n };\n const isNextDisabled = !isJalaliMonthSelectable(\n monthAfterSecond.year,\n monthAfterSecond.month,\n { minDate: minJalali, maxDate: maxJalali },\n );\n\r\n // 4. Synchronized Navigation (moves both months together)\r\n const handlePrevMonth = () => {\n if (isPrevDisabled) return;\n setViewState((prev) => {\r\n if (prev.month === 0) return { year: prev.year - 1, month: 11 };\r\n return { year: prev.year, month: (prev.month - 1) as JalaliMonthIndex };\r\n });\r\n };\r\n\r\n const handleNextMonth = () => {\n if (isNextDisabled) return;\n setViewState((prev) => {\r\n if (prev.month === 11) return { year: prev.year + 1, month: 0 };\r\n return { year: prev.year, month: (prev.month + 1) as JalaliMonthIndex };\r\n });\r\n };\r\n\r\n // 5. Date Selection Handler\r\n const handleDateSelect = useCallback(\r\n (target: JalaliDate) => {\r\n const [start, end] = activeRange;\r\n let newRange: JalaliDateRange;\r\n\r\n if (!start || (start && end)) {\r\n newRange = [target, null];\r\n } else {\r\n if (compareJalaliDates(target, start) < 0) {\r\n newRange = [target, start];\r\n } else {\r\n newRange = [start, target];\r\n }\r\n setHoveredDate(null);\r\n }\r\n\r\n if (value === undefined) {\r\n setInternalRange(newRange);\r\n }\r\n onChange?.(newRange);\r\n },\r\n [activeRange, value, onChange],\r\n );\r\n\r\n // 6. Enrich cells with cross-month range metadata\r\n const enrichGridCells = useCallback(\r\n (year: number, month: JalaliMonthIndex): JalaliCalendarCell[] => {\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year,\r\n month,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n });\r\n\r\n const [start, end] = activeRange;\r\n const effectiveEnd = end ?? (start && hoveredDate ? hoveredDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n },\r\n [\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n activeRange,\r\n hoveredDate,\r\n ],\r\n );\r\n\r\n const leftGrid = useMemo(\r\n () => enrichGridCells(viewState.year, viewState.month),\r\n [enrichGridCells, viewState.year, viewState.month],\r\n );\r\n\r\n const rightGrid = useMemo(\r\n () => enrichGridCells(nextMonthState.year, nextMonthState.month),\r\n [enrichGridCells, nextMonthState.year, nextMonthState.month],\r\n );\r\n\r\n const renderMonthPane = (\r\n year: number,\r\n month: JalaliMonthIndex,\r\n grid: JalaliCalendarCell[],\r\n isLeftPane: boolean,\r\n ) => (\r\n <div\r\n dir={direction}\r\n className={classNames?.calendarPane}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\n width: \"var(--pdp-calendar-pane-width, 276px)\",\n maxWidth: \"100%\",\n minWidth: 0,\n flex: \"1 1 var(--pdp-calendar-pane-width, 276px)\",\n ...styles?.calendarPane,\r\n }}\r\n >\r\n {/* Pane Header */}\r\n <div\r\n className={classNames?.header}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 4px\",\r\n height: \"32px\",\r\n ...styles?.header,\r\n }}\r\n >\r\n {isLeftPane ? (\r\n <button\r\n type=\"button\"\n aria-label=\"ماه قبل\"\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n aria-disabled={isPrevDisabled}\n className={mergeClassNames(\n classNames?.navButton,\n isPrevDisabled && classNames?.disabledNavButton,\n )}\n style={{\r\n width: \"28px\",\r\n height: \"28px\",\r\n borderRadius: \"6px\",\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n cursor: isPrevDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isPrevDisabled ? 0.38 : 1,\n ...styles?.navButton,\n ...(isPrevDisabled ? styles?.disabledNavButton : undefined),\n }}\r\n >\r\n {direction === \"rtl\" ? \"›\" : \"‹\"}\r\n </button>\r\n ) : (\r\n <div style={{ width: \"28px\" }} />\r\n )}\r\n\r\n <div\r\n style={{\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n color: theme.colors.textPrimary,\r\n }}\r\n >\r\n {PERSIAN_MONTH_NAMES[month]} {formatNumber(year)}\r\n </div>\r\n\r\n {!isLeftPane ? (\r\n <button\r\n type=\"button\"\n aria-label=\"ماه بعد\"\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n aria-disabled={isNextDisabled}\n className={mergeClassNames(\n classNames?.navButton,\n isNextDisabled && classNames?.disabledNavButton,\n )}\n style={{\r\n width: \"28px\",\r\n height: \"28px\",\r\n borderRadius: \"6px\",\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n cursor: isNextDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isNextDisabled ? 0.38 : 1,\n ...styles?.navButton,\n ...(isNextDisabled ? styles?.disabledNavButton : undefined),\n }}\r\n >\r\n {direction === \"rtl\" ? \"‹\" : \"›\"}\r\n </button>\r\n ) : (\r\n <div style={{ width: \"28px\" }} />\r\n )}\r\n </div>\r\n\r\n <Weekdays\r\n firstDayOfWeek={firstDayOfWeek}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n {/* Grid */}\r\n <div\r\n role=\"grid\"\r\n aria-label={`${PERSIAN_MONTH_NAMES[month]} ${formatNumber(year)}`}\r\n dir={direction}\r\n className={classNames?.grid}\r\n style={{\r\n display: \"grid\",\r\n width: \"100%\",\n minWidth: 0,\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"var(--pdp-cell-gap, 4px)\",\r\n ...styles?.grid,\r\n }}\r\n >\r\n {grid.map((cell) => (\r\n <DayCell\r\n key={`${cell.jalali.year}-${cell.jalali.month}-${cell.jalali.day}`}\r\n cell={cell}\r\n digitType={digitType}\r\n classNames={classNames}\r\n styles={styles}\r\n tabIndex={0}\r\n onSelect={handleDateSelect}\r\n onHover={setHoveredDate}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n role=\"region\"\r\n aria-label=\"تقویم دوقلو شمسی\"\r\n dir={direction}\r\n className={mergeClassNames(className, classNames?.calendar)}\r\n style={\r\n {\r\n \"--pdp-cell-size\": \"36px\",\r\n \"--pdp-cell-gap\": \"4px\",\r\n \"--pdp-calendar-pane-width\": \"276px\",\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n gap: \"24px\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n borderRadius: theme.radii.lg,\r\n border: `1px solid ${theme.colors.border}`,\r\n boxShadow: theme.shadows.lg,\r\n width:\n \"calc(var(--pdp-calendar-pane-width, 276px) + var(--pdp-calendar-pane-width, 276px) + 56px)\",\n maxWidth: \"100%\",\n ...style,\r\n ...styles?.calendar,\r\n } as React.CSSProperties\r\n }\r\n >\r\n {renderMonthPane(viewState.year, viewState.month, leftGrid, true)}\n {renderMonthPane(\n nextMonthState.year,\r\n nextMonthState.month,\r\n rightGrid,\r\n false,\r\n )}\r\n </div>\r\n );\r\n};\r\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/core/date-availability.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/theme/style-utils.ts","../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/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":["/**\r\n * Persian (Farsi) month names.\r\n */\r\nexport const PERSIAN_MONTH_NAMES = [\r\n \"فروردین\",\r\n \"اردیبهشت\",\r\n \"خرداد\",\r\n \"تیر\",\r\n \"مرداد\",\r\n \"شهریور\",\r\n \"مهر\",\r\n \"آبان\",\r\n \"آذر\",\r\n \"دی\",\r\n \"بهمن\",\r\n \"اسفند\",\r\n] as const;\r\n\r\n/**\r\n * Phonetic English month names for Jalali calendar.\r\n */\r\nexport const JALALI_MONTH_NAMES_EN = [\r\n \"Farvardin\",\r\n \"Ordibehesht\",\r\n \"Khordad\",\r\n \"Tir\",\r\n \"Mordad\",\r\n \"Shahrivar\",\r\n \"Mehr\",\r\n \"Aban\",\r\n \"Azar\",\r\n \"Dey\",\r\n \"Bahman\",\r\n \"Esfand\",\r\n] as const;\r\n\r\n/**\r\n * Persian weekday headers starting from Saturday (شنبه).\r\n */\r\nexport const PERSIAN_WEEK_DAYS_SHORT = [\r\n \"ش\",\r\n \"ی\",\r\n \"د\",\r\n \"س\",\r\n \"چ\",\r\n \"پ\",\r\n \"ج\",\r\n] as const;\r\nexport const PERSIAN_WEEK_DAYS_LONG = [\r\n \"شنبه\",\r\n \"یکشنبه\",\r\n \"دوشنبه\",\r\n \"سهشنبه\",\r\n \"چهارشنبه\",\r\n \"پنجشنبه\",\r\n \"جمعه\",\r\n] as const;\r\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\r\n\r\n/**\r\n * Determines if a Jalali year is a leap year (کبیسه).\r\n * Uses the Birashk 2820-year cycle algorithm.\r\n */\r\nexport function isJalaliLeapYear(year: number): boolean {\r\n const breaks = [\r\n -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097,\r\n 2192, 2262, 2324, 2394, 2456, 3178,\r\n ];\r\n\r\n let jp = breaks[0];\r\n let jump = 0;\r\n\r\n if (year < jp || year >= breaks[breaks.length - 1]) {\r\n throw new Error(`Jalali year ${year} is outside supported range.`);\r\n }\r\n\r\n for (let i = 1; i < breaks.length; i++) {\r\n const jm = breaks[i];\r\n jump = jm - jp;\r\n if (year < jm) break;\r\n jp = jm;\r\n }\r\n\r\n let n = year - jp;\r\n if (jump - n < 6) n = n - jump + ((jump + 4) / 33) * 33;\r\n let leap = ((n + 1) % 33) - 1;\r\n if (leap === -1) leap = 4;\r\n\r\n return leap % 4 === 0;\r\n}\r\n\r\n/**\r\n * Returns the number of days in a specific Jalali month.\r\n */\r\nexport function getDaysInJalaliMonth(\r\n year: number,\r\n month: JalaliMonthIndex,\r\n): number {\r\n if (month < 0 || month > 11) {\r\n throw new RangeError(\r\n \"Month index must be between 0 (Farvardin) and 11 (Esfand).\",\r\n );\r\n }\r\n // Months 0 to 5 (Farvardin - Shahrivar) have 31 days\r\n if (month <= 5) return 31;\r\n // Months 6 to 10 (Mehr - Bahman) have 30 days\r\n if (month <= 10) return 30;\r\n // Month 11 (Esfand) has 30 in leap years, 29 in regular years\r\n return isJalaliLeapYear(year) ? 30 : 29;\r\n}\r\n\r\n/**\r\n * Converts a Gregorian date (Year, Month, Day) to Jalali date.\r\n */\r\nexport function gregorianToJalali(\r\n gy: number,\r\n gm: number,\r\n gd: number,\r\n): JalaliDate {\r\n const g_d_m = [\r\n 0,\r\n 31,\r\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n ];\r\n let jy: number;\r\n let jm: number;\r\n let jd: number;\r\n\r\n let gy2 = gm > 2 ? gy + 1 : gy;\r\n let days =\r\n 355666 +\r\n 365 * gy +\r\n Math.floor((gy2 + 3) / 4) -\r\n Math.floor((gy2 + 99) / 100) +\r\n Math.floor((gy2 + 399) / 400) +\r\n gd;\r\n\r\n for (let i = 0; i < gm; ++i) days += g_d_m[i];\r\n\r\n jy = -1595 + 33 * Math.floor(days / 12053);\r\n days %= 12053;\r\n\r\n jy += 4 * Math.floor(days / 1461);\r\n days %= 1461;\r\n\r\n if (days > 365) {\r\n jy += Math.floor((days - 1) / 365);\r\n days = (days - 1) % 365;\r\n }\r\n\r\n if (days < 186) {\r\n jm = Math.floor(days / 31);\r\n jd = 1 + (days % 31);\r\n } else {\r\n jm = 6 + Math.floor((days - 186) / 30);\r\n jd = 1 + ((days - 186) % 30);\r\n }\r\n\r\n return { year: jy, month: jm as JalaliMonthIndex, day: jd };\r\n}\r\n\r\n/**\r\n * Converts a Jalali date to a Gregorian Date.\r\n */\r\nexport function jalaliToGregorian(\r\n jy: number,\r\n jm: JalaliMonthIndex,\r\n jd: number,\r\n): Date {\r\n let gy: number;\r\n let gm: number;\r\n let gd: number;\r\n\r\n let jy2 = jy + 1595;\r\n let days =\r\n -355668 +\r\n 365 * jy2 +\r\n Math.floor(jy2 / 33) * 8 +\r\n Math.floor(((jy2 % 33) + 3) / 4) +\r\n jd +\r\n (jm < 6 ? jm * 31 : (jm - 6) * 30 + 186);\r\n\r\n gy = 400 * Math.floor(days / 146097);\r\n days %= 146097;\r\n\r\n if (days > 36524) {\r\n gy += 100 * Math.floor(--days / 36524);\r\n days %= 36524;\r\n if (days >= 365) days++;\r\n }\r\n\r\n gy += 4 * Math.floor(days / 1461);\r\n days %= 1461;\r\n\r\n if (days > 365) {\r\n gy += Math.floor((days - 1) / 365);\r\n days = (days - 1) % 365;\r\n }\r\n\r\n gd = days + 1;\r\n const sal_a = [\r\n 0,\r\n 31,\r\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n ];\r\n\r\n for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) {\r\n gd -= sal_a[gm];\r\n }\r\n\r\n const result = new Date(gy, gm - 1, gd);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns today's date in Jalali format.\r\n */\r\nexport function getTodayJalali(): JalaliDate {\r\n const now = new Date();\r\n return gregorianToJalali(\r\n now.getFullYear(),\r\n now.getMonth() + 1,\r\n now.getDate(),\r\n );\r\n}\r\n\r\n/**\r\n * Checks if two Jalali dates are identical.\r\n */\r\nexport function isSameJalaliDay(\r\n a?: JalaliDate | null,\r\n b?: JalaliDate | null,\r\n): boolean {\r\n if (!a || !b) return false;\r\n return a.year === b.year && a.month === b.month && a.day === b.day;\r\n}\r\n","import type {\r\n JalaliCalendarCell,\r\n JalaliGridOptions,\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n} from \"./types\";\r\nimport {\r\n jalaliToGregorian,\r\n gregorianToJalali,\r\n getDaysInJalaliMonth,\r\n getTodayJalali,\r\n isSameJalaliDay,\r\n} from \"./jalali-math\";\r\n\r\n/**\r\n * Normalizes input date (Date or JalaliDate) into JalaliDate object.\r\n */\r\nexport function toJalaliDate(input: Date | JalaliDate): JalaliDate {\r\n if (input instanceof Date) {\r\n return gregorianToJalali(\r\n input.getFullYear(),\r\n input.getMonth() + 1,\r\n input.getDate(),\r\n );\r\n }\r\n return input;\r\n}\r\n\r\n/**\r\n * Generates a 42-cell (6 rows x 7 columns) matrix for a given Jalali month.\r\n */\r\nexport function generateJalaliCalendarGrid(\r\n options: JalaliGridOptions,\r\n): JalaliCalendarCell[] {\r\n const {\r\n year,\r\n month,\r\n firstDayOfWeek = 0, // 0 = Saturday (شنبه)\r\n selectedDate,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n } = options;\r\n\r\n const cells: JalaliCalendarCell[] = [];\r\n const todayJalali = getTodayJalali();\r\n const activeSelected = selectedDate ? toJalaliDate(selectedDate) : null;\r\n const minJalali = minDate ? toJalaliDate(minDate) : null;\r\n const maxJalali = maxDate ? toJalaliDate(maxDate) : null;\r\n\r\n // Convert Jalali 1st of month to Gregorian to read weekday\r\n const firstDayGregorian = jalaliToGregorian(year, month, 1);\r\n\r\n // JS getDay(): 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat\r\n // Map standard JS getDay() to Jalali index: 6(Sat)->0, 0(Sun)->1, ..., 5(Fri)->6\r\n const jsDay = firstDayGregorian.getDay();\r\n const rawJalaliWeekDay = (jsDay + 1) % 7;\r\n\r\n const leadingPaddingCount = (rawJalaliWeekDay - firstDayOfWeek + 7) % 7;\r\n\r\n // 1. Previous month trailing days\r\n const prevMonth = (month === 0 ? 11 : month - 1) as JalaliMonthIndex;\r\n const prevYear = month === 0 ? year - 1 : year;\r\n const daysInPrevMonth = getDaysInJalaliMonth(prevYear, prevMonth);\r\n\r\n for (let i = leadingPaddingCount - 1; i >= 0; i--) {\r\n const day = daysInPrevMonth - i;\r\n const jDate: JalaliDate = { year: prevYear, month: prevMonth, day };\r\n cells.push(buildCell(jDate, false));\r\n }\r\n\r\n // 2. Current month days\r\n const totalDays = getDaysInJalaliMonth(year, month);\r\n for (let d = 1; d <= totalDays; d++) {\r\n const jDate: JalaliDate = { year, month, day: d };\r\n cells.push(buildCell(jDate, true));\r\n }\r\n\r\n // 3. Next month leading days (completing 42 cells)\r\n const nextMonth = (month === 11 ? 0 : month + 1) as JalaliMonthIndex;\r\n const nextYear = month === 11 ? year + 1 : year;\r\n const trailingPaddingCount = 42 - cells.length;\r\n\r\n for (let d = 1; d <= trailingPaddingCount; d++) {\r\n const jDate: JalaliDate = { year: nextYear, month: nextMonth, day: d };\r\n cells.push(buildCell(jDate, false));\r\n }\r\n\r\n function buildCell(\r\n jDate: JalaliDate,\r\n isCurrentMonth: boolean,\r\n ): JalaliCalendarCell {\r\n const gregDate = jalaliToGregorian(jDate.year, jDate.month, jDate.day);\r\n const isToday = isSameJalaliDay(jDate, todayJalali);\r\n const isSelected = activeSelected\r\n ? isSameJalaliDay(jDate, activeSelected)\r\n : false;\r\n\r\n let isDisabled = false;\r\n if (minJalali) {\r\n const minG = jalaliToGregorian(\r\n minJalali.year,\r\n minJalali.month,\r\n minJalali.day,\r\n );\r\n if (gregDate.getTime() < minG.getTime()) isDisabled = true;\r\n }\r\n if (maxJalali) {\r\n const maxG = jalaliToGregorian(\r\n maxJalali.year,\r\n maxJalali.month,\r\n maxJalali.day,\r\n );\r\n if (gregDate.getTime() > maxG.getTime()) isDisabled = true;\r\n }\r\n if (isDateDisabled && isDateDisabled(jDate, gregDate)) {\r\n isDisabled = true;\r\n }\r\n\r\n return {\r\n jalali: jDate,\r\n gregorianDate: gregDate,\r\n dayNumber: jDate.day,\r\n isCurrentMonth,\r\n isToday,\r\n isSelected,\r\n isDisabled,\r\n };\r\n }\r\n\r\n return cells;\r\n}\r\n","import type { JalaliDate, JalaliDayOfWeek, JalaliMonthIndex } from \"./types\";\r\nimport {\r\n jalaliToGregorian,\r\n gregorianToJalali,\r\n getDaysInJalaliMonth,\r\n} from \"./jalali-math\";\r\n\r\nexport function jsDateToJalali(d: Date): JalaliDate {\r\n return gregorianToJalali(d.getFullYear(), d.getMonth() + 1, d.getDate());\r\n}\r\n\r\nexport function jalaliToJsDate(\r\n j: JalaliDate,\r\n hours = 0,\r\n minutes = 0,\r\n seconds = 0,\r\n): Date {\r\n const g = jalaliToGregorian(j.year, j.month, j.day);\r\n g.setHours(hours, minutes, seconds, 0);\r\n return g;\r\n}\r\n\r\n/**\r\n * Calculates day of week in Jalali calendar (0 = شنبه, ..., 6 = جمعه).\r\n */\r\nexport function getJalaliDayOfWeek(\r\n year: number,\r\n month: number,\r\n day: number,\r\n): JalaliDayOfWeek {\r\n const g = jalaliToGregorian(year, month as JalaliMonthIndex, day);\r\n const jsDay = g.getDay(); // 0 = Sunday, 6 = Saturday\r\n return ((jsDay + 1) % 7) as JalaliDayOfWeek;\r\n}\r\n\r\n/**\r\n * Adds or subtracts days to/from a Jalali date across month/year boundaries.\r\n */\r\nexport function addDaysToJalali(date: JalaliDate, days: number): JalaliDate {\r\n const g = jalaliToGregorian(date.year, date.month, date.day);\r\n g.setDate(g.getDate() + days);\r\n // تبدیل getMonth() از 0-indexed به 1-indexed برای gregorianToJalali\r\n return gregorianToJalali(g.getFullYear(), g.getMonth() + 1, g.getDate());\r\n}\r\n\r\n/**\r\n * Alias for addDaysToJalali\r\n */\r\nexport const addJalaliDays = addDaysToJalali;\r\n\r\n/**\r\n * Compares two Jalali dates:\r\n * - Returns -1 if d1 < d2\r\n * - Returns 1 if d1 > d2\r\n * - Returns 0 if d1 == d2\r\n */\r\nexport function compareJalaliDates(d1: JalaliDate, d2: JalaliDate): number {\r\n if (d1.year !== d2.year) return d1.year < d2.year ? -1 : 1;\r\n if (d1.month !== d2.month) return d1.month < d2.month ? -1 : 1;\r\n if (d1.day !== d2.day) return d1.day < d2.day ? -1 : 1;\r\n return 0;\r\n}\r\n\r\n/**\r\n * Checks if a target date falls strictly or inclusively between two dates.\r\n */\r\nexport function isJalaliDateBetween(\r\n target: JalaliDate,\r\n start: JalaliDate,\r\n end: JalaliDate,\r\n inclusive = true,\r\n): boolean {\r\n const minDate = compareJalaliDates(start, end) <= 0 ? start : end;\r\n const maxDate = compareJalaliDates(start, end) <= 0 ? end : start;\r\n\r\n const cmpMin = compareJalaliDates(target, minDate);\r\n const cmpMax = compareJalaliDates(target, maxDate);\r\n\r\n if (inclusive) {\r\n return cmpMin >= 0 && cmpMax <= 0;\r\n }\r\n return cmpMin > 0 && cmpMax < 0;\r\n}\r\n\r\n/**\r\n * Calculates the full Jalali week range starting Saturday and ending Friday.\r\n */\r\nexport function getJalaliWeekRange(date: JalaliDate): [JalaliDate, JalaliDate] {\r\n const dayOfWeek = getJalaliDayOfWeek(date.year, date.month, date.day);\r\n const startOfWeek = addDaysToJalali(date, -dayOfWeek); // شنبه\r\n const endOfWeek = addDaysToJalali(startOfWeek, 6); // جمعه\r\n return [startOfWeek, endOfWeek];\r\n}\r\n\r\n/**\r\n * Calculates full month range from day 1 to last day of that month.\r\n */\r\nexport function getJalaliMonthRange(\r\n date: JalaliDate,\r\n): [JalaliDate, JalaliDate] {\r\n const daysInMonth = getDaysInJalaliMonth(date.year, date.month);\r\n const start: JalaliDate = { year: date.year, month: date.month, day: 1 };\r\n const end: JalaliDate = {\r\n year: date.year,\r\n month: date.month,\r\n day: daysInMonth,\r\n };\r\n return [start, end];\r\n}\r\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\nimport { compareJalaliDates } from \"./jalali-helpers\";\nimport { getDaysInJalaliMonth } from \"./jalali-math\";\n\nexport interface JalaliDateConstraints {\n minDate?: JalaliDate;\n maxDate?: JalaliDate;\n isDateDisabled?: (date: JalaliDate) => boolean;\n}\n\nexport function isJalaliDateSelectable(\n date: JalaliDate,\n constraints: JalaliDateConstraints = {},\n): boolean {\n const { minDate, maxDate, isDateDisabled } = constraints;\n if (minDate && compareJalaliDates(date, minDate) < 0) return false;\n if (maxDate && compareJalaliDates(date, maxDate) > 0) return false;\n return !isDateDisabled?.(date);\n}\n\nexport function isJalaliMonthSelectable(\n year: number,\n month: JalaliMonthIndex,\n constraints: JalaliDateConstraints = {},\n): boolean {\n const firstDay: JalaliDate = { year, month, day: 1 };\n const lastDay: JalaliDate = {\n year,\n month,\n day: getDaysInJalaliMonth(year, month),\n };\n\n if (\n (constraints.minDate &&\n compareJalaliDates(lastDay, constraints.minDate) < 0) ||\n (constraints.maxDate &&\n compareJalaliDates(firstDay, constraints.maxDate) > 0)\n ) {\n return false;\n }\n\n if (!constraints.isDateDisabled) return true;\n for (let day = 1; day <= lastDay.day; day += 1) {\n if (isJalaliDateSelectable({ year, month, day }, constraints)) return true;\n }\n return false;\n}\n\nexport function isJalaliYearSelectable(\n year: number,\n constraints: JalaliDateConstraints = {},\n): boolean {\n for (let month = 0; month < 12; month += 1) {\n if (\n isJalaliMonthSelectable(\n year,\n month as JalaliMonthIndex,\n constraints,\n )\n ) {\n return true;\n }\n }\n return false;\n}\n","import { useState, useCallback, useMemo } from \"react\";\r\nimport type {\r\n UseJalaliDatePickerOptions,\r\n SelectionMode,\r\n InternalSelectedValue,\r\n JalaliDateRange,\r\n} from \"./types\";\r\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\r\nimport { getTodayJalali, isSameJalaliDay } from \"../core/jalali-math\";\r\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\r\nimport { isJalaliDateBetween } from \"../core/jalali-helpers\";\nimport { isJalaliDateSelectable } from \"../core/date-availability\";\n\r\nexport function useJalaliDatePicker<M extends SelectionMode = \"single\">(\r\n options: UseJalaliDatePickerOptions<M> = {},\r\n) {\r\n const {\r\n mode = \"single\" as M,\r\n value: controlledValue,\r\n defaultValue,\r\n initialViewDate,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n firstDayOfWeek = 0,\r\n } = options;\r\n\r\n const today = useMemo(() => getTodayJalali(), []);\r\n\r\n const [internalValue, setInternalValue] = useState<InternalSelectedValue<M>>(\r\n () => {\r\n if (defaultValue !== undefined) return defaultValue;\r\n if (mode === \"single\") return null as InternalSelectedValue<M>;\r\n if (mode === \"range\")\r\n return [null, null] as unknown as InternalSelectedValue<M>;\r\n return [] as unknown as InternalSelectedValue<M>;\r\n },\r\n );\r\n\r\n const selected =\r\n controlledValue !== undefined ? controlledValue : internalValue;\r\n\r\n const [viewYear, setViewYear] = useState<number>(() => {\r\n if (initialViewDate) return initialViewDate.year;\r\n if (defaultValue && !Array.isArray(defaultValue))\r\n return (defaultValue as JalaliDate).year;\r\n return today.year;\r\n });\r\n\r\n const [viewMonth, setViewMonth] = useState<JalaliMonthIndex>(() => {\r\n if (initialViewDate) return initialViewDate.month;\r\n if (defaultValue && !Array.isArray(defaultValue))\r\n return (defaultValue as JalaliDate).month;\r\n return today.month;\r\n });\r\n\r\n const [hoverDate, setHoverDate] = useState<JalaliDate | null>(null);\n\n const canSelectDate = useCallback(\n (date: JalaliDate) =>\n isJalaliDateSelectable(date, {\n minDate,\n maxDate,\n isDateDisabled,\n }),\n [minDate, maxDate, isDateDisabled],\n );\n\r\n const setView = useCallback((year: number, month: JalaliMonthIndex) => {\r\n setViewYear(year);\r\n setViewMonth(month);\r\n }, []);\r\n\r\n const goToPrevMonth = useCallback(() => {\r\n if (viewMonth === 0) {\r\n setViewYear((y) => y - 1);\r\n setViewMonth(11);\r\n } else {\r\n setViewMonth((m) => (m - 1) as JalaliMonthIndex);\r\n }\r\n }, [viewMonth]);\r\n\r\n const goToNextMonth = useCallback(() => {\r\n if (viewMonth === 11) {\r\n setViewYear((y) => y + 1);\r\n setViewMonth(0);\r\n } else {\r\n setViewMonth((m) => (m + 1) as JalaliMonthIndex);\r\n }\r\n }, [viewMonth]);\r\n\r\n const goToToday = useCallback(() => {\r\n const t = getTodayJalali();\r\n setViewYear(t.year);\r\n setViewMonth(t.month);\r\n }, []);\r\n\r\n const selectDate = useCallback(\n (date: JalaliDate) => {\n if (!canSelectDate(date)) return;\n\n let nextValue: InternalSelectedValue<M>;\r\n\r\n if (mode === \"single\") {\r\n nextValue = date as InternalSelectedValue<M>;\r\n } else if (mode === \"range\") {\r\n const currentRange = (selected as JalaliDateRange) || [null, null];\r\n const [start, end] = currentRange;\r\n\r\n if (!start || (start && end)) {\r\n nextValue = [date, null] as unknown as InternalSelectedValue<M>;\r\n } else {\r\n if (\r\n date.year < start.year ||\r\n (date.year === start.year && date.month < start.month) ||\r\n (date.year === start.year &&\r\n date.month === start.month &&\r\n date.day < start.day)\r\n ) {\r\n nextValue = [date, start] as unknown as InternalSelectedValue<M>;\r\n } else {\r\n nextValue = [start, date] as unknown as InternalSelectedValue<M>;\r\n }\r\n }\r\n } else {\r\n const currentList = (selected as JalaliDate[]) || [];\r\n const exists = currentList.some((d) => isSameJalaliDay(d, date));\r\n if (exists) {\r\n nextValue = currentList.filter(\r\n (d) => !isSameJalaliDay(d, date),\r\n ) as InternalSelectedValue<M>;\r\n } else {\r\n nextValue = [...currentList, date] as InternalSelectedValue<M>;\r\n }\r\n }\r\n\r\n if (controlledValue === undefined) {\r\n setInternalValue(nextValue);\r\n }\r\n onChange?.(nextValue);\r\n },\r\n [mode, selected, controlledValue, onChange, canSelectDate],\n );\n\n const isDateSelected = useCallback(\n (date: JalaliDate): boolean => {\n if (mode === \"single\") {\n return isSameJalaliDay(selected as JalaliDate | null, date);\n }\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n return Boolean(\n (start && isSameJalaliDay(start, date)) ||\n (end && isSameJalaliDay(end, date)),\n );\n }\n return ((selected as JalaliDate[]) || []).some((item) =>\n isSameJalaliDay(item, date),\n );\n },\n [mode, selected],\n );\n\r\n const clear = useCallback(() => {\r\n const emptyValue = (\r\n mode === \"single\" ? null : mode === \"range\" ? [null, null] : []\r\n ) as InternalSelectedValue<M>;\r\n\r\n if (controlledValue === undefined) {\r\n setInternalValue(emptyValue);\r\n }\r\n onChange?.(emptyValue);\r\n }, [mode, controlledValue, onChange]);\r\n\r\n const grid = useMemo(() => {\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year: viewYear,\r\n month: viewMonth,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n });\r\n\r\n if (mode === \"single\") {\r\n const singleSelected = selected as JalaliDate | null;\r\n return rawGrid.map((cell) => ({\r\n ...cell,\r\n isSelected: singleSelected\r\n ? isSameJalaliDay(cell.jalali, singleSelected)\r\n : false,\r\n }));\r\n }\r\n\r\n if (mode === \"range\") {\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n }\r\n\r\n if (mode === \"multiple\") {\r\n const list = (selected as JalaliDate[]) || [];\r\n return rawGrid.map((cell) => ({\r\n ...cell,\r\n isSelected: list.some((d) => isSameJalaliDay(d, cell.jalali)),\r\n }));\r\n }\r\n\r\n return rawGrid;\r\n }, [\r\n viewYear,\r\n viewMonth,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n mode,\r\n selected,\r\n hoverDate,\r\n ]);\r\n\r\n return {\r\n selected,\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n goToPrevMonth,\r\n goToNextMonth,\r\n goToToday,\r\n setView,\r\n selectDate,\n isDateSelected,\n setHoverDate,\r\n hoverDate,\r\n clear,\r\n };\r\n}\r\n","import type { JalaliMonthIndex } from \"../core/types\";\r\nimport { getDaysInJalaliMonth } from \"../core/jalali-math\";\r\nimport type { NavigateOptions, NavigationResult } from \"./types\";\r\n\r\nexport function calculateNextFocusedDate(\r\n options: NavigateOptions,\r\n): NavigationResult {\r\n const { currentFocused, key, isRtl = true } = options;\r\n let { year, month, day } = currentFocused;\r\n let viewChanged = false;\r\n let handled = true;\r\n\r\n // Handle RTL vs LTR arrow directions\r\n const stepLeft = isRtl ? 1 : -1;\r\n const stepRight = isRtl ? -1 : 1;\r\n\r\n switch (key) {\r\n case \"ArrowRight\":\r\n day += stepRight;\r\n break;\r\n\r\n case \"ArrowLeft\":\r\n day += stepLeft;\r\n break;\r\n\r\n case \"ArrowUp\":\r\n day -= 7;\r\n break;\r\n\r\n case \"ArrowDown\":\r\n day += 7;\r\n break;\r\n\r\n case \"Home\":\r\n day = 1;\r\n break;\r\n\r\n case \"End\":\r\n day = getDaysInJalaliMonth(year, month);\r\n break;\r\n\r\n case \"PageUp\":\r\n // Previous Month\r\n if (month === 0) {\r\n year -= 1;\r\n month = 11;\r\n } else {\r\n month = (month - 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n break;\r\n\r\n case \"PageDown\":\r\n // Next Month\r\n if (month === 11) {\r\n year += 1;\r\n month = 0;\r\n } else {\r\n month = (month + 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n break;\r\n\r\n default:\r\n handled = false;\r\n return { nextDate: currentFocused, viewChanged: false, handled: false };\r\n }\r\n\r\n // Normalize days falling outside current month boundary\r\n while (day < 1) {\r\n if (month === 0) {\r\n year -= 1;\r\n month = 11;\r\n } else {\r\n month = (month - 1) as JalaliMonthIndex;\r\n }\r\n day += getDaysInJalaliMonth(year, month);\r\n viewChanged = true;\r\n }\r\n\r\n while (day > getDaysInJalaliMonth(year, month)) {\r\n day -= getDaysInJalaliMonth(year, month);\r\n if (month === 11) {\r\n year += 1;\r\n month = 0;\r\n } else {\r\n month = (month + 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n }\r\n\r\n return {\r\n nextDate: { year, month, day },\r\n viewChanged,\r\n handled,\r\n };\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\n\r\n/**\r\n * Creates an accessible full Persian string for screen readers.\r\n * Example: \"شنبه، ۱ فروردین ۱۴۰۵\"\r\n */\r\nexport function getAriaDayLabel(date: JalaliDate): string {\r\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\r\n const jsDay = gregorian.getDay();\r\n const jalaliDayOfWeek = (jsDay + 1) % 7; // 0 = Sat, 1 = Sun, ...\r\n\r\n const weekDayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\r\n const monthName = PERSIAN_MONTH_NAMES[date.month];\r\n\r\n return `${weekDayName}، ${date.day} ${monthName} ${date.year}`;\r\n}\r\n","import { useState, useCallback } from \"react\";\r\nimport type { JalaliDate } from \"../core/types\";\r\nimport { calculateNextFocusedDate } from \"./keyboard-navigation\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { UseCalendarKeyboardProps } from \"./types\";\r\n\r\nexport function useCalendarKeyboard(props: UseCalendarKeyboardProps) {\r\n const {\r\n viewYear,\r\n viewMonth,\r\n selectedDate,\r\n onSelectDate,\r\n onViewChange,\r\n isRtl = true,\r\n } = props;\r\n\r\n const [focusedDate, setFocusedDate] = useState<JalaliDate>(() => {\r\n return selectedDate ?? { year: viewYear, month: viewMonth, day: 1 };\r\n });\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n onSelectDate(focusedDate);\r\n return;\r\n }\r\n\r\n const result = calculateNextFocusedDate({\r\n currentFocused: focusedDate,\r\n key: e.key,\r\n isRtl,\r\n });\r\n\r\n if (result.handled) {\r\n e.preventDefault();\r\n setFocusedDate(result.nextDate);\r\n\r\n if (result.viewChanged) {\r\n onViewChange(result.nextDate.year, result.nextDate.month);\r\n }\r\n }\r\n },\r\n [focusedDate, isRtl, onSelectDate, onViewChange],\r\n );\r\n\r\n const getCellTabIndex = useCallback(\r\n (cellDate: JalaliDate): number => {\r\n return isSameJalaliDay(cellDate, focusedDate) ? 0 : -1;\r\n },\r\n [focusedDate],\r\n );\r\n\r\n return {\r\n focusedDate,\r\n setFocusedDate,\r\n handleKeyDown,\r\n getCellTabIndex,\r\n };\r\n}\r\n","const PERSIAN_DIGITS = [\"۰\", \"۱\", \"۲\", \"۳\", \"۴\", \"۵\", \"۶\", \"۷\", \"۸\", \"۹\"];\r\nconst LATIN_DIGITS: Record<string, string> = {\r\n \"۰\": \"0\",\r\n \"۱\": \"1\",\r\n \"۲\": \"2\",\r\n \"۳\": \"3\",\r\n \"۴\": \"4\",\r\n \"۵\": \"5\",\r\n \"۶\": \"6\",\r\n \"۷\": \"7\",\r\n \"۸\": \"8\",\r\n \"۹\": \"9\",\r\n \"٠\": \"0\",\r\n \"١\": \"1\",\r\n \"٢\": \"2\",\r\n \"٣\": \"3\",\r\n \"٤\": \"4\", // Arabic-indic fallbacks\r\n \"٥\": \"5\",\r\n \"٦\": \"6\",\r\n \"٧\": \"7\",\r\n \"٨\": \"8\",\r\n \"٩\": \"9\",\r\n};\r\n\r\n/**\r\n * Converts Latin digits (0-9) to Persian digits (۰-۹).\r\n */\r\nexport function toPersianDigits(input: string | number): string {\r\n return String(input).replace(/[0-9]/g, (w) => PERSIAN_DIGITS[+w]);\r\n}\r\n\r\n/**\r\n * Converts Persian/Arabic digits to standard ASCII Latin digits (0-9).\r\n */\r\nexport function toLatinDigits(input: string): string {\r\n return input.replace(/[۰-۹٠-٩]/g, (char) => LATIN_DIGITS[char] ?? char);\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\nimport { toPersianDigits } from \"./persian-digits\";\r\n\r\nexport interface FormatJalaliOptions {\r\n /** Output digits format. Defaults to 'persian'. */\r\n digitType?: \"persian\" | \"latin\";\r\n}\r\n\r\n/**\r\n * Formats a JalaliDate using standard format pattern tokens:\r\n * - YYYY: 4-digit year (1405)\r\n * - YY: 2-digit year (05)\r\n * - MMMM: Full month name (فروردین)\r\n * - MM: 2-digit month (01-12)\r\n * - M: 1-digit month (1-12)\r\n * - dddd: Full weekday name (شنبه)\r\n * - DD: 2-digit day (01-31)\r\n * - D: 1-digit day (1-31)\r\n */\r\nexport function formatJalaliDate(\r\n date: JalaliDate | null | undefined,\r\n pattern = \"YYYY/MM/DD\",\r\n options: FormatJalaliOptions = {},\r\n): string {\r\n if (!date) return \"\";\r\n\r\n const { digitType = \"persian\" } = options;\r\n\r\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\r\n const jsDay = gregorian.getDay();\r\n const jalaliDayOfWeek = (jsDay + 1) % 7;\r\n\r\n const yearStr = String(date.year);\r\n const shortYearStr = yearStr.slice(-2);\r\n const monthNum = date.month + 1;\r\n const monthStr = monthNum < 10 ? `0${monthNum}` : String(monthNum);\r\n const monthName = PERSIAN_MONTH_NAMES[date.month];\r\n const dayStr = date.day < 10 ? `0${date.day}` : String(date.day);\r\n const weekdayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\r\n\r\n let formatted = pattern\r\n .replace(/\\bYYYY\\b/g, yearStr)\r\n .replace(/\\bYY\\b/g, shortYearStr)\r\n .replace(/\\bMMMM\\b/g, monthName)\r\n .replace(/\\bMM\\b/g, monthStr)\r\n .replace(/\\bM\\b/g, String(monthNum))\r\n .replace(/\\bdddd\\b/g, weekdayName)\r\n .replace(/\\bDD\\b/g, dayStr)\r\n .replace(/\\bD\\b/g, String(date.day));\r\n\r\n if (digitType === \"persian\") {\r\n // Convert numeric matches while preserving month/weekday strings\r\n formatted = formatted.replace(/\\d+/g, (num) => toPersianDigits(num));\r\n }\r\n\r\n return formatted;\r\n}\r\n","// src/theme/tokens.ts\r\nimport type { Theme } from './types';\r\n\r\nexport const lightTheme: Theme = {\r\n mode: 'light',\r\n colors: {\r\n primary: '#4f46e5', // Indigo-600\r\n primaryHover: '#4338ca', // Indigo-700\r\n primaryText: '#ffffff', // متن سفید روی رنگ اصلی\r\n background: '#ffffff', // پسزمینه اصلی تقویم و اینپوت\r\n backgroundHover: '#f1f5f9', // Slate-100 برای هاور دکمهها\r\n surface: '#f8fafc', // Slate-50 برای فوتر و کادرهای فرعی\r\n border: '#e2e8f0', // Slate-200 برای خطوط و بردرها\r\n textPrimary: '#0f172a', // Slate-900 (مشکی تیره برای روزها و عناوین)\r\n textSecondary: '#64748b', // Slate-500 (خاکستری برای نام روزهای هفته و متون کمکی)\r\n textDisabled: '#cbd5e1', // Slate-300 (برای روزهای ماه قبل و بعد)\r\n holiday: '#e11d48', // Rose-600 (رنگ جمعهها و روزهای تعطیل)\r\n holidayBackground: '#fff1f2', // Rose-50 (هاور روزهای تعطیل)\r\n rangeBackground: '#e0e7ff', // Indigo-100 (پسزمینه بازه انتخابشده)\r\n todayBorder: '#4f46e5', // حاشیه دور روز جاری\r\n },\r\n radii: {\r\n sm: '6px',\r\n md: '8px',\r\n lg: '12px',\r\n full: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.04)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.05)',\r\n },\r\n};\r\n\r\nexport const darkTheme: Theme = {\r\n mode: 'dark',\r\n colors: {\r\n primary: '#6366f1',\r\n primaryHover: '#4f46e5',\r\n primaryText: '#ffffff',\r\n background: '#0f172a',\r\n backgroundHover: '#1e293b',\r\n surface: '#1e293b',\r\n border: '#334155',\r\n textPrimary: '#f8fafc',\r\n textSecondary: '#94a3b8',\r\n textDisabled: '#475569',\r\n holiday: '#fb7185',\r\n holidayBackground: '#4c0519',\r\n rangeBackground: '#312e81',\r\n todayBorder: '#818cf8',\r\n },\r\n radii: {\r\n sm: '6px',\r\n md: '8px',\r\n lg: '12px',\r\n full: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.4)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.5)',\r\n },\r\n};\r\n","import React, { createContext, useContext, useMemo } from \"react\";\r\nimport { lightTheme, darkTheme } from \"./tokens\";\r\nimport type { Theme, ThemeMode, DeepPartial } from \"./types\";\r\n\r\ninterface ThemeContextType {\r\n theme: Theme;\r\n mode: ThemeMode;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType>({\r\n theme: lightTheme,\r\n mode: \"light\",\r\n});\r\n\r\nexport const useTheme = (): ThemeContextType => {\r\n const context = useContext(ThemeContext);\r\n if (!context) {\r\n return { theme: lightTheme, mode: \"light\" };\r\n }\r\n return context;\r\n};\r\n\r\nexport interface DatePickerThemeProviderProps {\r\n children: React.ReactNode;\r\n mode?: ThemeMode;\r\n customTheme?: DeepPartial<Theme>;\r\n}\r\n\r\nexport const DatePickerThemeProvider: React.FC<\r\n DatePickerThemeProviderProps\r\n> = ({ children, mode = \"light\", customTheme }) => {\r\n const baseTheme = mode === \"dark\" ? darkTheme : lightTheme;\r\n\r\n const value = useMemo<ThemeContextType>(() => {\r\n if (!customTheme) {\r\n return { theme: baseTheme, mode };\r\n }\r\n\r\n return {\r\n mode,\r\n theme: {\r\n ...baseTheme,\r\n ...customTheme,\r\n mode,\r\n colors: {\r\n ...baseTheme.colors,\r\n ...(customTheme.colors || {}),\r\n },\r\n radii: {\r\n ...baseTheme.radii,\r\n ...(customTheme.radii || {}),\r\n },\r\n shadows: {\r\n ...baseTheme.shadows,\r\n ...(customTheme.shadows || {}),\r\n },\r\n },\r\n };\r\n }, [baseTheme, customTheme, mode]);\r\n\r\n return (\r\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\r\n );\r\n};\r\n","export function mergeClassNames(\r\n ...classNames: Array<string | null | undefined | false>\r\n): string | undefined {\r\n const merged = classNames.filter(Boolean).join(\" \");\r\n return merged || undefined;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\r\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface HeaderProps {\r\n year: number;\r\n monthName: string;\r\n onPrevMonth: () => void;\r\n onNextMonth: () => void;\r\n onTitleClick?: () => void;\r\n isPickerOpen?: boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n direction?: \"rtl\" | \"ltr\";\n isPrevDisabled?: boolean;\n isNextDisabled?: boolean;\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\ntype HoverTarget = \"prev\" | \"title\" | \"next\" | null;\r\n\r\nexport const Header: React.FC<HeaderProps> = ({\r\n year,\r\n monthName,\r\n onPrevMonth,\r\n onNextMonth,\r\n onTitleClick,\r\n isPickerOpen = false,\r\n digitType = \"persian\",\r\n direction = \"rtl\",\n isPrevDisabled = false,\n isNextDisabled = false,\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n const [hovered, setHovered] = useState<HoverTarget>(null);\r\n const displayYear =\r\n digitType === \"persian\" ? toPersianDigits(year) : String(year);\r\n\r\n const navStyle = (\n target: Exclude<HoverTarget, \"title\" | null>,\n disabled: boolean,\n ) => ({\n width: \"32px\",\r\n height: \"32px\",\r\n padding: 0,\r\n borderRadius: theme.radii.md,\r\n border: \"none\",\r\n backgroundColor:\r\n hovered === target ? theme.colors.backgroundHover : \"transparent\",\r\n color: theme.colors.textPrimary,\r\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.38 : 1,\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"background-color 0.15s ease, color 0.15s ease\",\r\n ...styles?.navButton,\n ...(disabled ? styles?.disabledNavButton : undefined),\n });\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={classNames?.header}\r\n style={{\r\n display: \"flex\",\r\n minHeight: \"40px\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: \"8px\",\r\n padding: \"4px 0 10px\",\r\n borderBottom: `1px solid ${theme.colors.border}`,\r\n userSelect: \"none\",\r\n ...styles?.header,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\n onClick={onPrevMonth}\n disabled={isPrevDisabled}\n aria-disabled={isPrevDisabled}\n aria-label=\"ماه قبل\"\n className={mergeClassNames(\n classNames?.navButton,\n isPrevDisabled && classNames?.disabledNavButton,\n )}\n style={navStyle(\"prev\", isPrevDisabled)}\n onMouseEnter={() => setHovered(\"prev\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onTitleClick}\r\n aria-expanded={isPickerOpen}\r\n className={classNames?.headerTitle}\r\n style={{\r\n minHeight: \"32px\",\r\n padding: \"6px 12px\",\r\n borderRadius: theme.radii.md,\r\n border: \"none\",\r\n backgroundColor:\r\n isPickerOpen || hovered === \"title\"\r\n ? theme.colors.backgroundHover\r\n : \"transparent\",\r\n color: theme.colors.textPrimary,\r\n cursor: onTitleClick ? \"pointer\" : \"default\",\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: \"6px\",\r\n fontSize: \"0.95rem\",\r\n fontWeight: 700,\r\n whiteSpace: \"nowrap\",\r\n transition: \"background-color 0.15s ease\",\r\n ...styles?.headerTitle,\r\n }}\r\n onMouseEnter={() => setHovered(\"title\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <span>\r\n {monthName} {displayYear}\r\n </span>\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{\r\n transform: isPickerOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\r\n transition: \"transform 0.2s ease\",\r\n }}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\n onClick={onNextMonth}\n disabled={isNextDisabled}\n aria-disabled={isNextDisabled}\n aria-label=\"ماه بعد\"\n className={mergeClassNames(\n classNames?.navButton,\n isNextDisabled && classNames?.disabledNavButton,\n )}\n style={navStyle(\"next\", isNextDisabled)}\n onMouseEnter={() => setHovered(\"next\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n );\r\n};\r\n","// src/components/Weekdays.tsx\r\nimport React from \"react\";\r\nimport { PERSIAN_WEEK_DAYS_SHORT } from \"../core/constants\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\r\n\r\nexport interface WeekdaysProps {\r\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const Weekdays: React.FC<WeekdaysProps> = ({\r\n firstDayOfWeek = 0,\r\n classNames,\r\n styles,\r\n}) => {\r\n // مرتبسازی روزهای هفته بر اساس firstDayOfWeek\r\n const weekdays = React.useMemo(() => {\r\n const days = [...PERSIAN_WEEK_DAYS_SHORT];\r\n const rotated = [\r\n ...days.slice(firstDayOfWeek),\r\n ...days.slice(0, firstDayOfWeek),\r\n ];\r\n return rotated;\r\n }, [firstDayOfWeek]);\r\n\r\n return (\r\n <div\r\n role=\"row\"\r\n className={classNames?.weekdays}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"4px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n marginBottom: \"6px\",\r\n userSelect: \"none\",\r\n ...styles?.weekdays,\r\n }}\r\n >\r\n {weekdays.map((day, idx) => {\r\n // اگر جمعه باشد (در حالت شنبه تا جمعه، آخرین ایندکس ۶ است)\r\n const isFriday = (idx + firstDayOfWeek) % 7 === 6;\r\n\r\n return (\r\n <div\r\n key={day}\r\n role=\"columnheader\"\r\n aria-label={day}\r\n className={classNames?.weekdayCell}\r\n style={{\r\n width: \"100%\",\n minWidth: 0,\n height: \"24px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"11.5px\",\r\n fontWeight: 700,\r\n color: isFriday\r\n ? \"var(--pdp-holiday-color, #e11d48)\"\r\n : \"var(--pdp-text-muted, #94a3b8)\",\r\n textAlign: \"center\",\r\n ...styles?.weekdayCell,\r\n }}\r\n >\r\n {day}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","// src/components/DayCell.tsx\r\nimport React, { useState } from \"react\";\r\nimport type { JalaliCalendarCell, JalaliDate } from \"../core/types\";\r\nimport { toPersianDigits, toLatinDigits } from \"../formatters/persian-digits\";\r\nimport type { CalendarEvent } from \"../events/types\";\r\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface DayCellProps {\r\n cell: JalaliCalendarCell;\r\n digitType?: \"persian\" | \"latin\";\r\n isHoliday?: boolean;\r\n holidayTitle?: string;\r\n events?: CalendarEvent[];\r\n tabIndex?: number;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n onSelect: (date: JalaliDate) => void;\r\n onHover?: (date: JalaliDate | null) => void;\r\n onFocus?: (date: JalaliDate) => void;\r\n}\r\n\r\nexport const DayCell: React.FC<DayCellProps> = ({\r\n cell,\r\n digitType = \"persian\",\r\n isHoliday = false,\r\n holidayTitle,\r\n events = [],\r\n tabIndex = -1,\r\n classNames,\r\n styles,\r\n onSelect,\r\n onHover,\r\n onFocus,\r\n}) => {\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [isPressed, setIsPressed] = useState(false);\r\n\r\n const {\r\n jalali,\r\n dayNumber,\r\n isCurrentMonth,\r\n isToday,\r\n isSelected,\r\n isDisabled,\r\n isInRange,\r\n isRangeStart,\r\n isRangeEnd,\r\n } = cell;\r\n\r\n const formattedDay =\r\n digitType === \"persian\"\r\n ? toPersianDigits(dayNumber)\r\n : toLatinDigits(dayNumber.toString());\r\n\r\n const isInteractive = !isDisabled && isCurrentMonth;\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (isInteractive) {\r\n onSelect(jalali);\r\n }\r\n };\r\n\r\n const handleMouseEnter = () => {\r\n setIsHovered(true);\r\n if (isInteractive && onHover) {\r\n onHover(jalali);\r\n }\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setIsHovered(false);\r\n setIsPressed(false);\r\n if (onHover) {\r\n onHover(null);\r\n }\r\n };\r\n\r\n const handleFocus = () => {\r\n if (isInteractive && onFocus) {\r\n onFocus(jalali);\r\n }\r\n };\r\n\r\n // رنگبندی پسزمینه و متن در حالتهای مختلف\r\n let cellBg = \"transparent\";\r\n let textColor = isCurrentMonth\r\n ? \"var(--pdp-text-primary, #0f172a)\"\r\n : \"var(--pdp-text-disabled, #cbd5e1)\";\r\n\r\n const isEdgeOfRange = isRangeStart || isRangeEnd;\r\n\r\n if (isSelected || isEdgeOfRange) {\n cellBg = \"var(--pdp-primary, #4f46e5)\";\r\n textColor = \"#ffffff\";\r\n } else if (isInRange) {\r\n cellBg = \"var(--pdp-range-between-bg, rgba(79, 70, 229, 0.12))\";\r\n } else if (isHovered && isInteractive) {\r\n cellBg = \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }\r\n\r\n // رنگ روزهای تعطیل در صورت عدم انتخاب\r\n if (\n isHoliday &&\n isCurrentMonth &&\n !isDisabled &&\n !isSelected &&\n !isEdgeOfRange\n ) {\n textColor = \"var(--pdp-holiday-color, #e11d48)\";\n }\n\n if (isDisabled) {\n cellBg = \"var(--pdp-disabled-bg, #f1f5f9)\";\n textColor = \"var(--pdp-text-disabled, #94a3b8)\";\n }\n\n const stateClassName = mergeClassNames(\n classNames?.dayCell,\n isToday && classNames?.todayCell,\n isSelected && classNames?.selectedCell,\n isInRange && classNames?.rangeBetweenCell,\n isRangeStart && classNames?.rangeStartCell,\n isRangeEnd && classNames?.rangeEndCell,\n isDisabled && classNames?.disabledCell,\n !isCurrentMonth && classNames?.outsideMonthCell,\n isHoliday && classNames?.holidayCell,\n );\n\n const stateStyles: React.CSSProperties = {\n ...(isToday ? styles?.todayCell : undefined),\n ...(isSelected ? styles?.selectedCell : undefined),\n ...(isInRange ? styles?.rangeBetweenCell : undefined),\n ...(isRangeStart ? styles?.rangeStartCell : undefined),\n ...(isRangeEnd ? styles?.rangeEndCell : undefined),\n ...(!isCurrentMonth ? styles?.outsideMonthCell : undefined),\n ...(isHoliday ? styles?.holidayCell : undefined),\n ...(isDisabled ? styles?.disabledCell : undefined),\n };\n\r\n // انیمیشن transform بر اساس حالتهای مختلف\r\n let transform = \"scale(1)\";\r\n if (isInteractive) {\r\n if (isPressed) {\r\n transform = \"scale(0.92)\";\r\n } else if (isHovered && !isInRange) {\r\n transform = \"scale(1.08)\";\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\n minWidth: 0,\n aspectRatio: \"1 / 1\",\n margin: 0,\r\n padding: 0,\r\n boxSizing: \"border-box\",\r\n }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <button\r\n type=\"button\"\r\n role=\"gridcell\"\r\n tabIndex={tabIndex}\r\n disabled={isDisabled || !isCurrentMonth}\n aria-disabled={isDisabled || !isCurrentMonth}\n aria-selected={isSelected}\r\n aria-label={`${jalali.year}/${jalali.month + 1}/${jalali.day}${\r\n holidayTitle ? ` - ${holidayTitle}` : \"\"\r\n }`}\r\n onClick={handleClick}\r\n onFocus={handleFocus}\r\n onMouseDown={() => isInteractive && setIsPressed(true)}\r\n onMouseUp={() => isInteractive && setIsPressed(false)}\r\n className={stateClassName}\n style={{\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: isRangeStart\r\n ? \"0 8px 8px 0\"\r\n : isRangeEnd\r\n ? \"8px 0 0 8px\"\r\n : isInRange\r\n ? \"0\"\r\n : \"8px\",\r\n border:\r\n isToday && !isSelected\r\n ? \"1px solid var(--pdp-primary, #4f46e5)\"\r\n : \"none\",\r\n backgroundColor: cellBg,\r\n color: textColor,\r\n cursor: isDisabled ? \"not-allowed\" : isInteractive ? \"pointer\" : \"default\",\n fontSize: \"13px\",\r\n fontWeight: isSelected || isToday ? 700 : 500,\r\n outline: \"none\",\r\n position: \"relative\",\r\n padding: 0,\r\n margin: 0,\r\n boxSizing: \"border-box\",\r\n // انیمیشنهای نرم هاور، اسکیل و رنگ\r\n transform,\r\n boxShadow:\r\n isHovered && isInteractive && !isInRange && !isSelected\r\n ? \"0 2px 6px rgba(0, 0, 0, 0.08)\"\r\n : \"none\",\r\n transition:\r\n \"transform 0.16s cubic-bezier(0.34, 1.56, 0.64, 1), background-color 0.14s ease, color 0.14s ease, box-shadow 0.16s ease\",\r\n zIndex: isHovered && isInteractive ? 2 : 1,\n opacity: isDisabled ? 0.42 : isCurrentMonth ? 1 : 0.55,\n filter: isDisabled ? \"grayscale(0.65)\" : undefined,\n ...styles?.dayCell,\n ...stateStyles,\n }}\r\n >\r\n <span>{formattedDay}</span>\r\n\r\n {/* نقاط ایونتها */}\r\n {events.length > 0 && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"3px\",\r\n display: \"flex\",\r\n gap: \"2px\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"transform 0.14s ease\",\r\n transform:\r\n isHovered && isInteractive ? \"translateY(1px)\" : \"none\",\r\n }}\r\n >\r\n {events.slice(0, 3).map((ev) => (\r\n <span\r\n key={ev.id}\r\n style={{\r\n width: \"3.5px\",\r\n height: \"3.5px\",\r\n borderRadius: \"50%\",\r\n backgroundColor: isSelected\r\n ? \"#ffffff\"\r\n : ev.color || \"var(--pdp-primary, #4f46e5)\",\r\n transition: \"background-color 0.14s ease\",\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </button>\r\n\r\n {/* تولتیپ شناور روز با انیمیشن Fade-in / Slide-up */}\r\n {isHovered && isCurrentMonth && (isHoliday || events.length > 0) && (\r\n <div\r\n role=\"tooltip\"\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"calc(100% + 7px)\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n zIndex: 1050,\r\n pointerEvents: \"none\",\r\n whiteSpace: \"nowrap\",\r\n backgroundColor: \"var(--pdp-tooltip-bg, #0f172a)\",\r\n color: \"var(--pdp-tooltip-text, #ffffff)\",\r\n padding: \"5px 9px\",\r\n borderRadius: \"6px\",\r\n fontSize: \"11.5px\",\r\n fontWeight: 600,\r\n lineHeight: 1.3,\r\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.25)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"2px\",\r\n textAlign: \"center\",\r\n animation:\r\n \"pdpTooltipFade 0.15s cubic-bezier(0.16, 1, 0.3, 1) forwards\",\r\n }}\r\n >\r\n {isHoliday && holidayTitle && (\r\n <span style={{ color: \"#fda4af\" }}>{holidayTitle}</span>\r\n )}\r\n\r\n {events.map((ev) => (\r\n <span key={ev.id} style={{ color: \"#e2e8f0\" }}>\r\n • {ev.title}\r\n </span>\r\n ))}\r\n\r\n {/* فلش جهتنمای تولتیپ */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: \"100%\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n borderWidth: \"4px\",\r\n borderStyle: \"solid\",\r\n borderColor:\r\n \"var(--pdp-tooltip-bg, #0f172a) transparent transparent transparent\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// src/components/MonthYearPicker.tsx\r\nimport React, { useState } from \"react\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\nimport {\n isJalaliMonthSelectable,\n isJalaliYearSelectable,\n type JalaliDateConstraints,\n} from \"../core/date-availability\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface MonthYearPickerProps {\r\n currentYear: number;\r\n currentMonth: number;\r\n onSelectMonth: (month: JalaliMonthIndex) => void;\r\n onSelectYear: (year: number) => void;\n minDate?: JalaliDate;\n maxDate?: JalaliDate;\n isDateDisabled?: (date: JalaliDate) => boolean;\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const MonthYearPicker: React.FC<MonthYearPickerProps> = ({\r\n currentYear,\r\n currentMonth,\r\n onSelectMonth,\r\n onSelectYear,\n minDate,\n maxDate,\n isDateDisabled,\n classNames,\r\n styles,\r\n}) => {\r\n const [viewLevel, setViewLevel] = useState<\"months\" | \"years\">(\"months\");\r\n const [decadeStartYear, setDecadeStartYear] = useState<number>(\r\n () => Math.floor(currentYear / 10) * 10,\r\n );\r\n const [activeYear, setActiveYear] = useState<number>(currentYear);\r\n\r\n const decadeYears = Array.from(\n { length: 12 },\r\n (_, i) => decadeStartYear - 1 + i,\r\n );\n\n const constraints: JalaliDateConstraints = {\n minDate,\n maxDate,\n isDateDisabled,\n };\n const canSelectYear = (year: number) =>\n isJalaliYearSelectable(year, constraints);\n const canSelectMonth = (year: number, month: JalaliMonthIndex) =>\n isJalaliMonthSelectable(year, month, constraints);\n const previousPeriodDisabled =\n viewLevel === \"months\"\n ? !canSelectYear(activeYear - 1)\n : !Array.from({ length: 10 }, (_, i) => decadeStartYear - 10 + i).some(\n canSelectYear,\n );\n const nextPeriodDisabled =\n viewLevel === \"months\"\n ? !canSelectYear(activeYear + 1)\n : !Array.from({ length: 10 }, (_, i) => decadeStartYear + 10 + i).some(\n canSelectYear,\n );\n\r\n const handlePrev = () => {\n if (previousPeriodDisabled) return;\n if (viewLevel === \"months\") {\r\n const prevY = activeYear - 1;\r\n setActiveYear(prevY);\r\n onSelectYear(prevY);\r\n } else {\r\n setDecadeStartYear((prev) => prev - 10);\r\n }\r\n };\r\n\r\n const handleNext = () => {\n if (nextPeriodDisabled) return;\n if (viewLevel === \"months\") {\r\n const nextY = activeYear + 1;\r\n setActiveYear(nextY);\r\n onSelectYear(nextY);\r\n } else {\r\n setDecadeStartYear((prev) => prev + 10);\r\n }\r\n };\r\n\r\n const navBtnStyle: React.CSSProperties = {\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n padding: \"6px\",\r\n borderRadius: \"8px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n transition: \"all 0.15s ease\",\r\n };\r\n\r\n const cellBtnBaseStyle: React.CSSProperties = {\r\n height: \"46px\",\r\n borderRadius: \"10px\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n fontSize: \"13.5px\",\r\n fontWeight: 600,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"all 0.15s ease\",\r\n background: \"transparent\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n userSelect: \"none\",\r\n };\r\n\r\n return (\r\n <div\r\n className={classNames?.calendar}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"10px\",\r\n width: \"100%\",\r\n minWidth: 0,\n maxWidth: \"100%\",\n height: \"260px\",\r\n padding: \"6px\",\r\n boxSizing: \"border-box\",\r\n justifyContent: \"space-between\",\r\n userSelect: \"none\",\r\n ...styles?.calendar,\r\n }}\r\n >\r\n {/* Header Bar */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 4px\",\r\n height: \"38px\",\r\n }}\r\n >\r\n {/* Right Arrow (Previous in RTL) */}\r\n <button\n type=\"button\"\n onClick={handlePrev}\n disabled={previousPeriodDisabled}\n aria-disabled={previousPeriodDisabled}\n aria-label=\"Previous\"\n className={mergeClassNames(\n classNames?.navButton,\n previousPeriodDisabled && classNames?.disabledNavButton,\n )}\n style={{\n ...navBtnStyle,\n cursor: previousPeriodDisabled ? \"not-allowed\" : \"pointer\",\n opacity: previousPeriodDisabled ? 0.38 : 1,\n ...(previousPeriodDisabled\n ? styles?.disabledNavButton\n : undefined),\n }}\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Header Year Button (Clearly Interactive) */}\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (viewLevel === \"months\") {\r\n setDecadeStartYear(Math.floor(activeYear / 10) * 10);\r\n setViewLevel(\"years\");\r\n }\r\n }}\r\n style={{\r\n background:\r\n viewLevel === \"months\"\r\n ? \"var(--pdp-surface-subtle, #f1f5f9)\"\r\n : \"transparent\",\r\n border:\r\n viewLevel === \"months\"\r\n ? \"1px solid var(--pdp-surface-border, #e2e8f0)\"\r\n : \"none\",\r\n cursor: viewLevel === \"months\" ? \"pointer\" : \"default\",\r\n fontSize: \"13.5px\",\r\n fontWeight: 700,\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n padding: \"5px 12px\",\r\n borderRadius: \"8px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"6px\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (viewLevel === \"months\") {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #e2e8f0)\";\r\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (viewLevel === \"months\") {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-surface-subtle, #f1f5f9)\";\r\n e.currentTarget.style.borderColor =\r\n \"var(--pdp-surface-border, #e2e8f0)\";\r\n }\r\n }}\r\n >\r\n <span>\r\n {viewLevel === \"months\"\r\n ? toPersianDigits(activeYear)\r\n : `${toPersianDigits(decadeStartYear)} - ${toPersianDigits(decadeStartYear + 9)}`}\r\n </span>\r\n\r\n {viewLevel === \"months\" && (\r\n <svg\r\n width=\"13\"\r\n height=\"13\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{ opacity: 0.7 }}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n )}\r\n </button>\r\n\r\n {/* Left Arrow (Next in RTL) */}\r\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={nextPeriodDisabled}\n aria-disabled={nextPeriodDisabled}\n aria-label=\"Next\"\n className={mergeClassNames(\n classNames?.navButton,\n nextPeriodDisabled && classNames?.disabledNavButton,\n )}\n style={{\n ...navBtnStyle,\n cursor: nextPeriodDisabled ? \"not-allowed\" : \"pointer\",\n opacity: nextPeriodDisabled ? 0.38 : 1,\n ...(nextPeriodDisabled ? styles?.disabledNavButton : undefined),\n }}\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Grid Content: 4 Columns x 3 Rows */}\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(4, 1fr)\",\r\n gridTemplateRows: \"repeat(3, 1fr)\",\r\n gap: \"8px 6px\",\r\n flex: 1,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {viewLevel === \"months\"\r\n ? PERSIAN_MONTH_NAMES.map((name, index) => {\n const isSelected =\n index === currentMonth && activeYear === currentYear;\n const isDisabled = !canSelectMonth(\n activeYear,\n index as JalaliMonthIndex,\n );\n return (\n <button\n key={name}\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n onClick={() => onSelectMonth(index as JalaliMonthIndex)}\n className={mergeClassNames(\n classNames?.monthButton,\n isSelected && classNames?.selectedMonthButton,\n isDisabled && classNames?.disabledMonthButton,\n )}\n style={{\n ...cellBtnBaseStyle,\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontWeight: isSelected ? 700 : 500,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n ...(styles?.monthButton ?? {}),\n ...(isSelected ? styles?.selectedMonthButton : undefined),\n ...(isDisabled ? styles?.disabledMonthButton : undefined),\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {name}\r\n </button>\r\n );\r\n })\r\n : decadeYears.map((year, idx) => {\n const isOutlier = idx === 0 || idx === 11;\n const isSelected = year === activeYear;\n const isDisabled = !canSelectYear(year);\n\r\n return (\r\n <button\r\n key={year}\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n className={mergeClassNames(\n classNames?.yearButton,\n isSelected && classNames?.selectedYearButton,\n isDisabled && classNames?.disabledYearButton,\n )}\n onClick={() => {\r\n setActiveYear(year);\r\n onSelectYear(year);\r\n setViewLevel(\"months\");\r\n }}\r\n style={{\r\n ...cellBtnBaseStyle,\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : isOutlier\r\n ? \"var(--pdp-text-disabled, #94a3b8)\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontWeight: isSelected ? 700 : 500,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.3 : isOutlier ? 0.4 : 1,\n ...(styles?.yearButton ?? {}),\n ...(isSelected ? styles?.selectedYearButton : undefined),\n ...(isDisabled ? styles?.disabledYearButton : undefined),\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {toPersianDigits(year)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import type { JalaliTime } from \"./types\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\n\r\n/**\r\n * Formats a single time segment (e.g. hour/minute) as a 2-digit padded string.\r\n */\r\nexport function formatTimeSegment(\r\n val: number,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n const padded = val < 10 ? `0${val}` : `${val}`;\r\n return digitType === \"persian\" ? toPersianDigits(padded) : padded;\r\n}\r\n\r\n/**\r\n * Retrieves the current local machine time as a JalaliTime structure.\r\n */\r\nexport function getCurrentTime(): JalaliTime {\r\n const now = new Date();\r\n return {\r\n hour: now.getHours(),\r\n minute: now.getMinutes(),\r\n second: now.getSeconds(),\r\n };\r\n}\r\n\r\n/**\r\n * Clamps hour, minute, and second within valid boundary ranges.\r\n */\r\nexport function clampTime(time: JalaliTime): JalaliTime {\r\n return {\r\n hour: Math.max(0, Math.min(23, time.hour)),\r\n minute: Math.max(0, Math.min(59, time.minute)),\r\n second:\r\n time.second !== undefined\r\n ? Math.max(0, Math.min(59, time.second))\r\n : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Formats a JalaliTime object into a display string (e.g., \"14:30\" or \"۱۴:۳۰\").\r\n */\r\nexport function formatTimeString(\r\n time: JalaliTime | null | undefined,\r\n showSeconds = false,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n if (!time) return \"\";\r\n const h = formatTimeSegment(time.hour, digitType);\r\n const m = formatTimeSegment(time.minute, digitType);\r\n if (showSeconds && time.second !== undefined) {\r\n const s = formatTimeSegment(time.second, digitType);\r\n return `${h}:${m}:${s}`;\r\n }\r\n return `${h}:${m}`;\r\n}\r\n","import React from \"react\";\r\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport { formatTimeString } from \"../../plugins/time-picker/time-utils\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\nimport type { CalendarFooterProps } from \"./types\";\r\n\r\nexport const CalendarFooter: React.FC<CalendarFooterProps> = ({\r\n selectedDate,\r\n selectedRange,\r\n selectedDates,\r\n selectedTime,\r\n showSeconds = false,\r\n mode = \"single\",\r\n digitType = \"persian\",\r\n showStatusText = true,\r\n showActions = true,\r\n onToday,\r\n onClear,\r\n onConfirm,\r\n direction = \"rtl\",\r\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n\r\n const statusText = (() => {\r\n if (mode === \"single\") {\r\n if (!selectedDate) return \"تاریخی انتخاب نشده\";\r\n const date = formatJalaliDate(selectedDate, \"YYYY/MM/DD\", { digitType });\r\n const time = selectedTime\r\n ? formatTimeString(selectedTime, showSeconds, digitType)\r\n : \"\";\r\n return time ? `${date}، ${time}` : date;\r\n }\r\n\r\n if (mode === \"range\") {\r\n const [start, end] = selectedRange ?? [null, null];\r\n if (!start) return \"بازهای انتخاب نشده\";\r\n const startText = formatJalaliDate(start, \"YYYY/MM/DD\", { digitType });\r\n if (!end) return `${startText} تا …`;\r\n const endText = formatJalaliDate(end, \"YYYY/MM/DD\", { digitType });\r\n return `${startText} تا ${endText}`;\r\n }\r\n\r\n const count = selectedDates?.length ?? 0;\r\n const displayCount =\r\n digitType === \"persian\" ? toPersianDigits(count) : String(count);\r\n return count ? `${displayCount} تاریخ انتخاب شده` : \"تاریخی انتخاب نشده\";\r\n })();\r\n\r\n const actionButtonStyle: React.CSSProperties = {\r\n minHeight: \"34px\",\r\n padding: \"5px 12px\",\r\n borderRadius: theme.radii.sm,\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textSecondary,\r\n cursor: \"pointer\",\r\n fontFamily: \"inherit\",\r\n fontSize: \"0.78rem\",\r\n fontWeight: 600,\r\n };\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={classNames?.footer}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: showStatusText ? \"space-between\" : \"flex-end\",\r\n flexWrap: \"wrap\",\n gap: \"8px\",\n width: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n padding: \"10px 0 0\",\r\n borderTop: `1px solid ${theme.colors.border}`,\r\n color: theme.colors.textPrimary,\r\n ...styles?.footer,\r\n }}\r\n >\r\n {showStatusText && (\r\n <span\r\n className={classNames?.footerStatus}\r\n style={{\r\n color: theme.colors.textSecondary,\r\n fontSize: \"0.78rem\",\n lineHeight: 1.5,\n minWidth: 0,\n overflowWrap: \"anywhere\",\n ...styles?.footerStatus,\r\n }}\r\n >\r\n {statusText}\r\n </span>\r\n )}\r\n\r\n {showActions && (\r\n <div\r\n className={classNames?.footerActions}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n flexWrap: \"wrap\",\r\n gap: \"6px\",\r\n ...styles?.footerActions,\r\n }}\r\n >\r\n {onToday && (\r\n <button\r\n type=\"button\"\r\n onClick={onToday}\r\n className={classNames?.todayButton}\r\n style={{\r\n ...actionButtonStyle,\r\n color: theme.colors.primary,\r\n ...styles?.todayButton,\r\n }}\r\n >\r\n امروز\r\n </button>\r\n )}\r\n {onClear && (\r\n <button\r\n type=\"button\"\r\n onClick={onClear}\r\n className={classNames?.clearButton}\r\n style={{ ...actionButtonStyle, ...styles?.clearButton }}\r\n >\r\n پاک کردن\r\n </button>\r\n )}\r\n {onConfirm && (\r\n <button\r\n type=\"button\"\r\n onClick={onConfirm}\r\n className={classNames?.confirmButton}\r\n style={{\r\n ...actionButtonStyle,\r\n borderColor: theme.colors.primary,\r\n backgroundColor: theme.colors.primary,\r\n color: theme.colors.primaryText,\r\n ...styles?.confirmButton,\r\n }}\r\n >\r\n تأیید\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// src/plugins/time-picker/TimePicker.tsx\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport type { JalaliTime } from \"./types\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../../theme/style-slots\";\r\n\r\nexport interface TimePickerProps {\r\n value: JalaliTime;\r\n onChange: (time: JalaliTime) => void;\r\n minuteStep?: number;\r\n hourStep?: number;\r\n showSeconds?: boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const TimePicker: React.FC<TimePickerProps> = ({\r\n value,\r\n onChange,\r\n minuteStep = 1,\r\n hourStep = 1,\r\n showSeconds = false,\r\n digitType = \"persian\",\r\n classNames,\r\n styles,\r\n}) => {\r\n const [openDropdown, setOpenDropdown] = useState<\r\n \"hour\" | \"minute\" | \"second\" | null\r\n >(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const hours = Array.from(\r\n { length: Math.ceil(24 / hourStep) },\r\n (_, i) => i * hourStep,\r\n );\r\n const minutes = Array.from(\r\n { length: Math.ceil(60 / minuteStep) },\r\n (_, i) => i * minuteStep,\r\n );\r\n const seconds = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n // Close dropdown on outside click\r\n useEffect(() => {\r\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n setOpenDropdown(null);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleOutsideClick);\r\n document.addEventListener(\"touchstart\", handleOutsideClick);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleOutsideClick);\r\n document.removeEventListener(\"touchstart\", handleOutsideClick);\r\n };\r\n }, []);\r\n\r\n const formatNum = (n: number) => {\r\n const formatted = String(n).padStart(2, \"0\");\r\n return digitType === \"persian\" ? toPersianDigits(formatted) : formatted;\r\n };\r\n\r\n const renderSelectColumn = (\r\n type: \"hour\" | \"minute\" | \"second\",\r\n currentVal: number,\r\n options: number[],\r\n onSelect: (val: number) => void,\r\n ) => {\r\n const isOpen = openDropdown === type;\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n {/* Clickable Badge Trigger */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setOpenDropdown(isOpen ? null : type)}\r\n style={{\r\n minWidth: \"40px\",\r\n height: \"30px\",\r\n padding: \"0 6px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: \"6px\",\r\n backgroundColor: isOpen\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"var(--pdp-surface-bg, #ffffff)\",\r\n color: isOpen ? \"#ffffff\" : \"var(--pdp-text-primary, #0f172a)\",\r\n border: `1px solid ${isOpen ? \"var(--pdp-primary, #4f46e5)\" : \"var(--pdp-surface-border, #e2e8f0)\"}`,\r\n fontSize: \"13px\",\r\n fontWeight: 700,\r\n cursor: \"pointer\",\r\n transition: \"all 0.15s ease\",\r\n boxShadow: isOpen ? \"0 0 0 2px rgba(79, 70, 229, 0.2)\" : \"none\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isOpen) {\r\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isOpen) {\r\n e.currentTarget.style.borderColor =\r\n \"var(--pdp-surface-border, #e2e8f0)\";\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-surface-bg, #ffffff)\";\r\n }\r\n }}\r\n >\r\n {formatNum(currentVal)}\r\n </button>\r\n\r\n {/* Scrollable Dropdown List */}\r\n {isOpen && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"calc(100% + 4px)\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n maxHeight: \"140px\",\r\n width: \"52px\",\r\n overflowY: \"auto\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n borderRadius: \"8px\",\r\n boxShadow:\r\n \"var(--pdp-shadow, 0 10px 15px -3px rgba(0, 0, 0, 0.15))\",\r\n zIndex: 1050,\r\n padding: \"4px 2px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"2px\",\r\n }}\r\n >\r\n {options.map((opt) => {\r\n const isSelected = opt === currentVal;\r\n return (\r\n <button\r\n key={opt}\r\n type=\"button\"\r\n onClick={() => {\r\n onSelect(opt);\r\n setOpenDropdown(null);\r\n }}\r\n style={{\r\n padding: \"4px 0\",\r\n border: \"none\",\r\n borderRadius: \"4px\",\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontSize: \"12px\",\r\n fontWeight: isSelected ? 700 : 500,\r\n cursor: \"pointer\",\r\n transition: \"background 0.12s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {formatNum(opt)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={classNames?.timePicker}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n gap: \"6px\",\r\n padding: \"6px 12px\",\r\n borderTop: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n backgroundColor: \"var(--pdp-surface-subtle, #f8fafc)\",\r\n borderRadius:\r\n \"0 0 var(--pdp-border-radius, 10px) var(--pdp-border-radius, 10px)\",\r\n direction: \"ltr\",\r\n userSelect: \"none\",\n width: \"100%\",\n maxWidth: \"100%\",\n boxSizing: \"border-box\",\n ...styles?.timePicker,\r\n }}\r\n >\r\n {/* ساعت */}\r\n {renderSelectColumn(\"hour\", value.hour, hours, (h) =>\r\n onChange({ ...value, hour: h }),\r\n )}\r\n\r\n <span\r\n style={{\r\n fontWeight: 800,\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n fontSize: \"14px\",\r\n }}\r\n >\r\n :\r\n </span>\r\n\r\n {/* دقیقه */}\r\n {renderSelectColumn(\"minute\", value.minute, minutes, (m) =>\r\n onChange({ ...value, minute: m }),\r\n )}\r\n\r\n {/* ثانیه */}\r\n {showSeconds && (\r\n <>\r\n <span\r\n style={{\r\n fontWeight: 800,\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n fontSize: \"14px\",\r\n }}\r\n >\r\n :\r\n </span>\r\n {renderSelectColumn(\"second\", value.second ?? 0, seconds, (s) =>\r\n onChange({ ...value, second: s }),\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import type { JalaliDate, JalaliMonthIndex } from \"../../core/types\";\r\nimport type { DateParseResult } from \"./types\";\r\nimport {\r\n toLatinDigits,\r\n toPersianDigits,\r\n} from \"../../formatters/persian-digits\";\r\nimport { getDaysInJalaliMonth } from \"../../core/jalali-math\";\r\nimport { compareJalaliDates } from \"../../core/jalali-helpers\";\r\n\r\n/**\r\n * Strips all non-digit characters and applies the 'YYYY/MM/DD' mask structure.\r\n */\r\nexport function applyDateMask(\r\n rawInput: string,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n // Normalize all Persian/Arabic digits to ASCII 0-9\r\n const cleanDigits = toLatinDigits(rawInput).replace(/\\D/g, \"\").slice(0, 8);\r\n\r\n let masked = \"\";\r\n if (cleanDigits.length > 0) {\r\n masked = cleanDigits.slice(0, 4); // Year (YYYY)\r\n }\r\n if (cleanDigits.length >= 5) {\r\n masked += `/${cleanDigits.slice(4, 6)}`; // Month (MM)\r\n }\r\n if (cleanDigits.length >= 7) {\r\n masked += `/${cleanDigits.slice(6, 8)}`; // Day (DD)\r\n }\r\n\r\n return digitType === \"persian\" ? toPersianDigits(masked) : masked;\r\n}\r\n\r\n/**\r\n * Validates and parses a masked string into a valid JalaliDate object.\r\n */\r\nexport function parseAndValidateJalaliString(\r\n input: string,\r\n minDate?: JalaliDate,\r\n maxDate?: JalaliDate,\r\n isDateDisabled?: (date: JalaliDate) => boolean,\r\n): DateParseResult {\r\n const normalized = toLatinDigits(input).trim();\r\n\r\n if (!normalized) {\r\n return { isValid: true, date: null };\r\n }\r\n\r\n const parts = normalized.split(\"/\");\r\n if (\r\n parts.length !== 3 ||\r\n parts[0].length !== 4 ||\r\n parts[1].length !== 2 ||\r\n parts[2].length !== 2\r\n ) {\r\n return { isValid: false, date: null, error: \"INVALID_FORMAT\" };\r\n }\r\n\r\n const year = parseInt(parts[0], 10);\r\n const monthNum = parseInt(parts[1], 10);\r\n const day = parseInt(parts[2], 10);\r\n\r\n // Validate Month Range (1 to 12)\r\n if (monthNum < 1 || monthNum > 12) {\r\n return { isValid: false, date: null, error: \"INVALID_MONTH\" };\r\n }\r\n\r\n const monthIndex = (monthNum - 1) as JalaliMonthIndex;\r\n const maxDays = getDaysInJalaliMonth(year, monthIndex);\r\n\r\n // Validate Day Range (1 to 29/30/31 based on month & leap year)\r\n if (day < 1 || day > maxDays) {\r\n return { isValid: false, date: null, error: \"INVALID_DAY\" };\r\n }\r\n\r\n const jalaliDate: JalaliDate = { year, month: monthIndex, day };\r\n\r\n // Min / Max range validations\r\n if (minDate && compareJalaliDates(jalaliDate, minDate) < 0) {\r\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MIN_BOUNDS\" };\r\n }\r\n\r\n if (maxDate && compareJalaliDates(jalaliDate, maxDate) > 0) {\r\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MAX_BOUNDS\" };\r\n }\r\n\r\n // Custom disable rule\r\n if (isDateDisabled && isDateDisabled(jalaliDate)) {\r\n return { isValid: false, date: jalaliDate, error: \"DISABLED_DATE\" };\r\n }\r\n\r\n return { isValid: true, date: jalaliDate };\r\n}\r\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\r\nimport type { MaskedDateInputProps, DateValidationError } from \"./types\";\r\nimport { applyDateMask, parseAndValidateJalaliString } from \"./mask-utils\";\r\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\r\nimport type { JalaliDate } from \"../../core/types\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\n\r\nexport const MaskedDateInput: React.FC<MaskedDateInputProps> = ({\r\n value,\r\n defaultValue = null,\r\n onChange,\r\n onValidationError,\r\n digitType = \"persian\",\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n clearable = true,\r\n placeholder = \"۱۴۰۵/۰۱/۱۵\",\r\n disabled = false,\r\n direction = \"rtl\",\r\n wrapperClassName,\r\n wrapperStyle,\r\n clearButtonClassName,\r\n clearButtonStyle,\r\n style,\r\n ...restProps\r\n}) => {\r\n const { theme } = useTheme();\r\n const [internalValue, setInternalValue] = useState<JalaliDate | null>(\r\n defaultValue,\r\n );\r\n const activeDate = value !== undefined ? value : internalValue;\r\n\r\n const [text, setText] = useState<string>(() => {\r\n return activeDate\r\n ? formatJalaliDate(activeDate, \"YYYY/MM/DD\", { digitType })\r\n : \"\";\r\n });\r\n\r\n const [hasError, setHasError] = useState<boolean>(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Sync text input with incoming controlled value updates\r\n useEffect(() => {\r\n if (value !== undefined) {\r\n setText(\r\n value ? formatJalaliDate(value, \"YYYY/MM/DD\", { digitType }) : \"\",\r\n );\r\n setHasError(false);\r\n }\r\n }, [value, digitType]);\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const rawVal = e.target.value;\r\n const maskedVal = applyDateMask(rawVal, digitType);\r\n setText(maskedVal);\r\n\r\n // Validate only if complete date is typed (10 chars: YYYY/MM/DD) or empty\r\n if (maskedVal.length === 10 || maskedVal.length === 0) {\r\n const result = parseAndValidateJalaliString(\r\n maskedVal,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n );\r\n\r\n if (result.isValid) {\r\n setHasError(false);\r\n onValidationError?.(null);\r\n if (value === undefined) {\r\n setInternalValue(result.date);\r\n }\r\n onChange?.(result.date);\r\n } else {\r\n setHasError(true);\r\n onValidationError?.(result.error as DateValidationError);\r\n }\r\n } else {\r\n // Incomplete state\r\n setHasError(false);\r\n onValidationError?.(null);\r\n }\r\n };\r\n\r\n const handleClear = useCallback(() => {\r\n setText(\"\");\r\n setHasError(false);\r\n onValidationError?.(null);\r\n if (value === undefined) {\r\n setInternalValue(null);\r\n }\r\n onChange?.(null);\r\n inputRef.current?.focus();\r\n }, [value, onChange, onValidationError]);\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={wrapperClassName}\r\n style={{\r\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n width: \"100%\",\n maxWidth: \"180px\",\n ...wrapperStyle,\r\n }}\r\n >\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n disabled={disabled}\r\n placeholder={digitType === \"persian\" ? placeholder : \"1405/01/15\"}\r\n value={text}\r\n onChange={handleInputChange}\r\n style={{\r\n width: \"180px\",\n maxWidth: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n padding: \"8px 12px\",\r\n paddingInlineEnd: clearable && text ? \"32px\" : \"12px\",\r\n borderRadius: theme.radii.sm,\r\n border: `1px solid ${hasError ? theme.colors.holiday : theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n fontSize: \"14px\",\r\n fontFamily: \"inherit\",\r\n outlineColor: theme.colors.primary,\r\n textAlign: \"center\",\r\n letterSpacing: \"1px\",\r\n transition: \"border-color 0.15s ease\",\r\n ...style,\r\n }}\r\n {...restProps}\r\n />\r\n\r\n {/* Clear Button */}\r\n {clearable && text && !disabled && (\r\n <button\r\n type=\"button\"\r\n aria-label=\"پاک کردن\"\r\n onClick={handleClear}\r\n className={clearButtonClassName}\r\n style={{\r\n position: \"absolute\",\r\n insetInlineEnd: \"8px\",\r\n background: \"none\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n color: theme.colors.textSecondary,\r\n fontSize: \"14px\",\r\n lineHeight: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"2px\",\r\n ...clearButtonStyle,\r\n }}\r\n >\r\n ✕\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { CalendarEvent } from \"./types\";\r\n\r\n/**\r\n * Filters and returns all events matching a specific Jalali date.\r\n */\r\nexport function getEventsForDate(\r\n date: JalaliDate,\r\n events?: CalendarEvent[],\r\n): CalendarEvent[] {\r\n if (!events || events.length === 0) return [];\r\n return events.filter((e) => isSameJalaliDay(e.date, date));\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport type { OfficialHoliday, CustomHolidayRule } from \"./types\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\n\r\n/**\r\n * Fixed Solar Calendar Holidays in Iran:\r\n * Key format: `${monthIndex}-${day}` (Month index is 0-based: 0 = Farvardin, 11 = Esfand)\r\n */\r\nconst FIXED_SOLAR_HOLIDAYS: Record<string, string> = {\r\n \"0-1\": \"جشن نوروز / سال نو\",\r\n \"0-2\": \"عید نوروز\",\r\n \"0-3\": \"عید نوروز\",\r\n \"0-4\": \"عید نوروز\",\r\n \"0-12\": \"روز جمهوری اسلامی ایران\",\r\n \"0-13\": \"روز طبیعت (سیزدهبدر)\",\r\n \"2-14\": \"رحلت امام خمینی\",\r\n \"2-15\": \"قیام ۱۵ خرداد\",\r\n \"10-22\": \"پیروزی انقلاب اسلامی\",\r\n \"11-29\": \"روز ملی شدن صنعت نفت\",\r\n};\r\n\r\n/**\r\n * Checks if a given Jalali date is Friday (جمعه).\r\n */\r\nexport function isJalaliFriday(date: JalaliDate): boolean {\r\n const g = jalaliToGregorian(date.year, date.month, date.day);\r\n return g.getDay() === 5; // In JS Date.getDay(), 5 represents Friday\r\n}\r\n\r\n/**\r\n * Resolves holiday info for a JalaliDate based purely on solar calendar rules and custom overrides.\r\n */\r\nexport function getOfficialHoliday(\r\n date: JalaliDate,\r\n customHolidays?: CustomHolidayRule[],\r\n): OfficialHoliday | null {\r\n // 1. Check Custom User-Defined Holidays\r\n if (customHolidays && customHolidays.length > 0) {\r\n const custom = customHolidays.find(\r\n (h) =>\r\n h.date.year === date.year &&\r\n h.date.month === date.month &&\r\n h.date.day === date.day,\r\n );\r\n if (custom) {\r\n return {\r\n title: custom.title,\r\n type: \"custom\",\r\n isOff: custom.isOff ?? true,\r\n };\r\n }\r\n }\r\n\r\n // 2. Check Fixed Solar Holidays (O(1) Hash Map Lookup)\r\n const solarKey = `${date.month}-${date.day}`;\r\n if (FIXED_SOLAR_HOLIDAYS[solarKey]) {\r\n return {\r\n title: FIXED_SOLAR_HOLIDAYS[solarKey],\r\n type: \"solar\",\r\n isOff: true,\r\n };\r\n }\r\n\r\n // 3. Check Friday (End of Week)\r\n if (isJalaliFriday(date)) {\r\n return { title: \"جمعه (تعطیل پایان هفته)\", type: \"solar\", isOff: true };\r\n }\r\n\r\n return null;\r\n}\r\n","// src/components/JalaliDatePicker.tsx\r\nimport React, {\r\n useState,\r\n useRef,\r\n useCallback,\r\n useMemo,\r\n useEffect,\r\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useJalaliDatePicker } from \"../hooks/useJalaliDatePicker\";\r\nimport { useCalendarKeyboard } from \"../a11y/useCalendarKeyboard\";\r\nimport type {\r\n SelectionMode,\r\n JalaliDateRange,\r\n InternalSelectedValue,\r\n SelectedDateValue,\r\n DateRange,\r\n} from \"../hooks/types\";\r\nimport { Header } from \"./Header\";\r\nimport { Weekdays } from \"./Weekdays\";\r\nimport { DayCell } from \"./DayCell\";\r\nimport { MonthYearPicker } from \"./MonthYearPicker\";\r\nimport type {\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n JalaliCalendarCell,\r\n} from \"../core/types\";\r\nimport { formatJalaliDate } from \"../formatters/jalali-formatter\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport { CalendarFooter } from \"./footer/CalendarFooter\";\r\nimport { TimePicker } from \"../plugins/time-picker/TimePicker\";\r\nimport type { JalaliTime } from \"../plugins/time-picker/types\";\r\nimport {\r\n formatTimeString,\r\n getCurrentTime,\r\n} from \"../plugins/time-picker/time-utils\";\r\nimport { MaskedDateInput } from \"./masked-input/MaskedDateInput\";\r\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\r\nimport {\r\n isJalaliDateBetween,\r\n jsDateToJalali,\r\n jalaliToJsDate,\r\n} from \"../core/jalali-helpers\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { CalendarEvent } from \"../events/types\";\r\nimport { getEventsForDate } from \"../events/event-utils\";\r\nimport { getOfficialHoliday } from \"../holidays\";\r\nimport type { CustomHolidayRule } from \"../holidays/types\";\r\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { isJalaliMonthSelectable } from \"../core/date-availability\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\r\nexport interface JalaliDatePickerProps<M extends SelectionMode = \"single\"> {\r\n mode?: M;\r\n value?: SelectedDateValue<M>;\r\n defaultValue?: SelectedDateValue<M>;\r\n onChange?: (val: SelectedDateValue<M>) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n isDateDisabled?: (date: Date) => boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n variant?: \"inline\" | \"popover\" | \"modal\";\r\n placeholder?: string;\r\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n showFooter?: boolean;\r\n showStatusText?: boolean;\r\n allowClear?: boolean;\r\n enableTime?: boolean;\r\n timeValue?: JalaliTime | null;\r\n defaultTimeValue?: JalaliTime;\r\n onTimeChange?: (time: JalaliTime) => void;\r\n minuteStep?: number;\r\n hourStep?: number;\r\n showSeconds?: boolean;\r\n numberOfMonths?: 1 | 2;\r\n useMaskedInput?: boolean;\r\n events?: CalendarEvent[];\r\n showHolidays?: boolean;\r\n customHolidays?: CustomHolidayRule[];\r\n zIndex?: number;\r\n}\r\n\r\nexport function JalaliDatePicker<M extends SelectionMode = \"single\">({\r\n mode = \"single\" as M,\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n firstDayOfWeek = 0,\r\n variant = \"popover\",\r\n placeholder = \"YYYY/MM/DD\",\r\n digitType = \"persian\",\r\n className,\r\n style,\r\n classNames,\r\n styles,\r\n showFooter = true,\r\n showStatusText = true,\r\n allowClear = true,\r\n enableTime = false,\r\n timeValue,\r\n defaultTimeValue,\r\n onTimeChange,\r\n minuteStep = 1,\r\n hourStep = 1,\r\n showSeconds = false,\r\n numberOfMonths = 1,\r\n useMaskedInput = false,\r\n events,\r\n showHolidays = false,\r\n customHolidays,\r\n zIndex = 9999,\r\n}: JalaliDatePickerProps<M>) {\n const { theme, mode: themeMode } = useTheme();\n const [isOpen, setIsOpen] = useState(variant === \"inline\");\n const [showMonthYearPicker, setShowMonthYearPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n const [popoverPosition, setPopoverPosition] = useState<{\n top: number;\n left: number;\n maxHeight: number;\n } | null>(null);\n const isModal = variant === \"modal\";\n\n const themeVariables = useMemo(\n () =>\n ({\n \"--pdp-primary\": theme.colors.primary,\n \"--pdp-primary-hover\": theme.colors.primaryHover,\n \"--pdp-primary-text\": theme.colors.primaryText,\n \"--pdp-surface-bg\": theme.colors.background,\n \"--pdp-surface-subtle\": theme.colors.surface,\n \"--pdp-surface-border\": theme.colors.border,\n \"--pdp-hover-bg\": theme.colors.backgroundHover,\n \"--pdp-text-primary\": theme.colors.textPrimary,\n \"--pdp-text-secondary\": theme.colors.textSecondary,\n \"--pdp-text-muted\": theme.colors.textSecondary,\n \"--pdp-text-disabled\": theme.colors.textDisabled,\n \"--pdp-disabled-bg\": theme.colors.surface,\n \"--pdp-holiday-color\": theme.colors.holiday,\n \"--pdp-holiday-bg\": theme.colors.holidayBackground,\n \"--pdp-range-between-bg\": theme.colors.rangeBackground,\n \"--pdp-today-border\": theme.colors.todayBorder,\n \"--pdp-border-radius\": theme.radii.lg,\n \"--pdp-shadow\": theme.shadows.lg,\n colorScheme: themeMode,\n }) as React.CSSProperties,\n [theme, themeMode],\n );\n\r\n useEffect(() => {\r\n if (variant === \"inline\") {\r\n setIsOpen(true);\r\n }\r\n }, [variant]);\r\n\r\n const initialTime = useMemo<JalaliTime>(() => {\r\n if (defaultTimeValue) return defaultTimeValue;\r\n if (value instanceof Date) {\r\n return {\r\n hour: value.getHours(),\r\n minute: value.getMinutes(),\r\n second: value.getSeconds(),\r\n };\r\n }\r\n if (defaultValue instanceof Date) {\r\n return {\r\n hour: defaultValue.getHours(),\r\n minute: defaultValue.getMinutes(),\r\n second: defaultValue.getSeconds(),\r\n };\r\n }\r\n return getCurrentTime();\r\n }, [defaultTimeValue, value, defaultValue]);\r\n\r\n const [internalTime, setInternalTime] = useState<JalaliTime>(initialTime);\r\n const activeTime =\r\n timeValue !== undefined ? (timeValue ?? getCurrentTime()) : internalTime;\r\n\r\n useEffect(() => {\r\n if (variant === \"inline\" || !isOpen) return;\r\n\r\n const handleClickOutside = (e: MouseEvent | TouchEvent) => {\r\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node) &&\n !calendarRef.current?.contains(e.target as Node)\n ) {\r\n setIsOpen(false);\r\n setShowMonthYearPicker(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"touchstart\", handleClickOutside, {\r\n passive: true,\r\n });\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"touchstart\", handleClickOutside);\r\n };\r\n }, [variant, isOpen]);\n\n useEffect(() => {\n if (variant !== \"popover\" || !isOpen) {\n setPopoverPosition(null);\n return;\n }\n\n const updatePosition = () => {\n const trigger = containerRef.current;\n const calendar = calendarRef.current;\n if (!trigger || !calendar) return;\n\n const margin = 12;\n const gap = 6;\n const triggerRect = trigger.getBoundingClientRect();\n const calendarRect = calendar.getBoundingClientRect();\n const availableBelow = Math.max(\n 0,\n window.innerHeight - triggerRect.bottom - gap - margin,\n );\n const availableAbove = Math.max(0, triggerRect.top - gap - margin);\n const openAbove =\n calendarRect.height > availableBelow && availableAbove > availableBelow;\n const maxHeight = Math.max(\n 120,\n openAbove ? availableAbove : availableBelow,\n );\n const visibleHeight = Math.min(calendarRect.height, maxHeight);\n const top = openAbove\n ? Math.max(margin, triggerRect.top - gap - visibleHeight)\n : triggerRect.bottom + gap;\n const maxLeft = Math.max(\n margin,\n window.innerWidth - calendarRect.width - margin,\n );\n const left = Math.min(Math.max(margin, triggerRect.left), maxLeft);\n\n setPopoverPosition((current) => {\n if (\n current?.top === top &&\n current.left === left &&\n current.maxHeight === maxHeight\n ) {\n return current;\n }\n return { top, left, maxHeight };\n });\n };\n\n updatePosition();\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(updatePosition);\n if (calendarRef.current) resizeObserver?.observe(calendarRef.current);\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [variant, isOpen]);\n\r\n const internalJalaliValue = useMemo<\r\n InternalSelectedValue<M> | undefined\r\n >(() => {\r\n if (value === undefined) return undefined;\r\n if (!value) return null as InternalSelectedValue<M>;\r\n if (value instanceof Date) {\r\n return jsDateToJalali(value) as InternalSelectedValue<M>;\r\n }\r\n if (Array.isArray(value)) {\r\n if (mode === \"range\") {\r\n const [start, end] = value as DateRange;\r\n return [\r\n start ? jsDateToJalali(start) : null,\r\n end ? jsDateToJalali(end) : null,\r\n ] as InternalSelectedValue<M>;\r\n }\r\n if (mode === \"multiple\") {\r\n return (value as Date[]).map((d) =>\r\n jsDateToJalali(d),\r\n ) as InternalSelectedValue<M>;\r\n }\r\n }\r\n return null as InternalSelectedValue<M>;\r\n }, [value, mode]);\r\n\r\n const internalDefaultJalaliValue = useMemo<\r\n InternalSelectedValue<M> | undefined\r\n >(() => {\r\n if (defaultValue === undefined) return undefined;\r\n if (!defaultValue) return null as InternalSelectedValue<M>;\r\n if (defaultValue instanceof Date) {\r\n return jsDateToJalali(defaultValue) as InternalSelectedValue<M>;\r\n }\r\n if (Array.isArray(defaultValue)) {\r\n if (mode === \"range\") {\r\n const [start, end] = defaultValue as DateRange;\r\n return [\r\n start ? jsDateToJalali(start) : null,\r\n end ? jsDateToJalali(end) : null,\r\n ] as InternalSelectedValue<M>;\r\n }\r\n if (mode === \"multiple\") {\r\n return (defaultValue as Date[]).map((d) =>\r\n jsDateToJalali(d),\r\n ) as InternalSelectedValue<M>;\r\n }\r\n }\r\n return null as InternalSelectedValue<M>;\r\n }, [defaultValue, mode]);\r\n\r\n const internalMinDate = useMemo(\r\n () => (minDate ? jsDateToJalali(minDate) : undefined),\r\n [minDate],\r\n );\r\n const internalMaxDate = useMemo(\n () => (maxDate ? jsDateToJalali(maxDate) : undefined),\r\n [maxDate],\r\n );\n\n const internalIsDateDisabled = useCallback(\n (jDate: JalaliDate) =>\n isDateDisabled ? isDateDisabled(jalaliToJsDate(jDate)) : false,\n [isDateDisabled],\n );\n\r\n const convertJalaliToDateOutput = useCallback(\r\n (\r\n jVal: InternalSelectedValue<M>,\r\n specificTime?: JalaliTime,\r\n ): SelectedDateValue<M> => {\r\n if (!jVal) return null as SelectedDateValue<M>;\r\n\r\n const t = specificTime ?? activeTime;\r\n const h = enableTime ? t.hour : 0;\r\n const m = enableTime ? t.minute : 0;\r\n const s = enableTime && showSeconds ? (t.second ?? 0) : 0;\r\n\r\n if (mode === \"single\" && !Array.isArray(jVal)) {\r\n return jalaliToJsDate(\r\n jVal as JalaliDate,\r\n h,\r\n m,\r\n s,\r\n ) as SelectedDateValue<M>;\r\n }\r\n\r\n if (mode === \"range\" && Array.isArray(jVal)) {\r\n const [start, end] = jVal as JalaliDateRange;\r\n return [\r\n start ? jalaliToJsDate(start, 0, 0, 0) : null,\r\n end ? jalaliToJsDate(end, 23, 59, 59) : null,\r\n ] as SelectedDateValue<M>;\r\n }\r\n\r\n if (mode === \"multiple\" && Array.isArray(jVal)) {\r\n return (jVal as JalaliDate[]).map((d) =>\r\n jalaliToJsDate(d, h, m, s),\r\n ) as SelectedDateValue<M>;\r\n }\r\n\r\n return null as SelectedDateValue<M>;\r\n },\r\n [mode, enableTime, activeTime, showSeconds],\r\n );\r\n\r\n const {\r\n selected,\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n goToPrevMonth,\r\n goToNextMonth,\r\n setView,\r\n goToToday,\r\n selectDate,\r\n setHoverDate,\r\n hoverDate,\r\n clear,\r\n } = useJalaliDatePicker({\r\n mode,\r\n value: internalJalaliValue,\r\n defaultValue: internalDefaultJalaliValue,\r\n minDate: internalMinDate,\r\n maxDate: internalMaxDate,\r\n firstDayOfWeek,\r\n isDateDisabled: isDateDisabled ? internalIsDateDisabled : undefined,\n onChange: (val) => {\r\n onChange?.(convertJalaliToDateOutput(val));\r\n },\r\n });\r\n\r\n const handleTimeChange = useCallback(\r\n (newTime: JalaliTime) => {\r\n if (timeValue === undefined) setInternalTime(newTime);\r\n onTimeChange?.(newTime);\r\n\r\n if (selected && onChange) {\r\n onChange(convertJalaliToDateOutput(selected, newTime));\r\n }\r\n },\r\n [timeValue, onTimeChange, selected, onChange, convertJalaliToDateOutput],\r\n );\r\n\r\n const singleSelectedDate =\r\n mode === \"single\" ? (selected as JalaliDate | null) : null;\r\n\r\n const handleDateSelect = (d: JalaliDate) => {\r\n selectDate(d);\r\n if (variant === \"popover\" && mode === \"single\" && !enableTime) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handleClearClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n clear();\r\n };\r\n\r\n const { handleKeyDown, getCellTabIndex, setFocusedDate } =\r\n useCalendarKeyboard({\r\n viewYear,\r\n viewMonth,\r\n selectedDate: singleSelectedDate,\r\n onSelectDate: handleDateSelect,\r\n onViewChange: setView,\r\n isRtl: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (!isModal || !isOpen) return;\r\n const originalOverflow = document.body.style.overflow;\r\n document.body.style.overflow = \"hidden\";\r\n\r\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") setIsOpen(false);\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleGlobalKeyDown);\r\n return () => {\r\n document.body.style.overflow = originalOverflow;\r\n window.removeEventListener(\"keydown\", handleGlobalKeyDown);\r\n };\r\n }, [isModal, isOpen]);\r\n\r\n const nextMonthState = useMemo<{\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (viewMonth === 11) return { year: viewYear + 1, month: 0 };\r\n return { year: viewYear, month: (viewMonth + 1) as JalaliMonthIndex };\r\n }, [viewYear, viewMonth]);\n\n const prevMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewMonth === 0) return { year: viewYear - 1, month: 11 };\n return { year: viewYear, month: (viewMonth - 1) as JalaliMonthIndex };\n }, [viewYear, viewMonth]);\n\n const isPrevMonthDisabled = !isJalaliMonthSelectable(\n prevMonthState.year,\n prevMonthState.month,\n { minDate: internalMinDate, maxDate: internalMaxDate },\n );\n const nextNavigationState =\n numberOfMonths === 2\n ? nextMonthState.month === 11\n ? { year: nextMonthState.year + 1, month: 0 as JalaliMonthIndex }\n : {\n year: nextMonthState.year,\n month: (nextMonthState.month + 1) as JalaliMonthIndex,\n }\n : nextMonthState;\n const isNextMonthDisabled = !isJalaliMonthSelectable(\n nextNavigationState.year,\n nextNavigationState.month,\n { minDate: internalMinDate, maxDate: internalMaxDate },\n );\n\r\n const secondGrid = useMemo<JalaliCalendarCell[]>(() => {\r\n if (numberOfMonths !== 2) return [];\r\n\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year: nextMonthState.year,\r\n month: nextMonthState.month,\r\n firstDayOfWeek,\r\n minDate: internalMinDate,\r\n maxDate: internalMaxDate,\r\n });\r\n\r\n if (mode !== \"range\") return rawGrid;\r\n\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n }, [\r\n numberOfMonths,\r\n nextMonthState,\r\n firstDayOfWeek,\r\n internalMinDate,\r\n internalMaxDate,\r\n mode,\r\n selected,\r\n hoverDate,\r\n ]);\r\n\r\n const formattedInputValue = useMemo(() => {\r\n if (!selected) return \"\";\r\n if (mode === \"single\") {\r\n const datePart = formatJalaliDate(selected as JalaliDate, \"YYYY/MM/DD\", {\r\n digitType,\r\n });\r\n if (enableTime && activeTime) {\r\n const timePart = formatTimeString(activeTime, showSeconds, digitType);\r\n return `${datePart} ${timePart}`;\r\n }\r\n return datePart;\r\n }\r\n if (mode === \"range\") {\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n if (start && end) {\r\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ${formatJalaliDate(end, \"YYYY/MM/DD\", { digitType })}`;\r\n }\r\n if (start)\r\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ...`;\r\n }\r\n if (mode === \"multiple\" && Array.isArray(selected)) {\r\n return `${toPersianDigits((selected as JalaliDate[]).length)} تاریخ انتخاب شده`;\r\n }\r\n return \"\";\r\n }, [selected, mode, digitType, enableTime, activeTime, showSeconds]);\r\n\r\n const hasValue = Boolean(\r\n mode === \"single\"\r\n ? selected\r\n : mode === \"range\"\r\n ? (selected as JalaliDateRange)?.[0]\r\n : (selected as JalaliDate[])?.length,\r\n );\r\n\r\n const renderCalendarPane = (\r\n y: number,\r\n m: JalaliMonthIndex,\r\n paneGrid: JalaliCalendarCell[],\r\n showPrevArrow = true,\r\n showNextArrow = true,\r\n ) => (\n <div\n className={classNames?.calendarPane}\n style={{\n width: \"calc(7 * var(--pdp-cell-size, 34px) + 6 * 4px)\",\n maxWidth: \"100%\",\n minWidth: 0,\n flex: \"1 1 calc(7 * var(--pdp-cell-size, 34px) + 6 * 4px)\",\n ...styles?.calendarPane,\n }}\r\n >\r\n <Header\r\n year={y}\r\n monthName={PERSIAN_MONTH_NAMES[m]}\r\n onPrevMonth={showPrevArrow ? goToPrevMonth : () => {}}\r\n onNextMonth={showNextArrow ? goToNextMonth : () => {}}\r\n onTitleClick={() => setShowMonthYearPicker((prev) => !prev)}\r\n isPickerOpen={showMonthYearPicker}\n isPrevDisabled={showPrevArrow ? isPrevMonthDisabled : true}\n isNextDisabled={showNextArrow ? isNextMonthDisabled : true}\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n <Weekdays\r\n firstDayOfWeek={firstDayOfWeek}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n <div\r\n role=\"grid\"\r\n aria-label={`${PERSIAN_MONTH_NAMES[m]} ${toPersianDigits(y)}`}\r\n className={classNames?.grid}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"4px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n ...styles?.grid,\r\n }}\r\n >\r\n {paneGrid.map((cell, index) => {\r\n const holidayInfo = showHolidays\r\n ? getOfficialHoliday(cell.jalali, customHolidays)\r\n : null;\r\n const dayEvents = getEventsForDate(cell.jalali, events);\r\n\r\n return (\r\n <DayCell\r\n key={index}\r\n cell={cell}\r\n digitType={digitType}\r\n isHoliday={Boolean(holidayInfo)}\r\n holidayTitle={holidayInfo?.title}\r\n events={dayEvents}\r\n classNames={classNames}\r\n styles={styles}\r\n tabIndex={getCellTabIndex(cell.jalali)}\r\n onSelect={handleDateSelect}\r\n onHover={setHoverDate}\r\n onFocus={setFocusedDate}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n\r\n const calendarContent = (\n <div\n ref={calendarRef}\n role={isModal ? \"dialog\" : \"region\"}\r\n aria-modal={isModal ? true : undefined}\r\n aria-label=\"تقویم شمسی\"\r\n onKeyDown={handleKeyDown}\r\n onClick={(e) => e.stopPropagation()}\r\n className={classNames?.calendar}\n style={{\n ...themeVariables,\n position: variant === \"popover\" ? \"fixed\" : isModal ? \"relative\" : \"static\",\n top: variant === \"popover\" ? (popoverPosition?.top ?? 0) : undefined,\n left: variant === \"popover\" ? (popoverPosition?.left ?? 0) : undefined,\n visibility:\n variant === \"popover\" && !popoverPosition ? \"hidden\" : \"visible\",\n zIndex: isModal ? zIndex + 1 : zIndex,\r\n padding: \"12px\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n borderRadius: \"var(--pdp-border-radius, 12px)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n boxShadow: isModal\n ? \"0 20px 25px -5px rgb(0 0 0 / 0.3)\"\r\n : \"0 10px 25px -5px rgba(0, 0, 0, 0.15), 0 8px 10px -6px rgba(0, 0, 0, 0.1)\",\r\n width: \"max-content\",\n maxWidth:\n variant === \"inline\" ? \"100%\" : \"calc(100vw - 24px)\",\n maxHeight: isModal\n ? \"calc(100dvh - 32px)\"\n : variant === \"popover\"\n ? popoverPosition?.maxHeight\n : undefined,\n overflowY: isModal || variant === \"popover\" ? \"auto\" : undefined,\n overflowX: \"hidden\",\n userSelect: \"none\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\r\n direction: \"rtl\",\r\n boxSizing: \"border-box\",\r\n ...styles?.calendar,\r\n }}\r\n >\r\n {showMonthYearPicker ? (\r\n <MonthYearPicker\r\n currentYear={viewYear}\r\n currentMonth={viewMonth}\r\n onSelectMonth={(m) => {\r\n setView(viewYear, m);\r\n setShowMonthYearPicker(false);\r\n }}\r\n onSelectYear={(y) => setView(y, viewMonth)}\n minDate={internalMinDate}\n maxDate={internalMaxDate}\n isDateDisabled={\n isDateDisabled ? internalIsDateDisabled : undefined\n }\n classNames={classNames}\r\n styles={styles}\r\n />\r\n ) : (\r\n <>\r\n <div\n className={classNames?.calendarPanes}\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n gap: \"20px\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n width: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n ...styles?.calendarPanes,\n }}\r\n >\r\n {renderCalendarPane(\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n true,\r\n numberOfMonths === 1,\r\n )}\r\n\r\n {numberOfMonths === 2 && (\n <>\n {renderCalendarPane(\n nextMonthState.year,\r\n nextMonthState.month,\r\n secondGrid,\r\n false,\r\n true,\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {enableTime && (\r\n <TimePicker\r\n value={activeTime}\r\n onChange={handleTimeChange}\r\n minuteStep={minuteStep}\r\n hourStep={hourStep}\r\n showSeconds={showSeconds}\r\n digitType={digitType}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n )}\r\n\r\n {showFooter && (\r\n <CalendarFooter\r\n mode={mode}\r\n digitType={digitType}\r\n showStatusText={showStatusText}\r\n selectedDate={\r\n mode === \"single\" ? (selected as JalaliDate | null) : null\r\n }\r\n selectedRange={\r\n mode === \"range\" ? (selected as JalaliDateRange) : undefined\r\n }\r\n selectedDates={\r\n mode === \"multiple\" ? (selected as JalaliDate[]) : undefined\r\n }\r\n selectedTime={enableTime ? activeTime : undefined}\r\n onToday={goToToday}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={className ?? classNames?.root}\r\n style={{\n ...themeVariables,\n position: \"relative\",\n display: \"inline-block\",\n maxWidth: \"100%\",\n verticalAlign: \"top\",\n zIndex: isOpen && variant === \"popover\" ? zIndex : 1,\r\n ...style,\r\n ...styles?.root,\r\n }}\r\n >\r\n {variant !== \"inline\" &&\r\n (useMaskedInput && mode === \"single\" && variant === \"popover\" ? (\r\n <MaskedDateInput\r\n value={singleSelectedDate}\r\n digitType={digitType}\r\n placeholder={placeholder}\r\n onChange={(d) => {\r\n if (d) {\r\n selectDate(d);\r\n setView(d.year, d.month);\r\n } else {\r\n clear();\r\n }\r\n }}\r\n onClick={() => setIsOpen(true)}\r\n className={classNames?.input}\r\n style={{\r\n direction: \"ltr\",\r\n textAlign: \"left\",\r\n ...styles?.input,\r\n }}\r\n />\r\n ) : (\r\n <div\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setIsOpen((prev) => !prev);\r\n }}\r\n style={{\r\n position: \"relative\",\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n direction: \"ltr\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\r\n >\r\n <input\r\n type=\"text\"\r\n readOnly\r\n placeholder={placeholder}\r\n value={formattedInputValue}\r\n className={classNames?.input}\r\n style={{\r\n direction: \"ltr\",\r\n textAlign: \"left\",\r\n padding: \"8px 30px 8px 12px\",\r\n borderRadius: \"var(--pdp-border-radius, 8px)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n cursor: \"pointer\",\r\n fontSize: \"13.5px\",\n minWidth: enableTime ? \"190px\" : \"150px\",\n width: \"100%\",\n maxWidth: \"100%\",\n boxSizing: \"border-box\",\r\n ...styles?.input,\r\n }}\r\n />\r\n\r\n {allowClear && hasValue && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClearClick}\r\n aria-label=\"Clear value\"\r\n style={{\r\n position: \"absolute\",\r\n right: \"8px\",\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n padding: \"2px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"14px\",\r\n fontWeight: 700,\r\n lineHeight: 1,\r\n borderRadius: \"50%\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.color =\r\n \"var(--pdp-holiday-color, #e11d48)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.color =\r\n \"var(--pdp-text-muted, #94a3b8)\";\r\n }}\r\n >\r\n ✕\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n\r\n {isOpen &&\n (variant === \"inline\"\n ? calendarContent\n : typeof document !== \"undefined\"\n ? createPortal(\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: zIndex,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n overflowY: \"auto\",\n direction: \"rtl\",\n ...styles?.modalBackdrop,\n }}\n >\n {calendarContent}\n </div>\n ) : (\n calendarContent\n ),\n document.body,\n )\n : null)}\n </div>\r\n );\r\n}\r\n","import React, { useState, useMemo, useCallback } from \"react\";\r\nimport type { DualMonthCalendarProps } from \"./types\";\r\nimport type {\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n JalaliCalendarCell,\r\n} from \"../../core/types\";\r\nimport type { JalaliDateRange } from \"../../hooks/types\";\r\nimport { getTodayJalali, isSameJalaliDay } from \"../../core/jalali-math\";\r\nimport {\n generateJalaliCalendarGrid,\n toJalaliDate,\n} from \"../../core/calendar-grid\";\nimport {\r\n compareJalaliDates,\r\n isJalaliDateBetween,\r\n} from \"../../core/jalali-helpers\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../../core/constants\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport { Weekdays } from \"../Weekdays\";\r\nimport { DayCell } from \"../DayCell\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\nimport { mergeClassNames } from \"../../theme/style-utils\";\nimport { isJalaliMonthSelectable } from \"../../core/date-availability\";\n\r\nexport const DualMonthCalendar: React.FC<DualMonthCalendarProps> = ({\r\n value,\r\n defaultValue = [null, null],\r\n onChange,\r\n initialViewDate,\r\n firstDayOfWeek = 0,\r\n digitType = \"persian\",\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n direction = \"rtl\",\r\n className,\r\n style,\r\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n // 1. Selection State (Controlled vs Uncontrolled)\r\n const [internalRange, setInternalRange] =\r\n useState<JalaliDateRange>(defaultValue);\r\n const activeRange = value !== undefined ? value : internalRange;\r\n\r\n // 2. Hover state for range preview\r\n const [hoveredDate, setHoveredDate] = useState<JalaliDate | null>(null);\r\n const formatNumber = (value: number) =>\r\n digitType === \"persian\" ? toPersianDigits(value) : String(value);\r\n\r\n // 3. View state for First Month (Left)\r\n const today = useMemo(() => getTodayJalali(), []);\r\n const [viewState, setViewState] = useState<{\r\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (initialViewDate) return initialViewDate;\r\n if (activeRange[0])\r\n return { year: activeRange[0].year, month: activeRange[0].month };\r\n return { year: today.year, month: today.month };\r\n });\r\n\r\n // Calculate Second Month (Right)\r\n const nextMonthState = useMemo<{\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (viewState.month === 11) {\r\n return { year: viewState.year + 1, month: 0 };\r\n }\r\n return {\r\n year: viewState.year,\r\n month: (viewState.month + 1) as JalaliMonthIndex,\r\n };\r\n }, [viewState]);\n\n const prevMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewState.month === 0) {\n return { year: viewState.year - 1, month: 11 };\n }\n return {\n year: viewState.year,\n month: (viewState.month - 1) as JalaliMonthIndex,\n };\n }, [viewState]);\n\n const minJalali = useMemo(\n () => (minDate ? toJalaliDate(minDate) : undefined),\n [minDate],\n );\n const maxJalali = useMemo(\n () => (maxDate ? toJalaliDate(maxDate) : undefined),\n [maxDate],\n );\n const isPrevDisabled = !isJalaliMonthSelectable(\n prevMonthState.year,\n prevMonthState.month,\n { minDate: minJalali, maxDate: maxJalali },\n );\n const monthAfterSecond =\n nextMonthState.month === 11\n ? { year: nextMonthState.year + 1, month: 0 as JalaliMonthIndex }\n : {\n year: nextMonthState.year,\n month: (nextMonthState.month + 1) as JalaliMonthIndex,\n };\n const isNextDisabled = !isJalaliMonthSelectable(\n monthAfterSecond.year,\n monthAfterSecond.month,\n { minDate: minJalali, maxDate: maxJalali },\n );\n\r\n // 4. Synchronized Navigation (moves both months together)\r\n const handlePrevMonth = () => {\n if (isPrevDisabled) return;\n setViewState((prev) => {\r\n if (prev.month === 0) return { year: prev.year - 1, month: 11 };\r\n return { year: prev.year, month: (prev.month - 1) as JalaliMonthIndex };\r\n });\r\n };\r\n\r\n const handleNextMonth = () => {\n if (isNextDisabled) return;\n setViewState((prev) => {\r\n if (prev.month === 11) return { year: prev.year + 1, month: 0 };\r\n return { year: prev.year, month: (prev.month + 1) as JalaliMonthIndex };\r\n });\r\n };\r\n\r\n // 5. Date Selection Handler\r\n const handleDateSelect = useCallback(\r\n (target: JalaliDate) => {\r\n const [start, end] = activeRange;\r\n let newRange: JalaliDateRange;\r\n\r\n if (!start || (start && end)) {\r\n newRange = [target, null];\r\n } else {\r\n if (compareJalaliDates(target, start) < 0) {\r\n newRange = [target, start];\r\n } else {\r\n newRange = [start, target];\r\n }\r\n setHoveredDate(null);\r\n }\r\n\r\n if (value === undefined) {\r\n setInternalRange(newRange);\r\n }\r\n onChange?.(newRange);\r\n },\r\n [activeRange, value, onChange],\r\n );\r\n\r\n // 6. Enrich cells with cross-month range metadata\r\n const enrichGridCells = useCallback(\r\n (year: number, month: JalaliMonthIndex): JalaliCalendarCell[] => {\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year,\r\n month,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n });\r\n\r\n const [start, end] = activeRange;\r\n const effectiveEnd = end ?? (start && hoveredDate ? hoveredDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n },\r\n [\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n activeRange,\r\n hoveredDate,\r\n ],\r\n );\r\n\r\n const leftGrid = useMemo(\r\n () => enrichGridCells(viewState.year, viewState.month),\r\n [enrichGridCells, viewState.year, viewState.month],\r\n );\r\n\r\n const rightGrid = useMemo(\r\n () => enrichGridCells(nextMonthState.year, nextMonthState.month),\r\n [enrichGridCells, nextMonthState.year, nextMonthState.month],\r\n );\r\n\r\n const renderMonthPane = (\r\n year: number,\r\n month: JalaliMonthIndex,\r\n grid: JalaliCalendarCell[],\r\n isLeftPane: boolean,\r\n ) => (\r\n <div\r\n dir={direction}\r\n className={classNames?.calendarPane}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\n width: \"var(--pdp-calendar-pane-width, 276px)\",\n maxWidth: \"100%\",\n minWidth: 0,\n flex: \"1 1 var(--pdp-calendar-pane-width, 276px)\",\n ...styles?.calendarPane,\r\n }}\r\n >\r\n {/* Pane Header */}\r\n <div\r\n className={classNames?.header}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 4px\",\r\n height: \"32px\",\r\n ...styles?.header,\r\n }}\r\n >\r\n {isLeftPane ? (\r\n <button\r\n type=\"button\"\n aria-label=\"ماه قبل\"\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n aria-disabled={isPrevDisabled}\n className={mergeClassNames(\n classNames?.navButton,\n isPrevDisabled && classNames?.disabledNavButton,\n )}\n style={{\r\n width: \"28px\",\r\n height: \"28px\",\r\n borderRadius: \"6px\",\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n cursor: isPrevDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isPrevDisabled ? 0.38 : 1,\n ...styles?.navButton,\n ...(isPrevDisabled ? styles?.disabledNavButton : undefined),\n }}\r\n >\r\n {direction === \"rtl\" ? \"›\" : \"‹\"}\r\n </button>\r\n ) : (\r\n <div style={{ width: \"28px\" }} />\r\n )}\r\n\r\n <div\r\n style={{\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n color: theme.colors.textPrimary,\r\n }}\r\n >\r\n {PERSIAN_MONTH_NAMES[month]} {formatNumber(year)}\r\n </div>\r\n\r\n {!isLeftPane ? (\r\n <button\r\n type=\"button\"\n aria-label=\"ماه بعد\"\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n aria-disabled={isNextDisabled}\n className={mergeClassNames(\n classNames?.navButton,\n isNextDisabled && classNames?.disabledNavButton,\n )}\n style={{\r\n width: \"28px\",\r\n height: \"28px\",\r\n borderRadius: \"6px\",\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n cursor: isNextDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isNextDisabled ? 0.38 : 1,\n ...styles?.navButton,\n ...(isNextDisabled ? styles?.disabledNavButton : undefined),\n }}\r\n >\r\n {direction === \"rtl\" ? \"‹\" : \"›\"}\r\n </button>\r\n ) : (\r\n <div style={{ width: \"28px\" }} />\r\n )}\r\n </div>\r\n\r\n <Weekdays\r\n firstDayOfWeek={firstDayOfWeek}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n {/* Grid */}\r\n <div\r\n role=\"grid\"\r\n aria-label={`${PERSIAN_MONTH_NAMES[month]} ${formatNumber(year)}`}\r\n dir={direction}\r\n className={classNames?.grid}\r\n style={{\r\n display: \"grid\",\r\n width: \"100%\",\n minWidth: 0,\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"var(--pdp-cell-gap, 4px)\",\r\n ...styles?.grid,\r\n }}\r\n >\r\n {grid.map((cell) => (\r\n <DayCell\r\n key={`${cell.jalali.year}-${cell.jalali.month}-${cell.jalali.day}`}\r\n cell={cell}\r\n digitType={digitType}\r\n classNames={classNames}\r\n styles={styles}\r\n tabIndex={0}\r\n onSelect={handleDateSelect}\r\n onHover={setHoveredDate}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n role=\"region\"\r\n aria-label=\"تقویم دوقلو شمسی\"\r\n dir={direction}\r\n className={mergeClassNames(className, classNames?.calendar)}\r\n style={\r\n {\r\n \"--pdp-cell-size\": \"36px\",\r\n \"--pdp-cell-gap\": \"4px\",\r\n \"--pdp-calendar-pane-width\": \"276px\",\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n gap: \"24px\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n borderRadius: theme.radii.lg,\r\n border: `1px solid ${theme.colors.border}`,\r\n boxShadow: theme.shadows.lg,\r\n width:\n \"calc(var(--pdp-calendar-pane-width, 276px) + var(--pdp-calendar-pane-width, 276px) + 56px)\",\n maxWidth: \"100%\",\n ...style,\r\n ...styles?.calendar,\r\n } as React.CSSProperties\r\n }\r\n >\r\n {renderMonthPane(viewState.year, viewState.month, leftGrid, true)}\n {renderMonthPane(\n nextMonthState.year,\r\n nextMonthState.month,\r\n rightGrid,\r\n false,\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
|