@astryxdesign/core 0.7.5 → 0.7.6-canary.00507ba
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/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 +7 -3
- 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.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/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 +93 -59
- 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/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/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/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/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/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/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 +21 -4
- 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/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/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +6 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +6 -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.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/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.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 +27 -3
- package/locales/pseudo.json +18 -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/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/ChatComposerTokenElement.spec.md +45 -33
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- 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 +10 -3
- 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.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/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 +348 -1
- package/src/Layer/useLayer.tsx +118 -71
- 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/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/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/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/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/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/Typeahead/Typeahead.test.tsx +40 -0
- package/src/Typeahead/Typeahead.tsx +12 -1
- package/src/__tests__/pressState.ts +8 -4
- 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/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/generated-locales/en.generated.ts +7 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +7 -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/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/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/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 +5 -3
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import * as stylex from '@stylexjs/stylex';
|
|
15
|
+
import {TEMPO_RANGE, expandThemeMotion} from '../theme/themeMotion';
|
|
16
|
+
import {readFileSync} from 'node:fs';
|
|
17
|
+
import {dirname, join} from 'node:path';
|
|
18
|
+
import {fileURLToPath} from 'node:url';
|
|
15
19
|
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
|
16
20
|
import {
|
|
17
21
|
durationToMs,
|
|
@@ -317,6 +321,122 @@ describe('the release', () => {
|
|
|
317
321
|
expect(rows[0].hasAttribute(PRESSED_ATTRIBUTE)).toBe(false);
|
|
318
322
|
});
|
|
319
323
|
|
|
324
|
+
it('scales the fade by the tempo its stylesheet reads, a theme\u2019s or an adaptation rule\u2019s (spec:AST-108 FR4, component:Button FR15)', () => {
|
|
325
|
+
// A rule writes the tempo (a media-query adaptation, say); browsers
|
|
326
|
+
// inherit it from the theme, jsdom only reads it where it is declared.
|
|
327
|
+
const style = document.createElement('style');
|
|
328
|
+
style.textContent = '.slow-row { --_astryx-motion-tempo: 1.5; }';
|
|
329
|
+
document.head.appendChild(style);
|
|
330
|
+
rows[0].classList.add('slow-row');
|
|
331
|
+
try {
|
|
332
|
+
press(rows[0], 'pointerdown', 10, 10);
|
|
333
|
+
vi.advanceTimersByTime(PRESS_ONSET_MS);
|
|
334
|
+
press(rows[0], 'pointerup', 10, 10);
|
|
335
|
+
vi.advanceTimersByTime(PRESS_FADE_MS);
|
|
336
|
+
expect(rows[0].getAttribute(PRESSED_ATTRIBUTE)).toBe('fading');
|
|
337
|
+
vi.advanceTimersByTime(PRESS_FADE_MS / 2);
|
|
338
|
+
expect(rows[0].hasAttribute(PRESSED_ATTRIBUTE)).toBe(false);
|
|
339
|
+
} finally {
|
|
340
|
+
style.remove();
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it('under Reduce Motion a tempo may shorten the fade but never lengthens it past 200 ms (spec:AST-108 FR4)', () => {
|
|
345
|
+
vi.stubGlobal(
|
|
346
|
+
'matchMedia',
|
|
347
|
+
(query: string): MediaQueryList =>
|
|
348
|
+
({
|
|
349
|
+
matches: /prefers-reduced-motion:\s*reduce/.test(query),
|
|
350
|
+
media: query,
|
|
351
|
+
onchange: null,
|
|
352
|
+
addListener: () => undefined,
|
|
353
|
+
removeListener: () => undefined,
|
|
354
|
+
addEventListener: () => undefined,
|
|
355
|
+
removeEventListener: () => undefined,
|
|
356
|
+
dispatchEvent: () => false,
|
|
357
|
+
}) as MediaQueryList,
|
|
358
|
+
);
|
|
359
|
+
const style = document.createElement('style');
|
|
360
|
+
style.textContent =
|
|
361
|
+
'.slow-row { --_astryx-motion-tempo: 1.5; } .quick-row { --_astryx-motion-tempo: 0.75; }';
|
|
362
|
+
document.head.appendChild(style);
|
|
363
|
+
try {
|
|
364
|
+
rows[0].classList.add('slow-row');
|
|
365
|
+
press(rows[0], 'pointerdown', 10, 10);
|
|
366
|
+
vi.advanceTimersByTime(PRESS_ONSET_MS);
|
|
367
|
+
press(rows[0], 'pointerup', 10, 10);
|
|
368
|
+
vi.advanceTimersByTime(PRESS_FADE_MS);
|
|
369
|
+
expect(rows[0].hasAttribute(PRESSED_ATTRIBUTE)).toBe(false);
|
|
370
|
+
rows[0].classList.replace('slow-row', 'quick-row');
|
|
371
|
+
press(rows[0], 'pointerdown', 10, 10);
|
|
372
|
+
vi.advanceTimersByTime(PRESS_ONSET_MS);
|
|
373
|
+
press(rows[0], 'pointerup', 10, 10);
|
|
374
|
+
vi.advanceTimersByTime(PRESS_FADE_MS * 0.75);
|
|
375
|
+
expect(rows[0].hasAttribute(PRESSED_ATTRIBUTE)).toBe(false);
|
|
376
|
+
} finally {
|
|
377
|
+
rows[0].classList.remove('slow-row', 'quick-row');
|
|
378
|
+
style.remove();
|
|
379
|
+
vi.unstubAllGlobals();
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it('bounds the release’s tempo at its own maximum, so the bound changes nothing', () => {
|
|
384
|
+
// The clock's 1.5 is TEMPO_RANGE.max, and every tempo a theme writes is
|
|
385
|
+
// clamped to it: a theme asking for 3 writes 1.5.
|
|
386
|
+
const source = readFileSync(
|
|
387
|
+
join(
|
|
388
|
+
dirname(fileURLToPath(import.meta.url)),
|
|
389
|
+
'interactionOverlay.stylex.ts',
|
|
390
|
+
),
|
|
391
|
+
'utf8',
|
|
392
|
+
);
|
|
393
|
+
expect(source).toContain(
|
|
394
|
+
`min(var(--_astryx-motion-tempo, 1), ${TEMPO_RANGE.max})`,
|
|
395
|
+
);
|
|
396
|
+
expect(expandThemeMotion({tempo: 3})['--_astryx-motion-tempo']).toBe(
|
|
397
|
+
String(TEMPO_RANGE.max),
|
|
398
|
+
);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
it('caps the stylesheet’s release fade under Reduce Motion', () => {
|
|
402
|
+
const source = readFileSync(
|
|
403
|
+
join(
|
|
404
|
+
dirname(fileURLToPath(import.meta.url)),
|
|
405
|
+
'interactionOverlay.stylex.ts',
|
|
406
|
+
),
|
|
407
|
+
'utf8',
|
|
408
|
+
);
|
|
409
|
+
expect(source).toMatch(
|
|
410
|
+
/min\(\$\{pressConsts\.releaseMs\}ms, calc\(\$\{pressConsts\.releaseMs\}ms \* var\(--_astryx-motion-tempo, 1\)\)\)/,
|
|
411
|
+
);
|
|
412
|
+
expect(source).toMatch(
|
|
413
|
+
/'@media \(prefers-reduced-motion: reduce\)': PRESS_RELEASE_DURATION_REDUCED/,
|
|
414
|
+
);
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
it('keeps the 200 ms fade without a tempo', () => {
|
|
418
|
+
press(rows[0], 'pointerdown', 10, 10);
|
|
419
|
+
vi.advanceTimersByTime(PRESS_ONSET_MS);
|
|
420
|
+
press(rows[0], 'pointerup', 10, 10);
|
|
421
|
+
vi.advanceTimersByTime(PRESS_FADE_MS);
|
|
422
|
+
expect(rows[0].hasAttribute(PRESSED_ATTRIBUTE)).toBe(false);
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
it('times the stylesheet’s release fade by the same tempo', () => {
|
|
426
|
+
// The animation the attribute drives, scaled by the custom property a
|
|
427
|
+
// theme with a tempo writes beside its duration tokens.
|
|
428
|
+
const source = readFileSync(
|
|
429
|
+
join(
|
|
430
|
+
dirname(fileURLToPath(import.meta.url)),
|
|
431
|
+
'interactionOverlay.stylex.ts',
|
|
432
|
+
),
|
|
433
|
+
'utf8',
|
|
434
|
+
);
|
|
435
|
+
expect(source).toMatch(
|
|
436
|
+
/calc\(\$\{pressConsts\.releaseMs\}ms \* min\(var\(--_astryx-motion-tempo, 1\),/,
|
|
437
|
+
);
|
|
438
|
+
});
|
|
439
|
+
|
|
320
440
|
it('answers a tap too quick for the delay, at the release', () => {
|
|
321
441
|
press(rows[0], 'pointerdown', 10, 10);
|
|
322
442
|
vi.advanceTimersByTime(20);
|
|
@@ -418,6 +538,24 @@ describe('a phone or tablet paints a mouse or Space press itself', () => {
|
|
|
418
538
|
expect(rows[1].hasAttribute(PRESSED_ATTRIBUTE)).toBe(false);
|
|
419
539
|
});
|
|
420
540
|
|
|
541
|
+
it('fades a mouse press by the theme\u2019s tempo too (spec:AST-108 FR4, component:Button FR15)', () => {
|
|
542
|
+
const style = document.createElement('style');
|
|
543
|
+
style.textContent = '.slow-row { --_astryx-motion-tempo: 1.5; }';
|
|
544
|
+
document.head.appendChild(style);
|
|
545
|
+
rows[1].classList.add('slow-row');
|
|
546
|
+
try {
|
|
547
|
+
press(rows[1], 'pointerdown', 10, 100, 'mouse');
|
|
548
|
+
press(rows[1], 'pointerup', 10, 100, 'mouse');
|
|
549
|
+
vi.advanceTimersByTime(PRESS_FADE_MS);
|
|
550
|
+
expect(rows[1].getAttribute(PRESSED_ATTRIBUTE)).toBe('fading');
|
|
551
|
+
vi.advanceTimersByTime(PRESS_FADE_MS / 2);
|
|
552
|
+
expect(rows[1].hasAttribute(PRESSED_ATTRIBUTE)).toBe(false);
|
|
553
|
+
} finally {
|
|
554
|
+
rows[1].classList.remove('slow-row');
|
|
555
|
+
style.remove();
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
|
|
421
559
|
it('keeps the paint while the mouse is dragged off the surface, as `:active` does', () => {
|
|
422
560
|
press(rows[1], 'pointerdown', 10, 100, 'mouse');
|
|
423
561
|
press(document.body, 'pointermove', 400, 900, 'mouse');
|
|
@@ -156,6 +156,24 @@ const TIMER_MS: Record<NonNullable<PressStep['timer']>, number> = {
|
|
|
156
156
|
onset: PRESS_ONSET_MS,
|
|
157
157
|
};
|
|
158
158
|
|
|
159
|
+
/**
|
|
160
|
+
* The release fade's clock on `element`, read once, at the release, from the
|
|
161
|
+
* property its stylesheet reads: the theme's `--_astryx-motion-tempo`
|
|
162
|
+
* (`spec:AST-108` FR4, `component:Button` FR15). Under Reduce Motion a tempo
|
|
163
|
+
* may shorten the fade, never lengthen it past 200 ms.
|
|
164
|
+
*/
|
|
165
|
+
function fadeMs(element: Element): number {
|
|
166
|
+
const style = getComputedStyle(element);
|
|
167
|
+
const value = style.getPropertyValue('--_astryx-motion-tempo').trim();
|
|
168
|
+
const read = value === '' ? Number.NaN : Number(value);
|
|
169
|
+
const tempo = Number.isFinite(read) && read > 0 ? read : 1;
|
|
170
|
+
const scaled = PRESS_FADE_MS * tempo;
|
|
171
|
+
const reduced =
|
|
172
|
+
typeof window.matchMedia === 'function' &&
|
|
173
|
+
window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
174
|
+
return reduced ? Math.min(scaled, PRESS_FADE_MS) : scaled;
|
|
175
|
+
}
|
|
176
|
+
|
|
159
177
|
const TIMER_EVENT = {
|
|
160
178
|
fade: 'fadeEnd',
|
|
161
179
|
flash: 'flashEnd',
|
|
@@ -217,17 +235,22 @@ function apply(slot: Slot, step: PressStep): void {
|
|
|
217
235
|
// A TIMER, never `requestAnimationFrame`: iOS throttles frame callbacks
|
|
218
236
|
// while a scroll runs, so a frame-based delay would fire late, after the
|
|
219
237
|
// scroll, and paint a control nobody is pressing any more.
|
|
220
|
-
live.timer = setTimeout(
|
|
221
|
-
|
|
222
|
-
slot.live
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
238
|
+
live.timer = setTimeout(
|
|
239
|
+
() => {
|
|
240
|
+
if (slot.live != null) {
|
|
241
|
+
slot.live.timer = null;
|
|
242
|
+
}
|
|
243
|
+
apply(
|
|
244
|
+
slot,
|
|
245
|
+
pressGestureStep(slot.live?.gesture ?? idlePressGesture(), {
|
|
246
|
+
kind: TIMER_EVENT[kind],
|
|
247
|
+
}),
|
|
248
|
+
);
|
|
249
|
+
},
|
|
250
|
+
// The release fade follows the theme's tempo (`spec:AST-108` FR4,
|
|
251
|
+
// `component:Button` FR15); the onset delay and the tap flash do not.
|
|
252
|
+
kind === 'fade' ? fadeMs(live.element) : TIMER_MS[kind],
|
|
253
|
+
);
|
|
231
254
|
}
|
|
232
255
|
}
|
|
233
256
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file pressPaintPriority.test.ts
|
|
5
|
+
* @input Uses vitest, Babel with the StyleX plugin (the repository's shared
|
|
6
|
+
* module resolution) and interactionOverlay.stylex.ts
|
|
7
|
+
* @output Checks, in the compiled CSS, that the press paint outranks the
|
|
8
|
+
* coarse-pointer `:active` reset of the overlay
|
|
9
|
+
* @position Regression test for the cascade order of the press overlay
|
|
10
|
+
*
|
|
11
|
+
* WebKit applies `:active` during a touch. Under a coarse pointer the overlay
|
|
12
|
+
* turns the bare `:active` image off, and the press paint
|
|
13
|
+
* (`[data-astryx-press="on"]`) must still win: its rule has to sit in a
|
|
14
|
+
* higher StyleX priority than the reset. The order is a property of how
|
|
15
|
+
* each key is spelled: an imported `defineConsts` key compiles to a higher
|
|
16
|
+
* priority than the same literal, which put the reset above the paint and
|
|
17
|
+
* erased the touch-down frame.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import fs from 'node:fs';
|
|
21
|
+
import {createRequire} from 'node:module';
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
import {describe, expect, it} from 'vitest';
|
|
24
|
+
import stylexResolution from '../../../../scripts/stylex-module-resolution.cjs';
|
|
25
|
+
|
|
26
|
+
type Rule = [string, {ltr: string}, number];
|
|
27
|
+
|
|
28
|
+
// Babel's types are not part of core's typecheck; type the one call used.
|
|
29
|
+
const {transformSync} = createRequire(import.meta.url)('@babel/core') as {
|
|
30
|
+
transformSync: (
|
|
31
|
+
code: string,
|
|
32
|
+
options: Record<string, unknown>,
|
|
33
|
+
) => {metadata?: unknown} | null;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
function compiledRules(file: string): Rule[] {
|
|
37
|
+
const output = transformSync(fs.readFileSync(file, 'utf8'), {
|
|
38
|
+
filename: file,
|
|
39
|
+
babelrc: false,
|
|
40
|
+
configFile: false,
|
|
41
|
+
parserOpts: {plugins: ['typescript', 'jsx']},
|
|
42
|
+
plugins: [
|
|
43
|
+
[
|
|
44
|
+
'@stylexjs/babel-plugin',
|
|
45
|
+
{
|
|
46
|
+
dev: false,
|
|
47
|
+
runtimeInjection: false,
|
|
48
|
+
genConditionalClasses: true,
|
|
49
|
+
treeshakeCompensation: true,
|
|
50
|
+
unstable_moduleResolution: stylexResolution.stylexModuleResolution,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
return (output?.metadata as {stylex?: Rule[]}).stylex ?? [];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
describe('press overlay cascade', () => {
|
|
59
|
+
it('ranks the press paint above the coarse-pointer :active reset', () => {
|
|
60
|
+
const rules = compiledRules(
|
|
61
|
+
path.resolve(__dirname, 'interactionOverlay.stylex.ts'),
|
|
62
|
+
);
|
|
63
|
+
const resets = rules.filter(
|
|
64
|
+
// Matched without its condition's text: an imported key compiles to a
|
|
65
|
+
// placeholder until the bundle step.
|
|
66
|
+
([, {ltr}]) =>
|
|
67
|
+
ltr.includes(':active') && ltr.includes('background-image:none'),
|
|
68
|
+
);
|
|
69
|
+
const paints = rules.filter(
|
|
70
|
+
([, {ltr}]) =>
|
|
71
|
+
ltr.includes('[data-astryx-press="on"]') &&
|
|
72
|
+
ltr.includes('background-image:'),
|
|
73
|
+
);
|
|
74
|
+
expect(resets.length).toBeGreaterThan(0);
|
|
75
|
+
expect(paints.length).toBeGreaterThan(0);
|
|
76
|
+
const highestReset = Math.max(...resets.map(([, , priority]) => priority));
|
|
77
|
+
const lowestPaint = Math.min(...paints.map(([, , priority]) => priority));
|
|
78
|
+
expect(highestReset).toBeLessThan(lowestPaint);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file primaryClick.test.ts
|
|
5
|
+
* @input isPrimaryClick over button presses on Apple and other platforms
|
|
6
|
+
* @output Tests that only the main button, and not a ctrl-click on macOS,
|
|
7
|
+
* is a primary click (spec:AST-094 FR43)
|
|
8
|
+
* @position Unit tests of packages/core/src/utils/primaryClick.ts
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {afterEach, describe, expect, it, vi} from 'vitest';
|
|
12
|
+
import {isPrimaryClick} from './primaryClick';
|
|
13
|
+
|
|
14
|
+
function onPlatform(platform: string) {
|
|
15
|
+
vi.spyOn(navigator, 'platform', 'get').mockReturnValue(platform);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
vi.restoreAllMocks();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('isPrimaryClick (spec:AST-094 FR43)', () => {
|
|
23
|
+
it('takes the main button, and no right click or pen barrel button', () => {
|
|
24
|
+
onPlatform('Win32');
|
|
25
|
+
expect(isPrimaryClick({button: 0, ctrlKey: false})).toBe(true);
|
|
26
|
+
expect(isPrimaryClick({button: 2, ctrlKey: false})).toBe(false);
|
|
27
|
+
expect(isPrimaryClick({button: 1, ctrlKey: false})).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("takes no ctrl-click on macOS, that platform's context click, and a ctrl-click elsewhere", () => {
|
|
31
|
+
onPlatform('MacIntel');
|
|
32
|
+
expect(isPrimaryClick({button: 0, ctrlKey: true})).toBe(false);
|
|
33
|
+
expect(isPrimaryClick({button: 0, ctrlKey: false})).toBe(true);
|
|
34
|
+
vi.restoreAllMocks();
|
|
35
|
+
onPlatform('Win32');
|
|
36
|
+
expect(isPrimaryClick({button: 0, ctrlKey: true})).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file primaryClick.ts
|
|
5
|
+
* @input A mouse or pen button press: its `button` and `ctrlKey`
|
|
6
|
+
* @output Exports isPrimaryClick
|
|
7
|
+
* @position Internal util, the one primary-click rule: the gesture host
|
|
8
|
+
* starts a press only for one, and the press controller paints only one;
|
|
9
|
+
* platform detection is utils/isApplePlatform.ts
|
|
10
|
+
*
|
|
11
|
+
* Deliberately absent from utils/index.ts: packages/core/src/index.ts does
|
|
12
|
+
* `export * from './utils'`, so naming it there would publish it as API.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {isApplePlatform} from './isApplePlatform';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Whether a button press is a primary click: the main button, and not a
|
|
19
|
+
* ctrl-click on macOS or iPadOS, which is that platform's context click
|
|
20
|
+
* (`spec:AST-094` FR43). A right click, a pen's barrel button and a macOS
|
|
21
|
+
* ctrl-click start no press.
|
|
22
|
+
*/
|
|
23
|
+
export function isPrimaryClick(event: {
|
|
24
|
+
readonly button: number;
|
|
25
|
+
readonly ctrlKey: boolean;
|
|
26
|
+
}): boolean {
|
|
27
|
+
return event.button === 0 && !(event.ctrlKey && isApplePlatform());
|
|
28
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
import {describe, it, expect, vi} from 'vitest';
|
|
4
|
-
import {observeContent} from './sharedMutationObserver';
|
|
4
|
+
import {observeContent, observeMutations} from './sharedMutationObserver';
|
|
5
5
|
|
|
6
6
|
const flush = async () => new Promise(resolve => setTimeout(resolve, 0));
|
|
7
7
|
|
|
@@ -51,3 +51,56 @@ describe('observeContent', () => {
|
|
|
51
51
|
unsubscribeLive();
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
|
+
|
|
55
|
+
describe('observeMutations', () => {
|
|
56
|
+
it('shares one observer across registrations with the same options', async () => {
|
|
57
|
+
const Native = globalThis.MutationObserver;
|
|
58
|
+
let constructed = 0;
|
|
59
|
+
vi.stubGlobal(
|
|
60
|
+
'MutationObserver',
|
|
61
|
+
class extends Native {
|
|
62
|
+
constructor(callback: MutationCallback) {
|
|
63
|
+
super(callback);
|
|
64
|
+
constructed += 1;
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
const options = {attributes: true, attributeFilter: ['dir']};
|
|
69
|
+
const first = document.createElement('div');
|
|
70
|
+
const second = document.createElement('div');
|
|
71
|
+
const firstCallback = vi.fn();
|
|
72
|
+
const secondCallback = vi.fn();
|
|
73
|
+
const stops = [
|
|
74
|
+
observeMutations(first, options, firstCallback),
|
|
75
|
+
observeMutations(second, {...options}, secondCallback),
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
first.dir = 'rtl';
|
|
79
|
+
await flush();
|
|
80
|
+
|
|
81
|
+
expect(constructed).toBe(1);
|
|
82
|
+
expect(firstCallback).toHaveBeenCalledTimes(1);
|
|
83
|
+
expect(secondCallback).not.toHaveBeenCalled();
|
|
84
|
+
stops.forEach(stop => stop());
|
|
85
|
+
vi.unstubAllGlobals();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('reports a descendant only to a subtree registration', async () => {
|
|
89
|
+
const outer = document.createElement('div');
|
|
90
|
+
const inner = document.createElement('span');
|
|
91
|
+
outer.append(inner);
|
|
92
|
+
const self = vi.fn();
|
|
93
|
+
const subtree = vi.fn();
|
|
94
|
+
const stops = [
|
|
95
|
+
observeMutations(outer, {attributes: true}, self),
|
|
96
|
+
observeMutations(outer, {attributes: true, subtree: true}, subtree),
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
inner.className = 'changed';
|
|
100
|
+
await flush();
|
|
101
|
+
|
|
102
|
+
expect(self).not.toHaveBeenCalled();
|
|
103
|
+
expect(subtree).toHaveBeenCalledTimes(1);
|
|
104
|
+
stops.forEach(stop => stop());
|
|
105
|
+
});
|
|
106
|
+
});
|
|
@@ -5,58 +5,105 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file sharedMutationObserver.ts
|
|
7
7
|
* @input MutationObserver API
|
|
8
|
-
* @output Exports
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* @output Exports observeMutations (one shared observer per set of options)
|
|
9
|
+
* and observeContent, its text-and-children form
|
|
10
|
+
* @position Internal utility; consumed by useTruncation, hitArea and AppShell's
|
|
11
|
+
* main-overflow observer. The mutation counterpart of sharedResizeObserver:
|
|
12
|
+
* one observer for every element observed with the same options, so a
|
|
13
|
+
* repeated cell, row or region does not create one observer per instance.
|
|
12
14
|
*/
|
|
13
15
|
|
|
14
|
-
type
|
|
16
|
+
type MutationCallback = () => void;
|
|
15
17
|
|
|
16
|
-
const
|
|
18
|
+
const CONTENT_OPTIONS: MutationObserverInit = {
|
|
17
19
|
characterData: true,
|
|
18
20
|
childList: true,
|
|
19
21
|
subtree: true,
|
|
20
22
|
};
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
interface SharedObserver {
|
|
25
|
+
readonly observer: MutationObserver;
|
|
26
|
+
readonly callbacks: Map<Node, Set<MutationCallback>>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* One observer per distinct set of options: an observer holds one set of
|
|
31
|
+
* options per node, so registrations that need different options cannot
|
|
32
|
+
* share one.
|
|
33
|
+
*/
|
|
34
|
+
const observers = new Map<string, SharedObserver>();
|
|
35
|
+
|
|
36
|
+
function optionsKey(options: MutationObserverInit): string {
|
|
37
|
+
return JSON.stringify([
|
|
38
|
+
options.attributes === true,
|
|
39
|
+
options.attributeFilter == null
|
|
40
|
+
? null
|
|
41
|
+
: [...options.attributeFilter].sort(),
|
|
42
|
+
options.characterData === true,
|
|
43
|
+
options.childList === true,
|
|
44
|
+
options.subtree === true,
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
24
47
|
|
|
25
|
-
function
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
48
|
+
function createSharedObserver(options: MutationObserverInit): SharedObserver {
|
|
49
|
+
const callbacks = new Map<Node, Set<MutationCallback>>();
|
|
50
|
+
const isSubtree = options.subtree === true;
|
|
51
|
+
const observer = new MutationObserver(records => {
|
|
52
|
+
// One call per callback per batch, however many records it received.
|
|
53
|
+
// With `subtree`, a record's target can be any descendant, so walk up to
|
|
54
|
+
// the observed roots; without it, the target is the observed node.
|
|
55
|
+
const pending = new Set<MutationCallback>();
|
|
56
|
+
for (const record of records) {
|
|
57
|
+
if (!isSubtree) {
|
|
58
|
+
callbacks
|
|
59
|
+
.get(record.target)
|
|
60
|
+
?.forEach(callback => pending.add(callback));
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
for (
|
|
64
|
+
let node: Node | null = record.target;
|
|
65
|
+
node;
|
|
66
|
+
node = node.parentNode
|
|
67
|
+
) {
|
|
68
|
+
callbacks.get(node)?.forEach(callback => pending.add(callback));
|
|
69
|
+
}
|
|
32
70
|
}
|
|
33
|
-
|
|
34
|
-
|
|
71
|
+
pending.forEach(callback => callback());
|
|
72
|
+
});
|
|
73
|
+
return {observer, callbacks};
|
|
35
74
|
}
|
|
36
75
|
|
|
37
76
|
/**
|
|
38
|
-
* Call `callback`
|
|
39
|
-
*
|
|
77
|
+
* Call `callback` for mutations of `element` matching `options`, through the
|
|
78
|
+
* one observer shared by every registration with the same options. Returns an
|
|
79
|
+
* unsubscribe that removes only this registration.
|
|
40
80
|
*
|
|
41
81
|
* MutationObserver has no per-target unobserve, so a released element stays
|
|
42
|
-
* registered with
|
|
43
|
-
* match no callback and are ignored.
|
|
44
|
-
* when
|
|
82
|
+
* registered with its shared observer until no element remains; its records
|
|
83
|
+
* match no callback and are ignored. An observer disconnects and is released
|
|
84
|
+
* when its last registration goes.
|
|
45
85
|
*/
|
|
46
|
-
export function
|
|
47
|
-
element:
|
|
48
|
-
|
|
86
|
+
export function observeMutations(
|
|
87
|
+
element: Node,
|
|
88
|
+
options: MutationObserverInit,
|
|
89
|
+
callback: MutationCallback,
|
|
49
90
|
): () => void {
|
|
50
91
|
if (typeof MutationObserver === 'undefined') {
|
|
51
92
|
return () => {};
|
|
52
93
|
}
|
|
53
|
-
|
|
94
|
+
const key = optionsKey(options);
|
|
95
|
+
let shared = observers.get(key);
|
|
96
|
+
if (shared == null) {
|
|
97
|
+
shared = createSharedObserver(options);
|
|
98
|
+
observers.set(key, shared);
|
|
99
|
+
}
|
|
100
|
+
const {observer, callbacks} = shared;
|
|
54
101
|
const existing = callbacks.get(element);
|
|
55
102
|
if (existing) {
|
|
56
103
|
existing.add(callback);
|
|
57
104
|
} else {
|
|
58
105
|
callbacks.set(element, new Set([callback]));
|
|
59
|
-
observer.observe(element,
|
|
106
|
+
observer.observe(element, options);
|
|
60
107
|
}
|
|
61
108
|
|
|
62
109
|
let isSubscribed = true;
|
|
@@ -70,9 +117,20 @@ export function observeContent(
|
|
|
70
117
|
if (targetCallbacks?.size === 0) {
|
|
71
118
|
callbacks.delete(element);
|
|
72
119
|
}
|
|
73
|
-
if (callbacks.size === 0 && observer) {
|
|
120
|
+
if (callbacks.size === 0 && observers.get(key)?.observer === observer) {
|
|
74
121
|
observer.disconnect();
|
|
75
|
-
|
|
122
|
+
observers.delete(key);
|
|
76
123
|
}
|
|
77
124
|
};
|
|
78
125
|
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Call `callback` when the element's text or children change (including
|
|
129
|
+
* descendants). Returns an unsubscribe that removes only this registration.
|
|
130
|
+
*/
|
|
131
|
+
export function observeContent(
|
|
132
|
+
element: Element,
|
|
133
|
+
callback: MutationCallback,
|
|
134
|
+
): () => void {
|
|
135
|
+
return observeMutations(element, CONTENT_OPTIONS, callback);
|
|
136
|
+
}
|