@entur/datepicker 3.0.4 → 4.0.0-alpha.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.
@@ -1,5 +1,5 @@
1
- import { mergeRefs, useRandomId, useOnMount, warnAboutMissingStyles } from '@entur/utils';
2
- import React, { useRef, useState } from 'react';
1
+ import { mergeRefs, useRandomId, useOnClickOutside, useOnMount, warnAboutMissingStyles } from '@entur/utils';
2
+ import React, { useRef, useState, useEffect } from 'react';
3
3
  import ReactDatepicker, { registerLocale } from 'react-datepicker';
4
4
  import { parse, isSameDay } from 'date-fns';
5
5
  import { nb } from 'date-fns/locale';
@@ -10,10 +10,16 @@ import { IconButton } from '@entur/button';
10
10
  import { TextField, BaseFormControl, useVariant, useInputGroupContext, isFilled } from '@entur/form';
11
11
  import { Tooltip } from '@entur/tooltip';
12
12
  import 'react-datepicker/dist/react-datepicker.css';
13
- import { useDateSegment, useTimeField } from '@react-aria/datepicker';
13
+ import { useDateFieldState, useDatePickerState, useTimeFieldState } from '@react-stately/datepicker';
14
+ import { useDateSegment, useDateField, useDatePicker, useTimeField } from '@react-aria/datepicker';
14
15
  import { useLocale, I18nProvider } from '@react-aria/i18n';
15
- import { useTimeFieldState } from '@react-stately/datepicker';
16
- import { now, getLocalTimeZone, ZonedDateTime, parseAbsolute, Time, CalendarDateTime } from '@internationalized/date';
16
+ import { ZonedDateTime, parseAbsolute, Time, CalendarDateTime, GregorianCalendar, isEqualDay, now, getLocalTimeZone, getWeeksInMonth } from '@internationalized/date';
17
+ import { useCalendarCell, useCalendarGrid, useCalendar } from '@react-aria/calendar';
18
+ import { useCalendarState } from '@react-stately/calendar';
19
+ import { useButton } from '@react-aria/button';
20
+ import { useFloating, offset, flip, shift } from '@floating-ui/react-dom';
21
+ import FocusLock from 'react-focus-lock';
22
+ import { space } from '@entur/tokens';
17
23
 
18
24
  function _extends() {
19
25
  _extends = Object.assign || function (target) {
@@ -89,7 +95,7 @@ function getMonthName(monthIndex, locale) {
89
95
  return formatter.format(new Date(year, monthIndex));
90
96
  }
91
97
 
92
- var _excluded$4 = ["style", "label", "inputPlaceholder", "prepend", "feedback", "variant", "disabled", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "disableLabelAnimation", "inputRef", "calendarButtonId", "forwardRef", "toggleCalendarGUI", "onKeyDownInput", "onBlurInput", "selectedDate", "setFocusToCalendarGUI", "setShouldFocusOnCalendarButtonAfterSelect", "calendarGUIIsOpen", "placeholder", "onClick", "aria-labelledby"];
98
+ var _excluded$9 = ["style", "label", "inputPlaceholder", "prepend", "feedback", "variant", "disabled", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "disableLabelAnimation", "inputRef", "calendarButtonId", "forwardRef", "toggleCalendarGUI", "onKeyDownInput", "onBlurInput", "selectedDate", "setFocusToCalendarGUI", "setShouldFocusOnCalendarButtonAfterSelect", "calendarGUIIsOpen", "placeholder", "onClick", "aria-labelledby"];
93
99
  var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
94
100
  var style = _ref.style,
95
101
  label = _ref.label,
@@ -113,7 +119,7 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
113
119
  setShouldFocusOnCalendarButtonAfterSelect = _ref.setShouldFocusOnCalendarButtonAfterSelect,
114
120
  calendarGUIIsOpen = _ref.calendarGUIIsOpen,
115
121
  onClick = _ref.onClick,
116
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
122
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
117
123
 
118
124
  React.useEffect(function () {
119
125
  var _inputRef$current, _inputRef$current2, _inputRef$current3;
@@ -191,7 +197,7 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
191
197
  }, rest));
192
198
  });
193
199
 
194
- var _excluded$3 = ["style", "className", "selectedDate", "label", "placeholder", "onChange", "onKeyDown", "dateFormats", "minDate", "maxDate", "inline", "disabled", "prepend", "feedback", "variant", "validationFeedback", "validationVariant", "disableLabelAnimation", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "hideCalendar", "hideValidation", "weekLabel", "chooseDayAriaLabelPrefix", "previousMonthAriaLabel", "nextMonthAriaLabel", "locale", "open"];
200
+ var _excluded$8 = ["style", "className", "selectedDate", "label", "placeholder", "onChange", "onKeyDown", "dateFormats", "minDate", "maxDate", "inline", "disabled", "prepend", "feedback", "variant", "validationFeedback", "validationVariant", "disableLabelAnimation", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "hideCalendar", "hideValidation", "weekLabel", "chooseDayAriaLabelPrefix", "previousMonthAriaLabel", "nextMonthAriaLabel", "locale", "open"];
195
201
  registerLocale('nb', nb);
196
202
  var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
197
203
  var style = _ref.style,
@@ -243,7 +249,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
243
249
  _ref$locale = _ref.locale,
244
250
  locale = _ref$locale === void 0 ? nb : _ref$locale,
245
251
  open = _ref.open,
246
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
252
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
247
253
 
248
254
  var datepickerId = useRandomId('eds-datepicker');
249
255
  var datepickerRef = useRef(null);
@@ -475,6 +481,449 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
475
481
  }, rest)));
476
482
  });
477
483
 
484
+ var FieldSegment = function FieldSegment(_ref) {
485
+ var segment = _ref.segment,
486
+ state = _ref.state;
487
+ var ref = useRef(null);
488
+
489
+ var _useDateSegment = useDateSegment(segment, state, ref),
490
+ segmentProps = _useDateSegment.segmentProps;
491
+
492
+ var is12HourFormatted = state.segments.some(function (segment) {
493
+ return segment.text === 'AM' || segment.text === 'PM';
494
+ });
495
+
496
+ var segmentDisplayText = function segmentDisplayText() {
497
+ if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
498
+
499
+ if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
500
+ return segment.text;
501
+ };
502
+
503
+ return React.createElement("div", _extends({}, segmentProps, {
504
+ ref: ref,
505
+ className: classNames('eds-date-and-time-field__segment', {
506
+ 'eds-date-and-time-field__segment--placeholder': segment.isPlaceholder,
507
+ 'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
508
+ }),
509
+ tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
510
+ }), segmentDisplayText());
511
+ };
512
+
513
+ /**
514
+ * Tar inn et JS Date-objekt og returnerer et av TimeValue-objektene fra @internationalized/date-pakken
515
+ * @param {Date} date JS Date-objekt som ønskes konvertert til et TimeValue-objekt
516
+ * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
517
+ * @param {string} timeZone Tidssonen på IANA-formatet som tidpunktet skal konverteres til. Utelates denne får man et tidspunkt uten tidssone. Kan brukes med og uten en UTC-offset Vær obs på annen oppførsel med offset, les mer på beskrivelsen av offset
518
+ * @param {number} offset UTC-offset i millisekunder, må brukes med en tidssone. Ved å legge på en offset lager du en variant av en tidssone. Det betyr at tidspunktet ikke endres (time, minutt, sekund uendret), men tidssonen, med tilhørende offset, tidspunktet er i endres.
519
+ * @returns {Time | CalendarDateTime | ZonedDateTime} et av TimeValue-objektene med verdier fra date
520
+ */
521
+
522
+ var nativeDateToTimeValue = function nativeDateToTimeValue(date, noDateOnlyTime, timeZone, offset) {
523
+ if (noDateOnlyTime === void 0) {
524
+ noDateOnlyTime = false;
525
+ }
526
+
527
+ if (timeZone) {
528
+ if (offset) {
529
+ return new ZonedDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), timeZone, offset, date.getHours(), date.getMinutes(), date.getSeconds());
530
+ }
531
+
532
+ return parseAbsolute(date.toISOString(), timeZone);
533
+ }
534
+
535
+ if (noDateOnlyTime) return new Time(date.getHours(), date.getMinutes(), date.getSeconds(), 0);
536
+ return new CalendarDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
537
+ };
538
+ /**
539
+ * Tar inn et av TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
540
+ * @param {TimeValue} time Et tidspunkt på TimeValue-formatet som ønsket konvertert til et JS Date-objekt
541
+ * @param {string} timeZoneForCalendarDateTime Tidssonen time er i. Fungerer kun med typen er CalendarDateTime
542
+ * @returns {Date} et Date-objekt med verdier fra time
543
+ */
544
+ // This function uses a lot of @ts-expect-error to make it work with all TimeValue types. Sorry ...
545
+
546
+ var timeValueToNativeDate = function timeValueToNativeDate(time, timeZoneForCalendarDateTime) {
547
+ // @ts-expect-error .day does not exist on Time-object
548
+ if (!time.day) {
549
+ // type is Time
550
+ var date = new Date();
551
+ date.setHours(time.hour);
552
+ date.setMinutes(time.minute);
553
+ date.setSeconds(time.second);
554
+ return date;
555
+ } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
556
+
557
+
558
+ if (!time.timeZone) {
559
+ // type is CalendarDateTime
560
+ if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
561
+ return time.toDate(timeZoneForCalendarDateTime);
562
+ return new Date( // @ts-expect-error not in type Time
563
+ time.year, // @ts-expect-error not in type Time
564
+ time.month - 1, // @ts-expect-error not in type Time
565
+ time.day, time.hour, time.minute, time.second);
566
+ } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
567
+
568
+
569
+ return time.toDate();
570
+ };
571
+ var createCalendar = function createCalendar(identifier) {
572
+ if (identifier === void 0) {
573
+ identifier = 'gregory';
574
+ }
575
+
576
+ switch (identifier) {
577
+ case 'gregory':
578
+ return new GregorianCalendar();
579
+
580
+ default:
581
+ throw new Error("Unsupported calendar " + identifier);
582
+ }
583
+ };
584
+ var ariaLabelIfNorwegian = function ariaLabelIfNorwegian(norwegianAriaLabel, locale, propsCollection) {
585
+ if (locale !== 'no-NO') return propsCollection['aria-label'];
586
+ return norwegianAriaLabel;
587
+ };
588
+
589
+ var _excluded$7 = ["selectedDate", "label", "showTimeZone", "showTime", "granularity", "disabled", "variant", "feedback", "labelTooltip", "style", "className", "labelProps", "append"];
590
+ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
591
+ var value = _ref.selectedDate,
592
+ label = _ref.label,
593
+ showTimeZone = _ref.showTimeZone,
594
+ showTime = _ref.showTime,
595
+ _ref$granularity = _ref.granularity,
596
+ granularity = _ref$granularity === void 0 ? 'day' : _ref$granularity,
597
+ disabled = _ref.disabled,
598
+ variant = _ref.variant,
599
+ feedback = _ref.feedback,
600
+ labelTooltip = _ref.labelTooltip,
601
+ style = _ref.style,
602
+ className = _ref.className,
603
+ parentLabelProps = _ref.labelProps,
604
+ append = _ref.append,
605
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
606
+
607
+ var _useLocale = useLocale(),
608
+ locale = _useLocale.locale;
609
+
610
+ var state = useDateFieldState(_extends({}, rest, {
611
+ locale: locale,
612
+ createCalendar: createCalendar,
613
+ value: value === null ? undefined : value,
614
+ hideTimeZone: !showTimeZone,
615
+ granularity: showTime ? 'minute' : granularity
616
+ }));
617
+ var dateFieldRef = useRef(null);
618
+
619
+ var _useDateField = useDateField(_extends({}, rest, {
620
+ label: label,
621
+ isDisabled: disabled || rest.isDisabled
622
+ }), state, dateFieldRef),
623
+ labelProps = _useDateField.labelProps,
624
+ fieldProps = _useDateField.fieldProps;
625
+
626
+ var id = useRandomId('datefield');
627
+ return React.createElement(BaseFormControl, _extends({
628
+ style: style,
629
+ className: classNames('eds-datefield', className),
630
+ labelId: id,
631
+ ref: mergeRefs(dateFieldRef, ref),
632
+ disabled: state.isDisabled,
633
+ disableLabelAnimation: true,
634
+ label: label,
635
+ labelTooltip: labelTooltip,
636
+ labelProps: parentLabelProps != null ? parentLabelProps : labelProps
637
+ }, fieldProps, {
638
+ variant: variant,
639
+ feedback: feedback,
640
+ append: append
641
+ }), state.segments.map(function (segment, i) {
642
+ return React.createElement(FieldSegment, {
643
+ segment: segment,
644
+ state: state,
645
+ key: i
646
+ });
647
+ }));
648
+ });
649
+
650
+ var _excluded$6 = ["children", "className", "style"];
651
+ var CalendarButton = function CalendarButton(_ref) {
652
+ var children = _ref.children,
653
+ className = _ref.className,
654
+ style = _ref.style,
655
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$6);
656
+
657
+ var ref = useRef(null);
658
+
659
+ var _useButton = useButton(props, ref),
660
+ buttonProps = _useButton.buttonProps;
661
+
662
+ return React.createElement(IconButton, _extends({}, buttonProps, {
663
+ ref: ref,
664
+ className: className,
665
+ style: style
666
+ }), children);
667
+ };
668
+
669
+ var CalendarCell = function CalendarCell(_ref) {
670
+ var _state$timeZone;
671
+
672
+ var state = _ref.state,
673
+ date = _ref.date;
674
+ var cellRef = useRef(null);
675
+
676
+ var _useCalendarCell = useCalendarCell({
677
+ date: date
678
+ }, state, cellRef),
679
+ cellProps = _useCalendarCell.cellProps,
680
+ buttonProps = _useCalendarCell.buttonProps,
681
+ isSelected = _useCalendarCell.isSelected,
682
+ isOutsideVisibleRange = _useCalendarCell.isOutsideVisibleRange,
683
+ isDisabled = _useCalendarCell.isDisabled,
684
+ isUnavailable = _useCalendarCell.isUnavailable,
685
+ formattedDate = _useCalendarCell.formattedDate;
686
+
687
+ return React.createElement("td", _extends({}, cellProps, {
688
+ className: "eds-datepicker__calendar__grid__cell__td"
689
+ }), React.createElement("div", _extends({}, buttonProps, {
690
+ ref: cellRef,
691
+ hidden: isOutsideVisibleRange,
692
+ className: classNames('eds-datepicker__calendar__grid__cell', {
693
+ 'eds-datepicker__calendar__grid__cell--selected': isSelected,
694
+ 'eds-datepicker__calendar__grid__cell--disabled': isDisabled,
695
+ 'eds-datepicker__calendar__grid__cell--unavailable': isUnavailable,
696
+ 'eds-datepicker__calendar__grid__cell--today': isEqualDay(date, now((_state$timeZone = state.timeZone) != null ? _state$timeZone : getLocalTimeZone()))
697
+ })
698
+ }), formattedDate));
699
+ };
700
+
701
+ var _excluded$5 = ["state"];
702
+ var CalendarGrid = function CalendarGrid(_ref) {
703
+ var state = _ref.state,
704
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
705
+
706
+ var _useLocale = useLocale(),
707
+ locale = _useLocale.locale;
708
+
709
+ var _useCalendarGrid = useCalendarGrid(rest, state),
710
+ gridProps = _useCalendarGrid.gridProps,
711
+ headerProps = _useCalendarGrid.headerProps,
712
+ weekDays = _useCalendarGrid.weekDays;
713
+
714
+ var weeksInMonth = getWeeksInMonth(state.visibleRange.start, locale);
715
+ var weeksArray = Array.from(Array(weeksInMonth).keys());
716
+
717
+ var weekDaysMapped = function weekDaysMapped() {
718
+ if (locale.toLowerCase() === 'no-no' || locale.toLowerCase() === 'no') return ['ma', 'ti', 'on', 'to', 'fr', 'lø', 'sø'];
719
+ if (weekDays.toString() === 'M,T,W,T,F,S,S') return ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
720
+ return weekDays.map(function (day) {
721
+ return day.toLowerCase();
722
+ });
723
+ };
724
+
725
+ return React.createElement("table", _extends({}, gridProps, {
726
+ cellSpacing: "0",
727
+ className: "eds-datepicker__calendar__grid"
728
+ }), React.createElement("thead", _extends({}, headerProps), React.createElement("tr", null, weekDaysMapped().map(function (day, index) {
729
+ return React.createElement("th", {
730
+ key: index
731
+ }, day);
732
+ }))), React.createElement("tbody", null, weeksArray.map(function (weekIndex) {
733
+ return React.createElement("tr", {
734
+ key: weekIndex
735
+ }, state.getDatesInWeek(weekIndex).map(function (date, i) {
736
+ return date ? React.createElement(CalendarCell, {
737
+ key: i,
738
+ state: state,
739
+ date: date
740
+ }) : React.createElement("td", {
741
+ key: i
742
+ });
743
+ }));
744
+ })));
745
+ };
746
+
747
+ var _excluded$4 = ["selectedDate", "style", "children"];
748
+ var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
749
+ var style = _ref.style,
750
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
751
+
752
+ var _useLocale = useLocale(),
753
+ locale = _useLocale.locale;
754
+
755
+ var state = useCalendarState(_extends({}, rest, {
756
+ locale: locale,
757
+ createCalendar: createCalendar
758
+ }));
759
+
760
+ var _useCalendar = useCalendar(rest, state),
761
+ calendarProps = _useCalendar.calendarProps,
762
+ prevButtonProps = _useCalendar.prevButtonProps,
763
+ nextButtonProps = _useCalendar.nextButtonProps,
764
+ title = _useCalendar.title; // const monthAndYear = title.split(' ');
765
+
766
+
767
+ return React.createElement("div", _extends({}, calendarProps, {
768
+ ref: ref,
769
+ className: "eds-datepicker__calendar",
770
+ style: style
771
+ }), React.createElement("div", {
772
+ className: "eds-datepicker__calendar__header"
773
+ }, React.createElement(CalendarButton, _extends({}, prevButtonProps, {
774
+ "aria-label": ariaLabelIfNorwegian('Forrige måned', locale, prevButtonProps)
775
+ }), React.createElement(LeftArrowIcon, {
776
+ size: 20
777
+ })), React.createElement("h2", null, title), React.createElement(CalendarButton, _extends({}, nextButtonProps, {
778
+ "aria-label": ariaLabelIfNorwegian('Neste måned', locale, nextButtonProps)
779
+ }), React.createElement(RightArrowIcon, {
780
+ size: 20
781
+ }))), React.createElement(CalendarGrid, {
782
+ state: state
783
+ }));
784
+ }); // const getTitle = (monthYearList: string[], locale: string) => {
785
+ // const month = monthYearList[0];
786
+ // const year = monthYearList[1];
787
+ // if (locale.toLowerCase() !== 'no-no' && locale.toLowerCase() !== 'no')
788
+ // return month + ' ' + year;
789
+ // switch (month.toLowerCase()) {
790
+ // case 'january':
791
+ // return 'januar ' + year;
792
+ // case 'february':
793
+ // return 'februar ' + year;
794
+ // case 'march':
795
+ // return 'mars ' + year;
796
+ // case 'may':
797
+ // return 'mai ' + year;
798
+ // case 'june':
799
+ // return 'juni ' + year;
800
+ // case 'july':
801
+ // return 'juli ' + year;
802
+ // case 'october':
803
+ // return 'oktober ' + year;
804
+ // case 'december':
805
+ // return 'desember ' + year;
806
+ // default:
807
+ // return month.toLowerCase() + ' ' + year.toLowerCase();
808
+ // }
809
+ // };
810
+
811
+ var _excluded$3 = ["selectedDate", "onChange", "disabled", "className", "style", "variant", "feedback"];
812
+ var DatePickerBeta = function DatePickerBeta(_ref) {
813
+ var value = _ref.selectedDate,
814
+ _onChange = _ref.onChange,
815
+ isDisabled = _ref.disabled,
816
+ className = _ref.className,
817
+ variant = _ref.variant,
818
+ feedback = _ref.feedback,
819
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
820
+
821
+ var datePickerRef = useRef(null);
822
+ var calendarRef = useRef(null);
823
+ var dateFieldRef = useRef(null); // TODO SE PÅ OM VERDIER I USE...STATE BURDE VÆRE I USE... I STEDET
824
+
825
+ var state = useDatePickerState(_extends({}, rest, {
826
+ value: value,
827
+ onChange: _onChange
828
+ }));
829
+
830
+ var _useDatePicker = useDatePicker(_extends({
831
+ isDisabled: isDisabled
832
+ }, rest), state, datePickerRef),
833
+ groupProps = _useDatePicker.groupProps,
834
+ labelProps = _useDatePicker.labelProps,
835
+ fieldProps = _useDatePicker.fieldProps,
836
+ buttonProps = _useDatePicker.buttonProps,
837
+ dialogProps = _useDatePicker.dialogProps,
838
+ calendarProps = _useDatePicker.calendarProps; // calculations for floating-UI popover position
839
+
840
+
841
+ var _useFloating = useFloating({
842
+ placement: 'bottom-start',
843
+ middleware: [offset(space.extraSmall), flip(), shift({
844
+ padding: space.extraSmall
845
+ })]
846
+ }),
847
+ x = _useFloating.x,
848
+ y = _useFloating.y,
849
+ reference = _useFloating.reference,
850
+ floating = _useFloating.floating,
851
+ strategy = _useFloating.strategy; // set focus to selected date or today if available on open calendar
852
+
853
+
854
+ useEffect(function () {
855
+ var _calendarRef$current, _calendarRef$current2;
856
+
857
+ var gridCellPrefix = 'eds-datepicker__calendar__grid__cell';
858
+ var selectedCell = (_calendarRef$current = calendarRef.current) == null ? void 0 : _calendarRef$current.getElementsByClassName(gridCellPrefix + '--selected')[0];
859
+ var todayCell = (_calendarRef$current2 = calendarRef.current) == null ? void 0 : _calendarRef$current2.getElementsByClassName(gridCellPrefix + '--today')[0];
860
+ if (selectedCell) selectedCell.focus();else if (todayCell) todayCell.focus();
861
+ }, [state.isOpen]);
862
+ useOnClickOutside([calendarRef], function () {
863
+ state.setOpen(false);
864
+ });
865
+ useEffect(function () {
866
+ var _calendarRef$current3;
867
+
868
+ var keyDownHandler = function keyDownHandler(event) {
869
+ if (event.key === 'Escape') state.setOpen(false);
870
+ };
871
+
872
+ (_calendarRef$current3 = calendarRef.current) == null ? void 0 : _calendarRef$current3.addEventListener('keydown', keyDownHandler);
873
+ return function () {
874
+ var _calendarRef$current4;
875
+
876
+ return (_calendarRef$current4 = calendarRef.current) == null ? void 0 : _calendarRef$current4.removeEventListener('keydown', keyDownHandler);
877
+ }; // eslint-disable-next-line react-hooks/exhaustive-deps
878
+ }, []);
879
+ return React.createElement("div", {
880
+ className: classNames('eds-datepicker', className)
881
+ }, React.createElement("div", _extends({}, groupProps, {
882
+ ref: function ref(node) {
883
+ datePickerRef.current = node;
884
+ reference(node);
885
+ },
886
+ className: "eds-datepicker__datefield__wrapper"
887
+ }), React.createElement(DateField, _extends({}, fieldProps, {
888
+ selectedDate: state.value,
889
+ label: rest.label,
890
+ labelProps: labelProps,
891
+ ref: dateFieldRef,
892
+ className: classNames('eds-datepicker__datefield', {
893
+ 'eds-datepicker__datefield--disabled': fieldProps.isDisabled
894
+ }),
895
+ variant: variant,
896
+ feedback: feedback
897
+ })), !fieldProps.isDisabled && React.createElement(CalendarButton, _extends({}, buttonProps, {
898
+ onPress: function onPress() {
899
+ return state.setOpen(!state.isOpen);
900
+ },
901
+ className: "eds-datepicker__open-calendar-button"
902
+ }), React.createElement(CalendarIcon, null))), React.createElement(FocusLock, {
903
+ disabled: !state.isOpen,
904
+ returnFocus: true
905
+ }, React.createElement(Calendar, _extends({}, dialogProps, calendarProps, {
906
+ onChange: function onChange(dateValue) {
907
+ _onChange(dateValue);
908
+
909
+ state.setOpen(false);
910
+ },
911
+ disabled: calendarProps.isDisabled,
912
+ ref: function ref(node) {
913
+ calendarRef.current = node;
914
+ floating(node);
915
+ },
916
+ // styling for floating-UI popover
917
+ style: {
918
+ display: state.isOpen ? 'block' : 'none',
919
+ position: strategy,
920
+ top: y != null ? y : 0,
921
+ left: x != null ? x : 0,
922
+ zIndex: 10
923
+ }
924
+ }))));
925
+ };
926
+
478
927
  var _excluded$2 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
479
928
  _excluded2$1 = ["onChange", "variant", "value"];
480
929
  var NativeDatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
@@ -555,33 +1004,6 @@ var NativeDatePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
555
1004
  }, rest));
556
1005
  });
557
1006
 
558
- var TimeSegment = function TimeSegment(_ref) {
559
- var segment = _ref.segment,
560
- state = _ref.state;
561
- var ref = useRef(null);
562
-
563
- var _useDateSegment = useDateSegment(segment, state, ref),
564
- segmentProps = _useDateSegment.segmentProps;
565
-
566
- var is12HourFormatted = state.segments.some(function (segment) {
567
- return segment.text === 'AM' || segment.text === 'PM';
568
- });
569
-
570
- var segmentDisplayText = function segmentDisplayText() {
571
- if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
572
-
573
- if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
574
- return segment.text;
575
- };
576
-
577
- return React.createElement("div", _extends({}, segmentProps, {
578
- ref: ref,
579
- className: classNames('eds-timepicker__segment', {
580
- 'eds-timepicker__segment--placeholder': segment.isPlaceholder
581
- })
582
- }), segmentDisplayText());
583
- };
584
-
585
1007
  var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
586
1008
  var direction = _ref.direction,
587
1009
  onClick = _ref.onClick,
@@ -696,7 +1118,7 @@ var TimePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
696
1118
  variant: variant,
697
1119
  feedback: feedback
698
1120
  }), state.segments.map(function (segment, i) {
699
- return React.createElement(TimeSegment, {
1121
+ return React.createElement(FieldSegment, {
700
1122
  segment: segment,
701
1123
  state: state,
702
1124
  key: i
@@ -784,66 +1206,7 @@ var NativeTimePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
784
1206
  }, rest));
785
1207
  });
786
1208
 
787
- /**
788
- * Tar inn et JS Date-objekt og returnerer et av TimeValue-objektene fra @internationalized/date-pakken
789
- * @param {Date} date JS Date-objekt som ønskes konvertert til et TimeValue-objekt
790
- * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
791
- * @param {string} timeZone Tidssonen på IANA-formatet som tidpunktet skal konverteres til. Utelates denne får man et tidspunkt uten tidssone. Kan brukes med og uten en UTC-offset Vær obs på annen oppførsel med offset, les mer på beskrivelsen av offset
792
- * @param {number} offset UTC-offset i millisekunder, må brukes med en tidssone. Ved å legge på en offset lager du en variant av en tidssone. Det betyr at tidspunktet ikke endres (time, minutt, sekund uendret), men tidssonen, med tilhørende offset, tidspunktet er i endres.
793
- * @returns {Time | CalendarDateTime | ZonedDateTime} et av TimeValue-objektene med verdier fra date
794
- */
795
-
796
- var nativeDateToTimeValue = function nativeDateToTimeValue(date, noDateOnlyTime, timeZone, offset) {
797
- if (noDateOnlyTime === void 0) {
798
- noDateOnlyTime = false;
799
- }
800
-
801
- if (timeZone) {
802
- if (offset) {
803
- return new ZonedDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), timeZone, offset, date.getHours(), date.getMinutes(), date.getSeconds());
804
- }
805
-
806
- return parseAbsolute(date.toISOString(), timeZone);
807
- }
808
-
809
- if (noDateOnlyTime) return new Time(date.getHours(), date.getMinutes(), date.getSeconds(), 0);
810
- return new CalendarDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
811
- };
812
- /**
813
- * Tar inn et av TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
814
- * @param {TimeValue} time Et tidspunkt på TimeValue-formatet som ønsket konvertert til et JS Date-objekt
815
- * @param {string} timeZoneForCalendarDateTime Tidssonen time er i. Fungerer kun med typen er CalendarDateTime
816
- * @returns {Date} et Date-objekt med verdier fra time
817
- */
818
- // This function uses a lot of @ts-expect-error to make it work with all TimeValue types. Sorry ...
819
-
820
- var timeValueToNativeDate = function timeValueToNativeDate(time, timeZoneForCalendarDateTime) {
821
- // @ts-expect-error .day does not exist on Time-object
822
- if (!time.day) {
823
- // type is Time
824
- var date = new Date();
825
- date.setHours(time.hour);
826
- date.setMinutes(time.minute);
827
- date.setSeconds(time.second);
828
- return date;
829
- } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
830
-
831
-
832
- if (!time.timeZone) {
833
- // type is CalendarDateTime
834
- if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
835
- return time.toDate(timeZoneForCalendarDateTime);
836
- return new Date( // @ts-expect-error not in type Time
837
- time.year, // @ts-expect-error not in type Time
838
- time.month - 1, // @ts-expect-error not in type Time
839
- time.day, time.hour, time.minute, time.second);
840
- } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
841
-
842
-
843
- return time.toDate();
844
- };
845
-
846
1209
  warnAboutMissingStyles('datepicker', 'form', 'icons');
847
1210
 
848
- export { DatePicker, NativeDatePicker, NativeTimePicker, TimePicker, nativeDateToTimeValue, timeValueToNativeDate };
1211
+ export { Calendar, DateField, DatePicker, DatePickerBeta, NativeDatePicker, NativeTimePicker, TimePicker, ariaLabelIfNorwegian, createCalendar, nativeDateToTimeValue, timeValueToNativeDate };
849
1212
  //# sourceMappingURL=datepicker.esm.js.map