@astryxdesign/core 0.7.5 → 0.7.6-canary.5cd7a15
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/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/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 +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/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 +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/NumberInput/numberParser.d.ts +3 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -1
- package/dist/NumberInput/numberParser.js +7 -44
- 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/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 +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 +15 -1
- package/dist/gestures/GestureArena.d.ts +6 -0
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +39 -0
- package/dist/gestures/GestureHost.d.ts +352 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +10 -0
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +16 -0
- 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/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/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/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/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/primaryClick.d.ts +11 -0
- package/dist/utils/primaryClick.d.ts.map +1 -0
- package/dist/utils/primaryClick.js +25 -0
- 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.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/dist/utils/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/locales/en.json +15 -3
- 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/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/__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/ComplexSelector/ComplexSelector.test.tsx +37 -0
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +76 -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/__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.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.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.spec.md +205 -0
- 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/NumberInput/numberParser.ts +7 -45
- 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/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
- 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 +58 -4
- 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/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 +45 -48
- 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 +14 -20
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +719 -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/GestureArena.ts +35 -0
- package/src/gestures/GestureHost.ts +2065 -0
- package/src/gestures/GestureRecognizer.ts +18 -0
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -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 +2087 -0
- 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__/arena.test.ts +5 -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 +21 -2
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/haptics.ts +203 -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/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/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/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- 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 +5 -3
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file nativeScroll.ts
|
|
5
|
+
* @input An element a touch landed on
|
|
6
|
+
* @output Exports createNativeScrollProbe (the NativeScrollProbe a host gives
|
|
7
|
+
* each touch) and parseTouchAction
|
|
8
|
+
* @position DOM half of the scroll coordination in packages/core/src/gestures
|
|
9
|
+
*
|
|
10
|
+
* Answers one question for a recognizer without letting it touch the DOM:
|
|
11
|
+
* would the browser scroll something if this finger moved that way?
|
|
12
|
+
*
|
|
13
|
+
* The browser scrolls the innermost scroller that has room, then chains
|
|
14
|
+
* outward, so the answer is "yes" while ANY scroller under the touch can
|
|
15
|
+
* still move in that direction, with three narrowings that match the
|
|
16
|
+
* browser's own:
|
|
17
|
+
*
|
|
18
|
+
* - `touch-action` between the touch target and a scroller must allow the
|
|
19
|
+
* axis, or the browser will not pan that scroller with a finger;
|
|
20
|
+
* - an `overscroll-behavior` other than `auto` on the axis stops the chain at
|
|
21
|
+
* that scroller (a sheet body with `contain` never scrolls the page);
|
|
22
|
+
* - a finger moving down scrolls content toward its START (scrollTop
|
|
23
|
+
* decreasing), and horizontally the range follows the writing direction
|
|
24
|
+
* (RTL `scrollLeft` runs from minus the overflow to zero).
|
|
25
|
+
*
|
|
26
|
+
* Styles are read once per touch, on the first question; scroll offsets are
|
|
27
|
+
* read fresh on every question, since a native scroll moves them.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/** Which pans a `touch-action` value lets the browser perform. */
|
|
31
|
+
export function parseTouchAction(value) {
|
|
32
|
+
const tokens = value.trim().split(/\s+/);
|
|
33
|
+
if (tokens.includes('auto') || tokens.includes('manipulation')) {
|
|
34
|
+
return {
|
|
35
|
+
x: true,
|
|
36
|
+
y: true
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (tokens.includes('none')) {
|
|
40
|
+
return {
|
|
41
|
+
x: false,
|
|
42
|
+
y: false
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
x: tokens.some(token => token === 'pan-x' || token === 'pan-left' || token === 'pan-right'),
|
|
47
|
+
y: tokens.some(token => token === 'pan-y' || token === 'pan-up' || token === 'pan-down')
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const SCROLLABLE = new Set(['auto', 'scroll', 'overlay']);
|
|
51
|
+
const EDGE_TOLERANCE = 1;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The node's parent in the flat tree: a slotted node's slot, then out of
|
|
55
|
+
* shadow roots to their hosts, so a scroller inside a shadow tree around the
|
|
56
|
+
* slot is found.
|
|
57
|
+
*/
|
|
58
|
+
export function parentAcrossShadow(node) {
|
|
59
|
+
const slot = node instanceof Element || node instanceof Text ? node.assignedSlot : null;
|
|
60
|
+
if (slot != null) {
|
|
61
|
+
return slot;
|
|
62
|
+
}
|
|
63
|
+
if (node.parentNode != null) {
|
|
64
|
+
return node.parentNode instanceof ShadowRoot ? node.parentNode.host : node.parentNode;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function buildChain(target) {
|
|
69
|
+
const doc = target.ownerDocument;
|
|
70
|
+
const view = doc.defaultView;
|
|
71
|
+
if (view == null) {
|
|
72
|
+
return {
|
|
73
|
+
entries: [],
|
|
74
|
+
allowsPan: false
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const root = doc.scrollingElement ?? doc.documentElement;
|
|
78
|
+
const chain = [];
|
|
79
|
+
let allowX = true;
|
|
80
|
+
let allowY = true;
|
|
81
|
+
let reachedRoot = false;
|
|
82
|
+
let isBeyondFixed = false;
|
|
83
|
+
for (let node = target; node != null; node = parentAcrossShadow(node)) {
|
|
84
|
+
if (!(node instanceof Element)) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const style = view.getComputedStyle(node);
|
|
88
|
+
const pans = parseTouchAction(style.touchAction || 'auto');
|
|
89
|
+
allowX &&= pans.x;
|
|
90
|
+
allowY &&= pans.y;
|
|
91
|
+
const isRoot = node === root || node === doc.documentElement;
|
|
92
|
+
if (isRoot) {
|
|
93
|
+
reachedRoot = true;
|
|
94
|
+
}
|
|
95
|
+
const overflowX = isRoot ? rootOverflow(doc, 'x') : style.overflowX;
|
|
96
|
+
const overflowY = isRoot ? rootOverflow(doc, 'y') : style.overflowY;
|
|
97
|
+
const scrollsX = SCROLLABLE.has(overflowX);
|
|
98
|
+
const scrollsY = SCROLLABLE.has(overflowY);
|
|
99
|
+
if (scrollsX || scrollsY) {
|
|
100
|
+
const element = isRoot ? root : node;
|
|
101
|
+
const [behaviorX, behaviorY] = overscrollBehavior(style);
|
|
102
|
+
chain.push({
|
|
103
|
+
element,
|
|
104
|
+
x: scrollsX && allowX,
|
|
105
|
+
y: scrollsY && allowY,
|
|
106
|
+
isRtl: style.direction === 'rtl',
|
|
107
|
+
stopsX: behaviorX !== 'auto',
|
|
108
|
+
stopsY: behaviorY !== 'auto',
|
|
109
|
+
isBeyondFixed
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (isRoot) {
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (style.position === 'fixed') {
|
|
116
|
+
isBeyondFixed = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (!reachedRoot && root instanceof Element) {
|
|
120
|
+
chain.push({
|
|
121
|
+
element: root,
|
|
122
|
+
x: allowX && SCROLLABLE.has(rootOverflow(doc, 'x')),
|
|
123
|
+
y: allowY && SCROLLABLE.has(rootOverflow(doc, 'y')),
|
|
124
|
+
isRtl: false,
|
|
125
|
+
stopsX: false,
|
|
126
|
+
stopsY: false,
|
|
127
|
+
isBeyondFixed
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
entries: chain,
|
|
132
|
+
allowsPan: allowX || allowY
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** `overscroll-behavior` per axis, from the longhands or the shorthand. */
|
|
137
|
+
function overscrollBehavior(style) {
|
|
138
|
+
const x = style.overscrollBehaviorX;
|
|
139
|
+
const y = style.overscrollBehaviorY;
|
|
140
|
+
if (x !== '' && y !== '' && x != null && y != null) {
|
|
141
|
+
return [x, y];
|
|
142
|
+
}
|
|
143
|
+
const [first = 'auto', second = first] = (style.getPropertyValue('overscroll-behavior') || 'auto').trim().split(/\s+/);
|
|
144
|
+
return [x || first, y || second];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* The viewport scrolls unless the root or the body clips it (a scroll lock
|
|
149
|
+
* sets `overflow: hidden` on one of them).
|
|
150
|
+
*/
|
|
151
|
+
function rootOverflow(doc, axis) {
|
|
152
|
+
const view = doc.defaultView;
|
|
153
|
+
if (view == null) {
|
|
154
|
+
return 'hidden';
|
|
155
|
+
}
|
|
156
|
+
for (const element of [doc.documentElement, doc.body]) {
|
|
157
|
+
if (element == null) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const style = view.getComputedStyle(element);
|
|
161
|
+
const value = axis === 'x' ? style.overflowX : style.overflowY;
|
|
162
|
+
if (value === 'hidden' || value === 'clip') {
|
|
163
|
+
return 'hidden';
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return 'auto';
|
|
167
|
+
}
|
|
168
|
+
function canMoveY(element, dy) {
|
|
169
|
+
if (element.scrollHeight - element.clientHeight <= EDGE_TOLERANCE) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
return dy > 0 ? element.scrollTop > EDGE_TOLERANCE - 0.5 : element.scrollTop < element.scrollHeight - element.clientHeight - EDGE_TOLERANCE + 0.5;
|
|
173
|
+
}
|
|
174
|
+
function canMoveX(entry, dx) {
|
|
175
|
+
const {
|
|
176
|
+
element
|
|
177
|
+
} = entry;
|
|
178
|
+
const overflow = element.scrollWidth - element.clientWidth;
|
|
179
|
+
if (overflow <= EDGE_TOLERANCE) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
const min = entry.isRtl ? -overflow : 0;
|
|
183
|
+
const max = entry.isRtl ? 0 : overflow;
|
|
184
|
+
// A finger moving right drags the content right: scrollLeft decreases.
|
|
185
|
+
return dx > 0 ? element.scrollLeft > min + EDGE_TOLERANCE - 0.5 : element.scrollLeft < max - EDGE_TOLERANCE + 0.5;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** A probe of the native scrollers under `target`. */
|
|
189
|
+
export function createNativeScrollProbe(target) {
|
|
190
|
+
let chain = null;
|
|
191
|
+
const getChain = () => {
|
|
192
|
+
chain ??= target instanceof Element ? buildChain(target) : {
|
|
193
|
+
entries: [],
|
|
194
|
+
allowsPan: false
|
|
195
|
+
};
|
|
196
|
+
return chain.entries;
|
|
197
|
+
};
|
|
198
|
+
return {
|
|
199
|
+
canScroll(dx, dy) {
|
|
200
|
+
const ax = Math.abs(dx);
|
|
201
|
+
const ay = Math.abs(dy);
|
|
202
|
+
// The minor axis of a mostly-straight drag is the hand's wobble, not
|
|
203
|
+
// a direction: the browser locks to the major one.
|
|
204
|
+
const considerX = ax > 0 && ax >= ay / 2;
|
|
205
|
+
const considerY = ay > 0 && ay >= ax / 2;
|
|
206
|
+
for (const entry of getChain()) {
|
|
207
|
+
if (considerY && entry.y && canMoveY(entry.element, dy)) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
if (considerX && entry.x && canMoveX(entry, dx)) {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
const stops = (!considerX || entry.stopsX) && (!considerY || entry.stopsY);
|
|
214
|
+
if (stops && (entry.stopsX || entry.stopsY)) {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
},
|
|
220
|
+
get allowsNativePan() {
|
|
221
|
+
getChain();
|
|
222
|
+
return chain?.allowsPan === true;
|
|
223
|
+
},
|
|
224
|
+
get isInsideScroller() {
|
|
225
|
+
return getChain().some(entry => !entry.isBeyondFixed && (entry.y && entry.element.scrollHeight - entry.element.clientHeight > EDGE_TOLERANCE || entry.x && entry.element.scrollWidth - entry.element.clientWidth > EDGE_TOLERANCE));
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file touchAction.ts
|
|
3
|
+
* @input The recognizers attached to one element
|
|
4
|
+
* @output Exports deriveTouchAction (the element's `touch-action`),
|
|
5
|
+
* gestureHostStyle (the inline style a host sets for its recognizers),
|
|
6
|
+
* intersectTouchAction (what both a derived and a caller's value allow) and
|
|
7
|
+
* holdSelectionStyle (the selection and callout lock for one held press)
|
|
8
|
+
* @position Browser negotiation of packages/core/src/gestures, pure so a
|
|
9
|
+
* server render can emit the same style the client would set
|
|
10
|
+
*
|
|
11
|
+
* `touch-action` is decided when the finger lands and cannot change during
|
|
12
|
+
* the gesture, so it must say up front what the browser may still do: the
|
|
13
|
+
* intersection of what every recognizer on the element leaves it.
|
|
14
|
+
*
|
|
15
|
+
* - A tap or long press only removes double-tap zoom (`manipulation`): no
|
|
16
|
+
* 300 ms click delay, scrolling and pinch-zoom untouched.
|
|
17
|
+
* - A one-axis pan or swipe gives the browser the other axis.
|
|
18
|
+
* - A pan that coordinates with native scrolling (`scrollEdge`) keeps both
|
|
19
|
+
* axes: who gets the drag is decided once, when it begins, and a drag the
|
|
20
|
+
* browser began scrolling stays the browser's to the lift (`spec:AST-094`
|
|
21
|
+
* FR14).
|
|
22
|
+
* - `pinch-zoom` stays in every value unless a pinch recognizer is attached,
|
|
23
|
+
* so the page stays zoomable (WCAG 1.4.4).
|
|
24
|
+
*
|
|
25
|
+
* WebKit pans a drag with any vertical component even under `pan-y`, so the
|
|
26
|
+
* value alone does not protect a horizontal pan there: the host also cancels
|
|
27
|
+
* `touchmove` while a recognizer owns the touch (see GestureHost.ts).
|
|
28
|
+
*/
|
|
29
|
+
import type { GestureRecognizer, NativeTouchBehavior } from './GestureRecognizer.js';
|
|
30
|
+
/** The intersection of what each touch recognizer leaves the browser. */
|
|
31
|
+
export declare function combinedNativeBehavior(recognizers: ReadonlyArray<GestureRecognizer>): NativeTouchBehavior;
|
|
32
|
+
/** The `touch-action` value for a set of recognizers, or null for none needed. */
|
|
33
|
+
export declare function deriveTouchAction(recognizers: ReadonlyArray<GestureRecognizer>): string | null;
|
|
34
|
+
export interface GestureHostStyle {
|
|
35
|
+
touchAction?: string;
|
|
36
|
+
WebkitTouchCallout?: string;
|
|
37
|
+
WebkitUserSelect?: string;
|
|
38
|
+
userSelect?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The style a host sets for these recognizers while they are attached: the
|
|
42
|
+
* `touch-action`. Text selection is not locked here: a mouse, a keyboard and
|
|
43
|
+
* assistive technology keep selecting as they do today (spec:AST-017 FR59,
|
|
44
|
+
* spec:AST-094 FR41).
|
|
45
|
+
*/
|
|
46
|
+
export declare function gestureHostStyle(recognizers: ReadonlyArray<GestureRecognizer>): GestureHostStyle;
|
|
47
|
+
/**
|
|
48
|
+
* The `touch-action` that allows only what both values allow: the host's
|
|
49
|
+
* derived value never overrides a caller's narrower one.
|
|
50
|
+
*/
|
|
51
|
+
export declare function intersectTouchAction(derived: string, caller: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* The lock a host applies for one press only, from touch-down to the lift or
|
|
54
|
+
* a cancel, on an element whose hold does something (a long press): no iOS
|
|
55
|
+
* callout and no text-selection start under the held finger, as a
|
|
56
|
+
* long-pressed row in UIKit selects no text (spec:AST-094 FR41). Null where
|
|
57
|
+
* the hold does nothing, so a long press there selects natively.
|
|
58
|
+
*/
|
|
59
|
+
export declare function holdSelectionStyle(recognizers: ReadonlyArray<GestureRecognizer>): GestureHostStyle | null;
|
|
60
|
+
//# sourceMappingURL=touchAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchAction.d.ts","sourceRoot":"","sources":["../../src/gestures/touchAction.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAE,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAEhF,yEAAyE;AACzE,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,GAC5C,mBAAmB,CAgBrB;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,GAC5C,MAAM,GAAG,IAAI,CAwBf;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,GAC5C,gBAAgB,CAOlB;AAqCD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAyB5E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,GAC5C,gBAAgB,GAAG,IAAI,CAQzB"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file touchAction.ts
|
|
5
|
+
* @input The recognizers attached to one element
|
|
6
|
+
* @output Exports deriveTouchAction (the element's `touch-action`),
|
|
7
|
+
* gestureHostStyle (the inline style a host sets for its recognizers),
|
|
8
|
+
* intersectTouchAction (what both a derived and a caller's value allow) and
|
|
9
|
+
* holdSelectionStyle (the selection and callout lock for one held press)
|
|
10
|
+
* @position Browser negotiation of packages/core/src/gestures, pure so a
|
|
11
|
+
* server render can emit the same style the client would set
|
|
12
|
+
*
|
|
13
|
+
* `touch-action` is decided when the finger lands and cannot change during
|
|
14
|
+
* the gesture, so it must say up front what the browser may still do: the
|
|
15
|
+
* intersection of what every recognizer on the element leaves it.
|
|
16
|
+
*
|
|
17
|
+
* - A tap or long press only removes double-tap zoom (`manipulation`): no
|
|
18
|
+
* 300 ms click delay, scrolling and pinch-zoom untouched.
|
|
19
|
+
* - A one-axis pan or swipe gives the browser the other axis.
|
|
20
|
+
* - A pan that coordinates with native scrolling (`scrollEdge`) keeps both
|
|
21
|
+
* axes: who gets the drag is decided once, when it begins, and a drag the
|
|
22
|
+
* browser began scrolling stays the browser's to the lift (`spec:AST-094`
|
|
23
|
+
* FR14).
|
|
24
|
+
* - `pinch-zoom` stays in every value unless a pinch recognizer is attached,
|
|
25
|
+
* so the page stays zoomable (WCAG 1.4.4).
|
|
26
|
+
*
|
|
27
|
+
* WebKit pans a drag with any vertical component even under `pan-y`, so the
|
|
28
|
+
* value alone does not protect a horizontal pan there: the host also cancels
|
|
29
|
+
* `touchmove` while a recognizer owns the touch (see GestureHost.ts).
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** The intersection of what each touch recognizer leaves the browser. */
|
|
33
|
+
export function combinedNativeBehavior(recognizers) {
|
|
34
|
+
let panX = true;
|
|
35
|
+
let panY = true;
|
|
36
|
+
let pinchZoom = true;
|
|
37
|
+
let doubleTapZoom = true;
|
|
38
|
+
for (const recognizer of recognizers) {
|
|
39
|
+
if (!recognizer.acceptsTouchInput) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const behavior = recognizer.nativeTouchBehavior;
|
|
43
|
+
panX &&= behavior.panX;
|
|
44
|
+
panY &&= behavior.panY;
|
|
45
|
+
pinchZoom &&= behavior.pinchZoom;
|
|
46
|
+
doubleTapZoom &&= behavior.doubleTapZoom;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
panX,
|
|
50
|
+
panY,
|
|
51
|
+
pinchZoom,
|
|
52
|
+
doubleTapZoom
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The `touch-action` value for a set of recognizers, or null for none needed. */
|
|
57
|
+
export function deriveTouchAction(recognizers) {
|
|
58
|
+
const behavior = combinedNativeBehavior(recognizers);
|
|
59
|
+
if (behavior.panX && behavior.panY && behavior.pinchZoom && behavior.doubleTapZoom) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (behavior.panX && behavior.panY && behavior.pinchZoom) {
|
|
63
|
+
return 'manipulation';
|
|
64
|
+
}
|
|
65
|
+
const tokens = [];
|
|
66
|
+
if (behavior.panX) {
|
|
67
|
+
tokens.push('pan-x');
|
|
68
|
+
}
|
|
69
|
+
if (behavior.panY) {
|
|
70
|
+
tokens.push('pan-y');
|
|
71
|
+
}
|
|
72
|
+
if (behavior.pinchZoom) {
|
|
73
|
+
tokens.push('pinch-zoom');
|
|
74
|
+
}
|
|
75
|
+
return tokens.length === 0 ? 'none' : tokens.join(' ');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The style a host sets for these recognizers while they are attached: the
|
|
79
|
+
* `touch-action`. Text selection is not locked here: a mouse, a keyboard and
|
|
80
|
+
* assistive technology keep selecting as they do today (spec:AST-017 FR59,
|
|
81
|
+
* spec:AST-094 FR41).
|
|
82
|
+
*/
|
|
83
|
+
export function gestureHostStyle(recognizers) {
|
|
84
|
+
const style = {};
|
|
85
|
+
const touchAction = deriveTouchAction(recognizers);
|
|
86
|
+
if (touchAction != null) {
|
|
87
|
+
style.touchAction = touchAction;
|
|
88
|
+
}
|
|
89
|
+
return style;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** What a `touch-action` value lets the browser do, as tokens. */
|
|
93
|
+
const ALL_PANS = ['pan-left', 'pan-right', 'pan-up', 'pan-down', 'pinch-zoom'];
|
|
94
|
+
function touchActionTokens(value) {
|
|
95
|
+
const parts = value.trim().split(/\s+/).filter(part => part !== '');
|
|
96
|
+
const tokens = new Set();
|
|
97
|
+
if (parts.length === 0) {
|
|
98
|
+
parts.push('auto');
|
|
99
|
+
}
|
|
100
|
+
for (const part of parts) {
|
|
101
|
+
if (part === 'auto') {
|
|
102
|
+
ALL_PANS.forEach(token => tokens.add(token));
|
|
103
|
+
tokens.add('double-tap-zoom');
|
|
104
|
+
} else if (part === 'manipulation') {
|
|
105
|
+
ALL_PANS.forEach(token => tokens.add(token));
|
|
106
|
+
} else if (part === 'pan-x') {
|
|
107
|
+
tokens.add('pan-left').add('pan-right');
|
|
108
|
+
} else if (part === 'pan-y') {
|
|
109
|
+
tokens.add('pan-up').add('pan-down');
|
|
110
|
+
} else if (ALL_PANS.includes(part)) {
|
|
111
|
+
tokens.add(part);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return tokens;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* The `touch-action` that allows only what both values allow: the host's
|
|
119
|
+
* derived value never overrides a caller's narrower one.
|
|
120
|
+
*/
|
|
121
|
+
export function intersectTouchAction(derived, caller) {
|
|
122
|
+
const own = touchActionTokens(caller);
|
|
123
|
+
const both = new Set([...touchActionTokens(derived)].filter(token => own.has(token)));
|
|
124
|
+
if (ALL_PANS.every(token => both.has(token))) {
|
|
125
|
+
return both.has('double-tap-zoom') ? 'auto' : 'manipulation';
|
|
126
|
+
}
|
|
127
|
+
const parts = [];
|
|
128
|
+
for (const [axis, start, end] of [['pan-x', 'pan-left', 'pan-right'], ['pan-y', 'pan-up', 'pan-down']]) {
|
|
129
|
+
if (both.has(start) && both.has(end)) {
|
|
130
|
+
parts.push(axis);
|
|
131
|
+
} else if (both.has(start)) {
|
|
132
|
+
parts.push(start);
|
|
133
|
+
} else if (both.has(end)) {
|
|
134
|
+
parts.push(end);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (both.has('pinch-zoom')) {
|
|
138
|
+
parts.push('pinch-zoom');
|
|
139
|
+
}
|
|
140
|
+
return parts.length === 0 ? 'none' : parts.join(' ');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The lock a host applies for one press only, from touch-down to the lift or
|
|
145
|
+
* a cancel, on an element whose hold does something (a long press): no iOS
|
|
146
|
+
* callout and no text-selection start under the held finger, as a
|
|
147
|
+
* long-pressed row in UIKit selects no text (spec:AST-094 FR41). Null where
|
|
148
|
+
* the hold does nothing, so a long press there selects natively.
|
|
149
|
+
*/
|
|
150
|
+
export function holdSelectionStyle(recognizers) {
|
|
151
|
+
const holds = recognizers.some(recognizer => recognizer.kind === 'longPress' && recognizer.acceptsTouchInput);
|
|
152
|
+
return holds ? {
|
|
153
|
+
WebkitTouchCallout: 'none',
|
|
154
|
+
WebkitUserSelect: 'none',
|
|
155
|
+
userSelect: 'none'
|
|
156
|
+
} : null;
|
|
157
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file touchActionRule.ts
|
|
3
|
+
* @input An element and the touch-action its recognizers derive
|
|
4
|
+
* @output Exports markTouchAction and unmarkTouchAction: the element carries
|
|
5
|
+
* the derived value in TOUCH_ACTION_ATTRIBUTE, and its document or shadow
|
|
6
|
+
* root holds one zero-specificity rule per value in the first cascade
|
|
7
|
+
* layer (`reset`), so any author rule, in any layer or none, or inline
|
|
8
|
+
* value outranks the host's (`spec:AST-094` FR18, DEC-8); a root's rules
|
|
9
|
+
* go with its last marked element (FR24)
|
|
10
|
+
* @position The gesture host's touch-action writer (GestureHost.ts)
|
|
11
|
+
*
|
|
12
|
+
* The mark is set as a recognizer attaches, so a subtree that mounts with
|
|
13
|
+
* it is styled once with its touch-action: a value written after that first
|
|
14
|
+
* styling restyles every descendant (each one's effective touch-action
|
|
15
|
+
* changes). Until the host reads the element's own value, the value in
|
|
16
|
+
* force is the author's where the author sets one, and the derived value
|
|
17
|
+
* elsewhere: never wider than the author's.
|
|
18
|
+
*
|
|
19
|
+
* SYNC: When modified, update GestureHost.ts.
|
|
20
|
+
*/
|
|
21
|
+
/** The attribute that carries the host's derived touch-action. */
|
|
22
|
+
export declare const TOUCH_ACTION_ATTRIBUTE = "data-astryx-touch-action";
|
|
23
|
+
/**
|
|
24
|
+
* Give `element` the derived touch-action under a rule any author rule
|
|
25
|
+
* outranks. Returns false where no rule can hold it (a detached element):
|
|
26
|
+
* the caller writes nothing until the element is in a document.
|
|
27
|
+
*/
|
|
28
|
+
export declare function markTouchAction(element: Element, value: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Remove the host's mark; the element's own touch-action stands. The last
|
|
31
|
+
* mark in a document or shadow root takes its rules with it.
|
|
32
|
+
*/
|
|
33
|
+
export declare function unmarkTouchAction(element: Element): void;
|
|
34
|
+
//# sourceMappingURL=touchActionRule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchActionRule.d.ts","sourceRoot":"","sources":["../../src/gestures/touchActionRule.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AA2EjE;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAyBxE;AAeD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQxD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file touchActionRule.ts
|
|
5
|
+
* @input An element and the touch-action its recognizers derive
|
|
6
|
+
* @output Exports markTouchAction and unmarkTouchAction: the element carries
|
|
7
|
+
* the derived value in TOUCH_ACTION_ATTRIBUTE, and its document or shadow
|
|
8
|
+
* root holds one zero-specificity rule per value in the first cascade
|
|
9
|
+
* layer (`reset`), so any author rule, in any layer or none, or inline
|
|
10
|
+
* value outranks the host's (`spec:AST-094` FR18, DEC-8); a root's rules
|
|
11
|
+
* go with its last marked element (FR24)
|
|
12
|
+
* @position The gesture host's touch-action writer (GestureHost.ts)
|
|
13
|
+
*
|
|
14
|
+
* The mark is set as a recognizer attaches, so a subtree that mounts with
|
|
15
|
+
* it is styled once with its touch-action: a value written after that first
|
|
16
|
+
* styling restyles every descendant (each one's effective touch-action
|
|
17
|
+
* changes). Until the host reads the element's own value, the value in
|
|
18
|
+
* force is the author's where the author sets one, and the derived value
|
|
19
|
+
* elsewhere: never wider than the author's.
|
|
20
|
+
*
|
|
21
|
+
* SYNC: When modified, update GestureHost.ts.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** The attribute that carries the host's derived touch-action. */
|
|
25
|
+
export const TOUCH_ACTION_ATTRIBUTE = 'data-astryx-touch-action';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The cascade layer the rules sit in: the first in the order every package
|
|
29
|
+
* stylesheet declares (`spec:AST-080` FR3), so an author rule in any later
|
|
30
|
+
* layer, or in none, outranks them. Unlayered, they would outrank every
|
|
31
|
+
* layered author rule.
|
|
32
|
+
*/
|
|
33
|
+
const RULE_LAYER = 'reset';
|
|
34
|
+
/**
|
|
35
|
+
* Per document or shadow root: the values it has a rule for, their rules'
|
|
36
|
+
* text, where that text goes (an adopted sheet, or a style element where
|
|
37
|
+
* constructable sheets are missing), and the elements marked there. The
|
|
38
|
+
* rules go with the root's last marked element (`spec:AST-094` FR24).
|
|
39
|
+
*/
|
|
40
|
+
const sheets = new WeakMap();
|
|
41
|
+
|
|
42
|
+
/** Where each marked element's rule lives, for its unmark after it leaves. */
|
|
43
|
+
const markedRoots = new WeakMap();
|
|
44
|
+
function sheetOf(root) {
|
|
45
|
+
let entry = sheets.get(root);
|
|
46
|
+
if (entry == null) {
|
|
47
|
+
const doc = root.nodeType === 9 ? root : root.ownerDocument;
|
|
48
|
+
let write;
|
|
49
|
+
let remove;
|
|
50
|
+
// A constructable sheet where the engine has one; a style element only
|
|
51
|
+
// where it has none, so any other error from a sheet is not hidden.
|
|
52
|
+
const Sheet = doc?.defaultView?.CSSStyleSheet;
|
|
53
|
+
if (typeof Sheet === 'function' && 'replaceSync' in Sheet.prototype && 'adoptedStyleSheets' in root) {
|
|
54
|
+
const sheet = new Sheet();
|
|
55
|
+
root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
|
|
56
|
+
write = css => sheet.replaceSync(css);
|
|
57
|
+
remove = () => {
|
|
58
|
+
root.adoptedStyleSheets = root.adoptedStyleSheets.filter(adopted => adopted !== sheet);
|
|
59
|
+
};
|
|
60
|
+
} else {
|
|
61
|
+
const style = doc?.createElement('style');
|
|
62
|
+
const parent = root.nodeType === 9 ? doc?.head ?? doc?.documentElement : root;
|
|
63
|
+
if (style != null && parent != null) {
|
|
64
|
+
parent.append(style);
|
|
65
|
+
write = css => {
|
|
66
|
+
style.textContent = css;
|
|
67
|
+
};
|
|
68
|
+
remove = () => style.remove();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (write == null || remove == null) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
entry = {
|
|
75
|
+
values: new Set(),
|
|
76
|
+
marked: new Set(),
|
|
77
|
+
css: '',
|
|
78
|
+
write,
|
|
79
|
+
remove
|
|
80
|
+
};
|
|
81
|
+
sheets.set(root, entry);
|
|
82
|
+
}
|
|
83
|
+
return entry;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Give `element` the derived touch-action under a rule any author rule
|
|
88
|
+
* outranks. Returns false where no rule can hold it (a detached element):
|
|
89
|
+
* the caller writes nothing until the element is in a document.
|
|
90
|
+
*/
|
|
91
|
+
export function markTouchAction(element, value) {
|
|
92
|
+
const root = element.getRootNode();
|
|
93
|
+
const entry = element.isConnected && (root.nodeType === 9 || 'host' in root) ? sheetOf(root) : null;
|
|
94
|
+
if (entry == null) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
if (!entry.values.has(value)) {
|
|
98
|
+
entry.values.add(value);
|
|
99
|
+
entry.css += `:where([${TOUCH_ACTION_ATTRIBUTE}="${value}"]){touch-action:${value}}`;
|
|
100
|
+
entry.write(`@layer ${RULE_LAYER}{${entry.css}}`);
|
|
101
|
+
}
|
|
102
|
+
if (element.getAttribute(TOUCH_ACTION_ATTRIBUTE) !== value) {
|
|
103
|
+
element.setAttribute(TOUCH_ACTION_ATTRIBUTE, value);
|
|
104
|
+
}
|
|
105
|
+
const previous = markedRoots.get(element);
|
|
106
|
+
if (previous != null && previous !== root) {
|
|
107
|
+
// Moved to another root: the old one lets it go.
|
|
108
|
+
releaseMark(element, previous);
|
|
109
|
+
}
|
|
110
|
+
entry.marked.add(element);
|
|
111
|
+
markedRoots.set(element, root);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** `root` no longer holds `element`'s mark; its last mark takes the rules. */
|
|
116
|
+
function releaseMark(element, root) {
|
|
117
|
+
const entry = sheets.get(root);
|
|
118
|
+
if (entry == null) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
entry.marked.delete(element);
|
|
122
|
+
if (entry.marked.size === 0) {
|
|
123
|
+
entry.remove();
|
|
124
|
+
sheets.delete(root);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Remove the host's mark; the element's own touch-action stands. The last
|
|
130
|
+
* mark in a document or shadow root takes its rules with it.
|
|
131
|
+
*/
|
|
132
|
+
export function unmarkTouchAction(element) {
|
|
133
|
+
element.removeAttribute(TOUCH_ACTION_ATTRIBUTE);
|
|
134
|
+
const root = markedRoots.get(element);
|
|
135
|
+
if (root == null) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
markedRoots.delete(element);
|
|
139
|
+
releaseMark(element, root);
|
|
140
|
+
}
|
package/dist/gestures/types.d.ts
CHANGED
|
@@ -37,13 +37,6 @@ export interface NativeScrollProbe {
|
|
|
37
37
|
* lets the browser pan that axis).
|
|
38
38
|
*/
|
|
39
39
|
canScroll(dx: number, dy: number): boolean;
|
|
40
|
-
/**
|
|
41
|
-
* How much further (px) the scroller that would move for a finger moving
|
|
42
|
-
* by (dx, dy) can scroll before it reaches its edge; 0 when none would.
|
|
43
|
-
* Lets a reader place the point where the content runs out between two
|
|
44
|
-
* samples instead of at the next one.
|
|
45
|
-
*/
|
|
46
|
-
distanceToEdge?(dx: number, dy: number): number;
|
|
47
40
|
/** Whether any element under the touch can scroll natively at all. */
|
|
48
41
|
readonly isInsideScroller: boolean;
|
|
49
42
|
/**
|
|
@@ -116,6 +109,17 @@ export interface GestureEnvironment {
|
|
|
116
109
|
readonly height: number;
|
|
117
110
|
};
|
|
118
111
|
isRtl(view: unknown): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* The box of a recognizer's view in viewport coordinates, or null when it
|
|
114
|
+
* has none to measure. A screen-edge pan reads it to tell a view within
|
|
115
|
+
* its edge band from any other.
|
|
116
|
+
*/
|
|
117
|
+
viewRect?(view: unknown): {
|
|
118
|
+
readonly left: number;
|
|
119
|
+
readonly top: number;
|
|
120
|
+
readonly width: number;
|
|
121
|
+
readonly height: number;
|
|
122
|
+
} | null;
|
|
119
123
|
}
|
|
120
124
|
export declare const DEFAULT_ENVIRONMENT: GestureEnvironment;
|
|
121
125
|
/**
|
|
@@ -135,5 +139,12 @@ export interface TouchConsumer {
|
|
|
135
139
|
* (attached above this consumer) from beginning for a touch on it.
|
|
136
140
|
*/
|
|
137
141
|
allowsAncestorRecognizer?(recognizer: unknown): boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Whether the consumer takes touches now (a disabled control does not).
|
|
144
|
+
* The host listens only while something enabled is attached
|
|
145
|
+
* (`spec:AST-094` FR24); after this changes, call `host.update(element)`.
|
|
146
|
+
* @default true
|
|
147
|
+
*/
|
|
148
|
+
isEnabled?(): boolean;
|
|
138
149
|
}
|
|
139
150
|
//# sourceMappingURL=types.d.ts.map
|