@mngh/jalali-datepicker 1.1.6 → 1.1.8

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