@artemy-tech/datepicker 0.4.4 → 0.5.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/README.md +7 -0
- package/dist/{chunk-TVBIHMGX.js → chunk-AITGMET4.js} +32 -22
- package/dist/chunk-AITGMET4.js.map +1 -0
- package/dist/index.cjs +36 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/rhf.cjs +36 -26
- package/dist/rhf.cjs.map +1 -1
- package/dist/rhf.js +1 -1
- package/package.json +14 -4
- package/dist/chunk-TVBIHMGX.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -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 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 { 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 { 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 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 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 { 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":"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","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
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
|
|
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/
|
|
120
|
-
var
|
|
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,
|
|
195
|
-
const toDay = toDate ? (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
|
-
|
|
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);
|
|
@@ -222,7 +226,7 @@ function DatePicker({
|
|
|
222
226
|
const valueTime = (_c = value == null ? void 0 : value.getTime()) != null ? _c : null;
|
|
223
227
|
if (valueTime === lastTime) return;
|
|
224
228
|
if (!wasControlledRef.current && value === void 0) return;
|
|
225
|
-
const formatted = value && (0,
|
|
229
|
+
const formatted = value && (0, import_date_fns2.isValid)(value) ? (0, import_date_fns2.format)(value, dateFormat) : "";
|
|
226
230
|
setInputValue(formatted);
|
|
227
231
|
lastValidRef.current = formatted;
|
|
228
232
|
setInputInvalid(false);
|
|
@@ -308,14 +312,14 @@ function DatePicker({
|
|
|
308
312
|
});
|
|
309
313
|
}
|
|
310
314
|
function handleCalendarSelect(date) {
|
|
311
|
-
if (!date || !(0,
|
|
315
|
+
if (!date || !(0, import_date_fns2.isValid)(date)) {
|
|
312
316
|
applyValid("", void 0);
|
|
313
317
|
if (!timeFormat) setOpen(false);
|
|
314
318
|
return;
|
|
315
319
|
}
|
|
316
320
|
let dateToCommit;
|
|
317
321
|
if (timeFormat) {
|
|
318
|
-
const base = selected && (0,
|
|
322
|
+
const base = selected && (0, import_date_fns2.isValid)(selected) ? selected : /* @__PURE__ */ new Date(0);
|
|
319
323
|
dateToCommit = new Date(
|
|
320
324
|
date.getFullYear(),
|
|
321
325
|
date.getMonth(),
|
|
@@ -327,13 +331,13 @@ function DatePicker({
|
|
|
327
331
|
} else {
|
|
328
332
|
dateToCommit = toDateOnly(date);
|
|
329
333
|
}
|
|
330
|
-
applyValid((0,
|
|
334
|
+
applyValid((0, import_date_fns2.format)(dateToCommit, dateFormat), dateToCommit);
|
|
331
335
|
if (!timeFormat) setOpen(false);
|
|
332
336
|
}
|
|
333
337
|
function handleTimeChange(h, m, s) {
|
|
334
|
-
const base = selected && (0,
|
|
338
|
+
const base = selected && (0, import_date_fns2.isValid)(selected) ? selected : /* @__PURE__ */ new Date();
|
|
335
339
|
const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s);
|
|
336
|
-
applyValid((0,
|
|
340
|
+
applyValid((0, import_date_fns2.format)(newDate, dateFormat), newDate);
|
|
337
341
|
}
|
|
338
342
|
const interactive = !disabled && !loading;
|
|
339
343
|
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
@@ -476,9 +480,11 @@ var import_react_hook_form2 = require("react-hook-form");
|
|
|
476
480
|
|
|
477
481
|
// src/components/DateRangePicker/DateRangePicker.tsx
|
|
478
482
|
var import_react4 = require("react");
|
|
479
|
-
var
|
|
483
|
+
var import_date_fns4 = require("date-fns");
|
|
480
484
|
var import_locale2 = require("date-fns/locale");
|
|
481
|
-
|
|
485
|
+
|
|
486
|
+
// src/utils/range-mask.ts
|
|
487
|
+
var import_date_fns3 = require("date-fns");
|
|
482
488
|
var DATE_FORMAT2 = "dd.MM.yyyy";
|
|
483
489
|
function applyDateMask(digits) {
|
|
484
490
|
const d = digits.slice(0, 8);
|
|
@@ -512,21 +518,24 @@ function toDateOnly2(date) {
|
|
|
512
518
|
}
|
|
513
519
|
function parseDate(masked) {
|
|
514
520
|
if (masked.replace(/\D/g, "").length !== 8) return void 0;
|
|
515
|
-
const date = (0,
|
|
516
|
-
if (!(0,
|
|
521
|
+
const date = (0, import_date_fns3.parse)(masked, DATE_FORMAT2, /* @__PURE__ */ new Date());
|
|
522
|
+
if (!(0, import_date_fns3.isValid)(date) || (0, import_date_fns3.format)(date, DATE_FORMAT2) !== masked) return void 0;
|
|
517
523
|
return toDateOnly2(date);
|
|
518
524
|
}
|
|
519
525
|
function formatRange(from, to) {
|
|
520
526
|
if (!from) return "";
|
|
521
|
-
const fromStr = (0,
|
|
527
|
+
const fromStr = (0, import_date_fns3.format)(from, DATE_FORMAT2);
|
|
522
528
|
if (!to) return fromStr;
|
|
523
|
-
return `${fromStr} \u2014 ${(0,
|
|
529
|
+
return `${fromStr} \u2014 ${(0, import_date_fns3.format)(to, DATE_FORMAT2)}`;
|
|
524
530
|
}
|
|
525
531
|
function resolveShowSeconds(showTime) {
|
|
526
532
|
if (!showTime) return false;
|
|
527
533
|
if (showTime === true) return true;
|
|
528
534
|
return showTime.format === "HH:mm:ss";
|
|
529
535
|
}
|
|
536
|
+
|
|
537
|
+
// src/components/DateRangePicker/DateRangePicker.tsx
|
|
538
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
530
539
|
function DateRangePicker({
|
|
531
540
|
value,
|
|
532
541
|
defaultValue,
|
|
@@ -547,8 +556,8 @@ function DateRangePicker({
|
|
|
547
556
|
const resolvedIcon = loading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Spinner, {}) : icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CalendarIcon, {});
|
|
548
557
|
const isControlled = value !== void 0;
|
|
549
558
|
const showSeconds = resolveShowSeconds(showTime);
|
|
550
|
-
const fromDay = fromConstraint ? (0,
|
|
551
|
-
const toDay = toConstraint ? (0,
|
|
559
|
+
const fromDay = fromConstraint ? (0, import_date_fns4.startOfDay)(fromConstraint) : void 0;
|
|
560
|
+
const toDay = toConstraint ? (0, import_date_fns4.startOfDay)(toConstraint) : void 0;
|
|
552
561
|
const disabledDays = [
|
|
553
562
|
...fromDay ? [{ before: fromDay }] : [],
|
|
554
563
|
...toDay ? [{ after: toDay }] : []
|
|
@@ -559,9 +568,10 @@ function DateRangePicker({
|
|
|
559
568
|
const [internalTo, setInternalTo] = (0, import_react4.useState)(
|
|
560
569
|
defaultValue == null ? void 0 : defaultValue.to
|
|
561
570
|
);
|
|
562
|
-
const [inputValue, setInputValue] = (0, import_react4.useState)(
|
|
563
|
-
|
|
564
|
-
|
|
571
|
+
const [inputValue, setInputValue] = (0, import_react4.useState)(() => {
|
|
572
|
+
const initial = value != null ? value : defaultValue;
|
|
573
|
+
return formatRange(initial == null ? void 0 : initial.from, initial == null ? void 0 : initial.to);
|
|
574
|
+
});
|
|
565
575
|
const [inputInvalid, setInputInvalid] = (0, import_react4.useState)(false);
|
|
566
576
|
const [open, setOpen] = (0, import_react4.useState)(false);
|
|
567
577
|
const [focused, setFocused] = (0, import_react4.useState)(false);
|
|
@@ -624,7 +634,7 @@ function DateRangePicker({
|
|
|
624
634
|
setInternalFrom(from);
|
|
625
635
|
setInternalTo(void 0);
|
|
626
636
|
}
|
|
627
|
-
setInputValue((
|
|
637
|
+
setInputValue(formatRange(from, void 0));
|
|
628
638
|
setInputInvalid(false);
|
|
629
639
|
lastEmittedFromRef.current = from;
|
|
630
640
|
lastEmittedToRef.current = void 0;
|