@astryxdesign/core 0.7.5 → 0.7.6-canary.bb18c81
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/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +12 -3
- 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/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -5
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +4 -1
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +101 -15
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +4 -1
- 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.map +1 -1
- package/dist/Drawer/Drawer.js +5 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +10 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +16 -2
- 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.js +2 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -1
- 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 +2 -1
- package/dist/Item/ItemSwipeLayer.js +1 -1
- 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/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +7 -2
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +5 -2
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +3 -3
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- 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/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +7 -1
- package/dist/Spinner/Spinner.js +2 -2
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- 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/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +2 -2
- package/dist/Timestamp/TimestampHoverCard.js +4 -4
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +82 -51
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +13 -2
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +2 -1
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -1
- package/dist/astryx.css +14 -1
- package/dist/gestures/PinchGestureRecognizer.d.ts +30 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PinchGestureRecognizer.js +125 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +70 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +220 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts +36 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/SwipeGestureRecognizer.js +145 -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/types.d.ts +11 -7
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +22 -2
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +4 -1
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +12 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +3 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +3 -0
- package/dist/motion/animator.d.ts +7 -1
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +119 -27
- package/dist/theme/defineTheme.js +1 -1
- 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/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/presentation.d.ts +50 -0
- package/dist/utils/presentation.d.ts.map +1 -0
- package/dist/utils/presentation.js +125 -0
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +5 -3
- 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/locales/en.json +13 -1
- package/locales/pseudo.json +9 -0
- 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/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/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/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- 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/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/DateInput/DateInput.test.tsx +53 -2
- package/src/DateInput/DateInput.tsx +15 -11
- package/src/DateInput/MonthScroller.tsx +106 -20
- package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
- package/src/DateRangeInput/DateRangeInput.tsx +16 -12
- package/src/DateTimeInput/DateTimeInput.spec.md +71 -48
- package/src/DateTimeInput/DateTimeInput.test.tsx +61 -0
- package/src/DateTimeInput/DateTimeInput.tsx +15 -11
- 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 +22 -0
- package/src/Drawer/Drawer.tsx +5 -0
- package/src/Drawer/DrawerHeader.spec.md +181 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
- package/src/DropdownMenu/DropdownMenu.tsx +7 -1
- 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 +53 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +23 -6
- package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
- 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 +2 -2
- package/src/FileInput/FileInput.test.tsx +21 -0
- package/src/FileInput/FileInput.tsx +4 -1
- package/src/FormLayout/FormLayout.spec.md +7 -8
- 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.tsx +2 -1
- package/src/Item/ItemSwipeLayer.tsx +1 -1
- 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/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.tsx +3 -3
- 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/MultiSelector.spec.md +7 -4
- package/src/MultiSelector/MultiSelector.test.tsx +118 -1
- package/src/MultiSelector/MultiSelector.tsx +6 -2
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
- package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.tsx +13 -3
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- 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/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 +27 -0
- package/src/Slider/Slider.test.tsx +12 -0
- package/src/Slider/Slider.tsx +4 -1
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
- package/src/Spinner/Spinner.tsx +2 -2
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/TabList/TabList.test.tsx +52 -1
- package/src/TabList/TabList.tsx +16 -1
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- 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/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 +7 -10
- package/src/Toast/ToastViewport.test.tsx +575 -1
- package/src/Toast/ToastViewport.tsx +100 -50
- package/src/Tokenizer/Tokenizer.spec.md +5 -3
- package/src/Tokenizer/Tokenizer.test.tsx +68 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- 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/Typeahead/Typeahead.test.tsx +40 -0
- package/src/Typeahead/Typeahead.tsx +12 -1
- package/src/gestures/PinchGestureRecognizer.ts +144 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +252 -0
- package/src/gestures/SwipeGestureRecognizer.ts +193 -0
- package/src/gestures/VelocityTracker.ts +10 -3
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +188 -0
- package/src/gestures/__tests__/harness.ts +21 -2
- package/src/gestures/types.ts +23 -9
- package/src/hooks/useAdaptivePresentation.ts +4 -1
- package/src/hooks/useMenuHover.ts +15 -1
- package/src/i18n/generated-locales/en.generated.ts +4 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +4 -0
- package/src/motion/README.md +11 -1
- package/src/motion/animator.test.ts +151 -3
- package/src/motion/animator.ts +149 -33
- package/src/theme/defineTheme.ts +1 -1
- 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/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/presentation.test.ts +380 -0
- package/src/utils/presentation.ts +180 -0
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/touchPresentation.stylex.ts +43 -0
- package/src/utils/touchPresentation.test.ts +140 -1
- package/src/utils/touchPresentation.ts +5 -3
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file SwipeGestureRecognizer.ts
|
|
5
|
+
* @input Touches from a GestureArena
|
|
6
|
+
* @output Exports SwipeGestureRecognizer (UISwipeGestureRecognizer), its
|
|
7
|
+
* options and direction type
|
|
8
|
+
* @position Discrete recognizer of packages/core/src/gestures
|
|
9
|
+
*
|
|
10
|
+
* Recognized WHILE the fingers move, as UIKit's is: as soon as the centroid
|
|
11
|
+
* has travelled `minimumDistance` along an allowed direction, within
|
|
12
|
+
* `maximumDuration` of touch-down, with off-axis travel no more than
|
|
13
|
+
* `maximumSecondaryMovement` px across it. Off-axis travel past that
|
|
14
|
+
* allowance, or the distance travelled the wrong way, rules a direction out;
|
|
15
|
+
* the swipe fails once every allowed direction is ruled out, as it does for
|
|
16
|
+
* too many fingers, the duration running out, and a lift before it was
|
|
17
|
+
* recognized.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {UIKIT_SWIPE} from '../motion/uikit/gestures';
|
|
21
|
+
import {centroid} from './geometry';
|
|
22
|
+
import {
|
|
23
|
+
GestureRecognizer,
|
|
24
|
+
type GestureRecognizerOptions,
|
|
25
|
+
type NativeTouchBehavior,
|
|
26
|
+
} from './GestureRecognizer';
|
|
27
|
+
import type {GestureEventContext, GestureTouch, Point} from './types';
|
|
28
|
+
|
|
29
|
+
export type SwipeDirection = 'left' | 'right' | 'up' | 'down';
|
|
30
|
+
|
|
31
|
+
export interface SwipeGestureRecognizerOptions extends GestureRecognizerOptions<SwipeGestureRecognizer> {
|
|
32
|
+
/** @default ['right'] */
|
|
33
|
+
direction?: SwipeDirection | ReadonlyArray<SwipeDirection>;
|
|
34
|
+
/** @default 1 */
|
|
35
|
+
numberOfTouchesRequired?: number;
|
|
36
|
+
minimumDistance?: number;
|
|
37
|
+
maximumDuration?: number;
|
|
38
|
+
maximumSecondaryMovement?: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const SWIPE = UIKIT_SWIPE;
|
|
42
|
+
|
|
43
|
+
export class SwipeGestureRecognizer extends GestureRecognizer {
|
|
44
|
+
directions: ReadonlyArray<SwipeDirection>;
|
|
45
|
+
numberOfTouchesRequired: number;
|
|
46
|
+
minimumDistance: number;
|
|
47
|
+
maximumDuration: number;
|
|
48
|
+
maximumSecondaryMovement: number;
|
|
49
|
+
/** The direction of the recognized swipe. */
|
|
50
|
+
recognizedDirection: SwipeDirection | null = null;
|
|
51
|
+
|
|
52
|
+
private origin: Point = {x: 0, y: 0};
|
|
53
|
+
/** Directions this touch's path has ruled out. */
|
|
54
|
+
private readonly ruledOut = new Set<SwipeDirection>();
|
|
55
|
+
/** The centroid at the previous move. */
|
|
56
|
+
private last: Point | null = null;
|
|
57
|
+
|
|
58
|
+
constructor(options: SwipeGestureRecognizerOptions = {}) {
|
|
59
|
+
super(options);
|
|
60
|
+
const direction = options.direction ?? ['right'];
|
|
61
|
+
this.directions = typeof direction === 'string' ? [direction] : direction;
|
|
62
|
+
this.numberOfTouchesRequired = options.numberOfTouchesRequired ?? 1;
|
|
63
|
+
this.minimumDistance =
|
|
64
|
+
options.minimumDistance ?? SWIPE.minimumDistance.value;
|
|
65
|
+
this.maximumDuration =
|
|
66
|
+
options.maximumDuration ?? SWIPE.maximumDuration.value;
|
|
67
|
+
this.maximumSecondaryMovement =
|
|
68
|
+
options.maximumSecondaryMovement ?? SWIPE.maximumSecondaryMovement.value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
override get isDiscrete(): boolean {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
override get nativeTouchBehavior(): NativeTouchBehavior {
|
|
76
|
+
const horizontal = this.directions.some(
|
|
77
|
+
direction => direction === 'left' || direction === 'right',
|
|
78
|
+
);
|
|
79
|
+
const vertical = this.directions.some(
|
|
80
|
+
direction => direction === 'up' || direction === 'down',
|
|
81
|
+
);
|
|
82
|
+
return {
|
|
83
|
+
panX: !horizontal,
|
|
84
|
+
panY: !vertical,
|
|
85
|
+
pinchZoom: true,
|
|
86
|
+
doubleTapZoom: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected override touchesBegan(
|
|
91
|
+
touches: ReadonlyArray<GestureTouch>,
|
|
92
|
+
event: GestureEventContext,
|
|
93
|
+
): void {
|
|
94
|
+
if (this.numberOfTouches > this.numberOfTouchesRequired) {
|
|
95
|
+
this.setState('failed');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (this.numberOfTouches === touches.length) {
|
|
99
|
+
this.setTimer(event.time + this.maximumDuration, () => {
|
|
100
|
+
// A swipe already recognized, waiting on a recognizer it requires to
|
|
101
|
+
// fail, holds its recognition (spec:AST-094 FR15).
|
|
102
|
+
if (this.pending == null) {
|
|
103
|
+
this.setState('failed');
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Measure from where every required finger is down.
|
|
108
|
+
this.origin = centroid(this.touches.values());
|
|
109
|
+
this.last = null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
protected override touchesMoved(): void {
|
|
113
|
+
if (
|
|
114
|
+
this.pending != null ||
|
|
115
|
+
this.numberOfTouches !== this.numberOfTouchesRequired
|
|
116
|
+
) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const current = centroid(this.touches.values());
|
|
120
|
+
const from = this.last ?? this.origin;
|
|
121
|
+
this.last = current;
|
|
122
|
+
for (const direction of this.directions) {
|
|
123
|
+
if (this.ruledOut.has(direction)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// Along and across this direction at the start and the end of the
|
|
127
|
+
// move. The path between two events is read as a straight segment, so
|
|
128
|
+
// the verdict does not depend on how far apart the events were.
|
|
129
|
+
const [along0, across0] = this.project(direction, from);
|
|
130
|
+
const [along1, across1] = this.project(direction, current);
|
|
131
|
+
const reaches = segmentCrossing(along0, along1, this.minimumDistance);
|
|
132
|
+
const strays = Math.max(
|
|
133
|
+
segmentCrossing(across0, across1, this.maximumSecondaryMovement),
|
|
134
|
+
segmentCrossing(-across0, -across1, this.maximumSecondaryMovement),
|
|
135
|
+
);
|
|
136
|
+
const strayAt = strays < 0 ? Infinity : strays;
|
|
137
|
+
if (reaches >= 0 && reaches <= strayAt) {
|
|
138
|
+
this.recognizedDirection = direction;
|
|
139
|
+
this.setState('ended');
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Off-axis travel past the allowance, or the distance the wrong way,
|
|
143
|
+
// rules a direction out for good.
|
|
144
|
+
if (strays >= 0 || along1 <= -this.minimumDistance) {
|
|
145
|
+
this.ruledOut.add(direction);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (this.directions.every(direction => this.ruledOut.has(direction))) {
|
|
149
|
+
this.setState('failed');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Travel along and across `direction` from the origin to `point`. */
|
|
154
|
+
private project(direction: SwipeDirection, point: Point): [number, number] {
|
|
155
|
+
const dx = point.x - this.origin.x;
|
|
156
|
+
const dy = point.y - this.origin.y;
|
|
157
|
+
return direction === 'left'
|
|
158
|
+
? [-dx, dy]
|
|
159
|
+
: direction === 'right'
|
|
160
|
+
? [dx, dy]
|
|
161
|
+
: direction === 'up'
|
|
162
|
+
? [-dy, dx]
|
|
163
|
+
: [dy, dx];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
protected override touchesEnded(): void {
|
|
167
|
+
// Recognized and waiting, it holds past the lift (FR15).
|
|
168
|
+
if (this.pending == null) {
|
|
169
|
+
this.setState('failed');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
protected override reset(): void {
|
|
174
|
+
this.recognizedDirection = null;
|
|
175
|
+
this.ruledOut.clear();
|
|
176
|
+
this.last = null;
|
|
177
|
+
this.origin = {x: 0, y: 0};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Where on the segment from `start` to `end` (0 to 1) the value first
|
|
183
|
+
* reaches `limit`; 0 when it starts there, -1 when it never does.
|
|
184
|
+
*/
|
|
185
|
+
function segmentCrossing(start: number, end: number, limit: number): number {
|
|
186
|
+
if (start >= limit) {
|
|
187
|
+
return 0;
|
|
188
|
+
}
|
|
189
|
+
if (end < limit) {
|
|
190
|
+
return -1;
|
|
191
|
+
}
|
|
192
|
+
return (limit - start) / (end - start);
|
|
193
|
+
}
|
|
@@ -88,15 +88,22 @@ export class VelocityTracker {
|
|
|
88
88
|
* Record a position. Timestamps must not go backwards (an older sample is
|
|
89
89
|
* ignored), and a moved sample at the newest moved sample's timestamp
|
|
90
90
|
* replaces it. A sample at the newest position is not motion: it changes
|
|
91
|
-
* no velocity
|
|
91
|
+
* no velocity, unless `isMotion` says the contact moved anyway (a pinch's
|
|
92
|
+
* value holding while both fingers move, which reads as zero velocity for
|
|
93
|
+
* that interval).
|
|
92
94
|
*/
|
|
93
|
-
add(
|
|
95
|
+
add(
|
|
96
|
+
x: number,
|
|
97
|
+
y: number,
|
|
98
|
+
time: number,
|
|
99
|
+
{isMotion = false}: {isMotion?: boolean} = {},
|
|
100
|
+
): void {
|
|
94
101
|
if (this.newest != null && time < this.newest.time) {
|
|
95
102
|
return;
|
|
96
103
|
}
|
|
97
104
|
this.newest = {x, y, time};
|
|
98
105
|
const last = this.moved[this.moved.length - 1];
|
|
99
|
-
if (last != null && x === last.x && y === last.y) {
|
|
106
|
+
if (last != null && x === last.x && y === last.y && !isMotion) {
|
|
100
107
|
return;
|
|
101
108
|
}
|
|
102
109
|
if (last != null && time === last.time) {
|
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import {describe, expect, it} from 'vitest';
|
|
11
|
-
import {
|
|
11
|
+
import {UIKIT_PAN, UIKIT_VELOCITY} from '../../motion/uikit/gestures';
|
|
12
12
|
import {PanGestureRecognizer} from '../PanGestureRecognizer';
|
|
13
|
-
import {createHarness
|
|
13
|
+
import {createHarness} from './harness';
|
|
14
14
|
|
|
15
15
|
describe('PanGestureRecognizer', () => {
|
|
16
16
|
it('begins past the hysteresis and leaves the threshold out of the translation', () => {
|
|
17
17
|
const h = createHarness();
|
|
18
18
|
const pan = new PanGestureRecognizer({name: 'pan'});
|
|
19
|
-
const hysteresis =
|
|
19
|
+
const hysteresis = UIKIT_PAN.hysteresis.value;
|
|
20
20
|
h.finger(1).down(100, 100, 0, {recognizers: [pan]});
|
|
21
21
|
h.finger(1).move(100 + hysteresis - 0.1, 100, 16);
|
|
22
22
|
expect(pan.state).toBe('possible');
|
|
@@ -75,7 +75,7 @@ describe('PanGestureRecognizer', () => {
|
|
|
75
75
|
});
|
|
76
76
|
|
|
77
77
|
it('releases at 0 after a rest longer than the stillness interval (AST-100 FR2)', () => {
|
|
78
|
-
const stillness =
|
|
78
|
+
const stillness = UIKIT_VELOCITY.stillness.value;
|
|
79
79
|
const release = (liftAt: number) => {
|
|
80
80
|
const h = createHarness();
|
|
81
81
|
const pan = new PanGestureRecognizer({name: 'pan'});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file PinchGestureRecognizer.test.ts
|
|
5
|
+
* @input Synthetic touches with explicit timestamps through a GestureArena
|
|
6
|
+
* @output PinchGestureRecognizer's state machine: the hysteresis, the scale against the moved starting span, the velocity, extra fingers, re-basing
|
|
7
|
+
* @position Unit tests of packages/core/src/gestures/PinchGestureRecognizer.ts
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {describe, expect, it} from 'vitest';
|
|
11
|
+
import {PinchGestureRecognizer} from '../PinchGestureRecognizer';
|
|
12
|
+
import {createHarness} from './harness';
|
|
13
|
+
|
|
14
|
+
describe('PinchGestureRecognizer', () => {
|
|
15
|
+
it('begins after the hysteresis and reports scale and velocity', () => {
|
|
16
|
+
const h = createHarness();
|
|
17
|
+
const pinch = new PinchGestureRecognizer({name: 'pinch'});
|
|
18
|
+
h.finger(1).down(100, 100, 0, {recognizers: [pinch]});
|
|
19
|
+
h.finger(2).down(200, 100, 0, {recognizers: [pinch]});
|
|
20
|
+
h.finger(2).move(205, 100, 16);
|
|
21
|
+
expect(pinch.state).toBe('possible');
|
|
22
|
+
h.finger(2).move(210, 100, 32);
|
|
23
|
+
expect(pinch.state).toBe('began');
|
|
24
|
+
// UIKit: against the starting span moved by the hysteresis (100 + 8).
|
|
25
|
+
expect(pinch.scale).toBeCloseTo(110 / 108, 5);
|
|
26
|
+
for (let t = 48; t <= 160; t += 16) {
|
|
27
|
+
h.finger(2).move(210 + (t - 32) * 0.1, 100, t);
|
|
28
|
+
}
|
|
29
|
+
// 0.1 px/ms over 108 px.
|
|
30
|
+
expect(pinch.velocity).toBeCloseTo(100 / 108, 5);
|
|
31
|
+
h.finger(1).up(170);
|
|
32
|
+
expect(h.log).toContain('pinch:ended@170');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('ignores a third finger and can be re-based', () => {
|
|
36
|
+
const h = createHarness();
|
|
37
|
+
const pinch = new PinchGestureRecognizer({name: 'pinch'});
|
|
38
|
+
h.finger(1).down(0, 0, 0, {recognizers: [pinch]});
|
|
39
|
+
h.finger(2).down(100, 0, 0, {recognizers: [pinch]});
|
|
40
|
+
h.finger(3).down(50, 50, 5, {recognizers: [pinch]});
|
|
41
|
+
expect(pinch.numberOfTouches).toBe(2);
|
|
42
|
+
h.finger(2).move(150, 0, 16);
|
|
43
|
+
pinch.scale = 1;
|
|
44
|
+
h.finger(2).move(300, 0, 32);
|
|
45
|
+
expect(pinch.scale).toBeCloseTo(2, 5);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('lets the velocity settle when the span holds while the fingers move', () => {
|
|
49
|
+
const h = createHarness();
|
|
50
|
+
const pinch = new PinchGestureRecognizer({name: 'pinch'});
|
|
51
|
+
h.finger(1).down(100, 100, 0, {recognizers: [pinch]});
|
|
52
|
+
h.finger(2).down(200, 100, 0, {recognizers: [pinch]});
|
|
53
|
+
let time = 0;
|
|
54
|
+
for (let x = 210; x <= 260; x += 10) {
|
|
55
|
+
time += 16;
|
|
56
|
+
h.finger(2).move(x, 100, time);
|
|
57
|
+
}
|
|
58
|
+
const spreading = pinch.velocity;
|
|
59
|
+
expect(spreading).toBeGreaterThan(0);
|
|
60
|
+
// The second finger circles the first at exactly the same distance (160:
|
|
61
|
+
// 3-4-5 triangles), so the span holds while it moves.
|
|
62
|
+
for (const [dx, dy] of [
|
|
63
|
+
[128, 96],
|
|
64
|
+
[96, 128],
|
|
65
|
+
[0, 160],
|
|
66
|
+
[-96, 128],
|
|
67
|
+
[-128, 96],
|
|
68
|
+
]) {
|
|
69
|
+
time += 16;
|
|
70
|
+
h.finger(2).move(100 + dx, 100 + dy, time);
|
|
71
|
+
}
|
|
72
|
+
expect(Math.abs(pinch.velocity)).toBeLessThan(spreading * 0.25);
|
|
73
|
+
});
|
|
74
|
+
});
|