@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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # [@artemy-tech/datepicker](https://www.npmjs.com/package/@artemy-tech/datepicker)
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@artemy-tech/datepicker?color=blue)](https://www.npmjs.com/package/@artemy-tech/datepicker)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@artemy-tech/datepicker?color=green)](https://www.npmjs.com/package/@artemy-tech/datepicker)
5
+ [![CI](https://github.com/artemydottech/datepicker/actions/workflows/ci.yml/badge.svg)](https://github.com/artemydottech/datepicker/actions/workflows/ci.yml)
6
+ [![codecov](https://codecov.io/gh/artemydottech/datepicker/branch/main/graph/badge.svg)](https://codecov.io/gh/artemydottech/datepicker)
7
+ [![bundle size](https://img.shields.io/bundlephobia/minzip/@artemy-tech/datepicker)](https://bundlephobia.com/package/@artemy-tech/datepicker)
8
+ [![license](https://img.shields.io/npm/l/@artemy-tech/datepicker)](https://github.com/artemydottech/datepicker/blob/main/LICENSE)
9
+
3
10
  React DatePicker с опциональной поддержкой react-hook-form. Построен на базе [react-day-picker v9](https://daypicker.dev/) (headless) и [date-fns v3](https://date-fns.org/).
4
11
 
5
12
  ## Возможности
@@ -13,7 +13,7 @@ function Calendar({ className, ...props }) {
13
13
 
14
14
  // src/components/DatePicker/DatePicker.tsx
15
15
  import { useCallback, useEffect as useEffect3, useRef as useRef2, useState } from "react";
16
- import { format, isValid, parse, startOfDay } from "date-fns";
16
+ import { format as format2, isValid as isValid2, startOfDay } from "date-fns";
17
17
  import { ru } from "date-fns/locale";
18
18
 
19
19
  // src/hooks/useClickOutside.ts
@@ -86,8 +86,8 @@ function Spinner() {
86
86
  return /* @__PURE__ */ jsx4("span", { className: "datepicker-spinner", "aria-hidden": "true" });
87
87
  }
88
88
 
89
- // src/components/DatePicker/DatePicker.tsx
90
- import { Fragment, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
89
+ // src/utils/date-mask.ts
90
+ import { format, isValid, parse } from "date-fns";
91
91
  var DATE_FORMAT = "dd.MM.yyyy";
92
92
  function resolveTimeFormat(showTime) {
93
93
  if (!showTime) return null;
@@ -136,6 +136,9 @@ function parseDateTime(masked, dateFormat, maxDigits) {
136
136
  if (!isValid(date) || format(date, dateFormat) !== masked) return void 0;
137
137
  return maxDigits === 8 ? toDateOnly(date) : date;
138
138
  }
139
+
140
+ // src/components/DatePicker/DatePicker.tsx
141
+ import { Fragment, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
139
142
  function DatePicker({
140
143
  value,
141
144
  defaultValue,
@@ -172,9 +175,10 @@ function DatePicker({
172
175
  const [internalDate, setInternalDate] = useState(defaultValue);
173
176
  const [open, setOpen] = useState(false);
174
177
  const [focused, setFocused] = useState(false);
175
- const [inputValue, setInputValue] = useState(
176
- () => defaultValue && isValid(defaultValue) ? format(defaultValue, dateFormat) : ""
177
- );
178
+ const [inputValue, setInputValue] = useState(() => {
179
+ const initial = value != null ? value : defaultValue;
180
+ return initial && isValid2(initial) ? format2(initial, dateFormat) : "";
181
+ });
178
182
  const [inputInvalid, setInputInvalid] = useState(false);
179
183
  const inputRef = useRef2(null);
180
184
  const containerRef = useRef2(null);
@@ -192,7 +196,7 @@ function DatePicker({
192
196
  const valueTime = (_c = value == null ? void 0 : value.getTime()) != null ? _c : null;
193
197
  if (valueTime === lastTime) return;
194
198
  if (!wasControlledRef.current && value === void 0) return;
195
- const formatted = value && isValid(value) ? format(value, dateFormat) : "";
199
+ const formatted = value && isValid2(value) ? format2(value, dateFormat) : "";
196
200
  setInputValue(formatted);
197
201
  lastValidRef.current = formatted;
198
202
  setInputInvalid(false);
@@ -278,14 +282,14 @@ function DatePicker({
278
282
  });
279
283
  }
280
284
  function handleCalendarSelect(date) {
281
- if (!date || !isValid(date)) {
285
+ if (!date || !isValid2(date)) {
282
286
  applyValid("", void 0);
283
287
  if (!timeFormat) setOpen(false);
284
288
  return;
285
289
  }
286
290
  let dateToCommit;
287
291
  if (timeFormat) {
288
- const base = selected && isValid(selected) ? selected : /* @__PURE__ */ new Date(0);
292
+ const base = selected && isValid2(selected) ? selected : /* @__PURE__ */ new Date(0);
289
293
  dateToCommit = new Date(
290
294
  date.getFullYear(),
291
295
  date.getMonth(),
@@ -297,13 +301,13 @@ function DatePicker({
297
301
  } else {
298
302
  dateToCommit = toDateOnly(date);
299
303
  }
300
- applyValid(format(dateToCommit, dateFormat), dateToCommit);
304
+ applyValid(format2(dateToCommit, dateFormat), dateToCommit);
301
305
  if (!timeFormat) setOpen(false);
302
306
  }
303
307
  function handleTimeChange(h, m, s) {
304
- const base = selected && isValid(selected) ? selected : /* @__PURE__ */ new Date();
308
+ const base = selected && isValid2(selected) ? selected : /* @__PURE__ */ new Date();
305
309
  const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s);
306
- applyValid(format(newDate, dateFormat), newDate);
310
+ applyValid(format2(newDate, dateFormat), newDate);
307
311
  }
308
312
  const interactive = !disabled && !loading;
309
313
  return /* @__PURE__ */ jsxs3(
@@ -430,9 +434,11 @@ import {
430
434
  useRef as useRef3,
431
435
  useState as useState2
432
436
  } from "react";
433
- import { format as format2, isValid as isValid2, parse as parse2, startOfDay as startOfDay2 } from "date-fns";
437
+ import { startOfDay as startOfDay2 } from "date-fns";
434
438
  import { ru as ru2 } from "date-fns/locale";
435
- import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
439
+
440
+ // src/utils/range-mask.ts
441
+ import { format as format3, isValid as isValid3, parse as parse2 } from "date-fns";
436
442
  var DATE_FORMAT2 = "dd.MM.yyyy";
437
443
  function applyDateMask(digits) {
438
444
  const d = digits.slice(0, 8);
@@ -467,20 +473,23 @@ function toDateOnly2(date) {
467
473
  function parseDate(masked) {
468
474
  if (masked.replace(/\D/g, "").length !== 8) return void 0;
469
475
  const date = parse2(masked, DATE_FORMAT2, /* @__PURE__ */ new Date());
470
- if (!isValid2(date) || format2(date, DATE_FORMAT2) !== masked) return void 0;
476
+ if (!isValid3(date) || format3(date, DATE_FORMAT2) !== masked) return void 0;
471
477
  return toDateOnly2(date);
472
478
  }
473
479
  function formatRange(from, to) {
474
480
  if (!from) return "";
475
- const fromStr = format2(from, DATE_FORMAT2);
481
+ const fromStr = format3(from, DATE_FORMAT2);
476
482
  if (!to) return fromStr;
477
- return `${fromStr} \u2014 ${format2(to, DATE_FORMAT2)}`;
483
+ return `${fromStr} \u2014 ${format3(to, DATE_FORMAT2)}`;
478
484
  }
479
485
  function resolveShowSeconds(showTime) {
480
486
  if (!showTime) return false;
481
487
  if (showTime === true) return true;
482
488
  return showTime.format === "HH:mm:ss";
483
489
  }
490
+
491
+ // src/components/DateRangePicker/DateRangePicker.tsx
492
+ import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
484
493
  function DateRangePicker({
485
494
  value,
486
495
  defaultValue,
@@ -513,9 +522,10 @@ function DateRangePicker({
513
522
  const [internalTo, setInternalTo] = useState2(
514
523
  defaultValue == null ? void 0 : defaultValue.to
515
524
  );
516
- const [inputValue, setInputValue] = useState2(
517
- () => formatRange(defaultValue == null ? void 0 : defaultValue.from, defaultValue == null ? void 0 : defaultValue.to)
518
- );
525
+ const [inputValue, setInputValue] = useState2(() => {
526
+ const initial = value != null ? value : defaultValue;
527
+ return formatRange(initial == null ? void 0 : initial.from, initial == null ? void 0 : initial.to);
528
+ });
519
529
  const [inputInvalid, setInputInvalid] = useState2(false);
520
530
  const [open, setOpen] = useState2(false);
521
531
  const [focused, setFocused] = useState2(false);
@@ -578,7 +588,7 @@ function DateRangePicker({
578
588
  setInternalFrom(from);
579
589
  setInternalTo(void 0);
580
590
  }
581
- setInputValue(format2(day, DATE_FORMAT2));
591
+ setInputValue(formatRange(from, void 0));
582
592
  setInputInvalid(false);
583
593
  lastEmittedFromRef.current = from;
584
594
  lastEmittedToRef.current = void 0;
@@ -879,4 +889,4 @@ export {
879
889
  DatePicker,
880
890
  DateRangePicker
881
891
  };
882
- //# sourceMappingURL=chunk-TVBIHMGX.js.map
892
+ //# sourceMappingURL=chunk-AITGMET4.js.map
@@ -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/utils/date-mask.ts","../src/components/DateRangePicker/DateRangePicker.tsx","../src/utils/range-mask.ts"],"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, 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"],"mappings":"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","names":["useEffect","useRef","format","isValid","useEffect","jsx","jsx","jsxs","jsx","jsx","jsxs","isValid","format","useRef","useEffect","_a","useCallback","useEffect","useRef","useState","startOfDay","ru","format","isValid","parse","DATE_FORMAT","toDateOnly","Fragment","jsx","jsxs","startOfDay","useState","useRef","useCallback","useEffect","toDateOnly","_a","ru"]}
package/dist/index.cjs CHANGED
@@ -42,7 +42,7 @@ function Calendar({ className, ...props }) {
42
42
 
43
43
  // src/components/DatePicker/DatePicker.tsx
44
44
  var import_react3 = require("react");
45
- var import_date_fns = require("date-fns");
45
+ var import_date_fns2 = require("date-fns");
46
46
  var import_locale = require("date-fns/locale");
47
47
 
48
48
  // src/hooks/useClickOutside.ts
@@ -115,8 +115,8 @@ function Spinner() {
115
115
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "datepicker-spinner", "aria-hidden": "true" });
116
116
  }
117
117
 
118
- // src/components/DatePicker/DatePicker.tsx
119
- var import_jsx_runtime5 = require("react/jsx-runtime");
118
+ // src/utils/date-mask.ts
119
+ var import_date_fns = require("date-fns");
120
120
  var DATE_FORMAT = "dd.MM.yyyy";
121
121
  function resolveTimeFormat(showTime) {
122
122
  if (!showTime) return null;
@@ -165,6 +165,9 @@ function parseDateTime(masked, dateFormat, maxDigits) {
165
165
  if (!(0, import_date_fns.isValid)(date) || (0, import_date_fns.format)(date, dateFormat) !== masked) return void 0;
166
166
  return maxDigits === 8 ? toDateOnly(date) : date;
167
167
  }
168
+
169
+ // src/components/DatePicker/DatePicker.tsx
170
+ var import_jsx_runtime5 = require("react/jsx-runtime");
168
171
  function DatePicker({
169
172
  value,
170
173
  defaultValue,
@@ -190,8 +193,8 @@ function DatePicker({
190
193
  const maxDigits = buildMaxDigits(timeFormat);
191
194
  const defaultPlaceholder = placeholder != null ? placeholder : buildPlaceholder(timeFormat);
192
195
  const showSeconds = timeFormat === "HH:mm:ss";
193
- const fromDay = fromDate ? (0, import_date_fns.startOfDay)(fromDate) : void 0;
194
- const toDay = toDate ? (0, import_date_fns.startOfDay)(toDate) : void 0;
196
+ const fromDay = fromDate ? (0, import_date_fns2.startOfDay)(fromDate) : void 0;
197
+ const toDay = toDate ? (0, import_date_fns2.startOfDay)(toDate) : void 0;
195
198
  const disabledDays = [
196
199
  ...fromDay ? [{ before: fromDay }] : [],
197
200
  ...toDay ? [{ after: toDay }] : []
@@ -201,9 +204,10 @@ function DatePicker({
201
204
  const [internalDate, setInternalDate] = (0, import_react3.useState)(defaultValue);
202
205
  const [open, setOpen] = (0, import_react3.useState)(false);
203
206
  const [focused, setFocused] = (0, import_react3.useState)(false);
204
- const [inputValue, setInputValue] = (0, import_react3.useState)(
205
- () => defaultValue && (0, import_date_fns.isValid)(defaultValue) ? (0, import_date_fns.format)(defaultValue, dateFormat) : ""
206
- );
207
+ const [inputValue, setInputValue] = (0, import_react3.useState)(() => {
208
+ const initial = value != null ? value : defaultValue;
209
+ return initial && (0, import_date_fns2.isValid)(initial) ? (0, import_date_fns2.format)(initial, dateFormat) : "";
210
+ });
207
211
  const [inputInvalid, setInputInvalid] = (0, import_react3.useState)(false);
208
212
  const inputRef = (0, import_react3.useRef)(null);
209
213
  const containerRef = (0, import_react3.useRef)(null);
@@ -221,7 +225,7 @@ function DatePicker({
221
225
  const valueTime = (_c = value == null ? void 0 : value.getTime()) != null ? _c : null;
222
226
  if (valueTime === lastTime) return;
223
227
  if (!wasControlledRef.current && value === void 0) return;
224
- const formatted = value && (0, import_date_fns.isValid)(value) ? (0, import_date_fns.format)(value, dateFormat) : "";
228
+ const formatted = value && (0, import_date_fns2.isValid)(value) ? (0, import_date_fns2.format)(value, dateFormat) : "";
225
229
  setInputValue(formatted);
226
230
  lastValidRef.current = formatted;
227
231
  setInputInvalid(false);
@@ -307,14 +311,14 @@ function DatePicker({
307
311
  });
308
312
  }
309
313
  function handleCalendarSelect(date) {
310
- if (!date || !(0, import_date_fns.isValid)(date)) {
314
+ if (!date || !(0, import_date_fns2.isValid)(date)) {
311
315
  applyValid("", void 0);
312
316
  if (!timeFormat) setOpen(false);
313
317
  return;
314
318
  }
315
319
  let dateToCommit;
316
320
  if (timeFormat) {
317
- const base = selected && (0, import_date_fns.isValid)(selected) ? selected : /* @__PURE__ */ new Date(0);
321
+ const base = selected && (0, import_date_fns2.isValid)(selected) ? selected : /* @__PURE__ */ new Date(0);
318
322
  dateToCommit = new Date(
319
323
  date.getFullYear(),
320
324
  date.getMonth(),
@@ -326,13 +330,13 @@ function DatePicker({
326
330
  } else {
327
331
  dateToCommit = toDateOnly(date);
328
332
  }
329
- applyValid((0, import_date_fns.format)(dateToCommit, dateFormat), dateToCommit);
333
+ applyValid((0, import_date_fns2.format)(dateToCommit, dateFormat), dateToCommit);
330
334
  if (!timeFormat) setOpen(false);
331
335
  }
332
336
  function handleTimeChange(h, m, s) {
333
- const base = selected && (0, import_date_fns.isValid)(selected) ? selected : /* @__PURE__ */ new Date();
337
+ const base = selected && (0, import_date_fns2.isValid)(selected) ? selected : /* @__PURE__ */ new Date();
334
338
  const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s);
335
- applyValid((0, import_date_fns.format)(newDate, dateFormat), newDate);
339
+ applyValid((0, import_date_fns2.format)(newDate, dateFormat), newDate);
336
340
  }
337
341
  const interactive = !disabled && !loading;
338
342
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
@@ -454,9 +458,11 @@ function DatePicker({
454
458
 
455
459
  // src/components/DateRangePicker/DateRangePicker.tsx
456
460
  var import_react4 = require("react");
457
- var import_date_fns2 = require("date-fns");
461
+ var import_date_fns4 = require("date-fns");
458
462
  var import_locale2 = require("date-fns/locale");
459
- var import_jsx_runtime6 = require("react/jsx-runtime");
463
+
464
+ // src/utils/range-mask.ts
465
+ var import_date_fns3 = require("date-fns");
460
466
  var DATE_FORMAT2 = "dd.MM.yyyy";
461
467
  function applyDateMask(digits) {
462
468
  const d = digits.slice(0, 8);
@@ -490,21 +496,24 @@ function toDateOnly2(date) {
490
496
  }
491
497
  function parseDate(masked) {
492
498
  if (masked.replace(/\D/g, "").length !== 8) return void 0;
493
- const date = (0, import_date_fns2.parse)(masked, DATE_FORMAT2, /* @__PURE__ */ new Date());
494
- if (!(0, import_date_fns2.isValid)(date) || (0, import_date_fns2.format)(date, DATE_FORMAT2) !== masked) return void 0;
499
+ const date = (0, import_date_fns3.parse)(masked, DATE_FORMAT2, /* @__PURE__ */ new Date());
500
+ if (!(0, import_date_fns3.isValid)(date) || (0, import_date_fns3.format)(date, DATE_FORMAT2) !== masked) return void 0;
495
501
  return toDateOnly2(date);
496
502
  }
497
503
  function formatRange(from, to) {
498
504
  if (!from) return "";
499
- const fromStr = (0, import_date_fns2.format)(from, DATE_FORMAT2);
505
+ const fromStr = (0, import_date_fns3.format)(from, DATE_FORMAT2);
500
506
  if (!to) return fromStr;
501
- return `${fromStr} \u2014 ${(0, import_date_fns2.format)(to, DATE_FORMAT2)}`;
507
+ return `${fromStr} \u2014 ${(0, import_date_fns3.format)(to, DATE_FORMAT2)}`;
502
508
  }
503
509
  function resolveShowSeconds(showTime) {
504
510
  if (!showTime) return false;
505
511
  if (showTime === true) return true;
506
512
  return showTime.format === "HH:mm:ss";
507
513
  }
514
+
515
+ // src/components/DateRangePicker/DateRangePicker.tsx
516
+ var import_jsx_runtime6 = require("react/jsx-runtime");
508
517
  function DateRangePicker({
509
518
  value,
510
519
  defaultValue,
@@ -525,8 +534,8 @@ function DateRangePicker({
525
534
  const resolvedIcon = loading ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Spinner, {}) : icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CalendarIcon, {});
526
535
  const isControlled = value !== void 0;
527
536
  const showSeconds = resolveShowSeconds(showTime);
528
- const fromDay = fromConstraint ? (0, import_date_fns2.startOfDay)(fromConstraint) : void 0;
529
- const toDay = toConstraint ? (0, import_date_fns2.startOfDay)(toConstraint) : void 0;
537
+ const fromDay = fromConstraint ? (0, import_date_fns4.startOfDay)(fromConstraint) : void 0;
538
+ const toDay = toConstraint ? (0, import_date_fns4.startOfDay)(toConstraint) : void 0;
530
539
  const disabledDays = [
531
540
  ...fromDay ? [{ before: fromDay }] : [],
532
541
  ...toDay ? [{ after: toDay }] : []
@@ -537,9 +546,10 @@ function DateRangePicker({
537
546
  const [internalTo, setInternalTo] = (0, import_react4.useState)(
538
547
  defaultValue == null ? void 0 : defaultValue.to
539
548
  );
540
- const [inputValue, setInputValue] = (0, import_react4.useState)(
541
- () => formatRange(defaultValue == null ? void 0 : defaultValue.from, defaultValue == null ? void 0 : defaultValue.to)
542
- );
549
+ const [inputValue, setInputValue] = (0, import_react4.useState)(() => {
550
+ const initial = value != null ? value : defaultValue;
551
+ return formatRange(initial == null ? void 0 : initial.from, initial == null ? void 0 : initial.to);
552
+ });
543
553
  const [inputInvalid, setInputInvalid] = (0, import_react4.useState)(false);
544
554
  const [open, setOpen] = (0, import_react4.useState)(false);
545
555
  const [focused, setFocused] = (0, import_react4.useState)(false);
@@ -602,7 +612,7 @@ function DateRangePicker({
602
612
  setInternalFrom(from);
603
613
  setInternalTo(void 0);
604
614
  }
605
- setInputValue((0, import_date_fns2.format)(day, DATE_FORMAT2));
615
+ setInputValue(formatRange(from, void 0));
606
616
  setInputInvalid(false);
607
617
  lastEmittedFromRef.current = from;
608
618
  lastEmittedToRef.current = void 0;