@artemy-tech/datepicker 0.2.0 → 0.4.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.
- package/dist/DateRangePicker-Bp95dxDX.d.cts +50 -0
- package/dist/DateRangePicker-Bp95dxDX.d.ts +50 -0
- package/dist/chunk-DQSX6QKR.js +785 -0
- package/dist/chunk-DQSX6QKR.js.map +1 -0
- package/dist/index.cjs +136 -51
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -45
- package/dist/index.d.ts +9 -45
- package/dist/index.js +28 -714
- package/dist/index.js.map +1 -1
- package/dist/rhf.cjs +850 -0
- package/dist/rhf.cjs.map +1 -1
- package/dist/rhf.d.cts +20 -1
- package/dist/rhf.d.ts +20 -1
- package/dist/rhf.js +46 -0
- package/dist/rhf.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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"],"sourcesContent":["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 } 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 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 return isValid(date) && format(date, dateFormat) === masked ? date : 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}\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}: 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 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 }\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 <div\n className=\"datepicker__field\"\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 <input\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 {resolvedIcon && iconPosition === 'end' && (\n <span className=\"datepicker__icon datepicker__icon--end\">{resolvedIcon}</span>\n )}\n </div>\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={fromDate}\n endMonth={toDate}\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={fromDate}\n endMonth={toDate}\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 { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { format, isValid, parse } 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 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 return isValid(date) && format(date, DATE_FORMAT) === masked ? date : undefined\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 = 'vertical',\n showTime,\n icon,\n iconPosition = 'end',\n className,\n}: DateRangePickerProps) {\n const resolvedIcon = loading ? <Spinner /> : icon === false ? null : (icon ?? <CalendarIcon />)\n\n const isControlled = value !== undefined\n const showSeconds = resolveShowSeconds(showTime)\n\n const [internalFrom, setInternalFrom] = useState<Date | undefined>(defaultValue?.from)\n const [internalTo, setInternalTo] = useState<Date | undefined>(defaultValue?.to)\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>(value !== undefined ? value?.from : defaultValue?.from)\n const lastEmittedToRef = useRef<Date | undefined>(value !== undefined ? value?.to : defaultValue?.to)\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) { setInternalFrom(newFrom); setInternalTo(newTo) }\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(day.getFullYear(), day.getMonth(), day.getDate(),\n confirmedFrom?.getHours() ?? 0, confirmedFrom?.getMinutes() ?? 0, confirmedFrom?.getSeconds() ?? 0)\n : day\n setAnchorDate(from)\n if (!isControlled) { setInternalFrom(from); setInternalTo(undefined) }\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, to = showTime\n ? new Date(day.getFullYear(), day.getMonth(), day.getDate(),\n confirmedTo?.getHours() ?? 0, confirmedTo?.getMinutes() ?? 0, confirmedTo?.getSeconds() ?? 0)\n : day\n if (day < anchorDate) { const tmp = from; from = to; to = tmp }\n if (!isControlled) { setInternalFrom(from); setInternalTo(to) }\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(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s)\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(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s)\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.slice(0, cursorPos).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 = fromDigits.length === 8 ? parseDate(applyDateMask(fromDigits)) : undefined\n const parsedTo = 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) { setInternalFrom(parsedFrom); setInternalTo(parsedTo) }\n lastEmittedFromRef.current = parsedFrom\n lastEmittedToRef.current = parsedTo\n onChange?.(parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined)\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 (e.key === 'Backspace' && pos > 0 && /[\\s—]/.test(input.value[pos - 1])) {\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((val.slice(0, newPos - 1) + val.slice(newPos)).replace(/\\D/g, ''))\n setInputValue(masked)\n requestAnimationFrame(() => input.setSelectionRange(newPos - 1, newPos - 1))\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 = digits.length >= 8 ? parseDate(applyDateMask(digits.slice(0, 8))) : undefined\n const parsedTo = digits.length >= 16 ? parseDate(applyDateMask(digits.slice(8, 16))) : undefined\n setInputInvalid((digits.length >= 8 && !parsedFrom) || (digits.length >= 16 && !parsedTo))\n if (!isControlled) { setInternalFrom(parsedFrom); setInternalTo(parsedTo) }\n lastEmittedFromRef.current = parsedFrom\n lastEmittedToRef.current = parsedTo\n onChange?.(parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined)\n\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(masked.length, masked.length))\n }\n\n const placeholder = label && !focused && !filled ? undefined : 'дд.мм.гггг — дд.мм.гггг'\n const interactive = !disabled && !loading\n\n return (\n <div\n ref={containerRef}\n className={['datepicker', 'daterangepicker', `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 <div\n className=\"datepicker__field\"\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 <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={() => { setFocused(true); if (interactive) setOpen(true) }}\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\">{resolvedIcon}</span>\n )}\n </div>\n {open && (\n <div\n className={[\n 'datepicker__popover',\n `datepicker__popover--${size}`,\n calendarLayout === 'horizontal' && 'datepicker__popover--horizontal',\n showTime && 'datepicker__popover--with-time',\n ].filter(Boolean).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={fromConstraint}\n endMonth={toConstraint}\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 value={confirmedFrom} showSeconds={showSeconds} onChange={handleFromTimeChange} />\n </div>\n <div className=\"datepicker__time-separator\" />\n <div className=\"datepicker__time-col\">\n <span className=\"datepicker__time-label\">Конец</span>\n <TimePanel value={confirmedTo} showSeconds={showSeconds} onChange={handleToTimeChange} />\n </div>\n </div>\n <div className=\"datepicker__popover-footer\">\n <button className=\"datepicker__ok-btn\" type=\"button\" onClick={close}>OK</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"],"mappings":";AAAA,SAAS,iBAAiC;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,SAAS,aAAa,aAAAA,YAAW,UAAAC,SAAQ,gBAAgC;AACzE,SAAS,QAAQ,SAAS,aAAa;AACvC,SAAS,UAAU;;;ACFnB,SAAoB,iBAAiB;AAE9B,SAAS,gBAAgB,KAAoC,SAAqB;AACvF,YAAU,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,SAAS,aAAAC,YAAW,cAAc;AA0B1B,gBAAAC,MA4BJ,YA5BI;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,cAAc,OAA0B,IAAI;AAElD,EAAAD,WAAU,MAAM;AAnBlB;AAoBI,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO,UAAU,UAAU,UAAU;AAAA,EAC7E,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,gBAAAC,KAAC,SAAI,WAAU,sBACZ,iBAAO,IAAI,CAAC,MACX,gBAAAA;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,qBAAC,SAAI,WAAU,cACb;AAAA,oBAAAA,KAAC,UAAO,QAAQ,OAAO,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,IACxE,gBAAAA,KAAC,UAAO,QAAQ,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,IACzE,eACC,gBAAAA,KAAC,UAAO,QAAQ,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,KAE9E;AAEJ;;;AC5DI,SACE,OAAAC,MADF,QAAAC,aAAA;AAFG,SAAS,eAAe;AAC7B,SACE,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAChE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,MAAK,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC5F,gBAAAA,KAAC,UAAK,GAAE,aAAY,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC5D,gBAAAA,KAAC,UAAK,GAAE,iBAAgB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,KACxF;AAEJ;;;ACPS,gBAAAE,YAAA;AADF,SAAS,UAAU;AACxB,SAAO,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO;AACjE;;;AJyGiC,SAuMrB,UAvMqB,OAAAC,MA4J3B,QAAAC,aA5J2B;AA/FjC,IAAM,cAAc;AAEpB,SAAS,kBAAkB,UAA4D;AACrF,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,SAAS;AAClB;AAEA,SAAS,gBAAgB,YAA2B;AAClD,SAAO,aAAa,GAAG,WAAW,IAAI,UAAU,KAAK;AACvD;AAEA,SAAS,eAAe,YAA2B;AACjD,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,eAAe,UAAU,KAAK;AACvC;AAEA,SAAS,iBAAiB,YAA2B;AACnD,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,eAAe,UAAU,iFAAqB;AACvD;AAEA,SAAS,UAAU,QAAgB,WAA2B;AAC5D,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;AAEA,SAAS,aAAa,QAAgB,YAA4B;AAChE,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;AAEA,SAAS,cAAc,QAAgB,YAAoB,WAAqC;AAC9F,MAAI,OAAO,QAAQ,OAAO,EAAE,EAAE,WAAW,UAAW,QAAO;AAC3D,QAAM,OAAO,MAAM,QAAQ,YAAY,oBAAI,KAAK,CAAC;AACjD,SAAO,QAAQ,IAAI,KAAK,OAAO,MAAM,UAAU,MAAM,SAAS,OAAO;AACvE;AAqBO,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;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,eAAe,UAAU,gBAAAD,KAAC,WAAQ,IAAK,SAAS,QAAQ,OAAQ,sBAAQ,gBAAAA,KAAC,gBAAa;AAE5F,QAAM,eAAe,UAAU;AAC/B,QAAM,CAAC,cAAc,eAAe,IAAI,SAA2B,YAAY;AAC/E,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAI;AAAA,IAAS,MAC3C,gBAAgB,QAAQ,YAAY,IAAI,OAAO,cAAc,UAAU,IAAI;AAAA,EAC7E;AACA,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AAEtD,QAAM,WAAWE,QAAyB,IAAI;AAC9C,QAAM,eAAeA,QAAuB,IAAI;AAChD,QAAM,eAAeA,QAAO,UAAU;AAEtC,QAAM,iBAAiBA,QAAyB,UAAU,SAAY,QAAQ,YAAY;AAE1F,QAAM,mBAAmBA,QAAO,UAAU,MAAS;AAEnD,QAAM,WAAW,eAAe,QAAQ;AACxC,QAAM,SAAS,WAAW,SAAS;AAEnC,QAAM,QAAQ,YAAY,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AAClD,kBAAgB,cAAc,KAAK;AAGnC,EAAAC,WAAU,MAAM;AArIlB;AAsII,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,SAAS,QAAQ,KAAK,IAAI,OAAO,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;AA1LhE;AA2LI,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;AApM7B,UAAAC;AAoMgC,cAAAA,MAAA,SAAS,YAAT,gBAAAA,IAAkB,kBAAkB,cAAc;AAAA,KAAa;AAAA,EAC7F;AAEA,WAAS,cAAc,GAA0C;AAvMnE;AAwMI,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;AA/N7B;AA+NgC,4BAAS,YAAT,mBAAkB,kBAAkB,OAAO,QAAQ,OAAO;AAAA,KAAO;AAAA,EAC/F;AAEA,WAAS,qBAAqB,MAAwB;AACpD,QAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG;AAC3B,iBAAW,IAAI,MAAS;AACxB,UAAI,CAAC,WAAY,SAAQ,KAAK;AAC9B;AAAA,IACF;AAEA,QAAI,eAAe;AACnB,QAAI,YAAY;AACd,YAAM,OAAO,YAAY,QAAQ,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;AAEA,eAAW,OAAO,cAAc,UAAU,GAAG,YAAY;AACzD,QAAI,CAAC,WAAY,SAAQ,KAAK;AAAA,EAChC;AAEA,WAAS,iBAAiB,GAAW,GAAW,GAAW;AACzD,UAAM,OAAO,YAAY,QAAQ,QAAQ,IAAI,WAAW,oBAAI,KAAK;AACjE,UAAM,UAAU,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,eAAW,OAAO,SAAS,UAAU,GAAG,OAAO;AAAA,EACjD;AAEA,QAAM,cAAc,CAAC,YAAY,CAAC;AAElC,SACE,gBAAAH;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,MAE/B;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,mBAAiB,gBAAgB,iBAAiB,UAAU,OAAO;AAAA,YACnE,iBAAe,gBAAgB,iBAAiB,QAAQ,OAAO;AAAA,YAC/D,SAAS,MAAG;AA3QpB;AA2QuB,sCAAe,cAAS,YAAT,mBAAkB;AAAA;AAAA,YAE/C;AAAA,8BAAgB,iBAAiB,WAChC,gBAAAD,KAAC,UAAK,WAAU,4CAA4C,wBAAa;AAAA,cAE1E,SAAS,gBAAAA,KAAC,UAAK,WAAU,qBAAqB,iBAAM;AAAA,cACrD,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,WAAU;AAAA,kBACV,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,cAAY,wBAAS;AAAA,kBACrB,iBAAe,CAAC,aAAa,OAAO;AAAA,kBACpC,iBAAe,CAAC,aAAa,WAAW;AAAA,kBACxC,gBAAc,gBAAgB;AAAA;AAAA,cAChC;AAAA,cACC,gBAAgB,iBAAiB,SAChC,gBAAAA,KAAC,UAAK,WAAU,0CAA0C,wBAAa;AAAA;AAAA;AAAA,QAE3E;AAAA,QACC,CAAC,cAAc,QACd,gBAAAA;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,gBAAAC,MAAA,YACE;AAAA,8BAAAA,MAAC,SAAI,WAAU,4BACb;AAAA,gCAAAD,KAAC,SAAI,WAAU,gCACb,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL;AAAA,oBACA,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,QAAQ;AAAA;AAAA,gBACV,GACF;AAAA,gBACA,gBAAAA,KAAC,SAAI,WAAU,8BAA6B;AAAA,gBAC5C,gBAAAA,KAAC,SAAI,WAAU,4BACb,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP;AAAA,oBACA,UAAU;AAAA;AAAA,gBACZ,GACF;AAAA,iBACF;AAAA,cACA,gBAAAA,KAAC,SAAI,WAAU,8BACb,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,SAAS,MAAM,QAAQ,KAAK;AAAA,kBAC7B;AAAA;AAAA,cAED,GACF;AAAA,eACF,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL;AAAA,gBACA,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,QAAQ;AAAA;AAAA,YACV;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AK/VA,SAAS,eAAAK,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgC;AACzE,SAAS,UAAAC,SAAQ,WAAAC,UAAS,SAAAC,cAAa;AACvC,SAAS,MAAAC,WAAU;AAqGc,SAkPrB,YAAAC,WAlPqB,OAAAC,MAsM3B,QAAAC,aAtM2B;AA5FjC,IAAMC,eAAc;AAEpB,SAAS,cAAc,QAAwB;AAC7C,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;AAEA,SAAS,eAAe,QAAwB;AAC9C,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;AAEA,SAAS,kBAAkB,QAAgB,YAA4B;AACrE,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;AAEA,SAAS,UAAU,QAAkC;AACnD,MAAI,OAAO,QAAQ,OAAO,EAAE,EAAE,WAAW,EAAG,QAAO;AACnD,QAAM,OAAOC,OAAM,QAAQD,cAAa,oBAAI,KAAK,CAAC;AAClD,SAAOE,SAAQ,IAAI,KAAKC,QAAO,MAAMH,YAAW,MAAM,SAAS,OAAO;AACxE;AAEA,SAAS,YAAY,MAAwB,IAA8B;AACzE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAUG,QAAO,MAAMH,YAAW;AACxC,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,OAAO,WAAMG,QAAO,IAAIH,YAAW,CAAC;AAChD;AAEA,SAAS,mBAAmB,UAAwC;AAClE,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,SAAS,WAAW;AAC7B;AA0BO,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,UAAU,gBAAAF,KAAC,WAAQ,IAAK,SAAS,QAAQ,OAAQ,sBAAQ,gBAAAA,KAAC,gBAAa;AAE5F,QAAM,eAAe,UAAU;AAC/B,QAAM,cAAc,mBAAmB,QAAQ;AAE/C,QAAM,CAAC,cAAc,eAAe,IAAIM,UAA2B,6CAAc,IAAI;AACrF,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA2B,6CAAc,EAAE;AAC/E,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAAS,MAC3C,YAAY,6CAAc,MAAM,6CAAc,EAAE;AAAA,EAClD;AACA,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA2B,MAAS;AACxE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA2B,MAAS;AAE1E,QAAM,WAAWC,QAAyB,IAAI;AAC9C,QAAM,eAAeA,QAAuB,IAAI;AAEhD,QAAM,qBAAqBA,QAAyB,UAAU,SAAY,+BAAO,OAAO,6CAAc,IAAI;AAC1G,QAAM,mBAAmBA,QAAyB,UAAU,SAAY,+BAAO,KAAK,6CAAc,EAAE;AACpG,QAAM,mBAAmBA,QAAO,UAAU,MAAS;AAEnD,QAAM,gBAAgB,eAAe,+BAAO,OAAO;AACnD,QAAM,cAAc,eAAe,+BAAO,KAAK;AAC/C,QAAM,SAAS,WAAW,SAAS;AAEnC,QAAM,QAAQC,aAAY,MAAM;AAC9B,YAAQ,KAAK;AACb,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAAA,EAC1B,GAAG,CAAC,CAAC;AACL,kBAAgB,cAAc,KAAK;AAGnC,EAAAC,WAAU,MAAM;AA3IlB;AA4II,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;AAAE,sBAAgB,OAAO;AAAG,oBAAc,KAAK;AAAA,IAAE;AACpE,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;AAvKrC;AAwKI,QAAI,CAAC,YAAY;AACf,YAAM,OAAO,WACT,IAAI;AAAA,QAAK,IAAI,YAAY;AAAA,QAAG,IAAI,SAAS;AAAA,QAAG,IAAI,QAAQ;AAAA,SACtD,oDAAe,eAAf,YAA6B;AAAA,SAAG,oDAAe,iBAAf,YAA+B;AAAA,SAAG,oDAAe,iBAAf,YAA+B;AAAA,MAAC,IACpG;AACJ,oBAAc,IAAI;AAClB,UAAI,CAAC,cAAc;AAAE,wBAAgB,IAAI;AAAG,sBAAc,MAAS;AAAA,MAAE;AACrE,oBAAcJ,QAAO,KAAKH,YAAW,CAAC;AACtC,sBAAgB,KAAK;AACrB,yBAAmB,UAAU;AAC7B,uBAAiB,UAAU;AAC3B,2CAAW,EAAE,MAAM,IAAI,OAAU;AAAA,IACnC,OAAO;AACL,UAAI,OAAO,YAAY,KAAK,WACxB,IAAI;AAAA,QAAK,IAAI,YAAY;AAAA,QAAG,IAAI,SAAS;AAAA,QAAG,IAAI,QAAQ;AAAA,SACtD,gDAAa,eAAb,YAA2B;AAAA,SAAG,gDAAa,iBAAb,YAA6B;AAAA,SAAG,gDAAa,iBAAb,YAA6B;AAAA,MAAC,IAC9F;AACJ,UAAI,MAAM,YAAY;AAAE,cAAM,MAAM;AAAM,eAAO;AAAI,aAAK;AAAA,MAAI;AAC9D,UAAI,CAAC,cAAc;AAAE,wBAAgB,IAAI;AAAG,sBAAc,EAAE;AAAA,MAAE;AAC9D,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,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,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,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,QAAI,CAAC,aAAc,eAAc,OAAO;AACxC,qBAAiB,UAAU;AAC3B,yCAAW,EAAE,MAAM,eAAe,IAAI,QAAQ;AAAA,EAChD;AAEA,WAAS,aAAa,GAAwC;AAzNhE;AA0NI,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,IAAI,MAAM,GAAG,SAAS,EAAE,QAAQ,OAAO,EAAE,EAAE;AAEtE,kBAAc,MAAM;AACpB,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAExB,UAAM,aAAa,OAAO,MAAM,GAAG,CAAC;AACpC,UAAM,WAAW,OAAO,MAAM,CAAC;AAC/B,UAAM,aAAa,WAAW,WAAW,IAAI,UAAU,cAAc,UAAU,CAAC,IAAI;AACpF,UAAM,WAAW,SAAS,WAAW,IAAI,UAAU,cAAc,QAAQ,CAAC,IAAI;AAC9E,UAAM,eAAe,WAAW,WAAW;AAC3C,UAAM,aAAa,SAAS,WAAW;AACvC,oBAAiB,gBAAgB,CAAC,cAAgB,cAAc,CAAC,QAAS;AAE1E,QAAI,CAAC,cAAc;AAAE,sBAAgB,UAAU;AAAG,oBAAc,QAAQ;AAAA,IAAE;AAC1E,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAC3B,yCAAW,cAAc,WAAW,EAAE,MAAM,YAAY,IAAI,SAAS,IAAI;AAEzE;AAAA,MAAsB,MAAG;AAlP7B,YAAAQ;AAmPM,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;AA1PnE;AA2PI,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,QAAI,EAAE,QAAQ,eAAe,MAAM,KAAK,QAAQ,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC,GAAG;AAC1E,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,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,MAAM,GAAG,QAAQ,OAAO,EAAE,CAAC;AAC/F,oBAAc,MAAM;AACpB,4BAAsB,MAAM,MAAM,kBAAkB,SAAS,GAAG,SAAS,CAAC,CAAC;AAAA,IAC7E;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,aAAa,OAAO,UAAU,IAAI,UAAU,cAAc,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;AACvF,UAAM,WAAW,OAAO,UAAU,KAAK,UAAU,cAAc,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI;AACvF,oBAAiB,OAAO,UAAU,KAAK,CAAC,cAAgB,OAAO,UAAU,MAAM,CAAC,QAAS;AACzF,QAAI,CAAC,cAAc;AAAE,sBAAgB,UAAU;AAAG,oBAAc,QAAQ;AAAA,IAAE;AAC1E,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAC3B,yCAAW,cAAc,WAAW,EAAE,MAAM,YAAY,IAAI,SAAS,IAAI;AAEzE,0BAAsB,MAAG;AA9R7B;AA8RgC,4BAAS,YAAT,mBAAkB,kBAAkB,OAAO,QAAQ,OAAO;AAAA,KAAO;AAAA,EAC/F;AAEA,QAAM,cAAc,SAAS,CAAC,WAAW,CAAC,SAAS,SAAY;AAC/D,QAAM,cAAc,CAAC,YAAY,CAAC;AAElC,SACE,gBAAAT;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,CAAC,cAAc,mBAAmB,eAAe,IAAI,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACvG,gBAAc,WAAW,QAAQ;AAAA,MACjC,eAAa,UAAU;AAAA,MACvB,eAAa,UAAU,gBAAgB;AAAA,MACvC,iBAAe,CAAC,eAAe;AAAA,MAE/B;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,mBAAiB,gBAAgB,iBAAiB,UAAU,OAAO;AAAA,YACnE,iBAAe,gBAAgB,iBAAiB,QAAQ,OAAO;AAAA,YAC/D,SAAS,MAAG;AAjTpB;AAiTuB,sCAAe,cAAS,YAAT,mBAAkB;AAAA;AAAA,YAE/C;AAAA,8BAAgB,iBAAiB,WAChC,gBAAAD,KAAC,UAAK,WAAU,4CAA4C,wBAAa;AAAA,cAE1E,SAAS,gBAAAA,KAAC,UAAK,WAAU,qBAAqB,iBAAM;AAAA,cACrD,gBAAAA;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;AAAE,+BAAW,IAAI;AAAG,wBAAI,YAAa,SAAQ,IAAI;AAAA,kBAAE;AAAA,kBAClE,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,gBAAAA,KAAC,UAAK,WAAU,0CAA0C,wBAAa;AAAA;AAAA;AAAA,QAE3E;AAAA,QACC,QACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,wBAAwB,IAAI;AAAA,cAC5B,mBAAmB,gBAAgB;AAAA,cACnC,YAAY;AAAA,YACd,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC1B,MAAK;AAAA,YACL,cAAW;AAAA,YAEV,qBACC,gBAAAC,MAAAF,WAAA,EACE;AAAA,8BAAAC,KAAC,SAAI,WAAU,4BACb,0BAAAA,KAAC,SAAI,WAAU,gCACb,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV,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,gBAAgB;AAAA,kBAChB,QAAQW;AAAA;AAAA,cACV,GACF,GACF;AAAA,cACA,gBAAAV,MAAC,SAAI,WAAU,wBACb;AAAA,gCAAAA,MAAC,SAAI,WAAU,wBACb;AAAA,kCAAAD,KAAC,UAAK,WAAU,0BAAyB,kDAAM;AAAA,kBAC/C,gBAAAA,KAAC,aAAU,OAAO,eAAe,aAA0B,UAAU,sBAAsB;AAAA,mBAC7F;AAAA,gBACA,gBAAAA,KAAC,SAAI,WAAU,8BAA6B;AAAA,gBAC5C,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,kCAAAD,KAAC,UAAK,WAAU,0BAAyB,4CAAK;AAAA,kBAC9C,gBAAAA,KAAC,aAAU,OAAO,aAAa,aAA0B,UAAU,oBAAoB;AAAA,mBACzF;AAAA,iBACF;AAAA,cACA,gBAAAA,KAAC,SAAI,WAAU,8BACb,0BAAAA,KAAC,YAAO,WAAU,sBAAqB,MAAK,UAAS,SAAS,OAAO,gBAAE,GACzE;AAAA,eACF,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,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,QAAQW;AAAA;AAAA,YACV;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":["useEffect","useRef","useEffect","jsx","jsx","jsxs","jsx","jsx","jsxs","useRef","useEffect","_a","useCallback","useEffect","useRef","useState","format","isValid","parse","ru","Fragment","jsx","jsxs","DATE_FORMAT","parse","isValid","format","useState","useRef","useCallback","useEffect","_a","ru"]}
|
package/dist/index.cjs
CHANGED
|
@@ -20,10 +20,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
|
+
Button: () => Button,
|
|
23
24
|
Calendar: () => Calendar,
|
|
24
25
|
DatePicker: () => DatePicker,
|
|
25
|
-
DateRangePicker: () => DateRangePicker
|
|
26
|
-
VERSION: () => VERSION
|
|
26
|
+
DateRangePicker: () => DateRangePicker
|
|
27
27
|
});
|
|
28
28
|
module.exports = __toCommonJS(src_exports);
|
|
29
29
|
|
|
@@ -109,8 +109,14 @@ function CalendarIcon() {
|
|
|
109
109
|
] });
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
// src/components/
|
|
112
|
+
// src/components/icons/Spinner.tsx
|
|
113
113
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
114
|
+
function Spinner() {
|
|
115
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "datepicker-spinner", "aria-hidden": "true" });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// src/components/DatePicker/DatePicker.tsx
|
|
119
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
114
120
|
var DATE_FORMAT = "dd.MM.yyyy";
|
|
115
121
|
function resolveTimeFormat(showTime) {
|
|
116
122
|
if (!showTime) return null;
|
|
@@ -165,6 +171,7 @@ function DatePicker({
|
|
|
165
171
|
toDate,
|
|
166
172
|
disabled = false,
|
|
167
173
|
failed = false,
|
|
174
|
+
loading = false,
|
|
168
175
|
size = "m",
|
|
169
176
|
noCalendar = false,
|
|
170
177
|
showTime,
|
|
@@ -177,7 +184,7 @@ function DatePicker({
|
|
|
177
184
|
const maxDigits = buildMaxDigits(timeFormat);
|
|
178
185
|
const defaultPlaceholder = placeholder != null ? placeholder : buildPlaceholder(timeFormat);
|
|
179
186
|
const showSeconds = timeFormat === "HH:mm:ss";
|
|
180
|
-
const resolvedIcon = icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0,
|
|
187
|
+
const resolvedIcon = loading ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Spinner, {}) : icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CalendarIcon, {});
|
|
181
188
|
const isControlled = value !== void 0;
|
|
182
189
|
const [internalDate, setInternalDate] = (0, import_react3.useState)(defaultValue);
|
|
183
190
|
const [open, setOpen] = (0, import_react3.useState)(false);
|
|
@@ -189,11 +196,28 @@ function DatePicker({
|
|
|
189
196
|
const inputRef = (0, import_react3.useRef)(null);
|
|
190
197
|
const containerRef = (0, import_react3.useRef)(null);
|
|
191
198
|
const lastValidRef = (0, import_react3.useRef)(inputValue);
|
|
199
|
+
const lastEmittedRef = (0, import_react3.useRef)(value !== void 0 ? value : defaultValue);
|
|
200
|
+
const wasControlledRef = (0, import_react3.useRef)(value !== void 0);
|
|
192
201
|
const selected = isControlled ? value : internalDate;
|
|
193
202
|
const filled = inputValue.length > 0;
|
|
194
203
|
const close = (0, import_react3.useCallback)(() => setOpen(false), []);
|
|
195
204
|
useClickOutside(containerRef, close);
|
|
205
|
+
(0, import_react3.useEffect)(() => {
|
|
206
|
+
var _a, _b, _c;
|
|
207
|
+
if (value !== void 0) wasControlledRef.current = true;
|
|
208
|
+
const lastTime = (_b = (_a = lastEmittedRef.current) == null ? void 0 : _a.getTime()) != null ? _b : null;
|
|
209
|
+
const valueTime = (_c = value == null ? void 0 : value.getTime()) != null ? _c : null;
|
|
210
|
+
if (valueTime === lastTime) return;
|
|
211
|
+
if (!wasControlledRef.current && value === void 0) return;
|
|
212
|
+
const formatted = value && (0, import_date_fns.isValid)(value) ? (0, import_date_fns.format)(value, dateFormat) : "";
|
|
213
|
+
setInputValue(formatted);
|
|
214
|
+
lastValidRef.current = formatted;
|
|
215
|
+
setInputInvalid(false);
|
|
216
|
+
if (!isControlled) setInternalDate(value);
|
|
217
|
+
lastEmittedRef.current = value;
|
|
218
|
+
}, [value]);
|
|
196
219
|
function applyValid(masked, date) {
|
|
220
|
+
lastEmittedRef.current = date;
|
|
197
221
|
lastValidRef.current = masked;
|
|
198
222
|
setInputValue(masked);
|
|
199
223
|
setInputInvalid(false);
|
|
@@ -203,12 +227,14 @@ function DatePicker({
|
|
|
203
227
|
function commit(masked) {
|
|
204
228
|
const digits = masked.replace(/\D/g, "");
|
|
205
229
|
if (digits.length === 0) {
|
|
230
|
+
lastEmittedRef.current = void 0;
|
|
206
231
|
lastValidRef.current = "";
|
|
207
232
|
setInputInvalid(false);
|
|
208
233
|
if (!isControlled) setInternalDate(void 0);
|
|
209
234
|
onChange == null ? void 0 : onChange(void 0);
|
|
210
235
|
} else if (digits.length === maxDigits) {
|
|
211
236
|
const date = parseDateTime(masked, dateFormat, maxDigits);
|
|
237
|
+
lastEmittedRef.current = date;
|
|
212
238
|
if (date) lastValidRef.current = masked;
|
|
213
239
|
setInputInvalid(!date);
|
|
214
240
|
if (!isControlled) setInternalDate(date);
|
|
@@ -294,7 +320,8 @@ function DatePicker({
|
|
|
294
320
|
const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s);
|
|
295
321
|
applyValid((0, import_date_fns.format)(newDate, dateFormat), newDate);
|
|
296
322
|
}
|
|
297
|
-
|
|
323
|
+
const interactive = !disabled && !loading;
|
|
324
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
298
325
|
"div",
|
|
299
326
|
{
|
|
300
327
|
ref: containerRef,
|
|
@@ -302,9 +329,9 @@ function DatePicker({
|
|
|
302
329
|
"data-focused": focused || open || void 0,
|
|
303
330
|
"data-filled": filled || void 0,
|
|
304
331
|
"data-failed": failed || inputInvalid || void 0,
|
|
305
|
-
"data-disabled":
|
|
332
|
+
"data-disabled": !interactive || void 0,
|
|
306
333
|
children: [
|
|
307
|
-
/* @__PURE__ */ (0,
|
|
334
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
308
335
|
"div",
|
|
309
336
|
{
|
|
310
337
|
className: "datepicker__field",
|
|
@@ -312,12 +339,12 @@ function DatePicker({
|
|
|
312
339
|
"data-icon-end": resolvedIcon && iconPosition === "end" ? true : void 0,
|
|
313
340
|
onClick: () => {
|
|
314
341
|
var _a;
|
|
315
|
-
return
|
|
342
|
+
return interactive && ((_a = inputRef.current) == null ? void 0 : _a.focus());
|
|
316
343
|
},
|
|
317
344
|
children: [
|
|
318
|
-
resolvedIcon && iconPosition === "start" && /* @__PURE__ */ (0,
|
|
319
|
-
label && /* @__PURE__ */ (0,
|
|
320
|
-
/* @__PURE__ */ (0,
|
|
345
|
+
resolvedIcon && iconPosition === "start" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "datepicker__icon datepicker__icon--start", children: resolvedIcon }),
|
|
346
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "datepicker__label", children: label }),
|
|
347
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
321
348
|
"input",
|
|
322
349
|
{
|
|
323
350
|
ref: inputRef,
|
|
@@ -326,13 +353,13 @@ function DatePicker({
|
|
|
326
353
|
className: "datepicker__input",
|
|
327
354
|
value: inputValue,
|
|
328
355
|
placeholder: label && !focused ? void 0 : defaultPlaceholder,
|
|
329
|
-
disabled,
|
|
356
|
+
disabled: !interactive,
|
|
330
357
|
onChange: handleChange,
|
|
331
358
|
onKeyDown: handleKeyDown,
|
|
332
359
|
onPaste: handlePaste,
|
|
333
360
|
onFocus: () => {
|
|
334
361
|
setFocused(true);
|
|
335
|
-
if (
|
|
362
|
+
if (interactive && !noCalendar) setOpen(true);
|
|
336
363
|
},
|
|
337
364
|
onBlur: handleBlur,
|
|
338
365
|
"aria-label": label != null ? label : "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443",
|
|
@@ -341,11 +368,11 @@ function DatePicker({
|
|
|
341
368
|
"aria-invalid": inputInvalid || void 0
|
|
342
369
|
}
|
|
343
370
|
),
|
|
344
|
-
resolvedIcon && iconPosition === "end" && /* @__PURE__ */ (0,
|
|
371
|
+
resolvedIcon && iconPosition === "end" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "datepicker__icon datepicker__icon--end", children: resolvedIcon })
|
|
345
372
|
]
|
|
346
373
|
}
|
|
347
374
|
),
|
|
348
|
-
!noCalendar && open && /* @__PURE__ */ (0,
|
|
375
|
+
!noCalendar && open && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
349
376
|
"div",
|
|
350
377
|
{
|
|
351
378
|
className: [
|
|
@@ -355,9 +382,9 @@ function DatePicker({
|
|
|
355
382
|
].filter(Boolean).join(" "),
|
|
356
383
|
role: "dialog",
|
|
357
384
|
"aria-label": "\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C",
|
|
358
|
-
children: timeFormat ? /* @__PURE__ */ (0,
|
|
359
|
-
/* @__PURE__ */ (0,
|
|
360
|
-
/* @__PURE__ */ (0,
|
|
385
|
+
children: timeFormat ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
|
|
386
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "datepicker__popover-body", children: [
|
|
387
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "datepicker__popover-calendar", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
361
388
|
Calendar,
|
|
362
389
|
{
|
|
363
390
|
mode: "single",
|
|
@@ -368,8 +395,8 @@ function DatePicker({
|
|
|
368
395
|
locale: import_locale.ru
|
|
369
396
|
}
|
|
370
397
|
) }),
|
|
371
|
-
/* @__PURE__ */ (0,
|
|
372
|
-
/* @__PURE__ */ (0,
|
|
398
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "datepicker__time-separator" }),
|
|
399
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "datepicker__popover-time", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
373
400
|
TimePanel,
|
|
374
401
|
{
|
|
375
402
|
value: selected,
|
|
@@ -378,7 +405,7 @@ function DatePicker({
|
|
|
378
405
|
}
|
|
379
406
|
) })
|
|
380
407
|
] }),
|
|
381
|
-
/* @__PURE__ */ (0,
|
|
408
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "datepicker__popover-footer", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
382
409
|
"button",
|
|
383
410
|
{
|
|
384
411
|
className: "datepicker__ok-btn",
|
|
@@ -387,7 +414,7 @@ function DatePicker({
|
|
|
387
414
|
children: "OK"
|
|
388
415
|
}
|
|
389
416
|
) })
|
|
390
|
-
] }) : /* @__PURE__ */ (0,
|
|
417
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
391
418
|
Calendar,
|
|
392
419
|
{
|
|
393
420
|
mode: "single",
|
|
@@ -409,7 +436,7 @@ function DatePicker({
|
|
|
409
436
|
var import_react4 = require("react");
|
|
410
437
|
var import_date_fns2 = require("date-fns");
|
|
411
438
|
var import_locale2 = require("date-fns/locale");
|
|
412
|
-
var
|
|
439
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
413
440
|
var DATE_FORMAT2 = "dd.MM.yyyy";
|
|
414
441
|
function applyDateMask(digits) {
|
|
415
442
|
const d = digits.slice(0, 8);
|
|
@@ -463,6 +490,7 @@ function DateRangePicker({
|
|
|
463
490
|
toDate: toConstraint,
|
|
464
491
|
disabled = false,
|
|
465
492
|
failed = false,
|
|
493
|
+
loading = false,
|
|
466
494
|
size = "m",
|
|
467
495
|
calendarLayout = "vertical",
|
|
468
496
|
showTime,
|
|
@@ -470,7 +498,7 @@ function DateRangePicker({
|
|
|
470
498
|
iconPosition = "end",
|
|
471
499
|
className
|
|
472
500
|
}) {
|
|
473
|
-
const resolvedIcon = icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0,
|
|
501
|
+
const resolvedIcon = loading ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Spinner, {}) : icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CalendarIcon, {});
|
|
474
502
|
const isControlled = value !== void 0;
|
|
475
503
|
const showSeconds = resolveShowSeconds(showTime);
|
|
476
504
|
const [internalFrom, setInternalFrom] = (0, import_react4.useState)(defaultValue == null ? void 0 : defaultValue.from);
|
|
@@ -485,6 +513,9 @@ function DateRangePicker({
|
|
|
485
513
|
const [hoveredDate, setHoveredDate] = (0, import_react4.useState)(void 0);
|
|
486
514
|
const inputRef = (0, import_react4.useRef)(null);
|
|
487
515
|
const containerRef = (0, import_react4.useRef)(null);
|
|
516
|
+
const lastEmittedFromRef = (0, import_react4.useRef)(value !== void 0 ? value == null ? void 0 : value.from : defaultValue == null ? void 0 : defaultValue.from);
|
|
517
|
+
const lastEmittedToRef = (0, import_react4.useRef)(value !== void 0 ? value == null ? void 0 : value.to : defaultValue == null ? void 0 : defaultValue.to);
|
|
518
|
+
const wasControlledRef = (0, import_react4.useRef)(value !== void 0);
|
|
488
519
|
const confirmedFrom = isControlled ? value == null ? void 0 : value.from : internalFrom;
|
|
489
520
|
const confirmedTo = isControlled ? value == null ? void 0 : value.to : internalTo;
|
|
490
521
|
const filled = inputValue.length > 0;
|
|
@@ -494,6 +525,28 @@ function DateRangePicker({
|
|
|
494
525
|
setHoveredDate(void 0);
|
|
495
526
|
}, []);
|
|
496
527
|
useClickOutside(containerRef, close);
|
|
528
|
+
(0, import_react4.useEffect)(() => {
|
|
529
|
+
var _a, _b, _c, _d, _e, _f;
|
|
530
|
+
if (value !== void 0) wasControlledRef.current = true;
|
|
531
|
+
const newFrom = value == null ? void 0 : value.from;
|
|
532
|
+
const newTo = value == null ? void 0 : value.to;
|
|
533
|
+
const fromTime = (_a = newFrom == null ? void 0 : newFrom.getTime()) != null ? _a : null;
|
|
534
|
+
const toTime = (_b = newTo == null ? void 0 : newTo.getTime()) != null ? _b : null;
|
|
535
|
+
const lastFromTime = (_d = (_c = lastEmittedFromRef.current) == null ? void 0 : _c.getTime()) != null ? _d : null;
|
|
536
|
+
const lastToTime = (_f = (_e = lastEmittedToRef.current) == null ? void 0 : _e.getTime()) != null ? _f : null;
|
|
537
|
+
if (fromTime === lastFromTime && toTime === lastToTime) return;
|
|
538
|
+
if (!wasControlledRef.current && value === void 0) return;
|
|
539
|
+
setInputValue(formatRange(newFrom, newTo));
|
|
540
|
+
setInputInvalid(false);
|
|
541
|
+
if (!isControlled) {
|
|
542
|
+
setInternalFrom(newFrom);
|
|
543
|
+
setInternalTo(newTo);
|
|
544
|
+
}
|
|
545
|
+
setAnchorDate(void 0);
|
|
546
|
+
setHoveredDate(void 0);
|
|
547
|
+
lastEmittedFromRef.current = newFrom;
|
|
548
|
+
lastEmittedToRef.current = newTo;
|
|
549
|
+
}, [value]);
|
|
497
550
|
const calendarSelected = anchorDate ? hoveredDate ? anchorDate <= hoveredDate ? { from: anchorDate, to: hoveredDate } : { from: hoveredDate, to: anchorDate } : { from: anchorDate, to: void 0 } : { from: confirmedFrom, to: confirmedTo };
|
|
498
551
|
function handleDayClick(day) {
|
|
499
552
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -513,6 +566,8 @@ function DateRangePicker({
|
|
|
513
566
|
}
|
|
514
567
|
setInputValue((0, import_date_fns2.format)(day, DATE_FORMAT2));
|
|
515
568
|
setInputInvalid(false);
|
|
569
|
+
lastEmittedFromRef.current = from;
|
|
570
|
+
lastEmittedToRef.current = void 0;
|
|
516
571
|
onChange == null ? void 0 : onChange({ from, to: void 0 });
|
|
517
572
|
} else {
|
|
518
573
|
let from = anchorDate, to = showTime ? new Date(
|
|
@@ -534,6 +589,8 @@ function DateRangePicker({
|
|
|
534
589
|
}
|
|
535
590
|
setInputValue(formatRange(from, to));
|
|
536
591
|
setInputInvalid(false);
|
|
592
|
+
lastEmittedFromRef.current = from;
|
|
593
|
+
lastEmittedToRef.current = to;
|
|
537
594
|
onChange == null ? void 0 : onChange({ from, to });
|
|
538
595
|
if (!showTime) close();
|
|
539
596
|
else setAnchorDate(void 0);
|
|
@@ -546,12 +603,14 @@ function DateRangePicker({
|
|
|
546
603
|
const base = confirmedFrom != null ? confirmedFrom : /* @__PURE__ */ new Date();
|
|
547
604
|
const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s);
|
|
548
605
|
if (!isControlled) setInternalFrom(newDate);
|
|
606
|
+
lastEmittedFromRef.current = newDate;
|
|
549
607
|
onChange == null ? void 0 : onChange({ from: newDate, to: confirmedTo });
|
|
550
608
|
}
|
|
551
609
|
function handleToTimeChange(h, m, s) {
|
|
552
610
|
const base = confirmedTo != null ? confirmedTo : /* @__PURE__ */ new Date();
|
|
553
611
|
const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s);
|
|
554
612
|
if (!isControlled) setInternalTo(newDate);
|
|
613
|
+
lastEmittedToRef.current = newDate;
|
|
555
614
|
onChange == null ? void 0 : onChange({ from: confirmedFrom, to: newDate });
|
|
556
615
|
}
|
|
557
616
|
function handleChange(e) {
|
|
@@ -576,6 +635,8 @@ function DateRangePicker({
|
|
|
576
635
|
setInternalFrom(parsedFrom);
|
|
577
636
|
setInternalTo(parsedTo);
|
|
578
637
|
}
|
|
638
|
+
lastEmittedFromRef.current = parsedFrom;
|
|
639
|
+
lastEmittedToRef.current = parsedTo;
|
|
579
640
|
onChange == null ? void 0 : onChange(parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : void 0);
|
|
580
641
|
requestAnimationFrame(
|
|
581
642
|
() => {
|
|
@@ -620,6 +681,8 @@ function DateRangePicker({
|
|
|
620
681
|
setInternalFrom(parsedFrom);
|
|
621
682
|
setInternalTo(parsedTo);
|
|
622
683
|
}
|
|
684
|
+
lastEmittedFromRef.current = parsedFrom;
|
|
685
|
+
lastEmittedToRef.current = parsedTo;
|
|
623
686
|
onChange == null ? void 0 : onChange(parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : void 0);
|
|
624
687
|
requestAnimationFrame(() => {
|
|
625
688
|
var _a;
|
|
@@ -627,7 +690,8 @@ function DateRangePicker({
|
|
|
627
690
|
});
|
|
628
691
|
}
|
|
629
692
|
const placeholder = label && !focused && !filled ? void 0 : "\u0434\u0434.\u043C\u043C.\u0433\u0433\u0433\u0433 \u2014 \u0434\u0434.\u043C\u043C.\u0433\u0433\u0433\u0433";
|
|
630
|
-
|
|
693
|
+
const interactive = !disabled && !loading;
|
|
694
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
631
695
|
"div",
|
|
632
696
|
{
|
|
633
697
|
ref: containerRef,
|
|
@@ -635,9 +699,9 @@ function DateRangePicker({
|
|
|
635
699
|
"data-focused": focused || open || void 0,
|
|
636
700
|
"data-filled": filled || void 0,
|
|
637
701
|
"data-failed": failed || inputInvalid || void 0,
|
|
638
|
-
"data-disabled":
|
|
702
|
+
"data-disabled": !interactive || void 0,
|
|
639
703
|
children: [
|
|
640
|
-
/* @__PURE__ */ (0,
|
|
704
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
641
705
|
"div",
|
|
642
706
|
{
|
|
643
707
|
className: "datepicker__field",
|
|
@@ -645,12 +709,12 @@ function DateRangePicker({
|
|
|
645
709
|
"data-icon-end": resolvedIcon && iconPosition === "end" ? true : void 0,
|
|
646
710
|
onClick: () => {
|
|
647
711
|
var _a;
|
|
648
|
-
return
|
|
712
|
+
return interactive && ((_a = inputRef.current) == null ? void 0 : _a.focus());
|
|
649
713
|
},
|
|
650
714
|
children: [
|
|
651
|
-
resolvedIcon && iconPosition === "start" && /* @__PURE__ */ (0,
|
|
652
|
-
label && /* @__PURE__ */ (0,
|
|
653
|
-
/* @__PURE__ */ (0,
|
|
715
|
+
resolvedIcon && iconPosition === "start" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "datepicker__icon datepicker__icon--start", children: resolvedIcon }),
|
|
716
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "datepicker__label", children: label }),
|
|
717
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
654
718
|
"input",
|
|
655
719
|
{
|
|
656
720
|
ref: inputRef,
|
|
@@ -659,13 +723,13 @@ function DateRangePicker({
|
|
|
659
723
|
className: "datepicker__input",
|
|
660
724
|
value: inputValue,
|
|
661
725
|
placeholder,
|
|
662
|
-
disabled,
|
|
726
|
+
disabled: !interactive,
|
|
663
727
|
onChange: handleChange,
|
|
664
728
|
onKeyDown: handleKeyDown,
|
|
665
729
|
onPaste: handlePaste,
|
|
666
730
|
onFocus: () => {
|
|
667
731
|
setFocused(true);
|
|
668
|
-
if (
|
|
732
|
+
if (interactive) setOpen(true);
|
|
669
733
|
},
|
|
670
734
|
onBlur: () => setFocused(false),
|
|
671
735
|
"aria-label": label != null ? label : "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043F\u0435\u0440\u0438\u043E\u0434",
|
|
@@ -674,11 +738,11 @@ function DateRangePicker({
|
|
|
674
738
|
"aria-invalid": inputInvalid || void 0
|
|
675
739
|
}
|
|
676
740
|
),
|
|
677
|
-
resolvedIcon && iconPosition === "end" && /* @__PURE__ */ (0,
|
|
741
|
+
resolvedIcon && iconPosition === "end" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "datepicker__icon datepicker__icon--end", children: resolvedIcon })
|
|
678
742
|
]
|
|
679
743
|
}
|
|
680
744
|
),
|
|
681
|
-
open && /* @__PURE__ */ (0,
|
|
745
|
+
open && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
682
746
|
"div",
|
|
683
747
|
{
|
|
684
748
|
className: [
|
|
@@ -689,8 +753,8 @@ function DateRangePicker({
|
|
|
689
753
|
].filter(Boolean).join(" "),
|
|
690
754
|
role: "dialog",
|
|
691
755
|
"aria-label": "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043F\u0435\u0440\u0438\u043E\u0434",
|
|
692
|
-
children: showTime ? /* @__PURE__ */ (0,
|
|
693
|
-
/* @__PURE__ */ (0,
|
|
756
|
+
children: showTime ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
757
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "datepicker__popover-body", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "datepicker__popover-calendar", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
694
758
|
Calendar,
|
|
695
759
|
{
|
|
696
760
|
mode: "range",
|
|
@@ -706,19 +770,19 @@ function DateRangePicker({
|
|
|
706
770
|
locale: import_locale2.ru
|
|
707
771
|
}
|
|
708
772
|
) }) }),
|
|
709
|
-
/* @__PURE__ */ (0,
|
|
710
|
-
/* @__PURE__ */ (0,
|
|
711
|
-
/* @__PURE__ */ (0,
|
|
712
|
-
/* @__PURE__ */ (0,
|
|
773
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "datepicker__time-row", children: [
|
|
774
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "datepicker__time-col", children: [
|
|
775
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "datepicker__time-label", children: "\u041D\u0430\u0447\u0430\u043B\u043E" }),
|
|
776
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(TimePanel, { value: confirmedFrom, showSeconds, onChange: handleFromTimeChange })
|
|
713
777
|
] }),
|
|
714
|
-
/* @__PURE__ */ (0,
|
|
715
|
-
/* @__PURE__ */ (0,
|
|
716
|
-
/* @__PURE__ */ (0,
|
|
717
|
-
/* @__PURE__ */ (0,
|
|
778
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "datepicker__time-separator" }),
|
|
779
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "datepicker__time-col", children: [
|
|
780
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "datepicker__time-label", children: "\u041A\u043E\u043D\u0435\u0446" }),
|
|
781
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(TimePanel, { value: confirmedTo, showSeconds, onChange: handleToTimeChange })
|
|
718
782
|
] })
|
|
719
783
|
] }),
|
|
720
|
-
/* @__PURE__ */ (0,
|
|
721
|
-
] }) : /* @__PURE__ */ (0,
|
|
784
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "datepicker__popover-footer", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { className: "datepicker__ok-btn", type: "button", onClick: close, children: "OK" }) })
|
|
785
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
722
786
|
Calendar,
|
|
723
787
|
{
|
|
724
788
|
mode: "range",
|
|
@@ -741,13 +805,34 @@ function DateRangePicker({
|
|
|
741
805
|
);
|
|
742
806
|
}
|
|
743
807
|
|
|
744
|
-
// src/
|
|
745
|
-
var
|
|
808
|
+
// src/components/Button/Button.tsx
|
|
809
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
810
|
+
function Button({
|
|
811
|
+
variant = "primary",
|
|
812
|
+
size = "m",
|
|
813
|
+
loading = false,
|
|
814
|
+
disabled,
|
|
815
|
+
className,
|
|
816
|
+
children,
|
|
817
|
+
...rest
|
|
818
|
+
}) {
|
|
819
|
+
const classes = [
|
|
820
|
+
"dp-btn",
|
|
821
|
+
`dp-btn--${variant}`,
|
|
822
|
+
`dp-btn--${size}`,
|
|
823
|
+
loading && "dp-btn--loading",
|
|
824
|
+
className
|
|
825
|
+
].filter(Boolean).join(" ");
|
|
826
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("button", { ...rest, className: classes, disabled: disabled || loading, children: [
|
|
827
|
+
children,
|
|
828
|
+
loading && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Spinner, {})
|
|
829
|
+
] });
|
|
830
|
+
}
|
|
746
831
|
// Annotate the CommonJS export names for ESM import in node:
|
|
747
832
|
0 && (module.exports = {
|
|
833
|
+
Button,
|
|
748
834
|
Calendar,
|
|
749
835
|
DatePicker,
|
|
750
|
-
DateRangePicker
|
|
751
|
-
VERSION
|
|
836
|
+
DateRangePicker
|
|
752
837
|
});
|
|
753
838
|
//# sourceMappingURL=index.cjs.map
|