@astryxdesign/core 0.7.5 → 0.7.6-canary.0d71e8d
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/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +41 -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/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +11 -7
- package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
- package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
- package/dist/DateInput/usePointerDragScroll.js +25 -9
- package/dist/DateInput/useScrollSettle.d.ts +3 -1
- package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
- package/dist/DateInput/useScrollSettle.js +37 -8
- 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 +35 -22
- 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.d.ts +3 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +3 -2
- package/dist/FileInput/FileInput.d.ts +3 -0
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +34 -13
- 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 +21 -7
- 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 +120 -65
- 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/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +8 -3
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
- 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/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +26 -5
- 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/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +27 -0
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +32 -12
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +10 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +37 -30
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +11 -3
- 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/SideNav/SideNavItem.d.ts +2 -2
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +18 -7
- 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/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +26 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +10 -3
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +36 -10
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
- 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 +101 -54
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +52 -5
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +14 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +44 -7
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
- 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/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -4
- package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +43 -7
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +43 -9
- package/dist/astryx.css +25 -4
- package/dist/gestures/GestureArena.d.ts +32 -1
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +110 -9
- package/dist/gestures/GestureHost.d.ts +351 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +13 -1
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +19 -1
- 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/PressTracker.d.ts +112 -0
- package/dist/gestures/PressTracker.d.ts.map +1 -0
- package/dist/gestures/PressTracker.js +267 -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/index.d.ts +37 -0
- package/dist/gestures/index.d.ts.map +1 -0
- package/dist/gestures/index.js +25 -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/gestures/useGestureRecognizer.d.ts +56 -0
- package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/useGestureRecognizer.js +226 -0
- 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/af-ZA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
- package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
- package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
- package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
- package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
- package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +8 -5
- package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
- package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
- package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
- package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
- package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
- package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
- package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
- package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
- package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
- package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
- package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
- package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
- package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
- package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
- package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
- package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
- package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
- package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
- package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
- package/dist/i18n/useListFormatter.d.ts +9 -0
- package/dist/i18n/useListFormatter.d.ts.map +1 -0
- package/dist/i18n/useListFormatter.js +41 -0
- package/dist/motion/animator.d.ts +83 -8
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +701 -119
- package/dist/motion/coast.d.ts +4 -1
- package/dist/motion/coast.d.ts.map +1 -1
- package/dist/motion/coast.js +4 -2
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +6 -2
- package/dist/motion/reducedMotionPlan.d.ts +7 -0
- package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
- package/dist/motion/reducedMotionPlan.js +14 -1
- package/dist/motion/resolveMotion.d.ts +42 -0
- package/dist/motion/resolveMotion.d.ts.map +1 -0
- package/dist/motion/resolveMotion.js +43 -0
- package/dist/motion/roleValue.d.ts +2 -1
- package/dist/motion/roleValue.d.ts.map +1 -1
- package/dist/motion/roleValue.js +2 -1
- package/dist/motion/uikit/timing.d.ts +7 -1
- package/dist/motion/uikit/timing.d.ts.map +1 -1
- package/dist/motion/uikit/timing.js +19 -1
- 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/focusOutline.stylex.d.ts +6 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.js +7 -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 +2 -2
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +13 -8
- 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/touchQueries.d.ts +13 -0
- package/dist/utils/touchQueries.d.ts.map +1 -0
- package/dist/utils/touchQueries.js +15 -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/dist/utils/useFocusAcrossSwap.d.ts +19 -0
- package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
- package/dist/utils/useFocusAcrossSwap.js +41 -0
- package/locales/af-ZA.json +0 -21
- package/locales/ar-SA.json +0 -21
- package/locales/ca-ES.json +0 -21
- package/locales/cs-CZ.json +0 -21
- package/locales/da-DK.json +0 -21
- package/locales/de-DE.json +0 -21
- package/locales/el-GR.json +0 -21
- package/locales/en.json +35 -23
- package/locales/es-ES.json +0 -21
- package/locales/fi-FI.json +0 -21
- package/locales/fr-FR.json +0 -21
- package/locales/he-IL.json +0 -21
- package/locales/hu-HU.json +0 -21
- package/locales/it-IT.json +0 -21
- package/locales/ja-JP.json +0 -21
- package/locales/ko-KR.json +0 -21
- package/locales/nl-NL.json +0 -21
- package/locales/no-NO.json +0 -21
- package/locales/pl-PL.json +0 -21
- package/locales/pseudo.json +23 -14
- package/locales/pt-BR.json +0 -21
- package/locales/pt-PT.json +0 -21
- package/locales/ro-RO.json +0 -21
- package/locales/ru-RU.json +0 -21
- package/locales/sr-SP.json +0 -21
- package/locales/sv-SE.json +0 -21
- package/locales/tr-TR.json +0 -21
- package/locales/uk-UA.json +0 -21
- package/locales/vi-VN.json +0 -21
- package/locales/zh-CN.json +0 -21
- package/locales/zh-TW.json +0 -21
- 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/ChatComposer.spec.md +75 -59
- package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
- package/src/Chat/ChatDictationButton.spec.md +126 -81
- package/src/Chat/ChatLayout.spec.md +41 -36
- package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
- package/src/Chat/ChatMessage.spec.md +64 -65
- package/src/Chat/ChatSendButton.spec.md +78 -67
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/Citation/Citation.spec.md +60 -47
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
- 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 +148 -0
- package/src/ComplexSelector/ComplexSelector.tsx +41 -4
- package/src/ContextMenu/ContextMenu.spec.md +84 -56
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
- package/src/DateInput/DateInput.spec.md +74 -57
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +120 -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/Wheel.tsx +9 -6
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateInput/usePointerDragScroll.ts +34 -10
- package/src/DateInput/useScrollSettle.ts +38 -7
- 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.spec.md +198 -218
- package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
- package/src/DropdownMenu/DropdownMenu.tsx +43 -21
- package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
- package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
- package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
- package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
- package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
- package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
- package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
- 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.spec.md +35 -29
- 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 +9 -2
- package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
- package/src/FileInput/FileInput.test.tsx +159 -0
- package/src/FileInput/FileInput.tsx +34 -6
- package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
- package/src/FormLayout/FormLayout.spec.md +11 -20
- 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.test.tsx +60 -0
- package/src/Item/Item.tsx +16 -8
- 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 +426 -4
- package/src/Layer/useLayer.tsx +145 -77
- 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/Link.spec.md +3 -2
- package/src/Link/Link.tsx +11 -0
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
- 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/NavMenu/NavHeadingMenuItem.tsx +5 -39
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.test.tsx +68 -7
- package/src/NumberInput/NumberInput.tsx +44 -4
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- package/src/Outline/Outline.spec.md +165 -69
- package/src/Outline/Outline.test.tsx +67 -2
- package/src/Outline/Outline.tsx +23 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
- package/src/OverflowList/OverflowList.spec.md +102 -55
- package/src/Pagination/Pagination.spec.md +158 -84
- package/src/Popover/Popover.test.tsx +84 -0
- package/src/Popover/Popover.tsx +34 -14
- package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
- package/src/Popover/usePopover.tsx +10 -3
- package/src/PowerSearch/PowerSearch.test.tsx +24 -0
- package/src/PowerSearch/PowerSearch.tsx +42 -31
- package/src/ProgressBar/ProgressBar.spec.md +143 -119
- 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/RadioList/RadioList.spec.md +1 -1
- package/src/RadioList/RadioList.test.tsx +84 -0
- package/src/RadioList/RadioListItem.tsx +11 -2
- package/src/Resizable/Resizable.spec.md +144 -124
- 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 +151 -4
- package/src/SideNav/SideNavItem.spec.md +14 -24
- package/src/SideNav/SideNavItem.tsx +27 -10
- 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/Stepper/Step.spec.md +36 -42
- package/src/Stepper/Step.tsx +33 -6
- package/src/Stepper/Stepper.doc.mjs +1 -1
- package/src/Stepper/Stepper.test.tsx +69 -7
- package/src/Switch/Switch.spec.md +1 -1
- package/src/Switch/Switch.test.tsx +66 -1
- package/src/Switch/Switch.tsx +11 -3
- 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/Table.spec.md +1 -1
- package/src/Table/Table.test.tsx +32 -0
- package/src/Table/Table.tsx +43 -11
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/__tests__/Table.a11y.states.ts +1 -5
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
- package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
- 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 +58 -61
- 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 +15 -24
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +798 -1
- package/src/Toast/ToastViewport.tsx +121 -53
- package/src/ToggleButton/ToggleButton.test.tsx +27 -0
- package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Token/Token.spec.md +52 -61
- package/src/Token/Token.test.tsx +104 -0
- package/src/Token/Token.tsx +75 -5
- package/src/Token/TokenLink.tsx +21 -7
- package/src/Tokenizer/Tokenizer.spec.md +18 -4
- package/src/Tokenizer/Tokenizer.test.tsx +176 -0
- package/src/Tokenizer/Tokenizer.tsx +48 -12
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
- 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/TreeList/TreeList.test.tsx +26 -0
- package/src/TreeList/TreeListItem.tsx +26 -4
- package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
- package/src/Typeahead/BaseTypeahead.spec.md +45 -45
- package/src/Typeahead/BaseTypeahead.tsx +48 -9
- package/src/Typeahead/Typeahead.test.tsx +294 -11
- package/src/Typeahead/Typeahead.tsx +51 -9
- package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
- package/src/__tests__/pressState.ts +8 -4
- package/src/gestures/GestureArena.ts +111 -11
- package/src/gestures/GestureHost.ts +2064 -0
- package/src/gestures/GestureRecognizer.ts +21 -1
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -0
- package/src/gestures/PressTracker.ts +386 -0
- package/src/gestures/README.md +420 -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 +2136 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/PressTracker.test.ts +275 -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 +40 -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 +52 -4
- package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
- package/src/gestures/haptics.ts +203 -0
- package/src/gestures/index.ts +79 -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/gestures/useGestureRecognizer.ts +305 -0
- 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/__tests__/useListFormatter.test.tsx +58 -0
- package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
- package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
- package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
- package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
- package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
- package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
- package/src/i18n/generated-locales/en.generated.ts +9 -6
- package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
- package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
- package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
- package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
- package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
- package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
- package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
- package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
- package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
- package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
- package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
- package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
- package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
- package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
- package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
- package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
- package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
- package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
- package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
- package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
- package/src/i18n/useListFormatter.ts +42 -0
- package/src/motion/MEASUREMENTS.md +2 -1
- package/src/motion/README.md +113 -33
- package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
- package/src/motion/__tests__/motionBundle.ts +14 -0
- package/src/motion/animator.test.ts +1125 -32
- package/src/motion/animator.ts +932 -130
- package/src/motion/coast.ts +10 -3
- package/src/motion/reducedMotion.ts +12 -2
- package/src/motion/reducedMotionPlan.test.ts +26 -0
- package/src/motion/reducedMotionPlan.ts +20 -1
- package/src/motion/resolveMotion.test.ts +123 -0
- package/src/motion/resolveMotion.ts +68 -0
- package/src/motion/roleValue.ts +2 -1
- package/src/motion/roles.test.ts +21 -4
- package/src/motion/uikit/tableImports.test.ts +293 -0
- package/src/motion/uikit/timing.ts +15 -1
- package/src/motion/uikit/values.test.ts +23 -12
- 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/focusOutline.stylex.ts +28 -0
- 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/pressGesture.test.ts +9 -0
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- package/src/utils/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 +13 -8
- package/src/utils/touchQueries.ts +15 -0
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
- package/src/utils/useFocusAcrossSwap.ts +55 -0
package/src/motion/coast.ts
CHANGED
|
@@ -29,15 +29,19 @@
|
|
|
29
29
|
|
|
30
30
|
import {SETTLE_THRESHOLD, type Animator, type MotionCurve} from './animator';
|
|
31
31
|
import {solveDecay} from './decay';
|
|
32
|
+
import {resolveMotion} from './resolveMotion';
|
|
32
33
|
import {solveSpring, toSpring, type SpringDescription} from './spring';
|
|
33
|
-
import {scroll} from './uikit/scroll';
|
|
34
|
+
import {registerScrollTable, scroll} from './uikit/scroll';
|
|
34
35
|
|
|
35
36
|
export interface CoastOptions {
|
|
36
37
|
/** Per-millisecond velocity factor; UIScrollView's normal rate by default. */
|
|
37
38
|
rate?: number;
|
|
38
39
|
/** Edges: a coast crossing one hands its velocity to `bounce`. */
|
|
39
40
|
bounds?: Partial<Record<'x' | 'y', {min: number; max: number}>>;
|
|
40
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* The edge spring; `scroll.bounce` by default, which plays its table value
|
|
43
|
+
* (it is not a motion role: `spec:AST-094` FR4 lists no scroll spring).
|
|
44
|
+
*/
|
|
41
45
|
bounce?: SpringDescription;
|
|
42
46
|
/**
|
|
43
47
|
* The release time on the document timeline (ms, `performance.now()`
|
|
@@ -85,7 +89,10 @@ export function coast(
|
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
91
|
const rate = options.rate ?? scroll.decelerationRate.normal;
|
|
88
|
-
|
|
92
|
+
registerScrollTable();
|
|
93
|
+
const bounce = toSpring(
|
|
94
|
+
resolveMotion(animator.element, options.bounce ?? scroll.bounce),
|
|
95
|
+
);
|
|
89
96
|
const curves: Partial<Record<'x' | 'y', MotionCurve>> = {};
|
|
90
97
|
for (const [key, v0] of Object.entries(velocities) as ['x' | 'y', number][]) {
|
|
91
98
|
const from = animator.get(key, options.at);
|
|
@@ -45,7 +45,11 @@
|
|
|
45
45
|
*/
|
|
46
46
|
|
|
47
47
|
import {defaultIsCoarsePointer, defaultPrefersReducedMotion} from './animator';
|
|
48
|
-
import {
|
|
48
|
+
import {resolveMotion} from './resolveMotion';
|
|
49
|
+
import {
|
|
50
|
+
reducedMotionCrossFade,
|
|
51
|
+
registerReducedMotionCrossFade,
|
|
52
|
+
} from './uikit/timing';
|
|
49
53
|
|
|
50
54
|
/** Reduce Motion on a coarse primary pointer: an opacity-only cross-fade. */
|
|
51
55
|
export const REDUCED_MOTION_FADE_QUERY =
|
|
@@ -86,7 +90,13 @@ export function reducedMotionFade(
|
|
|
86
90
|
if (!fades) {
|
|
87
91
|
return {duration: 0, easing: 'linear'};
|
|
88
92
|
}
|
|
89
|
-
|
|
93
|
+
if (element != null) {
|
|
94
|
+
registerReducedMotionCrossFade();
|
|
95
|
+
}
|
|
96
|
+
const curve =
|
|
97
|
+
element != null
|
|
98
|
+
? resolveMotion(element, reducedMotionCrossFade.curve)
|
|
99
|
+
: reducedMotionCrossFade.curve;
|
|
90
100
|
return {
|
|
91
101
|
duration: reducedMotionCrossFade.durationMs,
|
|
92
102
|
easing: `cubic-bezier(${curve.join(', ')})`,
|
|
@@ -26,11 +26,37 @@ function view(overrides: Partial<ReducedMotionView> = {}): ReducedMotionView {
|
|
|
26
26
|
hasOpacityCurve: false,
|
|
27
27
|
restingOpacity: 1,
|
|
28
28
|
hasPendingLanding: false,
|
|
29
|
+
hasWaitingDip: false,
|
|
29
30
|
...overrides,
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
describe('planReducedMotion', () => {
|
|
35
|
+
it('a call naming the opacity a waiting dip returns to, with no travel, joins that dip', () => {
|
|
36
|
+
const plan = planReducedMotion(
|
|
37
|
+
view({hasPendingLanding: true, hasWaitingDip: true}),
|
|
38
|
+
0,
|
|
39
|
+
{opacity: 1},
|
|
40
|
+
['opacity'],
|
|
41
|
+
true,
|
|
42
|
+
);
|
|
43
|
+
expect(plan.joins).toBe(true);
|
|
44
|
+
expect(plan.atOnce).toEqual([]);
|
|
45
|
+
expect(plan.opacityFade).toBeNull();
|
|
46
|
+
expect(plan.landing).toBeNull();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('a call naming travel, or another opacity, while a dip waits does not join it', () => {
|
|
50
|
+
const waiting = view({hasPendingLanding: true, hasWaitingDip: true});
|
|
51
|
+
expect(
|
|
52
|
+
planReducedMotion(waiting, 0, {opacity: 1, x: 0}, ['opacity', 'x'], true)
|
|
53
|
+
.joins,
|
|
54
|
+
).toBeUndefined();
|
|
55
|
+
expect(
|
|
56
|
+
planReducedMotion(waiting, 0, {opacity: 0.5}, ['opacity'], true).joins,
|
|
57
|
+
).toBeUndefined();
|
|
58
|
+
});
|
|
59
|
+
|
|
34
60
|
it('without a fade (a fine primary pointer), writes everything at once (DR3)', () => {
|
|
35
61
|
const plan = planReducedMotion(
|
|
36
62
|
view(),
|
|
@@ -80,6 +80,8 @@ export interface ReducedMotionView {
|
|
|
80
80
|
readonly restingOpacity: number;
|
|
81
81
|
/** Whether a move of an earlier call still waits to land. */
|
|
82
82
|
readonly hasPendingLanding: boolean;
|
|
83
|
+
/** Whether an earlier dip's fade back in still waits on its landing. */
|
|
84
|
+
readonly hasWaitingDip: boolean;
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
/** What Reduce Motion makes of a call. */
|
|
@@ -93,6 +95,11 @@ export interface ReducedMotionPlan {
|
|
|
93
95
|
readonly landing: PlannedLanding | null;
|
|
94
96
|
/** The stylesheet opacity a dip borrowed (no call owns opacity). */
|
|
95
97
|
readonly borrowed?: number | null;
|
|
98
|
+
/**
|
|
99
|
+
* The call joins the waiting dip: it names the opacity the dip returns to
|
|
100
|
+
* and moves nothing, so the fade goes on as it was.
|
|
101
|
+
*/
|
|
102
|
+
readonly joins?: boolean;
|
|
96
103
|
}
|
|
97
104
|
|
|
98
105
|
/** The opacity no call has changed. */
|
|
@@ -162,7 +169,7 @@ export function planReducedMotion(
|
|
|
162
169
|
// A move still waiting to land (an earlier dip's) lands at this call's
|
|
163
170
|
// invisible moment, never while the element shows.
|
|
164
171
|
const pending = view.hasPendingLanding;
|
|
165
|
-
// Not a
|
|
172
|
+
// Not a role: nothing lengthens it (design:reduced-motion DR4).
|
|
166
173
|
const ms = reducedMotionCrossFade.durationMs;
|
|
167
174
|
const landsLater = (
|
|
168
175
|
at: number,
|
|
@@ -183,6 +190,18 @@ export function planReducedMotion(
|
|
|
183
190
|
: {}),
|
|
184
191
|
};
|
|
185
192
|
};
|
|
193
|
+
// A call that names the opacity a waiting dip returns to, and names no
|
|
194
|
+
// travel, joins that dip: the fade goes on as it was and the call settles
|
|
195
|
+
// when the dip ends. A second dip, opened from where the first had got
|
|
196
|
+
// to, would fade the element out twice.
|
|
197
|
+
if (
|
|
198
|
+
named &&
|
|
199
|
+
view.hasWaitingDip &&
|
|
200
|
+
!properties.some(property => TRAVEL_PROPERTIES.includes(property)) &&
|
|
201
|
+
Math.abs(opacityTo - view.opacityHeading()) < 1e-6
|
|
202
|
+
) {
|
|
203
|
+
return {atOnce: [], opacityFade: null, holds, landing: null, joins: true};
|
|
204
|
+
}
|
|
186
205
|
// Travel lands only while the element is transparent (DR1, DR2): an
|
|
187
206
|
// entrance that starts visible, or an exit that ends visible, dips instead
|
|
188
207
|
// when it has travel or a waiting landing to carry.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file resolveMotion.test.ts
|
|
5
|
+
* @input resolveMotion.ts, the shared UIKit tables, a stubbed computed style
|
|
6
|
+
* @output Proof that, with the per-role tables internal (spec:AST-094
|
|
7
|
+
* DEC-15), a role plays its table value whatever a scope's CSS variable
|
|
8
|
+
* says, reads no style, and leaves values that are not roles alone; and
|
|
9
|
+
* that the animator plays the table's spring
|
|
10
|
+
* @position Testing for /packages/core/src/motion/resolveMotion.ts (the
|
|
11
|
+
* browser proof: animator.interaction.browser.spec.ts)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
|
15
|
+
import {createAnimator} from './animator';
|
|
16
|
+
import {coast} from './coast';
|
|
17
|
+
import {resolveMotion} from './resolveMotion';
|
|
18
|
+
import {solveSpring, toSpring} from './spring';
|
|
19
|
+
import {
|
|
20
|
+
registerSpringsTable,
|
|
21
|
+
registerTimingTable,
|
|
22
|
+
scroll,
|
|
23
|
+
springs,
|
|
24
|
+
timing,
|
|
25
|
+
} from './uikit';
|
|
26
|
+
|
|
27
|
+
// Like a touch module: register the tables these motions resolve from.
|
|
28
|
+
registerSpringsTable();
|
|
29
|
+
registerTimingTable();
|
|
30
|
+
|
|
31
|
+
let reads: number;
|
|
32
|
+
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
reads = 0;
|
|
35
|
+
vi.spyOn(window, 'getComputedStyle').mockImplementation(
|
|
36
|
+
() =>
|
|
37
|
+
({
|
|
38
|
+
getPropertyValue: () => {
|
|
39
|
+
reads += 1;
|
|
40
|
+
return '';
|
|
41
|
+
},
|
|
42
|
+
}) as unknown as CSSStyleDeclaration,
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
vi.restoreAllMocks();
|
|
48
|
+
document.body.innerHTML = '';
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
/** A scope that sets role variables, as a page's own style could. */
|
|
52
|
+
function scoped(values: Record<string, string>) {
|
|
53
|
+
const scope = document.createElement('div');
|
|
54
|
+
scope.setAttribute('data-astryx-theme', 'soft');
|
|
55
|
+
for (const [name, value] of Object.entries(values)) {
|
|
56
|
+
scope.style.setProperty(name, value);
|
|
57
|
+
}
|
|
58
|
+
const child = document.createElement('div');
|
|
59
|
+
scope.append(child);
|
|
60
|
+
document.body.append(scope);
|
|
61
|
+
return child;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
describe('resolveMotion while the per-role tables stay internal (DEC-15)', () => {
|
|
65
|
+
it('plays the table value for a spring, a curve and a duration, whatever a scope sets', () => {
|
|
66
|
+
const child = scoped({
|
|
67
|
+
'--motion-springs-settle': '0.8s 0.3',
|
|
68
|
+
'--motion-timing-curves-move': 'cubic-bezier(0.4, 0, 0.2, 1)',
|
|
69
|
+
'--motion-timing-state-change-ms': '300ms',
|
|
70
|
+
});
|
|
71
|
+
expect(resolveMotion(child, springs.settle)).toBe(springs.settle);
|
|
72
|
+
expect(resolveMotion(child, timing.curves.move)).toBe(timing.curves.move);
|
|
73
|
+
expect(resolveMotion(child, timing, 'stateChangeMs')).toBe(
|
|
74
|
+
timing.stateChangeMs,
|
|
75
|
+
);
|
|
76
|
+
expect(resolveMotion(null, springs.settle)).toBe(springs.settle);
|
|
77
|
+
// No style is read to resolve a role.
|
|
78
|
+
expect(reads).toBe(0);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('leaves values that are not roles alone', () => {
|
|
82
|
+
const inline = {response: 0.4, dampingRatio: 0.9};
|
|
83
|
+
expect(resolveMotion(document.body, inline)).toBe(inline);
|
|
84
|
+
expect(resolveMotion(document.body, springs.sheetPresent)).toBe(
|
|
85
|
+
springs.sheetPresent,
|
|
86
|
+
);
|
|
87
|
+
expect(resolveMotion(document.body, timing.press, 'scrollBrakeMs')).toBe(
|
|
88
|
+
timing.press.scrollBrakeMs,
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('the animator', () => {
|
|
94
|
+
it("plays the table's spring even where a scope sets the role's variable", () => {
|
|
95
|
+
const child = scoped({'--motion-springs-settle': '0.8s 0.3'});
|
|
96
|
+
const animator = createAnimator(child, {now: () => 0});
|
|
97
|
+
animator.set({y: 300});
|
|
98
|
+
animator.animate({y: 0}, {spring: springs.settle}, {at: 0});
|
|
99
|
+
const table = solveSpring(toSpring(springs.settle), {from: 300, to: 0});
|
|
100
|
+
for (const ms of [50, 150, 400]) {
|
|
101
|
+
expect(animator.get('y', ms)).toBeCloseTo(table.value(ms / 1000), 3);
|
|
102
|
+
}
|
|
103
|
+
animator.dispose();
|
|
104
|
+
});
|
|
105
|
+
it('a coast plays the table edge spring whatever a scope sets: scroll.bounce is no role', () => {
|
|
106
|
+
const child = scoped({'--motion-scroll-bounce': '0.8s 0.3'});
|
|
107
|
+
const animator = createAnimator(child, {now: () => 0});
|
|
108
|
+
animator.set({x: 60});
|
|
109
|
+
// Released past the edge: straight back on the edge spring.
|
|
110
|
+
animator.decay(
|
|
111
|
+
coast(animator, {x: 0}, {bounds: {x: {min: -500, max: 0}}, at: 0}),
|
|
112
|
+
{at: 0},
|
|
113
|
+
);
|
|
114
|
+
const expected = solveSpring(toSpring(scroll.bounce), {
|
|
115
|
+
from: 60,
|
|
116
|
+
to: 0,
|
|
117
|
+
});
|
|
118
|
+
for (const ms of [50, 150, 400]) {
|
|
119
|
+
expect(animator.get('x', ms)).toBeCloseTo(expected.value(ms / 1000), 3);
|
|
120
|
+
}
|
|
121
|
+
animator.dispose();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file resolveMotion.ts
|
|
5
|
+
* @input A motion role: a spring or curve of a registered motion table, or a
|
|
6
|
+
* table group and the key of one of its values
|
|
7
|
+
* @output resolveMotion: the role's value
|
|
8
|
+
* @position Motion foundation; the animator resolves every spring and curve
|
|
9
|
+
* it is handed with it, and components resolve the durations they time
|
|
10
|
+
* with it
|
|
11
|
+
*
|
|
12
|
+
* Every touch motion passes through here, so the role a value plays is named
|
|
13
|
+
* in one place. A role plays its table value: the per-role tables stay
|
|
14
|
+
* internal (`spec:AST-094` DEC-15), so nothing reads a role's CSS variable
|
|
15
|
+
* and no page or theme style sets a role. Nothing here reads style or
|
|
16
|
+
* layout, listens or observes, imports a table, or runs on import or on the
|
|
17
|
+
* server.
|
|
18
|
+
*
|
|
19
|
+
* SYNC: When modified, update:
|
|
20
|
+
* - /packages/core/src/motion/resolveMotion.test.ts
|
|
21
|
+
* - /packages/core/src/motion/animator.ts (resolves each role it plays)
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type {MotionCurvePoints} from './roles';
|
|
25
|
+
import type {SpringDescription} from './spring';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A motion role's value: its table value, as the per-role tables stay
|
|
29
|
+
* internal (`spec:AST-094` DEC-15). Hand it a spring or curve of a motion
|
|
30
|
+
* table, or a table group and a key (the way to name a duration, which is a
|
|
31
|
+
* bare number):
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```
|
|
35
|
+
* const spring = resolveMotion(sheet, springs.settle);
|
|
36
|
+
* const fadeMs = resolveMotion(row, timing, 'stateChangeMs');
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* The element names where the motion plays; anything that is not a role
|
|
40
|
+
* comes back unchanged too, so a spring
|
|
41
|
+
* written inline at a call site keeps working.
|
|
42
|
+
*/
|
|
43
|
+
export function resolveMotion<T extends SpringDescription>(
|
|
44
|
+
element: Element | null | undefined,
|
|
45
|
+
spring: T,
|
|
46
|
+
): T | SpringDescription;
|
|
47
|
+
export function resolveMotion(
|
|
48
|
+
element: Element | null | undefined,
|
|
49
|
+
curve: MotionCurvePoints,
|
|
50
|
+
): MotionCurvePoints;
|
|
51
|
+
export function resolveMotion<G extends object, K extends keyof G & string>(
|
|
52
|
+
element: Element | null | undefined,
|
|
53
|
+
group: G,
|
|
54
|
+
key: K,
|
|
55
|
+
): G[K] extends number
|
|
56
|
+
? number
|
|
57
|
+
: G[K] extends MotionCurvePoints
|
|
58
|
+
? MotionCurvePoints
|
|
59
|
+
: G[K] | SpringDescription;
|
|
60
|
+
export function resolveMotion(
|
|
61
|
+
_element: Element | null | undefined,
|
|
62
|
+
leafOrGroup: object,
|
|
63
|
+
key?: string,
|
|
64
|
+
): unknown {
|
|
65
|
+
return key === undefined
|
|
66
|
+
? leafOrGroup
|
|
67
|
+
: (leafOrGroup as Record<string, unknown>)[key];
|
|
68
|
+
}
|
package/src/motion/roleValue.ts
CHANGED
|
@@ -69,7 +69,8 @@ export function short(n: number): string {
|
|
|
69
69
|
* spring: mass folds into the duration, overdamping into a negative bounce);
|
|
70
70
|
* - duration: `250ms`;
|
|
71
71
|
* - curve: `cubic-bezier(0.42, 0, 0.58, 1)`, usable as is in CSS.
|
|
72
|
-
* Throws on a value that is not a valid value of its kind
|
|
72
|
+
* Throws on a value that is not a valid value of its kind, a spring that
|
|
73
|
+
* never settles included.
|
|
73
74
|
*/
|
|
74
75
|
export function formatMotionRoleValue(
|
|
75
76
|
kind: MotionRoleKind,
|
package/src/motion/roles.test.ts
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file roles.test.ts
|
|
5
|
-
* @input roles.ts and the shared UIKit tables (registered
|
|
6
|
-
* @output Proof that
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* @input roles.ts and the shared UIKit tables (registered by this test)
|
|
6
|
+
* @output Proof that the registered roles are exactly the ones spec:AST-094
|
|
7
|
+
* FR4 names, each by its table path; that every other table value, a
|
|
8
|
+
* component's measured spring included, is no role; and that a role's CSS
|
|
9
|
+
* value reads back as the same motion
|
|
9
10
|
* @position Testing for /packages/core/src/motion/roles.ts
|
|
10
11
|
*/
|
|
11
12
|
|
|
@@ -175,6 +176,10 @@ describe('motion roles', () => {
|
|
|
175
176
|
// thresholds and the arbitration timings are not motion roles either.
|
|
176
177
|
expect(motionRoleIn(timing, 'reducedMotionCrossFadeMs')).toBeUndefined();
|
|
177
178
|
expect(motionRoleOf(springs.menuReducedMotion)).toBeUndefined();
|
|
179
|
+
// Nor is the keyboard's motion: it rides the keyboard's own spring and
|
|
180
|
+
// notification duration, not a role (spec:AST-094 FR4).
|
|
181
|
+
expect(motionRoleIn(springs, 'keyboard')).toBeUndefined();
|
|
182
|
+
expect(motionRoleIn(timing, 'keyboardNotificationMs')).toBeUndefined();
|
|
178
183
|
expect(motionRoleIn(timing.press, 'scrollBrakeMs')).toBeUndefined();
|
|
179
184
|
expect(motionRoleIn(scroll, 'delaysContentTouchesMs')).toBeUndefined();
|
|
180
185
|
expect(motionRoleIn(navigation, 'parallax')).toBeUndefined();
|
|
@@ -244,6 +249,18 @@ describe('motion roles', () => {
|
|
|
244
249
|
expect(() => formatMotionRoleValue('spring', {response: 0.5})).toThrow(
|
|
245
250
|
/spring is/,
|
|
246
251
|
);
|
|
252
|
+
// A spring with no damping never settles.
|
|
253
|
+
for (const never of [
|
|
254
|
+
{duration: 0.5, bounce: 1},
|
|
255
|
+
{duration: 0.5, bounce: 1.5},
|
|
256
|
+
{response: 0.5, dampingRatio: 0},
|
|
257
|
+
{mass: 1, stiffness: 100, damping: 0},
|
|
258
|
+
]) {
|
|
259
|
+
expect(() => formatMotionRoleValue('spring', never)).toThrow(
|
|
260
|
+
/must settle/,
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
expect(parseMotionRoleValue('spring', '0.5s 1')).toBeNull();
|
|
247
264
|
expect(parseMotionRoleValue('spring', '')).toBeNull();
|
|
248
265
|
expect(parseMotionRoleValue('spring', 'fast')).toBeNull();
|
|
249
266
|
expect(parseMotionRoleValue('spring', '0.4s 0.2')).toEqual({
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file tableImports.test.ts
|
|
5
|
+
* @input Core's source files and their relative runtime imports
|
|
6
|
+
* @output Fails when a component's import graph reaches a motion table it
|
|
7
|
+
* only reaches through a barrel or a namespace object, when anything imports
|
|
8
|
+
* a table as a namespace object, or when a shared module imports a table
|
|
9
|
+
* that belongs to one component
|
|
10
|
+
* @position Keeps a page to the motion tables it animates with: a namespace
|
|
11
|
+
* object (`export * as uikit`) keeps every table, every register function
|
|
12
|
+
* and the role registry in the bundle of anything that reads one table.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {existsSync, readdirSync, readFileSync, statSync} from 'node:fs';
|
|
16
|
+
import {dirname, join, relative, resolve} from 'node:path';
|
|
17
|
+
import {describe, expect, it} from 'vitest';
|
|
18
|
+
|
|
19
|
+
/** The tables every touch module may share: the animator and gestures read them. */
|
|
20
|
+
const SHARED_TABLES = new Set([
|
|
21
|
+
'motion/uikit/gestures.ts',
|
|
22
|
+
'motion/uikit/navigation.ts',
|
|
23
|
+
'motion/uikit/scroll.ts',
|
|
24
|
+
'motion/uikit/springs.ts',
|
|
25
|
+
'motion/uikit/timing.ts',
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
const BARREL = 'motion/uikit/index.ts';
|
|
29
|
+
|
|
30
|
+
/** A source file of the package, not a test, story or fixture. */
|
|
31
|
+
function isSource(path: string): boolean {
|
|
32
|
+
return (
|
|
33
|
+
/\.(ts|tsx)$/.test(path) &&
|
|
34
|
+
!path.endsWith('.d.ts') &&
|
|
35
|
+
!/(\.test|\.spec|\.stories|\.test-violations)\.tsx?$/.test(path) &&
|
|
36
|
+
!/(^|\/)__tests__\//.test(path)
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** A table: a data module directly under motion/uikit, not the barrel. */
|
|
41
|
+
function isTable(path: string): boolean {
|
|
42
|
+
return (
|
|
43
|
+
/^motion\/uikit\/[^/]+\.ts$/.test(path) &&
|
|
44
|
+
path !== BARREL &&
|
|
45
|
+
isSource(path) &&
|
|
46
|
+
!path.endsWith('.generated.ts')
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** The component a file belongs to (a PascalCase top-level directory), or null. */
|
|
51
|
+
function componentOf(path: string): string | null {
|
|
52
|
+
const top = path.split('/')[0] ?? '';
|
|
53
|
+
return path.includes('/') && /^[A-Z]/.test(top) ? top : null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface Edge {
|
|
57
|
+
readonly to: string;
|
|
58
|
+
readonly namespace: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const IMPORT =
|
|
62
|
+
/(?:^|[\s;])(import|export)\s+(type\s+)?([^'";]*?)\s*from\s*['"](\.{1,2}\/[^'"]+)['"]/g;
|
|
63
|
+
const DYNAMIC = /import\(\s*['"](\.{1,2}\/[^'"]+)['"]\s*\)/g;
|
|
64
|
+
const BARE = /(?:^|[\s;])import\s*['"](\.{1,2}\/[^'"]+)['"]/g;
|
|
65
|
+
|
|
66
|
+
/** The runtime edges of one file; type-only imports load nothing. */
|
|
67
|
+
function edgesOf(
|
|
68
|
+
path: string,
|
|
69
|
+
source: string,
|
|
70
|
+
resolveSpecifier: (from: string, specifier: string) => string | null,
|
|
71
|
+
): Edge[] {
|
|
72
|
+
const edges: Edge[] = [];
|
|
73
|
+
const text = source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/\/\/.*$/gm, '');
|
|
74
|
+
for (const match of text.matchAll(IMPORT)) {
|
|
75
|
+
const [, , typeOnly, clause = '', specifier = ''] = match;
|
|
76
|
+
if (typeOnly != null) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const named = /^\{([\s\S]*)\}$/.exec(clause.trim());
|
|
80
|
+
if (
|
|
81
|
+
named != null &&
|
|
82
|
+
(named[1] ?? '')
|
|
83
|
+
.split(',')
|
|
84
|
+
.map(part => part.trim())
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.every(part => part.startsWith('type '))
|
|
87
|
+
) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const to = resolveSpecifier(path, specifier);
|
|
91
|
+
if (to != null) {
|
|
92
|
+
edges.push({to, namespace: /\*\s+as\s+\w+/.test(clause)});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const pattern of [DYNAMIC, BARE]) {
|
|
96
|
+
for (const match of text.matchAll(pattern)) {
|
|
97
|
+
const to = resolveSpecifier(path, match[1] ?? '');
|
|
98
|
+
if (to != null) {
|
|
99
|
+
edges.push({to, namespace: false});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return edges;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Every leak in a package, given its source files by path (relative to the
|
|
108
|
+
* package's src directory). Pure, so the rule can be checked on a made-up
|
|
109
|
+
* package too.
|
|
110
|
+
*/
|
|
111
|
+
function findTableLeaks(files: ReadonlyMap<string, string>): string[] {
|
|
112
|
+
const resolveSpecifier = (from: string, specifier: string): string | null => {
|
|
113
|
+
const base = join(dirname(from), specifier).replace(/\\/g, '/');
|
|
114
|
+
const stem = base.replace(/\.js$/, '');
|
|
115
|
+
for (const candidate of [
|
|
116
|
+
base,
|
|
117
|
+
`${stem}.ts`,
|
|
118
|
+
`${stem}.tsx`,
|
|
119
|
+
`${stem}/index.ts`,
|
|
120
|
+
`${stem}/index.tsx`,
|
|
121
|
+
]) {
|
|
122
|
+
if (files.has(candidate)) {
|
|
123
|
+
return candidate;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
};
|
|
128
|
+
const graph = new Map<string, Edge[]>();
|
|
129
|
+
for (const [path, source] of files) {
|
|
130
|
+
if (isSource(path)) {
|
|
131
|
+
graph.set(path, edgesOf(path, source, resolveSpecifier));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const leaks: string[] = [];
|
|
136
|
+
for (const [path, edges] of graph) {
|
|
137
|
+
for (const edge of edges) {
|
|
138
|
+
if (edge.namespace && (isTable(edge.to) || edge.to === BARREL)) {
|
|
139
|
+
leaks.push(
|
|
140
|
+
`${path} imports ${edge.to} as a namespace object, which keeps every table it reaches; import the tables by name`,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
if (
|
|
144
|
+
isTable(edge.to) &&
|
|
145
|
+
!SHARED_TABLES.has(edge.to) &&
|
|
146
|
+
componentOf(path) == null &&
|
|
147
|
+
path !== BARREL
|
|
148
|
+
) {
|
|
149
|
+
leaks.push(
|
|
150
|
+
`${path} (shared code) imports ${edge.to}, a component's table; import it in that component's touch module`,
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const entries = [...graph.keys()].filter(path =>
|
|
157
|
+
/^[A-Z][^/]*\/index\.tsx?$/.test(path),
|
|
158
|
+
);
|
|
159
|
+
for (const entry of entries) {
|
|
160
|
+
const reached = new Set<string>([entry]);
|
|
161
|
+
const queue = [entry];
|
|
162
|
+
while (queue.length > 0) {
|
|
163
|
+
const file = queue.pop() as string;
|
|
164
|
+
for (const edge of graph.get(file) ?? []) {
|
|
165
|
+
if (!reached.has(edge.to)) {
|
|
166
|
+
reached.add(edge.to);
|
|
167
|
+
queue.push(edge.to);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (const table of reached) {
|
|
172
|
+
if (!isTable(table) || SHARED_TABLES.has(table)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Reached the way a page needs it: some component file this entry
|
|
176
|
+
// loads imports the table itself.
|
|
177
|
+
const direct = [...reached].some(
|
|
178
|
+
file =>
|
|
179
|
+
componentOf(file) != null &&
|
|
180
|
+
(graph.get(file) ?? []).some(edge => edge.to === table),
|
|
181
|
+
);
|
|
182
|
+
if (!direct) {
|
|
183
|
+
leaks.push(
|
|
184
|
+
`${entry} reaches ${table} only through a barrel or shared module; a component's table must be imported by the component that animates with it`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return leaks;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function readPackage(root: string): Map<string, string> {
|
|
193
|
+
const files = new Map<string, string>();
|
|
194
|
+
const walk = (dir: string) => {
|
|
195
|
+
for (const name of readdirSync(dir)) {
|
|
196
|
+
if (name === 'node_modules' || name.startsWith('.')) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const full = join(dir, name);
|
|
200
|
+
if (statSync(full).isDirectory()) {
|
|
201
|
+
walk(full);
|
|
202
|
+
} else if (/\.(ts|tsx)$/.test(name)) {
|
|
203
|
+
files.set(
|
|
204
|
+
relative(root, full).replace(/\\/g, '/'),
|
|
205
|
+
readFileSync(full, 'utf8'),
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
walk(root);
|
|
211
|
+
return files;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
describe('motion table imports', () => {
|
|
215
|
+
const src = resolve(__dirname, '../..');
|
|
216
|
+
|
|
217
|
+
it('core imports each motion table by name, from the component that animates with it', () => {
|
|
218
|
+
expect(existsSync(join(src, BARREL))).toBe(true);
|
|
219
|
+
expect(findTableLeaks(readPackage(src))).toEqual([]);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('catches a table reached through the barrel, a namespace object or shared code', () => {
|
|
223
|
+
const files = new Map([
|
|
224
|
+
[
|
|
225
|
+
'motion/uikit/index.ts',
|
|
226
|
+
"export {springs} from './springs';\nexport {refresh} from './refresh';\n",
|
|
227
|
+
],
|
|
228
|
+
['motion/uikit/springs.ts', 'export const springs = {};\n'],
|
|
229
|
+
['motion/uikit/refresh.ts', 'export const refresh = {};\n'],
|
|
230
|
+
['motion/uikit/wheel.ts', 'export const wheel = {};\n'],
|
|
231
|
+
[
|
|
232
|
+
'Refresh/index.ts',
|
|
233
|
+
"import {refresh} from '../motion/uikit/refresh';\nexport {refresh};\n",
|
|
234
|
+
],
|
|
235
|
+
[
|
|
236
|
+
'Button/index.ts',
|
|
237
|
+
"import {springs} from '../motion/uikit';\nexport {springs};\n",
|
|
238
|
+
],
|
|
239
|
+
[
|
|
240
|
+
'Picker/index.ts',
|
|
241
|
+
"import * as uikit from '../motion/uikit';\nimport type {Wheel} from '../motion/uikit/wheel';\nexport const p = uikit;\n",
|
|
242
|
+
],
|
|
243
|
+
[
|
|
244
|
+
'motion/animator.ts',
|
|
245
|
+
"import {wheel} from './uikit/wheel';\nexport {wheel};\n",
|
|
246
|
+
],
|
|
247
|
+
[
|
|
248
|
+
'Sheet/index.ts',
|
|
249
|
+
"import {wheel} from '../motion/animator';\nexport {wheel};\n",
|
|
250
|
+
],
|
|
251
|
+
]);
|
|
252
|
+
const leaks = findTableLeaks(files);
|
|
253
|
+
// The barrel re-exports a component's table, so Button reaches it.
|
|
254
|
+
expect(
|
|
255
|
+
leaks.some(leak =>
|
|
256
|
+
leak.startsWith('Button/index.ts reaches motion/uikit/refresh.ts'),
|
|
257
|
+
),
|
|
258
|
+
).toBe(true);
|
|
259
|
+
// A namespace object, and everything it keeps.
|
|
260
|
+
expect(
|
|
261
|
+
leaks.some(leak =>
|
|
262
|
+
leak.startsWith(
|
|
263
|
+
'Picker/index.ts imports motion/uikit/index.ts as a namespace object',
|
|
264
|
+
),
|
|
265
|
+
),
|
|
266
|
+
).toBe(true);
|
|
267
|
+
expect(
|
|
268
|
+
leaks.some(leak =>
|
|
269
|
+
leak.startsWith('Picker/index.ts reaches motion/uikit/refresh.ts'),
|
|
270
|
+
),
|
|
271
|
+
).toBe(true);
|
|
272
|
+
// Shared code importing one component's table, and what that leaks.
|
|
273
|
+
expect(
|
|
274
|
+
leaks.some(leak =>
|
|
275
|
+
leak.startsWith(
|
|
276
|
+
'motion/animator.ts (shared code) imports motion/uikit/wheel.ts',
|
|
277
|
+
),
|
|
278
|
+
),
|
|
279
|
+
).toBe(true);
|
|
280
|
+
expect(
|
|
281
|
+
leaks.some(leak =>
|
|
282
|
+
leak.startsWith('Sheet/index.ts reaches motion/uikit/wheel.ts'),
|
|
283
|
+
),
|
|
284
|
+
).toBe(true);
|
|
285
|
+
// The owner reaching its own table directly is fine; a type import loads nothing.
|
|
286
|
+
expect(leaks.some(leak => leak.startsWith('Refresh/index.ts'))).toBe(false);
|
|
287
|
+
expect(
|
|
288
|
+
leaks.some(leak =>
|
|
289
|
+
leak.includes('Picker/index.ts reaches motion/uikit/wheel.ts'),
|
|
290
|
+
),
|
|
291
|
+
).toBe(false);
|
|
292
|
+
});
|
|
293
|
+
});
|