@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
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file BadgeLargerText.a11y.chromium.spec.ts
|
|
5
|
+
* @input The `Core/Badge` Larger Text story in a built Storybook, in Chromium
|
|
6
|
+
* at an iPhone's page size (402 x 714), under the neutral theme and under
|
|
7
|
+
* Butter (whose badges set their own height).
|
|
8
|
+
* @output Real-layout proof that a badge with a label is never shorter than one
|
|
9
|
+
* line of it, and that nothing else about its size changes: at the default
|
|
10
|
+
* size its geometry is exactly what it is without that minimum (the theme's
|
|
11
|
+
* height, Butter's own 30px included); when its text grows (here by raising
|
|
12
|
+
* the supporting text size on a wrapper) the pill grows with the label,
|
|
13
|
+
* contains it and shows all
|
|
14
|
+
* of it, with no width floor; a color-only badge keeps its size at every
|
|
15
|
+
* text size; and where there is too little room (a crowded row, a cell
|
|
16
|
+
* narrower than one line) the badge shrinks and stays inside
|
|
17
|
+
* (component:Badge FR3).
|
|
18
|
+
* @position Run with `pnpm test:a11y-contract`. Line boxes and box sizes need
|
|
19
|
+
* a real layout engine; jsdom has neither.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import {expect, test, type Page} from '@playwright/test';
|
|
23
|
+
import {
|
|
24
|
+
DEFAULT_STORYBOOK_DIR,
|
|
25
|
+
serveStorybook,
|
|
26
|
+
type StaticServer,
|
|
27
|
+
} from '@astryxdesign/a11y-spec/storybook';
|
|
28
|
+
|
|
29
|
+
// A phone's page size (an iPhone 17 Pro's): at a desktop width every row fits
|
|
30
|
+
// on one line and a squeezed, truncated label would go unseen.
|
|
31
|
+
test.use({viewport: {width: 402, height: 714}});
|
|
32
|
+
|
|
33
|
+
let storybook: StaticServer;
|
|
34
|
+
test.beforeAll(async () => {
|
|
35
|
+
storybook = await serveStorybook(
|
|
36
|
+
process.env.ASTRYX_STORYBOOK_DIR ?? DEFAULT_STORYBOOK_DIR,
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
test.afterAll(async () => {
|
|
40
|
+
await storybook?.close();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
interface BadgeBox {
|
|
44
|
+
label: string;
|
|
45
|
+
/** The label is cut with an ellipsis: wider than the room it has. */
|
|
46
|
+
truncated: boolean;
|
|
47
|
+
width: number;
|
|
48
|
+
height: number;
|
|
49
|
+
lineHeight: number;
|
|
50
|
+
labelTop: number;
|
|
51
|
+
labelBottom: number;
|
|
52
|
+
top: number;
|
|
53
|
+
bottom: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function badgesIn(page: Page, size: string): Promise<BadgeBox[]> {
|
|
57
|
+
return page.getByTestId(`badge-row-${size}`).evaluate(row =>
|
|
58
|
+
[...row.querySelectorAll<HTMLElement>('.astryx-badge')].map(badge => {
|
|
59
|
+
const box = badge.getBoundingClientRect();
|
|
60
|
+
const label = badge.lastElementChild as HTMLElement;
|
|
61
|
+
const labelBox = label.getBoundingClientRect();
|
|
62
|
+
return {
|
|
63
|
+
label: label.textContent ?? '',
|
|
64
|
+
truncated: label.scrollWidth > label.clientWidth,
|
|
65
|
+
width: box.width,
|
|
66
|
+
height: box.height,
|
|
67
|
+
lineHeight: Number.parseFloat(getComputedStyle(badge).lineHeight),
|
|
68
|
+
labelTop: labelBox.top,
|
|
69
|
+
labelBottom: labelBox.bottom,
|
|
70
|
+
top: box.top,
|
|
71
|
+
bottom: box.bottom,
|
|
72
|
+
};
|
|
73
|
+
}),
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Each badge's size in the row, with and without the minimum this change adds:
|
|
79
|
+
* the "without" pass sets `min-height` back to what it was before (`auto`) on
|
|
80
|
+
* the element itself.
|
|
81
|
+
*/
|
|
82
|
+
async function withAndWithoutMinimums(page: Page, size: string) {
|
|
83
|
+
return page.getByTestId(`badge-row-${size}`).evaluate(row =>
|
|
84
|
+
[...row.querySelectorAll<HTMLElement>('.astryx-badge')].map(badge => {
|
|
85
|
+
const measure = () => {
|
|
86
|
+
const box = badge.getBoundingClientRect();
|
|
87
|
+
return {width: box.width, height: box.height};
|
|
88
|
+
};
|
|
89
|
+
const withMinimums = measure();
|
|
90
|
+
badge.style.minHeight = 'auto';
|
|
91
|
+
const without = measure();
|
|
92
|
+
badge.style.removeProperty('min-height');
|
|
93
|
+
return {label: badge.textContent ?? '', withMinimums, without};
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Each badge's natural width in the row: its content's width plus its own
|
|
100
|
+
* inline padding, measured with no minimum or maximum width and sized to its
|
|
101
|
+
* content (`max-content`). A badge with room is exactly this wide, so a width
|
|
102
|
+
* floor (or a stretch) shows up as a difference.
|
|
103
|
+
*/
|
|
104
|
+
async function naturalWidths(page: Page, size: string): Promise<number[]> {
|
|
105
|
+
return page.getByTestId(`badge-row-${size}`).evaluate(row =>
|
|
106
|
+
[...row.querySelectorAll<HTMLElement>('.astryx-badge')].map(badge => {
|
|
107
|
+
const {style} = badge;
|
|
108
|
+
style.setProperty('width', 'max-content');
|
|
109
|
+
style.setProperty('min-width', '0px');
|
|
110
|
+
style.setProperty('max-width', 'none');
|
|
111
|
+
const width = badge.getBoundingClientRect().width;
|
|
112
|
+
style.removeProperty('width');
|
|
113
|
+
style.removeProperty('min-width');
|
|
114
|
+
style.removeProperty('max-width');
|
|
115
|
+
return width;
|
|
116
|
+
}),
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** The neutral theme's badge height: its `--spacing-5`. */
|
|
121
|
+
async function spacing5(page: Page): Promise<number> {
|
|
122
|
+
return page.evaluate(() => {
|
|
123
|
+
const probe = document.createElement('div');
|
|
124
|
+
probe.style.height = 'var(--spacing-5)';
|
|
125
|
+
document.body.append(probe);
|
|
126
|
+
const height = probe.getBoundingClientRect().height;
|
|
127
|
+
probe.remove();
|
|
128
|
+
return height;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const THEMES = [
|
|
133
|
+
{name: 'neutral', badgeHeight: spacing5},
|
|
134
|
+
// Butter's own badge height (themes/butter/src/butterTheme.ts,
|
|
135
|
+
// `components.badge.base.height`).
|
|
136
|
+
{name: 'butter', badgeHeight: async () => 30},
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
for (const {name, badgeHeight} of THEMES) {
|
|
140
|
+
test.describe(`a badge and its text, ${name} theme`, () => {
|
|
141
|
+
test.beforeEach(async ({page}) => {
|
|
142
|
+
await page.goto(
|
|
143
|
+
`${storybook.origin}/iframe.html?id=core-badge--larger-text&viewMode=story&globals=astryxTheme:${name}`,
|
|
144
|
+
);
|
|
145
|
+
await expect(page.getByTestId('badge-row-default')).toBeVisible();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('keeps its exact geometry and the theme height at the default text size', async ({
|
|
149
|
+
page,
|
|
150
|
+
}) => {
|
|
151
|
+
const height = await badgeHeight(page);
|
|
152
|
+
const natural = await naturalWidths(page, 'default');
|
|
153
|
+
for (const [index, badge] of (
|
|
154
|
+
await withAndWithoutMinimums(page, 'default')
|
|
155
|
+
).entries()) {
|
|
156
|
+
// The new minimum does not bind at the default size …
|
|
157
|
+
expect(badge.withMinimums.width, badge.label).toBeCloseTo(
|
|
158
|
+
badge.without.width,
|
|
159
|
+
2,
|
|
160
|
+
);
|
|
161
|
+
expect(badge.withMinimums.height, badge.label).toBeCloseTo(
|
|
162
|
+
badge.without.height,
|
|
163
|
+
2,
|
|
164
|
+
);
|
|
165
|
+
// … so the badge is as tall as its theme says, and as wide as its
|
|
166
|
+
// content and padding: a color-only badge is its padding alone
|
|
167
|
+
// (component:Badge FR1).
|
|
168
|
+
expect(badge.withMinimums.height, badge.label).toBeCloseTo(height, 1);
|
|
169
|
+
expect(badge.withMinimums.width, badge.label).toBeCloseTo(
|
|
170
|
+
natural[index],
|
|
171
|
+
1,
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
for (const badge of await badgesIn(page, 'default')) {
|
|
175
|
+
expect(badge.truncated, badge.label).toBe(false);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test('stays inside a cell narrower than one line of its text', async ({
|
|
180
|
+
page,
|
|
181
|
+
}) => {
|
|
182
|
+
const boxes = await page.getByTestId('narrow-cell').evaluateAll(cells =>
|
|
183
|
+
cells.map(cell => {
|
|
184
|
+
const badge = cell.querySelector('.astryx-badge');
|
|
185
|
+
const own = cell.getBoundingClientRect();
|
|
186
|
+
const box = badge?.getBoundingClientRect();
|
|
187
|
+
return {
|
|
188
|
+
label: cell.textContent ?? '',
|
|
189
|
+
cell: [own.left, own.right],
|
|
190
|
+
badge: box == null ? null : [box.left, box.right],
|
|
191
|
+
};
|
|
192
|
+
}),
|
|
193
|
+
);
|
|
194
|
+
expect(boxes).toHaveLength(1);
|
|
195
|
+
for (const {label, cell, badge} of boxes) {
|
|
196
|
+
expect(badge, label).not.toBeNull();
|
|
197
|
+
if (badge != null) {
|
|
198
|
+
expect(badge[0], label).toBeGreaterThanOrEqual(cell[0] - 0.5);
|
|
199
|
+
expect(badge[1], label).toBeLessThanOrEqual(cell[1] + 0.5);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('stays inside a crowded row at 2.5rem text', async ({page}) => {
|
|
205
|
+
// A title that cannot shrink leaves the count less room than one line of
|
|
206
|
+
// its text is tall: the badge keeps its own width there, where a
|
|
207
|
+
// one-line minimum width would push it out of the row.
|
|
208
|
+
const box = await page.getByTestId('badge-row-crowded').evaluate(row => {
|
|
209
|
+
const badge = row.querySelector('.astryx-badge');
|
|
210
|
+
const own = row.getBoundingClientRect();
|
|
211
|
+
const rect = badge?.getBoundingClientRect();
|
|
212
|
+
return {
|
|
213
|
+
row: [own.left, own.right],
|
|
214
|
+
badge: rect == null ? null : [rect.left, rect.right],
|
|
215
|
+
};
|
|
216
|
+
});
|
|
217
|
+
expect(box.badge).not.toBeNull();
|
|
218
|
+
if (box.badge != null) {
|
|
219
|
+
expect(box.badge[1]).toBeLessThanOrEqual(box.row[1] + 0.5);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
for (const size of ['1.25rem', '2.5rem']) {
|
|
224
|
+
test(`grows with its label at ${size} text, shows all of it, and has no width floor`, async ({
|
|
225
|
+
page,
|
|
226
|
+
}) => {
|
|
227
|
+
const height = await badgeHeight(page);
|
|
228
|
+
const badges = await badgesIn(page, size);
|
|
229
|
+
const natural = await naturalWidths(page, size);
|
|
230
|
+
expect(natural).toHaveLength(badges.length);
|
|
231
|
+
for (const [index, badge] of badges.entries()) {
|
|
232
|
+
if (badge.label === '') {
|
|
233
|
+
// A color-only badge has no text to hold: it keeps its theme
|
|
234
|
+
// height and its padding-only width (component:Badge FR1).
|
|
235
|
+
expect(badge.height).toBeCloseTo(height, 1);
|
|
236
|
+
expect(badge.width).toBeCloseTo(natural[index], 1);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
// At least one line of its own text tall …
|
|
240
|
+
expect(badge.height, badge.label).toBeGreaterThanOrEqual(
|
|
241
|
+
badge.lineHeight - 0.5,
|
|
242
|
+
);
|
|
243
|
+
// … so the label stays inside the pill …
|
|
244
|
+
expect(badge.labelTop, badge.label).toBeGreaterThanOrEqual(
|
|
245
|
+
badge.top - 0.5,
|
|
246
|
+
);
|
|
247
|
+
expect(badge.labelBottom, badge.label).toBeLessThanOrEqual(
|
|
248
|
+
badge.bottom + 0.5,
|
|
249
|
+
);
|
|
250
|
+
// … whole rather than cut to an ellipsis, in rows that wrap as a
|
|
251
|
+
// layout must at these sizes …
|
|
252
|
+
expect(badge.truncated, badge.label).toBe(false);
|
|
253
|
+
// … and with no width floor: as wide as its own content and padding,
|
|
254
|
+
// a one-character count included.
|
|
255
|
+
expect(badge.width, badge.label).toBeCloseTo(natural[index], 1);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
@@ -1045,6 +1045,52 @@ describe('BottomSheet', () => {
|
|
|
1045
1045
|
});
|
|
1046
1046
|
|
|
1047
1047
|
describe('swipe to dismiss', () => {
|
|
1048
|
+
it("a sheet opened from inside another sheet's content drags to dismiss by its own handle, and the covered host neither drags nor takes the pointer (FR6, FR7)", () => {
|
|
1049
|
+
const onInnerOpenChange = vi.fn();
|
|
1050
|
+
const onOuterOpenChange = vi.fn();
|
|
1051
|
+
render(
|
|
1052
|
+
<BottomSheet isOpen onOpenChange={onOuterOpenChange} label="Outer">
|
|
1053
|
+
Outer content
|
|
1054
|
+
<BottomSheet isOpen onOpenChange={onInnerOpenChange} label="Inner">
|
|
1055
|
+
Inner content
|
|
1056
|
+
</BottomSheet>
|
|
1057
|
+
</BottomSheet>,
|
|
1058
|
+
);
|
|
1059
|
+
const dialogs = screen.getAllByRole('dialog', {hidden: true});
|
|
1060
|
+
expect(dialogs).toHaveLength(2);
|
|
1061
|
+
const [outerDialog, innerDialog] = dialogs;
|
|
1062
|
+
// The inner sheet's dialog is rendered inside the outer sheet's body,
|
|
1063
|
+
// so its events bubble through the outer body's gesture listeners.
|
|
1064
|
+
expect(outerDialog.contains(innerDialog)).toBe(true);
|
|
1065
|
+
const outerPanel = outerDialog.querySelector<HTMLElement>(
|
|
1066
|
+
':scope > .astryx-bottom-sheet',
|
|
1067
|
+
)!;
|
|
1068
|
+
const outerBody = outerPanel.querySelector<HTMLElement>(
|
|
1069
|
+
':scope > :not([aria-hidden])',
|
|
1070
|
+
)!;
|
|
1071
|
+
const innerHandle = innerDialog.querySelector<HTMLElement>(
|
|
1072
|
+
'.astryx-bottom-sheet > [aria-hidden="true"]',
|
|
1073
|
+
)!;
|
|
1074
|
+
// `setPointerCapture` is a prototype stub here, so record who captures.
|
|
1075
|
+
const captured: Element[] = [];
|
|
1076
|
+
const capture = vi
|
|
1077
|
+
.spyOn(Element.prototype, 'setPointerCapture')
|
|
1078
|
+
.mockImplementation(function (this: Element) {
|
|
1079
|
+
captured.push(this);
|
|
1080
|
+
});
|
|
1081
|
+
drag(innerHandle, [{y: 0}, {y: 40}, {y: 120}], 'touch');
|
|
1082
|
+
capture.mockRestore();
|
|
1083
|
+
// The inner sheet's own drag ran to its dismissal.
|
|
1084
|
+
expect(onInnerOpenChange).toHaveBeenCalledWith(false);
|
|
1085
|
+
// The covered host saw the same pointer bubble up and did nothing with
|
|
1086
|
+
// it: no drag of its own (its panel keeps its resting transform) and no
|
|
1087
|
+
// pointer capture, which would have cancelled the inner handle's drag.
|
|
1088
|
+
expect(onOuterOpenChange).not.toHaveBeenCalled();
|
|
1089
|
+
expect(captured).toContain(innerHandle);
|
|
1090
|
+
expect(captured).not.toContain(outerBody);
|
|
1091
|
+
expect(outerPanel.style.transform).toBe('');
|
|
1092
|
+
});
|
|
1093
|
+
|
|
1048
1094
|
it('requests close when dragged past the dismiss threshold', () => {
|
|
1049
1095
|
const onOpenChange = vi.fn();
|
|
1050
1096
|
render(
|
|
@@ -99,7 +99,7 @@ import {
|
|
|
99
99
|
} from '../theme/tokens.stylex';
|
|
100
100
|
import {useDevWarning} from '../hooks/useDevWarning';
|
|
101
101
|
import {useScrollLock} from '../hooks/useScrollLock';
|
|
102
|
-
import {mergeProps} from '../utils';
|
|
102
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
103
103
|
import {LayerDepthProvider} from '../Layer/LayerDepthContext';
|
|
104
104
|
import {ModalAnnounceProvider} from '../hooks/ModalAnnounceProvider';
|
|
105
105
|
import {useModalOutlet} from '../Layer/modalOutlet';
|
|
@@ -48,7 +48,8 @@ import {
|
|
|
48
48
|
sizeVars,
|
|
49
49
|
spacingVars,
|
|
50
50
|
} from '../theme/tokens.stylex';
|
|
51
|
-
import {mergeProps
|
|
51
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
52
|
+
import {themeProps} from '../utils/themeProps';
|
|
52
53
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
53
54
|
import {layerTextReset} from '../Layer/layerTextReset.stylex';
|
|
54
55
|
import {layerStructureReset} from '../Layer/layerStructureReset.stylex';
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
13
13
|
import {act, renderHook} from '@testing-library/react';
|
|
14
14
|
import {
|
|
15
|
+
isInsideNestedLayer,
|
|
15
16
|
useSheetGestures,
|
|
16
17
|
type UseSheetGesturesOptions,
|
|
17
18
|
} from './useSheetGestures';
|
|
@@ -106,6 +107,27 @@ function up(hook: Hook, y: number, t: number, target: HTMLElement) {
|
|
|
106
107
|
);
|
|
107
108
|
}
|
|
108
109
|
|
|
110
|
+
describe('isInsideNestedLayer', () => {
|
|
111
|
+
it("is true for a target inside a <dialog> rendered within the body, and false for the body's own content", () => {
|
|
112
|
+
const body = document.createElement('div');
|
|
113
|
+
const own = document.createElement('button');
|
|
114
|
+
body.append(own);
|
|
115
|
+
const nested = document.createElement('dialog');
|
|
116
|
+
const nestedHandle = document.createElement('div');
|
|
117
|
+
nested.append(nestedHandle);
|
|
118
|
+
body.append(nested);
|
|
119
|
+
expect(isInsideNestedLayer(own, body)).toBe(false);
|
|
120
|
+
expect(isInsideNestedLayer(body, body)).toBe(false);
|
|
121
|
+
expect(isInsideNestedLayer(nestedHandle, body)).toBe(true);
|
|
122
|
+
expect(isInsideNestedLayer(nested, body)).toBe(true);
|
|
123
|
+
// A dialog above the body (the sheet's own) does not count.
|
|
124
|
+
const ownDialog = document.createElement('dialog');
|
|
125
|
+
ownDialog.append(body);
|
|
126
|
+
expect(isInsideNestedLayer(own, body)).toBe(false);
|
|
127
|
+
expect(isInsideNestedLayer(null, body)).toBe(false);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
109
131
|
describe('useSheetGestures', () => {
|
|
110
132
|
it('dismisses on a fast downward flick (swipe-to-close)', () => {
|
|
111
133
|
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
@@ -1213,6 +1235,36 @@ describe('useSheetGestures', () => {
|
|
|
1213
1235
|
expect(hook.result.current.isDragging).toBe(true);
|
|
1214
1236
|
});
|
|
1215
1237
|
|
|
1238
|
+
it('leaves a touch that starts inside a nested <dialog> to that layer', () => {
|
|
1239
|
+
// A sheet opened from this sheet's content renders its <dialog> inside
|
|
1240
|
+
// the body, so its touches bubble here. The same pull-down from the
|
|
1241
|
+
// body's own content promotes (see above); from the nested layer it
|
|
1242
|
+
// must not.
|
|
1243
|
+
const {hook} = setup({snapHeights: () => [200]});
|
|
1244
|
+
const {body} = makeNested({
|
|
1245
|
+
bodyScrollTop: 0,
|
|
1246
|
+
innerScrollTop: 0,
|
|
1247
|
+
innerScrollHeight: 200,
|
|
1248
|
+
});
|
|
1249
|
+
const nested = document.createElement('dialog');
|
|
1250
|
+
const nestedHandle = document.createElement('div');
|
|
1251
|
+
nested.appendChild(nestedHandle);
|
|
1252
|
+
body.appendChild(nested);
|
|
1253
|
+
act(() => hook.result.current.sheetRef(body));
|
|
1254
|
+
act(() => hook.result.current.bodyProps.ref(body));
|
|
1255
|
+
let start: Event | undefined;
|
|
1256
|
+
let pull: Event | undefined;
|
|
1257
|
+
act(() => {
|
|
1258
|
+
start = touchOn(nestedHandle, body, 'touchstart', 100);
|
|
1259
|
+
pull = touchOn(nestedHandle, body, 'touchmove', 160);
|
|
1260
|
+
});
|
|
1261
|
+
expect(start?.defaultPrevented).toBe(false);
|
|
1262
|
+
expect(pull?.defaultPrevented).toBe(false);
|
|
1263
|
+
expect(hook.result.current.isDragging).toBe(false);
|
|
1264
|
+
expect(liveOffset(hook)).toBe(0);
|
|
1265
|
+
expect(body.style.transform).toBe('');
|
|
1266
|
+
});
|
|
1267
|
+
|
|
1216
1268
|
it('leaves a pull-up to a nested scroller with content below', () => {
|
|
1217
1269
|
const {hook} = setup({snapHeights: () => [200]});
|
|
1218
1270
|
const {body, tile} = makeNested({bodyScrollTop: 0, innerScrollTop: 100});
|
|
@@ -235,6 +235,33 @@ function isBlockScroller(element: HTMLElement): boolean {
|
|
|
235
235
|
return overflowY === 'auto' || overflowY === 'scroll';
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
+
/**
|
|
239
|
+
* Whether a gesture that lands on `target` began inside another layer
|
|
240
|
+
* rendered in this sheet's content — a `<dialog>` between the target and the
|
|
241
|
+
* body. A sheet opened from inside a sheet's content, a Dialog opened there,
|
|
242
|
+
* renders its dialog as a descendant of the host's body, so its pointer and
|
|
243
|
+
* touch events bubble through the host's gesture listeners. That gesture is
|
|
244
|
+
* the layer's own: the host must neither arm a drag on it nor take pointer
|
|
245
|
+
* capture for it, which would cancel the drag the layer's own handle began
|
|
246
|
+
* (`component:BottomSheet` FR7: a swipe reaches only the top sheet of a
|
|
247
|
+
* stack; FR6: a covered sheet is blocked).
|
|
248
|
+
*/
|
|
249
|
+
export function isInsideNestedLayer(
|
|
250
|
+
target: EventTarget | null,
|
|
251
|
+
body: HTMLElement,
|
|
252
|
+
): boolean {
|
|
253
|
+
for (
|
|
254
|
+
let element = target instanceof Element ? target : null;
|
|
255
|
+
element != null && element !== body;
|
|
256
|
+
element = element.parentElement
|
|
257
|
+
) {
|
|
258
|
+
if (element.localName === 'dialog') {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
|
|
238
265
|
/**
|
|
239
266
|
* The scrollers a gesture that lands on `target` can scroll, innermost first
|
|
240
267
|
* and the body last: every scrollable box between the target and the body,
|
|
@@ -1328,10 +1355,13 @@ export function useSheetGestures({
|
|
|
1328
1355
|
if (event.button !== 0 || !event.isPrimary) {
|
|
1329
1356
|
return;
|
|
1330
1357
|
}
|
|
1331
|
-
const
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1358
|
+
const body = event.currentTarget as HTMLElement;
|
|
1359
|
+
// A gesture inside a layer this sheet hosts belongs to that layer.
|
|
1360
|
+
if (isInsideNestedLayer(event.target, body)) {
|
|
1361
|
+
armedBodyRef.current = null;
|
|
1362
|
+
return;
|
|
1363
|
+
}
|
|
1364
|
+
const scrollers = scrollChainUnder(event.target, body);
|
|
1335
1365
|
if (!chainAtTop(scrollers)) {
|
|
1336
1366
|
armedBodyRef.current = null;
|
|
1337
1367
|
return;
|
|
@@ -1465,8 +1495,9 @@ export function useSheetGestures({
|
|
|
1465
1495
|
// At the top, a pull DOWN hands off (collapse); at the bottom, a pull UP
|
|
1466
1496
|
// hands off (expand). A gesture that starts mid-content is an ordinary
|
|
1467
1497
|
// scroll, but it is tracked all the same: the scroller can run out of
|
|
1468
|
-
// content while the finger is still down (see onTouchMove).
|
|
1469
|
-
|
|
1498
|
+
// content while the finger is still down (see onTouchMove). A touch
|
|
1499
|
+
// inside a layer this sheet hosts is that layer's, never tracked here.
|
|
1500
|
+
if (!touch || isInsideNestedLayer(event.target, body)) {
|
|
1470
1501
|
touchDragRef.current = null;
|
|
1471
1502
|
return;
|
|
1472
1503
|
}
|
|
@@ -97,15 +97,27 @@ async function runState(
|
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
// Checking coverage runs every state again, which on a loaded runner nears
|
|
101
|
+
// the per-test timeout as one test. It runs as one serial part per state,
|
|
102
|
+
// sharing their results, then one check over all of them.
|
|
103
|
+
test.describe('every Breadcrumb expectation is exercised by at least one state', () => {
|
|
104
|
+
test.describe.configure({mode: 'serial'});
|
|
104
105
|
const results: BindingResult[] = [];
|
|
106
|
+
|
|
105
107
|
for (const state of BREADCRUMB_A11Y_STATES) {
|
|
106
|
-
|
|
108
|
+
test(`runs ${state.id}`, async ({page}) => {
|
|
109
|
+
const cdp = await page.context().newCDPSession(page);
|
|
110
|
+
results.push(await runState(page, cdp, state));
|
|
111
|
+
});
|
|
107
112
|
}
|
|
108
|
-
|
|
113
|
+
|
|
114
|
+
test('no expectation is left unexercised', () => {
|
|
115
|
+
// Every part ran in this worker; this test alone proves nothing.
|
|
116
|
+
expect(results.map(result => result.state).sort()).toEqual(
|
|
117
|
+
BREADCRUMB_A11Y_STATES.map(state => state.id).sort(),
|
|
118
|
+
);
|
|
119
|
+
expect(neverExercised(results)).toEqual([]);
|
|
120
|
+
});
|
|
109
121
|
});
|
|
110
122
|
|
|
111
123
|
for (const state of BREADCRUMB_A11Y_STATES) {
|
package/src/Button/Button.tsx
CHANGED
|
@@ -43,8 +43,8 @@ import {
|
|
|
43
43
|
shadowVars,
|
|
44
44
|
focusVars,
|
|
45
45
|
} from '../theme/tokens.stylex';
|
|
46
|
-
import {Spinner} from '../Spinner';
|
|
47
|
-
import {VisuallyHidden} from '../VisuallyHidden';
|
|
46
|
+
import {Spinner} from '../Spinner/Spinner';
|
|
47
|
+
import {VisuallyHidden} from '../VisuallyHidden/VisuallyHidden';
|
|
48
48
|
import {IconDefaultSizeProvider} from '../Icon/IconDefaultSizeContext';
|
|
49
49
|
import {iconBoxSizeStyles, type IconSize} from '../Icon/IconSize.stylex';
|
|
50
50
|
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
groupStyles as inputGroupStyles,
|
|
58
58
|
inputGroupItemProps,
|
|
59
59
|
} from '../InputGroup/groupStyles';
|
|
60
|
-
import {mergeProps} from '../utils';
|
|
60
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
61
61
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
62
62
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
63
63
|
import type {LinkComponentType} from '../Link/types';
|
|
@@ -65,7 +65,7 @@ import {themeProps} from '../utils/themeProps';
|
|
|
65
65
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
66
66
|
import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
67
67
|
import {usePressFeedback} from '../hooks/usePressFeedback';
|
|
68
|
-
import {useTranslator} from '../i18n';
|
|
68
|
+
import {useTranslator} from '../i18n/useTranslator';
|
|
69
69
|
import type {ButtonVariantMap} from './index';
|
|
70
70
|
|
|
71
71
|
/**
|