@mngh/jalali-datepicker 1.1.7 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/constants.ts","../src/core/jalali-math.ts","../src/core/calendar-grid.ts","../src/core/jalali-helpers.ts","../src/hooks/useJalaliDatePicker.ts","../src/a11y/keyboard-navigation.ts","../src/a11y/aria-helpers.ts","../src/a11y/useCalendarKeyboard.ts","../src/formatters/persian-digits.ts","../src/formatters/jalali-formatter.ts","../src/theme/tokens.ts","../src/theme/ThemeProvider.tsx","../src/components/Header.tsx","../src/components/Weekdays.tsx","../src/components/DayCell.tsx","../src/components/MonthYearPicker.tsx","../src/plugins/time-picker/time-utils.ts","../src/components/footer/CalendarFooter.tsx","../src/plugins/time-picker/TimePicker.tsx","../src/components/masked-input/mask-utils.ts","../src/components/masked-input/MaskedDateInput.tsx","../src/events/event-utils.ts","../src/holidays/iran-holidays.ts","../src/components/JalaliDatePicker.tsx","../src/theme/style-utils.ts","../src/components/dual-calendar/DualMonthCalendar.tsx"],"sourcesContent":["/**\n * Persian (Farsi) month names.\n */\nexport const PERSIAN_MONTH_NAMES = [\n \"فروردین\",\n \"اردیبهشت\",\n \"خرداد\",\n \"تیر\",\n \"مرداد\",\n \"شهریور\",\n \"مهر\",\n \"آبان\",\n \"آذر\",\n \"دی\",\n \"بهمن\",\n \"اسفند\",\n] as const;\n\n/**\n * Phonetic English month names for Jalali calendar.\n */\nexport const JALALI_MONTH_NAMES_EN = [\n \"Farvardin\",\n \"Ordibehesht\",\n \"Khordad\",\n \"Tir\",\n \"Mordad\",\n \"Shahrivar\",\n \"Mehr\",\n \"Aban\",\n \"Azar\",\n \"Dey\",\n \"Bahman\",\n \"Esfand\",\n] as const;\n\n/**\n * Persian weekday headers starting from Saturday (شنبه).\n */\nexport const PERSIAN_WEEK_DAYS_SHORT = [\n \"ش\",\n \"ی\",\n \"د\",\n \"س\",\n \"چ\",\n \"پ\",\n \"ج\",\n] as const;\nexport const PERSIAN_WEEK_DAYS_LONG = [\n \"شنبه\",\n \"یکشنبه\",\n \"دوشنبه\",\n \"سه‌شنبه\",\n \"چهارشنبه\",\n \"پنج‌شنبه\",\n \"جمعه\",\n] as const;\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\n\n/**\n * Determines if a Jalali year is a leap year (کبیسه).\n * Uses the Birashk 2820-year cycle algorithm.\n */\nexport function isJalaliLeapYear(year: number): boolean {\n const breaks = [\n -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097,\n 2192, 2262, 2324, 2394, 2456, 3178,\n ];\n\n let jp = breaks[0];\n let jump = 0;\n\n if (year < jp || year >= breaks[breaks.length - 1]) {\n throw new Error(`Jalali year ${year} is outside supported range.`);\n }\n\n for (let i = 1; i < breaks.length; i++) {\n const jm = breaks[i];\n jump = jm - jp;\n if (year < jm) break;\n jp = jm;\n }\n\n let n = year - jp;\n if (jump - n < 6) n = n - jump + ((jump + 4) / 33) * 33;\n let leap = ((n + 1) % 33) - 1;\n if (leap === -1) leap = 4;\n\n return leap % 4 === 0;\n}\n\n/**\n * Returns the number of days in a specific Jalali month.\n */\nexport function getDaysInJalaliMonth(\n year: number,\n month: JalaliMonthIndex,\n): number {\n if (month < 0 || month > 11) {\n throw new RangeError(\n \"Month index must be between 0 (Farvardin) and 11 (Esfand).\",\n );\n }\n // Months 0 to 5 (Farvardin - Shahrivar) have 31 days\n if (month <= 5) return 31;\n // Months 6 to 10 (Mehr - Bahman) have 30 days\n if (month <= 10) return 30;\n // Month 11 (Esfand) has 30 in leap years, 29 in regular years\n return isJalaliLeapYear(year) ? 30 : 29;\n}\n\n/**\n * Converts a Gregorian date (Year, Month, Day) to Jalali date.\n */\nexport function gregorianToJalali(\n gy: number,\n gm: number,\n gd: number,\n): JalaliDate {\n const g_d_m = [\n 0,\n 31,\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n let jy: number;\n let jm: number;\n let jd: number;\n\n let gy2 = gm > 2 ? gy + 1 : gy;\n let days =\n 355666 +\n 365 * gy +\n Math.floor((gy2 + 3) / 4) -\n Math.floor((gy2 + 99) / 100) +\n Math.floor((gy2 + 399) / 400) +\n gd;\n\n for (let i = 0; i < gm; ++i) days += g_d_m[i];\n\n jy = -1595 + 33 * Math.floor(days / 12053);\n days %= 12053;\n\n jy += 4 * Math.floor(days / 1461);\n days %= 1461;\n\n if (days > 365) {\n jy += Math.floor((days - 1) / 365);\n days = (days - 1) % 365;\n }\n\n if (days < 186) {\n jm = Math.floor(days / 31);\n jd = 1 + (days % 31);\n } else {\n jm = 6 + Math.floor((days - 186) / 30);\n jd = 1 + ((days - 186) % 30);\n }\n\n return { year: jy, month: jm as JalaliMonthIndex, day: jd };\n}\n\n/**\n * Converts a Jalali date to a Gregorian Date.\n */\nexport function jalaliToGregorian(\n jy: number,\n jm: JalaliMonthIndex,\n jd: number,\n): Date {\n let gy: number;\n let gm: number;\n let gd: number;\n\n let jy2 = jy + 1595;\n let days =\n -355668 +\n 365 * jy2 +\n Math.floor(jy2 / 33) * 8 +\n Math.floor(((jy2 % 33) + 3) / 4) +\n jd +\n (jm < 6 ? jm * 31 : (jm - 6) * 30 + 186);\n\n gy = 400 * Math.floor(days / 146097);\n days %= 146097;\n\n if (days > 36524) {\n gy += 100 * Math.floor(--days / 36524);\n days %= 36524;\n if (days >= 365) days++;\n }\n\n gy += 4 * Math.floor(days / 1461);\n days %= 1461;\n\n if (days > 365) {\n gy += Math.floor((days - 1) / 365);\n days = (days - 1) % 365;\n }\n\n gd = days + 1;\n const sal_a = [\n 0,\n 31,\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n\n for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) {\n gd -= sal_a[gm];\n }\n\n const result = new Date(gy, gm - 1, gd);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\n/**\n * Returns today's date in Jalali format.\n */\nexport function getTodayJalali(): JalaliDate {\n const now = new Date();\n return gregorianToJalali(\n now.getFullYear(),\n now.getMonth() + 1,\n now.getDate(),\n );\n}\n\n/**\n * Checks if two Jalali dates are identical.\n */\nexport function isSameJalaliDay(\n a?: JalaliDate | null,\n b?: JalaliDate | null,\n): boolean {\n if (!a || !b) return false;\n return a.year === b.year && a.month === b.month && a.day === b.day;\n}\n","import type {\n JalaliCalendarCell,\n JalaliGridOptions,\n JalaliDate,\n JalaliMonthIndex,\n} from \"./types\";\nimport {\n jalaliToGregorian,\n gregorianToJalali,\n getDaysInJalaliMonth,\n getTodayJalali,\n isSameJalaliDay,\n} from \"./jalali-math\";\n\n/**\n * Normalizes input date (Date or JalaliDate) into JalaliDate object.\n */\nexport function toJalaliDate(input: Date | JalaliDate): JalaliDate {\n if (input instanceof Date) {\n return gregorianToJalali(\n input.getFullYear(),\n input.getMonth() + 1,\n input.getDate(),\n );\n }\n return input;\n}\n\n/**\n * Generates a 42-cell (6 rows x 7 columns) matrix for a given Jalali month.\n */\nexport function generateJalaliCalendarGrid(\n options: JalaliGridOptions,\n): JalaliCalendarCell[] {\n const {\n year,\n month,\n firstDayOfWeek = 0, // 0 = Saturday (شنبه)\n selectedDate,\n minDate,\n maxDate,\n isDateDisabled,\n } = options;\n\n const cells: JalaliCalendarCell[] = [];\n const todayJalali = getTodayJalali();\n const activeSelected = selectedDate ? toJalaliDate(selectedDate) : null;\n const minJalali = minDate ? toJalaliDate(minDate) : null;\n const maxJalali = maxDate ? toJalaliDate(maxDate) : null;\n\n // Convert Jalali 1st of month to Gregorian to read weekday\n const firstDayGregorian = jalaliToGregorian(year, month, 1);\n\n // JS getDay(): 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat\n // Map standard JS getDay() to Jalali index: 6(Sat)->0, 0(Sun)->1, ..., 5(Fri)->6\n const jsDay = firstDayGregorian.getDay();\n const rawJalaliWeekDay = (jsDay + 1) % 7;\n\n const leadingPaddingCount = (rawJalaliWeekDay - firstDayOfWeek + 7) % 7;\n\n // 1. Previous month trailing days\n const prevMonth = (month === 0 ? 11 : month - 1) as JalaliMonthIndex;\n const prevYear = month === 0 ? year - 1 : year;\n const daysInPrevMonth = getDaysInJalaliMonth(prevYear, prevMonth);\n\n for (let i = leadingPaddingCount - 1; i >= 0; i--) {\n const day = daysInPrevMonth - i;\n const jDate: JalaliDate = { year: prevYear, month: prevMonth, day };\n cells.push(buildCell(jDate, false));\n }\n\n // 2. Current month days\n const totalDays = getDaysInJalaliMonth(year, month);\n for (let d = 1; d <= totalDays; d++) {\n const jDate: JalaliDate = { year, month, day: d };\n cells.push(buildCell(jDate, true));\n }\n\n // 3. Next month leading days (completing 42 cells)\n const nextMonth = (month === 11 ? 0 : month + 1) as JalaliMonthIndex;\n const nextYear = month === 11 ? year + 1 : year;\n const trailingPaddingCount = 42 - cells.length;\n\n for (let d = 1; d <= trailingPaddingCount; d++) {\n const jDate: JalaliDate = { year: nextYear, month: nextMonth, day: d };\n cells.push(buildCell(jDate, false));\n }\n\n function buildCell(\n jDate: JalaliDate,\n isCurrentMonth: boolean,\n ): JalaliCalendarCell {\n const gregDate = jalaliToGregorian(jDate.year, jDate.month, jDate.day);\n const isToday = isSameJalaliDay(jDate, todayJalali);\n const isSelected = activeSelected\n ? isSameJalaliDay(jDate, activeSelected)\n : false;\n\n let isDisabled = false;\n if (minJalali) {\n const minG = jalaliToGregorian(\n minJalali.year,\n minJalali.month,\n minJalali.day,\n );\n if (gregDate.getTime() < minG.getTime()) isDisabled = true;\n }\n if (maxJalali) {\n const maxG = jalaliToGregorian(\n maxJalali.year,\n maxJalali.month,\n maxJalali.day,\n );\n if (gregDate.getTime() > maxG.getTime()) isDisabled = true;\n }\n if (isDateDisabled && isDateDisabled(jDate, gregDate)) {\n isDisabled = true;\n }\n\n return {\n jalali: jDate,\n gregorianDate: gregDate,\n dayNumber: jDate.day,\n isCurrentMonth,\n isToday,\n isSelected,\n isDisabled,\n };\n }\n\n return cells;\n}\n","import type { JalaliDate, JalaliDayOfWeek, JalaliMonthIndex } from \"./types\";\nimport {\n jalaliToGregorian,\n gregorianToJalali,\n getDaysInJalaliMonth,\n} from \"./jalali-math\";\n\nexport function jsDateToJalali(d: Date): JalaliDate {\n return gregorianToJalali(d.getFullYear(), d.getMonth() + 1, d.getDate());\n}\n\nexport function jalaliToJsDate(\n j: JalaliDate,\n hours = 0,\n minutes = 0,\n seconds = 0,\n): Date {\n const g = jalaliToGregorian(j.year, j.month, j.day);\n g.setHours(hours, minutes, seconds, 0);\n return g;\n}\n\n/**\n * Calculates day of week in Jalali calendar (0 = شنبه, ..., 6 = جمعه).\n */\nexport function getJalaliDayOfWeek(\n year: number,\n month: number,\n day: number,\n): JalaliDayOfWeek {\n const g = jalaliToGregorian(year, month as JalaliMonthIndex, day);\n const jsDay = g.getDay(); // 0 = Sunday, 6 = Saturday\n return ((jsDay + 1) % 7) as JalaliDayOfWeek;\n}\n\n/**\n * Adds or subtracts days to/from a Jalali date across month/year boundaries.\n */\nexport function addDaysToJalali(date: JalaliDate, days: number): JalaliDate {\n const g = jalaliToGregorian(date.year, date.month, date.day);\n g.setDate(g.getDate() + days);\n // تبدیل getMonth() از 0-indexed به 1-indexed برای gregorianToJalali\n return gregorianToJalali(g.getFullYear(), g.getMonth() + 1, g.getDate());\n}\n\n/**\n * Alias for addDaysToJalali\n */\nexport const addJalaliDays = addDaysToJalali;\n\n/**\n * Compares two Jalali dates:\n * - Returns -1 if d1 < d2\n * - Returns 1 if d1 > d2\n * - Returns 0 if d1 == d2\n */\nexport function compareJalaliDates(d1: JalaliDate, d2: JalaliDate): number {\n if (d1.year !== d2.year) return d1.year < d2.year ? -1 : 1;\n if (d1.month !== d2.month) return d1.month < d2.month ? -1 : 1;\n if (d1.day !== d2.day) return d1.day < d2.day ? -1 : 1;\n return 0;\n}\n\n/**\n * Checks if a target date falls strictly or inclusively between two dates.\n */\nexport function isJalaliDateBetween(\n target: JalaliDate,\n start: JalaliDate,\n end: JalaliDate,\n inclusive = true,\n): boolean {\n const minDate = compareJalaliDates(start, end) <= 0 ? start : end;\n const maxDate = compareJalaliDates(start, end) <= 0 ? end : start;\n\n const cmpMin = compareJalaliDates(target, minDate);\n const cmpMax = compareJalaliDates(target, maxDate);\n\n if (inclusive) {\n return cmpMin >= 0 && cmpMax <= 0;\n }\n return cmpMin > 0 && cmpMax < 0;\n}\n\n/**\n * Calculates the full Jalali week range starting Saturday and ending Friday.\n */\nexport function getJalaliWeekRange(date: JalaliDate): [JalaliDate, JalaliDate] {\n const dayOfWeek = getJalaliDayOfWeek(date.year, date.month, date.day);\n const startOfWeek = addDaysToJalali(date, -dayOfWeek); // شنبه\n const endOfWeek = addDaysToJalali(startOfWeek, 6); // جمعه\n return [startOfWeek, endOfWeek];\n}\n\n/**\n * Calculates full month range from day 1 to last day of that month.\n */\nexport function getJalaliMonthRange(\n date: JalaliDate,\n): [JalaliDate, JalaliDate] {\n const daysInMonth = getDaysInJalaliMonth(date.year, date.month);\n const start: JalaliDate = { year: date.year, month: date.month, day: 1 };\n const end: JalaliDate = {\n year: date.year,\n month: date.month,\n day: daysInMonth,\n };\n return [start, end];\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport type {\n UseJalaliDatePickerOptions,\n SelectionMode,\n InternalSelectedValue,\n JalaliDateRange,\n} from \"./types\";\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\nimport { getTodayJalali, isSameJalaliDay } from \"../core/jalali-math\";\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\nimport { isJalaliDateBetween } from \"../core/jalali-helpers\";\n\nexport function useJalaliDatePicker<M extends SelectionMode = \"single\">(\n options: UseJalaliDatePickerOptions<M> = {},\n) {\n const {\n mode = \"single\" as M,\n value: controlledValue,\n defaultValue,\n initialViewDate,\n onChange,\n minDate,\n maxDate,\n isDateDisabled,\n firstDayOfWeek = 0,\n } = options;\n\n const today = useMemo(() => getTodayJalali(), []);\n\n const [internalValue, setInternalValue] = useState<InternalSelectedValue<M>>(\n () => {\n if (defaultValue !== undefined) return defaultValue;\n if (mode === \"single\") return null as InternalSelectedValue<M>;\n if (mode === \"range\")\n return [null, null] as unknown as InternalSelectedValue<M>;\n return [] as unknown as InternalSelectedValue<M>;\n },\n );\n\n const selected =\n controlledValue !== undefined ? controlledValue : internalValue;\n\n const [viewYear, setViewYear] = useState<number>(() => {\n if (initialViewDate) return initialViewDate.year;\n if (defaultValue && !Array.isArray(defaultValue))\n return (defaultValue as JalaliDate).year;\n return today.year;\n });\n\n const [viewMonth, setViewMonth] = useState<JalaliMonthIndex>(() => {\n if (initialViewDate) return initialViewDate.month;\n if (defaultValue && !Array.isArray(defaultValue))\n return (defaultValue as JalaliDate).month;\n return today.month;\n });\n\n const [hoverDate, setHoverDate] = useState<JalaliDate | null>(null);\n\n const setView = useCallback((year: number, month: JalaliMonthIndex) => {\n setViewYear(year);\n setViewMonth(month);\n }, []);\n\n const goToPrevMonth = useCallback(() => {\n if (viewMonth === 0) {\n setViewYear((y) => y - 1);\n setViewMonth(11);\n } else {\n setViewMonth((m) => (m - 1) as JalaliMonthIndex);\n }\n }, [viewMonth]);\n\n const goToNextMonth = useCallback(() => {\n if (viewMonth === 11) {\n setViewYear((y) => y + 1);\n setViewMonth(0);\n } else {\n setViewMonth((m) => (m + 1) as JalaliMonthIndex);\n }\n }, [viewMonth]);\n\n const goToToday = useCallback(() => {\n const t = getTodayJalali();\n setViewYear(t.year);\n setViewMonth(t.month);\n }, []);\n\n const selectDate = useCallback(\n (date: JalaliDate) => {\n let nextValue: InternalSelectedValue<M>;\n\n if (mode === \"single\") {\n nextValue = date as InternalSelectedValue<M>;\n } else if (mode === \"range\") {\n const currentRange = (selected as JalaliDateRange) || [null, null];\n const [start, end] = currentRange;\n\n if (!start || (start && end)) {\n nextValue = [date, null] as unknown as InternalSelectedValue<M>;\n } else {\n if (\n date.year < start.year ||\n (date.year === start.year && date.month < start.month) ||\n (date.year === start.year &&\n date.month === start.month &&\n date.day < start.day)\n ) {\n nextValue = [date, start] as unknown as InternalSelectedValue<M>;\n } else {\n nextValue = [start, date] as unknown as InternalSelectedValue<M>;\n }\n }\n } else {\n const currentList = (selected as JalaliDate[]) || [];\n const exists = currentList.some((d) => isSameJalaliDay(d, date));\n if (exists) {\n nextValue = currentList.filter(\n (d) => !isSameJalaliDay(d, date),\n ) as InternalSelectedValue<M>;\n } else {\n nextValue = [...currentList, date] as InternalSelectedValue<M>;\n }\n }\n\n if (controlledValue === undefined) {\n setInternalValue(nextValue);\n }\n onChange?.(nextValue);\n },\n [mode, selected, controlledValue, onChange],\n );\n\n const clear = useCallback(() => {\n const emptyValue = (\n mode === \"single\" ? null : mode === \"range\" ? [null, null] : []\n ) as InternalSelectedValue<M>;\n\n if (controlledValue === undefined) {\n setInternalValue(emptyValue);\n }\n onChange?.(emptyValue);\n }, [mode, controlledValue, onChange]);\n\n const grid = useMemo(() => {\n const rawGrid = generateJalaliCalendarGrid({\n year: viewYear,\n month: viewMonth,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n });\n\n if (mode === \"single\") {\n const singleSelected = selected as JalaliDate | null;\n return rawGrid.map((cell) => ({\n ...cell,\n isSelected: singleSelected\n ? isSameJalaliDay(cell.jalali, singleSelected)\n : false,\n }));\n }\n\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n }\n\n if (mode === \"multiple\") {\n const list = (selected as JalaliDate[]) || [];\n return rawGrid.map((cell) => ({\n ...cell,\n isSelected: list.some((d) => isSameJalaliDay(d, cell.jalali)),\n }));\n }\n\n return rawGrid;\n }, [\n viewYear,\n viewMonth,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n mode,\n selected,\n hoverDate,\n ]);\n\n return {\n selected,\n viewYear,\n viewMonth,\n grid,\n goToPrevMonth,\n goToNextMonth,\n goToToday,\n setView,\n selectDate,\n setHoverDate,\n hoverDate,\n clear,\n };\n}\n","import type { JalaliMonthIndex } from \"../core/types\";\nimport { getDaysInJalaliMonth } from \"../core/jalali-math\";\nimport type { NavigateOptions, NavigationResult } from \"./types\";\n\nexport function calculateNextFocusedDate(\n options: NavigateOptions,\n): NavigationResult {\n const { currentFocused, key, isRtl = true } = options;\n let { year, month, day } = currentFocused;\n let viewChanged = false;\n let handled = true;\n\n // Handle RTL vs LTR arrow directions\n const stepLeft = isRtl ? 1 : -1;\n const stepRight = isRtl ? -1 : 1;\n\n switch (key) {\n case \"ArrowRight\":\n day += stepRight;\n break;\n\n case \"ArrowLeft\":\n day += stepLeft;\n break;\n\n case \"ArrowUp\":\n day -= 7;\n break;\n\n case \"ArrowDown\":\n day += 7;\n break;\n\n case \"Home\":\n day = 1;\n break;\n\n case \"End\":\n day = getDaysInJalaliMonth(year, month);\n break;\n\n case \"PageUp\":\n // Previous Month\n if (month === 0) {\n year -= 1;\n month = 11;\n } else {\n month = (month - 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n break;\n\n case \"PageDown\":\n // Next Month\n if (month === 11) {\n year += 1;\n month = 0;\n } else {\n month = (month + 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n break;\n\n default:\n handled = false;\n return { nextDate: currentFocused, viewChanged: false, handled: false };\n }\n\n // Normalize days falling outside current month boundary\n while (day < 1) {\n if (month === 0) {\n year -= 1;\n month = 11;\n } else {\n month = (month - 1) as JalaliMonthIndex;\n }\n day += getDaysInJalaliMonth(year, month);\n viewChanged = true;\n }\n\n while (day > getDaysInJalaliMonth(year, month)) {\n day -= getDaysInJalaliMonth(year, month);\n if (month === 11) {\n year += 1;\n month = 0;\n } else {\n month = (month + 1) as JalaliMonthIndex;\n }\n viewChanged = true;\n }\n\n return {\n nextDate: { year, month, day },\n viewChanged,\n handled,\n };\n}\n","import type { JalaliDate } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\n\n/**\n * Creates an accessible full Persian string for screen readers.\n * Example: \"شنبه، ۱ فروردین ۱۴۰۵\"\n */\nexport function getAriaDayLabel(date: JalaliDate): string {\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\n const jsDay = gregorian.getDay();\n const jalaliDayOfWeek = (jsDay + 1) % 7; // 0 = Sat, 1 = Sun, ...\n\n const weekDayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\n const monthName = PERSIAN_MONTH_NAMES[date.month];\n\n return `${weekDayName}، ${date.day} ${monthName} ${date.year}`;\n}\n","import { useState, useCallback } from \"react\";\nimport type { JalaliDate } from \"../core/types\";\nimport { calculateNextFocusedDate } from \"./keyboard-navigation\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { UseCalendarKeyboardProps } from \"./types\";\n\nexport function useCalendarKeyboard(props: UseCalendarKeyboardProps) {\n const {\n viewYear,\n viewMonth,\n selectedDate,\n onSelectDate,\n onViewChange,\n isRtl = true,\n } = props;\n\n const [focusedDate, setFocusedDate] = useState<JalaliDate>(() => {\n return selectedDate ?? { year: viewYear, month: viewMonth, day: 1 };\n });\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelectDate(focusedDate);\n return;\n }\n\n const result = calculateNextFocusedDate({\n currentFocused: focusedDate,\n key: e.key,\n isRtl,\n });\n\n if (result.handled) {\n e.preventDefault();\n setFocusedDate(result.nextDate);\n\n if (result.viewChanged) {\n onViewChange(result.nextDate.year, result.nextDate.month);\n }\n }\n },\n [focusedDate, isRtl, onSelectDate, onViewChange],\n );\n\n const getCellTabIndex = useCallback(\n (cellDate: JalaliDate): number => {\n return isSameJalaliDay(cellDate, focusedDate) ? 0 : -1;\n },\n [focusedDate],\n );\n\n return {\n focusedDate,\n setFocusedDate,\n handleKeyDown,\n getCellTabIndex,\n };\n}\n","const PERSIAN_DIGITS = [\"۰\", \"۱\", \"۲\", \"۳\", \"۴\", \"۵\", \"۶\", \"۷\", \"۸\", \"۹\"];\nconst LATIN_DIGITS: Record<string, string> = {\n \"۰\": \"0\",\n \"۱\": \"1\",\n \"۲\": \"2\",\n \"۳\": \"3\",\n \"۴\": \"4\",\n \"۵\": \"5\",\n \"۶\": \"6\",\n \"۷\": \"7\",\n \"۸\": \"8\",\n \"۹\": \"9\",\n \"٠\": \"0\",\n \"١\": \"1\",\n \"٢\": \"2\",\n \"٣\": \"3\",\n \"٤\": \"4\", // Arabic-indic fallbacks\n \"٥\": \"5\",\n \"٦\": \"6\",\n \"٧\": \"7\",\n \"٨\": \"8\",\n \"٩\": \"9\",\n};\n\n/**\n * Converts Latin digits (0-9) to Persian digits (۰-۹).\n */\nexport function toPersianDigits(input: string | number): string {\n return String(input).replace(/[0-9]/g, (w) => PERSIAN_DIGITS[+w]);\n}\n\n/**\n * Converts Persian/Arabic digits to standard ASCII Latin digits (0-9).\n */\nexport function toLatinDigits(input: string): string {\n return input.replace(/[۰-۹٠-٩]/g, (char) => LATIN_DIGITS[char] ?? char);\n}\n","import type { JalaliDate } from \"../core/types\";\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\nimport { toPersianDigits } from \"./persian-digits\";\n\nexport interface FormatJalaliOptions {\n /** Output digits format. Defaults to 'persian'. */\n digitType?: \"persian\" | \"latin\";\n}\n\n/**\n * Formats a JalaliDate using standard format pattern tokens:\n * - YYYY: 4-digit year (1405)\n * - YY: 2-digit year (05)\n * - MMMM: Full month name (فروردین)\n * - MM: 2-digit month (01-12)\n * - M: 1-digit month (1-12)\n * - dddd: Full weekday name (شنبه)\n * - DD: 2-digit day (01-31)\n * - D: 1-digit day (1-31)\n */\nexport function formatJalaliDate(\n date: JalaliDate | null | undefined,\n pattern = \"YYYY/MM/DD\",\n options: FormatJalaliOptions = {},\n): string {\n if (!date) return \"\";\n\n const { digitType = \"persian\" } = options;\n\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\n const jsDay = gregorian.getDay();\n const jalaliDayOfWeek = (jsDay + 1) % 7;\n\n const yearStr = String(date.year);\n const shortYearStr = yearStr.slice(-2);\n const monthNum = date.month + 1;\n const monthStr = monthNum < 10 ? `0${monthNum}` : String(monthNum);\n const monthName = PERSIAN_MONTH_NAMES[date.month];\n const dayStr = date.day < 10 ? `0${date.day}` : String(date.day);\n const weekdayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\n\n let formatted = pattern\n .replace(/\\bYYYY\\b/g, yearStr)\n .replace(/\\bYY\\b/g, shortYearStr)\n .replace(/\\bMMMM\\b/g, monthName)\n .replace(/\\bMM\\b/g, monthStr)\n .replace(/\\bM\\b/g, String(monthNum))\n .replace(/\\bdddd\\b/g, weekdayName)\n .replace(/\\bDD\\b/g, dayStr)\n .replace(/\\bD\\b/g, String(date.day));\n\n if (digitType === \"persian\") {\n // Convert numeric matches while preserving month/weekday strings\n formatted = formatted.replace(/\\d+/g, (num) => toPersianDigits(num));\n }\n\n return formatted;\n}\n","// src/theme/tokens.ts\nimport type { Theme } from './types';\n\nexport const lightTheme: Theme = {\n mode: 'light',\n colors: {\n primary: '#4f46e5', // Indigo-600\n primaryHover: '#4338ca', // Indigo-700\n primaryText: '#ffffff', // متن سفید روی رنگ اصلی\n background: '#ffffff', // پس‌زمینه اصلی تقویم و اینپوت\n backgroundHover: '#f1f5f9', // Slate-100 برای هاور دکمه‌ها\n surface: '#f8fafc', // Slate-50 برای فوتر و کادرهای فرعی\n border: '#e2e8f0', // Slate-200 برای خطوط و بردرها\n textPrimary: '#0f172a', // Slate-900 (مشکی تیره برای روزها و عناوین)\n textSecondary: '#64748b', // Slate-500 (خاکستری برای نام روزهای هفته و متون کمکی)\n textDisabled: '#cbd5e1', // Slate-300 (برای روزهای ماه قبل و بعد)\n holiday: '#e11d48', // Rose-600 (رنگ جمعه‌ها و روزهای تعطیل)\n holidayBackground: '#fff1f2', // Rose-50 (هاور روزهای تعطیل)\n rangeBackground: '#e0e7ff', // Indigo-100 (پس‌زمینه بازه انتخاب‌شده)\n todayBorder: '#4f46e5', // حاشیه دور روز جاری\n },\n radii: {\n sm: '6px',\n md: '8px',\n lg: '12px',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.04)',\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.05)',\n },\n};\n\nexport const darkTheme: Theme = {\n mode: 'dark',\n colors: {\n primary: '#6366f1',\n primaryHover: '#4f46e5',\n primaryText: '#ffffff',\n background: '#0f172a',\n backgroundHover: '#1e293b',\n surface: '#1e293b',\n border: '#334155',\n textPrimary: '#f8fafc',\n textSecondary: '#94a3b8',\n textDisabled: '#475569',\n holiday: '#fb7185',\n holidayBackground: '#4c0519',\n rangeBackground: '#312e81',\n todayBorder: '#818cf8',\n },\n radii: {\n sm: '6px',\n md: '8px',\n lg: '12px',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.4)',\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.5)',\n },\n};\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport { lightTheme, darkTheme } from \"./tokens\";\nimport type { Theme, ThemeMode, DeepPartial } from \"./types\";\n\ninterface ThemeContextType {\n theme: Theme;\n mode: ThemeMode;\n}\n\nconst ThemeContext = createContext<ThemeContextType>({\n theme: lightTheme,\n mode: \"light\",\n});\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n return { theme: lightTheme, mode: \"light\" };\n }\n return context;\n};\n\nexport interface DatePickerThemeProviderProps {\n children: React.ReactNode;\n mode?: ThemeMode;\n customTheme?: DeepPartial<Theme>;\n}\n\nexport const DatePickerThemeProvider: React.FC<\n DatePickerThemeProviderProps\n> = ({ children, mode = \"light\", customTheme }) => {\n const baseTheme = mode === \"dark\" ? darkTheme : lightTheme;\n\n const value = useMemo<ThemeContextType>(() => {\n if (!customTheme) {\n return { theme: baseTheme, mode };\n }\n\n return {\n mode,\n theme: {\n ...baseTheme,\n ...customTheme,\n mode,\n colors: {\n ...baseTheme.colors,\n ...(customTheme.colors || {}),\n },\n radii: {\n ...baseTheme.radii,\n ...(customTheme.radii || {}),\n },\n shadows: {\n ...baseTheme.shadows,\n ...(customTheme.shadows || {}),\n },\n },\n };\n }, [baseTheme, customTheme, mode]);\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n","import React, { useState } from \"react\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { useTheme } from \"../theme/ThemeProvider\";\n\nexport interface HeaderProps {\n year: number;\n monthName: string;\n onPrevMonth: () => void;\n onNextMonth: () => void;\n onTitleClick?: () => void;\n isPickerOpen?: boolean;\n digitType?: \"persian\" | \"latin\";\n direction?: \"rtl\" | \"ltr\";\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\ntype HoverTarget = \"prev\" | \"title\" | \"next\" | null;\n\nexport const Header: React.FC<HeaderProps> = ({\n year,\n monthName,\n onPrevMonth,\n onNextMonth,\n onTitleClick,\n isPickerOpen = false,\n digitType = \"persian\",\n direction = \"rtl\",\n classNames,\n styles,\n}) => {\n const { theme } = useTheme();\n const [hovered, setHovered] = useState<HoverTarget>(null);\n const displayYear =\n digitType === \"persian\" ? toPersianDigits(year) : String(year);\n\n const navStyle = (target: Exclude<HoverTarget, \"title\" | null>) => ({\n width: \"32px\",\n height: \"32px\",\n padding: 0,\n borderRadius: theme.radii.md,\n border: \"none\",\n backgroundColor:\n hovered === target ? theme.colors.backgroundHover : \"transparent\",\n color: theme.colors.textPrimary,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"background-color 0.15s ease, color 0.15s ease\",\n ...styles?.navButton,\n });\n\n return (\n <div\n dir={direction}\n className={classNames?.header}\n style={{\n display: \"flex\",\n minHeight: \"40px\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"8px\",\n padding: \"4px 0 10px\",\n borderBottom: `1px solid ${theme.colors.border}`,\n userSelect: \"none\",\n ...styles?.header,\n }}\n >\n <button\n type=\"button\"\n onClick={onPrevMonth}\n aria-label=\"ماه قبل\"\n className={classNames?.navButton}\n style={navStyle(\"prev\")}\n onMouseEnter={() => setHovered(\"prev\")}\n onMouseLeave={() => setHovered(null)}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n onClick={onTitleClick}\n aria-expanded={isPickerOpen}\n className={classNames?.headerTitle}\n style={{\n minHeight: \"32px\",\n padding: \"6px 12px\",\n borderRadius: theme.radii.md,\n border: \"none\",\n backgroundColor:\n isPickerOpen || hovered === \"title\"\n ? theme.colors.backgroundHover\n : \"transparent\",\n color: theme.colors.textPrimary,\n cursor: onTitleClick ? \"pointer\" : \"default\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"6px\",\n fontSize: \"0.95rem\",\n fontWeight: 700,\n whiteSpace: \"nowrap\",\n transition: \"background-color 0.15s ease\",\n ...styles?.headerTitle,\n }}\n onMouseEnter={() => setHovered(\"title\")}\n onMouseLeave={() => setHovered(null)}\n >\n <span>\n {monthName} {displayYear}\n </span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{\n transform: isPickerOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s ease\",\n }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n onClick={onNextMonth}\n aria-label=\"ماه بعد\"\n className={classNames?.navButton}\n style={navStyle(\"next\")}\n onMouseEnter={() => setHovered(\"next\")}\n onMouseLeave={() => setHovered(null)}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n </div>\n );\n};\n","// src/components/Weekdays.tsx\nimport React from \"react\";\nimport { PERSIAN_WEEK_DAYS_SHORT } from \"../core/constants\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface WeekdaysProps {\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const Weekdays: React.FC<WeekdaysProps> = ({\n firstDayOfWeek = 0,\n classNames,\n styles,\n}) => {\n // مرتب‌سازی روزهای هفته بر اساس firstDayOfWeek\n const weekdays = React.useMemo(() => {\n const days = [...PERSIAN_WEEK_DAYS_SHORT];\n const rotated = [\n ...days.slice(firstDayOfWeek),\n ...days.slice(0, firstDayOfWeek),\n ];\n return rotated;\n }, [firstDayOfWeek]);\n\n return (\n <div\n role=\"row\"\n className={classNames?.weekdays}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 34px))\",\n gap: \"4px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n marginBottom: \"6px\",\n userSelect: \"none\",\n ...styles?.weekdays,\n }}\n >\n {weekdays.map((day, idx) => {\n // اگر جمعه باشد (در حالت شنبه تا جمعه، آخرین ایندکس ۶ است)\n const isFriday = (idx + firstDayOfWeek) % 7 === 6;\n\n return (\n <div\n key={day}\n role=\"columnheader\"\n aria-label={day}\n className={classNames?.weekdayCell}\n style={{\n width: \"var(--pdp-cell-size, 34px)\",\n height: \"24px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11.5px\",\n fontWeight: 700,\n color: isFriday\n ? \"var(--pdp-holiday-color, #e11d48)\"\n : \"var(--pdp-text-muted, #94a3b8)\",\n textAlign: \"center\",\n ...styles?.weekdayCell,\n }}\n >\n {day}\n </div>\n );\n })}\n </div>\n );\n};\n","// src/components/DayCell.tsx\nimport React, { useState } from \"react\";\nimport type { JalaliCalendarCell, JalaliDate } from \"../core/types\";\nimport { toPersianDigits, toLatinDigits } from \"../formatters/persian-digits\";\nimport type { CalendarEvent } from \"../events/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface DayCellProps {\n cell: JalaliCalendarCell;\n digitType?: \"persian\" | \"latin\";\n isHoliday?: boolean;\n holidayTitle?: string;\n events?: CalendarEvent[];\n tabIndex?: number;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n onSelect: (date: JalaliDate) => void;\n onHover?: (date: JalaliDate | null) => void;\n onFocus?: (date: JalaliDate) => void;\n}\n\nexport const DayCell: React.FC<DayCellProps> = ({\n cell,\n digitType = \"persian\",\n isHoliday = false,\n holidayTitle,\n events = [],\n tabIndex = -1,\n classNames,\n styles,\n onSelect,\n onHover,\n onFocus,\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const {\n jalali,\n dayNumber,\n isCurrentMonth,\n isToday,\n isSelected,\n isDisabled,\n isInRange,\n isRangeStart,\n isRangeEnd,\n } = cell;\n\n const formattedDay =\n digitType === \"persian\"\n ? toPersianDigits(dayNumber)\n : toLatinDigits(dayNumber.toString());\n\n const isInteractive = !isDisabled && isCurrentMonth;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isInteractive) {\n onSelect(jalali);\n }\n };\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n if (isInteractive && onHover) {\n onHover(jalali);\n }\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n setIsPressed(false);\n if (onHover) {\n onHover(null);\n }\n };\n\n const handleFocus = () => {\n if (isInteractive && onFocus) {\n onFocus(jalali);\n }\n };\n\n // رنگ‌بندی پس‌زمینه و متن در حالت‌های مختلف\n let cellBg = \"transparent\";\n let textColor = isCurrentMonth\n ? \"var(--pdp-text-primary, #0f172a)\"\n : \"var(--pdp-text-disabled, #cbd5e1)\";\n\n const isEdgeOfRange = isRangeStart || isRangeEnd;\n\n if (isSelected || isEdgeOfRange) {\n cellBg = \"var(--pdp-primary, #4f46e5)\";\n textColor = \"#ffffff\";\n } else if (isInRange) {\n cellBg = \"var(--pdp-range-between-bg, rgba(79, 70, 229, 0.12))\";\n } else if (isHovered && isInteractive) {\n cellBg = \"var(--pdp-hover-bg, #f1f5f9)\";\n }\n\n // رنگ روزهای تعطیل در صورت عدم انتخاب\n if (isHoliday && isCurrentMonth && !isSelected && !isEdgeOfRange) {\n textColor = \"var(--pdp-holiday-color, #e11d48)\";\n }\n\n // انیمیشن transform بر اساس حالت‌های مختلف\n let transform = \"scale(1)\";\n if (isInteractive) {\n if (isPressed) {\n transform = \"scale(0.92)\";\n } else if (isHovered && !isInRange) {\n transform = \"scale(1.08)\";\n }\n }\n\n return (\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"var(--pdp-cell-size, 34px)\",\n height: \"var(--pdp-cell-size, 34px)\",\n margin: 0,\n padding: 0,\n boxSizing: \"border-box\",\n }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <button\n type=\"button\"\n role=\"gridcell\"\n tabIndex={tabIndex}\n disabled={isDisabled || !isCurrentMonth}\n aria-selected={isSelected}\n aria-label={`${jalali.year}/${jalali.month + 1}/${jalali.day}${\n holidayTitle ? ` - ${holidayTitle}` : \"\"\n }`}\n onClick={handleClick}\n onFocus={handleFocus}\n onMouseDown={() => isInteractive && setIsPressed(true)}\n onMouseUp={() => isInteractive && setIsPressed(false)}\n className={classNames?.dayCell}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: isRangeStart\n ? \"0 8px 8px 0\"\n : isRangeEnd\n ? \"8px 0 0 8px\"\n : isInRange\n ? \"0\"\n : \"8px\",\n border:\n isToday && !isSelected\n ? \"1px solid var(--pdp-primary, #4f46e5)\"\n : \"none\",\n backgroundColor: cellBg,\n color: textColor,\n cursor: isInteractive ? \"pointer\" : \"default\",\n fontSize: \"13px\",\n fontWeight: isSelected || isToday ? 700 : 500,\n outline: \"none\",\n position: \"relative\",\n padding: 0,\n margin: 0,\n boxSizing: \"border-box\",\n // انیمیشن‌های نرم هاور، اسکیل و رنگ\n transform,\n boxShadow:\n isHovered && isInteractive && !isInRange && !isSelected\n ? \"0 2px 6px rgba(0, 0, 0, 0.08)\"\n : \"none\",\n transition:\n \"transform 0.16s cubic-bezier(0.34, 1.56, 0.64, 1), background-color 0.14s ease, color 0.14s ease, box-shadow 0.16s ease\",\n zIndex: isHovered && isInteractive ? 2 : 1,\n ...styles?.dayCell,\n }}\n >\n <span>{formattedDay}</span>\n\n {/* نقاط ایونت‌ها */}\n {events.length > 0 && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"3px\",\n display: \"flex\",\n gap: \"2px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"transform 0.14s ease\",\n transform:\n isHovered && isInteractive ? \"translateY(1px)\" : \"none\",\n }}\n >\n {events.slice(0, 3).map((ev) => (\n <span\n key={ev.id}\n style={{\n width: \"3.5px\",\n height: \"3.5px\",\n borderRadius: \"50%\",\n backgroundColor: isSelected\n ? \"#ffffff\"\n : ev.color || \"var(--pdp-primary, #4f46e5)\",\n transition: \"background-color 0.14s ease\",\n }}\n />\n ))}\n </div>\n )}\n </button>\n\n {/* تولتیپ شناور روز با انیمیشن Fade-in / Slide-up */}\n {isHovered && isCurrentMonth && (isHoliday || events.length > 0) && (\n <div\n role=\"tooltip\"\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 7px)\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 1050,\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backgroundColor: \"var(--pdp-tooltip-bg, #0f172a)\",\n color: \"var(--pdp-tooltip-text, #ffffff)\",\n padding: \"5px 9px\",\n borderRadius: \"6px\",\n fontSize: \"11.5px\",\n fontWeight: 600,\n lineHeight: 1.3,\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.25)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n textAlign: \"center\",\n animation:\n \"pdpTooltipFade 0.15s cubic-bezier(0.16, 1, 0.3, 1) forwards\",\n }}\n >\n {isHoliday && holidayTitle && (\n <span style={{ color: \"#fda4af\" }}>{holidayTitle}</span>\n )}\n\n {events.map((ev) => (\n <span key={ev.id} style={{ color: \"#e2e8f0\" }}>\n • {ev.title}\n </span>\n ))}\n\n {/* فلش جهت‌نمای تولتیپ */}\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n borderWidth: \"4px\",\n borderStyle: \"solid\",\n borderColor:\n \"var(--pdp-tooltip-bg, #0f172a) transparent transparent transparent\",\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","// src/components/MonthYearPicker.tsx\nimport React, { useState } from \"react\";\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport type { JalaliMonthIndex } from \"../core/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface MonthYearPickerProps {\n currentYear: number;\n currentMonth: number;\n onSelectMonth: (month: JalaliMonthIndex) => void;\n onSelectYear: (year: number) => void;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const MonthYearPicker: React.FC<MonthYearPickerProps> = ({\n currentYear,\n currentMonth,\n onSelectMonth,\n onSelectYear,\n classNames,\n styles,\n}) => {\n const [viewLevel, setViewLevel] = useState<\"months\" | \"years\">(\"months\");\n const [decadeStartYear, setDecadeStartYear] = useState<number>(\n () => Math.floor(currentYear / 10) * 10,\n );\n const [activeYear, setActiveYear] = useState<number>(currentYear);\n\n const decadeYears = Array.from(\n { length: 12 },\n (_, i) => decadeStartYear - 1 + i,\n );\n\n const handlePrev = () => {\n if (viewLevel === \"months\") {\n const prevY = activeYear - 1;\n setActiveYear(prevY);\n onSelectYear(prevY);\n } else {\n setDecadeStartYear((prev) => prev - 10);\n }\n };\n\n const handleNext = () => {\n if (viewLevel === \"months\") {\n const nextY = activeYear + 1;\n setActiveYear(nextY);\n onSelectYear(nextY);\n } else {\n setDecadeStartYear((prev) => prev + 10);\n }\n };\n\n const navBtnStyle: React.CSSProperties = {\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"6px\",\n borderRadius: \"8px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n transition: \"all 0.15s ease\",\n };\n\n const cellBtnBaseStyle: React.CSSProperties = {\n height: \"46px\",\n borderRadius: \"10px\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"13.5px\",\n fontWeight: 600,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.15s ease\",\n background: \"transparent\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n userSelect: \"none\",\n };\n\n return (\n <div\n className={classNames?.calendar}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n width: \"100%\",\n minWidth: \"260px\",\n height: \"260px\",\n padding: \"6px\",\n boxSizing: \"border-box\",\n justifyContent: \"space-between\",\n userSelect: \"none\",\n ...styles?.calendar,\n }}\n >\n {/* Header Bar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 4px\",\n height: \"38px\",\n }}\n >\n {/* Right Arrow (Previous in RTL) */}\n <button\n type=\"button\"\n onClick={handlePrev}\n aria-label=\"Previous\"\n style={navBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-hover-bg, #f1f5f9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n\n {/* Header Year Button (Clearly Interactive) */}\n <button\n type=\"button\"\n onClick={() => {\n if (viewLevel === \"months\") {\n setDecadeStartYear(Math.floor(activeYear / 10) * 10);\n setViewLevel(\"years\");\n }\n }}\n style={{\n background:\n viewLevel === \"months\"\n ? \"var(--pdp-surface-subtle, #f1f5f9)\"\n : \"transparent\",\n border:\n viewLevel === \"months\"\n ? \"1px solid var(--pdp-surface-border, #e2e8f0)\"\n : \"none\",\n cursor: viewLevel === \"months\" ? \"pointer\" : \"default\",\n fontSize: \"13.5px\",\n fontWeight: 700,\n color: \"var(--pdp-text-primary, #0f172a)\",\n padding: \"5px 12px\",\n borderRadius: \"8px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (viewLevel === \"months\") {\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-hover-bg, #e2e8f0)\";\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\n }\n }}\n onMouseLeave={(e) => {\n if (viewLevel === \"months\") {\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-surface-subtle, #f1f5f9)\";\n e.currentTarget.style.borderColor =\n \"var(--pdp-surface-border, #e2e8f0)\";\n }\n }}\n >\n <span>\n {viewLevel === \"months\"\n ? toPersianDigits(activeYear)\n : `${toPersianDigits(decadeStartYear)} - ${toPersianDigits(decadeStartYear + 9)}`}\n </span>\n\n {viewLevel === \"months\" && (\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ opacity: 0.7 }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )}\n </button>\n\n {/* Left Arrow (Next in RTL) */}\n <button\n type=\"button\"\n onClick={handleNext}\n aria-label=\"Next\"\n style={navBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-hover-bg, #f1f5f9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n </div>\n\n {/* Grid Content: 4 Columns x 3 Rows */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n gridTemplateRows: \"repeat(3, 1fr)\",\n gap: \"8px 6px\",\n flex: 1,\n alignItems: \"center\",\n }}\n >\n {viewLevel === \"months\"\n ? PERSIAN_MONTH_NAMES.map((name, index) => {\n const isSelected =\n index === currentMonth && activeYear === currentYear;\n return (\n <button\n key={name}\n type=\"button\"\n onClick={() => onSelectMonth(index as JalaliMonthIndex)}\n style={{\n ...cellBtnBaseStyle,\n background: isSelected\n ? \"var(--pdp-primary, #4f46e5)\"\n : \"transparent\",\n color: isSelected\n ? \"#ffffff\"\n : \"var(--pdp-text-primary, #0f172a)\",\n fontWeight: isSelected ? 700 : 500,\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-hover-bg, #f1f5f9)\";\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n {name}\n </button>\n );\n })\n : decadeYears.map((year, idx) => {\n const isOutlier = idx === 0 || idx === 11;\n const isSelected = year === activeYear;\n\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => {\n setActiveYear(year);\n onSelectYear(year);\n setViewLevel(\"months\");\n }}\n style={{\n ...cellBtnBaseStyle,\n background: isSelected\n ? \"var(--pdp-primary, #4f46e5)\"\n : \"transparent\",\n color: isSelected\n ? \"#ffffff\"\n : isOutlier\n ? \"var(--pdp-text-disabled, #94a3b8)\"\n : \"var(--pdp-text-primary, #0f172a)\",\n fontWeight: isSelected ? 700 : 500,\n opacity: isOutlier ? 0.4 : 1,\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-hover-bg, #f1f5f9)\";\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n {toPersianDigits(year)}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n","import type { JalaliTime } from \"./types\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\n\n/**\n * Formats a single time segment (e.g. hour/minute) as a 2-digit padded string.\n */\nexport function formatTimeSegment(\n val: number,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n const padded = val < 10 ? `0${val}` : `${val}`;\n return digitType === \"persian\" ? toPersianDigits(padded) : padded;\n}\n\n/**\n * Retrieves the current local machine time as a JalaliTime structure.\n */\nexport function getCurrentTime(): JalaliTime {\n const now = new Date();\n return {\n hour: now.getHours(),\n minute: now.getMinutes(),\n second: now.getSeconds(),\n };\n}\n\n/**\n * Clamps hour, minute, and second within valid boundary ranges.\n */\nexport function clampTime(time: JalaliTime): JalaliTime {\n return {\n hour: Math.max(0, Math.min(23, time.hour)),\n minute: Math.max(0, Math.min(59, time.minute)),\n second:\n time.second !== undefined\n ? Math.max(0, Math.min(59, time.second))\n : undefined,\n };\n}\n\n/**\n * Formats a JalaliTime object into a display string (e.g., \"14:30\" or \"۱۴:۳۰\").\n */\nexport function formatTimeString(\n time: JalaliTime | null | undefined,\n showSeconds = false,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n if (!time) return \"\";\n const h = formatTimeSegment(time.hour, digitType);\n const m = formatTimeSegment(time.minute, digitType);\n if (showSeconds && time.second !== undefined) {\n const s = formatTimeSegment(time.second, digitType);\n return `${h}:${m}:${s}`;\n }\n return `${h}:${m}`;\n}\n","import React from \"react\";\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\nimport { formatTimeString } from \"../../plugins/time-picker/time-utils\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport type { CalendarFooterProps } from \"./types\";\n\nexport const CalendarFooter: React.FC<CalendarFooterProps> = ({\n selectedDate,\n selectedRange,\n selectedDates,\n selectedTime,\n showSeconds = false,\n mode = \"single\",\n digitType = \"persian\",\n showStatusText = true,\n showActions = true,\n onToday,\n onClear,\n onConfirm,\n direction = \"rtl\",\n classNames,\n styles,\n}) => {\n const { theme } = useTheme();\n\n const statusText = (() => {\n if (mode === \"single\") {\n if (!selectedDate) return \"تاریخی انتخاب نشده\";\n const date = formatJalaliDate(selectedDate, \"YYYY/MM/DD\", { digitType });\n const time = selectedTime\n ? formatTimeString(selectedTime, showSeconds, digitType)\n : \"\";\n return time ? `${date}، ${time}` : date;\n }\n\n if (mode === \"range\") {\n const [start, end] = selectedRange ?? [null, null];\n if (!start) return \"بازه‌ای انتخاب نشده\";\n const startText = formatJalaliDate(start, \"YYYY/MM/DD\", { digitType });\n if (!end) return `${startText} تا …`;\n const endText = formatJalaliDate(end, \"YYYY/MM/DD\", { digitType });\n return `${startText} تا ${endText}`;\n }\n\n const count = selectedDates?.length ?? 0;\n const displayCount =\n digitType === \"persian\" ? toPersianDigits(count) : String(count);\n return count ? `${displayCount} تاریخ انتخاب شده` : \"تاریخی انتخاب نشده\";\n })();\n\n const actionButtonStyle: React.CSSProperties = {\n minHeight: \"34px\",\n padding: \"5px 12px\",\n borderRadius: theme.radii.sm,\n border: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.background,\n color: theme.colors.textSecondary,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n fontSize: \"0.78rem\",\n fontWeight: 600,\n };\n\n return (\n <div\n dir={direction}\n className={classNames?.footer}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: showStatusText ? \"space-between\" : \"flex-end\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"10px 0 0\",\n borderTop: `1px solid ${theme.colors.border}`,\n color: theme.colors.textPrimary,\n ...styles?.footer,\n }}\n >\n {showStatusText && (\n <span\n className={classNames?.footerStatus}\n style={{\n color: theme.colors.textSecondary,\n fontSize: \"0.78rem\",\n lineHeight: 1.5,\n ...styles?.footerStatus,\n }}\n >\n {statusText}\n </span>\n )}\n\n {showActions && (\n <div\n className={classNames?.footerActions}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"6px\",\n ...styles?.footerActions,\n }}\n >\n {onToday && (\n <button\n type=\"button\"\n onClick={onToday}\n className={classNames?.todayButton}\n style={{\n ...actionButtonStyle,\n color: theme.colors.primary,\n ...styles?.todayButton,\n }}\n >\n امروز\n </button>\n )}\n {onClear && (\n <button\n type=\"button\"\n onClick={onClear}\n className={classNames?.clearButton}\n style={{ ...actionButtonStyle, ...styles?.clearButton }}\n >\n پاک کردن\n </button>\n )}\n {onConfirm && (\n <button\n type=\"button\"\n onClick={onConfirm}\n className={classNames?.confirmButton}\n style={{\n ...actionButtonStyle,\n borderColor: theme.colors.primary,\n backgroundColor: theme.colors.primary,\n color: theme.colors.primaryText,\n ...styles?.confirmButton,\n }}\n >\n تأیید\n </button>\n )}\n </div>\n )}\n </div>\n );\n};\n","// src/plugins/time-picker/TimePicker.tsx\nimport React, { useState, useRef, useEffect } from \"react\";\nimport type { JalaliTime } from \"./types\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../../theme/style-slots\";\n\nexport interface TimePickerProps {\n value: JalaliTime;\n onChange: (time: JalaliTime) => void;\n minuteStep?: number;\n hourStep?: number;\n showSeconds?: boolean;\n digitType?: \"persian\" | \"latin\";\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n}\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onChange,\n minuteStep = 1,\n hourStep = 1,\n showSeconds = false,\n digitType = \"persian\",\n classNames,\n styles,\n}) => {\n const [openDropdown, setOpenDropdown] = useState<\n \"hour\" | \"minute\" | \"second\" | null\n >(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const hours = Array.from(\n { length: Math.ceil(24 / hourStep) },\n (_, i) => i * hourStep,\n );\n const minutes = Array.from(\n { length: Math.ceil(60 / minuteStep) },\n (_, i) => i * minuteStep,\n );\n const seconds = Array.from({ length: 60 }, (_, i) => i);\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setOpenDropdown(null);\n }\n };\n document.addEventListener(\"mousedown\", handleOutsideClick);\n document.addEventListener(\"touchstart\", handleOutsideClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleOutsideClick);\n document.removeEventListener(\"touchstart\", handleOutsideClick);\n };\n }, []);\n\n const formatNum = (n: number) => {\n const formatted = String(n).padStart(2, \"0\");\n return digitType === \"persian\" ? toPersianDigits(formatted) : formatted;\n };\n\n const renderSelectColumn = (\n type: \"hour\" | \"minute\" | \"second\",\n currentVal: number,\n options: number[],\n onSelect: (val: number) => void,\n ) => {\n const isOpen = openDropdown === type;\n\n return (\n <div style={{ position: \"relative\" }}>\n {/* Clickable Badge Trigger */}\n <button\n type=\"button\"\n onClick={() => setOpenDropdown(isOpen ? null : type)}\n style={{\n minWidth: \"40px\",\n height: \"30px\",\n padding: \"0 6px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"6px\",\n backgroundColor: isOpen\n ? \"var(--pdp-primary, #4f46e5)\"\n : \"var(--pdp-surface-bg, #ffffff)\",\n color: isOpen ? \"#ffffff\" : \"var(--pdp-text-primary, #0f172a)\",\n border: `1px solid ${isOpen ? \"var(--pdp-primary, #4f46e5)\" : \"var(--pdp-surface-border, #e2e8f0)\"}`,\n fontSize: \"13px\",\n fontWeight: 700,\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n boxShadow: isOpen ? \"0 0 0 2px rgba(79, 70, 229, 0.2)\" : \"none\",\n }}\n onMouseEnter={(e) => {\n if (!isOpen) {\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-hover-bg, #f1f5f9)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isOpen) {\n e.currentTarget.style.borderColor =\n \"var(--pdp-surface-border, #e2e8f0)\";\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-surface-bg, #ffffff)\";\n }\n }}\n >\n {formatNum(currentVal)}\n </button>\n\n {/* Scrollable Dropdown List */}\n {isOpen && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 4px)\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n maxHeight: \"140px\",\n width: \"52px\",\n overflowY: \"auto\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n borderRadius: \"8px\",\n boxShadow:\n \"var(--pdp-shadow, 0 10px 15px -3px rgba(0, 0, 0, 0.15))\",\n zIndex: 1050,\n padding: \"4px 2px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n }}\n >\n {options.map((opt) => {\n const isSelected = opt === currentVal;\n return (\n <button\n key={opt}\n type=\"button\"\n onClick={() => {\n onSelect(opt);\n setOpenDropdown(null);\n }}\n style={{\n padding: \"4px 0\",\n border: \"none\",\n borderRadius: \"4px\",\n background: isSelected\n ? \"var(--pdp-primary, #4f46e5)\"\n : \"transparent\",\n color: isSelected\n ? \"#ffffff\"\n : \"var(--pdp-text-primary, #0f172a)\",\n fontSize: \"12px\",\n fontWeight: isSelected ? 700 : 500,\n cursor: \"pointer\",\n transition: \"background 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor =\n \"var(--pdp-hover-bg, #f1f5f9)\";\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n {formatNum(opt)}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={containerRef}\n className={classNames?.timePicker}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"6px\",\n padding: \"6px 12px\",\n borderTop: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-subtle, #f8fafc)\",\n borderRadius:\n \"0 0 var(--pdp-border-radius, 10px) var(--pdp-border-radius, 10px)\",\n direction: \"ltr\",\n userSelect: \"none\",\n ...styles?.timePicker,\n }}\n >\n {/* ساعت */}\n {renderSelectColumn(\"hour\", value.hour, hours, (h) =>\n onChange({ ...value, hour: h }),\n )}\n\n <span\n style={{\n fontWeight: 800,\n color: \"var(--pdp-text-muted, #94a3b8)\",\n fontSize: \"14px\",\n }}\n >\n :\n </span>\n\n {/* دقیقه */}\n {renderSelectColumn(\"minute\", value.minute, minutes, (m) =>\n onChange({ ...value, minute: m }),\n )}\n\n {/* ثانیه */}\n {showSeconds && (\n <>\n <span\n style={{\n fontWeight: 800,\n color: \"var(--pdp-text-muted, #94a3b8)\",\n fontSize: \"14px\",\n }}\n >\n :\n </span>\n {renderSelectColumn(\"second\", value.second ?? 0, seconds, (s) =>\n onChange({ ...value, second: s }),\n )}\n </>\n )}\n </div>\n );\n};\n","import type { JalaliDate, JalaliMonthIndex } from \"../../core/types\";\nimport type { DateParseResult } from \"./types\";\nimport {\n toLatinDigits,\n toPersianDigits,\n} from \"../../formatters/persian-digits\";\nimport { getDaysInJalaliMonth } from \"../../core/jalali-math\";\nimport { compareJalaliDates } from \"../../core/jalali-helpers\";\n\n/**\n * Strips all non-digit characters and applies the 'YYYY/MM/DD' mask structure.\n */\nexport function applyDateMask(\n rawInput: string,\n digitType: \"persian\" | \"latin\" = \"persian\",\n): string {\n // Normalize all Persian/Arabic digits to ASCII 0-9\n const cleanDigits = toLatinDigits(rawInput).replace(/\\D/g, \"\").slice(0, 8);\n\n let masked = \"\";\n if (cleanDigits.length > 0) {\n masked = cleanDigits.slice(0, 4); // Year (YYYY)\n }\n if (cleanDigits.length >= 5) {\n masked += `/${cleanDigits.slice(4, 6)}`; // Month (MM)\n }\n if (cleanDigits.length >= 7) {\n masked += `/${cleanDigits.slice(6, 8)}`; // Day (DD)\n }\n\n return digitType === \"persian\" ? toPersianDigits(masked) : masked;\n}\n\n/**\n * Validates and parses a masked string into a valid JalaliDate object.\n */\nexport function parseAndValidateJalaliString(\n input: string,\n minDate?: JalaliDate,\n maxDate?: JalaliDate,\n isDateDisabled?: (date: JalaliDate) => boolean,\n): DateParseResult {\n const normalized = toLatinDigits(input).trim();\n\n if (!normalized) {\n return { isValid: true, date: null };\n }\n\n const parts = normalized.split(\"/\");\n if (\n parts.length !== 3 ||\n parts[0].length !== 4 ||\n parts[1].length !== 2 ||\n parts[2].length !== 2\n ) {\n return { isValid: false, date: null, error: \"INVALID_FORMAT\" };\n }\n\n const year = parseInt(parts[0], 10);\n const monthNum = parseInt(parts[1], 10);\n const day = parseInt(parts[2], 10);\n\n // Validate Month Range (1 to 12)\n if (monthNum < 1 || monthNum > 12) {\n return { isValid: false, date: null, error: \"INVALID_MONTH\" };\n }\n\n const monthIndex = (monthNum - 1) as JalaliMonthIndex;\n const maxDays = getDaysInJalaliMonth(year, monthIndex);\n\n // Validate Day Range (1 to 29/30/31 based on month & leap year)\n if (day < 1 || day > maxDays) {\n return { isValid: false, date: null, error: \"INVALID_DAY\" };\n }\n\n const jalaliDate: JalaliDate = { year, month: monthIndex, day };\n\n // Min / Max range validations\n if (minDate && compareJalaliDates(jalaliDate, minDate) < 0) {\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MIN_BOUNDS\" };\n }\n\n if (maxDate && compareJalaliDates(jalaliDate, maxDate) > 0) {\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MAX_BOUNDS\" };\n }\n\n // Custom disable rule\n if (isDateDisabled && isDateDisabled(jalaliDate)) {\n return { isValid: false, date: jalaliDate, error: \"DISABLED_DATE\" };\n }\n\n return { isValid: true, date: jalaliDate };\n}\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { MaskedDateInputProps, DateValidationError } from \"./types\";\nimport { applyDateMask, parseAndValidateJalaliString } from \"./mask-utils\";\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\nimport type { JalaliDate } from \"../../core/types\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\n\nexport const MaskedDateInput: React.FC<MaskedDateInputProps> = ({\n value,\n defaultValue = null,\n onChange,\n onValidationError,\n digitType = \"persian\",\n minDate,\n maxDate,\n isDateDisabled,\n clearable = true,\n placeholder = \"۱۴۰۵/۰۱/۱۵\",\n disabled = false,\n direction = \"rtl\",\n wrapperClassName,\n wrapperStyle,\n clearButtonClassName,\n clearButtonStyle,\n style,\n ...restProps\n}) => {\n const { theme } = useTheme();\n const [internalValue, setInternalValue] = useState<JalaliDate | null>(\n defaultValue,\n );\n const activeDate = value !== undefined ? value : internalValue;\n\n const [text, setText] = useState<string>(() => {\n return activeDate\n ? formatJalaliDate(activeDate, \"YYYY/MM/DD\", { digitType })\n : \"\";\n });\n\n const [hasError, setHasError] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Sync text input with incoming controlled value updates\n useEffect(() => {\n if (value !== undefined) {\n setText(\n value ? formatJalaliDate(value, \"YYYY/MM/DD\", { digitType }) : \"\",\n );\n setHasError(false);\n }\n }, [value, digitType]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawVal = e.target.value;\n const maskedVal = applyDateMask(rawVal, digitType);\n setText(maskedVal);\n\n // Validate only if complete date is typed (10 chars: YYYY/MM/DD) or empty\n if (maskedVal.length === 10 || maskedVal.length === 0) {\n const result = parseAndValidateJalaliString(\n maskedVal,\n minDate,\n maxDate,\n isDateDisabled,\n );\n\n if (result.isValid) {\n setHasError(false);\n onValidationError?.(null);\n if (value === undefined) {\n setInternalValue(result.date);\n }\n onChange?.(result.date);\n } else {\n setHasError(true);\n onValidationError?.(result.error as DateValidationError);\n }\n } else {\n // Incomplete state\n setHasError(false);\n onValidationError?.(null);\n }\n };\n\n const handleClear = useCallback(() => {\n setText(\"\");\n setHasError(false);\n onValidationError?.(null);\n if (value === undefined) {\n setInternalValue(null);\n }\n onChange?.(null);\n inputRef.current?.focus();\n }, [value, onChange, onValidationError]);\n\n return (\n <div\n dir={direction}\n className={wrapperClassName}\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n ...wrapperStyle,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n disabled={disabled}\n placeholder={digitType === \"persian\" ? placeholder : \"1405/01/15\"}\n value={text}\n onChange={handleInputChange}\n style={{\n width: \"180px\",\n padding: \"8px 12px\",\n paddingInlineEnd: clearable && text ? \"32px\" : \"12px\",\n borderRadius: theme.radii.sm,\n border: `1px solid ${hasError ? theme.colors.holiday : theme.colors.border}`,\n backgroundColor: theme.colors.background,\n color: theme.colors.textPrimary,\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n outlineColor: theme.colors.primary,\n textAlign: \"center\",\n letterSpacing: \"1px\",\n transition: \"border-color 0.15s ease\",\n ...style,\n }}\n {...restProps}\n />\n\n {/* Clear Button */}\n {clearable && text && !disabled && (\n <button\n type=\"button\"\n aria-label=\"پاک کردن\"\n onClick={handleClear}\n className={clearButtonClassName}\n style={{\n position: \"absolute\",\n insetInlineEnd: \"8px\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: theme.colors.textSecondary,\n fontSize: \"14px\",\n lineHeight: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2px\",\n ...clearButtonStyle,\n }}\n >\n ✕\n </button>\n )}\n </div>\n );\n};\n","import type { JalaliDate } from \"../core/types\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { CalendarEvent } from \"./types\";\n\n/**\n * Filters and returns all events matching a specific Jalali date.\n */\nexport function getEventsForDate(\n date: JalaliDate,\n events?: CalendarEvent[],\n): CalendarEvent[] {\n if (!events || events.length === 0) return [];\n return events.filter((e) => isSameJalaliDay(e.date, date));\n}\n","import type { JalaliDate } from \"../core/types\";\nimport type { OfficialHoliday, CustomHolidayRule } from \"./types\";\nimport { jalaliToGregorian } from \"../core/jalali-math\";\n\n/**\n * Fixed Solar Calendar Holidays in Iran:\n * Key format: `${monthIndex}-${day}` (Month index is 0-based: 0 = Farvardin, 11 = Esfand)\n */\nconst FIXED_SOLAR_HOLIDAYS: Record<string, string> = {\n \"0-1\": \"جشن نوروز / سال نو\",\n \"0-2\": \"عید نوروز\",\n \"0-3\": \"عید نوروز\",\n \"0-4\": \"عید نوروز\",\n \"0-12\": \"روز جمهوری اسلامی ایران\",\n \"0-13\": \"روز طبیعت (سیزده‌بدر)\",\n \"2-14\": \"رحلت امام خمینی\",\n \"2-15\": \"قیام ۱۵ خرداد\",\n \"10-22\": \"پیروزی انقلاب اسلامی\",\n \"11-29\": \"روز ملی شدن صنعت نفت\",\n};\n\n/**\n * Checks if a given Jalali date is Friday (جمعه).\n */\nexport function isJalaliFriday(date: JalaliDate): boolean {\n const g = jalaliToGregorian(date.year, date.month, date.day);\n return g.getDay() === 5; // In JS Date.getDay(), 5 represents Friday\n}\n\n/**\n * Resolves holiday info for a JalaliDate based purely on solar calendar rules and custom overrides.\n */\nexport function getOfficialHoliday(\n date: JalaliDate,\n customHolidays?: CustomHolidayRule[],\n): OfficialHoliday | null {\n // 1. Check Custom User-Defined Holidays\n if (customHolidays && customHolidays.length > 0) {\n const custom = customHolidays.find(\n (h) =>\n h.date.year === date.year &&\n h.date.month === date.month &&\n h.date.day === date.day,\n );\n if (custom) {\n return {\n title: custom.title,\n type: \"custom\",\n isOff: custom.isOff ?? true,\n };\n }\n }\n\n // 2. Check Fixed Solar Holidays (O(1) Hash Map Lookup)\n const solarKey = `${date.month}-${date.day}`;\n if (FIXED_SOLAR_HOLIDAYS[solarKey]) {\n return {\n title: FIXED_SOLAR_HOLIDAYS[solarKey],\n type: \"solar\",\n isOff: true,\n };\n }\n\n // 3. Check Friday (End of Week)\n if (isJalaliFriday(date)) {\n return { title: \"جمعه (تعطیل پایان هفته)\", type: \"solar\", isOff: true };\n }\n\n return null;\n}\n","// src/components/JalaliDatePicker.tsx\nimport React, {\n useState,\n useRef,\n useCallback,\n useMemo,\n useEffect,\n} from \"react\";\nimport { useJalaliDatePicker } from \"../hooks/useJalaliDatePicker\";\nimport { useCalendarKeyboard } from \"../a11y/useCalendarKeyboard\";\nimport type {\n SelectionMode,\n JalaliDateRange,\n InternalSelectedValue,\n SelectedDateValue,\n DateRange,\n} from \"../hooks/types\";\nimport { Header } from \"./Header\";\nimport { Weekdays } from \"./Weekdays\";\nimport { DayCell } from \"./DayCell\";\nimport { MonthYearPicker } from \"./MonthYearPicker\";\nimport type {\n JalaliDate,\n JalaliMonthIndex,\n JalaliCalendarCell,\n} from \"../core/types\";\nimport { formatJalaliDate } from \"../formatters/jalali-formatter\";\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\nimport { toPersianDigits } from \"../formatters/persian-digits\";\nimport { CalendarFooter } from \"./footer/CalendarFooter\";\nimport { TimePicker } from \"../plugins/time-picker/TimePicker\";\nimport type { JalaliTime } from \"../plugins/time-picker/types\";\nimport {\n formatTimeString,\n getCurrentTime,\n} from \"../plugins/time-picker/time-utils\";\nimport { MaskedDateInput } from \"./masked-input/MaskedDateInput\";\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\nimport {\n isJalaliDateBetween,\n jsDateToJalali,\n jalaliToJsDate,\n} from \"../core/jalali-helpers\";\nimport { isSameJalaliDay } from \"../core/jalali-math\";\nimport type { CalendarEvent } from \"../events/types\";\nimport { getEventsForDate } from \"../events/event-utils\";\nimport { getOfficialHoliday } from \"../holidays\";\nimport type { CustomHolidayRule } from \"../holidays/types\";\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\n\nexport interface JalaliDatePickerProps<M extends SelectionMode = \"single\"> {\n mode?: M;\n value?: SelectedDateValue<M>;\n defaultValue?: SelectedDateValue<M>;\n onChange?: (val: SelectedDateValue<M>) => void;\n minDate?: Date;\n maxDate?: Date;\n isDateDisabled?: (date: Date) => boolean;\n digitType?: \"persian\" | \"latin\";\n variant?: \"inline\" | \"popover\" | \"modal\";\n placeholder?: string;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n className?: string;\n style?: React.CSSProperties;\n classNames?: DatePickerClassNames;\n styles?: DatePickerStyles;\n showFooter?: boolean;\n showStatusText?: boolean;\n allowClear?: boolean;\n enableTime?: boolean;\n timeValue?: JalaliTime | null;\n defaultTimeValue?: JalaliTime;\n onTimeChange?: (time: JalaliTime) => void;\n minuteStep?: number;\n hourStep?: number;\n showSeconds?: boolean;\n numberOfMonths?: 1 | 2;\n useMaskedInput?: boolean;\n events?: CalendarEvent[];\n showHolidays?: boolean;\n customHolidays?: CustomHolidayRule[];\n}\n\nexport function JalaliDatePicker<M extends SelectionMode = \"single\">({\n mode = \"single\" as M,\n value,\n defaultValue,\n onChange,\n minDate,\n maxDate,\n isDateDisabled,\n firstDayOfWeek = 0,\n variant = \"popover\",\n placeholder = \"YYYY/MM/DD\",\n digitType = \"persian\",\n className,\n style,\n classNames,\n styles,\n showFooter = true,\n showStatusText = true,\n allowClear = true,\n enableTime = false,\n timeValue,\n defaultTimeValue,\n onTimeChange,\n minuteStep = 1,\n hourStep = 1,\n showSeconds = false,\n numberOfMonths = 1,\n useMaskedInput = false,\n events,\n showHolidays = false,\n customHolidays,\n}: JalaliDatePickerProps<M>) {\n const [isOpen, setIsOpen] = useState(variant === \"inline\");\n const [showMonthYearPicker, setShowMonthYearPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const isModal = variant === \"modal\";\n\n // استخراج مقدار اولیه ساعت و دقیقه\n const initialTime = useMemo<JalaliTime>(() => {\n if (defaultTimeValue) return defaultTimeValue;\n if (value instanceof Date) {\n return {\n hour: value.getHours(),\n minute: value.getMinutes(),\n second: value.getSeconds(),\n };\n }\n if (defaultValue instanceof Date) {\n return {\n hour: defaultValue.getHours(),\n minute: defaultValue.getMinutes(),\n second: defaultValue.getSeconds(),\n };\n }\n return getCurrentTime();\n }, [defaultTimeValue, value, defaultValue]);\n\n const [internalTime, setInternalTime] = useState<JalaliTime>(initialTime);\n const activeTime =\n timeValue !== undefined ? (timeValue ?? getCurrentTime()) : internalTime;\n\n // بستن پاپ‌اور هنگام کلیک خارج از محدوده\n useEffect(() => {\n if (variant === \"inline\" || !isOpen) return;\n\n const handleClickOutside = (e: MouseEvent | TouchEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n setShowMonthYearPicker(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"touchstart\", handleClickOutside);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"touchstart\", handleClickOutside);\n };\n }, [variant, isOpen]);\n\n // تبدیل Date به فرمت محاسباتی تقویم جلالی\n const internalJalaliValue = useMemo<\n InternalSelectedValue<M> | undefined\n >(() => {\n if (value === undefined) return undefined;\n if (!value) return null as InternalSelectedValue<M>;\n if (value instanceof Date) {\n return jsDateToJalali(value) as InternalSelectedValue<M>;\n }\n if (Array.isArray(value)) {\n if (mode === \"range\") {\n const [start, end] = value as DateRange;\n return [\n start ? jsDateToJalali(start) : null,\n end ? jsDateToJalali(end) : null,\n ] as InternalSelectedValue<M>;\n }\n if (mode === \"multiple\") {\n return (value as Date[]).map((d) =>\n jsDateToJalali(d),\n ) as InternalSelectedValue<M>;\n }\n }\n return null as InternalSelectedValue<M>;\n }, [value, mode]);\n\n const internalDefaultJalaliValue = useMemo<\n InternalSelectedValue<M> | undefined\n >(() => {\n if (defaultValue === undefined) return undefined;\n if (!defaultValue) return null as InternalSelectedValue<M>;\n if (defaultValue instanceof Date) {\n return jsDateToJalali(defaultValue) as InternalSelectedValue<M>;\n }\n if (Array.isArray(defaultValue)) {\n if (mode === \"range\") {\n const [start, end] = defaultValue as DateRange;\n return [\n start ? jsDateToJalali(start) : null,\n end ? jsDateToJalali(end) : null,\n ] as InternalSelectedValue<M>;\n }\n if (mode === \"multiple\") {\n return (defaultValue as Date[]).map((d) =>\n jsDateToJalali(d),\n ) as InternalSelectedValue<M>;\n }\n }\n return null as InternalSelectedValue<M>;\n }, [defaultValue, mode]);\n\n const internalMinDate = useMemo(\n () => (minDate ? jsDateToJalali(minDate) : undefined),\n [minDate],\n );\n const internalMaxDate = useMemo(\n () => (maxDate ? jsDateToJalali(maxDate) : undefined),\n [maxDate],\n );\n\n // تبدیل خروجی به آبجکت Date واقعی به همراه زمان انتخابی\n const convertJalaliToDateOutput = useCallback(\n (\n jVal: InternalSelectedValue<M>,\n specificTime?: JalaliTime,\n ): SelectedDateValue<M> => {\n if (!jVal) return null as SelectedDateValue<M>;\n\n const t = specificTime ?? activeTime;\n const h = enableTime ? t.hour : 0;\n const m = enableTime ? t.minute : 0;\n const s = enableTime && showSeconds ? (t.second ?? 0) : 0;\n\n if (mode === \"single\" && !Array.isArray(jVal)) {\n return jalaliToJsDate(\n jVal as JalaliDate,\n h,\n m,\n s,\n ) as SelectedDateValue<M>;\n }\n\n if (mode === \"range\" && Array.isArray(jVal)) {\n const [start, end] = jVal as JalaliDateRange;\n return [\n start ? jalaliToJsDate(start, 0, 0, 0) : null,\n end ? jalaliToJsDate(end, 23, 59, 59) : null,\n ] as SelectedDateValue<M>;\n }\n\n if (mode === \"multiple\" && Array.isArray(jVal)) {\n return (jVal as JalaliDate[]).map((d) =>\n jalaliToJsDate(d, h, m, s),\n ) as SelectedDateValue<M>;\n }\n\n return null as SelectedDateValue<M>;\n },\n [mode, enableTime, activeTime, showSeconds],\n );\n\n const {\n selected,\n viewYear,\n viewMonth,\n grid,\n goToPrevMonth,\n goToNextMonth,\n setView,\n goToToday,\n selectDate,\n setHoverDate,\n hoverDate,\n clear,\n } = useJalaliDatePicker({\n mode,\n value: internalJalaliValue,\n defaultValue: internalDefaultJalaliValue,\n minDate: internalMinDate,\n maxDate: internalMaxDate,\n firstDayOfWeek,\n isDateDisabled: isDateDisabled\n ? (jDate: JalaliDate) => isDateDisabled(jalaliToJsDate(jDate))\n : undefined,\n onChange: (val) => {\n onChange?.(convertJalaliToDateOutput(val));\n },\n });\n\n // تغییر زمان و انتشار Date جدید با ساعت به‌روز\n const handleTimeChange = useCallback(\n (newTime: JalaliTime) => {\n if (timeValue === undefined) setInternalTime(newTime);\n onTimeChange?.(newTime);\n\n if (selected && onChange) {\n onChange(convertJalaliToDateOutput(selected, newTime));\n }\n },\n [timeValue, onTimeChange, selected, onChange, convertJalaliToDateOutput],\n );\n\n const singleSelectedDate =\n mode === \"single\" ? (selected as JalaliDate | null) : null;\n\n const handleDateSelect = (d: JalaliDate) => {\n selectDate(d);\n if (variant === \"popover\" && mode === \"single\" && !enableTime) {\n setIsOpen(false);\n }\n };\n\n const handleClearClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n clear();\n };\n\n const { handleKeyDown, getCellTabIndex, setFocusedDate } =\n useCalendarKeyboard({\n viewYear,\n viewMonth,\n selectedDate: singleSelectedDate,\n onSelectDate: handleDateSelect,\n onViewChange: setView,\n isRtl: true,\n });\n\n // پشتیبانی از کلید Escape در حالت مودال\n useEffect(() => {\n if (!isModal || !isOpen) return;\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n\n window.addEventListener(\"keydown\", handleGlobalKeyDown);\n return () => {\n document.body.style.overflow = originalOverflow;\n window.removeEventListener(\"keydown\", handleGlobalKeyDown);\n };\n }, [isModal, isOpen]);\n\n const nextMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewMonth === 11) return { year: viewYear + 1, month: 0 };\n return { year: viewYear, month: (viewMonth + 1) as JalaliMonthIndex };\n }, [viewYear, viewMonth]);\n\n const secondGrid = useMemo<JalaliCalendarCell[]>(() => {\n if (numberOfMonths !== 2) return [];\n\n const rawGrid = generateJalaliCalendarGrid({\n year: nextMonthState.year,\n month: nextMonthState.month,\n firstDayOfWeek,\n minDate: internalMinDate,\n maxDate: internalMaxDate,\n });\n\n if (mode !== \"range\") return rawGrid;\n\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n }, [\n numberOfMonths,\n nextMonthState,\n firstDayOfWeek,\n internalMinDate,\n internalMaxDate,\n mode,\n selected,\n hoverDate,\n ]);\n\n const formattedInputValue = useMemo(() => {\n if (!selected) return \"\";\n if (mode === \"single\") {\n const datePart = formatJalaliDate(selected as JalaliDate, \"YYYY/MM/DD\", {\n digitType,\n });\n if (enableTime && activeTime) {\n const timePart = formatTimeString(activeTime, showSeconds, digitType);\n return `${datePart} ${timePart}`;\n }\n return datePart;\n }\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n if (start && end) {\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ${formatJalaliDate(end, \"YYYY/MM/DD\", { digitType })}`;\n }\n if (start)\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ...`;\n }\n if (mode === \"multiple\" && Array.isArray(selected)) {\n return `${toPersianDigits((selected as JalaliDate[]).length)} تاریخ انتخاب شده`;\n }\n return \"\";\n }, [selected, mode, digitType, enableTime, activeTime, showSeconds]);\n\n const hasValue = Boolean(\n mode === \"single\"\n ? selected\n : mode === \"range\"\n ? (selected as JalaliDateRange)?.[0]\n : (selected as JalaliDate[])?.length,\n );\n\n const renderCalendarPane = (\n y: number,\n m: JalaliMonthIndex,\n paneGrid: JalaliCalendarCell[],\n showPrevArrow = true,\n showNextArrow = true,\n ) => (\n <div\n style={{\n width: \"calc(7 * var(--pdp-cell-size, 34px) + 6 * 4px)\",\n flexShrink: 0,\n }}\n >\n <Header\n year={y}\n monthName={PERSIAN_MONTH_NAMES[m]}\n onPrevMonth={showPrevArrow ? goToPrevMonth : () => {}}\n onNextMonth={showNextArrow ? goToNextMonth : () => {}}\n onTitleClick={() => setShowMonthYearPicker((prev) => !prev)}\n isPickerOpen={showMonthYearPicker}\n classNames={classNames}\n styles={styles}\n />\n\n <Weekdays\n firstDayOfWeek={firstDayOfWeek}\n classNames={classNames}\n styles={styles}\n />\n\n <div\n role=\"grid\"\n aria-label={`${PERSIAN_MONTH_NAMES[m]} ${toPersianDigits(y)}`}\n className={classNames?.grid}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 34px))\",\n gap: \"4px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n ...styles?.grid,\n }}\n >\n {paneGrid.map((cell, index) => {\n const holidayInfo = showHolidays\n ? getOfficialHoliday(cell.jalali, customHolidays)\n : null;\n const dayEvents = getEventsForDate(cell.jalali, events);\n\n return (\n <DayCell\n key={index}\n cell={cell}\n digitType={digitType}\n isHoliday={Boolean(holidayInfo)}\n holidayTitle={holidayInfo?.title}\n events={dayEvents}\n classNames={classNames}\n styles={styles}\n tabIndex={getCellTabIndex(cell.jalali)}\n onSelect={handleDateSelect}\n onHover={setHoverDate}\n onFocus={setFocusedDate}\n />\n );\n })}\n </div>\n </div>\n );\n\n const calendarContent = (\n <div\n role={isModal ? \"dialog\" : \"region\"}\n aria-modal={isModal ? true : undefined}\n aria-label=\"تقویم شمسی\"\n onKeyDown={handleKeyDown}\n onClick={(e) => isModal && e.stopPropagation()}\n className={classNames?.calendar}\n style={{\n position:\n variant === \"popover\" ? \"absolute\" : isModal ? \"relative\" : \"static\",\n top: variant === \"popover\" ? \"calc(100% + 4px)\" : undefined,\n left: variant === \"popover\" ? 0 : undefined,\n zIndex: isModal ? 1001 : 1000,\n padding: \"12px\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n borderRadius: \"var(--pdp-border-radius, 12px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n boxShadow: isModal\n ? \"0 20px 25px -5px rgb(0 0 0 / 0.3)\"\n : \"var(--pdp-shadow, 0 10px 15px -3px rgba(0, 0, 0, 0.1))\",\n width: \"max-content\",\n userSelect: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n direction: \"rtl\",\n boxSizing: \"border-box\",\n ...styles?.calendar,\n }}\n >\n {showMonthYearPicker ? (\n <MonthYearPicker\n currentYear={viewYear}\n currentMonth={viewMonth}\n onSelectMonth={(m) => {\n setView(viewYear, m);\n setShowMonthYearPicker(false);\n }}\n onSelectYear={(y) => setView(y, viewMonth)}\n classNames={classNames}\n styles={styles}\n />\n ) : (\n <>\n {/* Dual Calendar: همواره کنار هم بدون Wrap شدن */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n flexWrap: \"nowrap\",\n gap: \"20px\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n }}\n >\n {renderCalendarPane(\n viewYear,\n viewMonth,\n grid,\n true,\n numberOfMonths === 1,\n )}\n\n {numberOfMonths === 2 && (\n <>\n <div\n style={{\n width: \"1px\",\n alignSelf: \"stretch\",\n backgroundColor: \"var(--pdp-surface-border, #e2e8f0)\",\n margin: \"0 2px\",\n }}\n />\n {renderCalendarPane(\n nextMonthState.year,\n nextMonthState.month,\n secondGrid,\n false,\n true,\n )}\n </>\n )}\n </div>\n\n {enableTime && (\n <TimePicker\n value={activeTime}\n onChange={handleTimeChange}\n minuteStep={minuteStep}\n hourStep={hourStep}\n showSeconds={showSeconds}\n digitType={digitType}\n classNames={classNames}\n styles={styles}\n />\n )}\n\n {showFooter && (\n <CalendarFooter\n mode={mode}\n digitType={digitType}\n showStatusText={showStatusText}\n selectedDate={\n mode === \"single\" ? (selected as JalaliDate | null) : null\n }\n selectedRange={\n mode === \"range\" ? (selected as JalaliDateRange) : undefined\n }\n selectedDates={\n mode === \"multiple\" ? (selected as JalaliDate[]) : undefined\n }\n selectedTime={enableTime ? activeTime : undefined}\n onToday={goToToday}\n classNames={classNames}\n styles={styles}\n />\n )}\n </>\n )}\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={className ?? classNames?.root}\n style={{\n position: \"relative\",\n display: \"inline-block\",\n ...style,\n ...styles?.root,\n }}\n >\n {variant !== \"inline\" &&\n (useMaskedInput && mode === \"single\" && variant === \"popover\" ? (\n <MaskedDateInput\n value={singleSelectedDate}\n digitType={digitType}\n placeholder={placeholder}\n onChange={(d) => {\n if (d) {\n selectDate(d);\n setView(d.year, d.month);\n } else {\n clear();\n }\n }}\n onClick={() => setIsOpen(true)}\n className={classNames?.input}\n style={{\n direction: \"ltr\",\n textAlign: \"left\",\n ...styles?.input,\n }}\n />\n ) : (\n <div\n onClick={() => setIsOpen((prev) => !prev)}\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n cursor: \"pointer\",\n direction: \"ltr\",\n width: \"100%\",\n }}\n >\n <input\n type=\"text\"\n readOnly\n placeholder={placeholder}\n value={formattedInputValue}\n className={classNames?.input}\n style={{\n direction: \"ltr\",\n textAlign: \"left\",\n padding: \"8px 30px 8px 12px\",\n borderRadius: \"var(--pdp-border-radius, 8px)\",\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\n color: \"var(--pdp-text-primary, #0f172a)\",\n cursor: \"pointer\",\n fontSize: \"13.5px\",\n minWidth: enableTime ? \"190px\" : \"150px\",\n width: \"100%\",\n boxSizing: \"border-box\",\n ...styles?.input,\n }}\n />\n\n {/* دکمه پاک کردن */}\n {allowClear && hasValue && (\n <button\n type=\"button\"\n onClick={handleClearClick}\n aria-label=\"Clear value\"\n style={{\n position: \"absolute\",\n right: \"8px\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--pdp-text-muted, #94a3b8)\",\n padding: \"2px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"14px\",\n fontWeight: 700,\n lineHeight: 1,\n borderRadius: \"50%\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color =\n \"var(--pdp-holiday-color, #e11d48)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color =\n \"var(--pdp-text-muted, #94a3b8)\";\n }}\n >\n ✕\n </button>\n )}\n </div>\n ))}\n\n {isOpen &&\n (isModal ? (\n <div\n role=\"presentation\"\n onClick={() => setIsOpen(false)}\n className={classNames?.modalBackdrop}\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(15, 23, 42, 0.6)\",\n backdropFilter: \"blur(4px)\",\n zIndex: 1000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n direction: \"rtl\",\n ...styles?.modalBackdrop,\n }}\n >\n {calendarContent}\n </div>\n ) : (\n calendarContent\n ))}\n </div>\n );\n}\n","export function mergeClassNames(\n ...classNames: Array<string | null | undefined | false>\n): string | undefined {\n const merged = classNames.filter(Boolean).join(\" \");\n return merged || undefined;\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport type { DualMonthCalendarProps } from \"./types\";\nimport type {\n JalaliDate,\n JalaliMonthIndex,\n JalaliCalendarCell,\n} from \"../../core/types\";\nimport type { JalaliDateRange } from \"../../hooks/types\";\nimport { getTodayJalali, isSameJalaliDay } from \"../../core/jalali-math\";\nimport { generateJalaliCalendarGrid } from \"../../core/calendar-grid\";\nimport {\n compareJalaliDates,\n isJalaliDateBetween,\n} from \"../../core/jalali-helpers\";\nimport { PERSIAN_MONTH_NAMES } from \"../../core/constants\";\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\nimport { Weekdays } from \"../Weekdays\";\nimport { DayCell } from \"../DayCell\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { mergeClassNames } from \"../../theme/style-utils\";\n\nexport const DualMonthCalendar: React.FC<DualMonthCalendarProps> = ({\n value,\n defaultValue = [null, null],\n onChange,\n initialViewDate,\n firstDayOfWeek = 0,\n digitType = \"persian\",\n minDate,\n maxDate,\n isDateDisabled,\n direction = \"rtl\",\n className,\n style,\n classNames,\n styles,\n}) => {\n const { theme } = useTheme();\n // 1. Selection State (Controlled vs Uncontrolled)\n const [internalRange, setInternalRange] =\n useState<JalaliDateRange>(defaultValue);\n const activeRange = value !== undefined ? value : internalRange;\n\n // 2. Hover state for range preview\n const [hoveredDate, setHoveredDate] = useState<JalaliDate | null>(null);\n const formatNumber = (value: number) =>\n digitType === \"persian\" ? toPersianDigits(value) : String(value);\n\n // 3. View state for First Month (Left)\n const today = useMemo(() => getTodayJalali(), []);\n const [viewState, setViewState] = useState<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (initialViewDate) return initialViewDate;\n if (activeRange[0])\n return { year: activeRange[0].year, month: activeRange[0].month };\n return { year: today.year, month: today.month };\n });\n\n // Calculate Second Month (Right)\n const nextMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewState.month === 11) {\n return { year: viewState.year + 1, month: 0 };\n }\n return {\n year: viewState.year,\n month: (viewState.month + 1) as JalaliMonthIndex,\n };\n }, [viewState]);\n\n // 4. Synchronized Navigation (moves both months together)\n const handlePrevMonth = () => {\n setViewState((prev) => {\n if (prev.month === 0) return { year: prev.year - 1, month: 11 };\n return { year: prev.year, month: (prev.month - 1) as JalaliMonthIndex };\n });\n };\n\n const handleNextMonth = () => {\n setViewState((prev) => {\n if (prev.month === 11) return { year: prev.year + 1, month: 0 };\n return { year: prev.year, month: (prev.month + 1) as JalaliMonthIndex };\n });\n };\n\n // 5. Date Selection Handler\n const handleDateSelect = useCallback(\n (target: JalaliDate) => {\n const [start, end] = activeRange;\n let newRange: JalaliDateRange;\n\n if (!start || (start && end)) {\n newRange = [target, null];\n } else {\n if (compareJalaliDates(target, start) < 0) {\n newRange = [target, start];\n } else {\n newRange = [start, target];\n }\n setHoveredDate(null);\n }\n\n if (value === undefined) {\n setInternalRange(newRange);\n }\n onChange?.(newRange);\n },\n [activeRange, value, onChange],\n );\n\n // 6. Enrich cells with cross-month range metadata\n const enrichGridCells = useCallback(\n (year: number, month: JalaliMonthIndex): JalaliCalendarCell[] => {\n const rawGrid = generateJalaliCalendarGrid({\n year,\n month,\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n });\n\n const [start, end] = activeRange;\n const effectiveEnd = end ?? (start && hoveredDate ? hoveredDate : null);\n\n return rawGrid.map((cell) => {\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\n const isEnd = effectiveEnd\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\n : false;\n let inRange = false;\n\n if (start && effectiveEnd) {\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\n }\n\n return {\n ...cell,\n isSelected: isStart || isEnd,\n isInRange: inRange,\n isRangeStart: isStart,\n isRangeEnd: isEnd,\n };\n });\n },\n [\n firstDayOfWeek,\n minDate,\n maxDate,\n isDateDisabled,\n activeRange,\n hoveredDate,\n ],\n );\n\n const leftGrid = useMemo(\n () => enrichGridCells(viewState.year, viewState.month),\n [enrichGridCells, viewState.year, viewState.month],\n );\n\n const rightGrid = useMemo(\n () => enrichGridCells(nextMonthState.year, nextMonthState.month),\n [enrichGridCells, nextMonthState.year, nextMonthState.month],\n );\n\n const renderMonthPane = (\n year: number,\n month: JalaliMonthIndex,\n grid: JalaliCalendarCell[],\n isLeftPane: boolean,\n ) => (\n <div\n dir={direction}\n className={classNames?.calendarPane}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n width: \"var(--pdp-calendar-pane-width, 276px)\",\n minWidth: \"var(--pdp-calendar-pane-width, 276px)\",\n ...styles?.calendarPane,\n }}\n >\n {/* Pane Header */}\n <div\n className={classNames?.header}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 4px\",\n height: \"32px\",\n ...styles?.header,\n }}\n >\n {isLeftPane ? (\n <button\n type=\"button\"\n aria-label=\"ماه قبل\"\n onClick={handlePrevMonth}\n className={classNames?.navButton}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.background,\n color: theme.colors.textPrimary,\n cursor: \"pointer\",\n ...styles?.navButton,\n }}\n >\n {direction === \"rtl\" ? \"›\" : \"‹\"}\n </button>\n ) : (\n <div style={{ width: \"28px\" }} />\n )}\n\n <div\n style={{\n fontWeight: 600,\n fontSize: \"14px\",\n color: theme.colors.textPrimary,\n }}\n >\n {PERSIAN_MONTH_NAMES[month]} {formatNumber(year)}\n </div>\n\n {!isLeftPane ? (\n <button\n type=\"button\"\n aria-label=\"ماه بعد\"\n onClick={handleNextMonth}\n className={classNames?.navButton}\n style={{\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"6px\",\n border: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.background,\n color: theme.colors.textPrimary,\n cursor: \"pointer\",\n ...styles?.navButton,\n }}\n >\n {direction === \"rtl\" ? \"‹\" : \"›\"}\n </button>\n ) : (\n <div style={{ width: \"28px\" }} />\n )}\n </div>\n\n <Weekdays\n firstDayOfWeek={firstDayOfWeek}\n classNames={classNames}\n styles={styles}\n />\n\n {/* Grid */}\n <div\n role=\"grid\"\n aria-label={`${PERSIAN_MONTH_NAMES[month]} ${formatNumber(year)}`}\n dir={direction}\n className={classNames?.grid}\n style={{\n display: \"grid\",\n width: \"var(--pdp-calendar-pane-width, 276px)\",\n gridTemplateColumns: \"repeat(7, var(--pdp-cell-size, 36px))\",\n gap: \"var(--pdp-cell-gap, 4px)\",\n ...styles?.grid,\n }}\n >\n {grid.map((cell) => (\n <DayCell\n key={`${cell.jalali.year}-${cell.jalali.month}-${cell.jalali.day}`}\n cell={cell}\n digitType={digitType}\n classNames={classNames}\n styles={styles}\n tabIndex={0}\n onSelect={handleDateSelect}\n onHover={setHoveredDate}\n />\n ))}\n </div>\n </div>\n );\n\n return (\n <div\n role=\"region\"\n aria-label=\"تقویم دوقلو شمسی\"\n dir={direction}\n className={mergeClassNames(className, classNames?.calendar)}\n style={\n {\n \"--pdp-cell-size\": \"36px\",\n \"--pdp-cell-gap\": \"4px\",\n \"--pdp-calendar-pane-width\": \"276px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"24px\",\n padding: \"16px\",\n backgroundColor: theme.colors.background,\n color: theme.colors.textPrimary,\n borderRadius: theme.radii.lg,\n border: `1px solid ${theme.colors.border}`,\n boxShadow: theme.shadows.lg,\n width: \"fit-content\",\n ...style,\n ...styles?.calendar,\n } as React.CSSProperties\n }\n >\n {renderMonthPane(viewState.year, viewState.month, leftGrid, true)}\n <div\n className={classNames?.paneDivider}\n style={{\n width: \"1px\",\n backgroundColor: theme.colors.border,\n ...styles?.paneDivider,\n }}\n />\n {renderMonthPane(\n nextMonthState.year,\n nextMonthState.month,\n rightGrid,\n false,\n )}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/constants.ts","../src/core/jalali-math.ts","../src/core/calendar-grid.ts","../src/core/jalali-helpers.ts","../src/core/date-availability.ts","../src/hooks/useJalaliDatePicker.ts","../src/a11y/keyboard-navigation.ts","../src/a11y/aria-helpers.ts","../src/a11y/useCalendarKeyboard.ts","../src/formatters/persian-digits.ts","../src/formatters/jalali-formatter.ts","../src/theme/tokens.ts","../src/theme/ThemeProvider.tsx","../src/theme/style-utils.ts","../src/components/Header.tsx","../src/components/Weekdays.tsx","../src/components/DayCell.tsx","../src/components/MonthYearPicker.tsx","../src/plugins/time-picker/time-utils.ts","../src/components/footer/CalendarFooter.tsx","../src/plugins/time-picker/TimePicker.tsx","../src/components/masked-input/mask-utils.ts","../src/components/masked-input/MaskedDateInput.tsx","../src/events/event-utils.ts","../src/holidays/iran-holidays.ts","../src/components/JalaliDatePicker.tsx","../src/components/dual-calendar/DualMonthCalendar.tsx"],"sourcesContent":["/**\r\n * Persian (Farsi) month names.\r\n */\r\nexport const PERSIAN_MONTH_NAMES = [\r\n \"فروردین\",\r\n \"اردیبهشت\",\r\n \"خرداد\",\r\n \"تیر\",\r\n \"مرداد\",\r\n \"شهریور\",\r\n \"مهر\",\r\n \"آبان\",\r\n \"آذر\",\r\n \"دی\",\r\n \"بهمن\",\r\n \"اسفند\",\r\n] as const;\r\n\r\n/**\r\n * Phonetic English month names for Jalali calendar.\r\n */\r\nexport const JALALI_MONTH_NAMES_EN = [\r\n \"Farvardin\",\r\n \"Ordibehesht\",\r\n \"Khordad\",\r\n \"Tir\",\r\n \"Mordad\",\r\n \"Shahrivar\",\r\n \"Mehr\",\r\n \"Aban\",\r\n \"Azar\",\r\n \"Dey\",\r\n \"Bahman\",\r\n \"Esfand\",\r\n] as const;\r\n\r\n/**\r\n * Persian weekday headers starting from Saturday (شنبه).\r\n */\r\nexport const PERSIAN_WEEK_DAYS_SHORT = [\r\n \"ش\",\r\n \"ی\",\r\n \"د\",\r\n \"س\",\r\n \"چ\",\r\n \"پ\",\r\n \"ج\",\r\n] as const;\r\nexport const PERSIAN_WEEK_DAYS_LONG = [\r\n \"شنبه\",\r\n \"یکشنبه\",\r\n \"دوشنبه\",\r\n \"سه‌شنبه\",\r\n \"چهارشنبه\",\r\n \"پنج‌شنبه\",\r\n \"جمعه\",\r\n] as const;\r\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\r\n\r\n/**\r\n * Determines if a Jalali year is a leap year (کبیسه).\r\n * Uses the Birashk 2820-year cycle algorithm.\r\n */\r\nexport function isJalaliLeapYear(year: number): boolean {\r\n const breaks = [\r\n -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097,\r\n 2192, 2262, 2324, 2394, 2456, 3178,\r\n ];\r\n\r\n let jp = breaks[0];\r\n let jump = 0;\r\n\r\n if (year < jp || year >= breaks[breaks.length - 1]) {\r\n throw new Error(`Jalali year ${year} is outside supported range.`);\r\n }\r\n\r\n for (let i = 1; i < breaks.length; i++) {\r\n const jm = breaks[i];\r\n jump = jm - jp;\r\n if (year < jm) break;\r\n jp = jm;\r\n }\r\n\r\n let n = year - jp;\r\n if (jump - n < 6) n = n - jump + ((jump + 4) / 33) * 33;\r\n let leap = ((n + 1) % 33) - 1;\r\n if (leap === -1) leap = 4;\r\n\r\n return leap % 4 === 0;\r\n}\r\n\r\n/**\r\n * Returns the number of days in a specific Jalali month.\r\n */\r\nexport function getDaysInJalaliMonth(\r\n year: number,\r\n month: JalaliMonthIndex,\r\n): number {\r\n if (month < 0 || month > 11) {\r\n throw new RangeError(\r\n \"Month index must be between 0 (Farvardin) and 11 (Esfand).\",\r\n );\r\n }\r\n // Months 0 to 5 (Farvardin - Shahrivar) have 31 days\r\n if (month <= 5) return 31;\r\n // Months 6 to 10 (Mehr - Bahman) have 30 days\r\n if (month <= 10) return 30;\r\n // Month 11 (Esfand) has 30 in leap years, 29 in regular years\r\n return isJalaliLeapYear(year) ? 30 : 29;\r\n}\r\n\r\n/**\r\n * Converts a Gregorian date (Year, Month, Day) to Jalali date.\r\n */\r\nexport function gregorianToJalali(\r\n gy: number,\r\n gm: number,\r\n gd: number,\r\n): JalaliDate {\r\n const g_d_m = [\r\n 0,\r\n 31,\r\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n ];\r\n let jy: number;\r\n let jm: number;\r\n let jd: number;\r\n\r\n let gy2 = gm > 2 ? gy + 1 : gy;\r\n let days =\r\n 355666 +\r\n 365 * gy +\r\n Math.floor((gy2 + 3) / 4) -\r\n Math.floor((gy2 + 99) / 100) +\r\n Math.floor((gy2 + 399) / 400) +\r\n gd;\r\n\r\n for (let i = 0; i < gm; ++i) days += g_d_m[i];\r\n\r\n jy = -1595 + 33 * Math.floor(days / 12053);\r\n days %= 12053;\r\n\r\n jy += 4 * Math.floor(days / 1461);\r\n days %= 1461;\r\n\r\n if (days > 365) {\r\n jy += Math.floor((days - 1) / 365);\r\n days = (days - 1) % 365;\r\n }\r\n\r\n if (days < 186) {\r\n jm = Math.floor(days / 31);\r\n jd = 1 + (days % 31);\r\n } else {\r\n jm = 6 + Math.floor((days - 186) / 30);\r\n jd = 1 + ((days - 186) % 30);\r\n }\r\n\r\n return { year: jy, month: jm as JalaliMonthIndex, day: jd };\r\n}\r\n\r\n/**\r\n * Converts a Jalali date to a Gregorian Date.\r\n */\r\nexport function jalaliToGregorian(\r\n jy: number,\r\n jm: JalaliMonthIndex,\r\n jd: number,\r\n): Date {\r\n let gy: number;\r\n let gm: number;\r\n let gd: number;\r\n\r\n let jy2 = jy + 1595;\r\n let days =\r\n -355668 +\r\n 365 * jy2 +\r\n Math.floor(jy2 / 33) * 8 +\r\n Math.floor(((jy2 % 33) + 3) / 4) +\r\n jd +\r\n (jm < 6 ? jm * 31 : (jm - 6) * 30 + 186);\r\n\r\n gy = 400 * Math.floor(days / 146097);\r\n days %= 146097;\r\n\r\n if (days > 36524) {\r\n gy += 100 * Math.floor(--days / 36524);\r\n days %= 36524;\r\n if (days >= 365) days++;\r\n }\r\n\r\n gy += 4 * Math.floor(days / 1461);\r\n days %= 1461;\r\n\r\n if (days > 365) {\r\n gy += Math.floor((days - 1) / 365);\r\n days = (days - 1) % 365;\r\n }\r\n\r\n gd = days + 1;\r\n const sal_a = [\r\n 0,\r\n 31,\r\n (gy % 4 === 0 && gy % 100 !== 0) || gy % 400 === 0 ? 29 : 28,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n 31,\r\n 30,\r\n 31,\r\n 30,\r\n 31,\r\n ];\r\n\r\n for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) {\r\n gd -= sal_a[gm];\r\n }\r\n\r\n const result = new Date(gy, gm - 1, gd);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns today's date in Jalali format.\r\n */\r\nexport function getTodayJalali(): JalaliDate {\r\n const now = new Date();\r\n return gregorianToJalali(\r\n now.getFullYear(),\r\n now.getMonth() + 1,\r\n now.getDate(),\r\n );\r\n}\r\n\r\n/**\r\n * Checks if two Jalali dates are identical.\r\n */\r\nexport function isSameJalaliDay(\r\n a?: JalaliDate | null,\r\n b?: JalaliDate | null,\r\n): boolean {\r\n if (!a || !b) return false;\r\n return a.year === b.year && a.month === b.month && a.day === b.day;\r\n}\r\n","import type {\r\n JalaliCalendarCell,\r\n JalaliGridOptions,\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n} from \"./types\";\r\nimport {\r\n jalaliToGregorian,\r\n gregorianToJalali,\r\n getDaysInJalaliMonth,\r\n getTodayJalali,\r\n isSameJalaliDay,\r\n} from \"./jalali-math\";\r\n\r\n/**\r\n * Normalizes input date (Date or JalaliDate) into JalaliDate object.\r\n */\r\nexport function toJalaliDate(input: Date | JalaliDate): JalaliDate {\r\n if (input instanceof Date) {\r\n return gregorianToJalali(\r\n input.getFullYear(),\r\n input.getMonth() + 1,\r\n input.getDate(),\r\n );\r\n }\r\n return input;\r\n}\r\n\r\n/**\r\n * Generates a 42-cell (6 rows x 7 columns) matrix for a given Jalali month.\r\n */\r\nexport function generateJalaliCalendarGrid(\r\n options: JalaliGridOptions,\r\n): JalaliCalendarCell[] {\r\n const {\r\n year,\r\n month,\r\n firstDayOfWeek = 0, // 0 = Saturday (شنبه)\r\n selectedDate,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n } = options;\r\n\r\n const cells: JalaliCalendarCell[] = [];\r\n const todayJalali = getTodayJalali();\r\n const activeSelected = selectedDate ? toJalaliDate(selectedDate) : null;\r\n const minJalali = minDate ? toJalaliDate(minDate) : null;\r\n const maxJalali = maxDate ? toJalaliDate(maxDate) : null;\r\n\r\n // Convert Jalali 1st of month to Gregorian to read weekday\r\n const firstDayGregorian = jalaliToGregorian(year, month, 1);\r\n\r\n // JS getDay(): 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat\r\n // Map standard JS getDay() to Jalali index: 6(Sat)->0, 0(Sun)->1, ..., 5(Fri)->6\r\n const jsDay = firstDayGregorian.getDay();\r\n const rawJalaliWeekDay = (jsDay + 1) % 7;\r\n\r\n const leadingPaddingCount = (rawJalaliWeekDay - firstDayOfWeek + 7) % 7;\r\n\r\n // 1. Previous month trailing days\r\n const prevMonth = (month === 0 ? 11 : month - 1) as JalaliMonthIndex;\r\n const prevYear = month === 0 ? year - 1 : year;\r\n const daysInPrevMonth = getDaysInJalaliMonth(prevYear, prevMonth);\r\n\r\n for (let i = leadingPaddingCount - 1; i >= 0; i--) {\r\n const day = daysInPrevMonth - i;\r\n const jDate: JalaliDate = { year: prevYear, month: prevMonth, day };\r\n cells.push(buildCell(jDate, false));\r\n }\r\n\r\n // 2. Current month days\r\n const totalDays = getDaysInJalaliMonth(year, month);\r\n for (let d = 1; d <= totalDays; d++) {\r\n const jDate: JalaliDate = { year, month, day: d };\r\n cells.push(buildCell(jDate, true));\r\n }\r\n\r\n // 3. Next month leading days (completing 42 cells)\r\n const nextMonth = (month === 11 ? 0 : month + 1) as JalaliMonthIndex;\r\n const nextYear = month === 11 ? year + 1 : year;\r\n const trailingPaddingCount = 42 - cells.length;\r\n\r\n for (let d = 1; d <= trailingPaddingCount; d++) {\r\n const jDate: JalaliDate = { year: nextYear, month: nextMonth, day: d };\r\n cells.push(buildCell(jDate, false));\r\n }\r\n\r\n function buildCell(\r\n jDate: JalaliDate,\r\n isCurrentMonth: boolean,\r\n ): JalaliCalendarCell {\r\n const gregDate = jalaliToGregorian(jDate.year, jDate.month, jDate.day);\r\n const isToday = isSameJalaliDay(jDate, todayJalali);\r\n const isSelected = activeSelected\r\n ? isSameJalaliDay(jDate, activeSelected)\r\n : false;\r\n\r\n let isDisabled = false;\r\n if (minJalali) {\r\n const minG = jalaliToGregorian(\r\n minJalali.year,\r\n minJalali.month,\r\n minJalali.day,\r\n );\r\n if (gregDate.getTime() < minG.getTime()) isDisabled = true;\r\n }\r\n if (maxJalali) {\r\n const maxG = jalaliToGregorian(\r\n maxJalali.year,\r\n maxJalali.month,\r\n maxJalali.day,\r\n );\r\n if (gregDate.getTime() > maxG.getTime()) isDisabled = true;\r\n }\r\n if (isDateDisabled && isDateDisabled(jDate, gregDate)) {\r\n isDisabled = true;\r\n }\r\n\r\n return {\r\n jalali: jDate,\r\n gregorianDate: gregDate,\r\n dayNumber: jDate.day,\r\n isCurrentMonth,\r\n isToday,\r\n isSelected,\r\n isDisabled,\r\n };\r\n }\r\n\r\n return cells;\r\n}\r\n","import type { JalaliDate, JalaliDayOfWeek, JalaliMonthIndex } from \"./types\";\r\nimport {\r\n jalaliToGregorian,\r\n gregorianToJalali,\r\n getDaysInJalaliMonth,\r\n} from \"./jalali-math\";\r\n\r\nexport function jsDateToJalali(d: Date): JalaliDate {\r\n return gregorianToJalali(d.getFullYear(), d.getMonth() + 1, d.getDate());\r\n}\r\n\r\nexport function jalaliToJsDate(\r\n j: JalaliDate,\r\n hours = 0,\r\n minutes = 0,\r\n seconds = 0,\r\n): Date {\r\n const g = jalaliToGregorian(j.year, j.month, j.day);\r\n g.setHours(hours, minutes, seconds, 0);\r\n return g;\r\n}\r\n\r\n/**\r\n * Calculates day of week in Jalali calendar (0 = شنبه, ..., 6 = جمعه).\r\n */\r\nexport function getJalaliDayOfWeek(\r\n year: number,\r\n month: number,\r\n day: number,\r\n): JalaliDayOfWeek {\r\n const g = jalaliToGregorian(year, month as JalaliMonthIndex, day);\r\n const jsDay = g.getDay(); // 0 = Sunday, 6 = Saturday\r\n return ((jsDay + 1) % 7) as JalaliDayOfWeek;\r\n}\r\n\r\n/**\r\n * Adds or subtracts days to/from a Jalali date across month/year boundaries.\r\n */\r\nexport function addDaysToJalali(date: JalaliDate, days: number): JalaliDate {\r\n const g = jalaliToGregorian(date.year, date.month, date.day);\r\n g.setDate(g.getDate() + days);\r\n // تبدیل getMonth() از 0-indexed به 1-indexed برای gregorianToJalali\r\n return gregorianToJalali(g.getFullYear(), g.getMonth() + 1, g.getDate());\r\n}\r\n\r\n/**\r\n * Alias for addDaysToJalali\r\n */\r\nexport const addJalaliDays = addDaysToJalali;\r\n\r\n/**\r\n * Compares two Jalali dates:\r\n * - Returns -1 if d1 < d2\r\n * - Returns 1 if d1 > d2\r\n * - Returns 0 if d1 == d2\r\n */\r\nexport function compareJalaliDates(d1: JalaliDate, d2: JalaliDate): number {\r\n if (d1.year !== d2.year) return d1.year < d2.year ? -1 : 1;\r\n if (d1.month !== d2.month) return d1.month < d2.month ? -1 : 1;\r\n if (d1.day !== d2.day) return d1.day < d2.day ? -1 : 1;\r\n return 0;\r\n}\r\n\r\n/**\r\n * Checks if a target date falls strictly or inclusively between two dates.\r\n */\r\nexport function isJalaliDateBetween(\r\n target: JalaliDate,\r\n start: JalaliDate,\r\n end: JalaliDate,\r\n inclusive = true,\r\n): boolean {\r\n const minDate = compareJalaliDates(start, end) <= 0 ? start : end;\r\n const maxDate = compareJalaliDates(start, end) <= 0 ? end : start;\r\n\r\n const cmpMin = compareJalaliDates(target, minDate);\r\n const cmpMax = compareJalaliDates(target, maxDate);\r\n\r\n if (inclusive) {\r\n return cmpMin >= 0 && cmpMax <= 0;\r\n }\r\n return cmpMin > 0 && cmpMax < 0;\r\n}\r\n\r\n/**\r\n * Calculates the full Jalali week range starting Saturday and ending Friday.\r\n */\r\nexport function getJalaliWeekRange(date: JalaliDate): [JalaliDate, JalaliDate] {\r\n const dayOfWeek = getJalaliDayOfWeek(date.year, date.month, date.day);\r\n const startOfWeek = addDaysToJalali(date, -dayOfWeek); // شنبه\r\n const endOfWeek = addDaysToJalali(startOfWeek, 6); // جمعه\r\n return [startOfWeek, endOfWeek];\r\n}\r\n\r\n/**\r\n * Calculates full month range from day 1 to last day of that month.\r\n */\r\nexport function getJalaliMonthRange(\r\n date: JalaliDate,\r\n): [JalaliDate, JalaliDate] {\r\n const daysInMonth = getDaysInJalaliMonth(date.year, date.month);\r\n const start: JalaliDate = { year: date.year, month: date.month, day: 1 };\r\n const end: JalaliDate = {\r\n year: date.year,\r\n month: date.month,\r\n day: daysInMonth,\r\n };\r\n return [start, end];\r\n}\r\n","import type { JalaliDate, JalaliMonthIndex } from \"./types\";\nimport { compareJalaliDates } from \"./jalali-helpers\";\nimport { getDaysInJalaliMonth } from \"./jalali-math\";\n\nexport interface JalaliDateConstraints {\n minDate?: JalaliDate;\n maxDate?: JalaliDate;\n isDateDisabled?: (date: JalaliDate) => boolean;\n}\n\nexport function isJalaliDateSelectable(\n date: JalaliDate,\n constraints: JalaliDateConstraints = {},\n): boolean {\n const { minDate, maxDate, isDateDisabled } = constraints;\n if (minDate && compareJalaliDates(date, minDate) < 0) return false;\n if (maxDate && compareJalaliDates(date, maxDate) > 0) return false;\n return !isDateDisabled?.(date);\n}\n\nexport function isJalaliMonthSelectable(\n year: number,\n month: JalaliMonthIndex,\n constraints: JalaliDateConstraints = {},\n): boolean {\n const firstDay: JalaliDate = { year, month, day: 1 };\n const lastDay: JalaliDate = {\n year,\n month,\n day: getDaysInJalaliMonth(year, month),\n };\n\n if (\n (constraints.minDate &&\n compareJalaliDates(lastDay, constraints.minDate) < 0) ||\n (constraints.maxDate &&\n compareJalaliDates(firstDay, constraints.maxDate) > 0)\n ) {\n return false;\n }\n\n if (!constraints.isDateDisabled) return true;\n for (let day = 1; day <= lastDay.day; day += 1) {\n if (isJalaliDateSelectable({ year, month, day }, constraints)) return true;\n }\n return false;\n}\n\nexport function isJalaliYearSelectable(\n year: number,\n constraints: JalaliDateConstraints = {},\n): boolean {\n for (let month = 0; month < 12; month += 1) {\n if (\n isJalaliMonthSelectable(\n year,\n month as JalaliMonthIndex,\n constraints,\n )\n ) {\n return true;\n }\n }\n return false;\n}\n","import { useState, useCallback, useMemo } from \"react\";\r\nimport type {\r\n UseJalaliDatePickerOptions,\r\n SelectionMode,\r\n InternalSelectedValue,\r\n JalaliDateRange,\r\n} from \"./types\";\r\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\r\nimport { getTodayJalali, isSameJalaliDay } from \"../core/jalali-math\";\r\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\r\nimport { isJalaliDateBetween } from \"../core/jalali-helpers\";\nimport { isJalaliDateSelectable } from \"../core/date-availability\";\n\r\nexport function useJalaliDatePicker<M extends SelectionMode = \"single\">(\r\n options: UseJalaliDatePickerOptions<M> = {},\r\n) {\r\n const {\r\n mode = \"single\" as M,\r\n value: controlledValue,\r\n defaultValue,\r\n initialViewDate,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n firstDayOfWeek = 0,\r\n } = options;\r\n\r\n const today = useMemo(() => getTodayJalali(), []);\r\n\r\n const [internalValue, setInternalValue] = useState<InternalSelectedValue<M>>(\r\n () => {\r\n if (defaultValue !== undefined) return defaultValue;\r\n if (mode === \"single\") return null as InternalSelectedValue<M>;\r\n if (mode === \"range\")\r\n return [null, null] as unknown as InternalSelectedValue<M>;\r\n return [] as unknown as InternalSelectedValue<M>;\r\n },\r\n );\r\n\r\n const selected =\r\n controlledValue !== undefined ? controlledValue : internalValue;\r\n\r\n const [viewYear, setViewYear] = useState<number>(() => {\r\n if (initialViewDate) return initialViewDate.year;\r\n if (defaultValue && !Array.isArray(defaultValue))\r\n return (defaultValue as JalaliDate).year;\r\n return today.year;\r\n });\r\n\r\n const [viewMonth, setViewMonth] = useState<JalaliMonthIndex>(() => {\r\n if (initialViewDate) return initialViewDate.month;\r\n if (defaultValue && !Array.isArray(defaultValue))\r\n return (defaultValue as JalaliDate).month;\r\n return today.month;\r\n });\r\n\r\n const [hoverDate, setHoverDate] = useState<JalaliDate | null>(null);\n\n const canSelectDate = useCallback(\n (date: JalaliDate) =>\n isJalaliDateSelectable(date, {\n minDate,\n maxDate,\n isDateDisabled,\n }),\n [minDate, maxDate, isDateDisabled],\n );\n\r\n const setView = useCallback((year: number, month: JalaliMonthIndex) => {\r\n setViewYear(year);\r\n setViewMonth(month);\r\n }, []);\r\n\r\n const goToPrevMonth = useCallback(() => {\r\n if (viewMonth === 0) {\r\n setViewYear((y) => y - 1);\r\n setViewMonth(11);\r\n } else {\r\n setViewMonth((m) => (m - 1) as JalaliMonthIndex);\r\n }\r\n }, [viewMonth]);\r\n\r\n const goToNextMonth = useCallback(() => {\r\n if (viewMonth === 11) {\r\n setViewYear((y) => y + 1);\r\n setViewMonth(0);\r\n } else {\r\n setViewMonth((m) => (m + 1) as JalaliMonthIndex);\r\n }\r\n }, [viewMonth]);\r\n\r\n const goToToday = useCallback(() => {\r\n const t = getTodayJalali();\r\n setViewYear(t.year);\r\n setViewMonth(t.month);\r\n }, []);\r\n\r\n const selectDate = useCallback(\n (date: JalaliDate) => {\n if (!canSelectDate(date)) return;\n\n let nextValue: InternalSelectedValue<M>;\r\n\r\n if (mode === \"single\") {\r\n nextValue = date as InternalSelectedValue<M>;\r\n } else if (mode === \"range\") {\r\n const currentRange = (selected as JalaliDateRange) || [null, null];\r\n const [start, end] = currentRange;\r\n\r\n if (!start || (start && end)) {\r\n nextValue = [date, null] as unknown as InternalSelectedValue<M>;\r\n } else {\r\n if (\r\n date.year < start.year ||\r\n (date.year === start.year && date.month < start.month) ||\r\n (date.year === start.year &&\r\n date.month === start.month &&\r\n date.day < start.day)\r\n ) {\r\n nextValue = [date, start] as unknown as InternalSelectedValue<M>;\r\n } else {\r\n nextValue = [start, date] as unknown as InternalSelectedValue<M>;\r\n }\r\n }\r\n } else {\r\n const currentList = (selected as JalaliDate[]) || [];\r\n const exists = currentList.some((d) => isSameJalaliDay(d, date));\r\n if (exists) {\r\n nextValue = currentList.filter(\r\n (d) => !isSameJalaliDay(d, date),\r\n ) as InternalSelectedValue<M>;\r\n } else {\r\n nextValue = [...currentList, date] as InternalSelectedValue<M>;\r\n }\r\n }\r\n\r\n if (controlledValue === undefined) {\r\n setInternalValue(nextValue);\r\n }\r\n onChange?.(nextValue);\r\n },\r\n [mode, selected, controlledValue, onChange, canSelectDate],\n );\n\n const isDateSelected = useCallback(\n (date: JalaliDate): boolean => {\n if (mode === \"single\") {\n return isSameJalaliDay(selected as JalaliDate | null, date);\n }\n if (mode === \"range\") {\n const [start, end] = (selected as JalaliDateRange) || [null, null];\n return Boolean(\n (start && isSameJalaliDay(start, date)) ||\n (end && isSameJalaliDay(end, date)),\n );\n }\n return ((selected as JalaliDate[]) || []).some((item) =>\n isSameJalaliDay(item, date),\n );\n },\n [mode, selected],\n );\n\r\n const clear = useCallback(() => {\r\n const emptyValue = (\r\n mode === \"single\" ? null : mode === \"range\" ? [null, null] : []\r\n ) as InternalSelectedValue<M>;\r\n\r\n if (controlledValue === undefined) {\r\n setInternalValue(emptyValue);\r\n }\r\n onChange?.(emptyValue);\r\n }, [mode, controlledValue, onChange]);\r\n\r\n const grid = useMemo(() => {\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year: viewYear,\r\n month: viewMonth,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n });\r\n\r\n if (mode === \"single\") {\r\n const singleSelected = selected as JalaliDate | null;\r\n return rawGrid.map((cell) => ({\r\n ...cell,\r\n isSelected: singleSelected\r\n ? isSameJalaliDay(cell.jalali, singleSelected)\r\n : false,\r\n }));\r\n }\r\n\r\n if (mode === \"range\") {\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n }\r\n\r\n if (mode === \"multiple\") {\r\n const list = (selected as JalaliDate[]) || [];\r\n return rawGrid.map((cell) => ({\r\n ...cell,\r\n isSelected: list.some((d) => isSameJalaliDay(d, cell.jalali)),\r\n }));\r\n }\r\n\r\n return rawGrid;\r\n }, [\r\n viewYear,\r\n viewMonth,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n mode,\r\n selected,\r\n hoverDate,\r\n ]);\r\n\r\n return {\r\n selected,\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n goToPrevMonth,\r\n goToNextMonth,\r\n goToToday,\r\n setView,\r\n selectDate,\n isDateSelected,\n setHoverDate,\r\n hoverDate,\r\n clear,\r\n };\r\n}\r\n","import type { JalaliMonthIndex } from \"../core/types\";\r\nimport { getDaysInJalaliMonth } from \"../core/jalali-math\";\r\nimport type { NavigateOptions, NavigationResult } from \"./types\";\r\n\r\nexport function calculateNextFocusedDate(\r\n options: NavigateOptions,\r\n): NavigationResult {\r\n const { currentFocused, key, isRtl = true } = options;\r\n let { year, month, day } = currentFocused;\r\n let viewChanged = false;\r\n let handled = true;\r\n\r\n // Handle RTL vs LTR arrow directions\r\n const stepLeft = isRtl ? 1 : -1;\r\n const stepRight = isRtl ? -1 : 1;\r\n\r\n switch (key) {\r\n case \"ArrowRight\":\r\n day += stepRight;\r\n break;\r\n\r\n case \"ArrowLeft\":\r\n day += stepLeft;\r\n break;\r\n\r\n case \"ArrowUp\":\r\n day -= 7;\r\n break;\r\n\r\n case \"ArrowDown\":\r\n day += 7;\r\n break;\r\n\r\n case \"Home\":\r\n day = 1;\r\n break;\r\n\r\n case \"End\":\r\n day = getDaysInJalaliMonth(year, month);\r\n break;\r\n\r\n case \"PageUp\":\r\n // Previous Month\r\n if (month === 0) {\r\n year -= 1;\r\n month = 11;\r\n } else {\r\n month = (month - 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n break;\r\n\r\n case \"PageDown\":\r\n // Next Month\r\n if (month === 11) {\r\n year += 1;\r\n month = 0;\r\n } else {\r\n month = (month + 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n break;\r\n\r\n default:\r\n handled = false;\r\n return { nextDate: currentFocused, viewChanged: false, handled: false };\r\n }\r\n\r\n // Normalize days falling outside current month boundary\r\n while (day < 1) {\r\n if (month === 0) {\r\n year -= 1;\r\n month = 11;\r\n } else {\r\n month = (month - 1) as JalaliMonthIndex;\r\n }\r\n day += getDaysInJalaliMonth(year, month);\r\n viewChanged = true;\r\n }\r\n\r\n while (day > getDaysInJalaliMonth(year, month)) {\r\n day -= getDaysInJalaliMonth(year, month);\r\n if (month === 11) {\r\n year += 1;\r\n month = 0;\r\n } else {\r\n month = (month + 1) as JalaliMonthIndex;\r\n }\r\n viewChanged = true;\r\n }\r\n\r\n return {\r\n nextDate: { year, month, day },\r\n viewChanged,\r\n handled,\r\n };\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\n\r\n/**\r\n * Creates an accessible full Persian string for screen readers.\r\n * Example: \"شنبه، ۱ فروردین ۱۴۰۵\"\r\n */\r\nexport function getAriaDayLabel(date: JalaliDate): string {\r\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\r\n const jsDay = gregorian.getDay();\r\n const jalaliDayOfWeek = (jsDay + 1) % 7; // 0 = Sat, 1 = Sun, ...\r\n\r\n const weekDayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\r\n const monthName = PERSIAN_MONTH_NAMES[date.month];\r\n\r\n return `${weekDayName}، ${date.day} ${monthName} ${date.year}`;\r\n}\r\n","import { useState, useCallback } from \"react\";\r\nimport type { JalaliDate } from \"../core/types\";\r\nimport { calculateNextFocusedDate } from \"./keyboard-navigation\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { UseCalendarKeyboardProps } from \"./types\";\r\n\r\nexport function useCalendarKeyboard(props: UseCalendarKeyboardProps) {\r\n const {\r\n viewYear,\r\n viewMonth,\r\n selectedDate,\r\n onSelectDate,\r\n onViewChange,\r\n isRtl = true,\r\n } = props;\r\n\r\n const [focusedDate, setFocusedDate] = useState<JalaliDate>(() => {\r\n return selectedDate ?? { year: viewYear, month: viewMonth, day: 1 };\r\n });\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n onSelectDate(focusedDate);\r\n return;\r\n }\r\n\r\n const result = calculateNextFocusedDate({\r\n currentFocused: focusedDate,\r\n key: e.key,\r\n isRtl,\r\n });\r\n\r\n if (result.handled) {\r\n e.preventDefault();\r\n setFocusedDate(result.nextDate);\r\n\r\n if (result.viewChanged) {\r\n onViewChange(result.nextDate.year, result.nextDate.month);\r\n }\r\n }\r\n },\r\n [focusedDate, isRtl, onSelectDate, onViewChange],\r\n );\r\n\r\n const getCellTabIndex = useCallback(\r\n (cellDate: JalaliDate): number => {\r\n return isSameJalaliDay(cellDate, focusedDate) ? 0 : -1;\r\n },\r\n [focusedDate],\r\n );\r\n\r\n return {\r\n focusedDate,\r\n setFocusedDate,\r\n handleKeyDown,\r\n getCellTabIndex,\r\n };\r\n}\r\n","const PERSIAN_DIGITS = [\"۰\", \"۱\", \"۲\", \"۳\", \"۴\", \"۵\", \"۶\", \"۷\", \"۸\", \"۹\"];\r\nconst LATIN_DIGITS: Record<string, string> = {\r\n \"۰\": \"0\",\r\n \"۱\": \"1\",\r\n \"۲\": \"2\",\r\n \"۳\": \"3\",\r\n \"۴\": \"4\",\r\n \"۵\": \"5\",\r\n \"۶\": \"6\",\r\n \"۷\": \"7\",\r\n \"۸\": \"8\",\r\n \"۹\": \"9\",\r\n \"٠\": \"0\",\r\n \"١\": \"1\",\r\n \"٢\": \"2\",\r\n \"٣\": \"3\",\r\n \"٤\": \"4\", // Arabic-indic fallbacks\r\n \"٥\": \"5\",\r\n \"٦\": \"6\",\r\n \"٧\": \"7\",\r\n \"٨\": \"8\",\r\n \"٩\": \"9\",\r\n};\r\n\r\n/**\r\n * Converts Latin digits (0-9) to Persian digits (۰-۹).\r\n */\r\nexport function toPersianDigits(input: string | number): string {\r\n return String(input).replace(/[0-9]/g, (w) => PERSIAN_DIGITS[+w]);\r\n}\r\n\r\n/**\r\n * Converts Persian/Arabic digits to standard ASCII Latin digits (0-9).\r\n */\r\nexport function toLatinDigits(input: string): string {\r\n return input.replace(/[۰-۹٠-٩]/g, (char) => LATIN_DIGITS[char] ?? char);\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { PERSIAN_MONTH_NAMES, PERSIAN_WEEK_DAYS_LONG } from \"../core/constants\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\nimport { toPersianDigits } from \"./persian-digits\";\r\n\r\nexport interface FormatJalaliOptions {\r\n /** Output digits format. Defaults to 'persian'. */\r\n digitType?: \"persian\" | \"latin\";\r\n}\r\n\r\n/**\r\n * Formats a JalaliDate using standard format pattern tokens:\r\n * - YYYY: 4-digit year (1405)\r\n * - YY: 2-digit year (05)\r\n * - MMMM: Full month name (فروردین)\r\n * - MM: 2-digit month (01-12)\r\n * - M: 1-digit month (1-12)\r\n * - dddd: Full weekday name (شنبه)\r\n * - DD: 2-digit day (01-31)\r\n * - D: 1-digit day (1-31)\r\n */\r\nexport function formatJalaliDate(\r\n date: JalaliDate | null | undefined,\r\n pattern = \"YYYY/MM/DD\",\r\n options: FormatJalaliOptions = {},\r\n): string {\r\n if (!date) return \"\";\r\n\r\n const { digitType = \"persian\" } = options;\r\n\r\n const gregorian = jalaliToGregorian(date.year, date.month, date.day);\r\n const jsDay = gregorian.getDay();\r\n const jalaliDayOfWeek = (jsDay + 1) % 7;\r\n\r\n const yearStr = String(date.year);\r\n const shortYearStr = yearStr.slice(-2);\r\n const monthNum = date.month + 1;\r\n const monthStr = monthNum < 10 ? `0${monthNum}` : String(monthNum);\r\n const monthName = PERSIAN_MONTH_NAMES[date.month];\r\n const dayStr = date.day < 10 ? `0${date.day}` : String(date.day);\r\n const weekdayName = PERSIAN_WEEK_DAYS_LONG[jalaliDayOfWeek];\r\n\r\n let formatted = pattern\r\n .replace(/\\bYYYY\\b/g, yearStr)\r\n .replace(/\\bYY\\b/g, shortYearStr)\r\n .replace(/\\bMMMM\\b/g, monthName)\r\n .replace(/\\bMM\\b/g, monthStr)\r\n .replace(/\\bM\\b/g, String(monthNum))\r\n .replace(/\\bdddd\\b/g, weekdayName)\r\n .replace(/\\bDD\\b/g, dayStr)\r\n .replace(/\\bD\\b/g, String(date.day));\r\n\r\n if (digitType === \"persian\") {\r\n // Convert numeric matches while preserving month/weekday strings\r\n formatted = formatted.replace(/\\d+/g, (num) => toPersianDigits(num));\r\n }\r\n\r\n return formatted;\r\n}\r\n","// src/theme/tokens.ts\r\nimport type { Theme } from './types';\r\n\r\nexport const lightTheme: Theme = {\r\n mode: 'light',\r\n colors: {\r\n primary: '#4f46e5', // Indigo-600\r\n primaryHover: '#4338ca', // Indigo-700\r\n primaryText: '#ffffff', // متن سفید روی رنگ اصلی\r\n background: '#ffffff', // پس‌زمینه اصلی تقویم و اینپوت\r\n backgroundHover: '#f1f5f9', // Slate-100 برای هاور دکمه‌ها\r\n surface: '#f8fafc', // Slate-50 برای فوتر و کادرهای فرعی\r\n border: '#e2e8f0', // Slate-200 برای خطوط و بردرها\r\n textPrimary: '#0f172a', // Slate-900 (مشکی تیره برای روزها و عناوین)\r\n textSecondary: '#64748b', // Slate-500 (خاکستری برای نام روزهای هفته و متون کمکی)\r\n textDisabled: '#cbd5e1', // Slate-300 (برای روزهای ماه قبل و بعد)\r\n holiday: '#e11d48', // Rose-600 (رنگ جمعه‌ها و روزهای تعطیل)\r\n holidayBackground: '#fff1f2', // Rose-50 (هاور روزهای تعطیل)\r\n rangeBackground: '#e0e7ff', // Indigo-100 (پس‌زمینه بازه انتخاب‌شده)\r\n todayBorder: '#4f46e5', // حاشیه دور روز جاری\r\n },\r\n radii: {\r\n sm: '6px',\r\n md: '8px',\r\n lg: '12px',\r\n full: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.04)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.05)',\r\n },\r\n};\r\n\r\nexport const darkTheme: Theme = {\r\n mode: 'dark',\r\n colors: {\r\n primary: '#6366f1',\r\n primaryHover: '#4f46e5',\r\n primaryText: '#ffffff',\r\n background: '#0f172a',\r\n backgroundHover: '#1e293b',\r\n surface: '#1e293b',\r\n border: '#334155',\r\n textPrimary: '#f8fafc',\r\n textSecondary: '#94a3b8',\r\n textDisabled: '#475569',\r\n holiday: '#fb7185',\r\n holidayBackground: '#4c0519',\r\n rangeBackground: '#312e81',\r\n todayBorder: '#818cf8',\r\n },\r\n radii: {\r\n sm: '6px',\r\n md: '8px',\r\n lg: '12px',\r\n full: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.4)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.5)',\r\n },\r\n};\r\n","import React, { createContext, useContext, useMemo } from \"react\";\r\nimport { lightTheme, darkTheme } from \"./tokens\";\r\nimport type { Theme, ThemeMode, DeepPartial } from \"./types\";\r\n\r\ninterface ThemeContextType {\r\n theme: Theme;\r\n mode: ThemeMode;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType>({\r\n theme: lightTheme,\r\n mode: \"light\",\r\n});\r\n\r\nexport const useTheme = (): ThemeContextType => {\r\n const context = useContext(ThemeContext);\r\n if (!context) {\r\n return { theme: lightTheme, mode: \"light\" };\r\n }\r\n return context;\r\n};\r\n\r\nexport interface DatePickerThemeProviderProps {\r\n children: React.ReactNode;\r\n mode?: ThemeMode;\r\n customTheme?: DeepPartial<Theme>;\r\n}\r\n\r\nexport const DatePickerThemeProvider: React.FC<\r\n DatePickerThemeProviderProps\r\n> = ({ children, mode = \"light\", customTheme }) => {\r\n const baseTheme = mode === \"dark\" ? darkTheme : lightTheme;\r\n\r\n const value = useMemo<ThemeContextType>(() => {\r\n if (!customTheme) {\r\n return { theme: baseTheme, mode };\r\n }\r\n\r\n return {\r\n mode,\r\n theme: {\r\n ...baseTheme,\r\n ...customTheme,\r\n mode,\r\n colors: {\r\n ...baseTheme.colors,\r\n ...(customTheme.colors || {}),\r\n },\r\n radii: {\r\n ...baseTheme.radii,\r\n ...(customTheme.radii || {}),\r\n },\r\n shadows: {\r\n ...baseTheme.shadows,\r\n ...(customTheme.shadows || {}),\r\n },\r\n },\r\n };\r\n }, [baseTheme, customTheme, mode]);\r\n\r\n return (\r\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\r\n );\r\n};\r\n","export function mergeClassNames(\r\n ...classNames: Array<string | null | undefined | false>\r\n): string | undefined {\r\n const merged = classNames.filter(Boolean).join(\" \");\r\n return merged || undefined;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\r\nimport { useTheme } from \"../theme/ThemeProvider\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface HeaderProps {\r\n year: number;\r\n monthName: string;\r\n onPrevMonth: () => void;\r\n onNextMonth: () => void;\r\n onTitleClick?: () => void;\r\n isPickerOpen?: boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n direction?: \"rtl\" | \"ltr\";\n isPrevDisabled?: boolean;\n isNextDisabled?: boolean;\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\ntype HoverTarget = \"prev\" | \"title\" | \"next\" | null;\r\n\r\nexport const Header: React.FC<HeaderProps> = ({\r\n year,\r\n monthName,\r\n onPrevMonth,\r\n onNextMonth,\r\n onTitleClick,\r\n isPickerOpen = false,\r\n digitType = \"persian\",\r\n direction = \"rtl\",\n isPrevDisabled = false,\n isNextDisabled = false,\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n const [hovered, setHovered] = useState<HoverTarget>(null);\r\n const displayYear =\r\n digitType === \"persian\" ? toPersianDigits(year) : String(year);\r\n\r\n const navStyle = (\n target: Exclude<HoverTarget, \"title\" | null>,\n disabled: boolean,\n ) => ({\n width: \"32px\",\r\n height: \"32px\",\r\n padding: 0,\r\n borderRadius: theme.radii.md,\r\n border: \"none\",\r\n backgroundColor:\r\n hovered === target ? theme.colors.backgroundHover : \"transparent\",\r\n color: theme.colors.textPrimary,\r\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.38 : 1,\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"background-color 0.15s ease, color 0.15s ease\",\r\n ...styles?.navButton,\n ...(disabled ? styles?.disabledNavButton : undefined),\n });\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={classNames?.header}\r\n style={{\r\n display: \"flex\",\r\n minHeight: \"40px\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: \"8px\",\r\n padding: \"4px 0 10px\",\r\n borderBottom: `1px solid ${theme.colors.border}`,\r\n userSelect: \"none\",\r\n ...styles?.header,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\n onClick={onPrevMonth}\n disabled={isPrevDisabled}\n aria-disabled={isPrevDisabled}\n aria-label=\"ماه قبل\"\n className={mergeClassNames(\n classNames?.navButton,\n isPrevDisabled && classNames?.disabledNavButton,\n )}\n style={navStyle(\"prev\", isPrevDisabled)}\n onMouseEnter={() => setHovered(\"prev\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onTitleClick}\r\n aria-expanded={isPickerOpen}\r\n className={classNames?.headerTitle}\r\n style={{\r\n minHeight: \"32px\",\r\n padding: \"6px 12px\",\r\n borderRadius: theme.radii.md,\r\n border: \"none\",\r\n backgroundColor:\r\n isPickerOpen || hovered === \"title\"\r\n ? theme.colors.backgroundHover\r\n : \"transparent\",\r\n color: theme.colors.textPrimary,\r\n cursor: onTitleClick ? \"pointer\" : \"default\",\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: \"6px\",\r\n fontSize: \"0.95rem\",\r\n fontWeight: 700,\r\n whiteSpace: \"nowrap\",\r\n transition: \"background-color 0.15s ease\",\r\n ...styles?.headerTitle,\r\n }}\r\n onMouseEnter={() => setHovered(\"title\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <span>\r\n {monthName} {displayYear}\r\n </span>\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{\r\n transform: isPickerOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\r\n transition: \"transform 0.2s ease\",\r\n }}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\n onClick={onNextMonth}\n disabled={isNextDisabled}\n aria-disabled={isNextDisabled}\n aria-label=\"ماه بعد\"\n className={mergeClassNames(\n classNames?.navButton,\n isNextDisabled && classNames?.disabledNavButton,\n )}\n style={navStyle(\"next\", isNextDisabled)}\n onMouseEnter={() => setHovered(\"next\")}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n style={{ transform: direction === \"ltr\" ? \"scaleX(-1)\" : undefined }}\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n );\r\n};\r\n","// src/components/Weekdays.tsx\r\nimport React from \"react\";\r\nimport { PERSIAN_WEEK_DAYS_SHORT } from \"../core/constants\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\r\n\r\nexport interface WeekdaysProps {\r\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const Weekdays: React.FC<WeekdaysProps> = ({\r\n firstDayOfWeek = 0,\r\n classNames,\r\n styles,\r\n}) => {\r\n // مرتب‌سازی روزهای هفته بر اساس firstDayOfWeek\r\n const weekdays = React.useMemo(() => {\r\n const days = [...PERSIAN_WEEK_DAYS_SHORT];\r\n const rotated = [\r\n ...days.slice(firstDayOfWeek),\r\n ...days.slice(0, firstDayOfWeek),\r\n ];\r\n return rotated;\r\n }, [firstDayOfWeek]);\r\n\r\n return (\r\n <div\r\n role=\"row\"\r\n className={classNames?.weekdays}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"4px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n marginBottom: \"6px\",\r\n userSelect: \"none\",\r\n ...styles?.weekdays,\r\n }}\r\n >\r\n {weekdays.map((day, idx) => {\r\n // اگر جمعه باشد (در حالت شنبه تا جمعه، آخرین ایندکس ۶ است)\r\n const isFriday = (idx + firstDayOfWeek) % 7 === 6;\r\n\r\n return (\r\n <div\r\n key={day}\r\n role=\"columnheader\"\r\n aria-label={day}\r\n className={classNames?.weekdayCell}\r\n style={{\r\n width: \"100%\",\n minWidth: 0,\n height: \"24px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"11.5px\",\r\n fontWeight: 700,\r\n color: isFriday\r\n ? \"var(--pdp-holiday-color, #e11d48)\"\r\n : \"var(--pdp-text-muted, #94a3b8)\",\r\n textAlign: \"center\",\r\n ...styles?.weekdayCell,\r\n }}\r\n >\r\n {day}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","// src/components/DayCell.tsx\r\nimport React, { useState } from \"react\";\r\nimport type { JalaliCalendarCell, JalaliDate } from \"../core/types\";\r\nimport { toPersianDigits, toLatinDigits } from \"../formatters/persian-digits\";\r\nimport type { CalendarEvent } from \"../events/types\";\r\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface DayCellProps {\r\n cell: JalaliCalendarCell;\r\n digitType?: \"persian\" | \"latin\";\r\n isHoliday?: boolean;\r\n holidayTitle?: string;\r\n events?: CalendarEvent[];\r\n tabIndex?: number;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n onSelect: (date: JalaliDate) => void;\r\n onHover?: (date: JalaliDate | null) => void;\r\n onFocus?: (date: JalaliDate) => void;\r\n}\r\n\r\nexport const DayCell: React.FC<DayCellProps> = ({\r\n cell,\r\n digitType = \"persian\",\r\n isHoliday = false,\r\n holidayTitle,\r\n events = [],\r\n tabIndex = -1,\r\n classNames,\r\n styles,\r\n onSelect,\r\n onHover,\r\n onFocus,\r\n}) => {\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [isPressed, setIsPressed] = useState(false);\r\n\r\n const {\r\n jalali,\r\n dayNumber,\r\n isCurrentMonth,\r\n isToday,\r\n isSelected,\r\n isDisabled,\r\n isInRange,\r\n isRangeStart,\r\n isRangeEnd,\r\n } = cell;\r\n\r\n const formattedDay =\r\n digitType === \"persian\"\r\n ? toPersianDigits(dayNumber)\r\n : toLatinDigits(dayNumber.toString());\r\n\r\n const isInteractive = !isDisabled && isCurrentMonth;\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (isInteractive) {\r\n onSelect(jalali);\r\n }\r\n };\r\n\r\n const handleMouseEnter = () => {\r\n setIsHovered(true);\r\n if (isInteractive && onHover) {\r\n onHover(jalali);\r\n }\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setIsHovered(false);\r\n setIsPressed(false);\r\n if (onHover) {\r\n onHover(null);\r\n }\r\n };\r\n\r\n const handleFocus = () => {\r\n if (isInteractive && onFocus) {\r\n onFocus(jalali);\r\n }\r\n };\r\n\r\n // رنگ‌بندی پس‌زمینه و متن در حالت‌های مختلف\r\n let cellBg = \"transparent\";\r\n let textColor = isCurrentMonth\r\n ? \"var(--pdp-text-primary, #0f172a)\"\r\n : \"var(--pdp-text-disabled, #cbd5e1)\";\r\n\r\n const isEdgeOfRange = isRangeStart || isRangeEnd;\r\n\r\n if (isSelected || isEdgeOfRange) {\n cellBg = \"var(--pdp-primary, #4f46e5)\";\r\n textColor = \"#ffffff\";\r\n } else if (isInRange) {\r\n cellBg = \"var(--pdp-range-between-bg, rgba(79, 70, 229, 0.12))\";\r\n } else if (isHovered && isInteractive) {\r\n cellBg = \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }\r\n\r\n // رنگ روزهای تعطیل در صورت عدم انتخاب\r\n if (\n isHoliday &&\n isCurrentMonth &&\n !isDisabled &&\n !isSelected &&\n !isEdgeOfRange\n ) {\n textColor = \"var(--pdp-holiday-color, #e11d48)\";\n }\n\n if (isDisabled) {\n cellBg = \"var(--pdp-disabled-bg, #f1f5f9)\";\n textColor = \"var(--pdp-text-disabled, #94a3b8)\";\n }\n\n const stateClassName = mergeClassNames(\n classNames?.dayCell,\n isToday && classNames?.todayCell,\n isSelected && classNames?.selectedCell,\n isInRange && classNames?.rangeBetweenCell,\n isRangeStart && classNames?.rangeStartCell,\n isRangeEnd && classNames?.rangeEndCell,\n isDisabled && classNames?.disabledCell,\n !isCurrentMonth && classNames?.outsideMonthCell,\n isHoliday && classNames?.holidayCell,\n );\n\n const stateStyles: React.CSSProperties = {\n ...(isToday ? styles?.todayCell : undefined),\n ...(isSelected ? styles?.selectedCell : undefined),\n ...(isInRange ? styles?.rangeBetweenCell : undefined),\n ...(isRangeStart ? styles?.rangeStartCell : undefined),\n ...(isRangeEnd ? styles?.rangeEndCell : undefined),\n ...(!isCurrentMonth ? styles?.outsideMonthCell : undefined),\n ...(isHoliday ? styles?.holidayCell : undefined),\n ...(isDisabled ? styles?.disabledCell : undefined),\n };\n\r\n // انیمیشن transform بر اساس حالت‌های مختلف\r\n let transform = \"scale(1)\";\r\n if (isInteractive) {\r\n if (isPressed) {\r\n transform = \"scale(0.92)\";\r\n } else if (isHovered && !isInRange) {\r\n transform = \"scale(1.08)\";\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\n minWidth: 0,\n aspectRatio: \"1 / 1\",\n margin: 0,\r\n padding: 0,\r\n boxSizing: \"border-box\",\r\n }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <button\r\n type=\"button\"\r\n role=\"gridcell\"\r\n tabIndex={tabIndex}\r\n disabled={isDisabled || !isCurrentMonth}\n aria-disabled={isDisabled || !isCurrentMonth}\n aria-selected={isSelected}\r\n aria-label={`${jalali.year}/${jalali.month + 1}/${jalali.day}${\r\n holidayTitle ? ` - ${holidayTitle}` : \"\"\r\n }`}\r\n onClick={handleClick}\r\n onFocus={handleFocus}\r\n onMouseDown={() => isInteractive && setIsPressed(true)}\r\n onMouseUp={() => isInteractive && setIsPressed(false)}\r\n className={stateClassName}\n style={{\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: isRangeStart\r\n ? \"0 8px 8px 0\"\r\n : isRangeEnd\r\n ? \"8px 0 0 8px\"\r\n : isInRange\r\n ? \"0\"\r\n : \"8px\",\r\n border:\r\n isToday && !isSelected\r\n ? \"1px solid var(--pdp-primary, #4f46e5)\"\r\n : \"none\",\r\n backgroundColor: cellBg,\r\n color: textColor,\r\n cursor: isDisabled ? \"not-allowed\" : isInteractive ? \"pointer\" : \"default\",\n fontSize: \"13px\",\r\n fontWeight: isSelected || isToday ? 700 : 500,\r\n outline: \"none\",\r\n position: \"relative\",\r\n padding: 0,\r\n margin: 0,\r\n boxSizing: \"border-box\",\r\n // انیمیشن‌های نرم هاور، اسکیل و رنگ\r\n transform,\r\n boxShadow:\r\n isHovered && isInteractive && !isInRange && !isSelected\r\n ? \"0 2px 6px rgba(0, 0, 0, 0.08)\"\r\n : \"none\",\r\n transition:\r\n \"transform 0.16s cubic-bezier(0.34, 1.56, 0.64, 1), background-color 0.14s ease, color 0.14s ease, box-shadow 0.16s ease\",\r\n zIndex: isHovered && isInteractive ? 2 : 1,\n opacity: isDisabled ? 0.42 : isCurrentMonth ? 1 : 0.55,\n filter: isDisabled ? \"grayscale(0.65)\" : undefined,\n ...styles?.dayCell,\n ...stateStyles,\n }}\r\n >\r\n <span>{formattedDay}</span>\r\n\r\n {/* نقاط ایونت‌ها */}\r\n {events.length > 0 && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"3px\",\r\n display: \"flex\",\r\n gap: \"2px\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"transform 0.14s ease\",\r\n transform:\r\n isHovered && isInteractive ? \"translateY(1px)\" : \"none\",\r\n }}\r\n >\r\n {events.slice(0, 3).map((ev) => (\r\n <span\r\n key={ev.id}\r\n style={{\r\n width: \"3.5px\",\r\n height: \"3.5px\",\r\n borderRadius: \"50%\",\r\n backgroundColor: isSelected\r\n ? \"#ffffff\"\r\n : ev.color || \"var(--pdp-primary, #4f46e5)\",\r\n transition: \"background-color 0.14s ease\",\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </button>\r\n\r\n {/* تولتیپ شناور روز با انیمیشن Fade-in / Slide-up */}\r\n {isHovered && isCurrentMonth && (isHoliday || events.length > 0) && (\r\n <div\r\n role=\"tooltip\"\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"calc(100% + 7px)\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n zIndex: 1050,\r\n pointerEvents: \"none\",\r\n whiteSpace: \"nowrap\",\r\n backgroundColor: \"var(--pdp-tooltip-bg, #0f172a)\",\r\n color: \"var(--pdp-tooltip-text, #ffffff)\",\r\n padding: \"5px 9px\",\r\n borderRadius: \"6px\",\r\n fontSize: \"11.5px\",\r\n fontWeight: 600,\r\n lineHeight: 1.3,\r\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.25)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"2px\",\r\n textAlign: \"center\",\r\n animation:\r\n \"pdpTooltipFade 0.15s cubic-bezier(0.16, 1, 0.3, 1) forwards\",\r\n }}\r\n >\r\n {isHoliday && holidayTitle && (\r\n <span style={{ color: \"#fda4af\" }}>{holidayTitle}</span>\r\n )}\r\n\r\n {events.map((ev) => (\r\n <span key={ev.id} style={{ color: \"#e2e8f0\" }}>\r\n • {ev.title}\r\n </span>\r\n ))}\r\n\r\n {/* فلش جهت‌نمای تولتیپ */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: \"100%\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n borderWidth: \"4px\",\r\n borderStyle: \"solid\",\r\n borderColor:\r\n \"var(--pdp-tooltip-bg, #0f172a) transparent transparent transparent\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// src/components/MonthYearPicker.tsx\r\nimport React, { useState } from \"react\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport type { JalaliDate, JalaliMonthIndex } from \"../core/types\";\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../theme/style-slots\";\nimport {\n isJalaliMonthSelectable,\n isJalaliYearSelectable,\n type JalaliDateConstraints,\n} from \"../core/date-availability\";\nimport { mergeClassNames } from \"../theme/style-utils\";\n\r\nexport interface MonthYearPickerProps {\r\n currentYear: number;\r\n currentMonth: number;\r\n onSelectMonth: (month: JalaliMonthIndex) => void;\r\n onSelectYear: (year: number) => void;\n minDate?: JalaliDate;\n maxDate?: JalaliDate;\n isDateDisabled?: (date: JalaliDate) => boolean;\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const MonthYearPicker: React.FC<MonthYearPickerProps> = ({\r\n currentYear,\r\n currentMonth,\r\n onSelectMonth,\r\n onSelectYear,\n minDate,\n maxDate,\n isDateDisabled,\n classNames,\r\n styles,\r\n}) => {\r\n const [viewLevel, setViewLevel] = useState<\"months\" | \"years\">(\"months\");\r\n const [decadeStartYear, setDecadeStartYear] = useState<number>(\r\n () => Math.floor(currentYear / 10) * 10,\r\n );\r\n const [activeYear, setActiveYear] = useState<number>(currentYear);\r\n\r\n const decadeYears = Array.from(\n { length: 12 },\r\n (_, i) => decadeStartYear - 1 + i,\r\n );\n\n const constraints: JalaliDateConstraints = {\n minDate,\n maxDate,\n isDateDisabled,\n };\n const canSelectYear = (year: number) =>\n isJalaliYearSelectable(year, constraints);\n const canSelectMonth = (year: number, month: JalaliMonthIndex) =>\n isJalaliMonthSelectable(year, month, constraints);\n const previousPeriodDisabled =\n viewLevel === \"months\"\n ? !canSelectYear(activeYear - 1)\n : !Array.from({ length: 10 }, (_, i) => decadeStartYear - 10 + i).some(\n canSelectYear,\n );\n const nextPeriodDisabled =\n viewLevel === \"months\"\n ? !canSelectYear(activeYear + 1)\n : !Array.from({ length: 10 }, (_, i) => decadeStartYear + 10 + i).some(\n canSelectYear,\n );\n\r\n const handlePrev = () => {\n if (previousPeriodDisabled) return;\n if (viewLevel === \"months\") {\r\n const prevY = activeYear - 1;\r\n setActiveYear(prevY);\r\n onSelectYear(prevY);\r\n } else {\r\n setDecadeStartYear((prev) => prev - 10);\r\n }\r\n };\r\n\r\n const handleNext = () => {\n if (nextPeriodDisabled) return;\n if (viewLevel === \"months\") {\r\n const nextY = activeYear + 1;\r\n setActiveYear(nextY);\r\n onSelectYear(nextY);\r\n } else {\r\n setDecadeStartYear((prev) => prev + 10);\r\n }\r\n };\r\n\r\n const navBtnStyle: React.CSSProperties = {\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n padding: \"6px\",\r\n borderRadius: \"8px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n transition: \"all 0.15s ease\",\r\n };\r\n\r\n const cellBtnBaseStyle: React.CSSProperties = {\r\n height: \"46px\",\r\n borderRadius: \"10px\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n fontSize: \"13.5px\",\r\n fontWeight: 600,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"all 0.15s ease\",\r\n background: \"transparent\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n userSelect: \"none\",\r\n };\r\n\r\n return (\r\n <div\r\n className={classNames?.calendar}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"10px\",\r\n width: \"100%\",\r\n minWidth: 0,\n maxWidth: \"100%\",\n height: \"260px\",\r\n padding: \"6px\",\r\n boxSizing: \"border-box\",\r\n justifyContent: \"space-between\",\r\n userSelect: \"none\",\r\n ...styles?.calendar,\r\n }}\r\n >\r\n {/* Header Bar */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 4px\",\r\n height: \"38px\",\r\n }}\r\n >\r\n {/* Right Arrow (Previous in RTL) */}\r\n <button\n type=\"button\"\n onClick={handlePrev}\n disabled={previousPeriodDisabled}\n aria-disabled={previousPeriodDisabled}\n aria-label=\"Previous\"\n className={mergeClassNames(\n classNames?.navButton,\n previousPeriodDisabled && classNames?.disabledNavButton,\n )}\n style={{\n ...navBtnStyle,\n cursor: previousPeriodDisabled ? \"not-allowed\" : \"pointer\",\n opacity: previousPeriodDisabled ? 0.38 : 1,\n ...(previousPeriodDisabled\n ? styles?.disabledNavButton\n : undefined),\n }}\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Header Year Button (Clearly Interactive) */}\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (viewLevel === \"months\") {\r\n setDecadeStartYear(Math.floor(activeYear / 10) * 10);\r\n setViewLevel(\"years\");\r\n }\r\n }}\r\n style={{\r\n background:\r\n viewLevel === \"months\"\r\n ? \"var(--pdp-surface-subtle, #f1f5f9)\"\r\n : \"transparent\",\r\n border:\r\n viewLevel === \"months\"\r\n ? \"1px solid var(--pdp-surface-border, #e2e8f0)\"\r\n : \"none\",\r\n cursor: viewLevel === \"months\" ? \"pointer\" : \"default\",\r\n fontSize: \"13.5px\",\r\n fontWeight: 700,\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n padding: \"5px 12px\",\r\n borderRadius: \"8px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"6px\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (viewLevel === \"months\") {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #e2e8f0)\";\r\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (viewLevel === \"months\") {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-surface-subtle, #f1f5f9)\";\r\n e.currentTarget.style.borderColor =\r\n \"var(--pdp-surface-border, #e2e8f0)\";\r\n }\r\n }}\r\n >\r\n <span>\r\n {viewLevel === \"months\"\r\n ? toPersianDigits(activeYear)\r\n : `${toPersianDigits(decadeStartYear)} - ${toPersianDigits(decadeStartYear + 9)}`}\r\n </span>\r\n\r\n {viewLevel === \"months\" && (\r\n <svg\r\n width=\"13\"\r\n height=\"13\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{ opacity: 0.7 }}\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n )}\r\n </button>\r\n\r\n {/* Left Arrow (Next in RTL) */}\r\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={nextPeriodDisabled}\n aria-disabled={nextPeriodDisabled}\n aria-label=\"Next\"\n className={mergeClassNames(\n classNames?.navButton,\n nextPeriodDisabled && classNames?.disabledNavButton,\n )}\n style={{\n ...navBtnStyle,\n cursor: nextPeriodDisabled ? \"not-allowed\" : \"pointer\",\n opacity: nextPeriodDisabled ? 0.38 : 1,\n ...(nextPeriodDisabled ? styles?.disabledNavButton : undefined),\n }}\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Grid Content: 4 Columns x 3 Rows */}\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(4, 1fr)\",\r\n gridTemplateRows: \"repeat(3, 1fr)\",\r\n gap: \"8px 6px\",\r\n flex: 1,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {viewLevel === \"months\"\r\n ? PERSIAN_MONTH_NAMES.map((name, index) => {\n const isSelected =\n index === currentMonth && activeYear === currentYear;\n const isDisabled = !canSelectMonth(\n activeYear,\n index as JalaliMonthIndex,\n );\n return (\n <button\n key={name}\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n onClick={() => onSelectMonth(index as JalaliMonthIndex)}\n className={mergeClassNames(\n classNames?.monthButton,\n isSelected && classNames?.selectedMonthButton,\n isDisabled && classNames?.disabledMonthButton,\n )}\n style={{\n ...cellBtnBaseStyle,\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontWeight: isSelected ? 700 : 500,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n ...(styles?.monthButton ?? {}),\n ...(isSelected ? styles?.selectedMonthButton : undefined),\n ...(isDisabled ? styles?.disabledMonthButton : undefined),\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {name}\r\n </button>\r\n );\r\n })\r\n : decadeYears.map((year, idx) => {\n const isOutlier = idx === 0 || idx === 11;\n const isSelected = year === activeYear;\n const isDisabled = !canSelectYear(year);\n\r\n return (\r\n <button\r\n key={year}\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n className={mergeClassNames(\n classNames?.yearButton,\n isSelected && classNames?.selectedYearButton,\n isDisabled && classNames?.disabledYearButton,\n )}\n onClick={() => {\r\n setActiveYear(year);\r\n onSelectYear(year);\r\n setViewLevel(\"months\");\r\n }}\r\n style={{\r\n ...cellBtnBaseStyle,\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : isOutlier\r\n ? \"var(--pdp-text-disabled, #94a3b8)\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontWeight: isSelected ? 700 : 500,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.3 : isOutlier ? 0.4 : 1,\n ...(styles?.yearButton ?? {}),\n ...(isSelected ? styles?.selectedYearButton : undefined),\n ...(isDisabled ? styles?.disabledYearButton : undefined),\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {toPersianDigits(year)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import type { JalaliTime } from \"./types\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\n\r\n/**\r\n * Formats a single time segment (e.g. hour/minute) as a 2-digit padded string.\r\n */\r\nexport function formatTimeSegment(\r\n val: number,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n const padded = val < 10 ? `0${val}` : `${val}`;\r\n return digitType === \"persian\" ? toPersianDigits(padded) : padded;\r\n}\r\n\r\n/**\r\n * Retrieves the current local machine time as a JalaliTime structure.\r\n */\r\nexport function getCurrentTime(): JalaliTime {\r\n const now = new Date();\r\n return {\r\n hour: now.getHours(),\r\n minute: now.getMinutes(),\r\n second: now.getSeconds(),\r\n };\r\n}\r\n\r\n/**\r\n * Clamps hour, minute, and second within valid boundary ranges.\r\n */\r\nexport function clampTime(time: JalaliTime): JalaliTime {\r\n return {\r\n hour: Math.max(0, Math.min(23, time.hour)),\r\n minute: Math.max(0, Math.min(59, time.minute)),\r\n second:\r\n time.second !== undefined\r\n ? Math.max(0, Math.min(59, time.second))\r\n : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Formats a JalaliTime object into a display string (e.g., \"14:30\" or \"۱۴:۳۰\").\r\n */\r\nexport function formatTimeString(\r\n time: JalaliTime | null | undefined,\r\n showSeconds = false,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n if (!time) return \"\";\r\n const h = formatTimeSegment(time.hour, digitType);\r\n const m = formatTimeSegment(time.minute, digitType);\r\n if (showSeconds && time.second !== undefined) {\r\n const s = formatTimeSegment(time.second, digitType);\r\n return `${h}:${m}:${s}`;\r\n }\r\n return `${h}:${m}`;\r\n}\r\n","import React from \"react\";\r\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport { formatTimeString } from \"../../plugins/time-picker/time-utils\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\nimport type { CalendarFooterProps } from \"./types\";\r\n\r\nexport const CalendarFooter: React.FC<CalendarFooterProps> = ({\r\n selectedDate,\r\n selectedRange,\r\n selectedDates,\r\n selectedTime,\r\n showSeconds = false,\r\n mode = \"single\",\r\n digitType = \"persian\",\r\n showStatusText = true,\r\n showActions = true,\r\n onToday,\r\n onClear,\r\n onConfirm,\r\n direction = \"rtl\",\r\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n\r\n const statusText = (() => {\r\n if (mode === \"single\") {\r\n if (!selectedDate) return \"تاریخی انتخاب نشده\";\r\n const date = formatJalaliDate(selectedDate, \"YYYY/MM/DD\", { digitType });\r\n const time = selectedTime\r\n ? formatTimeString(selectedTime, showSeconds, digitType)\r\n : \"\";\r\n return time ? `${date}، ${time}` : date;\r\n }\r\n\r\n if (mode === \"range\") {\r\n const [start, end] = selectedRange ?? [null, null];\r\n if (!start) return \"بازه‌ای انتخاب نشده\";\r\n const startText = formatJalaliDate(start, \"YYYY/MM/DD\", { digitType });\r\n if (!end) return `${startText} تا …`;\r\n const endText = formatJalaliDate(end, \"YYYY/MM/DD\", { digitType });\r\n return `${startText} تا ${endText}`;\r\n }\r\n\r\n const count = selectedDates?.length ?? 0;\r\n const displayCount =\r\n digitType === \"persian\" ? toPersianDigits(count) : String(count);\r\n return count ? `${displayCount} تاریخ انتخاب شده` : \"تاریخی انتخاب نشده\";\r\n })();\r\n\r\n const actionButtonStyle: React.CSSProperties = {\r\n minHeight: \"34px\",\r\n padding: \"5px 12px\",\r\n borderRadius: theme.radii.sm,\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textSecondary,\r\n cursor: \"pointer\",\r\n fontFamily: \"inherit\",\r\n fontSize: \"0.78rem\",\r\n fontWeight: 600,\r\n };\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={classNames?.footer}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: showStatusText ? \"space-between\" : \"flex-end\",\r\n flexWrap: \"wrap\",\n gap: \"8px\",\n width: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n padding: \"10px 0 0\",\r\n borderTop: `1px solid ${theme.colors.border}`,\r\n color: theme.colors.textPrimary,\r\n ...styles?.footer,\r\n }}\r\n >\r\n {showStatusText && (\r\n <span\r\n className={classNames?.footerStatus}\r\n style={{\r\n color: theme.colors.textSecondary,\r\n fontSize: \"0.78rem\",\n lineHeight: 1.5,\n minWidth: 0,\n overflowWrap: \"anywhere\",\n ...styles?.footerStatus,\r\n }}\r\n >\r\n {statusText}\r\n </span>\r\n )}\r\n\r\n {showActions && (\r\n <div\r\n className={classNames?.footerActions}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n flexWrap: \"wrap\",\r\n gap: \"6px\",\r\n ...styles?.footerActions,\r\n }}\r\n >\r\n {onToday && (\r\n <button\r\n type=\"button\"\r\n onClick={onToday}\r\n className={classNames?.todayButton}\r\n style={{\r\n ...actionButtonStyle,\r\n color: theme.colors.primary,\r\n ...styles?.todayButton,\r\n }}\r\n >\r\n امروز\r\n </button>\r\n )}\r\n {onClear && (\r\n <button\r\n type=\"button\"\r\n onClick={onClear}\r\n className={classNames?.clearButton}\r\n style={{ ...actionButtonStyle, ...styles?.clearButton }}\r\n >\r\n پاک کردن\r\n </button>\r\n )}\r\n {onConfirm && (\r\n <button\r\n type=\"button\"\r\n onClick={onConfirm}\r\n className={classNames?.confirmButton}\r\n style={{\r\n ...actionButtonStyle,\r\n borderColor: theme.colors.primary,\r\n backgroundColor: theme.colors.primary,\r\n color: theme.colors.primaryText,\r\n ...styles?.confirmButton,\r\n }}\r\n >\r\n تأیید\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","// src/plugins/time-picker/TimePicker.tsx\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport type { JalaliTime } from \"./types\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport type {\r\n DatePickerClassNames,\r\n DatePickerStyles,\r\n} from \"../../theme/style-slots\";\r\n\r\nexport interface TimePickerProps {\r\n value: JalaliTime;\r\n onChange: (time: JalaliTime) => void;\r\n minuteStep?: number;\r\n hourStep?: number;\r\n showSeconds?: boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n}\r\n\r\nexport const TimePicker: React.FC<TimePickerProps> = ({\r\n value,\r\n onChange,\r\n minuteStep = 1,\r\n hourStep = 1,\r\n showSeconds = false,\r\n digitType = \"persian\",\r\n classNames,\r\n styles,\r\n}) => {\r\n const [openDropdown, setOpenDropdown] = useState<\r\n \"hour\" | \"minute\" | \"second\" | null\r\n >(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const hours = Array.from(\r\n { length: Math.ceil(24 / hourStep) },\r\n (_, i) => i * hourStep,\r\n );\r\n const minutes = Array.from(\r\n { length: Math.ceil(60 / minuteStep) },\r\n (_, i) => i * minuteStep,\r\n );\r\n const seconds = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n // Close dropdown on outside click\r\n useEffect(() => {\r\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n setOpenDropdown(null);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleOutsideClick);\r\n document.addEventListener(\"touchstart\", handleOutsideClick);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleOutsideClick);\r\n document.removeEventListener(\"touchstart\", handleOutsideClick);\r\n };\r\n }, []);\r\n\r\n const formatNum = (n: number) => {\r\n const formatted = String(n).padStart(2, \"0\");\r\n return digitType === \"persian\" ? toPersianDigits(formatted) : formatted;\r\n };\r\n\r\n const renderSelectColumn = (\r\n type: \"hour\" | \"minute\" | \"second\",\r\n currentVal: number,\r\n options: number[],\r\n onSelect: (val: number) => void,\r\n ) => {\r\n const isOpen = openDropdown === type;\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n {/* Clickable Badge Trigger */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setOpenDropdown(isOpen ? null : type)}\r\n style={{\r\n minWidth: \"40px\",\r\n height: \"30px\",\r\n padding: \"0 6px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: \"6px\",\r\n backgroundColor: isOpen\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"var(--pdp-surface-bg, #ffffff)\",\r\n color: isOpen ? \"#ffffff\" : \"var(--pdp-text-primary, #0f172a)\",\r\n border: `1px solid ${isOpen ? \"var(--pdp-primary, #4f46e5)\" : \"var(--pdp-surface-border, #e2e8f0)\"}`,\r\n fontSize: \"13px\",\r\n fontWeight: 700,\r\n cursor: \"pointer\",\r\n transition: \"all 0.15s ease\",\r\n boxShadow: isOpen ? \"0 0 0 2px rgba(79, 70, 229, 0.2)\" : \"none\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isOpen) {\r\n e.currentTarget.style.borderColor = \"var(--pdp-primary, #4f46e5)\";\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isOpen) {\r\n e.currentTarget.style.borderColor =\r\n \"var(--pdp-surface-border, #e2e8f0)\";\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-surface-bg, #ffffff)\";\r\n }\r\n }}\r\n >\r\n {formatNum(currentVal)}\r\n </button>\r\n\r\n {/* Scrollable Dropdown List */}\r\n {isOpen && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"calc(100% + 4px)\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n maxHeight: \"140px\",\r\n width: \"52px\",\r\n overflowY: \"auto\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n borderRadius: \"8px\",\r\n boxShadow:\r\n \"var(--pdp-shadow, 0 10px 15px -3px rgba(0, 0, 0, 0.15))\",\r\n zIndex: 1050,\r\n padding: \"4px 2px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"2px\",\r\n }}\r\n >\r\n {options.map((opt) => {\r\n const isSelected = opt === currentVal;\r\n return (\r\n <button\r\n key={opt}\r\n type=\"button\"\r\n onClick={() => {\r\n onSelect(opt);\r\n setOpenDropdown(null);\r\n }}\r\n style={{\r\n padding: \"4px 0\",\r\n border: \"none\",\r\n borderRadius: \"4px\",\r\n background: isSelected\r\n ? \"var(--pdp-primary, #4f46e5)\"\r\n : \"transparent\",\r\n color: isSelected\r\n ? \"#ffffff\"\r\n : \"var(--pdp-text-primary, #0f172a)\",\r\n fontSize: \"12px\",\r\n fontWeight: isSelected ? 700 : 500,\r\n cursor: \"pointer\",\r\n transition: \"background 0.12s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor =\r\n \"var(--pdp-hover-bg, #f1f5f9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isSelected)\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n }}\r\n >\r\n {formatNum(opt)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={classNames?.timePicker}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n gap: \"6px\",\r\n padding: \"6px 12px\",\r\n borderTop: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n backgroundColor: \"var(--pdp-surface-subtle, #f8fafc)\",\r\n borderRadius:\r\n \"0 0 var(--pdp-border-radius, 10px) var(--pdp-border-radius, 10px)\",\r\n direction: \"ltr\",\r\n userSelect: \"none\",\n width: \"100%\",\n maxWidth: \"100%\",\n boxSizing: \"border-box\",\n ...styles?.timePicker,\r\n }}\r\n >\r\n {/* ساعت */}\r\n {renderSelectColumn(\"hour\", value.hour, hours, (h) =>\r\n onChange({ ...value, hour: h }),\r\n )}\r\n\r\n <span\r\n style={{\r\n fontWeight: 800,\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n fontSize: \"14px\",\r\n }}\r\n >\r\n :\r\n </span>\r\n\r\n {/* دقیقه */}\r\n {renderSelectColumn(\"minute\", value.minute, minutes, (m) =>\r\n onChange({ ...value, minute: m }),\r\n )}\r\n\r\n {/* ثانیه */}\r\n {showSeconds && (\r\n <>\r\n <span\r\n style={{\r\n fontWeight: 800,\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n fontSize: \"14px\",\r\n }}\r\n >\r\n :\r\n </span>\r\n {renderSelectColumn(\"second\", value.second ?? 0, seconds, (s) =>\r\n onChange({ ...value, second: s }),\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import type { JalaliDate, JalaliMonthIndex } from \"../../core/types\";\r\nimport type { DateParseResult } from \"./types\";\r\nimport {\r\n toLatinDigits,\r\n toPersianDigits,\r\n} from \"../../formatters/persian-digits\";\r\nimport { getDaysInJalaliMonth } from \"../../core/jalali-math\";\r\nimport { compareJalaliDates } from \"../../core/jalali-helpers\";\r\n\r\n/**\r\n * Strips all non-digit characters and applies the 'YYYY/MM/DD' mask structure.\r\n */\r\nexport function applyDateMask(\r\n rawInput: string,\r\n digitType: \"persian\" | \"latin\" = \"persian\",\r\n): string {\r\n // Normalize all Persian/Arabic digits to ASCII 0-9\r\n const cleanDigits = toLatinDigits(rawInput).replace(/\\D/g, \"\").slice(0, 8);\r\n\r\n let masked = \"\";\r\n if (cleanDigits.length > 0) {\r\n masked = cleanDigits.slice(0, 4); // Year (YYYY)\r\n }\r\n if (cleanDigits.length >= 5) {\r\n masked += `/${cleanDigits.slice(4, 6)}`; // Month (MM)\r\n }\r\n if (cleanDigits.length >= 7) {\r\n masked += `/${cleanDigits.slice(6, 8)}`; // Day (DD)\r\n }\r\n\r\n return digitType === \"persian\" ? toPersianDigits(masked) : masked;\r\n}\r\n\r\n/**\r\n * Validates and parses a masked string into a valid JalaliDate object.\r\n */\r\nexport function parseAndValidateJalaliString(\r\n input: string,\r\n minDate?: JalaliDate,\r\n maxDate?: JalaliDate,\r\n isDateDisabled?: (date: JalaliDate) => boolean,\r\n): DateParseResult {\r\n const normalized = toLatinDigits(input).trim();\r\n\r\n if (!normalized) {\r\n return { isValid: true, date: null };\r\n }\r\n\r\n const parts = normalized.split(\"/\");\r\n if (\r\n parts.length !== 3 ||\r\n parts[0].length !== 4 ||\r\n parts[1].length !== 2 ||\r\n parts[2].length !== 2\r\n ) {\r\n return { isValid: false, date: null, error: \"INVALID_FORMAT\" };\r\n }\r\n\r\n const year = parseInt(parts[0], 10);\r\n const monthNum = parseInt(parts[1], 10);\r\n const day = parseInt(parts[2], 10);\r\n\r\n // Validate Month Range (1 to 12)\r\n if (monthNum < 1 || monthNum > 12) {\r\n return { isValid: false, date: null, error: \"INVALID_MONTH\" };\r\n }\r\n\r\n const monthIndex = (monthNum - 1) as JalaliMonthIndex;\r\n const maxDays = getDaysInJalaliMonth(year, monthIndex);\r\n\r\n // Validate Day Range (1 to 29/30/31 based on month & leap year)\r\n if (day < 1 || day > maxDays) {\r\n return { isValid: false, date: null, error: \"INVALID_DAY\" };\r\n }\r\n\r\n const jalaliDate: JalaliDate = { year, month: monthIndex, day };\r\n\r\n // Min / Max range validations\r\n if (minDate && compareJalaliDates(jalaliDate, minDate) < 0) {\r\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MIN_BOUNDS\" };\r\n }\r\n\r\n if (maxDate && compareJalaliDates(jalaliDate, maxDate) > 0) {\r\n return { isValid: false, date: jalaliDate, error: \"OUT_OF_MAX_BOUNDS\" };\r\n }\r\n\r\n // Custom disable rule\r\n if (isDateDisabled && isDateDisabled(jalaliDate)) {\r\n return { isValid: false, date: jalaliDate, error: \"DISABLED_DATE\" };\r\n }\r\n\r\n return { isValid: true, date: jalaliDate };\r\n}\r\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\r\nimport type { MaskedDateInputProps, DateValidationError } from \"./types\";\r\nimport { applyDateMask, parseAndValidateJalaliString } from \"./mask-utils\";\r\nimport { formatJalaliDate } from \"../../formatters/jalali-formatter\";\r\nimport type { JalaliDate } from \"../../core/types\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\n\r\nexport const MaskedDateInput: React.FC<MaskedDateInputProps> = ({\r\n value,\r\n defaultValue = null,\r\n onChange,\r\n onValidationError,\r\n digitType = \"persian\",\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n clearable = true,\r\n placeholder = \"۱۴۰۵/۰۱/۱۵\",\r\n disabled = false,\r\n direction = \"rtl\",\r\n wrapperClassName,\r\n wrapperStyle,\r\n clearButtonClassName,\r\n clearButtonStyle,\r\n style,\r\n ...restProps\r\n}) => {\r\n const { theme } = useTheme();\r\n const [internalValue, setInternalValue] = useState<JalaliDate | null>(\r\n defaultValue,\r\n );\r\n const activeDate = value !== undefined ? value : internalValue;\r\n\r\n const [text, setText] = useState<string>(() => {\r\n return activeDate\r\n ? formatJalaliDate(activeDate, \"YYYY/MM/DD\", { digitType })\r\n : \"\";\r\n });\r\n\r\n const [hasError, setHasError] = useState<boolean>(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Sync text input with incoming controlled value updates\r\n useEffect(() => {\r\n if (value !== undefined) {\r\n setText(\r\n value ? formatJalaliDate(value, \"YYYY/MM/DD\", { digitType }) : \"\",\r\n );\r\n setHasError(false);\r\n }\r\n }, [value, digitType]);\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const rawVal = e.target.value;\r\n const maskedVal = applyDateMask(rawVal, digitType);\r\n setText(maskedVal);\r\n\r\n // Validate only if complete date is typed (10 chars: YYYY/MM/DD) or empty\r\n if (maskedVal.length === 10 || maskedVal.length === 0) {\r\n const result = parseAndValidateJalaliString(\r\n maskedVal,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n );\r\n\r\n if (result.isValid) {\r\n setHasError(false);\r\n onValidationError?.(null);\r\n if (value === undefined) {\r\n setInternalValue(result.date);\r\n }\r\n onChange?.(result.date);\r\n } else {\r\n setHasError(true);\r\n onValidationError?.(result.error as DateValidationError);\r\n }\r\n } else {\r\n // Incomplete state\r\n setHasError(false);\r\n onValidationError?.(null);\r\n }\r\n };\r\n\r\n const handleClear = useCallback(() => {\r\n setText(\"\");\r\n setHasError(false);\r\n onValidationError?.(null);\r\n if (value === undefined) {\r\n setInternalValue(null);\r\n }\r\n onChange?.(null);\r\n inputRef.current?.focus();\r\n }, [value, onChange, onValidationError]);\r\n\r\n return (\r\n <div\r\n dir={direction}\r\n className={wrapperClassName}\r\n style={{\r\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n width: \"100%\",\n maxWidth: \"180px\",\n ...wrapperStyle,\r\n }}\r\n >\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n disabled={disabled}\r\n placeholder={digitType === \"persian\" ? placeholder : \"1405/01/15\"}\r\n value={text}\r\n onChange={handleInputChange}\r\n style={{\r\n width: \"180px\",\n maxWidth: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n padding: \"8px 12px\",\r\n paddingInlineEnd: clearable && text ? \"32px\" : \"12px\",\r\n borderRadius: theme.radii.sm,\r\n border: `1px solid ${hasError ? theme.colors.holiday : theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n fontSize: \"14px\",\r\n fontFamily: \"inherit\",\r\n outlineColor: theme.colors.primary,\r\n textAlign: \"center\",\r\n letterSpacing: \"1px\",\r\n transition: \"border-color 0.15s ease\",\r\n ...style,\r\n }}\r\n {...restProps}\r\n />\r\n\r\n {/* Clear Button */}\r\n {clearable && text && !disabled && (\r\n <button\r\n type=\"button\"\r\n aria-label=\"پاک کردن\"\r\n onClick={handleClear}\r\n className={clearButtonClassName}\r\n style={{\r\n position: \"absolute\",\r\n insetInlineEnd: \"8px\",\r\n background: \"none\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n color: theme.colors.textSecondary,\r\n fontSize: \"14px\",\r\n lineHeight: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"2px\",\r\n ...clearButtonStyle,\r\n }}\r\n >\r\n ✕\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { CalendarEvent } from \"./types\";\r\n\r\n/**\r\n * Filters and returns all events matching a specific Jalali date.\r\n */\r\nexport function getEventsForDate(\r\n date: JalaliDate,\r\n events?: CalendarEvent[],\r\n): CalendarEvent[] {\r\n if (!events || events.length === 0) return [];\r\n return events.filter((e) => isSameJalaliDay(e.date, date));\r\n}\r\n","import type { JalaliDate } from \"../core/types\";\r\nimport type { OfficialHoliday, CustomHolidayRule } from \"./types\";\r\nimport { jalaliToGregorian } from \"../core/jalali-math\";\r\n\r\n/**\r\n * Fixed Solar Calendar Holidays in Iran:\r\n * Key format: `${monthIndex}-${day}` (Month index is 0-based: 0 = Farvardin, 11 = Esfand)\r\n */\r\nconst FIXED_SOLAR_HOLIDAYS: Record<string, string> = {\r\n \"0-1\": \"جشن نوروز / سال نو\",\r\n \"0-2\": \"عید نوروز\",\r\n \"0-3\": \"عید نوروز\",\r\n \"0-4\": \"عید نوروز\",\r\n \"0-12\": \"روز جمهوری اسلامی ایران\",\r\n \"0-13\": \"روز طبیعت (سیزده‌بدر)\",\r\n \"2-14\": \"رحلت امام خمینی\",\r\n \"2-15\": \"قیام ۱۵ خرداد\",\r\n \"10-22\": \"پیروزی انقلاب اسلامی\",\r\n \"11-29\": \"روز ملی شدن صنعت نفت\",\r\n};\r\n\r\n/**\r\n * Checks if a given Jalali date is Friday (جمعه).\r\n */\r\nexport function isJalaliFriday(date: JalaliDate): boolean {\r\n const g = jalaliToGregorian(date.year, date.month, date.day);\r\n return g.getDay() === 5; // In JS Date.getDay(), 5 represents Friday\r\n}\r\n\r\n/**\r\n * Resolves holiday info for a JalaliDate based purely on solar calendar rules and custom overrides.\r\n */\r\nexport function getOfficialHoliday(\r\n date: JalaliDate,\r\n customHolidays?: CustomHolidayRule[],\r\n): OfficialHoliday | null {\r\n // 1. Check Custom User-Defined Holidays\r\n if (customHolidays && customHolidays.length > 0) {\r\n const custom = customHolidays.find(\r\n (h) =>\r\n h.date.year === date.year &&\r\n h.date.month === date.month &&\r\n h.date.day === date.day,\r\n );\r\n if (custom) {\r\n return {\r\n title: custom.title,\r\n type: \"custom\",\r\n isOff: custom.isOff ?? true,\r\n };\r\n }\r\n }\r\n\r\n // 2. Check Fixed Solar Holidays (O(1) Hash Map Lookup)\r\n const solarKey = `${date.month}-${date.day}`;\r\n if (FIXED_SOLAR_HOLIDAYS[solarKey]) {\r\n return {\r\n title: FIXED_SOLAR_HOLIDAYS[solarKey],\r\n type: \"solar\",\r\n isOff: true,\r\n };\r\n }\r\n\r\n // 3. Check Friday (End of Week)\r\n if (isJalaliFriday(date)) {\r\n return { title: \"جمعه (تعطیل پایان هفته)\", type: \"solar\", isOff: true };\r\n }\r\n\r\n return null;\r\n}\r\n","// src/components/JalaliDatePicker.tsx\r\nimport React, {\r\n useState,\r\n useRef,\r\n useCallback,\r\n useMemo,\r\n useEffect,\r\n} from \"react\";\r\nimport { useJalaliDatePicker } from \"../hooks/useJalaliDatePicker\";\r\nimport { useCalendarKeyboard } from \"../a11y/useCalendarKeyboard\";\r\nimport type {\r\n SelectionMode,\r\n JalaliDateRange,\r\n InternalSelectedValue,\r\n SelectedDateValue,\r\n DateRange,\r\n} from \"../hooks/types\";\r\nimport { Header } from \"./Header\";\r\nimport { Weekdays } from \"./Weekdays\";\r\nimport { DayCell } from \"./DayCell\";\r\nimport { MonthYearPicker } from \"./MonthYearPicker\";\r\nimport type {\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n JalaliCalendarCell,\r\n} from \"../core/types\";\r\nimport { formatJalaliDate } from \"../formatters/jalali-formatter\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../core/constants\";\r\nimport { toPersianDigits } from \"../formatters/persian-digits\";\r\nimport { CalendarFooter } from \"./footer/CalendarFooter\";\r\nimport { TimePicker } from \"../plugins/time-picker/TimePicker\";\r\nimport type { JalaliTime } from \"../plugins/time-picker/types\";\r\nimport {\r\n formatTimeString,\r\n getCurrentTime,\r\n} from \"../plugins/time-picker/time-utils\";\r\nimport { MaskedDateInput } from \"./masked-input/MaskedDateInput\";\r\nimport { generateJalaliCalendarGrid } from \"../core/calendar-grid\";\r\nimport {\r\n isJalaliDateBetween,\r\n jsDateToJalali,\r\n jalaliToJsDate,\r\n} from \"../core/jalali-helpers\";\r\nimport { isSameJalaliDay } from \"../core/jalali-math\";\r\nimport type { CalendarEvent } from \"../events/types\";\r\nimport { getEventsForDate } from \"../events/event-utils\";\r\nimport { getOfficialHoliday } from \"../holidays\";\r\nimport type { CustomHolidayRule } from \"../holidays/types\";\r\nimport type {\n DatePickerClassNames,\n DatePickerStyles,\n} from \"../theme/style-slots\";\nimport { isJalaliMonthSelectable } from \"../core/date-availability\";\n\r\nexport interface JalaliDatePickerProps<M extends SelectionMode = \"single\"> {\r\n mode?: M;\r\n value?: SelectedDateValue<M>;\r\n defaultValue?: SelectedDateValue<M>;\r\n onChange?: (val: SelectedDateValue<M>) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n isDateDisabled?: (date: Date) => boolean;\r\n digitType?: \"persian\" | \"latin\";\r\n variant?: \"inline\" | \"popover\" | \"modal\";\r\n placeholder?: string;\r\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n classNames?: DatePickerClassNames;\r\n styles?: DatePickerStyles;\r\n showFooter?: boolean;\r\n showStatusText?: boolean;\r\n allowClear?: boolean;\r\n enableTime?: boolean;\r\n timeValue?: JalaliTime | null;\r\n defaultTimeValue?: JalaliTime;\r\n onTimeChange?: (time: JalaliTime) => void;\r\n minuteStep?: number;\r\n hourStep?: number;\r\n showSeconds?: boolean;\r\n numberOfMonths?: 1 | 2;\r\n useMaskedInput?: boolean;\r\n events?: CalendarEvent[];\r\n showHolidays?: boolean;\r\n customHolidays?: CustomHolidayRule[];\r\n zIndex?: number;\r\n}\r\n\r\nexport function JalaliDatePicker<M extends SelectionMode = \"single\">({\r\n mode = \"single\" as M,\r\n value,\r\n defaultValue,\r\n onChange,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n firstDayOfWeek = 0,\r\n variant = \"popover\",\r\n placeholder = \"YYYY/MM/DD\",\r\n digitType = \"persian\",\r\n className,\r\n style,\r\n classNames,\r\n styles,\r\n showFooter = true,\r\n showStatusText = true,\r\n allowClear = true,\r\n enableTime = false,\r\n timeValue,\r\n defaultTimeValue,\r\n onTimeChange,\r\n minuteStep = 1,\r\n hourStep = 1,\r\n showSeconds = false,\r\n numberOfMonths = 1,\r\n useMaskedInput = false,\r\n events,\r\n showHolidays = false,\r\n customHolidays,\r\n zIndex = 9999,\r\n}: JalaliDatePickerProps<M>) {\r\n const [isOpen, setIsOpen] = useState(variant === \"inline\");\r\n const [showMonthYearPicker, setShowMonthYearPicker] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const isModal = variant === \"modal\";\r\n\r\n useEffect(() => {\r\n if (variant === \"inline\") {\r\n setIsOpen(true);\r\n }\r\n }, [variant]);\r\n\r\n const initialTime = useMemo<JalaliTime>(() => {\r\n if (defaultTimeValue) return defaultTimeValue;\r\n if (value instanceof Date) {\r\n return {\r\n hour: value.getHours(),\r\n minute: value.getMinutes(),\r\n second: value.getSeconds(),\r\n };\r\n }\r\n if (defaultValue instanceof Date) {\r\n return {\r\n hour: defaultValue.getHours(),\r\n minute: defaultValue.getMinutes(),\r\n second: defaultValue.getSeconds(),\r\n };\r\n }\r\n return getCurrentTime();\r\n }, [defaultTimeValue, value, defaultValue]);\r\n\r\n const [internalTime, setInternalTime] = useState<JalaliTime>(initialTime);\r\n const activeTime =\r\n timeValue !== undefined ? (timeValue ?? getCurrentTime()) : internalTime;\r\n\r\n useEffect(() => {\r\n if (variant === \"inline\" || !isOpen) return;\r\n\r\n const handleClickOutside = (e: MouseEvent | TouchEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n setShowMonthYearPicker(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"touchstart\", handleClickOutside, {\r\n passive: true,\r\n });\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"touchstart\", handleClickOutside);\r\n };\r\n }, [variant, isOpen]);\r\n\r\n const internalJalaliValue = useMemo<\r\n InternalSelectedValue<M> | undefined\r\n >(() => {\r\n if (value === undefined) return undefined;\r\n if (!value) return null as InternalSelectedValue<M>;\r\n if (value instanceof Date) {\r\n return jsDateToJalali(value) as InternalSelectedValue<M>;\r\n }\r\n if (Array.isArray(value)) {\r\n if (mode === \"range\") {\r\n const [start, end] = value as DateRange;\r\n return [\r\n start ? jsDateToJalali(start) : null,\r\n end ? jsDateToJalali(end) : null,\r\n ] as InternalSelectedValue<M>;\r\n }\r\n if (mode === \"multiple\") {\r\n return (value as Date[]).map((d) =>\r\n jsDateToJalali(d),\r\n ) as InternalSelectedValue<M>;\r\n }\r\n }\r\n return null as InternalSelectedValue<M>;\r\n }, [value, mode]);\r\n\r\n const internalDefaultJalaliValue = useMemo<\r\n InternalSelectedValue<M> | undefined\r\n >(() => {\r\n if (defaultValue === undefined) return undefined;\r\n if (!defaultValue) return null as InternalSelectedValue<M>;\r\n if (defaultValue instanceof Date) {\r\n return jsDateToJalali(defaultValue) as InternalSelectedValue<M>;\r\n }\r\n if (Array.isArray(defaultValue)) {\r\n if (mode === \"range\") {\r\n const [start, end] = defaultValue as DateRange;\r\n return [\r\n start ? jsDateToJalali(start) : null,\r\n end ? jsDateToJalali(end) : null,\r\n ] as InternalSelectedValue<M>;\r\n }\r\n if (mode === \"multiple\") {\r\n return (defaultValue as Date[]).map((d) =>\r\n jsDateToJalali(d),\r\n ) as InternalSelectedValue<M>;\r\n }\r\n }\r\n return null as InternalSelectedValue<M>;\r\n }, [defaultValue, mode]);\r\n\r\n const internalMinDate = useMemo(\r\n () => (minDate ? jsDateToJalali(minDate) : undefined),\r\n [minDate],\r\n );\r\n const internalMaxDate = useMemo(\n () => (maxDate ? jsDateToJalali(maxDate) : undefined),\r\n [maxDate],\r\n );\n\n const internalIsDateDisabled = useCallback(\n (jDate: JalaliDate) =>\n isDateDisabled ? isDateDisabled(jalaliToJsDate(jDate)) : false,\n [isDateDisabled],\n );\n\r\n const convertJalaliToDateOutput = useCallback(\r\n (\r\n jVal: InternalSelectedValue<M>,\r\n specificTime?: JalaliTime,\r\n ): SelectedDateValue<M> => {\r\n if (!jVal) return null as SelectedDateValue<M>;\r\n\r\n const t = specificTime ?? activeTime;\r\n const h = enableTime ? t.hour : 0;\r\n const m = enableTime ? t.minute : 0;\r\n const s = enableTime && showSeconds ? (t.second ?? 0) : 0;\r\n\r\n if (mode === \"single\" && !Array.isArray(jVal)) {\r\n return jalaliToJsDate(\r\n jVal as JalaliDate,\r\n h,\r\n m,\r\n s,\r\n ) as SelectedDateValue<M>;\r\n }\r\n\r\n if (mode === \"range\" && Array.isArray(jVal)) {\r\n const [start, end] = jVal as JalaliDateRange;\r\n return [\r\n start ? jalaliToJsDate(start, 0, 0, 0) : null,\r\n end ? jalaliToJsDate(end, 23, 59, 59) : null,\r\n ] as SelectedDateValue<M>;\r\n }\r\n\r\n if (mode === \"multiple\" && Array.isArray(jVal)) {\r\n return (jVal as JalaliDate[]).map((d) =>\r\n jalaliToJsDate(d, h, m, s),\r\n ) as SelectedDateValue<M>;\r\n }\r\n\r\n return null as SelectedDateValue<M>;\r\n },\r\n [mode, enableTime, activeTime, showSeconds],\r\n );\r\n\r\n const {\r\n selected,\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n goToPrevMonth,\r\n goToNextMonth,\r\n setView,\r\n goToToday,\r\n selectDate,\r\n setHoverDate,\r\n hoverDate,\r\n clear,\r\n } = useJalaliDatePicker({\r\n mode,\r\n value: internalJalaliValue,\r\n defaultValue: internalDefaultJalaliValue,\r\n minDate: internalMinDate,\r\n maxDate: internalMaxDate,\r\n firstDayOfWeek,\r\n isDateDisabled: isDateDisabled ? internalIsDateDisabled : undefined,\n onChange: (val) => {\r\n onChange?.(convertJalaliToDateOutput(val));\r\n },\r\n });\r\n\r\n const handleTimeChange = useCallback(\r\n (newTime: JalaliTime) => {\r\n if (timeValue === undefined) setInternalTime(newTime);\r\n onTimeChange?.(newTime);\r\n\r\n if (selected && onChange) {\r\n onChange(convertJalaliToDateOutput(selected, newTime));\r\n }\r\n },\r\n [timeValue, onTimeChange, selected, onChange, convertJalaliToDateOutput],\r\n );\r\n\r\n const singleSelectedDate =\r\n mode === \"single\" ? (selected as JalaliDate | null) : null;\r\n\r\n const handleDateSelect = (d: JalaliDate) => {\r\n selectDate(d);\r\n if (variant === \"popover\" && mode === \"single\" && !enableTime) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handleClearClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n clear();\r\n };\r\n\r\n const { handleKeyDown, getCellTabIndex, setFocusedDate } =\r\n useCalendarKeyboard({\r\n viewYear,\r\n viewMonth,\r\n selectedDate: singleSelectedDate,\r\n onSelectDate: handleDateSelect,\r\n onViewChange: setView,\r\n isRtl: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (!isModal || !isOpen) return;\r\n const originalOverflow = document.body.style.overflow;\r\n document.body.style.overflow = \"hidden\";\r\n\r\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") setIsOpen(false);\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleGlobalKeyDown);\r\n return () => {\r\n document.body.style.overflow = originalOverflow;\r\n window.removeEventListener(\"keydown\", handleGlobalKeyDown);\r\n };\r\n }, [isModal, isOpen]);\r\n\r\n const nextMonthState = useMemo<{\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (viewMonth === 11) return { year: viewYear + 1, month: 0 };\r\n return { year: viewYear, month: (viewMonth + 1) as JalaliMonthIndex };\r\n }, [viewYear, viewMonth]);\n\n const prevMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewMonth === 0) return { year: viewYear - 1, month: 11 };\n return { year: viewYear, month: (viewMonth - 1) as JalaliMonthIndex };\n }, [viewYear, viewMonth]);\n\n const isPrevMonthDisabled = !isJalaliMonthSelectable(\n prevMonthState.year,\n prevMonthState.month,\n { minDate: internalMinDate, maxDate: internalMaxDate },\n );\n const nextNavigationState =\n numberOfMonths === 2\n ? nextMonthState.month === 11\n ? { year: nextMonthState.year + 1, month: 0 as JalaliMonthIndex }\n : {\n year: nextMonthState.year,\n month: (nextMonthState.month + 1) as JalaliMonthIndex,\n }\n : nextMonthState;\n const isNextMonthDisabled = !isJalaliMonthSelectable(\n nextNavigationState.year,\n nextNavigationState.month,\n { minDate: internalMinDate, maxDate: internalMaxDate },\n );\n\r\n const secondGrid = useMemo<JalaliCalendarCell[]>(() => {\r\n if (numberOfMonths !== 2) return [];\r\n\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year: nextMonthState.year,\r\n month: nextMonthState.month,\r\n firstDayOfWeek,\r\n minDate: internalMinDate,\r\n maxDate: internalMaxDate,\r\n });\r\n\r\n if (mode !== \"range\") return rawGrid;\r\n\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n const effectiveEnd = end ?? (start && hoverDate ? hoverDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n }, [\r\n numberOfMonths,\r\n nextMonthState,\r\n firstDayOfWeek,\r\n internalMinDate,\r\n internalMaxDate,\r\n mode,\r\n selected,\r\n hoverDate,\r\n ]);\r\n\r\n const formattedInputValue = useMemo(() => {\r\n if (!selected) return \"\";\r\n if (mode === \"single\") {\r\n const datePart = formatJalaliDate(selected as JalaliDate, \"YYYY/MM/DD\", {\r\n digitType,\r\n });\r\n if (enableTime && activeTime) {\r\n const timePart = formatTimeString(activeTime, showSeconds, digitType);\r\n return `${datePart} ${timePart}`;\r\n }\r\n return datePart;\r\n }\r\n if (mode === \"range\") {\r\n const [start, end] = (selected as JalaliDateRange) || [null, null];\r\n if (start && end) {\r\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ${formatJalaliDate(end, \"YYYY/MM/DD\", { digitType })}`;\r\n }\r\n if (start)\r\n return `${formatJalaliDate(start, \"YYYY/MM/DD\", { digitType })} - ...`;\r\n }\r\n if (mode === \"multiple\" && Array.isArray(selected)) {\r\n return `${toPersianDigits((selected as JalaliDate[]).length)} تاریخ انتخاب شده`;\r\n }\r\n return \"\";\r\n }, [selected, mode, digitType, enableTime, activeTime, showSeconds]);\r\n\r\n const hasValue = Boolean(\r\n mode === \"single\"\r\n ? selected\r\n : mode === \"range\"\r\n ? (selected as JalaliDateRange)?.[0]\r\n : (selected as JalaliDate[])?.length,\r\n );\r\n\r\n const renderCalendarPane = (\r\n y: number,\r\n m: JalaliMonthIndex,\r\n paneGrid: JalaliCalendarCell[],\r\n showPrevArrow = true,\r\n showNextArrow = true,\r\n ) => (\n <div\n className={classNames?.calendarPane}\n style={{\n width: \"calc(7 * var(--pdp-cell-size, 34px) + 6 * 4px)\",\n maxWidth: \"100%\",\n minWidth: 0,\n flex: \"1 1 calc(7 * var(--pdp-cell-size, 34px) + 6 * 4px)\",\n ...styles?.calendarPane,\n }}\r\n >\r\n <Header\r\n year={y}\r\n monthName={PERSIAN_MONTH_NAMES[m]}\r\n onPrevMonth={showPrevArrow ? goToPrevMonth : () => {}}\r\n onNextMonth={showNextArrow ? goToNextMonth : () => {}}\r\n onTitleClick={() => setShowMonthYearPicker((prev) => !prev)}\r\n isPickerOpen={showMonthYearPicker}\n isPrevDisabled={showPrevArrow ? isPrevMonthDisabled : true}\n isNextDisabled={showNextArrow ? isNextMonthDisabled : true}\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n <Weekdays\r\n firstDayOfWeek={firstDayOfWeek}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n <div\r\n role=\"grid\"\r\n aria-label={`${PERSIAN_MONTH_NAMES[m]} ${toPersianDigits(y)}`}\r\n className={classNames?.grid}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"4px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n ...styles?.grid,\r\n }}\r\n >\r\n {paneGrid.map((cell, index) => {\r\n const holidayInfo = showHolidays\r\n ? getOfficialHoliday(cell.jalali, customHolidays)\r\n : null;\r\n const dayEvents = getEventsForDate(cell.jalali, events);\r\n\r\n return (\r\n <DayCell\r\n key={index}\r\n cell={cell}\r\n digitType={digitType}\r\n isHoliday={Boolean(holidayInfo)}\r\n holidayTitle={holidayInfo?.title}\r\n events={dayEvents}\r\n classNames={classNames}\r\n styles={styles}\r\n tabIndex={getCellTabIndex(cell.jalali)}\r\n onSelect={handleDateSelect}\r\n onHover={setHoverDate}\r\n onFocus={setFocusedDate}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n\r\n const calendarContent = (\r\n <div\r\n role={isModal ? \"dialog\" : \"region\"}\r\n aria-modal={isModal ? true : undefined}\r\n aria-label=\"تقویم شمسی\"\r\n onKeyDown={handleKeyDown}\r\n onClick={(e) => e.stopPropagation()}\r\n className={classNames?.calendar}\r\n style={{\r\n position:\r\n variant === \"popover\" ? \"absolute\" : isModal ? \"relative\" : \"static\",\r\n top: variant === \"popover\" ? \"calc(100% + 6px)\" : undefined,\r\n left: variant === \"popover\" ? 0 : undefined,\r\n zIndex: isModal ? zIndex + 1 : zIndex,\r\n padding: \"12px\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n borderRadius: \"var(--pdp-border-radius, 12px)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n boxShadow: isModal\n ? \"0 20px 25px -5px rgb(0 0 0 / 0.3)\"\r\n : \"0 10px 25px -5px rgba(0, 0, 0, 0.15), 0 8px 10px -6px rgba(0, 0, 0, 0.1)\",\r\n width: \"max-content\",\n maxWidth:\n variant === \"inline\" ? \"100%\" : \"calc(100vw - 24px)\",\n maxHeight: isModal ? \"calc(100dvh - 32px)\" : undefined,\n overflowY: isModal ? \"auto\" : undefined,\n overflowX: \"hidden\",\n userSelect: \"none\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\r\n direction: \"rtl\",\r\n boxSizing: \"border-box\",\r\n ...styles?.calendar,\r\n }}\r\n >\r\n {showMonthYearPicker ? (\r\n <MonthYearPicker\r\n currentYear={viewYear}\r\n currentMonth={viewMonth}\r\n onSelectMonth={(m) => {\r\n setView(viewYear, m);\r\n setShowMonthYearPicker(false);\r\n }}\r\n onSelectYear={(y) => setView(y, viewMonth)}\n minDate={internalMinDate}\n maxDate={internalMaxDate}\n isDateDisabled={\n isDateDisabled ? internalIsDateDisabled : undefined\n }\n classNames={classNames}\r\n styles={styles}\r\n />\r\n ) : (\r\n <>\r\n <div\n className={classNames?.calendarPanes}\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n gap: \"20px\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n width: \"100%\",\n minWidth: 0,\n boxSizing: \"border-box\",\n ...styles?.calendarPanes,\n }}\r\n >\r\n {renderCalendarPane(\r\n viewYear,\r\n viewMonth,\r\n grid,\r\n true,\r\n numberOfMonths === 1,\r\n )}\r\n\r\n {numberOfMonths === 2 && (\n <>\n {renderCalendarPane(\n nextMonthState.year,\r\n nextMonthState.month,\r\n secondGrid,\r\n false,\r\n true,\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {enableTime && (\r\n <TimePicker\r\n value={activeTime}\r\n onChange={handleTimeChange}\r\n minuteStep={minuteStep}\r\n hourStep={hourStep}\r\n showSeconds={showSeconds}\r\n digitType={digitType}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n )}\r\n\r\n {showFooter && (\r\n <CalendarFooter\r\n mode={mode}\r\n digitType={digitType}\r\n showStatusText={showStatusText}\r\n selectedDate={\r\n mode === \"single\" ? (selected as JalaliDate | null) : null\r\n }\r\n selectedRange={\r\n mode === \"range\" ? (selected as JalaliDateRange) : undefined\r\n }\r\n selectedDates={\r\n mode === \"multiple\" ? (selected as JalaliDate[]) : undefined\r\n }\r\n selectedTime={enableTime ? activeTime : undefined}\r\n onToday={goToToday}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={className ?? classNames?.root}\r\n style={{\r\n position: \"relative\",\n display: \"inline-block\",\n maxWidth: \"100%\",\n verticalAlign: \"top\",\n zIndex: isOpen && variant === \"popover\" ? zIndex : 1,\r\n ...style,\r\n ...styles?.root,\r\n }}\r\n >\r\n {variant !== \"inline\" &&\r\n (useMaskedInput && mode === \"single\" && variant === \"popover\" ? (\r\n <MaskedDateInput\r\n value={singleSelectedDate}\r\n digitType={digitType}\r\n placeholder={placeholder}\r\n onChange={(d) => {\r\n if (d) {\r\n selectDate(d);\r\n setView(d.year, d.month);\r\n } else {\r\n clear();\r\n }\r\n }}\r\n onClick={() => setIsOpen(true)}\r\n className={classNames?.input}\r\n style={{\r\n direction: \"ltr\",\r\n textAlign: \"left\",\r\n ...styles?.input,\r\n }}\r\n />\r\n ) : (\r\n <div\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setIsOpen((prev) => !prev);\r\n }}\r\n style={{\r\n position: \"relative\",\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n direction: \"ltr\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\r\n >\r\n <input\r\n type=\"text\"\r\n readOnly\r\n placeholder={placeholder}\r\n value={formattedInputValue}\r\n className={classNames?.input}\r\n style={{\r\n direction: \"ltr\",\r\n textAlign: \"left\",\r\n padding: \"8px 30px 8px 12px\",\r\n borderRadius: \"var(--pdp-border-radius, 8px)\",\r\n border: \"1px solid var(--pdp-surface-border, #e2e8f0)\",\r\n backgroundColor: \"var(--pdp-surface-bg, #ffffff)\",\r\n color: \"var(--pdp-text-primary, #0f172a)\",\r\n cursor: \"pointer\",\r\n fontSize: \"13.5px\",\n minWidth: enableTime ? \"190px\" : \"150px\",\n width: \"100%\",\n maxWidth: \"100%\",\n boxSizing: \"border-box\",\r\n ...styles?.input,\r\n }}\r\n />\r\n\r\n {allowClear && hasValue && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClearClick}\r\n aria-label=\"Clear value\"\r\n style={{\r\n position: \"absolute\",\r\n right: \"8px\",\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n color: \"var(--pdp-text-muted, #94a3b8)\",\r\n padding: \"2px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"14px\",\r\n fontWeight: 700,\r\n lineHeight: 1,\r\n borderRadius: \"50%\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.color =\r\n \"var(--pdp-holiday-color, #e11d48)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.color =\r\n \"var(--pdp-text-muted, #94a3b8)\";\r\n }}\r\n >\r\n ✕\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n\r\n {isOpen &&\r\n (isModal ? (\r\n <div\r\n role=\"presentation\"\r\n onClick={() => setIsOpen(false)}\r\n className={classNames?.modalBackdrop}\r\n style={{\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: \"rgba(15, 23, 42, 0.6)\",\r\n backdropFilter: \"blur(4px)\",\r\n zIndex: zIndex,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n overflowY: \"auto\",\n direction: \"rtl\",\r\n ...styles?.modalBackdrop,\r\n }}\r\n >\r\n {calendarContent}\r\n </div>\r\n ) : (\r\n calendarContent\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useMemo, useCallback } from \"react\";\r\nimport type { DualMonthCalendarProps } from \"./types\";\r\nimport type {\r\n JalaliDate,\r\n JalaliMonthIndex,\r\n JalaliCalendarCell,\r\n} from \"../../core/types\";\r\nimport type { JalaliDateRange } from \"../../hooks/types\";\r\nimport { getTodayJalali, isSameJalaliDay } from \"../../core/jalali-math\";\r\nimport {\n generateJalaliCalendarGrid,\n toJalaliDate,\n} from \"../../core/calendar-grid\";\nimport {\r\n compareJalaliDates,\r\n isJalaliDateBetween,\r\n} from \"../../core/jalali-helpers\";\r\nimport { PERSIAN_MONTH_NAMES } from \"../../core/constants\";\r\nimport { toPersianDigits } from \"../../formatters/persian-digits\";\r\nimport { Weekdays } from \"../Weekdays\";\r\nimport { DayCell } from \"../DayCell\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\nimport { mergeClassNames } from \"../../theme/style-utils\";\nimport { isJalaliMonthSelectable } from \"../../core/date-availability\";\n\r\nexport const DualMonthCalendar: React.FC<DualMonthCalendarProps> = ({\r\n value,\r\n defaultValue = [null, null],\r\n onChange,\r\n initialViewDate,\r\n firstDayOfWeek = 0,\r\n digitType = \"persian\",\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n direction = \"rtl\",\r\n className,\r\n style,\r\n classNames,\r\n styles,\r\n}) => {\r\n const { theme } = useTheme();\r\n // 1. Selection State (Controlled vs Uncontrolled)\r\n const [internalRange, setInternalRange] =\r\n useState<JalaliDateRange>(defaultValue);\r\n const activeRange = value !== undefined ? value : internalRange;\r\n\r\n // 2. Hover state for range preview\r\n const [hoveredDate, setHoveredDate] = useState<JalaliDate | null>(null);\r\n const formatNumber = (value: number) =>\r\n digitType === \"persian\" ? toPersianDigits(value) : String(value);\r\n\r\n // 3. View state for First Month (Left)\r\n const today = useMemo(() => getTodayJalali(), []);\r\n const [viewState, setViewState] = useState<{\r\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (initialViewDate) return initialViewDate;\r\n if (activeRange[0])\r\n return { year: activeRange[0].year, month: activeRange[0].month };\r\n return { year: today.year, month: today.month };\r\n });\r\n\r\n // Calculate Second Month (Right)\r\n const nextMonthState = useMemo<{\n year: number;\r\n month: JalaliMonthIndex;\r\n }>(() => {\r\n if (viewState.month === 11) {\r\n return { year: viewState.year + 1, month: 0 };\r\n }\r\n return {\r\n year: viewState.year,\r\n month: (viewState.month + 1) as JalaliMonthIndex,\r\n };\r\n }, [viewState]);\n\n const prevMonthState = useMemo<{\n year: number;\n month: JalaliMonthIndex;\n }>(() => {\n if (viewState.month === 0) {\n return { year: viewState.year - 1, month: 11 };\n }\n return {\n year: viewState.year,\n month: (viewState.month - 1) as JalaliMonthIndex,\n };\n }, [viewState]);\n\n const minJalali = useMemo(\n () => (minDate ? toJalaliDate(minDate) : undefined),\n [minDate],\n );\n const maxJalali = useMemo(\n () => (maxDate ? toJalaliDate(maxDate) : undefined),\n [maxDate],\n );\n const isPrevDisabled = !isJalaliMonthSelectable(\n prevMonthState.year,\n prevMonthState.month,\n { minDate: minJalali, maxDate: maxJalali },\n );\n const monthAfterSecond =\n nextMonthState.month === 11\n ? { year: nextMonthState.year + 1, month: 0 as JalaliMonthIndex }\n : {\n year: nextMonthState.year,\n month: (nextMonthState.month + 1) as JalaliMonthIndex,\n };\n const isNextDisabled = !isJalaliMonthSelectable(\n monthAfterSecond.year,\n monthAfterSecond.month,\n { minDate: minJalali, maxDate: maxJalali },\n );\n\r\n // 4. Synchronized Navigation (moves both months together)\r\n const handlePrevMonth = () => {\n if (isPrevDisabled) return;\n setViewState((prev) => {\r\n if (prev.month === 0) return { year: prev.year - 1, month: 11 };\r\n return { year: prev.year, month: (prev.month - 1) as JalaliMonthIndex };\r\n });\r\n };\r\n\r\n const handleNextMonth = () => {\n if (isNextDisabled) return;\n setViewState((prev) => {\r\n if (prev.month === 11) return { year: prev.year + 1, month: 0 };\r\n return { year: prev.year, month: (prev.month + 1) as JalaliMonthIndex };\r\n });\r\n };\r\n\r\n // 5. Date Selection Handler\r\n const handleDateSelect = useCallback(\r\n (target: JalaliDate) => {\r\n const [start, end] = activeRange;\r\n let newRange: JalaliDateRange;\r\n\r\n if (!start || (start && end)) {\r\n newRange = [target, null];\r\n } else {\r\n if (compareJalaliDates(target, start) < 0) {\r\n newRange = [target, start];\r\n } else {\r\n newRange = [start, target];\r\n }\r\n setHoveredDate(null);\r\n }\r\n\r\n if (value === undefined) {\r\n setInternalRange(newRange);\r\n }\r\n onChange?.(newRange);\r\n },\r\n [activeRange, value, onChange],\r\n );\r\n\r\n // 6. Enrich cells with cross-month range metadata\r\n const enrichGridCells = useCallback(\r\n (year: number, month: JalaliMonthIndex): JalaliCalendarCell[] => {\r\n const rawGrid = generateJalaliCalendarGrid({\r\n year,\r\n month,\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n });\r\n\r\n const [start, end] = activeRange;\r\n const effectiveEnd = end ?? (start && hoveredDate ? hoveredDate : null);\r\n\r\n return rawGrid.map((cell) => {\r\n const isStart = start ? isSameJalaliDay(cell.jalali, start) : false;\r\n const isEnd = effectiveEnd\r\n ? isSameJalaliDay(cell.jalali, effectiveEnd)\r\n : false;\r\n let inRange = false;\r\n\r\n if (start && effectiveEnd) {\r\n inRange = isJalaliDateBetween(cell.jalali, start, effectiveEnd);\r\n }\r\n\r\n return {\r\n ...cell,\r\n isSelected: isStart || isEnd,\r\n isInRange: inRange,\r\n isRangeStart: isStart,\r\n isRangeEnd: isEnd,\r\n };\r\n });\r\n },\r\n [\r\n firstDayOfWeek,\r\n minDate,\r\n maxDate,\r\n isDateDisabled,\r\n activeRange,\r\n hoveredDate,\r\n ],\r\n );\r\n\r\n const leftGrid = useMemo(\r\n () => enrichGridCells(viewState.year, viewState.month),\r\n [enrichGridCells, viewState.year, viewState.month],\r\n );\r\n\r\n const rightGrid = useMemo(\r\n () => enrichGridCells(nextMonthState.year, nextMonthState.month),\r\n [enrichGridCells, nextMonthState.year, nextMonthState.month],\r\n );\r\n\r\n const renderMonthPane = (\r\n year: number,\r\n month: JalaliMonthIndex,\r\n grid: JalaliCalendarCell[],\r\n isLeftPane: boolean,\r\n ) => (\r\n <div\r\n dir={direction}\r\n className={classNames?.calendarPane}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\n width: \"var(--pdp-calendar-pane-width, 276px)\",\n maxWidth: \"100%\",\n minWidth: 0,\n flex: \"1 1 var(--pdp-calendar-pane-width, 276px)\",\n ...styles?.calendarPane,\r\n }}\r\n >\r\n {/* Pane Header */}\r\n <div\r\n className={classNames?.header}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 4px\",\r\n height: \"32px\",\r\n ...styles?.header,\r\n }}\r\n >\r\n {isLeftPane ? (\r\n <button\r\n type=\"button\"\n aria-label=\"ماه قبل\"\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n aria-disabled={isPrevDisabled}\n className={mergeClassNames(\n classNames?.navButton,\n isPrevDisabled && classNames?.disabledNavButton,\n )}\n style={{\r\n width: \"28px\",\r\n height: \"28px\",\r\n borderRadius: \"6px\",\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n cursor: isPrevDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isPrevDisabled ? 0.38 : 1,\n ...styles?.navButton,\n ...(isPrevDisabled ? styles?.disabledNavButton : undefined),\n }}\r\n >\r\n {direction === \"rtl\" ? \"›\" : \"‹\"}\r\n </button>\r\n ) : (\r\n <div style={{ width: \"28px\" }} />\r\n )}\r\n\r\n <div\r\n style={{\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n color: theme.colors.textPrimary,\r\n }}\r\n >\r\n {PERSIAN_MONTH_NAMES[month]} {formatNumber(year)}\r\n </div>\r\n\r\n {!isLeftPane ? (\r\n <button\r\n type=\"button\"\n aria-label=\"ماه بعد\"\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n aria-disabled={isNextDisabled}\n className={mergeClassNames(\n classNames?.navButton,\n isNextDisabled && classNames?.disabledNavButton,\n )}\n style={{\r\n width: \"28px\",\r\n height: \"28px\",\r\n borderRadius: \"6px\",\r\n border: `1px solid ${theme.colors.border}`,\r\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n cursor: isNextDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isNextDisabled ? 0.38 : 1,\n ...styles?.navButton,\n ...(isNextDisabled ? styles?.disabledNavButton : undefined),\n }}\r\n >\r\n {direction === \"rtl\" ? \"‹\" : \"›\"}\r\n </button>\r\n ) : (\r\n <div style={{ width: \"28px\" }} />\r\n )}\r\n </div>\r\n\r\n <Weekdays\r\n firstDayOfWeek={firstDayOfWeek}\r\n classNames={classNames}\r\n styles={styles}\r\n />\r\n\r\n {/* Grid */}\r\n <div\r\n role=\"grid\"\r\n aria-label={`${PERSIAN_MONTH_NAMES[month]} ${formatNumber(year)}`}\r\n dir={direction}\r\n className={classNames?.grid}\r\n style={{\r\n display: \"grid\",\r\n width: \"100%\",\n minWidth: 0,\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: \"var(--pdp-cell-gap, 4px)\",\r\n ...styles?.grid,\r\n }}\r\n >\r\n {grid.map((cell) => (\r\n <DayCell\r\n key={`${cell.jalali.year}-${cell.jalali.month}-${cell.jalali.day}`}\r\n cell={cell}\r\n digitType={digitType}\r\n classNames={classNames}\r\n styles={styles}\r\n tabIndex={0}\r\n onSelect={handleDateSelect}\r\n onHover={setHoveredDate}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n role=\"region\"\r\n aria-label=\"تقویم دوقلو شمسی\"\r\n dir={direction}\r\n className={mergeClassNames(className, classNames?.calendar)}\r\n style={\r\n {\r\n \"--pdp-cell-size\": \"36px\",\r\n \"--pdp-cell-gap\": \"4px\",\r\n \"--pdp-calendar-pane-width\": \"276px\",\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n gap: \"24px\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n backgroundColor: theme.colors.background,\r\n color: theme.colors.textPrimary,\r\n borderRadius: theme.radii.lg,\r\n border: `1px solid ${theme.colors.border}`,\r\n boxShadow: theme.shadows.lg,\r\n width:\n \"calc(var(--pdp-calendar-pane-width, 276px) + var(--pdp-calendar-pane-width, 276px) + 56px)\",\n maxWidth: \"100%\",\n ...style,\r\n ...styles?.calendar,\r\n } as React.CSSProperties\r\n }\r\n >\r\n {renderMonthPane(viewState.year, viewState.month, leftGrid, true)}\n {renderMonthPane(\n nextMonthState.year,\r\n nextMonthState.month,\r\n rightGrid,\r\n false,\r\n )}\r\n </div>\r\n );\r\n};\r\n"],"mappings":";;;AAGA,IAAa,IAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAKa,IAAwB;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAKa,IAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GACa,IAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;AClDA,SAAgB,EAAiB,GAAuB;CACtD,IAAM,IAAS;EACb;EAAK;EAAG;EAAI;EAAK;EAAK;EAAK;EAAK;EAAK;EAAM;EAAM;EAAM;EAAM;EAAM;EACnE;EAAM;EAAM;EAAM;EAAM;EAAM;CAChC,GAEI,IAAK,EAAO,IACZ,IAAO;CAEX,IAAI,IAAO,KAAM,KAAQ,EAAO,EAAO,SAAS,IAC9C,MAAU,MAAM,eAAe,EAAK,6BAA6B;CAGnE,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK;EACtC,IAAM,IAAK,EAAO;EAElB,IADA,IAAO,IAAK,GACR,IAAO,GAAI;EACf,IAAK;CACP;CAEA,IAAI,IAAI,IAAO;CACf,AAAI,IAAO,IAAI,MAAG,IAAI,IAAI,KAAS,IAAO,KAAK,KAAM;CACrD,IAAI,KAAS,IAAI,KAAK,KAAM;CAG5B,OAFI,MAAS,OAAI,IAAO,IAEjB,IAAO,KAAM;AACtB;AAKA,SAAgB,EACd,GACA,GACQ;CACR,IAAI,IAAQ,KAAK,IAAQ,IACvB,MAAU,WACR,4DACF;CAOF,OAJI,KAAS,IAAU,KAEnB,KAAS,MAEN,EAAiB,CAAI,IAFJ,KAEa;AACvC;AAKA,SAAgB,EACd,GACA,GACA,GACY;CACZ,IAAM,IAAQ;EACZ;EACA;EACC,IAAK,KAAM,KAAK,IAAK,OAAQ,KAAM,IAAK,OAAQ,IAAI,KAAK;EAC1D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,GACI,GACA,GACA,GAEA,IAAM,IAAK,IAAI,IAAK,IAAI,GACxB,IACF,SACA,MAAM,IACN,KAAK,OAAO,IAAM,KAAK,CAAC,IACxB,KAAK,OAAO,IAAM,MAAM,GAAG,IAC3B,KAAK,OAAO,IAAM,OAAO,GAAG,IAC5B;CAEF,KAAK,IAAI,IAAI,GAAG,IAAI,GAAI,EAAE,GAAG,KAAQ,EAAM;CAqB3C,OAnBA,IAAK,QAAQ,KAAK,KAAK,MAAM,IAAO,KAAK,GACzC,KAAQ,OAER,KAAM,IAAI,KAAK,MAAM,IAAO,IAAI,GAChC,KAAQ,MAEJ,IAAO,QACT,KAAM,KAAK,OAAO,IAAO,KAAK,GAAG,GACjC,KAAQ,IAAO,KAAK,MAGlB,IAAO,OACT,IAAK,KAAK,MAAM,IAAO,EAAE,GACzB,IAAK,IAAK,IAAO,OAEjB,IAAK,IAAI,KAAK,OAAO,IAAO,OAAO,EAAE,GACrC,IAAK,KAAM,IAAO,OAAO,KAGpB;EAAE,MAAM;EAAI,OAAO;EAAwB,KAAK;CAAG;AAC5D;AAKA,SAAgB,EACd,GACA,GACA,GACM;CACN,IAAI,GACA,GACA,GAEA,IAAM,IAAK,MACX,IACF,UACA,MAAM,IACN,KAAK,MAAM,IAAM,EAAE,IAAI,IACvB,KAAK,OAAQ,IAAM,KAAM,KAAK,CAAC,IAC/B,KACC,IAAK,IAAI,IAAK,MAAM,IAAK,KAAK,KAAK;CAmBtC,AAjBA,IAAK,MAAM,KAAK,MAAM,IAAO,MAAM,GACnC,KAAQ,QAEJ,IAAO,UACT,KAAM,MAAM,KAAK,MAAM,EAAE,IAAO,KAAK,GACrC,KAAQ,OACJ,KAAQ,OAAK,MAGnB,KAAM,IAAI,KAAK,MAAM,IAAO,IAAI,GAChC,KAAQ,MAEJ,IAAO,QACT,KAAM,KAAK,OAAO,IAAO,KAAK,GAAG,GACjC,KAAQ,IAAO,KAAK,MAGtB,IAAK,IAAO;CACZ,IAAM,IAAQ;EACZ;EACA;EACC,IAAK,KAAM,KAAK,IAAK,OAAQ,KAAM,IAAK,OAAQ,IAAI,KAAK;EAC1D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,KAAK,IAAK,GAAG,IAAK,MAAM,IAAK,EAAM,IAAK,KACtC,KAAM,EAAM;CAGd,IAAM,IAAS,IAAI,KAAK,GAAI,IAAK,GAAG,CAAE;CAEtC,OADA,EAAO,SAAS,GAAG,GAAG,GAAG,CAAC,GACnB;AACT;AAKA,SAAgB,IAA6B;CAC3C,IAAM,oBAAM,IAAI,KAAK;CACrB,OAAO,EACL,EAAI,YAAY,GAChB,EAAI,SAAS,IAAI,GACjB,EAAI,QAAQ,CACd;AACF;AAKA,SAAgB,EACd,GACA,GACS;CAET,OADI,CAAC,KAAK,CAAC,IAAU,KACd,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AACjE;;;ACtLA,SAAgB,EAAa,GAAsC;CAQjE,OAPI,aAAiB,OACZ,EACL,EAAM,YAAY,GAClB,EAAM,SAAS,IAAI,GACnB,EAAM,QAAQ,CAChB,IAEK;AACT;AAKA,SAAgB,EACd,GACsB;CACtB,IAAM,EACJ,SACA,UACA,oBAAiB,GACjB,iBACA,YACA,YACA,sBACE,GAEE,IAA8B,CAAC,GAC/B,IAAc,EAAe,GAC7B,IAAiB,IAAe,EAAa,CAAY,IAAI,MAC7D,IAAY,IAAU,EAAa,CAAO,IAAI,MAC9C,IAAY,IAAU,EAAa,CAAO,IAAI,MAU9C,MAPoB,EAAkB,GAAM,GAAO,CAI3C,CAAA,CAAkB,OACN,IAAQ,KAAK,IAES,IAAiB,KAAK,GAGhE,IAAa,MAAU,IAAI,KAAK,IAAQ,GACxC,IAAW,MAAU,IAAI,IAAO,IAAI,GACpC,IAAkB,EAAqB,GAAU,CAAS;CAEhE,KAAK,IAAI,IAAI,IAAsB,GAAG,KAAK,GAAG,KAAK;EAEjD,IAAM,IAAoB;GAAE,MAAM;GAAU,OAAO;GAAW,KADlD,IAAkB;EACoC;EAClE,EAAM,KAAK,EAAU,GAAO,EAAK,CAAC;CACpC;CAGA,IAAM,IAAY,EAAqB,GAAM,CAAK;CAClD,KAAK,IAAI,IAAI,GAAG,KAAK,GAAW,KAAK;EACnC,IAAM,IAAoB;GAAE;GAAM;GAAO,KAAK;EAAE;EAChD,EAAM,KAAK,EAAU,GAAO,EAAI,CAAC;CACnC;CAGA,IAAM,IAAa,MAAU,KAAK,IAAI,IAAQ,GACxC,IAAW,MAAU,KAAK,IAAO,IAAI,GACrC,IAAuB,KAAK,EAAM;CAExC,KAAK,IAAI,IAAI,GAAG,KAAK,GAAsB,KAAK;EAC9C,IAAM,IAAoB;GAAE,MAAM;GAAU,OAAO;GAAW,KAAK;EAAE;EACrE,EAAM,KAAK,EAAU,GAAO,EAAK,CAAC;CACpC;CAEA,SAAS,EACP,GACA,GACoB;EACpB,IAAM,IAAW,EAAkB,EAAM,MAAM,EAAM,OAAO,EAAM,GAAG,GAC/D,IAAU,EAAgB,GAAO,CAAW,GAC5C,IAAa,IACf,EAAgB,GAAO,CAAc,IACrC,IAEA,IAAa;EACjB,IAAI,GAAW;GACb,IAAM,IAAO,EACX,EAAU,MACV,EAAU,OACV,EAAU,GACZ;GACA,AAAI,EAAS,QAAQ,IAAI,EAAK,QAAQ,MAAG,IAAa;EACxD;EACA,IAAI,GAAW;GACb,IAAM,IAAO,EACX,EAAU,MACV,EAAU,OACV,EAAU,GACZ;GACA,AAAI,EAAS,QAAQ,IAAI,EAAK,QAAQ,MAAG,IAAa;EACxD;EAKA,OAJI,KAAkB,EAAe,GAAO,CAAQ,MAClD,IAAa,KAGR;GACL,QAAQ;GACR,eAAe;GACf,WAAW,EAAM;GACjB;GACA;GACA;GACA;EACF;CACF;CAEA,OAAO;AACT;;;AC5HA,SAAgB,EAAe,GAAqB;CAClD,OAAO,EAAkB,EAAE,YAAY,GAAG,EAAE,SAAS,IAAI,GAAG,EAAE,QAAQ,CAAC;AACzE;AAEA,SAAgB,EACd,GACA,IAAQ,GACR,IAAU,GACV,IAAU,GACJ;CACN,IAAM,IAAI,EAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;CAElD,OADA,EAAE,SAAS,GAAO,GAAS,GAAS,CAAC,GAC9B;AACT;AAKA,SAAgB,EACd,GACA,GACA,GACiB;CAGjB,QAFU,EAAkB,GAAM,GAA2B,CAC/C,CAAA,CAAE,OACP,IAAQ,KAAK;AACxB;AAKA,SAAgB,EAAgB,GAAkB,GAA0B;CAC1E,IAAM,IAAI,EAAkB,EAAK,MAAM,EAAK,OAAO,EAAK,GAAG;CAG3D,OAFA,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAI,GAErB,EAAkB,EAAE,YAAY,GAAG,EAAE,SAAS,IAAI,GAAG,EAAE,QAAQ,CAAC;AACzE;AAKA,IAAa,IAAgB;AAQ7B,SAAgB,EAAmB,GAAgB,GAAwB;CAIzE,OAHI,EAAG,SAAS,EAAG,OACf,EAAG,UAAU,EAAG,QAChB,EAAG,QAAQ,EAAG,MACX,IADuB,EAAG,MAAM,EAAG,MAAM,KAAK,IADnB,EAAG,QAAQ,EAAG,QAAQ,KAAK,IAD7B,EAAG,OAAO,EAAG,OAAO,KAAK;AAI3D;AAKA,SAAgB,EACd,GACA,GACA,GACA,IAAY,IACH;CACT,IAAM,IAAU,EAAmB,GAAO,CAAG,KAAK,IAAI,IAAQ,GACxD,IAAU,EAAmB,GAAO,CAAG,KAAK,IAAI,IAAM,GAEtD,IAAS,EAAmB,GAAQ,CAAO,GAC3C,IAAS,EAAmB,GAAQ,CAAO;CAKjD,OAHI,IACK,KAAU,KAAK,KAAU,IAE3B,IAAS,KAAK,IAAS;AAChC;AAKA,SAAgB,EAAmB,GAA4C;CAE7E,IAAM,IAAc,EAAgB,GAAM,CADxB,EAAmB,EAAK,MAAM,EAAK,OAAO,EAAK,GACtB,CAAS;CAEpD,OAAO,CAAC,GADU,EAAgB,GAAa,CAC1B,CAAS;AAChC;AAKA,SAAgB,EACd,GAC0B;CAC1B,IAAM,IAAc,EAAqB,EAAK,MAAM,EAAK,KAAK;CAO9D,OAAO,CAAC;EANoB,MAAM,EAAK;EAAM,OAAO,EAAK;EAAO,KAAK;CAM7D,GAAO;EAJb,MAAM,EAAK;EACX,OAAO,EAAK;EACZ,KAAK;CAEQ,CAAG;AACpB;;;AClGA,SAAgB,EACd,GACA,IAAqC,CAAC,GAC7B;CACT,IAAM,EAAE,YAAS,YAAS,sBAAmB;CAG7C,OAFI,KAAW,EAAmB,GAAM,CAAO,IAAI,KAC/C,KAAW,EAAmB,GAAM,CAAO,IAAI,IAAU,KACtD,CAAC,IAAiB,CAAI;AAC/B;AAEA,SAAgB,EACd,GACA,GACA,IAAqC,CAAC,GAC7B;CACT,IAAM,IAAuB;EAAE;EAAM;EAAO,KAAK;CAAE,GAC7C,IAAsB;EAC1B;EACA;EACA,KAAK,EAAqB,GAAM,CAAK;CACvC;CAEA,IACG,EAAY,WACX,EAAmB,GAAS,EAAY,OAAO,IAAI,KACpD,EAAY,WACX,EAAmB,GAAU,EAAY,OAAO,IAAI,GAEtD,OAAO;CAGT,IAAI,CAAC,EAAY,gBAAgB,OAAO;CACxC,KAAK,IAAI,IAAM,GAAG,KAAO,EAAQ,KAAK,KAAO,GAC3C,IAAI,EAAuB;EAAE;EAAM;EAAO;CAAI,GAAG,CAAW,GAAG,OAAO;CAExE,OAAO;AACT;AAEA,SAAgB,EACd,GACA,IAAqC,CAAC,GAC7B;CACT,KAAK,IAAI,IAAQ,GAAG,IAAQ,IAAI,KAAS,GACvC,IACE,EACE,GACA,GACA,CACF,GAEA,OAAO;CAGX,OAAO;AACT;;;ACnDA,SAAgB,EACd,IAAyC,CAAC,GAC1C;CACA,IAAM,EACJ,UAAO,UACP,OAAO,GACP,iBACA,oBACA,aACA,YACA,YACA,mBACA,oBAAiB,MACf,GAEE,IAAQ,QAAc,EAAe,GAAG,CAAC,CAAC,GAE1C,CAAC,GAAe,KAAoB,QAElC,MAAiB,KAAA,IACjB,MAAS,WAAiB,OAC1B,MAAS,UACJ,CAAC,MAAM,IAAI,IACb,CAAC,IAJ+B,CAM3C,GAEM,IACJ,MAAoB,KAAA,IAA8B,IAAlB,GAE5B,CAAC,GAAU,KAAe,QAC1B,IAAwB,EAAgB,OACxC,KAAgB,CAAC,MAAM,QAAQ,CAAY,IACrC,EAA4B,OAC/B,EAAM,IACd,GAEK,CAAC,GAAW,KAAgB,QAC5B,IAAwB,EAAgB,QACxC,KAAgB,CAAC,MAAM,QAAQ,CAAY,IACrC,EAA4B,QAC/B,EAAM,KACd,GAEK,CAAC,GAAW,KAAgB,EAA4B,IAAI,GAE5D,IAAgB,GACnB,MACC,EAAuB,GAAM;EAC3B;EACA;EACA;CACF,CAAC,GACH;EAAC;EAAS;EAAS;CAAc,CACnC,GAEM,IAAU,GAAa,GAAc,MAA4B;EAErE,AADA,EAAY,CAAI,GAChB,EAAa,CAAK;CACpB,GAAG,CAAC,CAAC,GAEC,IAAgB,QAAkB;EACtC,AAAI,MAAc,KAChB,GAAa,MAAM,IAAI,CAAC,GACxB,EAAa,EAAE,KAEf,GAAc,MAAO,IAAI,CAAsB;CAEnD,GAAG,CAAC,CAAS,CAAC,GAER,IAAgB,QAAkB;EACtC,AAAI,MAAc,MAChB,GAAa,MAAM,IAAI,CAAC,GACxB,EAAa,CAAC,KAEd,GAAc,MAAO,IAAI,CAAsB;CAEnD,GAAG,CAAC,CAAS,CAAC,GAER,IAAY,QAAkB;EAClC,IAAM,IAAI,EAAe;EAEzB,AADA,EAAY,EAAE,IAAI,GAClB,EAAa,EAAE,KAAK;CACtB,GAAG,CAAC,CAAC,GAEC,IAAa,GAChB,MAAqB;EACpB,IAAI,CAAC,EAAc,CAAI,GAAG;EAE1B,IAAI;EAEJ,IAAI,MAAS,UACX,IAAY;OACP,IAAI,MAAS,SAAS;GAE3B,IAAM,CAAC,GAAO,KADQ,KAAgC,CAAC,MAAM,IAAI;GAGjE,AAYI,IAZA,CAAC,KAAU,KAAS,IACV,CAAC,GAAM,IAAI,IAGrB,EAAK,OAAO,EAAM,QACjB,EAAK,SAAS,EAAM,QAAQ,EAAK,QAAQ,EAAM,SAC/C,EAAK,SAAS,EAAM,QACnB,EAAK,UAAU,EAAM,SACrB,EAAK,MAAM,EAAM,MAEP,CAAC,GAAM,CAAK,IAEZ,CAAC,GAAO,CAAI;EAG9B,OAAO;GACL,IAAM,IAAe,KAA6B,CAAC;GAEnD,AAKE,IANa,EAAY,MAAM,MAAM,EAAgB,GAAG,CAAI,CAC1D,IACU,EAAY,QACrB,MAAM,CAAC,EAAgB,GAAG,CAAI,CACjC,IAEY,CAAC,GAAG,GAAa,CAAI;EAErC;EAKA,AAHI,MAAoB,KAAA,KACtB,EAAiB,CAAS,GAE5B,IAAW,CAAS;CACtB,GACA;EAAC;EAAM;EAAU;EAAiB;EAAU;CAAa,CAC3D,GAEM,IAAiB,GACpB,MAA8B;EAC7B,IAAI,MAAS,UACX,OAAO,EAAgB,GAA+B,CAAI;EAE5D,IAAI,MAAS,SAAS;GACpB,IAAM,CAAC,GAAO,KAAQ,KAAgC,CAAC,MAAM,IAAI;GACjE,OAAO,GACJ,KAAS,EAAgB,GAAO,CAAI,KAClC,KAAO,EAAgB,GAAK,CAAI;EAEvC;EACA,QAAS,KAA6B,CAAC,EAAA,CAAG,MAAM,MAC9C,EAAgB,GAAM,CAAI,CAC5B;CACF,GACA,CAAC,GAAM,CAAQ,CACjB,GAEM,IAAQ,QAAkB;EAC9B,IAAM,IACJ,MAAS,WAAW,OAAO,MAAS,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC;EAMhE,AAHI,MAAoB,KAAA,KACtB,EAAiB,CAAU,GAE7B,IAAW,CAAU;CACvB,GAAG;EAAC;EAAM;EAAiB;CAAQ,CAAC;CAkEpC,OAAO;EACL;EACA;EACA;EACA,MApEW,QAAc;GACzB,IAAM,IAAU,EAA2B;IACzC,MAAM;IACN,OAAO;IACP;IACA;IACA;IACA;GACF,CAAC;GAED,IAAI,MAAS,UAAU;IACrB,IAAM,IAAiB;IACvB,OAAO,EAAQ,KAAK,OAAU;KAC5B,GAAG;KACH,YAAY,IACR,EAAgB,EAAK,QAAQ,CAAc,IAC3C;IACN,EAAE;GACJ;GAEA,IAAI,MAAS,SAAS;IACpB,IAAM,CAAC,GAAO,KAAQ,KAAgC,CAAC,MAAM,IAAI,GAC3D,IAAe,MAAQ,KAAS,IAAY,IAAY;IAE9D,OAAO,EAAQ,KAAK,MAAS;KAC3B,IAAM,IAAU,IAAQ,EAAgB,EAAK,QAAQ,CAAK,IAAI,IACxD,IAAQ,IACV,EAAgB,EAAK,QAAQ,CAAY,IACzC,IACA,IAAU;KAId,OAHI,KAAS,MACX,IAAU,EAAoB,EAAK,QAAQ,GAAO,CAAY,IAEzD;MACL,GAAG;MACH,YAAY,KAAW;MACvB,WAAW;MACX,cAAc;MACd,YAAY;KACd;IACF,CAAC;GACH;GAEA,IAAI,MAAS,YAAY;IACvB,IAAM,IAAQ,KAA6B,CAAC;IAC5C,OAAO,EAAQ,KAAK,OAAU;KAC5B,GAAG;KACH,YAAY,EAAK,MAAM,MAAM,EAAgB,GAAG,EAAK,MAAM,CAAC;IAC9D,EAAE;GACJ;GAEA,OAAO;EACT,GAAG;GACD;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAME;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;AC1PA,SAAgB,EACd,GACkB;CAClB,IAAM,EAAE,mBAAgB,QAAK,WAAQ,OAAS,GAC1C,EAAE,SAAM,UAAO,WAAQ,GACvB,IAAc,IACd,IAAU,IAGR,IAAW,IAAQ,IAAI,IACvB,IAAY,IAAQ,KAAK;CAE/B,QAAQ,GAAR;EACE,KAAK;GACH,KAAO;GACP;EAEF,KAAK;GACH,KAAO;GACP;EAEF,KAAK;GACH,KAAO;GACP;EAEF,KAAK;GACH,KAAO;GACP;EAEF,KAAK;GACH,IAAM;GACN;EAEF,KAAK;GACH,IAAM,EAAqB,GAAM,CAAK;GACtC;EAEF,KAAK;GAQH,AANI,MAAU,KACZ,KACA,IAAQ,MAER,KAEF,IAAc;GACd;EAEF,KAAK;GAQH,AANI,MAAU,MACZ,KAAQ,GACR,IAAQ,KAER,KAAiB,GAEnB,IAAc;GACd;EAEF,SAEE,OADA,IAAU,IACH;GAAE,UAAU;GAAgB,aAAa;GAAO,SAAS;EAAM;CAC1E;CAGA,OAAO,IAAM,IAQX,AAPI,MAAU,KACZ,KACA,IAAQ,MAER,KAEF,KAAO,EAAqB,GAAM,CAAK,GACvC,IAAc;CAGhB,OAAO,IAAM,EAAqB,GAAM,CAAK,IAQ3C,AAPA,KAAO,EAAqB,GAAM,CAAK,GACnC,MAAU,MACZ,KAAQ,GACR,IAAQ,KAER,KAAiB,GAEnB,IAAc;CAGhB,OAAO;EACL,UAAU;GAAE;GAAM;GAAO;EAAI;EAC7B;EACA;CACF;AACF;;;ACxFA,SAAgB,EAAgB,GAA0B;CAKxD,IAAM,IAAc,GAJF,EAAkB,EAAK,MAAM,EAAK,OAAO,EAAK,GAClD,CAAA,CAAU,OACC,IAAQ,KAAK,IAGhC,IAAY,EAAoB,EAAK;CAE3C,OAAO,GAAG,EAAY,IAAI,EAAK,IAAI,GAAG,EAAU,GAAG,EAAK;AAC1D;;;ACXA,SAAgB,EAAoB,GAAiC;CACnE,IAAM,EACJ,aACA,cACA,iBACA,iBACA,iBACA,WAAQ,OACN,GAEE,CAAC,GAAa,KAAkB,QAC7B,KAAgB;EAAE,MAAM;EAAU,OAAO;EAAW,KAAK;CAAE,CACnE;CAmCD,OAAO;EACL;EACA;EACA,eApCoB,GACnB,MAA2B;GAC1B,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;IAEtC,AADA,EAAE,eAAe,GACjB,EAAa,CAAW;IACxB;GACF;GAEA,IAAM,IAAS,EAAyB;IACtC,gBAAgB;IAChB,KAAK,EAAE;IACP;GACF,CAAC;GAED,AAAI,EAAO,YACT,EAAE,eAAe,GACjB,EAAe,EAAO,QAAQ,GAE1B,EAAO,eACT,EAAa,EAAO,SAAS,MAAM,EAAO,SAAS,KAAK;EAG9D,GACA;GAAC;GAAa;GAAO;GAAc;EAAY,CAa/C;EACA,iBAXsB,GACrB,MACQ,EAAgB,GAAU,CAAW,IAAI,IAAI,IAEtD,CAAC,CAAW,CAOZ;CACF;AACF;;;AC3DA,IAAM,KAAiB;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG,GAClE,KAAuC;CAC3C,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACP;AAKA,SAAgB,EAAgB,GAAgC;CAC9D,OAAO,OAAO,CAAK,CAAC,CAAC,QAAQ,WAAW,MAAM,GAAe,CAAC,EAAE;AAClE;AAKA,SAAgB,EAAc,GAAuB;CACnD,OAAO,EAAM,QAAQ,cAAc,MAAS,GAAa,MAAS,CAAI;AACxE;;;ACfA,SAAgB,EACd,GACA,IAAU,cACV,IAA+B,CAAC,GACxB;CACR,IAAI,CAAC,GAAM,OAAO;CAElB,IAAM,EAAE,eAAY,cAAc,GAI5B,KAFY,EAAkB,EAAK,MAAM,EAAK,OAAO,EAAK,GAClD,CAAA,CAAU,OACC,IAAQ,KAAK,GAEhC,IAAU,OAAO,EAAK,IAAI,GAC1B,IAAe,EAAQ,MAAM,EAAE,GAC/B,IAAW,EAAK,QAAQ,GACxB,IAAW,IAAW,KAAK,IAAI,MAAa,OAAO,CAAQ,GAC3D,IAAY,EAAoB,EAAK,QACrC,IAAS,EAAK,MAAM,KAAK,IAAI,EAAK,QAAQ,OAAO,EAAK,GAAG,GACzD,IAAc,EAAuB,IAEvC,IAAY,EACb,QAAQ,aAAa,CAAO,CAAC,CAC7B,QAAQ,WAAW,CAAY,CAAC,CAChC,QAAQ,aAAa,CAAS,CAAC,CAC/B,QAAQ,WAAW,CAAQ,CAAC,CAC5B,QAAQ,UAAU,OAAO,CAAQ,CAAC,CAAC,CACnC,QAAQ,aAAa,CAAW,CAAC,CACjC,QAAQ,WAAW,CAAM,CAAC,CAC1B,QAAQ,UAAU,OAAO,EAAK,GAAG,CAAC;CAOrC,OALI,MAAc,cAEhB,IAAY,EAAU,QAAQ,SAAS,MAAQ,EAAgB,CAAG,CAAC,IAG9D;AACT;;;ACvDA,IAAa,IAAoB;CAC/B,MAAM;CACN,QAAQ;EACN,SAAS;EACT,cAAc;EACd,aAAa;EACb,YAAY;EACZ,iBAAiB;EACjB,SAAS;EACT,QAAQ;EACR,aAAa;EACb,eAAe;EACf,cAAc;EACd,SAAS;EACT,mBAAmB;EACnB,iBAAiB;EACjB,aAAa;CACf;CACA,OAAO;EACL,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,MAAM;CACR;CACA,SAAS;EACP,IAAI;EACJ,IAAI;EACJ,IAAI;CACN;AACF,GAEa,KAAmB;CAC9B,MAAM;CACN,QAAQ;EACN,SAAS;EACT,cAAc;EACd,aAAa;EACb,YAAY;EACZ,iBAAiB;EACjB,SAAS;EACT,QAAQ;EACR,aAAa;EACb,eAAe;EACf,cAAc;EACd,SAAS;EACT,mBAAmB;EACnB,iBAAiB;EACjB,aAAa;CACf;CACA,OAAO;EACL,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,MAAM;CACR;CACA,SAAS;EACP,IAAI;EACJ,IAAI;EACJ,IAAI;CACN;AACF,GCtDM,KAAe,EAAgC;CACnD,OAAO;CACP,MAAM;AACR,CAAC,GAEY,UACK,EAAW,EACtB,KACI;CAAE,OAAO;CAAY,MAAM;AAAQ,GAWjC,MAER,EAAE,aAAU,UAAO,SAAS,qBAAkB;CACjD,IAAM,IAAY,MAAS,SAAS,KAAY,GAE1C,IAAQ,QACP,IAIE;EACL;EACA,OAAO;GACL,GAAG;GACH,GAAG;GACH;GACA,QAAQ;IACN,GAAG,EAAU;IACb,GAAI,EAAY,UAAU,CAAC;GAC7B;GACA,OAAO;IACL,GAAG,EAAU;IACb,GAAI,EAAY,SAAS,CAAC;GAC5B;GACA,SAAS;IACP,GAAG,EAAU;IACb,GAAI,EAAY,WAAW,CAAC;GAC9B;EACF;CACF,IAtBS;EAAE,OAAO;EAAW;CAAK,GAuBjC;EAAC;EAAW;EAAa;CAAI,CAAC;CAEjC,OACE,kBAAC,GAAa,UAAd;EAA8B;EAAQ;CAAgC,CAAA;AAE1E;;;AC/DA,SAAgB,EACd,GAAG,GACiB;CAEpB,OADe,EAAW,OAAO,OAAO,CAAC,CAAC,KAAK,GACxC,KAAU,KAAA;AACnB;;;ACqBA,IAAa,KAAiC,EAC5C,SACA,cACA,gBACA,gBACA,iBACA,kBAAe,IACf,eAAY,WACZ,eAAY,OACZ,oBAAiB,IACjB,oBAAiB,IACjB,eACA,gBACI;CACJ,IAAM,EAAE,aAAU,EAAS,GACrB,CAAC,GAAS,KAAc,EAAsB,IAAI,GAClD,IACJ,MAAc,YAAY,EAAgB,CAAI,IAAI,OAAO,CAAI,GAEzD,KACJ,GACA,OACI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,cAAc,EAAM,MAAM;EAC1B,QAAQ;EACR,iBACE,MAAY,IAAS,EAAM,OAAO,kBAAkB;EACtD,OAAO,EAAM,OAAO;EACpB,QAAQ,IAAW,gBAAgB;EACnC,SAAS,IAAW,MAAO;EAC3B,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,YAAY;EACZ,GAAG,GAAQ;EACX,GAAI,IAAW,GAAQ,oBAAoB,KAAA;CAC7C;CAEA,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAY;EACvB,OAAO;GACL,SAAS;GACT,WAAW;GACX,YAAY;GACZ,gBAAgB;GAChB,KAAK;GACL,SAAS;GACT,cAAc,aAAa,EAAM,OAAO;GACxC,YAAY;GACZ,GAAG,GAAQ;EACb;EAbF,UAAA;GAeE,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU;IACV,iBAAe;IACf,cAAW;IACX,WAAW,EACT,GAAY,WACZ,KAAkB,GAAY,iBAChC;IACA,OAAO,EAAS,QAAQ,CAAc;IACtC,oBAAoB,EAAW,MAAM;IACrC,oBAAoB,EAAW,IAAI;IAEnC,UAAA,kBAAC,OAAD;KACE,OAAM;KACN,QAAO;KACP,SAAQ;KACR,MAAK;KACL,QAAO;KACP,aAAY;KACZ,eAAc;KACd,gBAAe;KACf,eAAY;KACZ,OAAO,EAAE,WAAW,MAAc,QAAQ,eAAe,KAAA,EAAU;KAEnE,UAAA,kBAAC,YAAD,EAAU,QAAO,iBAAkB,CAAA;IAChC,CAAA;GACC,CAAA;GAER,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,iBAAe;IACf,WAAW,GAAY;IACvB,OAAO;KACL,WAAW;KACX,SAAS;KACT,cAAc,EAAM,MAAM;KAC1B,QAAQ;KACR,iBACE,KAAgB,MAAY,UACxB,EAAM,OAAO,kBACb;KACN,OAAO,EAAM,OAAO;KACpB,QAAQ,IAAe,YAAY;KACnC,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,KAAK;KACL,UAAU;KACV,YAAY;KACZ,YAAY;KACZ,YAAY;KACZ,GAAG,GAAQ;IACb;IACA,oBAAoB,EAAW,OAAO;IACtC,oBAAoB,EAAW,IAAI;IA3BrC,UAAA,CA6BE,kBAAC,QAAD,EAAA,UAAA;KACG;KAAU;KAAE;IACT,EAAA,CAAA,GACN,kBAAC,OAAD;KACE,OAAM;KACN,QAAO;KACP,SAAQ;KACR,MAAK;KACL,QAAO;KACP,aAAY;KACZ,eAAc;KACd,gBAAe;KACf,eAAY;KACZ,OAAO;MACL,WAAW,IAAe,mBAAmB;MAC7C,YAAY;KACd;KAEA,UAAA,kBAAC,YAAD,EAAU,QAAO,iBAAkB,CAAA;IAChC,CAAA,CACC;;GAER,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU;IACV,iBAAe;IACf,cAAW;IACX,WAAW,EACT,GAAY,WACZ,KAAkB,GAAY,iBAChC;IACA,OAAO,EAAS,QAAQ,CAAc;IACtC,oBAAoB,EAAW,MAAM;IACrC,oBAAoB,EAAW,IAAI;IAEnC,UAAA,kBAAC,OAAD;KACE,OAAM;KACN,QAAO;KACP,SAAQ;KACR,MAAK;KACL,QAAO;KACP,aAAY;KACZ,eAAc;KACd,gBAAe;KACf,eAAY;KACZ,OAAO,EAAE,WAAW,MAAc,QAAQ,eAAe,KAAA,EAAU;KAEnE,UAAA,kBAAC,YAAD,EAAU,QAAO,kBAAmB,CAAA;IACjC,CAAA;GACC,CAAA;EACL;;AAET,GCrLa,MAAqC,EAChD,oBAAiB,GACjB,eACA,gBACI;CAEJ,IAAM,IAAW,EAAM,cAAc;EACnC,IAAM,IAAO,CAAC,GAAG,CAAuB;EAKxC,OAAO,CAHL,GAAG,EAAK,MAAM,CAAc,GAC5B,GAAG,EAAK,MAAM,GAAG,CAAc,CAE1B;CACT,GAAG,CAAC,CAAc,CAAC;CAEnB,OACE,kBAAC,OAAD;EACE,MAAK;EACL,WAAW,GAAY;EACvB,OAAO;GACL,SAAS;GACT,qBAAqB;GACrB,KAAK;GACL,gBAAgB;GAChB,YAAY;GACZ,cAAc;GACd,YAAY;GACZ,GAAG,GAAQ;EACb;EAEC,UAAA,EAAS,KAAK,GAAK,MAAQ;GAE1B,IAAM,KAAY,IAAM,KAAkB,KAAM;GAEhD,OACE,kBAAC,OAAD;IAEE,MAAK;IACL,cAAY;IACZ,WAAW,GAAY;IACvB,OAAO;KACL,OAAO;KACP,UAAU;KACV,QAAQ;KACR,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,UAAU;KACV,YAAY;KACZ,OAAO,IACH,sCACA;KACJ,WAAW;KACX,GAAG,GAAQ;IACb;IAEC,UAAA;GACE,GArBE,CAqBF;EAET,CAAC;CACE,CAAA;AAET,GCnDa,MAAmC,EAC9C,SACA,eAAY,WACZ,eAAY,IACZ,iBACA,YAAS,CAAC,GACV,cAAW,IACX,eACA,WACA,aACA,YACA,iBACI;CACJ,IAAM,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,CAAC,GAAW,KAAgB,EAAS,EAAK,GAE1C,EACJ,WACA,cACA,mBACA,YACA,eACA,eACA,cACA,iBACA,kBACE,GAEE,IACJ,MAAc,YACV,EAAgB,CAAS,IACzB,EAAc,EAAU,SAAS,CAAC,GAElC,IAAgB,CAAC,KAAc,GAE/B,KAAe,MAAwB;EAE3C,AADA,EAAE,gBAAgB,GACd,KACF,EAAS,CAAM;CAEnB,GAEM,UAAyB;EAE7B,AADA,EAAa,EAAI,GACb,KAAiB,KACnB,EAAQ,CAAM;CAElB,GAEM,UAAyB;EAG7B,AAFA,EAAa,EAAK,GAClB,EAAa,EAAK,GACd,KACF,EAAQ,IAAI;CAEhB,GAEM,UAAoB;EACxB,AAAI,KAAiB,KACnB,EAAQ,CAAM;CAElB,GAGI,IAAS,eACT,IAAY,IACZ,qCACA,qCAEE,IAAgB,KAAgB;CAsBtC,AApBI,KAAc,KAChB,IAAS,+BACT,IAAY,aACH,IACT,IAAS,yDACA,KAAa,MACtB,IAAS,iCAKT,KACA,KACA,CAAC,KACD,CAAC,KACD,CAAC,MAED,IAAY,sCAGV,MACF,IAAS,mCACT,IAAY;CAGd,IAAM,IAAiB,EACrB,GAAY,SACZ,KAAW,GAAY,WACvB,KAAc,GAAY,cAC1B,KAAa,GAAY,kBACzB,KAAgB,GAAY,gBAC5B,KAAc,GAAY,cAC1B,KAAc,GAAY,cAC1B,CAAC,KAAkB,GAAY,kBAC/B,KAAa,GAAY,WAC3B,GAEM,IAAmC;EACvC,GAAI,IAAU,GAAQ,YAAY,KAAA;EAClC,GAAI,IAAa,GAAQ,eAAe,KAAA;EACxC,GAAI,IAAY,GAAQ,mBAAmB,KAAA;EAC3C,GAAI,IAAe,GAAQ,iBAAiB,KAAA;EAC5C,GAAI,IAAa,GAAQ,eAAe,KAAA;EACxC,GAAK,IAA4C,KAAA,IAA3B,GAAQ;EAC9B,GAAI,IAAY,GAAQ,cAAc,KAAA;EACtC,GAAI,IAAa,GAAQ,eAAe,KAAA;CAC1C,GAGI,IAAY;CAShB,OARI,MACE,IACF,IAAY,gBACH,KAAa,CAAC,MACvB,IAAY,iBAKd,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,SAAS;GACT,WAAW;EACb;EACA,cAAc;EACd,cAAc;EAdhB,UAAA,CAgBE,kBAAC,UAAD;GACE,MAAK;GACL,MAAK;GACK;GACV,UAAU,KAAc,CAAC;GACzB,iBAAe,KAAc,CAAC;GAC9B,iBAAe;GACf,cAAY,GAAG,EAAO,KAAK,GAAG,EAAO,QAAQ,EAAE,GAAG,EAAO,MACvD,IAAe,MAAM,MAAiB;GAExC,SAAS;GACT,SAAS;GACT,mBAAmB,KAAiB,EAAa,EAAI;GACrD,iBAAiB,KAAiB,EAAa,EAAK;GACpD,WAAW;GACX,OAAO;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,cAAc,IACV,gBACA,IACE,gBACA,IACE,MACA;IACR,QACE,KAAW,CAAC,IACR,0CACA;IACN,iBAAiB;IACjB,OAAO;IACP,QAAQ,IAAa,gBAAgB,IAAgB,YAAY;IACjE,UAAU;IACV,YAAY,KAAc,IAAU,MAAM;IAC1C,SAAS;IACT,UAAU;IACV,SAAS;IACT,QAAQ;IACR,WAAW;IAEX;IACA,WACE,KAAa,KAAiB,CAAC,KAAa,CAAC,IACzC,kCACA;IACN,YACE;IACF,QAAQ,KAAa,IAAgB,IAAI;IACzC,SAAS,IAAa,MAAO,IAAiB,IAAI;IAClD,QAAQ,IAAa,oBAAoB,KAAA;IACzC,GAAG,GAAQ;IACX,GAAG;GACL;GAxDF,UAAA,CA0DE,kBAAC,QAAD,EAAA,UAAO,EAAmB,CAAA,GAGzB,EAAO,SAAS,KACf,kBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,QAAQ;KACR,SAAS;KACT,KAAK;KACL,YAAY;KACZ,gBAAgB;KAChB,YAAY;KACZ,WACE,KAAa,IAAgB,oBAAoB;IACrD;IAEC,UAAA,EAAO,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,MACvB,kBAAC,QAAD,EAEE,OAAO;KACL,OAAO;KACP,QAAQ;KACR,cAAc;KACd,iBAAiB,IACb,YACA,EAAG,SAAS;KAChB,YAAY;IACd,EACD,GAVM,EAAG,EAUT,CACF;GACE,CAAA,CAED;EAGP,CAAA,GAAA,KAAa,MAAmB,KAAa,EAAO,SAAS,MAC5D,kBAAC,OAAD;GACE,MAAK;GACL,OAAO;IACL,UAAU;IACV,QAAQ;IACR,MAAM;IACN,WAAW;IACX,QAAQ;IACR,eAAe;IACf,YAAY;IACZ,iBAAiB;IACjB,OAAO;IACP,SAAS;IACT,cAAc;IACd,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,SAAS;IACT,eAAe;IACf,KAAK;IACL,WAAW;IACX,WACE;GACJ;GAxBF,UAAA;IA0BG,KAAa,KACZ,kBAAC,QAAD;KAAM,OAAO,EAAE,OAAO,UAAU;KAAI,UAAA;IAAmB,CAAA;IAGxD,EAAO,KAAK,MACX,kBAAC,QAAD;KAAkB,OAAO,EAAE,OAAO,UAAU;KAA5C,UAAA,CAA+C,MAC1C,EAAG,KACF;IAFK,GAAA,EAAG,EAER,CACP;IAGD,kBAAC,OAAD,EACE,OAAO;KACL,UAAU;KACV,KAAK;KACL,MAAM;KACN,WAAW;KACX,aAAa;KACb,aAAa;KACb,aACE;IACJ,EACD,CAAA;GACE;EAEJ,CAAA,CAAA;;AAET,GCnSa,MAAmD,EAC9D,gBACA,iBACA,kBACA,iBACA,YACA,YACA,mBACA,eACA,gBACI;CACJ,IAAM,CAAC,GAAW,KAAgB,EAA6B,QAAQ,GACjE,CAAC,GAAiB,KAAsB,QACtC,KAAK,MAAM,IAAc,EAAE,IAAI,EACvC,GACM,CAAC,GAAY,KAAiB,EAAiB,CAAW,GAE1D,IAAc,MAAM,KACxB,EAAE,QAAQ,GAAG,IACZ,GAAG,MAAM,IAAkB,IAAI,CAClC,GAEM,IAAqC;EACzC;EACA;EACA;CACF,GACM,KAAiB,MACrB,EAAuB,GAAM,CAAW,GACpC,KAAkB,GAAc,MACpC,EAAwB,GAAM,GAAO,CAAW,GAC5C,IACJ,MAAc,WACV,CAAC,EAAc,IAAa,CAAC,IAC7B,CAAC,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,IAAkB,KAAK,CAAC,CAAC,CAAC,KAC9D,CACF,GACA,IACJ,MAAc,WACV,CAAC,EAAc,IAAa,CAAC,IAC7B,CAAC,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,IAAkB,KAAK,CAAC,CAAC,CAAC,KAC9D,CACF,GAEA,UAAmB;EACnB,QACJ;OAAI,MAAc,UAAU;IAC1B,IAAM,IAAQ,IAAa;IAE3B,AADA,EAAc,CAAK,GACnB,EAAa,CAAK;GACpB,OACE,GAAoB,MAAS,IAAO,EAAE;EAAA;CAE1C,GAEM,UAAmB;EACnB,QACJ;OAAI,MAAc,UAAU;IAC1B,IAAM,IAAQ,IAAa;IAE3B,AADA,EAAc,CAAK,GACnB,EAAa,CAAK;GACpB,OACE,GAAoB,MAAS,IAAO,EAAE;EAAA;CAE1C,GAEM,IAAmC;EACvC,YAAY;EACZ,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,cAAc;EACd,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,OAAO;EACP,YAAY;CACd,GAEM,IAAwC;EAC5C,QAAQ;EACR,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,YAAY;EACZ,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,YAAY;CACd;CAEA,OACE,kBAAC,OAAD;EACE,WAAW,GAAY;EACvB,OAAO;GACL,SAAS;GACT,eAAe;GACf,KAAK;GACL,OAAO;GACP,UAAU;GACV,UAAU;GACV,QAAQ;GACR,SAAS;GACT,WAAW;GACX,gBAAgB;GAChB,YAAY;GACZ,GAAG,GAAQ;EACb;EAfF,UAAA,CAkBE,kBAAC,OAAD;GACE,OAAO;IACL,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,QAAQ;GACV;GAPF,UAAA;IAUE,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,UAAU;KACV,iBAAe;KACf,cAAW;KACX,WAAW,EACT,GAAY,WACZ,KAA0B,GAAY,iBACxC;KACA,OAAO;MACL,GAAG;MACH,QAAQ,IAAyB,gBAAgB;MACjD,SAAS,IAAyB,MAAO;MACzC,GAAI,IACA,GAAQ,oBACR,KAAA;KACN;KACA,eAAe,MAAM;MACnB,EAAE,cAAc,MAAM,kBACpB;KACJ;KACA,eAAe,MAAM;MACnB,EAAE,cAAc,MAAM,kBAAkB;KAC1C;KAEA,UAAA,kBAAC,OAAD;MACE,OAAM;MACN,QAAO;MACP,SAAQ;MACR,MAAK;MACL,QAAO;MACP,aAAY;MACZ,eAAc;MACd,gBAAe;MAEf,UAAA,kBAAC,YAAD,EAAU,QAAO,iBAAkB,CAAA;KAChC,CAAA;IACC,CAAA;IAGR,kBAAC,UAAD;KACE,MAAK;KACL,eAAe;MACb,AAAI,MAAc,aAChB,EAAmB,KAAK,MAAM,IAAa,EAAE,IAAI,EAAE,GACnD,EAAa,OAAO;KAExB;KACA,OAAO;MACL,YACE,MAAc,WACV,uCACA;MACN,QACE,MAAc,WACV,iDACA;MACN,QAAQ,MAAc,WAAW,YAAY;MAC7C,UAAU;MACV,YAAY;MACZ,OAAO;MACP,SAAS;MACT,cAAc;MACd,SAAS;MACT,YAAY;MACZ,KAAK;MACL,YAAY;KACd;KACA,eAAe,MAAM;MACnB,AAAI,MAAc,aAChB,EAAE,cAAc,MAAM,kBACpB,gCACF,EAAE,cAAc,MAAM,cAAc;KAExC;KACA,eAAe,MAAM;MACnB,AAAI,MAAc,aAChB,EAAE,cAAc,MAAM,kBACpB,sCACF,EAAE,cAAc,MAAM,cACpB;KAEN;KA1CF,UAAA,CA4CE,kBAAC,QAAD,EAAA,UACG,MAAc,WACX,EAAgB,CAAU,IAC1B,GAAG,EAAgB,CAAe,EAAE,KAAK,EAAgB,IAAkB,CAAC,IAC5E,CAAA,GAEL,MAAc,YACb,kBAAC,OAAD;MACE,OAAM;MACN,QAAO;MACP,SAAQ;MACR,MAAK;MACL,QAAO;MACP,aAAY;MACZ,eAAc;MACd,gBAAe;MACf,OAAO,EAAE,SAAS,GAAI;MAEtB,UAAA,kBAAC,YAAD,EAAU,QAAO,iBAAkB,CAAA;KAChC,CAAA,CAED;;IAGR,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,UAAU;KACV,iBAAe;KACf,cAAW;KACX,WAAW,EACT,GAAY,WACZ,KAAsB,GAAY,iBACpC;KACA,OAAO;MACL,GAAG;MACH,QAAQ,IAAqB,gBAAgB;MAC7C,SAAS,IAAqB,MAAO;MACrC,GAAI,IAAqB,GAAQ,oBAAoB,KAAA;KACvD;KACA,eAAe,MAAM;MACnB,EAAE,cAAc,MAAM,kBACpB;KACJ;KACA,eAAe,MAAM;MACnB,EAAE,cAAc,MAAM,kBAAkB;KAC1C;KAEA,UAAA,kBAAC,OAAD;MACE,OAAM;MACN,QAAO;MACP,SAAQ;MACR,MAAK;MACL,QAAO;MACP,aAAY;MACZ,eAAc;MACd,gBAAe;MAEf,UAAA,kBAAC,YAAD,EAAU,QAAO,kBAAmB,CAAA;KACjC,CAAA;IACC,CAAA;GACL;EAGL,CAAA,GAAA,kBAAC,OAAD;GACE,OAAO;IACL,SAAS;IACT,qBAAqB;IACrB,kBAAkB;IAClB,KAAK;IACL,MAAM;IACN,YAAY;GACd;GAEC,UAAA,MAAc,WACX,EAAoB,KAAK,GAAM,MAAU;IACvC,IAAM,IACJ,MAAU,KAAgB,MAAe,GACrC,IAAa,CAAC,EAClB,GACA,CACF;IACA,OACE,kBAAC,UAAD;KAEE,MAAK;KACL,UAAU;KACV,iBAAe;KACf,eAAe,EAAc,CAAyB;KACtD,WAAW,EACT,GAAY,aACZ,KAAc,GAAY,qBAC1B,KAAc,GAAY,mBAC5B;KACA,OAAO;MACL,GAAG;MACH,YAAY,IACR,gCACA;MACJ,OAAO,IACH,YACA;MACJ,YAAY,IAAa,MAAM;MAC/B,QAAQ,IAAa,gBAAgB;MACrC,SAAS,IAAa,MAAO;MAC7B,GAAI,GAAQ,eAAe,CAAC;MAC5B,GAAI,IAAa,GAAQ,sBAAsB,KAAA;MAC/C,GAAI,IAAa,GAAQ,sBAAsB,KAAA;KACjD;KACA,eAAe,MAAM;MACnB,AAAK,MACH,EAAE,cAAc,MAAM,kBACpB;KACN;KACA,eAAe,MAAM;MACnB,AAAK,MACH,EAAE,cAAc,MAAM,kBAAkB;KAC5C;KAEC,UAAA;IACK,GApCD,CAoCC;GAEZ,CAAC,IACD,EAAY,KAAK,GAAM,MAAQ;IAC7B,IAAM,IAAY,MAAQ,KAAK,MAAQ,IACjC,IAAa,MAAS,GACtB,IAAa,CAAC,EAAc,CAAI;IAEtC,OACE,kBAAC,UAAD;KAEE,MAAK;KACL,UAAU;KACV,iBAAe;KACf,WAAW,EACT,GAAY,YACZ,KAAc,GAAY,oBAC1B,KAAc,GAAY,kBAC5B;KACA,eAAe;MAGb,AAFA,EAAc,CAAI,GAClB,EAAa,CAAI,GACjB,EAAa,QAAQ;KACvB;KACA,OAAO;MACL,GAAG;MACH,YAAY,IACR,gCACA;MACJ,OAAO,IACH,YACA,IACE,sCACA;MACN,YAAY,IAAa,MAAM;MAC/B,QAAQ,IAAa,gBAAgB;MACrC,SAAS,IAAa,KAAM,IAAY,KAAM;MAC9C,GAAI,GAAQ,cAAc,CAAC;MAC3B,GAAI,IAAa,GAAQ,qBAAqB,KAAA;MAC9C,GAAI,IAAa,GAAQ,qBAAqB,KAAA;KAChD;KACA,eAAe,MAAM;MACnB,AAAK,MACH,EAAE,cAAc,MAAM,kBACpB;KACN;KACA,eAAe,MAAM;MACnB,AAAK,MACH,EAAE,cAAc,MAAM,kBAAkB;KAC5C;KAEC,UAAA,EAAgB,CAAI;IACf,GA1CD,CA0CC;GAEZ,CAAC;EACF,CAAA,CACF;;AAET;;;ACzZA,SAAgB,EACd,GACA,IAAiC,WACzB;CACR,IAAM,IAAS,IAAM,KAAK,IAAI,MAAQ,GAAG;CACzC,OAAO,MAAc,YAAY,EAAgB,CAAM,IAAI;AAC7D;AAKA,SAAgB,KAA6B;CAC3C,IAAM,oBAAM,IAAI,KAAK;CACrB,OAAO;EACL,MAAM,EAAI,SAAS;EACnB,QAAQ,EAAI,WAAW;EACvB,QAAQ,EAAI,WAAW;CACzB;AACF;AAKA,SAAgB,EAAU,GAA8B;CACtD,OAAO;EACL,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAK,IAAI,CAAC;EACzC,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAK,MAAM,CAAC;EAC7C,QACE,EAAK,WAAW,KAAA,IAEZ,KAAA,IADA,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAK,MAAM,CAAC;CAE7C;AACF;AAKA,SAAgB,GACd,GACA,IAAc,IACd,IAAiC,WACzB;CACR,IAAI,CAAC,GAAM,OAAO;CAClB,IAAM,IAAI,EAAkB,EAAK,MAAM,CAAS,GAC1C,IAAI,EAAkB,EAAK,QAAQ,CAAS;CAKlD,OAJI,KAAe,EAAK,WAAW,KAAA,IAE1B,GAAG,EAAE,GAAG,EAAE,GADP,EAAkB,EAAK,QAAQ,CACrB,MAEf,GAAG,EAAE,GAAG;AACjB;;;ACjDA,IAAa,MAAiD,EAC5D,iBACA,kBACA,kBACA,iBACA,iBAAc,IACd,UAAO,UACP,eAAY,WACZ,oBAAiB,IACjB,iBAAc,IACd,YACA,YACA,cACA,eAAY,OACZ,eACA,gBACI;CACJ,IAAM,EAAE,aAAU,EAAS,GAErB,WAAoB;EACxB,IAAI,MAAS,UAAU;GACrB,IAAI,CAAC,GAAc,OAAO;GAC1B,IAAM,IAAO,EAAiB,GAAc,cAAc,EAAE,aAAU,CAAC,GACjE,IAAO,IACT,GAAiB,GAAc,GAAa,CAAS,IACrD;GACJ,OAAO,IAAO,GAAG,EAAK,IAAI,MAAS;EACrC;EAEA,IAAI,MAAS,SAAS;GACpB,IAAM,CAAC,GAAO,KAAO,KAAiB,CAAC,MAAM,IAAI;GACjD,IAAI,CAAC,GAAO,OAAO;GACnB,IAAM,IAAY,EAAiB,GAAO,cAAc,EAAE,aAAU,CAAC;GAGrE,OAFK,IAEE,GAAG,EAAU,MADJ,EAAiB,GAAK,cAAc,EAAE,aAAU,CACtC,MAFT,GAAG,EAAU;EAGhC;EAEA,IAAM,IAAQ,GAAe,UAAU,GACjC,IACJ,MAAc,YAAY,EAAgB,CAAK,IAAI,OAAO,CAAK;EACjE,OAAO,IAAQ,GAAG,EAAa,qBAAqB;CACtD,EAAA,CAAG,GAEG,IAAyC;EAC7C,WAAW;EACX,SAAS;EACT,cAAc,EAAM,MAAM;EAC1B,QAAQ,aAAa,EAAM,OAAO;EAClC,iBAAiB,EAAM,OAAO;EAC9B,OAAO,EAAM,OAAO;EACpB,QAAQ;EACR,YAAY;EACZ,UAAU;EACV,YAAY;CACd;CAEA,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAY;EACvB,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB,IAAiB,kBAAkB;GACnD,UAAU;GACV,KAAK;GACL,OAAO;GACP,UAAU;GACV,WAAW;GACX,SAAS;GACT,WAAW,aAAa,EAAM,OAAO;GACrC,OAAO,EAAM,OAAO;GACpB,GAAG,GAAQ;EACb;EAhBF,UAAA,CAkBG,KACC,kBAAC,QAAD;GACE,WAAW,GAAY;GACvB,OAAO;IACL,OAAO,EAAM,OAAO;IACpB,UAAU;IACV,YAAY;IACZ,UAAU;IACV,cAAc;IACd,GAAG,GAAQ;GACb;GAEC,UAAA;EACG,CAAA,GAGP,KACC,kBAAC,OAAD;GACE,WAAW,GAAY;GACvB,OAAO;IACL,SAAS;IACT,YAAY;IACZ,UAAU;IACV,KAAK;IACL,GAAG,GAAQ;GACb;GARF,UAAA;IAUG,KACC,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAW,GAAY;KACvB,OAAO;MACL,GAAG;MACH,OAAO,EAAM,OAAO;MACpB,GAAG,GAAQ;KACb;KACD,UAAA;IAEO,CAAA;IAET,KACC,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAW,GAAY;KACvB,OAAO;MAAE,GAAG;MAAmB,GAAG,GAAQ;KAAY;KACvD,UAAA;IAEO,CAAA;IAET,KACC,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAW,GAAY;KACvB,OAAO;MACL,GAAG;MACH,aAAa,EAAM,OAAO;MAC1B,iBAAiB,EAAM,OAAO;MAC9B,OAAO,EAAM,OAAO;MACpB,GAAG,GAAQ;KACb;KACD,UAAA;IAEO,CAAA;GAEP;EAEJ,CAAA,CAAA;;AAET,GCtIa,MAAyC,EACpD,UACA,aACA,gBAAa,GACb,cAAW,GACX,iBAAc,IACd,eAAY,WACZ,eACA,gBACI;CACJ,IAAM,CAAC,GAAc,KAAmB,EAEtC,IAAI,GACA,IAAe,EAAuB,IAAI,GAE1C,IAAQ,MAAM,KAClB,EAAE,QAAQ,KAAK,KAAK,KAAK,CAAQ,EAAE,IAClC,GAAG,MAAM,IAAI,CAChB,GACM,IAAU,MAAM,KACpB,EAAE,QAAQ,KAAK,KAAK,KAAK,CAAU,EAAE,IACpC,GAAG,MAAM,IAAI,CAChB,GACM,IAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;CAGtD,QAAgB;EACd,IAAM,KAAsB,MAA+B;GACzD,AACE,EAAa,WACb,CAAC,EAAa,QAAQ,SAAS,EAAE,MAAc,KAE/C,EAAgB,IAAI;EAExB;EAGA,OAFA,SAAS,iBAAiB,aAAa,CAAkB,GACzD,SAAS,iBAAiB,cAAc,CAAkB,SAC7C;GAEX,AADA,SAAS,oBAAoB,aAAa,CAAkB,GAC5D,SAAS,oBAAoB,cAAc,CAAkB;EAC/D;CACF,GAAG,CAAC,CAAC;CAEL,IAAM,KAAa,MAAc;EAC/B,IAAM,IAAY,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;EAC3C,OAAO,MAAc,YAAY,EAAgB,CAAS,IAAI;CAChE,GAEM,KACJ,GACA,GACA,GACA,MACG;EACH,IAAM,IAAS,MAAiB;EAEhC,OACE,kBAAC,OAAD;GAAK,OAAO,EAAE,UAAU,WAAW;GAAnC,UAAA,CAEE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAgB,IAAS,OAAO,CAAI;IACnD,OAAO;KACL,UAAU;KACV,QAAQ;KACR,SAAS;KACT,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,cAAc;KACd,iBAAiB,IACb,gCACA;KACJ,OAAO,IAAS,YAAY;KAC5B,QAAQ,aAAa,IAAS,gCAAgC;KAC9D,UAAU;KACV,YAAY;KACZ,QAAQ;KACR,YAAY;KACZ,WAAW,IAAS,qCAAqC;IAC3D;IACA,eAAe,MAAM;KACnB,AAAK,MACH,EAAE,cAAc,MAAM,cAAc,+BACpC,EAAE,cAAc,MAAM,kBACpB;IAEN;IACA,eAAe,MAAM;KACnB,AAAK,MACH,EAAE,cAAc,MAAM,cACpB,sCACF,EAAE,cAAc,MAAM,kBACpB;IAEN;IAEC,UAAA,EAAU,CAAU;GACf,CAAA,GAGP,KACC,kBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,QAAQ;KACR,MAAM;KACN,WAAW;KACX,WAAW;KACX,OAAO;KACP,WAAW;KACX,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,WACE;KACF,QAAQ;KACR,SAAS;KACT,SAAS;KACT,eAAe;KACf,KAAK;IACP;IAEC,UAAA,EAAQ,KAAK,MAAQ;KACpB,IAAM,IAAa,MAAQ;KAC3B,OACE,kBAAC,UAAD;MAEE,MAAK;MACL,eAAe;OAEb,AADA,EAAS,CAAG,GACZ,EAAgB,IAAI;MACtB;MACA,OAAO;OACL,SAAS;OACT,QAAQ;OACR,cAAc;OACd,YAAY,IACR,gCACA;OACJ,OAAO,IACH,YACA;OACJ,UAAU;OACV,YAAY,IAAa,MAAM;OAC/B,QAAQ;OACR,YAAY;MACd;MACA,eAAe,MAAM;OACnB,AAAK,MACH,EAAE,cAAc,MAAM,kBACpB;MACN;MACA,eAAe,MAAM;OACnB,AAAK,MACH,EAAE,cAAc,MAAM,kBAAkB;MAC5C;MAEC,UAAA,EAAU,CAAG;KACR,GAhCD,CAgCC;IAEZ,CAAC;GACE,CAAA,CAEJ;;CAET;CAEA,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAY;EACvB,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,UAAU;GACV,KAAK;GACL,SAAS;GACT,WAAW;GACX,iBAAiB;GACjB,cACE;GACF,WAAW;GACX,YAAY;GACZ,OAAO;GACP,UAAU;GACV,WAAW;GACX,GAAG,GAAQ;EACb;EApBF,UAAA;GAuBG,EAAmB,QAAQ,EAAM,MAAM,IAAQ,MAC9C,EAAS;IAAE,GAAG;IAAO,MAAM;GAAE,CAAC,CAChC;GAEA,kBAAC,QAAD;IACE,OAAO;KACL,YAAY;KACZ,OAAO;KACP,UAAU;IACZ;IACD,UAAA;GAEK,CAAA;GAGL,EAAmB,UAAU,EAAM,QAAQ,IAAU,MACpD,EAAS;IAAE,GAAG;IAAO,QAAQ;GAAE,CAAC,CAClC;GAGC,KACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;IACE,OAAO;KACL,YAAY;KACZ,OAAO;KACP,UAAU;IACZ;IACD,UAAA;GAEK,CAAA,GACL,EAAmB,UAAU,EAAM,UAAU,GAAG,IAAU,MACzD,EAAS;IAAE,GAAG;IAAO,QAAQ;GAAE,CAAC,CAClC,CACA,EAAA,CAAA;EAED;;AAET;;;AC9OA,SAAgB,GACd,GACA,IAAiC,WACzB;CAER,IAAM,IAAc,EAAc,CAAQ,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,GAErE,IAAS;CAWb,OAVI,EAAY,SAAS,MACvB,IAAS,EAAY,MAAM,GAAG,CAAC,IAE7B,EAAY,UAAU,MACxB,KAAU,IAAI,EAAY,MAAM,GAAG,CAAC,MAElC,EAAY,UAAU,MACxB,KAAU,IAAI,EAAY,MAAM,GAAG,CAAC,MAG/B,MAAc,YAAY,EAAgB,CAAM,IAAI;AAC7D;AAKA,SAAgB,GACd,GACA,GACA,GACA,GACiB;CACjB,IAAM,IAAa,EAAc,CAAK,CAAC,CAAC,KAAK;CAE7C,IAAI,CAAC,GACH,OAAO;EAAE,SAAS;EAAM,MAAM;CAAK;CAGrC,IAAM,IAAQ,EAAW,MAAM,GAAG;CAClC,IACE,EAAM,WAAW,KACjB,EAAM,EAAE,CAAC,WAAW,KACpB,EAAM,EAAE,CAAC,WAAW,KACpB,EAAM,EAAE,CAAC,WAAW,GAEpB,OAAO;EAAE,SAAS;EAAO,MAAM;EAAM,OAAO;CAAiB;CAG/D,IAAM,IAAO,SAAS,EAAM,IAAI,EAAE,GAC5B,IAAW,SAAS,EAAM,IAAI,EAAE,GAChC,IAAM,SAAS,EAAM,IAAI,EAAE;CAGjC,IAAI,IAAW,KAAK,IAAW,IAC7B,OAAO;EAAE,SAAS;EAAO,MAAM;EAAM,OAAO;CAAgB;CAG9D,IAAM,IAAc,IAAW,GACzB,IAAU,EAAqB,GAAM,CAAU;CAGrD,IAAI,IAAM,KAAK,IAAM,GACnB,OAAO;EAAE,SAAS;EAAO,MAAM;EAAM,OAAO;CAAc;CAG5D,IAAM,IAAyB;EAAE;EAAM,OAAO;EAAY;CAAI;CAgB9D,OAbI,KAAW,EAAmB,GAAY,CAAO,IAAI,IAChD;EAAE,SAAS;EAAO,MAAM;EAAY,OAAO;CAAoB,IAGpE,KAAW,EAAmB,GAAY,CAAO,IAAI,IAChD;EAAE,SAAS;EAAO,MAAM;EAAY,OAAO;CAAoB,IAIpE,KAAkB,EAAe,CAAU,IACtC;EAAE,SAAS;EAAO,MAAM;EAAY,OAAO;CAAgB,IAG7D;EAAE,SAAS;EAAM,MAAM;CAAW;AAC3C;;;ACrFA,IAAa,MAAmD,EAC9D,UACA,kBAAe,MACf,aACA,sBACA,eAAY,WACZ,YACA,YACA,mBACA,eAAY,IACZ,iBAAc,cACd,cAAW,IACX,eAAY,OACZ,qBACA,iBACA,yBACA,qBACA,UACA,GAAG,QACC;CACJ,IAAM,EAAE,aAAU,EAAS,GACrB,CAAC,GAAe,KAAoB,EACxC,CACF,GACM,IAAa,MAAU,KAAA,IAAoB,IAAR,GAEnC,CAAC,GAAM,KAAW,QACf,IACH,EAAiB,GAAY,cAAc,EAAE,aAAU,CAAC,IACxD,EACL,GAEK,CAAC,GAAU,KAAe,EAAkB,EAAK,GACjD,IAAW,EAAyB,IAAI;CAG9C,QAAgB;EACd,AAAI,MAAU,KAAA,MACZ,EACE,IAAQ,EAAiB,GAAO,cAAc,EAAE,aAAU,CAAC,IAAI,EACjE,GACA,EAAY,EAAK;CAErB,GAAG,CAAC,GAAO,CAAS,CAAC;CAErB,IAAM,KAAqB,MAA2C;EACpE,IAAM,IAAS,EAAE,OAAO,OAClB,IAAY,GAAc,GAAQ,CAAS;EAIjD,IAHA,EAAQ,CAAS,GAGb,EAAU,WAAW,MAAM,EAAU,WAAW,GAAG;GACrD,IAAM,IAAS,GACb,GACA,GACA,GACA,CACF;GAEA,AAAI,EAAO,WACT,EAAY,EAAK,GACjB,IAAoB,IAAI,GACpB,MAAU,KAAA,KACZ,EAAiB,EAAO,IAAI,GAE9B,IAAW,EAAO,IAAI,MAEtB,EAAY,EAAI,GAChB,IAAoB,EAAO,KAA4B;EAE3D,OAGE,AADA,EAAY,EAAK,GACjB,IAAoB,IAAI;CAE5B,GAEM,IAAc,QAAkB;EAQpC,AAPA,EAAQ,EAAE,GACV,EAAY,EAAK,GACjB,IAAoB,IAAI,GACpB,MAAU,KAAA,KACZ,EAAiB,IAAI,GAEvB,IAAW,IAAI,GACf,EAAS,SAAS,MAAM;CAC1B,GAAG;EAAC;EAAO;EAAU;CAAiB,CAAC;CAEvC,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW;EACX,OAAO;GACL,UAAU;GACV,SAAS;GACT,YAAY;GACZ,OAAO;GACP,UAAU;GACV,GAAG;EACL;EAVF,UAAA,CAYE,kBAAC,SAAD;GACE,KAAK;GACL,MAAK;GACL,WAAU;GACA;GACV,aAAa,MAAc,YAAY,IAAc;GACrD,OAAO;GACP,UAAU;GACV,OAAO;IACL,OAAO;IACP,UAAU;IACV,UAAU;IACV,WAAW;IACX,SAAS;IACT,kBAAkB,KAAa,IAAO,SAAS;IAC/C,cAAc,EAAM,MAAM;IAC1B,QAAQ,aAAa,IAAW,EAAM,OAAO,UAAU,EAAM,OAAO;IACpE,iBAAiB,EAAM,OAAO;IAC9B,OAAO,EAAM,OAAO;IACpB,UAAU;IACV,YAAY;IACZ,cAAc,EAAM,OAAO;IAC3B,WAAW;IACX,eAAe;IACf,YAAY;IACZ,GAAG;GACL;GACA,GAAI;EACL,CAAA,GAGA,KAAa,KAAQ,CAAC,KACrB,kBAAC,UAAD;GACE,MAAK;GACL,cAAW;GACX,SAAS;GACT,WAAW;GACX,OAAO;IACL,UAAU;IACV,gBAAgB;IAChB,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,OAAO,EAAM,OAAO;IACpB,UAAU;IACV,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,GAAG;GACL;GACD,UAAA;EAEO,CAAA,CAEP;;AAET;;;AC/JA,SAAgB,GACd,GACA,GACiB;CAEjB,OADI,CAAC,KAAU,EAAO,WAAW,IAAU,CAAC,IACrC,EAAO,QAAQ,MAAM,EAAgB,EAAE,MAAM,CAAI,CAAC;AAC3D;;;ACLA,IAAM,KAA+C;CACnD,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,SAAS;AACX;AAKA,SAAgB,EAAe,GAA2B;CAExD,OADU,EAAkB,EAAK,MAAM,EAAK,OAAO,EAAK,GACjD,CAAA,CAAE,OAAO,MAAM;AACxB;AAKA,SAAgB,GACd,GACA,GACwB;CAExB,IAAI,KAAkB,EAAe,SAAS,GAAG;EAC/C,IAAM,IAAS,EAAe,MAC3B,MACC,EAAE,KAAK,SAAS,EAAK,QACrB,EAAE,KAAK,UAAU,EAAK,SACtB,EAAE,KAAK,QAAQ,EAAK,GACxB;EACA,IAAI,GACF,OAAO;GACL,OAAO,EAAO;GACd,MAAM;GACN,OAAO,EAAO,SAAS;EACzB;CAEJ;CAGA,IAAM,IAAW,GAAG,EAAK,MAAM,GAAG,EAAK;CAcvC,OAbI,GAAqB,KAChB;EACL,OAAO,GAAqB;EAC5B,MAAM;EACN,OAAO;CACT,IAIE,EAAe,CAAI,IACd;EAAE,OAAO;EAA2B,MAAM;EAAS,OAAO;CAAK,IAGjE;AACT;;;ACmBA,SAAgB,GAAqD,EACnE,UAAO,UACP,UACA,iBACA,aACA,YACA,YACA,mBACA,oBAAiB,GACjB,aAAU,WACV,iBAAc,cACd,eAAY,WACZ,cACA,UACA,eACA,WACA,gBAAa,IACb,oBAAiB,IACjB,gBAAa,IACb,gBAAa,IACb,cACA,qBACA,iBACA,iBAAa,GACb,eAAW,GACX,iBAAc,IACd,oBAAiB,GACjB,qBAAiB,IACjB,YACA,kBAAe,IACf,oBACA,YAAS,QACkB;CAC3B,IAAM,CAAC,GAAQ,KAAa,EAAS,MAAY,QAAQ,GACnD,CAAC,IAAqB,MAA0B,EAAS,EAAK,GAC9D,KAAe,EAAuB,IAAI,GAC1C,IAAU,MAAY;CAE5B,QAAgB;EACd,AAAI,MAAY,YACd,EAAU,EAAI;CAElB,GAAG,CAAC,CAAO,CAAC;CAEZ,IAAM,KAAc,QACd,MACA,aAAiB,OACZ;EACL,MAAM,EAAM,SAAS;EACrB,QAAQ,EAAM,WAAW;EACzB,QAAQ,EAAM,WAAW;CAC3B,IAEE,aAAwB,OACnB;EACL,MAAM,EAAa,SAAS;EAC5B,QAAQ,EAAa,WAAW;EAChC,QAAQ,EAAa,WAAW;CAClC,IAEK,GAAe,IACrB;EAAC;EAAkB;EAAO;CAAY,CAAC,GAEpC,CAAC,IAAc,MAAmB,EAAqB,EAAW,GAClE,IACJ,MAAc,KAAA,IAA8C,KAAjC,KAAa,GAAe;CAEzD,QAAgB;EACd,IAAI,MAAY,YAAY,CAAC,GAAQ;EAErC,IAAM,KAAsB,MAA+B;GACzD,AACE,GAAa,WACb,CAAC,GAAa,QAAQ,SAAS,EAAE,MAAc,MAE/C,EAAU,EAAK,GACf,GAAuB,EAAK;EAEhC;EAOA,OALA,SAAS,iBAAiB,aAAa,CAAkB,GACzD,SAAS,iBAAiB,cAAc,GAAoB,EAC1D,SAAS,GACX,CAAC,SAEY;GAEX,AADA,SAAS,oBAAoB,aAAa,CAAkB,GAC5D,SAAS,oBAAoB,cAAc,CAAkB;EAC/D;CACF,GAAG,CAAC,GAAS,CAAM,CAAC;CAEpB,IAAM,KAAsB,QAEpB;EACF,UAAU,KAAA,GACd;OAAI,CAAC,GAAO,OAAO;GACnB,IAAI,aAAiB,MACnB,OAAO,EAAe,CAAK;GAE7B,IAAI,MAAM,QAAQ,CAAK,GAAG;IACxB,IAAI,MAAS,SAAS;KACpB,IAAM,CAAC,GAAO,KAAO;KACrB,OAAO,CACL,IAAQ,EAAe,CAAK,IAAI,MAChC,IAAM,EAAe,CAAG,IAAI,IAC9B;IACF;IACA,IAAI,MAAS,YACX,OAAQ,EAAiB,KAAK,MAC5B,EAAe,CAAC,CAClB;GAEJ;GACA,OAAO;EAlBY;CAmBrB,GAAG,CAAC,GAAO,CAAI,CAAC,GAEV,KAA6B,QAE3B;EACF,UAAiB,KAAA,GACrB;OAAI,CAAC,GAAc,OAAO;GAC1B,IAAI,aAAwB,MAC1B,OAAO,EAAe,CAAY;GAEpC,IAAI,MAAM,QAAQ,CAAY,GAAG;IAC/B,IAAI,MAAS,SAAS;KACpB,IAAM,CAAC,GAAO,KAAO;KACrB,OAAO,CACL,IAAQ,EAAe,CAAK,IAAI,MAChC,IAAM,EAAe,CAAG,IAAI,IAC9B;IACF;IACA,IAAI,MAAS,YACX,OAAQ,EAAwB,KAAK,MACnC,EAAe,CAAC,CAClB;GAEJ;GACA,OAAO;EAlBmB;CAmB5B,GAAG,CAAC,GAAc,CAAI,CAAC,GAEjB,KAAkB,QACf,IAAU,EAAe,CAAO,IAAI,KAAA,GAC3C,CAAC,CAAO,CACV,GACM,KAAkB,QACf,IAAU,EAAe,CAAO,IAAI,KAAA,GAC3C,CAAC,CAAO,CACV,GAEM,KAAyB,GAC5B,MACC,IAAiB,EAAe,EAAe,CAAK,CAAC,IAAI,IAC3D,CAAC,CAAc,CACjB,GAEM,KAA4B,GAE9B,GACA,MACyB;EACzB,IAAI,CAAC,GAAM,OAAO;EAElB,IAAM,IAAI,KAAgB,GACpB,IAAI,IAAa,EAAE,OAAO,GAC1B,IAAI,IAAa,EAAE,SAAS,GAC5B,IAAI,KAAc,IAAe,EAAE,UAAU,IAAK;EAExD,IAAI,MAAS,YAAY,CAAC,MAAM,QAAQ,CAAI,GAC1C,OAAO,EACL,GACA,GACA,GACA,CACF;EAGF,IAAI,MAAS,WAAW,MAAM,QAAQ,CAAI,GAAG;GAC3C,IAAM,CAAC,GAAO,KAAO;GACrB,OAAO,CACL,IAAQ,EAAe,GAAO,GAAG,GAAG,CAAC,IAAI,MACzC,IAAM,EAAe,GAAK,IAAI,IAAI,EAAE,IAAI,IAC1C;EACF;EAQA,OANI,MAAS,cAAc,MAAM,QAAQ,CAAI,IACnC,EAAsB,KAAK,MACjC,EAAe,GAAG,GAAG,GAAG,CAAC,CAC3B,IAGK;CACT,GACA;EAAC;EAAM;EAAY;EAAY;CAAW,CAC5C,GAEM,EACJ,aACA,aACA,cACA,UACA,mBACA,mBACA,aACA,eACA,gBACA,kBACA,eACA,cACE,EAAoB;EACtB;EACA,OAAO;EACP,cAAc;EACd,SAAS;EACT,SAAS;EACT;EACA,gBAAgB,IAAiB,KAAyB,KAAA;EAC1D,WAAW,MAAQ;GACjB,IAAW,GAA0B,CAAG,CAAC;EAC3C;CACF,CAAC,GAEK,KAAmB,GACtB,MAAwB;EAIvB,AAHI,MAAc,KAAA,KAAW,GAAgB,CAAO,GACpD,IAAe,CAAO,GAElB,KAAY,KACd,EAAS,GAA0B,GAAU,CAAO,CAAC;CAEzD,GACA;EAAC;EAAW;EAAc;EAAU;EAAU;CAAyB,CACzE,GAEM,KACJ,MAAS,WAAY,IAAiC,MAElD,MAAoB,MAAkB;EAE1C,AADA,GAAW,CAAC,GACR,MAAY,aAAa,MAAS,YAAY,CAAC,KACjD,EAAU,EAAK;CAEnB,GAEM,MAAoB,MAAwB;EAEhD,AADA,EAAE,gBAAgB,GAClB,GAAM;CACR,GAEM,EAAE,mBAAe,qBAAiB,uBACtC,EAAoB;EAClB;EACA;EACA,cAAc;EACd,cAAc;EACd,cAAc;EACd,OAAO;CACT,CAAC;CAEH,QAAgB;EACd,IAAI,CAAC,KAAW,CAAC,GAAQ;EACzB,IAAM,IAAmB,SAAS,KAAK,MAAM;EAC7C,SAAS,KAAK,MAAM,WAAW;EAE/B,IAAM,KAAuB,MAAqB;GAChD,AAAI,EAAE,QAAQ,YAAU,EAAU,EAAK;EACzC;EAGA,OADA,OAAO,iBAAiB,WAAW,CAAmB,SACzC;GAEX,AADA,SAAS,KAAK,MAAM,WAAW,GAC/B,OAAO,oBAAoB,WAAW,CAAmB;EAC3D;CACF,GAAG,CAAC,GAAS,CAAM,CAAC;CAEpB,IAAM,IAAiB,QAIjB,MAAc,KAAW;EAAE,MAAM,IAAW;EAAG,OAAO;CAAE,IACrD;EAAE,MAAM;EAAU,OAAQ,IAAY;CAAuB,GACnE,CAAC,GAAU,CAAS,CAAC,GAElB,KAAiB,QAIjB,MAAc,IAAU;EAAE,MAAM,IAAW;EAAG,OAAO;CAAG,IACrD;EAAE,MAAM;EAAU,OAAQ,IAAY;CAAuB,GACnE,CAAC,GAAU,CAAS,CAAC,GAElB,KAAsB,CAAC,EAC3B,GAAe,MACf,GAAe,OACf;EAAE,SAAS;EAAiB,SAAS;CAAgB,CACvD,GACM,KACJ,MAAmB,IACf,EAAe,UAAU,KACvB;EAAE,MAAM,EAAe,OAAO;EAAG,OAAO;CAAsB,IAC9D;EACE,MAAM,EAAe;EACrB,OAAQ,EAAe,QAAQ;CACjC,IACF,GACA,KAAsB,CAAC,EAC3B,GAAoB,MACpB,GAAoB,OACpB;EAAE,SAAS;EAAiB,SAAS;CAAgB,CACvD,GAEM,KAAa,QAAoC;EACrD,IAAI,MAAmB,GAAG,OAAO,CAAC;EAElC,IAAM,IAAU,EAA2B;GACzC,MAAM,EAAe;GACrB,OAAO,EAAe;GACtB;GACA,SAAS;GACT,SAAS;EACX,CAAC;EAED,IAAI,MAAS,SAAS,OAAO;EAE7B,IAAM,CAAC,GAAO,KAAQ,KAAgC,CAAC,MAAM,IAAI,GAC3D,IAAe,MAAQ,KAAS,KAAY,KAAY;EAE9D,OAAO,EAAQ,KAAK,MAAS;GAC3B,IAAM,IAAU,IAAQ,EAAgB,EAAK,QAAQ,CAAK,IAAI,IACxD,IAAQ,IACV,EAAgB,EAAK,QAAQ,CAAY,IACzC,IACA,IAAU;GAId,OAHI,KAAS,MACX,IAAU,EAAoB,EAAK,QAAQ,GAAO,CAAY,IAEzD;IACL,GAAG;IACH,YAAY,KAAW;IACvB,WAAW;IACX,cAAc;IACd,YAAY;GACd;EACF,CAAC;CACH,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAEK,KAAsB,QAAc;EACxC,IAAI,CAAC,GAAU,OAAO;EACtB,IAAI,MAAS,UAAU;GACrB,IAAM,IAAW,EAAiB,GAAwB,cAAc,EACtE,aACF,CAAC;GAKD,OAJI,KAAc,IAET,GAAG,EAAS,GADF,GAAiB,GAAY,GAAa,CACrC,MAEjB;EACT;EACA,IAAI,MAAS,SAAS;GACpB,IAAM,CAAC,GAAO,KAAQ,KAAgC,CAAC,MAAM,IAAI;GACjE,IAAI,KAAS,GACX,OAAO,GAAG,EAAiB,GAAO,cAAc,EAAE,aAAU,CAAC,EAAE,KAAK,EAAiB,GAAK,cAAc,EAAE,aAAU,CAAC;GAEvH,IAAI,GACF,OAAO,GAAG,EAAiB,GAAO,cAAc,EAAE,aAAU,CAAC,EAAE;EACnE;EAIA,OAHI,MAAS,cAAc,MAAM,QAAQ,CAAQ,IACxC,GAAG,EAAiB,EAA0B,MAAM,EAAE,qBAExD;CACT,GAAG;EAAC;EAAU;EAAM;EAAW;EAAY;EAAY;CAAW,CAAC,GAE7D,KAAW,GACf,MAAS,WACL,IACA,MAAS,UACN,IAA+B,KAC/B,GAA2B,SAG9B,MACJ,GACA,GACA,GACA,IAAgB,IAChB,IAAgB,OAEhB,kBAAC,OAAD;EACE,WAAW,GAAY;EACvB,OAAO;GACL,OAAO;GACP,UAAU;GACV,UAAU;GACV,MAAM;GACN,GAAG,GAAQ;EACb;EARF,UAAA;GAUE,kBAAC,GAAD;IACE,MAAM;IACN,WAAW,EAAoB;IAC/B,aAAa,IAAgB,WAAsB,CAAC;IACpD,aAAa,IAAgB,WAAsB,CAAC;IACpD,oBAAoB,IAAwB,MAAS,CAAC,CAAI;IAC1D,cAAc;IACd,gBAAgB,MAAgB;IAChC,gBAAgB,MAAgB;IACpB;IACJ;GACT,CAAA;GAED,kBAAC,IAAD;IACkB;IACJ;IACJ;GACT,CAAA;GAED,kBAAC,OAAD;IACE,MAAK;IACL,cAAY,GAAG,EAAoB,GAAG,GAAG,EAAgB,CAAC;IAC1D,WAAW,GAAY;IACvB,OAAO;KACL,SAAS;KACT,qBAAqB;KACrB,KAAK;KACL,gBAAgB;KAChB,YAAY;KACZ,GAAG,GAAQ;IACb;IAEC,UAAA,EAAS,KAAK,GAAM,MAAU;KAC7B,IAAM,IAAc,IAChB,GAAmB,EAAK,QAAQ,EAAc,IAC9C,MACE,IAAY,GAAiB,EAAK,QAAQ,EAAM;KAEtD,OACE,kBAAC,IAAD;MAEQ;MACK;MACX,WAAW,EAAQ;MACnB,cAAc,GAAa;MAC3B,QAAQ;MACI;MACJ;MACR,UAAU,GAAgB,EAAK,MAAM;MACrC,UAAU;MACV,SAAS;MACT,SAAS;KACV,GAZM,CAYN;IAEL,CAAC;GACE,CAAA;EACF;KAGD,KACJ,kBAAC,OAAD;EACE,MAAM,IAAU,WAAW;EAC3B,cAAY,IAAU,KAAO,KAAA;EAC7B,cAAW;EACX,WAAW;EACX,UAAU,MAAM,EAAE,gBAAgB;EAClC,WAAW,GAAY;EACvB,OAAO;GACL,UACE,MAAY,YAAY,aAAa,IAAU,aAAa;GAC9D,KAAK,MAAY,YAAY,qBAAqB,KAAA;GAClD,MAAM,MAAY,YAAY,IAAI,KAAA;GAClC,QAAQ,IAAU,IAAS,IAAI;GAC/B,SAAS;GACT,iBAAiB;GACjB,cAAc;GACd,QAAQ;GACR,WAAW,IACP,sCACA;GACJ,OAAO;GACP,UACE,MAAY,WAAW,SAAS;GAClC,WAAW,IAAU,wBAAwB,KAAA;GAC7C,WAAW,IAAU,SAAS,KAAA;GAC9B,WAAW;GACX,YAAY;GACZ,SAAS;GACT,eAAe;GACf,KAAK;GACL,WAAW;GACX,WAAW;GACX,GAAG,GAAQ;EACb;EAEC,UAAA,KACC,kBAAC,IAAD;GACE,aAAa;GACb,cAAc;GACd,gBAAgB,MAAM;IAEpB,AADA,GAAQ,GAAU,CAAC,GACnB,GAAuB,EAAK;GAC9B;GACA,eAAe,MAAM,GAAQ,GAAG,CAAS;GACzC,SAAS;GACT,SAAS;GACT,gBACE,IAAiB,KAAyB,KAAA;GAEhC;GACJ;EACT,CAAA,IAED,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,OAAD;IACE,WAAW,GAAY;IACvB,OAAO;KACL,SAAS;KACT,eAAe;KACf,UAAU;KACV,KAAK;KACL,YAAY;KACZ,gBAAgB;KAChB,OAAO;KACP,UAAU;KACV,WAAW;KACX,GAAG,GAAQ;IACb;IAbF,UAAA,CAeG,GACC,GACA,GACA,IACA,IACA,MAAmB,CACrB,GAEC,MAAmB,KAClB,kBAAA,GAAA,EAAA,UACG,GACC,EAAe,MACf,EAAe,OACf,IACA,IACA,EACF,EACA,CAAA,CAED;;GAEJ,KACC,kBAAC,IAAD;IACE,OAAO;IACP,UAAU;IACE;IACF;IACG;IACF;IACC;IACJ;GACT,CAAA;GAGF,KACC,kBAAC,IAAD;IACQ;IACK;IACK;IAChB,cACE,MAAS,WAAY,IAAiC;IAExD,eACE,MAAS,UAAW,IAA+B,KAAA;IAErD,eACE,MAAS,aAAc,IAA4B,KAAA;IAErD,cAAc,IAAa,IAAa,KAAA;IACxC,SAAS;IACG;IACJ;GACT,CAAA;EAEH,EAAA,CAAA;CAED,CAAA;CAGP,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,KAAa,GAAY;EACpC,OAAO;GACL,UAAU;GACV,SAAS;GACT,UAAU;GACV,eAAe;GACf,QAAQ,KAAU,MAAY,YAAY,IAAS;GACnD,GAAG;GACH,GAAG,GAAQ;EACb;EAXF,UAAA,CAaG,MAAY,aACV,MAAkB,MAAS,YAAY,MAAY,YAClD,kBAAC,IAAD;GACE,OAAO;GACI;GACE;GACb,WAAW,MAAM;IACf,AAAI,KACF,GAAW,CAAC,GACZ,GAAQ,EAAE,MAAM,EAAE,KAAK,KAEvB,GAAM;GAEV;GACA,eAAe,EAAU,EAAI;GAC7B,WAAW,GAAY;GACvB,OAAO;IACL,WAAW;IACX,WAAW;IACX,GAAG,GAAQ;GACb;EACD,CAAA,IAED,kBAAC,OAAD;GACE,UAAU,MAAM;IAEd,AADA,EAAE,gBAAgB,GAClB,GAAW,MAAS,CAAC,CAAI;GAC3B;GACA,OAAO;IACL,UAAU;IACV,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,OAAO;IACP,UAAU;GACZ;GAbF,UAAA,CAeE,kBAAC,SAAD;IACE,MAAK;IACL,UAAA;IACa;IACb,OAAO;IACP,WAAW,GAAY;IACvB,OAAO;KACL,WAAW;KACX,WAAW;KACX,SAAS;KACT,cAAc;KACd,QAAQ;KACR,iBAAiB;KACjB,OAAO;KACP,QAAQ;KACR,UAAU;KACV,UAAU,IAAa,UAAU;KACjC,OAAO;KACP,UAAU;KACV,WAAW;KACX,GAAG,GAAQ;IACb;GACD,CAAA,GAEA,KAAc,MACb,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,cAAW;IACX,OAAO;KACL,UAAU;KACV,OAAO;KACP,YAAY;KACZ,QAAQ;KACR,QAAQ;KACR,OAAO;KACP,SAAS;KACT,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,UAAU;KACV,YAAY;KACZ,YAAY;KACZ,cAAc;KACd,YAAY;IACd;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,QACpB;IACJ;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,QACpB;IACJ;IACD,UAAA;GAEO,CAAA,CAEP;EAGR,CAAA,IAAA,MACE,IACC,kBAAC,OAAD;GACE,MAAK;GACL,eAAe,EAAU,EAAK;GAC9B,WAAW,GAAY;GACvB,OAAO;IACL,UAAU;IACV,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,iBAAiB;IACjB,gBAAgB;IACR;IACR,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,WAAW;IACX,WAAW;IACX,WAAW;IACX,GAAG,GAAQ;GACb;GAEC,UAAA;EACE,CAAA,IAEL,GAED;;AAET;;;AClyBA,IAAa,MAAuD,EAClE,UACA,kBAAe,CAAC,MAAM,IAAI,GAC1B,aACA,oBACA,oBAAiB,GACjB,eAAY,WACZ,YACA,YACA,mBACA,eAAY,OACZ,cACA,UACA,eACA,gBACI;CACJ,IAAM,EAAE,aAAU,EAAS,GAErB,CAAC,GAAe,KACpB,EAA0B,CAAY,GAClC,IAAc,MAAU,KAAA,IAAoB,IAAR,GAGpC,CAAC,GAAa,KAAkB,EAA4B,IAAI,GAChE,KAAgB,MACpB,MAAc,YAAY,EAAgB,CAAK,IAAI,OAAO,CAAK,GAG3D,IAAQ,QAAc,EAAe,GAAG,CAAC,CAAC,GAC1C,CAAC,GAAW,KAAgB,QAI5B,MACA,EAAY,KACP;EAAE,MAAM,EAAY,EAAE,CAAC;EAAM,OAAO,EAAY,EAAE,CAAC;CAAM,IAC3D;EAAE,MAAM,EAAM;EAAM,OAAO,EAAM;CAAM,EAC/C,GAGK,IAAiB,QAIjB,EAAU,UAAU,KACf;EAAE,MAAM,EAAU,OAAO;EAAG,OAAO;CAAE,IAEvC;EACL,MAAM,EAAU;EAChB,OAAQ,EAAU,QAAQ;CAC5B,GACC,CAAC,CAAS,CAAC,GAER,IAAiB,QAIjB,EAAU,UAAU,IACf;EAAE,MAAM,EAAU,OAAO;EAAG,OAAO;CAAG,IAExC;EACL,MAAM,EAAU;EAChB,OAAQ,EAAU,QAAQ;CAC5B,GACC,CAAC,CAAS,CAAC,GAER,KAAY,QACT,IAAU,EAAa,CAAO,IAAI,KAAA,GACzC,CAAC,CAAO,CACV,GACM,KAAY,QACT,IAAU,EAAa,CAAO,IAAI,KAAA,GACzC,CAAC,CAAO,CACV,GACM,IAAiB,CAAC,EACtB,EAAe,MACf,EAAe,OACf;EAAE,SAAS;EAAW,SAAS;CAAU,CAC3C,GACM,IACJ,EAAe,UAAU,KACrB;EAAE,MAAM,EAAe,OAAO;EAAG,OAAO;CAAsB,IAC9D;EACE,MAAM,EAAe;EACrB,OAAQ,EAAe,QAAQ;CACjC,GACA,IAAiB,CAAC,EACtB,EAAiB,MACjB,EAAiB,OACjB;EAAE,SAAS;EAAW,SAAS;CAAU,CAC3C,GAGM,WAAwB;EACxB,KACJ,GAAc,MACR,EAAK,UAAU,IAAU;GAAE,MAAM,EAAK,OAAO;GAAG,OAAO;EAAG,IACvD;GAAE,MAAM,EAAK;GAAM,OAAQ,EAAK,QAAQ;EAAuB,CACvE;CACH,GAEM,WAAwB;EACxB,KACJ,GAAc,MACR,EAAK,UAAU,KAAW;GAAE,MAAM,EAAK,OAAO;GAAG,OAAO;EAAE,IACvD;GAAE,MAAM,EAAK;GAAM,OAAQ,EAAK,QAAQ;EAAuB,CACvE;CACH,GAGM,KAAmB,GACtB,MAAuB;EACtB,IAAM,CAAC,GAAO,KAAO,GACjB;EAgBJ,AAdI,CAAC,KAAU,KAAS,IACtB,IAAW,CAAC,GAAQ,IAAI,KAExB,AAGE,IAHE,EAAmB,GAAQ,CAAK,IAAI,IAC3B,CAAC,GAAQ,CAAK,IAEd,CAAC,GAAO,CAAM,GAE3B,EAAe,IAAI,IAGjB,MAAU,KAAA,KACZ,EAAiB,CAAQ,GAE3B,IAAW,CAAQ;CACrB,GACA;EAAC;EAAa;EAAO;CAAQ,CAC/B,GAGM,IAAkB,GACrB,GAAc,MAAkD;EAC/D,IAAM,IAAU,EAA2B;GACzC;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,GAEK,CAAC,GAAO,KAAO,GACf,IAAe,MAAQ,KAAS,IAAc,IAAc;EAElE,OAAO,EAAQ,KAAK,MAAS;GAC3B,IAAM,IAAU,IAAQ,EAAgB,EAAK,QAAQ,CAAK,IAAI,IACxD,IAAQ,IACV,EAAgB,EAAK,QAAQ,CAAY,IACzC,IACA,IAAU;GAMd,OAJI,KAAS,MACX,IAAU,EAAoB,EAAK,QAAQ,GAAO,CAAY,IAGzD;IACL,GAAG;IACH,YAAY,KAAW;IACvB,WAAW;IACX,cAAc;IACd,YAAY;GACd;EACF,CAAC;CACH,GACA;EACE;EACA;EACA;EACA;EACA;EACA;CACF,CACF,GAEM,KAAW,QACT,EAAgB,EAAU,MAAM,EAAU,KAAK,GACrD;EAAC;EAAiB,EAAU;EAAM,EAAU;CAAK,CACnD,GAEM,IAAY,QACV,EAAgB,EAAe,MAAM,EAAe,KAAK,GAC/D;EAAC;EAAiB,EAAe;EAAM,EAAe;CAAK,CAC7D,GAEM,MACJ,GACA,GACA,GACA,MAEA,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAY;EACvB,OAAO;GACL,SAAS;GACT,eAAe;GACf,KAAK;GACL,OAAO;GACP,UAAU;GACV,UAAU;GACV,MAAM;GACN,GAAG,GAAQ;EACb;EAZF,UAAA;GAeE,kBAAC,OAAD;IACE,WAAW,GAAY;IACvB,OAAO;KACL,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,SAAS;KACT,QAAQ;KACR,GAAG,GAAQ;IACb;IATF,UAAA;KAWG,IACC,kBAAC,UAAD;MACE,MAAK;MACL,cAAW;MACX,SAAS;MACT,UAAU;MACV,iBAAe;MACf,WAAW,EACT,GAAY,WACZ,KAAkB,GAAY,iBAChC;MACA,OAAO;OACL,OAAO;OACP,QAAQ;OACR,cAAc;OACd,QAAQ,aAAa,EAAM,OAAO;OAClC,iBAAiB,EAAM,OAAO;OAC9B,OAAO,EAAM,OAAO;OACpB,QAAQ,IAAiB,gBAAgB;OACzC,SAAS,IAAiB,MAAO;OACjC,GAAG,GAAQ;OACX,GAAI,IAAiB,GAAQ,oBAAoB,KAAA;MACnD;MAEC,UAAA,MAAc,QAAQ,MAAM;KACvB,CAAA,IAER,kBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,OAAO,EAAI,CAAA;KAGlC,kBAAC,OAAD;MACE,OAAO;OACL,YAAY;OACZ,UAAU;OACV,OAAO,EAAM,OAAO;MACtB;MALF,UAAA;OAOG,EAAoB;OAAO;OAAE,EAAa,CAAI;MAC5C;;KAEH,IA2BA,kBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,OAAO,EAAI,CAAA,IA1BhC,kBAAC,UAAD;MACE,MAAK;MACL,cAAW;MACX,SAAS;MACT,UAAU;MACV,iBAAe;MACf,WAAW,EACT,GAAY,WACZ,KAAkB,GAAY,iBAChC;MACA,OAAO;OACL,OAAO;OACP,QAAQ;OACR,cAAc;OACd,QAAQ,aAAa,EAAM,OAAO;OAClC,iBAAiB,EAAM,OAAO;OAC9B,OAAO,EAAM,OAAO;OACpB,QAAQ,IAAiB,gBAAgB;OACzC,SAAS,IAAiB,MAAO;OACjC,GAAG,GAAQ;OACX,GAAI,IAAiB,GAAQ,oBAAoB,KAAA;MACnD;MAEC,UAAA,MAAc,QAAQ,MAAM;KACvB,CAAA;IAIP;;GAEL,kBAAC,IAAD;IACkB;IACJ;IACJ;GACT,CAAA;GAGD,kBAAC,OAAD;IACE,MAAK;IACL,cAAY,GAAG,EAAoB,GAAO,GAAG,EAAa,CAAI;IAC9D,KAAK;IACL,WAAW,GAAY;IACvB,OAAO;KACL,SAAS;KACT,OAAO;KACP,UAAU;KACV,qBAAqB;KACrB,KAAK;KACL,GAAG,GAAQ;IACb;IAEC,UAAA,EAAK,KAAK,MACT,kBAAC,IAAD;KAEQ;KACK;KACC;KACJ;KACR,UAAU;KACV,UAAU;KACV,SAAS;IACV,GARM,GAAG,EAAK,OAAO,KAAK,GAAG,EAAK,OAAO,MAAM,GAAG,EAAK,OAAO,KAQ9D,CACF;GACE,CAAA;EACF;;CAGP,OACE,kBAAC,OAAD;EACE,MAAK;EACL,cAAW;EACX,KAAK;EACL,WAAW,EAAgB,GAAW,GAAY,QAAQ;EAC1D,OACE;GACE,mBAAmB;GACnB,kBAAkB;GAClB,6BAA6B;GAC7B,SAAS;GACT,UAAU;GACV,KAAK;GACL,SAAS;GACT,WAAW;GACX,iBAAiB,EAAM,OAAO;GAC9B,OAAO,EAAM,OAAO;GACpB,cAAc,EAAM,MAAM;GAC1B,QAAQ,aAAa,EAAM,OAAO;GAClC,WAAW,EAAM,QAAQ;GACzB,OACE;GACF,UAAU;GACV,GAAG;GACH,GAAG,GAAQ;EACb;EAzBJ,UAAA,CA4BG,GAAgB,EAAU,MAAM,EAAU,OAAO,IAAU,EAAI,GAC/D,GACC,EAAe,MACf,EAAe,OACf,GACA,EACF,CACG;;AAET"}