@artemy-tech/datepicker 0.4.4 → 0.6.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,"sources":["../src/index.ts","../src/components/Calendar/Calendar.tsx","../src/components/DatePicker/DatePicker.tsx","../src/hooks/useClickOutside.ts","../src/components/TimePanel/TimePanel.tsx","../src/components/icons/CalendarIcon.tsx","../src/components/icons/Spinner.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/Button/Button.tsx"],"sourcesContent":["export { Calendar } from './components/Calendar'\nexport type { CalendarProps } from './components/Calendar'\n\nexport { DatePicker } from './components/DatePicker'\nexport type { DatePickerProps, DatePickerShowTime, DatePickerInputProps } from './components/DatePicker'\n\nexport { DateRangePicker } from './components/DateRangePicker'\nexport type { DateRangePickerProps, DateRange } from './components/DateRangePicker'\n\nexport { Button } from './components/Button'\nexport type { ButtonProps } from './components/Button'\n","import { DayPicker, DayPickerProps } from 'react-day-picker'\n\nexport type CalendarProps = DayPickerProps & {\n className?: string\n}\n\nexport function Calendar({ className, ...props }: CalendarProps) {\n return (\n <DayPicker\n className={['datepicker-calendar', className].filter(Boolean).join(' ')}\n {...props}\n />\n )\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { format, isValid, parse, startOfDay } from 'date-fns'\nimport { ru } from 'date-fns/locale'\nimport { useClickOutside } from '../../hooks/useClickOutside'\nimport { Calendar } from '../Calendar'\nimport { TimePanel } from '../TimePanel'\nimport { CalendarIcon } from '../icons/CalendarIcon'\nimport { Spinner } from '../icons/Spinner'\n\nexport type DatePickerSize = 's' | 'm' | 'l'\nexport type DatePickerShowTime = boolean | { format: 'HH:mm' | 'HH:mm:ss' }\n\nconst DATE_FORMAT = 'dd.MM.yyyy'\n\nfunction resolveTimeFormat(showTime?: DatePickerShowTime): 'HH:mm' | 'HH:mm:ss' | null {\n if (!showTime) return null\n if (showTime === true) return 'HH:mm:ss'\n return showTime.format\n}\n\nfunction buildDateFormat(timeFormat: string | null) {\n return timeFormat ? `${DATE_FORMAT} ${timeFormat}` : DATE_FORMAT\n}\n\nfunction buildMaxDigits(timeFormat: string | null) {\n if (!timeFormat) return 8\n return timeFormat === 'HH:mm' ? 12 : 14\n}\n\nfunction buildPlaceholder(timeFormat: string | null) {\n if (!timeFormat) return 'дд.мм.гггг'\n return timeFormat === 'HH:mm' ? 'дд.мм.гггг чч:мм' : 'дд.мм.гггг чч:мм:сс'\n}\n\nfunction applyMask(digits: string, maxDigits: number): string {\n const d = digits.slice(0, maxDigits)\n let result = ''\n for (let i = 0; i < d.length; i++) {\n if (i === 2 || i === 4) result += '.'\n else if (i === 8) result += ' '\n else if (i === 10 || i === 12) result += ':'\n result += d[i]\n }\n return result\n}\n\nfunction getCursorPos(masked: string, digitCount: number): number {\n if (digitCount === 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (/\\d/.test(masked[i])) {\n count++\n if (count === digitCount) return i + 1\n }\n }\n return masked.length\n}\n\nfunction toDateOnly(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0)\n}\n\nfunction parseDateTime(masked: string, dateFormat: string, maxDigits: number): Date | undefined {\n if (masked.replace(/\\D/g, '').length !== maxDigits) return undefined\n const date = parse(masked, dateFormat, new Date())\n if (!isValid(date) || format(date, dateFormat) !== masked) return undefined\n return maxDigits === 8 ? toDateOnly(date) : date\n}\n\nexport interface DatePickerInputProps {\n ref: React.Ref<HTMLInputElement>\n type: 'text'\n inputMode: 'numeric'\n className: string\n value: string\n placeholder: string | undefined\n disabled: boolean\n onChange: React.ChangeEventHandler<HTMLInputElement>\n onKeyDown: React.KeyboardEventHandler<HTMLInputElement>\n onPaste: React.ClipboardEventHandler<HTMLInputElement>\n onFocus: React.FocusEventHandler<HTMLInputElement>\n onBlur: React.FocusEventHandler<HTMLInputElement>\n 'aria-label': string\n 'aria-expanded': boolean | undefined\n 'aria-haspopup': 'dialog' | undefined\n 'aria-invalid': true | undefined\n}\n\nexport interface DatePickerProps {\n value?: Date\n defaultValue?: Date\n onChange?: (date: Date | undefined) => void\n label?: string\n placeholder?: string\n fromDate?: Date\n toDate?: Date\n disabled?: boolean\n failed?: boolean\n loading?: boolean\n size?: DatePickerSize\n noCalendar?: boolean\n showTime?: DatePickerShowTime\n icon?: ReactNode | false\n iconPosition?: 'start' | 'end'\n className?: string\n renderInput?: (props: DatePickerInputProps) => ReactNode\n customTrigger?: (value: string, onClick: () => void) => ReactNode\n}\n\nexport function DatePicker({\n value,\n defaultValue,\n onChange,\n label,\n placeholder,\n fromDate,\n toDate,\n disabled = false,\n failed = false,\n loading = false,\n size = 'm',\n noCalendar = false,\n showTime,\n icon,\n iconPosition = 'end',\n className,\n renderInput,\n customTrigger,\n}: DatePickerProps) {\n const timeFormat = resolveTimeFormat(showTime)\n const dateFormat = buildDateFormat(timeFormat)\n const maxDigits = buildMaxDigits(timeFormat)\n const defaultPlaceholder = placeholder ?? buildPlaceholder(timeFormat)\n const showSeconds = timeFormat === 'HH:mm:ss'\n\n const fromDay = fromDate ? startOfDay(fromDate) : undefined\n const toDay = toDate ? startOfDay(toDate) : undefined\n const disabledDays = [\n ...(fromDay ? [{ before: fromDay }] : []),\n ...(toDay ? [{ after: toDay }] : []),\n ]\n\n const resolvedIcon = loading ? <Spinner /> : icon === false ? null : (icon ?? <CalendarIcon />)\n\n const isControlled = value !== undefined\n const [internalDate, setInternalDate] = useState<Date | undefined>(defaultValue)\n const [open, setOpen] = useState(false)\n const [focused, setFocused] = useState(false)\n const [inputValue, setInputValue] = useState(() =>\n defaultValue && isValid(defaultValue) ? format(defaultValue, dateFormat) : '',\n )\n const [inputInvalid, setInputInvalid] = useState(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const lastValidRef = useRef(inputValue)\n // Track what we last emitted via onChange so we can ignore parent echoing it back\n const lastEmittedRef = useRef<Date | undefined>(value !== undefined ? value : defaultValue)\n // Once we see a defined value, we always sync external changes (handles RHF reset)\n const wasControlledRef = useRef(value !== undefined)\n\n const selected = isControlled ? value : internalDate\n const filled = inputValue.length > 0\n\n const close = useCallback(() => setOpen(false), [])\n useClickOutside(containerRef, close)\n\n // Sync inputValue when value changes externally (e.g. form reset)\n useEffect(() => {\n if (value !== undefined) wasControlledRef.current = true\n const lastTime = lastEmittedRef.current?.getTime() ?? null\n const valueTime = value?.getTime() ?? null\n if (valueTime === lastTime) return\n if (!wasControlledRef.current && value === undefined) return\n\n const formatted = value && isValid(value) ? format(value, dateFormat) : ''\n setInputValue(formatted)\n lastValidRef.current = formatted\n setInputInvalid(false)\n if (!isControlled) setInternalDate(value)\n lastEmittedRef.current = value\n }, [value]) // eslint-disable-line react-hooks/exhaustive-deps\n\n function applyValid(masked: string, date: Date | undefined) {\n lastEmittedRef.current = date\n lastValidRef.current = masked\n setInputValue(masked)\n setInputInvalid(false)\n if (!isControlled) setInternalDate(date)\n onChange?.(date)\n }\n\n function commit(masked: string) {\n const digits = masked.replace(/\\D/g, '')\n if (digits.length === 0) {\n lastEmittedRef.current = undefined\n lastValidRef.current = ''\n setInputInvalid(false)\n if (!isControlled) setInternalDate(undefined)\n onChange?.(undefined)\n } else if (digits.length === maxDigits) {\n const date = parseDateTime(masked, dateFormat, maxDigits)\n lastEmittedRef.current = date\n if (date) lastValidRef.current = masked\n setInputInvalid(!date)\n if (!isControlled) setInternalDate(date)\n onChange?.(date)\n } else {\n setInputInvalid(false)\n }\n }\n\n function handleBlur() {\n setFocused(false)\n const digits = inputValue.replace(/\\D/g, '')\n if ((digits.length > 0 && digits.length < maxDigits) || inputInvalid) {\n setInputValue(lastValidRef.current)\n setInputInvalid(false)\n }\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const input = e.target\n const cursorPos = input.selectionStart ?? 0\n const raw = input.value\n const digits = raw.replace(/\\D/g, '').slice(0, maxDigits)\n const masked = applyMask(digits, maxDigits)\n const digitsBeforeCursor = raw.slice(0, cursorPos).replace(/\\D/g, '').length\n const newCursorPos = getCursorPos(masked, digitsBeforeCursor)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(newCursorPos, newCursorPos))\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget\n const pos = input.selectionStart ?? 0\n\n if (e.key.length === 1 && !/\\d/.test(e.key) && !e.ctrlKey && !e.metaKey) {\n e.preventDefault()\n return\n }\n\n if (e.key === 'Backspace' && pos > 0 && /[.: ]/.test(input.value[pos - 1])) {\n e.preventDefault()\n const val = input.value\n const masked = applyMask((val.slice(0, pos - 2) + val.slice(pos)).replace(/\\D/g, ''), maxDigits)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => input.setSelectionRange(pos - 2, pos - 2))\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n e.preventDefault()\n const masked = applyMask(e.clipboardData.getData('text').replace(/\\D/g, ''), maxDigits)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(masked.length, masked.length))\n }\n\n function handleCalendarSelect(date: Date | undefined) {\n if (!date || !isValid(date)) {\n applyValid('', undefined)\n if (!timeFormat) setOpen(false)\n return\n }\n\n let dateToCommit: Date\n if (timeFormat) {\n const base = selected && isValid(selected) ? selected : new Date(0)\n dateToCommit = new Date(\n date.getFullYear(), date.getMonth(), date.getDate(),\n base.getHours(), base.getMinutes(), base.getSeconds(),\n )\n } else {\n dateToCommit = toDateOnly(date)\n }\n\n applyValid(format(dateToCommit, dateFormat), dateToCommit)\n if (!timeFormat) setOpen(false)\n }\n\n function handleTimeChange(h: number, m: number, s: number) {\n const base = selected && isValid(selected) ? selected : new Date()\n const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s)\n applyValid(format(newDate, dateFormat), newDate)\n }\n\n const interactive = !disabled && !loading\n\n return (\n <div\n ref={containerRef}\n className={['datepicker', `datepicker--${size}`, className].filter(Boolean).join(' ')}\n data-focused={focused || open || undefined}\n data-filled={filled || undefined}\n data-failed={failed || inputInvalid || undefined}\n data-disabled={!interactive || undefined}\n >\n {customTrigger\n ? customTrigger(inputValue, () => interactive && setOpen(prev => !prev))\n : (\n <div\n className={['datepicker__field', renderInput ? 'datepicker__field--custom' : ''].filter(Boolean).join(' ')}\n data-icon-start={resolvedIcon && iconPosition === 'start' ? true : undefined}\n data-icon-end={resolvedIcon && iconPosition === 'end' ? true : undefined}\n onClick={() => interactive && inputRef.current?.focus()}\n >\n {resolvedIcon && iconPosition === 'start' && (\n <span className=\"datepicker__icon datepicker__icon--start\">{resolvedIcon}</span>\n )}\n {label && <span className=\"datepicker__label\">{label}</span>}\n {(() => {\n const inputProps: DatePickerInputProps = {\n ref: inputRef,\n type: 'text',\n inputMode: 'numeric',\n className: 'datepicker__input',\n value: inputValue,\n placeholder: label && !focused ? undefined : defaultPlaceholder,\n disabled: !interactive,\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n onPaste: handlePaste,\n onFocus: () => { setFocused(true); if (interactive && !noCalendar) setOpen(true) },\n onBlur: handleBlur,\n 'aria-label': label ?? 'Выберите дату',\n 'aria-expanded': !noCalendar ? open : undefined,\n 'aria-haspopup': !noCalendar ? 'dialog' : undefined,\n 'aria-invalid': inputInvalid || undefined,\n }\n if (renderInput) return renderInput(inputProps)\n const { ref, ...rest } = inputProps\n return <input ref={ref as React.RefObject<HTMLInputElement>} {...rest} />\n })()}\n {resolvedIcon && iconPosition === 'end' && (\n <span className=\"datepicker__icon datepicker__icon--end\">{resolvedIcon}</span>\n )}\n </div>\n )\n }\n {!noCalendar && open && (\n <div\n className={[\n 'datepicker__popover',\n `datepicker__popover--${size}`,\n timeFormat && 'datepicker__popover--with-time',\n ].filter(Boolean).join(' ')}\n role=\"dialog\"\n aria-label=\"Календарь\"\n >\n {timeFormat ? (\n <>\n <div className=\"datepicker__popover-body\">\n <div className=\"datepicker__popover-calendar\">\n <Calendar\n mode=\"single\"\n selected={selected}\n onSelect={handleCalendarSelect}\n startMonth={fromDay}\n endMonth={toDay}\n disabled={disabledDays.length ? disabledDays : undefined}\n navLayout=\"around\"\n locale={ru}\n />\n </div>\n <div className=\"datepicker__time-separator\" />\n <div className=\"datepicker__popover-time\">\n <TimePanel\n value={selected}\n showSeconds={showSeconds}\n onChange={handleTimeChange}\n />\n </div>\n </div>\n <div className=\"datepicker__popover-footer\">\n <button\n className=\"datepicker__ok-btn\"\n type=\"button\"\n onClick={() => setOpen(false)}\n >\n OK\n </button>\n </div>\n </>\n ) : (\n <Calendar\n mode=\"single\"\n selected={selected}\n onSelect={handleCalendarSelect}\n startMonth={fromDay}\n endMonth={toDay}\n disabled={disabledDays.length ? disabledDays : undefined}\n navLayout=\"around\"\n locale={ru}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n","import { RefObject, useEffect } from 'react'\n\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, handler: () => void) {\n useEffect(() => {\n function listener(e: MouseEvent) {\n if (!ref.current || ref.current.contains(e.target as Node)) return\n handler()\n }\n document.addEventListener('mousedown', listener)\n return () => document.removeEventListener('mousedown', listener)\n }, [ref, handler])\n}\n","import { useEffect, useRef } from 'react'\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i)\nconst MINUTES = Array.from({ length: 60 }, (_, i) => i)\nconst SECONDS = Array.from({ length: 60 }, (_, i) => i)\n\nfunction pad2(n: number) {\n return String(n).padStart(2, '0')\n}\n\ninterface ColumnProps {\n values: number[]\n selected: number\n onSelect: (v: number) => void\n}\n\nfunction Column({ values, selected, onSelect }: ColumnProps) {\n const selectedRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: 'center', behavior: 'instant' })\n }, [selected])\n\n return (\n <div className=\"time-panel__column\">\n {values.map((v) => (\n <button\n key={v}\n ref={v === selected ? selectedRef : undefined}\n className=\"time-panel__item\"\n data-selected={v === selected || undefined}\n onClick={() => onSelect(v)}\n type=\"button\"\n tabIndex={-1}\n >\n {pad2(v)}\n </button>\n ))}\n </div>\n )\n}\n\nexport interface TimePanelProps {\n value: Date | undefined\n showSeconds: boolean\n onChange: (h: number, m: number, s: number) => void\n}\n\nexport function TimePanel({ value, showSeconds, onChange }: TimePanelProps) {\n const h = value?.getHours() ?? 0\n const m = value?.getMinutes() ?? 0\n const s = value?.getSeconds() ?? 0\n\n return (\n <div className=\"time-panel\">\n <Column values={HOURS} selected={h} onSelect={(v) => onChange(v, m, s)} />\n <Column values={MINUTES} selected={m} onSelect={(v) => onChange(h, v, s)} />\n {showSeconds && (\n <Column values={SECONDS} selected={s} onSelect={(v) => onChange(h, m, v)} />\n )}\n </div>\n )\n}\n","export function CalendarIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"2.5\" width=\"14\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M1 6.5H15\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 1V4M11 1V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","export function Spinner() {\n return <span className=\"datepicker-spinner\" aria-hidden=\"true\" />\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { format, isValid, parse, startOfDay } from 'date-fns';\nimport { ru } from 'date-fns/locale';\nimport type { DateRange } from 'react-day-picker';\nimport type { DatePickerShowTime } from '../DatePicker/DatePicker';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { Calendar } from '../Calendar';\nimport { TimePanel } from '../TimePanel';\nimport { CalendarIcon } from '../icons/CalendarIcon';\nimport { Spinner } from '../icons/Spinner';\n\nconst DATE_FORMAT = 'dd.MM.yyyy';\n\nfunction applyDateMask(digits: string): string {\n const d = digits.slice(0, 8);\n let result = '';\n for (let i = 0; i < d.length; i++) {\n if (i === 2 || i === 4) result += '.';\n result += d[i];\n }\n return result;\n}\n\nfunction applyRangeMask(digits: string): string {\n const all = digits.slice(0, 16);\n const fromMasked = applyDateMask(all.slice(0, 8));\n const toDigits = all.slice(8);\n if (toDigits.length === 0) return fromMasked;\n return `${fromMasked} — ${applyDateMask(toDigits)}`;\n}\n\nfunction getRangeCursorPos(masked: string, digitCount: number): number {\n if (digitCount === 0) return 0;\n let count = 0;\n for (let i = 0; i < masked.length; i++) {\n if (/\\d/.test(masked[i])) {\n count++;\n if (count === digitCount) return i + 1;\n }\n }\n return masked.length;\n}\n\nfunction toDateOnly(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0);\n}\n\nfunction parseDate(masked: string): Date | undefined {\n if (masked.replace(/\\D/g, '').length !== 8) return undefined;\n const date = parse(masked, DATE_FORMAT, new Date());\n if (!isValid(date) || format(date, DATE_FORMAT) !== masked) return undefined;\n return toDateOnly(date);\n}\n\nfunction formatRange(from: Date | undefined, to: Date | undefined): string {\n if (!from) return '';\n const fromStr = format(from, DATE_FORMAT);\n if (!to) return fromStr;\n return `${fromStr} — ${format(to, DATE_FORMAT)}`;\n}\n\nfunction resolveShowSeconds(showTime?: DatePickerShowTime): boolean {\n if (!showTime) return false;\n if (showTime === true) return true;\n return showTime.format === 'HH:mm:ss';\n}\n\nexport type { DateRange };\nexport type { DatePickerShowTime };\n\nexport type DateRangePickerSize = 's' | 'm' | 'l';\nexport type DateRangePickerCalendarLayout = 'vertical' | 'horizontal';\n\nexport interface DateRangePickerProps {\n value?: DateRange;\n defaultValue?: DateRange;\n onChange?: (range: DateRange | undefined) => void;\n label?: string;\n fromDate?: Date;\n toDate?: Date;\n disabled?: boolean;\n failed?: boolean;\n loading?: boolean;\n size?: DateRangePickerSize;\n calendarLayout?: DateRangePickerCalendarLayout;\n showTime?: DatePickerShowTime;\n icon?: ReactNode | false;\n iconPosition?: 'start' | 'end';\n className?: string;\n}\n\nexport function DateRangePicker({\n value,\n defaultValue,\n onChange,\n label,\n fromDate: fromConstraint,\n toDate: toConstraint,\n disabled = false,\n failed = false,\n loading = false,\n size = 'm',\n calendarLayout = 'horizontal',\n showTime,\n icon,\n iconPosition = 'end',\n className,\n}: DateRangePickerProps) {\n const resolvedIcon = loading ? (\n <Spinner />\n ) : icon === false ? null : (\n icon ?? <CalendarIcon />\n );\n\n const isControlled = value !== undefined;\n const showSeconds = resolveShowSeconds(showTime);\n\n const fromDay = fromConstraint ? startOfDay(fromConstraint) : undefined;\n const toDay = toConstraint ? startOfDay(toConstraint) : undefined;\n const disabledDays = [\n ...(fromDay ? [{ before: fromDay }] : []),\n ...(toDay ? [{ after: toDay }] : []),\n ];\n\n const [internalFrom, setInternalFrom] = useState<Date | undefined>(\n defaultValue?.from,\n );\n const [internalTo, setInternalTo] = useState<Date | undefined>(\n defaultValue?.to,\n );\n const [inputValue, setInputValue] = useState(() =>\n formatRange(defaultValue?.from, defaultValue?.to),\n );\n const [inputInvalid, setInputInvalid] = useState(false);\n const [open, setOpen] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const [anchorDate, setAnchorDate] = useState<Date | undefined>(undefined);\n const [hoveredDate, setHoveredDate] = useState<Date | undefined>(undefined);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Track last emitted range to ignore parent echoing it back\n const lastEmittedFromRef = useRef<Date | undefined>(\n value !== undefined ? value?.from : defaultValue?.from,\n );\n const lastEmittedToRef = useRef<Date | undefined>(\n value !== undefined ? value?.to : defaultValue?.to,\n );\n const wasControlledRef = useRef(value !== undefined);\n\n const confirmedFrom = isControlled ? value?.from : internalFrom;\n const confirmedTo = isControlled ? value?.to : internalTo;\n const filled = inputValue.length > 0;\n\n const close = useCallback(() => {\n setOpen(false);\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n }, []);\n useClickOutside(containerRef, close);\n\n // Sync inputValue when value changes externally (e.g. form reset)\n useEffect(() => {\n if (value !== undefined) wasControlledRef.current = true;\n const newFrom = value?.from;\n const newTo = value?.to;\n const fromTime = newFrom?.getTime() ?? null;\n const toTime = newTo?.getTime() ?? null;\n const lastFromTime = lastEmittedFromRef.current?.getTime() ?? null;\n const lastToTime = lastEmittedToRef.current?.getTime() ?? null;\n if (fromTime === lastFromTime && toTime === lastToTime) return;\n if (!wasControlledRef.current && value === undefined) return;\n\n setInputValue(formatRange(newFrom, newTo));\n setInputInvalid(false);\n if (!isControlled) {\n setInternalFrom(newFrom);\n setInternalTo(newTo);\n }\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n lastEmittedFromRef.current = newFrom;\n lastEmittedToRef.current = newTo;\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const calendarSelected: DateRange | undefined = anchorDate\n ? hoveredDate\n ? anchorDate <= hoveredDate\n ? { from: anchorDate, to: hoveredDate }\n : { from: hoveredDate, to: anchorDate }\n : { from: anchorDate, to: undefined }\n : { from: confirmedFrom, to: confirmedTo };\n\n function handleDayClick(day: Date) {\n if (!anchorDate) {\n const from = showTime\n ? new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n confirmedFrom?.getHours() ?? 0,\n confirmedFrom?.getMinutes() ?? 0,\n confirmedFrom?.getSeconds() ?? 0,\n )\n : toDateOnly(day);\n setAnchorDate(from);\n if (!isControlled) {\n setInternalFrom(from);\n setInternalTo(undefined);\n }\n setInputValue(format(day, DATE_FORMAT));\n setInputInvalid(false);\n lastEmittedFromRef.current = from;\n lastEmittedToRef.current = undefined;\n onChange?.({ from, to: undefined });\n } else {\n let from = anchorDate,\n to = showTime\n ? new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n confirmedTo?.getHours() ?? 0,\n confirmedTo?.getMinutes() ?? 0,\n confirmedTo?.getSeconds() ?? 0,\n )\n : toDateOnly(day);\n if (day < anchorDate) {\n const tmp = from;\n from = to;\n to = tmp;\n }\n if (!isControlled) {\n setInternalFrom(from);\n setInternalTo(to);\n }\n setInputValue(formatRange(from, to));\n setInputInvalid(false);\n lastEmittedFromRef.current = from;\n lastEmittedToRef.current = to;\n onChange?.({ from, to });\n if (!showTime) close();\n else setAnchorDate(undefined);\n }\n }\n\n function handleDayMouseEnter(day: Date) {\n if (anchorDate) setHoveredDate(day);\n }\n\n function handleFromTimeChange(h: number, m: number, s: number) {\n const base = confirmedFrom ?? new Date();\n const newDate = new Date(\n base.getFullYear(),\n base.getMonth(),\n base.getDate(),\n h,\n m,\n s,\n );\n if (!isControlled) setInternalFrom(newDate);\n lastEmittedFromRef.current = newDate;\n onChange?.({ from: newDate, to: confirmedTo });\n }\n\n function handleToTimeChange(h: number, m: number, s: number) {\n const base = confirmedTo ?? new Date();\n const newDate = new Date(\n base.getFullYear(),\n base.getMonth(),\n base.getDate(),\n h,\n m,\n s,\n );\n if (!isControlled) setInternalTo(newDate);\n lastEmittedToRef.current = newDate;\n onChange?.({ from: confirmedFrom, to: newDate });\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const input = e.target;\n const cursorPos = input.selectionStart ?? 0;\n const raw = input.value;\n const digits = raw.replace(/\\D/g, '').slice(0, 16);\n const masked = applyRangeMask(digits);\n const digitsBeforeCursor = raw\n .slice(0, cursorPos)\n .replace(/\\D/g, '').length;\n\n setInputValue(masked);\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n\n const fromDigits = digits.slice(0, 8);\n const toDigits = digits.slice(8);\n const parsedFrom =\n fromDigits.length === 8\n ? parseDate(applyDateMask(fromDigits))\n : undefined;\n const parsedTo =\n toDigits.length === 8 ? parseDate(applyDateMask(toDigits)) : undefined;\n const fromComplete = fromDigits.length === 8;\n const toComplete = toDigits.length === 8;\n setInputInvalid((fromComplete && !parsedFrom) || (toComplete && !parsedTo));\n\n if (!isControlled) {\n setInternalFrom(parsedFrom);\n setInternalTo(parsedTo);\n }\n lastEmittedFromRef.current = parsedFrom;\n lastEmittedToRef.current = parsedTo;\n onChange?.(\n parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined,\n );\n\n requestAnimationFrame(() =>\n inputRef.current?.setSelectionRange(\n getRangeCursorPos(masked, digitsBeforeCursor),\n getRangeCursorPos(masked, digitsBeforeCursor),\n ),\n );\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget;\n const pos = input.selectionStart ?? 0;\n\n if (e.key.length === 1 && !/\\d/.test(e.key) && !e.ctrlKey && !e.metaKey) {\n e.preventDefault();\n return;\n }\n if (\n e.key === 'Backspace' &&\n pos > 0 &&\n /[\\s—]/.test(input.value[pos - 1])\n ) {\n e.preventDefault();\n const val = input.value;\n const charsToSkip = val.slice(0, pos).match(/[\\s—]+$/)?.[0].length ?? 1;\n const newPos = pos - charsToSkip;\n const masked = applyRangeMask(\n (val.slice(0, newPos - 1) + val.slice(newPos)).replace(/\\D/g, ''),\n );\n setInputValue(masked);\n requestAnimationFrame(() =>\n input.setSelectionRange(newPos - 1, newPos - 1),\n );\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text');\n const digits = text.replace(/\\D/g, '').slice(0, 16);\n const masked = applyRangeMask(digits);\n setInputValue(masked);\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n\n const parsedFrom =\n digits.length >= 8\n ? parseDate(applyDateMask(digits.slice(0, 8)))\n : undefined;\n const parsedTo =\n digits.length >= 16\n ? parseDate(applyDateMask(digits.slice(8, 16)))\n : undefined;\n setInputInvalid(\n (digits.length >= 8 && !parsedFrom) || (digits.length >= 16 && !parsedTo),\n );\n if (!isControlled) {\n setInternalFrom(parsedFrom);\n setInternalTo(parsedTo);\n }\n lastEmittedFromRef.current = parsedFrom;\n lastEmittedToRef.current = parsedTo;\n onChange?.(\n parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined,\n );\n\n requestAnimationFrame(() =>\n inputRef.current?.setSelectionRange(masked.length, masked.length),\n );\n }\n\n const placeholder =\n label && !focused && !filled ? undefined : 'дд.мм.гггг — дд.мм.гггг';\n const interactive = !disabled && !loading;\n\n return (\n <div\n ref={containerRef}\n className={[\n 'datepicker',\n 'daterangepicker',\n `datepicker--${size}`,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-focused={focused || open || undefined}\n data-filled={filled || undefined}\n data-failed={failed || inputInvalid || undefined}\n data-disabled={!interactive || undefined}\n >\n <div\n className=\"datepicker__field\"\n data-icon-start={\n resolvedIcon && iconPosition === 'start' ? true : undefined\n }\n data-icon-end={\n resolvedIcon && iconPosition === 'end' ? true : undefined\n }\n onClick={() => interactive && inputRef.current?.focus()}\n >\n {resolvedIcon && iconPosition === 'start' && (\n <span className=\"datepicker__icon datepicker__icon--start\">\n {resolvedIcon}\n </span>\n )}\n {label && <span className=\"datepicker__label\">{label}</span>}\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n className=\"datepicker__input\"\n value={inputValue}\n placeholder={placeholder}\n disabled={!interactive}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => {\n setFocused(true);\n if (interactive) setOpen(true);\n }}\n onBlur={() => setFocused(false)}\n aria-label={label ?? 'Выберите период'}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-invalid={inputInvalid || undefined}\n />\n {resolvedIcon && iconPosition === 'end' && (\n <span className=\"datepicker__icon datepicker__icon--end\">\n {resolvedIcon}\n </span>\n )}\n </div>\n {open && (\n <div\n className={[\n 'datepicker__popover',\n `datepicker__popover--${size}`,\n calendarLayout === 'horizontal' &&\n 'datepicker__popover--horizontal',\n showTime && 'datepicker__popover--with-time',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"dialog\"\n aria-label=\"Выберите период\"\n >\n {showTime ? (\n <>\n <div className=\"datepicker__popover-body\">\n <div className=\"datepicker__popover-calendar\">\n <Calendar\n mode=\"range\"\n selected={calendarSelected}\n onSelect={() => {}}\n onDayClick={handleDayClick}\n onDayMouseEnter={handleDayMouseEnter}\n onDayMouseLeave={() => setHoveredDate(undefined)}\n startMonth={fromDay}\n endMonth={toDay}\n disabled={disabledDays.length ? disabledDays : undefined}\n numberOfMonths={2}\n locale={ru}\n />\n </div>\n </div>\n <div className=\"datepicker__time-row\">\n <div className=\"datepicker__time-col\">\n <span className=\"datepicker__time-label\">Начало</span>\n <TimePanel\n value={confirmedFrom}\n showSeconds={showSeconds}\n onChange={handleFromTimeChange}\n />\n </div>\n <div className=\"datepicker__time-separator\" />\n <div className=\"datepicker__time-col\">\n <span className=\"datepicker__time-label\">Конец</span>\n <TimePanel\n value={confirmedTo}\n showSeconds={showSeconds}\n onChange={handleToTimeChange}\n />\n </div>\n </div>\n <div className=\"datepicker__popover-footer\">\n <button\n className=\"datepicker__ok-btn\"\n type=\"button\"\n onClick={close}\n >\n OK\n </button>\n </div>\n </>\n ) : (\n <Calendar\n mode=\"range\"\n selected={calendarSelected}\n onSelect={() => {}}\n onDayClick={handleDayClick}\n onDayMouseEnter={handleDayMouseEnter}\n onDayMouseLeave={() => setHoveredDate(undefined)}\n startMonth={fromConstraint}\n endMonth={toConstraint}\n numberOfMonths={2}\n locale={ru}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { ButtonProps } from './Button.types'\nimport { Spinner } from '../icons/Spinner'\n\nexport function Button({\n variant = 'primary',\n size = 'm',\n loading = false,\n disabled,\n className,\n children,\n ...rest\n}: ButtonProps) {\n const classes = [\n 'dp-btn',\n `dp-btn--${variant}`,\n `dp-btn--${size}`,\n loading && 'dp-btn--loading',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <button {...rest} className={classes} disabled={disabled || loading}>\n {children}\n {loading && <Spinner />}\n </button>\n )\n}\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_a","import_react","import_date_fns","import_locale","import_jsx_runtime","DATE_FORMAT","toDateOnly","_a","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/Calendar/Calendar.tsx","../src/components/DatePicker/DatePicker.tsx","../src/hooks/useClickOutside.ts","../src/components/TimePanel/TimePanel.tsx","../src/components/icons/CalendarIcon.tsx","../src/components/icons/Spinner.tsx","../src/utils/date-mask.ts","../src/components/DateRangePicker/DateRangePicker.tsx","../src/utils/range-mask.ts","../src/components/Button/Button.tsx"],"sourcesContent":["export { Calendar } from './components/Calendar'\nexport type { CalendarProps } from './components/Calendar'\n\nexport { DatePicker } from './components/DatePicker'\nexport type { DatePickerProps, DatePickerShowTime, DatePickerInputProps } from './components/DatePicker'\n\nexport { DateRangePicker } from './components/DateRangePicker'\nexport type { DateRangePickerProps, DateRange } from './components/DateRangePicker'\n\nexport { Button } from './components/Button'\nexport type { ButtonProps } from './components/Button'\n","import { DayPicker, DayPickerProps } from 'react-day-picker'\n\nexport type CalendarProps = DayPickerProps & {\n className?: string\n}\n\nexport function Calendar({ className, ...props }: CalendarProps) {\n return (\n <DayPicker\n className={['datepicker-calendar', className].filter(Boolean).join(' ')}\n {...props}\n />\n )\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { format, isValid, startOfDay } from 'date-fns'\nimport { ru } from 'date-fns/locale'\nimport { useClickOutside } from '../../hooks/useClickOutside'\nimport { Calendar } from '../Calendar'\nimport { TimePanel } from '../TimePanel'\nimport { CalendarIcon } from '../icons/CalendarIcon'\nimport { Spinner } from '../icons/Spinner'\nimport {\n applyMask,\n buildDateFormat,\n buildMaxDigits,\n buildPlaceholder,\n getCursorPos,\n parseDateTime,\n resolveTimeFormat,\n toDateOnly,\n} from '../../utils/date-mask'\n\nexport type DatePickerSize = 's' | 'm' | 'l'\nexport type DatePickerShowTime = boolean | { format: 'HH:mm' | 'HH:mm:ss' }\n\nexport interface DatePickerInputProps {\n ref: React.Ref<HTMLInputElement>\n type: 'text'\n inputMode: 'numeric'\n className: string\n value: string\n placeholder: string | undefined\n disabled: boolean\n onChange: React.ChangeEventHandler<HTMLInputElement>\n onKeyDown: React.KeyboardEventHandler<HTMLInputElement>\n onPaste: React.ClipboardEventHandler<HTMLInputElement>\n onFocus: React.FocusEventHandler<HTMLInputElement>\n onBlur: React.FocusEventHandler<HTMLInputElement>\n 'aria-label': string\n 'aria-expanded': boolean | undefined\n 'aria-haspopup': 'dialog' | undefined\n 'aria-invalid': true | undefined\n}\n\nexport interface DatePickerProps {\n value?: Date\n defaultValue?: Date\n onChange?: (date: Date | undefined) => void\n label?: string\n placeholder?: string\n fromDate?: Date\n toDate?: Date\n disabled?: boolean\n failed?: boolean\n loading?: boolean\n size?: DatePickerSize\n noCalendar?: boolean\n showTime?: DatePickerShowTime\n icon?: ReactNode | false\n iconPosition?: 'start' | 'end'\n className?: string\n renderInput?: (props: DatePickerInputProps) => ReactNode\n customTrigger?: (value: string, onClick: () => void) => ReactNode\n}\n\nexport function DatePicker({\n value,\n defaultValue,\n onChange,\n label,\n placeholder,\n fromDate,\n toDate,\n disabled = false,\n failed = false,\n loading = false,\n size = 'm',\n noCalendar = false,\n showTime,\n icon,\n iconPosition = 'end',\n className,\n renderInput,\n customTrigger,\n}: DatePickerProps) {\n const timeFormat = resolveTimeFormat(showTime)\n const dateFormat = buildDateFormat(timeFormat)\n const maxDigits = buildMaxDigits(timeFormat)\n const defaultPlaceholder = placeholder ?? buildPlaceholder(timeFormat)\n const showSeconds = timeFormat === 'HH:mm:ss'\n\n const fromDay = fromDate ? startOfDay(fromDate) : undefined\n const toDay = toDate ? startOfDay(toDate) : undefined\n const disabledDays = [\n ...(fromDay ? [{ before: fromDay }] : []),\n ...(toDay ? [{ after: toDay }] : []),\n ]\n\n const resolvedIcon = loading ? <Spinner /> : icon === false ? null : (icon ?? <CalendarIcon />)\n\n const isControlled = value !== undefined\n const [internalDate, setInternalDate] = useState<Date | undefined>(defaultValue)\n const [open, setOpen] = useState(false)\n const [focused, setFocused] = useState(false)\n const [inputValue, setInputValue] = useState(() => {\n const initial = value ?? defaultValue\n return initial && isValid(initial) ? format(initial, dateFormat) : ''\n })\n const [inputInvalid, setInputInvalid] = useState(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const lastValidRef = useRef(inputValue)\n // Track what we last emitted via onChange so we can ignore parent echoing it back\n const lastEmittedRef = useRef<Date | undefined>(value !== undefined ? value : defaultValue)\n // Once we see a defined value, we always sync external changes (handles RHF reset)\n const wasControlledRef = useRef(value !== undefined)\n\n const selected = isControlled ? value : internalDate\n const [month, setMonth] = useState<Date>(\n () => (selected && isValid(selected) ? selected : new Date()),\n )\n const filled = inputValue.length > 0\n\n useEffect(() => {\n if (selected && isValid(selected)) setMonth(selected)\n }, [selected?.getFullYear(), selected?.getMonth()]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const close = useCallback(() => setOpen(false), [])\n useClickOutside(containerRef, close)\n\n // Sync inputValue when value changes externally (e.g. form reset)\n useEffect(() => {\n if (value !== undefined) wasControlledRef.current = true\n const lastTime = lastEmittedRef.current?.getTime() ?? null\n const valueTime = value?.getTime() ?? null\n if (valueTime === lastTime) return\n if (!wasControlledRef.current && value === undefined) return\n\n const formatted = value && isValid(value) ? format(value, dateFormat) : ''\n setInputValue(formatted)\n lastValidRef.current = formatted\n setInputInvalid(false)\n if (!isControlled) setInternalDate(value)\n lastEmittedRef.current = value\n }, [value]) // eslint-disable-line react-hooks/exhaustive-deps\n\n function applyValid(masked: string, date: Date | undefined) {\n lastEmittedRef.current = date\n lastValidRef.current = masked\n setInputValue(masked)\n setInputInvalid(false)\n if (!isControlled) setInternalDate(date)\n onChange?.(date)\n }\n\n function commit(masked: string) {\n const digits = masked.replace(/\\D/g, '')\n if (digits.length === 0) {\n lastEmittedRef.current = undefined\n lastValidRef.current = ''\n setInputInvalid(false)\n if (!isControlled) setInternalDate(undefined)\n onChange?.(undefined)\n } else if (digits.length === maxDigits) {\n const date = parseDateTime(masked, dateFormat, maxDigits)\n lastEmittedRef.current = date\n if (date) lastValidRef.current = masked\n setInputInvalid(!date)\n if (!isControlled) setInternalDate(date)\n onChange?.(date)\n } else {\n setInputInvalid(false)\n }\n }\n\n function handleBlur() {\n setFocused(false)\n const digits = inputValue.replace(/\\D/g, '')\n if ((digits.length > 0 && digits.length < maxDigits) || inputInvalid) {\n setInputValue(lastValidRef.current)\n setInputInvalid(false)\n }\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const input = e.target\n const cursorPos = input.selectionStart ?? 0\n const raw = input.value\n const digits = raw.replace(/\\D/g, '').slice(0, maxDigits)\n const masked = applyMask(digits, maxDigits)\n const digitsBeforeCursor = raw.slice(0, cursorPos).replace(/\\D/g, '').length\n const newCursorPos = getCursorPos(masked, digitsBeforeCursor)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(newCursorPos, newCursorPos))\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget\n const pos = input.selectionStart ?? 0\n\n if (e.key.length === 1 && !/\\d/.test(e.key) && !e.ctrlKey && !e.metaKey) {\n e.preventDefault()\n return\n }\n\n if (e.key === 'Backspace' && pos > 0 && /[.: ]/.test(input.value[pos - 1])) {\n e.preventDefault()\n const val = input.value\n const masked = applyMask((val.slice(0, pos - 2) + val.slice(pos)).replace(/\\D/g, ''), maxDigits)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => input.setSelectionRange(pos - 2, pos - 2))\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n e.preventDefault()\n const masked = applyMask(e.clipboardData.getData('text').replace(/\\D/g, ''), maxDigits)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(masked.length, masked.length))\n }\n\n function handleCalendarSelect(date: Date | undefined) {\n if (!date || !isValid(date)) {\n applyValid('', undefined)\n if (!timeFormat) setOpen(false)\n return\n }\n\n let dateToCommit: Date\n if (timeFormat) {\n const base = selected && isValid(selected) ? selected : new Date(0)\n dateToCommit = new Date(\n date.getFullYear(), date.getMonth(), date.getDate(),\n base.getHours(), base.getMinutes(), base.getSeconds(),\n )\n } else {\n dateToCommit = toDateOnly(date)\n }\n\n applyValid(format(dateToCommit, dateFormat), dateToCommit)\n if (!timeFormat) setOpen(false)\n }\n\n function handleTimeChange(h: number, m: number, s: number) {\n const base = selected && isValid(selected) ? selected : new Date()\n const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s)\n applyValid(format(newDate, dateFormat), newDate)\n }\n\n const interactive = !disabled && !loading\n\n return (\n <div\n ref={containerRef}\n className={['datepicker', `datepicker--${size}`, className].filter(Boolean).join(' ')}\n data-focused={focused || open || undefined}\n data-filled={filled || undefined}\n data-failed={failed || inputInvalid || undefined}\n data-disabled={!interactive || undefined}\n >\n {customTrigger\n ? customTrigger(inputValue, () => interactive && setOpen(prev => !prev))\n : (\n <div\n className={['datepicker__field', renderInput ? 'datepicker__field--custom' : ''].filter(Boolean).join(' ')}\n data-icon-start={resolvedIcon && iconPosition === 'start' ? true : undefined}\n data-icon-end={resolvedIcon && iconPosition === 'end' ? true : undefined}\n onClick={() => interactive && inputRef.current?.focus()}\n >\n {resolvedIcon && iconPosition === 'start' && (\n <span className=\"datepicker__icon datepicker__icon--start\">{resolvedIcon}</span>\n )}\n {label && <span className=\"datepicker__label\">{label}</span>}\n {(() => {\n const inputProps: DatePickerInputProps = {\n ref: inputRef,\n type: 'text',\n inputMode: 'numeric',\n className: 'datepicker__input',\n value: inputValue,\n placeholder: label && !focused ? undefined : defaultPlaceholder,\n disabled: !interactive,\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n onPaste: handlePaste,\n onFocus: () => { setFocused(true); if (interactive && !noCalendar) setOpen(true) },\n onBlur: handleBlur,\n 'aria-label': label ?? 'Выберите дату',\n 'aria-expanded': !noCalendar ? open : undefined,\n 'aria-haspopup': !noCalendar ? 'dialog' : undefined,\n 'aria-invalid': inputInvalid || undefined,\n }\n if (renderInput) return renderInput(inputProps)\n const { ref, ...rest } = inputProps\n return <input ref={ref as React.RefObject<HTMLInputElement>} {...rest} />\n })()}\n {resolvedIcon && iconPosition === 'end' && (\n <span className=\"datepicker__icon datepicker__icon--end\">{resolvedIcon}</span>\n )}\n </div>\n )\n }\n {!noCalendar && open && (\n <div\n className={[\n 'datepicker__popover',\n `datepicker__popover--${size}`,\n timeFormat && 'datepicker__popover--with-time',\n ].filter(Boolean).join(' ')}\n role=\"dialog\"\n aria-label=\"Календарь\"\n >\n {timeFormat ? (\n <>\n <div className=\"datepicker__popover-body\">\n <div className=\"datepicker__popover-calendar\">\n <Calendar\n mode=\"single\"\n selected={selected}\n month={month}\n onMonthChange={setMonth}\n onSelect={handleCalendarSelect}\n startMonth={fromDay}\n endMonth={toDay}\n disabled={disabledDays.length ? disabledDays : undefined}\n navLayout=\"around\"\n locale={ru}\n />\n </div>\n <div className=\"datepicker__time-separator\" />\n <div className=\"datepicker__popover-time\">\n <TimePanel\n value={selected}\n showSeconds={showSeconds}\n onChange={handleTimeChange}\n />\n </div>\n </div>\n <div className=\"datepicker__popover-footer\">\n <button\n className=\"datepicker__ok-btn\"\n type=\"button\"\n onClick={() => setOpen(false)}\n >\n OK\n </button>\n </div>\n </>\n ) : (\n <Calendar\n mode=\"single\"\n selected={selected}\n month={month}\n onMonthChange={setMonth}\n onSelect={handleCalendarSelect}\n startMonth={fromDay}\n endMonth={toDay}\n disabled={disabledDays.length ? disabledDays : undefined}\n navLayout=\"around\"\n locale={ru}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n","import { RefObject, useEffect } from 'react'\n\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, handler: () => void) {\n useEffect(() => {\n function listener(e: MouseEvent) {\n if (!ref.current || ref.current.contains(e.target as Node)) return\n handler()\n }\n document.addEventListener('mousedown', listener)\n return () => document.removeEventListener('mousedown', listener)\n }, [ref, handler])\n}\n","import { useEffect, useRef } from 'react'\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i)\nconst MINUTES = Array.from({ length: 60 }, (_, i) => i)\nconst SECONDS = Array.from({ length: 60 }, (_, i) => i)\n\nfunction pad2(n: number) {\n return String(n).padStart(2, '0')\n}\n\ninterface ColumnProps {\n values: number[]\n selected: number\n onSelect: (v: number) => void\n}\n\nfunction Column({ values, selected, onSelect }: ColumnProps) {\n const selectedRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: 'center', behavior: 'instant' })\n }, [selected])\n\n return (\n <div className=\"time-panel__column\">\n {values.map((v) => (\n <button\n key={v}\n ref={v === selected ? selectedRef : undefined}\n className=\"time-panel__item\"\n data-selected={v === selected || undefined}\n onClick={() => onSelect(v)}\n type=\"button\"\n tabIndex={-1}\n >\n {pad2(v)}\n </button>\n ))}\n </div>\n )\n}\n\nexport interface TimePanelProps {\n value: Date | undefined\n showSeconds: boolean\n onChange: (h: number, m: number, s: number) => void\n}\n\nexport function TimePanel({ value, showSeconds, onChange }: TimePanelProps) {\n const h = value?.getHours() ?? 0\n const m = value?.getMinutes() ?? 0\n const s = value?.getSeconds() ?? 0\n\n return (\n <div className=\"time-panel\">\n <Column values={HOURS} selected={h} onSelect={(v) => onChange(v, m, s)} />\n <Column values={MINUTES} selected={m} onSelect={(v) => onChange(h, v, s)} />\n {showSeconds && (\n <Column values={SECONDS} selected={s} onSelect={(v) => onChange(h, m, v)} />\n )}\n </div>\n )\n}\n","export function CalendarIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"2.5\" width=\"14\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M1 6.5H15\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 1V4M11 1V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","export function Spinner() {\n return <span className=\"datepicker-spinner\" aria-hidden=\"true\" />\n}\n","import { format, isValid, parse } from 'date-fns'\nimport type { DatePickerShowTime } from '../components/DatePicker/DatePicker'\n\nexport const DATE_FORMAT = 'dd.MM.yyyy'\n\nexport function resolveTimeFormat(showTime?: DatePickerShowTime): 'HH:mm' | 'HH:mm:ss' | null {\n if (!showTime) return null\n if (showTime === true) return 'HH:mm:ss'\n return showTime.format\n}\n\nexport function buildDateFormat(timeFormat: string | null): string {\n return timeFormat ? `${DATE_FORMAT} ${timeFormat}` : DATE_FORMAT\n}\n\nexport function buildMaxDigits(timeFormat: string | null): number {\n if (!timeFormat) return 8\n return timeFormat === 'HH:mm' ? 12 : 14\n}\n\nexport function buildPlaceholder(timeFormat: string | null): string {\n if (!timeFormat) return 'дд.мм.гггг'\n return timeFormat === 'HH:mm' ? 'дд.мм.гггг чч:мм' : 'дд.мм.гггг чч:мм:сс'\n}\n\nexport function applyMask(digits: string, maxDigits: number): string {\n const d = digits.slice(0, maxDigits)\n let result = ''\n for (let i = 0; i < d.length; i++) {\n if (i === 2 || i === 4) result += '.'\n else if (i === 8) result += ' '\n else if (i === 10 || i === 12) result += ':'\n result += d[i]\n }\n return result\n}\n\nexport function getCursorPos(masked: string, digitCount: number): number {\n if (digitCount === 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (/\\d/.test(masked[i])) {\n count++\n if (count === digitCount) return i + 1\n }\n }\n return masked.length\n}\n\nexport function toDateOnly(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0)\n}\n\nexport function parseDateTime(\n masked: string,\n dateFormat: string,\n maxDigits: number,\n): Date | undefined {\n if (masked.replace(/\\D/g, '').length !== maxDigits) return undefined\n const date = parse(masked, dateFormat, new Date())\n if (!isValid(date) || format(date, dateFormat) !== masked) return undefined\n return maxDigits === 8 ? toDateOnly(date) : date\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { isValid, startOfDay } from 'date-fns';\nimport { ru } from 'date-fns/locale';\nimport type { DateRange } from 'react-day-picker';\nimport type { DatePickerShowTime } from '../DatePicker/DatePicker';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { Calendar } from '../Calendar';\nimport { TimePanel } from '../TimePanel';\nimport { CalendarIcon } from '../icons/CalendarIcon';\nimport { Spinner } from '../icons/Spinner';\nimport {\n applyDateMask,\n applyRangeMask,\n formatRange,\n getRangeCursorPos,\n parseDate,\n resolveShowSeconds,\n toDateOnly,\n} from '../../utils/range-mask';\n\nexport type { DateRange };\nexport type { DatePickerShowTime };\n\nexport type DateRangePickerSize = 's' | 'm' | 'l';\nexport type DateRangePickerCalendarLayout = 'vertical' | 'horizontal';\n\nexport interface DateRangePickerProps {\n value?: DateRange;\n defaultValue?: DateRange;\n onChange?: (range: DateRange | undefined) => void;\n label?: string;\n fromDate?: Date;\n toDate?: Date;\n disabled?: boolean;\n failed?: boolean;\n loading?: boolean;\n size?: DateRangePickerSize;\n calendarLayout?: DateRangePickerCalendarLayout;\n showTime?: DatePickerShowTime;\n icon?: ReactNode | false;\n iconPosition?: 'start' | 'end';\n className?: string;\n}\n\nexport function DateRangePicker({\n value,\n defaultValue,\n onChange,\n label,\n fromDate: fromConstraint,\n toDate: toConstraint,\n disabled = false,\n failed = false,\n loading = false,\n size = 'm',\n calendarLayout = 'horizontal',\n showTime,\n icon,\n iconPosition = 'end',\n className,\n}: DateRangePickerProps) {\n const resolvedIcon = loading ? (\n <Spinner />\n ) : icon === false ? null : (\n icon ?? <CalendarIcon />\n );\n\n const isControlled = value !== undefined;\n const showSeconds = resolveShowSeconds(showTime);\n\n const fromDay = fromConstraint ? startOfDay(fromConstraint) : undefined;\n const toDay = toConstraint ? startOfDay(toConstraint) : undefined;\n const disabledDays = [\n ...(fromDay ? [{ before: fromDay }] : []),\n ...(toDay ? [{ after: toDay }] : []),\n ];\n\n const [internalFrom, setInternalFrom] = useState<Date | undefined>(\n defaultValue?.from,\n );\n const [internalTo, setInternalTo] = useState<Date | undefined>(\n defaultValue?.to,\n );\n const [inputValue, setInputValue] = useState(() => {\n const initial = value ?? defaultValue;\n return formatRange(initial?.from, initial?.to);\n });\n const [inputInvalid, setInputInvalid] = useState(false);\n const [open, setOpen] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const [anchorDate, setAnchorDate] = useState<Date | undefined>(undefined);\n const [hoveredDate, setHoveredDate] = useState<Date | undefined>(undefined);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Track last emitted range to ignore parent echoing it back\n const lastEmittedFromRef = useRef<Date | undefined>(\n value !== undefined ? value?.from : defaultValue?.from,\n );\n const lastEmittedToRef = useRef<Date | undefined>(\n value !== undefined ? value?.to : defaultValue?.to,\n );\n const wasControlledRef = useRef(value !== undefined);\n\n const confirmedFrom = isControlled ? value?.from : internalFrom;\n const confirmedTo = isControlled ? value?.to : internalTo;\n const filled = inputValue.length > 0;\n\n const [month, setMonth] = useState<Date>(() => {\n const init = confirmedFrom ?? confirmedTo;\n return init && isValid(init) ? init : new Date();\n });\n const monthAnchor = confirmedFrom ?? confirmedTo;\n useEffect(() => {\n if (monthAnchor && isValid(monthAnchor)) setMonth(monthAnchor);\n }, [monthAnchor?.getFullYear(), monthAnchor?.getMonth()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const close = useCallback(() => {\n setOpen(false);\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n }, []);\n useClickOutside(containerRef, close);\n\n // Sync inputValue when value changes externally (e.g. form reset)\n useEffect(() => {\n if (value !== undefined) wasControlledRef.current = true;\n const newFrom = value?.from;\n const newTo = value?.to;\n const fromTime = newFrom?.getTime() ?? null;\n const toTime = newTo?.getTime() ?? null;\n const lastFromTime = lastEmittedFromRef.current?.getTime() ?? null;\n const lastToTime = lastEmittedToRef.current?.getTime() ?? null;\n if (fromTime === lastFromTime && toTime === lastToTime) return;\n if (!wasControlledRef.current && value === undefined) return;\n\n setInputValue(formatRange(newFrom, newTo));\n setInputInvalid(false);\n if (!isControlled) {\n setInternalFrom(newFrom);\n setInternalTo(newTo);\n }\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n lastEmittedFromRef.current = newFrom;\n lastEmittedToRef.current = newTo;\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const calendarSelected: DateRange | undefined = anchorDate\n ? hoveredDate\n ? anchorDate <= hoveredDate\n ? { from: anchorDate, to: hoveredDate }\n : { from: hoveredDate, to: anchorDate }\n : { from: anchorDate, to: undefined }\n : { from: confirmedFrom, to: confirmedTo };\n\n function handleDayClick(day: Date) {\n if (!anchorDate) {\n const from = showTime\n ? new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n confirmedFrom?.getHours() ?? 0,\n confirmedFrom?.getMinutes() ?? 0,\n confirmedFrom?.getSeconds() ?? 0,\n )\n : toDateOnly(day);\n setAnchorDate(from);\n if (!isControlled) {\n setInternalFrom(from);\n setInternalTo(undefined);\n }\n setInputValue(formatRange(from, undefined));\n setInputInvalid(false);\n lastEmittedFromRef.current = from;\n lastEmittedToRef.current = undefined;\n onChange?.({ from, to: undefined });\n } else {\n let from = anchorDate,\n to = showTime\n ? new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n confirmedTo?.getHours() ?? 0,\n confirmedTo?.getMinutes() ?? 0,\n confirmedTo?.getSeconds() ?? 0,\n )\n : toDateOnly(day);\n if (day < anchorDate) {\n const tmp = from;\n from = to;\n to = tmp;\n }\n if (!isControlled) {\n setInternalFrom(from);\n setInternalTo(to);\n }\n setInputValue(formatRange(from, to));\n setInputInvalid(false);\n lastEmittedFromRef.current = from;\n lastEmittedToRef.current = to;\n onChange?.({ from, to });\n if (!showTime) close();\n else setAnchorDate(undefined);\n }\n }\n\n function handleDayMouseEnter(day: Date) {\n if (anchorDate) setHoveredDate(day);\n }\n\n function handleFromTimeChange(h: number, m: number, s: number) {\n const base = confirmedFrom ?? new Date();\n const newDate = new Date(\n base.getFullYear(),\n base.getMonth(),\n base.getDate(),\n h,\n m,\n s,\n );\n if (!isControlled) setInternalFrom(newDate);\n lastEmittedFromRef.current = newDate;\n onChange?.({ from: newDate, to: confirmedTo });\n }\n\n function handleToTimeChange(h: number, m: number, s: number) {\n const base = confirmedTo ?? new Date();\n const newDate = new Date(\n base.getFullYear(),\n base.getMonth(),\n base.getDate(),\n h,\n m,\n s,\n );\n if (!isControlled) setInternalTo(newDate);\n lastEmittedToRef.current = newDate;\n onChange?.({ from: confirmedFrom, to: newDate });\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const input = e.target;\n const cursorPos = input.selectionStart ?? 0;\n const raw = input.value;\n const digits = raw.replace(/\\D/g, '').slice(0, 16);\n const masked = applyRangeMask(digits);\n const digitsBeforeCursor = raw\n .slice(0, cursorPos)\n .replace(/\\D/g, '').length;\n\n setInputValue(masked);\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n\n const fromDigits = digits.slice(0, 8);\n const toDigits = digits.slice(8);\n const parsedFrom =\n fromDigits.length === 8\n ? parseDate(applyDateMask(fromDigits))\n : undefined;\n const parsedTo =\n toDigits.length === 8 ? parseDate(applyDateMask(toDigits)) : undefined;\n const fromComplete = fromDigits.length === 8;\n const toComplete = toDigits.length === 8;\n setInputInvalid((fromComplete && !parsedFrom) || (toComplete && !parsedTo));\n\n if (!isControlled) {\n setInternalFrom(parsedFrom);\n setInternalTo(parsedTo);\n }\n lastEmittedFromRef.current = parsedFrom;\n lastEmittedToRef.current = parsedTo;\n onChange?.(\n parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined,\n );\n\n requestAnimationFrame(() =>\n inputRef.current?.setSelectionRange(\n getRangeCursorPos(masked, digitsBeforeCursor),\n getRangeCursorPos(masked, digitsBeforeCursor),\n ),\n );\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget;\n const pos = input.selectionStart ?? 0;\n\n if (e.key.length === 1 && !/\\d/.test(e.key) && !e.ctrlKey && !e.metaKey) {\n e.preventDefault();\n return;\n }\n if (\n e.key === 'Backspace' &&\n pos > 0 &&\n /[\\s—]/.test(input.value[pos - 1])\n ) {\n e.preventDefault();\n const val = input.value;\n const charsToSkip = val.slice(0, pos).match(/[\\s—]+$/)?.[0].length ?? 1;\n const newPos = pos - charsToSkip;\n const masked = applyRangeMask(\n (val.slice(0, newPos - 1) + val.slice(newPos)).replace(/\\D/g, ''),\n );\n setInputValue(masked);\n requestAnimationFrame(() =>\n input.setSelectionRange(newPos - 1, newPos - 1),\n );\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text');\n const digits = text.replace(/\\D/g, '').slice(0, 16);\n const masked = applyRangeMask(digits);\n setInputValue(masked);\n setAnchorDate(undefined);\n setHoveredDate(undefined);\n\n const parsedFrom =\n digits.length >= 8\n ? parseDate(applyDateMask(digits.slice(0, 8)))\n : undefined;\n const parsedTo =\n digits.length >= 16\n ? parseDate(applyDateMask(digits.slice(8, 16)))\n : undefined;\n setInputInvalid(\n (digits.length >= 8 && !parsedFrom) || (digits.length >= 16 && !parsedTo),\n );\n if (!isControlled) {\n setInternalFrom(parsedFrom);\n setInternalTo(parsedTo);\n }\n lastEmittedFromRef.current = parsedFrom;\n lastEmittedToRef.current = parsedTo;\n onChange?.(\n parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined,\n );\n\n requestAnimationFrame(() =>\n inputRef.current?.setSelectionRange(masked.length, masked.length),\n );\n }\n\n const placeholder =\n label && !focused && !filled ? undefined : 'дд.мм.гггг — дд.мм.гггг';\n const interactive = !disabled && !loading;\n\n return (\n <div\n ref={containerRef}\n className={[\n 'datepicker',\n 'daterangepicker',\n `datepicker--${size}`,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-focused={focused || open || undefined}\n data-filled={filled || undefined}\n data-failed={failed || inputInvalid || undefined}\n data-disabled={!interactive || undefined}\n >\n <div\n className=\"datepicker__field\"\n data-icon-start={\n resolvedIcon && iconPosition === 'start' ? true : undefined\n }\n data-icon-end={\n resolvedIcon && iconPosition === 'end' ? true : undefined\n }\n onClick={() => interactive && inputRef.current?.focus()}\n >\n {resolvedIcon && iconPosition === 'start' && (\n <span className=\"datepicker__icon datepicker__icon--start\">\n {resolvedIcon}\n </span>\n )}\n {label && <span className=\"datepicker__label\">{label}</span>}\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n className=\"datepicker__input\"\n value={inputValue}\n placeholder={placeholder}\n disabled={!interactive}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => {\n setFocused(true);\n if (interactive) setOpen(true);\n }}\n onBlur={() => setFocused(false)}\n aria-label={label ?? 'Выберите период'}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-invalid={inputInvalid || undefined}\n />\n {resolvedIcon && iconPosition === 'end' && (\n <span className=\"datepicker__icon datepicker__icon--end\">\n {resolvedIcon}\n </span>\n )}\n </div>\n {open && (\n <div\n className={[\n 'datepicker__popover',\n `datepicker__popover--${size}`,\n calendarLayout === 'horizontal' &&\n 'datepicker__popover--horizontal',\n showTime && 'datepicker__popover--with-time',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"dialog\"\n aria-label=\"Выберите период\"\n >\n {showTime ? (\n <>\n <div className=\"datepicker__popover-body\">\n <div className=\"datepicker__popover-calendar\">\n <Calendar\n mode=\"range\"\n selected={calendarSelected}\n month={month}\n onMonthChange={setMonth}\n onSelect={() => {}}\n onDayClick={handleDayClick}\n onDayMouseEnter={handleDayMouseEnter}\n onDayMouseLeave={() => setHoveredDate(undefined)}\n startMonth={fromDay}\n endMonth={toDay}\n disabled={disabledDays.length ? disabledDays : undefined}\n numberOfMonths={2}\n locale={ru}\n />\n </div>\n </div>\n <div className=\"datepicker__time-row\">\n <div className=\"datepicker__time-col\">\n <span className=\"datepicker__time-label\">Начало</span>\n <TimePanel\n value={confirmedFrom}\n showSeconds={showSeconds}\n onChange={handleFromTimeChange}\n />\n </div>\n <div className=\"datepicker__time-separator\" />\n <div className=\"datepicker__time-col\">\n <span className=\"datepicker__time-label\">Конец</span>\n <TimePanel\n value={confirmedTo}\n showSeconds={showSeconds}\n onChange={handleToTimeChange}\n />\n </div>\n </div>\n <div className=\"datepicker__popover-footer\">\n <button\n className=\"datepicker__ok-btn\"\n type=\"button\"\n onClick={close}\n >\n OK\n </button>\n </div>\n </>\n ) : (\n <Calendar\n mode=\"range\"\n selected={calendarSelected}\n month={month}\n onMonthChange={setMonth}\n onSelect={() => {}}\n onDayClick={handleDayClick}\n onDayMouseEnter={handleDayMouseEnter}\n onDayMouseLeave={() => setHoveredDate(undefined)}\n startMonth={fromConstraint}\n endMonth={toConstraint}\n numberOfMonths={2}\n locale={ru}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n","import { format, isValid, parse } from 'date-fns'\nimport type { DatePickerShowTime } from '../components/DatePicker/DatePicker'\n\nconst DATE_FORMAT = 'dd.MM.yyyy'\n\nexport function applyDateMask(digits: string): string {\n const d = digits.slice(0, 8)\n let result = ''\n for (let i = 0; i < d.length; i++) {\n if (i === 2 || i === 4) result += '.'\n result += d[i]\n }\n return result\n}\n\nexport function applyRangeMask(digits: string): string {\n const all = digits.slice(0, 16)\n const fromMasked = applyDateMask(all.slice(0, 8))\n const toDigits = all.slice(8)\n if (toDigits.length === 0) return fromMasked\n return `${fromMasked} — ${applyDateMask(toDigits)}`\n}\n\nexport function getRangeCursorPos(masked: string, digitCount: number): number {\n if (digitCount === 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (/\\d/.test(masked[i])) {\n count++\n if (count === digitCount) return i + 1\n }\n }\n return masked.length\n}\n\nexport function toDateOnly(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0)\n}\n\nexport function parseDate(masked: string): Date | undefined {\n if (masked.replace(/\\D/g, '').length !== 8) return undefined\n const date = parse(masked, DATE_FORMAT, new Date())\n if (!isValid(date) || format(date, DATE_FORMAT) !== masked) return undefined\n return toDateOnly(date)\n}\n\nexport function formatRange(from: Date | undefined, to: Date | undefined): string {\n if (!from) return ''\n const fromStr = format(from, DATE_FORMAT)\n if (!to) return fromStr\n return `${fromStr} — ${format(to, DATE_FORMAT)}`\n}\n\nexport function resolveShowSeconds(showTime?: DatePickerShowTime): boolean {\n if (!showTime) return false\n if (showTime === true) return true\n return showTime.format === 'HH:mm:ss'\n}\n","import type { ButtonProps } from './Button.types'\nimport { Spinner } from '../icons/Spinner'\n\nexport function Button({\n variant = 'primary',\n size = 'm',\n loading = false,\n disabled,\n className,\n children,\n ...rest\n}: ButtonProps) {\n const classes = [\n 'dp-btn',\n `dp-btn--${variant}`,\n `dp-btn--${size}`,\n loading && 'dp-btn--loading',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <button {...rest} className={classes} disabled={disabled || loading}>\n {children}\n {loading && <Spinner />}\n </button>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,8BAA0C;AAQtC;AAFG,SAAS,SAAS,EAAE,WAAW,GAAG,MAAM,GAAkB;AAC/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,uBAAuB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACrE,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACbA,IAAAA,gBAAyE;AACzE,IAAAC,mBAA4C;AAC5C,oBAAmB;;;ACFnB,mBAAqC;AAE9B,SAAS,gBAAgB,KAAoC,SAAqB;AACvF,8BAAU,MAAM;AACd,aAAS,SAAS,GAAe;AAC/B,UAAI,CAAC,IAAI,WAAW,IAAI,QAAQ,SAAS,EAAE,MAAc,EAAG;AAC5D,cAAQ;AAAA,IACV;AACA,aAAS,iBAAiB,aAAa,QAAQ;AAC/C,WAAO,MAAM,SAAS,oBAAoB,aAAa,QAAQ;AAAA,EACjE,GAAG,CAAC,KAAK,OAAO,CAAC;AACnB;;;ACXA,IAAAC,gBAAkC;AA0B1B,IAAAC,sBAAA;AAxBR,IAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;AACpD,IAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;AACtD,IAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;AAEtD,SAAS,KAAK,GAAW;AACvB,SAAO,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAClC;AAQA,SAAS,OAAO,EAAE,QAAQ,UAAU,SAAS,GAAgB;AAC3D,QAAM,kBAAc,sBAA0B,IAAI;AAElD,+BAAU,MAAM;AAnBlB;AAoBI,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO,UAAU,UAAU,UAAU;AAAA,EAC7E,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,6CAAC,SAAI,WAAU,sBACZ,iBAAO,IAAI,CAAC,MACX;AAAA,IAAC;AAAA;AAAA,MAEC,KAAK,MAAM,WAAW,cAAc;AAAA,MACpC,WAAU;AAAA,MACV,iBAAe,MAAM,YAAY;AAAA,MACjC,SAAS,MAAM,SAAS,CAAC;AAAA,MACzB,MAAK;AAAA,MACL,UAAU;AAAA,MAET,eAAK,CAAC;AAAA;AAAA,IARF;AAAA,EASP,CACD,GACH;AAEJ;AAQO,SAAS,UAAU,EAAE,OAAO,aAAa,SAAS,GAAmB;AAhD5E;AAiDE,QAAM,KAAI,oCAAO,eAAP,YAAqB;AAC/B,QAAM,KAAI,oCAAO,iBAAP,YAAuB;AACjC,QAAM,KAAI,oCAAO,iBAAP,YAAuB;AAEjC,SACE,8CAAC,SAAI,WAAU,cACb;AAAA,iDAAC,UAAO,QAAQ,OAAO,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,IACxE,6CAAC,UAAO,QAAQ,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,IACzE,eACC,6CAAC,UAAO,QAAQ,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,KAE9E;AAEJ;;;AC5DI,IAAAC,sBAAA;AAFG,SAAS,eAAe;AAC7B,SACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAChE;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,MAAK,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC5F,6CAAC,UAAK,GAAE,aAAY,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC5D,6CAAC,UAAK,GAAE,iBAAgB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,KACxF;AAEJ;;;ACPS,IAAAC,sBAAA;AADF,SAAS,UAAU;AACxB,SAAO,6CAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO;AACjE;;;ACFA,sBAAuC;AAGhC,IAAM,cAAc;AAEpB,SAAS,kBAAkB,UAA4D;AAC5F,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,SAAS;AAClB;AAEO,SAAS,gBAAgB,YAAmC;AACjE,SAAO,aAAa,GAAG,WAAW,IAAI,UAAU,KAAK;AACvD;AAEO,SAAS,eAAe,YAAmC;AAChE,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,eAAe,UAAU,KAAK;AACvC;AAEO,SAAS,iBAAiB,YAAmC;AAClE,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,eAAe,UAAU,iFAAqB;AACvD;AAEO,SAAS,UAAU,QAAgB,WAA2B;AACnE,QAAM,IAAI,OAAO,MAAM,GAAG,SAAS;AACnC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,MAAM,KAAK,MAAM,EAAG,WAAU;AAAA,aACzB,MAAM,EAAG,WAAU;AAAA,aACnB,MAAM,MAAM,MAAM,GAAI,WAAU;AACzC,cAAU,EAAE,CAAC;AAAA,EACf;AACA,SAAO;AACT;AAEO,SAAS,aAAa,QAAgB,YAA4B;AACvE,MAAI,eAAe,EAAG,QAAO;AAC7B,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,KAAK,KAAK,OAAO,CAAC,CAAC,GAAG;AACxB;AACA,UAAI,UAAU,WAAY,QAAO,IAAI;AAAA,IACvC;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,WAAW,MAAkB;AAC3C,SAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,IAAI,GAAG,CAAC;AAC/E;AAEO,SAAS,cACd,QACA,YACA,WACkB;AAClB,MAAI,OAAO,QAAQ,OAAO,EAAE,EAAE,WAAW,UAAW,QAAO;AAC3D,QAAM,WAAO,uBAAM,QAAQ,YAAY,oBAAI,KAAK,CAAC;AACjD,MAAI,KAAC,yBAAQ,IAAI,SAAK,wBAAO,MAAM,UAAU,MAAM,OAAQ,QAAO;AAClE,SAAO,cAAc,IAAI,WAAW,IAAI,IAAI;AAC9C;;;ALiCiC,IAAAC,sBAAA;AAjC1B,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAM,aAAa,gBAAgB,UAAU;AAC7C,QAAM,YAAY,eAAe,UAAU;AAC3C,QAAM,qBAAqB,oCAAe,iBAAiB,UAAU;AACrE,QAAM,cAAc,eAAe;AAEnC,QAAM,UAAU,eAAW,6BAAW,QAAQ,IAAI;AAClD,QAAM,QAAQ,aAAS,6BAAW,MAAM,IAAI;AAC5C,QAAM,eAAe;AAAA,IACnB,GAAI,UAAU,CAAC,EAAE,QAAQ,QAAQ,CAAC,IAAI,CAAC;AAAA,IACvC,GAAI,QAAQ,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC;AAAA,EACpC;AAEA,QAAM,eAAe,UAAU,6CAAC,WAAQ,IAAK,SAAS,QAAQ,OAAQ,sBAAQ,6CAAC,gBAAa;AAE5F,QAAM,eAAe,UAAU;AAC/B,QAAM,CAAC,cAAc,eAAe,QAAI,wBAA2B,YAAY;AAC/E,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,MAAM;AACjD,UAAM,UAAU,wBAAS;AACzB,WAAO,eAAW,0BAAQ,OAAO,QAAI,yBAAO,SAAS,UAAU,IAAI;AAAA,EACrE,CAAC;AACD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AAEtD,QAAM,eAAW,sBAAyB,IAAI;AAC9C,QAAM,mBAAe,sBAAuB,IAAI;AAChD,QAAM,mBAAe,sBAAO,UAAU;AAEtC,QAAM,qBAAiB,sBAAyB,UAAU,SAAY,QAAQ,YAAY;AAE1F,QAAM,uBAAmB,sBAAO,UAAU,MAAS;AAEnD,QAAM,WAAW,eAAe,QAAQ;AACxC,QAAM,CAAC,OAAO,QAAQ,QAAI;AAAA,IACxB,MAAO,gBAAY,0BAAQ,QAAQ,IAAI,WAAW,oBAAI,KAAK;AAAA,EAC7D;AACA,QAAM,SAAS,WAAW,SAAS;AAEnC,+BAAU,MAAM;AACd,QAAI,gBAAY,0BAAQ,QAAQ,EAAG,UAAS,QAAQ;AAAA,EACtD,GAAG,CAAC,qCAAU,eAAe,qCAAU,UAAU,CAAC;AAElD,QAAM,YAAQ,2BAAY,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AAClD,kBAAgB,cAAc,KAAK;AAGnC,+BAAU,MAAM;AAjIlB;AAkII,QAAI,UAAU,OAAW,kBAAiB,UAAU;AACpD,UAAM,YAAW,0BAAe,YAAf,mBAAwB,cAAxB,YAAqC;AACtD,UAAM,aAAY,oCAAO,cAAP,YAAoB;AACtC,QAAI,cAAc,SAAU;AAC5B,QAAI,CAAC,iBAAiB,WAAW,UAAU,OAAW;AAEtD,UAAM,YAAY,aAAS,0BAAQ,KAAK,QAAI,yBAAO,OAAO,UAAU,IAAI;AACxE,kBAAc,SAAS;AACvB,iBAAa,UAAU;AACvB,oBAAgB,KAAK;AACrB,QAAI,CAAC,aAAc,iBAAgB,KAAK;AACxC,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,KAAK,CAAC;AAEV,WAAS,WAAW,QAAgB,MAAwB;AAC1D,mBAAe,UAAU;AACzB,iBAAa,UAAU;AACvB,kBAAc,MAAM;AACpB,oBAAgB,KAAK;AACrB,QAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,yCAAW;AAAA,EACb;AAEA,WAAS,OAAO,QAAgB;AAC9B,UAAM,SAAS,OAAO,QAAQ,OAAO,EAAE;AACvC,QAAI,OAAO,WAAW,GAAG;AACvB,qBAAe,UAAU;AACzB,mBAAa,UAAU;AACvB,sBAAgB,KAAK;AACrB,UAAI,CAAC,aAAc,iBAAgB,MAAS;AAC5C,2CAAW;AAAA,IACb,WAAW,OAAO,WAAW,WAAW;AACtC,YAAM,OAAO,cAAc,QAAQ,YAAY,SAAS;AACxD,qBAAe,UAAU;AACzB,UAAI,KAAM,cAAa,UAAU;AACjC,sBAAgB,CAAC,IAAI;AACrB,UAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,2CAAW;AAAA,IACb,OAAO;AACL,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,WAAS,aAAa;AACpB,eAAW,KAAK;AAChB,UAAM,SAAS,WAAW,QAAQ,OAAO,EAAE;AAC3C,QAAK,OAAO,SAAS,KAAK,OAAO,SAAS,aAAc,cAAc;AACpE,oBAAc,aAAa,OAAO;AAClC,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,WAAS,aAAa,GAAwC;AAtLhE;AAuLI,UAAM,QAAQ,EAAE;AAChB,UAAM,aAAY,WAAM,mBAAN,YAAwB;AAC1C,UAAM,MAAM,MAAM;AAClB,UAAM,SAAS,IAAI,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,SAAS;AACxD,UAAM,SAAS,UAAU,QAAQ,SAAS;AAC1C,UAAM,qBAAqB,IAAI,MAAM,GAAG,SAAS,EAAE,QAAQ,OAAO,EAAE,EAAE;AACtE,UAAM,eAAe,aAAa,QAAQ,kBAAkB;AAC5D,kBAAc,MAAM;AACpB,WAAO,MAAM;AACb,0BAAsB,MAAG;AAhM7B,UAAAC;AAgMgC,cAAAA,MAAA,SAAS,YAAT,gBAAAA,IAAkB,kBAAkB,cAAc;AAAA,KAAa;AAAA,EAC7F;AAEA,WAAS,cAAc,GAA0C;AAnMnE;AAoMI,UAAM,QAAQ,EAAE;AAChB,UAAM,OAAM,WAAM,mBAAN,YAAwB;AAEpC,QAAI,EAAE,IAAI,WAAW,KAAK,CAAC,KAAK,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS;AACvE,QAAE,eAAe;AACjB;AAAA,IACF;AAEA,QAAI,EAAE,QAAQ,eAAe,MAAM,KAAK,QAAQ,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC,GAAG;AAC1E,QAAE,eAAe;AACjB,YAAM,MAAM,MAAM;AAClB,YAAM,SAAS,WAAW,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,GAAG,GAAG,QAAQ,OAAO,EAAE,GAAG,SAAS;AAC/F,oBAAc,MAAM;AACpB,aAAO,MAAM;AACb,4BAAsB,MAAM,MAAM,kBAAkB,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,WAAS,YAAY,GAA2C;AAC9D,MAAE,eAAe;AACjB,UAAM,SAAS,UAAU,EAAE,cAAc,QAAQ,MAAM,EAAE,QAAQ,OAAO,EAAE,GAAG,SAAS;AACtF,kBAAc,MAAM;AACpB,WAAO,MAAM;AACb,0BAAsB,MAAG;AA3N7B;AA2NgC,4BAAS,YAAT,mBAAkB,kBAAkB,OAAO,QAAQ,OAAO;AAAA,KAAO;AAAA,EAC/F;AAEA,WAAS,qBAAqB,MAAwB;AACpD,QAAI,CAAC,QAAQ,KAAC,0BAAQ,IAAI,GAAG;AAC3B,iBAAW,IAAI,MAAS;AACxB,UAAI,CAAC,WAAY,SAAQ,KAAK;AAC9B;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,YAAY;AACd,YAAM,OAAO,gBAAY,0BAAQ,QAAQ,IAAI,WAAW,oBAAI,KAAK,CAAC;AAClE,qBAAe,IAAI;AAAA,QACjB,KAAK,YAAY;AAAA,QAAG,KAAK,SAAS;AAAA,QAAG,KAAK,QAAQ;AAAA,QAClD,KAAK,SAAS;AAAA,QAAG,KAAK,WAAW;AAAA,QAAG,KAAK,WAAW;AAAA,MACtD;AAAA,IACF,OAAO;AACL,qBAAe,WAAW,IAAI;AAAA,IAChC;AAEA,mBAAW,yBAAO,cAAc,UAAU,GAAG,YAAY;AACzD,QAAI,CAAC,WAAY,SAAQ,KAAK;AAAA,EAChC;AAEA,WAAS,iBAAiB,GAAW,GAAW,GAAW;AACzD,UAAM,OAAO,gBAAY,0BAAQ,QAAQ,IAAI,WAAW,oBAAI,KAAK;AACjE,UAAM,UAAU,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,mBAAW,yBAAO,SAAS,UAAU,GAAG,OAAO;AAAA,EACjD;AAEA,QAAM,cAAc,CAAC,YAAY,CAAC;AAElC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,CAAC,cAAc,eAAe,IAAI,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpF,gBAAc,WAAW,QAAQ;AAAA,MACjC,eAAa,UAAU;AAAA,MACvB,eAAa,UAAU,gBAAgB;AAAA,MACvC,iBAAe,CAAC,eAAe;AAAA,MAE9B;AAAA,wBACG,cAAc,YAAY,MAAM,eAAe,QAAQ,UAAQ,CAAC,IAAI,CAAC,IAErE;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,CAAC,qBAAqB,cAAc,8BAA8B,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YACzG,mBAAiB,gBAAgB,iBAAiB,UAAU,OAAO;AAAA,YACnE,iBAAe,gBAAgB,iBAAiB,QAAQ,OAAO;AAAA,YAC/D,SAAS,MAAG;AA5QxB;AA4Q2B,sCAAe,cAAS,YAAT,mBAAkB;AAAA;AAAA,YAE/C;AAAA,8BAAgB,iBAAiB,WAChC,6CAAC,UAAK,WAAU,4CAA4C,wBAAa;AAAA,cAE1E,SAAS,6CAAC,UAAK,WAAU,qBAAqB,iBAAM;AAAA,eACnD,MAAM;AACN,sBAAM,aAAmC;AAAA,kBACvC,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,WAAW;AAAA,kBACX,WAAW;AAAA,kBACX,OAAO;AAAA,kBACP,aAAa,SAAS,CAAC,UAAU,SAAY;AAAA,kBAC7C,UAAU,CAAC;AAAA,kBACX,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,SAAS,MAAM;AAAE,+BAAW,IAAI;AAAG,wBAAI,eAAe,CAAC,WAAY,SAAQ,IAAI;AAAA,kBAAE;AAAA,kBACjF,QAAQ;AAAA,kBACR,cAAc,wBAAS;AAAA,kBACvB,iBAAiB,CAAC,aAAa,OAAO;AAAA,kBACtC,iBAAiB,CAAC,aAAa,WAAW;AAAA,kBAC1C,gBAAgB,gBAAgB;AAAA,gBAClC;AACA,oBAAI,YAAa,QAAO,YAAY,UAAU;AAC9C,sBAAM,EAAE,KAAK,GAAG,KAAK,IAAI;AACzB,uBAAO,6CAAC,WAAM,KAAgD,GAAG,MAAM;AAAA,cACzE,GAAG;AAAA,cACF,gBAAgB,iBAAiB,SAChC,6CAAC,UAAK,WAAU,0CAA0C,wBAAa;AAAA;AAAA;AAAA,QAE3E;AAAA,QAGH,CAAC,cAAc,QACd;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,wBAAwB,IAAI;AAAA,cAC5B,cAAc;AAAA,YAChB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC1B,MAAK;AAAA,YACL,cAAW;AAAA,YAEV,uBACC,8EACE;AAAA,4DAAC,SAAI,WAAU,4BACb;AAAA,6DAAC,SAAI,WAAU,gCACb;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL;AAAA,oBACA;AAAA,oBACA,eAAe;AAAA,oBACf,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,UAAU,aAAa,SAAS,eAAe;AAAA,oBAC/C,WAAU;AAAA,oBACV,QAAQ;AAAA;AAAA,gBACV,GACF;AAAA,gBACA,6CAAC,SAAI,WAAU,8BAA6B;AAAA,gBAC5C,6CAAC,SAAI,WAAU,4BACb;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP;AAAA,oBACA,UAAU;AAAA;AAAA,gBACZ,GACF;AAAA,iBACF;AAAA,cACA,6CAAC,SAAI,WAAU,8BACb;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,SAAS,MAAM,QAAQ,KAAK;AAAA,kBAC7B;AAAA;AAAA,cAED,GACF;AAAA,eACF,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA,eAAe;AAAA,gBACf,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,UAAU,aAAa,SAAS,eAAe;AAAA,gBAC/C,WAAU;AAAA,gBACV,QAAQ;AAAA;AAAA,YACV;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AM/WA,IAAAC,gBAMO;AACP,IAAAC,mBAAoC;AACpC,IAAAC,iBAAmB;;;ACRnB,IAAAC,mBAAuC;AAGvC,IAAMC,eAAc;AAEb,SAAS,cAAc,QAAwB;AACpD,QAAM,IAAI,OAAO,MAAM,GAAG,CAAC;AAC3B,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,MAAM,KAAK,MAAM,EAAG,WAAU;AAClC,cAAU,EAAE,CAAC;AAAA,EACf;AACA,SAAO;AACT;AAEO,SAAS,eAAe,QAAwB;AACrD,QAAM,MAAM,OAAO,MAAM,GAAG,EAAE;AAC9B,QAAM,aAAa,cAAc,IAAI,MAAM,GAAG,CAAC,CAAC;AAChD,QAAM,WAAW,IAAI,MAAM,CAAC;AAC5B,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,GAAG,UAAU,WAAM,cAAc,QAAQ,CAAC;AACnD;AAEO,SAAS,kBAAkB,QAAgB,YAA4B;AAC5E,MAAI,eAAe,EAAG,QAAO;AAC7B,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,KAAK,KAAK,OAAO,CAAC,CAAC,GAAG;AACxB;AACA,UAAI,UAAU,WAAY,QAAO,IAAI;AAAA,IACvC;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEO,SAASC,YAAW,MAAkB;AAC3C,SAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,IAAI,GAAG,CAAC;AAC/E;AAEO,SAAS,UAAU,QAAkC;AAC1D,MAAI,OAAO,QAAQ,OAAO,EAAE,EAAE,WAAW,EAAG,QAAO;AACnD,QAAM,WAAO,wBAAM,QAAQD,cAAa,oBAAI,KAAK,CAAC;AAClD,MAAI,KAAC,0BAAQ,IAAI,SAAK,yBAAO,MAAMA,YAAW,MAAM,OAAQ,QAAO;AACnE,SAAOC,YAAW,IAAI;AACxB;AAEO,SAAS,YAAY,MAAwB,IAA8B;AAChF,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,cAAU,yBAAO,MAAMD,YAAW;AACxC,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,OAAO,eAAM,yBAAO,IAAIA,YAAW,CAAC;AAChD;AAEO,SAAS,mBAAmB,UAAwC;AACzE,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,SAAS,WAAW;AAC7B;;;ADWI,IAAAE,sBAAA;AAlBG,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AACF,GAAyB;AACvB,QAAM,eAAe,UACnB,6CAAC,WAAQ,IACP,SAAS,QAAQ,OACnB,sBAAQ,6CAAC,gBAAa;AAGxB,QAAM,eAAe,UAAU;AAC/B,QAAM,cAAc,mBAAmB,QAAQ;AAE/C,QAAM,UAAU,qBAAiB,6BAAW,cAAc,IAAI;AAC9D,QAAM,QAAQ,mBAAe,6BAAW,YAAY,IAAI;AACxD,QAAM,eAAe;AAAA,IACnB,GAAI,UAAU,CAAC,EAAE,QAAQ,QAAQ,CAAC,IAAI,CAAC;AAAA,IACvC,GAAI,QAAQ,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC;AAAA,EACpC;AAEA,QAAM,CAAC,cAAc,eAAe,QAAI;AAAA,IACtC,6CAAc;AAAA,EAChB;AACA,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAClC,6CAAc;AAAA,EAChB;AACA,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,MAAM;AACjD,UAAM,UAAU,wBAAS;AACzB,WAAO,YAAY,mCAAS,MAAM,mCAAS,EAAE;AAAA,EAC/C,CAAC;AACD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA2B,MAAS;AACxE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAA2B,MAAS;AAE1E,QAAM,eAAW,sBAAyB,IAAI;AAC9C,QAAM,mBAAe,sBAAuB,IAAI;AAEhD,QAAM,yBAAqB;AAAA,IACzB,UAAU,SAAY,+BAAO,OAAO,6CAAc;AAAA,EACpD;AACA,QAAM,uBAAmB;AAAA,IACvB,UAAU,SAAY,+BAAO,KAAK,6CAAc;AAAA,EAClD;AACA,QAAM,uBAAmB,sBAAO,UAAU,MAAS;AAEnD,QAAM,gBAAgB,eAAe,+BAAO,OAAO;AACnD,QAAM,cAAc,eAAe,+BAAO,KAAK;AAC/C,QAAM,SAAS,WAAW,SAAS;AAEnC,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAe,MAAM;AAC7C,UAAM,OAAO,wCAAiB;AAC9B,WAAO,YAAQ,0BAAQ,IAAI,IAAI,OAAO,oBAAI,KAAK;AAAA,EACjD,CAAC;AACD,QAAM,cAAc,wCAAiB;AACrC,+BAAU,MAAM;AACd,QAAI,mBAAe,0BAAQ,WAAW,EAAG,UAAS,WAAW;AAAA,EAC/D,GAAG,CAAC,2CAAa,eAAe,2CAAa,UAAU,CAAC;AAExD,QAAM,YAAQ,2BAAY,MAAM;AAC9B,YAAQ,KAAK;AACb,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAAA,EAC1B,GAAG,CAAC,CAAC;AACL,kBAAgB,cAAc,KAAK;AAGnC,+BAAU,MAAM;AApIlB;AAqII,QAAI,UAAU,OAAW,kBAAiB,UAAU;AACpD,UAAM,UAAU,+BAAO;AACvB,UAAM,QAAQ,+BAAO;AACrB,UAAM,YAAW,wCAAS,cAAT,YAAsB;AACvC,UAAM,UAAS,oCAAO,cAAP,YAAoB;AACnC,UAAM,gBAAe,8BAAmB,YAAnB,mBAA4B,cAA5B,YAAyC;AAC9D,UAAM,cAAa,4BAAiB,YAAjB,mBAA0B,cAA1B,YAAuC;AAC1D,QAAI,aAAa,gBAAgB,WAAW,WAAY;AACxD,QAAI,CAAC,iBAAiB,WAAW,UAAU,OAAW;AAEtD,kBAAc,YAAY,SAAS,KAAK,CAAC;AACzC,oBAAgB,KAAK;AACrB,QAAI,CAAC,cAAc;AACjB,sBAAgB,OAAO;AACvB,oBAAc,KAAK;AAAA,IACrB;AACA,kBAAc,MAAS;AACvB,mBAAe,MAAS;AACxB,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,mBAA0C,aAC5C,cACE,cAAc,cACZ,EAAE,MAAM,YAAY,IAAI,YAAY,IACpC,EAAE,MAAM,aAAa,IAAI,WAAW,IACtC,EAAE,MAAM,YAAY,IAAI,OAAU,IACpC,EAAE,MAAM,eAAe,IAAI,YAAY;AAE3C,WAAS,eAAe,KAAW;AAnKrC;AAoKI,QAAI,CAAC,YAAY;AACf,YAAM,OAAO,WACT,IAAI;AAAA,QACF,IAAI,YAAY;AAAA,QAChB,IAAI,SAAS;AAAA,QACb,IAAI,QAAQ;AAAA,SACZ,oDAAe,eAAf,YAA6B;AAAA,SAC7B,oDAAe,iBAAf,YAA+B;AAAA,SAC/B,oDAAe,iBAAf,YAA+B;AAAA,MACjC,IACAC,YAAW,GAAG;AAClB,oBAAc,IAAI;AAClB,UAAI,CAAC,cAAc;AACjB,wBAAgB,IAAI;AACpB,sBAAc,MAAS;AAAA,MACzB;AACA,oBAAc,YAAY,MAAM,MAAS,CAAC;AAC1C,sBAAgB,KAAK;AACrB,yBAAmB,UAAU;AAC7B,uBAAiB,UAAU;AAC3B,2CAAW,EAAE,MAAM,IAAI,OAAU;AAAA,IACnC,OAAO;AACL,UAAI,OAAO,YACT,KAAK,WACD,IAAI;AAAA,QACF,IAAI,YAAY;AAAA,QAChB,IAAI,SAAS;AAAA,QACb,IAAI,QAAQ;AAAA,SACZ,gDAAa,eAAb,YAA2B;AAAA,SAC3B,gDAAa,iBAAb,YAA6B;AAAA,SAC7B,gDAAa,iBAAb,YAA6B;AAAA,MAC/B,IACAA,YAAW,GAAG;AACpB,UAAI,MAAM,YAAY;AACpB,cAAM,MAAM;AACZ,eAAO;AACP,aAAK;AAAA,MACP;AACA,UAAI,CAAC,cAAc;AACjB,wBAAgB,IAAI;AACpB,sBAAc,EAAE;AAAA,MAClB;AACA,oBAAc,YAAY,MAAM,EAAE,CAAC;AACnC,sBAAgB,KAAK;AACrB,yBAAmB,UAAU;AAC7B,uBAAiB,UAAU;AAC3B,2CAAW,EAAE,MAAM,GAAG;AACtB,UAAI,CAAC,SAAU,OAAM;AAAA,UAChB,eAAc,MAAS;AAAA,IAC9B;AAAA,EACF;AAEA,WAAS,oBAAoB,KAAW;AACtC,QAAI,WAAY,gBAAe,GAAG;AAAA,EACpC;AAEA,WAAS,qBAAqB,GAAW,GAAW,GAAW;AAC7D,UAAM,OAAO,wCAAiB,oBAAI,KAAK;AACvC,UAAM,UAAU,IAAI;AAAA,MAClB,KAAK,YAAY;AAAA,MACjB,KAAK,SAAS;AAAA,MACd,KAAK,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,aAAc,iBAAgB,OAAO;AAC1C,uBAAmB,UAAU;AAC7B,yCAAW,EAAE,MAAM,SAAS,IAAI,YAAY;AAAA,EAC9C;AAEA,WAAS,mBAAmB,GAAW,GAAW,GAAW;AAC3D,UAAM,OAAO,oCAAe,oBAAI,KAAK;AACrC,UAAM,UAAU,IAAI;AAAA,MAClB,KAAK,YAAY;AAAA,MACjB,KAAK,SAAS;AAAA,MACd,KAAK,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,aAAc,eAAc,OAAO;AACxC,qBAAiB,UAAU;AAC3B,yCAAW,EAAE,MAAM,eAAe,IAAI,QAAQ;AAAA,EAChD;AAEA,WAAS,aAAa,GAAwC;AA1PhE;AA2PI,UAAM,QAAQ,EAAE;AAChB,UAAM,aAAY,WAAM,mBAAN,YAAwB;AAC1C,UAAM,MAAM,MAAM;AAClB,UAAM,SAAS,IAAI,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE;AACjD,UAAM,SAAS,eAAe,MAAM;AACpC,UAAM,qBAAqB,IACxB,MAAM,GAAG,SAAS,EAClB,QAAQ,OAAO,EAAE,EAAE;AAEtB,kBAAc,MAAM;AACpB,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAExB,UAAM,aAAa,OAAO,MAAM,GAAG,CAAC;AACpC,UAAM,WAAW,OAAO,MAAM,CAAC;AAC/B,UAAM,aACJ,WAAW,WAAW,IAClB,UAAU,cAAc,UAAU,CAAC,IACnC;AACN,UAAM,WACJ,SAAS,WAAW,IAAI,UAAU,cAAc,QAAQ,CAAC,IAAI;AAC/D,UAAM,eAAe,WAAW,WAAW;AAC3C,UAAM,aAAa,SAAS,WAAW;AACvC,oBAAiB,gBAAgB,CAAC,cAAgB,cAAc,CAAC,QAAS;AAE1E,QAAI,CAAC,cAAc;AACjB,sBAAgB,UAAU;AAC1B,oBAAc,QAAQ;AAAA,IACxB;AACA,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAC3B;AAAA,MACE,cAAc,WAAW,EAAE,MAAM,YAAY,IAAI,SAAS,IAAI;AAAA;AAGhE;AAAA,MAAsB,MAAG;AA9R7B,YAAAC;AA+RM,gBAAAA,MAAA,SAAS,YAAT,gBAAAA,IAAkB;AAAA,UAChB,kBAAkB,QAAQ,kBAAkB;AAAA,UAC5C,kBAAkB,QAAQ,kBAAkB;AAAA;AAAA;AAAA,IAEhD;AAAA,EACF;AAEA,WAAS,cAAc,GAA0C;AAtSnE;AAuSI,UAAM,QAAQ,EAAE;AAChB,UAAM,OAAM,WAAM,mBAAN,YAAwB;AAEpC,QAAI,EAAE,IAAI,WAAW,KAAK,CAAC,KAAK,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS;AACvE,QAAE,eAAe;AACjB;AAAA,IACF;AACA,QACE,EAAE,QAAQ,eACV,MAAM,KACN,QAAQ,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC,GACjC;AACA,QAAE,eAAe;AACjB,YAAM,MAAM,MAAM;AAClB,YAAM,eAAc,eAAI,MAAM,GAAG,GAAG,EAAE,MAAM,SAAS,MAAjC,mBAAqC,GAAG,WAAxC,YAAkD;AACtE,YAAM,SAAS,MAAM;AACrB,YAAM,SAAS;AAAA,SACZ,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,MAAM,GAAG,QAAQ,OAAO,EAAE;AAAA,MAClE;AACA,oBAAc,MAAM;AACpB;AAAA,QAAsB,MACpB,MAAM,kBAAkB,SAAS,GAAG,SAAS,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YAAY,GAA2C;AAC9D,MAAE,eAAe;AACjB,UAAM,OAAO,EAAE,cAAc,QAAQ,MAAM;AAC3C,UAAM,SAAS,KAAK,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE;AAClD,UAAM,SAAS,eAAe,MAAM;AACpC,kBAAc,MAAM;AACpB,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAExB,UAAM,aACJ,OAAO,UAAU,IACb,UAAU,cAAc,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,IAC3C;AACN,UAAM,WACJ,OAAO,UAAU,KACb,UAAU,cAAc,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,IAC5C;AACN;AAAA,MACG,OAAO,UAAU,KAAK,CAAC,cAAgB,OAAO,UAAU,MAAM,CAAC;AAAA,IAClE;AACA,QAAI,CAAC,cAAc;AACjB,sBAAgB,UAAU;AAC1B,oBAAc,QAAQ;AAAA,IACxB;AACA,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAC3B;AAAA,MACE,cAAc,WAAW,EAAE,MAAM,YAAY,IAAI,SAAS,IAAI;AAAA;AAGhE;AAAA,MAAsB,MAAG;AA/V7B;AAgWM,8BAAS,YAAT,mBAAkB,kBAAkB,OAAO,QAAQ,OAAO;AAAA;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,cACJ,SAAS,CAAC,WAAW,CAAC,SAAS,SAAY;AAC7C,QAAM,cAAc,CAAC,YAAY,CAAC;AAElC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,IAAI;AAAA,QACnB;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,gBAAc,WAAW,QAAQ;AAAA,MACjC,eAAa,UAAU;AAAA,MACvB,eAAa,UAAU,gBAAgB;AAAA,MACvC,iBAAe,CAAC,eAAe;AAAA,MAE/B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,mBACE,gBAAgB,iBAAiB,UAAU,OAAO;AAAA,YAEpD,iBACE,gBAAgB,iBAAiB,QAAQ,OAAO;AAAA,YAElD,SAAS,MAAG;AAhYpB;AAgYuB,sCAAe,cAAS,YAAT,mBAAkB;AAAA;AAAA,YAE/C;AAAA,8BAAgB,iBAAiB,WAChC,6CAAC,UAAK,WAAU,4CACb,wBACH;AAAA,cAED,SAAS,6CAAC,UAAK,WAAU,qBAAqB,iBAAM;AAAA,cACrD;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,WAAU;AAAA,kBACV,OAAO;AAAA,kBACP;AAAA,kBACA,UAAU,CAAC;AAAA,kBACX,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,SAAS,MAAM;AACb,+BAAW,IAAI;AACf,wBAAI,YAAa,SAAQ,IAAI;AAAA,kBAC/B;AAAA,kBACA,QAAQ,MAAM,WAAW,KAAK;AAAA,kBAC9B,cAAY,wBAAS;AAAA,kBACrB,iBAAe;AAAA,kBACf,iBAAc;AAAA,kBACd,gBAAc,gBAAgB;AAAA;AAAA,cAChC;AAAA,cACC,gBAAgB,iBAAiB,SAChC,6CAAC,UAAK,WAAU,0CACb,wBACH;AAAA;AAAA;AAAA,QAEJ;AAAA,QACC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,wBAAwB,IAAI;AAAA,cAC5B,mBAAmB,gBACjB;AAAA,cACF,YAAY;AAAA,YACd,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,MAAK;AAAA,YACL,cAAW;AAAA,YAEV,qBACC,8EACE;AAAA,2DAAC,SAAI,WAAU,4BACb,uDAAC,SAAI,WAAU,gCACb;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV;AAAA,kBACA,eAAe;AAAA,kBACf,UAAU,MAAM;AAAA,kBAAC;AAAA,kBACjB,YAAY;AAAA,kBACZ,iBAAiB;AAAA,kBACjB,iBAAiB,MAAM,eAAe,MAAS;AAAA,kBAC/C,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,UAAU,aAAa,SAAS,eAAe;AAAA,kBAC/C,gBAAgB;AAAA,kBAChB,QAAQ;AAAA;AAAA,cACV,GACF,GACF;AAAA,cACA,8CAAC,SAAI,WAAU,wBACb;AAAA,8DAAC,SAAI,WAAU,wBACb;AAAA,+DAAC,UAAK,WAAU,0BAAyB,kDAAM;AAAA,kBAC/C;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,sBACP;AAAA,sBACA,UAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,gBACA,6CAAC,SAAI,WAAU,8BAA6B;AAAA,gBAC5C,8CAAC,SAAI,WAAU,wBACb;AAAA,+DAAC,UAAK,WAAU,0BAAyB,4CAAK;AAAA,kBAC9C;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,sBACP;AAAA,sBACA,UAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,iBACF;AAAA,cACA,6CAAC,SAAI,WAAU,8BACb;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,SAAS;AAAA,kBACV;AAAA;AAAA,cAED,GACF;AAAA,eACF,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV;AAAA,gBACA,eAAe;AAAA,gBACf,UAAU,MAAM;AAAA,gBAAC;AAAA,gBACjB,YAAY;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,iBAAiB,MAAM,eAAe,MAAS;AAAA,gBAC/C,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,gBAAgB;AAAA,gBAChB,QAAQ;AAAA;AAAA,YACV;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AEleI,IAAAC,sBAAA;AAlBG,SAAS,OAAO;AAAA,EACrB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,UAAU;AAAA,IACd;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,WAAW,IAAI;AAAA,IACf,WAAW;AAAA,IACX;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,8CAAC,YAAQ,GAAG,MAAM,WAAW,SAAS,UAAU,YAAY,SACzD;AAAA;AAAA,IACA,WAAW,6CAAC,WAAQ;AAAA,KACvB;AAEJ;","names":["import_react","import_date_fns","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_a","import_react","import_date_fns","import_locale","import_date_fns","DATE_FORMAT","toDateOnly","import_jsx_runtime","toDateOnly","_a","import_jsx_runtime"]}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  DatePicker,
4
4
  DateRangePicker,
5
5
  Spinner
6
- } from "./chunk-TVBIHMGX.js";
6
+ } from "./chunk-I3ID2PSC.js";
7
7
 
8
8
  // src/components/Button/Button.tsx
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
package/dist/rhf.cjs CHANGED
@@ -30,7 +30,7 @@ var import_react_hook_form = require("react-hook-form");
30
30
 
31
31
  // src/components/DatePicker/DatePicker.tsx
32
32
  var import_react3 = require("react");
33
- var import_date_fns = require("date-fns");
33
+ var import_date_fns2 = require("date-fns");
34
34
  var import_locale = require("date-fns/locale");
35
35
 
36
36
  // src/hooks/useClickOutside.ts
@@ -116,8 +116,8 @@ function Spinner() {
116
116
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "datepicker-spinner", "aria-hidden": "true" });
117
117
  }
118
118
 
119
- // src/components/DatePicker/DatePicker.tsx
120
- var import_jsx_runtime5 = require("react/jsx-runtime");
119
+ // src/utils/date-mask.ts
120
+ var import_date_fns = require("date-fns");
121
121
  var DATE_FORMAT = "dd.MM.yyyy";
122
122
  function resolveTimeFormat(showTime) {
123
123
  if (!showTime) return null;
@@ -166,6 +166,9 @@ function parseDateTime(masked, dateFormat, maxDigits) {
166
166
  if (!(0, import_date_fns.isValid)(date) || (0, import_date_fns.format)(date, dateFormat) !== masked) return void 0;
167
167
  return maxDigits === 8 ? toDateOnly(date) : date;
168
168
  }
169
+
170
+ // src/components/DatePicker/DatePicker.tsx
171
+ var import_jsx_runtime5 = require("react/jsx-runtime");
169
172
  function DatePicker({
170
173
  value,
171
174
  defaultValue,
@@ -191,8 +194,8 @@ function DatePicker({
191
194
  const maxDigits = buildMaxDigits(timeFormat);
192
195
  const defaultPlaceholder = placeholder != null ? placeholder : buildPlaceholder(timeFormat);
193
196
  const showSeconds = timeFormat === "HH:mm:ss";
194
- const fromDay = fromDate ? (0, import_date_fns.startOfDay)(fromDate) : void 0;
195
- const toDay = toDate ? (0, import_date_fns.startOfDay)(toDate) : void 0;
197
+ const fromDay = fromDate ? (0, import_date_fns2.startOfDay)(fromDate) : void 0;
198
+ const toDay = toDate ? (0, import_date_fns2.startOfDay)(toDate) : void 0;
196
199
  const disabledDays = [
197
200
  ...fromDay ? [{ before: fromDay }] : [],
198
201
  ...toDay ? [{ after: toDay }] : []
@@ -202,9 +205,10 @@ function DatePicker({
202
205
  const [internalDate, setInternalDate] = (0, import_react3.useState)(defaultValue);
203
206
  const [open, setOpen] = (0, import_react3.useState)(false);
204
207
  const [focused, setFocused] = (0, import_react3.useState)(false);
205
- const [inputValue, setInputValue] = (0, import_react3.useState)(
206
- () => defaultValue && (0, import_date_fns.isValid)(defaultValue) ? (0, import_date_fns.format)(defaultValue, dateFormat) : ""
207
- );
208
+ const [inputValue, setInputValue] = (0, import_react3.useState)(() => {
209
+ const initial = value != null ? value : defaultValue;
210
+ return initial && (0, import_date_fns2.isValid)(initial) ? (0, import_date_fns2.format)(initial, dateFormat) : "";
211
+ });
208
212
  const [inputInvalid, setInputInvalid] = (0, import_react3.useState)(false);
209
213
  const inputRef = (0, import_react3.useRef)(null);
210
214
  const containerRef = (0, import_react3.useRef)(null);
@@ -212,7 +216,13 @@ function DatePicker({
212
216
  const lastEmittedRef = (0, import_react3.useRef)(value !== void 0 ? value : defaultValue);
213
217
  const wasControlledRef = (0, import_react3.useRef)(value !== void 0);
214
218
  const selected = isControlled ? value : internalDate;
219
+ const [month, setMonth] = (0, import_react3.useState)(
220
+ () => selected && (0, import_date_fns2.isValid)(selected) ? selected : /* @__PURE__ */ new Date()
221
+ );
215
222
  const filled = inputValue.length > 0;
223
+ (0, import_react3.useEffect)(() => {
224
+ if (selected && (0, import_date_fns2.isValid)(selected)) setMonth(selected);
225
+ }, [selected == null ? void 0 : selected.getFullYear(), selected == null ? void 0 : selected.getMonth()]);
216
226
  const close = (0, import_react3.useCallback)(() => setOpen(false), []);
217
227
  useClickOutside(containerRef, close);
218
228
  (0, import_react3.useEffect)(() => {
@@ -222,7 +232,7 @@ function DatePicker({
222
232
  const valueTime = (_c = value == null ? void 0 : value.getTime()) != null ? _c : null;
223
233
  if (valueTime === lastTime) return;
224
234
  if (!wasControlledRef.current && value === void 0) return;
225
- const formatted = value && (0, import_date_fns.isValid)(value) ? (0, import_date_fns.format)(value, dateFormat) : "";
235
+ const formatted = value && (0, import_date_fns2.isValid)(value) ? (0, import_date_fns2.format)(value, dateFormat) : "";
226
236
  setInputValue(formatted);
227
237
  lastValidRef.current = formatted;
228
238
  setInputInvalid(false);
@@ -308,14 +318,14 @@ function DatePicker({
308
318
  });
309
319
  }
310
320
  function handleCalendarSelect(date) {
311
- if (!date || !(0, import_date_fns.isValid)(date)) {
321
+ if (!date || !(0, import_date_fns2.isValid)(date)) {
312
322
  applyValid("", void 0);
313
323
  if (!timeFormat) setOpen(false);
314
324
  return;
315
325
  }
316
326
  let dateToCommit;
317
327
  if (timeFormat) {
318
- const base = selected && (0, import_date_fns.isValid)(selected) ? selected : /* @__PURE__ */ new Date(0);
328
+ const base = selected && (0, import_date_fns2.isValid)(selected) ? selected : /* @__PURE__ */ new Date(0);
319
329
  dateToCommit = new Date(
320
330
  date.getFullYear(),
321
331
  date.getMonth(),
@@ -327,13 +337,13 @@ function DatePicker({
327
337
  } else {
328
338
  dateToCommit = toDateOnly(date);
329
339
  }
330
- applyValid((0, import_date_fns.format)(dateToCommit, dateFormat), dateToCommit);
340
+ applyValid((0, import_date_fns2.format)(dateToCommit, dateFormat), dateToCommit);
331
341
  if (!timeFormat) setOpen(false);
332
342
  }
333
343
  function handleTimeChange(h, m, s) {
334
- const base = selected && (0, import_date_fns.isValid)(selected) ? selected : /* @__PURE__ */ new Date();
344
+ const base = selected && (0, import_date_fns2.isValid)(selected) ? selected : /* @__PURE__ */ new Date();
335
345
  const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s);
336
- applyValid((0, import_date_fns.format)(newDate, dateFormat), newDate);
346
+ applyValid((0, import_date_fns2.format)(newDate, dateFormat), newDate);
337
347
  }
338
348
  const interactive = !disabled && !loading;
339
349
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
@@ -406,6 +416,8 @@ function DatePicker({
406
416
  {
407
417
  mode: "single",
408
418
  selected,
419
+ month,
420
+ onMonthChange: setMonth,
409
421
  onSelect: handleCalendarSelect,
410
422
  startMonth: fromDay,
411
423
  endMonth: toDay,
@@ -438,6 +450,8 @@ function DatePicker({
438
450
  {
439
451
  mode: "single",
440
452
  selected,
453
+ month,
454
+ onMonthChange: setMonth,
441
455
  onSelect: handleCalendarSelect,
442
456
  startMonth: fromDay,
443
457
  endMonth: toDay,
@@ -476,9 +490,11 @@ var import_react_hook_form2 = require("react-hook-form");
476
490
 
477
491
  // src/components/DateRangePicker/DateRangePicker.tsx
478
492
  var import_react4 = require("react");
479
- var import_date_fns2 = require("date-fns");
493
+ var import_date_fns4 = require("date-fns");
480
494
  var import_locale2 = require("date-fns/locale");
481
- var import_jsx_runtime7 = require("react/jsx-runtime");
495
+
496
+ // src/utils/range-mask.ts
497
+ var import_date_fns3 = require("date-fns");
482
498
  var DATE_FORMAT2 = "dd.MM.yyyy";
483
499
  function applyDateMask(digits) {
484
500
  const d = digits.slice(0, 8);
@@ -512,21 +528,24 @@ function toDateOnly2(date) {
512
528
  }
513
529
  function parseDate(masked) {
514
530
  if (masked.replace(/\D/g, "").length !== 8) return void 0;
515
- const date = (0, import_date_fns2.parse)(masked, DATE_FORMAT2, /* @__PURE__ */ new Date());
516
- if (!(0, import_date_fns2.isValid)(date) || (0, import_date_fns2.format)(date, DATE_FORMAT2) !== masked) return void 0;
531
+ const date = (0, import_date_fns3.parse)(masked, DATE_FORMAT2, /* @__PURE__ */ new Date());
532
+ if (!(0, import_date_fns3.isValid)(date) || (0, import_date_fns3.format)(date, DATE_FORMAT2) !== masked) return void 0;
517
533
  return toDateOnly2(date);
518
534
  }
519
535
  function formatRange(from, to) {
520
536
  if (!from) return "";
521
- const fromStr = (0, import_date_fns2.format)(from, DATE_FORMAT2);
537
+ const fromStr = (0, import_date_fns3.format)(from, DATE_FORMAT2);
522
538
  if (!to) return fromStr;
523
- return `${fromStr} \u2014 ${(0, import_date_fns2.format)(to, DATE_FORMAT2)}`;
539
+ return `${fromStr} \u2014 ${(0, import_date_fns3.format)(to, DATE_FORMAT2)}`;
524
540
  }
525
541
  function resolveShowSeconds(showTime) {
526
542
  if (!showTime) return false;
527
543
  if (showTime === true) return true;
528
544
  return showTime.format === "HH:mm:ss";
529
545
  }
546
+
547
+ // src/components/DateRangePicker/DateRangePicker.tsx
548
+ var import_jsx_runtime7 = require("react/jsx-runtime");
530
549
  function DateRangePicker({
531
550
  value,
532
551
  defaultValue,
@@ -547,8 +566,8 @@ function DateRangePicker({
547
566
  const resolvedIcon = loading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Spinner, {}) : icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CalendarIcon, {});
548
567
  const isControlled = value !== void 0;
549
568
  const showSeconds = resolveShowSeconds(showTime);
550
- const fromDay = fromConstraint ? (0, import_date_fns2.startOfDay)(fromConstraint) : void 0;
551
- const toDay = toConstraint ? (0, import_date_fns2.startOfDay)(toConstraint) : void 0;
569
+ const fromDay = fromConstraint ? (0, import_date_fns4.startOfDay)(fromConstraint) : void 0;
570
+ const toDay = toConstraint ? (0, import_date_fns4.startOfDay)(toConstraint) : void 0;
552
571
  const disabledDays = [
553
572
  ...fromDay ? [{ before: fromDay }] : [],
554
573
  ...toDay ? [{ after: toDay }] : []
@@ -559,9 +578,10 @@ function DateRangePicker({
559
578
  const [internalTo, setInternalTo] = (0, import_react4.useState)(
560
579
  defaultValue == null ? void 0 : defaultValue.to
561
580
  );
562
- const [inputValue, setInputValue] = (0, import_react4.useState)(
563
- () => formatRange(defaultValue == null ? void 0 : defaultValue.from, defaultValue == null ? void 0 : defaultValue.to)
564
- );
581
+ const [inputValue, setInputValue] = (0, import_react4.useState)(() => {
582
+ const initial = value != null ? value : defaultValue;
583
+ return formatRange(initial == null ? void 0 : initial.from, initial == null ? void 0 : initial.to);
584
+ });
565
585
  const [inputInvalid, setInputInvalid] = (0, import_react4.useState)(false);
566
586
  const [open, setOpen] = (0, import_react4.useState)(false);
567
587
  const [focused, setFocused] = (0, import_react4.useState)(false);
@@ -579,6 +599,14 @@ function DateRangePicker({
579
599
  const confirmedFrom = isControlled ? value == null ? void 0 : value.from : internalFrom;
580
600
  const confirmedTo = isControlled ? value == null ? void 0 : value.to : internalTo;
581
601
  const filled = inputValue.length > 0;
602
+ const [month, setMonth] = (0, import_react4.useState)(() => {
603
+ const init = confirmedFrom != null ? confirmedFrom : confirmedTo;
604
+ return init && (0, import_date_fns4.isValid)(init) ? init : /* @__PURE__ */ new Date();
605
+ });
606
+ const monthAnchor = confirmedFrom != null ? confirmedFrom : confirmedTo;
607
+ (0, import_react4.useEffect)(() => {
608
+ if (monthAnchor && (0, import_date_fns4.isValid)(monthAnchor)) setMonth(monthAnchor);
609
+ }, [monthAnchor == null ? void 0 : monthAnchor.getFullYear(), monthAnchor == null ? void 0 : monthAnchor.getMonth()]);
582
610
  const close = (0, import_react4.useCallback)(() => {
583
611
  setOpen(false);
584
612
  setAnchorDate(void 0);
@@ -624,7 +652,7 @@ function DateRangePicker({
624
652
  setInternalFrom(from);
625
653
  setInternalTo(void 0);
626
654
  }
627
- setInputValue((0, import_date_fns2.format)(day, DATE_FORMAT2));
655
+ setInputValue(formatRange(from, void 0));
628
656
  setInputInvalid(false);
629
657
  lastEmittedFromRef.current = from;
630
658
  lastEmittedToRef.current = void 0;
@@ -850,6 +878,8 @@ function DateRangePicker({
850
878
  {
851
879
  mode: "range",
852
880
  selected: calendarSelected,
881
+ month,
882
+ onMonthChange: setMonth,
853
883
  onSelect: () => {
854
884
  },
855
885
  onDayClick: handleDayClick,
@@ -901,6 +931,8 @@ function DateRangePicker({
901
931
  {
902
932
  mode: "range",
903
933
  selected: calendarSelected,
934
+ month,
935
+ onMonthChange: setMonth,
904
936
  onSelect: () => {
905
937
  },
906
938
  onDayClick: handleDayClick,