best-react-datepicker 0.2.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.
Files changed (46) hide show
  1. package/dist/chunk-A3NQUSC5.cjs +1155 -0
  2. package/dist/chunk-A3NQUSC5.cjs.map +1 -0
  3. package/dist/chunk-FBN3SFQJ.js +1140 -0
  4. package/dist/chunk-FBN3SFQJ.js.map +1 -0
  5. package/dist/chunk-HI4J64KK.cjs +592 -0
  6. package/dist/chunk-HI4J64KK.cjs.map +1 -0
  7. package/dist/chunk-NF5M43IO.js +49 -0
  8. package/dist/chunk-NF5M43IO.js.map +1 -0
  9. package/dist/chunk-QW2CUEX4.js +117 -0
  10. package/dist/chunk-QW2CUEX4.js.map +1 -0
  11. package/dist/chunk-R7HLYS5V.cjs +120 -0
  12. package/dist/chunk-R7HLYS5V.cjs.map +1 -0
  13. package/dist/chunk-W6KEY2SO.js +526 -0
  14. package/dist/chunk-W6KEY2SO.js.map +1 -0
  15. package/dist/chunk-WBWQ5RKN.cjs +51 -0
  16. package/dist/chunk-WBWQ5RKN.cjs.map +1 -0
  17. package/dist/hooks.cjs +66 -0
  18. package/dist/hooks.cjs.map +1 -0
  19. package/dist/hooks.d.cts +555 -0
  20. package/dist/hooks.d.ts +555 -0
  21. package/dist/hooks.js +5 -0
  22. package/dist/hooks.js.map +1 -0
  23. package/dist/index.cjs +1502 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +239 -0
  26. package/dist/index.d.ts +239 -0
  27. package/dist/index.js +1303 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/locales.cjs +16 -0
  30. package/dist/locales.cjs.map +1 -0
  31. package/dist/locales.d.cts +6 -0
  32. package/dist/locales.d.ts +6 -0
  33. package/dist/locales.js +3 -0
  34. package/dist/locales.js.map +1 -0
  35. package/dist/presets-B8wfaoTj.d.cts +54 -0
  36. package/dist/presets-CB5Rt4Li.d.ts +54 -0
  37. package/dist/styles.css +751 -0
  38. package/dist/types-DA2PcEiy.d.cts +104 -0
  39. package/dist/types-DA2PcEiy.d.ts +104 -0
  40. package/dist/utils.cjs +282 -0
  41. package/dist/utils.cjs.map +1 -0
  42. package/dist/utils.d.cts +57 -0
  43. package/dist/utils.d.ts +57 -0
  44. package/dist/utils.js +5 -0
  45. package/dist/utils.js.map +1 -0
  46. package/package.json +79 -0
@@ -0,0 +1,1155 @@
1
+ 'use strict';
2
+
3
+ var chunkHI4J64KK_cjs = require('./chunk-HI4J64KK.cjs');
4
+ var chunkR7HLYS5V_cjs = require('./chunk-R7HLYS5V.cjs');
5
+ var react = require('react');
6
+
7
+ function useControllable(options) {
8
+ const { value: controlledValue, defaultValue, onChange } = options;
9
+ const isControlled = controlledValue !== void 0;
10
+ const [internalValue, setInternalValue] = react.useState(defaultValue);
11
+ const onChangeRef = react.useRef(onChange);
12
+ onChangeRef.current = onChange;
13
+ const value = isControlled ? controlledValue : internalValue;
14
+ const setValue = react.useCallback(
15
+ (newValue) => {
16
+ if (!isControlled) {
17
+ setInternalValue(newValue);
18
+ }
19
+ onChangeRef.current?.(newValue);
20
+ },
21
+ [isControlled]
22
+ );
23
+ return [value, setValue];
24
+ }
25
+ function useCalendar(options = {}) {
26
+ const {
27
+ numberOfMonths = 1,
28
+ weekStartsOn: weekStartsOnProp,
29
+ fixedWeeks = false,
30
+ minDate,
31
+ maxDate,
32
+ disabled,
33
+ highlighted,
34
+ locale = chunkR7HLYS5V_cjs.defaultLocale
35
+ } = options;
36
+ const weekStartsOn = weekStartsOnProp ?? locale.weekStartsOn;
37
+ const now = /* @__PURE__ */ new Date();
38
+ const [viewingDate, setViewingDate] = useControllable({
39
+ value: options.month,
40
+ defaultValue: options.defaultMonth ?? new Date(now.getFullYear(), now.getMonth(), 1),
41
+ onChange: (date) => options.onMonthChange?.(date)
42
+ });
43
+ const [focusedDate, setFocusedDate] = react.useState(null);
44
+ const viewingYear = viewingDate.getFullYear();
45
+ const viewingMonth = viewingDate.getMonth();
46
+ const months = react.useMemo(
47
+ () => chunkHI4J64KK_cjs.generateCalendarMonths(viewingYear, viewingMonth, numberOfMonths, {
48
+ weekStartsOn,
49
+ fixedWeeks
50
+ }),
51
+ [viewingYear, viewingMonth, numberOfMonths, weekStartsOn, fixedWeeks]
52
+ );
53
+ const navigate = react.useCallback(
54
+ (year, month) => {
55
+ const adjusted = new Date(year, month, 1);
56
+ setViewingDate(adjusted);
57
+ },
58
+ [setViewingDate]
59
+ );
60
+ const goToNextMonth = react.useCallback(() => {
61
+ navigate(viewingYear, viewingMonth + 1);
62
+ }, [navigate, viewingYear, viewingMonth]);
63
+ const goToPrevMonth = react.useCallback(() => {
64
+ navigate(viewingYear, viewingMonth - 1);
65
+ }, [navigate, viewingYear, viewingMonth]);
66
+ const goToNextYear = react.useCallback(() => {
67
+ navigate(viewingYear + 1, viewingMonth);
68
+ }, [navigate, viewingYear, viewingMonth]);
69
+ const goToPrevYear = react.useCallback(() => {
70
+ navigate(viewingYear - 1, viewingMonth);
71
+ }, [navigate, viewingYear, viewingMonth]);
72
+ const goToMonth = react.useCallback(
73
+ (month) => {
74
+ navigate(viewingYear, month);
75
+ },
76
+ [navigate, viewingYear]
77
+ );
78
+ const goToYear = react.useCallback(
79
+ (year) => {
80
+ navigate(year, viewingMonth);
81
+ },
82
+ [navigate, viewingMonth]
83
+ );
84
+ const goToDate = react.useCallback(
85
+ (date) => {
86
+ navigate(date.getFullYear(), date.getMonth());
87
+ },
88
+ [navigate]
89
+ );
90
+ const goToToday = react.useCallback(() => {
91
+ const t = /* @__PURE__ */ new Date();
92
+ navigate(t.getFullYear(), t.getMonth());
93
+ }, [navigate]);
94
+ const checkDisabled = react.useCallback(
95
+ (date) => {
96
+ if (!chunkHI4J64KK_cjs.isDateInRange(date, minDate, maxDate)) return true;
97
+ return chunkHI4J64KK_cjs.isDateDisabled(date, disabled);
98
+ },
99
+ [minDate, maxDate, disabled]
100
+ );
101
+ const checkHighlighted = react.useCallback(
102
+ (date) => chunkHI4J64KK_cjs.isDateHighlighted(date, highlighted),
103
+ [highlighted]
104
+ );
105
+ const checkOutsideRange = react.useCallback(
106
+ (date) => !chunkHI4J64KK_cjs.isDateInRange(date, minDate, maxDate),
107
+ [minDate, maxDate]
108
+ );
109
+ return {
110
+ months,
111
+ focusedDate,
112
+ viewingYear,
113
+ viewingMonth,
114
+ goToNextMonth,
115
+ goToPrevMonth,
116
+ goToNextYear,
117
+ goToPrevYear,
118
+ goToMonth,
119
+ goToYear,
120
+ goToDate,
121
+ goToToday,
122
+ setFocusedDate,
123
+ isDateDisabled: checkDisabled,
124
+ isDateHighlighted: checkHighlighted,
125
+ isOutsideRange: checkOutsideRange,
126
+ locale
127
+ };
128
+ }
129
+ function useKeyboardNav(options) {
130
+ const {
131
+ focusedDate,
132
+ onFocusChange,
133
+ onSelect,
134
+ onClose,
135
+ weekStartsOn = 0,
136
+ minDate,
137
+ maxDate,
138
+ disabled
139
+ } = options;
140
+ const isValid = (date) => {
141
+ return chunkHI4J64KK_cjs.isDateInRange(date, minDate, maxDate) && !chunkHI4J64KK_cjs.isDateDisabled(date, disabled);
142
+ };
143
+ const moveFocus = (newDate) => {
144
+ if (chunkHI4J64KK_cjs.isDateInRange(newDate, minDate, maxDate)) {
145
+ onFocusChange(newDate);
146
+ }
147
+ };
148
+ const handleKeyDown = react.useCallback(
149
+ (event) => {
150
+ let handled = true;
151
+ switch (event.key) {
152
+ case "ArrowRight":
153
+ moveFocus(chunkHI4J64KK_cjs.addDays(focusedDate, 1));
154
+ break;
155
+ case "ArrowLeft":
156
+ moveFocus(chunkHI4J64KK_cjs.subDays(focusedDate, 1));
157
+ break;
158
+ case "ArrowDown":
159
+ moveFocus(chunkHI4J64KK_cjs.addDays(focusedDate, 7));
160
+ break;
161
+ case "ArrowUp":
162
+ moveFocus(chunkHI4J64KK_cjs.subDays(focusedDate, 7));
163
+ break;
164
+ case "Home":
165
+ moveFocus(chunkHI4J64KK_cjs.startOfWeek(focusedDate, weekStartsOn));
166
+ break;
167
+ case "End":
168
+ moveFocus(chunkHI4J64KK_cjs.endOfWeek(focusedDate, weekStartsOn));
169
+ break;
170
+ case "PageDown":
171
+ if (event.shiftKey) {
172
+ moveFocus(chunkHI4J64KK_cjs.addYears(focusedDate, 1));
173
+ } else {
174
+ moveFocus(chunkHI4J64KK_cjs.addMonths(focusedDate, 1));
175
+ }
176
+ break;
177
+ case "PageUp":
178
+ if (event.shiftKey) {
179
+ moveFocus(chunkHI4J64KK_cjs.subYears(focusedDate, 1));
180
+ } else {
181
+ moveFocus(chunkHI4J64KK_cjs.subMonths(focusedDate, 1));
182
+ }
183
+ break;
184
+ case "Enter":
185
+ case " ":
186
+ if (isValid(focusedDate)) {
187
+ onSelect(focusedDate);
188
+ }
189
+ break;
190
+ case "Escape":
191
+ onClose?.();
192
+ break;
193
+ default:
194
+ handled = false;
195
+ }
196
+ if (handled) {
197
+ event.preventDefault();
198
+ event.stopPropagation();
199
+ }
200
+ },
201
+ [focusedDate, onFocusChange, onSelect, onClose, weekStartsOn, minDate, maxDate, disabled]
202
+ );
203
+ return { handleKeyDown };
204
+ }
205
+ function useDatePicker(options = {}) {
206
+ const {
207
+ closeOnSelect = true,
208
+ clearable = false,
209
+ required = false,
210
+ readOnly = false,
211
+ placeholder,
212
+ name,
213
+ locale = chunkR7HLYS5V_cjs.defaultLocale,
214
+ ...calendarOptions
215
+ } = options;
216
+ const format = options.format ?? locale.dateFormat;
217
+ const calendar = useCalendar({ ...calendarOptions, locale });
218
+ const [selectedDate, setSelectedDate] = useControllable({
219
+ value: options.value,
220
+ defaultValue: options.defaultValue ?? null,
221
+ onChange: options.onChange
222
+ });
223
+ const [isOpen, setIsOpen] = useControllable({
224
+ value: options.open,
225
+ defaultValue: options.defaultOpen ?? false,
226
+ onChange: options.onOpenChange
227
+ });
228
+ const [inputValue, setInputValue] = react.useState("");
229
+ const [isInputFocused, setIsInputFocused] = react.useState(false);
230
+ const formattedValue = react.useMemo(
231
+ () => selectedDate ? chunkHI4J64KK_cjs.formatDate(selectedDate, format, locale.code) : "",
232
+ [selectedDate, format, locale.code]
233
+ );
234
+ const open = react.useCallback(() => {
235
+ if (!readOnly) setIsOpen(true);
236
+ }, [readOnly, setIsOpen]);
237
+ const close = react.useCallback(() => {
238
+ setIsOpen(false);
239
+ setInputValue("");
240
+ }, [setIsOpen]);
241
+ const toggle = react.useCallback(() => {
242
+ if (isOpen) close();
243
+ else open();
244
+ }, [isOpen, open, close]);
245
+ const selectDate = react.useCallback(
246
+ (date) => {
247
+ if (calendar.isDateDisabled(date)) return;
248
+ setSelectedDate(date);
249
+ if (closeOnSelect) close();
250
+ },
251
+ [calendar.isDateDisabled, setSelectedDate, closeOnSelect, close]
252
+ );
253
+ const clearDate = react.useCallback(() => {
254
+ setSelectedDate(null);
255
+ setInputValue("");
256
+ }, [setSelectedDate]);
257
+ const isSelected = react.useCallback(
258
+ (date) => selectedDate ? chunkHI4J64KK_cjs.isSameDay(date, selectedDate) : false,
259
+ [selectedDate]
260
+ );
261
+ const handleInputChange = react.useCallback(
262
+ (value) => {
263
+ setInputValue(value);
264
+ const parsed = chunkHI4J64KK_cjs.parseDate(value, format, locale.code);
265
+ if (parsed && !calendar.isDateDisabled(parsed)) {
266
+ setSelectedDate(parsed);
267
+ calendar.goToDate(parsed);
268
+ }
269
+ },
270
+ [format, locale.code, calendar, setSelectedDate]
271
+ );
272
+ const handleInputBlur = react.useCallback(() => {
273
+ setIsInputFocused(false);
274
+ setInputValue("");
275
+ }, []);
276
+ const handleInputFocus = react.useCallback(() => {
277
+ setIsInputFocused(true);
278
+ }, []);
279
+ const getInputProps = react.useCallback(
280
+ () => ({
281
+ type: "text",
282
+ value: isInputFocused && inputValue ? inputValue : formattedValue,
283
+ placeholder: placeholder ?? format,
284
+ readOnly,
285
+ "aria-label": placeholder ?? "Select date",
286
+ "aria-haspopup": "dialog",
287
+ "aria-expanded": isOpen,
288
+ autoComplete: "off",
289
+ onChange: (e) => handleInputChange(e.target.value),
290
+ onFocus: () => {
291
+ handleInputFocus();
292
+ open();
293
+ },
294
+ onBlur: handleInputBlur,
295
+ onClick: () => open()
296
+ }),
297
+ [formattedValue, inputValue, isInputFocused, placeholder, format, readOnly, isOpen, handleInputChange, handleInputFocus, handleInputBlur, open]
298
+ );
299
+ const getPopoverProps = react.useCallback(
300
+ () => ({
301
+ role: "dialog",
302
+ "aria-modal": true,
303
+ "aria-label": "Choose date"
304
+ }),
305
+ []
306
+ );
307
+ const getHiddenInputProps = react.useCallback(
308
+ () => ({
309
+ type: "hidden",
310
+ name,
311
+ value: selectedDate ? selectedDate.toISOString() : ""
312
+ }),
313
+ [name, selectedDate]
314
+ );
315
+ return {
316
+ ...calendar,
317
+ selectedDate,
318
+ selectDate,
319
+ clearDate,
320
+ formattedValue,
321
+ isOpen,
322
+ open,
323
+ close,
324
+ toggle,
325
+ isSelected,
326
+ getInputProps,
327
+ getPopoverProps,
328
+ getHiddenInputProps,
329
+ clearable,
330
+ required
331
+ };
332
+ }
333
+ function useRangePicker(options = {}) {
334
+ const {
335
+ minDays,
336
+ maxDays,
337
+ presets = [],
338
+ allowSameDay = true,
339
+ separator = " \u2013 ",
340
+ startName,
341
+ endName,
342
+ startPlaceholder,
343
+ endPlaceholder,
344
+ closeOnSelect = false,
345
+ locale = chunkR7HLYS5V_cjs.defaultLocale,
346
+ ...calendarOptions
347
+ } = options;
348
+ const format = options.format ?? locale.dateFormat;
349
+ const calendar = useCalendar({
350
+ ...calendarOptions,
351
+ numberOfMonths: calendarOptions.numberOfMonths ?? 2,
352
+ locale
353
+ });
354
+ const emptyRange = { from: null, to: null };
355
+ const [range, setRange] = useControllable({
356
+ value: options.value,
357
+ defaultValue: options.defaultValue ?? emptyRange,
358
+ onChange: options.onChange
359
+ });
360
+ const [isOpen, setIsOpen] = useControllable({
361
+ value: options.open,
362
+ defaultValue: options.defaultOpen ?? false,
363
+ onChange: options.onOpenChange
364
+ });
365
+ const [hoveredDate, setHoveredDate] = react.useState(null);
366
+ const [activeInput, setActiveInput] = react.useState("start");
367
+ const isValidRange = react.useCallback(
368
+ (from, to) => {
369
+ const days = Math.abs(chunkHI4J64KK_cjs.differenceInDays(to, from)) + 1;
370
+ if (!allowSameDay && days === 1) return false;
371
+ if (minDays && days < minDays) return false;
372
+ if (maxDays && days > maxDays) return false;
373
+ return true;
374
+ },
375
+ [allowSameDay, minDays, maxDays]
376
+ );
377
+ const handleDayClick = react.useCallback(
378
+ (date) => {
379
+ if (calendar.isDateDisabled(date)) return;
380
+ if (!range.from || range.from && range.to) {
381
+ setRange({ from: date, to: null });
382
+ setActiveInput("end");
383
+ } else {
384
+ let from = range.from;
385
+ let to = date;
386
+ if (chunkHI4J64KK_cjs.isBefore(to, from)) {
387
+ [from, to] = [to, from];
388
+ }
389
+ if (isValidRange(from, to)) {
390
+ setRange({ from, to });
391
+ setActiveInput("start");
392
+ if (closeOnSelect) {
393
+ setIsOpen(false);
394
+ }
395
+ } else {
396
+ setRange({ from: date, to: null });
397
+ setActiveInput("end");
398
+ }
399
+ }
400
+ },
401
+ [range, calendar.isDateDisabled, isValidRange, setRange, closeOnSelect, setIsOpen]
402
+ );
403
+ const applyPreset = react.useCallback(
404
+ (preset) => {
405
+ const value = typeof preset.value === "function" ? preset.value() : preset.value;
406
+ setRange(value);
407
+ if (closeOnSelect) {
408
+ setIsOpen(false);
409
+ }
410
+ },
411
+ [setRange, closeOnSelect, setIsOpen]
412
+ );
413
+ const activePresetIndex = react.useMemo(() => {
414
+ if (!range.from || !range.to) return -1;
415
+ return presets.findIndex((preset) => {
416
+ const resolved = typeof preset.value === "function" ? preset.value() : preset.value;
417
+ if (!resolved.from || !resolved.to) return false;
418
+ return chunkHI4J64KK_cjs.isSameDay(range.from, resolved.from) && chunkHI4J64KK_cjs.isSameDay(range.to, resolved.to);
419
+ });
420
+ }, [range.from, range.to, presets]);
421
+ const clearRange = react.useCallback(() => {
422
+ setRange(emptyRange);
423
+ setActiveInput("start");
424
+ }, [setRange]);
425
+ const isRangeStart = react.useCallback(
426
+ (date) => range.from ? chunkHI4J64KK_cjs.isSameDay(date, range.from) : false,
427
+ [range.from]
428
+ );
429
+ const isRangeEnd = react.useCallback(
430
+ (date) => range.to ? chunkHI4J64KK_cjs.isSameDay(date, range.to) : false,
431
+ [range.to]
432
+ );
433
+ const isInRange = react.useCallback(
434
+ (date) => {
435
+ if (!range.from || !range.to) return false;
436
+ return chunkHI4J64KK_cjs.isBetween(date, range.from, range.to, false) && !chunkHI4J64KK_cjs.isSameDay(date, range.from) && !chunkHI4J64KK_cjs.isSameDay(date, range.to);
437
+ },
438
+ [range.from, range.to]
439
+ );
440
+ const isInPreviewRange = react.useCallback(
441
+ (date) => {
442
+ if (!range.from || range.to || !hoveredDate) return false;
443
+ const start = chunkHI4J64KK_cjs.isBefore(hoveredDate, range.from) ? hoveredDate : range.from;
444
+ const end = chunkHI4J64KK_cjs.isAfter(hoveredDate, range.from) ? hoveredDate : range.from;
445
+ return chunkHI4J64KK_cjs.isBetween(date, start, end);
446
+ },
447
+ [range.from, range.to, hoveredDate]
448
+ );
449
+ const isSelected = react.useCallback(
450
+ (date) => isRangeStart(date) || isRangeEnd(date),
451
+ [isRangeStart, isRangeEnd]
452
+ );
453
+ const formattedStart = react.useMemo(
454
+ () => range.from ? chunkHI4J64KK_cjs.formatDate(range.from, format, locale.code) : "",
455
+ [range.from, format, locale.code]
456
+ );
457
+ const formattedEnd = react.useMemo(
458
+ () => range.to ? chunkHI4J64KK_cjs.formatDate(range.to, format, locale.code) : "",
459
+ [range.to, format, locale.code]
460
+ );
461
+ const open = react.useCallback(() => setIsOpen(true), [setIsOpen]);
462
+ const close = react.useCallback(() => setIsOpen(false), [setIsOpen]);
463
+ const toggle = react.useCallback(() => setIsOpen(!isOpen), [isOpen, setIsOpen]);
464
+ const getStartInputProps = react.useCallback(
465
+ () => ({
466
+ type: "text",
467
+ value: formattedStart,
468
+ placeholder: startPlaceholder ?? locale.labels.startDate,
469
+ readOnly: true,
470
+ "aria-label": locale.labels.startDate,
471
+ onClick: () => {
472
+ setActiveInput("start");
473
+ open();
474
+ }
475
+ }),
476
+ [formattedStart, startPlaceholder, locale.labels.startDate, open]
477
+ );
478
+ const getEndInputProps = react.useCallback(
479
+ () => ({
480
+ type: "text",
481
+ value: formattedEnd,
482
+ placeholder: endPlaceholder ?? locale.labels.endDate,
483
+ readOnly: true,
484
+ "aria-label": locale.labels.endDate,
485
+ onClick: () => {
486
+ setActiveInput("end");
487
+ open();
488
+ }
489
+ }),
490
+ [formattedEnd, endPlaceholder, locale.labels.endDate, open]
491
+ );
492
+ const getPopoverProps = react.useCallback(
493
+ () => ({
494
+ role: "dialog",
495
+ "aria-modal": true,
496
+ "aria-label": "Choose date range"
497
+ }),
498
+ []
499
+ );
500
+ const getPresetButtonProps = react.useCallback(
501
+ (preset) => ({
502
+ type: "button",
503
+ onClick: () => applyPreset(preset),
504
+ "aria-label": preset.label
505
+ }),
506
+ [applyPreset]
507
+ );
508
+ return {
509
+ ...calendar,
510
+ range,
511
+ hoveredDate,
512
+ activeInput,
513
+ handleDayClick,
514
+ applyPreset,
515
+ clearRange,
516
+ setHoveredDate,
517
+ isRangeStart,
518
+ isRangeEnd,
519
+ isInRange,
520
+ isInPreviewRange,
521
+ isSelected,
522
+ formattedStart,
523
+ formattedEnd,
524
+ isOpen,
525
+ open,
526
+ close,
527
+ toggle,
528
+ presets,
529
+ separator,
530
+ activePresetIndex,
531
+ getStartInputProps,
532
+ getEndInputProps,
533
+ getPopoverProps,
534
+ getPresetButtonProps
535
+ };
536
+ }
537
+ function useMultiPicker(options = {}) {
538
+ const {
539
+ maxSelections,
540
+ locale = chunkR7HLYS5V_cjs.defaultLocale,
541
+ ...calendarOptions
542
+ } = options;
543
+ const format = options.format ?? locale.dateFormat;
544
+ const calendar = useCalendar({ ...calendarOptions, locale });
545
+ const [selectedDates, setSelectedDates] = useControllable({
546
+ value: options.value,
547
+ defaultValue: options.defaultValue ?? [],
548
+ onChange: options.onChange
549
+ });
550
+ const [isOpen, setIsOpen] = useControllable({
551
+ value: options.open,
552
+ defaultValue: options.defaultOpen ?? false,
553
+ onChange: options.onOpenChange
554
+ });
555
+ const toggleDate = react.useCallback(
556
+ (date) => {
557
+ if (calendar.isDateDisabled(date)) return;
558
+ const index = selectedDates.findIndex((d) => chunkHI4J64KK_cjs.isSameDay(d, date));
559
+ if (index >= 0) {
560
+ setSelectedDates(selectedDates.filter((_, i) => i !== index));
561
+ } else {
562
+ if (maxSelections && selectedDates.length >= maxSelections) return;
563
+ setSelectedDates([...selectedDates, date]);
564
+ }
565
+ },
566
+ [selectedDates, maxSelections, calendar.isDateDisabled, setSelectedDates]
567
+ );
568
+ const removeDate = react.useCallback(
569
+ (date) => {
570
+ setSelectedDates(selectedDates.filter((d) => !chunkHI4J64KK_cjs.isSameDay(d, date)));
571
+ },
572
+ [selectedDates, setSelectedDates]
573
+ );
574
+ const clearAll = react.useCallback(() => {
575
+ setSelectedDates([]);
576
+ }, [setSelectedDates]);
577
+ const isSelected = react.useCallback(
578
+ (date) => selectedDates.some((d) => chunkHI4J64KK_cjs.isSameDay(d, date)),
579
+ [selectedDates]
580
+ );
581
+ const formattedValues = react.useMemo(
582
+ () => selectedDates.map((d) => chunkHI4J64KK_cjs.formatDate(d, format, locale.code)),
583
+ [selectedDates, format, locale.code]
584
+ );
585
+ const open = react.useCallback(() => setIsOpen(true), [setIsOpen]);
586
+ const close = react.useCallback(() => setIsOpen(false), [setIsOpen]);
587
+ const toggle = react.useCallback(() => setIsOpen(!isOpen), [isOpen, setIsOpen]);
588
+ return {
589
+ ...calendar,
590
+ selectedDates,
591
+ toggleDate,
592
+ removeDate,
593
+ clearAll,
594
+ isSelected,
595
+ formattedValues,
596
+ isOpen,
597
+ open,
598
+ close,
599
+ toggle
600
+ };
601
+ }
602
+ function useTimePicker(options = {}) {
603
+ const {
604
+ format = "12h",
605
+ minuteStep = 1,
606
+ secondStep = 1,
607
+ showSeconds = false,
608
+ minTime,
609
+ maxTime,
610
+ name,
611
+ placeholder
612
+ } = options;
613
+ const [selectedTime, setSelectedTime] = useControllable({
614
+ value: options.value,
615
+ defaultValue: options.defaultValue ?? null,
616
+ onChange: options.onChange
617
+ });
618
+ const [isOpen, setIsOpen] = useControllable({
619
+ value: options.open,
620
+ defaultValue: options.defaultOpen ?? false,
621
+ onChange: options.onOpenChange
622
+ });
623
+ const hours24 = selectedTime?.getHours() ?? 0;
624
+ const minutes = selectedTime?.getMinutes() ?? 0;
625
+ const seconds = selectedTime?.getSeconds() ?? 0;
626
+ const { hours: display12h, meridiem } = chunkHI4J64KK_cjs.to12Hour(hours24);
627
+ const displayHours = format === "12h" ? display12h : hours24;
628
+ const updateTime = react.useCallback(
629
+ (h, m, s) => {
630
+ const base = selectedTime ? chunkHI4J64KK_cjs.clone(selectedTime) : /* @__PURE__ */ new Date();
631
+ base.setHours(h, m, s, 0);
632
+ setSelectedTime(base);
633
+ },
634
+ [selectedTime, setSelectedTime]
635
+ );
636
+ const setHours = react.useCallback(
637
+ (h) => {
638
+ const h24 = format === "12h" ? chunkHI4J64KK_cjs.to24Hour(h, meridiem) : h;
639
+ updateTime(h24, minutes, seconds);
640
+ },
641
+ [format, meridiem, minutes, seconds, updateTime]
642
+ );
643
+ const setMinutes = react.useCallback(
644
+ (m) => updateTime(hours24, m, seconds),
645
+ [hours24, seconds, updateTime]
646
+ );
647
+ const setSeconds = react.useCallback(
648
+ (s) => updateTime(hours24, minutes, s),
649
+ [hours24, minutes, updateTime]
650
+ );
651
+ const setMeridiem = react.useCallback(
652
+ (m) => {
653
+ const h = chunkHI4J64KK_cjs.to24Hour(display12h, m);
654
+ updateTime(h, minutes, seconds);
655
+ },
656
+ [display12h, minutes, seconds, updateTime]
657
+ );
658
+ const availableHours = react.useMemo(() => chunkHI4J64KK_cjs.generateHours(format), [format]);
659
+ const availableMinutes = react.useMemo(() => chunkHI4J64KK_cjs.generateMinutes(minuteStep), [minuteStep]);
660
+ const availableSeconds = react.useMemo(() => chunkHI4J64KK_cjs.generateSeconds(secondStep), [secondStep]);
661
+ const formattedValue = react.useMemo(
662
+ () => selectedTime ? chunkHI4J64KK_cjs.formatTime(selectedTime, format) : "",
663
+ [selectedTime, format]
664
+ );
665
+ const open = react.useCallback(() => setIsOpen(true), [setIsOpen]);
666
+ const close = react.useCallback(() => setIsOpen(false), [setIsOpen]);
667
+ const toggle = react.useCallback(() => setIsOpen(!isOpen), [isOpen, setIsOpen]);
668
+ const getInputProps = react.useCallback(
669
+ () => ({
670
+ type: "text",
671
+ value: formattedValue,
672
+ placeholder: placeholder ?? (format === "12h" ? "hh:mm AM" : "HH:mm"),
673
+ readOnly: true,
674
+ "aria-label": placeholder ?? "Select time",
675
+ "aria-haspopup": "listbox",
676
+ "aria-expanded": isOpen,
677
+ onClick: () => open()
678
+ }),
679
+ [formattedValue, placeholder, format, isOpen, open]
680
+ );
681
+ const getTimeOptionProps = react.useCallback(
682
+ (type, value) => {
683
+ const isActive = type === "hours" ? displayHours === value : type === "minutes" ? minutes === value : type === "seconds" ? seconds === value : meridiem === value;
684
+ return {
685
+ type: "button",
686
+ role: "option",
687
+ "aria-selected": isActive,
688
+ "data-active": isActive || void 0,
689
+ onClick: () => {
690
+ switch (type) {
691
+ case "hours":
692
+ setHours(value);
693
+ break;
694
+ case "minutes":
695
+ setMinutes(value);
696
+ break;
697
+ case "seconds":
698
+ setSeconds(value);
699
+ break;
700
+ case "meridiem":
701
+ setMeridiem(value);
702
+ break;
703
+ }
704
+ }
705
+ };
706
+ },
707
+ [displayHours, minutes, seconds, meridiem, setHours, setMinutes, setSeconds, setMeridiem]
708
+ );
709
+ return {
710
+ hours: displayHours,
711
+ minutes,
712
+ seconds,
713
+ meridiem,
714
+ setHours,
715
+ setMinutes,
716
+ setSeconds,
717
+ setMeridiem,
718
+ formattedValue,
719
+ availableHours,
720
+ availableMinutes,
721
+ availableSeconds,
722
+ showSeconds,
723
+ format,
724
+ isOpen,
725
+ open,
726
+ close,
727
+ toggle,
728
+ getInputProps,
729
+ getTimeOptionProps,
730
+ selectedTime
731
+ };
732
+ }
733
+ function useMonthPicker(options = {}) {
734
+ const { minDate, maxDate, locale = chunkR7HLYS5V_cjs.defaultLocale } = options;
735
+ const format = options.format ?? "MMM YYYY";
736
+ const [selectedDate, setSelectedDate] = useControllable({
737
+ value: options.value,
738
+ defaultValue: options.defaultValue ?? null,
739
+ onChange: options.onChange
740
+ });
741
+ const [isOpen, setIsOpen] = useControllable({
742
+ value: options.open,
743
+ defaultValue: options.defaultOpen ?? false,
744
+ onChange: options.onOpenChange
745
+ });
746
+ const [viewingYear, setViewingYear] = react.useState(
747
+ () => selectedDate?.getFullYear() ?? (/* @__PURE__ */ new Date()).getFullYear()
748
+ );
749
+ const monthGrid = react.useMemo(() => {
750
+ const grid = chunkHI4J64KK_cjs.generateMonthGrid(viewingYear);
751
+ return grid.map((item) => {
752
+ const date = chunkHI4J64KK_cjs.createDate(viewingYear, item.month, 1);
753
+ const isDisabled = (minDate ? chunkHI4J64KK_cjs.isBefore(date, chunkHI4J64KK_cjs.startOfMonth(minDate)) : false) || (maxDate ? chunkHI4J64KK_cjs.isAfter(date, maxDate) : false);
754
+ const isSelected = selectedDate ? chunkHI4J64KK_cjs.isSameMonth(date, selectedDate) : false;
755
+ return { ...item, isDisabled, isSelected, date };
756
+ });
757
+ }, [viewingYear, minDate, maxDate, selectedDate]);
758
+ const goToNextYear = react.useCallback(() => setViewingYear((y) => y + 1), []);
759
+ const goToPrevYear = react.useCallback(() => setViewingYear((y) => y - 1), []);
760
+ const selectMonth = react.useCallback(
761
+ (month) => {
762
+ const date = chunkHI4J64KK_cjs.createDate(viewingYear, month, 1);
763
+ setSelectedDate(date);
764
+ },
765
+ [viewingYear, setSelectedDate]
766
+ );
767
+ const formattedValue = react.useMemo(
768
+ () => selectedDate ? chunkHI4J64KK_cjs.formatDate(selectedDate, format, locale.code) : "",
769
+ [selectedDate, format, locale.code]
770
+ );
771
+ const open = react.useCallback(() => setIsOpen(true), [setIsOpen]);
772
+ const close = react.useCallback(() => setIsOpen(false), [setIsOpen]);
773
+ const toggle = react.useCallback(() => setIsOpen(!isOpen), [isOpen, setIsOpen]);
774
+ const getInputProps = react.useCallback(
775
+ () => ({
776
+ type: "text",
777
+ value: formattedValue,
778
+ readOnly: true,
779
+ "aria-label": locale.labels.selectMonth,
780
+ "aria-haspopup": "dialog",
781
+ "aria-expanded": isOpen,
782
+ onClick: () => open()
783
+ }),
784
+ [formattedValue, locale.labels.selectMonth, isOpen, open]
785
+ );
786
+ const getMonthButtonProps = react.useCallback(
787
+ (month) => {
788
+ const item = monthGrid.find((m) => m.month === month);
789
+ return {
790
+ type: "button",
791
+ "aria-selected": item?.isSelected ?? false,
792
+ "aria-disabled": item?.isDisabled ?? false,
793
+ disabled: item?.isDisabled ?? false,
794
+ onClick: () => {
795
+ if (!item?.isDisabled) {
796
+ selectMonth(month);
797
+ close();
798
+ }
799
+ }
800
+ };
801
+ },
802
+ [monthGrid, selectMonth, close]
803
+ );
804
+ return {
805
+ viewingYear,
806
+ selectedDate,
807
+ monthGrid,
808
+ goToNextYear,
809
+ goToPrevYear,
810
+ selectMonth,
811
+ formattedValue,
812
+ isOpen,
813
+ open,
814
+ close,
815
+ toggle,
816
+ getInputProps,
817
+ getMonthButtonProps,
818
+ locale
819
+ };
820
+ }
821
+ function useYearPicker(options = {}) {
822
+ const { minYear, maxYear, yearsPerPage = 12 } = options;
823
+ const [selectedYear, setSelectedYear] = useControllable({
824
+ value: options.value,
825
+ defaultValue: options.defaultValue ?? null,
826
+ onChange: options.onChange
827
+ });
828
+ const [isOpen, setIsOpen] = useControllable({
829
+ value: options.open,
830
+ defaultValue: options.defaultOpen ?? false,
831
+ onChange: options.onOpenChange
832
+ });
833
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
834
+ const [centerYear, setCenterYear] = react.useState(selectedYear ?? currentYear);
835
+ const years = react.useMemo(() => {
836
+ const grid = chunkHI4J64KK_cjs.generateYearGrid(centerYear, yearsPerPage);
837
+ return grid.map((item) => ({
838
+ ...item,
839
+ isDisabled: minYear != null && item.year < minYear || maxYear != null && item.year > maxYear,
840
+ isSelected: selectedYear === item.year,
841
+ isCurrentYear: item.year === currentYear
842
+ }));
843
+ }, [centerYear, yearsPerPage, minYear, maxYear, selectedYear, currentYear]);
844
+ const decadeStart = years[0]?.year ?? centerYear;
845
+ const goToNextDecade = react.useCallback(
846
+ () => setCenterYear((y) => y + yearsPerPage),
847
+ [yearsPerPage]
848
+ );
849
+ const goToPrevDecade = react.useCallback(
850
+ () => setCenterYear((y) => y - yearsPerPage),
851
+ [yearsPerPage]
852
+ );
853
+ const selectYear = react.useCallback(
854
+ (year) => setSelectedYear(year),
855
+ [setSelectedYear]
856
+ );
857
+ const open = react.useCallback(() => setIsOpen(true), [setIsOpen]);
858
+ const close = react.useCallback(() => setIsOpen(false), [setIsOpen]);
859
+ const toggle = react.useCallback(() => setIsOpen(!isOpen), [isOpen, setIsOpen]);
860
+ const getInputProps = react.useCallback(
861
+ () => ({
862
+ type: "text",
863
+ value: selectedYear != null ? String(selectedYear) : "",
864
+ readOnly: true,
865
+ "aria-label": "Select year",
866
+ "aria-haspopup": "dialog",
867
+ "aria-expanded": isOpen,
868
+ onClick: () => open()
869
+ }),
870
+ [selectedYear, isOpen, open]
871
+ );
872
+ const getYearButtonProps = react.useCallback(
873
+ (year) => {
874
+ const item = years.find((y) => y.year === year);
875
+ return {
876
+ type: "button",
877
+ "aria-selected": item?.isSelected ?? false,
878
+ "aria-disabled": item?.isDisabled ?? false,
879
+ disabled: item?.isDisabled ?? false,
880
+ onClick: () => {
881
+ if (!item?.isDisabled) {
882
+ selectYear(year);
883
+ close();
884
+ }
885
+ }
886
+ };
887
+ },
888
+ [years, selectYear, close]
889
+ );
890
+ return {
891
+ decadeStart,
892
+ selectedYear,
893
+ years,
894
+ goToNextDecade,
895
+ goToPrevDecade,
896
+ selectYear,
897
+ isOpen,
898
+ open,
899
+ close,
900
+ toggle,
901
+ getInputProps,
902
+ getYearButtonProps
903
+ };
904
+ }
905
+ function useWeekPicker(options = {}) {
906
+ const { locale = chunkR7HLYS5V_cjs.defaultLocale, ...calendarOptions } = options;
907
+ const format = options.format ?? locale.dateFormat;
908
+ const weekStartsOn = options.weekStartsOn ?? locale.weekStartsOn;
909
+ const calendar = useCalendar({
910
+ ...calendarOptions,
911
+ locale,
912
+ showWeekNumbers: true,
913
+ weekStartsOn
914
+ });
915
+ const [selectedWeekDate, setSelectedWeekDate] = useControllable({
916
+ value: options.value,
917
+ defaultValue: options.defaultValue ?? null,
918
+ onChange: void 0
919
+ });
920
+ const [isOpen, setIsOpen] = useControllable({
921
+ value: options.open,
922
+ defaultValue: options.defaultOpen ?? false,
923
+ onChange: options.onOpenChange
924
+ });
925
+ const selectedWeek = react.useMemo(() => {
926
+ if (!selectedWeekDate) return null;
927
+ const start = chunkHI4J64KK_cjs.startOfWeek(selectedWeekDate, weekStartsOn);
928
+ const end = chunkHI4J64KK_cjs.endOfWeek(selectedWeekDate, weekStartsOn);
929
+ const weekNumber = chunkHI4J64KK_cjs.getWeekNumber(selectedWeekDate, weekStartsOn);
930
+ return { start, end, weekNumber };
931
+ }, [selectedWeekDate, weekStartsOn]);
932
+ const selectWeek = react.useCallback(
933
+ (date) => {
934
+ if (calendar.isDateDisabled(date)) return;
935
+ setSelectedWeekDate(date);
936
+ const start = chunkHI4J64KK_cjs.startOfWeek(date, weekStartsOn);
937
+ const end = chunkHI4J64KK_cjs.endOfWeek(date, weekStartsOn);
938
+ const weekNumber = chunkHI4J64KK_cjs.getWeekNumber(date, weekStartsOn);
939
+ options.onChange?.(start, end, weekNumber);
940
+ },
941
+ [calendar.isDateDisabled, weekStartsOn, options.onChange, setSelectedWeekDate]
942
+ );
943
+ const isInSelectedWeek = react.useCallback(
944
+ (date) => {
945
+ if (!selectedWeek) return false;
946
+ const weekDates = chunkHI4J64KK_cjs.getWeekDates(selectedWeek.start, weekStartsOn);
947
+ return weekDates.some((d) => chunkHI4J64KK_cjs.isSameDay(d, date));
948
+ },
949
+ [selectedWeek, weekStartsOn]
950
+ );
951
+ const formattedValue = react.useMemo(() => {
952
+ if (!selectedWeek) return "";
953
+ return `${chunkHI4J64KK_cjs.formatDate(selectedWeek.start, format, locale.code)} \u2013 ${chunkHI4J64KK_cjs.formatDate(selectedWeek.end, format, locale.code)}`;
954
+ }, [selectedWeek, format, locale.code]);
955
+ const open = react.useCallback(() => setIsOpen(true), [setIsOpen]);
956
+ const close = react.useCallback(() => setIsOpen(false), [setIsOpen]);
957
+ const toggle = react.useCallback(() => setIsOpen(!isOpen), [isOpen, setIsOpen]);
958
+ const getInputProps = react.useCallback(
959
+ () => ({
960
+ type: "text",
961
+ value: formattedValue,
962
+ readOnly: true,
963
+ "aria-label": "Select week",
964
+ "aria-haspopup": "dialog",
965
+ "aria-expanded": isOpen,
966
+ onClick: () => open()
967
+ }),
968
+ [formattedValue, isOpen, open]
969
+ );
970
+ return {
971
+ ...calendar,
972
+ selectedWeek,
973
+ selectWeek,
974
+ isInSelectedWeek,
975
+ formattedValue,
976
+ isOpen,
977
+ open,
978
+ close,
979
+ toggle,
980
+ getInputProps
981
+ };
982
+ }
983
+ function useDateTimePicker(options = {}) {
984
+ const {
985
+ timeFormat = "12h",
986
+ minuteStep = 1,
987
+ showSeconds = false,
988
+ locale = chunkR7HLYS5V_cjs.defaultLocale,
989
+ ...dateOptions
990
+ } = options;
991
+ const dateFormat = options.dateFormat ?? locale.dateFormat;
992
+ const datePicker = useDatePicker({
993
+ ...dateOptions,
994
+ format: dateFormat,
995
+ closeOnSelect: false,
996
+ locale
997
+ });
998
+ const [activeTab, setActiveTab] = react.useState("date");
999
+ const selectedDate = datePicker.selectedDate;
1000
+ const hours24 = selectedDate?.getHours() ?? 0;
1001
+ const minutes = selectedDate?.getMinutes() ?? 0;
1002
+ const seconds = selectedDate?.getSeconds() ?? 0;
1003
+ const { hours: display12h, meridiem } = chunkHI4J64KK_cjs.to12Hour(hours24);
1004
+ const displayHours = timeFormat === "12h" ? display12h : hours24;
1005
+ const updateTime = react.useCallback(
1006
+ (h, m, s) => {
1007
+ const base = selectedDate ? chunkHI4J64KK_cjs.clone(selectedDate) : /* @__PURE__ */ new Date();
1008
+ base.setHours(h, m, s, 0);
1009
+ datePicker.selectDate(base);
1010
+ },
1011
+ [selectedDate, datePicker.selectDate]
1012
+ );
1013
+ const setHours = react.useCallback(
1014
+ (h) => {
1015
+ const h24 = timeFormat === "12h" ? chunkHI4J64KK_cjs.to24Hour(h, meridiem) : h;
1016
+ updateTime(h24, minutes, seconds);
1017
+ },
1018
+ [timeFormat, meridiem, minutes, seconds, updateTime]
1019
+ );
1020
+ const setMinutes = react.useCallback(
1021
+ (m) => updateTime(hours24, m, seconds),
1022
+ [hours24, seconds, updateTime]
1023
+ );
1024
+ const setSeconds = react.useCallback(
1025
+ (s) => updateTime(hours24, minutes, s),
1026
+ [hours24, minutes, updateTime]
1027
+ );
1028
+ const setMeridiem = react.useCallback(
1029
+ (m) => {
1030
+ const h = chunkHI4J64KK_cjs.to24Hour(display12h, m);
1031
+ updateTime(h, minutes, seconds);
1032
+ },
1033
+ [display12h, minutes, seconds, updateTime]
1034
+ );
1035
+ const formattedValue = react.useMemo(() => {
1036
+ if (!selectedDate) return "";
1037
+ const datePart = chunkHI4J64KK_cjs.formatDate(selectedDate, dateFormat, locale.code);
1038
+ const timePart = chunkHI4J64KK_cjs.formatTime(selectedDate, timeFormat);
1039
+ return `${datePart} ${timePart}`;
1040
+ }, [selectedDate, dateFormat, timeFormat, locale.code]);
1041
+ return {
1042
+ ...datePicker,
1043
+ formattedValue,
1044
+ hours: displayHours,
1045
+ minutes,
1046
+ seconds,
1047
+ meridiem,
1048
+ setHours,
1049
+ setMinutes,
1050
+ setSeconds,
1051
+ setMeridiem,
1052
+ activeTab,
1053
+ setActiveTab,
1054
+ timeFormat,
1055
+ minuteStep,
1056
+ showSeconds
1057
+ };
1058
+ }
1059
+ function useClickOutside(refs, handler, enabled = true) {
1060
+ const handlerRef = react.useRef(handler);
1061
+ handlerRef.current = handler;
1062
+ react.useEffect(() => {
1063
+ if (!enabled) return;
1064
+ const listener = (event) => {
1065
+ const target = event.target;
1066
+ const isOutside = refs.every((ref) => {
1067
+ return !ref.current || !ref.current.contains(target);
1068
+ });
1069
+ if (isOutside) {
1070
+ handlerRef.current(event);
1071
+ }
1072
+ };
1073
+ document.addEventListener("mousedown", listener);
1074
+ document.addEventListener("touchstart", listener);
1075
+ return () => {
1076
+ document.removeEventListener("mousedown", listener);
1077
+ document.removeEventListener("touchstart", listener);
1078
+ };
1079
+ }, [refs, enabled]);
1080
+ }
1081
+ function usePortal(options) {
1082
+ const { containerId = "brdp-portal", enabled = true } = options ?? {};
1083
+ const [portalTarget, setPortalTarget] = react.useState(null);
1084
+ react.useEffect(() => {
1085
+ if (!enabled) {
1086
+ setPortalTarget(null);
1087
+ return;
1088
+ }
1089
+ let container = document.getElementById(containerId);
1090
+ if (!container) {
1091
+ container = document.createElement("div");
1092
+ container.id = containerId;
1093
+ document.body.appendChild(container);
1094
+ }
1095
+ setPortalTarget(container);
1096
+ }, [containerId, enabled]);
1097
+ return {
1098
+ portalTarget,
1099
+ isPortalReady: !!portalTarget
1100
+ };
1101
+ }
1102
+ function useFocusTrap(containerRef, enabled = true) {
1103
+ const previousFocusRef = react.useRef(null);
1104
+ react.useEffect(() => {
1105
+ if (!enabled || !containerRef.current) return;
1106
+ previousFocusRef.current = document.activeElement;
1107
+ const container = containerRef.current;
1108
+ const focusableSelector = 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
1109
+ const focusFirst = () => {
1110
+ const firstFocusable = container.querySelector(focusableSelector);
1111
+ firstFocusable?.focus();
1112
+ };
1113
+ const handleKeyDown = (event) => {
1114
+ if (event.key !== "Tab") return;
1115
+ const focusableElements = container.querySelectorAll(focusableSelector);
1116
+ if (focusableElements.length === 0) return;
1117
+ const firstFocusable = focusableElements[0];
1118
+ const lastFocusable = focusableElements[focusableElements.length - 1];
1119
+ if (event.shiftKey) {
1120
+ if (document.activeElement === firstFocusable) {
1121
+ event.preventDefault();
1122
+ lastFocusable.focus();
1123
+ }
1124
+ } else {
1125
+ if (document.activeElement === lastFocusable) {
1126
+ event.preventDefault();
1127
+ firstFocusable.focus();
1128
+ }
1129
+ }
1130
+ };
1131
+ focusFirst();
1132
+ container.addEventListener("keydown", handleKeyDown);
1133
+ return () => {
1134
+ container.removeEventListener("keydown", handleKeyDown);
1135
+ previousFocusRef.current?.focus();
1136
+ };
1137
+ }, [containerRef, enabled]);
1138
+ }
1139
+
1140
+ exports.useCalendar = useCalendar;
1141
+ exports.useClickOutside = useClickOutside;
1142
+ exports.useControllable = useControllable;
1143
+ exports.useDatePicker = useDatePicker;
1144
+ exports.useDateTimePicker = useDateTimePicker;
1145
+ exports.useFocusTrap = useFocusTrap;
1146
+ exports.useKeyboardNav = useKeyboardNav;
1147
+ exports.useMonthPicker = useMonthPicker;
1148
+ exports.useMultiPicker = useMultiPicker;
1149
+ exports.usePortal = usePortal;
1150
+ exports.useRangePicker = useRangePicker;
1151
+ exports.useTimePicker = useTimePicker;
1152
+ exports.useWeekPicker = useWeekPicker;
1153
+ exports.useYearPicker = useYearPicker;
1154
+ //# sourceMappingURL=chunk-A3NQUSC5.cjs.map
1155
+ //# sourceMappingURL=chunk-A3NQUSC5.cjs.map