@astryxdesign/core 0.7.5 → 0.7.6-canary.bb18c81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +12 -3
- package/dist/BottomSheet/BottomSheet.js +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +2 -1
- package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +30 -3
- package/dist/Button/Button.js +4 -4
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -5
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +4 -1
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +101 -15
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +4 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +34 -9
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +5 -4
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +2 -1
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +5 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +10 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +16 -2
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -16
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +2 -1
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +4 -4
- package/dist/Field/InputClearButton.js +3 -3
- package/dist/Field/PanelSearchInput.js +2 -2
- package/dist/FieldStatus/FieldStatus.js +2 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -1
- package/dist/Heading/Heading.js +1 -1
- package/dist/Icon/Icon.js +1 -1
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckIndicator.js +2 -1
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +3 -1
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
- package/dist/Indicator/RadioIndicator.js +3 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +2 -1
- package/dist/Item/ItemSwipeLayer.js +1 -1
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +5 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +7 -2
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +5 -2
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +3 -3
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +28 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
- package/dist/Selector/useSelectorPresentation.d.ts +8 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +20 -4
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +7 -1
- package/dist/Spinner/Spinner.js +2 -2
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- package/dist/Text/Text.js +1 -1
- package/dist/Text/useTruncation.d.ts.map +1 -1
- package/dist/Text/useTruncation.js +23 -5
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -3
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +2 -2
- package/dist/Timestamp/TimestampHoverCard.js +4 -4
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +82 -51
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +13 -2
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +2 -1
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -1
- package/dist/astryx.css +14 -1
- package/dist/gestures/PinchGestureRecognizer.d.ts +30 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PinchGestureRecognizer.js +125 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +70 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +220 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts +36 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/SwipeGestureRecognizer.js +145 -0
- package/dist/gestures/VelocityTracker.d.ts +6 -2
- package/dist/gestures/VelocityTracker.d.ts.map +1 -1
- package/dist/gestures/VelocityTracker.js +7 -3
- package/dist/gestures/types.d.ts +11 -7
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +22 -2
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +4 -1
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +12 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +3 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +3 -0
- package/dist/motion/animator.d.ts +7 -1
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +119 -27
- package/dist/theme/defineTheme.js +1 -1
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
- package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
- package/dist/theme/domainTokens/index.d.ts +5 -4
- package/dist/theme/domainTokens/index.d.ts.map +1 -1
- package/dist/theme/domainTokens/index.js +5 -9
- package/dist/utils/focusReturn.d.ts +17 -1
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +11 -4
- package/dist/utils/getNodeText.d.ts +8 -0
- package/dist/utils/getNodeText.d.ts.map +1 -0
- package/dist/utils/getNodeText.js +37 -0
- package/dist/utils/interactionModality.d.ts +11 -2
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +58 -5
- package/dist/utils/presentation.d.ts +50 -0
- package/dist/utils/presentation.d.ts.map +1 -0
- package/dist/utils/presentation.js +125 -0
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +5 -3
- package/dist/utils/touchPresentation.stylex.d.ts +15 -0
- package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
- package/dist/utils/touchPresentation.stylex.js +33 -0
- package/locales/en.json +13 -1
- package/locales/pseudo.json +9 -0
- package/package.json +5 -4
- package/src/AlertDialog/AlertDialog.tsx +6 -5
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
- package/src/Avatar/Avatar.spec.md +22 -22
- package/src/Avatar/Avatar.tsx +18 -1
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
- package/src/BottomSheet/BottomSheet.test.tsx +46 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
- package/src/BottomSheet/useSheetGestures.test.ts +52 -0
- package/src/BottomSheet/useSheetGestures.ts +37 -6
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
- package/src/Button/Button.tsx +4 -4
- package/src/Calendar/Calendar.spec.md +87 -48
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/Collapsible/Collapsible.spec.md +2 -0
- package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/DateInput/DateInput.test.tsx +53 -2
- package/src/DateInput/DateInput.tsx +15 -11
- package/src/DateInput/MonthScroller.tsx +106 -20
- package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
- package/src/DateRangeInput/DateRangeInput.tsx +16 -12
- package/src/DateTimeInput/DateTimeInput.spec.md +71 -48
- package/src/DateTimeInput/DateTimeInput.test.tsx +61 -0
- package/src/DateTimeInput/DateTimeInput.tsx +15 -11
- package/src/Dialog/Dialog.test.tsx +216 -2
- package/src/Dialog/Dialog.tsx +42 -9
- package/src/Dialog/DialogHeader.tsx +5 -4
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
- package/src/Divider/Divider.tsx +2 -1
- package/src/Drawer/Drawer.spec.md +111 -80
- package/src/Drawer/Drawer.test.tsx +22 -0
- package/src/Drawer/Drawer.tsx +5 -0
- package/src/Drawer/DrawerHeader.spec.md +181 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
- package/src/DropdownMenu/DropdownMenu.tsx +7 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +53 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +23 -6
- package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
- package/src/EmptyState/EmptyState.tsx +2 -1
- package/src/Field/FieldLabel.tsx +5 -4
- package/src/Field/InputClearButton.tsx +3 -3
- package/src/Field/PanelSearchInput.tsx +2 -2
- package/src/FieldStatus/FieldStatus.tsx +2 -2
- package/src/FileInput/FileInput.test.tsx +21 -0
- package/src/FileInput/FileInput.tsx +4 -1
- package/src/FormLayout/FormLayout.spec.md +7 -8
- package/src/Heading/Heading.tsx +1 -1
- package/src/Icon/Icon.tsx +1 -1
- package/src/Indicator/CheckIndicator.spec.md +47 -42
- package/src/Indicator/CheckIndicator.tsx +2 -1
- package/src/Indicator/CheckboxIndicator.spec.md +40 -37
- package/src/Indicator/CheckboxIndicator.tsx +3 -1
- package/src/Indicator/Indicator.spec.md +188 -0
- package/src/Indicator/RadioIndicator.tsx +3 -1
- package/src/Item/Item.tsx +2 -1
- package/src/Item/ItemSwipeLayer.tsx +1 -1
- package/src/Layout/Layout.spec.md +127 -131
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.spec.md +205 -0
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.spec.md +190 -0
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.spec.md +193 -0
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.spec.md +194 -0
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
- package/src/Lightbox/Lightbox.test.tsx +18 -0
- package/src/Lightbox/Lightbox.tsx +5 -0
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.tsx +3 -3
- package/src/MobileNav/MobileNav.test.tsx +15 -0
- package/src/MobileNav/MobileNav.tsx +9 -1
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
- package/src/MoreMenu/MoreMenu.test.tsx +11 -0
- package/src/MultiSelector/MultiSelector.spec.md +7 -4
- package/src/MultiSelector/MultiSelector.test.tsx +118 -1
- package/src/MultiSelector/MultiSelector.tsx +6 -2
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
- package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.tsx +13 -3
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/ProgressBar/ProgressBar.test.tsx +108 -32
- package/src/ProgressBar/ProgressBar.tsx +58 -10
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
- package/src/Resizable/useResizable.test.ts +43 -0
- package/src/Resizable/useResizable.ts +32 -9
- package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
- package/src/Selector/Selector.test.tsx +90 -1
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
- package/src/Selector/useSelectorPresentation.ts +31 -3
- package/src/SideNav/SideNav.test.tsx +27 -0
- package/src/Slider/Slider.test.tsx +12 -0
- package/src/Slider/Slider.tsx +4 -1
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
- package/src/Spinner/Spinner.tsx +2 -2
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/TabList/TabList.test.tsx +52 -1
- package/src/TabList/TabList.tsx +16 -1
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- package/src/Text/Text.tsx +1 -1
- package/src/Text/useTruncation.test.tsx +128 -1
- package/src/Text/useTruncation.ts +23 -5
- package/src/TextArea/TextArea.spec.md +10 -13
- package/src/TextArea/TextArea.test.tsx +60 -0
- package/src/TextArea/TextArea.tsx +15 -1
- package/src/TextInput/TextInput.test.tsx +21 -0
- package/src/TextInput/TextInput.tsx +3 -1
- package/src/Timestamp/Timestamp.spec.md +6 -12
- package/src/Timestamp/Timestamp.test.tsx +30 -5
- package/src/Timestamp/Timestamp.tsx +6 -2
- package/src/Timestamp/TimestampHoverCard.tsx +4 -4
- package/src/Toast/Toast.spec.md +7 -10
- package/src/Toast/ToastViewport.test.tsx +575 -1
- package/src/Toast/ToastViewport.tsx +100 -50
- package/src/Tokenizer/Tokenizer.spec.md +5 -3
- package/src/Tokenizer/Tokenizer.test.tsx +68 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- package/src/Toolbar/Toolbar.spec.md +5 -6
- package/src/Toolbar/Toolbar.test.tsx +30 -0
- package/src/Toolbar/Toolbar.tsx +2 -1
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
- package/src/TopNav/TopNav.test.tsx +27 -0
- package/src/Typeahead/Typeahead.test.tsx +40 -0
- package/src/Typeahead/Typeahead.tsx +12 -1
- package/src/gestures/PinchGestureRecognizer.ts +144 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +252 -0
- package/src/gestures/SwipeGestureRecognizer.ts +193 -0
- package/src/gestures/VelocityTracker.ts +10 -3
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +188 -0
- package/src/gestures/__tests__/harness.ts +21 -2
- package/src/gestures/types.ts +23 -9
- package/src/hooks/useAdaptivePresentation.ts +4 -1
- package/src/hooks/useMenuHover.ts +15 -1
- package/src/i18n/generated-locales/en.generated.ts +4 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +4 -0
- package/src/motion/README.md +11 -1
- package/src/motion/animator.test.ts +151 -3
- package/src/motion/animator.ts +149 -33
- package/src/theme/defineTheme.ts +1 -1
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
- package/src/theme/domainTokens/index.ts +6 -10
- package/src/utils/focusReturn.ts +17 -6
- package/src/utils/getNodeText.test.ts +24 -0
- package/src/utils/getNodeText.ts +37 -0
- package/src/utils/interactionModality.test.ts +45 -1
- package/src/utils/interactionModality.ts +64 -5
- package/src/utils/presentation.test.ts +380 -0
- package/src/utils/presentation.ts +180 -0
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/touchPresentation.stylex.ts +43 -0
- package/src/utils/touchPresentation.test.ts +140 -1
- package/src/utils/touchPresentation.ts +5 -3
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
// @pr-a11y scope ^packages/core/src/Avatar/ ^apps/storybook/stories/Avatar
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file AvatarForcedColors.a11y.chromium.spec.ts
|
|
6
|
+
* @input The built Avatar "Initials Fallback" story in real Chromium, with
|
|
7
|
+
* forced colors emulated and without
|
|
8
|
+
* @output Browser evidence that, in forced colors, a lone Avatar's initials
|
|
9
|
+
* take the color around them: CanvasText by default, GrayText inside a control
|
|
10
|
+
* that paints itself disabled, HighlightText inside a
|
|
11
|
+
* selected one, while grouped faces keep CanvasText on the group's ring;
|
|
12
|
+
* outside forced colors they keep the theme's color
|
|
13
|
+
* @position Regression proof for Avatar's fallback color (Chromium only:
|
|
14
|
+
* Playwright's WebKit matches the forced-colors query but forces nothing)
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {expect, test, type Page} from '@playwright/test';
|
|
18
|
+
import {
|
|
19
|
+
DEFAULT_STORYBOOK_DIR,
|
|
20
|
+
serveStorybook,
|
|
21
|
+
type StaticServer,
|
|
22
|
+
} from '@astryxdesign/a11y-spec/storybook';
|
|
23
|
+
|
|
24
|
+
let storybook: StaticServer;
|
|
25
|
+
test.beforeAll(async () => {
|
|
26
|
+
storybook = await serveStorybook(
|
|
27
|
+
process.env.ASTRYX_STORYBOOK_DIR ?? DEFAULT_STORYBOOK_DIR,
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
test.afterAll(async () => {
|
|
31
|
+
await storybook?.close();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The initials' color, with `around` painted on `host`: the Avatar's own box
|
|
36
|
+
* for a lone Avatar, the group's for grouped ones.
|
|
37
|
+
*/
|
|
38
|
+
async function initialsColor(
|
|
39
|
+
page: Page,
|
|
40
|
+
forcedColors: 'active' | 'none',
|
|
41
|
+
around: string | null,
|
|
42
|
+
{
|
|
43
|
+
story = 'core-avatar--initials-fallback',
|
|
44
|
+
host = '.astryx-avatar',
|
|
45
|
+
}: {story?: string; host?: string} = {},
|
|
46
|
+
): Promise<{initials: string; reference: string}> {
|
|
47
|
+
await page.emulateMedia({forcedColors});
|
|
48
|
+
await page.goto(`${storybook.origin}/iframe.html?id=${story}&viewMode=story`);
|
|
49
|
+
await page.locator('.astryx-avatar-fallback').first().waitFor();
|
|
50
|
+
if (around != null) {
|
|
51
|
+
await page.addStyleTag({content: `${host} { ${around} }`});
|
|
52
|
+
}
|
|
53
|
+
return page.evaluate(() => {
|
|
54
|
+
const initials = document.querySelector('.astryx-avatar-fallback');
|
|
55
|
+
// A probe painted with the system color the initials should show.
|
|
56
|
+
const probe = document.createElement('span');
|
|
57
|
+
document.body.append(probe);
|
|
58
|
+
const read = (color: string) => {
|
|
59
|
+
probe.style.color = color;
|
|
60
|
+
return getComputedStyle(probe).color;
|
|
61
|
+
};
|
|
62
|
+
const result = {
|
|
63
|
+
initials: initials == null ? '' : getComputedStyle(initials).color,
|
|
64
|
+
reference: JSON.stringify({
|
|
65
|
+
CanvasText: read('CanvasText'),
|
|
66
|
+
GrayText: read('GrayText'),
|
|
67
|
+
HighlightText: read('HighlightText'),
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
probe.remove();
|
|
71
|
+
return result;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
test('in forced colors the initials are CanvasText by default', async ({
|
|
76
|
+
page,
|
|
77
|
+
}) => {
|
|
78
|
+
const {initials, reference} = await initialsColor(page, 'active', null);
|
|
79
|
+
expect(initials).toBe(JSON.parse(reference).CanvasText);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('in forced colors the initials take GrayText inside a control that paints itself disabled', async ({
|
|
83
|
+
page,
|
|
84
|
+
}) => {
|
|
85
|
+
const {initials, reference} = await initialsColor(
|
|
86
|
+
page,
|
|
87
|
+
'active',
|
|
88
|
+
'color: GrayText;',
|
|
89
|
+
);
|
|
90
|
+
expect(initials).toBe(JSON.parse(reference).GrayText);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('in forced colors the initials take HighlightText inside a selected control', async ({
|
|
94
|
+
page,
|
|
95
|
+
}) => {
|
|
96
|
+
const {initials, reference} = await initialsColor(
|
|
97
|
+
page,
|
|
98
|
+
'active',
|
|
99
|
+
'forced-color-adjust: none; background: Highlight; color: HighlightText;',
|
|
100
|
+
);
|
|
101
|
+
expect(initials).toBe(JSON.parse(reference).HighlightText);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test("outside forced colors the initials keep the theme's color, whatever is around them", async ({
|
|
105
|
+
page,
|
|
106
|
+
}) => {
|
|
107
|
+
const plain = await initialsColor(page, 'none', null);
|
|
108
|
+
const around = await initialsColor(page, 'none', 'color: rgb(200, 0, 0);');
|
|
109
|
+
expect(around.initials).toBe(plain.initials);
|
|
110
|
+
expect(plain.initials).not.toBe('rgb(200, 0, 0)');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("in forced colors grouped initials keep CanvasText on the group's ring", async ({
|
|
114
|
+
page,
|
|
115
|
+
}) => {
|
|
116
|
+
const {initials, reference} = await initialsColor(
|
|
117
|
+
page,
|
|
118
|
+
'active',
|
|
119
|
+
'color: GrayText;',
|
|
120
|
+
{
|
|
121
|
+
story: 'core-avatargroup--initials-fallback',
|
|
122
|
+
host: '.astryx-avatar-group',
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
expect(initials).toBe(JSON.parse(reference).CanvasText);
|
|
126
|
+
});
|
|
@@ -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
|
/**
|