@entur/datepicker 3.0.7 → 4.0.0-RC.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,26 +4,28 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var utils = require('@entur/utils');
6
6
  var React = require('react');
7
- var ReactDatepicker = require('react-datepicker');
8
- var dateFns = require('date-fns');
9
- var locale = require('date-fns/locale');
10
- var classNames = require('classnames');
11
- var icons = require('@entur/icons');
12
- var typography = require('@entur/typography');
13
- var button = require('@entur/button');
14
- var form = require('@entur/form');
15
- var tooltip = require('@entur/tooltip');
16
- require('react-datepicker/dist/react-datepicker.css');
7
+ var datepicker$1 = require('@react-stately/datepicker');
17
8
  var datepicker = require('@react-aria/datepicker');
18
9
  var i18n = require('@react-aria/i18n');
19
- var datepicker$1 = require('@react-stately/datepicker');
10
+ var classNames = require('classnames');
11
+ var form = require('@entur/form');
20
12
  var date = require('@internationalized/date');
13
+ var calendar = require('@react-aria/calendar');
14
+ var calendar$1 = require('@react-stately/calendar');
15
+ var icons = require('@entur/icons');
16
+ var button = require('@react-aria/button');
17
+ var button$1 = require('@entur/button');
18
+ var a11y = require('@entur/a11y');
19
+ var reactDom = require('@floating-ui/react-dom');
20
+ var FocusLock = require('react-focus-lock');
21
+ var tokens = require('@entur/tokens');
22
+ var modal = require('@entur/modal');
21
23
 
22
24
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
23
25
 
24
26
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
25
- var ReactDatepicker__default = /*#__PURE__*/_interopDefaultLegacy(ReactDatepicker);
26
27
  var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
28
+ var FocusLock__default = /*#__PURE__*/_interopDefaultLegacy(FocusLock);
27
29
 
28
30
  function _extends() {
29
31
  _extends = Object.assign || function (target) {
@@ -58,432 +60,540 @@ function _objectWithoutPropertiesLoose(source, excluded) {
58
60
  return target;
59
61
  }
60
62
 
61
- var DatePickerHeader = function DatePickerHeader(_ref) {
62
- var _date$getMonth;
63
-
64
- var date = _ref.date,
65
- decreaseMonth = _ref.decreaseMonth,
66
- increaseMonth = _ref.increaseMonth,
67
- prevMonthButtonDisabled = _ref.prevMonthButtonDisabled,
68
- nextMonthButtonDisabled = _ref.nextMonthButtonDisabled,
69
- nextMonthAriaLabel = _ref.nextMonthAriaLabel,
70
- previousMonthAriaLabel = _ref.previousMonthAriaLabel,
71
- locale = _ref.locale;
72
- var currentMonthIndex = (_date$getMonth = date == null ? void 0 : date.getMonth()) != null ? _date$getMonth : 0;
73
- return React__default["default"].createElement("div", {
74
- className: "eds-datepicker__calender__header"
75
- }, React__default["default"].createElement(button.IconButton, {
76
- type: "button",
77
- className: "eds-datepicker__calender__header__month-button--left",
78
- onClick: decreaseMonth,
79
- disabled: prevMonthButtonDisabled,
80
- "aria-label": previousMonthAriaLabel + " (" + getMonthName(currentMonthIndex - 1, locale) + ")"
81
- }, React__default["default"].createElement(icons.LeftArrowIcon, null)), React__default["default"].createElement(typography.Heading3, {
82
- className: "eds-datepicker__calender__header__month-text"
83
- }, getMonthName(currentMonthIndex, locale)), React__default["default"].createElement(typography.Heading3, {
84
- className: "eds-datepicker__calender__header__month-text"
85
- }, date == null ? void 0 : date.getFullYear()), React__default["default"].createElement(button.IconButton, {
86
- type: "button",
87
- className: "eds-datepicker__calender__header__month-button--right",
88
- onClick: increaseMonth,
89
- disabled: nextMonthButtonDisabled,
90
- "aria-label": nextMonthAriaLabel + " (" + getMonthName(currentMonthIndex + 1, locale) + ")"
91
- }, React__default["default"].createElement(icons.RightArrowIcon, null)));
92
- };
63
+ var FieldSegment = function FieldSegment(_ref) {
64
+ var segment = _ref.segment,
65
+ state = _ref.state;
66
+ var ref = React.useRef(null);
67
+
68
+ var _useDateSegment = datepicker.useDateSegment(segment, state, ref),
69
+ segmentProps = _useDateSegment.segmentProps;
93
70
 
94
- function getMonthName(monthIndex, locale) {
95
- var year = new Date().getFullYear();
96
- var formatter = new Intl.DateTimeFormat(locale.code, {
97
- month: 'long'
71
+ var is12HourFormatted = state.segments.some(function (segment) {
72
+ return segment.text === 'AM' || segment.text === 'PM';
98
73
  });
99
- return formatter.format(new Date(year, monthIndex));
100
- }
101
74
 
102
- 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"];
103
- var DatePickerInput = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
104
- var style = _ref.style,
105
- label = _ref.label,
106
- inputPlaceholder = _ref.inputPlaceholder,
107
- prepend = _ref.prepend,
108
- feedback = _ref.feedback,
109
- variant = _ref.variant,
110
- disabled = _ref.disabled,
111
- calendarButtonTooltipOpen = _ref.calendarButtonTooltipOpen,
112
- calendarButtonTooltipClose = _ref.calendarButtonTooltipClose,
113
- hideCalendarButton = _ref.hideCalendarButton,
114
- disableLabelAnimation = _ref.disableLabelAnimation,
115
- inputRef = _ref.inputRef,
116
- calendarButtonId = _ref.calendarButtonId,
117
- forwardRef = _ref.forwardRef,
118
- toggleCalendarGUI = _ref.toggleCalendarGUI,
119
- onKeyDownInput = _ref.onKeyDownInput,
120
- onBlurInput = _ref.onBlurInput,
121
- selectedDate = _ref.selectedDate,
122
- setFocusToCalendarGUI = _ref.setFocusToCalendarGUI,
123
- setShouldFocusOnCalendarButtonAfterSelect = _ref.setShouldFocusOnCalendarButtonAfterSelect,
124
- calendarGUIIsOpen = _ref.calendarGUIIsOpen,
125
- onClick = _ref.onClick,
126
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
75
+ var segmentDisplayText = function segmentDisplayText() {
76
+ if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
127
77
 
128
- React__default["default"].useEffect(function () {
129
- var _inputRef$current, _inputRef$current2, _inputRef$current3;
130
-
131
- (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.addEventListener('keydown', handleOnKeyDown);
132
- (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.addEventListener('blur', handleOnBlur);
133
- (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.addEventListener('focus', handleOnFocus);
134
- return function () {
135
- var _inputRef$current4, _inputRef$current5, _inputRef$current6;
136
-
137
- (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.removeEventListener('keydown', handleOnKeyDown);
138
- (_inputRef$current5 = inputRef.current) == null ? void 0 : _inputRef$current5.removeEventListener('blur', handleOnBlur);
139
- (_inputRef$current6 = inputRef.current) == null ? void 0 : _inputRef$current6.removeEventListener('focus', handleOnFocus);
140
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
141
- }, [inputRef, selectedDate]);
142
-
143
- function handleOnKeyDown(event) {
144
- onKeyDownInput(event);
78
+ if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
79
+ return segment.text;
80
+ };
81
+
82
+ return React__default["default"].createElement("div", _extends({}, segmentProps, {
83
+ ref: ref,
84
+ className: classNames__default["default"]('eds-date-and-time-field__segment', {
85
+ 'eds-date-and-time-field__segment--placeholder': segment.isPlaceholder,
86
+ 'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
87
+ }),
88
+ tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
89
+ }), segmentDisplayText());
90
+ };
91
+
92
+ /**
93
+ * Tar inn et JS Date-objekt og returnerer et av Date- eller TimeValue-objektene fra @internationalized/date-pakken
94
+ * @param {Date} date JS Date-objekt som ønskes konvertert til et Date- eller TimeValue-objekt
95
+ * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
96
+ * @param {boolean} noTimeOnlyDate Hvis tidspunktet er irrelevant kan denne settes til true, da får man et CalendarDate-objekt uten tidspunkt tilbake
97
+ * @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
98
+ * @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.
99
+ * @returns {Time | CalendarDateTime | ZonedDateTime | CalendarDate} et av Time- eller DateValue-objektene med verdier fra date
100
+ */
101
+
102
+ var nativeDateToTimeOrDateValue = function nativeDateToTimeOrDateValue(date$1, noDateOnlyTime, noTimeOnlyDate, timeZone, offset) {
103
+ if (noDateOnlyTime === void 0) {
104
+ noDateOnlyTime = false;
145
105
  }
146
106
 
147
- function handleOnBlur(event) {
148
- onBlurInput(event);
107
+ if (noTimeOnlyDate === void 0) {
108
+ noTimeOnlyDate = false;
149
109
  }
150
110
 
151
- var handleOnFocus = function handleOnFocus() {
152
- return requestAnimationFrame(function () {
153
- var _inputRef$current7;
111
+ if (timeZone) {
112
+ if (offset) {
113
+ return new date.ZonedDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), timeZone, offset, date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
114
+ }
154
115
 
155
- return (_inputRef$current7 = inputRef.current) == null ? void 0 : _inputRef$current7.select();
156
- });
157
- };
116
+ return date.parseAbsolute(date$1.toISOString(), timeZone);
117
+ }
158
118
 
159
- var handleOnClickInputField = function handleOnClickInputField(event) {
160
- setShouldFocusOnCalendarButtonAfterSelect(false);
161
- onClick && onClick(event);
162
- };
119
+ if (noDateOnlyTime) return new date.Time(date$1.getHours(), date$1.getMinutes(), date$1.getSeconds(), 0);
120
+ if (noTimeOnlyDate) return new date.CalendarDate(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate());
121
+ return new date.CalendarDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
122
+ };
123
+ /**
124
+ * Tar inn et av Date- eller TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
125
+ * @param {DateValue | TimeValue} value En dato eller et tidspunkt på Date- eller TimeValue-formatet som ønskes konvertert til et JS Date-objekt
126
+ * @param {string} timeZoneForCalendarDateTime Tidssonen value er i. Fungerer kun med typen er CalendarDateTime
127
+ * @returns {Date} et Date-objekt med verdier fra time
128
+ */
129
+ // This function uses a lot of @ts-expect-error to make it work with all Date- and TimeValue types. Sorry ...
163
130
 
164
- var handleOnClickCalendarButton = function handleOnClickCalendarButton() {
165
- toggleCalendarGUI();
166
- setFocusToCalendarGUI();
167
- setShouldFocusOnCalendarButtonAfterSelect(true);
168
- };
131
+ var timeOrDateValueToNativeDate = function timeOrDateValueToNativeDate(value, timeZoneForCalendarDateTime) {
132
+ // @ts-expect-error .day does not exist on Time-object
133
+ if (!value.day) {
134
+ // type is Time
135
+ var date$1 = new Date(); // @ts-expect-error hour does not exist on CalendarDate
169
136
 
170
- var calendarButtonAriaLabel = function calendarButtonAriaLabel() {
171
- var _inputRef$current8;
137
+ date$1.setHours(value.hour); // @ts-expect-error minute does not exist on CalendarDate
172
138
 
173
- var buttonStateText = calendarGUIIsOpen() ? calendarButtonTooltipClose : calendarButtonTooltipOpen;
174
- var currentSelectionText = selectedDate ? ((_inputRef$current8 = inputRef.current) == null ? void 0 : _inputRef$current8.value) + " valgt" : 'Ingen dato valgt';
175
- return buttonStateText + ", " + currentSelectionText;
176
- };
139
+ date$1.setMinutes(value.minute); // @ts-expect-error second does not exist on CalendarDate
177
140
 
178
- return React__default["default"].createElement(form.TextField, _extends({
179
- style: style,
180
- label: label,
181
- placeholder: inputPlaceholder,
182
- prepend: prepend,
183
- feedback: feedback,
184
- variant: variant,
185
- disableLabelAnimation: disableLabelAnimation,
186
- ref: utils.mergeRefs(ref, inputRef, forwardRef),
187
- onClick: handleOnClickInputField,
188
- ariaAlertOnFeedback: true,
189
- append: !hideCalendarButton && React__default["default"].createElement(tooltip.Tooltip, {
190
- placement: "top",
191
- content: calendarGUIIsOpen() ? calendarButtonTooltipClose : calendarButtonTooltipOpen,
192
- disableHoverListener: disabled,
193
- disableFocusListener: disabled
194
- }, React__default["default"].createElement(button.IconButton, {
195
- id: calendarButtonId,
196
- type: "button",
197
- onClick: handleOnClickCalendarButton,
198
- tabIndex: calendarGUIIsOpen() ? -1 : 0,
199
- "aria-label": calendarButtonAriaLabel()
200
- }, React__default["default"].createElement(icons.CalendarIcon, null)))
201
- }, rest));
202
- });
141
+ date$1.setSeconds(value.second);
142
+ return date$1;
143
+ } // @ts-expect-error .day does not exist on Time-object
203
144
 
204
- 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"];
205
- ReactDatepicker.registerLocale('nb', locale.nb);
206
- var DatePicker = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
207
- var style = _ref.style,
208
- className = _ref.className,
209
- selectedDate = _ref.selectedDate,
210
- label = _ref.label,
211
- _ref$placeholder = _ref.placeholder,
212
- placeholder = _ref$placeholder === void 0 ? 'dd.mm.yyyy' : _ref$placeholder,
213
- onChange = _ref.onChange,
214
- _ref$onKeyDown = _ref.onKeyDown,
215
- onKeyDown = _ref$onKeyDown === void 0 ? function () {
216
- return null;
217
- } : _ref$onKeyDown,
218
- _ref$dateFormats = _ref.dateFormats,
219
- dateFormats = _ref$dateFormats === void 0 ? ['dd.MM.yyyy', 'ddMMyyyy', 'dd/MM/yyyy', 'ddMMyy'] : _ref$dateFormats,
220
- minDate = _ref.minDate,
221
- maxDate = _ref.maxDate,
222
- _ref$inline = _ref.inline,
223
- inline = _ref$inline === void 0 ? false : _ref$inline,
224
- disabled = _ref.disabled,
225
- prepend = _ref.prepend,
226
- _ref$feedback = _ref.feedback,
227
- feedback = _ref$feedback === void 0 ? '' : _ref$feedback,
228
- variant = _ref.variant,
229
- _ref$validationFeedba = _ref.validationFeedback,
230
- validationFeedback = _ref$validationFeedba === void 0 ? 'Ugyldig dato' : _ref$validationFeedba,
231
- _ref$validationVarian = _ref.validationVariant,
232
- validationVariant = _ref$validationVarian === void 0 ? 'error' : _ref$validationVarian,
233
- _ref$disableLabelAnim = _ref.disableLabelAnimation,
234
- disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
235
- _ref$calendarButtonTo = _ref.calendarButtonTooltipOpen,
236
- calendarButtonTooltipOpen = _ref$calendarButtonTo === void 0 ? 'Åpne\xa0kalender' : _ref$calendarButtonTo,
237
- _ref$calendarButtonTo2 = _ref.calendarButtonTooltipClose,
238
- calendarButtonTooltipClose = _ref$calendarButtonTo2 === void 0 ? 'Lukk\xa0kalender' : _ref$calendarButtonTo2,
239
- _ref$hideCalendarButt = _ref.hideCalendarButton,
240
- hideCalendarButton = _ref$hideCalendarButt === void 0 ? false : _ref$hideCalendarButt,
241
- _ref$hideCalendar = _ref.hideCalendar,
242
- hideCalendar = _ref$hideCalendar === void 0 ? false : _ref$hideCalendar,
243
- _ref$hideValidation = _ref.hideValidation,
244
- hideValidation = _ref$hideValidation === void 0 ? false : _ref$hideValidation,
245
- _ref$weekLabel = _ref.weekLabel,
246
- weekLabel = _ref$weekLabel === void 0 ? 'uke' : _ref$weekLabel,
247
- _ref$chooseDayAriaLab = _ref.chooseDayAriaLabelPrefix,
248
- chooseDayAriaLabelPrefix = _ref$chooseDayAriaLab === void 0 ? 'Velg' : _ref$chooseDayAriaLab,
249
- _ref$previousMonthAri = _ref.previousMonthAriaLabel,
250
- previousMonthAriaLabel = _ref$previousMonthAri === void 0 ? 'Forrige måned' : _ref$previousMonthAri,
251
- _ref$nextMonthAriaLab = _ref.nextMonthAriaLabel,
252
- nextMonthAriaLabel = _ref$nextMonthAriaLab === void 0 ? 'Neste måned' : _ref$nextMonthAriaLab,
253
- _ref$locale = _ref.locale,
254
- locale$1 = _ref$locale === void 0 ? locale.nb : _ref$locale,
255
- open = _ref.open,
256
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
257
145
 
258
- var datepickerId = utils.useRandomId('eds-datepicker');
259
- var datepickerRef = React.useRef(null);
260
- var inputRef = React__default["default"].useRef(null);
261
- var calendarButton = document.getElementById(datepickerId + '-button');
146
+ if (!value.hour) {
147
+ // type is CalendarDate
148
+ // @ts-expect-error .toDate(timeZone) does not exist in type Time
149
+ return value.toDate(timeZoneForCalendarDateTime != null ? timeZoneForCalendarDateTime : date.getLocalTimeZone());
150
+ } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
262
151
 
263
- var _useState = React.useState(false),
264
- showValidation = _useState[0],
265
- setShowValidation = _useState[1];
266
152
 
267
- var _useState2 = React.useState(false),
268
- shouldFocusOnCalendarButtonAfterSelect = _useState2[0],
269
- setShouldFocusOnCalendarButtonAfterSelect = _useState2[1]; // eslint-disable-next-line react-hooks/exhaustive-deps
153
+ if (!value.timeZone) {
154
+ // type is CalendarDateTime
155
+ if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
156
+ return value.toDate(timeZoneForCalendarDateTime);
157
+ return new Date( // @ts-expect-error not in type Time
158
+ value.year, // @ts-expect-error not in type Time
159
+ value.month - 1, // @ts-expect-error not in type Time
160
+ value.day, // @ts-expect-error not in type CalendarDate
161
+ value.hour, // @ts-expect-error not in type CalendarDate
162
+ value.minute, // @ts-expect-error not in type CalendarDate
163
+ value.second);
164
+ } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
270
165
 
271
166
 
272
- React__default["default"].useEffect(function () {
273
- return validateInput();
274
- }, [selectedDate]);
167
+ return value.toDate();
168
+ };
169
+ var createCalendar = function createCalendar(identifier) {
170
+ if (identifier === void 0) {
171
+ identifier = 'gregory';
172
+ }
275
173
 
276
- var handleOnChange = function handleOnChange(date, event) {
277
- var _inputRef$current;
174
+ switch (identifier) {
175
+ case 'gregory':
176
+ return new date.GregorianCalendar();
278
177
 
279
- if (shouldFocusOnCalendarButtonAfterSelect && !hideCalendarButton) {
280
- calendarButton == null ? void 0 : calendarButton.focus();
281
- setShouldFocusOnCalendarButtonAfterSelect(false);
282
- } else (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
178
+ default:
179
+ throw new Error("Unsupported calendar " + identifier);
180
+ }
181
+ };
182
+ var ariaLabelIfNorwegian = function ariaLabelIfNorwegian(norwegianAriaLabel, locale, propsCollection) {
183
+ if (locale.toLowerCase() !== 'no-no') return propsCollection['aria-label'];
184
+ return norwegianAriaLabel;
185
+ };
283
186
 
284
- onChange(date, event);
285
- };
187
+ var _excluded$8 = ["selectedDate", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "style", "className", "labelProps", "append"];
188
+ var DateField = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
189
+ var value = _ref.selectedDate,
190
+ label = _ref.label,
191
+ customLocale = _ref.locale,
192
+ showTimeZone = _ref.showTimeZone,
193
+ showTime = _ref.showTime,
194
+ _ref$granularity = _ref.granularity,
195
+ granularity = _ref$granularity === void 0 ? 'day' : _ref$granularity,
196
+ disabled = _ref.disabled,
197
+ variant = _ref.variant,
198
+ feedback = _ref.feedback,
199
+ _ref$validationVarian = _ref.validationVariant,
200
+ validationVariant = _ref$validationVarian === void 0 ? 'error' : _ref$validationVarian,
201
+ _ref$validationFeedba = _ref.validationFeedback,
202
+ validationFeedback = _ref$validationFeedba === void 0 ? 'Ugyldig dato' : _ref$validationFeedba,
203
+ labelTooltip = _ref.labelTooltip,
204
+ style = _ref.style,
205
+ className = _ref.className,
206
+ parentLabelProps = _ref.labelProps,
207
+ append = _ref.append,
208
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
286
209
 
287
- var handleOnKeyDown = function handleOnKeyDown(event) {
288
- setShowValidation(false);
210
+ var _useLocale = i18n.useLocale(),
211
+ locale = _useLocale.locale;
289
212
 
290
- if (event.key === 'Enter') {
291
- if (!datePickerGUIIsOpen()) {
292
- // onBlurInput will validate if calendar is open
293
- validateInput();
294
- forceUpdateInputFormat();
295
- }
213
+ var state = datepicker$1.useDateFieldState(_extends({}, rest, {
214
+ locale: customLocale != null ? customLocale : locale,
215
+ createCalendar: createCalendar,
216
+ value: value === null ? undefined : value,
217
+ hideTimeZone: !showTimeZone,
218
+ granularity: showTime ? 'minute' : granularity
219
+ }));
220
+ var dateFieldRef = React.useRef(null);
296
221
 
297
- focusAndSelectInputField();
298
- } else if (event.key === 'Tab' && datePickerGUIIsOpen()) {
299
- forceUpdateInputFormat();
300
- } else if (event.key === 'Escape') {
301
- forceUpdateInputFormat();
302
- focusAndSelectInputField();
303
- if (datePickerGUIIsOpen()) toggleCalendarGUI();
222
+ var _useDateField = datepicker.useDateField(_extends({}, rest, {
223
+ label: label,
224
+ isDisabled: disabled || rest.isDisabled
225
+ }), state, dateFieldRef),
226
+ labelProps = _useDateField.labelProps,
227
+ fieldProps = _useDateField.fieldProps;
228
+
229
+ var id = utils.useRandomId('datefield');
230
+ return React__default["default"].createElement(utils.ConditionalWrapper, {
231
+ condition: customLocale !== undefined,
232
+ wrapper: function wrapper(child) {
233
+ return React__default["default"].createElement(i18n.I18nProvider, {
234
+ locale: customLocale
235
+ }, child);
304
236
  }
237
+ }, React__default["default"].createElement(form.BaseFormControl, _extends({
238
+ style: style,
239
+ className: classNames__default["default"]('eds-datefield', className),
240
+ labelId: id,
241
+ ref: utils.mergeRefs(dateFieldRef, ref),
242
+ disabled: state.isDisabled,
243
+ disableLabelAnimation: true,
244
+ label: label,
245
+ labelTooltip: labelTooltip,
246
+ labelProps: parentLabelProps != null ? parentLabelProps : labelProps
247
+ }, fieldProps, {
248
+ variant: (variant != null ? variant : state.validationState === 'invalid') ? validationVariant : undefined,
249
+ feedback: (feedback != null ? feedback : state.validationState === 'invalid') ? validationFeedback : undefined,
250
+ append: append,
251
+ ariaAlertOnFeedback: true
252
+ }), state.segments.map(function (segment, i) {
253
+ return React__default["default"].createElement(FieldSegment, {
254
+ segment: segment,
255
+ state: state,
256
+ key: i
257
+ });
258
+ })));
259
+ });
305
260
 
306
- onKeyDown(event);
307
- };
308
-
309
- var handleOnClickOutside = function handleOnClickOutside() {
310
- return setShouldFocusOnCalendarButtonAfterSelect(false);
311
- };
261
+ var _excluded$7 = ["children", "className", "style"];
262
+ var CalendarButton = function CalendarButton(_ref) {
263
+ var children = _ref.children,
264
+ className = _ref.className,
265
+ style = _ref.style,
266
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$7);
312
267
 
313
- var handleOnBlurInput = function handleOnBlurInput() {
314
- if (datePickerGUIIsOpen()) return;
315
- validateInput();
316
- forceUpdateInputFormat();
317
- };
268
+ var ref = React.useRef(null);
318
269
 
319
- var validateInput = function validateInput() {
320
- var _inputRef$current2;
270
+ var _useButton = button.useButton(props, ref),
271
+ buttonProps = _useButton.buttonProps;
321
272
 
322
- setShowValidation(false);
323
- var inputValue = (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value;
324
- if (!inputValue) return;
325
- var inputValueParsedWithAllDateFormats = dateFormats.map(function (format) {
326
- return dateFns.parse(inputValue, format, new Date(), {
327
- locale: locale$1
328
- });
329
- });
330
- var parsedDateFromInputIsTheSameAsSelectedDate = selectedDate && inputValueParsedWithAllDateFormats.some(function (dateFormat) {
331
- return dateFns.isSameDay(dateFormat, selectedDate);
332
- });
273
+ return React__default["default"].createElement(button$1.IconButton, _extends({}, buttonProps, {
274
+ ref: ref,
275
+ className: className,
276
+ style: style
277
+ }), children);
278
+ };
333
279
 
334
- if (parsedDateFromInputIsTheSameAsSelectedDate) {
335
- // valid date inputted
336
- setShowValidation(false);
337
- } else {
338
- // invalid date inputted
339
- setShowValidation(true);
280
+ var _excluded$6 = ["state", "date", "onSelectedCellClick"];
281
+ var CalendarCell = function CalendarCell(_ref) {
282
+ var _state$timeZone;
283
+
284
+ var state = _ref.state,
285
+ date$1 = _ref.date,
286
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
287
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
288
+ return;
289
+ } : _ref$onSelectedCellCl,
290
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
291
+
292
+ var cellRef = React.useRef(null);
293
+
294
+ var _useCalendarCell = calendar.useCalendarCell({
295
+ date: date$1
296
+ }, state, cellRef),
297
+ cellProps = _useCalendarCell.cellProps,
298
+ buttonProps = _useCalendarCell.buttonProps,
299
+ isSelected = _useCalendarCell.isSelected,
300
+ isOutsideVisibleRange = _useCalendarCell.isOutsideVisibleRange,
301
+ isDisabled = _useCalendarCell.isDisabled,
302
+ isUnavailable = _useCalendarCell.isUnavailable,
303
+ formattedDate = _useCalendarCell.formattedDate;
304
+
305
+ return React__default["default"].createElement("td", _extends({}, cellProps, {
306
+ className: "eds-datepicker__calendar__grid__cell__td"
307
+ }), React__default["default"].createElement("div", _extends({}, buttonProps, {
308
+ ref: cellRef,
309
+ hidden: isOutsideVisibleRange,
310
+ className: classNames__default["default"]('eds-datepicker__calendar__grid__cell', {
311
+ 'eds-datepicker__calendar__grid__cell--selected': isSelected,
312
+ 'eds-datepicker__calendar__grid__cell--disabled': isDisabled || isUnavailable,
313
+ 'eds-datepicker__calendar__grid__cell--outside-month': isOutsideVisibleRange,
314
+ 'eds-datepicker__calendar__grid__cell--today': date.isEqualDay(date$1, date.now((_state$timeZone = state.timeZone) != null ? _state$timeZone : date.getLocalTimeZone()))
315
+ })
316
+ }, rest, {
317
+ onClick: function onClick(e) {
318
+ buttonProps.onClick && buttonProps.onClick(e);
319
+ isSelected && onSelectedCellClick();
340
320
  }
341
- };
321
+ }), formattedDate));
322
+ };
342
323
 
343
- var getFeedbackAndVariant = function getFeedbackAndVariant() {
344
- if (feedback) return {
345
- feedback: feedback,
346
- variant: variant
347
- };
348
- if (!hideValidation && showValidation) return {
349
- feedback: validationFeedback,
350
- variant: validationVariant
351
- };
352
- return {
353
- feedback: '',
354
- variant: undefined
355
- };
356
- };
324
+ var _excluded$5 = ["state", "navigationDescription", "onSelectedCellClick"];
325
+ var CalendarGrid = function CalendarGrid(_ref) {
326
+ var state = _ref.state,
327
+ navigationDescription = _ref.navigationDescription,
328
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
329
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
330
+ return;
331
+ } : _ref$onSelectedCellCl,
332
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
357
333
 
358
- var focusAndSelectInputField = function focusAndSelectInputField() {
359
- return requestAnimationFrame(function () {
360
- var _inputRef$current3;
334
+ var calendarGridId = utils.useRandomId('eds-calendar');
361
335
 
362
- return (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.select();
363
- });
364
- };
336
+ var _useLocale = i18n.useLocale(),
337
+ locale = _useLocale.locale;
338
+
339
+ var _useCalendarGrid = calendar.useCalendarGrid(rest, state),
340
+ gridProps = _useCalendarGrid.gridProps,
341
+ headerProps = _useCalendarGrid.headerProps,
342
+ weekDays = _useCalendarGrid.weekDays;
365
343
 
366
- var forceUpdateInputFormat = function forceUpdateInputFormat() {
367
- var _datepickerRef$curren;
344
+ var weeksInMonth = date.getWeeksInMonth(state.visibleRange.start, locale);
345
+ var weeksArray = Array.from(Array(weeksInMonth).keys());
368
346
 
369
- return (_datepickerRef$curren = datepickerRef.current) == null ? void 0 : _datepickerRef$curren.setState({
370
- inputValue: null
347
+ var weekDaysMapped = function weekDaysMapped() {
348
+ if (locale.toLowerCase() === 'no-no' || locale.toLowerCase() === 'no') return ['ma', 'ti', 'on', 'to', 'fr', 'lø', 'sø'];
349
+ if (weekDays.toString() === 'M,T,W,T,F,S,S') return ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
350
+ return weekDays.map(function (day) {
351
+ return day.toLowerCase();
371
352
  });
372
353
  };
373
354
 
374
- var toggleCalendarGUI = function toggleCalendarGUI() {
375
- var _datepickerRef$curren2;
376
-
377
- return (_datepickerRef$curren2 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren2.setOpen(!datePickerGUIIsOpen());
355
+ var getNavigationDescription = function getNavigationDescription() {
356
+ if (navigationDescription) return navigationDescription;
357
+ if (locale.toLowerCase().includes('en')) return 'Use the arrow keys to navigate between dates';
358
+ return 'Bruk piltastene til å navigere mellom datoer';
378
359
  };
379
360
 
380
- var setFocusToCalendarGUI = function setFocusToCalendarGUI() {
381
- if (inline || hideCalendar || datePickerGUIIsOpen()) return; // 1 frame delay to allow calendar to spawn
361
+ return React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement("table", _extends({}, gridProps, {
362
+ cellSpacing: "0",
363
+ className: "eds-datepicker__calendar__grid"
364
+ }), React__default["default"].createElement("thead", _extends({}, headerProps), React__default["default"].createElement("tr", null, weekDaysMapped().map(function (day, index) {
365
+ return React__default["default"].createElement("th", {
366
+ key: index
367
+ }, day);
368
+ }))), React__default["default"].createElement("tbody", null, weeksArray.map(function (weekIndex) {
369
+ return React__default["default"].createElement("tr", {
370
+ key: weekIndex
371
+ }, state.getDatesInWeek(weekIndex).map(function (date, i) {
372
+ return date ? React__default["default"].createElement(CalendarCell, {
373
+ key: i,
374
+ state: state,
375
+ date: date,
376
+ "aria-describedby": calendarGridId + 'description',
377
+ onSelectedCellClick: onSelectedCellClick
378
+ }) : React__default["default"].createElement("td", {
379
+ key: i
380
+ });
381
+ }));
382
+ }))), React__default["default"].createElement(a11y.VisuallyHidden, {
383
+ id: calendarGridId + 'description'
384
+ }, getNavigationDescription()));
385
+ };
382
386
 
383
- requestAnimationFrame(function () {
384
- var _datepickerRef$curren3;
387
+ var _excluded$4 = ["selectedDate", "onChange", "locale", "style", "children", "navigationDescription", "onSelectedCellClick"];
388
+ var Calendar = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
389
+ var onChange = _ref.onChange,
390
+ customLocale = _ref.locale,
391
+ style = _ref.style,
392
+ navigationDescription = _ref.navigationDescription,
393
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
394
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
395
+ return;
396
+ } : _ref$onSelectedCellCl,
397
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
398
+
399
+ var _useLocale = i18n.useLocale(),
400
+ locale = _useLocale.locale;
385
401
 
386
- var datepickerGUIWrapper = // @ts-expect-error .calendar does actually exist in ReactDatePicker ref
387
- (_datepickerRef$curren3 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren3.calendar.componentNode;
388
- var dateToSetFocusTo = selectedDate ? datepickerGUIWrapper.querySelector('.eds-datepicker__calender__day[tabindex="0"]') : datepickerGUIWrapper.querySelector('.eds-datepicker__calender__day[aria-current="date"]');
402
+ var state = calendar$1.useCalendarState(_extends({}, rest, {
403
+ onChange: onChange,
404
+ locale: customLocale != null ? customLocale : locale,
405
+ createCalendar: createCalendar
406
+ }));
407
+
408
+ var _useCalendar = calendar.useCalendar(rest, state),
409
+ calendarProps = _useCalendar.calendarProps,
410
+ prevButtonProps = _useCalendar.prevButtonProps,
411
+ nextButtonProps = _useCalendar.nextButtonProps,
412
+ title = _useCalendar.title;
413
+
414
+ return React__default["default"].createElement(utils.ConditionalWrapper, {
415
+ condition: customLocale,
416
+ wrapper: function wrapper(child) {
417
+ return React__default["default"].createElement(i18n.I18nProvider, {
418
+ locale: customLocale
419
+ }, child);
420
+ }
421
+ }, React__default["default"].createElement("div", _extends({}, calendarProps, {
422
+ ref: ref,
423
+ className: "eds-datepicker__calendar",
424
+ style: style
425
+ }), React__default["default"].createElement("div", {
426
+ className: "eds-datepicker__calendar__header"
427
+ }, React__default["default"].createElement(CalendarButton, _extends({}, prevButtonProps, {
428
+ "aria-label": ariaLabelIfNorwegian('Forrige måned', locale, prevButtonProps)
429
+ }), React__default["default"].createElement(icons.LeftArrowIcon, {
430
+ size: 20
431
+ })), React__default["default"].createElement("h2", null, title), React__default["default"].createElement(CalendarButton, _extends({}, nextButtonProps, {
432
+ "aria-label": ariaLabelIfNorwegian('Neste måned', locale, nextButtonProps)
433
+ }), React__default["default"].createElement(icons.RightArrowIcon, {
434
+ size: 20
435
+ }))), React__default["default"].createElement(CalendarGrid, {
436
+ state: state,
437
+ navigationDescription: navigationDescription,
438
+ onSelectedCellClick: onSelectedCellClick
439
+ })));
440
+ });
389
441
 
390
- if (dateToSetFocusTo !== null) {
391
- var _datepickerRef$curren4;
442
+ var _excluded$3 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold"];
443
+ var DatePicker = function DatePicker(_ref) {
444
+ var value = _ref.selectedDate,
445
+ onChange = _ref.onChange,
446
+ locale = _ref.locale,
447
+ isDisabled = _ref.disabled,
448
+ showTime = _ref.showTime,
449
+ _ref$showTimeZone = _ref.showTimeZone,
450
+ showTimeZone = _ref$showTimeZone === void 0 ? false : _ref$showTimeZone,
451
+ className = _ref.className,
452
+ variant = _ref.variant,
453
+ feedback = _ref.feedback,
454
+ validationVariant = _ref.validationVariant,
455
+ validationFeedback = _ref.validationFeedback,
456
+ _ref$disableModal = _ref.disableModal,
457
+ disableModal = _ref$disableModal === void 0 ? false : _ref$disableModal,
458
+ labelTooltip = _ref.labelTooltip,
459
+ navigationDescription = _ref.navigationDescription,
460
+ minValue = _ref.minDate,
461
+ maxValue = _ref.maxDate,
462
+ _ref$modalTreshold = _ref.modalTreshold,
463
+ modalTreshold = _ref$modalTreshold === void 0 ? 1000 : _ref$modalTreshold,
464
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
392
465
 
393
- (_datepickerRef$curren4 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren4.setBlur();
394
- dateToSetFocusTo.focus({
395
- preventScroll: true
396
- });
397
- }
466
+ var CALENDAR_MODAL_MAX_SCREEN_WIDTH = modalTreshold;
467
+ var datePickerRef = React.useRef(null);
468
+ var calendarRef = React.useRef(null);
469
+ var dateFieldRef = React.useRef(null);
470
+
471
+ var _useWindowDimensions = utils.useWindowDimensions(),
472
+ width = _useWindowDimensions.width;
473
+
474
+ var state = datepicker$1.useDatePickerState(_extends({}, rest, {
475
+ minValue: minValue,
476
+ maxValue: maxValue,
477
+ value: value,
478
+ onChange: onChange
479
+ }));
480
+
481
+ var _useDatePicker = datepicker.useDatePicker(_extends({
482
+ isDisabled: isDisabled,
483
+ minValue: minValue,
484
+ maxValue: maxValue,
485
+ autoFocus: true
486
+ }, rest), state, datePickerRef),
487
+ groupProps = _useDatePicker.groupProps,
488
+ labelProps = _useDatePicker.labelProps,
489
+ fieldProps = _useDatePicker.fieldProps,
490
+ buttonProps = _useDatePicker.buttonProps,
491
+ dialogProps = _useDatePicker.dialogProps,
492
+ calendarProps = _useDatePicker.calendarProps; // calculations for floating-UI popover position
493
+
494
+
495
+ var _useFloating = reactDom.useFloating({
496
+ whileElementsMounted: reactDom.autoUpdate,
497
+ placement: 'bottom-start',
498
+ middleware: [reactDom.offset(tokens.space.extraSmall), reactDom.flip(), reactDom.shift({
499
+ padding: tokens.space.extraSmall
500
+ })]
501
+ }),
502
+ x = _useFloating.x,
503
+ y = _useFloating.y,
504
+ reference = _useFloating.reference,
505
+ floating = _useFloating.floating,
506
+ strategy = _useFloating.strategy;
507
+
508
+ var onChangeCalendar = function onChangeCalendar(newSelectedDate) {
509
+ // Necessary to avoid state update on unmounted component
510
+ requestAnimationFrame(function () {
511
+ calendarProps.onChange && calendarProps.onChange(newSelectedDate);
398
512
  });
399
- setShouldFocusOnCalendarButtonAfterSelect(true);
400
- setShowValidation(false);
401
513
  };
402
514
 
403
- var datePickerGUIIsOpen = function datePickerGUIIsOpen() {
404
- var _datepickerRef$curren5;
515
+ utils.useOnClickOutside([calendarRef], function () {
516
+ state.setOpen(false);
517
+ });
518
+ utils.useOnEscape(calendarRef, function () {
519
+ state.setOpen(false);
520
+ });
405
521
 
406
- return (_datepickerRef$curren5 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren5.isCalendarOpen();
407
- };
522
+ var calendarSharedProps = _extends({}, dialogProps, calendarProps, {
523
+ disabled: calendarProps.isDisabled,
524
+ navigationDescription: navigationDescription,
525
+ onSelectedCellClick: function onSelectedCellClick() {
526
+ return state.setOpen(false);
527
+ },
528
+ onChange: onChangeCalendar
529
+ });
408
530
 
409
- return React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(ReactDatepicker__default["default"], _extends({
410
- selected: selectedDate,
411
- minDate: minDate,
412
- maxDate: maxDate,
413
- dateFormat: dateFormats,
414
- showWeekNumbers: true,
415
- weekLabel: weekLabel,
416
- onChange: handleOnChange,
417
- onClickOutside: handleOnClickOutside,
418
- id: datepickerId,
419
- ariaLabelledBy: datepickerId,
420
- showPopperArrow: false,
421
- locale: locale$1,
422
- inline: inline,
423
- disabled: disabled,
424
- preventOpenOnFocus: true,
425
- chooseDayAriaLabelPrefix: chooseDayAriaLabelPrefix,
426
- open: hideCalendar ? false : open,
427
- ref: datepickerRef,
428
- calendarClassName: "eds-datepicker__calender",
429
- dayClassName: function dayClassName() {
430
- return 'eds-datepicker__calender__day';
531
+ var useModal = width <= CALENDAR_MODAL_MAX_SCREEN_WIDTH && !disableModal;
532
+ var popoverCalendar = React__default["default"].createElement("div", {
533
+ // styling for floating-UI popover
534
+ style: {
535
+ position: strategy,
536
+ top: y != null ? y : 0,
537
+ left: x != null ? x : 0,
538
+ zIndex: tokens.zIndexes.popover
431
539
  },
432
- weekDayClassName: function weekDayClassName() {
433
- return 'eds-datepicker__calender__day-name';
540
+ ref: function ref(node) {
541
+ floating(node);
542
+ }
543
+ }, React__default["default"].createElement(FocusLock__default["default"], {
544
+ disabled: !state.isOpen || useModal,
545
+ returnFocus: true
546
+ }, state.isOpen && React__default["default"].createElement(Calendar, _extends({}, calendarSharedProps, {
547
+ ref: calendarRef
548
+ }))));
549
+ var modalCalendar = React__default["default"].createElement(modal.Modal, {
550
+ size: "small",
551
+ title: "",
552
+ open: state.isOpen,
553
+ onDismiss: function onDismiss() {
554
+ return state.setOpen(false);
434
555
  },
435
- className: classNames__default["default"](className, 'eds-datepicker__input'),
436
- highlightDates: [{
437
- 'eds-datepicker__calender__day--today': [new Date()]
438
- }, {
439
- 'eds-datepicker__calender__day--selected': selectedDate ? [selectedDate] : []
440
- }],
441
- renderCustomHeader: function renderCustomHeader(_ref2) {
442
- var date = _ref2.date,
443
- changeYear = _ref2.changeYear,
444
- changeMonth = _ref2.changeMonth,
445
- decreaseMonth = _ref2.decreaseMonth,
446
- increaseMonth = _ref2.increaseMonth,
447
- prevMonthButtonDisabled = _ref2.prevMonthButtonDisabled,
448
- nextMonthButtonDisabled = _ref2.nextMonthButtonDisabled;
449
- return React__default["default"].createElement(DatePickerHeader, {
450
- date: date,
451
- changeYear: changeYear,
452
- changeMonth: changeMonth,
453
- increaseMonth: increaseMonth,
454
- decreaseMonth: decreaseMonth,
455
- prevMonthButtonDisabled: prevMonthButtonDisabled,
456
- nextMonthButtonDisabled: nextMonthButtonDisabled,
457
- previousMonthAriaLabel: previousMonthAriaLabel,
458
- nextMonthAriaLabel: nextMonthAriaLabel,
459
- locale: locale$1
460
- });
556
+ closeOnClickOutside: true,
557
+ className: "eds-datepicker__calendar-modal"
558
+ }, React__default["default"].createElement(Calendar, _extends({}, calendarSharedProps)));
559
+ return React__default["default"].createElement(utils.ConditionalWrapper, {
560
+ condition: locale !== undefined,
561
+ wrapper: function wrapper(child) {
562
+ return React__default["default"].createElement(i18n.I18nProvider, {
563
+ locale: locale
564
+ }, child);
565
+ }
566
+ }, React__default["default"].createElement("div", {
567
+ className: classNames__default["default"]('eds-datepicker', className)
568
+ }, React__default["default"].createElement("div", _extends({}, groupProps, {
569
+ ref: function ref(node) {
570
+ datePickerRef.current = node;
571
+ reference(node);
461
572
  },
462
- customInput: React__default["default"].createElement(DatePickerInput, {
463
- style: style,
464
- label: label,
465
- inputPlaceholder: placeholder,
466
- calendarButtonTooltipOpen: calendarButtonTooltipOpen,
467
- calendarButtonTooltipClose: calendarButtonTooltipClose,
468
- prepend: prepend,
469
- feedback: getFeedbackAndVariant().feedback,
470
- variant: getFeedbackAndVariant().variant,
471
- inputRef: inputRef,
472
- calendarButtonId: datepickerId + '-button',
473
- forwardRef: ref,
474
- onKeyDownInput: handleOnKeyDown,
475
- onBlurInput: handleOnBlurInput,
476
- onFocus: undefined,
477
- toggleCalendarGUI: toggleCalendarGUI,
478
- setFocusToCalendarGUI: setFocusToCalendarGUI,
479
- setShouldFocusOnCalendarButtonAfterSelect: setShouldFocusOnCalendarButtonAfterSelect,
480
- calendarGUIIsOpen: datePickerGUIIsOpen,
481
- disableLabelAnimation: disableLabelAnimation,
482
- hideCalendarButton: hideCalendarButton,
483
- selectedDate: selectedDate
573
+ id: undefined,
574
+ className: "eds-datepicker__datefield__wrapper"
575
+ }), React__default["default"].createElement(DateField, _extends({}, fieldProps, {
576
+ selectedDate: state.value,
577
+ label: rest.label,
578
+ labelProps: labelProps,
579
+ showTime: showTime,
580
+ showTimeZone: showTimeZone,
581
+ ref: dateFieldRef,
582
+ variant: variant,
583
+ feedback: feedback,
584
+ validationVariant: validationVariant,
585
+ validationFeedback: validationFeedback,
586
+ labelTooltip: labelTooltip,
587
+ className: classNames__default["default"]('eds-datepicker__datefield', {
588
+ 'eds-datepicker__datefield--disabled': fieldProps.isDisabled
484
589
  })
485
- }, rest)));
486
- });
590
+ })), !fieldProps.isDisabled && React__default["default"].createElement(CalendarButton, _extends({}, buttonProps, {
591
+ onPress: function onPress() {
592
+ return state.setOpen(!state.isOpen);
593
+ },
594
+ className: "eds-datepicker__open-calendar-button"
595
+ }), React__default["default"].createElement(icons.CalendarIcon, null)), useModal ? modalCalendar : popoverCalendar)));
596
+ };
487
597
 
488
598
  var _excluded$2 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
489
599
  _excluded2$1 = ["onChange", "variant", "value"];
@@ -565,39 +675,12 @@ var NativeDatePickerBase = /*#__PURE__*/React__default["default"].forwardRef(fun
565
675
  }, rest));
566
676
  });
567
677
 
568
- var TimeSegment = function TimeSegment(_ref) {
569
- var segment = _ref.segment,
570
- state = _ref.state;
571
- var ref = React.useRef(null);
572
-
573
- var _useDateSegment = datepicker.useDateSegment(segment, state, ref),
574
- segmentProps = _useDateSegment.segmentProps;
575
-
576
- var is12HourFormatted = state.segments.some(function (segment) {
577
- return segment.text === 'AM' || segment.text === 'PM';
578
- });
579
-
580
- var segmentDisplayText = function segmentDisplayText() {
581
- if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
582
-
583
- if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
584
- return segment.text;
585
- };
586
-
587
- return React__default["default"].createElement("div", _extends({}, segmentProps, {
588
- ref: ref,
589
- className: classNames__default["default"]('eds-timepicker__segment', {
590
- 'eds-timepicker__segment--placeholder': segment.isPlaceholder
591
- })
592
- }), segmentDisplayText());
593
- };
594
-
595
678
  var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
596
679
  var direction = _ref.direction,
597
680
  onClick = _ref.onClick,
598
681
  disabled = _ref.disabled,
599
682
  ariaLabel = _ref['aria-label'];
600
- return React__default["default"].createElement(button.IconButton, {
683
+ return React__default["default"].createElement(button$1.IconButton, {
601
684
  className: classNames__default["default"]('eds-timepicker__arrowbutton', "eds-timepicker__arrowbutton--" + direction, {
602
685
  'eds-timepicker__arrowbutton--disabled': disabled
603
686
  }),
@@ -706,7 +789,7 @@ var TimePicker = /*#__PURE__*/React__default["default"].forwardRef(function (_re
706
789
  variant: variant,
707
790
  feedback: feedback
708
791
  }), state.segments.map(function (segment, i) {
709
- return React__default["default"].createElement(TimeSegment, {
792
+ return React__default["default"].createElement(FieldSegment, {
710
793
  segment: segment,
711
794
  state: state,
712
795
  key: i
@@ -794,71 +877,16 @@ var NativeTimePickerBase = /*#__PURE__*/React__default["default"].forwardRef(fun
794
877
  }, rest));
795
878
  });
796
879
 
797
- /**
798
- * Tar inn et JS Date-objekt og returnerer et av TimeValue-objektene fra @internationalized/date-pakken
799
- * @param {Date} date JS Date-objekt som ønskes konvertert til et TimeValue-objekt
800
- * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
801
- * @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
802
- * @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.
803
- * @returns {Time | CalendarDateTime | ZonedDateTime} et av TimeValue-objektene med verdier fra date
804
- */
805
-
806
- var nativeDateToTimeValue = function nativeDateToTimeValue(date$1, noDateOnlyTime, timeZone, offset) {
807
- if (noDateOnlyTime === void 0) {
808
- noDateOnlyTime = false;
809
- }
810
-
811
- if (timeZone) {
812
- if (offset) {
813
- return new date.ZonedDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), timeZone, offset, date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
814
- }
815
-
816
- return date.parseAbsolute(date$1.toISOString(), timeZone);
817
- }
818
-
819
- if (noDateOnlyTime) return new date.Time(date$1.getHours(), date$1.getMinutes(), date$1.getSeconds(), 0);
820
- return new date.CalendarDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
821
- };
822
- /**
823
- * Tar inn et av TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
824
- * @param {TimeValue} time Et tidspunkt på TimeValue-formatet som ønsket konvertert til et JS Date-objekt
825
- * @param {string} timeZoneForCalendarDateTime Tidssonen time er i. Fungerer kun med typen er CalendarDateTime
826
- * @returns {Date} et Date-objekt med verdier fra time
827
- */
828
- // This function uses a lot of @ts-expect-error to make it work with all TimeValue types. Sorry ...
829
-
830
- var timeValueToNativeDate = function timeValueToNativeDate(time, timeZoneForCalendarDateTime) {
831
- // @ts-expect-error .day does not exist on Time-object
832
- if (!time.day) {
833
- // type is Time
834
- var date = new Date();
835
- date.setHours(time.hour);
836
- date.setMinutes(time.minute);
837
- date.setSeconds(time.second);
838
- return date;
839
- } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
840
-
841
-
842
- if (!time.timeZone) {
843
- // type is CalendarDateTime
844
- if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
845
- return time.toDate(timeZoneForCalendarDateTime);
846
- return new Date( // @ts-expect-error not in type Time
847
- time.year, // @ts-expect-error not in type Time
848
- time.month - 1, // @ts-expect-error not in type Time
849
- time.day, time.hour, time.minute, time.second);
850
- } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
851
-
852
-
853
- return time.toDate();
854
- };
855
-
856
880
  utils.warnAboutMissingStyles('datepicker', 'form', 'icons');
857
881
 
882
+ exports.Calendar = Calendar;
883
+ exports.DateField = DateField;
858
884
  exports.DatePicker = DatePicker;
859
885
  exports.NativeDatePicker = NativeDatePicker;
860
886
  exports.NativeTimePicker = NativeTimePicker;
861
887
  exports.TimePicker = TimePicker;
862
- exports.nativeDateToTimeValue = nativeDateToTimeValue;
863
- exports.timeValueToNativeDate = timeValueToNativeDate;
888
+ exports.ariaLabelIfNorwegian = ariaLabelIfNorwegian;
889
+ exports.createCalendar = createCalendar;
890
+ exports.nativeDateToTimeOrDateValue = nativeDateToTimeOrDateValue;
891
+ exports.timeOrDateValueToNativeDate = timeOrDateValueToNativeDate;
864
892
  //# sourceMappingURL=datepicker.cjs.development.js.map