@mngh/jalali-datepicker 1.1.5 → 1.1.6

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.cjs","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","import React from \"react\";\nimport { PERSIAN_WEEK_DAYS_SHORT } from \"../core/constants\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\nexport interface WeekdaysProps {\n firstDayOfWeek?: number;\n direction?: \"rtl\" | \"ltr\";\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const Weekdays: React.FC<WeekdaysProps> = ({\n firstDayOfWeek = 0,\n direction = \"rtl\",\n classNames,\n styles,\n}) => {\n const { theme } = useTheme();\n const normalizedFirstDay =\n ((Math.trunc(firstDayOfWeek) % 7) + 7) % 7;\n const weekdays = Array.from({ length: 7 }, (_, index) => {\n const dayIndex = (normalizedFirstDay + index) % 7;\n return {\n dayIndex,\n label: PERSIAN_WEEK_DAYS_SHORT[dayIndex],\n };\n });\n\n return (\n <div\n role=\"row\"\n dir={direction}\n className={classNames?.weekdays}\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 padding: \"6px 0 4px\",\n textAlign: \"center\",\n userSelect: \"none\",\n ...styles?.weekdays,\n }}\n >\n {weekdays.map(({ dayIndex, label }) => (\n <span\n key={dayIndex}\n role=\"columnheader\"\n className={classNames?.weekdayCell}\n style={{\n display: \"inline-flex\",\n width: \"var(--pdp-cell-size, 36px)\",\n height: \"28px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"0.78rem\",\n fontWeight: 700,\n color:\n dayIndex === 6\n ? theme.colors.holiday\n : theme.colors.textSecondary,\n ...styles?.weekdayCell,\n }}\n >\n {label}\n </span>\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 }}\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 ...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 }}\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 {/* Modern Popover / 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 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 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 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 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 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 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 style={{ width: \"262px\", flexShrink: 0 }}>\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 {/* Calendar Panes Container: No wrap under any condition */}\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 {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 direction={direction}\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 \"--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 {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.cjs","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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"}