@react-aria/datepicker 3.10.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/ar-AE.mjs +1 -1
  2. package/dist/bg-BG.mjs +1 -1
  3. package/dist/cs-CZ.mjs +1 -1
  4. package/dist/da-DK.mjs +1 -1
  5. package/dist/de-DE.mjs +1 -1
  6. package/dist/el-GR.mjs +1 -1
  7. package/dist/en-US.mjs +1 -1
  8. package/dist/es-ES.mjs +1 -1
  9. package/dist/et-EE.mjs +1 -1
  10. package/dist/fi-FI.mjs +1 -1
  11. package/dist/fr-FR.mjs +1 -1
  12. package/dist/he-IL.mjs +1 -1
  13. package/dist/hr-HR.mjs +1 -1
  14. package/dist/hu-HU.mjs +1 -1
  15. package/dist/intlStrings.mjs +1 -1
  16. package/dist/it-IT.mjs +1 -1
  17. package/dist/ja-JP.mjs +1 -1
  18. package/dist/ko-KR.mjs +1 -1
  19. package/dist/lt-LT.mjs +1 -1
  20. package/dist/lv-LV.mjs +1 -1
  21. package/dist/nb-NO.mjs +1 -1
  22. package/dist/nl-NL.mjs +1 -1
  23. package/dist/pl-PL.mjs +1 -1
  24. package/dist/pt-BR.mjs +1 -1
  25. package/dist/pt-PT.mjs +1 -1
  26. package/dist/ro-RO.mjs +1 -1
  27. package/dist/ru-RU.mjs +1 -1
  28. package/dist/sk-SK.mjs +1 -1
  29. package/dist/sl-SI.mjs +1 -1
  30. package/dist/sr-SP.mjs +1 -1
  31. package/dist/sv-SE.mjs +1 -1
  32. package/dist/tr-TR.mjs +1 -1
  33. package/dist/types.d.ts +10 -10
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/uk-UA.mjs +1 -1
  36. package/dist/useDateField.main.js +27 -26
  37. package/dist/useDateField.main.js.map +1 -1
  38. package/dist/useDateField.mjs +28 -27
  39. package/dist/useDateField.module.js +27 -26
  40. package/dist/useDateField.module.js.map +1 -1
  41. package/dist/useDatePicker.main.js +23 -23
  42. package/dist/useDatePicker.main.js.map +1 -1
  43. package/dist/useDatePicker.mjs +24 -24
  44. package/dist/useDatePicker.module.js +23 -23
  45. package/dist/useDatePicker.module.js.map +1 -1
  46. package/dist/useDatePickerGroup.main.js +10 -10
  47. package/dist/useDatePickerGroup.main.js.map +1 -1
  48. package/dist/useDatePickerGroup.mjs +11 -11
  49. package/dist/useDatePickerGroup.module.js +10 -10
  50. package/dist/useDatePickerGroup.module.js.map +1 -1
  51. package/dist/useDateRangePicker.main.js +28 -28
  52. package/dist/useDateRangePicker.main.js.map +1 -1
  53. package/dist/useDateRangePicker.mjs +29 -29
  54. package/dist/useDateRangePicker.module.js +28 -28
  55. package/dist/useDateRangePicker.module.js.map +1 -1
  56. package/dist/useDateSegment.main.js +79 -72
  57. package/dist/useDateSegment.main.js.map +1 -1
  58. package/dist/useDateSegment.mjs +80 -73
  59. package/dist/useDateSegment.module.js +79 -72
  60. package/dist/useDateSegment.module.js.map +1 -1
  61. package/dist/useDisplayNames.main.js +2 -2
  62. package/dist/useDisplayNames.mjs +3 -3
  63. package/dist/useDisplayNames.module.js +2 -2
  64. package/dist/zh-CN.mjs +1 -1
  65. package/dist/zh-TW.mjs +1 -1
  66. package/package.json +21 -21
  67. package/src/useDateField.ts +8 -7
  68. package/src/useDatePicker.ts +3 -3
  69. package/src/useDatePickerGroup.ts +4 -4
  70. package/src/useDateRangePicker.ts +3 -3
  71. package/src/useDateSegment.ts +15 -5
@@ -13,9 +13,9 @@
13
13
  import {AriaDateFieldProps as AriaDateFieldPropsBase, AriaTimeFieldProps, DateValue, TimeValue} from '@react-types/datepicker';
14
14
  import {createFocusManager, FocusManager} from '@react-aria/focus';
15
15
  import {DateFieldState, TimeFieldState} from '@react-stately/datepicker';
16
- import {DOMAttributes, GroupDOMAttributes, KeyboardEvent, ValidationResult} from '@react-types/shared';
16
+ import {DOMAttributes, GroupDOMAttributes, KeyboardEvent, RefObject, ValidationResult} from '@react-types/shared';
17
17
  import {filterDOMProps, mergeProps, useDescription, useFormReset} from '@react-aria/utils';
18
- import {InputHTMLAttributes, RefObject, useEffect, useMemo, useRef} from 'react';
18
+ import {InputHTMLAttributes, useEffect, useMemo, useRef} from 'react';
19
19
  // @ts-ignore
20
20
  import intlMessages from '../intl/*.json';
21
21
  import {useDatePickerGroup} from './useDatePickerGroup';
@@ -27,7 +27,7 @@ import {useLocalizedStringFormatter} from '@react-aria/i18n';
27
27
  // Allows this hook to also be used with TimeField
28
28
  export interface AriaDateFieldOptions<T extends DateValue> extends Omit<AriaDateFieldPropsBase<T>, 'value' | 'defaultValue' | 'onChange' | 'minValue' | 'maxValue' | 'placeholderValue' | 'validate'> {
29
29
  /** A ref for the hidden input element for HTML form submission. */
30
- inputRef?: RefObject<HTMLInputElement>
30
+ inputRef?: RefObject<HTMLInputElement | null>
31
31
  }
32
32
 
33
33
  export interface DateFieldAria extends ValidationResult {
@@ -63,7 +63,7 @@ export const focusManagerSymbol = '__focusManager_' + Date.now();
63
63
  * A date field allows users to enter and edit date and time values using a keyboard.
64
64
  * Each part of a date value is displayed in an individually editable segment.
65
65
  */
66
- export function useDateField<T extends DateValue>(props: AriaDateFieldOptions<T>, state: DateFieldState, ref: RefObject<Element>): DateFieldAria {
66
+ export function useDateField<T extends DateValue>(props: AriaDateFieldOptions<T>, state: DateFieldState, ref: RefObject<Element | null>): DateFieldAria {
67
67
  let {isInvalid, validationErrors, validationDetails} = state.displayValidation;
68
68
  let {labelProps, fieldProps, descriptionProps, errorMessageProps} = useField({
69
69
  ...props,
@@ -149,7 +149,8 @@ export function useDateField<T extends DateValue>(props: AriaDateFieldOptions<T>
149
149
  let inputProps: InputHTMLAttributes<HTMLInputElement> = {
150
150
  type: 'hidden',
151
151
  name: props.name,
152
- value: state.value?.toString() || ''
152
+ value: state.value?.toString() || '',
153
+ disabled: props.isDisabled
153
154
  };
154
155
 
155
156
  if (props.validationBehavior === 'native') {
@@ -193,7 +194,7 @@ export function useDateField<T extends DateValue>(props: AriaDateFieldOptions<T>
193
194
 
194
195
  export interface AriaTimeFieldOptions<T extends TimeValue> extends AriaTimeFieldProps<T> {
195
196
  /** A ref for the hidden input element for HTML form submission. */
196
- inputRef?: RefObject<HTMLInputElement>
197
+ inputRef?: RefObject<HTMLInputElement | null>
197
198
  }
198
199
 
199
200
  /**
@@ -201,7 +202,7 @@ export interface AriaTimeFieldOptions<T extends TimeValue> extends AriaTimeField
201
202
  * A time field allows users to enter and edit time values using a keyboard.
202
203
  * Each part of a time value is displayed in an individually editable segment.
203
204
  */
204
- export function useTimeField<T extends TimeValue>(props: AriaTimeFieldOptions<T>, state: TimeFieldState, ref: RefObject<Element>): DateFieldAria {
205
+ export function useTimeField<T extends TimeValue>(props: AriaTimeFieldOptions<T>, state: TimeFieldState, ref: RefObject<Element | null>): DateFieldAria {
205
206
  let res = useDateField(props, state, ref);
206
207
  res.inputProps.value = state.timeValue?.toString() || '';
207
208
  return res;
@@ -16,17 +16,17 @@ import {AriaDialogProps} from '@react-types/dialog';
16
16
  import {CalendarProps} from '@react-types/calendar';
17
17
  import {createFocusManager} from '@react-aria/focus';
18
18
  import {DatePickerState} from '@react-stately/datepicker';
19
- import {DOMAttributes, GroupDOMAttributes, KeyboardEvent, ValidationResult} from '@react-types/shared';
19
+ import {DOMAttributes, GroupDOMAttributes, KeyboardEvent, RefObject, ValidationResult} from '@react-types/shared';
20
20
  import {filterDOMProps, mergeProps, useDescription, useId} from '@react-aria/utils';
21
21
  // @ts-ignore
22
22
  import intlMessages from '../intl/*.json';
23
23
  import {privateValidationStateProp} from '@react-stately/form';
24
- import {RefObject, useMemo} from 'react';
25
24
  import {roleSymbol} from './useDateField';
26
25
  import {useDatePickerGroup} from './useDatePickerGroup';
27
26
  import {useField} from '@react-aria/label';
28
27
  import {useFocusWithin} from '@react-aria/interactions';
29
28
  import {useLocale, useLocalizedStringFormatter} from '@react-aria/i18n';
29
+ import {useMemo} from 'react';
30
30
 
31
31
  export interface DatePickerAria extends ValidationResult {
32
32
  /** Props for the date picker's visible label element, if any. */
@@ -51,7 +51,7 @@ export interface DatePickerAria extends ValidationResult {
51
51
  * Provides the behavior and accessibility implementation for a date picker component.
52
52
  * A date picker combines a DateField and a Calendar popover to allow users to enter or select a date and time value.
53
53
  */
54
- export function useDatePicker<T extends DateValue>(props: AriaDatePickerProps<T>, state: DatePickerState, ref: RefObject<Element>): DatePickerAria {
54
+ export function useDatePicker<T extends DateValue>(props: AriaDatePickerProps<T>, state: DatePickerState, ref: RefObject<Element | null>): DatePickerAria {
55
55
  let buttonId = useId();
56
56
  let dialogId = useId();
57
57
  let fieldId = useId();
@@ -1,12 +1,12 @@
1
1
  import {createFocusManager, getFocusableTreeWalker} from '@react-aria/focus';
2
2
  import {DateFieldState, DatePickerState, DateRangePickerState} from '@react-stately/datepicker';
3
- import {FocusableElement, KeyboardEvent} from '@react-types/shared';
3
+ import {FocusableElement, KeyboardEvent, RefObject} from '@react-types/shared';
4
4
  import {mergeProps} from '@react-aria/utils';
5
- import {RefObject, useMemo} from 'react';
6
5
  import {useLocale} from '@react-aria/i18n';
6
+ import {useMemo} from 'react';
7
7
  import {usePress} from '@react-aria/interactions';
8
8
 
9
- export function useDatePickerGroup(state: DatePickerState | DateRangePickerState | DateFieldState, ref: RefObject<Element>, disableArrowNavigation?: boolean) {
9
+ export function useDatePickerGroup(state: DatePickerState | DateRangePickerState | DateFieldState, ref: RefObject<Element | null>, disableArrowNavigation?: boolean) {
10
10
  let {direction} = useLocale();
11
11
  let focusManager = useMemo(() => createFocusManager(ref), [ref]);
12
12
 
@@ -15,7 +15,7 @@ export function useDatePickerGroup(state: DatePickerState | DateRangePickerState
15
15
  if (!e.currentTarget.contains(e.target)) {
16
16
  return;
17
17
  }
18
-
18
+
19
19
  if (e.altKey && (e.key === 'ArrowDown' || e.key === 'ArrowUp') && 'setOpen' in state) {
20
20
  e.preventDefault();
21
21
  e.stopPropagation();
@@ -16,17 +16,17 @@ import {AriaDialogProps} from '@react-types/dialog';
16
16
  import {createFocusManager} from '@react-aria/focus';
17
17
  import {DateRangePickerState} from '@react-stately/datepicker';
18
18
  import {DEFAULT_VALIDATION_RESULT, mergeValidation, privateValidationStateProp} from '@react-stately/form';
19
- import {DOMAttributes, GroupDOMAttributes, KeyboardEvent, ValidationResult} from '@react-types/shared';
19
+ import {DOMAttributes, GroupDOMAttributes, KeyboardEvent, RefObject, ValidationResult} from '@react-types/shared';
20
20
  import {filterDOMProps, mergeProps, useDescription, useId} from '@react-aria/utils';
21
21
  import {focusManagerSymbol, roleSymbol} from './useDateField';
22
22
  // @ts-ignore
23
23
  import intlMessages from '../intl/*.json';
24
24
  import {RangeCalendarProps} from '@react-types/calendar';
25
- import {RefObject, useMemo, useRef} from 'react';
26
25
  import {useDatePickerGroup} from './useDatePickerGroup';
27
26
  import {useField} from '@react-aria/label';
28
27
  import {useFocusWithin} from '@react-aria/interactions';
29
28
  import {useLocale, useLocalizedStringFormatter} from '@react-aria/i18n';
29
+ import {useMemo, useRef} from 'react';
30
30
 
31
31
  export interface DateRangePickerAria extends ValidationResult {
32
32
  /** Props for the date range picker's visible label element, if any. */
@@ -54,7 +54,7 @@ export interface DateRangePickerAria extends ValidationResult {
54
54
  * A date range picker combines two DateFields and a RangeCalendar popover to allow
55
55
  * users to enter or select a date and time range.
56
56
  */
57
- export function useDateRangePicker<T extends DateValue>(props: AriaDateRangePickerProps<T>, state: DateRangePickerState, ref: RefObject<Element>): DateRangePickerAria {
57
+ export function useDateRangePicker<T extends DateValue>(props: AriaDateRangePickerProps<T>, state: DateRangePickerState, ref: RefObject<Element | null>): DateRangePickerAria {
58
58
  let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-aria/datepicker');
59
59
  let {isInvalid, validationErrors, validationDetails} = state.displayValidation;
60
60
  let {labelProps, fieldProps, descriptionProps, errorMessageProps} = useField({
@@ -12,18 +12,18 @@
12
12
 
13
13
  import {CalendarDate, toCalendar} from '@internationalized/date';
14
14
  import {DateFieldState, DateSegment} from '@react-stately/datepicker';
15
- import {DOMAttributes} from '@react-types/shared';
16
15
  import {getScrollParent, isIOS, isMac, mergeProps, scrollIntoViewport, useEvent, useId, useLabels, useLayoutEffect} from '@react-aria/utils';
17
16
  import {hookData} from './useDateField';
18
17
  import {NumberParser} from '@internationalized/number';
19
- import React, {RefObject, useMemo, useRef} from 'react';
18
+ import React, {useMemo, useRef} from 'react';
19
+ import {RefObject} from '@react-types/shared';
20
20
  import {useDateFormatter, useFilter, useLocale} from '@react-aria/i18n';
21
21
  import {useDisplayNames} from './useDisplayNames';
22
22
  import {useSpinButton} from '@react-aria/spinbutton';
23
23
 
24
24
  export interface DateSegmentAria {
25
25
  /** Props for the segment element. */
26
- segmentProps: DOMAttributes
26
+ segmentProps: React.HTMLAttributes<HTMLDivElement>
27
27
  }
28
28
 
29
29
  /**
@@ -31,7 +31,7 @@ export interface DateSegmentAria {
31
31
  * A date segment displays an individual unit of a date and time, and allows users to edit
32
32
  * the value by typing or using the arrow keys to increment and decrement.
33
33
  */
34
- export function useDateSegment(segment: DateSegment, state: DateFieldState, ref: RefObject<HTMLElement>): DateSegmentAria {
34
+ export function useDateSegment(segment: DateSegment, state: DateFieldState, ref: RefObject<HTMLElement | null>): DateSegmentAria {
35
35
  let enteredKeys = useRef('');
36
36
  let {locale} = useLocale();
37
37
  let displayNames = useDisplayNames();
@@ -269,6 +269,17 @@ export function useDateSegment(segment: DateSegment, state: DateFieldState, ref:
269
269
  selection.collapse(ref.current);
270
270
  };
271
271
 
272
+ let documentRef = useRef(typeof document !== 'undefined' ? document : null);
273
+ useEvent(documentRef, 'selectionchange', () => {
274
+ // Enforce that the selection is collapsed when inside a date segment.
275
+ // Otherwise, when tapping on a segment in Android Chrome and then entering text,
276
+ // composition events will be fired that break the DOM structure and crash the page.
277
+ let selection = window.getSelection();
278
+ if (ref.current.contains(selection.anchorNode)) {
279
+ selection.collapse(ref.current);
280
+ }
281
+ });
282
+
272
283
  let compositionRef = useRef('');
273
284
  // @ts-ignore - TODO: possibly old TS version? doesn't fail in my editor...
274
285
  useEvent(ref, 'beforeinput', e => {
@@ -375,7 +386,6 @@ export function useDateSegment(segment: DateSegment, state: DateFieldState, ref:
375
386
  contentEditable: isEditable,
376
387
  suppressContentEditableWarning: isEditable,
377
388
  spellCheck: isEditable ? 'false' : undefined,
378
- autoCapitalize: isEditable ? 'off' : undefined,
379
389
  autoCorrect: isEditable ? 'off' : undefined,
380
390
  // Capitalization was changed in React 17...
381
391
  [parseInt(React.version, 10) >= 17 ? 'enterKeyHint' : 'enterkeyhint']: isEditable ? 'next' : undefined,