@kodezen/kz-react-datepicker 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1794 @@
1
+ import React, { createContext, useContext, useMemo, useState, useRef, useEffect, useCallback } from 'react';
2
+
3
+ function _arrayLikeToArray(r, a) {
4
+ (null == a || a > r.length) && (a = r.length);
5
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
6
+ return n;
7
+ }
8
+ function _arrayWithHoles(r) {
9
+ if (Array.isArray(r)) return r;
10
+ }
11
+ function _defineProperty(e, r, t) {
12
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
13
+ value: t,
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true
17
+ }) : e[r] = t, e;
18
+ }
19
+ function _iterableToArrayLimit(r, l) {
20
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
21
+ if (null != t) {
22
+ var e,
23
+ n,
24
+ i,
25
+ u,
26
+ a = [],
27
+ f = true,
28
+ o = false;
29
+ try {
30
+ if (i = (t = t.call(r)).next, 0 === l) {
31
+ if (Object(t) !== t) return;
32
+ f = !1;
33
+ } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
34
+ } catch (r) {
35
+ o = true, n = r;
36
+ } finally {
37
+ try {
38
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
39
+ } finally {
40
+ if (o) throw n;
41
+ }
42
+ }
43
+ return a;
44
+ }
45
+ }
46
+ function _nonIterableRest() {
47
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
48
+ }
49
+ function ownKeys(e, r) {
50
+ var t = Object.keys(e);
51
+ if (Object.getOwnPropertySymbols) {
52
+ var o = Object.getOwnPropertySymbols(e);
53
+ r && (o = o.filter(function (r) {
54
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
55
+ })), t.push.apply(t, o);
56
+ }
57
+ return t;
58
+ }
59
+ function _objectSpread2(e) {
60
+ for (var r = 1; r < arguments.length; r++) {
61
+ var t = null != arguments[r] ? arguments[r] : {};
62
+ r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
63
+ _defineProperty(e, r, t[r]);
64
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
65
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
66
+ });
67
+ }
68
+ return e;
69
+ }
70
+ function _slicedToArray(r, e) {
71
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
72
+ }
73
+ function _toPrimitive(t, r) {
74
+ if ("object" != typeof t || !t) return t;
75
+ var e = t[Symbol.toPrimitive];
76
+ if (void 0 !== e) {
77
+ var i = e.call(t, r);
78
+ if ("object" != typeof i) return i;
79
+ throw new TypeError("@@toPrimitive must return a primitive value.");
80
+ }
81
+ return ("string" === r ? String : Number)(t);
82
+ }
83
+ function _toPropertyKey(t) {
84
+ var i = _toPrimitive(t, "string");
85
+ return "symbol" == typeof i ? i : i + "";
86
+ }
87
+ function _typeof(o) {
88
+ "@babel/helpers - typeof";
89
+
90
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
91
+ return typeof o;
92
+ } : function (o) {
93
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
94
+ }, _typeof(o);
95
+ }
96
+ function _unsupportedIterableToArray(r, a) {
97
+ if (r) {
98
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
99
+ var t = {}.toString.call(r).slice(8, -1);
100
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
101
+ }
102
+ }
103
+
104
+ var COLORS = ["blue", "orange", "yellow", "red", "purple", "amber", "lime", "green", "emerald", "teal", "cyan", "sky", "indigo", "violet", "fuchsia", "pink", "rose"];
105
+ var DEFAULT_COLOR = "blue";
106
+ var LANGUAGE = "en";
107
+ var DATE_FORMAT = "YYYY-MM-DD";
108
+ var START_WEEK = "sun";
109
+ var DAYS = [0, 1, 2, 3, 4, 5, 6];
110
+ var MONTHS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
111
+
112
+ /**
113
+ * @typedef {Object} Period
114
+ * @property {string|null} start
115
+ * @property {string|null} end
116
+ */
117
+
118
+ /**
119
+ * @typedef {Object} DateValueType
120
+ * @property {Date|string|null} startDate
121
+ * @property {Date|string|null} endDate
122
+ */
123
+
124
+ /**
125
+ * @typedef {Object} DatepickerStore
126
+ * @property {import("react").RefObject} [input]
127
+ * @property {boolean} [asSingle]
128
+ * @property {string} primaryColor
129
+ * @property {Object} [configs]
130
+ * @property {import("react").RefObject} calendarContainer
131
+ * @property {import("react").RefObject} arrowContainer
132
+ * @property {() => void} hideDatepicker
133
+ * @property {Period} period
134
+ * @property {(period: Period) => void} changePeriod
135
+ * @property {string|null} dayHover
136
+ * @property {(day: string|null) => void} changeDayHover
137
+ * @property {string} inputText
138
+ * @property {(text: string) => void} changeInputText
139
+ * @property {(date: Date) => void} updateFirstDate
140
+ * @property {(value: DateValueType, e?: HTMLInputElement | null) => void} changeDatepickerValue
141
+ * @property {boolean} [showFooter]
142
+ * @property {string|null} [placeholder]
143
+ * @property {string} separator
144
+ * @property {string|null} shortcutText
145
+ * @property {string} i18n
146
+ * @property {DateValueType|null} value
147
+ * @property {boolean} [disabled]
148
+ * @property {((className: string) => string)|string|null} [inputClassName]
149
+ * @property {((className: string) => string)|string|null} [containerClassName]
150
+ * @property {((className: string) => string)|string|null} [toggleClassName]
151
+ * @property {(open: boolean) => import("react").ReactNode} [toggleIcon]
152
+ * @property {boolean} [readOnly]
153
+ * @property {string|null} [startWeekOn]
154
+ * @property {string} displayFormat
155
+ * @property {Date|string|null} [minDate]
156
+ * @property {Date|string|null} [maxDate]
157
+ * @property {"forward"|"backward"|"middle"} [dateLooking]
158
+ * @property {Array<{start: Date|string, end: Date|string}>|null} [disabledDates]
159
+ * @property {string} [inputId]
160
+ * @property {string} [inputName]
161
+ * @property {Object} [classNames]
162
+ * @property {string} [popoverDirection]
163
+ * @property {"auto"|"light"|"dark"} theme
164
+ * @property {"bottom"|"top"|"left"|"right"|"auto"} placement
165
+ */
166
+
167
+ /**
168
+ * @type {import("react").Context<DatepickerStore>}
169
+ */
170
+ var DatepickerContext = /*#__PURE__*/createContext({
171
+ input: undefined,
172
+ primaryColor: "blue",
173
+ configs: undefined,
174
+ calendarContainer: null,
175
+ arrowContainer: null,
176
+ period: {
177
+ start: null,
178
+ end: null
179
+ },
180
+ changePeriod: function changePeriod(period) {},
181
+ hideDatepicker: function hideDatepicker() {},
182
+ dayHover: null,
183
+ changeDayHover: function changeDayHover(day) {},
184
+ inputText: "",
185
+ changeInputText: function changeInputText(text) {},
186
+ updateFirstDate: function updateFirstDate(date) {},
187
+ changeDatepickerValue: function changeDatepickerValue(value, e) {},
188
+ showFooter: false,
189
+ value: null,
190
+ i18n: LANGUAGE,
191
+ disabled: false,
192
+ inputClassName: "",
193
+ containerClassName: "",
194
+ toggleClassName: "",
195
+ readOnly: false,
196
+ displayFormat: DATE_FORMAT,
197
+ minDate: null,
198
+ maxDate: null,
199
+ dateLooking: "forward",
200
+ disabledDates: null,
201
+ inputId: undefined,
202
+ inputName: undefined,
203
+ startWeekOn: START_WEEK,
204
+ toggleIcon: undefined,
205
+ classNames: undefined,
206
+ popoverDirection: undefined,
207
+ separator: "~",
208
+ shortcutText: null,
209
+ suffix: "",
210
+ theme: "auto",
211
+ placement: "bottom"
212
+ });
213
+
214
+ function generateArrayNumber() {
215
+ var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
216
+ var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
217
+ var array = [];
218
+ for (var i = start; i <= end; i++) {
219
+ array.push(i);
220
+ }
221
+ return array;
222
+ }
223
+ function shortString(value) {
224
+ var limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
225
+ return value.slice(0, limit);
226
+ }
227
+ function ucFirst(value) {
228
+ return "".concat(value[0].toUpperCase()).concat(value.slice(1));
229
+ }
230
+
231
+ /**
232
+ * Parses a string to Date object or returns the Date if already a Date.
233
+ * Supports basic 'YYYY-MM-DD' parser fallback since removing dayjs.
234
+ * @param {Date|string} date
235
+ * @returns {Date}
236
+ */
237
+ function parseDate(date) {
238
+ if (date instanceof Date) return new Date(date);
239
+ // Attempt simple parsing for YYYY-MM-DD
240
+ if (typeof date === "string" && /^\d{4}-\d{2}-\d{2}$/.test(date)) {
241
+ var _date$split$map = date.split("-").map(Number),
242
+ _date$split$map2 = _slicedToArray(_date$split$map, 3),
243
+ y = _date$split$map2[0],
244
+ m = _date$split$map2[1],
245
+ d = _date$split$map2[2];
246
+ return new Date(y, m - 1, d);
247
+ }
248
+ return new Date(date);
249
+ }
250
+
251
+ /**
252
+ * Format date nicely, replacing dayjs formatting
253
+ * Defaults to YYYY-MM-DD
254
+ * @param {Date|string} date
255
+ * @param {string} format
256
+ * @returns {string}
257
+ */
258
+ function formatDate(date) {
259
+ var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DATE_FORMAT;
260
+ var d = parseDate(date);
261
+ if (!dateIsValid(d)) return "";
262
+ var map = {
263
+ YYYY: d.getFullYear(),
264
+ MM: String(d.getMonth() + 1).padStart(2, "0"),
265
+ DD: String(d.getDate()).padStart(2, "0"),
266
+ ddd: d.toLocaleDateString("en-US", {
267
+ weekday: "short"
268
+ })
269
+ };
270
+ var result = format;
271
+ for (var _i = 0, _Object$entries = Object.entries(map); _i < _Object$entries.length; _i++) {
272
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
273
+ key = _Object$entries$_i[0],
274
+ value = _Object$entries$_i[1];
275
+ result = result.replace(key, value);
276
+ }
277
+ return result;
278
+ }
279
+ function getFirstDayInMonth(date) {
280
+ var d = parseDate(date);
281
+ var firstDay = new Date(d.getFullYear(), d.getMonth(), 1);
282
+ return {
283
+ ddd: formatDate(firstDay, "ddd"),
284
+ basic: formatDate(firstDay),
285
+ object: firstDay
286
+ };
287
+ }
288
+ function getDaysInMonth(date) {
289
+ var d = parseDate(date);
290
+ var days = new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();
291
+ return generateArrayNumber(1, days);
292
+ }
293
+ function nextMonth(date) {
294
+ var d = parseDate(date);
295
+ return new Date(d.getFullYear(), d.getMonth() + 1, 1);
296
+ }
297
+ function previousMonth(date) {
298
+ var d = parseDate(date);
299
+ return new Date(d.getFullYear(), d.getMonth() - 1, 1);
300
+ }
301
+ function getFirstElementsInArray() {
302
+ var array = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
303
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
304
+ return array.slice(0, size);
305
+ }
306
+ function getLastElementsInArray() {
307
+ var array = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
308
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
309
+ var result = [];
310
+ if (Array.isArray(array) && size > 0) {
311
+ if (size >= array.length) {
312
+ return array;
313
+ }
314
+ var y = array.length - 1;
315
+ for (var i = 0; i < size; i++) {
316
+ result.push(array[y]);
317
+ y--;
318
+ }
319
+ }
320
+ return result.reverse();
321
+ }
322
+ function getNumberOfDay(dayString) {
323
+ var startWeekOn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "sun";
324
+ var number = 0;
325
+ var startDateModifier = 0;
326
+ switch (startWeekOn) {
327
+ case "mon":
328
+ startDateModifier = 6;
329
+ break;
330
+ case "tue":
331
+ startDateModifier = 5;
332
+ break;
333
+ case "wed":
334
+ startDateModifier = 4;
335
+ break;
336
+ case "thu":
337
+ startDateModifier = 3;
338
+ break;
339
+ case "fri":
340
+ startDateModifier = 2;
341
+ break;
342
+ case "sat":
343
+ startDateModifier = 1;
344
+ break;
345
+ case "sun":
346
+ default:
347
+ startDateModifier = 0;
348
+ break;
349
+ }
350
+ var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
351
+ days.forEach(function (item, index) {
352
+ if (item.includes(dayString)) {
353
+ number = (index + startDateModifier) % 7;
354
+ }
355
+ });
356
+ return number;
357
+ }
358
+ function getLastDaysInMonth(date) {
359
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
360
+ return getLastElementsInArray(getDaysInMonth(date), size);
361
+ }
362
+ function getFirstDaysInMonth(date) {
363
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
364
+ return getFirstElementsInArray(getDaysInMonth(date), size);
365
+ }
366
+ function dateIsValid(date) {
367
+ return date instanceof Date && !isNaN(date.getTime());
368
+ }
369
+ function isSameDate(date1, date2) {
370
+ var d1 = parseDate(date1);
371
+ var d2 = parseDate(date2);
372
+ if (!dateIsValid(d1) || !dateIsValid(d2)) return false;
373
+ return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate();
374
+ }
375
+ function isBeforeDate(date1, date2) {
376
+ var d1 = parseDate(date1);
377
+ var d2 = parseDate(date2);
378
+ if (!dateIsValid(d1) || !dateIsValid(d2)) return false;
379
+
380
+ // Set time limits for strict date comparison
381
+ var t1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate()).getTime();
382
+ var t2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate()).getTime();
383
+ return t1 < t2;
384
+ }
385
+ function isAfterDate(date1, date2) {
386
+ var d1 = parseDate(date1);
387
+ var d2 = parseDate(date2);
388
+ if (!dateIsValid(d1) || !dateIsValid(d2)) return false;
389
+ var t1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate()).getTime();
390
+ var t2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate()).getTime();
391
+ return t1 > t2;
392
+ }
393
+ function isBetweenDates(target, date1, date2) {
394
+ var t = parseDate(target).getTime();
395
+ var d1 = parseDate(date1).getTime();
396
+ var d2 = parseDate(date2).getTime();
397
+ var start = Math.min(d1, d2);
398
+ var end = Math.max(d1, d2);
399
+ return t > start && t < end;
400
+ }
401
+
402
+ var ChevronLeftIcon = function ChevronLeftIcon(_ref3) {
403
+ var _ref3$className = _ref3.className,
404
+ className = _ref3$className === void 0 ? "w-6 h-6" : _ref3$className;
405
+ return /*#__PURE__*/React.createElement("svg", {
406
+ className: className,
407
+ xmlns: "http://www.w3.org/2000/svg",
408
+ fill: "none",
409
+ viewBox: "0 0 24 24",
410
+ strokeWidth: 1.5,
411
+ stroke: "currentColor"
412
+ }, /*#__PURE__*/React.createElement("path", {
413
+ strokeLinecap: "round",
414
+ strokeLinejoin: "round",
415
+ d: "M15.75 19.5L8.25 12l7.5-7.5"
416
+ }));
417
+ };
418
+ var DoubleChevronLeftIcon = function DoubleChevronLeftIcon(_ref4) {
419
+ var _ref4$className = _ref4.className,
420
+ className = _ref4$className === void 0 ? "w-6 h-6" : _ref4$className;
421
+ return /*#__PURE__*/React.createElement("svg", {
422
+ className: className,
423
+ xmlns: "http://www.w3.org/2000/svg",
424
+ fill: "none",
425
+ viewBox: "0 0 24 24",
426
+ strokeWidth: 1.5,
427
+ stroke: "currentColor"
428
+ }, /*#__PURE__*/React.createElement("path", {
429
+ strokeLinecap: "round",
430
+ strokeLinejoin: "round",
431
+ d: "M18.75 19.5l-7.5-7.5 7.5-7.5m-6 15L5.25 12l7.5-7.5"
432
+ }));
433
+ };
434
+ var ChevronRightIcon = function ChevronRightIcon(_ref5) {
435
+ var _ref5$className = _ref5.className,
436
+ className = _ref5$className === void 0 ? "w-6 h-6" : _ref5$className;
437
+ return /*#__PURE__*/React.createElement("svg", {
438
+ className: className,
439
+ xmlns: "http://www.w3.org/2000/svg",
440
+ fill: "none",
441
+ viewBox: "0 0 24 24",
442
+ strokeWidth: 1.5,
443
+ stroke: "currentColor"
444
+ }, /*#__PURE__*/React.createElement("path", {
445
+ strokeLinecap: "round",
446
+ strokeLinejoin: "round",
447
+ d: "M8.25 4.5l7.5 7.5-7.5 7.5"
448
+ }));
449
+ };
450
+ var DoubleChevronRightIcon = function DoubleChevronRightIcon(_ref6) {
451
+ var _ref6$className = _ref6.className,
452
+ className = _ref6$className === void 0 ? "w-6 h-6" : _ref6$className;
453
+ return /*#__PURE__*/React.createElement("svg", {
454
+ className: className,
455
+ xmlns: "http://www.w3.org/2000/svg",
456
+ fill: "none",
457
+ viewBox: "0 0 24 24",
458
+ strokeWidth: 1.5,
459
+ stroke: "currentColor"
460
+ }, /*#__PURE__*/React.createElement("path", {
461
+ strokeLinecap: "round",
462
+ strokeLinejoin: "round",
463
+ d: "M11.25 4.5l7.5 7.5-7.5 7.5m-6-15l7.5 7.5-7.5 7.5"
464
+ }));
465
+ };
466
+ var Arrow = /*#__PURE__*/React.forwardRef(function (props, ref) {
467
+ var _useContext = useContext(DatepickerContext),
468
+ suffix = _useContext.suffix;
469
+ var baseClass = "kz-arrow-indicator";
470
+ return /*#__PURE__*/React.createElement("div", {
471
+ ref: ref,
472
+ className: baseClass + (suffix ? " ".concat(baseClass, "--").concat(suffix) : "")
473
+ });
474
+ });
475
+ var SecondaryButton = function SecondaryButton(_ref7) {
476
+ var children = _ref7.children,
477
+ onClick = _ref7.onClick,
478
+ _ref7$disabled = _ref7.disabled,
479
+ disabled = _ref7$disabled === void 0 ? false : _ref7$disabled;
480
+ var _useContext2 = useContext(DatepickerContext),
481
+ suffix = _useContext2.suffix;
482
+ var baseClass = "kz-secondary-btn";
483
+ return /*#__PURE__*/React.createElement("button", {
484
+ type: "button",
485
+ className: baseClass + (suffix ? " ".concat(baseClass, "--").concat(suffix) : ""),
486
+ onClick: onClick,
487
+ disabled: disabled
488
+ }, children);
489
+ };
490
+ var PrimaryButton = function PrimaryButton(_ref8) {
491
+ var children = _ref8.children,
492
+ onClick = _ref8.onClick,
493
+ _ref8$disabled = _ref8.disabled,
494
+ disabled = _ref8$disabled === void 0 ? false : _ref8$disabled;
495
+ var _useContext3 = useContext(DatepickerContext),
496
+ suffix = _useContext3.suffix;
497
+ var baseClass = "kz-primary-btn";
498
+ return /*#__PURE__*/React.createElement("button", {
499
+ type: "button",
500
+ className: baseClass + (suffix ? " ".concat(baseClass, "--").concat(suffix) : ""),
501
+ onClick: onClick,
502
+ disabled: disabled
503
+ }, children);
504
+ };
505
+ var RoundedButton = function RoundedButton(_ref9) {
506
+ var children = _ref9.children,
507
+ onClick = _ref9.onClick,
508
+ disabled = _ref9.disabled,
509
+ _ref9$roundedFull = _ref9.roundedFull,
510
+ roundedFull = _ref9$roundedFull === void 0 ? false : _ref9$roundedFull,
511
+ _ref9$active = _ref9.active,
512
+ active = _ref9$active === void 0 ? false : _ref9$active;
513
+ var _useContext4 = useContext(DatepickerContext),
514
+ suffix = _useContext4.suffix;
515
+ var baseClass = "kz-rounded-btn";
516
+ var cn = [baseClass];
517
+ if (suffix) cn.push("".concat(baseClass, "--").concat(suffix));
518
+ if (roundedFull) {
519
+ cn.push("is-rounded-full");
520
+ if (suffix) cn.push("is-rounded-full--".concat(suffix));
521
+ }
522
+ if (active) {
523
+ cn.push("is-active");
524
+ if (suffix) cn.push("is-active--".concat(suffix));
525
+ }
526
+ return /*#__PURE__*/React.createElement("button", {
527
+ type: "button",
528
+ className: cn.join(" "),
529
+ onClick: onClick,
530
+ disabled: disabled
531
+ }, children);
532
+ };
533
+ var VerticalDash = function VerticalDash() {
534
+ var _useContext5 = useContext(DatepickerContext),
535
+ suffix = _useContext5.suffix;
536
+ var baseClass = "kz-vertical-dash";
537
+ return /*#__PURE__*/React.createElement("div", {
538
+ className: baseClass + (suffix ? " ".concat(baseClass, "--").concat(suffix) : "")
539
+ });
540
+ };
541
+
542
+ var Days = function Days(_ref) {
543
+ var calendarData = _ref.calendarData,
544
+ onClickPreviousDays = _ref.onClickPreviousDays,
545
+ onClickDay = _ref.onClickDay,
546
+ onClickNextDays = _ref.onClickNextDays;
547
+ var _useContext = useContext(DatepickerContext),
548
+ period = _useContext.period,
549
+ dayHover = _useContext.dayHover,
550
+ changeDayHover = _useContext.changeDayHover,
551
+ minDate = _useContext.minDate,
552
+ maxDate = _useContext.maxDate,
553
+ disabledDates = _useContext.disabledDates,
554
+ suffix = _useContext.suffix;
555
+ var isDateDisabledInner = function isDateDisabledInner(day, type) {
556
+ var date = calendarData.date;
557
+ var m = date.getMonth();
558
+ var y = date.getFullYear();
559
+ if (type === "previous") m -= 1;
560
+ if (type === "next") m += 1;
561
+ var currentDayDate = new Date(y, m, day);
562
+ if (minDate && isBeforeDate(currentDayDate, minDate)) return true;
563
+ if (maxDate && isAfterDate(currentDayDate, maxDate)) return true;
564
+ if (disabledDates !== null && disabledDates !== void 0 && disabledDates.length) {
565
+ for (var i = 0; i < disabledDates.length; i++) {
566
+ if (isBetweenDates(currentDayDate, disabledDates[i].startDate, disabledDates[i].endDate) || currentDayDate.getTime() === new Date(disabledDates[i].startDate).getTime() || currentDayDate.getTime() === new Date(disabledDates[i].endDate).getTime()) {
567
+ return true;
568
+ }
569
+ }
570
+ }
571
+ return false;
572
+ };
573
+ var isDateDisabled = function isDateDisabled(day, type) {
574
+ return isDateDisabledInner(day, type);
575
+ };
576
+ var getButtonClass = function getButtonClass(day, type) {
577
+ var date = calendarData.date;
578
+ var m = date.getMonth();
579
+ var y = date.getFullYear();
580
+ if (type === "previous") m -= 1;
581
+ if (type === "next") m += 1;
582
+ var currentDayDate = new Date(y, m, day);
583
+ var today = new Date();
584
+ var isToday = today.getDate() === day && today.getMonth() === m && today.getFullYear() === y;
585
+ var start = period.start ? parseDate(period.start) : null;
586
+ var end = period.end ? parseDate(period.end) : null;
587
+ var hover = dayHover ? parseDate(dayHover) : null;
588
+ var baseClass = "kz-calendar-day";
589
+ if (suffix) baseClass += " kz-calendar-day--".concat(suffix);
590
+ if (type !== "current" || isDateDisabled(day, type)) {
591
+ baseClass += " kz-calendar-day-disabled";
592
+ if (suffix) baseClass += " kz-calendar-day-disabled--".concat(suffix);
593
+ return baseClass;
594
+ }
595
+ if (isToday) {
596
+ baseClass += " kz-calendar-day-today";
597
+ if (suffix) baseClass += " kz-calendar-day-today--".concat(suffix);
598
+ }
599
+ var isStart = start && isSameDate(start, currentDayDate);
600
+ var isEnd = end && isSameDate(end, currentDayDate);
601
+
602
+ // Initial click: make it rounded
603
+ if (start && !end && isStart) {
604
+ baseClass += " kz-calendar-day-active kz-calendar-day-rounded";
605
+ if (suffix) {
606
+ baseClass += " kz-calendar-day-active--".concat(suffix, " kz-calendar-day-rounded--").concat(suffix);
607
+ }
608
+ return baseClass;
609
+ }
610
+ if (isStart && isEnd) {
611
+ baseClass += " kz-calendar-day-active kz-calendar-day-rounded";
612
+ if (suffix) {
613
+ baseClass += " kz-calendar-day-active--".concat(suffix, " kz-calendar-day-rounded--").concat(suffix);
614
+ }
615
+ } else if (isStart) {
616
+ baseClass += " kz-calendar-day-active";
617
+ if (suffix) baseClass += " kz-calendar-day-active--".concat(suffix);
618
+ var isStartBeforeEnd = end && isBeforeDate(start, end);
619
+ var isStartBeforeHover = !end && hover && isBeforeDate(start, hover);
620
+ if (isStartBeforeEnd || isStartBeforeHover) {
621
+ baseClass += " kz-calendar-day-hover-left";
622
+ if (suffix) baseClass += " kz-calendar-day-hover-left--".concat(suffix);
623
+ } else {
624
+ baseClass += " kz-calendar-day-hover-right";
625
+ if (suffix) baseClass += " kz-calendar-day-hover-right--".concat(suffix);
626
+ }
627
+ } else if (isEnd) {
628
+ baseClass += " kz-calendar-day-active";
629
+ if (suffix) baseClass += " kz-calendar-day-active--".concat(suffix);
630
+ var isEndAfterStart = start && isAfterDate(end, start);
631
+ var isEndAfterHover = !start && hover && isAfterDate(end, hover);
632
+ if (isEndAfterStart || isEndAfterHover) {
633
+ baseClass += " kz-calendar-day-hover-right";
634
+ if (suffix) baseClass += " kz-calendar-day-hover-right--".concat(suffix);
635
+ } else {
636
+ baseClass += " kz-calendar-day-hover-left";
637
+ if (suffix) baseClass += " kz-calendar-day-hover-left--".concat(suffix);
638
+ }
639
+ }
640
+ if (start && end && isBetweenDates(currentDayDate, start, end)) {
641
+ baseClass += " kz-calendar-day-in-range";
642
+ if (suffix) baseClass += " kz-calendar-day-in-range--".concat(suffix);
643
+ }
644
+ if (hover) {
645
+ if (start && !end && isBetweenDates(currentDayDate, start, hover)) {
646
+ baseClass += " kz-calendar-day-in-range";
647
+ if (suffix) baseClass += " kz-calendar-day-in-range--".concat(suffix);
648
+ }
649
+ if (end && !start && isBetweenDates(currentDayDate, hover, end)) {
650
+ baseClass += " kz-calendar-day-in-range";
651
+ if (suffix) baseClass += " kz-calendar-day-in-range--".concat(suffix);
652
+ }
653
+ if (hover.getTime() === currentDayDate.getTime() && !(isStart || isEnd)) {
654
+ baseClass += " kz-calendar-day-hover-end";
655
+ if (suffix) baseClass += " kz-calendar-day-hover-end--".concat(suffix);
656
+ if (start) {
657
+ if (isBeforeDate(currentDayDate, start)) {
658
+ baseClass += " kz-calendar-day-hover-left";
659
+ if (suffix) baseClass += " kz-calendar-day-hover-left--".concat(suffix);
660
+ } else {
661
+ baseClass += " kz-calendar-day-hover-right";
662
+ if (suffix) baseClass += " kz-calendar-day-hover-right--".concat(suffix);
663
+ }
664
+ } else if (end) {
665
+ if (isAfterDate(currentDayDate, end)) {
666
+ baseClass += " kz-calendar-day-hover-right";
667
+ if (suffix) baseClass += " kz-calendar-day-hover-right--".concat(suffix);
668
+ } else {
669
+ baseClass += " kz-calendar-day-hover-left";
670
+ if (suffix) baseClass += " kz-calendar-day-hover-left--".concat(suffix);
671
+ }
672
+ }
673
+ }
674
+ }
675
+ return baseClass;
676
+ };
677
+ var handleClick = function handleClick(day, type) {
678
+ if (isDateDisabled(day, type)) return;
679
+ if (type === "previous") onClickPreviousDays(day);
680
+ if (type === "current") onClickDay(day);
681
+ if (type === "next") onClickNextDays(day);
682
+ };
683
+ var processHover = function processHover(day, type) {
684
+ if (isDateDisabled(day, type)) return;
685
+ var date = calendarData.date;
686
+ var m = date.getMonth();
687
+ var y = date.getFullYear();
688
+ if (type === "previous") m -= 1;
689
+ if (type === "next") m += 1;
690
+ var dStr = "".concat(y, "-").concat(String(m + 1).padStart(2, '0'), "-").concat(String(day).padStart(2, '0'));
691
+ changeDayHover(dStr);
692
+ };
693
+ return /*#__PURE__*/React.createElement("div", {
694
+ className: "kz-calendar-days-grid" + (suffix ? " kz-calendar-days-grid--".concat(suffix) : ""),
695
+ onMouseLeave: function onMouseLeave() {
696
+ return changeDayHover(null);
697
+ }
698
+ }, ["previous", "current", "next"].map(function (type) {
699
+ return calendarData.days[type].map(function (day, idx) {
700
+ return /*#__PURE__*/React.createElement("button", {
701
+ key: "".concat(type, "-").concat(idx),
702
+ className: getButtonClass(day, type),
703
+ onClick: function onClick() {
704
+ return handleClick(day, type);
705
+ },
706
+ onMouseOver: function onMouseOver() {
707
+ return processHover(day, type);
708
+ },
709
+ disabled: isDateDisabled(day, type)
710
+ }, day);
711
+ });
712
+ }));
713
+ };
714
+
715
+ var Months = function Months(_ref) {
716
+ var currentMonth = _ref.currentMonth,
717
+ clickMonth = _ref.clickMonth;
718
+ var _useContext = useContext(DatepickerContext),
719
+ i18n = _useContext.i18n,
720
+ suffix = _useContext.suffix;
721
+ var getMonthName = function getMonthName(monthNumber) {
722
+ var date = new Date(2022, monthNumber - 1, 1);
723
+ return date.toLocaleString(i18n || "en-US", {
724
+ month: "short"
725
+ });
726
+ };
727
+ return /*#__PURE__*/React.createElement("div", {
728
+ className: "kz-calendar-months-grid" + (suffix ? " kz-calendar-months-grid--".concat(suffix) : "")
729
+ }, MONTHS.map(function (item) {
730
+ return /*#__PURE__*/React.createElement(RoundedButton, {
731
+ key: item,
732
+ padding: "py-3",
733
+ onClick: function onClick() {
734
+ return clickMonth(item);
735
+ },
736
+ active: currentMonth === item
737
+ }, getMonthName(item));
738
+ }));
739
+ };
740
+
741
+ var Week = function Week() {
742
+ var _useContext = useContext(DatepickerContext),
743
+ i18n = _useContext.i18n,
744
+ startWeekOn = _useContext.startWeekOn,
745
+ suffix = _useContext.suffix;
746
+ var startDateModifier = useMemo(function () {
747
+ switch (startWeekOn) {
748
+ case "mon":
749
+ return 1;
750
+ case "tue":
751
+ return 2;
752
+ case "wed":
753
+ return 3;
754
+ case "thu":
755
+ return 4;
756
+ case "fri":
757
+ return 5;
758
+ case "sat":
759
+ return 6;
760
+ case "sun":
761
+ default:
762
+ return 0;
763
+ }
764
+ }, [startWeekOn]);
765
+ var getDayName = function getDayName(dayIndex) {
766
+ // Nov 6, 2022 is a Sunday.
767
+ var date = new Date(2022, 10, 6 + dayIndex + startDateModifier);
768
+ return ucFirst(shortString(date.toLocaleDateString(i18n || "en-US", {
769
+ weekday: "short"
770
+ })));
771
+ };
772
+ return /*#__PURE__*/React.createElement("div", {
773
+ className: "kz-calendar-week-grid" + (suffix ? " kz-calendar-week-grid--".concat(suffix) : "")
774
+ }, DAYS.map(function (item) {
775
+ return /*#__PURE__*/React.createElement("div", {
776
+ key: item,
777
+ className: "kz-calendar-week-day" + (suffix ? " kz-calendar-week-day--".concat(suffix) : "")
778
+ }, getDayName(item));
779
+ }));
780
+ };
781
+
782
+ var Years = function Years(_ref) {
783
+ var year = _ref.year,
784
+ currentYear = _ref.currentYear,
785
+ minYear = _ref.minYear,
786
+ maxYear = _ref.maxYear,
787
+ clickYear = _ref.clickYear;
788
+ var _useContext = useContext(DatepickerContext),
789
+ dateLooking = _useContext.dateLooking,
790
+ suffix = _useContext.suffix;
791
+ var startDate = 0;
792
+ var endDate = 0;
793
+ switch (dateLooking) {
794
+ case "backward":
795
+ startDate = year - 11;
796
+ endDate = year;
797
+ break;
798
+ case "middle":
799
+ startDate = year - 4;
800
+ endDate = year + 7;
801
+ break;
802
+ case "forward":
803
+ default:
804
+ startDate = year;
805
+ endDate = year + 11;
806
+ break;
807
+ }
808
+ return /*#__PURE__*/React.createElement("div", {
809
+ className: "kz-calendar-years-grid" + (suffix ? " kz-calendar-years-grid--".concat(suffix) : "")
810
+ }, generateArrayNumber(startDate, endDate).map(function (item, index) {
811
+ return /*#__PURE__*/React.createElement(RoundedButton, {
812
+ key: index,
813
+ padding: "py-3",
814
+ onClick: function onClick() {
815
+ return clickYear(item);
816
+ },
817
+ active: currentYear === item,
818
+ disabled: maxYear !== null && item > maxYear || minYear !== null && item < minYear
819
+ }, item);
820
+ }));
821
+ };
822
+
823
+ var Calendar = function Calendar(_ref) {
824
+ var date = _ref.date,
825
+ minDate = _ref.minDate,
826
+ maxDate = _ref.maxDate,
827
+ onClickPrevious = _ref.onClickPrevious,
828
+ onClickNext = _ref.onClickNext,
829
+ changeMonth = _ref.changeMonth,
830
+ changeYear = _ref.changeYear;
831
+ var _useContext = useContext(DatepickerContext),
832
+ asSingle = _useContext.asSingle,
833
+ showFooter = _useContext.showFooter,
834
+ changeDatepickerValue = _useContext.changeDatepickerValue,
835
+ hideDatepicker = _useContext.hideDatepicker,
836
+ period = _useContext.period,
837
+ changePeriod = _useContext.changePeriod,
838
+ changeDayHover = _useContext.changeDayHover,
839
+ startWeekOn = _useContext.startWeekOn,
840
+ input = _useContext.input,
841
+ suffix = _useContext.suffix;
842
+ var _useState = useState(false),
843
+ _useState2 = _slicedToArray(_useState, 2),
844
+ showMonths = _useState2[0],
845
+ setShowMonths = _useState2[1];
846
+ var _useState3 = useState(false),
847
+ _useState4 = _slicedToArray(_useState3, 2),
848
+ showYears = _useState4[0],
849
+ setShowYears = _useState4[1];
850
+ var _useState5 = useState(date.getFullYear()),
851
+ _useState6 = _slicedToArray(_useState5, 2),
852
+ year = _useState6[0],
853
+ setYear = _useState6[1];
854
+ var previous = function previous() {
855
+ return getLastDaysInMonth(previousMonth(date), getNumberOfDay(getFirstDayInMonth(date).ddd, startWeekOn));
856
+ };
857
+ var current = function current() {
858
+ return getDaysInMonth(date);
859
+ };
860
+ var next = function next() {
861
+ return getFirstDaysInMonth(previousMonth(date), 42 - (previous().length + current().length));
862
+ };
863
+ var hideMonths = function hideMonths() {
864
+ return showMonths && setShowMonths(false);
865
+ };
866
+ var hideYears = function hideYears() {
867
+ return showYears && setShowYears(false);
868
+ };
869
+ var clickMonth = function clickMonth(month) {
870
+ setTimeout(function () {
871
+ changeMonth(month);
872
+ setShowMonths(!showMonths);
873
+ }, 250);
874
+ };
875
+ var clickYear = function clickYear(year) {
876
+ setTimeout(function () {
877
+ changeYear(year);
878
+ setShowYears(!showYears);
879
+ }, 250);
880
+ };
881
+ var clickDay = function clickDay(day) {
882
+ var month = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : date.getMonth() + 1;
883
+ var year = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : date.getFullYear();
884
+ var fullDay = "".concat(year, "-").concat(String(month).padStart(2, "0"), "-").concat(String(day).padStart(2, "0"));
885
+ var newStart;
886
+ var newEnd = null;
887
+ function chosePeriod(start, end) {
888
+ changeDatepickerValue({
889
+ startDate: start,
890
+ endDate: end
891
+ }, input === null || input === void 0 ? void 0 : input.current);
892
+ hideDatepicker();
893
+ }
894
+ if (period.start && period.end) {
895
+ changeDayHover(null);
896
+ changePeriod({
897
+ start: null,
898
+ end: null
899
+ });
900
+ }
901
+ if (!period.start && !period.end || period.start && period.end) {
902
+ if (!period.start && !period.end) {
903
+ changeDayHover(fullDay);
904
+ }
905
+ newStart = fullDay;
906
+ if (asSingle) {
907
+ newEnd = fullDay;
908
+ chosePeriod(fullDay, fullDay);
909
+ }
910
+ } else {
911
+ if (period.start && !period.end) {
912
+ var startDate = new Date(period.start);
913
+ var clickedDate = new Date(fullDay);
914
+ var condition = clickedDate.getTime() >= startDate.getTime();
915
+ newStart = condition ? period.start : fullDay;
916
+ newEnd = condition ? fullDay : period.start;
917
+ } else {
918
+ var endDate = new Date(period.end);
919
+ var _clickedDate = new Date(fullDay);
920
+ var _condition = _clickedDate.getTime() <= endDate.getTime();
921
+ newStart = _condition ? fullDay : period.start;
922
+ newEnd = _condition ? period.end : fullDay;
923
+ }
924
+ if (!showFooter && newStart && newEnd) {
925
+ chosePeriod(newStart, newEnd);
926
+ }
927
+ }
928
+ if (!(newEnd && newStart) || showFooter) {
929
+ changePeriod({
930
+ start: newStart,
931
+ end: newEnd
932
+ });
933
+ }
934
+ };
935
+ var clickPreviousDays = function clickPreviousDays(day) {
936
+ var newDate = previousMonth(date);
937
+ clickDay(day, newDate.getMonth() + 1, newDate.getFullYear());
938
+ onClickPrevious();
939
+ };
940
+ var clickNextDays = function clickNextDays(day) {
941
+ var newDate = nextMonth(date);
942
+ clickDay(day, newDate.getMonth() + 1, newDate.getFullYear());
943
+ onClickNext();
944
+ };
945
+ React.useEffect(function () {
946
+ setYear(date.getFullYear());
947
+ }, [date]);
948
+ var calendarData = useMemo(function () {
949
+ return {
950
+ date: date,
951
+ days: {
952
+ previous: previous(),
953
+ current: current(),
954
+ next: next()
955
+ }
956
+ };
957
+ }, [date, previous, current, next]);
958
+ var minYear = useMemo(function () {
959
+ return minDate ? new Date(minDate).getFullYear() : null;
960
+ }, [minDate]);
961
+ var maxYear = useMemo(function () {
962
+ return maxDate ? new Date(maxDate).getFullYear() : null;
963
+ }, [maxDate]);
964
+ return /*#__PURE__*/React.createElement("div", {
965
+ className: "kz-calendar" + (suffix ? " kz-calendar--".concat(suffix) : "")
966
+ }, /*#__PURE__*/React.createElement("div", {
967
+ className: "kz-calendar-header" + (suffix ? " kz-calendar-header--".concat(suffix) : "")
968
+ }, !showMonths && !showYears && /*#__PURE__*/React.createElement("div", {
969
+ className: "kz-calendar-header-nav" + (suffix ? " kz-calendar-header-nav--".concat(suffix) : "")
970
+ }, /*#__PURE__*/React.createElement(RoundedButton, {
971
+ roundedFull: true,
972
+ onClick: onClickPrevious
973
+ }, /*#__PURE__*/React.createElement(ChevronLeftIcon, null))), showYears && /*#__PURE__*/React.createElement("div", {
974
+ className: "kz-calendar-header-nav" + (suffix ? " kz-calendar-header-nav--".concat(suffix) : "")
975
+ }, /*#__PURE__*/React.createElement(RoundedButton, {
976
+ roundedFull: true,
977
+ onClick: function onClick() {
978
+ return setYear(year - 12);
979
+ }
980
+ }, /*#__PURE__*/React.createElement(DoubleChevronLeftIcon, null))), /*#__PURE__*/React.createElement("div", {
981
+ className: "kz-calendar-header-title" + (suffix ? " kz-calendar-header-title--".concat(suffix) : "")
982
+ }, /*#__PURE__*/React.createElement("div", {
983
+ className: "kz-calendar-header-month" + (suffix ? " kz-calendar-header-month--".concat(suffix) : "")
984
+ }, /*#__PURE__*/React.createElement(RoundedButton, {
985
+ onClick: function onClick() {
986
+ setShowMonths(!showMonths);
987
+ hideYears();
988
+ }
989
+ }, date.toLocaleDateString("en-US", {
990
+ month: "short"
991
+ }))), /*#__PURE__*/React.createElement("div", {
992
+ className: "kz-calendar-header-year" + (suffix ? " kz-calendar-header-year--".concat(suffix) : "")
993
+ }, /*#__PURE__*/React.createElement(RoundedButton, {
994
+ onClick: function onClick() {
995
+ setShowYears(!showYears);
996
+ hideMonths();
997
+ }
998
+ }, date.getFullYear()))), showYears && /*#__PURE__*/React.createElement("div", {
999
+ className: "kz-calendar-header-nav" + (suffix ? " kz-calendar-header-nav--".concat(suffix) : "")
1000
+ }, /*#__PURE__*/React.createElement(RoundedButton, {
1001
+ roundedFull: true,
1002
+ onClick: function onClick() {
1003
+ return setYear(year + 12);
1004
+ }
1005
+ }, /*#__PURE__*/React.createElement(DoubleChevronRightIcon, null))), !showMonths && !showYears && /*#__PURE__*/React.createElement("div", {
1006
+ className: "kz-calendar-header-nav" + (suffix ? " kz-calendar-header-nav--".concat(suffix) : "")
1007
+ }, /*#__PURE__*/React.createElement(RoundedButton, {
1008
+ roundedFull: true,
1009
+ onClick: onClickNext
1010
+ }, /*#__PURE__*/React.createElement(ChevronRightIcon, null)))), /*#__PURE__*/React.createElement("div", {
1011
+ className: "kz-calendar-body" + (suffix ? " kz-calendar-body--".concat(suffix) : "")
1012
+ }, showMonths && /*#__PURE__*/React.createElement(Months, {
1013
+ currentMonth: date.getMonth() + 1,
1014
+ clickMonth: clickMonth
1015
+ }), showYears && /*#__PURE__*/React.createElement(Years, {
1016
+ year: year,
1017
+ minYear: minYear,
1018
+ maxYear: maxYear,
1019
+ currentYear: date.getFullYear(),
1020
+ clickYear: clickYear
1021
+ }), !showMonths && !showYears && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Week, null), /*#__PURE__*/React.createElement(Days, {
1022
+ calendarData: calendarData,
1023
+ onClickPreviousDays: clickPreviousDays,
1024
+ onClickDay: clickDay,
1025
+ onClickNextDays: clickNextDays
1026
+ }))));
1027
+ };
1028
+
1029
+ var Footer = function Footer() {
1030
+ var _configs$footer, _configs$footer2;
1031
+ var _useContext = useContext(DatepickerContext),
1032
+ hideDatepicker = _useContext.hideDatepicker,
1033
+ period = _useContext.period,
1034
+ changeDatepickerValue = _useContext.changeDatepickerValue,
1035
+ configs = _useContext.configs,
1036
+ suffix = _useContext.suffix;
1037
+ return /*#__PURE__*/React.createElement("div", {
1038
+ className: "kz-datepicker-footer" + (suffix ? " kz-datepicker-footer--".concat(suffix) : "")
1039
+ }, /*#__PURE__*/React.createElement("div", {
1040
+ className: "kz-datepicker-footer-buttons" + (suffix ? " kz-datepicker-footer-buttons--".concat(suffix) : "")
1041
+ }, /*#__PURE__*/React.createElement(SecondaryButton, {
1042
+ onClick: hideDatepicker
1043
+ }, configs !== null && configs !== void 0 && (_configs$footer = configs.footer) !== null && _configs$footer !== void 0 && _configs$footer.cancel ? configs.footer.cancel : "Cancel"), /*#__PURE__*/React.createElement(PrimaryButton, {
1044
+ onClick: function onClick() {
1045
+ if (period.start && period.end) {
1046
+ changeDatepickerValue({
1047
+ startDate: formatDate(period.start, DATE_FORMAT),
1048
+ endDate: formatDate(period.end, DATE_FORMAT)
1049
+ });
1050
+ hideDatepicker();
1051
+ }
1052
+ },
1053
+ disabled: !(period.start && period.end)
1054
+ }, configs !== null && configs !== void 0 && (_configs$footer2 = configs.footer) !== null && _configs$footer2 !== void 0 && _configs$footer2.apply ? configs.footer.apply : "Apply")));
1055
+ };
1056
+
1057
+ var ToggleButton = function ToggleButton(_ref) {
1058
+ _ref.isEmpty;
1059
+ return /*#__PURE__*/React.createElement("svg", {
1060
+ className: "kz-datepicker-toggle-icon",
1061
+ xmlns: "http://www.w3.org/2000/svg",
1062
+ fill: "none",
1063
+ viewBox: "0 0 24 24",
1064
+ strokeWidth: 1.5,
1065
+ stroke: "currentColor"
1066
+ }, /*#__PURE__*/React.createElement("path", {
1067
+ strokeLinecap: "round",
1068
+ strokeLinejoin: "round",
1069
+ d: "M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z"
1070
+ }));
1071
+ };
1072
+ var Input = function Input(_ref2) {
1073
+ var _shortcutTextRef$curr;
1074
+ var setContextRef = _ref2.setContextRef;
1075
+ var _useContext = useContext(DatepickerContext),
1076
+ period = _useContext.period,
1077
+ dayHover = _useContext.dayHover,
1078
+ changeDayHover = _useContext.changeDayHover,
1079
+ calendarContainer = _useContext.calendarContainer,
1080
+ arrowContainer = _useContext.arrowContainer,
1081
+ inputText = _useContext.inputText,
1082
+ changeInputText = _useContext.changeInputText,
1083
+ hideDatepicker = _useContext.hideDatepicker,
1084
+ changeDatepickerValue = _useContext.changeDatepickerValue,
1085
+ asSingle = _useContext.asSingle,
1086
+ placeholder = _useContext.placeholder,
1087
+ separator = _useContext.separator,
1088
+ shortcutText = _useContext.shortcutText,
1089
+ disabled = _useContext.disabled,
1090
+ readOnly = _useContext.readOnly,
1091
+ displayFormat = _useContext.displayFormat,
1092
+ inputId = _useContext.inputId,
1093
+ inputName = _useContext.inputName,
1094
+ popoverDirection = _useContext.popoverDirection,
1095
+ suffix = _useContext.suffix,
1096
+ placement = _useContext.placement;
1097
+ var buttonRef = useRef(null);
1098
+ var inputRef = useRef(null);
1099
+ var shortcutTextRef = useRef(null);
1100
+ var handleInputChange = function handleInputChange(e) {
1101
+ var inputValue = e.target.value;
1102
+ var dates = [];
1103
+ if (asSingle) {
1104
+ var date = parseDate(inputValue);
1105
+ if (dateIsValid(date)) {
1106
+ dates.push(formatDate(date, DATE_FORMAT));
1107
+ }
1108
+ } else {
1109
+ var parsed = inputValue.split(separator);
1110
+ var startDate = null;
1111
+ var endDate = null;
1112
+ if (parsed.length === 2) {
1113
+ startDate = parseDate(parsed[0].trim());
1114
+ endDate = parseDate(parsed[1].trim());
1115
+ } else {
1116
+ var middle = Math.floor(inputValue.length / 2);
1117
+ startDate = parseDate(inputValue.slice(0, middle));
1118
+ endDate = parseDate(inputValue.slice(middle));
1119
+ }
1120
+ if (dateIsValid(startDate) && dateIsValid(endDate) && startDate.getTime() <= endDate.getTime()) {
1121
+ dates.push(formatDate(startDate, DATE_FORMAT));
1122
+ dates.push(formatDate(endDate, DATE_FORMAT));
1123
+ }
1124
+ }
1125
+ if (dates[0]) {
1126
+ changeDatepickerValue({
1127
+ startDate: dates[0],
1128
+ endDate: dates[1] || dates[0]
1129
+ }, e.target);
1130
+ var hoverD = dates[1] ? parseDate(dates[1]) : parseDate(dates[0]);
1131
+ if (dates[1]) hoverD.setDate(hoverD.getDate() - 1);
1132
+ changeDayHover(formatDate(hoverD, DATE_FORMAT));
1133
+ }
1134
+ changeInputText(e.target.value);
1135
+ };
1136
+ var handleInputKeyDown = function handleInputKeyDown(e) {
1137
+ if (e.key === "Enter") {
1138
+ var _inputRef$current;
1139
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.blur();
1140
+ hideDatepicker();
1141
+ }
1142
+ };
1143
+ useEffect(function () {
1144
+ if (inputRef && typeof setContextRef === "function") {
1145
+ setContextRef(inputRef);
1146
+ }
1147
+ }, [setContextRef, inputRef]);
1148
+ useEffect(function () {
1149
+ var button = buttonRef === null || buttonRef === void 0 ? void 0 : buttonRef.current;
1150
+ var shortcut = shortcutTextRef === null || shortcutTextRef === void 0 ? void 0 : shortcutTextRef.current;
1151
+ function focusInput(e) {
1152
+ var _inputRef$current2;
1153
+ e.stopPropagation();
1154
+ (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 || _inputRef$current2.focus();
1155
+ }
1156
+ if (button) button.addEventListener("click", focusInput);
1157
+ if (shortcut) shortcut.addEventListener("click", focusInput);
1158
+ return function () {
1159
+ if (button) button.removeEventListener("click", focusInput);
1160
+ if (shortcut) shortcut.removeEventListener("click", focusInput);
1161
+ };
1162
+ }, [changeDatepickerValue, changeDayHover, changeInputText, dayHover, inputText, period.end, period.start]);
1163
+ useEffect(function () {
1164
+ var div = calendarContainer === null || calendarContainer === void 0 ? void 0 : calendarContainer.current;
1165
+ var input = inputRef.current;
1166
+ var arrow = arrowContainer === null || arrowContainer === void 0 ? void 0 : arrowContainer.current;
1167
+ function showCalendarContainer() {
1168
+ if (arrow && div && div.style.display === "none") {
1169
+ div.style.display = "block";
1170
+ var inputRect = input.getBoundingClientRect();
1171
+ var activePlacement = placement;
1172
+ if (placement === "auto") {
1173
+ var spaceBelow = window.innerHeight - inputRect.bottom;
1174
+ var spaceAbove = inputRect.top;
1175
+ activePlacement = spaceBelow > 350 || spaceBelow >= spaceAbove ? "bottom" : "top";
1176
+ }
1177
+
1178
+ // Reset inline styles
1179
+ div.style.top = "";
1180
+ div.style.bottom = "";
1181
+ div.style.left = "";
1182
+ div.style.right = "";
1183
+ div.style.marginTop = "";
1184
+ div.style.marginBottom = "";
1185
+ div.style.marginLeft = "";
1186
+ div.style.marginRight = "";
1187
+ if (activePlacement === "top") {
1188
+ div.style.bottom = "100%";
1189
+ div.style.top = "auto";
1190
+ div.style.marginBottom = "0.625rem";
1191
+ } else if (activePlacement === "bottom") {
1192
+ div.style.top = "100%";
1193
+ div.style.bottom = "auto";
1194
+ } else if (activePlacement === "left") {
1195
+ div.style.right = "100%";
1196
+ div.style.left = "auto";
1197
+ div.style.top = "0";
1198
+ div.style.marginRight = "0.625rem";
1199
+ } else if (activePlacement === "right") {
1200
+ div.style.left = "100%";
1201
+ div.style.right = "auto";
1202
+ div.style.top = "0";
1203
+ div.style.marginLeft = "0.625rem";
1204
+ }
1205
+
1206
+ // Timeout to allow DOM layout
1207
+ setTimeout(function () {
1208
+ div.classList.add("kz-datepicker-open");
1209
+ if (suffix) div.classList.add("kz-datepicker-open--".concat(suffix));
1210
+ }, 10);
1211
+ }
1212
+ }
1213
+ if (div && input) {
1214
+ input.addEventListener("focus", showCalendarContainer);
1215
+ }
1216
+ return function () {
1217
+ if (input) {
1218
+ input.removeEventListener("focus", showCalendarContainer);
1219
+ }
1220
+ };
1221
+ }, [calendarContainer, arrowContainer, popoverDirection, placement]);
1222
+ return /*#__PURE__*/React.createElement("div", {
1223
+ className: "kz-datepicker-input-wrapper" + (suffix ? " kz-datepicker-input-wrapper--".concat(suffix) : "")
1224
+ }, /*#__PURE__*/React.createElement("input", {
1225
+ ref: inputRef,
1226
+ type: "text",
1227
+ className: "kz-datepicker-input" + (suffix ? " kz-datepicker-input--".concat(suffix) : ""),
1228
+ disabled: disabled,
1229
+ readOnly: readOnly,
1230
+ placeholder: placeholder || "".concat(displayFormat).concat(asSingle ? "" : " ".concat(separator, " ").concat(displayFormat)),
1231
+ value: inputText,
1232
+ id: inputId,
1233
+ name: inputName,
1234
+ autoComplete: "off",
1235
+ role: "presentation",
1236
+ onChange: handleInputChange,
1237
+ onKeyDown: handleInputKeyDown,
1238
+ style: {
1239
+ paddingLeft: shortcutText ? "".concat(((_shortcutTextRef$curr = shortcutTextRef.current) === null || _shortcutTextRef$curr === void 0 ? void 0 : _shortcutTextRef$curr.clientWidth) || 0, "px") : undefined
1240
+ }
1241
+ }), shortcutText && /*#__PURE__*/React.createElement("span", {
1242
+ ref: shortcutTextRef,
1243
+ className: "kz-datepicker-shortcut-text" + (suffix ? " kz-datepicker-shortcut-text--".concat(suffix) : "")
1244
+ }, shortcutText), /*#__PURE__*/React.createElement("button", {
1245
+ type: "button",
1246
+ ref: buttonRef,
1247
+ disabled: disabled,
1248
+ className: "kz-datepicker-toggle-button" + (suffix ? " kz-datepicker-toggle-button--".concat(suffix) : "")
1249
+ }, /*#__PURE__*/React.createElement(ToggleButton, {
1250
+ isEmpty: !(inputText !== null && inputText !== void 0 && inputText.length)
1251
+ })));
1252
+ };
1253
+
1254
+ var _today = new Date();
1255
+ var DEFAULT_SHORTCUTS = {
1256
+ today: {
1257
+ text: "Today",
1258
+ period: {
1259
+ start: formatDate(_today),
1260
+ end: formatDate(_today)
1261
+ }
1262
+ },
1263
+ yesterday: {
1264
+ text: "Yesterday",
1265
+ period: {
1266
+ start: formatDate(new Date(new Date().setDate(_today.getDate() - 1))),
1267
+ end: formatDate(new Date(new Date().setDate(_today.getDate() - 1)))
1268
+ }
1269
+ },
1270
+ past: [{
1271
+ daysNumber: 7,
1272
+ text: "Last 7 days",
1273
+ period: {
1274
+ start: formatDate(new Date(new Date().setDate(_today.getDate() - 7))),
1275
+ end: formatDate(_today)
1276
+ }
1277
+ }, {
1278
+ daysNumber: 30,
1279
+ text: "Last 30 days",
1280
+ period: {
1281
+ start: formatDate(new Date(new Date().setDate(_today.getDate() - 30))),
1282
+ end: formatDate(_today)
1283
+ }
1284
+ }],
1285
+ currentMonth: {
1286
+ text: "This month",
1287
+ period: {
1288
+ start: formatDate(new Date(_today.getFullYear(), _today.getMonth(), 1)),
1289
+ end: formatDate(new Date(_today.getFullYear(), _today.getMonth() + 1, 0))
1290
+ }
1291
+ },
1292
+ pastMonth: {
1293
+ text: "Last month",
1294
+ period: {
1295
+ start: formatDate(new Date(_today.getFullYear(), _today.getMonth() - 1, 1)),
1296
+ end: formatDate(new Date(_today.getFullYear(), _today.getMonth(), 0))
1297
+ }
1298
+ }
1299
+ };
1300
+
1301
+ var ItemTemplate = /*#__PURE__*/React.memo(function (_ref) {
1302
+ var children = _ref.children,
1303
+ item = _ref.item;
1304
+ var _useContext = useContext(DatepickerContext),
1305
+ period = _useContext.period,
1306
+ changePeriod = _useContext.changePeriod,
1307
+ updateFirstDate = _useContext.updateFirstDate,
1308
+ dayHover = _useContext.dayHover,
1309
+ changeDayHover = _useContext.changeDayHover,
1310
+ hideDatepicker = _useContext.hideDatepicker,
1311
+ changeDatepickerValue = _useContext.changeDatepickerValue,
1312
+ suffix = _useContext.suffix;
1313
+ var getClassName = function getClassName() {
1314
+ return "kz-datepicker-shortcut-item" + (suffix ? " kz-datepicker-shortcut-item--".concat(suffix) : "");
1315
+ };
1316
+ var chosePeriod = function chosePeriod(periodItem) {
1317
+ if (dayHover) changeDayHover(null);
1318
+ if (period.start || period.end) changePeriod({
1319
+ start: null,
1320
+ end: null
1321
+ });
1322
+ changePeriod(periodItem);
1323
+ changeDatepickerValue({
1324
+ startDate: periodItem.start,
1325
+ endDate: periodItem.end
1326
+ });
1327
+ updateFirstDate(parseDate(periodItem.start));
1328
+ hideDatepicker();
1329
+ };
1330
+ return /*#__PURE__*/React.createElement("li", {
1331
+ className: getClassName(),
1332
+ onClick: function onClick(e) {
1333
+ chosePeriod(item.period);
1334
+ if (item.onClick) item.onClick(item.text, e);
1335
+ }
1336
+ }, children);
1337
+ });
1338
+ var Shortcuts = function Shortcuts() {
1339
+ var _useContext2 = useContext(DatepickerContext),
1340
+ configs = _useContext2.configs,
1341
+ suffix = _useContext2.suffix;
1342
+ var callPastFunction = function callPastFunction(data, numberValue) {
1343
+ return typeof data === "function" ? data(numberValue) : null;
1344
+ };
1345
+ var shortcutOptions = useMemo(function () {
1346
+ if (!(configs !== null && configs !== void 0 && configs.shortcuts)) return Object.entries(DEFAULT_SHORTCUTS);
1347
+ return Object.entries(configs.shortcuts).flatMap(function (_ref2) {
1348
+ var _ref3 = _slicedToArray(_ref2, 2),
1349
+ key = _ref3[0],
1350
+ customConfig = _ref3[1];
1351
+ if (Object.prototype.hasOwnProperty.call(DEFAULT_SHORTCUTS, key)) {
1352
+ return [[key, DEFAULT_SHORTCUTS[key]]];
1353
+ }
1354
+ var text = customConfig.text,
1355
+ period = customConfig.period,
1356
+ onClick = customConfig.onClick;
1357
+ if (!text || !period) return [];
1358
+ var start = parseDate(period.start);
1359
+ var end = parseDate(period.end);
1360
+ if (start && end && start.getTime() <= end.getTime()) {
1361
+ return [[text, {
1362
+ text: text,
1363
+ period: {
1364
+ start: formatDate(start, DATE_FORMAT),
1365
+ end: formatDate(end, DATE_FORMAT)
1366
+ },
1367
+ onClick: onClick
1368
+ }]];
1369
+ }
1370
+ return [];
1371
+ });
1372
+ }, [configs]);
1373
+ var printItemText = function printItemText(item) {
1374
+ var _item$text;
1375
+ return (_item$text = item === null || item === void 0 ? void 0 : item.text) !== null && _item$text !== void 0 ? _item$text : null;
1376
+ };
1377
+ if (!(shortcutOptions !== null && shortcutOptions !== void 0 && shortcutOptions.length)) return null;
1378
+ return /*#__PURE__*/React.createElement("div", {
1379
+ className: "kz-datepicker-shortcuts" + (suffix ? " kz-datepicker-shortcuts--".concat(suffix) : "")
1380
+ }, /*#__PURE__*/React.createElement("ul", {
1381
+ className: "kz-datepicker-shortcuts-list" + (suffix ? " kz-datepicker-shortcuts-list--".concat(suffix) : "")
1382
+ }, shortcutOptions.map(function (_ref4, index) {
1383
+ var _ref5 = _slicedToArray(_ref4, 2),
1384
+ key = _ref5[0],
1385
+ item = _ref5[1];
1386
+ return Array.isArray(item) ? item.map(function (subItem, subIndex) {
1387
+ return /*#__PURE__*/React.createElement(ItemTemplate, {
1388
+ key: "".concat(index, "-").concat(subIndex),
1389
+ item: subItem
1390
+ }, /*#__PURE__*/React.createElement(React.Fragment, null, key === "past" && configs !== null && configs !== void 0 && configs.shortcuts && key in configs.shortcuts && subItem.daysNumber ? callPastFunction(configs.shortcuts[key], subItem.daysNumber) : subItem.text));
1391
+ }) : /*#__PURE__*/React.createElement(ItemTemplate, {
1392
+ key: index,
1393
+ item: item
1394
+ }, /*#__PURE__*/React.createElement(React.Fragment, null, configs !== null && configs !== void 0 && configs.shortcuts && key in configs.shortcuts ? _typeof(configs.shortcuts[key]) === "object" ? printItemText(item) : configs.shortcuts[key] : printItemText(item)));
1395
+ })));
1396
+ };
1397
+
1398
+ /**
1399
+ * Hook that alerts clicks outside of the passed ref
1400
+ *
1401
+ * @param {import("react").RefObject} ref
1402
+ * @param {(e?: MouseEvent | TouchEvent) => void} handler
1403
+ */
1404
+ function useOnClickOutside(ref, handler) {
1405
+ useEffect(function () {
1406
+ var listener = function listener(event) {
1407
+ if (!ref.current || ref.current.contains(event.target)) {
1408
+ return;
1409
+ }
1410
+ handler(event);
1411
+ };
1412
+ document.addEventListener("mousedown", listener);
1413
+ document.addEventListener("touchstart", listener);
1414
+ return function () {
1415
+ document.removeEventListener("mousedown", listener);
1416
+ document.removeEventListener("touchstart", listener);
1417
+ };
1418
+ }, [ref, handler]);
1419
+ }
1420
+
1421
+ /**
1422
+ * kz-react-datepicker
1423
+ *
1424
+ * @param {Object} props
1425
+ * @param {import("./DatepickerContext").DateValueType|null} [props.value] - The selected date(s).
1426
+ * @param {(value: import("./DatepickerContext").DateValueType, e?: HTMLInputElement | null) => void} props.onChange - onChange callback.
1427
+ * @param {boolean} [props.useRange=true] - Whether to show two calendars for start and end dates.
1428
+ * @param {boolean} [props.asSingle=false] - If true, only a single date is selected.
1429
+ * @param {string} [props.placeholder] - Input placeholder.
1430
+ * @param {boolean} [props.disabled=false] - Disables the input.
1431
+ * @param {boolean} [props.readOnly=false] - Makes the input read-only.
1432
+ * @param {string} [props.displayFormat] - The display format for the input, defaults to YYYY-MM-DD.
1433
+ * @param {Date|string|null} [props.minDate=null] - Minimum selectable date.
1434
+ * @param {Date|string|null} [props.maxDate=null] - Maximum selectable date.
1435
+ * @param {string} [props.primaryColor="blue"] - Theme color.
1436
+ * @param {string} [props.separator="~"] - Separator between start and end date in input.
1437
+ * @param {string|null} [props.startFrom=null] - Date to open the calendar at.
1438
+ * @param {string} [props.i18n] - i18n locale, e.g., 'en'.
1439
+ * @param {boolean} [props.showFooter=false] - Show Action/Footer buttons.
1440
+ * @param {boolean} [props.showShortcuts=false] - Show quick shortcuts.
1441
+ * @param {string|null} [props.shortcutText] - Label for shortcut button input adornment.
1442
+ * @param {Object} [props.configs] - Additional configurations.
1443
+ * @param {((className: string) => string)|string|null} [props.inputClassName] - Custom input classes.
1444
+ * @param {((className: string) => string)|string|null} [props.containerClassName] - Custom wrapper classes.
1445
+ * @param {((className: string) => string)|string|null} [props.toggleClassName] - Toggle button classes.
1446
+ * @param {(open: boolean) => import("react").ReactNode} [props.toggleIcon] - Custom toggle icon.
1447
+ * @param {"forward"|"backward"|"middle"} [props.dateLooking="forward"] - Date looking direction for missing ranges.
1448
+ * @param {Array<{start: Date|string, end: Date|string}>|null} [props.disabledDates=null] - Dates to disable.
1449
+ * @param {string} [props.inputId] - ID for the input field.
1450
+ * @param {string} [props.inputName] - Name for the input field.
1451
+ * @param {string} [props.startWeekOn="sun"] - Day the week starts on.
1452
+ * @param {Object} [props.classNames] - Custom classes for different sub-components.
1453
+ * @param {string} [props.popoverDirection] - Popover direction.
1454
+ * @param {string} [props.suffix] - Suffix for classnames.
1455
+ * @param {"auto"|"light"|"dark"} [props.theme="auto"] - Color theme of the datepicker, defaults to system preferences (auto).
1456
+ * @param {"bottom"|"top"|"left"|"right"|"auto"} [props.placement="bottom"] - Where the datepicker calendar opens relative to input.
1457
+ */
1458
+ var Datepicker = function Datepicker(_ref) {
1459
+ var _ref$primaryColor = _ref.primaryColor,
1460
+ primaryColor = _ref$primaryColor === void 0 ? "blue" : _ref$primaryColor,
1461
+ _ref$value = _ref.value,
1462
+ value = _ref$value === void 0 ? null : _ref$value,
1463
+ onChange = _ref.onChange,
1464
+ _ref$useRange = _ref.useRange,
1465
+ useRange = _ref$useRange === void 0 ? true : _ref$useRange,
1466
+ _ref$showFooter = _ref.showFooter,
1467
+ showFooter = _ref$showFooter === void 0 ? false : _ref$showFooter,
1468
+ _ref$showShortcuts = _ref.showShortcuts,
1469
+ showShortcuts = _ref$showShortcuts === void 0 ? false : _ref$showShortcuts,
1470
+ _ref$configs = _ref.configs,
1471
+ configs = _ref$configs === void 0 ? undefined : _ref$configs,
1472
+ _ref$asSingle = _ref.asSingle,
1473
+ asSingle = _ref$asSingle === void 0 ? false : _ref$asSingle,
1474
+ _ref$placeholder = _ref.placeholder,
1475
+ placeholder = _ref$placeholder === void 0 ? null : _ref$placeholder,
1476
+ _ref$separator = _ref.separator,
1477
+ separator = _ref$separator === void 0 ? "~" : _ref$separator,
1478
+ _ref$startFrom = _ref.startFrom,
1479
+ startFrom = _ref$startFrom === void 0 ? null : _ref$startFrom,
1480
+ _ref$i18n = _ref.i18n,
1481
+ i18n = _ref$i18n === void 0 ? LANGUAGE : _ref$i18n,
1482
+ _ref$disabled = _ref.disabled,
1483
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1484
+ _ref$inputClassName = _ref.inputClassName,
1485
+ inputClassName = _ref$inputClassName === void 0 ? null : _ref$inputClassName,
1486
+ _ref$containerClassNa = _ref.containerClassName,
1487
+ containerClassName = _ref$containerClassNa === void 0 ? null : _ref$containerClassNa,
1488
+ _ref$toggleClassName = _ref.toggleClassName,
1489
+ toggleClassName = _ref$toggleClassName === void 0 ? null : _ref$toggleClassName,
1490
+ _ref$toggleIcon = _ref.toggleIcon,
1491
+ toggleIcon = _ref$toggleIcon === void 0 ? undefined : _ref$toggleIcon,
1492
+ _ref$shortcutText = _ref.shortcutText,
1493
+ shortcutText = _ref$shortcutText === void 0 ? null : _ref$shortcutText,
1494
+ _ref$displayFormat = _ref.displayFormat,
1495
+ displayFormat = _ref$displayFormat === void 0 ? DATE_FORMAT : _ref$displayFormat,
1496
+ _ref$readOnly = _ref.readOnly,
1497
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1498
+ _ref$minDate = _ref.minDate,
1499
+ minDate = _ref$minDate === void 0 ? null : _ref$minDate,
1500
+ _ref$maxDate = _ref.maxDate,
1501
+ maxDate = _ref$maxDate === void 0 ? null : _ref$maxDate,
1502
+ _ref$dateLooking = _ref.dateLooking,
1503
+ dateLooking = _ref$dateLooking === void 0 ? "forward" : _ref$dateLooking,
1504
+ _ref$disabledDates = _ref.disabledDates,
1505
+ disabledDates = _ref$disabledDates === void 0 ? null : _ref$disabledDates,
1506
+ inputId = _ref.inputId,
1507
+ inputName = _ref.inputName,
1508
+ _ref$startWeekOn = _ref.startWeekOn,
1509
+ startWeekOn = _ref$startWeekOn === void 0 ? "sun" : _ref$startWeekOn,
1510
+ _ref$classNames = _ref.classNames,
1511
+ classNames = _ref$classNames === void 0 ? undefined : _ref$classNames,
1512
+ _ref$popoverDirection = _ref.popoverDirection,
1513
+ popoverDirection = _ref$popoverDirection === void 0 ? undefined : _ref$popoverDirection,
1514
+ _ref$suffix = _ref.suffix,
1515
+ suffix = _ref$suffix === void 0 ? "" : _ref$suffix,
1516
+ _ref$theme = _ref.theme,
1517
+ theme = _ref$theme === void 0 ? "auto" : _ref$theme,
1518
+ _ref$placement = _ref.placement,
1519
+ placement = _ref$placement === void 0 ? "bottom" : _ref$placement;
1520
+ var containerRef = useRef(null);
1521
+ var calendarContainerRef = useRef(null);
1522
+ var arrowRef = useRef(null);
1523
+ var getInitialFirstDate = function getInitialFirstDate() {
1524
+ if (value !== null && value !== void 0 && value.startDate && dateIsValid(parseDate(value.startDate))) {
1525
+ return parseDate(value.startDate);
1526
+ }
1527
+ if (startFrom && dateIsValid(parseDate(startFrom))) {
1528
+ return parseDate(startFrom);
1529
+ }
1530
+ return new Date();
1531
+ };
1532
+ var _useState = useState(getInitialFirstDate()),
1533
+ _useState2 = _slicedToArray(_useState, 2),
1534
+ firstDate = _useState2[0],
1535
+ setFirstDate = _useState2[1];
1536
+ var _useState3 = useState(nextMonth(getInitialFirstDate())),
1537
+ _useState4 = _slicedToArray(_useState3, 2),
1538
+ secondDate = _useState4[0],
1539
+ setSecondDate = _useState4[1];
1540
+ var _useState5 = useState(function () {
1541
+ return typeof window !== "undefined" && window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
1542
+ }),
1543
+ _useState6 = _slicedToArray(_useState5, 2),
1544
+ systemTheme = _useState6[0],
1545
+ setSystemTheme = _useState6[1];
1546
+ useEffect(function () {
1547
+ if (theme === "auto" && typeof window !== "undefined" && window.matchMedia) {
1548
+ var mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1549
+ var handleChange = function handleChange(e) {
1550
+ return setSystemTheme(e.matches ? "dark" : "light");
1551
+ };
1552
+ mediaQuery.addEventListener("change", handleChange);
1553
+ return function () {
1554
+ return mediaQuery.removeEventListener("change", handleChange);
1555
+ };
1556
+ }
1557
+ }, [theme]);
1558
+ var activeTheme = theme === "auto" ? systemTheme : theme;
1559
+ var _useState7 = useState({
1560
+ start: null,
1561
+ end: null
1562
+ }),
1563
+ _useState8 = _slicedToArray(_useState7, 2),
1564
+ period = _useState8[0],
1565
+ setPeriod = _useState8[1];
1566
+ var _useState9 = useState(null),
1567
+ _useState0 = _slicedToArray(_useState9, 2),
1568
+ dayHover = _useState0[0],
1569
+ setDayHover = _useState0[1];
1570
+ var _useState1 = useState(""),
1571
+ _useState10 = _slicedToArray(_useState1, 2),
1572
+ inputText = _useState10[0],
1573
+ setInputText = _useState10[1];
1574
+ var _useState11 = useState(/*#__PURE__*/React.createRef()),
1575
+ _useState12 = _slicedToArray(_useState11, 2),
1576
+ inputRef = _useState12[0],
1577
+ setInputRef = _useState12[1];
1578
+ useOnClickOutside(containerRef, function () {
1579
+ var container = containerRef.current;
1580
+ var div = calendarContainerRef.current;
1581
+ var openBaseClass = "kz-datepicker-open";
1582
+ var openModifierClass = suffix ? "kz-datepicker-open--".concat(suffix) : "";
1583
+ if (container && div && (div.classList.contains(openBaseClass) || openModifierClass && div.classList.contains(openModifierClass))) {
1584
+ onChange(_objectSpread2({
1585
+ endDate: null,
1586
+ startDate: null
1587
+ }, value));
1588
+ hideDatepicker();
1589
+ }
1590
+ });
1591
+ var hideDatepicker = useCallback(function () {
1592
+ var div = calendarContainerRef.current;
1593
+ var openBaseClass = "kz-datepicker-open";
1594
+ var openModifierClass = suffix ? "kz-datepicker-open--".concat(suffix) : "";
1595
+ var closeBaseClass = "kz-datepicker-close";
1596
+ var closeModifierClass = suffix ? "kz-datepicker-close--".concat(suffix) : "";
1597
+ if (div && (div.classList.contains(openBaseClass) || openModifierClass && div.classList.contains(openModifierClass))) {
1598
+ div.classList.remove(openBaseClass);
1599
+ if (openModifierClass) div.classList.remove(openModifierClass);
1600
+ div.classList.add(closeBaseClass);
1601
+ if (closeModifierClass) div.classList.add(closeModifierClass);
1602
+ setTimeout(function () {
1603
+ div.style.display = "none";
1604
+ div.classList.remove(closeBaseClass);
1605
+ if (closeModifierClass) div.classList.remove(closeModifierClass);
1606
+ }, 300);
1607
+ }
1608
+ }, [suffix]);
1609
+ var firstGotoDate = useCallback(function (date) {
1610
+ var newDate = parseDate(formatDate(date));
1611
+ var reformatDate = parseDate(formatDate(secondDate));
1612
+ if (newDate.getTime() >= reformatDate.getTime()) {
1613
+ setSecondDate(nextMonth(date));
1614
+ }
1615
+ setFirstDate(date);
1616
+ }, [secondDate]);
1617
+ var previousMonthFirst = useCallback(function () {
1618
+ return setFirstDate(previousMonth(firstDate));
1619
+ }, [firstDate]);
1620
+ var nextMonthFirst = useCallback(function () {
1621
+ return firstGotoDate(nextMonth(firstDate));
1622
+ }, [firstDate, firstGotoDate]);
1623
+ var changeFirstMonth = useCallback(function (month) {
1624
+ firstGotoDate(new Date(firstDate.getFullYear(), month - 1, 1));
1625
+ }, [firstDate, firstGotoDate]);
1626
+ var changeFirstYear = useCallback(function (year) {
1627
+ firstGotoDate(new Date(year, firstDate.getMonth(), 1));
1628
+ }, [firstDate, firstGotoDate]);
1629
+ var secondGotoDate = useCallback(function (date) {
1630
+ var newDate = parseDate(formatDate(date, displayFormat));
1631
+ var reformatDate = parseDate(formatDate(firstDate, displayFormat));
1632
+ if (newDate.getTime() <= reformatDate.getTime()) {
1633
+ setFirstDate(previousMonth(date));
1634
+ }
1635
+ setSecondDate(date);
1636
+ }, [firstDate, displayFormat]);
1637
+ var previousMonthSecond = useCallback(function () {
1638
+ return secondGotoDate(previousMonth(secondDate));
1639
+ }, [secondDate, secondGotoDate]);
1640
+ var nextMonthSecond = useCallback(function () {
1641
+ return setSecondDate(nextMonth(secondDate));
1642
+ }, [secondDate]);
1643
+ var changeSecondMonth = useCallback(function (month) {
1644
+ secondGotoDate(new Date(secondDate.getFullYear(), month - 1, 1));
1645
+ }, [secondDate, secondGotoDate]);
1646
+ var changeSecondYear = useCallback(function (year) {
1647
+ secondGotoDate(new Date(year, secondDate.getMonth(), 1));
1648
+ }, [secondDate, secondGotoDate]);
1649
+ useEffect(function () {
1650
+ if (value && value.startDate && value.endDate) {
1651
+ var startDate = parseDate(value.startDate);
1652
+ var endDate = parseDate(value.endDate);
1653
+ var validDate = dateIsValid(startDate) && dateIsValid(endDate);
1654
+ var condition = validDate && startDate.getTime() <= endDate.getTime();
1655
+ if (condition) {
1656
+ setPeriod({
1657
+ start: formatDate(startDate),
1658
+ end: formatDate(endDate)
1659
+ });
1660
+ setInputText("".concat(formatDate(startDate, displayFormat)).concat(asSingle ? "" : " ".concat(separator, " ").concat(formatDate(endDate, displayFormat))));
1661
+ }
1662
+ }
1663
+ if (value && value.startDate === null && value.endDate === null) {
1664
+ setPeriod({
1665
+ start: null,
1666
+ end: null
1667
+ });
1668
+ setInputText("");
1669
+ }
1670
+ }, [asSingle, value, displayFormat, separator]);
1671
+ useEffect(function () {
1672
+ if (startFrom && dateIsValid(parseDate(startFrom))) {
1673
+ var startDate = value === null || value === void 0 ? void 0 : value.startDate;
1674
+ var endDate = value === null || value === void 0 ? void 0 : value.endDate;
1675
+ if (startDate && dateIsValid(parseDate(startDate))) {
1676
+ setFirstDate(parseDate(startDate));
1677
+ if (!asSingle) {
1678
+ if (endDate && dateIsValid(parseDate(endDate))) {
1679
+ var parsedEnd = parseDate(endDate);
1680
+ var startMonthEnd = new Date(parseDate(startDate).getFullYear(), parseDate(startDate).getMonth() + 1, 0, 23, 59, 59);
1681
+ if (parsedEnd.getTime() > startMonthEnd.getTime()) {
1682
+ setSecondDate(parsedEnd);
1683
+ } else {
1684
+ setSecondDate(nextMonth(parseDate(startDate)));
1685
+ }
1686
+ } else {
1687
+ setSecondDate(nextMonth(parseDate(startDate)));
1688
+ }
1689
+ }
1690
+ } else {
1691
+ setFirstDate(parseDate(startFrom));
1692
+ setSecondDate(nextMonth(parseDate(startFrom)));
1693
+ }
1694
+ }
1695
+ }, [asSingle, startFrom, value]);
1696
+ var safePrimaryColor = useMemo(function () {
1697
+ return COLORS.includes(primaryColor) ? primaryColor : DEFAULT_COLOR;
1698
+ }, [primaryColor]);
1699
+ var contextValues = useMemo(function () {
1700
+ return {
1701
+ asSingle: asSingle,
1702
+ primaryColor: safePrimaryColor,
1703
+ configs: configs,
1704
+ calendarContainer: calendarContainerRef,
1705
+ arrowContainer: arrowRef,
1706
+ hideDatepicker: hideDatepicker,
1707
+ period: period,
1708
+ changePeriod: setPeriod,
1709
+ dayHover: dayHover,
1710
+ changeDayHover: setDayHover,
1711
+ inputText: inputText,
1712
+ changeInputText: setInputText,
1713
+ updateFirstDate: firstGotoDate,
1714
+ changeDatepickerValue: onChange,
1715
+ showFooter: showFooter,
1716
+ placeholder: placeholder,
1717
+ separator: separator,
1718
+ shortcutText: shortcutText,
1719
+ i18n: i18n,
1720
+ value: value,
1721
+ disabled: disabled,
1722
+ inputClassName: inputClassName,
1723
+ containerClassName: containerClassName,
1724
+ toggleClassName: toggleClassName,
1725
+ toggleIcon: toggleIcon,
1726
+ readOnly: readOnly,
1727
+ displayFormat: displayFormat,
1728
+ minDate: minDate,
1729
+ maxDate: maxDate,
1730
+ dateLooking: dateLooking,
1731
+ disabledDates: disabledDates,
1732
+ inputId: inputId,
1733
+ inputName: inputName,
1734
+ startWeekOn: startWeekOn,
1735
+ classNames: classNames,
1736
+ onChange: onChange,
1737
+ input: inputRef,
1738
+ popoverDirection: popoverDirection,
1739
+ suffix: suffix,
1740
+ theme: activeTheme,
1741
+ placement: placement
1742
+ };
1743
+ }, [asSingle, safePrimaryColor, configs, hideDatepicker, period, dayHover, inputText, onChange, showFooter, placeholder, separator, shortcutText, i18n, value, disabled, inputClassName, containerClassName, toggleClassName, toggleIcon, readOnly, displayFormat, minDate, maxDate, dateLooking, disabledDates, inputId, inputName, startWeekOn, classNames, inputRef, popoverDirection, firstGotoDate, suffix, activeTheme, placement]);
1744
+ var containerClassNameOverload = useMemo(function () {
1745
+ var defaultClassName = "kz-datepicker-container" + (suffix ? " kz-datepicker-container--".concat(suffix) : "");
1746
+ if (activeTheme === "dark") {
1747
+ defaultClassName += " dark";
1748
+ }
1749
+ return typeof containerClassName === "function" ? containerClassName(defaultClassName) : typeof containerClassName === "string" && containerClassName !== "" ? containerClassName + (activeTheme === "dark" && !containerClassName.includes("dark") ? " dark" : "") : defaultClassName;
1750
+ }, [containerClassName, suffix, activeTheme]);
1751
+ return /*#__PURE__*/React.createElement(DatepickerContext.Provider, {
1752
+ value: contextValues
1753
+ }, /*#__PURE__*/React.createElement("div", {
1754
+ className: containerClassNameOverload,
1755
+ ref: containerRef
1756
+ }, /*#__PURE__*/React.createElement(Input, {
1757
+ setContextRef: setInputRef
1758
+ }), /*#__PURE__*/React.createElement("div", {
1759
+ className: "kz-datepicker-popup" + (suffix ? " kz-datepicker-popup--".concat(suffix) : ""),
1760
+ ref: calendarContainerRef,
1761
+ style: {
1762
+ display: "none"
1763
+ }
1764
+ }, /*#__PURE__*/React.createElement(Arrow, {
1765
+ ref: arrowRef
1766
+ }), /*#__PURE__*/React.createElement("div", {
1767
+ className: "kz-datepicker-popup-inner" + (suffix ? " kz-datepicker-popup-inner--".concat(suffix) : "")
1768
+ }, /*#__PURE__*/React.createElement("div", {
1769
+ className: "kz-datepicker-main-content" + (suffix ? " kz-datepicker-main-content--".concat(suffix) : "")
1770
+ }, showShortcuts && /*#__PURE__*/React.createElement(Shortcuts, null), /*#__PURE__*/React.createElement("div", {
1771
+ className: "kz-datepicker-calendars".concat(suffix ? " kz-datepicker-calendars--".concat(suffix) : "", " ").concat(showShortcuts ? "kz-has-shortcuts" + (suffix ? " kz-has-shortcuts--".concat(suffix) : "") : "")
1772
+ }, /*#__PURE__*/React.createElement(Calendar, {
1773
+ date: firstDate,
1774
+ onClickPrevious: previousMonthFirst,
1775
+ onClickNext: nextMonthFirst,
1776
+ changeMonth: changeFirstMonth,
1777
+ changeYear: changeFirstYear,
1778
+ minDate: minDate,
1779
+ maxDate: maxDate
1780
+ }), useRange && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
1781
+ className: "kz-datepicker-divider-wrapper" + (suffix ? " kz-datepicker-divider-wrapper--".concat(suffix) : "")
1782
+ }, /*#__PURE__*/React.createElement(VerticalDash, null)), /*#__PURE__*/React.createElement(Calendar, {
1783
+ date: secondDate,
1784
+ onClickPrevious: previousMonthSecond,
1785
+ onClickNext: nextMonthSecond,
1786
+ changeMonth: changeSecondMonth,
1787
+ changeYear: changeSecondYear,
1788
+ minDate: minDate,
1789
+ maxDate: maxDate
1790
+ })))), showFooter && /*#__PURE__*/React.createElement(Footer, null)))));
1791
+ };
1792
+
1793
+ export { Datepicker as default };
1794
+ //# sourceMappingURL=index.esm.js.map