@entur/datepicker 3.0.6 → 4.0.0-RC.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,4 +1,4 @@
1
- import { mergeRefs, useRandomId, useOnMount, warnAboutMissingStyles } from '@entur/utils';
1
+ import { mergeRefs, useRandomId, ConditionalWrapper, useWindowDimensions, useOnClickOutside, useOnEscape, useOnMount, warnAboutMissingStyles } from '@entur/utils';
2
2
  import React, { useRef, useState } from 'react';
3
3
  import ReactDatepicker, { registerLocale } from 'react-datepicker';
4
4
  import { parse, isSameDay } from 'date-fns';
@@ -10,10 +10,18 @@ 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, CalendarDate, CalendarDateTime, getLocalTimeZone, GregorianCalendar, isEqualDay, now, 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 { VisuallyHidden } from '@entur/a11y';
21
+ import { useFloating, autoUpdate, offset, flip, shift } from '@floating-ui/react-dom';
22
+ import FocusLock from 'react-focus-lock';
23
+ import { space, zIndexes } from '@entur/tokens';
24
+ import { Modal } from '@entur/modal';
17
25
 
18
26
  function _extends() {
19
27
  _extends = Object.assign || function (target) {
@@ -89,7 +97,7 @@ function getMonthName(monthIndex, locale) {
89
97
  return formatter.format(new Date(year, monthIndex));
90
98
  }
91
99
 
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"];
100
+ var _excluded$a = ["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
101
  var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
94
102
  var style = _ref.style,
95
103
  label = _ref.label,
@@ -113,7 +121,7 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
113
121
  setShouldFocusOnCalendarButtonAfterSelect = _ref.setShouldFocusOnCalendarButtonAfterSelect,
114
122
  calendarGUIIsOpen = _ref.calendarGUIIsOpen,
115
123
  onClick = _ref.onClick,
116
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
124
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$a);
117
125
 
118
126
  React.useEffect(function () {
119
127
  var _inputRef$current, _inputRef$current2, _inputRef$current3;
@@ -191,7 +199,7 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
191
199
  }, rest));
192
200
  });
193
201
 
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"];
202
+ var _excluded$9 = ["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
203
  registerLocale('nb', nb);
196
204
  var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
197
205
  var style = _ref.style,
@@ -243,7 +251,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
243
251
  _ref$locale = _ref.locale,
244
252
  locale = _ref$locale === void 0 ? nb : _ref$locale,
245
253
  open = _ref.open,
246
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
254
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
247
255
 
248
256
  var datepickerId = useRandomId('eds-datepicker');
249
257
  var datepickerRef = useRef(null);
@@ -475,6 +483,541 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
475
483
  }, rest)));
476
484
  });
477
485
 
486
+ var FieldSegment = function FieldSegment(_ref) {
487
+ var segment = _ref.segment,
488
+ state = _ref.state;
489
+ var ref = useRef(null);
490
+
491
+ var _useDateSegment = useDateSegment(segment, state, ref),
492
+ segmentProps = _useDateSegment.segmentProps;
493
+
494
+ var is12HourFormatted = state.segments.some(function (segment) {
495
+ return segment.text === 'AM' || segment.text === 'PM';
496
+ });
497
+
498
+ var segmentDisplayText = function segmentDisplayText() {
499
+ if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
500
+
501
+ if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
502
+ return segment.text;
503
+ };
504
+
505
+ return React.createElement("div", _extends({}, segmentProps, {
506
+ ref: ref,
507
+ className: classNames('eds-date-and-time-field__segment', {
508
+ 'eds-date-and-time-field__segment--placeholder': segment.isPlaceholder,
509
+ 'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
510
+ }),
511
+ tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
512
+ }), segmentDisplayText());
513
+ };
514
+
515
+ /**
516
+ * Tar inn et JS Date-objekt og returnerer et av Date- eller TimeValue-objektene fra @internationalized/date-pakken
517
+ * @param {Date} date JS Date-objekt som ønskes konvertert til et Date- eller TimeValue-objekt
518
+ * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
519
+ * @param {boolean} noTimeOnlyDate Hvis tidspunktet er irrelevant kan denne settes til true, da får man et CalendarDate-objekt uten tidspunkt tilbake
520
+ * @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
521
+ * @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.
522
+ * @returns {Time | CalendarDateTime | ZonedDateTime | CalendarDate} et av Time- eller DateValue-objektene med verdier fra date
523
+ */
524
+
525
+ var nativeDateToTimeOrDateValue = function nativeDateToTimeOrDateValue(date, noDateOnlyTime, noTimeOnlyDate, timeZone, offset) {
526
+ if (noDateOnlyTime === void 0) {
527
+ noDateOnlyTime = false;
528
+ }
529
+
530
+ if (noTimeOnlyDate === void 0) {
531
+ noTimeOnlyDate = false;
532
+ }
533
+
534
+ if (timeZone) {
535
+ if (offset) {
536
+ return new ZonedDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), timeZone, offset, date.getHours(), date.getMinutes(), date.getSeconds());
537
+ }
538
+
539
+ return parseAbsolute(date.toISOString(), timeZone);
540
+ }
541
+
542
+ if (noDateOnlyTime) return new Time(date.getHours(), date.getMinutes(), date.getSeconds(), 0);
543
+ if (noTimeOnlyDate) return new CalendarDate(date.getFullYear(), date.getMonth() + 1, date.getDate());
544
+ return new CalendarDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
545
+ };
546
+ /**
547
+ * Tar inn et av Date- eller TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
548
+ * @param {DateValue | TimeValue} value En dato eller et tidspunkt på Date- eller TimeValue-formatet som ønskes konvertert til et JS Date-objekt
549
+ * @param {string} timeZoneForCalendarDateTime Tidssonen value er i. Fungerer kun med typen er CalendarDateTime
550
+ * @returns {Date} et Date-objekt med verdier fra time
551
+ */
552
+ // This function uses a lot of @ts-expect-error to make it work with all Date- and TimeValue types. Sorry ...
553
+
554
+ var timeOrDateValueToNativeDate = function timeOrDateValueToNativeDate(value, timeZoneForCalendarDateTime) {
555
+ // @ts-expect-error .day does not exist on Time-object
556
+ if (!value.day) {
557
+ // type is Time
558
+ var date = new Date(); // @ts-expect-error hour does not exist on CalendarDate
559
+
560
+ date.setHours(value.hour); // @ts-expect-error minute does not exist on CalendarDate
561
+
562
+ date.setMinutes(value.minute); // @ts-expect-error second does not exist on CalendarDate
563
+
564
+ date.setSeconds(value.second);
565
+ return date;
566
+ } // @ts-expect-error .day does not exist on Time-object
567
+
568
+
569
+ if (!value.hour) {
570
+ // type is CalendarDate
571
+ // @ts-expect-error .toDate(timeZone) does not exist in type Time
572
+ return value.toDate(timeZoneForCalendarDateTime != null ? timeZoneForCalendarDateTime : getLocalTimeZone());
573
+ } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
574
+
575
+
576
+ if (!value.timeZone) {
577
+ // type is CalendarDateTime
578
+ if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
579
+ return value.toDate(timeZoneForCalendarDateTime);
580
+ return new Date( // @ts-expect-error not in type Time
581
+ value.year, // @ts-expect-error not in type Time
582
+ value.month - 1, // @ts-expect-error not in type Time
583
+ value.day, // @ts-expect-error not in type CalendarDate
584
+ value.hour, // @ts-expect-error not in type CalendarDate
585
+ value.minute, // @ts-expect-error not in type CalendarDate
586
+ value.second);
587
+ } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
588
+
589
+
590
+ return value.toDate();
591
+ };
592
+ var createCalendar = function createCalendar(identifier) {
593
+ if (identifier === void 0) {
594
+ identifier = 'gregory';
595
+ }
596
+
597
+ switch (identifier) {
598
+ case 'gregory':
599
+ return new GregorianCalendar();
600
+
601
+ default:
602
+ throw new Error("Unsupported calendar " + identifier);
603
+ }
604
+ };
605
+ var ariaLabelIfNorwegian = function ariaLabelIfNorwegian(norwegianAriaLabel, locale, propsCollection) {
606
+ if (locale.toLowerCase() !== 'no-no') return propsCollection['aria-label'];
607
+ return norwegianAriaLabel;
608
+ };
609
+
610
+ var _excluded$8 = ["selectedDate", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "style", "className", "labelProps", "append"];
611
+ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
612
+ var value = _ref.selectedDate,
613
+ label = _ref.label,
614
+ customLocale = _ref.locale,
615
+ showTimeZone = _ref.showTimeZone,
616
+ showTime = _ref.showTime,
617
+ _ref$granularity = _ref.granularity,
618
+ granularity = _ref$granularity === void 0 ? 'day' : _ref$granularity,
619
+ disabled = _ref.disabled,
620
+ variant = _ref.variant,
621
+ feedback = _ref.feedback,
622
+ _ref$validationVarian = _ref.validationVariant,
623
+ validationVariant = _ref$validationVarian === void 0 ? 'error' : _ref$validationVarian,
624
+ _ref$validationFeedba = _ref.validationFeedback,
625
+ validationFeedback = _ref$validationFeedba === void 0 ? 'Ugyldig dato' : _ref$validationFeedba,
626
+ labelTooltip = _ref.labelTooltip,
627
+ style = _ref.style,
628
+ className = _ref.className,
629
+ parentLabelProps = _ref.labelProps,
630
+ append = _ref.append,
631
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
632
+
633
+ var _useLocale = useLocale(),
634
+ locale = _useLocale.locale;
635
+
636
+ var state = useDateFieldState(_extends({}, rest, {
637
+ locale: customLocale != null ? customLocale : locale,
638
+ createCalendar: createCalendar,
639
+ value: value === null ? undefined : value,
640
+ hideTimeZone: !showTimeZone,
641
+ granularity: showTime ? 'minute' : granularity
642
+ }));
643
+ var dateFieldRef = useRef(null);
644
+
645
+ var _useDateField = useDateField(_extends({}, rest, {
646
+ label: label,
647
+ isDisabled: disabled || rest.isDisabled
648
+ }), state, dateFieldRef),
649
+ labelProps = _useDateField.labelProps,
650
+ fieldProps = _useDateField.fieldProps;
651
+
652
+ var id = useRandomId('datefield');
653
+ return React.createElement(ConditionalWrapper, {
654
+ condition: customLocale !== undefined,
655
+ wrapper: function wrapper(child) {
656
+ return React.createElement(I18nProvider, {
657
+ locale: customLocale
658
+ }, child);
659
+ }
660
+ }, React.createElement(BaseFormControl, _extends({
661
+ style: style,
662
+ className: classNames('eds-datefield', className),
663
+ labelId: id,
664
+ ref: mergeRefs(dateFieldRef, ref),
665
+ disabled: state.isDisabled,
666
+ disableLabelAnimation: true,
667
+ label: label,
668
+ labelTooltip: labelTooltip,
669
+ labelProps: parentLabelProps != null ? parentLabelProps : labelProps
670
+ }, fieldProps, {
671
+ variant: (variant != null ? variant : state.validationState === 'invalid') ? validationVariant : undefined,
672
+ feedback: (feedback != null ? feedback : state.validationState === 'invalid') ? validationFeedback : undefined,
673
+ append: append,
674
+ ariaAlertOnFeedback: true
675
+ }), state.segments.map(function (segment, i) {
676
+ return React.createElement(FieldSegment, {
677
+ segment: segment,
678
+ state: state,
679
+ key: i
680
+ });
681
+ })));
682
+ });
683
+
684
+ var _excluded$7 = ["children", "className", "style"];
685
+ var CalendarButton = function CalendarButton(_ref) {
686
+ var children = _ref.children,
687
+ className = _ref.className,
688
+ style = _ref.style,
689
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$7);
690
+
691
+ var ref = useRef(null);
692
+
693
+ var _useButton = useButton(props, ref),
694
+ buttonProps = _useButton.buttonProps;
695
+
696
+ return React.createElement(IconButton, _extends({}, buttonProps, {
697
+ ref: ref,
698
+ className: className,
699
+ style: style
700
+ }), children);
701
+ };
702
+
703
+ var _excluded$6 = ["state", "date", "onSelectedCellClick"];
704
+ var CalendarCell = function CalendarCell(_ref) {
705
+ var _state$timeZone;
706
+
707
+ var state = _ref.state,
708
+ date = _ref.date,
709
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
710
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
711
+ return;
712
+ } : _ref$onSelectedCellCl,
713
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
714
+
715
+ var cellRef = useRef(null);
716
+
717
+ var _useCalendarCell = useCalendarCell({
718
+ date: date
719
+ }, state, cellRef),
720
+ cellProps = _useCalendarCell.cellProps,
721
+ buttonProps = _useCalendarCell.buttonProps,
722
+ isSelected = _useCalendarCell.isSelected,
723
+ isOutsideVisibleRange = _useCalendarCell.isOutsideVisibleRange,
724
+ isDisabled = _useCalendarCell.isDisabled,
725
+ isUnavailable = _useCalendarCell.isUnavailable,
726
+ formattedDate = _useCalendarCell.formattedDate;
727
+
728
+ return React.createElement("td", _extends({}, cellProps, {
729
+ className: "eds-datepicker__calendar__grid__cell__td"
730
+ }), React.createElement("div", _extends({}, buttonProps, {
731
+ ref: cellRef,
732
+ hidden: isOutsideVisibleRange,
733
+ className: classNames('eds-datepicker__calendar__grid__cell', {
734
+ 'eds-datepicker__calendar__grid__cell--selected': isSelected,
735
+ 'eds-datepicker__calendar__grid__cell--disabled': isDisabled || isUnavailable,
736
+ 'eds-datepicker__calendar__grid__cell--outside-month': isOutsideVisibleRange,
737
+ 'eds-datepicker__calendar__grid__cell--today': isEqualDay(date, now((_state$timeZone = state.timeZone) != null ? _state$timeZone : getLocalTimeZone()))
738
+ })
739
+ }, rest, {
740
+ onClick: function onClick(e) {
741
+ buttonProps.onClick && buttonProps.onClick(e);
742
+ isSelected && onSelectedCellClick();
743
+ }
744
+ }), formattedDate));
745
+ };
746
+
747
+ var _excluded$5 = ["state", "navigationDescription", "onSelectedCellClick"];
748
+ var CalendarGrid = function CalendarGrid(_ref) {
749
+ var state = _ref.state,
750
+ navigationDescription = _ref.navigationDescription,
751
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
752
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
753
+ return;
754
+ } : _ref$onSelectedCellCl,
755
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
756
+
757
+ var calendarGridId = useRandomId('eds-calendar');
758
+
759
+ var _useLocale = useLocale(),
760
+ locale = _useLocale.locale;
761
+
762
+ var _useCalendarGrid = useCalendarGrid(rest, state),
763
+ gridProps = _useCalendarGrid.gridProps,
764
+ headerProps = _useCalendarGrid.headerProps,
765
+ weekDays = _useCalendarGrid.weekDays;
766
+
767
+ var weeksInMonth = getWeeksInMonth(state.visibleRange.start, locale);
768
+ var weeksArray = Array.from(Array(weeksInMonth).keys());
769
+
770
+ var weekDaysMapped = function weekDaysMapped() {
771
+ if (locale.toLowerCase() === 'no-no' || locale.toLowerCase() === 'no') return ['ma', 'ti', 'on', 'to', 'fr', 'lø', 'sø'];
772
+ if (weekDays.toString() === 'M,T,W,T,F,S,S') return ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
773
+ return weekDays.map(function (day) {
774
+ return day.toLowerCase();
775
+ });
776
+ };
777
+
778
+ var getNavigationDescription = function getNavigationDescription() {
779
+ if (navigationDescription) return navigationDescription;
780
+ if (locale.toLowerCase().includes('en')) return 'Use the arrow keys to navigate between dates';
781
+ return 'Bruk piltastene til å navigere mellom datoer';
782
+ };
783
+
784
+ return React.createElement(React.Fragment, null, React.createElement("table", _extends({}, gridProps, {
785
+ cellSpacing: "0",
786
+ className: "eds-datepicker__calendar__grid"
787
+ }), React.createElement("thead", _extends({}, headerProps), React.createElement("tr", null, weekDaysMapped().map(function (day, index) {
788
+ return React.createElement("th", {
789
+ key: index
790
+ }, day);
791
+ }))), React.createElement("tbody", null, weeksArray.map(function (weekIndex) {
792
+ return React.createElement("tr", {
793
+ key: weekIndex
794
+ }, state.getDatesInWeek(weekIndex).map(function (date, i) {
795
+ return date ? React.createElement(CalendarCell, {
796
+ key: i,
797
+ state: state,
798
+ date: date,
799
+ "aria-describedby": calendarGridId + 'description',
800
+ onSelectedCellClick: onSelectedCellClick
801
+ }) : React.createElement("td", {
802
+ key: i
803
+ });
804
+ }));
805
+ }))), React.createElement(VisuallyHidden, {
806
+ id: calendarGridId + 'description'
807
+ }, getNavigationDescription()));
808
+ };
809
+
810
+ var _excluded$4 = ["selectedDate", "onChange", "locale", "style", "children", "navigationDescription", "onSelectedCellClick"];
811
+ var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
812
+ var onChange = _ref.onChange,
813
+ customLocale = _ref.locale,
814
+ style = _ref.style,
815
+ navigationDescription = _ref.navigationDescription,
816
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
817
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
818
+ return;
819
+ } : _ref$onSelectedCellCl,
820
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
821
+
822
+ var _useLocale = useLocale(),
823
+ locale = _useLocale.locale;
824
+
825
+ var state = useCalendarState(_extends({}, rest, {
826
+ onChange: onChange,
827
+ locale: customLocale != null ? customLocale : locale,
828
+ createCalendar: createCalendar
829
+ }));
830
+
831
+ var _useCalendar = useCalendar(rest, state),
832
+ calendarProps = _useCalendar.calendarProps,
833
+ prevButtonProps = _useCalendar.prevButtonProps,
834
+ nextButtonProps = _useCalendar.nextButtonProps,
835
+ title = _useCalendar.title;
836
+
837
+ return React.createElement(ConditionalWrapper, {
838
+ condition: customLocale,
839
+ wrapper: function wrapper(child) {
840
+ return React.createElement(I18nProvider, {
841
+ locale: customLocale
842
+ }, child);
843
+ }
844
+ }, React.createElement("div", _extends({}, calendarProps, {
845
+ ref: ref,
846
+ className: "eds-datepicker__calendar",
847
+ style: style
848
+ }), React.createElement("div", {
849
+ className: "eds-datepicker__calendar__header"
850
+ }, React.createElement(CalendarButton, _extends({}, prevButtonProps, {
851
+ "aria-label": ariaLabelIfNorwegian('Forrige måned', locale, prevButtonProps)
852
+ }), React.createElement(LeftArrowIcon, {
853
+ size: 20
854
+ })), React.createElement("h2", null, title), React.createElement(CalendarButton, _extends({}, nextButtonProps, {
855
+ "aria-label": ariaLabelIfNorwegian('Neste måned', locale, nextButtonProps)
856
+ }), React.createElement(RightArrowIcon, {
857
+ size: 20
858
+ }))), React.createElement(CalendarGrid, {
859
+ state: state,
860
+ navigationDescription: navigationDescription,
861
+ onSelectedCellClick: onSelectedCellClick
862
+ })));
863
+ });
864
+
865
+ var _excluded$3 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold"];
866
+ var DatePickerBeta = function DatePickerBeta(_ref) {
867
+ var value = _ref.selectedDate,
868
+ onChange = _ref.onChange,
869
+ locale = _ref.locale,
870
+ isDisabled = _ref.disabled,
871
+ showTime = _ref.showTime,
872
+ _ref$showTimeZone = _ref.showTimeZone,
873
+ showTimeZone = _ref$showTimeZone === void 0 ? false : _ref$showTimeZone,
874
+ className = _ref.className,
875
+ variant = _ref.variant,
876
+ feedback = _ref.feedback,
877
+ validationVariant = _ref.validationVariant,
878
+ validationFeedback = _ref.validationFeedback,
879
+ _ref$disableModal = _ref.disableModal,
880
+ disableModal = _ref$disableModal === void 0 ? false : _ref$disableModal,
881
+ labelTooltip = _ref.labelTooltip,
882
+ navigationDescription = _ref.navigationDescription,
883
+ minValue = _ref.minDate,
884
+ maxValue = _ref.maxDate,
885
+ _ref$modalTreshold = _ref.modalTreshold,
886
+ modalTreshold = _ref$modalTreshold === void 0 ? 1000 : _ref$modalTreshold,
887
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
888
+
889
+ var CALENDAR_MODAL_MAX_SCREEN_WIDTH = modalTreshold;
890
+ var datePickerRef = useRef(null);
891
+ var calendarRef = useRef(null);
892
+ var dateFieldRef = useRef(null);
893
+
894
+ var _useWindowDimensions = useWindowDimensions(),
895
+ width = _useWindowDimensions.width;
896
+
897
+ var state = useDatePickerState(_extends({}, rest, {
898
+ minValue: minValue,
899
+ maxValue: maxValue,
900
+ value: value,
901
+ onChange: onChange
902
+ }));
903
+
904
+ var _useDatePicker = useDatePicker(_extends({
905
+ isDisabled: isDisabled,
906
+ minValue: minValue,
907
+ maxValue: maxValue,
908
+ autoFocus: true
909
+ }, rest), state, datePickerRef),
910
+ groupProps = _useDatePicker.groupProps,
911
+ labelProps = _useDatePicker.labelProps,
912
+ fieldProps = _useDatePicker.fieldProps,
913
+ buttonProps = _useDatePicker.buttonProps,
914
+ dialogProps = _useDatePicker.dialogProps,
915
+ calendarProps = _useDatePicker.calendarProps; // calculations for floating-UI popover position
916
+
917
+
918
+ var _useFloating = useFloating({
919
+ whileElementsMounted: autoUpdate,
920
+ placement: 'bottom-start',
921
+ middleware: [offset(space.extraSmall), flip(), shift({
922
+ padding: space.extraSmall
923
+ })]
924
+ }),
925
+ x = _useFloating.x,
926
+ y = _useFloating.y,
927
+ reference = _useFloating.reference,
928
+ floating = _useFloating.floating,
929
+ strategy = _useFloating.strategy;
930
+
931
+ var onChangeCalendar = function onChangeCalendar(newSelectedDate) {
932
+ // Necessary to avoid state update on unmounted component
933
+ requestAnimationFrame(function () {
934
+ calendarProps.onChange && calendarProps.onChange(newSelectedDate);
935
+ });
936
+ };
937
+
938
+ useOnClickOutside([calendarRef], function () {
939
+ state.setOpen(false);
940
+ });
941
+ useOnEscape(calendarRef, function () {
942
+ state.setOpen(false);
943
+ });
944
+
945
+ var calendarSharedProps = _extends({}, dialogProps, calendarProps, {
946
+ disabled: calendarProps.isDisabled,
947
+ navigationDescription: navigationDescription,
948
+ onSelectedCellClick: function onSelectedCellClick() {
949
+ return state.setOpen(false);
950
+ },
951
+ onChange: onChangeCalendar
952
+ });
953
+
954
+ var useModal = width <= CALENDAR_MODAL_MAX_SCREEN_WIDTH && !disableModal;
955
+ var popoverCalendar = React.createElement("div", {
956
+ // styling for floating-UI popover
957
+ style: {
958
+ position: strategy,
959
+ top: y != null ? y : 0,
960
+ left: x != null ? x : 0,
961
+ zIndex: zIndexes.popover
962
+ },
963
+ ref: function ref(node) {
964
+ floating(node);
965
+ }
966
+ }, React.createElement(FocusLock, {
967
+ disabled: !state.isOpen || useModal,
968
+ returnFocus: true
969
+ }, state.isOpen && React.createElement(Calendar, _extends({}, calendarSharedProps, {
970
+ ref: calendarRef
971
+ }))));
972
+ var modalCalendar = React.createElement(Modal, {
973
+ size: "small",
974
+ title: "",
975
+ open: state.isOpen,
976
+ onDismiss: function onDismiss() {
977
+ return state.setOpen(false);
978
+ },
979
+ closeOnClickOutside: true,
980
+ className: "eds-datepicker__calendar-modal"
981
+ }, React.createElement(Calendar, _extends({}, calendarSharedProps)));
982
+ return React.createElement(ConditionalWrapper, {
983
+ condition: locale !== undefined,
984
+ wrapper: function wrapper(child) {
985
+ return React.createElement(I18nProvider, {
986
+ locale: locale
987
+ }, child);
988
+ }
989
+ }, React.createElement("div", {
990
+ className: classNames('eds-datepicker', className)
991
+ }, React.createElement("div", _extends({}, groupProps, {
992
+ ref: function ref(node) {
993
+ datePickerRef.current = node;
994
+ reference(node);
995
+ },
996
+ id: undefined,
997
+ className: "eds-datepicker__datefield__wrapper"
998
+ }), React.createElement(DateField, _extends({}, fieldProps, {
999
+ selectedDate: state.value,
1000
+ label: rest.label,
1001
+ labelProps: labelProps,
1002
+ showTime: showTime,
1003
+ showTimeZone: showTimeZone,
1004
+ ref: dateFieldRef,
1005
+ variant: variant,
1006
+ feedback: feedback,
1007
+ validationVariant: validationVariant,
1008
+ validationFeedback: validationFeedback,
1009
+ labelTooltip: labelTooltip,
1010
+ className: classNames('eds-datepicker__datefield', {
1011
+ 'eds-datepicker__datefield--disabled': fieldProps.isDisabled
1012
+ })
1013
+ })), !fieldProps.isDisabled && React.createElement(CalendarButton, _extends({}, buttonProps, {
1014
+ onPress: function onPress() {
1015
+ return state.setOpen(!state.isOpen);
1016
+ },
1017
+ className: "eds-datepicker__open-calendar-button"
1018
+ }), React.createElement(CalendarIcon, null)), useModal ? modalCalendar : popoverCalendar)));
1019
+ };
1020
+
478
1021
  var _excluded$2 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
479
1022
  _excluded2$1 = ["onChange", "variant", "value"];
480
1023
  var NativeDatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
@@ -555,33 +1098,6 @@ var NativeDatePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
555
1098
  }, rest));
556
1099
  });
557
1100
 
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
1101
  var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
586
1102
  var direction = _ref.direction,
587
1103
  onClick = _ref.onClick,
@@ -696,7 +1212,7 @@ var TimePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
696
1212
  variant: variant,
697
1213
  feedback: feedback
698
1214
  }), state.segments.map(function (segment, i) {
699
- return React.createElement(TimeSegment, {
1215
+ return React.createElement(FieldSegment, {
700
1216
  segment: segment,
701
1217
  state: state,
702
1218
  key: i
@@ -784,66 +1300,7 @@ var NativeTimePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
784
1300
  }, rest));
785
1301
  });
786
1302
 
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
1303
  warnAboutMissingStyles('datepicker', 'form', 'icons');
847
1304
 
848
- export { DatePicker, NativeDatePicker, NativeTimePicker, TimePicker, nativeDateToTimeValue, timeValueToNativeDate };
1305
+ export { Calendar, DateField, DatePicker, DatePickerBeta, NativeDatePicker, NativeTimePicker, TimePicker, ariaLabelIfNorwegian, createCalendar, nativeDateToTimeOrDateValue, timeOrDateValueToNativeDate };
849
1306
  //# sourceMappingURL=datepicker.esm.js.map