@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,80 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file pressPaintPriority.test.ts
|
|
5
|
+
* @input Uses vitest, Babel with the StyleX plugin (the repository's shared
|
|
6
|
+
* module resolution) and interactionOverlay.stylex.ts
|
|
7
|
+
* @output Checks, in the compiled CSS, that the press paint outranks the
|
|
8
|
+
* coarse-pointer `:active` reset of the overlay
|
|
9
|
+
* @position Regression test for the cascade order of the press overlay
|
|
10
|
+
*
|
|
11
|
+
* WebKit applies `:active` during a touch. Under a coarse pointer the overlay
|
|
12
|
+
* turns the bare `:active` image off, and the press paint
|
|
13
|
+
* (`[data-astryx-press="on"]`) must still win: its rule has to sit in a
|
|
14
|
+
* higher StyleX priority than the reset. The order is a property of how
|
|
15
|
+
* each key is spelled: an imported `defineConsts` key compiles to a higher
|
|
16
|
+
* priority than the same literal, which put the reset above the paint and
|
|
17
|
+
* erased the touch-down frame.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import fs from 'node:fs';
|
|
21
|
+
import {createRequire} from 'node:module';
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
import {describe, expect, it} from 'vitest';
|
|
24
|
+
import stylexResolution from '../../../../scripts/stylex-module-resolution.cjs';
|
|
25
|
+
|
|
26
|
+
type Rule = [string, {ltr: string}, number];
|
|
27
|
+
|
|
28
|
+
// Babel's types are not part of core's typecheck; type the one call used.
|
|
29
|
+
const {transformSync} = createRequire(import.meta.url)('@babel/core') as {
|
|
30
|
+
transformSync: (
|
|
31
|
+
code: string,
|
|
32
|
+
options: Record<string, unknown>,
|
|
33
|
+
) => {metadata?: unknown} | null;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
function compiledRules(file: string): Rule[] {
|
|
37
|
+
const output = transformSync(fs.readFileSync(file, 'utf8'), {
|
|
38
|
+
filename: file,
|
|
39
|
+
babelrc: false,
|
|
40
|
+
configFile: false,
|
|
41
|
+
parserOpts: {plugins: ['typescript', 'jsx']},
|
|
42
|
+
plugins: [
|
|
43
|
+
[
|
|
44
|
+
'@stylexjs/babel-plugin',
|
|
45
|
+
{
|
|
46
|
+
dev: false,
|
|
47
|
+
runtimeInjection: false,
|
|
48
|
+
genConditionalClasses: true,
|
|
49
|
+
treeshakeCompensation: true,
|
|
50
|
+
unstable_moduleResolution: stylexResolution.stylexModuleResolution,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
return (output?.metadata as {stylex?: Rule[]}).stylex ?? [];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
describe('press overlay cascade', () => {
|
|
59
|
+
it('ranks the press paint above the coarse-pointer :active reset', () => {
|
|
60
|
+
const rules = compiledRules(
|
|
61
|
+
path.resolve(__dirname, 'interactionOverlay.stylex.ts'),
|
|
62
|
+
);
|
|
63
|
+
const resets = rules.filter(
|
|
64
|
+
// Matched without its condition's text: an imported key compiles to a
|
|
65
|
+
// placeholder until the bundle step.
|
|
66
|
+
([, {ltr}]) =>
|
|
67
|
+
ltr.includes(':active') && ltr.includes('background-image:none'),
|
|
68
|
+
);
|
|
69
|
+
const paints = rules.filter(
|
|
70
|
+
([, {ltr}]) =>
|
|
71
|
+
ltr.includes('[data-astryx-press="on"]') &&
|
|
72
|
+
ltr.includes('background-image:'),
|
|
73
|
+
);
|
|
74
|
+
expect(resets.length).toBeGreaterThan(0);
|
|
75
|
+
expect(paints.length).toBeGreaterThan(0);
|
|
76
|
+
const highestReset = Math.max(...resets.map(([, , priority]) => priority));
|
|
77
|
+
const lowestPaint = Math.min(...paints.map(([, , priority]) => priority));
|
|
78
|
+
expect(highestReset).toBeLessThan(lowestPaint);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file touchPresentation.stylex.ts
|
|
5
|
+
* @input Uses StyleX defineConsts
|
|
6
|
+
* @output Exports touchKeys: the touch presentation resolver's queries as
|
|
7
|
+
* StyleX at-rule keys
|
|
8
|
+
* @position The reference spellings of the touch, compact and iOS-gate
|
|
9
|
+
* conditions. Core styles write these as literal keys wherever they need
|
|
10
|
+
* them (`spec:AST-094` FR13, `spec:AST-012` FR9), and a test pins each
|
|
11
|
+
* literal to these values; utils/touchPresentation.ts holds the same
|
|
12
|
+
* queries for script (matchMedia)
|
|
13
|
+
*
|
|
14
|
+
* These are the spellings to match. A style that changes with these
|
|
15
|
+
* conditions writes the same literal key (`'@media (pointer: coarse)'`, the
|
|
16
|
+
* iOS gate as that media key outside `'@supports (-webkit-touch-callout:
|
|
17
|
+
* none)'`), and a test pins every literal in core to these values. Do not use
|
|
18
|
+
* an imported key as a computed StyleX key: it compiles to a different
|
|
19
|
+
* priority than the literal (6000 against 3200) and reorders the cascade.
|
|
20
|
+
* The iOS supports gate is only for a style iOS WebKit itself requires (the
|
|
21
|
+
* 16px input floor), never a behaviour.
|
|
22
|
+
*
|
|
23
|
+
* SYNC: When modified, update touchPresentation.ts and
|
|
24
|
+
* touchPresentation.test.ts.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import * as stylex from '@stylexjs/stylex';
|
|
28
|
+
|
|
29
|
+
export const touchKeys = stylex.defineConsts({
|
|
30
|
+
/** The primary pointer is coarse (TOUCH_QUERY). */
|
|
31
|
+
touch: '@media (pointer: coarse)',
|
|
32
|
+
/** The viewport is compact (COMPACT_QUERY, `spec:AST-012` FR9). */
|
|
33
|
+
compact: '@media (width < 768px), (height < 500px)',
|
|
34
|
+
/** Both: a presentation such as a sheet in place of a popover. */
|
|
35
|
+
compactTouch:
|
|
36
|
+
'@media (width < 768px) and (pointer: coarse), (height < 500px) and (pointer: coarse)',
|
|
37
|
+
/**
|
|
38
|
+
* The iOS WebKit gate, inside `touch` (IOS_SUPPORTS_QUERY): only for a
|
|
39
|
+
* style iOS WebKit itself requires (the 16px input floor), never a
|
|
40
|
+
* behaviour; touch behaviour is one model on every touch device.
|
|
41
|
+
*/
|
|
42
|
+
iosSupports: '@supports (-webkit-touch-callout: none)',
|
|
43
|
+
});
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
COMPACT_TOUCH_PRESENTATION_QUERY,
|
|
23
23
|
useAdaptivePresentation,
|
|
24
24
|
} from '../hooks/useAdaptivePresentation';
|
|
25
|
+
import {reducedMotionKeys} from '../motion/reducedMotion.stylex';
|
|
25
26
|
import {DEFAULT_COMPACT_DEFINITION} from '../theme/themeAdaptations';
|
|
26
27
|
import {Theme, defineTheme} from '../theme';
|
|
27
28
|
import {
|
|
@@ -33,6 +34,7 @@ import {
|
|
|
33
34
|
readTouchPresentation,
|
|
34
35
|
useTouchPresentation,
|
|
35
36
|
} from './touchPresentation';
|
|
37
|
+
import {touchKeys} from './touchPresentation.stylex';
|
|
36
38
|
|
|
37
39
|
/**
|
|
38
40
|
* A device: what its primary pointer is, how big its viewport is, and
|
|
@@ -90,6 +92,32 @@ afterEach(() => {
|
|
|
90
92
|
vi.unstubAllGlobals();
|
|
91
93
|
});
|
|
92
94
|
|
|
95
|
+
/**
|
|
96
|
+
* The Levenshtein distance between two strings, or more than `limit` as soon
|
|
97
|
+
* as it must exceed it: how many characters a spelling is off another.
|
|
98
|
+
*/
|
|
99
|
+
function editDistance(a: string, b: string, limit: number): number {
|
|
100
|
+
if (Math.abs(a.length - b.length) > limit) {
|
|
101
|
+
return limit + 1;
|
|
102
|
+
}
|
|
103
|
+
let previous = Array.from({length: b.length + 1}, (_, j) => j);
|
|
104
|
+
for (let i = 1; i <= a.length; i++) {
|
|
105
|
+
const current = [i];
|
|
106
|
+
for (let j = 1; j <= b.length; j++) {
|
|
107
|
+
current[j] = Math.min(
|
|
108
|
+
previous[j] + 1,
|
|
109
|
+
current[j - 1] + 1,
|
|
110
|
+
previous[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1),
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
if (Math.min(...current) > limit) {
|
|
114
|
+
return limit + 1;
|
|
115
|
+
}
|
|
116
|
+
previous = current;
|
|
117
|
+
}
|
|
118
|
+
return previous[b.length];
|
|
119
|
+
}
|
|
120
|
+
|
|
93
121
|
describe('touch presentation', () => {
|
|
94
122
|
it('keys touch on the primary pointer and compact on the width', () => {
|
|
95
123
|
const {result} = renderHook(() => useTouchPresentation());
|
|
@@ -181,6 +209,116 @@ describe('touch presentation', () => {
|
|
|
181
209
|
});
|
|
182
210
|
});
|
|
183
211
|
|
|
212
|
+
it('holds the same keys the resolver defines', () => {
|
|
213
|
+
expect(touchKeys.touch).toBe(`@media ${TOUCH_QUERY}`);
|
|
214
|
+
expect(touchKeys.compact).toBe(`@media ${COMPACT_QUERY}`);
|
|
215
|
+
expect(touchKeys.compactTouch).toBe(`@media ${COMPACT_TOUCH_QUERY}`);
|
|
216
|
+
expect(touchKeys.iosSupports).toBe(`@supports ${IOS_SUPPORTS_QUERY}`);
|
|
217
|
+
expect(IOS_TOUCH_STYLE_KEYS).toEqual([
|
|
218
|
+
touchKeys.touch,
|
|
219
|
+
touchKeys.iosSupports,
|
|
220
|
+
]);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('keeps every touch and Reduce Motion key literal in core: no computed StyleX key', () => {
|
|
224
|
+
// An imported defineConsts at-rule key compiles to a different StyleX
|
|
225
|
+
// priority than the same literal (6000 vs 3200), which reorders the
|
|
226
|
+
// cascade; core spells the keys and matches them to the constants.
|
|
227
|
+
const root = path.resolve(__dirname, '..');
|
|
228
|
+
const computed: string[] = [];
|
|
229
|
+
const walk = (dir: string): void => {
|
|
230
|
+
for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
|
|
231
|
+
const full = path.join(dir, entry.name);
|
|
232
|
+
if (entry.isDirectory()) {
|
|
233
|
+
if (entry.name !== '__tests__' && entry.name !== 'node_modules') {
|
|
234
|
+
walk(full);
|
|
235
|
+
}
|
|
236
|
+
} else if (
|
|
237
|
+
/\.(ts|tsx)$/.test(entry.name) &&
|
|
238
|
+
!/\.test\.|\.spec\./.test(entry.name)
|
|
239
|
+
) {
|
|
240
|
+
fs.readFileSync(full, 'utf8')
|
|
241
|
+
.split('\n')
|
|
242
|
+
.forEach((line, index) => {
|
|
243
|
+
if (
|
|
244
|
+
!/^\s*(\*|\/\/)/.test(line) &&
|
|
245
|
+
/\[(touchKeys|reducedMotionKeys)\.[a-zA-Z]+\]\s*:/.test(line)
|
|
246
|
+
) {
|
|
247
|
+
computed.push(`${path.relative(root, full)}:${index + 1}`);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
walk(root);
|
|
254
|
+
expect(computed).toEqual([]);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('keeps every quoted at-rule key in core that names the pointer, the touch callout or a compact size, or that is a few characters off a reference spelling, one of the reference spellings', () => {
|
|
258
|
+
// Every quoted string that starts with `@` is read, whatever its at-rule
|
|
259
|
+
// is spelled. Two rules, so no drift depends on which character moved:
|
|
260
|
+
// - one that names the pointer or the touch callout (any word of either
|
|
261
|
+
// query, any case), or a compact size with its breakpoint, is one of
|
|
262
|
+
// the resolver's own spellings or a query the presentation does not
|
|
263
|
+
// decide (a second pointer, a fine pointer, Reduce Motion split by
|
|
264
|
+
// pointer);
|
|
265
|
+
// - one within three characters of any of those spellings, case aside,
|
|
266
|
+
// is that spelling exactly: a capital, a digit or a typo anywhere, in
|
|
267
|
+
// the at-rule, a feature or a value, fails.
|
|
268
|
+
const pointerKeys = new Set<string>([
|
|
269
|
+
touchKeys.touch,
|
|
270
|
+
touchKeys.compactTouch,
|
|
271
|
+
touchKeys.iosSupports,
|
|
272
|
+
'@media (any-pointer: coarse)',
|
|
273
|
+
'@media (pointer: fine)',
|
|
274
|
+
reducedMotionKeys.fade,
|
|
275
|
+
reducedMotionKeys.instant,
|
|
276
|
+
]);
|
|
277
|
+
const references = new Set<string>([...pointerKeys, touchKeys.compact]);
|
|
278
|
+
const lowered = [...references].map(reference => reference.toLowerCase());
|
|
279
|
+
const root = path.resolve(__dirname, '..');
|
|
280
|
+
const drifted: string[] = [];
|
|
281
|
+
let pointerLiterals = 0;
|
|
282
|
+
const walk = (dir: string): void => {
|
|
283
|
+
for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
|
|
284
|
+
const full = path.join(dir, entry.name);
|
|
285
|
+
if (entry.isDirectory()) {
|
|
286
|
+
if (entry.name !== '__tests__' && entry.name !== 'node_modules') {
|
|
287
|
+
walk(full);
|
|
288
|
+
}
|
|
289
|
+
} else if (
|
|
290
|
+
/\.(ts|tsx)$/.test(entry.name) &&
|
|
291
|
+
!/\.(test|spec|stories)\./.test(entry.name)
|
|
292
|
+
) {
|
|
293
|
+
const source = fs.readFileSync(full, 'utf8');
|
|
294
|
+
for (const match of source.matchAll(/'(@[^'\n]*)'/g)) {
|
|
295
|
+
const key = match[1];
|
|
296
|
+
if (references.has(key)) {
|
|
297
|
+
if (pointerKeys.has(key)) {
|
|
298
|
+
pointerLiterals++;
|
|
299
|
+
}
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
const names =
|
|
303
|
+
/pointer|coarse|fine|touch|callout/i.test(key) ||
|
|
304
|
+
(/\b(width|height)\b/i.test(key) && /\b(768|500)px\b/.test(key));
|
|
305
|
+
const lower = key.toLowerCase();
|
|
306
|
+
const isNear = lowered.some(
|
|
307
|
+
reference => editDistance(lower, reference, 3) <= 3,
|
|
308
|
+
);
|
|
309
|
+
if (names || isNear) {
|
|
310
|
+
drifted.push(`${path.relative(root, full)}: ${key}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
walk(root);
|
|
317
|
+
expect(drifted).toEqual([]);
|
|
318
|
+
// Core writes the touch key as a literal in many places.
|
|
319
|
+
expect(pointerLiterals).toBeGreaterThan(50);
|
|
320
|
+
});
|
|
321
|
+
|
|
184
322
|
it('keeps every iOS gate in core spelled and nested as the resolver', () => {
|
|
185
323
|
// The gate is the media query outside and the supports query inside; a
|
|
186
324
|
// single supports query that names the pointer never matches anywhere.
|
|
@@ -201,7 +339,8 @@ describe('touch presentation', () => {
|
|
|
201
339
|
} else if (
|
|
202
340
|
/\.(ts|tsx)$/.test(entry.name) &&
|
|
203
341
|
!/\.test\.|\.spec\./.test(entry.name) &&
|
|
204
|
-
entry.name !== 'touchPresentation.ts'
|
|
342
|
+
entry.name !== 'touchPresentation.ts' &&
|
|
343
|
+
entry.name !== 'touchPresentation.stylex.ts'
|
|
205
344
|
) {
|
|
206
345
|
const lines = fs.readFileSync(full, 'utf8').split('\n');
|
|
207
346
|
lines.forEach((line, index) => {
|
|
@@ -46,9 +46,11 @@
|
|
|
46
46
|
* test keeps core's compact-touch keys identical to COMPACT_TOUCH_QUERY and
|
|
47
47
|
* every touch-callout key spelled and nested as above. The iOS style gate
|
|
48
48
|
* is only for a style iOS WebKit itself requires (core's 16px input floor);
|
|
49
|
-
* it never selects a behaviour.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
49
|
+
* it never selects a behaviour. Core spells the keys literally: an imported
|
|
50
|
+
* `defineConsts` key compiles to a different StyleX priority than the same
|
|
51
|
+
* literal, which would reorder the cascade. `touchKeys`
|
|
52
|
+
* (touchPresentation.stylex.ts, internal to core) holds the same keys, and a
|
|
53
|
+
* test keeps every literal equal to them. The hook is for behaviour. It answers the server default
|
|
52
54
|
* (not touch, not compact) until hydrated unless the caller passes a server
|
|
53
55
|
* hint, and follows the pointer and size when they change (a tablet docking
|
|
54
56
|
* a mouse).
|