@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,420 @@
|
|
|
1
|
+
# Gestures
|
|
2
|
+
|
|
3
|
+
A gesture recognizer system with UIKit's semantics, for the touch
|
|
4
|
+
presentations of Astryx core components. Components import it from
|
|
5
|
+
`../gestures`; nothing here is exported from the package.
|
|
6
|
+
|
|
7
|
+
UIKit is the reference throughout: the same recognizer states, the same
|
|
8
|
+
conflict rules, the same thresholds (from `../motion/uikit/gestures.ts`, each
|
|
9
|
+
one sourced or marked as a guess awaiting measurement), and touch handling
|
|
10
|
+
that behaves like `UIControl` and `UIScrollView`. The rest of this page says
|
|
11
|
+
where the web forces a difference.
|
|
12
|
+
|
|
13
|
+
## Using it from a component
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import {useRef} from 'react';
|
|
17
|
+
import {PanGestureRecognizer, useGestureRecognizer} from '../gestures';
|
|
18
|
+
|
|
19
|
+
function Sheet() {
|
|
20
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
21
|
+
useGestureRecognizer(
|
|
22
|
+
ref,
|
|
23
|
+
() => new PanGestureRecognizer({direction: 'down'}),
|
|
24
|
+
pan => {
|
|
25
|
+
// Runs inside the input event: write the transform, render nothing.
|
|
26
|
+
const element = ref.current;
|
|
27
|
+
if (element == null) return;
|
|
28
|
+
if (pan.state === 'ended') {
|
|
29
|
+
settle(element, pan.translation().y, pan.velocity().y);
|
|
30
|
+
} else {
|
|
31
|
+
element.style.transform = `translateY(${pan.translation().y}px)`;
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
return <div ref={ref}>…</div>;
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- The recognizer is created once per component and keeps its identity, so
|
|
40
|
+
relationships set up when it is created (`requireToFail`,
|
|
41
|
+
`recognizeSimultaneouslyWith`) keep working.
|
|
42
|
+
- The listener is read through a ref. Passing a new function on each render
|
|
43
|
+
attaches nothing new, and a gesture never causes a React render.
|
|
44
|
+
- The recognizer attaches in a layout effect, so the element's `touch-action`
|
|
45
|
+
is set before the browser can see a finger.
|
|
46
|
+
- The `isEnabled` option follows the prop. Turning it off mid-gesture ends
|
|
47
|
+
the gesture without calling the listener, since the handler that turned
|
|
48
|
+
it off owns that end (no consumer callback from an Effect). A recognizer
|
|
49
|
+
that required it to fail recognizes a microtask later, outside the Effect,
|
|
50
|
+
and its listener reports as usual. A handler that wants UIKit's
|
|
51
|
+
`.cancelled` calls `recognizer.setEnabled(false)` itself, which reports it
|
|
52
|
+
at once.
|
|
53
|
+
- `usePressTracker` rebuilds its tracker when `trackingExpansion`,
|
|
54
|
+
`highlightDelay`, `cancelTravel` or `quickTapFlash` change, from the next
|
|
55
|
+
touch, and reads its callbacks (`isBraking` included) on every touch.
|
|
56
|
+
- `usePressTracker(ref, options)` gives an element `UIControl` touch tracking
|
|
57
|
+
(see below).
|
|
58
|
+
|
|
59
|
+
Outside React, `getGestureHost(document).attach(element, recognizer)` does
|
|
60
|
+
the same and returns a detach function.
|
|
61
|
+
|
|
62
|
+
## Recognizers
|
|
63
|
+
|
|
64
|
+
| Recognizer | UIKit | Kind | Notes |
|
|
65
|
+
| -------------------------------- | ---------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
66
|
+
| `TapGestureRecognizer` | `UITapGestureRecognizer` | discrete | `numberOfTapsRequired`, `numberOfTouchesRequired`; fails past 45 px of travel, on extra fingers, a hold over 1.5 s, a late or far next tap |
|
|
67
|
+
| `LongPressGestureRecognizer` | `UILongPressGestureRecognizer` | continuous | `minimumPressDuration` 500 ms, `allowableMovement` 10 px (a distance, not per axis), `numberOfTapsRequired`; a zero duration begins on the touch itself (a selection tracker over a group of actions) |
|
|
68
|
+
| `PanGestureRecognizer` | `UIPanGestureRecognizer` | continuous | min/max touches, `direction` (axis or one-way) with `axisRatio`, `lockAxis`, `scrollEdge`; `translation()`, `totalTranslation()`, `velocity()` |
|
|
69
|
+
| `SwipeGestureRecognizer` | `UISwipeGestureRecognizer` | discrete | recognized during the motion; one or more directions, `numberOfTouchesRequired`; 50 px along, at most 50 px across, 500 ms |
|
|
70
|
+
| `PinchGestureRecognizer` | `UIPinchGestureRecognizer` | continuous | `scale` (settable, to re-base it), `velocity` in scale per second, `focalPoint()` |
|
|
71
|
+
| `ScreenEdgePanGestureRecognizer` | `UIScreenEdgePanGestureRecognizer` | continuous | `edges`: `leading` / `trailing`, resolved against the view's writing direction; attached to an edge zone the view lies within; fails as soon as the touch lands outside every requested edge band; a finger's only |
|
|
72
|
+
|
|
73
|
+
Every recognizer also has UIKit's switches: `isEnabled` (use `setEnabled`;
|
|
74
|
+
turning it off mid-gesture cancels), `cancelsTouchesInView` (default true),
|
|
75
|
+
`delaysTouchesBegan` (default false), `delaysTouchesEnded` (default true),
|
|
76
|
+
`allowedPointerTypes`, and `requiresExclusiveTouchType`.
|
|
77
|
+
|
|
78
|
+
### What the pan reports
|
|
79
|
+
|
|
80
|
+
The pan reads its numbers the way `UIPanGestureRecognizer` does, as measured
|
|
81
|
+
in the UIKit lab:
|
|
82
|
+
|
|
83
|
+
- It begins once the centroid has moved `hysteresis` (10 px) along either
|
|
84
|
+
axis, not as a distance.
|
|
85
|
+
- `translation()` leaves out the travel the threshold took: a slow drag reads
|
|
86
|
+
zero when the pan begins, and a step that overshoots keeps only the
|
|
87
|
+
overshoot. A dragged surface does not jump. `totalTranslation()` is the
|
|
88
|
+
movement since the fingers landed, for a surface that wants it.
|
|
89
|
+
- `axisRatio` (for a pan limited to an axis): the movement along the axis
|
|
90
|
+
must exceed `axisRatio` times the movement across it to begin; movement
|
|
91
|
+
across that exceeds the movement along it fails the pan; in between it
|
|
92
|
+
waits.
|
|
93
|
+
- `velocity()` is UIKit's own filter (see Velocity). The lift updates
|
|
94
|
+
neither number; a finger that rested past the stillness interval releases
|
|
95
|
+
at 0.
|
|
96
|
+
|
|
97
|
+
### States
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
possible ─► began ─► changed* ─► ended | cancelled continuous
|
|
101
|
+
possible ─► ended discrete ("recognized")
|
|
102
|
+
possible ─► failed
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Listeners (UIKit's target-action) run for `began`, `changed`, `ended` and
|
|
106
|
+
`cancelled`. `addTransitionListener` also reports `failed` and the return to
|
|
107
|
+
`possible`. A recognizer in a terminal state ignores the touches it still
|
|
108
|
+
holds and returns to `possible` when all of them have ended.
|
|
109
|
+
|
|
110
|
+
## Conflicts: the arena
|
|
111
|
+
|
|
112
|
+
A new touch goes to every recognizer on its hit path, innermost first, and
|
|
113
|
+
each one that accepts it tracks it until it ends. Then:
|
|
114
|
+
|
|
115
|
+
- **Exclusivity.** Two recognizers that share a touch are never active
|
|
116
|
+
together unless one allows it (`recognizeSimultaneouslyWith`, or the
|
|
117
|
+
`shouldRecognizeSimultaneously` delegate). The first to recognize fails
|
|
118
|
+
the other possible ones. A recognizer that tries to begin while a
|
|
119
|
+
conflicting one is active fails instead. When two qualify on the same
|
|
120
|
+
input, the innermost one wins.
|
|
121
|
+
- **Failure requirements.** `a.requireToFail(b)` keeps `a` in `possible`
|
|
122
|
+
until `b` fails, then lets `a` recognize. If `b` recognizes, `a` fails. A
|
|
123
|
+
recognizer that is not involved in the current touches holds nothing up.
|
|
124
|
+
The delegates `shouldRequireFailureOf` and `shouldBeRequiredToFailBy`
|
|
125
|
+
express the same thing dynamically.
|
|
126
|
+
- **Delegates.** `shouldBegin`, `shouldReceiveTouch`, and `canPrevent` /
|
|
127
|
+
`canBePrevented` on subclasses.
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
// Single tap waits for the double tap to fail, as in UIKit.
|
|
131
|
+
single.requireToFail(double);
|
|
132
|
+
|
|
133
|
+
// Inner horizontal scroller yields to the back-swipe in the edge band only:
|
|
134
|
+
// the edge pan fails at touch-down anywhere else, so nothing waits.
|
|
135
|
+
innerPan.requireToFail(edgePan);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Touches in the view: `createPressTracker`
|
|
139
|
+
|
|
140
|
+
A pressable control's view-level touch handling, with `UIControl`
|
|
141
|
+
semantics:
|
|
142
|
+
|
|
143
|
+
- `touchDown`, `touchDragInside` / `touchDragOutside`, `touchDragEnter` /
|
|
144
|
+
`touchDragExit`, `touchUpInside` / `touchUpOutside`, `touchCancel`.
|
|
145
|
+
- "Inside" is the control's bounds expanded by `trackingExpansion`, so a
|
|
146
|
+
fingertip that slides a little off a button is still on it.
|
|
147
|
+
- The highlight comes on in the same frame. Inside a scroller it waits
|
|
148
|
+
`contentTouchDelay` (`UIScrollView.delaysContentTouches`), so a flick
|
|
149
|
+
paints nothing. A tap quicker than that delay shows the highlight at the
|
|
150
|
+
lift for `quickTapFlash`.
|
|
151
|
+
- A recognizer that takes the touch (`cancelsTouchesInView`), or the browser
|
|
152
|
+
taking it to scroll, cancels the press with no release.
|
|
153
|
+
- `UIControl`'s iOS 6 rule applies: an ancestor's single-finger single tap
|
|
154
|
+
does not beat the control's own action for a touch on it.
|
|
155
|
+
`vetoesAncestorRecognizer` replaces that rule (a slider vetoes a pan along
|
|
156
|
+
its track).
|
|
157
|
+
|
|
158
|
+
The browser's click stays the control's activation, so keyboard and
|
|
159
|
+
assistive-technology activation keep working.
|
|
160
|
+
|
|
161
|
+
### Press profiles
|
|
162
|
+
|
|
163
|
+
`PRESS_PROFILES` holds the two ways UIKit tracks a press:
|
|
164
|
+
|
|
165
|
+
- `control` (a button, a switch): the highlight comes on in the same frame
|
|
166
|
+
outside a scroller, the finger is tracked 70 pt beyond the bounds, and
|
|
167
|
+
the release takes the list's deselect clock, as every surface's does
|
|
168
|
+
until a control runs its own (UIButton's 0.25 s);
|
|
169
|
+
- `cell` (a table or collection row): the highlight waits the content-touch
|
|
170
|
+
delay inside a scroll view and comes on at once outside one
|
|
171
|
+
(`spec:AST-094` FR11), travel past the pan hysteresis cancels the press for
|
|
172
|
+
good, a quicker tap highlights at the lift straight into the release, and
|
|
173
|
+
the release takes the list's deselect clock.
|
|
174
|
+
|
|
175
|
+
The document press controller (`utils/pressFeedback.ts`) writes
|
|
176
|
+
`data-astryx-press` for the presses it tracks, and the action-group tracker
|
|
177
|
+
(`hooks/actionGroupTracker.ts`) writes its groups' presses itself.
|
|
178
|
+
|
|
179
|
+
### Rows and cards
|
|
180
|
+
|
|
181
|
+
A list of a thousand rows cannot pay for a hook and four listeners per row.
|
|
182
|
+
The document press controller (`utils/pressFeedback.ts`) presses the
|
|
183
|
+
innermost enabled `[data-astryx-pressable]` under each touch and paints it,
|
|
184
|
+
with no listener per row; a touch that brakes a scroll the finger set moving
|
|
185
|
+
presses nothing.
|
|
186
|
+
|
|
187
|
+
## What the browser is told
|
|
188
|
+
|
|
189
|
+
- **Every pointer.** Gestures attach for a mouse, a pen and a finger
|
|
190
|
+
(`spec:AST-094` FR43). Under a fine primary pointer an element whose
|
|
191
|
+
gesture or press consumer is enabled listens with one passive
|
|
192
|
+
`pointerdown`; a press (the primary button, a pen's contact or a finger)
|
|
193
|
+
adds the page's listeners for that press alone, and they go once none of
|
|
194
|
+
its contacts is down, except the `click` listener, which stays up to 1 s
|
|
195
|
+
when a claimed lift owes a swallowed click (FR24). An element whose
|
|
196
|
+
recognizer claims a moving finger also keeps its blocking `touchmove`
|
|
197
|
+
(FR19). A right click, a pen's barrel button or a ctrl-click on macOS
|
|
198
|
+
starts no press.
|
|
199
|
+
- **`touch-action`.** Each element gets the intersection of what its
|
|
200
|
+
recognizers leave the browser, never wider than the element's own
|
|
201
|
+
`touch-action` (`spec:AST-094` FR18). Over an inline value the host writes
|
|
202
|
+
what both allow, inline. Otherwise it marks the element
|
|
203
|
+
(`data-astryx-touch-action`) under a rule in the first cascade layer, which
|
|
204
|
+
any author rule outranks, and in the next frame writes inline what both
|
|
205
|
+
allow where that is narrower than the author's rule. Detaching gives the
|
|
206
|
+
element its own value back (opt out with `manageStyle: false`):
|
|
207
|
+
|
|
208
|
+
| Recognizers on the element | `touch-action` |
|
|
209
|
+
| -------------------------------------------- | ------------------- |
|
|
210
|
+
| tap, long press | `manipulation` |
|
|
211
|
+
| horizontal pan or swipe, horizontal edge pan | `pan-y pinch-zoom` |
|
|
212
|
+
| vertical pan or swipe | `pan-x pinch-zoom` |
|
|
213
|
+
| one-way pan, pan with `scrollEdge` | left as is (`auto`) |
|
|
214
|
+
| free pan | `pinch-zoom` |
|
|
215
|
+
| pinch | `pan-x pan-y` |
|
|
216
|
+
| pinch together with a free pan | `none` |
|
|
217
|
+
|
|
218
|
+
A one-way pan leaves the browser its own axis too: a toast dragged away
|
|
219
|
+
from its edge scrolls the page. It claims its direction by cancelling
|
|
220
|
+
`touchmove` when it begins.
|
|
221
|
+
|
|
222
|
+
`pinch-zoom` stays in the value unless a pinch recognizer is
|
|
223
|
+
attached, so the page stays zoomable (WCAG 1.4.4). A long press also turns
|
|
224
|
+
off the iOS callout and text selection on its element.
|
|
225
|
+
|
|
226
|
+
- **Claiming.** When a recognizer recognizes, it owns its touches. Each
|
|
227
|
+
element with a recognizer that can claim a moving touch (a pan, a swipe, a
|
|
228
|
+
long press that then drags, a pinch) has a non-passive
|
|
229
|
+
`touchmove` listener that cancels the event only while one of its touches
|
|
230
|
+
is owned. A touch nobody owns scrolls exactly as it would without the
|
|
231
|
+
system. Taps claim only at the lift, so an element with only taps, or only
|
|
232
|
+
a press consumer, gets no such listener (see the known limit below).
|
|
233
|
+
- **Claim at the begin.** A pan claims its touch only as it begins, at
|
|
234
|
+
UIKit's 10 pt (`spec:AST-094` FR19), before WebKit commits a slow drag to
|
|
235
|
+
a scroll at 10–11 px; a drag the browser took first stays the browser's
|
|
236
|
+
(FR14).
|
|
237
|
+
- **The browser's claim.** `pointercancel` on a finger, or a scroll above
|
|
238
|
+
the touch, means the browser took the finger; so does its first `touchmove`
|
|
239
|
+
that can no longer be cancelled, when the browser could pan along the
|
|
240
|
+
finger's main axis. (Chromium also stops asking after one unconsumed
|
|
241
|
+
`touchmove` when `touch-action` keeps it from panning that way, as for a
|
|
242
|
+
horizontal drag under `pan-y`; that is not a claim.) Possible recognizers that share it fail, active ones are
|
|
243
|
+
cancelled, and the view's press is cancelled.
|
|
244
|
+
- **Clicks.** When a touch's gesture cancelled the view's touches, its
|
|
245
|
+
`touchend` is cancelled (no click and no compatibility mouse events) and a
|
|
246
|
+
one-shot guard swallows the next trusted click. A click held back for a
|
|
247
|
+
recognizer that may still recognize (a double tap between taps) is
|
|
248
|
+
swallowed at once and replayed on the original target if the recognizer
|
|
249
|
+
fails. Clicks with `detail === 0` (keyboard, assistive technology, code)
|
|
250
|
+
always pass.
|
|
251
|
+
- **Context menus.** A `contextmenu` while a recognizer owns a touch is
|
|
252
|
+
cancelled, so a long press never also opens the browser's menu.
|
|
253
|
+
- **Focus.** Losing window focus or hiding the page cancels every touch in
|
|
254
|
+
flight, as UIKit does when the app resigns active.
|
|
255
|
+
|
|
256
|
+
### Native scrolling
|
|
257
|
+
|
|
258
|
+
`scrollEdge` makes a pan share its axis with the native scrollers under the
|
|
259
|
+
finger. This is the sheet over its own list: the pan begins only if nothing
|
|
260
|
+
under the touch could scroll for that movement, the finger landed at the
|
|
261
|
+
edge and pulls away from it. The browser has not committed yet, so beginning
|
|
262
|
+
claims the touch and the content never moves.
|
|
263
|
+
|
|
264
|
+
Who gets a drag is decided once, when it begins, as in UIKit: a drag that
|
|
265
|
+
began as a scroll stays the scroll view's for its whole length (it scrolls
|
|
266
|
+
to the top, then rubber-bands), and never changes hands midway
|
|
267
|
+
(`spec:AST-094` FR14).
|
|
268
|
+
|
|
269
|
+
"Could scroll" follows the browser's own rules: `touch-action` between the
|
|
270
|
+
touch and each scroller, scroll chaining stopped by `overscroll-behavior`,
|
|
271
|
+
and RTL `scrollLeft` ranges.
|
|
272
|
+
|
|
273
|
+
### Multiple fingers
|
|
274
|
+
|
|
275
|
+
A second finger never breaks a one-finger pan that is already moving: the
|
|
276
|
+
pan ignores it, and the claim keeps the browser from zooming with it. A
|
|
277
|
+
second finger that lands before any recognizer has claimed fails the
|
|
278
|
+
one-finger recognizers, so the two fingers zoom the page.
|
|
279
|
+
|
|
280
|
+
## Time
|
|
281
|
+
|
|
282
|
+
Every input carries its own timestamp (`event.timeStamp`), and timers are
|
|
283
|
+
deadlines on that same clock. Before an input is processed, every timer due
|
|
284
|
+
by its timestamp runs first, at its own deadline. A long press therefore
|
|
285
|
+
begins at exactly touch-down + 500 ms even when the main thread was blocked
|
|
286
|
+
and the timer callback ran late. Tests drive the whole system with explicit
|
|
287
|
+
timestamps and no real time.
|
|
288
|
+
|
|
289
|
+
## Velocity
|
|
290
|
+
|
|
291
|
+
`VelocityTracker` reports px per second, UIKit's unit, and is the one
|
|
292
|
+
velocity tracker every continuous recognizer uses
|
|
293
|
+
(`architecture:interaction-modality` INV10, `spec:AST-100` FR1, FR2; no
|
|
294
|
+
alternative estimators). One filter, iOS's measured blend, updated on each
|
|
295
|
+
moved sample (a sample at the newest position is not motion):
|
|
296
|
+
|
|
297
|
+
- A pan's velocity is 0.2 times the newest interval's velocity plus 0.8 times
|
|
298
|
+
the previous interval's (an interval runs from one moved sample to the
|
|
299
|
+
next; the touch-down counts as the first). With one interval so far it is
|
|
300
|
+
that interval, as UIKit reports it. It reproduces every value UIKit
|
|
301
|
+
reported on six recorded touch streams, and like UIKit's it reacts a frame
|
|
302
|
+
late to an acceleration.
|
|
303
|
+
- A scrolling surface's release (paging, a wheel) is 0.25 times the newest
|
|
304
|
+
pan value plus 0.75 times the previous one: a pan's `scrollVelocity()`.
|
|
305
|
+
Everything else reads `velocity()`.
|
|
306
|
+
|
|
307
|
+
A release reads 0 when the finger stayed still for longer than the stillness
|
|
308
|
+
interval (`UIKIT_GESTURES.velocity.stillness`) before lifting, the one
|
|
309
|
+
difference from iOS, whose filter never decays and so flings after a rest;
|
|
310
|
+
and 0 with fewer than two moved samples. The pan passes its lift's event time
|
|
311
|
+
to the tracker.
|
|
312
|
+
|
|
313
|
+
## Haptics
|
|
314
|
+
|
|
315
|
+
`playHaptic(kind)` vibrates where `navigator.vibrate` exists, with one
|
|
316
|
+
pattern per UIKit feedback kind. iOS Safari has no vibration API. It plays a
|
|
317
|
+
light impact only when a real tap toggles an `<input type="checkbox"
|
|
318
|
+
switch>`, and WebKit requires a trusted event for it. `attachTapHaptic(label)`
|
|
319
|
+
puts a hidden switch inside a label the control renders as its tap target,
|
|
320
|
+
so every real tap on it plays that impact. Nothing can play a haptic later
|
|
321
|
+
from script, so mid-drag haptics (detent snaps, picker ticks) are not
|
|
322
|
+
possible in iOS Safari.
|
|
323
|
+
|
|
324
|
+
## Thresholds
|
|
325
|
+
|
|
326
|
+
All numbers live in `../motion/uikit/gestures.ts`. Each one carries either
|
|
327
|
+
its source (Apple documentation, or a measurement: the recognizers' own
|
|
328
|
+
values read in a UIKit app on the iOS 26.2 simulator and confirmed with
|
|
329
|
+
touches, or Mobile Safari measured on the same simulator) or a guess
|
|
330
|
+
together with the measurement that will replace it. A unit test fails if an
|
|
331
|
+
entry has neither.
|
|
332
|
+
|
|
333
|
+
## Touch presentation
|
|
334
|
+
|
|
335
|
+
Whether a component presents itself the touch (UIKit) way is answered once,
|
|
336
|
+
in `../utils/touchPresentation.ts`:
|
|
337
|
+
|
|
338
|
+
- touch behaviours (UIKit springs and timings, the press model's touch
|
|
339
|
+
profiles) key on a coarse PRIMARY pointer (`TOUCH_QUERY`);
|
|
340
|
+
- layout behaviours key on a compact viewport, below the theme's `md`
|
|
341
|
+
width point (`spec:AST-012` FR9): `COMPACT_QUERY` spells the default
|
|
342
|
+
points for a style, and behaviour reads the active theme's definition, so
|
|
343
|
+
a theme that moves `md` moves compact with it;
|
|
344
|
+
- a presentation that needs both, a sheet in place of a popover, asks for
|
|
345
|
+
both (`COMPACT_TOUCH_QUERY`).
|
|
346
|
+
|
|
347
|
+
Styles switch on the same conditions by writing the same query as a StyleX
|
|
348
|
+
media key (`'@media (pointer: coarse)'`, and the compact-touch query spelled
|
|
349
|
+
exactly as `COMPACT_TOUCH_QUERY`, which a test enforces), so the first paint
|
|
350
|
+
is right. Behaviour reads
|
|
351
|
+
`useTouchPresentation()` (SSR-safe), a component with no interaction to
|
|
352
|
+
infer from included (UIKit timings under a finger, its own motion under a
|
|
353
|
+
mouse), and a decision taken once reads `readTouchPresentation()`.
|
|
354
|
+
|
|
355
|
+
## Known limits
|
|
356
|
+
|
|
357
|
+
- **A scroll that begins on a recognizer waits for a busy main thread.** In
|
|
358
|
+
Mobile Safari (iOS 26.2, measured), a vertical scroll that starts on an
|
|
359
|
+
element with a non-passive `touchmove` listener waits until the current
|
|
360
|
+
JavaScript task ends; on a plain row, a pressable row or a tap-only
|
|
361
|
+
element it starts at once (within 50 ms) even during a 500 ms task.
|
|
362
|
+
Chromium documents the same rule for non-passive listeners. The listener
|
|
363
|
+
stays because nothing else keeps UIKit's arbitration: with a passive
|
|
364
|
+
listener, or one added during `touchstart` (which Safari ignores for that
|
|
365
|
+
touch), Safari hands every diagonal drag on a swipe row to the list's
|
|
366
|
+
scroll, 3:1 included. It is never worse than UIKit, where a busy main
|
|
367
|
+
thread stalls every scroll.
|
|
368
|
+
- **Lists where every row has a horizontal recognizer** (swipe actions on
|
|
369
|
+
every row of a mail list): every scroll start waits on the current task in
|
|
370
|
+
Safari. Keep list screens' tasks short. A native horizontal `scroll-snap`
|
|
371
|
+
reveal inside the row would never wait, but it tracks with scroll physics
|
|
372
|
+
rather than UIKit's measured tracking spring; it is a possible opt-in, not
|
|
373
|
+
the default.
|
|
374
|
+
- **Follow-up:** Chromium keeps 3:1 to 1.5:1 drags as swipes even with a
|
|
375
|
+
passive listener (its `touch-action` filter drops a `pan-y` scroll that
|
|
376
|
+
starts sideways), so a passive listener there would cost no parity. It
|
|
377
|
+
waits on a measured run on Android before any engine-specific choice.
|
|
378
|
+
|
|
379
|
+
## Where the web differs from UIKit
|
|
380
|
+
|
|
381
|
+
- Once a recognizer owns a touch, the browser cannot take the scroll back
|
|
382
|
+
later in the same gesture. UIKit does not either: it decides between a
|
|
383
|
+
sheet and its list when the drag begins.
|
|
384
|
+
- In Chromium a finger's first `touchmove` arrives only after about 16 px.
|
|
385
|
+
Movement below that comes from the finger's pointer events, but the
|
|
386
|
+
browser's own decision to scroll happens at that first `touchmove`.
|
|
387
|
+
Mobile Safari delivers `touchmove` from the first pixel.
|
|
388
|
+
- A tap that holds a plain `<button>` for a second or more gets no click in
|
|
389
|
+
Mobile Safari, while UIKit's tap allows 1.5 s. A tap recognizer on the
|
|
390
|
+
element follows UIKit.
|
|
391
|
+
- iOS Safari's own back swipe from the screen edge cannot be cancelled by
|
|
392
|
+
the page. A leading-edge pan works where that swipe has no history to go
|
|
393
|
+
back to.
|
|
394
|
+
- `translation()` is in client CSS px. It is not converted into a rotated or
|
|
395
|
+
scaled ancestor's coordinate space.
|
|
396
|
+
- A replayed click is untrusted. Anything that needs real user activation
|
|
397
|
+
inside the replay window (opening a file picker, for example) should not
|
|
398
|
+
sit under a multi-tap recognizer.
|
|
399
|
+
|
|
400
|
+
## Tests
|
|
401
|
+
|
|
402
|
+
- `__tests__/<Recognizer>.test.ts`: each recognizer's state machine on
|
|
403
|
+
synthetic touches with explicit timestamps.
|
|
404
|
+
- `__tests__/arena*.test.ts`: the conflict matrix, delivery to the view,
|
|
405
|
+
click dispositions, cancellation, and multiple fingers.
|
|
406
|
+
- `__tests__/GestureHost.test.ts`: the DOM integration through real
|
|
407
|
+
listeners in jsdom.
|
|
408
|
+
- `__tests__/VelocityTracker.test.ts`: UIKit's filter against the velocities
|
|
409
|
+
UIKit reported on recorded touch streams, a steady speed and a hard
|
|
410
|
+
acceleration.
|
|
411
|
+
- `__tests__/haptics.test.ts`: vibration patterns and the hidden switch.
|
|
412
|
+
- `__tests__/browser/`: the browser proof on a phone-sized touch screen, in
|
|
413
|
+
Chromium (CDP touches with timestamps) and WebKit (its own touch input),
|
|
414
|
+
with mouse and pen input in a fine-pointer context, run by
|
|
415
|
+
`pnpm test:interaction gestures.interaction.browser.spec.ts` and in CI's
|
|
416
|
+
interaction proofs; where WebKit cannot launch on the host,
|
|
417
|
+
`internal/interaction-harness/scripts/webkit-container.mjs` runs its
|
|
418
|
+
project in the official Playwright image. The same fixture passed in
|
|
419
|
+
Mobile Safari on the iOS 26.2 simulator: claims, click suppression, the
|
|
420
|
+
scroll edge, pinch, and a long press at exactly 500 ms.
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file ScreenEdgePanGestureRecognizer.ts
|
|
5
|
+
* @input Touches from a GestureArena; the viewport size and writing
|
|
6
|
+
* direction from its environment
|
|
7
|
+
* @output Exports ScreenEdgePanGestureRecognizer
|
|
8
|
+
* (UIScreenEdgePanGestureRecognizer), its options and edge type
|
|
9
|
+
* @position Continuous recognizer of packages/core/src/gestures, a pan that
|
|
10
|
+
* only starts from a band at the edge of the viewport
|
|
11
|
+
*
|
|
12
|
+
* A touch that lands outside every requested band fails at once, so a
|
|
13
|
+
* recognizer that requires this one to fail is not held up by a touch in the
|
|
14
|
+
* middle of the screen. Inside a band, the pan begins on movement away from
|
|
15
|
+
* that edge. `leading` and `trailing` resolve against the view's writing
|
|
16
|
+
* direction: under RTL the leading edge is the right one, as the
|
|
17
|
+
* interactive pop gesture's is.
|
|
18
|
+
*
|
|
19
|
+
* Attach it to the edge zone: an element that lies within the band at its
|
|
20
|
+
* edge. There the pan takes the horizontal axis from the browser, which has
|
|
21
|
+
* nothing to scroll in so thin a band, so a touch in the band decides at
|
|
22
|
+
* UIKit's 15 px screen-edge hysteresis. On any other view, whose
|
|
23
|
+
* `touch-action` cannot claim per touch, it leaves the browser every touch
|
|
24
|
+
* behavior, so the author's scrolling there is untouched, and a touch in the
|
|
25
|
+
* band decides at FR19's 10 px like every other claim (spec:AST-094 FR18,
|
|
26
|
+
* DEC-22). The edges' physical sides and the edge zone are measured once,
|
|
27
|
+
* together, and serve both the element's `touch-action` and the touch-down
|
|
28
|
+
* decision; the host reports a layout change (layoutChanged), and a changed
|
|
29
|
+
* answer is announced (onTouchBehaviorChange) so `touch-action` follows it
|
|
30
|
+
* (FR19). The writing direction is read again at each touch-down: a view
|
|
31
|
+
* switched to RTL in place, with no resize, is measured again there and the
|
|
32
|
+
* change announced, so a `leading` back swipe follows the new leading edge
|
|
33
|
+
* (`design:bidirectionality` DR13). That touch landed under the touch-action
|
|
34
|
+
* from before, so it decides at FR19's 10 px unless that one claimed the
|
|
35
|
+
* axis.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import {UIKIT_PAN, UIKIT_SCREEN_EDGE_PAN} from '../motion/uikit/gestures';
|
|
39
|
+
import {ALL_NATIVE_TOUCH, type NativeTouchBehavior} from './GestureRecognizer';
|
|
40
|
+
import {
|
|
41
|
+
PanGestureRecognizer,
|
|
42
|
+
type PanGestureRecognizerOptions,
|
|
43
|
+
} from './PanGestureRecognizer';
|
|
44
|
+
import type {GestureEventContext, GestureTouch} from './types';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* How far past `edgeRegion` a view still counts as the edge zone, px: layout
|
|
48
|
+
* snaps sizes to 1/64 px, so a strip authored at the region measures a hair
|
|
49
|
+
* wider; half a pixel takes that and nothing a pixel wider.
|
|
50
|
+
*/
|
|
51
|
+
const EDGE_ZONE_TOLERANCE = 0.5;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* An edge by writing direction: under RTL the leading edge is the right one.
|
|
55
|
+
* Top and bottom edges land with their first user.
|
|
56
|
+
*/
|
|
57
|
+
export type ScreenEdge = 'leading' | 'trailing';
|
|
58
|
+
|
|
59
|
+
/** A physical horizontal edge of the viewport. */
|
|
60
|
+
type PhysicalEdge = 'left' | 'right';
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* What the pan measures of its view, once until a layout change: the
|
|
64
|
+
* writing direction it read, the physical sides its edges resolve to under
|
|
65
|
+
* that direction, and the sides whose band the view lies within.
|
|
66
|
+
*/
|
|
67
|
+
interface EdgeLayout {
|
|
68
|
+
readonly isRtl: boolean;
|
|
69
|
+
readonly watched: ReadonlyArray<PhysicalEdge>;
|
|
70
|
+
readonly zone: ReadonlySet<PhysicalEdge>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A screen-edge pan is a finger's: it takes no `allowedPointerTypes`
|
|
75
|
+
* (`spec:AST-094` FR43).
|
|
76
|
+
*/
|
|
77
|
+
export interface ScreenEdgePanGestureRecognizerOptions extends Omit<
|
|
78
|
+
PanGestureRecognizerOptions,
|
|
79
|
+
'direction' | 'allowedPointerTypes'
|
|
80
|
+
> {
|
|
81
|
+
/** The edges a touch may start from. @default ['leading'] */
|
|
82
|
+
edges?: ReadonlyArray<ScreenEdge>;
|
|
83
|
+
/** Width of the band at each edge, px. */
|
|
84
|
+
edgeRegion?: number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export class ScreenEdgePanGestureRecognizer extends PanGestureRecognizer {
|
|
88
|
+
override get kind(): PanGestureRecognizer['kind'] {
|
|
89
|
+
return 'screenEdgePan';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
edges: ReadonlyArray<ScreenEdge>;
|
|
93
|
+
edgeRegion: number;
|
|
94
|
+
/** The physical edge the current gesture started from. */
|
|
95
|
+
activeEdge: PhysicalEdge | null = null;
|
|
96
|
+
/**
|
|
97
|
+
* @internal Set by the host while attached: called when the edge-zone
|
|
98
|
+
* answer changes, so the element's `touch-action` follows it
|
|
99
|
+
* (spec:AST-094 FR19, DEC-22).
|
|
100
|
+
*/
|
|
101
|
+
onTouchBehaviorChange: (() => void) | null = null;
|
|
102
|
+
/** The hysteresis where the pan takes its axis (UIKit's 15 px). */
|
|
103
|
+
private readonly edgeHysteresis: number;
|
|
104
|
+
/** What the pan measured of its view (see EdgeLayout), until a layout change. */
|
|
105
|
+
private layout: EdgeLayout | null = null;
|
|
106
|
+
|
|
107
|
+
constructor(options: ScreenEdgePanGestureRecognizerOptions = {}) {
|
|
108
|
+
super({
|
|
109
|
+
maximumNumberOfTouches: 1,
|
|
110
|
+
hysteresis: UIKIT_SCREEN_EDGE_PAN.hysteresis.value,
|
|
111
|
+
...options,
|
|
112
|
+
// A finger's only: under a mouse, a trackpad or a pen the screen-edge
|
|
113
|
+
// pan stays off (`spec:AST-094` FR43), whatever a caller passes.
|
|
114
|
+
allowedPointerTypes: ['touch'],
|
|
115
|
+
});
|
|
116
|
+
this.edges = options.edges ?? ['leading'];
|
|
117
|
+
this.edgeRegion =
|
|
118
|
+
options.edgeRegion ?? UIKIT_SCREEN_EDGE_PAN.edgeRegion.value;
|
|
119
|
+
this.edgeHysteresis = this.hysteresis;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* The pan takes the horizontal axis only in its edge zone, a view within
|
|
124
|
+
* the band of an edge it watches; elsewhere it leaves the browser every
|
|
125
|
+
* touch behavior, so the author's scrolling is untouched (spec:AST-094
|
|
126
|
+
* FR18), never claiming across a whole wider element.
|
|
127
|
+
*/
|
|
128
|
+
override get nativeTouchBehavior(): NativeTouchBehavior {
|
|
129
|
+
const {watched, zone} = this.measured();
|
|
130
|
+
if (!watched.some(edge => zone.has(edge))) {
|
|
131
|
+
return ALL_NATIVE_TOUCH;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
panX: false,
|
|
135
|
+
panY: true,
|
|
136
|
+
pinchZoom: true,
|
|
137
|
+
doubleTapZoom: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* @internal Whether the edge zone depends on the viewport's width: the pan
|
|
143
|
+
* watches the right side, whose band moves with the viewport, so the host
|
|
144
|
+
* reports a viewport resize to it as well as its own box's (FR19, FR24).
|
|
145
|
+
*/
|
|
146
|
+
get watchesViewport(): boolean {
|
|
147
|
+
return this.measured().watched.includes('right');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @internal The view's box may have changed (a resize): its edges' sides
|
|
152
|
+
* and the edge zone are measured again, and a changed answer calls
|
|
153
|
+
* onTouchBehaviorChange.
|
|
154
|
+
*/
|
|
155
|
+
layoutChanged(): void {
|
|
156
|
+
const before = this.layout;
|
|
157
|
+
this.layout = null;
|
|
158
|
+
const after = this.measured();
|
|
159
|
+
if (
|
|
160
|
+
before == null ||
|
|
161
|
+
before.watched.join() !== after.watched.join() ||
|
|
162
|
+
before.zone.size !== after.zone.size ||
|
|
163
|
+
[...after.zone].some(edge => !before.zone.has(edge))
|
|
164
|
+
) {
|
|
165
|
+
this.onTouchBehaviorChange?.();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
protected override touchesBegan(
|
|
170
|
+
touches: ReadonlyArray<GestureTouch>,
|
|
171
|
+
event: GestureEventContext,
|
|
172
|
+
): void {
|
|
173
|
+
if (this.numberOfTouches === touches.length) {
|
|
174
|
+
// The touch-action the browser applies to this touch was derived from
|
|
175
|
+
// the layout in force as it landed: whether that claimed the axis.
|
|
176
|
+
const inForce = this.measured();
|
|
177
|
+
const claimedAxis = inForce.watched.some(side => inForce.zone.has(side));
|
|
178
|
+
// A direction switched in place (no resize) moves the leading edge:
|
|
179
|
+
// measure again, and announce it so touch-action follows for the next
|
|
180
|
+
// touch (DR13).
|
|
181
|
+
if (inForce.isRtl !== this.environment.isRtl(this.view)) {
|
|
182
|
+
this.layoutChanged();
|
|
183
|
+
}
|
|
184
|
+
const edge = this.edgeAt(touches[0]);
|
|
185
|
+
if (edge == null) {
|
|
186
|
+
this.setState('failed');
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
this.activeEdge = edge;
|
|
190
|
+
// On an element within the band, which takes the axis across the edge,
|
|
191
|
+
// a touch decides at UIKit's 15 px; on any other, which leaves the
|
|
192
|
+
// browser that axis, at FR19's 10 px, before the browser commits to a
|
|
193
|
+
// scroll (spec:AST-094 FR18, DEC-22). The answer is the one this
|
|
194
|
+
// touch's touch-action was derived from: a touch that measured again
|
|
195
|
+
// decides at 10 px unless the layout in force claimed the axis.
|
|
196
|
+
const offZone = !claimedAxis || !this.measured().zone.has(edge);
|
|
197
|
+
this.hysteresis = offZone
|
|
198
|
+
? Math.min(this.edgeHysteresis, UIKIT_PAN.hysteresis.value)
|
|
199
|
+
: this.edgeHysteresis;
|
|
200
|
+
this.direction = edge === 'left' ? 'right' : 'left';
|
|
201
|
+
}
|
|
202
|
+
super.touchesBegan(touches, event);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* The physical sides the pan's edges resolve to under the view's writing
|
|
207
|
+
* direction, and the sides whose band the view lies within, measured
|
|
208
|
+
* together once until a layout change: the view starts at that side and
|
|
209
|
+
* reaches no farther than `edgeRegion` from it, within layout's rounding
|
|
210
|
+
* (a strip authored at the 40.2 px region lays out at 40.203 px, on
|
|
211
|
+
* 1/64 px). A view that cannot be measured lies within none.
|
|
212
|
+
*/
|
|
213
|
+
private measured(): EdgeLayout {
|
|
214
|
+
if (this.layout != null) {
|
|
215
|
+
return this.layout;
|
|
216
|
+
}
|
|
217
|
+
const isRtl = this.environment.isRtl(this.view);
|
|
218
|
+
const watched = this.edges.map(edge =>
|
|
219
|
+
(edge === 'leading') !== isRtl ? 'left' : 'right',
|
|
220
|
+
);
|
|
221
|
+
const zone = new Set<PhysicalEdge>();
|
|
222
|
+
const rect = this.environment.viewRect?.(this.view);
|
|
223
|
+
if (rect != null && rect.width > 0) {
|
|
224
|
+
const {width} = this.environment.viewportSize();
|
|
225
|
+
const right = rect.left + rect.width;
|
|
226
|
+
const band = this.edgeRegion + EDGE_ZONE_TOLERANCE;
|
|
227
|
+
if (rect.left >= -EDGE_ZONE_TOLERANCE && right <= band) {
|
|
228
|
+
zone.add('left');
|
|
229
|
+
}
|
|
230
|
+
if (rect.left >= width - band && right <= width + EDGE_ZONE_TOLERANCE) {
|
|
231
|
+
zone.add('right');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
this.layout = {isRtl, watched, zone};
|
|
235
|
+
return this.layout;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
protected override reset(): void {
|
|
239
|
+
super.reset();
|
|
240
|
+
this.activeEdge = null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private edgeAt(touch: GestureTouch): PhysicalEdge | null {
|
|
244
|
+
const {width} = this.environment.viewportSize();
|
|
245
|
+
for (const physical of this.measured().watched) {
|
|
246
|
+
const inBand =
|
|
247
|
+
physical === 'left'
|
|
248
|
+
? touch.startX <= this.edgeRegion
|
|
249
|
+
: touch.startX >= width - this.edgeRegion;
|
|
250
|
+
if (inBand) {
|
|
251
|
+
return physical;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
}
|