@astryxdesign/core 0.7.7 → 0.7.8-canary.0d54fd3
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/dist/AlertDialog/AlertDialog.d.ts +4 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +46 -6
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +11 -3
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +1 -0
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +25 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
- package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
- package/dist/BottomSheet/useMobileKeyboard.js +6 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +12 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +17 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +18 -22
- package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
- package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
- package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
- package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
- package/dist/Calendar/hooks/useCalendarDays.js +2 -10
- package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
- package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
- package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +2 -0
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +6 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +2 -1
- package/dist/Chat/useChatDictation.d.ts.map +1 -1
- package/dist/Chat/useChatDictation.js +2 -0
- package/dist/Chat/useChatNewMessages.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +2 -0
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +3 -0
- package/dist/Chat/useTriggerMenu.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +17 -12
- package/dist/CheckboxList/CheckboxList.d.ts +8 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +2 -0
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +28 -11
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +2 -0
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +2 -0
- package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +14 -4
- package/dist/ContextMenu/ContextMenu.js +2 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +5 -2
- package/dist/DateInput/PickerWheel.d.ts +19 -0
- package/dist/DateInput/PickerWheel.d.ts.map +1 -0
- package/dist/DateInput/PickerWheel.js +625 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +9 -30
- package/dist/DateInput/Wheel.d.ts +18 -37
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +84 -113
- package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
- package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
- package/dist/DateInput/useOwnScrollGesture.js +16 -3
- package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
- package/dist/DateInput/usePointerDragScroll.js +2 -0
- package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
- package/dist/DateInput/useScrollSettle.js +3 -0
- package/dist/DateInput/useWheelListbox.d.ts +59 -0
- package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
- package/dist/DateInput/useWheelListbox.js +88 -0
- package/dist/DateInput/wheelOptions.d.ts +74 -0
- package/dist/DateInput/wheelOptions.d.ts.map +1 -0
- package/dist/DateInput/wheelOptions.js +98 -0
- package/dist/DateInput/wheelPhysics.d.ts +127 -0
- package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
- package/dist/DateInput/wheelPhysics.js +341 -0
- package/dist/DateInput/wheelStrip.d.ts +92 -0
- package/dist/DateInput/wheelStrip.d.ts.map +1 -0
- package/dist/DateInput/wheelStrip.js +258 -0
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +10 -10
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -32
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +3 -0
- package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
- package/dist/DropdownMenu/useMenuOverflow.js +5 -0
- package/dist/Field/Field.js +2 -2
- package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
- package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
- package/dist/FormLayout/FormLayout.d.ts +5 -1
- package/dist/FormLayout/FormLayout.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.d.ts +6 -4
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +48 -3
- package/dist/HoverCard/useHoverCard.d.ts +5 -4
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +20 -33
- package/dist/Icon/Icon.d.ts +5 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +5 -2
- package/dist/InfoTip/InfoTip.d.ts +5 -5
- package/dist/InfoTip/InfoTip.d.ts.map +1 -1
- package/dist/InfoTip/InfoTip.js +58 -19
- package/dist/Item/useSwipeAction.d.ts.map +1 -1
- package/dist/Item/useSwipeAction.js +3 -0
- package/dist/Layer/modalOutlet.d.ts.map +1 -1
- package/dist/Layer/modalOutlet.js +2 -0
- package/dist/Layer/outsidePress.d.ts.map +1 -1
- package/dist/Layer/outsidePress.js +1 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +4 -1
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
- package/dist/Layer/useLayerDismissal.js +3 -0
- package/dist/Layer/useTouchTrigger.d.ts +13 -7
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +20 -6
- package/dist/Layout/index.d.ts +1 -1
- package/dist/Layout/index.d.ts.map +1 -1
- package/dist/Layout/index.js +1 -1
- package/dist/Layout/layoutReset.js +1 -1
- package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
- package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
- package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
- package/dist/Layout/padding.stylex.d.ts +5 -129
- package/dist/Layout/padding.stylex.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.js +9 -143
- package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
- package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
- package/dist/Layout/paddingStyles.stylex.js +99 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +20 -1
- package/dist/MobileNav/MobileNav.d.ts +3 -2
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +10 -26
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +2 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +2 -1
- package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromDOM.js +3 -0
- package/dist/Outline/useScrollSpy.d.ts.map +1 -1
- package/dist/Outline/useScrollSpy.js +3 -0
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -0
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -0
- package/dist/Popover/usePopover.js +2 -2
- package/dist/PowerSearch/PowerSearch.d.ts +39 -4
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +441 -134
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
- package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
- package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchToken.js +3 -2
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
- package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +31 -23
- package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
- package/dist/PowerSearch/formatTokenValue.js +161 -0
- package/dist/PowerSearch/index.d.ts +1 -1
- package/dist/PowerSearch/index.d.ts.map +1 -1
- package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
- package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchDateZone.js +57 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
- package/dist/PowerSearch/types.d.ts +8 -1
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBarTouch.js +2 -0
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +3 -2
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -3
- package/dist/Resizable/ResizeHandle.d.ts +2 -1
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +101 -77
- package/dist/Resizable/createResizable.d.ts +145 -0
- package/dist/Resizable/createResizable.d.ts.map +1 -0
- package/dist/Resizable/createResizable.js +575 -0
- package/dist/Resizable/useResizable.d.ts +3 -3
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +252 -459
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
- package/dist/SelectableCard/SelectableCard.d.ts +2 -0
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +36 -11
- package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
- package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
- package/dist/SelectableCard/selectableCardInput.js +20 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +7 -9
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +36 -5
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +16 -11
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +60 -58
- package/dist/Stepper/Stepper.d.ts.map +1 -1
- package/dist/Stepper/Stepper.js +10 -15
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +4 -10
- package/dist/Switch/useSwitchTouch.js +4 -4
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +29 -8
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +2 -1
- package/dist/TextInput/TextInput.d.ts +2 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +12 -8
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +2 -0
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +2 -0
- package/dist/Timer/Timer.d.ts.map +1 -1
- package/dist/Timer/Timer.js +2 -0
- package/dist/Timestamp/Timestamp.js +1 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +1 -23
- package/dist/Toast/Toast.d.ts +11 -1
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -15
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +97 -34
- package/dist/Toast/types.d.ts +9 -3
- package/dist/Toast/types.d.ts.map +1 -1
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +1 -0
- package/dist/Tokenizer/Tokenizer.d.ts +44 -46
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -21
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +4 -6
- package/dist/Tokenizer/index.d.ts +1 -1
- package/dist/Tokenizer/index.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.d.ts +2 -23
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +5 -29
- package/dist/Tooltip/useTooltip.d.ts +23 -30
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +194 -108
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +27 -18
- package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/animator/createAnimator.d.ts +98 -0
- package/dist/animator/createAnimator.d.ts.map +1 -0
- package/dist/animator/createAnimator.js +259 -0
- package/dist/astryx.css +41 -7
- package/dist/gestures/GestureHost.d.ts +16 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +1 -1
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +4 -3
- package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
- package/dist/hooks/ModalAnnounceProvider.js +1 -0
- package/dist/hooks/actionGroupTracker.d.ts +4 -1
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
- package/dist/hooks/actionGroupTracker.js +13 -3
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/longPressDetector.d.ts +66 -0
- package/dist/hooks/longPressDetector.d.ts.map +1 -0
- package/dist/hooks/longPressDetector.js +200 -0
- package/dist/hooks/pressGroupContext.d.ts +6 -0
- package/dist/hooks/pressGroupContext.d.ts.map +1 -0
- package/dist/hooks/pressGroupContext.js +20 -0
- package/dist/hooks/rootScrollStyles.d.ts +48 -0
- package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
- package/dist/hooks/rootScrollStyles.js +207 -0
- package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
- package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
- package/dist/hooks/scrollLockTouchGuard.js +117 -0
- package/dist/hooks/scrollbarGutter.d.ts +4 -4
- package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
- package/dist/hooks/scrollbarGutter.js +36 -23
- package/dist/hooks/useActionGroupTracking.d.ts +53 -0
- package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
- package/dist/hooks/useActionGroupTracking.js +174 -0
- package/dist/hooks/useAnimator.d.ts +41 -0
- package/dist/hooks/useAnimator.d.ts.map +1 -0
- package/dist/hooks/useAnimator.js +70 -0
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +1 -0
- package/dist/hooks/useAttachment.d.ts +1 -1
- package/dist/hooks/useAttachment.js +1 -1
- package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
- package/dist/hooks/useAutoMediaMode.js +1 -0
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +2 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -1
- package/dist/hooks/useDevWarning.js +2 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +2 -0
- package/dist/hooks/useGridFocus.d.ts +8 -5
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +4 -3
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -0
- package/dist/hooks/useImageMode.d.ts.map +1 -1
- package/dist/hooks/useImageMode.js +3 -0
- package/dist/hooks/useInputStatusIcon.d.ts +1 -1
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +2 -2
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +1 -1
- package/dist/hooks/useLongPress.d.ts +8 -9
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +23 -106
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +2 -0
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +3 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +2 -1
- package/dist/hooks/usePressFeedback.d.ts.map +1 -1
- package/dist/hooks/usePressFeedback.js +1 -0
- package/dist/hooks/useResolvedRequired.d.ts +3 -0
- package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
- package/dist/hooks/useResolvedRequired.js +3 -0
- package/dist/hooks/useScrollLock.d.ts +8 -9
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +50 -48
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +5 -0
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +3 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +30 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/internal/indicatorPress.stylex.d.ts +20 -0
- package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
- package/dist/internal/indicatorPress.stylex.js +26 -0
- package/dist/internal/selectable-card.d.ts +21 -0
- package/dist/internal/selectable-card.d.ts.map +1 -0
- package/dist/internal/selectable-card.js +20 -0
- package/dist/internal/sheetDraft.d.ts +2 -2
- package/dist/internal/sheetDraft.js +2 -2
- package/dist/motion/animatedLayout.d.ts +8 -0
- package/dist/motion/animatedLayout.d.ts.map +1 -1
- package/dist/motion/animatedLayout.js +246 -53
- package/dist/motion/animator.d.ts +14 -14
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +45 -26
- package/dist/motion/frameBlock.d.ts +14 -0
- package/dist/motion/frameBlock.d.ts.map +1 -0
- package/dist/motion/frameBlock.js +16 -0
- package/dist/motion/progress.d.ts +88 -0
- package/dist/motion/progress.d.ts.map +1 -0
- package/dist/motion/progress.js +128 -0
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +3 -1
- package/dist/motion/uikit/alert.d.ts +41 -0
- package/dist/motion/uikit/alert.d.ts.map +1 -0
- package/dist/motion/uikit/alert.js +43 -0
- package/dist/motion/uikit/index.d.ts +4 -3
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +4 -3
- package/dist/motion/uikit/picker.d.ts +96 -0
- package/dist/motion/uikit/picker.d.ts.map +1 -0
- package/dist/motion/uikit/picker.js +117 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
- package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
- package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +29 -4
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +14 -13
- package/dist/theme/motionKnobs.d.ts +4 -3
- package/dist/theme/motionKnobs.d.ts.map +1 -1
- package/dist/theme/motionKnobs.js +3 -2
- package/dist/theme/themeMotion.d.ts +6 -0
- package/dist/theme/themeMotion.d.ts.map +1 -1
- package/dist/theme/themeMotion.js +15 -2
- package/dist/theme/tokens.stylex.d.ts +3 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +4 -1
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +12 -0
- package/dist/utils/disabledInteraction.d.ts +10 -2
- package/dist/utils/disabledInteraction.d.ts.map +1 -1
- package/dist/utils/disabledInteraction.js +16 -2
- package/dist/utils/focusReturn.d.ts +22 -25
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +36 -29
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +4 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +3 -2
- package/dist/utils/isFocusDetached.d.ts +27 -0
- package/dist/utils/isFocusDetached.d.ts.map +1 -0
- package/dist/utils/isFocusDetached.js +32 -0
- package/dist/utils/plainDate.d.ts +31 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +68 -4
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +20 -6
- package/dist/utils/triggerFocus.d.ts +36 -0
- package/dist/utils/triggerFocus.d.ts.map +1 -0
- package/dist/utils/triggerFocus.js +65 -0
- package/locales/en.json +120 -0
- package/locales/pseudo.json +90 -0
- package/package.json +14 -9
- package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
- package/src/AlertDialog/AlertDialog.tsx +46 -5
- package/src/AppShell/AppShell.tsx +13 -4
- package/src/BottomSheet/BottomSheet.tsx +1 -0
- package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
- package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
- package/src/BottomSheet/useMobileKeyboard.ts +4 -0
- package/src/BottomSheet/useSheetGestures.ts +10 -1
- package/src/Button/Button.tsx +26 -4
- package/src/Calendar/Calendar.tsx +40 -32
- package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
- package/src/Calendar/hooks/useCalendarDays.ts +5 -10
- package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/ChatComposerInput.tsx +4 -7
- package/src/Chat/ChatMessageList.tsx +2 -1
- package/src/Chat/useChatDictation.ts +1 -0
- package/src/Chat/useChatNewMessages.ts +1 -1
- package/src/Chat/useChatStreamScroll.ts +2 -0
- package/src/Chat/useSpeechRecognition.ts +2 -0
- package/src/Chat/useTriggerMenu.tsx +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
- package/src/CheckboxInput/CheckboxInput.tsx +38 -15
- package/src/CheckboxList/CheckboxList.doc.mjs +7 -0
- package/src/CheckboxList/CheckboxList.tsx +9 -0
- package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
- package/src/CodeBlock/CodeBlock.tsx +41 -4
- package/src/CommandPalette/CommandPalette.tsx +1 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
- package/src/ComplexSelector/ComplexSelector.tsx +20 -5
- package/src/ContextMenu/ContextMenu.tsx +2 -2
- package/src/DateInput/MonthScroller.tsx +8 -2
- package/src/DateInput/PickerWheel.tsx +765 -0
- package/src/DateInput/TouchDateField.tsx +6 -32
- package/src/DateInput/Wheel.tsx +94 -150
- package/src/DateInput/useOwnScrollGesture.ts +25 -3
- package/src/DateInput/usePointerDragScroll.ts +1 -0
- package/src/DateInput/useScrollSettle.ts +2 -0
- package/src/DateInput/useWheelListbox.ts +112 -0
- package/src/DateInput/wheelOptions.ts +155 -0
- package/src/DateInput/wheelPhysics.ts +406 -0
- package/src/DateInput/wheelStrip.ts +341 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +8 -13
- package/src/Dialog/Dialog.tsx +12 -32
- package/src/Drawer/useDrawerDialogPresence.ts +2 -0
- package/src/DropdownMenu/useMenuOverflow.ts +3 -0
- package/src/Field/Field.tsx +2 -2
- package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
- package/src/FormLayout/FormLayout.doc.mjs +181 -46
- package/src/FormLayout/FormLayout.tsx +5 -1
- package/src/HoverCard/HoverCard.doc.mjs +10 -8
- package/src/HoverCard/HoverCard.tsx +58 -6
- package/src/HoverCard/useHoverCard.doc.mjs +178 -36
- package/src/HoverCard/useHoverCard.tsx +49 -54
- package/src/Icon/Icon.doc.mjs +51 -10
- package/src/Icon/Icon.tsx +15 -7
- package/src/IconButton/IconButton.doc.mjs +141 -21
- package/src/InfoTip/InfoTip.tsx +72 -16
- package/src/Item/useSwipeAction.ts +2 -0
- package/src/Layer/modalOutlet.ts +2 -0
- package/src/Layer/outsidePress.ts +1 -0
- package/src/Layer/useLayer.tsx +3 -1
- package/src/Layer/useLayerDismissal.ts +2 -0
- package/src/Layer/useTouchTrigger.ts +19 -6
- package/src/Layout/index.ts +1 -1
- package/src/Layout/layoutReset.ts +1 -1
- package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
- package/src/Layout/padding.stylex.ts +9 -133
- package/src/Layout/paddingStyles.stylex.ts +87 -0
- package/src/Lightbox/Lightbox.tsx +20 -1
- package/src/Lightbox/useLightbox.doc.mjs +167 -0
- package/src/MobileNav/MobileNav.tsx +10 -31
- package/src/MultiSelector/MultiSelector.tsx +2 -7
- package/src/NumberInput/NumberInput.tsx +2 -7
- package/src/Outline/useOutlineFromDOM.ts +2 -0
- package/src/Outline/useScrollSpy.ts +2 -0
- package/src/OverflowList/OverflowList.tsx +2 -0
- package/src/Popover/Popover.tsx +4 -0
- package/src/Popover/usePopover.tsx +2 -2
- package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
- package/src/PowerSearch/PowerSearch.tsx +620 -157
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
- package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
- package/src/PowerSearch/PowerSearchToken.tsx +2 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
- package/src/PowerSearch/formatFilterValue.ts +49 -27
- package/src/PowerSearch/formatTokenValue.ts +220 -0
- package/src/PowerSearch/index.ts +5 -1
- package/src/PowerSearch/powerSearchDateZone.ts +95 -0
- package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
- package/src/PowerSearch/types.ts +8 -1
- package/src/ProgressBar/ProgressBarTouch.ts +2 -0
- package/src/RadioList/RadioList.tsx +3 -2
- package/src/RadioList/RadioListItem.tsx +5 -3
- package/src/Resizable/Resizable.doc.mjs +5 -4
- package/src/Resizable/ResizeHandle.tsx +169 -109
- package/src/Resizable/createResizable.ts +831 -0
- package/src/Resizable/useResizable.ts +292 -623
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
- package/src/SelectableCard/SelectableCard.tsx +39 -10
- package/src/SelectableCard/selectableCardInput.ts +30 -0
- package/src/Selector/Selector.tsx +7 -19
- package/src/SideNav/SideNav.tsx +41 -5
- package/src/Slider/Slider.tsx +20 -11
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Spinner/Spinner.tsx +77 -63
- package/src/Stepper/Stepper.tsx +10 -27
- package/src/Switch/Switch.tsx +2 -6
- package/src/Switch/useSwitchTouch.ts +4 -4
- package/src/Table/BaseTable.tsx +46 -12
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
- package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
- package/src/TextArea/TextArea.tsx +2 -7
- package/src/TextInput/TextInput.tsx +13 -17
- package/src/TimeInput/TimeInput.tsx +2 -0
- package/src/TimeInput/TouchTimeField.tsx +2 -0
- package/src/Timer/Timer.tsx +1 -0
- package/src/Timestamp/Timestamp.tsx +1 -1
- package/src/Timestamp/formatInstant.ts +1 -33
- package/src/Toast/Toast.doc.mjs +4 -3
- package/src/Toast/Toast.tsx +52 -32
- package/src/Toast/ToastViewport.tsx +123 -35
- package/src/Toast/types.ts +9 -3
- package/src/Toast/useToast.tsx +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
- package/src/Tokenizer/Tokenizer.tsx +61 -62
- package/src/Tokenizer/TokenizerBottomSheet.tsx +9 -11
- package/src/Tokenizer/index.ts +1 -0
- package/src/Tooltip/Tooltip.tsx +6 -42
- package/src/Tooltip/useTooltip.doc.mjs +24 -0
- package/src/Tooltip/useTooltip.tsx +237 -134
- package/src/Typeahead/BaseTypeahead.tsx +27 -17
- package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/animator/createAnimator.doc.mjs +153 -0
- package/src/animator/createAnimator.ts +324 -0
- package/src/gestures/GestureHost.ts +1 -1
- package/src/gestures/PressTracker.ts +4 -3
- package/src/gestures/README.md +10 -4
- package/src/hooks/ModalAnnounceProvider.tsx +1 -0
- package/src/hooks/actionGroupTracker.ts +20 -5
- package/src/hooks/index.ts +2 -0
- package/src/hooks/longPressDetector.ts +273 -0
- package/src/hooks/pressGroupContext.ts +21 -0
- package/src/hooks/rootScrollStyles.ts +247 -0
- package/src/hooks/scrollLockTouchGuard.ts +149 -0
- package/src/hooks/scrollbarGutter.ts +41 -26
- package/src/hooks/useActionGroupTracking.ts +224 -0
- package/src/hooks/useAnimator.doc.mjs +109 -0
- package/src/hooks/useAnimator.ts +67 -0
- package/src/hooks/useAnnounceRenderedText.ts +1 -0
- package/src/hooks/useAttachment.ts +1 -1
- package/src/hooks/useAutoMediaMode.ts +1 -0
- package/src/hooks/useBusyAnnouncement.ts +2 -0
- package/src/hooks/useDevWarning.ts +2 -0
- package/src/hooks/useFocusTrap.ts +2 -0
- package/src/hooks/useGridFocus.doc.mjs +6 -6
- package/src/hooks/useGridFocus.ts +10 -7
- package/src/hooks/useHotkeys.ts +2 -0
- package/src/hooks/useImageMode.ts +2 -0
- package/src/hooks/useInputStatusIcon.tsx +3 -2
- package/src/hooks/useKeyboardHint.tsx +1 -1
- package/src/hooks/useLongPress.doc.mjs +2 -2
- package/src/hooks/useLongPress.ts +32 -122
- package/src/hooks/useMenuHover.ts +1 -0
- package/src/hooks/useMenuPress.ts +2 -0
- package/src/hooks/useOverflow.ts +2 -1
- package/src/hooks/usePressFeedback.ts +1 -0
- package/src/hooks/useResolvedRequired.ts +3 -0
- package/src/hooks/useScrollLock.doc.mjs +51 -12
- package/src/hooks/useScrollLock.ts +53 -60
- package/src/hooks/useScrollableArea.ts +4 -0
- package/src/hooks/useStreamingText.ts +2 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
- package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
- package/src/i18n/generated-locales/en.generated.ts +41 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
- package/src/index.ts +13 -0
- package/src/internal/indicatorPress.stylex.ts +24 -0
- package/src/internal/selectable-card.ts +21 -0
- package/src/internal/sheetDraft.ts +2 -2
- package/src/motion/MEASUREMENTS.md +18 -0
- package/src/motion/README.md +10 -5
- package/src/motion/animatedLayout.ts +323 -60
- package/src/motion/animator.ts +66 -37
- package/src/motion/frameBlock.ts +16 -0
- package/src/motion/progress.ts +155 -0
- package/src/motion/reducedMotion.ts +3 -1
- package/src/motion/uikit/alert.ts +43 -0
- package/src/motion/uikit/index.ts +4 -3
- package/src/motion/uikit/picker.ts +116 -0
- package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
- package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
- package/src/theme/Theme.tsx +37 -3
- package/src/theme/generateThemeRules.ts +14 -12
- package/src/theme/motionKnobs.ts +4 -3
- package/src/theme/themeMotion.ts +17 -2
- package/src/theme/tokens.stylex.ts +2 -0
- package/src/utils/dateParser.ts +16 -0
- package/src/utils/disabledInteraction.ts +23 -2
- package/src/utils/focusReturn.ts +38 -31
- package/src/utils/index.ts +1 -1
- package/src/utils/interactionModality.ts +4 -0
- package/src/utils/interactionOverlay.stylex.ts +3 -2
- package/src/utils/isFocusDetached.ts +34 -0
- package/src/utils/plainDate.ts +80 -4
- package/src/utils/pressFeedback.ts +24 -6
- package/src/utils/triggerFocus.ts +80 -0
- package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
- package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
- package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
- package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
- package/dist/Layer/usePressPin.d.ts +0 -93
- package/dist/Layer/usePressPin.d.ts.map +0 -1
- package/dist/Layer/usePressPin.js +0 -363
- package/dist/internal/touch-sheet.d.ts +0 -21
- package/dist/internal/touch-sheet.d.ts.map +0 -1
- package/dist/internal/touch-sheet.js +0 -19
- package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
- package/src/Layer/usePressPin.ts +0 -510
- package/src/internal/touch-sheet.ts +0 -21
|
@@ -108,8 +108,6 @@ import {
|
|
|
108
108
|
formatSharedDate,
|
|
109
109
|
plainDateFromISO,
|
|
110
110
|
plainDateToday,
|
|
111
|
-
plainDateFormat,
|
|
112
|
-
DATE_FORMAT_WEEKDAY_ONLY,
|
|
113
111
|
type ISODateString,
|
|
114
112
|
} from '../utils';
|
|
115
113
|
import {plainDateFormatStandaloneMonthYear} from '../utils/plainDate';
|
|
@@ -117,6 +115,7 @@ import {chainEventHandlers} from '../utils/chainEventHandlers';
|
|
|
117
115
|
import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
118
116
|
import {usePressFeedback} from '../hooks/usePressFeedback';
|
|
119
117
|
import {normalizeDayOfWeek} from '../utils/dateTypes';
|
|
118
|
+
import {getWeekdayHeaders} from '../Calendar/getWeekdayHeaderNames';
|
|
120
119
|
import {MonthScroller, type MonthScrollerHandle} from './MonthScroller';
|
|
121
120
|
import {MonthYearWheels} from './MonthYearWheels';
|
|
122
121
|
import {
|
|
@@ -676,6 +675,7 @@ export function TouchDateField({
|
|
|
676
675
|
const scrollerHandleRef = useRef<MonthScrollerHandle | null>(null);
|
|
677
676
|
// Pending focus handoff from the clear button; see handleClear.
|
|
678
677
|
const clearFocusTimerRef = useRef<number | null>(null);
|
|
678
|
+
// Releases the focus timer on unmount.
|
|
679
679
|
useEffect(
|
|
680
680
|
() => () => {
|
|
681
681
|
if (clearFocusTimerRef.current != null) {
|
|
@@ -720,34 +720,8 @@ export function TouchDateField({
|
|
|
720
720
|
|
|
721
721
|
const {year, month} = fromMonthIndex(monthIndex);
|
|
722
722
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
*
|
|
726
|
-
* The sheet is full width and the columns are ~51px, so there is room for
|
|
727
|
-
* the form people actually read, and a picker operated by thumb should not
|
|
728
|
-
* make anyone decode "Tu" against "Th".
|
|
729
|
-
*
|
|
730
|
-
* This is CLDR's `abbreviated` width, which `Intl` produces natively — no
|
|
731
|
-
* truncation, so the 28 non-English locales stay correct rather than being
|
|
732
|
-
* sliced to three characters. (Verified against the CLDR tables for all 30
|
|
733
|
-
* locales in the catalog.) Calendar's 2-letter row is CLDR's *short* width,
|
|
734
|
-
* which `Intl` cannot express, which is exactly why that surface needs a
|
|
735
|
-
* generated table and this one does not.
|
|
736
|
-
*
|
|
737
|
-
* Built here rather than taken from `useCalendarDays`, which supplies the
|
|
738
|
-
* short form for Calendar's own header. The rotation matches: day 4 of
|
|
739
|
-
* January 1970 was a Sunday, so offsetting from it by `weekStartsOn` walks
|
|
740
|
-
* the week in the same order the panes lay out their columns.
|
|
741
|
-
*/
|
|
742
|
-
const dayNames = useMemo(
|
|
743
|
-
() =>
|
|
744
|
-
Array.from({length: 7}, (_, offset) =>
|
|
745
|
-
plainDateFormat(
|
|
746
|
-
{year: 1970, month: 1, day: 4 + ((weekStartsOn + offset) % 7)},
|
|
747
|
-
DATE_FORMAT_WEEKDAY_ONLY,
|
|
748
|
-
locale,
|
|
749
|
-
),
|
|
750
|
-
),
|
|
723
|
+
const weekdayHeaders = useMemo(
|
|
724
|
+
() => getWeekdayHeaders(locale, weekStartsOn),
|
|
751
725
|
[locale, weekStartsOn],
|
|
752
726
|
);
|
|
753
727
|
const monthYearLabel = plainDateFormatStandaloneMonthYear(
|
|
@@ -1107,8 +1081,8 @@ export function TouchDateField({
|
|
|
1107
1081
|
styles.weekdays,
|
|
1108
1082
|
isWheelOpen && styles.weekdaysHidden,
|
|
1109
1083
|
)}>
|
|
1110
|
-
{
|
|
1111
|
-
<div key={
|
|
1084
|
+
{weekdayHeaders.map(({dayOfWeek, name}) => (
|
|
1085
|
+
<div key={dayOfWeek} {...stylex.props(styles.weekday)}>
|
|
1112
1086
|
{name}
|
|
1113
1087
|
</div>
|
|
1114
1088
|
))}
|
package/src/DateInput/Wheel.tsx
CHANGED
|
@@ -4,41 +4,30 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Wheel.tsx
|
|
7
|
-
* @input Option list, selected value
|
|
8
|
-
* @output Exports Wheel
|
|
9
|
-
*
|
|
7
|
+
* @input Option list, selected value and change callback
|
|
8
|
+
* @output Exports Wheel (one picker column), ScrollWheel (the scrolling
|
|
9
|
+
* column) and the shared types of wheelOptions.ts
|
|
10
|
+
* @position Internal component; consumed by MonthYearWheels.tsx,
|
|
11
|
+
* TouchTimeField.tsx and TouchDateTimeField.tsx
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* is
|
|
14
|
-
* each end so the first and last option can reach the middle, and a commit
|
|
15
|
-
* when the scrolling stops and no finger or mouse drag still holds it.
|
|
13
|
+
* Wheel picks its column by the primary pointer. Under a finger it is
|
|
14
|
+
* PickerWheel.tsx, the touch layer, imported here alone. Under a fine pointer
|
|
15
|
+
* it is the snap-scrolling column below.
|
|
16
16
|
*
|
|
17
|
-
* The
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* finger with no JS in the frame loop. It is guarded by `@supports`, because a
|
|
21
|
-
* browser that does not understand `animation-timeline` would otherwise run
|
|
22
|
-
* the same keyframes on the document timeline and simply play them once.
|
|
23
|
-
*
|
|
24
|
-
* Under Reduce Motion, the wheel's own scrolls (a step from a key or a click,
|
|
25
|
-
* the travel to the nearest enabled row) land without travel. They cross-fade
|
|
26
|
-
* on a touch screen and land at once otherwise. A finger's scroll and its
|
|
27
|
-
* momentum stay the platform's.
|
|
28
|
-
*
|
|
29
|
-
* Accessibility: this is a listbox, not a novel widget. It is one tab stop
|
|
30
|
-
* with arrow/Home/End/PageUp/PageDown keys, `aria-activedescendant` tracking
|
|
31
|
-
* the active row, and every row reachable by tap — none of which depends on
|
|
32
|
-
* the scroll-driven decoration.
|
|
17
|
+
* The scrolling column is a scroll container: momentum, rubber-banding and the
|
|
18
|
+
* settle are the platform's. Its rows fade and tip on a CSS `view()` timeline,
|
|
19
|
+
* behind `@supports`. Under Reduce Motion its own scrolls land without travel.
|
|
33
20
|
*
|
|
34
21
|
* SYNC: When modified, update:
|
|
22
|
+
* - /packages/core/src/DateInput/PickerWheel.tsx (the touch column)
|
|
23
|
+
* - /packages/core/src/DateInput/wheelOptions.ts
|
|
35
24
|
* - /packages/core/src/DateInput/TouchDateField.tsx
|
|
36
25
|
* - /packages/core/src/DateTimeInput/TouchDateTimeField.tsx
|
|
37
26
|
* - /packages/core/src/DateInput/DateInput.doc.mjs
|
|
38
27
|
* - /packages/core/src/DateInput/DateInputTouch.test.tsx
|
|
39
28
|
*/
|
|
40
29
|
|
|
41
|
-
import {useCallback, useEffect,
|
|
30
|
+
import {useCallback, useEffect, useRef, useState} from 'react';
|
|
42
31
|
import * as stylex from '@stylexjs/stylex';
|
|
43
32
|
import {
|
|
44
33
|
colorVars,
|
|
@@ -54,10 +43,25 @@ import {
|
|
|
54
43
|
reducedMotionFade,
|
|
55
44
|
type ReducedMotionDip,
|
|
56
45
|
} from '../motion/reducedMotion';
|
|
46
|
+
import {useTouchPresentation} from '../utils/touchPresentation';
|
|
47
|
+
import {PickerWheel} from './PickerWheel';
|
|
57
48
|
import {dateInputTouchSizes, dateInputTouchGeometry} from './tokens.stylex';
|
|
58
49
|
import {useOwnScrollGesture} from './useOwnScrollGesture';
|
|
59
50
|
import {usePointerDragScroll} from './usePointerDragScroll';
|
|
60
51
|
import {useScrollSettle} from './useScrollSettle';
|
|
52
|
+
import {useWheelListbox} from './useWheelListbox';
|
|
53
|
+
import {
|
|
54
|
+
endIndex,
|
|
55
|
+
nearestEnabledIndex,
|
|
56
|
+
steppedIndex,
|
|
57
|
+
type WheelProps,
|
|
58
|
+
} from './wheelOptions';
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
nearestEnabledIndex,
|
|
62
|
+
type WheelOption,
|
|
63
|
+
type WheelProps,
|
|
64
|
+
} from './wheelOptions';
|
|
61
65
|
|
|
62
66
|
const ITEM_BLOCK_SIZE = dateInputTouchSizes.wheelItemSize;
|
|
63
67
|
|
|
@@ -214,80 +218,35 @@ const styles = stylex.create({
|
|
|
214
218
|
},
|
|
215
219
|
});
|
|
216
220
|
|
|
217
|
-
export interface WheelOption {
|
|
218
|
-
/** Stable numeric identity of the row (a month 1-12, or a year). */
|
|
219
|
-
value: number;
|
|
220
|
-
/** Row text. */
|
|
221
|
-
label: string;
|
|
222
|
-
/**
|
|
223
|
-
* Rows outside min/max stay visible but cannot be committed: a wheel that
|
|
224
|
-
* stops on one travels on to the nearest enabled row.
|
|
225
|
-
*/
|
|
226
|
-
isDisabled?: boolean;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
export interface WheelProps {
|
|
230
|
-
/** Accessible name for the column, e.g. "Month". */
|
|
231
|
-
label: string;
|
|
232
|
-
/** Rows, top to bottom. */
|
|
233
|
-
options: ReadonlyArray<WheelOption>;
|
|
234
|
-
/** Committed value; must match one option's `value`. */
|
|
235
|
-
value: number;
|
|
236
|
-
/** Fired when the wheel comes to rest on a different, enabled row. */
|
|
237
|
-
onChange: (value: number) => void;
|
|
238
|
-
/**
|
|
239
|
-
* False while the wheel is hidden — scroll offsets of a display:none
|
|
240
|
-
* scroller are meaningless, so listeners and the initial scroll wait.
|
|
241
|
-
*/
|
|
242
|
-
isActive?: boolean;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
221
|
/**
|
|
246
|
-
*
|
|
247
|
-
*
|
|
248
|
-
* `towardIndex` (the committed row), and a wheel with no enabled row stays on
|
|
249
|
-
* `towardIndex`.
|
|
222
|
+
* One picker column: UIPickerView's motion with flat rows under a finger, the
|
|
223
|
+
* snap-scrolling column under a fine pointer.
|
|
250
224
|
*
|
|
251
225
|
* @example
|
|
252
226
|
* ```
|
|
253
|
-
*
|
|
254
|
-
*
|
|
227
|
+
* <Wheel
|
|
228
|
+
* label="Month"
|
|
229
|
+
* options={monthOptions}
|
|
230
|
+
* value={month}
|
|
231
|
+
* onChange={setMonth}
|
|
232
|
+
* />
|
|
255
233
|
* ```
|
|
256
234
|
*/
|
|
257
|
-
export function
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
const isEnabled = (i: number) =>
|
|
263
|
-
i >= 0 && i < options.length && !options[i].isDisabled;
|
|
264
|
-
if (isEnabled(index)) {
|
|
265
|
-
return index;
|
|
266
|
-
}
|
|
267
|
-
for (let distance = 1; distance < options.length; distance++) {
|
|
268
|
-
const below = index - distance;
|
|
269
|
-
const above = index + distance;
|
|
270
|
-
const isBelowEnabled = isEnabled(below);
|
|
271
|
-
const isAboveEnabled = isEnabled(above);
|
|
272
|
-
if (isBelowEnabled && isAboveEnabled) {
|
|
273
|
-
return towardIndex < index ? below : above;
|
|
274
|
-
}
|
|
275
|
-
if (isBelowEnabled) {
|
|
276
|
-
return below;
|
|
277
|
-
}
|
|
278
|
-
if (isAboveEnabled) {
|
|
279
|
-
return above;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
return towardIndex;
|
|
235
|
+
export function Wheel(props: WheelProps) {
|
|
236
|
+
// One touch model on every touch device: a finger gets UIPickerView's motion
|
|
237
|
+
// with flat rows, a fine pointer the scrolling column.
|
|
238
|
+
const {isTouch} = useTouchPresentation();
|
|
239
|
+
return isTouch ? <PickerWheel {...props} /> : <ScrollWheel {...props} />;
|
|
283
240
|
}
|
|
284
241
|
|
|
242
|
+
Wheel.displayName = 'Wheel';
|
|
243
|
+
|
|
285
244
|
/**
|
|
286
|
-
* One snap-scrolling picker column.
|
|
245
|
+
* One snap-scrolling picker column, under a fine pointer.
|
|
287
246
|
*
|
|
288
247
|
* @example
|
|
289
248
|
* ```
|
|
290
|
-
* <
|
|
249
|
+
* <ScrollWheel
|
|
291
250
|
* label="Month"
|
|
292
251
|
* options={monthOptions}
|
|
293
252
|
* value={month}
|
|
@@ -295,14 +254,13 @@ export function nearestEnabledIndex(
|
|
|
295
254
|
* />
|
|
296
255
|
* ```
|
|
297
256
|
*/
|
|
298
|
-
export function
|
|
257
|
+
export function ScrollWheel({
|
|
299
258
|
label,
|
|
300
259
|
options,
|
|
301
260
|
value,
|
|
302
261
|
onChange,
|
|
303
262
|
isActive = true,
|
|
304
263
|
}: WheelProps) {
|
|
305
|
-
const id = useId();
|
|
306
264
|
const scrollerRef = useRef<HTMLDivElement | null>(null);
|
|
307
265
|
const selectedIndex = Math.max(
|
|
308
266
|
0,
|
|
@@ -462,6 +420,8 @@ export function Wheel({
|
|
|
462
420
|
// useScrollSettle. The settle handler re-checks the position afterwards, so
|
|
463
421
|
// a correction that is genuinely needed still happens, just at rest.
|
|
464
422
|
const parkedRef = useRef(false);
|
|
423
|
+
// Syncs the wheel's scroll position with the selected index while the wheel
|
|
424
|
+
// is active.
|
|
465
425
|
useEffect(() => {
|
|
466
426
|
if (!isActive) {
|
|
467
427
|
parkedRef.current = false;
|
|
@@ -492,6 +452,8 @@ export function Wheel({
|
|
|
492
452
|
// Highlight follows the finger. rAF-throttled: a scroll can fire far more
|
|
493
453
|
// often than the display refreshes, and this only feeds a repaint.
|
|
494
454
|
const frameRef = useRef<number | undefined>(undefined);
|
|
455
|
+
// Syncs a scroll listener with the active wheel. It updates the highlighted
|
|
456
|
+
// row.
|
|
495
457
|
useEffect(() => {
|
|
496
458
|
const scroller = scrollerRef.current;
|
|
497
459
|
if (scroller == null || !isActive) {
|
|
@@ -531,69 +493,64 @@ export function Wheel({
|
|
|
531
493
|
// there is no way to share — it takes every touch that lands on it.
|
|
532
494
|
useOwnScrollGesture(scrollerRef, 'all', {isEnabled: isActive});
|
|
533
495
|
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
);
|
|
540
|
-
const option = options[next];
|
|
541
|
-
if (option == null || option.isDisabled) {
|
|
496
|
+
// A key commits the row it moves to and scrolls the column there.
|
|
497
|
+
const moveTo = useCallback(
|
|
498
|
+
(row: number | null) => {
|
|
499
|
+
const option = row == null ? undefined : options[row];
|
|
500
|
+
if (row == null || option == null || option.isDisabled) {
|
|
542
501
|
return;
|
|
543
502
|
}
|
|
544
|
-
setActiveIndex(
|
|
545
|
-
scrollToIndex(
|
|
503
|
+
setActiveIndex(row);
|
|
504
|
+
scrollToIndex(row, 'smooth');
|
|
546
505
|
if (option.value !== value) {
|
|
547
506
|
onChange(option.value);
|
|
548
507
|
}
|
|
549
508
|
},
|
|
550
|
-
[
|
|
509
|
+
[options, scrollToIndex, value, onChange],
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
const moveBy = useCallback(
|
|
513
|
+
(delta: number) => moveTo(steppedIndex(options, activeIndex, delta)),
|
|
514
|
+
[moveTo, options, activeIndex],
|
|
551
515
|
);
|
|
552
516
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
event.preventDefault();
|
|
570
|
-
moveBy(-10);
|
|
571
|
-
break;
|
|
572
|
-
case 'Home':
|
|
573
|
-
event.preventDefault();
|
|
574
|
-
moveBy(-activeIndex);
|
|
575
|
-
break;
|
|
576
|
-
case 'End':
|
|
577
|
-
event.preventDefault();
|
|
578
|
-
moveBy(options.length - 1 - activeIndex);
|
|
579
|
-
break;
|
|
580
|
-
default:
|
|
581
|
-
break;
|
|
517
|
+
// Home and End: the first and the last enabled row.
|
|
518
|
+
const toEnd = useCallback(
|
|
519
|
+
(end: 'first' | 'last') => moveTo(endIndex(options, end)),
|
|
520
|
+
[moveTo, options],
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
const activate = useCallback(
|
|
524
|
+
(index: number) => {
|
|
525
|
+
const option = options[index];
|
|
526
|
+
if (option == null || option.isDisabled) {
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
setActiveIndex(index);
|
|
530
|
+
scrollToIndex(index, 'smooth');
|
|
531
|
+
if (option.value !== value) {
|
|
532
|
+
onChange(option.value);
|
|
582
533
|
}
|
|
583
534
|
},
|
|
584
|
-
[
|
|
535
|
+
[options, scrollToIndex, value, onChange],
|
|
585
536
|
);
|
|
586
537
|
|
|
538
|
+
const {listboxProps, optionProps} = useWheelListbox({
|
|
539
|
+
label,
|
|
540
|
+
options,
|
|
541
|
+
value,
|
|
542
|
+
activeIndex,
|
|
543
|
+
stepBy: moveBy,
|
|
544
|
+
toEnd,
|
|
545
|
+
activate,
|
|
546
|
+
});
|
|
547
|
+
|
|
587
548
|
return (
|
|
588
549
|
<div {...stylex.props(styles.column)}>
|
|
589
550
|
<div aria-hidden="true" {...stylex.props(styles.band)} />
|
|
590
551
|
<div
|
|
591
552
|
ref={scrollerRef}
|
|
592
|
-
|
|
593
|
-
aria-label={label}
|
|
594
|
-
aria-activedescendant={`${id}-${options[activeIndex]?.value}`}
|
|
595
|
-
tabIndex={0}
|
|
596
|
-
onKeyDown={handleKeyDown}
|
|
553
|
+
{...listboxProps}
|
|
597
554
|
// Read in the capture phase. usePointerDragScroll stops a primary
|
|
598
555
|
// mouse press from bubbling, so that it does not reach BottomSheet's
|
|
599
556
|
// drag. A bubbling handler would never see a mouse, and would keep the
|
|
@@ -608,20 +565,7 @@ export function Wheel({
|
|
|
608
565
|
{options.map((option, index) => (
|
|
609
566
|
<div
|
|
610
567
|
key={option.value}
|
|
611
|
-
|
|
612
|
-
role="option"
|
|
613
|
-
aria-selected={option.value === value}
|
|
614
|
-
aria-disabled={option.isDisabled || undefined}
|
|
615
|
-
onClick={() => {
|
|
616
|
-
if (option.isDisabled) {
|
|
617
|
-
return;
|
|
618
|
-
}
|
|
619
|
-
setActiveIndex(index);
|
|
620
|
-
scrollToIndex(index, 'smooth');
|
|
621
|
-
if (option.value !== value) {
|
|
622
|
-
onChange(option.value);
|
|
623
|
-
}
|
|
624
|
-
}}
|
|
568
|
+
{...optionProps(option, index)}
|
|
625
569
|
{...stylex.props(
|
|
626
570
|
styles.item,
|
|
627
571
|
index === activeIndex && styles.itemActive,
|
|
@@ -635,4 +579,4 @@ export function Wheel({
|
|
|
635
579
|
);
|
|
636
580
|
}
|
|
637
581
|
|
|
638
|
-
|
|
582
|
+
ScrollWheel.displayName = 'ScrollWheel';
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* @file useOwnScrollGesture.ts
|
|
7
7
|
* @input A scroll container ref and which axis it owns
|
|
8
8
|
* @output Stops touch gestures on that container from reaching an ancestor
|
|
9
|
-
* @position Internal behavior hook; consumed by Wheel.tsx
|
|
9
|
+
* @position Internal behavior hook; consumed by Wheel.tsx, PickerWheel.tsx and
|
|
10
|
+
* MonthScroller.tsx
|
|
10
11
|
*
|
|
11
12
|
* Lets a nested scroller keep the finger that lands on it.
|
|
12
13
|
*
|
|
@@ -114,6 +115,16 @@ export type OwnScrollGestureOptions = {
|
|
|
114
115
|
* so momentum and snapping are never second-guessed.
|
|
115
116
|
*/
|
|
116
117
|
onSwipe?: (direction: 1 | -1) => void;
|
|
118
|
+
/**
|
|
119
|
+
* Also keep the pointer a touch lands with, for an `'all'` scroller that pans
|
|
120
|
+
* through the gesture system rather than natively. A sheet arms its pull-down
|
|
121
|
+
* on its body's `pointerdown`, and counts on a native pan to cancel a touch
|
|
122
|
+
* pointer. A pan of the gesture system never cancels it. Without this, the
|
|
123
|
+
* sheet follows the first 8 px of a downward drag before the scroller's own
|
|
124
|
+
* pan takes over. The gesture host and the shared modality tracker listen in
|
|
125
|
+
* the capture phase, before this.
|
|
126
|
+
*/
|
|
127
|
+
isPointerKept?: boolean;
|
|
117
128
|
};
|
|
118
129
|
|
|
119
130
|
/**
|
|
@@ -130,13 +141,15 @@ export function useOwnScrollGesture(
|
|
|
130
141
|
axis: OwnedAxis = 'all',
|
|
131
142
|
options: OwnScrollGestureOptions = {},
|
|
132
143
|
): void {
|
|
133
|
-
const {isEnabled = true, onSwipe} = options;
|
|
144
|
+
const {isEnabled = true, onSwipe, isPointerKept = false} = options;
|
|
134
145
|
|
|
135
146
|
// Read through a ref so a caller need not memoize the callback: re-running
|
|
136
147
|
// this effect would tear the listeners off mid-gesture.
|
|
137
148
|
const onSwipeRef = useRef(onSwipe);
|
|
138
149
|
onSwipeRef.current = onSwipe;
|
|
139
150
|
|
|
151
|
+
// Syncs touch listeners on the element with `isEnabled`. They decide which
|
|
152
|
+
// gesture owns a horizontal scroll.
|
|
140
153
|
useEffect(() => {
|
|
141
154
|
const element = ref.current;
|
|
142
155
|
if (element == null || !isEnabled) {
|
|
@@ -213,15 +226,24 @@ export function useOwnScrollGesture(
|
|
|
213
226
|
claimed = null;
|
|
214
227
|
};
|
|
215
228
|
|
|
229
|
+
const keepPointer = (event: PointerEvent) => event.stopPropagation();
|
|
230
|
+
const isKeepingPointer = axis === 'all' && isPointerKept;
|
|
231
|
+
|
|
216
232
|
element.addEventListener('touchstart', onStart, {passive: true});
|
|
217
233
|
element.addEventListener('touchmove', onMove, {passive: true});
|
|
218
234
|
element.addEventListener('touchend', onEnd, {passive: true});
|
|
219
235
|
element.addEventListener('touchcancel', onEnd, {passive: true});
|
|
236
|
+
if (isKeepingPointer) {
|
|
237
|
+
element.addEventListener('pointerdown', keepPointer);
|
|
238
|
+
}
|
|
220
239
|
return () => {
|
|
221
240
|
element.removeEventListener('touchstart', onStart);
|
|
222
241
|
element.removeEventListener('touchmove', onMove);
|
|
223
242
|
element.removeEventListener('touchend', onEnd);
|
|
224
243
|
element.removeEventListener('touchcancel', onEnd);
|
|
244
|
+
if (isKeepingPointer) {
|
|
245
|
+
element.removeEventListener('pointerdown', keepPointer);
|
|
246
|
+
}
|
|
225
247
|
};
|
|
226
|
-
}, [ref, axis, isEnabled]);
|
|
248
|
+
}, [ref, axis, isEnabled, isPointerKept]);
|
|
227
249
|
}
|
|
@@ -87,6 +87,7 @@ export function usePointerDragScroll(
|
|
|
87
87
|
): PointerDragScrollState {
|
|
88
88
|
const isDraggingRef = useRef(false);
|
|
89
89
|
|
|
90
|
+
// Syncs pointer listeners with `isEnabled`. A mouse drag scrolls the element.
|
|
90
91
|
useEffect(() => {
|
|
91
92
|
const element = ref.current;
|
|
92
93
|
if (element == null || !isEnabled) {
|
|
@@ -98,6 +98,8 @@ export function useScrollSettle(
|
|
|
98
98
|
|
|
99
99
|
const isAtRestRef = useRef(true);
|
|
100
100
|
|
|
101
|
+
// Syncs scroll, touch and pointer listeners with `isEnabled`. They find when
|
|
102
|
+
// scrolling stops.
|
|
101
103
|
useEffect(() => {
|
|
102
104
|
const element = ref.current;
|
|
103
105
|
if (element == null || !isEnabled) {
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useWheelListbox.ts
|
|
7
|
+
* @input A wheel's label, options, committed value and active row, and its
|
|
8
|
+
* presentation's three moves: a step, an end, a row
|
|
9
|
+
* @output useWheelListbox: the listbox and option props both wheels share
|
|
10
|
+
* @position Internal hook of ScrollWheel (Wheel.tsx) and PickerWheel.tsx
|
|
11
|
+
*
|
|
12
|
+
* A wheel is a listbox: one tab stop, with Arrow, Page, Home and End keys.
|
|
13
|
+
* Each presentation decides what its keys and clicks do to its own column.
|
|
14
|
+
*
|
|
15
|
+
* SYNC: When modified, update Wheel.tsx and PickerWheel.tsx.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import {useCallback, useId, type KeyboardEvent} from 'react';
|
|
19
|
+
import type {WheelOption} from './wheelOptions';
|
|
20
|
+
|
|
21
|
+
/** Rows a Page Up or Page Down key moves. */
|
|
22
|
+
const PAGE_ROWS = 10;
|
|
23
|
+
|
|
24
|
+
export interface WheelListboxProps {
|
|
25
|
+
/** Accessible name for the column. */
|
|
26
|
+
label: string;
|
|
27
|
+
/** Rows, top to bottom. */
|
|
28
|
+
options: ReadonlyArray<WheelOption>;
|
|
29
|
+
/** Committed value. */
|
|
30
|
+
value: number;
|
|
31
|
+
/** The row `aria-activedescendant` names. */
|
|
32
|
+
activeIndex: number;
|
|
33
|
+
/** An Arrow or Page key: a step of `delta` rows. */
|
|
34
|
+
stepBy: (delta: number) => void;
|
|
35
|
+
/** Home or End. */
|
|
36
|
+
toEnd: (end: 'first' | 'last') => void;
|
|
37
|
+
/** A click on row `index`. */
|
|
38
|
+
activate: (index: number) => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The listbox and option props of one wheel column: ids, ARIA, the keys and
|
|
43
|
+
* a click on a row. `aria-activedescendant` marks the active row, and a click
|
|
44
|
+
* reaches every row. The scrolling column steps from the row under its band. The
|
|
45
|
+
* touch column steps from the row it is heading to.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```
|
|
49
|
+
* const {listboxProps, optionProps} = useWheelListbox({label, options, value, activeIndex, stepBy, toEnd, activate});
|
|
50
|
+
* <div {...listboxProps}>{options.map((option, index) => <div key={option.value} {...optionProps(option, index)} />)}</div>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function useWheelListbox({
|
|
54
|
+
label,
|
|
55
|
+
options,
|
|
56
|
+
value,
|
|
57
|
+
activeIndex,
|
|
58
|
+
stepBy,
|
|
59
|
+
toEnd,
|
|
60
|
+
activate,
|
|
61
|
+
}: WheelListboxProps) {
|
|
62
|
+
const id = useId();
|
|
63
|
+
const onKeyDown = useCallback(
|
|
64
|
+
(event: KeyboardEvent) => {
|
|
65
|
+
switch (event.key) {
|
|
66
|
+
case 'ArrowDown':
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
stepBy(1);
|
|
69
|
+
break;
|
|
70
|
+
case 'ArrowUp':
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
stepBy(-1);
|
|
73
|
+
break;
|
|
74
|
+
case 'PageDown':
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
stepBy(PAGE_ROWS);
|
|
77
|
+
break;
|
|
78
|
+
case 'PageUp':
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
stepBy(-PAGE_ROWS);
|
|
81
|
+
break;
|
|
82
|
+
case 'Home':
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
toEnd('first');
|
|
85
|
+
break;
|
|
86
|
+
case 'End':
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
toEnd('last');
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
[stepBy, toEnd],
|
|
95
|
+
);
|
|
96
|
+
return {
|
|
97
|
+
listboxProps: {
|
|
98
|
+
role: 'listbox' as const,
|
|
99
|
+
'aria-label': label,
|
|
100
|
+
'aria-activedescendant': `${id}-${options[activeIndex]?.value}`,
|
|
101
|
+
tabIndex: 0,
|
|
102
|
+
onKeyDown,
|
|
103
|
+
},
|
|
104
|
+
optionProps: (option: WheelOption, index: number) => ({
|
|
105
|
+
id: `${id}-${option.value}`,
|
|
106
|
+
role: 'option' as const,
|
|
107
|
+
'aria-selected': option.value === value,
|
|
108
|
+
'aria-disabled': option.isDisabled || undefined,
|
|
109
|
+
onClick: () => activate(index),
|
|
110
|
+
}),
|
|
111
|
+
};
|
|
112
|
+
}
|