@octanejs/aria 0.0.40 → 0.0.42
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.
- package/LICENSE-APACHE-2.0 +201 -0
- package/README.md +20 -7
- package/UPSTREAM.md +108 -0
- package/package.json +10 -6
- package/src/calendar/useCalendar.tsx +36 -0
- package/src/calendar/useCalendarBase.tsx +142 -0
- package/src/calendar/useCalendarCell.tsx +416 -0
- package/src/calendar/useCalendarGrid.tsx +202 -0
- package/src/calendar/useCalendarHeading.tsx +85 -0
- package/src/calendar/useCalendarMonthPicker.tsx +92 -0
- package/src/calendar/useCalendarYearPicker.tsx +127 -0
- package/src/calendar/useRangeCalendar.tsx +121 -0
- package/src/calendar/utils.tsx +183 -0
- package/src/color/useColorArea.tsx +599 -0
- package/src/color/useColorAreaGradient.tsx +157 -0
- package/src/color/useColorChannelField.tsx +53 -0
- package/src/color/useColorField.tsx +170 -0
- package/src/color/useColorSlider.tsx +177 -0
- package/src/color/useColorSwatch.tsx +83 -0
- package/src/color/useColorWheel.tsx +401 -0
- package/src/compat/react.ts +111 -0
- package/src/components/Calendar.tsx +842 -0
- package/src/components/ColorArea.tsx +120 -0
- package/src/components/ColorField.tsx +304 -0
- package/src/components/ColorPicker.tsx +86 -0
- package/src/components/ColorSlider.tsx +144 -0
- package/src/components/ColorSwatch.tsx +72 -0
- package/src/components/ColorSwatchPicker.tsx +176 -0
- package/src/components/ColorThumb.tsx +140 -0
- package/src/components/ColorWheel.tsx +163 -0
- package/src/components/DateField.tsx +580 -0
- package/src/components/DatePicker.tsx +386 -0
- package/src/components/DropZone.tsx +181 -0
- package/src/components/FileTrigger.tsx +96 -0
- package/src/components/GridLayout.tsx +33 -0
- package/src/components/HiddenDateInput.tsx +169 -0
- package/src/components/TableLayout.tsx +39 -0
- package/src/components/Toast.tsx +336 -0
- package/src/components/Virtualizer.tsx +219 -0
- package/src/components/index.ts +257 -7
- package/src/components/useDragAndDrop.tsx +221 -0
- package/src/components/utils.ts +12 -89
- package/src/datepicker/useDateField.tsx +272 -0
- package/src/datepicker/useDatePicker.tsx +229 -0
- package/src/datepicker/useDatePickerGroup.tsx +147 -0
- package/src/datepicker/useDateRangePicker.tsx +288 -0
- package/src/datepicker/useDateSegment.tsx +439 -0
- package/src/datepicker/useDisplayNames.tsx +53 -0
- package/src/dnd/DragManager.tsx +718 -0
- package/src/dnd/DragPreview.tsx +100 -0
- package/src/dnd/DropTargetKeyboardNavigation.tsx +317 -0
- package/src/dnd/ListDropTargetDelegate.tsx +215 -0
- package/src/dnd/constants.tsx +93 -0
- package/src/dnd/useAutoScroll.tsx +116 -0
- package/src/dnd/useClipboard.tsx +160 -0
- package/src/dnd/useDrag.tsx +437 -0
- package/src/dnd/useDraggableCollection.tsx +35 -0
- package/src/dnd/useDraggableItem.tsx +168 -0
- package/src/dnd/useDrop.tsx +518 -0
- package/src/dnd/useDropIndicator.tsx +129 -0
- package/src/dnd/useDroppableCollection.tsx +808 -0
- package/src/dnd/useDroppableItem.tsx +99 -0
- package/src/dnd/useVirtualDrop.tsx +52 -0
- package/src/dnd/utils.tsx +430 -0
- package/src/intl/calendar/ar-AE.json +14 -0
- package/src/intl/calendar/bg-BG.json +14 -0
- package/src/intl/calendar/cs-CZ.json +14 -0
- package/src/intl/calendar/da-DK.json +14 -0
- package/src/intl/calendar/de-DE.json +14 -0
- package/src/intl/calendar/el-GR.json +14 -0
- package/src/intl/calendar/en-US.json +14 -0
- package/src/intl/calendar/es-ES.json +14 -0
- package/src/intl/calendar/et-EE.json +14 -0
- package/src/intl/calendar/fi-FI.json +14 -0
- package/src/intl/calendar/fr-FR.json +14 -0
- package/src/intl/calendar/he-IL.json +14 -0
- package/src/intl/calendar/hr-HR.json +14 -0
- package/src/intl/calendar/hu-HU.json +14 -0
- package/src/intl/calendar/index.ts +73 -0
- package/src/intl/calendar/it-IT.json +14 -0
- package/src/intl/calendar/ja-JP.json +14 -0
- package/src/intl/calendar/ko-KR.json +14 -0
- package/src/intl/calendar/lt-LT.json +14 -0
- package/src/intl/calendar/lv-LV.json +14 -0
- package/src/intl/calendar/nb-NO.json +14 -0
- package/src/intl/calendar/nl-NL.json +14 -0
- package/src/intl/calendar/pl-PL.json +14 -0
- package/src/intl/calendar/pt-BR.json +14 -0
- package/src/intl/calendar/pt-PT.json +14 -0
- package/src/intl/calendar/ro-RO.json +14 -0
- package/src/intl/calendar/ru-RU.json +14 -0
- package/src/intl/calendar/sk-SK.json +14 -0
- package/src/intl/calendar/sl-SI.json +14 -0
- package/src/intl/calendar/sr-SP.json +14 -0
- package/src/intl/calendar/sv-SE.json +14 -0
- package/src/intl/calendar/tr-TR.json +14 -0
- package/src/intl/calendar/uk-UA.json +14 -0
- package/src/intl/calendar/zh-CN.json +14 -0
- package/src/intl/calendar/zh-TW.json +14 -0
- package/src/intl/color/ar-AE.json +8 -0
- package/src/intl/color/bg-BG.json +8 -0
- package/src/intl/color/cs-CZ.json +8 -0
- package/src/intl/color/da-DK.json +8 -0
- package/src/intl/color/de-DE.json +8 -0
- package/src/intl/color/el-GR.json +8 -0
- package/src/intl/color/en-US.json +8 -0
- package/src/intl/color/es-ES.json +8 -0
- package/src/intl/color/et-EE.json +8 -0
- package/src/intl/color/fi-FI.json +8 -0
- package/src/intl/color/fr-FR.json +8 -0
- package/src/intl/color/he-IL.json +8 -0
- package/src/intl/color/hr-HR.json +8 -0
- package/src/intl/color/hu-HU.json +8 -0
- package/src/intl/color/index.ts +73 -0
- package/src/intl/color/it-IT.json +8 -0
- package/src/intl/color/ja-JP.json +8 -0
- package/src/intl/color/ko-KR.json +8 -0
- package/src/intl/color/lt-LT.json +8 -0
- package/src/intl/color/lv-LV.json +8 -0
- package/src/intl/color/nb-NO.json +8 -0
- package/src/intl/color/nl-NL.json +8 -0
- package/src/intl/color/pl-PL.json +8 -0
- package/src/intl/color/pt-BR.json +8 -0
- package/src/intl/color/pt-PT.json +8 -0
- package/src/intl/color/ro-RO.json +8 -0
- package/src/intl/color/ru-RU.json +8 -0
- package/src/intl/color/sk-SK.json +8 -0
- package/src/intl/color/sl-SI.json +8 -0
- package/src/intl/color/sr-SP.json +8 -0
- package/src/intl/color/sv-SE.json +8 -0
- package/src/intl/color/tr-TR.json +8 -0
- package/src/intl/color/uk-UA.json +8 -0
- package/src/intl/color/zh-CN.json +8 -0
- package/src/intl/color/zh-TW.json +8 -0
- package/src/intl/datepicker/ar-AE.json +18 -0
- package/src/intl/datepicker/bg-BG.json +18 -0
- package/src/intl/datepicker/cs-CZ.json +18 -0
- package/src/intl/datepicker/da-DK.json +18 -0
- package/src/intl/datepicker/de-DE.json +18 -0
- package/src/intl/datepicker/el-GR.json +18 -0
- package/src/intl/datepicker/en-US.json +18 -0
- package/src/intl/datepicker/es-ES.json +18 -0
- package/src/intl/datepicker/et-EE.json +18 -0
- package/src/intl/datepicker/fi-FI.json +18 -0
- package/src/intl/datepicker/fr-FR.json +18 -0
- package/src/intl/datepicker/he-IL.json +18 -0
- package/src/intl/datepicker/hr-HR.json +18 -0
- package/src/intl/datepicker/hu-HU.json +18 -0
- package/src/intl/datepicker/index.ts +73 -0
- package/src/intl/datepicker/it-IT.json +18 -0
- package/src/intl/datepicker/ja-JP.json +18 -0
- package/src/intl/datepicker/ko-KR.json +18 -0
- package/src/intl/datepicker/lt-LT.json +18 -0
- package/src/intl/datepicker/lv-LV.json +18 -0
- package/src/intl/datepicker/nb-NO.json +18 -0
- package/src/intl/datepicker/nl-NL.json +18 -0
- package/src/intl/datepicker/pl-PL.json +18 -0
- package/src/intl/datepicker/pt-BR.json +18 -0
- package/src/intl/datepicker/pt-PT.json +18 -0
- package/src/intl/datepicker/ro-RO.json +18 -0
- package/src/intl/datepicker/ru-RU.json +18 -0
- package/src/intl/datepicker/sk-SK.json +18 -0
- package/src/intl/datepicker/sl-SI.json +18 -0
- package/src/intl/datepicker/sr-SP.json +18 -0
- package/src/intl/datepicker/sv-SE.json +18 -0
- package/src/intl/datepicker/tr-TR.json +18 -0
- package/src/intl/datepicker/uk-UA.json +18 -0
- package/src/intl/datepicker/zh-CN.json +18 -0
- package/src/intl/datepicker/zh-TW.json +18 -0
- package/src/intl/dnd/ar-AE.json +29 -0
- package/src/intl/dnd/bg-BG.json +29 -0
- package/src/intl/dnd/cs-CZ.json +29 -0
- package/src/intl/dnd/da-DK.json +29 -0
- package/src/intl/dnd/de-DE.json +29 -0
- package/src/intl/dnd/el-GR.json +29 -0
- package/src/intl/dnd/en-US.json +29 -0
- package/src/intl/dnd/es-ES.json +29 -0
- package/src/intl/dnd/et-EE.json +29 -0
- package/src/intl/dnd/fi-FI.json +29 -0
- package/src/intl/dnd/fr-FR.json +29 -0
- package/src/intl/dnd/he-IL.json +29 -0
- package/src/intl/dnd/hr-HR.json +29 -0
- package/src/intl/dnd/hu-HU.json +29 -0
- package/src/intl/dnd/index.ts +73 -0
- package/src/intl/dnd/it-IT.json +29 -0
- package/src/intl/dnd/ja-JP.json +29 -0
- package/src/intl/dnd/ko-KR.json +29 -0
- package/src/intl/dnd/lt-LT.json +29 -0
- package/src/intl/dnd/lv-LV.json +29 -0
- package/src/intl/dnd/nb-NO.json +29 -0
- package/src/intl/dnd/nl-NL.json +29 -0
- package/src/intl/dnd/pl-PL.json +29 -0
- package/src/intl/dnd/pt-BR.json +29 -0
- package/src/intl/dnd/pt-PT.json +29 -0
- package/src/intl/dnd/ro-RO.json +29 -0
- package/src/intl/dnd/ru-RU.json +29 -0
- package/src/intl/dnd/sk-SK.json +29 -0
- package/src/intl/dnd/sl-SI.json +29 -0
- package/src/intl/dnd/sr-SP.json +29 -0
- package/src/intl/dnd/sv-SE.json +29 -0
- package/src/intl/dnd/tr-TR.json +29 -0
- package/src/intl/dnd/uk-UA.json +29 -0
- package/src/intl/dnd/zh-CN.json +29 -0
- package/src/intl/dnd/zh-TW.json +29 -0
- package/src/intl/react-aria-components/ar-AE.json +6 -0
- package/src/intl/react-aria-components/bg-BG.json +6 -0
- package/src/intl/react-aria-components/cs-CZ.json +6 -0
- package/src/intl/react-aria-components/da-DK.json +6 -0
- package/src/intl/react-aria-components/de-DE.json +6 -0
- package/src/intl/react-aria-components/el-GR.json +6 -0
- package/src/intl/react-aria-components/en-US.json +6 -0
- package/src/intl/react-aria-components/es-ES.json +6 -0
- package/src/intl/react-aria-components/et-EE.json +6 -0
- package/src/intl/react-aria-components/fi-FI.json +6 -0
- package/src/intl/react-aria-components/fr-FR.json +6 -0
- package/src/intl/react-aria-components/he-IL.json +6 -0
- package/src/intl/react-aria-components/hr-HR.json +6 -0
- package/src/intl/react-aria-components/hu-HU.json +6 -0
- package/src/intl/react-aria-components/index.ts +73 -0
- package/src/intl/react-aria-components/it-IT.json +6 -0
- package/src/intl/react-aria-components/ja-JP.json +6 -0
- package/src/intl/react-aria-components/ko-KR.json +6 -0
- package/src/intl/react-aria-components/lt-LT.json +6 -0
- package/src/intl/react-aria-components/lv-LV.json +6 -0
- package/src/intl/react-aria-components/nb-NO.json +6 -0
- package/src/intl/react-aria-components/nl-NL.json +6 -0
- package/src/intl/react-aria-components/pl-PL.json +6 -0
- package/src/intl/react-aria-components/pt-BR.json +6 -0
- package/src/intl/react-aria-components/pt-PT.json +6 -0
- package/src/intl/react-aria-components/ro-RO.json +6 -0
- package/src/intl/react-aria-components/ru-RU.json +6 -0
- package/src/intl/react-aria-components/sk-SK.json +6 -0
- package/src/intl/react-aria-components/sl-SI.json +6 -0
- package/src/intl/react-aria-components/sr-SP.json +6 -0
- package/src/intl/react-aria-components/sv-SE.json +6 -0
- package/src/intl/react-aria-components/tr-TR.json +6 -0
- package/src/intl/react-aria-components/uk-UA.json +6 -0
- package/src/intl/react-aria-components/zh-CN.json +6 -0
- package/src/intl/react-aria-components/zh-TW.json +6 -0
- package/src/intl/stately-color/ar-AE.json +39 -0
- package/src/intl/stately-color/bg-BG.json +39 -0
- package/src/intl/stately-color/cs-CZ.json +39 -0
- package/src/intl/stately-color/da-DK.json +39 -0
- package/src/intl/stately-color/de-DE.json +39 -0
- package/src/intl/stately-color/el-GR.json +39 -0
- package/src/intl/stately-color/en-US.json +39 -0
- package/src/intl/stately-color/es-ES.json +39 -0
- package/src/intl/stately-color/et-EE.json +39 -0
- package/src/intl/stately-color/fi-FI.json +39 -0
- package/src/intl/stately-color/fr-FR.json +39 -0
- package/src/intl/stately-color/he-IL.json +39 -0
- package/src/intl/stately-color/hr-HR.json +39 -0
- package/src/intl/stately-color/hu-HU.json +39 -0
- package/src/intl/stately-color/index.ts +73 -0
- package/src/intl/stately-color/it-IT.json +39 -0
- package/src/intl/stately-color/ja-JP.json +39 -0
- package/src/intl/stately-color/ko-KR.json +39 -0
- package/src/intl/stately-color/lt-LT.json +39 -0
- package/src/intl/stately-color/lv-LV.json +39 -0
- package/src/intl/stately-color/nb-NO.json +39 -0
- package/src/intl/stately-color/nl-NL.json +39 -0
- package/src/intl/stately-color/pl-PL.json +39 -0
- package/src/intl/stately-color/pt-BR.json +39 -0
- package/src/intl/stately-color/pt-PT.json +39 -0
- package/src/intl/stately-color/ro-RO.json +39 -0
- package/src/intl/stately-color/ru-RU.json +39 -0
- package/src/intl/stately-color/sk-SK.json +39 -0
- package/src/intl/stately-color/sl-SI.json +39 -0
- package/src/intl/stately-color/sr-SP.json +39 -0
- package/src/intl/stately-color/sv-SE.json +39 -0
- package/src/intl/stately-color/tr-TR.json +39 -0
- package/src/intl/stately-color/uk-UA.json +39 -0
- package/src/intl/stately-color/zh-CN.json +39 -0
- package/src/intl/stately-color/zh-TW.json +39 -0
- package/src/intl/toast/ar-AE.json +4 -0
- package/src/intl/toast/bg-BG.json +4 -0
- package/src/intl/toast/cs-CZ.json +4 -0
- package/src/intl/toast/da-DK.json +4 -0
- package/src/intl/toast/de-DE.json +4 -0
- package/src/intl/toast/el-GR.json +4 -0
- package/src/intl/toast/en-US.json +4 -0
- package/src/intl/toast/es-ES.json +4 -0
- package/src/intl/toast/et-EE.json +4 -0
- package/src/intl/toast/fi-FI.json +4 -0
- package/src/intl/toast/fr-FR.json +4 -0
- package/src/intl/toast/he-IL.json +4 -0
- package/src/intl/toast/hr-HR.json +4 -0
- package/src/intl/toast/hu-HU.json +4 -0
- package/src/intl/toast/index.ts +73 -0
- package/src/intl/toast/it-IT.json +4 -0
- package/src/intl/toast/ja-JP.json +4 -0
- package/src/intl/toast/ko-KR.json +4 -0
- package/src/intl/toast/lt-LT.json +4 -0
- package/src/intl/toast/lv-LV.json +4 -0
- package/src/intl/toast/nb-NO.json +4 -0
- package/src/intl/toast/nl-NL.json +4 -0
- package/src/intl/toast/pl-PL.json +4 -0
- package/src/intl/toast/pt-BR.json +4 -0
- package/src/intl/toast/pt-PT.json +4 -0
- package/src/intl/toast/ro-RO.json +4 -0
- package/src/intl/toast/ru-RU.json +4 -0
- package/src/intl/toast/sk-SK.json +4 -0
- package/src/intl/toast/sl-SI.json +4 -0
- package/src/intl/toast/sr-SP.json +4 -0
- package/src/intl/toast/sv-SE.json +4 -0
- package/src/intl/toast/tr-TR.json +4 -0
- package/src/intl/toast/uk-UA.json +4 -0
- package/src/intl/toast/zh-CN.json +4 -0
- package/src/intl/toast/zh-TW.json +4 -0
- package/src/landmark/useLandmark.tsx +569 -0
- package/src/stately/calendar/types.tsx +239 -0
- package/src/stately/calendar/useCalendarState.tsx +527 -0
- package/src/stately/calendar/useRangeCalendarState.tsx +323 -0
- package/src/stately/calendar/utils.tsx +175 -0
- package/src/stately/color/Color.tsx +889 -0
- package/src/stately/color/types.tsx +82 -0
- package/src/stately/color/useColor.tsx +30 -0
- package/src/stately/color/useColorAreaState.tsx +255 -0
- package/src/stately/color/useColorChannelFieldState.tsx +86 -0
- package/src/stately/color/useColorFieldState.tsx +220 -0
- package/src/stately/color/useColorPickerState.tsx +31 -0
- package/src/stately/color/useColorSliderState.tsx +143 -0
- package/src/stately/color/useColorWheelState.tsx +225 -0
- package/src/stately/data/useAsyncList.tsx +382 -0
- package/src/stately/data/useListData.tsx +447 -0
- package/src/stately/data/useTreeData.tsx +603 -0
- package/src/stately/datepicker/IncompleteDate.tsx +427 -0
- package/src/stately/datepicker/placeholders.tsx +116 -0
- package/src/stately/datepicker/types.tsx +169 -0
- package/src/stately/datepicker/useDateFieldState.tsx +564 -0
- package/src/stately/datepicker/useDatePickerState.tsx +244 -0
- package/src/stately/datepicker/useDateRangePickerState.tsx +397 -0
- package/src/stately/datepicker/useTimeFieldState.tsx +123 -0
- package/src/stately/datepicker/utils.tsx +316 -0
- package/src/stately/dnd/useDraggableCollectionState.tsx +191 -0
- package/src/stately/dnd/useDroppableCollectionState.tsx +288 -0
- package/src/stately/layout/GridLayout.tsx +449 -0
- package/src/stately/layout/ListLayout.tsx +872 -0
- package/src/stately/layout/TableLayout.tsx +793 -0
- package/src/stately/layout/WaterfallLayout.tsx +399 -0
- package/src/stately/toast/useToastState.tsx +219 -0
- package/src/stately/virtualizer/Layout.tsx +105 -0
- package/src/stately/virtualizer/LayoutInfo.tsx +127 -0
- package/src/stately/virtualizer/OverscanManager.tsx +56 -0
- package/src/stately/virtualizer/Point.tsx +47 -0
- package/src/stately/virtualizer/Rect.tsx +194 -0
- package/src/stately/virtualizer/ReusableView.tsx +101 -0
- package/src/stately/virtualizer/Size.tsx +48 -0
- package/src/stately/virtualizer/Virtualizer.tsx +408 -0
- package/src/stately/virtualizer/types.tsx +48 -0
- package/src/stately/virtualizer/useVirtualizerState.tsx +138 -0
- package/src/stately/virtualizer/utils.tsx +32 -0
- package/src/textfield/useTextField.ts +3 -0
- package/src/toast/useToast.tsx +105 -0
- package/src/toast/useToastRegion.tsx +223 -0
- package/src/upstream-exports/react-aria/I18nProvider.tsx +17 -0
- package/src/upstream-exports/react-aria/ListDropTargetDelegate.tsx +15 -0
- package/src/upstream-exports/react-aria/PortalProvider.tsx +19 -0
- package/src/upstream-exports/react-aria/SSRProvider.tsx +15 -0
- package/src/upstream-exports/react-aria/VisuallyHidden.tsx +15 -0
- package/src/upstream-exports/react-aria/filterDOMProps.tsx +3 -0
- package/src/upstream-exports/react-aria/mergeProps.tsx +14 -0
- package/src/upstream-exports/react-aria/private/dnd/DragManager.tsx +3 -0
- package/src/upstream-exports/react-aria/private/interactions/PressResponder.tsx +3 -0
- package/src/upstream-exports/react-aria/private/utils/isFocusable.tsx +3 -0
- package/src/upstream-exports/react-aria/private/utils/shadowdom/DOMFunctions.tsx +8 -0
- package/src/upstream-exports/react-aria/private/utils/useId.tsx +3 -0
- package/src/upstream-exports/react-aria/private/utils/useLabels.tsx +3 -0
- package/src/upstream-exports/react-aria/private/virtualizer/ScrollView.tsx +3 -0
- package/src/upstream-exports/react-aria/private/virtualizer/VirtualizerItem.tsx +3 -0
- package/src/upstream-exports/react-aria/useButton.tsx +22 -0
- package/src/upstream-exports/react-aria/useCalendar.tsx +37 -0
- package/src/upstream-exports/react-aria/useClipboard.tsx +23 -0
- package/src/upstream-exports/react-aria/useColorArea.tsx +19 -0
- package/src/upstream-exports/react-aria/useColorField.tsx +20 -0
- package/src/upstream-exports/react-aria/useColorSlider.tsx +19 -0
- package/src/upstream-exports/react-aria/useColorSwatch.tsx +15 -0
- package/src/upstream-exports/react-aria/useColorWheel.tsx +19 -0
- package/src/upstream-exports/react-aria/useDateField.tsx +23 -0
- package/src/upstream-exports/react-aria/useDatePicker.tsx +17 -0
- package/src/upstream-exports/react-aria/useDateRangePicker.tsx +24 -0
- package/src/upstream-exports/react-aria/useDraggableCollection.tsx +31 -0
- package/src/upstream-exports/react-aria/useDrop.tsx +33 -0
- package/src/upstream-exports/react-aria/useDroppableCollection.tsx +47 -0
- package/src/upstream-exports/react-aria/useFocusRing.tsx +16 -0
- package/src/upstream-exports/react-aria/useHover.tsx +17 -0
- package/src/upstream-exports/react-aria/useLocalizedStringFormatter.tsx +19 -0
- package/src/upstream-exports/react-aria/useObjectRef.tsx +14 -0
- package/src/upstream-exports/react-aria/useRangeCalendar.tsx +38 -0
- package/src/upstream-exports/react-aria/useTimeField.tsx +23 -0
- package/src/upstream-exports/react-aria/useToast.tsx +18 -0
- package/src/upstream-exports/react-stately/Color.tsx +23 -0
- package/src/upstream-exports/react-stately/private/form/useFormValidationState.tsx +11 -0
- package/src/upstream-exports/react-stately/useCalendarState.tsx +24 -0
- package/src/upstream-exports/react-stately/useColorAreaState.tsx +24 -0
- package/src/upstream-exports/react-stately/useColorFieldState.tsx +22 -0
- package/src/upstream-exports/react-stately/useColorPickerState.tsx +25 -0
- package/src/upstream-exports/react-stately/useColorSliderState.tsx +25 -0
- package/src/upstream-exports/react-stately/useColorWheelState.tsx +24 -0
- package/src/upstream-exports/react-stately/useDateFieldState.tsx +29 -0
- package/src/upstream-exports/react-stately/useDatePickerState.tsx +25 -0
- package/src/upstream-exports/react-stately/useDateRangePickerState.tsx +26 -0
- package/src/upstream-exports/react-stately/useDraggableCollectionState.tsx +19 -0
- package/src/upstream-exports/react-stately/useDroppableCollectionState.tsx +19 -0
- package/src/upstream-exports/react-stately/useRangeCalendarState.tsx +27 -0
- package/src/upstream-exports/react-stately/useTimeFieldState.tsx +26 -0
- package/src/upstream-exports/react-stately/useToastState.tsx +21 -0
- package/src/upstream-exports/react-stately/useVirtualizerState.tsx +22 -0
- package/src/utils/useLoadMore.tsx +89 -0
- package/src/virtualizer/ScrollView.tsx +401 -0
- package/src/virtualizer/Virtualizer.tsx +147 -0
- package/src/virtualizer/VirtualizerItem.tsx +108 -0
- package/src/virtualizer/useVirtualizerItem.tsx +57 -0
- package/src/virtualizer/utils.tsx +105 -0
- package/LICENSE +0 -21
- package/src/components/useDragAndDrop.ts +0 -164
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/** @jsxImportSource octane */
|
|
2
|
+
// Ported from adobe/react-spectrum@1c84a49a1faf50b571c84e00bcf9c60b22ddd03e (packages/react-aria-components/src/useDragAndDrop.tsx).
|
|
3
|
+
/*
|
|
4
|
+
* Copyright 2022 Adobe. All rights reserved.
|
|
5
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
7
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
10
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
11
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
12
|
+
* governing permissions and limitations under the License.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
DropIndicatorProps as AriaDropIndicatorProps,
|
|
17
|
+
DropIndicatorAria,
|
|
18
|
+
DroppableCollectionOptions,
|
|
19
|
+
DroppableCollectionResult,
|
|
20
|
+
DroppableItemOptions,
|
|
21
|
+
DroppableItemResult,
|
|
22
|
+
useDropIndicator,
|
|
23
|
+
useDroppableCollection,
|
|
24
|
+
useDroppableItem,
|
|
25
|
+
} from '../upstream-exports/react-aria/useDroppableCollection';
|
|
26
|
+
import {
|
|
27
|
+
DraggableCollectionOptions,
|
|
28
|
+
DraggableItemProps,
|
|
29
|
+
DraggableItemResult,
|
|
30
|
+
DragPreview,
|
|
31
|
+
useDraggableCollection,
|
|
32
|
+
useDraggableItem,
|
|
33
|
+
} from '../upstream-exports/react-aria/useDraggableCollection';
|
|
34
|
+
import {
|
|
35
|
+
DraggableCollectionProps,
|
|
36
|
+
DroppableCollectionProps,
|
|
37
|
+
Key,
|
|
38
|
+
RefObject,
|
|
39
|
+
} from '@react-types/shared';
|
|
40
|
+
import {
|
|
41
|
+
DraggableCollectionState,
|
|
42
|
+
DraggableCollectionStateOptions,
|
|
43
|
+
useDraggableCollectionState,
|
|
44
|
+
} from '../upstream-exports/react-stately/useDraggableCollectionState';
|
|
45
|
+
import { DragItem, DropTarget, DropTargetDelegate } from '@react-types/shared';
|
|
46
|
+
import {
|
|
47
|
+
DroppableCollectionState,
|
|
48
|
+
DroppableCollectionStateOptions,
|
|
49
|
+
useDroppableCollectionState,
|
|
50
|
+
} from '../upstream-exports/react-stately/useDroppableCollectionState';
|
|
51
|
+
import { isVirtualDragging } from '../upstream-exports/react-aria/private/dnd/DragManager';
|
|
52
|
+
import { JSX, useMemo } from '../compat/react';
|
|
53
|
+
import { ListDropTargetDelegate } from '../upstream-exports/react-aria/ListDropTargetDelegate';
|
|
54
|
+
|
|
55
|
+
// Compatibility exports consumed by the existing collection component ports.
|
|
56
|
+
export type {
|
|
57
|
+
AriaDropIndicatorProps,
|
|
58
|
+
DropIndicatorAria,
|
|
59
|
+
DraggableCollectionState,
|
|
60
|
+
DraggableItemResult,
|
|
61
|
+
DroppableCollectionResult,
|
|
62
|
+
DroppableCollectionState,
|
|
63
|
+
DroppableItemResult,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export { DropIndicator, DropIndicatorContext, DragAndDropContext } from './DragAndDrop';
|
|
67
|
+
export type { DropIndicatorProps, DropIndicatorRenderProps } from './DragAndDrop';
|
|
68
|
+
|
|
69
|
+
interface DraggableCollectionStateOpts<T = object> extends Omit<
|
|
70
|
+
DraggableCollectionStateOptions<T>,
|
|
71
|
+
'getItems'
|
|
72
|
+
> {}
|
|
73
|
+
|
|
74
|
+
interface DragHooks<T = object> {
|
|
75
|
+
useDraggableCollectionState?: (
|
|
76
|
+
props: DraggableCollectionStateOpts<T>,
|
|
77
|
+
) => DraggableCollectionState;
|
|
78
|
+
useDraggableCollection?: (
|
|
79
|
+
props: DraggableCollectionOptions,
|
|
80
|
+
state: DraggableCollectionState,
|
|
81
|
+
ref: RefObject<HTMLElement | null>,
|
|
82
|
+
) => void;
|
|
83
|
+
useDraggableItem?: (
|
|
84
|
+
props: DraggableItemProps,
|
|
85
|
+
state: DraggableCollectionState,
|
|
86
|
+
) => DraggableItemResult;
|
|
87
|
+
DragPreview?: typeof DragPreview;
|
|
88
|
+
renderDragPreview?: (
|
|
89
|
+
items: DragItem[],
|
|
90
|
+
) => JSX.Element | { element: JSX.Element; x: number; y: number };
|
|
91
|
+
isVirtualDragging?: () => boolean;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
interface DropHooks {
|
|
95
|
+
useDroppableCollectionState?: (
|
|
96
|
+
props: DroppableCollectionStateOptions,
|
|
97
|
+
) => DroppableCollectionState;
|
|
98
|
+
useDroppableCollection?: (
|
|
99
|
+
props: DroppableCollectionOptions,
|
|
100
|
+
state: DroppableCollectionState,
|
|
101
|
+
ref: RefObject<HTMLElement | null>,
|
|
102
|
+
) => DroppableCollectionResult;
|
|
103
|
+
useDroppableItem?: (
|
|
104
|
+
options: DroppableItemOptions,
|
|
105
|
+
state: DroppableCollectionState,
|
|
106
|
+
ref: RefObject<HTMLElement | null>,
|
|
107
|
+
) => DroppableItemResult;
|
|
108
|
+
useDropIndicator?: (
|
|
109
|
+
props: AriaDropIndicatorProps,
|
|
110
|
+
state: DroppableCollectionState,
|
|
111
|
+
ref: RefObject<HTMLElement | null>,
|
|
112
|
+
) => DropIndicatorAria;
|
|
113
|
+
renderDropIndicator?: (target: DropTarget) => JSX.Element;
|
|
114
|
+
dropTargetDelegate?: DropTargetDelegate;
|
|
115
|
+
ListDropTargetDelegate: typeof ListDropTargetDelegate;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export type DragAndDropHooks<T = object> = DragHooks<T> & DropHooks;
|
|
119
|
+
|
|
120
|
+
export interface DragAndDrop<T = object> {
|
|
121
|
+
/** Drag and drop hooks for the collection element. */
|
|
122
|
+
dragAndDropHooks: DragAndDropHooks<T>;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface DragAndDropOptions<T = object>
|
|
126
|
+
extends Omit<DraggableCollectionProps, 'preview' | 'getItems'>, DroppableCollectionProps {
|
|
127
|
+
/**
|
|
128
|
+
* A function that returns the items being dragged. If not specified, we assume that the
|
|
129
|
+
* collection is not draggable.
|
|
130
|
+
*
|
|
131
|
+
* @default () => []
|
|
132
|
+
*/
|
|
133
|
+
getItems?: (keys: Set<Key>, items: T[]) => DragItem[];
|
|
134
|
+
/**
|
|
135
|
+
* A function that renders a drag preview, which is shown under the user's cursor while dragging.
|
|
136
|
+
* By default, a copy of the dragged element is rendered.
|
|
137
|
+
*/
|
|
138
|
+
renderDragPreview?: (
|
|
139
|
+
items: DragItem[],
|
|
140
|
+
) => JSX.Element | { element: JSX.Element; x: number; y: number };
|
|
141
|
+
/**
|
|
142
|
+
* A function that renders a drop indicator element between two items in a collection.
|
|
143
|
+
* This should render a `<DropIndicator>` element. If this function is not provided, a
|
|
144
|
+
* default DropIndicator is provided.
|
|
145
|
+
*/
|
|
146
|
+
renderDropIndicator?: (target: DropTarget) => JSX.Element;
|
|
147
|
+
/**
|
|
148
|
+
* A custom delegate object that provides drop targets for pointer coordinates within the
|
|
149
|
+
* collection.
|
|
150
|
+
*/
|
|
151
|
+
dropTargetDelegate?: DropTargetDelegate;
|
|
152
|
+
/** Whether the drag and drop events should be disabled. */
|
|
153
|
+
isDisabled?: boolean;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Provides the hooks required to enable drag and drop behavior for a drag and drop compatible
|
|
158
|
+
* collection component.
|
|
159
|
+
*/
|
|
160
|
+
export function useDragAndDrop<T = object>(options: DragAndDropOptions<T>): DragAndDrop<T> {
|
|
161
|
+
let dragAndDropHooks = useMemo(() => {
|
|
162
|
+
let {
|
|
163
|
+
onDrop,
|
|
164
|
+
onInsert,
|
|
165
|
+
onItemDrop,
|
|
166
|
+
onReorder,
|
|
167
|
+
onMove,
|
|
168
|
+
onRootDrop,
|
|
169
|
+
getItems,
|
|
170
|
+
renderDragPreview,
|
|
171
|
+
renderDropIndicator,
|
|
172
|
+
dropTargetDelegate,
|
|
173
|
+
} = options;
|
|
174
|
+
|
|
175
|
+
let isDraggable = !!getItems;
|
|
176
|
+
let isDroppable = !!(onDrop || onInsert || onItemDrop || onReorder || onMove || onRootDrop);
|
|
177
|
+
|
|
178
|
+
let hooks = {} as DragAndDropHooks;
|
|
179
|
+
if (isDraggable) {
|
|
180
|
+
hooks.useDraggableCollectionState = function useDraggableCollectionStateOverride(
|
|
181
|
+
props: DraggableCollectionStateOpts,
|
|
182
|
+
) {
|
|
183
|
+
return useDraggableCollectionState({
|
|
184
|
+
...props,
|
|
185
|
+
...options,
|
|
186
|
+
} as DraggableCollectionStateOptions);
|
|
187
|
+
};
|
|
188
|
+
hooks.useDraggableCollection = useDraggableCollection;
|
|
189
|
+
hooks.useDraggableItem = useDraggableItem;
|
|
190
|
+
hooks.DragPreview = DragPreview;
|
|
191
|
+
hooks.renderDragPreview = renderDragPreview;
|
|
192
|
+
hooks.isVirtualDragging = isVirtualDragging;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (isDroppable) {
|
|
196
|
+
hooks.useDroppableCollectionState = function useDroppableCollectionStateOverride(
|
|
197
|
+
props: DroppableCollectionStateOptions,
|
|
198
|
+
) {
|
|
199
|
+
return useDroppableCollectionState({ ...props, ...options });
|
|
200
|
+
};
|
|
201
|
+
hooks.useDroppableItem = useDroppableItem;
|
|
202
|
+
hooks.useDroppableCollection = function useDroppableCollectionOverride(
|
|
203
|
+
props: DroppableCollectionOptions,
|
|
204
|
+
state: DroppableCollectionState,
|
|
205
|
+
ref: RefObject<HTMLElement | null>,
|
|
206
|
+
) {
|
|
207
|
+
return useDroppableCollection({ ...props, ...options }, state, ref);
|
|
208
|
+
};
|
|
209
|
+
hooks.useDropIndicator = useDropIndicator;
|
|
210
|
+
hooks.renderDropIndicator = renderDropIndicator;
|
|
211
|
+
hooks.dropTargetDelegate = dropTargetDelegate;
|
|
212
|
+
hooks.ListDropTargetDelegate = ListDropTargetDelegate;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return hooks;
|
|
216
|
+
}, [options]);
|
|
217
|
+
|
|
218
|
+
return {
|
|
219
|
+
dragAndDropHooks,
|
|
220
|
+
};
|
|
221
|
+
}
|
package/src/components/utils.ts
CHANGED
|
@@ -37,101 +37,24 @@ interface SlottedValue<T> {
|
|
|
37
37
|
export type SlottedContextValue<T> = SlottedValue<T> | T | null | undefined;
|
|
38
38
|
export type ContextValue<T, E> = SlottedContextValue<WithRef<T, E>>;
|
|
39
39
|
|
|
40
|
-
type ProviderValue<
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
ProviderValue<C>,
|
|
51
|
-
ProviderValue<D>,
|
|
52
|
-
ProviderValue<E>,
|
|
53
|
-
ProviderValue<F>,
|
|
54
|
-
]
|
|
55
|
-
| [
|
|
56
|
-
ProviderValue<A>,
|
|
57
|
-
ProviderValue<B>,
|
|
58
|
-
ProviderValue<C>,
|
|
59
|
-
ProviderValue<D>,
|
|
60
|
-
ProviderValue<E>,
|
|
61
|
-
ProviderValue<F>,
|
|
62
|
-
ProviderValue<G>,
|
|
63
|
-
]
|
|
64
|
-
| [
|
|
65
|
-
ProviderValue<A>,
|
|
66
|
-
ProviderValue<B>,
|
|
67
|
-
ProviderValue<C>,
|
|
68
|
-
ProviderValue<D>,
|
|
69
|
-
ProviderValue<E>,
|
|
70
|
-
ProviderValue<F>,
|
|
71
|
-
ProviderValue<G>,
|
|
72
|
-
ProviderValue<H>,
|
|
73
|
-
]
|
|
74
|
-
| [
|
|
75
|
-
ProviderValue<A>,
|
|
76
|
-
ProviderValue<B>,
|
|
77
|
-
ProviderValue<C>,
|
|
78
|
-
ProviderValue<D>,
|
|
79
|
-
ProviderValue<E>,
|
|
80
|
-
ProviderValue<F>,
|
|
81
|
-
ProviderValue<G>,
|
|
82
|
-
ProviderValue<H>,
|
|
83
|
-
ProviderValue<I>,
|
|
84
|
-
]
|
|
85
|
-
| [
|
|
86
|
-
ProviderValue<A>,
|
|
87
|
-
ProviderValue<B>,
|
|
88
|
-
ProviderValue<C>,
|
|
89
|
-
ProviderValue<D>,
|
|
90
|
-
ProviderValue<E>,
|
|
91
|
-
ProviderValue<F>,
|
|
92
|
-
ProviderValue<G>,
|
|
93
|
-
ProviderValue<H>,
|
|
94
|
-
ProviderValue<I>,
|
|
95
|
-
ProviderValue<J>,
|
|
96
|
-
]
|
|
97
|
-
| [
|
|
98
|
-
ProviderValue<A>,
|
|
99
|
-
ProviderValue<B>,
|
|
100
|
-
ProviderValue<C>,
|
|
101
|
-
ProviderValue<D>,
|
|
102
|
-
ProviderValue<E>,
|
|
103
|
-
ProviderValue<F>,
|
|
104
|
-
ProviderValue<G>,
|
|
105
|
-
ProviderValue<H>,
|
|
106
|
-
ProviderValue<I>,
|
|
107
|
-
ProviderValue<J>,
|
|
108
|
-
ProviderValue<K>,
|
|
109
|
-
]
|
|
110
|
-
| [
|
|
111
|
-
ProviderValue<A>,
|
|
112
|
-
ProviderValue<B>,
|
|
113
|
-
ProviderValue<C>,
|
|
114
|
-
ProviderValue<D>,
|
|
115
|
-
ProviderValue<E>,
|
|
116
|
-
ProviderValue<F>,
|
|
117
|
-
ProviderValue<G>,
|
|
118
|
-
ProviderValue<H>,
|
|
119
|
-
ProviderValue<I>,
|
|
120
|
-
ProviderValue<J>,
|
|
121
|
-
ProviderValue<K>,
|
|
122
|
-
ProviderValue<L>,
|
|
123
|
-
];
|
|
124
|
-
|
|
125
|
-
interface ProviderProps<A, B, C, D, E, F, G, H, I, J, K, L> {
|
|
126
|
-
values: ProviderValues<A, B, C, D, E, F, G, H, I, J, K, L>;
|
|
40
|
+
type ProviderValue<C extends Context<any>> = readonly [
|
|
41
|
+
C,
|
|
42
|
+
C extends Context<infer Value> ? Value : never,
|
|
43
|
+
];
|
|
44
|
+
type ProviderValues<Contexts extends readonly Context<any>[]> = {
|
|
45
|
+
readonly [Index in keyof Contexts]: ProviderValue<Contexts[Index]>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
interface ProviderProps<Contexts extends readonly Context<any>[]> {
|
|
49
|
+
values: ProviderValues<Contexts>;
|
|
127
50
|
children: ReactNode;
|
|
128
51
|
}
|
|
129
52
|
|
|
130
53
|
// No hooks (Provider nests plain Context.Provider descriptors), so no slot threading. The
|
|
131
54
|
// descriptor `{ value, children }` shape stays stable per values entry (see aria memory
|
|
132
55
|
// octane-provider-children-shape-flip).
|
|
133
|
-
export function Provider<
|
|
134
|
-
props: ProviderProps<
|
|
56
|
+
export function Provider<const Contexts extends readonly Context<any>[]>(
|
|
57
|
+
props: ProviderProps<Contexts>,
|
|
135
58
|
): any {
|
|
136
59
|
let { values, children } = props;
|
|
137
60
|
for (let [Context, value] of values) {
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/** @jsxImportSource octane */
|
|
2
|
+
// Ported from adobe/react-spectrum@1c84a49a1faf50b571c84e00bcf9c60b22ddd03e (packages/react-aria/src/datepicker/useDateField.ts).
|
|
3
|
+
/*
|
|
4
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
5
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
7
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
10
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
11
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
12
|
+
* governing permissions and limitations under the License.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
AriaLabelingProps,
|
|
17
|
+
DOMAttributes,
|
|
18
|
+
DOMProps,
|
|
19
|
+
GroupDOMAttributes,
|
|
20
|
+
InputDOMProps,
|
|
21
|
+
KeyboardEvent,
|
|
22
|
+
RefObject,
|
|
23
|
+
ValidationResult,
|
|
24
|
+
} from '@react-types/shared';
|
|
25
|
+
import { createFocusManager, FocusManager } from '../focus/FocusScope';
|
|
26
|
+
import {
|
|
27
|
+
DateFieldProps,
|
|
28
|
+
DateFieldState,
|
|
29
|
+
DateValue,
|
|
30
|
+
} from '../upstream-exports/react-stately/useDateFieldState';
|
|
31
|
+
import { filterDOMProps } from '../utils/filterDOMProps';
|
|
32
|
+
import { InputHTMLAttributes, useEffect, useMemo, useRef } from '../compat/react';
|
|
33
|
+
import intlMessages from '../intl/datepicker/index';
|
|
34
|
+
import { mergeProps } from '../utils/mergeProps';
|
|
35
|
+
import {
|
|
36
|
+
TimeFieldState,
|
|
37
|
+
TimePickerProps,
|
|
38
|
+
TimeValue,
|
|
39
|
+
} from '../upstream-exports/react-stately/useTimeFieldState';
|
|
40
|
+
import { useDatePickerGroup } from './useDatePickerGroup';
|
|
41
|
+
import { useDescription } from '../utils/useDescription';
|
|
42
|
+
import { useField } from '../label/useField';
|
|
43
|
+
import { useFocusWithin } from '../interactions/useFocusWithin';
|
|
44
|
+
import { useFormReset } from '../utils/useFormReset';
|
|
45
|
+
import { useFormValidation } from '../form/useFormValidation';
|
|
46
|
+
import { useLocalizedStringFormatter } from '../i18n/useLocalizedStringFormatter';
|
|
47
|
+
|
|
48
|
+
export interface AriaDateFieldProps<T extends DateValue>
|
|
49
|
+
extends DateFieldProps<T>, AriaLabelingProps, DOMProps, InputDOMProps {
|
|
50
|
+
/**
|
|
51
|
+
* Describes the type of autocomplete functionality the input should provide if any. See
|
|
52
|
+
* [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#htmlattrdefautocomplete).
|
|
53
|
+
*/
|
|
54
|
+
autoComplete?: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Allows this hook to also be used with TimeField
|
|
58
|
+
export interface AriaDateFieldOptions<T extends DateValue> extends Omit<
|
|
59
|
+
AriaDateFieldProps<T>,
|
|
60
|
+
'value' | 'defaultValue' | 'onChange' | 'minValue' | 'maxValue' | 'placeholderValue' | 'validate'
|
|
61
|
+
> {
|
|
62
|
+
/** A ref for the hidden input element for HTML form submission. */
|
|
63
|
+
inputRef?: RefObject<HTMLInputElement | null>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface DateFieldAria extends ValidationResult {
|
|
67
|
+
/** Props for the field's visible label element, if any. */
|
|
68
|
+
labelProps: DOMAttributes;
|
|
69
|
+
/** Props for the field grouping element. */
|
|
70
|
+
fieldProps: GroupDOMAttributes;
|
|
71
|
+
/** Props for the hidden input element for HTML form submission. */
|
|
72
|
+
inputProps: InputHTMLAttributes<HTMLInputElement>;
|
|
73
|
+
/** Props for the description element, if any. */
|
|
74
|
+
descriptionProps: DOMAttributes;
|
|
75
|
+
/** Props for the error message element, if any. */
|
|
76
|
+
errorMessageProps: DOMAttributes;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Data that is passed between useDateField and useDateSegment.
|
|
80
|
+
interface HookData {
|
|
81
|
+
ariaLabel?: string;
|
|
82
|
+
ariaLabelledBy?: string;
|
|
83
|
+
ariaDescribedBy?: string;
|
|
84
|
+
focusManager: FocusManager;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export const hookData: WeakMap<DateFieldState, HookData> = new WeakMap<DateFieldState, HookData>();
|
|
88
|
+
|
|
89
|
+
// Private props that we pass from useDatePicker/useDateRangePicker.
|
|
90
|
+
// Ideally we'd use a Symbol for this, but React doesn't support them: https://github.com/facebook/react/issues/7552
|
|
91
|
+
// These need to be stable across server and client module evaluation for SSR hydration.
|
|
92
|
+
export const roleSymbol: string = '__reactAriaDateFieldRole';
|
|
93
|
+
export const focusManagerSymbol: string = '__reactAriaDateFieldFocusManager';
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Provides the behavior and accessibility implementation for a date field component.
|
|
97
|
+
* A date field allows users to enter and edit date and time values using a keyboard.
|
|
98
|
+
* Each part of a date value is displayed in an individually editable segment.
|
|
99
|
+
*/
|
|
100
|
+
export function useDateField<T extends DateValue>(
|
|
101
|
+
props: AriaDateFieldOptions<T>,
|
|
102
|
+
state: DateFieldState,
|
|
103
|
+
ref: RefObject<Element | null>,
|
|
104
|
+
): DateFieldAria {
|
|
105
|
+
let { isInvalid, validationErrors, validationDetails } = state.displayValidation;
|
|
106
|
+
let { labelProps, fieldProps, descriptionProps, errorMessageProps } = useField({
|
|
107
|
+
...props,
|
|
108
|
+
labelElementType: 'span',
|
|
109
|
+
isInvalid,
|
|
110
|
+
errorMessage: props.errorMessage || validationErrors,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
let valueOnFocus = useRef<DateValue | null>(null);
|
|
114
|
+
let { focusWithinProps } = useFocusWithin({
|
|
115
|
+
...props,
|
|
116
|
+
onFocusWithin(e) {
|
|
117
|
+
valueOnFocus.current = state.value;
|
|
118
|
+
props.onFocus?.(e as any);
|
|
119
|
+
},
|
|
120
|
+
onBlurWithin: (e) => {
|
|
121
|
+
state.confirmPlaceholder();
|
|
122
|
+
if (state.value !== valueOnFocus.current) {
|
|
123
|
+
state.commitValidation();
|
|
124
|
+
}
|
|
125
|
+
props.onBlur?.(e as any);
|
|
126
|
+
},
|
|
127
|
+
onFocusWithinChange: props.onFocusChange,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-aria/datepicker');
|
|
131
|
+
let message =
|
|
132
|
+
state.maxGranularity === 'hour' ? 'selectedTimeDescription' : 'selectedDateDescription';
|
|
133
|
+
let field = state.maxGranularity === 'hour' ? 'time' : 'date';
|
|
134
|
+
let description = state.value
|
|
135
|
+
? stringFormatter.format(message, { [field]: state.formatValue({ month: 'long' }) })
|
|
136
|
+
: '';
|
|
137
|
+
let descProps = useDescription(description);
|
|
138
|
+
|
|
139
|
+
// If within a date picker or date range picker, the date field will have role="presentation" and an aria-describedby
|
|
140
|
+
// will be passed in that references the value (e.g. entire range). Otherwise, add the field's value description.
|
|
141
|
+
let describedBy =
|
|
142
|
+
(props as any)[roleSymbol] === 'presentation'
|
|
143
|
+
? fieldProps['aria-describedby']
|
|
144
|
+
: [descProps['aria-describedby'], fieldProps['aria-describedby']].filter(Boolean).join(' ') ||
|
|
145
|
+
undefined;
|
|
146
|
+
let propsFocusManager = (props as any)[focusManagerSymbol];
|
|
147
|
+
let focusManager = useMemo(
|
|
148
|
+
() => propsFocusManager || createFocusManager(ref),
|
|
149
|
+
[propsFocusManager, ref],
|
|
150
|
+
);
|
|
151
|
+
let groupProps = useDatePickerGroup(state, ref, (props as any)[roleSymbol] === 'presentation');
|
|
152
|
+
|
|
153
|
+
// Pass labels and other information to segments.
|
|
154
|
+
hookData.set(state, {
|
|
155
|
+
ariaLabel: props['aria-label'],
|
|
156
|
+
ariaLabelledBy:
|
|
157
|
+
[labelProps.id, props['aria-labelledby']].filter(Boolean).join(' ') || undefined,
|
|
158
|
+
ariaDescribedBy: describedBy,
|
|
159
|
+
focusManager,
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
let autoFocusRef = useRef(props.autoFocus);
|
|
163
|
+
|
|
164
|
+
// When used within a date picker or date range picker, the field gets role="presentation"
|
|
165
|
+
// rather than role="group". Since the date picker/date range picker already has a role="group"
|
|
166
|
+
// with a label and description, and the segments are already labeled by this as well, this
|
|
167
|
+
// avoids very verbose duplicate announcements.
|
|
168
|
+
let fieldDOMProps: GroupDOMAttributes;
|
|
169
|
+
if ((props as any)[roleSymbol] === 'presentation') {
|
|
170
|
+
fieldDOMProps = {
|
|
171
|
+
role: 'presentation',
|
|
172
|
+
};
|
|
173
|
+
} else {
|
|
174
|
+
fieldDOMProps = mergeProps(fieldProps, {
|
|
175
|
+
role: 'group' as const,
|
|
176
|
+
'aria-disabled': props.isDisabled || undefined,
|
|
177
|
+
'aria-describedby': describedBy,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
useEffect(() => {
|
|
182
|
+
if (autoFocusRef.current) {
|
|
183
|
+
focusManager.focusFirst();
|
|
184
|
+
}
|
|
185
|
+
autoFocusRef.current = false;
|
|
186
|
+
}, [focusManager]);
|
|
187
|
+
|
|
188
|
+
useFormReset(props.inputRef, state.defaultValue, state.setValue);
|
|
189
|
+
useFormValidation(
|
|
190
|
+
{
|
|
191
|
+
...props,
|
|
192
|
+
focus() {
|
|
193
|
+
focusManager.focusFirst();
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
state,
|
|
197
|
+
props.inputRef,
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
let inputProps: InputHTMLAttributes<HTMLInputElement> = {
|
|
201
|
+
type: 'hidden',
|
|
202
|
+
name: props.name,
|
|
203
|
+
form: props.form,
|
|
204
|
+
value: state.value?.toString() || '',
|
|
205
|
+
disabled: props.isDisabled,
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
if (props.validationBehavior === 'native') {
|
|
209
|
+
// Use a hidden <input type="text"> rather than <input type="hidden">
|
|
210
|
+
// so that an empty value blocks HTML form submission when the field is required.
|
|
211
|
+
inputProps.type = 'text';
|
|
212
|
+
inputProps.hidden = true;
|
|
213
|
+
inputProps.required = props.isRequired;
|
|
214
|
+
// React uses a no-op synthetic onChange to mark this controlled validation proxy
|
|
215
|
+
// as intentionally managed. Octane's equivalent marker is the native input event.
|
|
216
|
+
inputProps.onInput = () => {};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
let domProps = filterDOMProps(props);
|
|
220
|
+
return {
|
|
221
|
+
labelProps: {
|
|
222
|
+
...labelProps,
|
|
223
|
+
onClick: () => {
|
|
224
|
+
focusManager.focusFirst();
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
fieldProps: mergeProps(domProps, fieldDOMProps, groupProps, focusWithinProps, {
|
|
228
|
+
onKeyDown(e: KeyboardEvent) {
|
|
229
|
+
if (props.onKeyDown) {
|
|
230
|
+
props.onKeyDown(e);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
onKeyUp(e: KeyboardEvent) {
|
|
234
|
+
if (props.onKeyUp) {
|
|
235
|
+
props.onKeyUp(e);
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
style: {
|
|
239
|
+
unicodeBidi: 'isolate',
|
|
240
|
+
},
|
|
241
|
+
}),
|
|
242
|
+
inputProps,
|
|
243
|
+
descriptionProps,
|
|
244
|
+
errorMessageProps,
|
|
245
|
+
isInvalid,
|
|
246
|
+
validationErrors,
|
|
247
|
+
validationDetails,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface AriaTimeFieldProps<T extends TimeValue>
|
|
252
|
+
extends TimePickerProps<T>, AriaLabelingProps, DOMProps, InputDOMProps {}
|
|
253
|
+
|
|
254
|
+
export interface AriaTimeFieldOptions<T extends TimeValue> extends AriaTimeFieldProps<T> {
|
|
255
|
+
/** A ref for the hidden input element for HTML form submission. */
|
|
256
|
+
inputRef?: RefObject<HTMLInputElement | null>;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Provides the behavior and accessibility implementation for a time field component.
|
|
261
|
+
* A time field allows users to enter and edit time values using a keyboard.
|
|
262
|
+
* Each part of a time value is displayed in an individually editable segment.
|
|
263
|
+
*/
|
|
264
|
+
export function useTimeField<T extends TimeValue>(
|
|
265
|
+
props: AriaTimeFieldOptions<T>,
|
|
266
|
+
state: TimeFieldState,
|
|
267
|
+
ref: RefObject<Element | null>,
|
|
268
|
+
): DateFieldAria {
|
|
269
|
+
let res = useDateField(props, state, ref);
|
|
270
|
+
res.inputProps.value = state.timeValue?.toString() || '';
|
|
271
|
+
return res;
|
|
272
|
+
}
|