@artemy-tech/datepicker 0.4.0 → 0.4.1
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 +165 -13
- package/dist/{DateRangePicker-Bp95dxDX.d.cts → DateRangePicker-uJd_I9OI.d.cts} +26 -3
- package/dist/{DateRangePicker-Bp95dxDX.d.ts → DateRangePicker-uJd_I9OI.d.ts} +26 -3
- package/dist/{chunk-DQSX6QKR.js → chunk-IIIOWD5F.js} +144 -44
- package/dist/chunk-IIIOWD5F.js.map +1 -0
- package/dist/index.cjs +134 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/rhf.cjs +134 -39
- package/dist/rhf.cjs.map +1 -1
- package/dist/rhf.d.cts +1 -1
- package/dist/rhf.d.ts +1 -1
- package/dist/rhf.js +1 -1
- package/package.json +2 -1
- package/dist/chunk-DQSX6QKR.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -156,10 +156,14 @@ function getCursorPos(masked, digitCount) {
|
|
|
156
156
|
}
|
|
157
157
|
return masked.length;
|
|
158
158
|
}
|
|
159
|
+
function toDateOnly(date) {
|
|
160
|
+
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0);
|
|
161
|
+
}
|
|
159
162
|
function parseDateTime(masked, dateFormat, maxDigits) {
|
|
160
163
|
if (masked.replace(/\D/g, "").length !== maxDigits) return void 0;
|
|
161
164
|
const date = (0, import_date_fns.parse)(masked, dateFormat, /* @__PURE__ */ new Date());
|
|
162
|
-
|
|
165
|
+
if (!(0, import_date_fns.isValid)(date) || (0, import_date_fns.format)(date, dateFormat) !== masked) return void 0;
|
|
166
|
+
return maxDigits === 8 ? toDateOnly(date) : date;
|
|
163
167
|
}
|
|
164
168
|
function DatePicker({
|
|
165
169
|
value,
|
|
@@ -177,13 +181,21 @@ function DatePicker({
|
|
|
177
181
|
showTime,
|
|
178
182
|
icon,
|
|
179
183
|
iconPosition = "end",
|
|
180
|
-
className
|
|
184
|
+
className,
|
|
185
|
+
renderInput,
|
|
186
|
+
customInput
|
|
181
187
|
}) {
|
|
182
188
|
const timeFormat = resolveTimeFormat(showTime);
|
|
183
189
|
const dateFormat = buildDateFormat(timeFormat);
|
|
184
190
|
const maxDigits = buildMaxDigits(timeFormat);
|
|
185
191
|
const defaultPlaceholder = placeholder != null ? placeholder : buildPlaceholder(timeFormat);
|
|
186
192
|
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;
|
|
195
|
+
const disabledDays = [
|
|
196
|
+
...fromDay ? [{ before: fromDay }] : [],
|
|
197
|
+
...toDay ? [{ after: toDay }] : []
|
|
198
|
+
];
|
|
187
199
|
const resolvedIcon = loading ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Spinner, {}) : icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CalendarIcon, {});
|
|
188
200
|
const isControlled = value !== void 0;
|
|
189
201
|
const [internalDate, setInternalDate] = (0, import_react3.useState)(defaultValue);
|
|
@@ -300,7 +312,7 @@ function DatePicker({
|
|
|
300
312
|
if (!timeFormat) setOpen(false);
|
|
301
313
|
return;
|
|
302
314
|
}
|
|
303
|
-
let dateToCommit
|
|
315
|
+
let dateToCommit;
|
|
304
316
|
if (timeFormat) {
|
|
305
317
|
const base = selected && (0, import_date_fns.isValid)(selected) ? selected : /* @__PURE__ */ new Date(0);
|
|
306
318
|
dateToCommit = new Date(
|
|
@@ -311,6 +323,8 @@ function DatePicker({
|
|
|
311
323
|
base.getMinutes(),
|
|
312
324
|
base.getSeconds()
|
|
313
325
|
);
|
|
326
|
+
} else {
|
|
327
|
+
dateToCommit = toDateOnly(date);
|
|
314
328
|
}
|
|
315
329
|
applyValid((0, import_date_fns.format)(dateToCommit, dateFormat), dateToCommit);
|
|
316
330
|
if (!timeFormat) setOpen(false);
|
|
@@ -331,10 +345,13 @@ function DatePicker({
|
|
|
331
345
|
"data-failed": failed || inputInvalid || void 0,
|
|
332
346
|
"data-disabled": !interactive || void 0,
|
|
333
347
|
children: [
|
|
334
|
-
|
|
348
|
+
customInput ? (0, import_react3.cloneElement)(customInput, {
|
|
349
|
+
value: inputValue,
|
|
350
|
+
onClick: () => interactive && setOpen((prev) => !prev)
|
|
351
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
335
352
|
"div",
|
|
336
353
|
{
|
|
337
|
-
className: "datepicker__field",
|
|
354
|
+
className: ["datepicker__field", renderInput ? "datepicker__field--custom" : ""].filter(Boolean).join(" "),
|
|
338
355
|
"data-icon-start": resolvedIcon && iconPosition === "start" ? true : void 0,
|
|
339
356
|
"data-icon-end": resolvedIcon && iconPosition === "end" ? true : void 0,
|
|
340
357
|
onClick: () => {
|
|
@@ -344,9 +361,8 @@ function DatePicker({
|
|
|
344
361
|
children: [
|
|
345
362
|
resolvedIcon && iconPosition === "start" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "datepicker__icon datepicker__icon--start", children: resolvedIcon }),
|
|
346
363
|
label && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "datepicker__label", children: label }),
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
{
|
|
364
|
+
(() => {
|
|
365
|
+
const inputProps = {
|
|
350
366
|
ref: inputRef,
|
|
351
367
|
type: "text",
|
|
352
368
|
inputMode: "numeric",
|
|
@@ -366,8 +382,11 @@ function DatePicker({
|
|
|
366
382
|
"aria-expanded": !noCalendar ? open : void 0,
|
|
367
383
|
"aria-haspopup": !noCalendar ? "dialog" : void 0,
|
|
368
384
|
"aria-invalid": inputInvalid || void 0
|
|
369
|
-
}
|
|
370
|
-
|
|
385
|
+
};
|
|
386
|
+
if (renderInput) return renderInput(inputProps);
|
|
387
|
+
const { ref, ...rest } = inputProps;
|
|
388
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("input", { ref, ...rest });
|
|
389
|
+
})(),
|
|
371
390
|
resolvedIcon && iconPosition === "end" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "datepicker__icon datepicker__icon--end", children: resolvedIcon })
|
|
372
391
|
]
|
|
373
392
|
}
|
|
@@ -390,8 +409,10 @@ function DatePicker({
|
|
|
390
409
|
mode: "single",
|
|
391
410
|
selected,
|
|
392
411
|
onSelect: handleCalendarSelect,
|
|
393
|
-
startMonth:
|
|
394
|
-
endMonth:
|
|
412
|
+
startMonth: fromDay,
|
|
413
|
+
endMonth: toDay,
|
|
414
|
+
disabled: disabledDays.length ? disabledDays : void 0,
|
|
415
|
+
navLayout: "around",
|
|
395
416
|
locale: import_locale.ru
|
|
396
417
|
}
|
|
397
418
|
) }),
|
|
@@ -420,8 +441,10 @@ function DatePicker({
|
|
|
420
441
|
mode: "single",
|
|
421
442
|
selected,
|
|
422
443
|
onSelect: handleCalendarSelect,
|
|
423
|
-
startMonth:
|
|
424
|
-
endMonth:
|
|
444
|
+
startMonth: fromDay,
|
|
445
|
+
endMonth: toDay,
|
|
446
|
+
disabled: disabledDays.length ? disabledDays : void 0,
|
|
447
|
+
navLayout: "around",
|
|
425
448
|
locale: import_locale.ru
|
|
426
449
|
}
|
|
427
450
|
)
|
|
@@ -465,10 +488,14 @@ function getRangeCursorPos(masked, digitCount) {
|
|
|
465
488
|
}
|
|
466
489
|
return masked.length;
|
|
467
490
|
}
|
|
491
|
+
function toDateOnly2(date) {
|
|
492
|
+
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0);
|
|
493
|
+
}
|
|
468
494
|
function parseDate(masked) {
|
|
469
495
|
if (masked.replace(/\D/g, "").length !== 8) return void 0;
|
|
470
496
|
const date = (0, import_date_fns2.parse)(masked, DATE_FORMAT2, /* @__PURE__ */ new Date());
|
|
471
|
-
|
|
497
|
+
if (!(0, import_date_fns2.isValid)(date) || (0, import_date_fns2.format)(date, DATE_FORMAT2) !== masked) return void 0;
|
|
498
|
+
return toDateOnly2(date);
|
|
472
499
|
}
|
|
473
500
|
function formatRange(from, to) {
|
|
474
501
|
if (!from) return "";
|
|
@@ -492,7 +519,7 @@ function DateRangePicker({
|
|
|
492
519
|
failed = false,
|
|
493
520
|
loading = false,
|
|
494
521
|
size = "m",
|
|
495
|
-
calendarLayout = "
|
|
522
|
+
calendarLayout = "horizontal",
|
|
496
523
|
showTime,
|
|
497
524
|
icon,
|
|
498
525
|
iconPosition = "end",
|
|
@@ -501,8 +528,18 @@ function DateRangePicker({
|
|
|
501
528
|
const resolvedIcon = loading ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Spinner, {}) : icon === false ? null : icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CalendarIcon, {});
|
|
502
529
|
const isControlled = value !== void 0;
|
|
503
530
|
const showSeconds = resolveShowSeconds(showTime);
|
|
504
|
-
const
|
|
505
|
-
const
|
|
531
|
+
const fromDay = fromConstraint ? (0, import_date_fns2.startOfDay)(fromConstraint) : void 0;
|
|
532
|
+
const toDay = toConstraint ? (0, import_date_fns2.startOfDay)(toConstraint) : void 0;
|
|
533
|
+
const disabledDays = [
|
|
534
|
+
...fromDay ? [{ before: fromDay }] : [],
|
|
535
|
+
...toDay ? [{ after: toDay }] : []
|
|
536
|
+
];
|
|
537
|
+
const [internalFrom, setInternalFrom] = (0, import_react4.useState)(
|
|
538
|
+
defaultValue == null ? void 0 : defaultValue.from
|
|
539
|
+
);
|
|
540
|
+
const [internalTo, setInternalTo] = (0, import_react4.useState)(
|
|
541
|
+
defaultValue == null ? void 0 : defaultValue.to
|
|
542
|
+
);
|
|
506
543
|
const [inputValue, setInputValue] = (0, import_react4.useState)(
|
|
507
544
|
() => formatRange(defaultValue == null ? void 0 : defaultValue.from, defaultValue == null ? void 0 : defaultValue.to)
|
|
508
545
|
);
|
|
@@ -513,8 +550,12 @@ function DateRangePicker({
|
|
|
513
550
|
const [hoveredDate, setHoveredDate] = (0, import_react4.useState)(void 0);
|
|
514
551
|
const inputRef = (0, import_react4.useRef)(null);
|
|
515
552
|
const containerRef = (0, import_react4.useRef)(null);
|
|
516
|
-
const lastEmittedFromRef = (0, import_react4.useRef)(
|
|
517
|
-
|
|
553
|
+
const lastEmittedFromRef = (0, import_react4.useRef)(
|
|
554
|
+
value !== void 0 ? value == null ? void 0 : value.from : defaultValue == null ? void 0 : defaultValue.from
|
|
555
|
+
);
|
|
556
|
+
const lastEmittedToRef = (0, import_react4.useRef)(
|
|
557
|
+
value !== void 0 ? value == null ? void 0 : value.to : defaultValue == null ? void 0 : defaultValue.to
|
|
558
|
+
);
|
|
518
559
|
const wasControlledRef = (0, import_react4.useRef)(value !== void 0);
|
|
519
560
|
const confirmedFrom = isControlled ? value == null ? void 0 : value.from : internalFrom;
|
|
520
561
|
const confirmedTo = isControlled ? value == null ? void 0 : value.to : internalTo;
|
|
@@ -558,7 +599,7 @@ function DateRangePicker({
|
|
|
558
599
|
(_a = confirmedFrom == null ? void 0 : confirmedFrom.getHours()) != null ? _a : 0,
|
|
559
600
|
(_b = confirmedFrom == null ? void 0 : confirmedFrom.getMinutes()) != null ? _b : 0,
|
|
560
601
|
(_c = confirmedFrom == null ? void 0 : confirmedFrom.getSeconds()) != null ? _c : 0
|
|
561
|
-
) : day;
|
|
602
|
+
) : toDateOnly2(day);
|
|
562
603
|
setAnchorDate(from);
|
|
563
604
|
if (!isControlled) {
|
|
564
605
|
setInternalFrom(from);
|
|
@@ -577,7 +618,7 @@ function DateRangePicker({
|
|
|
577
618
|
(_d = confirmedTo == null ? void 0 : confirmedTo.getHours()) != null ? _d : 0,
|
|
578
619
|
(_e = confirmedTo == null ? void 0 : confirmedTo.getMinutes()) != null ? _e : 0,
|
|
579
620
|
(_f = confirmedTo == null ? void 0 : confirmedTo.getSeconds()) != null ? _f : 0
|
|
580
|
-
) : day;
|
|
621
|
+
) : toDateOnly2(day);
|
|
581
622
|
if (day < anchorDate) {
|
|
582
623
|
const tmp = from;
|
|
583
624
|
from = to;
|
|
@@ -601,14 +642,28 @@ function DateRangePicker({
|
|
|
601
642
|
}
|
|
602
643
|
function handleFromTimeChange(h, m, s) {
|
|
603
644
|
const base = confirmedFrom != null ? confirmedFrom : /* @__PURE__ */ new Date();
|
|
604
|
-
const newDate = new Date(
|
|
645
|
+
const newDate = new Date(
|
|
646
|
+
base.getFullYear(),
|
|
647
|
+
base.getMonth(),
|
|
648
|
+
base.getDate(),
|
|
649
|
+
h,
|
|
650
|
+
m,
|
|
651
|
+
s
|
|
652
|
+
);
|
|
605
653
|
if (!isControlled) setInternalFrom(newDate);
|
|
606
654
|
lastEmittedFromRef.current = newDate;
|
|
607
655
|
onChange == null ? void 0 : onChange({ from: newDate, to: confirmedTo });
|
|
608
656
|
}
|
|
609
657
|
function handleToTimeChange(h, m, s) {
|
|
610
658
|
const base = confirmedTo != null ? confirmedTo : /* @__PURE__ */ new Date();
|
|
611
|
-
const newDate = new Date(
|
|
659
|
+
const newDate = new Date(
|
|
660
|
+
base.getFullYear(),
|
|
661
|
+
base.getMonth(),
|
|
662
|
+
base.getDate(),
|
|
663
|
+
h,
|
|
664
|
+
m,
|
|
665
|
+
s
|
|
666
|
+
);
|
|
612
667
|
if (!isControlled) setInternalTo(newDate);
|
|
613
668
|
lastEmittedToRef.current = newDate;
|
|
614
669
|
onChange == null ? void 0 : onChange({ from: confirmedFrom, to: newDate });
|
|
@@ -637,7 +692,9 @@ function DateRangePicker({
|
|
|
637
692
|
}
|
|
638
693
|
lastEmittedFromRef.current = parsedFrom;
|
|
639
694
|
lastEmittedToRef.current = parsedTo;
|
|
640
|
-
onChange == null ? void 0 : onChange(
|
|
695
|
+
onChange == null ? void 0 : onChange(
|
|
696
|
+
parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : void 0
|
|
697
|
+
);
|
|
641
698
|
requestAnimationFrame(
|
|
642
699
|
() => {
|
|
643
700
|
var _a2;
|
|
@@ -661,9 +718,13 @@ function DateRangePicker({
|
|
|
661
718
|
const val = input.value;
|
|
662
719
|
const charsToSkip = (_c = (_b = val.slice(0, pos).match(/[\s—]+$/)) == null ? void 0 : _b[0].length) != null ? _c : 1;
|
|
663
720
|
const newPos = pos - charsToSkip;
|
|
664
|
-
const masked = applyRangeMask(
|
|
721
|
+
const masked = applyRangeMask(
|
|
722
|
+
(val.slice(0, newPos - 1) + val.slice(newPos)).replace(/\D/g, "")
|
|
723
|
+
);
|
|
665
724
|
setInputValue(masked);
|
|
666
|
-
requestAnimationFrame(
|
|
725
|
+
requestAnimationFrame(
|
|
726
|
+
() => input.setSelectionRange(newPos - 1, newPos - 1)
|
|
727
|
+
);
|
|
667
728
|
}
|
|
668
729
|
}
|
|
669
730
|
function handlePaste(e) {
|
|
@@ -676,18 +737,24 @@ function DateRangePicker({
|
|
|
676
737
|
setHoveredDate(void 0);
|
|
677
738
|
const parsedFrom = digits.length >= 8 ? parseDate(applyDateMask(digits.slice(0, 8))) : void 0;
|
|
678
739
|
const parsedTo = digits.length >= 16 ? parseDate(applyDateMask(digits.slice(8, 16))) : void 0;
|
|
679
|
-
setInputInvalid(
|
|
740
|
+
setInputInvalid(
|
|
741
|
+
digits.length >= 8 && !parsedFrom || digits.length >= 16 && !parsedTo
|
|
742
|
+
);
|
|
680
743
|
if (!isControlled) {
|
|
681
744
|
setInternalFrom(parsedFrom);
|
|
682
745
|
setInternalTo(parsedTo);
|
|
683
746
|
}
|
|
684
747
|
lastEmittedFromRef.current = parsedFrom;
|
|
685
748
|
lastEmittedToRef.current = parsedTo;
|
|
686
|
-
onChange == null ? void 0 : onChange(
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
749
|
+
onChange == null ? void 0 : onChange(
|
|
750
|
+
parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : void 0
|
|
751
|
+
);
|
|
752
|
+
requestAnimationFrame(
|
|
753
|
+
() => {
|
|
754
|
+
var _a;
|
|
755
|
+
return (_a = inputRef.current) == null ? void 0 : _a.setSelectionRange(masked.length, masked.length);
|
|
756
|
+
}
|
|
757
|
+
);
|
|
691
758
|
}
|
|
692
759
|
const placeholder = label && !focused && !filled ? void 0 : "\u0434\u0434.\u043C\u043C.\u0433\u0433\u0433\u0433 \u2014 \u0434\u0434.\u043C\u043C.\u0433\u0433\u0433\u0433";
|
|
693
760
|
const interactive = !disabled && !loading;
|
|
@@ -695,7 +762,12 @@ function DateRangePicker({
|
|
|
695
762
|
"div",
|
|
696
763
|
{
|
|
697
764
|
ref: containerRef,
|
|
698
|
-
className: [
|
|
765
|
+
className: [
|
|
766
|
+
"datepicker",
|
|
767
|
+
"daterangepicker",
|
|
768
|
+
`datepicker--${size}`,
|
|
769
|
+
className
|
|
770
|
+
].filter(Boolean).join(" "),
|
|
699
771
|
"data-focused": focused || open || void 0,
|
|
700
772
|
"data-filled": filled || void 0,
|
|
701
773
|
"data-failed": failed || inputInvalid || void 0,
|
|
@@ -764,8 +836,9 @@ function DateRangePicker({
|
|
|
764
836
|
onDayClick: handleDayClick,
|
|
765
837
|
onDayMouseEnter: handleDayMouseEnter,
|
|
766
838
|
onDayMouseLeave: () => setHoveredDate(void 0),
|
|
767
|
-
startMonth:
|
|
768
|
-
endMonth:
|
|
839
|
+
startMonth: fromDay,
|
|
840
|
+
endMonth: toDay,
|
|
841
|
+
disabled: disabledDays.length ? disabledDays : void 0,
|
|
769
842
|
numberOfMonths: 2,
|
|
770
843
|
locale: import_locale2.ru
|
|
771
844
|
}
|
|
@@ -773,15 +846,37 @@ function DateRangePicker({
|
|
|
773
846
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "datepicker__time-row", children: [
|
|
774
847
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "datepicker__time-col", children: [
|
|
775
848
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "datepicker__time-label", children: "\u041D\u0430\u0447\u0430\u043B\u043E" }),
|
|
776
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
849
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
850
|
+
TimePanel,
|
|
851
|
+
{
|
|
852
|
+
value: confirmedFrom,
|
|
853
|
+
showSeconds,
|
|
854
|
+
onChange: handleFromTimeChange
|
|
855
|
+
}
|
|
856
|
+
)
|
|
777
857
|
] }),
|
|
778
858
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "datepicker__time-separator" }),
|
|
779
859
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "datepicker__time-col", children: [
|
|
780
860
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "datepicker__time-label", children: "\u041A\u043E\u043D\u0435\u0446" }),
|
|
781
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
861
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
862
|
+
TimePanel,
|
|
863
|
+
{
|
|
864
|
+
value: confirmedTo,
|
|
865
|
+
showSeconds,
|
|
866
|
+
onChange: handleToTimeChange
|
|
867
|
+
}
|
|
868
|
+
)
|
|
782
869
|
] })
|
|
783
870
|
] }),
|
|
784
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "datepicker__popover-footer", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
871
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "datepicker__popover-footer", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
872
|
+
"button",
|
|
873
|
+
{
|
|
874
|
+
className: "datepicker__ok-btn",
|
|
875
|
+
type: "button",
|
|
876
|
+
onClick: close,
|
|
877
|
+
children: "OK"
|
|
878
|
+
}
|
|
879
|
+
) })
|
|
785
880
|
] }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
786
881
|
Calendar,
|
|
787
882
|
{
|
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 } 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 } from 'date-fns'\nimport { ru } from 'date-fns/locale'\nimport { useClickOutside } from '../../hooks/useClickOutside'\nimport { Calendar } from '../Calendar'\nimport { TimePanel } from '../TimePanel'\nimport { CalendarIcon } from '../icons/CalendarIcon'\nimport { Spinner } from '../icons/Spinner'\n\nexport type DatePickerSize = 's' | 'm' | 'l'\nexport type DatePickerShowTime = boolean | { format: 'HH:mm' | 'HH:mm:ss' }\n\nconst DATE_FORMAT = 'dd.MM.yyyy'\n\nfunction resolveTimeFormat(showTime?: DatePickerShowTime): 'HH:mm' | 'HH:mm:ss' | null {\n if (!showTime) return null\n if (showTime === true) return 'HH:mm:ss'\n return showTime.format\n}\n\nfunction buildDateFormat(timeFormat: string | null) {\n return timeFormat ? `${DATE_FORMAT} ${timeFormat}` : DATE_FORMAT\n}\n\nfunction buildMaxDigits(timeFormat: string | null) {\n if (!timeFormat) return 8\n return timeFormat === 'HH:mm' ? 12 : 14\n}\n\nfunction buildPlaceholder(timeFormat: string | null) {\n if (!timeFormat) return 'дд.мм.гггг'\n return timeFormat === 'HH:mm' ? 'дд.мм.гггг чч:мм' : 'дд.мм.гггг чч:мм:сс'\n}\n\nfunction applyMask(digits: string, maxDigits: number): string {\n const d = digits.slice(0, maxDigits)\n let result = ''\n for (let i = 0; i < d.length; i++) {\n if (i === 2 || i === 4) result += '.'\n else if (i === 8) result += ' '\n else if (i === 10 || i === 12) result += ':'\n result += d[i]\n }\n return result\n}\n\nfunction getCursorPos(masked: string, digitCount: number): number {\n if (digitCount === 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (/\\d/.test(masked[i])) {\n count++\n if (count === digitCount) return i + 1\n }\n }\n return masked.length\n}\n\nfunction parseDateTime(masked: string, dateFormat: string, maxDigits: number): Date | undefined {\n if (masked.replace(/\\D/g, '').length !== maxDigits) return undefined\n const date = parse(masked, dateFormat, new Date())\n return isValid(date) && format(date, dateFormat) === masked ? date : undefined\n}\n\nexport interface DatePickerProps {\n value?: Date\n defaultValue?: Date\n onChange?: (date: Date | undefined) => void\n label?: string\n placeholder?: string\n fromDate?: Date\n toDate?: Date\n disabled?: boolean\n failed?: boolean\n loading?: boolean\n size?: DatePickerSize\n noCalendar?: boolean\n showTime?: DatePickerShowTime\n icon?: ReactNode | false\n iconPosition?: 'start' | 'end'\n className?: string\n}\n\nexport function DatePicker({\n value,\n defaultValue,\n onChange,\n label,\n placeholder,\n fromDate,\n toDate,\n disabled = false,\n failed = false,\n loading = false,\n size = 'm',\n noCalendar = false,\n showTime,\n icon,\n iconPosition = 'end',\n className,\n}: DatePickerProps) {\n const timeFormat = resolveTimeFormat(showTime)\n const dateFormat = buildDateFormat(timeFormat)\n const maxDigits = buildMaxDigits(timeFormat)\n const defaultPlaceholder = placeholder ?? buildPlaceholder(timeFormat)\n const showSeconds = timeFormat === 'HH:mm:ss'\n\n const resolvedIcon = loading ? <Spinner /> : icon === false ? null : (icon ?? <CalendarIcon />)\n\n const isControlled = value !== undefined\n const [internalDate, setInternalDate] = useState<Date | undefined>(defaultValue)\n const [open, setOpen] = useState(false)\n const [focused, setFocused] = useState(false)\n const [inputValue, setInputValue] = useState(() =>\n defaultValue && isValid(defaultValue) ? format(defaultValue, dateFormat) : '',\n )\n const [inputInvalid, setInputInvalid] = useState(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const lastValidRef = useRef(inputValue)\n // Track what we last emitted via onChange so we can ignore parent echoing it back\n const lastEmittedRef = useRef<Date | undefined>(value !== undefined ? value : defaultValue)\n // Once we see a defined value, we always sync external changes (handles RHF reset)\n const wasControlledRef = useRef(value !== undefined)\n\n const selected = isControlled ? value : internalDate\n const filled = inputValue.length > 0\n\n const close = useCallback(() => setOpen(false), [])\n useClickOutside(containerRef, close)\n\n // Sync inputValue when value changes externally (e.g. form reset)\n useEffect(() => {\n if (value !== undefined) wasControlledRef.current = true\n const lastTime = lastEmittedRef.current?.getTime() ?? null\n const valueTime = value?.getTime() ?? null\n if (valueTime === lastTime) return\n if (!wasControlledRef.current && value === undefined) return\n\n const formatted = value && isValid(value) ? format(value, dateFormat) : ''\n setInputValue(formatted)\n lastValidRef.current = formatted\n setInputInvalid(false)\n if (!isControlled) setInternalDate(value)\n lastEmittedRef.current = value\n }, [value]) // eslint-disable-line react-hooks/exhaustive-deps\n\n function applyValid(masked: string, date: Date | undefined) {\n lastEmittedRef.current = date\n lastValidRef.current = masked\n setInputValue(masked)\n setInputInvalid(false)\n if (!isControlled) setInternalDate(date)\n onChange?.(date)\n }\n\n function commit(masked: string) {\n const digits = masked.replace(/\\D/g, '')\n if (digits.length === 0) {\n lastEmittedRef.current = undefined\n lastValidRef.current = ''\n setInputInvalid(false)\n if (!isControlled) setInternalDate(undefined)\n onChange?.(undefined)\n } else if (digits.length === maxDigits) {\n const date = parseDateTime(masked, dateFormat, maxDigits)\n lastEmittedRef.current = date\n if (date) lastValidRef.current = masked\n setInputInvalid(!date)\n if (!isControlled) setInternalDate(date)\n onChange?.(date)\n } else {\n setInputInvalid(false)\n }\n }\n\n function handleBlur() {\n setFocused(false)\n const digits = inputValue.replace(/\\D/g, '')\n if ((digits.length > 0 && digits.length < maxDigits) || inputInvalid) {\n setInputValue(lastValidRef.current)\n setInputInvalid(false)\n }\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const input = e.target\n const cursorPos = input.selectionStart ?? 0\n const raw = input.value\n const digits = raw.replace(/\\D/g, '').slice(0, maxDigits)\n const masked = applyMask(digits, maxDigits)\n const digitsBeforeCursor = raw.slice(0, cursorPos).replace(/\\D/g, '').length\n const newCursorPos = getCursorPos(masked, digitsBeforeCursor)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(newCursorPos, newCursorPos))\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget\n const pos = input.selectionStart ?? 0\n\n if (e.key.length === 1 && !/\\d/.test(e.key) && !e.ctrlKey && !e.metaKey) {\n e.preventDefault()\n return\n }\n\n if (e.key === 'Backspace' && pos > 0 && /[.: ]/.test(input.value[pos - 1])) {\n e.preventDefault()\n const val = input.value\n const masked = applyMask((val.slice(0, pos - 2) + val.slice(pos)).replace(/\\D/g, ''), maxDigits)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => input.setSelectionRange(pos - 2, pos - 2))\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n e.preventDefault()\n const masked = applyMask(e.clipboardData.getData('text').replace(/\\D/g, ''), maxDigits)\n setInputValue(masked)\n commit(masked)\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(masked.length, masked.length))\n }\n\n function handleCalendarSelect(date: Date | undefined) {\n if (!date || !isValid(date)) {\n applyValid('', undefined)\n if (!timeFormat) setOpen(false)\n return\n }\n\n let dateToCommit = date\n if (timeFormat) {\n const base = selected && isValid(selected) ? selected : new Date(0)\n dateToCommit = new Date(\n date.getFullYear(), date.getMonth(), date.getDate(),\n base.getHours(), base.getMinutes(), base.getSeconds(),\n )\n }\n\n applyValid(format(dateToCommit, dateFormat), dateToCommit)\n if (!timeFormat) setOpen(false)\n }\n\n function handleTimeChange(h: number, m: number, s: number) {\n const base = selected && isValid(selected) ? selected : new Date()\n const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s)\n applyValid(format(newDate, dateFormat), newDate)\n }\n\n const interactive = !disabled && !loading\n\n return (\n <div\n ref={containerRef}\n className={['datepicker', `datepicker--${size}`, className].filter(Boolean).join(' ')}\n data-focused={focused || open || undefined}\n data-filled={filled || undefined}\n data-failed={failed || inputInvalid || undefined}\n data-disabled={!interactive || undefined}\n >\n <div\n className=\"datepicker__field\"\n data-icon-start={resolvedIcon && iconPosition === 'start' ? true : undefined}\n data-icon-end={resolvedIcon && iconPosition === 'end' ? true : undefined}\n onClick={() => interactive && inputRef.current?.focus()}\n >\n {resolvedIcon && iconPosition === 'start' && (\n <span className=\"datepicker__icon datepicker__icon--start\">{resolvedIcon}</span>\n )}\n {label && <span className=\"datepicker__label\">{label}</span>}\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n className=\"datepicker__input\"\n value={inputValue}\n placeholder={label && !focused ? undefined : defaultPlaceholder}\n disabled={!interactive}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => { setFocused(true); if (interactive && !noCalendar) setOpen(true) }}\n onBlur={handleBlur}\n aria-label={label ?? 'Выберите дату'}\n aria-expanded={!noCalendar ? open : undefined}\n aria-haspopup={!noCalendar ? 'dialog' : undefined}\n aria-invalid={inputInvalid || undefined}\n />\n {resolvedIcon && iconPosition === 'end' && (\n <span className=\"datepicker__icon datepicker__icon--end\">{resolvedIcon}</span>\n )}\n </div>\n {!noCalendar && open && (\n <div\n className={[\n 'datepicker__popover',\n `datepicker__popover--${size}`,\n timeFormat && 'datepicker__popover--with-time',\n ].filter(Boolean).join(' ')}\n role=\"dialog\"\n aria-label=\"Календарь\"\n >\n {timeFormat ? (\n <>\n <div className=\"datepicker__popover-body\">\n <div className=\"datepicker__popover-calendar\">\n <Calendar\n mode=\"single\"\n selected={selected}\n onSelect={handleCalendarSelect}\n startMonth={fromDate}\n endMonth={toDate}\n locale={ru}\n />\n </div>\n <div className=\"datepicker__time-separator\" />\n <div className=\"datepicker__popover-time\">\n <TimePanel\n value={selected}\n showSeconds={showSeconds}\n onChange={handleTimeChange}\n />\n </div>\n </div>\n <div className=\"datepicker__popover-footer\">\n <button\n className=\"datepicker__ok-btn\"\n type=\"button\"\n onClick={() => setOpen(false)}\n >\n OK\n </button>\n </div>\n </>\n ) : (\n <Calendar\n mode=\"single\"\n selected={selected}\n onSelect={handleCalendarSelect}\n startMonth={fromDate}\n endMonth={toDate}\n locale={ru}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n","import { RefObject, useEffect } from 'react'\n\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, handler: () => void) {\n useEffect(() => {\n function listener(e: MouseEvent) {\n if (!ref.current || ref.current.contains(e.target as Node)) return\n handler()\n }\n document.addEventListener('mousedown', listener)\n return () => document.removeEventListener('mousedown', listener)\n }, [ref, handler])\n}\n","import { useEffect, useRef } from 'react'\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i)\nconst MINUTES = Array.from({ length: 60 }, (_, i) => i)\nconst SECONDS = Array.from({ length: 60 }, (_, i) => i)\n\nfunction pad2(n: number) {\n return String(n).padStart(2, '0')\n}\n\ninterface ColumnProps {\n values: number[]\n selected: number\n onSelect: (v: number) => void\n}\n\nfunction Column({ values, selected, onSelect }: ColumnProps) {\n const selectedRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: 'center', behavior: 'instant' })\n }, [selected])\n\n return (\n <div className=\"time-panel__column\">\n {values.map((v) => (\n <button\n key={v}\n ref={v === selected ? selectedRef : undefined}\n className=\"time-panel__item\"\n data-selected={v === selected || undefined}\n onClick={() => onSelect(v)}\n type=\"button\"\n tabIndex={-1}\n >\n {pad2(v)}\n </button>\n ))}\n </div>\n )\n}\n\nexport interface TimePanelProps {\n value: Date | undefined\n showSeconds: boolean\n onChange: (h: number, m: number, s: number) => void\n}\n\nexport function TimePanel({ value, showSeconds, onChange }: TimePanelProps) {\n const h = value?.getHours() ?? 0\n const m = value?.getMinutes() ?? 0\n const s = value?.getSeconds() ?? 0\n\n return (\n <div className=\"time-panel\">\n <Column values={HOURS} selected={h} onSelect={(v) => onChange(v, m, s)} />\n <Column values={MINUTES} selected={m} onSelect={(v) => onChange(h, v, s)} />\n {showSeconds && (\n <Column values={SECONDS} selected={s} onSelect={(v) => onChange(h, m, v)} />\n )}\n </div>\n )\n}\n","export function CalendarIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"2.5\" width=\"14\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M1 6.5H15\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 1V4M11 1V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","export function Spinner() {\n return <span className=\"datepicker-spinner\" aria-hidden=\"true\" />\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { format, isValid, parse } from 'date-fns'\nimport { ru } from 'date-fns/locale'\nimport type { DateRange } from 'react-day-picker'\nimport type { DatePickerShowTime } from '../DatePicker/DatePicker'\nimport { useClickOutside } from '../../hooks/useClickOutside'\nimport { Calendar } from '../Calendar'\nimport { TimePanel } from '../TimePanel'\nimport { CalendarIcon } from '../icons/CalendarIcon'\nimport { Spinner } from '../icons/Spinner'\n\nconst DATE_FORMAT = 'dd.MM.yyyy'\n\nfunction applyDateMask(digits: string): string {\n const d = digits.slice(0, 8)\n let result = ''\n for (let i = 0; i < d.length; i++) {\n if (i === 2 || i === 4) result += '.'\n result += d[i]\n }\n return result\n}\n\nfunction applyRangeMask(digits: string): string {\n const all = digits.slice(0, 16)\n const fromMasked = applyDateMask(all.slice(0, 8))\n const toDigits = all.slice(8)\n if (toDigits.length === 0) return fromMasked\n return `${fromMasked} — ${applyDateMask(toDigits)}`\n}\n\nfunction getRangeCursorPos(masked: string, digitCount: number): number {\n if (digitCount === 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (/\\d/.test(masked[i])) {\n count++\n if (count === digitCount) return i + 1\n }\n }\n return masked.length\n}\n\nfunction parseDate(masked: string): Date | undefined {\n if (masked.replace(/\\D/g, '').length !== 8) return undefined\n const date = parse(masked, DATE_FORMAT, new Date())\n return isValid(date) && format(date, DATE_FORMAT) === masked ? date : undefined\n}\n\nfunction formatRange(from: Date | undefined, to: Date | undefined): string {\n if (!from) return ''\n const fromStr = format(from, DATE_FORMAT)\n if (!to) return fromStr\n return `${fromStr} — ${format(to, DATE_FORMAT)}`\n}\n\nfunction resolveShowSeconds(showTime?: DatePickerShowTime): boolean {\n if (!showTime) return false\n if (showTime === true) return true\n return showTime.format === 'HH:mm:ss'\n}\n\nexport type { DateRange }\nexport type { DatePickerShowTime }\n\nexport type DateRangePickerSize = 's' | 'm' | 'l'\nexport type DateRangePickerCalendarLayout = 'vertical' | 'horizontal'\n\nexport interface DateRangePickerProps {\n value?: DateRange\n defaultValue?: DateRange\n onChange?: (range: DateRange | undefined) => void\n label?: string\n fromDate?: Date\n toDate?: Date\n disabled?: boolean\n failed?: boolean\n loading?: boolean\n size?: DateRangePickerSize\n calendarLayout?: DateRangePickerCalendarLayout\n showTime?: DatePickerShowTime\n icon?: ReactNode | false\n iconPosition?: 'start' | 'end'\n className?: string\n}\n\nexport function DateRangePicker({\n value,\n defaultValue,\n onChange,\n label,\n fromDate: fromConstraint,\n toDate: toConstraint,\n disabled = false,\n failed = false,\n loading = false,\n size = 'm',\n calendarLayout = 'vertical',\n showTime,\n icon,\n iconPosition = 'end',\n className,\n}: DateRangePickerProps) {\n const resolvedIcon = loading ? <Spinner /> : icon === false ? null : (icon ?? <CalendarIcon />)\n\n const isControlled = value !== undefined\n const showSeconds = resolveShowSeconds(showTime)\n\n const [internalFrom, setInternalFrom] = useState<Date | undefined>(defaultValue?.from)\n const [internalTo, setInternalTo] = useState<Date | undefined>(defaultValue?.to)\n const [inputValue, setInputValue] = useState(() =>\n formatRange(defaultValue?.from, defaultValue?.to),\n )\n const [inputInvalid, setInputInvalid] = useState(false)\n const [open, setOpen] = useState(false)\n const [focused, setFocused] = useState(false)\n\n const [anchorDate, setAnchorDate] = useState<Date | undefined>(undefined)\n const [hoveredDate, setHoveredDate] = useState<Date | undefined>(undefined)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n // Track last emitted range to ignore parent echoing it back\n const lastEmittedFromRef = useRef<Date | undefined>(value !== undefined ? value?.from : defaultValue?.from)\n const lastEmittedToRef = useRef<Date | undefined>(value !== undefined ? value?.to : defaultValue?.to)\n const wasControlledRef = useRef(value !== undefined)\n\n const confirmedFrom = isControlled ? value?.from : internalFrom\n const confirmedTo = isControlled ? value?.to : internalTo\n const filled = inputValue.length > 0\n\n const close = useCallback(() => {\n setOpen(false)\n setAnchorDate(undefined)\n setHoveredDate(undefined)\n }, [])\n useClickOutside(containerRef, close)\n\n // Sync inputValue when value changes externally (e.g. form reset)\n useEffect(() => {\n if (value !== undefined) wasControlledRef.current = true\n const newFrom = value?.from\n const newTo = value?.to\n const fromTime = newFrom?.getTime() ?? null\n const toTime = newTo?.getTime() ?? null\n const lastFromTime = lastEmittedFromRef.current?.getTime() ?? null\n const lastToTime = lastEmittedToRef.current?.getTime() ?? null\n if (fromTime === lastFromTime && toTime === lastToTime) return\n if (!wasControlledRef.current && value === undefined) return\n\n setInputValue(formatRange(newFrom, newTo))\n setInputInvalid(false)\n if (!isControlled) { setInternalFrom(newFrom); setInternalTo(newTo) }\n setAnchorDate(undefined)\n setHoveredDate(undefined)\n lastEmittedFromRef.current = newFrom\n lastEmittedToRef.current = newTo\n }, [value]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const calendarSelected: DateRange | undefined = anchorDate\n ? hoveredDate\n ? anchorDate <= hoveredDate\n ? { from: anchorDate, to: hoveredDate }\n : { from: hoveredDate, to: anchorDate }\n : { from: anchorDate, to: undefined }\n : { from: confirmedFrom, to: confirmedTo }\n\n function handleDayClick(day: Date) {\n if (!anchorDate) {\n const from = showTime\n ? new Date(day.getFullYear(), day.getMonth(), day.getDate(),\n confirmedFrom?.getHours() ?? 0, confirmedFrom?.getMinutes() ?? 0, confirmedFrom?.getSeconds() ?? 0)\n : day\n setAnchorDate(from)\n if (!isControlled) { setInternalFrom(from); setInternalTo(undefined) }\n setInputValue(format(day, DATE_FORMAT))\n setInputInvalid(false)\n lastEmittedFromRef.current = from\n lastEmittedToRef.current = undefined\n onChange?.({ from, to: undefined })\n } else {\n let from = anchorDate, to = showTime\n ? new Date(day.getFullYear(), day.getMonth(), day.getDate(),\n confirmedTo?.getHours() ?? 0, confirmedTo?.getMinutes() ?? 0, confirmedTo?.getSeconds() ?? 0)\n : day\n if (day < anchorDate) { const tmp = from; from = to; to = tmp }\n if (!isControlled) { setInternalFrom(from); setInternalTo(to) }\n setInputValue(formatRange(from, to))\n setInputInvalid(false)\n lastEmittedFromRef.current = from\n lastEmittedToRef.current = to\n onChange?.({ from, to })\n if (!showTime) close()\n else setAnchorDate(undefined)\n }\n }\n\n function handleDayMouseEnter(day: Date) {\n if (anchorDate) setHoveredDate(day)\n }\n\n function handleFromTimeChange(h: number, m: number, s: number) {\n const base = confirmedFrom ?? new Date()\n const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s)\n if (!isControlled) setInternalFrom(newDate)\n lastEmittedFromRef.current = newDate\n onChange?.({ from: newDate, to: confirmedTo })\n }\n\n function handleToTimeChange(h: number, m: number, s: number) {\n const base = confirmedTo ?? new Date()\n const newDate = new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, m, s)\n if (!isControlled) setInternalTo(newDate)\n lastEmittedToRef.current = newDate\n onChange?.({ from: confirmedFrom, to: newDate })\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const input = e.target\n const cursorPos = input.selectionStart ?? 0\n const raw = input.value\n const digits = raw.replace(/\\D/g, '').slice(0, 16)\n const masked = applyRangeMask(digits)\n const digitsBeforeCursor = raw.slice(0, cursorPos).replace(/\\D/g, '').length\n\n setInputValue(masked)\n setAnchorDate(undefined)\n setHoveredDate(undefined)\n\n const fromDigits = digits.slice(0, 8)\n const toDigits = digits.slice(8)\n const parsedFrom = fromDigits.length === 8 ? parseDate(applyDateMask(fromDigits)) : undefined\n const parsedTo = toDigits.length === 8 ? parseDate(applyDateMask(toDigits)) : undefined\n const fromComplete = fromDigits.length === 8\n const toComplete = toDigits.length === 8\n setInputInvalid((fromComplete && !parsedFrom) || (toComplete && !parsedTo))\n\n if (!isControlled) { setInternalFrom(parsedFrom); setInternalTo(parsedTo) }\n lastEmittedFromRef.current = parsedFrom\n lastEmittedToRef.current = parsedTo\n onChange?.(parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined)\n\n requestAnimationFrame(() =>\n inputRef.current?.setSelectionRange(\n getRangeCursorPos(masked, digitsBeforeCursor),\n getRangeCursorPos(masked, digitsBeforeCursor),\n ),\n )\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget\n const pos = input.selectionStart ?? 0\n\n if (e.key.length === 1 && !/\\d/.test(e.key) && !e.ctrlKey && !e.metaKey) {\n e.preventDefault()\n return\n }\n if (e.key === 'Backspace' && pos > 0 && /[\\s—]/.test(input.value[pos - 1])) {\n e.preventDefault()\n const val = input.value\n const charsToSkip = val.slice(0, pos).match(/[\\s—]+$/)?.[0].length ?? 1\n const newPos = pos - charsToSkip\n const masked = applyRangeMask((val.slice(0, newPos - 1) + val.slice(newPos)).replace(/\\D/g, ''))\n setInputValue(masked)\n requestAnimationFrame(() => input.setSelectionRange(newPos - 1, newPos - 1))\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n e.preventDefault()\n const text = e.clipboardData.getData('text')\n const digits = text.replace(/\\D/g, '').slice(0, 16)\n const masked = applyRangeMask(digits)\n setInputValue(masked)\n setAnchorDate(undefined)\n setHoveredDate(undefined)\n\n const parsedFrom = digits.length >= 8 ? parseDate(applyDateMask(digits.slice(0, 8))) : undefined\n const parsedTo = digits.length >= 16 ? parseDate(applyDateMask(digits.slice(8, 16))) : undefined\n setInputInvalid((digits.length >= 8 && !parsedFrom) || (digits.length >= 16 && !parsedTo))\n if (!isControlled) { setInternalFrom(parsedFrom); setInternalTo(parsedTo) }\n lastEmittedFromRef.current = parsedFrom\n lastEmittedToRef.current = parsedTo\n onChange?.(parsedFrom || parsedTo ? { from: parsedFrom, to: parsedTo } : undefined)\n\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(masked.length, masked.length))\n }\n\n const placeholder = label && !focused && !filled ? undefined : 'дд.мм.гггг — дд.мм.гггг'\n const interactive = !disabled && !loading\n\n return (\n <div\n ref={containerRef}\n className={['datepicker', 'daterangepicker', `datepicker--${size}`, className].filter(Boolean).join(' ')}\n data-focused={focused || open || undefined}\n data-filled={filled || undefined}\n data-failed={failed || inputInvalid || undefined}\n data-disabled={!interactive || undefined}\n >\n <div\n className=\"datepicker__field\"\n data-icon-start={resolvedIcon && iconPosition === 'start' ? true : undefined}\n data-icon-end={resolvedIcon && iconPosition === 'end' ? true : undefined}\n onClick={() => interactive && inputRef.current?.focus()}\n >\n {resolvedIcon && iconPosition === 'start' && (\n <span className=\"datepicker__icon datepicker__icon--start\">{resolvedIcon}</span>\n )}\n {label && <span className=\"datepicker__label\">{label}</span>}\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n className=\"datepicker__input\"\n value={inputValue}\n placeholder={placeholder}\n disabled={!interactive}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => { setFocused(true); if (interactive) setOpen(true) }}\n onBlur={() => setFocused(false)}\n aria-label={label ?? 'Выберите период'}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-invalid={inputInvalid || undefined}\n />\n {resolvedIcon && iconPosition === 'end' && (\n <span className=\"datepicker__icon datepicker__icon--end\">{resolvedIcon}</span>\n )}\n </div>\n {open && (\n <div\n className={[\n 'datepicker__popover',\n `datepicker__popover--${size}`,\n calendarLayout === 'horizontal' && 'datepicker__popover--horizontal',\n showTime && 'datepicker__popover--with-time',\n ].filter(Boolean).join(' ')}\n role=\"dialog\"\n aria-label=\"Выберите период\"\n >\n {showTime ? (\n <>\n <div className=\"datepicker__popover-body\">\n <div className=\"datepicker__popover-calendar\">\n <Calendar\n mode=\"range\"\n selected={calendarSelected}\n onSelect={() => {}}\n onDayClick={handleDayClick}\n onDayMouseEnter={handleDayMouseEnter}\n onDayMouseLeave={() => setHoveredDate(undefined)}\n startMonth={fromConstraint}\n endMonth={toConstraint}\n numberOfMonths={2}\n locale={ru}\n />\n </div>\n </div>\n <div className=\"datepicker__time-row\">\n <div className=\"datepicker__time-col\">\n <span className=\"datepicker__time-label\">Начало</span>\n <TimePanel value={confirmedFrom} showSeconds={showSeconds} onChange={handleFromTimeChange} />\n </div>\n <div className=\"datepicker__time-separator\" />\n <div className=\"datepicker__time-col\">\n <span className=\"datepicker__time-label\">Конец</span>\n <TimePanel value={confirmedTo} showSeconds={showSeconds} onChange={handleToTimeChange} />\n </div>\n </div>\n <div className=\"datepicker__popover-footer\">\n <button className=\"datepicker__ok-btn\" type=\"button\" onClick={close}>OK</button>\n </div>\n </>\n ) : (\n <Calendar\n mode=\"range\"\n selected={calendarSelected}\n onSelect={() => {}}\n onDayClick={handleDayClick}\n onDayMouseEnter={handleDayMouseEnter}\n onDayMouseLeave={() => setHoveredDate(undefined)}\n startMonth={fromConstraint}\n endMonth={toConstraint}\n numberOfMonths={2}\n locale={ru}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n","import type { ButtonProps } from './Button.types'\nimport { Spinner } from '../icons/Spinner'\n\nexport function Button({\n variant = 'primary',\n size = 'm',\n loading = false,\n disabled,\n className,\n children,\n ...rest\n}: ButtonProps) {\n const classes = [\n 'dp-btn',\n `dp-btn--${variant}`,\n `dp-btn--${size}`,\n loading && 'dp-btn--loading',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <button {...rest} className={classes} disabled={disabled || loading}>\n {children}\n {loading && <Spinner />}\n </button>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,8BAA0C;AAQtC;AAFG,SAAS,SAAS,EAAE,WAAW,GAAG,MAAM,GAAkB;AAC/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,uBAAuB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACrE,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACbA,IAAAA,gBAAyE;AACzE,sBAAuC;AACvC,oBAAmB;;;ACFnB,mBAAqC;AAE9B,SAAS,gBAAgB,KAAoC,SAAqB;AACvF,8BAAU,MAAM;AACd,aAAS,SAAS,GAAe;AAC/B,UAAI,CAAC,IAAI,WAAW,IAAI,QAAQ,SAAS,EAAE,MAAc,EAAG;AAC5D,cAAQ;AAAA,IACV;AACA,aAAS,iBAAiB,aAAa,QAAQ;AAC/C,WAAO,MAAM,SAAS,oBAAoB,aAAa,QAAQ;AAAA,EACjE,GAAG,CAAC,KAAK,OAAO,CAAC;AACnB;;;ACXA,IAAAC,gBAAkC;AA0B1B,IAAAC,sBAAA;AAxBR,IAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;AACpD,IAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;AACtD,IAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;AAEtD,SAAS,KAAK,GAAW;AACvB,SAAO,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAClC;AAQA,SAAS,OAAO,EAAE,QAAQ,UAAU,SAAS,GAAgB;AAC3D,QAAM,kBAAc,sBAA0B,IAAI;AAElD,+BAAU,MAAM;AAnBlB;AAoBI,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO,UAAU,UAAU,UAAU;AAAA,EAC7E,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,6CAAC,SAAI,WAAU,sBACZ,iBAAO,IAAI,CAAC,MACX;AAAA,IAAC;AAAA;AAAA,MAEC,KAAK,MAAM,WAAW,cAAc;AAAA,MACpC,WAAU;AAAA,MACV,iBAAe,MAAM,YAAY;AAAA,MACjC,SAAS,MAAM,SAAS,CAAC;AAAA,MACzB,MAAK;AAAA,MACL,UAAU;AAAA,MAET,eAAK,CAAC;AAAA;AAAA,IARF;AAAA,EASP,CACD,GACH;AAEJ;AAQO,SAAS,UAAU,EAAE,OAAO,aAAa,SAAS,GAAmB;AAhD5E;AAiDE,QAAM,KAAI,oCAAO,eAAP,YAAqB;AAC/B,QAAM,KAAI,oCAAO,iBAAP,YAAuB;AACjC,QAAM,KAAI,oCAAO,iBAAP,YAAuB;AAEjC,SACE,8CAAC,SAAI,WAAU,cACb;AAAA,iDAAC,UAAO,QAAQ,OAAO,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,IACxE,6CAAC,UAAO,QAAQ,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,IACzE,eACC,6CAAC,UAAO,QAAQ,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,KAE9E;AAEJ;;;AC5DI,IAAAC,sBAAA;AAFG,SAAS,eAAe;AAC7B,SACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAChE;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,MAAK,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC5F,6CAAC,UAAK,GAAE,aAAY,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC5D,6CAAC,UAAK,GAAE,iBAAgB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,KACxF;AAEJ;;;ACPS,IAAAC,sBAAA;AADF,SAAS,UAAU;AACxB,SAAO,6CAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO;AACjE;;;AJyGiC,IAAAC,sBAAA;AA/FjC,IAAM,cAAc;AAEpB,SAAS,kBAAkB,UAA4D;AACrF,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,SAAS;AAClB;AAEA,SAAS,gBAAgB,YAA2B;AAClD,SAAO,aAAa,GAAG,WAAW,IAAI,UAAU,KAAK;AACvD;AAEA,SAAS,eAAe,YAA2B;AACjD,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,eAAe,UAAU,KAAK;AACvC;AAEA,SAAS,iBAAiB,YAA2B;AACnD,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,eAAe,UAAU,iFAAqB;AACvD;AAEA,SAAS,UAAU,QAAgB,WAA2B;AAC5D,QAAM,IAAI,OAAO,MAAM,GAAG,SAAS;AACnC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,MAAM,KAAK,MAAM,EAAG,WAAU;AAAA,aACzB,MAAM,EAAG,WAAU;AAAA,aACnB,MAAM,MAAM,MAAM,GAAI,WAAU;AACzC,cAAU,EAAE,CAAC;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,aAAa,QAAgB,YAA4B;AAChE,MAAI,eAAe,EAAG,QAAO;AAC7B,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,KAAK,KAAK,OAAO,CAAC,CAAC,GAAG;AACxB;AACA,UAAI,UAAU,WAAY,QAAO,IAAI;AAAA,IACvC;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,cAAc,QAAgB,YAAoB,WAAqC;AAC9F,MAAI,OAAO,QAAQ,OAAO,EAAE,EAAE,WAAW,UAAW,QAAO;AAC3D,QAAM,WAAO,uBAAM,QAAQ,YAAY,oBAAI,KAAK,CAAC;AACjD,aAAO,yBAAQ,IAAI,SAAK,wBAAO,MAAM,UAAU,MAAM,SAAS,OAAO;AACvE;AAqBO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AACF,GAAoB;AAClB,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAM,aAAa,gBAAgB,UAAU;AAC7C,QAAM,YAAY,eAAe,UAAU;AAC3C,QAAM,qBAAqB,oCAAe,iBAAiB,UAAU;AACrE,QAAM,cAAc,eAAe;AAEnC,QAAM,eAAe,UAAU,6CAAC,WAAQ,IAAK,SAAS,QAAQ,OAAQ,sBAAQ,6CAAC,gBAAa;AAE5F,QAAM,eAAe,UAAU;AAC/B,QAAM,CAAC,cAAc,eAAe,QAAI,wBAA2B,YAAY;AAC/E,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAAS,MAC3C,oBAAgB,yBAAQ,YAAY,QAAI,wBAAO,cAAc,UAAU,IAAI;AAAA,EAC7E;AACA,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AAEtD,QAAM,eAAW,sBAAyB,IAAI;AAC9C,QAAM,mBAAe,sBAAuB,IAAI;AAChD,QAAM,mBAAe,sBAAO,UAAU;AAEtC,QAAM,qBAAiB,sBAAyB,UAAU,SAAY,QAAQ,YAAY;AAE1F,QAAM,uBAAmB,sBAAO,UAAU,MAAS;AAEnD,QAAM,WAAW,eAAe,QAAQ;AACxC,QAAM,SAAS,WAAW,SAAS;AAEnC,QAAM,YAAQ,2BAAY,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AAClD,kBAAgB,cAAc,KAAK;AAGnC,+BAAU,MAAM;AArIlB;AAsII,QAAI,UAAU,OAAW,kBAAiB,UAAU;AACpD,UAAM,YAAW,0BAAe,YAAf,mBAAwB,cAAxB,YAAqC;AACtD,UAAM,aAAY,oCAAO,cAAP,YAAoB;AACtC,QAAI,cAAc,SAAU;AAC5B,QAAI,CAAC,iBAAiB,WAAW,UAAU,OAAW;AAEtD,UAAM,YAAY,aAAS,yBAAQ,KAAK,QAAI,wBAAO,OAAO,UAAU,IAAI;AACxE,kBAAc,SAAS;AACvB,iBAAa,UAAU;AACvB,oBAAgB,KAAK;AACrB,QAAI,CAAC,aAAc,iBAAgB,KAAK;AACxC,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,KAAK,CAAC;AAEV,WAAS,WAAW,QAAgB,MAAwB;AAC1D,mBAAe,UAAU;AACzB,iBAAa,UAAU;AACvB,kBAAc,MAAM;AACpB,oBAAgB,KAAK;AACrB,QAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,yCAAW;AAAA,EACb;AAEA,WAAS,OAAO,QAAgB;AAC9B,UAAM,SAAS,OAAO,QAAQ,OAAO,EAAE;AACvC,QAAI,OAAO,WAAW,GAAG;AACvB,qBAAe,UAAU;AACzB,mBAAa,UAAU;AACvB,sBAAgB,KAAK;AACrB,UAAI,CAAC,aAAc,iBAAgB,MAAS;AAC5C,2CAAW;AAAA,IACb,WAAW,OAAO,WAAW,WAAW;AACtC,YAAM,OAAO,cAAc,QAAQ,YAAY,SAAS;AACxD,qBAAe,UAAU;AACzB,UAAI,KAAM,cAAa,UAAU;AACjC,sBAAgB,CAAC,IAAI;AACrB,UAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,2CAAW;AAAA,IACb,OAAO;AACL,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,WAAS,aAAa;AACpB,eAAW,KAAK;AAChB,UAAM,SAAS,WAAW,QAAQ,OAAO,EAAE;AAC3C,QAAK,OAAO,SAAS,KAAK,OAAO,SAAS,aAAc,cAAc;AACpE,oBAAc,aAAa,OAAO;AAClC,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,WAAS,aAAa,GAAwC;AA1LhE;AA2LI,UAAM,QAAQ,EAAE;AAChB,UAAM,aAAY,WAAM,mBAAN,YAAwB;AAC1C,UAAM,MAAM,MAAM;AAClB,UAAM,SAAS,IAAI,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,SAAS;AACxD,UAAM,SAAS,UAAU,QAAQ,SAAS;AAC1C,UAAM,qBAAqB,IAAI,MAAM,GAAG,SAAS,EAAE,QAAQ,OAAO,EAAE,EAAE;AACtE,UAAM,eAAe,aAAa,QAAQ,kBAAkB;AAC5D,kBAAc,MAAM;AACpB,WAAO,MAAM;AACb,0BAAsB,MAAG;AApM7B,UAAAC;AAoMgC,cAAAA,MAAA,SAAS,YAAT,gBAAAA,IAAkB,kBAAkB,cAAc;AAAA,KAAa;AAAA,EAC7F;AAEA,WAAS,cAAc,GAA0C;AAvMnE;AAwMI,UAAM,QAAQ,EAAE;AAChB,UAAM,OAAM,WAAM,mBAAN,YAAwB;AAEpC,QAAI,EAAE,IAAI,WAAW,KAAK,CAAC,KAAK,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS;AACvE,QAAE,eAAe;AACjB;AAAA,IACF;AAEA,QAAI,EAAE,QAAQ,eAAe,MAAM,KAAK,QAAQ,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC,GAAG;AAC1E,QAAE,eAAe;AACjB,YAAM,MAAM,MAAM;AAClB,YAAM,SAAS,WAAW,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,GAAG,GAAG,QAAQ,OAAO,EAAE,GAAG,SAAS;AAC/F,oBAAc,MAAM;AACpB,aAAO,MAAM;AACb,4BAAsB,MAAM,MAAM,kBAAkB,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,WAAS,YAAY,GAA2C;AAC9D,MAAE,eAAe;AACjB,UAAM,SAAS,UAAU,EAAE,cAAc,QAAQ,MAAM,EAAE,QAAQ,OAAO,EAAE,GAAG,SAAS;AACtF,kBAAc,MAAM;AACpB,WAAO,MAAM;AACb,0BAAsB,MAAG;AA/N7B;AA+NgC,4BAAS,YAAT,mBAAkB,kBAAkB,OAAO,QAAQ,OAAO;AAAA,KAAO;AAAA,EAC/F;AAEA,WAAS,qBAAqB,MAAwB;AACpD,QAAI,CAAC,QAAQ,KAAC,yBAAQ,IAAI,GAAG;AAC3B,iBAAW,IAAI,MAAS;AACxB,UAAI,CAAC,WAAY,SAAQ,KAAK;AAC9B;AAAA,IACF;AAEA,QAAI,eAAe;AACnB,QAAI,YAAY;AACd,YAAM,OAAO,gBAAY,yBAAQ,QAAQ,IAAI,WAAW,oBAAI,KAAK,CAAC;AAClE,qBAAe,IAAI;AAAA,QACjB,KAAK,YAAY;AAAA,QAAG,KAAK,SAAS;AAAA,QAAG,KAAK,QAAQ;AAAA,QAClD,KAAK,SAAS;AAAA,QAAG,KAAK,WAAW;AAAA,QAAG,KAAK,WAAW;AAAA,MACtD;AAAA,IACF;AAEA,mBAAW,wBAAO,cAAc,UAAU,GAAG,YAAY;AACzD,QAAI,CAAC,WAAY,SAAQ,KAAK;AAAA,EAChC;AAEA,WAAS,iBAAiB,GAAW,GAAW,GAAW;AACzD,UAAM,OAAO,gBAAY,yBAAQ,QAAQ,IAAI,WAAW,oBAAI,KAAK;AACjE,UAAM,UAAU,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,mBAAW,wBAAO,SAAS,UAAU,GAAG,OAAO;AAAA,EACjD;AAEA,QAAM,cAAc,CAAC,YAAY,CAAC;AAElC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,CAAC,cAAc,eAAe,IAAI,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpF,gBAAc,WAAW,QAAQ;AAAA,MACjC,eAAa,UAAU;AAAA,MACvB,eAAa,UAAU,gBAAgB;AAAA,MACvC,iBAAe,CAAC,eAAe;AAAA,MAE/B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,mBAAiB,gBAAgB,iBAAiB,UAAU,OAAO;AAAA,YACnE,iBAAe,gBAAgB,iBAAiB,QAAQ,OAAO;AAAA,YAC/D,SAAS,MAAG;AA3QpB;AA2QuB,sCAAe,cAAS,YAAT,mBAAkB;AAAA;AAAA,YAE/C;AAAA,8BAAgB,iBAAiB,WAChC,6CAAC,UAAK,WAAU,4CAA4C,wBAAa;AAAA,cAE1E,SAAS,6CAAC,UAAK,WAAU,qBAAqB,iBAAM;AAAA,cACrD;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,WAAU;AAAA,kBACV,OAAO;AAAA,kBACP,aAAa,SAAS,CAAC,UAAU,SAAY;AAAA,kBAC7C,UAAU,CAAC;AAAA,kBACX,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,SAAS,MAAM;AAAE,+BAAW,IAAI;AAAG,wBAAI,eAAe,CAAC,WAAY,SAAQ,IAAI;AAAA,kBAAE;AAAA,kBACjF,QAAQ;AAAA,kBACR,cAAY,wBAAS;AAAA,kBACrB,iBAAe,CAAC,aAAa,OAAO;AAAA,kBACpC,iBAAe,CAAC,aAAa,WAAW;AAAA,kBACxC,gBAAc,gBAAgB;AAAA;AAAA,cAChC;AAAA,cACC,gBAAgB,iBAAiB,SAChC,6CAAC,UAAK,WAAU,0CAA0C,wBAAa;AAAA;AAAA;AAAA,QAE3E;AAAA,QACC,CAAC,cAAc,QACd;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,wBAAwB,IAAI;AAAA,cAC5B,cAAc;AAAA,YAChB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC1B,MAAK;AAAA,YACL,cAAW;AAAA,YAEV,uBACC,8EACE;AAAA,4DAAC,SAAI,WAAU,4BACb;AAAA,6DAAC,SAAI,WAAU,gCACb;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL;AAAA,oBACA,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,QAAQ;AAAA;AAAA,gBACV,GACF;AAAA,gBACA,6CAAC,SAAI,WAAU,8BAA6B;AAAA,gBAC5C,6CAAC,SAAI,WAAU,4BACb;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP;AAAA,oBACA,UAAU;AAAA;AAAA,gBACZ,GACF;AAAA,iBACF;AAAA,cACA,6CAAC,SAAI,WAAU,8BACb;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,SAAS,MAAM,QAAQ,KAAK;AAAA,kBAC7B;AAAA;AAAA,cAED,GACF;AAAA,eACF,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL;AAAA,gBACA,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,QAAQ;AAAA;AAAA,YACV;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AK/VA,IAAAC,gBAAyE;AACzE,IAAAC,mBAAuC;AACvC,IAAAC,iBAAmB;AAqGc,IAAAC,sBAAA;AA5FjC,IAAMC,eAAc;AAEpB,SAAS,cAAc,QAAwB;AAC7C,QAAM,IAAI,OAAO,MAAM,GAAG,CAAC;AAC3B,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,MAAM,KAAK,MAAM,EAAG,WAAU;AAClC,cAAU,EAAE,CAAC;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAwB;AAC9C,QAAM,MAAM,OAAO,MAAM,GAAG,EAAE;AAC9B,QAAM,aAAa,cAAc,IAAI,MAAM,GAAG,CAAC,CAAC;AAChD,QAAM,WAAW,IAAI,MAAM,CAAC;AAC5B,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,GAAG,UAAU,WAAM,cAAc,QAAQ,CAAC;AACnD;AAEA,SAAS,kBAAkB,QAAgB,YAA4B;AACrE,MAAI,eAAe,EAAG,QAAO;AAC7B,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,KAAK,KAAK,OAAO,CAAC,CAAC,GAAG;AACxB;AACA,UAAI,UAAU,WAAY,QAAO,IAAI;AAAA,IACvC;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,UAAU,QAAkC;AACnD,MAAI,OAAO,QAAQ,OAAO,EAAE,EAAE,WAAW,EAAG,QAAO;AACnD,QAAM,WAAO,wBAAM,QAAQA,cAAa,oBAAI,KAAK,CAAC;AAClD,aAAO,0BAAQ,IAAI,SAAK,yBAAO,MAAMA,YAAW,MAAM,SAAS,OAAO;AACxE;AAEA,SAAS,YAAY,MAAwB,IAA8B;AACzE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,cAAU,yBAAO,MAAMA,YAAW;AACxC,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,OAAO,eAAM,yBAAO,IAAIA,YAAW,CAAC;AAChD;AAEA,SAAS,mBAAmB,UAAwC;AAClE,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,SAAS,WAAW;AAC7B;AA0BO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AACF,GAAyB;AACvB,QAAM,eAAe,UAAU,6CAAC,WAAQ,IAAK,SAAS,QAAQ,OAAQ,sBAAQ,6CAAC,gBAAa;AAE5F,QAAM,eAAe,UAAU;AAC/B,QAAM,cAAc,mBAAmB,QAAQ;AAE/C,QAAM,CAAC,cAAc,eAAe,QAAI,wBAA2B,6CAAc,IAAI;AACrF,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA2B,6CAAc,EAAE;AAC/E,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAAS,MAC3C,YAAY,6CAAc,MAAM,6CAAc,EAAE;AAAA,EAClD;AACA,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA2B,MAAS;AACxE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAA2B,MAAS;AAE1E,QAAM,eAAW,sBAAyB,IAAI;AAC9C,QAAM,mBAAe,sBAAuB,IAAI;AAEhD,QAAM,yBAAqB,sBAAyB,UAAU,SAAY,+BAAO,OAAO,6CAAc,IAAI;AAC1G,QAAM,uBAAmB,sBAAyB,UAAU,SAAY,+BAAO,KAAK,6CAAc,EAAE;AACpG,QAAM,uBAAmB,sBAAO,UAAU,MAAS;AAEnD,QAAM,gBAAgB,eAAe,+BAAO,OAAO;AACnD,QAAM,cAAc,eAAe,+BAAO,KAAK;AAC/C,QAAM,SAAS,WAAW,SAAS;AAEnC,QAAM,YAAQ,2BAAY,MAAM;AAC9B,YAAQ,KAAK;AACb,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAAA,EAC1B,GAAG,CAAC,CAAC;AACL,kBAAgB,cAAc,KAAK;AAGnC,+BAAU,MAAM;AA3IlB;AA4II,QAAI,UAAU,OAAW,kBAAiB,UAAU;AACpD,UAAM,UAAU,+BAAO;AACvB,UAAM,QAAQ,+BAAO;AACrB,UAAM,YAAW,wCAAS,cAAT,YAAsB;AACvC,UAAM,UAAS,oCAAO,cAAP,YAAoB;AACnC,UAAM,gBAAe,8BAAmB,YAAnB,mBAA4B,cAA5B,YAAyC;AAC9D,UAAM,cAAa,4BAAiB,YAAjB,mBAA0B,cAA1B,YAAuC;AAC1D,QAAI,aAAa,gBAAgB,WAAW,WAAY;AACxD,QAAI,CAAC,iBAAiB,WAAW,UAAU,OAAW;AAEtD,kBAAc,YAAY,SAAS,KAAK,CAAC;AACzC,oBAAgB,KAAK;AACrB,QAAI,CAAC,cAAc;AAAE,sBAAgB,OAAO;AAAG,oBAAc,KAAK;AAAA,IAAE;AACpE,kBAAc,MAAS;AACvB,mBAAe,MAAS;AACxB,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,mBAA0C,aAC5C,cACE,cAAc,cACZ,EAAE,MAAM,YAAY,IAAI,YAAY,IACpC,EAAE,MAAM,aAAa,IAAI,WAAW,IACtC,EAAE,MAAM,YAAY,IAAI,OAAU,IACpC,EAAE,MAAM,eAAe,IAAI,YAAY;AAE3C,WAAS,eAAe,KAAW;AAvKrC;AAwKI,QAAI,CAAC,YAAY;AACf,YAAM,OAAO,WACT,IAAI;AAAA,QAAK,IAAI,YAAY;AAAA,QAAG,IAAI,SAAS;AAAA,QAAG,IAAI,QAAQ;AAAA,SACtD,oDAAe,eAAf,YAA6B;AAAA,SAAG,oDAAe,iBAAf,YAA+B;AAAA,SAAG,oDAAe,iBAAf,YAA+B;AAAA,MAAC,IACpG;AACJ,oBAAc,IAAI;AAClB,UAAI,CAAC,cAAc;AAAE,wBAAgB,IAAI;AAAG,sBAAc,MAAS;AAAA,MAAE;AACrE,wBAAc,yBAAO,KAAKA,YAAW,CAAC;AACtC,sBAAgB,KAAK;AACrB,yBAAmB,UAAU;AAC7B,uBAAiB,UAAU;AAC3B,2CAAW,EAAE,MAAM,IAAI,OAAU;AAAA,IACnC,OAAO;AACL,UAAI,OAAO,YAAY,KAAK,WACxB,IAAI;AAAA,QAAK,IAAI,YAAY;AAAA,QAAG,IAAI,SAAS;AAAA,QAAG,IAAI,QAAQ;AAAA,SACtD,gDAAa,eAAb,YAA2B;AAAA,SAAG,gDAAa,iBAAb,YAA6B;AAAA,SAAG,gDAAa,iBAAb,YAA6B;AAAA,MAAC,IAC9F;AACJ,UAAI,MAAM,YAAY;AAAE,cAAM,MAAM;AAAM,eAAO;AAAI,aAAK;AAAA,MAAI;AAC9D,UAAI,CAAC,cAAc;AAAE,wBAAgB,IAAI;AAAG,sBAAc,EAAE;AAAA,MAAE;AAC9D,oBAAc,YAAY,MAAM,EAAE,CAAC;AACnC,sBAAgB,KAAK;AACrB,yBAAmB,UAAU;AAC7B,uBAAiB,UAAU;AAC3B,2CAAW,EAAE,MAAM,GAAG;AACtB,UAAI,CAAC,SAAU,OAAM;AAAA,UAChB,eAAc,MAAS;AAAA,IAC9B;AAAA,EACF;AAEA,WAAS,oBAAoB,KAAW;AACtC,QAAI,WAAY,gBAAe,GAAG;AAAA,EACpC;AAEA,WAAS,qBAAqB,GAAW,GAAW,GAAW;AAC7D,UAAM,OAAO,wCAAiB,oBAAI,KAAK;AACvC,UAAM,UAAU,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,QAAI,CAAC,aAAc,iBAAgB,OAAO;AAC1C,uBAAmB,UAAU;AAC7B,yCAAW,EAAE,MAAM,SAAS,IAAI,YAAY;AAAA,EAC9C;AAEA,WAAS,mBAAmB,GAAW,GAAW,GAAW;AAC3D,UAAM,OAAO,oCAAe,oBAAI,KAAK;AACrC,UAAM,UAAU,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,QAAI,CAAC,aAAc,eAAc,OAAO;AACxC,qBAAiB,UAAU;AAC3B,yCAAW,EAAE,MAAM,eAAe,IAAI,QAAQ;AAAA,EAChD;AAEA,WAAS,aAAa,GAAwC;AAzNhE;AA0NI,UAAM,QAAQ,EAAE;AAChB,UAAM,aAAY,WAAM,mBAAN,YAAwB;AAC1C,UAAM,MAAM,MAAM;AAClB,UAAM,SAAS,IAAI,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE;AACjD,UAAM,SAAS,eAAe,MAAM;AACpC,UAAM,qBAAqB,IAAI,MAAM,GAAG,SAAS,EAAE,QAAQ,OAAO,EAAE,EAAE;AAEtE,kBAAc,MAAM;AACpB,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAExB,UAAM,aAAa,OAAO,MAAM,GAAG,CAAC;AACpC,UAAM,WAAW,OAAO,MAAM,CAAC;AAC/B,UAAM,aAAa,WAAW,WAAW,IAAI,UAAU,cAAc,UAAU,CAAC,IAAI;AACpF,UAAM,WAAW,SAAS,WAAW,IAAI,UAAU,cAAc,QAAQ,CAAC,IAAI;AAC9E,UAAM,eAAe,WAAW,WAAW;AAC3C,UAAM,aAAa,SAAS,WAAW;AACvC,oBAAiB,gBAAgB,CAAC,cAAgB,cAAc,CAAC,QAAS;AAE1E,QAAI,CAAC,cAAc;AAAE,sBAAgB,UAAU;AAAG,oBAAc,QAAQ;AAAA,IAAE;AAC1E,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAC3B,yCAAW,cAAc,WAAW,EAAE,MAAM,YAAY,IAAI,SAAS,IAAI;AAEzE;AAAA,MAAsB,MAAG;AAlP7B,YAAAC;AAmPM,gBAAAA,MAAA,SAAS,YAAT,gBAAAA,IAAkB;AAAA,UAChB,kBAAkB,QAAQ,kBAAkB;AAAA,UAC5C,kBAAkB,QAAQ,kBAAkB;AAAA;AAAA;AAAA,IAEhD;AAAA,EACF;AAEA,WAAS,cAAc,GAA0C;AA1PnE;AA2PI,UAAM,QAAQ,EAAE;AAChB,UAAM,OAAM,WAAM,mBAAN,YAAwB;AAEpC,QAAI,EAAE,IAAI,WAAW,KAAK,CAAC,KAAK,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS;AACvE,QAAE,eAAe;AACjB;AAAA,IACF;AACA,QAAI,EAAE,QAAQ,eAAe,MAAM,KAAK,QAAQ,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC,GAAG;AAC1E,QAAE,eAAe;AACjB,YAAM,MAAM,MAAM;AAClB,YAAM,eAAc,eAAI,MAAM,GAAG,GAAG,EAAE,MAAM,SAAS,MAAjC,mBAAqC,GAAG,WAAxC,YAAkD;AACtE,YAAM,SAAS,MAAM;AACrB,YAAM,SAAS,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,MAAM,GAAG,QAAQ,OAAO,EAAE,CAAC;AAC/F,oBAAc,MAAM;AACpB,4BAAsB,MAAM,MAAM,kBAAkB,SAAS,GAAG,SAAS,CAAC,CAAC;AAAA,IAC7E;AAAA,EACF;AAEA,WAAS,YAAY,GAA2C;AAC9D,MAAE,eAAe;AACjB,UAAM,OAAO,EAAE,cAAc,QAAQ,MAAM;AAC3C,UAAM,SAAS,KAAK,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE;AAClD,UAAM,SAAS,eAAe,MAAM;AACpC,kBAAc,MAAM;AACpB,kBAAc,MAAS;AACvB,mBAAe,MAAS;AAExB,UAAM,aAAa,OAAO,UAAU,IAAI,UAAU,cAAc,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;AACvF,UAAM,WAAW,OAAO,UAAU,KAAK,UAAU,cAAc,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI;AACvF,oBAAiB,OAAO,UAAU,KAAK,CAAC,cAAgB,OAAO,UAAU,MAAM,CAAC,QAAS;AACzF,QAAI,CAAC,cAAc;AAAE,sBAAgB,UAAU;AAAG,oBAAc,QAAQ;AAAA,IAAE;AAC1E,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAC3B,yCAAW,cAAc,WAAW,EAAE,MAAM,YAAY,IAAI,SAAS,IAAI;AAEzE,0BAAsB,MAAG;AA9R7B;AA8RgC,4BAAS,YAAT,mBAAkB,kBAAkB,OAAO,QAAQ,OAAO;AAAA,KAAO;AAAA,EAC/F;AAEA,QAAM,cAAc,SAAS,CAAC,WAAW,CAAC,SAAS,SAAY;AAC/D,QAAM,cAAc,CAAC,YAAY,CAAC;AAElC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,CAAC,cAAc,mBAAmB,eAAe,IAAI,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACvG,gBAAc,WAAW,QAAQ;AAAA,MACjC,eAAa,UAAU;AAAA,MACvB,eAAa,UAAU,gBAAgB;AAAA,MACvC,iBAAe,CAAC,eAAe;AAAA,MAE/B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,mBAAiB,gBAAgB,iBAAiB,UAAU,OAAO;AAAA,YACnE,iBAAe,gBAAgB,iBAAiB,QAAQ,OAAO;AAAA,YAC/D,SAAS,MAAG;AAjTpB;AAiTuB,sCAAe,cAAS,YAAT,mBAAkB;AAAA;AAAA,YAE/C;AAAA,8BAAgB,iBAAiB,WAChC,6CAAC,UAAK,WAAU,4CAA4C,wBAAa;AAAA,cAE1E,SAAS,6CAAC,UAAK,WAAU,qBAAqB,iBAAM;AAAA,cACrD;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,WAAU;AAAA,kBACV,OAAO;AAAA,kBACP;AAAA,kBACA,UAAU,CAAC;AAAA,kBACX,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,SAAS,MAAM;AAAE,+BAAW,IAAI;AAAG,wBAAI,YAAa,SAAQ,IAAI;AAAA,kBAAE;AAAA,kBAClE,QAAQ,MAAM,WAAW,KAAK;AAAA,kBAC9B,cAAY,wBAAS;AAAA,kBACrB,iBAAe;AAAA,kBACf,iBAAc;AAAA,kBACd,gBAAc,gBAAgB;AAAA;AAAA,cAChC;AAAA,cACC,gBAAgB,iBAAiB,SAChC,6CAAC,UAAK,WAAU,0CAA0C,wBAAa;AAAA;AAAA;AAAA,QAE3E;AAAA,QACC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,wBAAwB,IAAI;AAAA,cAC5B,mBAAmB,gBAAgB;AAAA,cACnC,YAAY;AAAA,YACd,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC1B,MAAK;AAAA,YACL,cAAW;AAAA,YAEV,qBACC,8EACE;AAAA,2DAAC,SAAI,WAAU,4BACb,uDAAC,SAAI,WAAU,gCACb;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV,UAAU,MAAM;AAAA,kBAAC;AAAA,kBACjB,YAAY;AAAA,kBACZ,iBAAiB;AAAA,kBACjB,iBAAiB,MAAM,eAAe,MAAS;AAAA,kBAC/C,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,gBAAgB;AAAA,kBAChB,QAAQ;AAAA;AAAA,cACV,GACF,GACF;AAAA,cACA,8CAAC,SAAI,WAAU,wBACb;AAAA,8DAAC,SAAI,WAAU,wBACb;AAAA,+DAAC,UAAK,WAAU,0BAAyB,kDAAM;AAAA,kBAC/C,6CAAC,aAAU,OAAO,eAAe,aAA0B,UAAU,sBAAsB;AAAA,mBAC7F;AAAA,gBACA,6CAAC,SAAI,WAAU,8BAA6B;AAAA,gBAC5C,8CAAC,SAAI,WAAU,wBACb;AAAA,+DAAC,UAAK,WAAU,0BAAyB,4CAAK;AAAA,kBAC9C,6CAAC,aAAU,OAAO,aAAa,aAA0B,UAAU,oBAAoB;AAAA,mBACzF;AAAA,iBACF;AAAA,cACA,6CAAC,SAAI,WAAU,8BACb,uDAAC,YAAO,WAAU,sBAAqB,MAAK,UAAS,SAAS,OAAO,gBAAE,GACzE;AAAA,eACF,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,UAAU,MAAM;AAAA,gBAAC;AAAA,gBACjB,YAAY;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,iBAAiB,MAAM,eAAe,MAAS;AAAA,gBAC/C,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,gBAAgB;AAAA,gBAChB,QAAQ;AAAA;AAAA,YACV;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACtXI,IAAAC,sBAAA;AAlBG,SAAS,OAAO;AAAA,EACrB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,UAAU;AAAA,IACd;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,WAAW,IAAI;AAAA,IACf,WAAW;AAAA,IACX;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,8CAAC,YAAQ,GAAG,MAAM,WAAW,SAAS,UAAU,YAAY,SACzD;AAAA;AAAA,IACA,WAAW,6CAAC,WAAQ;AAAA,KACvB;AAEJ;","names":["import_react","import_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","_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/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 { cloneElement, useCallback, useEffect, useRef, useState, type ReactElement, 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 customInput?: ReactElement<{ value?: string; onClick?: () => void }>\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 customInput,\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 {customInput\n ? cloneElement(customInput, {\n value: inputValue,\n onClick: () => interactive && setOpen(prev => !prev),\n })\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"]}
|