@astryxdesign/core 0.7.5 → 0.7.6-canary.0d71e8d
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 +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +5 -5
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +183 -5
- package/dist/AppShell/observeMainOverflow.d.ts +9 -0
- package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
- package/dist/AppShell/observeMainOverflow.js +125 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +12 -3
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +7 -1
- package/dist/BottomSheet/BottomSheet.js +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +2 -1
- package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +30 -3
- package/dist/Button/Button.js +4 -4
- package/dist/Carousel/Carousel.d.ts +3 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +12 -3
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -5
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +37 -4
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +41 -4
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +12 -4
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +101 -15
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +8 -3
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +11 -7
- package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
- package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
- package/dist/DateInput/usePointerDragScroll.js +25 -9
- package/dist/DateInput/useScrollSettle.d.ts +3 -1
- package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
- package/dist/DateInput/useScrollSettle.js +37 -8
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +23 -12
- package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
- package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +34 -9
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +5 -4
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +2 -1
- package/dist/Drawer/Drawer.d.ts +1 -0
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +7 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +35 -22
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -16
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +2 -1
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +4 -4
- package/dist/Field/InputClearButton.js +3 -3
- package/dist/Field/PanelSearchInput.js +2 -2
- package/dist/FieldStatus/FieldStatus.d.ts +3 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +3 -2
- package/dist/FileInput/FileInput.d.ts +3 -0
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +34 -13
- package/dist/Heading/Heading.js +1 -1
- package/dist/Icon/Icon.js +1 -1
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckIndicator.js +2 -1
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +3 -1
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
- package/dist/Indicator/RadioIndicator.js +3 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +21 -7
- package/dist/Item/ItemSwipeLayer.js +1 -1
- package/dist/Layer/popoverOperations.d.ts +27 -0
- package/dist/Layer/popoverOperations.d.ts.map +1 -0
- package/dist/Layer/popoverOperations.js +159 -0
- package/dist/Layer/useLayer.d.ts +1 -1
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +120 -65
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +5 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +8 -3
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +7 -2
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +26 -10
- package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +26 -5
- package/dist/NumberInput/numberParser.d.ts +3 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -1
- package/dist/NumberInput/numberParser.js +7 -44
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +27 -0
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +32 -12
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +10 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +37 -30
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +11 -3
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +28 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
- package/dist/Selector/useSelectorPresentation.d.ts +8 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +20 -4
- package/dist/SideNav/SideNavItem.d.ts +2 -2
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +18 -7
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +10 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +3 -3
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +26 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +10 -3
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +36 -10
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
- package/dist/Text/Text.js +1 -1
- package/dist/Text/useTruncation.d.ts.map +1 -1
- package/dist/Text/useTruncation.js +23 -5
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -3
- package/dist/TimeInput/TimeInput.d.ts +6 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -14
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +5 -4
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +2 -2
- package/dist/Timestamp/TimestampHoverCard.js +4 -4
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +60 -20
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +101 -54
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +52 -5
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +14 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +44 -7
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +2 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -0
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +1 -0
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -4
- package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +43 -7
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +43 -9
- package/dist/astryx.css +25 -4
- package/dist/gestures/GestureArena.d.ts +32 -1
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +110 -9
- package/dist/gestures/GestureHost.d.ts +351 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +13 -1
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +19 -1
- package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/LongPressGestureRecognizer.js +3 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PanGestureRecognizer.js +3 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PinchGestureRecognizer.js +128 -0
- package/dist/gestures/PressTracker.d.ts +112 -0
- package/dist/gestures/PressTracker.d.ts.map +1 -0
- package/dist/gestures/PressTracker.js +267 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/SwipeGestureRecognizer.js +148 -0
- package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
- package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/TapGestureRecognizer.js +3 -0
- package/dist/gestures/VelocityTracker.d.ts +6 -2
- package/dist/gestures/VelocityTracker.d.ts.map +1 -1
- package/dist/gestures/VelocityTracker.js +7 -3
- package/dist/gestures/haptics.d.ts +65 -0
- package/dist/gestures/haptics.d.ts.map +1 -0
- package/dist/gestures/haptics.js +182 -0
- package/dist/gestures/index.d.ts +37 -0
- package/dist/gestures/index.d.ts.map +1 -0
- package/dist/gestures/index.js +25 -0
- package/dist/gestures/nativeScroll.d.ts +42 -0
- package/dist/gestures/nativeScroll.d.ts.map +1 -0
- package/dist/gestures/nativeScroll.js +228 -0
- package/dist/gestures/touchAction.d.ts +60 -0
- package/dist/gestures/touchAction.d.ts.map +1 -0
- package/dist/gestures/touchAction.js +157 -0
- package/dist/gestures/touchActionRule.d.ts +34 -0
- package/dist/gestures/touchActionRule.d.ts.map +1 -0
- package/dist/gestures/touchActionRule.js +140 -0
- package/dist/gestures/types.d.ts +18 -7
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +22 -2
- package/dist/gestures/useGestureRecognizer.d.ts +56 -0
- package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/useGestureRecognizer.js +226 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.js +107 -61
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
- package/dist/hooks/scrollKeyboardDelegation.js +7 -3
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +4 -1
- package/dist/hooks/useAnnounce.d.ts +101 -42
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +161 -75
- package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +5 -3
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +6 -12
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +12 -1
- package/dist/hooks/useScrollOverflow.d.ts +2 -1
- package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
- package/dist/hooks/useScrollOverflow.js +56 -10
- package/dist/i18n/generated-locales/af-ZA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
- package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
- package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
- package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
- package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
- package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +8 -5
- package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
- package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
- package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
- package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
- package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
- package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
- package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
- package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
- package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
- package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
- package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
- package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
- package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
- package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
- package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
- package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
- package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
- package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
- package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
- package/dist/i18n/useListFormatter.d.ts +9 -0
- package/dist/i18n/useListFormatter.d.ts.map +1 -0
- package/dist/i18n/useListFormatter.js +41 -0
- package/dist/motion/animator.d.ts +83 -8
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +701 -119
- package/dist/motion/coast.d.ts +4 -1
- package/dist/motion/coast.d.ts.map +1 -1
- package/dist/motion/coast.js +4 -2
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +6 -2
- package/dist/motion/reducedMotionPlan.d.ts +7 -0
- package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
- package/dist/motion/reducedMotionPlan.js +14 -1
- package/dist/motion/resolveMotion.d.ts +42 -0
- package/dist/motion/resolveMotion.d.ts.map +1 -0
- package/dist/motion/resolveMotion.js +43 -0
- package/dist/motion/roleValue.d.ts +2 -1
- package/dist/motion/roleValue.d.ts.map +1 -1
- package/dist/motion/roleValue.js +2 -1
- package/dist/motion/uikit/timing.d.ts +7 -1
- package/dist/motion/uikit/timing.d.ts.map +1 -1
- package/dist/motion/uikit/timing.js +19 -1
- package/dist/theme/defineTheme.d.ts +19 -5
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +64 -4
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
- package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
- package/dist/theme/domainTokens/index.d.ts +5 -4
- package/dist/theme/domainTokens/index.d.ts.map +1 -1
- package/dist/theme/domainTokens/index.js +5 -9
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/motionKnobs.d.ts +56 -0
- package/dist/theme/motionKnobs.d.ts.map +1 -0
- package/dist/theme/motionKnobs.js +48 -0
- package/dist/theme/resolveThemeValues.d.ts +11 -4
- package/dist/theme/resolveThemeValues.d.ts.map +1 -1
- package/dist/theme/resolveThemeValues.js +40 -4
- package/dist/theme/themeAdaptations.d.ts +7 -3
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +36 -7
- package/dist/theme/themeMotion.d.ts +96 -0
- package/dist/theme/themeMotion.d.ts.map +1 -0
- package/dist/theme/themeMotion.js +177 -0
- package/dist/theme/tokenReferences.d.ts +31 -0
- package/dist/theme/tokenReferences.d.ts.map +1 -0
- package/dist/theme/tokenReferences.js +132 -0
- package/dist/theme/tokens.d.ts +1 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +9 -129
- package/dist/theme/tokens.stylex.d.ts +12 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +12 -0
- package/dist/utils/focusOutline.stylex.d.ts +6 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.js +7 -0
- package/dist/utils/focusReturn.d.ts +17 -1
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +11 -4
- package/dist/utils/getNodeText.d.ts +8 -0
- package/dist/utils/getNodeText.d.ts.map +1 -0
- package/dist/utils/getNodeText.js +37 -0
- package/dist/utils/interactionModality.d.ts +11 -2
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +58 -5
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +17 -8
- package/dist/utils/plainDate.d.ts +2 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +46 -3
- package/dist/utils/presentation.d.ts +50 -0
- package/dist/utils/presentation.d.ts.map +1 -0
- package/dist/utils/presentation.js +125 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +20 -1
- package/dist/utils/primaryClick.d.ts +11 -0
- package/dist/utils/primaryClick.d.ts.map +1 -0
- package/dist/utils/primaryClick.js +25 -0
- package/dist/utils/sharedMutationObserver.d.ts +19 -11
- package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
- package/dist/utils/sharedMutationObserver.js +66 -26
- package/dist/utils/timeFormat.d.ts +47 -0
- package/dist/utils/timeFormat.d.ts.map +1 -0
- package/dist/utils/timeFormat.js +240 -0
- package/dist/utils/touchPresentation.d.ts +2 -2
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +13 -8
- package/dist/utils/touchPresentation.stylex.d.ts +15 -0
- package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
- package/dist/utils/touchPresentation.stylex.js +33 -0
- package/dist/utils/touchQueries.d.ts +13 -0
- package/dist/utils/touchQueries.d.ts.map +1 -0
- package/dist/utils/touchQueries.js +15 -0
- package/dist/utils/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/dist/utils/useFocusAcrossSwap.d.ts +19 -0
- package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
- package/dist/utils/useFocusAcrossSwap.js +41 -0
- package/locales/af-ZA.json +0 -21
- package/locales/ar-SA.json +0 -21
- package/locales/ca-ES.json +0 -21
- package/locales/cs-CZ.json +0 -21
- package/locales/da-DK.json +0 -21
- package/locales/de-DE.json +0 -21
- package/locales/el-GR.json +0 -21
- package/locales/en.json +35 -23
- package/locales/es-ES.json +0 -21
- package/locales/fi-FI.json +0 -21
- package/locales/fr-FR.json +0 -21
- package/locales/he-IL.json +0 -21
- package/locales/hu-HU.json +0 -21
- package/locales/it-IT.json +0 -21
- package/locales/ja-JP.json +0 -21
- package/locales/ko-KR.json +0 -21
- package/locales/nl-NL.json +0 -21
- package/locales/no-NO.json +0 -21
- package/locales/pl-PL.json +0 -21
- package/locales/pseudo.json +23 -14
- package/locales/pt-BR.json +0 -21
- package/locales/pt-PT.json +0 -21
- package/locales/ro-RO.json +0 -21
- package/locales/ru-RU.json +0 -21
- package/locales/sr-SP.json +0 -21
- package/locales/sv-SE.json +0 -21
- package/locales/tr-TR.json +0 -21
- package/locales/uk-UA.json +0 -21
- package/locales/vi-VN.json +0 -21
- package/locales/zh-CN.json +0 -21
- package/locales/zh-TW.json +0 -21
- package/package.json +5 -4
- package/src/AlertDialog/AlertDialog.tsx +6 -5
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
- package/src/AppShell/AppShell.doc.mjs +1 -1
- package/src/AppShell/AppShell.spec.md +9 -12
- package/src/AppShell/AppShell.test.tsx +164 -2
- package/src/AppShell/AppShell.tsx +225 -5
- package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
- package/src/AppShell/observeMainOverflow.test.ts +173 -0
- package/src/AppShell/observeMainOverflow.ts +143 -0
- package/src/Avatar/Avatar.spec.md +22 -22
- package/src/Avatar/Avatar.tsx +18 -1
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
- package/src/Badge/Badge.doc.mjs +1 -1
- package/src/Badge/Badge.tsx +19 -2
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
- package/src/BottomSheet/BottomSheet.test.tsx +46 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
- package/src/BottomSheet/useSheetGestures.test.ts +52 -0
- package/src/BottomSheet/useSheetGestures.ts +37 -6
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
- package/src/Button/Button.tsx +4 -4
- package/src/Calendar/Calendar.spec.md +87 -48
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/Carousel.doc.mjs +1 -1
- package/src/Carousel/Carousel.spec.md +9 -9
- package/src/Carousel/Carousel.test.tsx +124 -3
- package/src/Carousel/Carousel.tsx +10 -2
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
- package/src/Chat/ChatComposer.spec.md +75 -59
- package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
- package/src/Chat/ChatDictationButton.spec.md +126 -81
- package/src/Chat/ChatLayout.spec.md +41 -36
- package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
- package/src/Chat/ChatMessage.spec.md +64 -65
- package/src/Chat/ChatSendButton.spec.md +78 -67
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/Citation/Citation.spec.md +60 -47
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
- package/src/Collapsible/Collapsible.spec.md +2 -0
- package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
- package/src/ComplexSelector/ComplexSelector.test.tsx +148 -0
- package/src/ComplexSelector/ComplexSelector.tsx +41 -4
- package/src/ContextMenu/ContextMenu.spec.md +84 -56
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
- package/src/DateInput/DateInput.spec.md +74 -57
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +120 -0
- package/src/DateInput/MonthScroller.tsx +106 -20
- package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
- package/src/DateInput/TouchDateField.tsx +14 -3
- package/src/DateInput/Wheel.tsx +9 -6
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateInput/usePointerDragScroll.ts +34 -10
- package/src/DateInput/useScrollSettle.ts +38 -7
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
- package/src/DateRangeInput/DateRangeInput.tsx +16 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
- package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
- package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
- package/src/DateTimeInput/DateTimeInput.tsx +46 -24
- package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
- package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
- package/src/Dialog/Dialog.test.tsx +216 -2
- package/src/Dialog/Dialog.tsx +42 -9
- package/src/Dialog/DialogHeader.tsx +5 -4
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
- package/src/Divider/Divider.tsx +2 -1
- package/src/Drawer/Drawer.spec.md +111 -80
- package/src/Drawer/Drawer.test.tsx +35 -0
- package/src/Drawer/Drawer.tsx +13 -2
- package/src/Drawer/DrawerHeader.spec.md +181 -0
- package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
- package/src/DropdownMenu/DropdownMenu.spec.md +198 -218
- package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
- package/src/DropdownMenu/DropdownMenu.tsx +43 -21
- package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
- package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
- package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
- package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
- package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
- package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
- package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
- package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
- package/src/EmptyState/EmptyState.spec.md +35 -29
- package/src/EmptyState/EmptyState.tsx +2 -1
- package/src/Field/FieldLabel.tsx +5 -4
- package/src/Field/InputClearButton.tsx +3 -3
- package/src/Field/PanelSearchInput.tsx +2 -2
- package/src/FieldStatus/FieldStatus.tsx +9 -2
- package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
- package/src/FileInput/FileInput.test.tsx +159 -0
- package/src/FileInput/FileInput.tsx +34 -6
- package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
- package/src/FormLayout/FormLayout.spec.md +11 -20
- package/src/Heading/Heading.tsx +1 -1
- package/src/Icon/Icon.tsx +1 -1
- package/src/Indicator/CheckIndicator.spec.md +47 -42
- package/src/Indicator/CheckIndicator.tsx +2 -1
- package/src/Indicator/CheckboxIndicator.spec.md +40 -37
- package/src/Indicator/CheckboxIndicator.tsx +3 -1
- package/src/Indicator/Indicator.spec.md +188 -0
- package/src/Indicator/RadioIndicator.tsx +3 -1
- package/src/Item/Item.test.tsx +60 -0
- package/src/Item/Item.tsx +16 -8
- package/src/Item/ItemSwipeLayer.tsx +1 -1
- package/src/Kbd/Kbd.spec.md +81 -38
- package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
- package/src/Layer/popoverOperations.test.ts +205 -0
- package/src/Layer/popoverOperations.ts +172 -0
- package/src/Layer/useLayer.test.tsx +426 -4
- package/src/Layer/useLayer.tsx +145 -77
- package/src/Layout/Layout.spec.md +127 -131
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.spec.md +205 -0
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.spec.md +190 -0
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.spec.md +193 -0
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.spec.md +194 -0
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
- package/src/Lightbox/Lightbox.test.tsx +18 -0
- package/src/Lightbox/Lightbox.tsx +5 -0
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
- package/src/Link/Link.spec.md +3 -2
- package/src/Link/Link.tsx +11 -0
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
- package/src/MetadataList/MetadataList.spec.md +187 -0
- package/src/MetadataList/MetadataListItem.spec.md +165 -0
- package/src/MobileNav/MobileNav.test.tsx +15 -0
- package/src/MobileNav/MobileNav.tsx +9 -1
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
- package/src/MoreMenu/MoreMenu.test.tsx +11 -0
- package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
- package/src/MultiSelector/MultiSelector.spec.md +7 -4
- package/src/MultiSelector/MultiSelector.test.tsx +270 -1
- package/src/MultiSelector/MultiSelector.tsx +25 -10
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
- package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
- package/src/NavMenu/NavHeadingMenuItem.tsx +5 -39
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.test.tsx +68 -7
- package/src/NumberInput/NumberInput.tsx +44 -4
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- package/src/Outline/Outline.spec.md +165 -69
- package/src/Outline/Outline.test.tsx +67 -2
- package/src/Outline/Outline.tsx +23 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
- package/src/OverflowList/OverflowList.spec.md +102 -55
- package/src/Pagination/Pagination.spec.md +158 -84
- package/src/Popover/Popover.test.tsx +84 -0
- package/src/Popover/Popover.tsx +34 -14
- package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
- package/src/Popover/usePopover.tsx +10 -3
- package/src/PowerSearch/PowerSearch.test.tsx +24 -0
- package/src/PowerSearch/PowerSearch.tsx +42 -31
- package/src/ProgressBar/ProgressBar.spec.md +143 -119
- package/src/ProgressBar/ProgressBar.test.tsx +108 -32
- package/src/ProgressBar/ProgressBar.tsx +58 -10
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
- package/src/RadioList/RadioList.spec.md +1 -1
- package/src/RadioList/RadioList.test.tsx +84 -0
- package/src/RadioList/RadioListItem.tsx +11 -2
- package/src/Resizable/Resizable.spec.md +144 -124
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
- package/src/Resizable/useResizable.test.ts +43 -0
- package/src/Resizable/useResizable.ts +32 -9
- package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
- package/src/Selector/Selector.test.tsx +90 -1
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
- package/src/Selector/useSelectorPresentation.ts +31 -3
- package/src/SideNav/SideNav.test.tsx +151 -4
- package/src/SideNav/SideNavItem.spec.md +14 -24
- package/src/SideNav/SideNavItem.tsx +27 -10
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
- package/src/Skeleton/Skeleton.tsx +3 -1
- package/src/Slider/Slider.test.tsx +31 -0
- package/src/Slider/Slider.tsx +8 -3
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
- package/src/Spinner/Spinner.tsx +5 -3
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/Stepper/Step.spec.md +36 -42
- package/src/Stepper/Step.tsx +33 -6
- package/src/Stepper/Stepper.doc.mjs +1 -1
- package/src/Stepper/Stepper.test.tsx +69 -7
- package/src/Switch/Switch.spec.md +1 -1
- package/src/Switch/Switch.test.tsx +66 -1
- package/src/Switch/Switch.tsx +11 -3
- package/src/TabList/TabList.test.tsx +58 -4
- package/src/TabList/TabList.tsx +16 -1
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
- package/src/Table/Table.spec.md +1 -1
- package/src/Table/Table.test.tsx +32 -0
- package/src/Table/Table.tsx +43 -11
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/__tests__/Table.a11y.states.ts +1 -5
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
- package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
- package/src/Text/Text.tsx +1 -1
- package/src/Text/useTruncation.test.tsx +128 -1
- package/src/Text/useTruncation.ts +23 -5
- package/src/TextArea/TextArea.spec.md +10 -13
- package/src/TextArea/TextArea.test.tsx +60 -0
- package/src/TextArea/TextArea.tsx +15 -1
- package/src/TextInput/TextInput.test.tsx +21 -0
- package/src/TextInput/TextInput.tsx +3 -1
- package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
- package/src/TimeInput/Presentation.test.tsx +21 -0
- package/src/TimeInput/TimeInput.doc.mjs +8 -8
- package/src/TimeInput/TimeInput.spec.md +58 -61
- package/src/TimeInput/TimeInput.test.tsx +76 -0
- package/src/TimeInput/TimeInput.tsx +36 -18
- package/src/TimeInput/TouchTimeField.tsx +4 -6
- package/src/Timestamp/Timestamp.spec.md +6 -12
- package/src/Timestamp/Timestamp.test.tsx +30 -5
- package/src/Timestamp/Timestamp.tsx +6 -2
- package/src/Timestamp/TimestampHoverCard.tsx +4 -4
- package/src/Toast/Toast.spec.md +15 -24
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +798 -1
- package/src/Toast/ToastViewport.tsx +121 -53
- package/src/ToggleButton/ToggleButton.test.tsx +27 -0
- package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Token/Token.spec.md +52 -61
- package/src/Token/Token.test.tsx +104 -0
- package/src/Token/Token.tsx +75 -5
- package/src/Token/TokenLink.tsx +21 -7
- package/src/Tokenizer/Tokenizer.spec.md +18 -4
- package/src/Tokenizer/Tokenizer.test.tsx +176 -0
- package/src/Tokenizer/Tokenizer.tsx +48 -12
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
- package/src/Toolbar/Toolbar.spec.md +5 -6
- package/src/Toolbar/Toolbar.test.tsx +30 -0
- package/src/Toolbar/Toolbar.tsx +2 -1
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
- package/src/TopNav/TopNav.test.tsx +27 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
- package/src/TopNav/TopNavMegaMenu.tsx +4 -1
- package/src/TopNav/TopNavMenu.test.tsx +17 -0
- package/src/TopNav/TopNavMenu.tsx +1 -0
- package/src/TreeList/TreeList.test.tsx +26 -0
- package/src/TreeList/TreeListItem.tsx +26 -4
- package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
- package/src/Typeahead/BaseTypeahead.spec.md +45 -45
- package/src/Typeahead/BaseTypeahead.tsx +48 -9
- package/src/Typeahead/Typeahead.test.tsx +294 -11
- package/src/Typeahead/Typeahead.tsx +51 -9
- package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
- package/src/__tests__/pressState.ts +8 -4
- package/src/gestures/GestureArena.ts +111 -11
- package/src/gestures/GestureHost.ts +2064 -0
- package/src/gestures/GestureRecognizer.ts +21 -1
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -0
- package/src/gestures/PressTracker.ts +386 -0
- package/src/gestures/README.md +420 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
- package/src/gestures/SwipeGestureRecognizer.ts +197 -0
- package/src/gestures/TapGestureRecognizer.ts +4 -0
- package/src/gestures/VelocityTracker.ts +10 -3
- package/src/gestures/__tests__/GestureHost.test.ts +2136 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/PressTracker.test.ts +275 -0
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
- package/src/gestures/__tests__/arena.test.ts +40 -0
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
- package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
- package/src/gestures/__tests__/browser/fixture.ts +307 -0
- package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
- package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
- package/src/gestures/__tests__/haptics.test.ts +187 -0
- package/src/gestures/__tests__/harness.ts +52 -4
- package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
- package/src/gestures/haptics.ts +203 -0
- package/src/gestures/index.ts +79 -0
- package/src/gestures/nativeScroll.ts +277 -0
- package/src/gestures/touchAction.ts +191 -0
- package/src/gestures/touchActionRule.ts +157 -0
- package/src/gestures/types.ts +30 -9
- package/src/gestures/useGestureRecognizer.ts +305 -0
- package/src/hooks/index.ts +5 -1
- package/src/hooks/modalAnnounce.ts +129 -72
- package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
- package/src/hooks/scrollKeyboardDelegation.ts +9 -3
- package/src/hooks/useAdaptivePresentation.ts +4 -1
- package/src/hooks/useAnnounce.doc.mjs +35 -3
- package/src/hooks/useAnnounce.replace.test.tsx +516 -0
- package/src/hooks/useAnnounce.ts +209 -102
- package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
- package/src/hooks/useAnnounceRenderedText.ts +17 -3
- package/src/hooks/useBusyAnnouncement.ts +7 -10
- package/src/hooks/useMenuHover.ts +15 -1
- package/src/hooks/useScrollOverflow.doc.mjs +1 -1
- package/src/hooks/useScrollOverflow.test.tsx +102 -1
- package/src/hooks/useScrollOverflow.ts +59 -10
- package/src/i18n/__tests__/useListFormatter.test.tsx +58 -0
- package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
- package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
- package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
- package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
- package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
- package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
- package/src/i18n/generated-locales/en.generated.ts +9 -6
- package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
- package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
- package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
- package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
- package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
- package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
- package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
- package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
- package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
- package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
- package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
- package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
- package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
- package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
- package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
- package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
- package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
- package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
- package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
- package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
- package/src/i18n/useListFormatter.ts +42 -0
- package/src/motion/MEASUREMENTS.md +2 -1
- package/src/motion/README.md +113 -33
- package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
- package/src/motion/__tests__/motionBundle.ts +14 -0
- package/src/motion/animator.test.ts +1125 -32
- package/src/motion/animator.ts +932 -130
- package/src/motion/coast.ts +10 -3
- package/src/motion/reducedMotion.ts +12 -2
- package/src/motion/reducedMotionPlan.test.ts +26 -0
- package/src/motion/reducedMotionPlan.ts +20 -1
- package/src/motion/resolveMotion.test.ts +123 -0
- package/src/motion/resolveMotion.ts +68 -0
- package/src/motion/roleValue.ts +2 -1
- package/src/motion/roles.test.ts +21 -4
- package/src/motion/uikit/tableImports.test.ts +293 -0
- package/src/motion/uikit/timing.ts +15 -1
- package/src/motion/uikit/values.test.ts +23 -12
- package/src/theme/Theme.doc.mjs +1 -1
- package/src/theme/defineTheme.ts +117 -8
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
- package/src/theme/domainTokens/index.ts +6 -10
- package/src/theme/expandMotionScale.test.ts +1 -1
- package/src/theme/index.ts +5 -0
- package/src/theme/motionKnobs.ts +82 -0
- package/src/theme/resolveThemeValues.ts +68 -6
- package/src/theme/themeAdaptations.ts +52 -12
- package/src/theme/themeMotion.test.ts +620 -0
- package/src/theme/themeMotion.ts +221 -0
- package/src/theme/tokenReferences.ts +149 -0
- package/src/theme/tokens.stylex.ts +10 -0
- package/src/theme/tokens.ts +15 -158
- package/src/utils/focusOutline.stylex.ts +28 -0
- package/src/utils/focusReturn.ts +17 -6
- package/src/utils/getNodeText.test.ts +24 -0
- package/src/utils/getNodeText.ts +37 -0
- package/src/utils/interactionModality.test.ts +45 -1
- package/src/utils/interactionModality.ts +64 -5
- package/src/utils/interactionOverlay.stylex.ts +12 -3
- package/src/utils/plainDate.test.ts +90 -0
- package/src/utils/plainDate.ts +58 -3
- package/src/utils/presentation.test.ts +380 -0
- package/src/utils/presentation.ts +180 -0
- package/src/utils/pressFeedback.test.ts +138 -0
- package/src/utils/pressFeedback.ts +34 -11
- package/src/utils/pressGesture.test.ts +9 -0
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- package/src/utils/sharedMutationObserver.test.ts +54 -1
- package/src/utils/sharedMutationObserver.ts +87 -29
- package/src/utils/timeFormat.test.ts +204 -0
- package/src/utils/timeFormat.ts +314 -0
- package/src/utils/touchPresentation.stylex.ts +43 -0
- package/src/utils/touchPresentation.test.ts +140 -1
- package/src/utils/touchPresentation.ts +13 -8
- package/src/utils/touchQueries.ts +15 -0
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
- package/src/utils/useFocusAcrossSwap.ts +55 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {act, render} from '@testing-library/react';
|
|
4
|
+
import {createRef} from 'react';
|
|
5
|
+
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
|
6
|
+
import {MonthScroller, type MonthScrollerHandle} from './MonthScroller';
|
|
7
|
+
import {SCROLL_QUIET_MS} from './useScrollSettle';
|
|
8
|
+
|
|
9
|
+
class FakeResizeObserver {
|
|
10
|
+
constructor(private callback: ResizeObserverCallback) {}
|
|
11
|
+
observe() {
|
|
12
|
+
this.callback([], this);
|
|
13
|
+
}
|
|
14
|
+
unobserve() {}
|
|
15
|
+
disconnect() {}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const PANE = 300;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The month scroller's settle, with the browser's scrolling played by hand:
|
|
22
|
+
* `scrollTo` is recorded, and the offset is whatever the test sets.
|
|
23
|
+
*/
|
|
24
|
+
describe('MonthScroller settle', () => {
|
|
25
|
+
const scrollTo = vi.fn();
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
vi.useFakeTimers({
|
|
28
|
+
toFake: [
|
|
29
|
+
'setTimeout',
|
|
30
|
+
'clearTimeout',
|
|
31
|
+
'requestAnimationFrame',
|
|
32
|
+
'cancelAnimationFrame',
|
|
33
|
+
'Date',
|
|
34
|
+
'performance',
|
|
35
|
+
],
|
|
36
|
+
});
|
|
37
|
+
vi.stubGlobal('ResizeObserver', FakeResizeObserver);
|
|
38
|
+
vi.spyOn(HTMLElement.prototype, 'clientWidth', 'get').mockReturnValue(PANE);
|
|
39
|
+
vi.spyOn(HTMLElement.prototype, 'clientHeight', 'get').mockReturnValue(
|
|
40
|
+
PANE,
|
|
41
|
+
);
|
|
42
|
+
Element.prototype.scrollTo = scrollTo;
|
|
43
|
+
scrollTo.mockClear();
|
|
44
|
+
});
|
|
45
|
+
afterEach(() => {
|
|
46
|
+
vi.useRealTimers();
|
|
47
|
+
vi.unstubAllGlobals();
|
|
48
|
+
vi.restoreAllMocks();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
function renderScroller() {
|
|
52
|
+
const handleRef = createRef<MonthScrollerHandle>();
|
|
53
|
+
const view = render(
|
|
54
|
+
<MonthScroller
|
|
55
|
+
handleRef={handleRef}
|
|
56
|
+
minMonthIndex={0}
|
|
57
|
+
maxMonthIndex={23}
|
|
58
|
+
initialMonthIndex={9}
|
|
59
|
+
onVisibleMonthChange={() => {}}
|
|
60
|
+
selectedDate={null}
|
|
61
|
+
today={{year: 2026, month: 10, day: 15}}
|
|
62
|
+
isDateDisabled={() => false}
|
|
63
|
+
weekStartsOn={0}
|
|
64
|
+
onSelect={() => {}}
|
|
65
|
+
/>,
|
|
66
|
+
);
|
|
67
|
+
const scroller = view.container.querySelector<HTMLElement>(
|
|
68
|
+
'[data-scroller="months"]',
|
|
69
|
+
);
|
|
70
|
+
if (scroller == null) {
|
|
71
|
+
throw new Error('no month scroller');
|
|
72
|
+
}
|
|
73
|
+
scrollTo.mockClear();
|
|
74
|
+
return {handleRef, scroller};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The browser moving the scroller to `left`, as a scroll event reports. */
|
|
78
|
+
/**
|
|
79
|
+
* A touch event carrying the lists a real one always has: jsdom has no
|
|
80
|
+
* constructible TouchEvent, and the gesture hook reads `touches[0]`.
|
|
81
|
+
*/
|
|
82
|
+
function touchEvent(type: 'touchstart' | 'touchend') {
|
|
83
|
+
const event = new Event(type, {bubbles: true});
|
|
84
|
+
const point = {identifier: 1, clientX: 100, clientY: 100};
|
|
85
|
+
Object.defineProperties(event, {
|
|
86
|
+
touches: {value: type === 'touchend' ? [] : [point]},
|
|
87
|
+
targetTouches: {value: type === 'touchend' ? [] : [point]},
|
|
88
|
+
changedTouches: {value: [point]},
|
|
89
|
+
});
|
|
90
|
+
return event;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function scrollBy(scroller: HTMLElement, left: number) {
|
|
94
|
+
scroller.scrollLeft = left;
|
|
95
|
+
scroller.dispatchEvent(new Event('scroll'));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
it('turns scroll snapping back on after re-centers that end on the month they began on', () => {
|
|
99
|
+
const {handleRef, scroller} = renderScroller();
|
|
100
|
+
// Two far jumps in one batch, out and back: each re-centers the mounted
|
|
101
|
+
// months, pausing scroll snapping, and the second puts the center back
|
|
102
|
+
// where it was, so the render that follows changes no center.
|
|
103
|
+
act(() => {
|
|
104
|
+
handleRef.current?.scrollToMonth(20);
|
|
105
|
+
handleRef.current?.scrollToMonth(9);
|
|
106
|
+
});
|
|
107
|
+
act(() => {
|
|
108
|
+
vi.advanceTimersByTime(50);
|
|
109
|
+
});
|
|
110
|
+
expect(scroller.style.scrollSnapType).toBe('');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('leaves snapping on for a re-center while a finger drives the scroll', () => {
|
|
114
|
+
const {scroller} = renderScroller();
|
|
115
|
+
// A finger drags the next month in: the scroller crosses the middle of
|
|
116
|
+
// October's pane and re-centers its months with the finger still down.
|
|
117
|
+
act(() => {
|
|
118
|
+
scroller.dispatchEvent(touchEvent('touchstart'));
|
|
119
|
+
});
|
|
120
|
+
act(() => scrollBy(scroller, 9 * PANE + 0.6 * PANE));
|
|
121
|
+
act(() => {
|
|
122
|
+
vi.advanceTimersByTime(16);
|
|
123
|
+
});
|
|
124
|
+
// Snapping stays on: iOS tracks a snap target for the gesture.
|
|
125
|
+
expect(scroller.style.scrollSnapType).toBe('');
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('pauses snapping for a re-center again once the finger’s scroll has come to rest', () => {
|
|
129
|
+
const {handleRef, scroller} = renderScroller();
|
|
130
|
+
act(() => {
|
|
131
|
+
scroller.dispatchEvent(touchEvent('touchstart'));
|
|
132
|
+
scroller.dispatchEvent(touchEvent('touchend'));
|
|
133
|
+
});
|
|
134
|
+
act(() => {
|
|
135
|
+
vi.advanceTimersByTime(SCROLL_QUIET_MS + 50);
|
|
136
|
+
});
|
|
137
|
+
// An arrow's far jump after the swipe re-centers with snapping paused.
|
|
138
|
+
act(() => handleRef.current?.scrollToMonth(20));
|
|
139
|
+
expect(scroller.style.scrollSnapType).toBe('none');
|
|
140
|
+
act(() => {
|
|
141
|
+
vi.advanceTimersByTime(50);
|
|
142
|
+
});
|
|
143
|
+
expect(scroller.style.scrollSnapType).toBe('');
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('finishes a steer the browser cut short instead of rounding it back', () => {
|
|
147
|
+
const {handleRef, scroller} = renderScroller();
|
|
148
|
+
// An arrow toward month 10, its scroll 95 % of the way there.
|
|
149
|
+
act(() => handleRef.current?.scrollToMonth(10));
|
|
150
|
+
act(() => scrollBy(scroller, 9 * PANE + 0.95 * PANE));
|
|
151
|
+
// The other arrow, late in that scroll: back toward month 9.
|
|
152
|
+
act(() => handleRef.current?.scrollToMonth(9));
|
|
153
|
+
scrollTo.mockClear();
|
|
154
|
+
// WebKit ends the retargeted scroll where the first one's time ran out,
|
|
155
|
+
// near month 10, and the scroller goes quiet there.
|
|
156
|
+
act(() => scrollBy(scroller, 9 * PANE + 0.95 * PANE));
|
|
157
|
+
act(() => {
|
|
158
|
+
vi.advanceTimersByTime(SCROLL_QUIET_MS + 50);
|
|
159
|
+
});
|
|
160
|
+
// The settle finishes the steer onto month 9, not the nearest pane (10).
|
|
161
|
+
expect(
|
|
162
|
+
scrollTo.mock.calls.map(([options]) => (options as ScrollToOptions).left),
|
|
163
|
+
).toEqual([9 * PANE]);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -772,7 +772,7 @@ export function TouchDateField({
|
|
|
772
772
|
|
|
773
773
|
const fireChange = useCallback(
|
|
774
774
|
(newValue: ISODateString | undefined) => {
|
|
775
|
-
if (
|
|
775
|
+
if (isEffectivelyDisabled) {
|
|
776
776
|
return;
|
|
777
777
|
}
|
|
778
778
|
onChange?.(newValue);
|
|
@@ -783,7 +783,13 @@ export function TouchDateField({
|
|
|
783
783
|
});
|
|
784
784
|
}
|
|
785
785
|
},
|
|
786
|
-
[
|
|
786
|
+
[
|
|
787
|
+
isEffectivelyDisabled,
|
|
788
|
+
onChange,
|
|
789
|
+
changeAction,
|
|
790
|
+
startTransition,
|
|
791
|
+
setOptimisticValue,
|
|
792
|
+
],
|
|
787
793
|
);
|
|
788
794
|
|
|
789
795
|
const openSheet = useCallback(() => {
|
|
@@ -841,6 +847,11 @@ export function TouchDateField({
|
|
|
841
847
|
* value is still cleared either way — that half never depends on the range.
|
|
842
848
|
*/
|
|
843
849
|
const handleResetInSheet = useCallback(() => {
|
|
850
|
+
// Disabled: reject the entire reset without closing or moving focus.
|
|
851
|
+
// Busy-only fields keep month navigation; fireChange blocks the clear.
|
|
852
|
+
if (isDisabled) {
|
|
853
|
+
return;
|
|
854
|
+
}
|
|
844
855
|
fireChange(undefined);
|
|
845
856
|
const currentMonth = monthIndexOf(today);
|
|
846
857
|
if (currentMonth < minMonthIndex || currentMonth > maxMonthIndex) {
|
|
@@ -851,7 +862,7 @@ export function TouchDateField({
|
|
|
851
862
|
}
|
|
852
863
|
setMonthIndex(currentMonth);
|
|
853
864
|
scrollerHandleRef.current?.scrollToMonth(currentMonth, 'smooth');
|
|
854
|
-
}, [fireChange, today, monthIndex, minMonthIndex, maxMonthIndex]);
|
|
865
|
+
}, [isDisabled, fireChange, today, monthIndex, minMonthIndex, maxMonthIndex]);
|
|
855
866
|
|
|
856
867
|
// Selection commits on the tap and leaves the sheet up, so a mistake can be
|
|
857
868
|
// corrected in place and a nearby date reconsidered without reopening.
|
package/src/DateInput/Wheel.tsx
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* rubber-banding, and the settle animation are the platform's; all this adds
|
|
13
13
|
* is `scroll-snap-align: center` on each option, half a viewport of padding at
|
|
14
14
|
* each end so the first and last option can reach the middle, and a commit
|
|
15
|
-
* when the scrolling stops.
|
|
15
|
+
* when the scrolling stops and no finger or mouse drag still holds it.
|
|
16
16
|
*
|
|
17
17
|
* The falloff (rows fading and tipping away from the centre) is a CSS
|
|
18
18
|
* scroll-driven animation on a `view()` timeline — the browser interpolates it
|
|
@@ -259,6 +259,13 @@ export function Wheel({
|
|
|
259
259
|
// `selectedIndex` only catches up when the wheel settles.
|
|
260
260
|
const [activeIndex, setActiveIndex] = useState(selectedIndex);
|
|
261
261
|
|
|
262
|
+
// A mouse cannot drag a scroll container, so without this the wheel ignores
|
|
263
|
+
// the one gesture its shape invites. Touch is untouched — it pans natively,
|
|
264
|
+
// with momentum this could not match. See usePointerDragScroll. The drag it
|
|
265
|
+
// holds is not rest either: the settle below waits for its release, as it
|
|
266
|
+
// waits for a finger's (useScrollSettle).
|
|
267
|
+
const {isDraggingRef} = usePointerDragScroll(scrollerRef, isActive);
|
|
268
|
+
|
|
262
269
|
// Row height in px, read from layout rather than assumed, so a theme that
|
|
263
270
|
// retunes --date-input-touch-wheel-item-size still lands on the right row.
|
|
264
271
|
const itemBlockSize = useCallback((): number => {
|
|
@@ -306,6 +313,7 @@ export function Wheel({
|
|
|
306
313
|
}
|
|
307
314
|
},
|
|
308
315
|
isActive,
|
|
316
|
+
isDraggingRef,
|
|
309
317
|
);
|
|
310
318
|
|
|
311
319
|
// Park the committed row under the band whenever the wheel is shown, or the
|
|
@@ -375,11 +383,6 @@ export function Wheel({
|
|
|
375
383
|
// there is no way to share — it takes every touch that lands on it.
|
|
376
384
|
useOwnScrollGesture(scrollerRef, 'all', {isEnabled: isActive});
|
|
377
385
|
|
|
378
|
-
// A mouse cannot drag a scroll container, so without this the wheel ignores
|
|
379
|
-
// the one gesture its shape invites. Touch is untouched — it pans natively,
|
|
380
|
-
// with momentum this could not match. See usePointerDragScroll.
|
|
381
|
-
usePointerDragScroll(scrollerRef, isActive);
|
|
382
|
-
|
|
383
386
|
const moveBy = useCallback(
|
|
384
387
|
(delta: number) => {
|
|
385
388
|
const next = Math.min(
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file MonthScrollerSteps.interaction.browser.spec.ts
|
|
5
|
+
* @input The built "Default" DateInput story, shown in a bottom sheet, the
|
|
6
|
+
* arrows clicked from the page, real mouse and trackpad input and the
|
|
7
|
+
* interaction harness
|
|
8
|
+
* @output Interaction proofs for the month scroller's steps: after the month
|
|
9
|
+
* and year wheels close, a trackpad scroll still pages to the next month and
|
|
10
|
+
* Reset from four months on still rests on today's month; an arrow step
|
|
11
|
+
* through a stalled frame moves exactly one month; under a finger, a swipe
|
|
12
|
+
* that crosses the middle of a month as it lifts keeps scroll snapping on
|
|
13
|
+
* and rests on the next month.
|
|
14
|
+
* (A second arrow step late in the first one's scroll, which WebKit cuts
|
|
15
|
+
* short, is proven in MonthScrollerSettle.test.tsx: a loaded page's frames
|
|
16
|
+
* are too far apart to aim a click at a share of a 300 ms scroll.)
|
|
17
|
+
* @position Interaction tests of MonthScroller.tsx
|
|
18
|
+
* (`*.interaction.browser.spec.ts`, run by `pnpm test:interaction`)
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import {expect, test, type Locator, type Page} from '@playwright/test';
|
|
22
|
+
import {
|
|
23
|
+
blockMainThread,
|
|
24
|
+
drag,
|
|
25
|
+
openStory,
|
|
26
|
+
touchDriver,
|
|
27
|
+
withStorybook,
|
|
28
|
+
} from '@astryxdesign/interaction-harness';
|
|
29
|
+
|
|
30
|
+
const storybook = withStorybook(test);
|
|
31
|
+
const STORY = 'core-dateinput--default';
|
|
32
|
+
const ARGS = {presentation: 'bottom-sheet'};
|
|
33
|
+
|
|
34
|
+
/** Waits until the scroller's offset has not moved for ten frames. */
|
|
35
|
+
async function waitForRest(viewport: Locator): Promise<number> {
|
|
36
|
+
return viewport.evaluate(
|
|
37
|
+
async element =>
|
|
38
|
+
new Promise<number>(resolve => {
|
|
39
|
+
let last = element.scrollLeft;
|
|
40
|
+
let still = 0;
|
|
41
|
+
const check = () => {
|
|
42
|
+
const now = element.scrollLeft;
|
|
43
|
+
still = now === last ? still + 1 : 0;
|
|
44
|
+
last = now;
|
|
45
|
+
if (still >= 10) {
|
|
46
|
+
resolve(now);
|
|
47
|
+
} else {
|
|
48
|
+
requestAnimationFrame(check);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
requestAnimationFrame(check);
|
|
52
|
+
}),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The month the scroller rests on, as the pane's own grid names it. */
|
|
57
|
+
/**
|
|
58
|
+
* Waits until a month's grid sits flush with the scroller's edge, the offset
|
|
59
|
+
* unchanged, for ten frames: the end of the scroller's own settle
|
|
60
|
+
* correction, however long the page takes to run it. (The panes' width can
|
|
61
|
+
* be fractional, so the grid's own box is the measure, not the offset.)
|
|
62
|
+
*/
|
|
63
|
+
async function waitForRestOnMonth(viewport: Locator): Promise<number> {
|
|
64
|
+
return viewport.evaluate(
|
|
65
|
+
async element =>
|
|
66
|
+
new Promise<number>(resolve => {
|
|
67
|
+
let last = element.scrollLeft;
|
|
68
|
+
let still = 0;
|
|
69
|
+
const flush = () => {
|
|
70
|
+
const edge = element.getBoundingClientRect().left;
|
|
71
|
+
return [
|
|
72
|
+
...element.querySelectorAll<HTMLElement>('[role="grid"]'),
|
|
73
|
+
].some(
|
|
74
|
+
grid => Math.abs(grid.getBoundingClientRect().left - edge) < 1,
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
const check = () => {
|
|
78
|
+
const now = element.scrollLeft;
|
|
79
|
+
still = now === last && flush() ? still + 1 : 0;
|
|
80
|
+
last = now;
|
|
81
|
+
if (still >= 10) {
|
|
82
|
+
resolve(now);
|
|
83
|
+
} else {
|
|
84
|
+
requestAnimationFrame(check);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
requestAnimationFrame(check);
|
|
88
|
+
}),
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function monthAtRest(viewport: Locator): Promise<string> {
|
|
93
|
+
return viewport.evaluate(element => {
|
|
94
|
+
const box = element.getBoundingClientRect();
|
|
95
|
+
const middle = box.left + box.width / 2;
|
|
96
|
+
for (const grid of element.querySelectorAll<HTMLElement>('[role="grid"]')) {
|
|
97
|
+
const r = grid.getBoundingClientRect();
|
|
98
|
+
if (r.left <= middle && r.right >= middle) {
|
|
99
|
+
return grid.getAttribute('aria-label') ?? '';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return '';
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function openCalendar(page: Page) {
|
|
107
|
+
await openStory(page, storybook(), STORY, ARGS);
|
|
108
|
+
await page
|
|
109
|
+
.getByRole('button', {name: /calendar/i})
|
|
110
|
+
.first()
|
|
111
|
+
.click();
|
|
112
|
+
const viewport = page.locator('[data-scroller="months"]');
|
|
113
|
+
await expect(viewport).toBeVisible();
|
|
114
|
+
await waitForRest(viewport);
|
|
115
|
+
return viewport;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
test.use({hasTouch: false, isMobile: false});
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Waits until the scroller comes to rest, or until it has gone more than
|
|
122
|
+
* `limit` past `from`: a scroller that runs on by itself never rests, and
|
|
123
|
+
* the proof should fail where it ran, not at the test's timeout.
|
|
124
|
+
*/
|
|
125
|
+
async function waitForRestOrRun(
|
|
126
|
+
viewport: Locator,
|
|
127
|
+
from: number,
|
|
128
|
+
limit: number,
|
|
129
|
+
): Promise<number> {
|
|
130
|
+
return viewport.evaluate(
|
|
131
|
+
async (element, {from, limit}) =>
|
|
132
|
+
new Promise<number>(resolve => {
|
|
133
|
+
let last = element.scrollLeft;
|
|
134
|
+
let still = 0;
|
|
135
|
+
const check = () => {
|
|
136
|
+
const now = element.scrollLeft;
|
|
137
|
+
still = now === last ? still + 1 : 0;
|
|
138
|
+
last = now;
|
|
139
|
+
if (still >= 10 || Math.abs(now - from) > limit) {
|
|
140
|
+
resolve(now);
|
|
141
|
+
} else {
|
|
142
|
+
requestAnimationFrame(check);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
requestAnimationFrame(check);
|
|
146
|
+
}),
|
|
147
|
+
{from, limit},
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* A stalled frame right after an arrow (a 300 ms block of the main thread)
|
|
153
|
+
* let the re-center that follows the step land after the scroll had ended,
|
|
154
|
+
* and WebKit's re-snap after it then paged on by itself, a month every few
|
|
155
|
+
* frames. The step moves exactly one month.
|
|
156
|
+
*/
|
|
157
|
+
test('an arrow step through a stalled frame moves exactly one month', async ({
|
|
158
|
+
page,
|
|
159
|
+
}) => {
|
|
160
|
+
const viewport = await openCalendar(page);
|
|
161
|
+
const title = page.getByRole('button', {name: /Choose month and year/});
|
|
162
|
+
const from = await viewport.evaluate(element => element.scrollLeft);
|
|
163
|
+
const width = await viewport.evaluate(element => element.clientWidth);
|
|
164
|
+
const box = await page
|
|
165
|
+
.getByRole('button', {name: 'Next month'})
|
|
166
|
+
.boundingBox();
|
|
167
|
+
if (box == null) {
|
|
168
|
+
throw new Error('no Next month button');
|
|
169
|
+
}
|
|
170
|
+
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
171
|
+
await blockMainThread(page, 300);
|
|
172
|
+
const at = await waitForRestOrRun(viewport, from, 2 * width);
|
|
173
|
+
expect(Math.round((at - from) / width)).toBe(1);
|
|
174
|
+
await waitForRestOnMonth(viewport);
|
|
175
|
+
expect(
|
|
176
|
+
Math.round(((await viewport.evaluate(e => e.scrollLeft)) - from) / width),
|
|
177
|
+
).toBe(1);
|
|
178
|
+
await expect(title).toHaveAccessibleName(
|
|
179
|
+
new RegExp(await monthAtRest(viewport)),
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Closing the month and year wheels re-asserts the month shown, a steer that
|
|
185
|
+
* moves nothing. A trackpad scroll after it is the user's: it pages to the
|
|
186
|
+
* next month and stays there, the title following.
|
|
187
|
+
*/
|
|
188
|
+
test('after the month and year wheels close, a trackpad scroll to the next month stays there', async ({
|
|
189
|
+
page,
|
|
190
|
+
}) => {
|
|
191
|
+
const viewport = await openCalendar(page);
|
|
192
|
+
const toggle = page.getByRole('button', {name: /Choose month and year/});
|
|
193
|
+
const start = await monthAtRest(viewport);
|
|
194
|
+
expect(start).not.toBe('');
|
|
195
|
+
const toggleBox = await toggle.boundingBox();
|
|
196
|
+
if (toggleBox == null) {
|
|
197
|
+
throw new Error('no month and year toggle');
|
|
198
|
+
}
|
|
199
|
+
const clickToggle = async () =>
|
|
200
|
+
page.mouse.click(
|
|
201
|
+
toggleBox.x + toggleBox.width / 2,
|
|
202
|
+
toggleBox.y + toggleBox.height / 2,
|
|
203
|
+
);
|
|
204
|
+
await clickToggle();
|
|
205
|
+
await expect(toggle).toHaveAttribute('aria-expanded', 'true');
|
|
206
|
+
await clickToggle();
|
|
207
|
+
await expect(toggle).toHaveAttribute('aria-expanded', 'false');
|
|
208
|
+
await waitForRest(viewport);
|
|
209
|
+
|
|
210
|
+
const box = await viewport.boundingBox();
|
|
211
|
+
if (box == null) {
|
|
212
|
+
throw new Error('no month scroller');
|
|
213
|
+
}
|
|
214
|
+
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
|
|
215
|
+
// A horizontal trackpad scroll of 70 % of a month, as one wheel event: a
|
|
216
|
+
// burst of small ones reaches a loaded page far enough apart to count as
|
|
217
|
+
// separate gestures, each snapping back on its own.
|
|
218
|
+
await page.mouse.wheel(box.width * 0.7, 0);
|
|
219
|
+
// Past the scroller's own settle correction too, which ends on a month's
|
|
220
|
+
// boundary.
|
|
221
|
+
await waitForRestOnMonth(viewport);
|
|
222
|
+
const next = await monthAtRest(viewport);
|
|
223
|
+
expect(next).not.toBe(start);
|
|
224
|
+
await expect(toggle).toHaveAccessibleName(new RegExp(next));
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Reset from four months on is a far jump, mounting today's month before the
|
|
229
|
+
* scroller moves. After the month and year wheels close, whose re-assert is a
|
|
230
|
+
* steer that moved nothing, the jump still rests on today's month, the title
|
|
231
|
+
* with it.
|
|
232
|
+
*/
|
|
233
|
+
test('after the month and year wheels close, Reset from four months on rests on today’s month', async ({
|
|
234
|
+
page,
|
|
235
|
+
}) => {
|
|
236
|
+
const viewport = await openCalendar(page);
|
|
237
|
+
const toggle = page.getByRole('button', {name: /Choose month and year/});
|
|
238
|
+
const today = await monthAtRest(viewport);
|
|
239
|
+
expect(today).not.toBe('');
|
|
240
|
+
const clickCentre = async (name: string | RegExp) => {
|
|
241
|
+
const box = await page.getByRole('button', {name}).boundingBox();
|
|
242
|
+
if (box == null) {
|
|
243
|
+
throw new Error(`no ${String(name)} button`);
|
|
244
|
+
}
|
|
245
|
+
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
246
|
+
};
|
|
247
|
+
for (let step = 0; step < 4; step++) {
|
|
248
|
+
await clickCentre('Next month');
|
|
249
|
+
await waitForRest(viewport);
|
|
250
|
+
}
|
|
251
|
+
expect(await monthAtRest(viewport)).not.toBe(today);
|
|
252
|
+
await clickCentre(/Choose month and year/);
|
|
253
|
+
await expect(toggle).toHaveAttribute('aria-expanded', 'true');
|
|
254
|
+
await clickCentre(/Choose month and year/);
|
|
255
|
+
await expect(toggle).toHaveAttribute('aria-expanded', 'false');
|
|
256
|
+
await waitForRest(viewport);
|
|
257
|
+
|
|
258
|
+
await clickCentre('Reset');
|
|
259
|
+
// Past the scroller's own settle correction too, which ends on a month's
|
|
260
|
+
// boundary.
|
|
261
|
+
await waitForRestOnMonth(viewport);
|
|
262
|
+
expect(await monthAtRest(viewport)).toBe(today);
|
|
263
|
+
await expect(toggle).toHaveAccessibleName(new RegExp(today));
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
test.describe('under a finger', () => {
|
|
267
|
+
test.use({hasTouch: true, isMobile: true});
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* A swipe whose last move crosses the middle of the month makes the
|
|
271
|
+
* scroller re-center as the finger lifts. The finger drives that scroll, so
|
|
272
|
+
* the re-center leaves scroll snapping on (turning it off drops the snap
|
|
273
|
+
* target iOS tracks for the gesture, and the swipe coasted past the month),
|
|
274
|
+
* and the swipe comes to rest on the next month.
|
|
275
|
+
*/
|
|
276
|
+
test('a swipe that crosses the middle of a month as it lifts keeps snapping on and rests on the next month', async ({
|
|
277
|
+
page,
|
|
278
|
+
}) => {
|
|
279
|
+
const viewport = await openCalendar(page);
|
|
280
|
+
const start = await monthAtRest(viewport);
|
|
281
|
+
const box = await viewport.boundingBox();
|
|
282
|
+
if (box == null) {
|
|
283
|
+
throw new Error('no month scroller');
|
|
284
|
+
}
|
|
285
|
+
// Every change of the scroller's inline scroll-snap-type from here on.
|
|
286
|
+
await viewport.evaluate(element => {
|
|
287
|
+
const changes: string[] = [];
|
|
288
|
+
(window as unknown as {snapChanges: string[]}).snapChanges = changes;
|
|
289
|
+
new MutationObserver(() => {
|
|
290
|
+
changes.push((element as HTMLElement).style.scrollSnapType || 'on');
|
|
291
|
+
}).observe(element, {attributes: true, attributeFilter: ['style']});
|
|
292
|
+
});
|
|
293
|
+
const driver = await touchDriver(page);
|
|
294
|
+
const y = box.y + box.height / 2;
|
|
295
|
+
const from = {x: box.x + box.width * 0.8, y};
|
|
296
|
+
// 55 % of a month toward the next one, the middle crossed by the last
|
|
297
|
+
// move, lifting a quarter frame after it.
|
|
298
|
+
await driver.play(
|
|
299
|
+
drag(from, {x: from.x - box.width * 0.55, y}, {durationMs: 300}),
|
|
300
|
+
);
|
|
301
|
+
await waitForRestOnMonth(viewport);
|
|
302
|
+
const rest = await monthAtRest(viewport);
|
|
303
|
+
expect(rest).not.toBe('');
|
|
304
|
+
expect(rest).not.toBe(start);
|
|
305
|
+
// Snapping was never turned off while the finger drove the scroll.
|
|
306
|
+
expect(
|
|
307
|
+
await page.evaluate(
|
|
308
|
+
() => (window as unknown as {snapChanges: string[]}).snapChanges,
|
|
309
|
+
),
|
|
310
|
+
).not.toContain('none');
|
|
311
|
+
});
|
|
312
|
+
});
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file usePointerDragScroll.ts
|
|
7
7
|
* @input A scroll container ref
|
|
8
|
-
* @output Lets a mouse drag the container's contents the way a finger does
|
|
8
|
+
* @output Lets a mouse drag the container's contents the way a finger does,
|
|
9
|
+
* and reports while a drag holds it (`isDraggingRef`)
|
|
9
10
|
* @position Internal behavior hook; consumed by Wheel.tsx
|
|
10
11
|
*
|
|
11
12
|
* ## Why this exists
|
|
@@ -38,12 +39,20 @@
|
|
|
38
39
|
* then jumps a whole one. The drag therefore suspends snapping, and restores
|
|
39
40
|
* it once the release has settled somewhere legal.
|
|
40
41
|
*
|
|
42
|
+
* ## A held drag is not rest
|
|
43
|
+
*
|
|
44
|
+
* Every `scrollTop` the drag assigns is a programmatic scroll, and Chromium
|
|
45
|
+
* ends each one with a `scrollend` — 14 moves, 14 of them. A settle listening
|
|
46
|
+
* for `scrollend` alone would commit the row under the band at every step,
|
|
47
|
+
* with the button still down. `isDraggingRef` tells `useScrollSettle` the
|
|
48
|
+
* drag is still held, the way a touch that has not ended does.
|
|
49
|
+
*
|
|
41
50
|
* SYNC: When modified, update:
|
|
42
51
|
* - /packages/core/src/DateInput/Wheel.tsx
|
|
43
52
|
* - /packages/core/src/DateInput/DateInputTouch.test.tsx
|
|
44
53
|
*/
|
|
45
54
|
|
|
46
|
-
import {useEffect} from 'react';
|
|
55
|
+
import {useEffect, useRef} from 'react';
|
|
47
56
|
|
|
48
57
|
/**
|
|
49
58
|
* Movement below this stays a click. A mouse shifts a pixel or two under the
|
|
@@ -54,6 +63,16 @@ export const DRAG_SLOP = 4;
|
|
|
54
63
|
/** How long to wait for a release's settle before restoring snapping. */
|
|
55
64
|
const SETTLE_FALLBACK_MS = 260;
|
|
56
65
|
|
|
66
|
+
/** What {@link usePointerDragScroll} reports back about the drag. */
|
|
67
|
+
export type PointerDragScrollState = {
|
|
68
|
+
/**
|
|
69
|
+
* True while a mouse drag holds the container: from the press that moved
|
|
70
|
+
* past {@link DRAG_SLOP} until its release. Pass it to `useScrollSettle`,
|
|
71
|
+
* which treats a held drag as it treats a finger still down.
|
|
72
|
+
*/
|
|
73
|
+
isDraggingRef: React.RefObject<boolean>;
|
|
74
|
+
};
|
|
75
|
+
|
|
57
76
|
/**
|
|
58
77
|
* Let a mouse drag `ref`'s contents, on a container that already scrolls and
|
|
59
78
|
* snaps for touch.
|
|
@@ -65,7 +84,9 @@ const SETTLE_FALLBACK_MS = 260;
|
|
|
65
84
|
export function usePointerDragScroll(
|
|
66
85
|
ref: React.RefObject<HTMLElement | null>,
|
|
67
86
|
isEnabled: boolean = true,
|
|
68
|
-
):
|
|
87
|
+
): PointerDragScrollState {
|
|
88
|
+
const isDraggingRef = useRef(false);
|
|
89
|
+
|
|
69
90
|
useEffect(() => {
|
|
70
91
|
const element = ref.current;
|
|
71
92
|
if (element == null || !isEnabled) {
|
|
@@ -75,9 +96,9 @@ export function usePointerDragScroll(
|
|
|
75
96
|
let pointerId: number | null = null;
|
|
76
97
|
let originY = 0;
|
|
77
98
|
let originScrollTop = 0;
|
|
78
|
-
|
|
99
|
+
isDraggingRef.current = false;
|
|
79
100
|
// Survives from the drag's end to the click it produces, which is the
|
|
80
|
-
// whole reason it is not just `
|
|
101
|
+
// whole reason it is not just `isDraggingRef`.
|
|
81
102
|
let wasDragged = false;
|
|
82
103
|
let restoreTimer: number | undefined;
|
|
83
104
|
|
|
@@ -120,7 +141,7 @@ export function usePointerDragScroll(
|
|
|
120
141
|
pointerId = event.pointerId;
|
|
121
142
|
originY = event.clientY;
|
|
122
143
|
originScrollTop = element.scrollTop;
|
|
123
|
-
|
|
144
|
+
isDraggingRef.current = false;
|
|
124
145
|
// Not captured yet: a press that never moves has to stay a click on the
|
|
125
146
|
// row under it, and capturing here would retarget that click.
|
|
126
147
|
};
|
|
@@ -130,11 +151,11 @@ export function usePointerDragScroll(
|
|
|
130
151
|
return;
|
|
131
152
|
}
|
|
132
153
|
const delta = event.clientY - originY;
|
|
133
|
-
if (!
|
|
154
|
+
if (!isDraggingRef.current) {
|
|
134
155
|
if (Math.abs(delta) < DRAG_SLOP) {
|
|
135
156
|
return;
|
|
136
157
|
}
|
|
137
|
-
|
|
158
|
+
isDraggingRef.current = true;
|
|
138
159
|
element.setPointerCapture(event.pointerId);
|
|
139
160
|
suspendSnap();
|
|
140
161
|
// Dragging across rows would otherwise select their text, leaving the
|
|
@@ -151,10 +172,10 @@ export function usePointerDragScroll(
|
|
|
151
172
|
return;
|
|
152
173
|
}
|
|
153
174
|
pointerId = null;
|
|
154
|
-
if (!
|
|
175
|
+
if (!isDraggingRef.current) {
|
|
155
176
|
return;
|
|
156
177
|
}
|
|
157
|
-
|
|
178
|
+
isDraggingRef.current = false;
|
|
158
179
|
wasDragged = true;
|
|
159
180
|
element.style.removeProperty('user-select');
|
|
160
181
|
if (element.hasPointerCapture(event.pointerId)) {
|
|
@@ -204,9 +225,12 @@ export function usePointerDragScroll(
|
|
|
204
225
|
element.removeEventListener('pointerup', onPointerEnd);
|
|
205
226
|
element.removeEventListener('pointercancel', onPointerEnd);
|
|
206
227
|
element.removeEventListener('click', onClickCapture, {capture: true});
|
|
228
|
+
isDraggingRef.current = false;
|
|
207
229
|
restoreSnap();
|
|
208
230
|
};
|
|
209
231
|
}, [ref, isEnabled]);
|
|
232
|
+
|
|
233
|
+
return {isDraggingRef};
|
|
210
234
|
}
|
|
211
235
|
|
|
212
236
|
/**
|