@entur/datepicker 9.1.5 → 9.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import { DateValue } from '@internationalized/date';
2
+ import { CalendarDate, DateValue } from '@internationalized/date';
3
3
  import './Calendar.scss';
4
- type CalendarProps = {
4
+ export type CalendarProps = {
5
5
  selectedDate: DateValue | null;
6
6
  onChange: (SelectedDate: DateValue | null) => void;
7
7
  navigationDescription?: string;
@@ -21,7 +21,21 @@ type CalendarProps = {
21
21
  * Gyldig til og med den tiden som legges inn som maxDate.
22
22
  * Dato uten tid vil være gyldig hele maxDate-dagen */
23
23
  maxDate?: DateValue;
24
+ /** Brukes for å legge til klassenavn på spesifikke datoer i kalenderen.
25
+ * Tar inn en dato og skal returnere klassenavnet som skal legges til den datoen.
26
+ * @default undefined
27
+ * @example (date) => isWeekend(date, 'no-NO') ? 'weekend' : ''
28
+ *
29
+ * OBS: hvis stylingen er meningsbærende bør du bruke ariaLabelForDate i tillegg for å beskrive
30
+ * meningen til skjermlesere o.l.
31
+ */
32
+ classNameForDate?: (date: CalendarDate) => string;
33
+ /** Legger til teksten som returneres på datoen i kalenderen sin aria-label.
34
+ * Bør brukes sammen med classNameForDate hvis styling-endringene gjort der er meningsbærende.
35
+ * @default undefined
36
+ * @example (date) => isWeekend(date, 'no-NO') ? 'helgedag' : ''
37
+ */
38
+ ariaLabelForDate?: (date: CalendarDate) => string;
24
39
  [key: string]: any;
25
40
  };
26
41
  export declare const Calendar: React.ForwardRefExoticComponent<Omit<CalendarProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
27
- export {};
@@ -5,6 +5,8 @@ type CalendarCellProps = {
5
5
  state: CalendarState;
6
6
  date: CalendarDate;
7
7
  onSelectedCellClick?: () => void;
8
+ classNameForDate?: (date: CalendarDate) => string;
9
+ ariaLabelForDate?: (date: CalendarDate) => string;
8
10
  };
9
- export declare const CalendarCell: ({ state, date, onSelectedCellClick, ...rest }: CalendarCellProps) => React.JSX.Element;
11
+ export declare const CalendarCell: ({ state, date, onSelectedCellClick, classNameForDate, ariaLabelForDate, ...rest }: CalendarCellProps) => React.JSX.Element;
10
12
  export {};
@@ -1,9 +1,12 @@
1
1
  import React from 'react';
2
2
  import { CalendarState } from '@react-stately/calendar';
3
+ import { CalendarDate } from '@internationalized/date';
3
4
  type CalendarGridProps = {
4
5
  state: CalendarState;
5
6
  navigationDescription?: string;
6
7
  onSelectedCellClick?: () => void;
8
+ classNameForDate?: (date: CalendarDate) => string;
9
+ ariaLabelForDate?: (date: CalendarDate) => string;
7
10
  };
8
- export declare const CalendarGrid: ({ state, navigationDescription, onSelectedCellClick, ...rest }: CalendarGridProps) => React.JSX.Element;
11
+ export declare const CalendarGrid: ({ state, navigationDescription, onSelectedCellClick, classNameForDate, ariaLabelForDate, ...rest }: CalendarGridProps) => React.JSX.Element;
9
12
  export {};
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import type { DateValue, AriaDatePickerProps, MappedDateValue } from '@react-types/datepicker';
2
+ import { CalendarDate, DateValue } from '@internationalized/date';
3
+ import type { AriaDatePickerProps, MappedDateValue } from '@react-types/datepicker';
3
4
  import type { VariantType } from '@entur/form';
4
5
  import './DatePicker.scss';
5
6
  export type DatePickerProps<DateType extends DateValue> = {
@@ -66,25 +67,31 @@ export type DatePickerProps<DateType extends DateValue> = {
66
67
  navigationDescription?: string;
67
68
  /** Tvinger typen på onChange til den gitte typen.
68
69
  * Dette er nyttig når utgangsverdien din er 'null', men du ønsker at
69
- * DatePicker f.eks alltid skal returnere en ZonedDateTime.
70
+ * DatePicker alltid skal returnere f.eks ZonedDateTime.
70
71
  *
71
- * @default undefined (onChange returnerer DateValue bassertvalue, og om tid vises eller ikke)
72
+ * Som standard returnerer onChange DateValue basertselectedDate,
73
+ * eller CalendarDate hvis selectedDate er 'null'.
72
74
  *
73
- * Hvorfor er dette nødvendig?
74
- * I utgangspunktet vil en DatePicker som initieres med 'null' som verdi og ikke viser tid returnere en CalendarDate.
75
- * Dette er problematisk hvis du bruker datovelgeren sammen en TimePicker da
76
- * denne ikke støtter dato uten tidspunkt (CalendarDate). Ved å da tvinge DatePicker til å returnere
77
- * CalendarDateTime eller ZonedDateTime vil du kunne bruke den sammen med TimePicker.
78
- *
79
- * Hvorfor kan ikke dette gjøres automatisk?
80
- * En DatePicker som initieres med 'null' som verdi gir ingen informasjon om hvilken type man ønsker å returnere.
81
- * DatePicker støtter dog at du kan sende med en TypeScript-type, men TypeScript eksisterer ikke i runtime og
82
- * kan derfor ikke brukes til å bestemme hvilken type som skal returneres. Det er derfor nødvendig å enten gi
83
- * en initiell 'selectedDate' eller tvinge typen med denne prop-en.
75
+ * @default undefined
84
76
  */
85
77
  forcedReturnType?: 'CalendarDate' | 'CalendarDateTime' | 'ZonedDateTime';
78
+ /** Brukes for å legge til klassenavn på spesifikke datoer i kalenderen.
79
+ * Tar inn en dato og skal returnere klassenavnet som skal legges til den datoen.
80
+ * @default undefined
81
+ * @example (date) => isWeekend(date, 'no-NO') ? 'weekend' : ''
82
+ *
83
+ * OBS: hvis stylingen er meningsbærende bør du bruke ariaLabelForDate i tillegg for å beskrive
84
+ * meningen til skjermlesere o.l.
85
+ */
86
+ classNameForDate?: (date: CalendarDate) => string;
87
+ /** Legger til teksten som returneres på datoen i kalenderen sin aria-label.
88
+ * Bør brukes sammen med classNameForDate hvis styling-endringene gjort der er meningsbærende.
89
+ * @default undefined
90
+ * @example (date) => isWeekend(date, 'no-NO') ? 'helgedag' : ''
91
+ */
92
+ ariaLabelForDate?: (date: CalendarDate) => string;
86
93
  /** Ekstra klassenavn */
87
94
  className?: string;
88
95
  style?: React.CSSProperties;
89
96
  } & Omit<AriaDatePickerProps<DateType>, 'value' | 'onChange' | 'label' | 'hideTimeZone' | 'placeholder' | 'minValue' | 'maxValue'>;
90
- export declare const DatePicker: <DateType extends DateValue>({ selectedDate, onChange, locale, disabled, showTime, showTimeZone, className, style, variant, feedback, validationVariant, validationFeedback, disableModal, labelTooltip, navigationDescription, minDate, maxDate, modalTreshold, forcedReturnType, ...rest }: DatePickerProps<DateType>) => React.JSX.Element;
97
+ export declare const DatePicker: <DateType extends DateValue>({ selectedDate, onChange, locale, disabled, showTime, showTimeZone, classNameForDate, className, style, variant, feedback, validationVariant, validationFeedback, disableModal, labelTooltip, navigationDescription, minDate, maxDate, modalTreshold, forcedReturnType, ariaLabelForDate, ...rest }: DatePickerProps<DateType>) => React.JSX.Element;
@@ -9,8 +9,11 @@ export type TimePickerProps<TimeType extends TimeValue> = {
9
9
  onChange: (value: MappedTimeValue<TimeType> | null) => void;
10
10
  /** Label til TimePicker */
11
11
  label: string;
12
- /** Minutter som legges til eller trekkes fra ved klikk på pilene i TimePicker
13
- * @default 30
12
+ /** Minutter som legges til eller trekkes fra ved klikk på pilene i TimePicker.
13
+ * Rundes av til nærmeste hele 'minuteIncrement' som går opp i 60.
14
+ *
15
+ * OBS: Støtter kun verdier <= 60 og multiplum av 60.
16
+ * @default 30
14
17
  */
15
18
  minuteIncrementForArrowButtons?: number;
16
19
  /** BCP47-språkkoden til locale-en du ønsker å bruke.
@@ -21,6 +24,10 @@ export type TimePickerProps<TimeType extends TimeValue> = {
21
24
  * @default false
22
25
  */
23
26
  showTimeZone?: boolean;
27
+ /** Viser sekunder i tillegg til minutter og timer
28
+ * @default false
29
+ */
30
+ showSeconds?: boolean;
24
31
  /** Aria-label for venstrepil-knappen som trekker fra tid
25
32
  * @default `Trekk fra ${minuteIncrementForArrowButtons} minutter`
26
33
  */
@@ -36,8 +43,19 @@ export type TimePickerProps<TimeType extends TimeValue> = {
36
43
  labelTooltip?: React.ReactNode;
37
44
  disabled?: boolean;
38
45
  inputRef?: React.ForwardedRef<HTMLDivElement>;
46
+ /** Tvinger typen på onChange til den gitte typen.
47
+ * Dette er nyttig når utgangsverdien din er 'null', men du ønsker at
48
+ * TimePicker alltid skal returnere f.eks Time.
49
+ *
50
+ * Som standard returnerer onChange TimeValue basert på selectedTime,
51
+ * eller ZonedDateTime hvis selectedTime er 'null'.
52
+ *
53
+ * @default undefined
54
+ */
55
+ forcedReturnType?: 'Time' | 'CalendarDateTime' | 'ZonedDateTime';
56
+ forcedTimeZone?: string;
39
57
  /** Ekstra klassenavn */
40
58
  className?: string;
41
59
  style?: React.CSSProperties;
42
60
  } & Omit<AriaTimeFieldProps<TimeType>, 'value' | 'onChange' | 'label' | 'hideTimeZone' | 'placeholder' | 'minValue' | 'maxValue'>;
43
- export declare const TimePicker: <TimeType extends TimeValue>({ selectedTime, onChange, disabled, className, style, label, labelTooltip, feedback, variant, locale: customLocale, showTimeZone, minuteIncrementForArrowButtons, leftArrowButtonAriaLabel, rightArrowButtonAriaLabel, inputRef, ...rest }: TimePickerProps<TimeType>) => React.JSX.Element;
61
+ export declare const TimePicker: <TimeType extends TimeValue>({ selectedTime, onChange, disabled, className, style, label, labelTooltip, feedback, granularity, variant, locale: customLocale, showTimeZone, showSeconds, minuteIncrementForArrowButtons, leftArrowButtonAriaLabel, rightArrowButtonAriaLabel, inputRef, forcedReturnType, forcedTimeZone, ...rest }: TimePickerProps<TimeType>) => React.JSX.Element;
@@ -1,6 +1,10 @@
1
1
  import React from 'react';
2
2
  type TimePickerArrowButtonProps = {
3
3
  direction: 'left' | 'right';
4
- } & React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
5
- export declare const TimePickerArrowButton: React.FC<TimePickerArrowButtonProps>;
4
+ disabled?: boolean;
5
+ 'aria-label': string;
6
+ onClick?: () => void;
7
+ onFocus?: () => void;
8
+ };
9
+ export declare const TimePickerArrowButton: ({ direction, onClick, disabled, "aria-label": ariaLabel, ...rest }: TimePickerArrowButtonProps) => React.JSX.Element;
6
10
  export {};
@@ -48,9 +48,11 @@ function _objectWithoutPropertiesLoose(source, excluded) {
48
48
  return target;
49
49
  }
50
50
 
51
+ var _excluded$b = ["segment", "state"];
51
52
  var FieldSegment = function FieldSegment(_ref) {
52
53
  var segment = _ref.segment,
53
- state = _ref.state;
54
+ state = _ref.state,
55
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$b);
54
56
  var ref = React.useRef(null);
55
57
  var _useDateSegment = datepicker.useDateSegment(segment, state, ref),
56
58
  segmentProps = _useDateSegment.segmentProps;
@@ -61,7 +63,7 @@ var FieldSegment = function FieldSegment(_ref) {
61
63
  'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
62
64
  }),
63
65
  tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
64
- }), segment.text);
66
+ }, rest), segment.text);
65
67
  };
66
68
 
67
69
  var nativeDateToDateTime = function nativeDateToDateTime(date$1, timeZone, offset) {
@@ -157,21 +159,46 @@ var lastMillisecondOfDay = function lastMillisecondOfDay(dateValue) {
157
159
  };
158
160
  var convertValueToType = function convertValueToType(_ref) {
159
161
  var value = _ref.value,
160
- type = _ref.type;
162
+ type = _ref.type,
163
+ _ref$timezone = _ref.timezone,
164
+ timezone = _ref$timezone === void 0 ? 'Europe/Oslo' : _ref$timezone;
161
165
  if (value === null) return null;
162
166
  switch (type) {
163
167
  case 'CalendarDate':
168
+ if (!('day' in value)) return date.today(timezone);
164
169
  return date.toCalendarDate(value);
165
170
  case 'CalendarDateTime':
171
+ if (!('day' in value)) return date.toCalendarDateTime(date.today(timezone), value);
166
172
  return date.toCalendarDateTime(value);
167
173
  case 'ZonedDateTime':
168
- return date.toZoned(value, 'Europe/Oslo');
174
+ if (!('day' in value)) return date.toZoned(date.toCalendarDateTime(date.today(timezone), value), timezone);
175
+ return date.toZoned(value, timezone);
176
+ case 'Time':
177
+ if (!('hour' in value)) return date.toTime(date.now(timezone));
178
+ if (!('day' in value)) return value;
179
+ return date.toTime(value);
169
180
  default:
170
181
  return value;
171
182
  }
172
183
  };
184
+ var modulo = function modulo(a, b) {
185
+ return (a % b + b) % b;
186
+ };
187
+ var focusSegment = function focusSegment(ref, segment) {
188
+ if (ref.current) {
189
+ var segments = ref.current.querySelectorAll('.eds-date-and-time-field__segment');
190
+ var firstSegment = segments[0];
191
+ var lastSegment = segments[segments.length - 1];
192
+ switch (segment) {
193
+ case 'first':
194
+ return firstSegment.focus();
195
+ case 'last':
196
+ return lastSegment.focus();
197
+ }
198
+ }
199
+ };
173
200
 
174
- var _excluded$9 = ["selectedDate", "onChange", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "isDisabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "minDate", "maxDate", "style", "className", "labelProps", "append"];
201
+ var _excluded$a = ["selectedDate", "onChange", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "isDisabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "minDate", "maxDate", "style", "className", "labelProps", "append"];
175
202
  var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
176
203
  var selectedDate = _ref.selectedDate,
177
204
  onChange = _ref.onChange,
@@ -196,7 +223,7 @@ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
196
223
  className = _ref.className,
197
224
  parentLabelProps = _ref.labelProps,
198
225
  append = _ref.append,
199
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
226
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$a);
200
227
  var _useLocale = i18n.useLocale(),
201
228
  locale = _useLocale.locale;
202
229
  var state = datepicker$1.useDateFieldState(_extends({}, rest, {
@@ -237,8 +264,8 @@ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
237
264
  labelTooltip: labelTooltip,
238
265
  labelProps: parentLabelProps != null ? parentLabelProps : labelProps
239
266
  }, fieldProps, {
240
- variant: (variant != null ? variant : state.validationState === 'invalid') ? validationVariant : undefined,
241
- feedback: (feedback != null ? feedback : state.validationState === 'invalid') ? validationFeedback : undefined,
267
+ variant: variant != null ? variant : state.validationState === 'invalid' ? validationVariant : undefined,
268
+ feedback: feedback != null ? feedback : state.validationState === 'invalid' ? validationFeedback : undefined,
242
269
  append: append,
243
270
  ariaAlertOnFeedback: true
244
271
  }), state.segments.map(function (segment, i) {
@@ -250,12 +277,12 @@ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
250
277
  })));
251
278
  });
252
279
 
253
- var _excluded$8 = ["children", "className", "style"];
280
+ var _excluded$9 = ["children", "className", "style"];
254
281
  var CalendarButton = function CalendarButton(_ref) {
255
282
  var children = _ref.children,
256
283
  className = _ref.className,
257
284
  style = _ref.style,
258
- props = _objectWithoutPropertiesLoose(_ref, _excluded$8);
285
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$9);
259
286
  var ref = React.useRef(null);
260
287
  var _useButton = button.useButton(props, ref),
261
288
  buttonProps = _useButton.buttonProps;
@@ -266,16 +293,18 @@ var CalendarButton = function CalendarButton(_ref) {
266
293
  }), children);
267
294
  };
268
295
 
269
- var _excluded$7 = ["state", "date", "onSelectedCellClick"];
296
+ var _excluded$8 = ["state", "date", "onSelectedCellClick", "classNameForDate", "ariaLabelForDate"];
270
297
  var CalendarCell = function CalendarCell(_ref) {
271
- var _state$timeZone;
298
+ var _ariaLabelForDate, _classNameForDate, _state$timeZone;
272
299
  var state = _ref.state,
273
300
  date$1 = _ref.date,
274
301
  _ref$onSelectedCellCl = _ref.onSelectedCellClick,
275
302
  onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
276
303
  return;
277
304
  } : _ref$onSelectedCellCl,
278
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
305
+ classNameForDate = _ref.classNameForDate,
306
+ ariaLabelForDate = _ref.ariaLabelForDate,
307
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
279
308
  var cellRef = React.useRef(null);
280
309
  var _useCalendarCell = calendar.useCalendarCell({
281
310
  date: date$1
@@ -287,12 +316,14 @@ var CalendarCell = function CalendarCell(_ref) {
287
316
  isDisabled = _useCalendarCell.isDisabled,
288
317
  isUnavailable = _useCalendarCell.isUnavailable,
289
318
  formattedDate = _useCalendarCell.formattedDate;
319
+ var ariaLabel = buttonProps['aria-label'] + " " + ((_ariaLabelForDate = ariaLabelForDate == null ? void 0 : ariaLabelForDate(date$1)) != null ? _ariaLabelForDate : '');
290
320
  return React.createElement("td", _extends({}, cellProps, {
291
321
  className: "eds-datepicker__calendar__grid__cell__td"
292
322
  }), React.createElement("div", _extends({}, buttonProps, {
323
+ "aria-label": ariaLabel,
293
324
  ref: cellRef,
294
325
  hidden: isOutsideVisibleRange,
295
- className: classNames('eds-datepicker__calendar__grid__cell', {
326
+ className: classNames('eds-datepicker__calendar__grid__cell', [(_classNameForDate = classNameForDate == null ? void 0 : classNameForDate(date$1)) != null ? _classNameForDate : ''], {
296
327
  'eds-datepicker__calendar__grid__cell--selected': isSelected,
297
328
  'eds-datepicker__calendar__grid__cell--disabled': isDisabled || isUnavailable,
298
329
  'eds-datepicker__calendar__grid__cell--outside-month': isOutsideVisibleRange,
@@ -310,7 +341,7 @@ var CalendarCell = function CalendarCell(_ref) {
310
341
  }), formattedDate));
311
342
  };
312
343
 
313
- var _excluded$6 = ["state", "navigationDescription", "onSelectedCellClick"];
344
+ var _excluded$7 = ["state", "navigationDescription", "onSelectedCellClick", "classNameForDate", "ariaLabelForDate"];
314
345
  var CalendarGrid = function CalendarGrid(_ref) {
315
346
  var state = _ref.state,
316
347
  navigationDescription = _ref.navigationDescription,
@@ -318,7 +349,9 @@ var CalendarGrid = function CalendarGrid(_ref) {
318
349
  onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
319
350
  return;
320
351
  } : _ref$onSelectedCellCl,
321
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
352
+ classNameForDate = _ref.classNameForDate,
353
+ ariaLabelForDate = _ref.ariaLabelForDate,
354
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
322
355
  var calendarGridId = utils.useRandomId('eds-calendar');
323
356
  var _useLocale = i18n.useLocale(),
324
357
  locale = _useLocale.locale;
@@ -359,7 +392,9 @@ var CalendarGrid = function CalendarGrid(_ref) {
359
392
  state: state,
360
393
  date: date,
361
394
  "aria-describedby": calendarGridId + 'description',
362
- onSelectedCellClick: onSelectedCellClick
395
+ onSelectedCellClick: onSelectedCellClick,
396
+ classNameForDate: classNameForDate,
397
+ ariaLabelForDate: ariaLabelForDate
363
398
  }) : React.createElement("td", {
364
399
  key: i
365
400
  });
@@ -369,7 +404,7 @@ var CalendarGrid = function CalendarGrid(_ref) {
369
404
  }, getNavigationDescription()));
370
405
  };
371
406
 
372
- var _excluded$5 = ["selectedDate", "onChange", "locale", "minDate", "maxDate", "style", "children", "navigationDescription", "onSelectedCellClick"];
407
+ var _excluded$6 = ["selectedDate", "onChange", "locale", "minDate", "maxDate", "style", "children", "navigationDescription", "onSelectedCellClick", "classNameForDate", "ariaLabelForDate"];
373
408
  var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
374
409
  var selectedDate = _ref.selectedDate,
375
410
  onChange = _ref.onChange,
@@ -382,7 +417,9 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
382
417
  onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
383
418
  return;
384
419
  } : _ref$onSelectedCellCl,
385
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
420
+ classNameForDate = _ref.classNameForDate,
421
+ ariaLabelForDate = _ref.ariaLabelForDate,
422
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
386
423
  var _useLocale = i18n.useLocale(),
387
424
  locale = _useLocale.locale;
388
425
  var allProps = _extends({}, rest, {
@@ -423,11 +460,13 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
423
460
  }))), React.createElement(CalendarGrid, {
424
461
  state: state,
425
462
  navigationDescription: navigationDescription,
426
- onSelectedCellClick: onSelectedCellClick
463
+ onSelectedCellClick: onSelectedCellClick,
464
+ classNameForDate: classNameForDate,
465
+ ariaLabelForDate: ariaLabelForDate
427
466
  })));
428
467
  });
429
468
 
430
- var _excluded$4 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold", "forcedReturnType"];
469
+ var _excluded$5 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "classNameForDate", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold", "forcedReturnType", "ariaLabelForDate"];
431
470
  var DatePicker = function DatePicker(_ref) {
432
471
  var selectedDate = _ref.selectedDate,
433
472
  onChange = _ref.onChange,
@@ -436,6 +475,7 @@ var DatePicker = function DatePicker(_ref) {
436
475
  showTime = _ref.showTime,
437
476
  _ref$showTimeZone = _ref.showTimeZone,
438
477
  showTimeZone = _ref$showTimeZone === void 0 ? false : _ref$showTimeZone,
478
+ classNameForDate = _ref.classNameForDate,
439
479
  className = _ref.className,
440
480
  variant = _ref.variant,
441
481
  feedback = _ref.feedback,
@@ -450,7 +490,8 @@ var DatePicker = function DatePicker(_ref) {
450
490
  _ref$modalTreshold = _ref.modalTreshold,
451
491
  modalTreshold = _ref$modalTreshold === void 0 ? 1000 : _ref$modalTreshold,
452
492
  forcedReturnType = _ref.forcedReturnType,
453
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
493
+ ariaLabelForDate = _ref.ariaLabelForDate,
494
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
454
495
  var CALENDAR_MODAL_MAX_SCREEN_WIDTH = modalTreshold;
455
496
  var datePickerRef = React.useRef(null);
456
497
  var calendarRef = React.useRef(null);
@@ -461,7 +502,8 @@ var DatePicker = function DatePicker(_ref) {
461
502
  if (forcedReturnType !== undefined) {
462
503
  return onChange(convertValueToType({
463
504
  value: value,
464
- type: forcedReturnType
505
+ type: forcedReturnType,
506
+ timezone: value !== null && 'timezone' in value ? value.timezone : undefined
465
507
  }));
466
508
  }
467
509
  onChange(value);
@@ -511,7 +553,9 @@ var DatePicker = function DatePicker(_ref) {
511
553
  onChange: handleOnChange,
512
554
  minDate: minDate,
513
555
  maxDate: maxDate,
514
- ref: calendarRef
556
+ ref: calendarRef,
557
+ classNameForDate: classNameForDate,
558
+ ariaLabelForDate: ariaLabelForDate
515
559
  });
516
560
  var useModal = typeof width !== 'undefined' && width <= CALENDAR_MODAL_MAX_SCREEN_WIDTH && !disableModal;
517
561
  var popoverCalendar = React.createElement("div", {
@@ -581,7 +625,7 @@ var DatePicker = function DatePicker(_ref) {
581
625
  }), React.createElement(icons.CalendarIcon, null)), useModal ? modalCalendar : popoverCalendar)));
582
626
  };
583
627
 
584
- var _excluded$3 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
628
+ var _excluded$4 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
585
629
  _excluded2$2 = ["onChange", "variant", "value"];
586
630
  var NativeDatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
587
631
  var className = _ref.className,
@@ -595,7 +639,7 @@ var NativeDatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
595
639
  prepend = _ref$prepend === void 0 ? React.createElement(icons.DateIcon, {
596
640
  inline: true
597
641
  }) : _ref$prepend,
598
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
642
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
599
643
  var nativedatepickerId = utils.useRandomId('eds-nativetimepicker');
600
644
  return React.createElement(form.BaseFormControl, {
601
645
  style: style,
@@ -654,12 +698,14 @@ var NativeDatePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
654
698
  }, rest));
655
699
  });
656
700
 
701
+ var _excluded$3 = ["direction", "onClick", "disabled", "aria-label"];
657
702
  var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
658
703
  var direction = _ref.direction,
659
704
  onClick = _ref.onClick,
660
705
  disabled = _ref.disabled,
661
- ariaLabel = _ref['aria-label'];
662
- return React.createElement(button$1.IconButton, {
706
+ ariaLabel = _ref['aria-label'],
707
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
708
+ return React.createElement(button$1.IconButton, _extends({
663
709
  className: classNames('eds-timepicker__arrowbutton', "eds-timepicker__arrowbutton--" + direction, {
664
710
  'eds-timepicker__arrowbutton--disabled': disabled
665
711
  }),
@@ -668,10 +714,10 @@ var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
668
714
  onClick: onClick,
669
715
  "aria-label": ariaLabel,
670
716
  disabled: disabled
671
- }, direction === 'left' ? React.createElement(icons.LeftArrowIcon, null) : React.createElement(icons.RightArrowIcon, null));
717
+ }, rest), direction === 'left' ? React.createElement(icons.LeftArrowIcon, null) : React.createElement(icons.RightArrowIcon, null));
672
718
  };
673
719
 
674
- var _excluded$2 = ["selectedTime", "onChange", "disabled", "className", "style", "label", "labelTooltip", "feedback", "variant", "locale", "showTimeZone", "minuteIncrementForArrowButtons", "leftArrowButtonAriaLabel", "rightArrowButtonAriaLabel", "inputRef"];
720
+ var _excluded$2 = ["selectedTime", "onChange", "disabled", "className", "style", "label", "labelTooltip", "feedback", "granularity", "variant", "locale", "showTimeZone", "showSeconds", "minuteIncrementForArrowButtons", "leftArrowButtonAriaLabel", "rightArrowButtonAriaLabel", "inputRef", "forcedReturnType", "forcedTimeZone"];
675
721
  var TimePicker = function TimePicker(_ref) {
676
722
  var selectedTime = _ref.selectedTime,
677
723
  onChange = _ref.onChange,
@@ -681,9 +727,12 @@ var TimePicker = function TimePicker(_ref) {
681
727
  label = _ref.label,
682
728
  labelTooltip = _ref.labelTooltip,
683
729
  feedback = _ref.feedback,
730
+ granularity = _ref.granularity,
684
731
  variant = _ref.variant,
685
732
  customLocale = _ref.locale,
686
733
  showTimeZone = _ref.showTimeZone,
734
+ _ref$showSeconds = _ref.showSeconds,
735
+ showSeconds = _ref$showSeconds === void 0 ? false : _ref$showSeconds,
687
736
  _ref$minuteIncrementF = _ref.minuteIncrementForArrowButtons,
688
737
  minuteIncrementForArrowButtons = _ref$minuteIncrementF === void 0 ? 30 : _ref$minuteIncrementF,
689
738
  _ref$leftArrowButtonA = _ref.leftArrowButtonAriaLabel,
@@ -691,15 +740,30 @@ var TimePicker = function TimePicker(_ref) {
691
740
  _ref$rightArrowButton = _ref.rightArrowButtonAriaLabel,
692
741
  rightArrowButtonAriaLabel = _ref$rightArrowButton === void 0 ? "Legg til " + minuteIncrementForArrowButtons + " minutter" : _ref$rightArrowButton,
693
742
  inputRef = _ref.inputRef,
743
+ forcedReturnType = _ref.forcedReturnType,
744
+ forcedTimeZone = _ref.forcedTimeZone,
694
745
  rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
695
746
  var _useLocale = i18n.useLocale(),
696
747
  locale = _useLocale.locale;
697
748
  if (customLocale) locale = customLocale;
749
+ var timePickerId = utils.useRandomId('eds-timepicker');
750
+ var timeZone = forcedTimeZone != null ? forcedTimeZone : selectedTime !== null && 'timezone' in selectedTime ? selectedTime.timezone : 'Europe/Oslo';
751
+ var handleOnChange = function handleOnChange(value) {
752
+ if (forcedReturnType !== undefined) {
753
+ return onChange(convertValueToType({
754
+ value: value,
755
+ type: forcedReturnType,
756
+ timezone: timeZone
757
+ }));
758
+ }
759
+ onChange(value);
760
+ };
698
761
  var state = datepicker$1.useTimeFieldState(_extends({
699
- onChange: onChange,
762
+ onChange: handleOnChange,
700
763
  label: label,
701
764
  locale: locale,
702
765
  value: selectedTime,
766
+ granularity: (granularity != null ? granularity : showSeconds) ? 'second' : 'minute',
703
767
  hideTimeZone: !showTimeZone,
704
768
  isDisabled: disabled,
705
769
  shouldForceLeadingZeros: true
@@ -711,70 +775,81 @@ var TimePicker = function TimePicker(_ref) {
711
775
  labelProps = _useTimeField.labelProps,
712
776
  fieldProps = _useTimeField.fieldProps;
713
777
  var id = utils.useRandomId('timepicker');
714
- var handleOnClickArrowButton = function handleOnClickArrowButton(minutes) {
715
- if (someSegmentIsUndefined) {
716
- setTimeToNearestMinuteIncrement();
717
- } else {
718
- addMinutesToSelectedTime(minutes);
719
- }
720
- };
721
- var someSegmentIsUndefined = state.segments.some(function (segment) {
722
- return segment.text === '––';
723
- });
724
- var setTimeToNearestMinuteIncrement = function setTimeToNearestMinuteIncrement() {
725
- var currentTime = date.now(date.getLocalTimeZone());
726
- var roundedMinute = Math.floor(currentTime.minute / minuteIncrementForArrowButtons) * minuteIncrementForArrowButtons;
727
- var newTime = currentTime.set({
728
- minute: roundedMinute
778
+ var getCurrentTime = function getCurrentTime() {
779
+ var getCurrentTimeWithCorrectType = convertValueToType({
780
+ value: date.now(timeZone),
781
+ type: forcedReturnType != null ? forcedReturnType : 'ZonedDateTime'
729
782
  });
730
- // @ts-expect-error Since this function is used when selectedTime is null,
731
- // we can't guarantee newTime matching the type of selectedTime in the future.
732
- // This might lead to a type issue.
733
- onChange(newTime);
783
+ return getCurrentTimeWithCorrectType;
734
784
  };
735
- var addMinutesToSelectedTime = function addMinutesToSelectedTime(minutes) {
736
- selectedTime !== null && onChange(selectedTime.add({
737
- minutes: minutes
738
- }));
785
+ var handleOnClickArrowButton = function handleOnClickArrowButton(operation) {
786
+ if (selectedTime === null) return handleOnChange(getCurrentTime());
787
+ switch (operation) {
788
+ case 'add':
789
+ return handleOnChange(selectedTime.add({
790
+ minutes: minuteIncrementForArrowButtons - modulo(selectedTime.minute, minuteIncrementForArrowButtons)
791
+ }));
792
+ case 'subtract':
793
+ return handleOnChange(selectedTime.subtract({
794
+ minutes: modulo(selectedTime.minute - 1, minuteIncrementForArrowButtons) + 1
795
+ }));
796
+ }
739
797
  };
740
798
  return React.createElement(i18n.I18nProvider, {
741
799
  locale: locale
742
800
  }, React.createElement("div", {
743
801
  className: classNames(className, 'eds-timepicker__wrapper')
744
- }, React.createElement(TimePickerArrowButton, {
745
- direction: "left",
746
- disabled: disabled,
747
- "aria-label": leftArrowButtonAriaLabel,
748
- onClick: function onClick() {
749
- return handleOnClickArrowButton(minuteIncrementForArrowButtons * -1);
750
- }
751
- }), React.createElement(form.BaseFormControl, _extends({
802
+ }, React.createElement(form.BaseFormControl, _extends({
752
803
  style: style,
753
- className: 'eds-timepicker',
804
+ className: classNames('eds-timepicker', {
805
+ 'eds-timepicker--disabled': disabled
806
+ }),
754
807
  labelId: id,
755
808
  label: label,
756
- labelProps: _extends({}, labelProps),
809
+ labelProps: _extends({}, labelProps, {
810
+ 'aria-describedby': timePickerId + 'description'
811
+ }),
757
812
  ref: utils.mergeRefs(timeFieldRef, inputRef),
758
813
  disabled: disabled,
759
814
  disableLabelAnimation: true,
760
815
  labelTooltip: labelTooltip
761
816
  }, fieldProps, {
762
817
  variant: variant,
763
- feedback: feedback
818
+ feedback: feedback,
819
+ ariaAlertOnFeedback: true,
820
+ "aria-describedby": timePickerId + 'description',
821
+ prepend: React.createElement(TimePickerArrowButton, {
822
+ direction: "left",
823
+ disabled: disabled,
824
+ "aria-label": leftArrowButtonAriaLabel,
825
+ onClick: function onClick() {
826
+ return handleOnClickArrowButton('subtract');
827
+ },
828
+ onFocus: function onFocus() {
829
+ return focusSegment(timeFieldRef, 'first');
830
+ }
831
+ }),
832
+ append: React.createElement(TimePickerArrowButton, {
833
+ direction: "right",
834
+ disabled: disabled,
835
+ "aria-label": rightArrowButtonAriaLabel,
836
+ onClick: function onClick() {
837
+ return handleOnClickArrowButton('add');
838
+ },
839
+ onFocus: function onFocus() {
840
+ return focusSegment(timeFieldRef, 'last');
841
+ }
842
+ })
764
843
  }), state.segments.map(function (segment, i) {
765
844
  return React.createElement(FieldSegment, {
766
845
  segment: segment,
767
846
  state: state,
768
- key: i
847
+ key: i,
848
+ "aria-describedby": timePickerId + 'description'
769
849
  });
770
- })), React.createElement(TimePickerArrowButton, {
771
- direction: "right",
772
- disabled: disabled,
773
- "aria-label": rightArrowButtonAriaLabel,
774
- onClick: function onClick() {
775
- return handleOnClickArrowButton(minuteIncrementForArrowButtons);
776
- }
777
- })));
850
+ })), React.createElement(a11y.VisuallyHidden, {
851
+ id: timePickerId + 'description'
852
+ }, selectedTime !== null ? 'valgt tid: ' + selectedTime.hour.toString().padStart(2, '0') + ':' + selectedTime.minute.toString().padStart(2, '0') + (showSeconds ? ':' + selectedTime.second.toString().padStart(2, '0') : '') : '')));
778
853
  };
779
854
 
780
855
  var _excluded$1 = ["className", "style", "onChange", "label", "feedback", "variant", "prepend"],
@@ -1063,7 +1138,9 @@ exports.TimePicker = TimePicker;
1063
1138
  exports.ariaLabelIfNorwegian = ariaLabelIfNorwegian;
1064
1139
  exports.convertValueToType = convertValueToType;
1065
1140
  exports.createCalendar = createCalendar;
1141
+ exports.focusSegment = focusSegment;
1066
1142
  exports.lastMillisecondOfDay = lastMillisecondOfDay;
1143
+ exports.modulo = modulo;
1067
1144
  exports.nativeDateToDateValue = nativeDateToDateValue;
1068
1145
  exports.nativeDateToTimeValue = nativeDateToTimeValue;
1069
1146
  exports.timeOrDateValueToNativeDate = timeOrDateValueToNativeDate;