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