@astryxdesign/core 0.7.6-canary.f73623d → 0.7.6-canary.f77aaf2
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/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +0 -6
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +2 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +6 -2
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +36 -9
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +1 -1
- package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
- package/dist/BottomSheet/useMobileKeyboard.js +44 -8
- package/dist/BottomSheet/useSheetGestures.d.ts +36 -6
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +67 -10
- package/dist/Breadcrumbs/BreadcrumbItem.js +4 -2
- package/dist/Center/Center.d.ts +1 -1
- package/dist/Center/Center.js +1 -1
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +10 -5
- package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
- package/dist/Chat/ChatComposerDrawer.js +1 -1
- package/dist/Chat/ChatComposerInput.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +1 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +3 -1
- package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
- package/dist/Chat/ChatPastedTextToken.js +15 -4
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +2 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +5 -2
- package/dist/CheckboxList/CheckboxListContext.d.ts +8 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +5 -2
- package/dist/Code/Code.d.ts +1 -1
- package/dist/Code/Code.js +1 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +8 -5
- package/dist/ComplexSelector/ComplexSelector.d.ts +2 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +7 -2
- package/dist/DateInput/DateInput.d.ts +3 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +17 -18
- package/dist/DateRangeInput/DateRangeInput.d.ts +3 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +8 -4
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +10 -15
- package/dist/Drawer/Drawer.d.ts +1 -1
- package/dist/Drawer/Drawer.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +19 -8
- package/dist/DropdownMenu/DropdownMenuGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuGroup.js +2 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +9 -3
- package/dist/Field/Field.d.ts +2 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +19 -2
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +10 -5
- package/dist/Field/fieldStatusPlacement.d.ts +15 -0
- package/dist/Field/fieldStatusPlacement.d.ts.map +1 -0
- package/dist/Field/fieldStatusPlacement.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +16 -28
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +25 -3
- package/dist/FieldStatus/index.d.ts +7 -0
- package/dist/FieldStatus/index.d.ts.map +1 -1
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +86 -35
- package/dist/Item/Item.js +5 -5
- package/dist/Item/ItemSwipeLayer.d.ts.map +1 -1
- package/dist/Item/ItemSwipeLayer.js +8 -2
- package/dist/Layer/useTouchTrigger.d.ts +35 -3
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +80 -11
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +10 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +1 -0
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +2 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +2 -1
- package/dist/MultiSelector/MultiSelector.d.ts +2 -2
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +35 -25
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +4 -2
- package/dist/NumberInput/NumberInput.d.ts +3 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +11 -15
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +2 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Popover/Popover.js +2 -2
- package/dist/Popover/usePopover.d.ts +7 -1
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts +3 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +4 -2
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +7 -2
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +8 -2
- package/dist/RadioList/RadioListReasonContext.d.ts +2 -0
- package/dist/RadioList/RadioListReasonContext.d.ts.map +1 -0
- package/dist/RadioList/RadioListReasonContext.js +22 -0
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +53 -10
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +22 -5
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +16 -3
- package/dist/Selector/Selector.d.ts +3 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +14 -8
- package/dist/Selector/hooks.js +2 -2
- package/dist/Selector/useSelectorPresentation.d.ts +7 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +2 -1
- package/dist/SideNav/railMotion.d.ts +5 -5
- package/dist/SideNav/railMotion.d.ts.map +1 -1
- package/dist/SideNav/railMotion.js +69 -177
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +100 -17
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +7 -6
- package/dist/Table/glidingDivider.d.ts +8 -1
- package/dist/Table/glidingDivider.d.ts.map +1 -1
- package/dist/Table/glidingDivider.js +8 -3
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -2
- package/dist/TextArea/TextArea.d.ts +2 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextInput/TextInput.d.ts +3 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.d.ts +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/Timer/Timer.js +1 -1
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +8 -2
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +11 -3
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +15 -0
- package/dist/Tokenizer/Tokenizer.d.ts +3 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +73 -50
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +9 -15
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +4 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +6 -3
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +4 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +262 -43
- package/dist/Typeahead/Typeahead.d.ts +3 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +36 -10
- package/dist/Typeahead/index.d.ts +1 -1
- package/dist/Typeahead/index.d.ts.map +1 -1
- package/dist/Typeahead/types.d.ts +26 -3
- package/dist/Typeahead/types.d.ts.map +1 -1
- package/dist/astryx.css +1 -2
- package/dist/gestures/haptics.d.ts.map +1 -1
- package/dist/gestures/haptics.js +1 -5
- package/dist/hooks/menuPressMarker.d.ts +13 -0
- package/dist/hooks/menuPressMarker.d.ts.map +1 -0
- package/dist/hooks/menuPressMarker.js +15 -0
- package/dist/hooks/useClickableContainer.d.ts +24 -4
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +41 -14
- package/dist/hooks/useFocusReturnVisibility.d.ts +8 -1
- package/dist/hooks/useFocusReturnVisibility.d.ts.map +1 -1
- package/dist/hooks/useFocusReturnVisibility.js +14 -8
- package/dist/hooks/useInputStatusIcon.d.ts +2 -2
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +1 -2
- package/dist/hooks/useListFocus.d.ts +19 -0
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +26 -1
- package/dist/hooks/useMenuPress.d.ts +2 -2
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +5 -6
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +13 -5
- package/dist/hooks/useTypeahead.d.ts +3 -1
- package/dist/hooks/useTypeahead.d.ts.map +1 -1
- package/dist/hooks/useTypeahead.js +21 -15
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +6 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +6 -0
- package/dist/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/animatedLayout.d.ts +130 -5
- package/dist/motion/animatedLayout.d.ts.map +1 -1
- package/dist/motion/animatedLayout.js +771 -44
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +38 -2
- package/dist/privateAttributes/segmentDisabled.stylex.d.ts +5 -0
- package/dist/privateAttributes/segmentDisabled.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/segmentDisabled.stylex.js +28 -0
- package/dist/theme/Theme.d.ts +10 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +8 -4
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +7 -1
- package/dist/utils/focusReturn.d.ts +5 -3
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +6 -4
- package/dist/utils/getNodeText.d.ts.map +1 -1
- package/dist/utils/getNodeText.js +2 -1
- package/dist/utils/interactionModality.d.ts +78 -7
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +125 -42
- package/dist/utils/pressDisabled.d.ts +21 -0
- package/dist/utils/pressDisabled.d.ts.map +1 -0
- package/dist/utils/pressDisabled.js +32 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +5 -3
- package/dist/utils/typeaheadMatch.d.ts +24 -0
- package/dist/utils/typeaheadMatch.d.ts.map +1 -0
- package/dist/utils/typeaheadMatch.js +112 -0
- package/locales/en.json +25 -1
- package/locales/pseudo.json +18 -0
- package/package.json +19 -5
- package/src/AppShell/AppShell.tsx +0 -9
- package/src/Badge/Badge.tsx +2 -1
- package/src/BottomSheet/BottomSheet.tsx +4 -2
- package/src/BottomSheet/BottomSheetPanel.tsx +39 -8
- package/src/BottomSheet/BottomSheetSwitcher.tsx +1 -1
- package/src/BottomSheet/useMobileKeyboard.ts +51 -10
- package/src/BottomSheet/useSheetGestures.ts +92 -15
- package/src/Breadcrumbs/BreadcrumbItem.tsx +2 -1
- package/src/Center/Center.tsx +1 -1
- package/src/Chat/ChatComposer.tsx +7 -10
- package/src/Chat/ChatComposerDrawer.tsx +1 -1
- package/src/Chat/ChatComposerInput.tsx +1 -1
- package/src/Chat/ChatLayout.tsx +1 -6
- package/src/Chat/ChatMessageList.tsx +1 -0
- package/src/Chat/ChatPastedTextToken.tsx +14 -4
- package/src/Chat/ChatSystemMessage.tsx +4 -1
- package/src/Chat/ChatToolCalls.tsx +5 -0
- package/src/CheckboxList/CheckboxList.tsx +7 -1
- package/src/CheckboxList/CheckboxListContext.tsx +8 -0
- package/src/CheckboxList/CheckboxListItem.tsx +8 -2
- package/src/Code/Code.tsx +1 -1
- package/src/CommandPalette/CommandPaletteInput.tsx +5 -8
- package/src/ComplexSelector/ComplexSelector.tsx +22 -4
- package/src/DateInput/DateInput.tsx +2 -2
- package/src/DateInput/MonthScroller.tsx +15 -17
- package/src/DateRangeInput/DateRangeInput.tsx +20 -5
- package/src/Dialog/Dialog.tsx +9 -25
- package/src/Drawer/Drawer.tsx +1 -1
- package/src/DropdownMenu/DropdownMenu.tsx +24 -9
- package/src/DropdownMenu/DropdownMenuGroup.tsx +2 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +3 -1
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -3
- package/src/Field/Field.doc.mjs +2 -1
- package/src/Field/Field.tsx +2 -2
- package/src/Field/FieldLabel.doc.mjs +4 -2
- package/src/Field/FieldLabel.tsx +18 -2
- package/src/Field/PanelSearchInput.tsx +7 -8
- package/src/Field/fieldStatusPlacement.ts +18 -0
- package/src/FieldStatus/FieldStatus.tsx +33 -3
- package/src/FieldStatus/index.ts +7 -0
- package/src/FileInput/FileInput.doc.mjs +3 -3
- package/src/FileInput/FileInput.tsx +103 -36
- package/src/HoverCard/HoverCard.doc.mjs +3 -3
- package/src/HoverCard/useHoverCard.doc.mjs +1 -1
- package/src/Item/Item.tsx +5 -5
- package/src/Item/ItemSwipeLayer.tsx +8 -1
- package/src/Layer/useTouchTrigger.ts +107 -18
- package/src/Link/Link.tsx +9 -2
- package/src/Markdown/Markdown.tsx +1 -0
- package/src/MetadataList/MetadataList.tsx +4 -2
- package/src/MetadataList/MetadataListItem.tsx +2 -1
- package/src/MultiSelector/MultiSelector.tsx +57 -36
- package/src/MultiSelector/hooks.ts +7 -5
- package/src/NumberInput/NumberInput.tsx +13 -20
- package/src/OverflowList/OverflowList.tsx +2 -1
- package/src/Pagination/Pagination.tsx +1 -0
- package/src/Popover/Popover.tsx +2 -2
- package/src/Popover/usePopover.tsx +7 -2
- package/src/PowerSearch/PowerSearch.tsx +4 -2
- package/src/RadioList/RadioList.tsx +13 -2
- package/src/RadioList/RadioListItem.tsx +9 -1
- package/src/RadioList/RadioListReasonContext.ts +25 -0
- package/src/Resizable/useResizable.ts +50 -7
- package/src/SegmentedControl/SegmentedControl.tsx +43 -8
- package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +12 -1
- package/src/Selector/Selector.tsx +23 -9
- package/src/Selector/hooks.ts +2 -2
- package/src/Selector/useSelectorPresentation.ts +8 -1
- package/src/SideNav/railMotion.ts +73 -179
- package/src/Slider/Slider.tsx +116 -19
- package/src/Table/BaseTable.tsx +10 -6
- package/src/Table/glidingDivider.ts +8 -3
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/TextArea/TextArea.tsx +3 -2
- package/src/TextInput/TextInput.tsx +2 -2
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timer/Timer.tsx +1 -1
- package/src/Toast/useToast.tsx +8 -3
- package/src/ToggleButton/ToggleButton.tsx +10 -3
- package/src/Token/Token.tsx +15 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +12 -8
- package/src/Tokenizer/Tokenizer.tsx +81 -53
- package/src/Tokenizer/TokenizerBottomSheet.tsx +9 -15
- package/src/Tooltip/Tooltip.doc.mjs +3 -3
- package/src/Tooltip/useTooltip.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenu.tsx +4 -3
- package/src/TreeList/TreeList.tsx +6 -3
- package/src/TreeList/TreeListItem.tsx +5 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +7 -4
- package/src/Typeahead/BaseTypeahead.tsx +314 -40
- package/src/Typeahead/Typeahead.doc.mjs +21 -4
- package/src/Typeahead/Typeahead.tsx +42 -11
- package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
- package/src/Typeahead/index.ts +1 -1
- package/src/Typeahead/types.ts +27 -3
- package/src/gestures/haptics.ts +1 -8
- package/src/hooks/menuPressMarker.ts +15 -0
- package/src/hooks/useClickableContainer.ts +48 -17
- package/src/hooks/useFocusReturnVisibility.ts +15 -12
- package/src/hooks/useInputStatusIcon.tsx +2 -2
- package/src/hooks/useListFocus.ts +38 -1
- package/src/hooks/useMenuPress.ts +5 -5
- package/src/hooks/useTreeFocus.doc.mjs +2 -2
- package/src/hooks/useTreeFocus.ts +16 -10
- package/src/hooks/useTypeahead.doc.mjs +2 -2
- package/src/hooks/useTypeahead.ts +21 -20
- package/src/i18n/generated-locales/en.generated.ts +8 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +8 -0
- package/src/i18n/useListFormatter.ts +42 -0
- package/src/motion/animatedLayout.ts +977 -45
- package/src/motion/animator.ts +55 -2
- package/src/privateAttributes/segmentDisabled.stylex.ts +28 -0
- package/src/theme/Theme.tsx +8 -4
- package/src/theme/useTheme.ts +6 -1
- package/src/utils/focusReturn.ts +6 -4
- package/src/utils/getNodeText.ts +2 -1
- package/src/utils/interactionModality.ts +165 -44
- package/src/utils/pressDisabled.ts +32 -0
- package/src/utils/pressFeedback.ts +5 -3
- package/src/utils/typeaheadMatch.ts +141 -0
- package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.d.ts +0 -2
- package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.js +0 -132
- package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts +0 -2
- package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.js +0 -78
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts +0 -2
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +0 -66
- package/dist/List/ListMarkers.a11y.chromium.spec.d.ts +0 -2
- package/dist/List/ListMarkers.a11y.chromium.spec.js +0 -677
- package/dist/Markdown/Markdown.fr23.bench.d.ts +0 -2
- package/dist/Markdown/Markdown.fr23.bench.d.ts.map +0 -1
- package/dist/Markdown/Markdown.fr23.bench.js +0 -152
- package/dist/Markdown/MarkdownTable.a11y.chromium.spec.d.ts +0 -2
- package/dist/Markdown/MarkdownTable.a11y.chromium.spec.js +0 -590
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.d.ts +0 -2
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +0 -657
- package/dist/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.d.ts +0 -2
- package/dist/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.js +0 -153
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.d.ts +0 -2
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +0 -117
- package/dist/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.d.ts +0 -2
- package/dist/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.js +0 -49
- package/dist/MultiSelector/OptionActions.a11y.chromium.spec.d.ts +0 -2
- package/dist/MultiSelector/OptionActions.a11y.chromium.spec.js +0 -273
- package/dist/Outline/OutlineFocus.a11y.chromium.spec.d.ts +0 -2
- package/dist/Outline/OutlineFocus.a11y.chromium.spec.js +0 -421
- package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.d.ts +0 -2
- package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.js +0 -118
- package/dist/reset.a11y.chromium.spec.d.ts +0 -2
- package/dist/reset.a11y.chromium.spec.js +0 -231
- package/dist/reset.until-found.a11y.browser.spec.d.ts +0 -2
- package/dist/reset.until-found.a11y.browser.spec.js +0 -72
- package/src/AlertDialog/AlertDialog.spec.md +0 -259
- package/src/AlertDialog/AlertDialog.test.tsx +0 -519
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +0 -128
- package/src/AlertDialog/__tests__/AlertDialog.a11y.renders.tsx +0 -52
- package/src/AlertDialog/__tests__/AlertDialog.a11y.states.ts +0 -68
- package/src/AlertDialog/__tests__/AlertDialog.a11y.test.tsx +0 -144
- package/src/AlertDialog/useImperativeAlertDialog.test.tsx +0 -163
- package/src/AppShell/AppShell.spec.md +0 -331
- package/src/AppShell/AppShell.test.tsx +0 -1310
- package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +0 -534
- package/src/AppShell/observeMainOverflow.test.ts +0 -173
- package/src/AspectRatio/AspectRatio.spec.md +0 -179
- package/src/AspectRatio/AspectRatio.test.tsx +0 -398
- package/src/AspectRatio/__tests__/AspectRatioFitLayers.a11y.browser.spec.ts +0 -158
- package/src/Avatar/Avatar.spec.md +0 -253
- package/src/Avatar/Avatar.test.tsx +0 -867
- package/src/Avatar/AvatarStatusDot.spec.md +0 -208
- package/src/Avatar/AvatarStatusDot.test.tsx +0 -306
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +0 -126
- package/src/AvatarGroup/AvatarGroup.spec.md +0 -205
- package/src/AvatarGroup/AvatarGroup.test.tsx +0 -313
- package/src/AvatarGroup/AvatarGroupOverflow.spec.md +0 -210
- package/src/AvatarGroup/AvatarGroupOverflow.test.tsx +0 -263
- package/src/Badge/Badge.spec.md +0 -207
- package/src/Badge/Badge.test.tsx +0 -125
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +0 -260
- package/src/Banner/Banner.spec.md +0 -282
- package/src/Banner/Banner.test.tsx +0 -879
- package/src/Blockquote/Blockquote.spec.md +0 -171
- package/src/Blockquote/Blockquote.test.tsx +0 -121
- package/src/BottomSheet/BottomSheet.spec.md +0 -457
- package/src/BottomSheet/BottomSheet.test.tsx +0 -3154
- package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +0 -248
- package/src/BottomSheet/BottomSheetKeyboard.test.tsx +0 -195
- package/src/BottomSheet/BottomSheetPanel.test.tsx +0 -549
- package/src/BottomSheet/BottomSheetReplace.test.tsx +0 -1638
- package/src/BottomSheet/BottomSheetStacking.announce.test.tsx +0 -246
- package/src/BottomSheet/BottomSheetStacking.test.tsx +0 -3184
- package/src/BottomSheet/BottomSheetSwitcher.spec.md +0 -367
- package/src/BottomSheet/BottomSheetSwitcher.test.tsx +0 -2010
- package/src/BottomSheet/__tests__/BottomSheetDrag.a11y.chromium.spec.ts +0 -129
- package/src/BottomSheet/__tests__/BottomSheetFocusReturn.a11y.browser.spec.ts +0 -97
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +0 -415
- package/src/BottomSheet/__tests__/BottomSheetNativeModal.a11y.browser.spec.ts +0 -462
- package/src/BottomSheet/__tests__/BottomSheetPinchZoom.a11y.chromium.spec.ts +0 -247
- package/src/BottomSheet/__tests__/BottomSheetToastOutlet.a11y.chromium.spec.ts +0 -83
- package/src/BottomSheet/snapOffsets.test.ts +0 -254
- package/src/BottomSheet/useSheetGestures.test.ts +0 -1690
- package/src/Breadcrumbs/BreadcrumbItem.spec.md +0 -269
- package/src/Breadcrumbs/Breadcrumbs.spec.md +0 -165
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +0 -921
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +0 -132
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.renders.tsx +0 -45
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.states.ts +0 -81
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.test.tsx +0 -125
- package/src/Button/Button.spec.md +0 -322
- package/src/Button/Button.test.tsx +0 -864
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +0 -355
- package/src/Button/__tests__/Button.a11y.harnesses.tsx +0 -47
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -25
- package/src/Button/__tests__/Button.a11y.renders.tsx +0 -139
- package/src/Button/__tests__/Button.a11y.states.ts +0 -317
- package/src/Button/__tests__/Button.a11y.test.tsx +0 -187
- package/src/ButtonGroup/ButtonGroup.spec.md +0 -220
- package/src/ButtonGroup/ButtonGroup.test.tsx +0 -1025
- package/src/Calendar/Calendar.spec.md +0 -248
- package/src/Calendar/Calendar.test.tsx +0 -2186
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +0 -141
- package/src/Calendar/__tests__/Calendar.a11y.known-failures.ts +0 -12
- package/src/Calendar/__tests__/Calendar.a11y.renders.tsx +0 -57
- package/src/Calendar/__tests__/Calendar.a11y.states.ts +0 -139
- package/src/Calendar/__tests__/Calendar.a11y.test.tsx +0 -137
- package/src/Calendar/dayCellUtils.test.ts +0 -520
- package/src/Calendar/getInitialFocusDate.test.ts +0 -94
- package/src/Calendar/getStandaloneShortWeekdayNames.test.ts +0 -54
- package/src/Calendar/hooks/useCalendarConstraints.test.ts +0 -153
- package/src/Calendar/hooks/useCalendarDays.test.ts +0 -265
- package/src/Calendar/hooks/useCalendarNavigation.test.ts +0 -252
- package/src/Card/Card.spec.md +0 -205
- package/src/Card/Card.test.tsx +0 -202
- package/src/Carousel/Carousel.spec.md +0 -146
- package/src/Carousel/Carousel.test.tsx +0 -1036
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +0 -207
- package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +0 -12
- package/src/Carousel/__tests__/Carousel.a11y.renders.tsx +0 -39
- package/src/Carousel/__tests__/Carousel.a11y.states.ts +0 -139
- package/src/Carousel/__tests__/Carousel.a11y.test.tsx +0 -127
- package/src/Center/Center.spec.md +0 -205
- package/src/Center/Center.test.tsx +0 -406
- package/src/Chat/ChatComposer.spec.md +0 -246
- package/src/Chat/ChatComposer.test.tsx +0 -364
- package/src/Chat/ChatComposerDrawer.spec.md +0 -267
- package/src/Chat/ChatComposerDrawer.test.tsx +0 -130
- package/src/Chat/ChatComposerInput.spec.md +0 -224
- package/src/Chat/ChatComposerInput.test.tsx +0 -2136
- package/src/Chat/ChatComposerTokenElement.spec.md +0 -164
- package/src/Chat/ChatComposerTokenElement.test.tsx +0 -85
- package/src/Chat/ChatDictationButton.spec.md +0 -205
- package/src/Chat/ChatDictationButton.test.tsx +0 -108
- package/src/Chat/ChatLayout.spec.md +0 -276
- package/src/Chat/ChatLayout.test.tsx +0 -311
- package/src/Chat/ChatLayoutScrollButton.spec.md +0 -322
- package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -99
- package/src/Chat/ChatMessage.spec.md +0 -265
- package/src/Chat/ChatMessage.test.tsx +0 -344
- package/src/Chat/ChatMessageBubble.spec.md +0 -263
- package/src/Chat/ChatMessageBubble.test.tsx +0 -294
- package/src/Chat/ChatMessageList.spec.md +0 -222
- package/src/Chat/ChatMessageList.test.tsx +0 -198
- package/src/Chat/ChatMessageMetadata.spec.md +0 -220
- package/src/Chat/ChatMessageMetadata.test.tsx +0 -66
- package/src/Chat/ChatPastedTextToken.test.tsx +0 -71
- package/src/Chat/ChatSendButton.spec.md +0 -238
- package/src/Chat/ChatSendButton.test.tsx +0 -309
- package/src/Chat/ChatSystemMessage.spec.md +0 -224
- package/src/Chat/ChatSystemMessage.test.tsx +0 -189
- package/src/Chat/ChatTokenizedText.spec.md +0 -190
- package/src/Chat/ChatTokenizedText.test.tsx +0 -163
- package/src/Chat/ChatToolCalls.spec.md +0 -194
- package/src/Chat/ChatToolCalls.test.tsx +0 -413
- package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +0 -577
- package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +0 -740
- package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +0 -457
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +0 -91
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +0 -91
- package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +0 -465
- package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +0 -416
- package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +0 -1523
- package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +0 -1004
- package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +0 -574
- package/src/Chat/__tests__/useChatStreamScroll.a11y.chromium.spec.ts +0 -263
- package/src/Chat/__tests__/useChatStreamScroll.fixture.tsx +0 -61
- package/src/Chat/useChatDictation.test.tsx +0 -369
- package/src/Chat/useChatNewMessages.test.tsx +0 -209
- package/src/Chat/useChatPasteAsToken.test.ts +0 -191
- package/src/Chat/useChatStreamScroll.test.tsx +0 -381
- package/src/Chat/useTriggerMenu.test.tsx +0 -994
- package/src/CheckboxInput/CheckboxInput.spec.md +0 -218
- package/src/CheckboxInput/CheckboxInput.test.tsx +0 -926
- package/src/CheckboxInput/__tests__/Checkbox.a11y.chromium.spec.ts +0 -354
- package/src/CheckboxInput/__tests__/Checkbox.a11y.known-failures.ts +0 -54
- package/src/CheckboxInput/__tests__/Checkbox.a11y.renders.tsx +0 -310
- package/src/CheckboxInput/__tests__/Checkbox.a11y.states.ts +0 -404
- package/src/CheckboxInput/__tests__/Checkbox.a11y.test.tsx +0 -128
- package/src/CheckboxList/CheckboxList.fr10.test.tsx +0 -51
- package/src/CheckboxList/CheckboxList.spec.md +0 -332
- package/src/CheckboxList/CheckboxList.test.tsx +0 -1159
- package/src/CheckboxList/CheckboxListItem.spec.md +0 -302
- package/src/CheckboxList/__tests__/CheckboxList.a11y.chromium.spec.ts +0 -1998
- package/src/Citation/Citation.spec.md +0 -179
- package/src/Citation/Citation.test.tsx +0 -361
- package/src/ClickableCard/ClickableCard.spec.md +0 -241
- package/src/ClickableCard/ClickableCard.test.tsx +0 -382
- package/src/Code/Code.spec.md +0 -170
- package/src/Code/Code.test.tsx +0 -75
- package/src/CodeBlock/CodeBlock.highlightStyles.test.tsx +0 -87
- package/src/CodeBlock/CodeBlock.spec.md +0 -243
- package/src/CodeBlock/CodeBlock.test.tsx +0 -752
- package/src/CodeBlock/CodeLanguage.test.tsx +0 -173
- package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +0 -325
- package/src/CodeBlock/__tests__/CodeBlockLanguages.a11y.chromium.spec.ts +0 -64
- package/src/CodeBlock/__tests__/CodeBlockOverflowStop.a11y.chromium.spec.ts +0 -126
- package/src/CodeBlock/__tests__/DiffRowPaint.a11y.chromium.spec.ts +0 -94
- package/src/CodeBlock/highlightRanges.test.ts +0 -253
- package/src/CodeBlock/languages.test.ts +0 -402
- package/src/CodeBlock/tokenizer.test.ts +0 -280
- package/src/CodeBlock/tokenizerBudget.test.ts +0 -112
- package/src/Collapsible/Collapsible.spec.md +0 -247
- package/src/Collapsible/Collapsible.test.tsx +0 -620
- package/src/Collapsible/CollapsibleGroup.spec.md +0 -229
- package/src/Collapsible/CollapsibleGroup.test.tsx +0 -656
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +0 -194
- package/src/Collapsible/__tests__/Collapsible.a11y.states.ts +0 -117
- package/src/Collapsible/__tests__/Collapsible.a11y.test.tsx +0 -140
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.chromium.spec.ts +0 -559
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.renders.tsx +0 -45
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.states.ts +0 -139
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.test.tsx +0 -135
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +0 -141
- package/src/Collapsible/useCollapsible.test.tsx +0 -236
- package/src/CommandPalette/CommandPalette.perf.test.ts +0 -100
- package/src/CommandPalette/CommandPalette.spec.md +0 -278
- package/src/CommandPalette/CommandPalette.test.tsx +0 -750
- package/src/CommandPalette/CommandPaletteEmpty.spec.md +0 -190
- package/src/CommandPalette/CommandPaletteEmpty.test.tsx +0 -101
- package/src/CommandPalette/CommandPaletteFooter.test.tsx +0 -122
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +0 -129
- package/src/CommandPalette/CommandPaletteInput.spec.md +0 -215
- package/src/CommandPalette/CommandPaletteInput.test.tsx +0 -539
- package/src/CommandPalette/CommandPaletteItem.spec.md +0 -223
- package/src/CommandPalette/CommandPaletteItem.test.tsx +0 -417
- package/src/CommandPalette/CommandPaletteList.spec.md +0 -194
- package/src/CommandPalette/CommandPaletteList.test.tsx +0 -184
- package/src/CommandPalette/__tests__/CommandPalette.a11y.chromium.spec.ts +0 -600
- package/src/CommandPalette/__tests__/CommandPaletteEmptyAudit.a11y.chromium.spec.ts +0 -715
- package/src/CommandPalette/__tests__/CommandPaletteFooter.a11y.chromium.spec.ts +0 -582
- package/src/CommandPalette/__tests__/CommandPaletteInputAudit.a11y.chromium.spec.ts +0 -336
- package/src/CommandPalette/__tests__/CommandPaletteItemAudit.a11y.chromium.spec.ts +0 -523
- package/src/ComplexSelector/ComplexSelector.focusableDisabled.test.tsx +0 -76
- package/src/ComplexSelector/ComplexSelector.fr10.test.tsx +0 -262
- package/src/ComplexSelector/ComplexSelector.spec.md +0 -266
- package/src/ComplexSelector/ComplexSelector.test.tsx +0 -1171
- package/src/ComplexSelector/__tests__/ComplexSelector.a11y.chromium.spec.ts +0 -965
- package/src/ContextMenu/ContextMenu.spec.md +0 -279
- package/src/ContextMenu/ContextMenu.test.tsx +0 -1617
- package/src/ContextMenu/ContextMenu.triggerProps.test.tsx +0 -54
- package/src/ContextMenu/ContextMenuItem.spec.md +0 -132
- package/src/ContextMenu/__tests__/ContextMenuAudit.a11y.chromium.spec.ts +0 -439
- package/src/ContextMenu/__tests__/ContextMenuCursorAnchor.a11y.browser.spec.ts +0 -154
- package/src/ContextMenu/__tests__/ContextMenuLongPress.a11y.chromium.spec.ts +0 -117
- package/src/DateInput/DateInput.fr10.test.tsx +0 -283
- package/src/DateInput/DateInput.spec.md +0 -319
- package/src/DateInput/DateInput.test.tsx +0 -1571
- package/src/DateInput/DateInputTouch.test.tsx +0 -2948
- package/src/DateInput/MonthScrollerSettle.test.tsx +0 -165
- package/src/DateInput/NativeDateField.test.tsx +0 -741
- package/src/DateInput/Presentation.test.tsx +0 -121
- package/src/DateInput/__tests__/DateInputAudit.a11y.chromium.spec.ts +0 -577
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +0 -312
- package/src/DateInput/__tests__/WheelPinchZoom.a11y.chromium.spec.ts +0 -171
- package/src/DateRangeInput/DateRangeInput.fr10.test.tsx +0 -165
- package/src/DateRangeInput/DateRangeInput.spec.md +0 -203
- package/src/DateRangeInput/DateRangeInput.test.tsx +0 -1151
- package/src/DateTimeInput/DateTimeInput.fr10.test.tsx +0 -319
- package/src/DateTimeInput/DateTimeInput.spec.md +0 -270
- package/src/DateTimeInput/DateTimeInput.test.tsx +0 -2656
- package/src/DateTimeInput/DateTimeInputTouch.test.tsx +0 -1071
- package/src/DateTimeInput/NativePickerSegments.test.tsx +0 -657
- package/src/DateTimeInput/Presentation.test.tsx +0 -89
- package/src/Dialog/Dialog.source-build.test.mjs +0 -43
- package/src/Dialog/Dialog.spec.md +0 -189
- package/src/Dialog/Dialog.test.tsx +0 -1599
- package/src/Dialog/DialogHeader.test.tsx +0 -477
- package/src/Dialog/__tests__/Dialog.a11y.browser.spec.ts +0 -111
- package/src/Dialog/__tests__/Dialog.a11y.chromium.spec.ts +0 -218
- package/src/Dialog/__tests__/Dialog.a11y.known-failures.ts +0 -28
- package/src/Dialog/__tests__/Dialog.a11y.renders.tsx +0 -107
- package/src/Dialog/__tests__/Dialog.a11y.states.ts +0 -104
- package/src/Dialog/__tests__/Dialog.a11y.test.tsx +0 -102
- package/src/Dialog/__tests__/Dialog.reduced-motion.a11y.browser.spec.ts +0 -252
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +0 -202
- package/src/Dialog/modules/DialogHeader.spec.md +0 -211
- package/src/Dialog/useImperativeDialog.test.tsx +0 -78
- package/src/Divider/Divider.spec.md +0 -252
- package/src/Divider/Divider.test.tsx +0 -155
- package/src/Drawer/Drawer.spec.md +0 -388
- package/src/Drawer/Drawer.test.tsx +0 -1335
- package/src/Drawer/DrawerDirection.test.tsx +0 -127
- package/src/Drawer/DrawerHeader.spec.md +0 -181
- package/src/Drawer/DrawerHeader.test.tsx +0 -102
- package/src/Drawer/__tests__/DrawerAudit.a11y.chromium.spec.ts +0 -402
- package/src/Drawer/__tests__/DrawerHeaderAudit.a11y.chromium.spec.ts +0 -298
- package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +0 -267
- package/src/DropdownMenu/DropdownMenu.spec.md +0 -562
- package/src/DropdownMenu/DropdownMenu.ssr.test.tsx +0 -93
- package/src/DropdownMenu/DropdownMenu.test.tsx +0 -4498
- package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +0 -192
- package/src/DropdownMenu/DropdownMenuContext.public.test.ts +0 -22
- package/src/DropdownMenu/DropdownMenuDivider.spec.md +0 -186
- package/src/DropdownMenu/DropdownMenuGroup.spec.md +0 -145
- package/src/DropdownMenu/DropdownMenuItem.spec.md +0 -215
- package/src/DropdownMenu/DropdownMenuLazySheet.test.tsx +0 -126
- package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +0 -187
- package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +0 -227
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +0 -635
- package/src/DropdownMenu/DropdownMenuSheetFirstOpen.test.tsx +0 -72
- package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +0 -231
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +0 -2442
- package/src/DropdownMenu/__tests__/DropdownMenuDividerAudit.a11y.chromium.spec.ts +0 -281
- package/src/DropdownMenu/__tests__/DropdownMenuDrillIn.a11y.chromium.spec.ts +0 -175
- package/src/DropdownMenu/__tests__/DropdownMenuFocusReturn.a11y.browser.spec.ts +0 -74
- package/src/DropdownMenu/__tests__/DropdownMenuGroupAudit.a11y.chromium.spec.ts +0 -335
- package/src/DropdownMenu/__tests__/DropdownMenuItemAudit.a11y.chromium.spec.ts +0 -367
- package/src/DropdownMenu/__tests__/DropdownMenuRadioGroupAudit.a11y.chromium.spec.ts +0 -328
- package/src/DropdownMenu/__tests__/DropdownMenuRadioItemAudit.a11y.chromium.spec.ts +0 -540
- package/src/DropdownMenu/__tests__/DropdownMenuSubMenuAudit.a11y.chromium.spec.ts +0 -671
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +0 -158
- package/src/DropdownMenu/__tests__/Menu.a11y.known-failures.ts +0 -26
- package/src/DropdownMenu/__tests__/Menu.a11y.renders.tsx +0 -65
- package/src/DropdownMenu/__tests__/Menu.a11y.states.ts +0 -138
- package/src/DropdownMenu/__tests__/Menu.a11y.test.tsx +0 -136
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +0 -149
- package/src/DropdownMenu/__tests__/MenuButton.a11y.known-failures.ts +0 -12
- package/src/DropdownMenu/__tests__/MenuButton.a11y.renders.tsx +0 -67
- package/src/DropdownMenu/__tests__/MenuButton.a11y.states.ts +0 -141
- package/src/DropdownMenu/__tests__/MenuButton.a11y.test.tsx +0 -138
- package/src/DropdownMenu/__tests__/MenuHeaderFooter.a11y.chromium.spec.ts +0 -231
- package/src/DropdownMenu/__tests__/MenuHoverFocus.a11y.chromium.spec.ts +0 -238
- package/src/DropdownMenu/__tests__/MenuPinchZoom.a11y.chromium.spec.ts +0 -173
- package/src/DropdownMenu/__tests__/MenuPress.a11y.chromium.spec.ts +0 -503
- package/src/DropdownMenu/__tests__/SubMenuHeaderFooter.a11y.chromium.spec.ts +0 -268
- package/src/DropdownMenu/__tests__/warmMenuBottomSheet.tsx +0 -43
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +0 -60
- package/src/DropdownMenu/modules/useMenuHover.spec.md +0 -283
- package/src/DropdownMenu/modules/useMenuPress.spec.md +0 -348
- package/src/EmptyState/EmptyState.announce.test.tsx +0 -227
- package/src/EmptyState/EmptyState.spec.md +0 -203
- package/src/EmptyState/EmptyState.test.tsx +0 -284
- package/src/Field/Field.spec.md +0 -226
- package/src/Field/Field.test.tsx +0 -800
- package/src/Field/FieldLabel.spec.md +0 -183
- package/src/Field/FieldLabel.test.tsx +0 -244
- package/src/Field/InputClearButton.test.tsx +0 -395
- package/src/Field/__tests__/FieldLabelAudit.a11y.chromium.spec.ts +0 -297
- package/src/Field/fieldInputFamily.test.tsx +0 -160
- package/src/FieldStatus/FieldStatus.spec.md +0 -224
- package/src/FieldStatus/FieldStatus.test.tsx +0 -482
- package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +0 -206
- package/src/FieldStatus/__tests__/StatusMessage.a11y.known-failures.ts +0 -13
- package/src/FieldStatus/__tests__/StatusMessage.a11y.renders.tsx +0 -287
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +0 -302
- package/src/FieldStatus/__tests__/StatusMessage.a11y.test.tsx +0 -154
- package/src/FileInput/FileInput.fr10.test.tsx +0 -21
- package/src/FileInput/FileInput.spec.md +0 -199
- package/src/FileInput/FileInput.test.tsx +0 -1291
- package/src/FormLayout/FormLayout.spec.md +0 -209
- package/src/FormLayout/FormLayout.test.tsx +0 -444
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -46
- package/src/Grid/Grid.spec.md +0 -193
- package/src/Grid/Grid.test.tsx +0 -509
- package/src/Grid/GridSpan.spec.md +0 -158
- package/src/HStack/HStack.test.tsx +0 -129
- package/src/Heading/Heading.spec.md +0 -198
- package/src/Heading/Heading.test.tsx +0 -328
- package/src/HoverCard/HoverCard.spec.md +0 -244
- package/src/HoverCard/HoverCard.test.tsx +0 -1339
- package/src/Icon/Icon.spec.md +0 -244
- package/src/Icon/Icon.test.tsx +0 -990
- package/src/Icon/globalIconRegistry.test.tsx +0 -613
- package/src/IconButton/IconButton.spec.md +0 -197
- package/src/IconButton/IconButton.test.tsx +0 -156
- package/src/Indicator/CheckIndicator.spec.md +0 -164
- package/src/Indicator/CheckboxIndicator.spec.md +0 -164
- package/src/Indicator/Indicator.spec.md +0 -188
- package/src/Indicator/Indicator.test.tsx +0 -389
- package/src/Indicator/indicatorRegistry.test.tsx +0 -106
- package/src/InputGroup/InputGroup.spec.md +0 -199
- package/src/InputGroup/InputGroup.test.tsx +0 -502
- package/src/InputGroup/InputGroupText.spec.md +0 -139
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
- package/src/Item/Item.source-build.test.mjs +0 -88
- package/src/Item/Item.spec.md +0 -226
- package/src/Item/Item.swipeLayer.test.tsx +0 -74
- package/src/Item/Item.test.tsx +0 -1515
- package/src/Item/ItemMarkerColumns.a11y.chromium.spec.ts +0 -211
- package/src/Item/__tests__/ItemSwipeActions.a11y.chromium.spec.ts +0 -337
- package/src/Item/__tests__/ItemSwipePinchZoom.a11y.chromium.spec.ts +0 -186
- package/src/Kbd/Kbd.spec.md +0 -185
- package/src/Kbd/Kbd.test.tsx +0 -299
- package/src/Layer/LayerProvider.spec.md +0 -149
- package/src/Layer/LayerProvider.test.tsx +0 -143
- package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +0 -126
- package/src/Layer/__tests__/LayerReducedMotion.a11y.chromium.spec.ts +0 -176
- package/src/Layer/__tests__/TouchTrigger.a11y.chromium.spec.ts +0 -200
- package/src/Layer/anchorName.test.ts +0 -146
- package/src/Layer/layerDismissalFamilies.test.tsx +0 -487
- package/src/Layer/layerDismissalInvariants.test.tsx +0 -501
- package/src/Layer/layerHost.test.ts +0 -117
- package/src/Layer/layerScopedContext.test.tsx +0 -499
- package/src/Layer/layerViewportInset.source-build.test.mjs +0 -90
- package/src/Layer/layerViewportInset.test.ts +0 -120
- package/src/Layer/popoverOperations.test.ts +0 -205
- package/src/Layer/useLayer.test.tsx +0 -2845
- package/src/Layer/useLayerDismissal.test.tsx +0 -580
- package/src/Layer/useTouchTrigger.test.ts +0 -70
- package/src/Layout/Layout.spec.md +0 -243
- package/src/Layout/Layout.test.tsx +0 -375
- package/src/Layout/LayoutContent.spec.md +0 -205
- package/src/Layout/LayoutFooter.spec.md +0 -190
- package/src/Layout/LayoutHeader.spec.md +0 -193
- package/src/Layout/LayoutPanel.spec.md +0 -194
- package/src/Layout/LayoutSlots.test.tsx +0 -376
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +0 -134
- package/src/Layout/__tests__/Layout.a11y.renders.tsx +0 -110
- package/src/Layout/__tests__/Layout.a11y.states.ts +0 -93
- package/src/Layout/__tests__/Layout.a11y.test.tsx +0 -142
- package/src/Layout/__tests__/childrenAsContent.test.tsx +0 -59
- package/src/Layout/__tests__/contentWidth.test.tsx +0 -303
- package/src/Layout/__tests__/edgeCompensation.test.tsx +0 -191
- package/src/Layout/__tests__/nestedPadding.test.tsx +0 -264
- package/src/Layout/overlayPaddingReset.test.tsx +0 -224
- package/src/Lightbox/Lightbox.spec.md +0 -199
- package/src/Lightbox/Lightbox.test.tsx +0 -837
- package/src/Lightbox/LightboxKeyboard.a11y.browser.spec.ts +0 -78
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +0 -74
- package/src/Lightbox/useLightbox.test.tsx +0 -263
- package/src/Link/Link.spec.md +0 -230
- package/src/Link/Link.test.tsx +0 -457
- package/src/Link/LinkProvider.spec.md +0 -167
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +0 -153
- package/src/Link/__tests__/Link.a11y.renders.tsx +0 -97
- package/src/Link/__tests__/Link.a11y.states.ts +0 -104
- package/src/Link/__tests__/Link.a11y.test.tsx +0 -127
- package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +0 -262
- package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +0 -58
- package/src/Link/useLinkComponent.test.tsx +0 -572
- package/src/Link/useLinkify.test.tsx +0 -146
- package/src/List/List.spec.md +0 -336
- package/src/List/List.test.tsx +0 -1052
- package/src/List/ListItem.source-build.test.mjs +0 -41
- package/src/List/ListItem.spec.md +0 -205
- package/src/List/ListMarkers.a11y.chromium.spec.ts +0 -904
- package/src/Markdown/Markdown.codeLanguages.test.tsx +0 -137
- package/src/Markdown/Markdown.fr23.bench.ts +0 -176
- package/src/Markdown/Markdown.fr23.perf.test.ts +0 -484
- package/src/Markdown/Markdown.helpers.perf.test.ts +0 -495
- package/src/Markdown/Markdown.public.test.ts +0 -309
- package/src/Markdown/Markdown.renderBoundary.test.tsx +0 -72
- package/src/Markdown/Markdown.rerender.test.tsx +0 -143
- package/src/Markdown/Markdown.spec.md +0 -595
- package/src/Markdown/Markdown.test.tsx +0 -1383
- package/src/Markdown/MarkdownTable.a11y.chromium.spec.ts +0 -727
- package/src/Markdown/__tests__/MarkdownNesting.a11y.chromium.spec.ts +0 -102
- package/src/Markdown/angleDestinations.test.tsx +0 -104
- package/src/Markdown/ast.test.ts +0 -374
- package/src/Markdown/atxHeadingIndentation.test.tsx +0 -53
- package/src/Markdown/blockNesting.test.tsx +0 -124
- package/src/Markdown/blockquoteMarkers.test.tsx +0 -69
- package/src/Markdown/characterReferences.test.ts +0 -47
- package/src/Markdown/codeSpans.test.tsx +0 -65
- package/src/Markdown/emphasis.test.tsx +0 -214
- package/src/Markdown/fenceInfo.test.tsx +0 -47
- package/src/Markdown/imageAlt.test.tsx +0 -84
- package/src/Markdown/incremental.test.ts +0 -1198
- package/src/Markdown/incrementalIndentation.test.tsx +0 -36
- package/src/Markdown/indentedFences.test.tsx +0 -374
- package/src/Markdown/indentedTables.test.tsx +0 -53
- package/src/Markdown/linkBrackets.test.tsx +0 -116
- package/src/Markdown/linkDestinationLinear.test.tsx +0 -54
- package/src/Markdown/linkDestinations.test.tsx +0 -127
- package/src/Markdown/linkTextCode.test.tsx +0 -65
- package/src/Markdown/listBullets.test.tsx +0 -55
- package/src/Markdown/listContinuation.test.tsx +0 -94
- package/src/Markdown/listThematicBreak.test.tsx +0 -49
- package/src/Markdown/longLinkLabels.test.tsx +0 -49
- package/src/Markdown/modules/headingLinks.spec.md +0 -262
- package/src/Markdown/modules/remark.spec.md +0 -269
- package/src/Markdown/modules/softBreaks.spec.md +0 -137
- package/src/Markdown/modules/sourceLines.spec.md +0 -162
- package/src/Markdown/openFenceFinalNewline.test.tsx +0 -85
- package/src/Markdown/parser.perf.test.ts +0 -398
- package/src/Markdown/parser.public.test.ts +0 -144
- package/src/Markdown/parser.test.ts +0 -1925
- package/src/Markdown/plugin-renderer/MarkdownPluginNodeRenderer.test.tsx +0 -300
- package/src/Markdown/plugins/frontmatter.test.tsx +0 -150
- package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +0 -856
- package/src/Markdown/plugins/headingLinks.ssr.test.tsx +0 -143
- package/src/Markdown/plugins/headingLinks.test.tsx +0 -637
- package/src/Markdown/plugins/protocol.test.tsx +0 -1083
- package/src/Markdown/plugins/semanticFence.test.tsx +0 -655
- package/src/Markdown/plugins/softBreaks.test.tsx +0 -172
- package/src/Markdown/plugins/sourceDecoration.test.tsx +0 -799
- package/src/Markdown/plugins/sourceLines.test.tsx +0 -715
- package/src/Markdown/plugins/textTransform.test.ts +0 -467
- package/src/Markdown/remark.test.tsx +0 -1877
- package/src/Markdown/streaming.test.ts +0 -148
- package/src/Markdown/streamingListShapes.test.tsx +0 -93
- package/src/Markdown/trailingSpaces.test.tsx +0 -45
- package/src/MetadataList/MetadataList.spec.md +0 -187
- package/src/MetadataList/MetadataList.test.tsx +0 -383
- package/src/MetadataList/MetadataListItem.spec.md +0 -165
- package/src/MobileNav/MobileNav.spec.md +0 -306
- package/src/MobileNav/MobileNav.test.tsx +0 -296
- package/src/MobileNav/MobileNavCloseEdgeCases.test.tsx +0 -584
- package/src/MobileNav/MobileNavCloseTiming.test.ts +0 -58
- package/src/MobileNav/MobileNavCloseVisibility.test.tsx +0 -172
- package/src/MobileNav/MobileNavEntryAnimation.test.tsx +0 -212
- package/src/MobileNav/MobileNavFocus.test.tsx +0 -553
- package/src/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.ts +0 -147
- package/src/MobileNav/MobileNavReopen.test.tsx +0 -118
- package/src/MobileNav/MobileNavScrollbarGutter.test.tsx +0 -109
- package/src/MobileNav/MobileNavToggle.test.tsx +0 -179
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +0 -89
- package/src/MobileNav/__tests__/MobileNavWidth.a11y.chromium.spec.ts +0 -103
- package/src/MoreMenu/MoreMenu.spec.md +0 -268
- package/src/MoreMenu/MoreMenu.test.tsx +0 -367
- package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +0 -148
- package/src/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.ts +0 -72
- package/src/MultiSelector/MultiSelector.focusableDisabled.test.tsx +0 -121
- package/src/MultiSelector/MultiSelector.fr10.test.tsx +0 -221
- package/src/MultiSelector/MultiSelector.spec.md +0 -357
- package/src/MultiSelector/MultiSelector.test.tsx +0 -4971
- package/src/MultiSelector/OptionActions.a11y.chromium.spec.ts +0 -310
- package/src/MultiSelector/__tests__/MultiSelector.a11y.chromium.spec.ts +0 -46
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +0 -135
- package/src/NavIcon/NavIcon.spec.md +0 -158
- package/src/NavIcon/NavIcon.test.tsx +0 -41
- package/src/NavMenu/NavHeadingMenu.spec.md +0 -264
- package/src/NavMenu/NavHeadingMenu.test.tsx +0 -714
- package/src/NavMenu/__tests__/NavMenusSlideSelection.a11y.chromium.spec.ts +0 -137
- package/src/NumberInput/NumberInput.fr10.test.tsx +0 -21
- package/src/NumberInput/NumberInput.spec.md +0 -270
- package/src/NumberInput/NumberInput.test.tsx +0 -2697
- package/src/NumberInput/__tests__/NumberInput.a11y.chromium.spec.ts +0 -124
- package/src/NumberInput/__tests__/NumberInput.a11y.known-failures.ts +0 -26
- package/src/NumberInput/__tests__/NumberInput.a11y.renders.tsx +0 -77
- package/src/NumberInput/__tests__/NumberInput.a11y.states.ts +0 -116
- package/src/NumberInput/__tests__/NumberInput.a11y.test.tsx +0 -154
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +0 -102
- package/src/NumberInput/numberInputCommit.test.ts +0 -72
- package/src/NumberInput/numberParser.docblock.test.ts +0 -234
- package/src/NumberInput/numberParser.test.ts +0 -222
- package/src/Outline/Outline.spec.md +0 -258
- package/src/Outline/Outline.test.tsx +0 -1134
- package/src/Outline/OutlineFocus.a11y.chromium.spec.ts +0 -551
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +0 -150
- package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -104
- package/src/OverflowList/OverflowList.spec.md +0 -204
- package/src/OverflowList/OverflowList.test.tsx +0 -1073
- package/src/Overlay/Overlay.spec.md +0 -304
- package/src/Overlay/Overlay.test.tsx +0 -424
- package/src/Pagination/Pagination.spec.md +0 -300
- package/src/Pagination/Pagination.test.tsx +0 -1754
- package/src/Popover/Popover.spec.md +0 -525
- package/src/Popover/Popover.test.tsx +0 -1508
- package/src/Popover/PopoverPresentation.test.tsx +0 -952
- package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +0 -267
- package/src/PowerSearch/PowerSearch.spec.md +0 -661
- package/src/PowerSearch/PowerSearch.test.tsx +0 -1027
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +0 -1190
- package/src/PowerSearch/PowerSearchFilterEditor.test.tsx +0 -377
- package/src/PowerSearch/PowerSearchToken.test.tsx +0 -230
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +0 -754
- package/src/PowerSearch/formatFilterValue.test.ts +0 -339
- package/src/PowerSearch/resolveDateTimeRangePart.test.ts +0 -40
- package/src/PowerSearch/usePowerSearchConfig.test.ts +0 -832
- package/src/PowerSearch/usePowerSearchSource.test.ts +0 -621
- package/src/ProgressBar/ProgressBar.spec.md +0 -261
- package/src/ProgressBar/ProgressBar.test.tsx +0 -928
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +0 -127
- package/src/ProgressBar/__tests__/ProgressBar.a11y.known-failures.ts +0 -12
- package/src/ProgressBar/__tests__/ProgressBar.a11y.renders.tsx +0 -38
- package/src/ProgressBar/__tests__/ProgressBar.a11y.states.ts +0 -123
- package/src/ProgressBar/__tests__/ProgressBar.a11y.test.tsx +0 -107
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +0 -831
- package/src/RadioList/RadioList.fr10.test.tsx +0 -67
- package/src/RadioList/RadioList.spec.md +0 -227
- package/src/RadioList/RadioList.test.tsx +0 -1051
- package/src/RadioList/RadioListItem.press.source-build.test.mjs +0 -80
- package/src/RadioList/RadioListItem.spec.md +0 -223
- package/src/RadioList/__tests__/RadioGroup.a11y.chromium.spec.ts +0 -274
- package/src/RadioList/__tests__/RadioGroup.a11y.known-failures.ts +0 -12
- package/src/RadioList/__tests__/RadioGroup.a11y.renders.tsx +0 -232
- package/src/RadioList/__tests__/RadioGroup.a11y.states.ts +0 -503
- package/src/RadioList/__tests__/RadioGroup.a11y.test.tsx +0 -217
- package/src/Resizable/Resizable.spec.md +0 -298
- package/src/Resizable/ResizeHandle.test.tsx +0 -1067
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +0 -127
- package/src/Resizable/__tests__/ResizeHandle.a11y.known-failures.ts +0 -39
- package/src/Resizable/__tests__/ResizeHandle.a11y.renders.tsx +0 -80
- package/src/Resizable/__tests__/ResizeHandle.a11y.states.ts +0 -197
- package/src/Resizable/__tests__/ResizeHandle.a11y.test.tsx +0 -123
- package/src/Resizable/shippedDirections.test.ts +0 -462
- package/src/Resizable/useResizable.test.ts +0 -1725
- package/src/Resizable/utils.test.ts +0 -74
- package/src/ScrollableArea/ScrollableArea.spec.md +0 -190
- package/src/ScrollableArea/ScrollableArea.test.tsx +0 -304
- package/src/ScrollableArea/modules/useScrollableArea.spec.md +0 -149
- package/src/Section/Section.spec.md +0 -197
- package/src/Section/Section.test.tsx +0 -376
- package/src/SegmentedControl/SegmentedControl.spec.md +0 -261
- package/src/SegmentedControl/SegmentedControl.test.tsx +0 -981
- package/src/SegmentedControl/SegmentedControlItem.spec.md +0 -206
- package/src/SelectableCard/SelectableCard.spec.md +0 -230
- package/src/SelectableCard/SelectableCard.test.tsx +0 -216
- package/src/Selector/Selector.focusableDisabled.test.tsx +0 -127
- package/src/Selector/Selector.fr10.test.tsx +0 -149
- package/src/Selector/Selector.sheetActiveDescendant.test.tsx +0 -95
- package/src/Selector/Selector.source-build.test.mjs +0 -79
- package/src/Selector/Selector.spec.md +0 -379
- package/src/Selector/Selector.test.tsx +0 -5117
- package/src/Selector/__tests__/Combobox.a11y.known-failures.ts +0 -27
- package/src/Selector/__tests__/Combobox.a11y.states.ts +0 -145
- package/src/Selector/__tests__/ComboboxField.a11y.chromium.spec.ts +0 -458
- package/src/Selector/__tests__/EmptyStateAnnouncement.a11y.chromium.spec.ts +0 -91
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +0 -131
- package/src/Selector/__tests__/Listbox.a11y.dom.ts +0 -38
- package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +0 -63
- package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +0 -12
- package/src/Selector/__tests__/Listbox.a11y.states.ts +0 -232
- package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +0 -46
- package/src/Selector/__tests__/Selector.combobox.a11y.chromium.spec.ts +0 -109
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +0 -133
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +0 -128
- package/src/Selector/useCombobox.public.test.tsx +0 -89
- package/src/Selector/useCombobox.test.tsx +0 -444
- package/src/SideNav/SideNav.spec.md +0 -247
- package/src/SideNav/SideNav.test.tsx +0 -4275
- package/src/SideNav/SideNavCollapseButton.spec.md +0 -161
- package/src/SideNav/SideNavHeading.spec.md +0 -226
- package/src/SideNav/SideNavItem.spec.md +0 -236
- package/src/SideNav/SideNavRailMotion.test.tsx +0 -620
- package/src/SideNav/SideNavSection.spec.md +0 -153
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +0 -542
- package/src/SizeContext/SizeContext.test.tsx +0 -226
- package/src/Skeleton/Skeleton.spec.md +0 -184
- package/src/Skeleton/Skeleton.test.tsx +0 -148
- package/src/Slider/Slider.fr10.test.tsx +0 -93
- package/src/Slider/Slider.spec.md +0 -285
- package/src/Slider/Slider.test.tsx +0 -1661
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +0 -125
- package/src/Slider/__tests__/Slider.a11y.known-failures.ts +0 -12
- package/src/Slider/__tests__/Slider.a11y.renders.tsx +0 -42
- package/src/Slider/__tests__/Slider.a11y.states.ts +0 -106
- package/src/Slider/__tests__/Slider.a11y.test.tsx +0 -105
- package/src/Spinner/Spinner.spec.md +0 -231
- package/src/Spinner/Spinner.test.tsx +0 -484
- package/src/Stack/Stack.spec.md +0 -203
- package/src/Stack/Stack.test.tsx +0 -473
- package/src/Stack/StackItem.test.tsx +0 -105
- package/src/StatusDot/StatusDot.spec.md +0 -224
- package/src/StatusDot/StatusDot.test.tsx +0 -213
- package/src/Stepper/Step.spec.md +0 -200
- package/src/Stepper/Stepper.public.test.ts +0 -91
- package/src/Stepper/Stepper.spec.md +0 -327
- package/src/Stepper/Stepper.test.tsx +0 -2130
- package/src/Switch/Switch.focusRing.source-build.test.mjs +0 -81
- package/src/Switch/Switch.spec.md +0 -277
- package/src/Switch/Switch.test.tsx +0 -1136
- package/src/Switch/__tests__/Switch.a11y.chromium.spec.ts +0 -211
- package/src/Switch/__tests__/Switch.a11y.known-failures.ts +0 -28
- package/src/Switch/__tests__/Switch.a11y.states.ts +0 -275
- package/src/Switch/__tests__/Switch.a11y.test.tsx +0 -144
- package/src/TabList/Tab.spec.md +0 -201
- package/src/TabList/TabList.spec.md +0 -217
- package/src/TabList/TabList.test.tsx +0 -1755
- package/src/TabList/TabMenu.spec.md +0 -198
- package/src/TabList/__tests__/TabListOverflow.interaction.browser.spec.ts +0 -99
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +0 -163
- package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +0 -199
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +0 -12
- package/src/TabList/__tests__/Tabs.a11y.renders.tsx +0 -92
- package/src/TabList/__tests__/Tabs.a11y.states.ts +0 -247
- package/src/TabList/__tests__/Tabs.a11y.test.tsx +0 -153
- package/src/Table/Table.perf.test.tsx +0 -569
- package/src/Table/Table.spec.md +0 -395
- package/src/Table/Table.test.tsx +0 -1883
- package/src/Table/TableHeaderCell.test.tsx +0 -291
- package/src/Table/TableSelectionToolbar.test.tsx +0 -109
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +0 -141
- package/src/Table/__tests__/Table.a11y.contracts.ts +0 -35
- package/src/Table/__tests__/Table.a11y.renders.tsx +0 -112
- package/src/Table/__tests__/Table.a11y.states.ts +0 -136
- package/src/Table/__tests__/Table.a11y.test.tsx +0 -198
- package/src/Table/__tests__/TableMinWidth.a11y.chromium.spec.ts +0 -75
- package/src/Table/__tests__/TableRowGlide.a11y.browser.spec.ts +0 -382
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +0 -138
- package/src/Table/__tests__/TableStickyDividers.a11y.browser.spec.ts +0 -560
- package/src/Table/plugins/activation/useTableActivation.spec.md +0 -254
- package/src/Table/plugins/columnResize/useTableColumnResize.spec.md +0 -373
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +0 -941
- package/src/Table/plugins/columnSettings/useTableColumnSettings.test.tsx +0 -175
- package/src/Table/plugins/columnSettings/useTableColumnSettingsState.test.tsx +0 -296
- package/src/Table/plugins/filtering/useTableFilterState.test.tsx +0 -143
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +0 -357
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +0 -112
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +0 -409
- package/src/Table/plugins/infiniteScroll/useTableInfiniteScroll.spec.md +0 -244
- package/src/Table/plugins/pagination/useTablePagination-perf.test.tsx +0 -232
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +0 -666
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.glide.test.tsx +0 -280
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +0 -681
- package/src/Table/plugins/rowIndex/useTableRowIndex.test.tsx +0 -132
- package/src/Table/plugins/rowStatus/useTableRowStatus.public.test.ts +0 -92
- package/src/Table/plugins/rowStatus/useTableRowStatus.spec.md +0 -355
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +0 -519
- package/src/Table/plugins/selection/useTableSelection-perf.test.tsx +0 -258
- package/src/Table/plugins/selection/useTableSelection.test.tsx +0 -424
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +0 -451
- package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.test.tsx +0 -174
- package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.ts +0 -86
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +0 -786
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +0 -580
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +0 -334
- package/src/Table/plugins/tree/useTableTreeData-perf.test.tsx +0 -163
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +0 -992
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +0 -740
- package/src/Table/plugins/virtualization/useTableVirtualization.spec.md +0 -266
- package/src/Table/tableContextMenu.test.tsx +0 -208
- package/src/Text/Text.spec.md +0 -193
- package/src/Text/Text.test.tsx +0 -405
- package/src/Text/useTruncation.test.tsx +0 -196
- package/src/TextArea/TextArea.fr10.test.tsx +0 -21
- package/src/TextArea/TextArea.spec.md +0 -300
- package/src/TextArea/TextArea.test.tsx +0 -1317
- package/src/TextInput/TextInput.fr10.test.tsx +0 -21
- package/src/TextInput/TextInput.spec.md +0 -260
- package/src/TextInput/TextInput.test.tsx +0 -1280
- package/src/TextInput/__tests__/TextInput.a11y.chromium.spec.ts +0 -214
- package/src/TextInput/__tests__/TextInput.a11y.known-failures.ts +0 -40
- package/src/TextInput/__tests__/TextInput.a11y.renders.tsx +0 -202
- package/src/TextInput/__tests__/TextInput.a11y.states.ts +0 -384
- package/src/TextInput/__tests__/TextInput.a11y.test.tsx +0 -130
- package/src/Thumbnail/Thumbnail.spec.md +0 -244
- package/src/Thumbnail/Thumbnail.test.tsx +0 -384
- package/src/TimeInput/NativeTimeInput.test.tsx +0 -343
- package/src/TimeInput/Presentation.test.tsx +0 -192
- package/src/TimeInput/TimeInput.fr10.test.tsx +0 -312
- package/src/TimeInput/TimeInput.spec.md +0 -270
- package/src/TimeInput/TimeInput.test.tsx +0 -907
- package/src/Timer/Timer.spec.md +0 -215
- package/src/Timer/Timer.test.tsx +0 -302
- package/src/Timestamp/Timestamp.spec.md +0 -246
- package/src/Timestamp/Timestamp.test.tsx +0 -1661
- package/src/Timestamp/tooltipEntries.test.ts +0 -566
- package/src/Toast/Toast.spec.md +0 -291
- package/src/Toast/ToastViewport.modalHost.test.tsx +0 -891
- package/src/Toast/ToastViewport.test.tsx +0 -3130
- package/src/Toast/useToast.test.tsx +0 -258
- package/src/ToggleButton/ToggleButton.spec.md +0 -256
- package/src/ToggleButton/ToggleButton.test.tsx +0 -1000
- package/src/ToggleButton/ToggleButtonGroup.spec.md +0 -195
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +0 -177
- package/src/ToggleButton/__tests__/ToggleButton.a11y.renders.tsx +0 -133
- package/src/ToggleButton/__tests__/ToggleButton.a11y.states.ts +0 -167
- package/src/ToggleButton/__tests__/ToggleButton.a11y.test.tsx +0 -103
- package/src/Token/Token.spec.md +0 -261
- package/src/Token/Token.test.tsx +0 -707
- package/src/Token/__tests__/TokenRemoveTarget.a11y.chromium.spec.ts +0 -87
- package/src/Tokenizer/Tokenizer.fr10.test.tsx +0 -28
- package/src/Tokenizer/Tokenizer.props-type.test.tsx +0 -126
- package/src/Tokenizer/Tokenizer.spec.md +0 -615
- package/src/Tokenizer/Tokenizer.ssr.test.tsx +0 -196
- package/src/Tokenizer/Tokenizer.test.tsx +0 -2216
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +0 -2738
- package/src/Tokenizer/__tests__/TokenizerEndLane.a11y.chromium.spec.ts +0 -505
- package/src/Toolbar/Toolbar.spec.md +0 -227
- package/src/Toolbar/Toolbar.test.tsx +0 -600
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +0 -176
- package/src/Toolbar/__tests__/Toolbar.a11y.renders.tsx +0 -63
- package/src/Toolbar/__tests__/Toolbar.a11y.states.ts +0 -142
- package/src/Toolbar/__tests__/Toolbar.a11y.test.tsx +0 -126
- package/src/Tooltip/Tooltip.spec.md +0 -267
- package/src/Tooltip/Tooltip.test.tsx +0 -819
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +0 -141
- package/src/Tooltip/__tests__/Tooltip.a11y.renders.tsx +0 -86
- package/src/Tooltip/__tests__/Tooltip.a11y.states.ts +0 -132
- package/src/Tooltip/__tests__/Tooltip.a11y.test.tsx +0 -126
- package/src/Tooltip/__tests__/TooltipFocusReturn.a11y.chromium.spec.ts +0 -130
- package/src/Tooltip/__tests__/TooltipHoverBridge.a11y.chromium.spec.ts +0 -75
- package/src/Tooltip/__tests__/TooltipTallContent.a11y.browser.spec.ts +0 -673
- package/src/Tooltip/__tests__/TooltipTallContentTracking.a11y.browser.spec.ts +0 -1162
- package/src/Tooltip/useTooltip.test.tsx +0 -483
- package/src/TopNav/TopNav.spec.md +0 -190
- package/src/TopNav/TopNav.test.tsx +0 -863
- package/src/TopNav/TopNavHeading.spec.md +0 -211
- package/src/TopNav/TopNavItem.spec.md +0 -189
- package/src/TopNav/TopNavMegaMenu.reduced-motion.source-build.test.mjs +0 -83
- package/src/TopNav/TopNavMegaMenu.spec.md +0 -190
- package/src/TopNav/TopNavMegaMenu.test.tsx +0 -1153
- package/src/TopNav/TopNavMegaMenuFeaturedCard.spec.md +0 -150
- package/src/TopNav/TopNavMegaMenuItem.spec.md +0 -155
- package/src/TopNav/TopNavMenu.spec.md +0 -202
- package/src/TopNav/TopNavMenu.test.tsx +0 -502
- package/src/TopNav/__tests__/TopNavMobileLongHeading.a11y.chromium.spec.ts +0 -75
- package/src/TreeList/TreeList.spec.md +0 -328
- package/src/TreeList/TreeList.test.tsx +0 -1737
- package/src/TreeList/__tests__/TreeList.a11y.chromium.spec.ts +0 -138
- package/src/TreeList/__tests__/TreeList.a11y.renders.tsx +0 -44
- package/src/TreeList/__tests__/TreeList.a11y.states.ts +0 -164
- package/src/TreeList/__tests__/TreeList.a11y.test.tsx +0 -138
- package/src/TreeList/__tests__/TreeListGuideAlignment.interaction.browser.spec.ts +0 -127
- package/src/TreeList/__tests__/TreeListRowNames.a11y.chromium.spec.ts +0 -83
- package/src/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.ts +0 -138
- package/src/Typeahead/BaseTypeahead.spec.md +0 -270
- package/src/Typeahead/BaseTypeahead.test.tsx +0 -553
- package/src/Typeahead/Typeahead.fr10.test.tsx +0 -28
- package/src/Typeahead/Typeahead.spec.md +0 -257
- package/src/Typeahead/Typeahead.test.tsx +0 -2984
- package/src/Typeahead/TypeaheadItem.test.tsx +0 -134
- package/src/VStack/VStack.test.tsx +0 -128
- package/src/VisuallyHidden/VisuallyHidden.spec.md +0 -170
- package/src/VisuallyHidden/VisuallyHidden.test.tsx +0 -115
- package/src/__tests__/BusyOwnerAnnouncement.test.tsx +0 -853
- package/src/__tests__/CardPress.a11y.chromium.spec.ts +0 -353
- package/src/__tests__/DisabledTriggerFocus.a11y.chromium.spec.ts +0 -87
- package/src/__tests__/PressModality.a11y.chromium.spec.ts +0 -392
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +0 -814
- package/src/__tests__/TestIcon.tsx +0 -26
- package/src/__tests__/babelPluginAddExtensions.test.ts +0 -190
- package/src/__tests__/fastRoleQueries.ts +0 -66
- package/src/__tests__/forcedColors.ts +0 -60
- package/src/__tests__/internalModulesNotExperimental.test.ts +0 -88
- package/src/__tests__/pressState.ts +0 -216
- package/src/__tests__/stubMatchMedia.test.ts +0 -79
- package/src/__tests__/stubMatchMedia.ts +0 -95
- package/src/__tests__/stylexDeclarations.ts +0 -51
- package/src/__tests__/unthemedLength.ts +0 -34
- package/src/docPropLiterals.test.ts +0 -964
- package/src/docPropReferences.test.ts +0 -178
- package/src/docs-script.test.mjs +0 -55
- package/src/gestures/__tests__/GestureHost.test.ts +0 -2136
- package/src/gestures/__tests__/LongPressGestureRecognizer.test.ts +0 -141
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +0 -327
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +0 -74
- package/src/gestures/__tests__/PressTracker.test.ts +0 -275
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +0 -498
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +0 -108
- package/src/gestures/__tests__/TapGestureRecognizer.test.ts +0 -154
- package/src/gestures/__tests__/VelocityTracker.streams.test.ts +0 -243
- package/src/gestures/__tests__/VelocityTracker.test.ts +0 -261
- package/src/gestures/__tests__/arena.test.ts +0 -864
- package/src/gestures/__tests__/arenaContinuous.test.ts +0 -207
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +0 -193
- package/src/gestures/__tests__/arenaTapLongPress.test.ts +0 -211
- package/src/gestures/__tests__/browser/build-fixture.mjs +0 -46
- package/src/gestures/__tests__/browser/fixture.ts +0 -307
- package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +0 -1137
- package/src/gestures/__tests__/browserNegotiation.test.ts +0 -293
- package/src/gestures/__tests__/fixtures/pointer-streams/README.md +0 -82
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-fling.json +0 -130
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-slow.json +0 -860
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-stop-release.json +0 -357
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-fling.json +0 -66
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-slow.json +0 -268
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-stop-release.json +0 -128
- package/src/gestures/__tests__/fixtures/pointer-streams/capture.html +0 -123
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-fling.json +0 -64
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-slow.json +0 -268
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-stop-release.json +0 -124
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-fling.json +0 -64
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-slow.json +0 -268
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-stop-release.json +0 -124
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-fling.json +0 -84
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-slow.json +0 -381
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-stop-release.json +0 -171
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-fling.json +0 -45
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-slow.json +0 -101
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-stop-release.json +0 -130
- package/src/gestures/__tests__/haptics.test.ts +0 -187
- package/src/gestures/__tests__/harness.ts +0 -252
- package/src/gestures/__tests__/pressTrackerFactory.test.ts +0 -59
- package/src/gestures/__tests__/recognizerKind.test.ts +0 -78
- package/src/gestures/__tests__/touchActionRule.test.ts +0 -54
- package/src/gestures/__tests__/useGestureRecognizer.test.tsx +0 -570
- package/src/hooks/__tests__/MenuPressShadowRoot.a11y.chromium.spec.ts +0 -144
- package/src/hooks/__tests__/menuLinkClicks.ts +0 -71
- package/src/hooks/actionGroupTracker.exports.test.ts +0 -28
- package/src/hooks/actionGroupTracker.test.ts +0 -510
- package/src/hooks/computeOverflow.test.ts +0 -422
- package/src/hooks/deprecatedApis.public.test.ts +0 -33
- package/src/hooks/menuPressGesture.test.ts +0 -253
- package/src/hooks/scrollKeyboardDelegation.test.ts +0 -188
- package/src/hooks/scrollbarGutter.test.ts +0 -167
- package/src/hooks/useAnnounce.modal.test.tsx +0 -1291
- package/src/hooks/useAnnounce.replace.test.tsx +0 -516
- package/src/hooks/useAnnounce.test.tsx +0 -293
- package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +0 -235
- package/src/hooks/useAutoMediaMode.test.ts +0 -109
- package/src/hooks/useBusyAnnouncement.adopters.test.tsx +0 -69
- package/src/hooks/useBusyAnnouncement.test.tsx +0 -112
- package/src/hooks/useClickableContainer.test.tsx +0 -236
- package/src/hooks/useClipboard.test.tsx +0 -151
- package/src/hooks/useContainerReveal.test.tsx +0 -163
- package/src/hooks/useDevWarning.test.tsx +0 -45
- package/src/hooks/useEntryAnimation.ssr.test.tsx +0 -143
- package/src/hooks/useFocusTrap.test.tsx +0 -635
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +0 -166
- package/src/hooks/useGridFocus.test.tsx +0 -165
- package/src/hooks/useHotkeys.test.ts +0 -265
- package/src/hooks/useImageMode.test.ts +0 -133
- package/src/hooks/useInputContainer.test.tsx +0 -180
- package/src/hooks/useInputStatusIcon.test.tsx +0 -240
- package/src/hooks/useIsHydrating.test.tsx +0 -70
- package/src/hooks/useKeyboardHint.test.tsx +0 -92
- package/src/hooks/useListFocus.test.tsx +0 -664
- package/src/hooks/useLongPress.test.tsx +0 -152
- package/src/hooks/useMediaQuery.test.ts +0 -165
- package/src/hooks/useMenuHover.test.tsx +0 -536
- package/src/hooks/useMenuPress.test.tsx +0 -565
- package/src/hooks/useMergedRefs.test.tsx +0 -62
- package/src/hooks/useOverflow.test.ts +0 -504
- package/src/hooks/useRenamedProp.test.tsx +0 -95
- package/src/hooks/useScrollLock.test.ts +0 -248
- package/src/hooks/useScrollOverflow.test.tsx +0 -323
- package/src/hooks/useScrollableArea.test.tsx +0 -836
- package/src/hooks/useStreamingText.test.ts +0 -237
- package/src/hooks/useTreeFocus.test.tsx +0 -351
- package/src/hooks/useTypeahead.test.tsx +0 -351
- package/src/i18n/InternationalizationProvider.spec.md +0 -252
- package/src/i18n/__tests__/InternationalizationProvider.test.tsx +0 -128
- package/src/i18n/__tests__/e2e-pagination.test.tsx +0 -172
- package/src/i18n/__tests__/e2e-powersearch.test.tsx +0 -166
- package/src/i18n/__tests__/getLocaleDirection.test.ts +0 -40
- package/src/i18n/__tests__/resolve.test.ts +0 -325
- package/src/i18n/__tests__/useCollator.test.tsx +0 -115
- package/src/i18n/__tests__/useDirection.test.tsx +0 -66
- package/src/i18n/__tests__/useLocale.test.tsx +0 -52
- package/src/i18n/useTranslator.test.tsx +0 -267
- package/src/inputFontFloor.test.ts +0 -106
- package/src/internal/tokenizer-presentation.test.ts +0 -29
- package/src/internal/touch.test.ts +0 -44
- package/src/motion/__tests__/animatedLayout.interaction.browser.spec.ts +0 -1613
- package/src/motion/__tests__/animatedLayoutAdopters.interaction.browser.spec.ts +0 -217
- package/src/motion/__tests__/animatedLayoutBundle.ts +0 -17
- package/src/motion/__tests__/animator.interaction.browser.spec.ts +0 -843
- package/src/motion/__tests__/motionBundle.ts +0 -14
- package/src/motion/animatedLayout.boundary.test.ts +0 -155
- package/src/motion/animatedLayout.swap.test.ts +0 -827
- package/src/motion/animatedLayout.test.ts +0 -1154
- package/src/motion/animatedLayoutAdopters.test.tsx +0 -500
- package/src/motion/animator.test.ts +0 -3746
- package/src/motion/bezier.test.ts +0 -52
- package/src/motion/coast.test.ts +0 -99
- package/src/motion/decay.test.ts +0 -120
- package/src/motion/projection.test.ts +0 -107
- package/src/motion/reducedMotion.test.ts +0 -129
- package/src/motion/reducedMotionPlan.test.ts +0 -208
- package/src/motion/resolveMotion.test.ts +0 -123
- package/src/motion/resolveSnapPoint.test.ts +0 -189
- package/src/motion/roles.test.ts +0 -273
- package/src/motion/rubberBand.test.ts +0 -88
- package/src/motion/selectPage.test.ts +0 -31
- package/src/motion/spring.test.ts +0 -650
- package/src/motion/uikit/gestures.test.ts +0 -89
- package/src/motion/uikit/springRows.test.ts +0 -71
- package/src/motion/uikit/tableImports.test.ts +0 -293
- package/src/motion/uikit/uikit.test.ts +0 -364
- package/src/motion/uikit/values.test.ts +0 -121
- package/src/naming.test.ts +0 -44
- package/src/postinstall.test.mjs +0 -216
- package/src/reset.a11y.chromium.spec.ts +0 -238
- package/src/reset.test.ts +0 -205
- package/src/reset.until-found.a11y.browser.spec.ts +0 -76
- package/src/reset.until-found.test.ts +0 -32
- package/src/serverSafeComponents.test.ts +0 -675
- package/src/stylexValidation.source-build.test.mjs +0 -42
- package/src/tailwind-theme.test.ts +0 -153
- package/src/theme/MediaTheme.dom.test.tsx +0 -97
- package/src/theme/Theme.test.tsx +0 -337
- package/src/theme/__tests__/SpacingRootFontSize.a11y.chromium.spec.ts +0 -199
- package/src/theme/contrast.test.ts +0 -94
- package/src/theme/declarationBoundary.test.ts +0 -126
- package/src/theme/defineTheme.test.ts +0 -2028
- package/src/theme/derivedVarRegistry.test.ts +0 -592
- package/src/theme/expandColorScale.test.ts +0 -651
- package/src/theme/expandMotionScale.test.ts +0 -145
- package/src/theme/expandRadiusScale.test.ts +0 -59
- package/src/theme/expandTypeScale.test.ts +0 -351
- package/src/theme/extensibleAxes.test.ts +0 -432
- package/src/theme/generateThemeRules.test.ts +0 -1870
- package/src/theme/hct.test.ts +0 -93
- package/src/theme/onMediaTokens.test.ts +0 -431
- package/src/theme/publicThemeHelperContract.test.ts +0 -67
- package/src/theme/syntax/defineSyntaxTheme.diff.test.ts +0 -91
- package/src/theme/syntax/serverSafeSyntax.test.ts +0 -68
- package/src/theme/syntax/useSyntaxTheme.diff.test.tsx +0 -40
- package/src/theme/themeAdaptations.test.ts +0 -1795
- package/src/theme/themeMotion.test.ts +0 -620
- package/src/theme/themeRegistry.test.ts +0 -59
- package/src/theme/themingTargets.test.ts +0 -589
- package/src/theme/tokenValueCompat.test.ts +0 -204
- package/src/theme/tokens.test.ts +0 -441
- package/src/theme/useTheme.test.tsx +0 -322
- package/src/unicodePropertyEscapes.source-build.test.mjs +0 -69
- package/src/utils/chainEventHandlers.test.ts +0 -39
- package/src/utils/characters.test.ts +0 -141
- package/src/utils/color.test.ts +0 -233
- package/src/utils/composeEventHandlers.test.ts +0 -71
- package/src/utils/customPropertyArmLayering.test.ts +0 -131
- package/src/utils/dateParser.test.ts +0 -402
- package/src/utils/dateTypes.test.ts +0 -40
- package/src/utils/devWarning.test.ts +0 -56
- package/src/utils/edgeAutoscroll.test.ts +0 -192
- package/src/utils/focusReturn.test.ts +0 -119
- package/src/utils/getKey.test.ts +0 -25
- package/src/utils/getNodeText.test.ts +0 -24
- package/src/utils/hitArea.test.ts +0 -628
- package/src/utils/ime.test.ts +0 -32
- package/src/utils/inputAria.test.ts +0 -39
- package/src/utils/interactionModality.test.ts +0 -144
- package/src/utils/isApplePlatform.test.ts +0 -61
- package/src/utils/mergeProps.test.ts +0 -166
- package/src/utils/mergeRefs.test.ts +0 -48
- package/src/utils/parseStyleKey.test.ts +0 -56
- package/src/utils/plainDate.test.ts +0 -938
- package/src/utils/presentation.test.ts +0 -380
- package/src/utils/pressFeedback.test.ts +0 -1012
- package/src/utils/pressGesture.test.ts +0 -332
- package/src/utils/pressPaintPriority.test.ts +0 -80
- package/src/utils/pressPaintSource.test.ts +0 -65
- package/src/utils/pressableCoverage.test.ts +0 -192
- package/src/utils/primaryClick.test.ts +0 -38
- package/src/utils/safeUrl.test.ts +0 -101
- package/src/utils/sharedMutationObserver.test.ts +0 -106
- package/src/utils/sharedResizeObserver.test.ts +0 -283
- package/src/utils/themeProps.test.ts +0 -62
- package/src/utils/timeFormat.test.ts +0 -204
- package/src/utils/timeParser.test.ts +0 -295
- package/src/utils/touchPresentation.test.ts +0 -462
- package/src/utils/unicodeDigits.test.ts +0 -44
|
@@ -1,1690 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file useSheetGestures.test.ts
|
|
5
|
-
* @input Uses vitest, @testing-library/react renderHook, useSheetGestures
|
|
6
|
-
* @output Unit tests for useSheetGestures behavior
|
|
7
|
-
* @position Testing; validates useSheetGestures.ts implementation
|
|
8
|
-
*
|
|
9
|
-
* SYNC: When useSheetGestures.ts changes, update tests to match new behavior
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
13
|
-
import {act, renderHook} from '@testing-library/react';
|
|
14
|
-
import {
|
|
15
|
-
isInsideNestedLayer,
|
|
16
|
-
useSheetGestures,
|
|
17
|
-
type UseSheetGesturesOptions,
|
|
18
|
-
} from './useSheetGestures';
|
|
19
|
-
|
|
20
|
-
const SHEET_HEIGHT = 400;
|
|
21
|
-
|
|
22
|
-
// A fake pointer event object good enough for the handlers, which only read
|
|
23
|
-
// pointerId, clientY, timeStamp, preventDefault, and currentTarget's capture +
|
|
24
|
-
// measure APIs.
|
|
25
|
-
function pointerEvent(
|
|
26
|
-
clientY: number,
|
|
27
|
-
timeStamp: number,
|
|
28
|
-
target: HTMLElement,
|
|
29
|
-
pointerId = 1,
|
|
30
|
-
button = 0,
|
|
31
|
-
isPrimary = true,
|
|
32
|
-
) {
|
|
33
|
-
return {
|
|
34
|
-
pointerId,
|
|
35
|
-
button,
|
|
36
|
-
isPrimary,
|
|
37
|
-
clientY,
|
|
38
|
-
timeStamp,
|
|
39
|
-
currentTarget: target,
|
|
40
|
-
preventDefault: vi.fn(),
|
|
41
|
-
} as unknown as React.PointerEvent;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function makeTarget(): HTMLElement {
|
|
45
|
-
const el = document.createElement('div');
|
|
46
|
-
el.setPointerCapture = vi.fn();
|
|
47
|
-
el.releasePointerCapture = vi.fn();
|
|
48
|
-
el.getBoundingClientRect = () => ({height: SHEET_HEIGHT}) as DOMRect;
|
|
49
|
-
return el;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
beforeEach(() => {
|
|
53
|
-
vi.stubGlobal(
|
|
54
|
-
'matchMedia',
|
|
55
|
-
vi.fn().mockReturnValue({
|
|
56
|
-
matches: false,
|
|
57
|
-
addEventListener: vi.fn(),
|
|
58
|
-
removeEventListener: vi.fn(),
|
|
59
|
-
}),
|
|
60
|
-
);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
afterEach(() => {
|
|
64
|
-
vi.unstubAllGlobals();
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
function setup(options: Partial<UseSheetGesturesOptions> = {}) {
|
|
68
|
-
const onDismiss = vi.fn();
|
|
69
|
-
const hook = renderHook(
|
|
70
|
-
(props: UseSheetGesturesOptions) => useSheetGestures(props),
|
|
71
|
-
{
|
|
72
|
-
initialProps: {
|
|
73
|
-
isOpen: true,
|
|
74
|
-
onDismiss,
|
|
75
|
-
...options,
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
);
|
|
79
|
-
return {hook, onDismiss};
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
type Hook = {
|
|
83
|
-
result: {current: ReturnType<typeof useSheetGestures>};
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// The live drag position: written per input sample, not rendered.
|
|
87
|
-
function liveOffset(hook: Hook): number {
|
|
88
|
-
return hook.result.current.activeOffsetRef.current;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function down(hook: Hook, y: number, t: number, target: HTMLElement) {
|
|
92
|
-
// Register the sheet element the way the component does on mount, so the
|
|
93
|
-
// hook can measure its height (it no longer queries the DOM for it).
|
|
94
|
-
act(() => hook.result.current.sheetRef(target));
|
|
95
|
-
act(() =>
|
|
96
|
-
hook.result.current.handleProps.onPointerDown(pointerEvent(y, t, target)),
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
function move(hook: Hook, y: number, t: number, target: HTMLElement) {
|
|
100
|
-
act(() =>
|
|
101
|
-
hook.result.current.handleProps.onPointerMove(pointerEvent(y, t, target)),
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
function up(hook: Hook, y: number, t: number, target: HTMLElement) {
|
|
105
|
-
act(() =>
|
|
106
|
-
hook.result.current.handleProps.onPointerUp(pointerEvent(y, t, target)),
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
describe('isInsideNestedLayer', () => {
|
|
111
|
-
it("is true for a target inside a <dialog> rendered within the body, and false for the body's own content", () => {
|
|
112
|
-
const body = document.createElement('div');
|
|
113
|
-
const own = document.createElement('button');
|
|
114
|
-
body.append(own);
|
|
115
|
-
const nested = document.createElement('dialog');
|
|
116
|
-
const nestedHandle = document.createElement('div');
|
|
117
|
-
nested.append(nestedHandle);
|
|
118
|
-
body.append(nested);
|
|
119
|
-
expect(isInsideNestedLayer(own, body)).toBe(false);
|
|
120
|
-
expect(isInsideNestedLayer(body, body)).toBe(false);
|
|
121
|
-
expect(isInsideNestedLayer(nestedHandle, body)).toBe(true);
|
|
122
|
-
expect(isInsideNestedLayer(nested, body)).toBe(true);
|
|
123
|
-
// A dialog above the body (the sheet's own) does not count.
|
|
124
|
-
const ownDialog = document.createElement('dialog');
|
|
125
|
-
ownDialog.append(body);
|
|
126
|
-
expect(isInsideNestedLayer(own, body)).toBe(false);
|
|
127
|
-
expect(isInsideNestedLayer(null, body)).toBe(false);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
describe('useSheetGestures', () => {
|
|
132
|
-
it('dismisses on a fast downward flick (swipe-to-close)', () => {
|
|
133
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
134
|
-
const t = makeTarget();
|
|
135
|
-
down(hook, 0, 0, t);
|
|
136
|
-
// 60px in 20ms = 3px/ms, and 60px > the flick distance floor.
|
|
137
|
-
move(hook, 60, 20, t);
|
|
138
|
-
up(hook, 60, 22, t);
|
|
139
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('settles instead of dismissing on a downward flick when canDismiss is false', () => {
|
|
143
|
-
const onSnap = vi.fn();
|
|
144
|
-
const onScrimOpacity = vi.fn();
|
|
145
|
-
const {hook, onDismiss} = setup({
|
|
146
|
-
canDismiss: false,
|
|
147
|
-
snapHeights: () => [200],
|
|
148
|
-
onSnap,
|
|
149
|
-
onScrimOpacity,
|
|
150
|
-
});
|
|
151
|
-
const t = makeTarget();
|
|
152
|
-
down(hook, 0, 0, t);
|
|
153
|
-
move(hook, 60, 20, t);
|
|
154
|
-
up(hook, 60, 22, t);
|
|
155
|
-
|
|
156
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
157
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
158
|
-
expect(onSnap).toHaveBeenLastCalledWith(200);
|
|
159
|
-
// The 200px stop is half the sheet — a working surface, not a peek — so
|
|
160
|
-
// the backdrop stays full there.
|
|
161
|
-
expect(onScrimOpacity).toHaveBeenLastCalledWith(1);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('expands to the tallest detent on a fast upward flick', () => {
|
|
165
|
-
const onSnap = vi.fn();
|
|
166
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200], onSnap});
|
|
167
|
-
const t = makeTarget();
|
|
168
|
-
// Start rested at a lower detent by first snapping there via a slow drag.
|
|
169
|
-
down(hook, 0, 0, t);
|
|
170
|
-
move(hook, 200, 400, t); // slow drag down toward the 200px detent
|
|
171
|
-
up(hook, 200, 800, t);
|
|
172
|
-
onSnap.mockClear();
|
|
173
|
-
// Now flick up fast: 60px in 20ms = 3px/ms, over the distance floor.
|
|
174
|
-
down(hook, 200, 1000, t);
|
|
175
|
-
move(hook, 140, 1020, t);
|
|
176
|
-
up(hook, 140, 1022, t);
|
|
177
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
178
|
-
expect(onSnap).toHaveBeenLastCalledWith(SHEET_HEIGHT); // full height
|
|
179
|
-
expect(hook.result.current.settledOffset).toBe(0);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
describe('release projection', () => {
|
|
183
|
-
// A release is judged where the sheet would coast to at the finger's
|
|
184
|
-
// speed, the way a thrown scroll view is, not where the finger left it.
|
|
185
|
-
it('dismisses on a medium throw released short of the dismiss line', () => {
|
|
186
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
187
|
-
const t = makeTarget();
|
|
188
|
-
down(hook, 0, 0, t);
|
|
189
|
-
// 150px in 150ms = 1px/ms. The finger stops at 150, well short of the
|
|
190
|
-
// 280px line; a surface moving at that speed coasts far past it.
|
|
191
|
-
move(hook, 50, 50, t);
|
|
192
|
-
move(hook, 100, 100, t);
|
|
193
|
-
move(hook, 150, 150, t);
|
|
194
|
-
up(hook, 150, 152, t);
|
|
195
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('lands a gentle throw on the next detent, not back where it started', () => {
|
|
199
|
-
const onSnap = vi.fn();
|
|
200
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200], onSnap});
|
|
201
|
-
const t = makeTarget();
|
|
202
|
-
down(hook, 0, 0, t);
|
|
203
|
-
// 60px in 200ms = 0.3px/ms: too slow to be a flick, too short to reach
|
|
204
|
-
// the 200px detent by position. The coast carries it there.
|
|
205
|
-
move(hook, 30, 100, t);
|
|
206
|
-
move(hook, 60, 200, t);
|
|
207
|
-
up(hook, 60, 202, t);
|
|
208
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
209
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
210
|
-
expect(onSnap).toHaveBeenLastCalledWith(200);
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
it('reads the release speed over the last stretch, so one slow sample does not cancel a throw', () => {
|
|
214
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
215
|
-
const t = makeTarget();
|
|
216
|
-
down(hook, 0, 0, t);
|
|
217
|
-
move(hook, 60, 20, t); // 3px/ms
|
|
218
|
-
move(hook, 62, 90, t); // the lift's own last, slow sample
|
|
219
|
-
up(hook, 62, 92, t);
|
|
220
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('reads a throw that begins after a hold at its own speed, not the average since touch-down', () => {
|
|
224
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
225
|
-
const t = makeTarget();
|
|
226
|
-
down(hook, 0, 0, t);
|
|
227
|
-
move(hook, 0, 250, t); // a still hold on the handle
|
|
228
|
-
move(hook, 30, 275, t); // then 60px in 50ms
|
|
229
|
-
move(hook, 60, 300, t);
|
|
230
|
-
up(hook, 60, 302, t);
|
|
231
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it('reads a single move after a hold as a move, not as the whole hold', () => {
|
|
235
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
236
|
-
const t = makeTarget();
|
|
237
|
-
down(hook, 0, 0, t);
|
|
238
|
-
move(hook, 60, 300, t); // one sample, 300ms after touch-down
|
|
239
|
-
up(hook, 60, 302, t);
|
|
240
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('releases no throw from a finger that rested before lifting', () => {
|
|
244
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
245
|
-
const t = makeTarget();
|
|
246
|
-
down(hook, 0, 0, t);
|
|
247
|
-
move(hook, 60, 20, t); // 3px/ms ...
|
|
248
|
-
up(hook, 60, 400, t); // ... then 380ms of rest, then the lift
|
|
249
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
250
|
-
expect(hook.result.current.settledOffset).toBe(0);
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
it('settles a throw that would coast past the line at the shortest detent when canDismiss is false', () => {
|
|
254
|
-
const {hook, onDismiss} = setup({
|
|
255
|
-
canDismiss: false,
|
|
256
|
-
snapHeights: () => [200],
|
|
257
|
-
});
|
|
258
|
-
const t = makeTarget();
|
|
259
|
-
down(hook, 0, 0, t);
|
|
260
|
-
move(hook, 50, 50, t);
|
|
261
|
-
move(hook, 100, 100, t);
|
|
262
|
-
up(hook, 100, 102, t);
|
|
263
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
264
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it('does not flick-dismiss on a fast but short nudge', () => {
|
|
269
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
270
|
-
const t = makeTarget();
|
|
271
|
-
// Fast (20px/10ms = 2px/ms) but only 20px of travel — under the distance
|
|
272
|
-
// floor, so nothing is projected and it settles rather than dismissing.
|
|
273
|
-
down(hook, 0, 0, t);
|
|
274
|
-
move(hook, 20, 10, t);
|
|
275
|
-
up(hook, 20, 12, t);
|
|
276
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
it('settles to the nearest detent on a slow drag', () => {
|
|
280
|
-
const onSnap = vi.fn();
|
|
281
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200], onSnap});
|
|
282
|
-
const t = makeTarget();
|
|
283
|
-
// Detents: full=400 (offset 0) and 200 (offset 200). Drag slowly to ~180
|
|
284
|
-
// offset -> nearest is the 200px detent (offset 200).
|
|
285
|
-
down(hook, 0, 0, t);
|
|
286
|
-
move(hook, 90, 300, t);
|
|
287
|
-
move(hook, 180, 700, t);
|
|
288
|
-
up(hook, 180, 1100, t);
|
|
289
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
290
|
-
expect(onSnap).toHaveBeenLastCalledWith(200);
|
|
291
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it('excludes the offscreen block-end reserve from visible detent heights', () => {
|
|
295
|
-
const onSnap = vi.fn();
|
|
296
|
-
const {hook} = setup({
|
|
297
|
-
snapHeights: () => [200],
|
|
298
|
-
offscreenBlockEndInset: 48,
|
|
299
|
-
onSnap,
|
|
300
|
-
});
|
|
301
|
-
const t = makeTarget();
|
|
302
|
-
|
|
303
|
-
// The 400px border box has 352px visible. A 200px visible detent therefore
|
|
304
|
-
// rests at offset 152, not 200; the 48px reserve remains below the viewport.
|
|
305
|
-
down(hook, 0, 0, t);
|
|
306
|
-
move(hook, 150, 700, t);
|
|
307
|
-
up(hook, 150, 1100, t);
|
|
308
|
-
|
|
309
|
-
expect(hook.result.current.settledOffset).toBe(152);
|
|
310
|
-
expect(onSnap).toHaveBeenLastCalledWith(200);
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
it('keeps the full layout height at the peek detent', () => {
|
|
314
|
-
// Three detents on the 400px sheet: full (0), mid 240 (offset 160), and
|
|
315
|
-
// the 80px peek (offset 320).
|
|
316
|
-
const {hook} = setup({snapHeights: () => [80, 240]});
|
|
317
|
-
const t = makeTarget();
|
|
318
|
-
|
|
319
|
-
// Settle at the mid detent: the scrolling area takes that travel as
|
|
320
|
-
// layout height.
|
|
321
|
-
down(hook, 0, 0, t);
|
|
322
|
-
move(hook, 150, 700, t);
|
|
323
|
-
up(hook, 150, 1100, t);
|
|
324
|
-
expect(hook.result.current.settledOffset).toBe(160);
|
|
325
|
-
expect(hook.result.current.settledLayoutOffset).toBe(160);
|
|
326
|
-
|
|
327
|
-
// Settle at the peek: a glance state keeps the sheet's full layout height
|
|
328
|
-
// and slides it below the viewport, so no layout travel is reported.
|
|
329
|
-
down(hook, 150, 2000, t);
|
|
330
|
-
move(hook, 310, 2700, t);
|
|
331
|
-
up(hook, 310, 3100, t);
|
|
332
|
-
expect(hook.result.current.settledOffset).toBe(320);
|
|
333
|
-
expect(hook.result.current.settledLayoutOffset).toBe(0);
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
it('re-anchors to the same stop when the snap heights change at rest', () => {
|
|
337
|
-
const onDismiss = vi.fn();
|
|
338
|
-
const hook = renderHook(
|
|
339
|
-
(props: UseSheetGesturesOptions) => useSheetGestures(props),
|
|
340
|
-
{
|
|
341
|
-
initialProps: {
|
|
342
|
-
isOpen: true,
|
|
343
|
-
onDismiss,
|
|
344
|
-
snapHeights: () => [200],
|
|
345
|
-
},
|
|
346
|
-
},
|
|
347
|
-
);
|
|
348
|
-
const t = makeTarget();
|
|
349
|
-
|
|
350
|
-
// Settle on the one collapsed stop: 400 - 200 = 200px of travel.
|
|
351
|
-
down(hook, 0, 0, t);
|
|
352
|
-
move(hook, 180, 700, t);
|
|
353
|
-
up(hook, 180, 1100, t);
|
|
354
|
-
act(() => hook.result.current.completeScrollAreaSettle());
|
|
355
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
356
|
-
|
|
357
|
-
// A new resolver is a new set of stops. The sheet is resting on the one it
|
|
358
|
-
// names, so it follows: a 150px stop is 250px of travel. The resolver is
|
|
359
|
-
// read during render, not from a passive effect — the re-anchor runs in a
|
|
360
|
-
// layout effect, which would otherwise still see the previous one.
|
|
361
|
-
hook.rerender({
|
|
362
|
-
isOpen: true,
|
|
363
|
-
onDismiss,
|
|
364
|
-
snapHeights: () => [150],
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
expect(hook.result.current.settledOffset).toBe(250);
|
|
368
|
-
expect(hook.result.current.settledLayoutOffset).toBe(250);
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
it('resizes the scrolling area at a collapsed stop that is a working height', () => {
|
|
372
|
-
// A 200px stop on the 400px sheet is half of it: the scrolling area takes
|
|
373
|
-
// that travel as layout height rather than sliding the sheet away.
|
|
374
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
375
|
-
const t = makeTarget();
|
|
376
|
-
down(hook, 0, 0, t);
|
|
377
|
-
move(hook, 180, 700, t);
|
|
378
|
-
up(hook, 180, 1100, t);
|
|
379
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
380
|
-
expect(hook.result.current.settledLayoutOffset).toBe(200);
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
it('treats the only collapsed stop as a peek when it is a sliver', () => {
|
|
384
|
-
// 60px of a 400px sheet is inside the quarter that makes a peek, so the
|
|
385
|
-
// sheet keeps its full layout height and slides below the viewport.
|
|
386
|
-
const {hook} = setup({snapHeights: () => [60]});
|
|
387
|
-
const t = makeTarget();
|
|
388
|
-
down(hook, 0, 0, t);
|
|
389
|
-
move(hook, 320, 700, t);
|
|
390
|
-
up(hook, 320, 1100, t);
|
|
391
|
-
expect(hook.result.current.settledOffset).toBe(340);
|
|
392
|
-
expect(hook.result.current.settledLayoutOffset).toBe(0);
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
it('uses the visible shortest detent height for the dismiss overshoot', () => {
|
|
396
|
-
const {hook, onDismiss} = setup({
|
|
397
|
-
snapHeights: () => [200],
|
|
398
|
-
offscreenBlockEndInset: 48,
|
|
399
|
-
});
|
|
400
|
-
const t = makeTarget();
|
|
401
|
-
|
|
402
|
-
// Visible full height is 352px, so the 200px stop is offset 152. Its 40%
|
|
403
|
-
// dismiss overshoot ends at 232px; the hidden reserve must not extend it.
|
|
404
|
-
down(hook, 0, 0, t);
|
|
405
|
-
move(hook, 235, 1000, t);
|
|
406
|
-
up(hook, 235, 2000, t);
|
|
407
|
-
|
|
408
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it('a downward drag from a middle detent never snaps back up past it', () => {
|
|
412
|
-
// Three detents on a 600px sheet: full (offset 0), mid 360 (offset 240),
|
|
413
|
-
// short 160 (offset 440). Rest at the mid detent, then drag DOWN a modest
|
|
414
|
-
// amount that's still closer to mid than to short. It must not snap back
|
|
415
|
-
// UP to full — only to mid (stay) or further down.
|
|
416
|
-
const onSnap = vi.fn();
|
|
417
|
-
const {hook} = setup({snapHeights: () => [160, 360], onSnap});
|
|
418
|
-
const t = makeTarget();
|
|
419
|
-
t.getBoundingClientRect = () => ({height: 600}) as DOMRect;
|
|
420
|
-
// Drag to the mid detent (offset 240).
|
|
421
|
-
down(hook, 0, 0, t);
|
|
422
|
-
move(hook, 120, 300, t);
|
|
423
|
-
move(hook, 240, 700, t);
|
|
424
|
-
up(hook, 240, 1100, t);
|
|
425
|
-
expect(hook.result.current.settledOffset).toBe(240);
|
|
426
|
-
onSnap.mockClear();
|
|
427
|
-
// Small slow drag DOWN from mid: offset 240 -> ~300.
|
|
428
|
-
down(hook, 300, 2000, t);
|
|
429
|
-
move(hook, 340, 2200, t);
|
|
430
|
-
move(hook, 360, 2600, t);
|
|
431
|
-
up(hook, 360, 3000, t);
|
|
432
|
-
// Must not have jumped back up to full (offset 0).
|
|
433
|
-
expect(hook.result.current.settledOffset).not.toBe(0);
|
|
434
|
-
expect(hook.result.current.settledOffset).toBeGreaterThanOrEqual(240);
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
it('dismisses when dragged well below the shortest detent', () => {
|
|
438
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
439
|
-
const t = makeTarget();
|
|
440
|
-
// Shortest detent offset = 200 (height 200). Drag slowly past it by
|
|
441
|
-
// >40% of 200 -> offset ~320 dismisses.
|
|
442
|
-
down(hook, 0, 0, t);
|
|
443
|
-
move(hook, 160, 400, t);
|
|
444
|
-
move(hook, 330, 900, t);
|
|
445
|
-
up(hook, 330, 1400, t);
|
|
446
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
it('rebounds to the shortest detent when canDismiss is false', () => {
|
|
450
|
-
const onScrimOpacity = vi.fn();
|
|
451
|
-
const {hook, onDismiss} = setup({
|
|
452
|
-
canDismiss: false,
|
|
453
|
-
snapHeights: () => [200],
|
|
454
|
-
onScrimOpacity,
|
|
455
|
-
});
|
|
456
|
-
const t = makeTarget();
|
|
457
|
-
down(hook, 0, 0, t);
|
|
458
|
-
move(hook, 160, 400, t);
|
|
459
|
-
move(hook, 330, 900, t);
|
|
460
|
-
up(hook, 330, 1400, t);
|
|
461
|
-
|
|
462
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
463
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
464
|
-
// Rebounding restores the scrim the 200px stop rests under — full, since
|
|
465
|
-
// half a sheet is a working surface rather than a glance.
|
|
466
|
-
expect(onScrimOpacity).toHaveBeenLastCalledWith(1);
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
it('fades the scrim from full toward the peek floor as it collapses onto the peek detent', () => {
|
|
470
|
-
const onScrimOpacity = vi.fn();
|
|
471
|
-
// Sheet 400, stops at 300 and a 60px sliver -> offsets [0, 100, 340]. The
|
|
472
|
-
// fade spans the mid detent (offset 100) to the peek (offset 340): full
|
|
473
|
-
// at/above 100, thinned to the peek floor (0.3) at/below 340.
|
|
474
|
-
const {hook} = setup({snapHeights: () => [60, 300], onScrimOpacity});
|
|
475
|
-
const t = makeTarget();
|
|
476
|
-
down(hook, 0, 0, t);
|
|
477
|
-
move(hook, 60, 200, t); // offset 60, above the mid detent -> full
|
|
478
|
-
move(hook, 220, 600, t); // offset 220, halfway -> between 1 and 0.3 (~0.65)
|
|
479
|
-
move(hook, 360, 1000, t); // offset 360, past the peek -> peek floor
|
|
480
|
-
const values = onScrimOpacity.mock.calls.map(c => Number(c[0]));
|
|
481
|
-
expect(values[0]).toBe(1);
|
|
482
|
-
expect(values[1]).toBeGreaterThan(0.55);
|
|
483
|
-
expect(values[1]).toBeLessThan(0.75);
|
|
484
|
-
expect(values[values.length - 1]).toBeCloseTo(0.3);
|
|
485
|
-
});
|
|
486
|
-
|
|
487
|
-
it('thins the scrim to the peek floor when settled at the peek detent (still modal)', () => {
|
|
488
|
-
const onScrimOpacity = vi.fn();
|
|
489
|
-
const {hook} = setup({snapHeights: () => [60, 300], onScrimOpacity});
|
|
490
|
-
const t = makeTarget();
|
|
491
|
-
// Slow drag down to the peek detent (offset 340).
|
|
492
|
-
down(hook, 0, 0, t);
|
|
493
|
-
move(hook, 170, 400, t);
|
|
494
|
-
move(hook, 340, 900, t);
|
|
495
|
-
up(hook, 340, 1400, t);
|
|
496
|
-
expect(hook.result.current.settledOffset).toBe(340);
|
|
497
|
-
// Last reported opacity (on settle) is the peek floor, not fully hidden —
|
|
498
|
-
// the sheet is still modal, so the backdrop keeps a minimum dim.
|
|
499
|
-
const values = onScrimOpacity.mock.calls.map(c => Number(c[0]));
|
|
500
|
-
expect(values[values.length - 1]).toBeCloseTo(0.3);
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
it('magnetically settles the live drag onto a nearby detent', () => {
|
|
504
|
-
// Detents for a 400px sheet with snaps 300 and 200 -> visible-height snaps
|
|
505
|
-
// become offsets [0, 100, 200]. Approaching the middle detent (offset 100)
|
|
506
|
-
// from just below (raw ~90) — inside MAGNET_RANGE and BELOW the shortest
|
|
507
|
-
// detent so the between-detents magnet applies — should ease toward 100.
|
|
508
|
-
const {hook} = setup({snapHeights: () => [200, 300]});
|
|
509
|
-
const t = makeTarget();
|
|
510
|
-
down(hook, 0, 0, t);
|
|
511
|
-
move(hook, 90, 100, t); // raw offset 90, 10px from the 100 detent
|
|
512
|
-
const off = liveOffset(hook);
|
|
513
|
-
expect(off).toBeGreaterThan(90); // pulled up toward 100
|
|
514
|
-
expect(off).toBeLessThanOrEqual(100);
|
|
515
|
-
});
|
|
516
|
-
|
|
517
|
-
it('translates the surface live during a drag', () => {
|
|
518
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
519
|
-
const t = makeTarget();
|
|
520
|
-
down(hook, 0, 0, t);
|
|
521
|
-
move(hook, 50, 100, t);
|
|
522
|
-
expect(liveOffset(hook)).toBe(50);
|
|
523
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
524
|
-
// Written to the element, not rendered: the move costs one style write
|
|
525
|
-
// and no commit.
|
|
526
|
-
expect(t.style.transform).toBe('translateY(50px)');
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
it('renders nothing for a move that keeps the layout split', () => {
|
|
530
|
-
let renders = 0;
|
|
531
|
-
const onDismiss = vi.fn();
|
|
532
|
-
const hook = renderHook(
|
|
533
|
-
(props: UseSheetGesturesOptions) => {
|
|
534
|
-
renders += 1;
|
|
535
|
-
return useSheetGestures(props);
|
|
536
|
-
},
|
|
537
|
-
{initialProps: {isOpen: true, onDismiss, snapHeights: () => [200]}},
|
|
538
|
-
);
|
|
539
|
-
const t = makeTarget();
|
|
540
|
-
down(hook, 0, 0, t);
|
|
541
|
-
const rendersAtDown = renders;
|
|
542
|
-
move(hook, 30, 50, t);
|
|
543
|
-
move(hook, 60, 100, t);
|
|
544
|
-
move(hook, 90, 150, t);
|
|
545
|
-
expect(t.style.transform).toBe('translateY(90px)');
|
|
546
|
-
// One render announces that the sheet is traveling; the moves after it
|
|
547
|
-
// render nothing.
|
|
548
|
-
expect(renders - rendersAtDown).toBeLessThanOrEqual(1);
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
it('restores the full layout height when a drag crosses above its base', () => {
|
|
552
|
-
const onSnap = vi.fn();
|
|
553
|
-
const {hook} = setup({snapHeights: () => [200], onSnap});
|
|
554
|
-
const t = makeTarget();
|
|
555
|
-
// Rest at the 200px working detent: the sheet gives 200px up as layout.
|
|
556
|
-
down(hook, 0, 0, t);
|
|
557
|
-
move(hook, 200, 400, t);
|
|
558
|
-
up(hook, 200, 800, t);
|
|
559
|
-
expect(hook.result.current.settledLayoutOffset).toBe(200);
|
|
560
|
-
// Drag back up above the base: the layout split changes, and that one
|
|
561
|
-
// render carries the offset the host pairs with the new height.
|
|
562
|
-
down(hook, 200, 1000, t);
|
|
563
|
-
move(hook, 150, 1100, t);
|
|
564
|
-
expect(liveOffset(hook)).toBe(150);
|
|
565
|
-
expect(liveOffset(hook)).toBe(150);
|
|
566
|
-
expect(t.style.transform).toBe('translateY(150px)');
|
|
567
|
-
});
|
|
568
|
-
|
|
569
|
-
it('returns to the settled detent when a context menu interrupts a drag', () => {
|
|
570
|
-
const onScrimOpacity = vi.fn();
|
|
571
|
-
const {hook, onDismiss} = setup({
|
|
572
|
-
snapHeights: () => [200, 300],
|
|
573
|
-
onScrimOpacity,
|
|
574
|
-
});
|
|
575
|
-
const target = makeTarget();
|
|
576
|
-
down(hook, 0, 0, target);
|
|
577
|
-
move(hook, 300, 1000, target);
|
|
578
|
-
|
|
579
|
-
const preventDefault = vi.fn();
|
|
580
|
-
act(() =>
|
|
581
|
-
hook.result.current.handleProps.onContextMenu({
|
|
582
|
-
currentTarget: target,
|
|
583
|
-
preventDefault,
|
|
584
|
-
} as unknown as React.MouseEvent),
|
|
585
|
-
);
|
|
586
|
-
|
|
587
|
-
expect(preventDefault).toHaveBeenCalledTimes(1);
|
|
588
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
589
|
-
expect(hook.result.current.contentProps.style.transform).toBeUndefined();
|
|
590
|
-
expect(onScrimOpacity).toHaveBeenLastCalledWith(1);
|
|
591
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
it('returns to the settled detent when pointer capture is lost', () => {
|
|
595
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
596
|
-
const target = makeTarget();
|
|
597
|
-
down(hook, 0, 0, target);
|
|
598
|
-
move(hook, 300, 1000, target);
|
|
599
|
-
|
|
600
|
-
act(() =>
|
|
601
|
-
hook.result.current.handleProps.onLostPointerCapture(
|
|
602
|
-
pointerEvent(300, 1000, target),
|
|
603
|
-
),
|
|
604
|
-
);
|
|
605
|
-
|
|
606
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
607
|
-
expect(hook.result.current.contentProps.style.transform).toBeUndefined();
|
|
608
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
609
|
-
});
|
|
610
|
-
|
|
611
|
-
describe('pinch', () => {
|
|
612
|
-
// A second finger is a pinch, and pinch-zoom belongs to the browser.
|
|
613
|
-
it('declares pinch-zoom on the sliding surface and the handle', () => {
|
|
614
|
-
const {hook} = setup();
|
|
615
|
-
expect(hook.result.current.contentProps.style.touchAction).toBe(
|
|
616
|
-
'pinch-zoom',
|
|
617
|
-
);
|
|
618
|
-
expect(hook.result.current.handleProps.style.touchAction).toBe(
|
|
619
|
-
'pinch-zoom',
|
|
620
|
-
);
|
|
621
|
-
});
|
|
622
|
-
|
|
623
|
-
it('returns to the settled detent when a second finger lands on the handle', () => {
|
|
624
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
625
|
-
const target = makeTarget();
|
|
626
|
-
down(hook, 0, 0, target);
|
|
627
|
-
move(hook, 120, 200, target);
|
|
628
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
629
|
-
|
|
630
|
-
act(() =>
|
|
631
|
-
hook.result.current.handleProps.onPointerDown(
|
|
632
|
-
pointerEvent(160, 220, target, 2, 0, false),
|
|
633
|
-
),
|
|
634
|
-
);
|
|
635
|
-
|
|
636
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
637
|
-
expect(hook.result.current.contentProps.style.transform).toBeUndefined();
|
|
638
|
-
// The first finger's later release is not a drag either.
|
|
639
|
-
up(hook, 300, 400, target);
|
|
640
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
641
|
-
});
|
|
642
|
-
|
|
643
|
-
it('returns to the detent when the browser cancels a handle drag to take a pinch', () => {
|
|
644
|
-
const onSnap = vi.fn();
|
|
645
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200], onSnap});
|
|
646
|
-
const target = makeTarget();
|
|
647
|
-
down(hook, 0, 0, target);
|
|
648
|
-
// Fast enough that settling from here would throw the sheet away.
|
|
649
|
-
move(hook, 60, 20, target);
|
|
650
|
-
act(() =>
|
|
651
|
-
hook.result.current.handleProps.onPointerCancel(
|
|
652
|
-
pointerEvent(60, 22, target),
|
|
653
|
-
),
|
|
654
|
-
);
|
|
655
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
656
|
-
expect(hook.result.current.contentProps.style.transform).toBeUndefined();
|
|
657
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
658
|
-
expect(onSnap).not.toHaveBeenCalled();
|
|
659
|
-
});
|
|
660
|
-
|
|
661
|
-
it('returns a handle drag to its detent when a second finger lands off the sheet', () => {
|
|
662
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
663
|
-
const target = makeTarget();
|
|
664
|
-
down(hook, 0, 0, target);
|
|
665
|
-
move(hook, 40, 100, target);
|
|
666
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
667
|
-
act(() =>
|
|
668
|
-
hook.result.current.handleProps.onTouchMove({
|
|
669
|
-
currentTarget: target,
|
|
670
|
-
touches: [
|
|
671
|
-
{identifier: 1, clientY: 40},
|
|
672
|
-
{identifier: 2, clientY: -60},
|
|
673
|
-
],
|
|
674
|
-
} as unknown as React.TouchEvent),
|
|
675
|
-
);
|
|
676
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
677
|
-
expect(hook.result.current.contentProps.style.transform).toBeUndefined();
|
|
678
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
679
|
-
});
|
|
680
|
-
|
|
681
|
-
it('drops an armed body pull when a second pointer lands on the body', () => {
|
|
682
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
683
|
-
const body = makeTarget();
|
|
684
|
-
act(() => hook.result.current.sheetRef(body));
|
|
685
|
-
act(() =>
|
|
686
|
-
hook.result.current.bodyProps.onPointerDown(pointerEvent(0, 0, body)),
|
|
687
|
-
);
|
|
688
|
-
act(() =>
|
|
689
|
-
hook.result.current.bodyProps.onPointerDown(
|
|
690
|
-
pointerEvent(80, 10, body, 2, 0, false),
|
|
691
|
-
),
|
|
692
|
-
);
|
|
693
|
-
act(() =>
|
|
694
|
-
hook.result.current.bodyProps.onPointerMove(
|
|
695
|
-
pointerEvent(60, 100, body),
|
|
696
|
-
),
|
|
697
|
-
);
|
|
698
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
699
|
-
});
|
|
700
|
-
});
|
|
701
|
-
|
|
702
|
-
it('does not start a drag from a secondary pointer button', () => {
|
|
703
|
-
const {hook} = setup();
|
|
704
|
-
const target = makeTarget();
|
|
705
|
-
act(() => hook.result.current.sheetRef(target));
|
|
706
|
-
|
|
707
|
-
act(() =>
|
|
708
|
-
hook.result.current.handleProps.onPointerDown(
|
|
709
|
-
pointerEvent(0, 0, target, 1, 2),
|
|
710
|
-
),
|
|
711
|
-
);
|
|
712
|
-
|
|
713
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
714
|
-
});
|
|
715
|
-
|
|
716
|
-
it('rubber-bands an upward drag past the fully-open position', () => {
|
|
717
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
718
|
-
const t = makeTarget();
|
|
719
|
-
down(hook, 100, 0, t);
|
|
720
|
-
move(hook, 20, 100, t); // drag up 80px past the top of a rested-at-top sheet
|
|
721
|
-
// Overscroll is allowed but damped: a resisted fraction of the raw -80,
|
|
722
|
-
// and negative (above the top), not the raw distance and not clamped to 0.
|
|
723
|
-
const off = liveOffset(hook);
|
|
724
|
-
expect(off).toBeLessThan(0);
|
|
725
|
-
expect(off).toBeGreaterThan(-80); // resisted, so smaller in magnitude
|
|
726
|
-
});
|
|
727
|
-
|
|
728
|
-
it('dismisses a single-height sheet on a slow drag past the floor', () => {
|
|
729
|
-
const {hook, onDismiss} = setup(); // no snapHeights
|
|
730
|
-
const t = makeTarget();
|
|
731
|
-
// Only detent is the full 400px height (offset 0). A slow drag past 40%
|
|
732
|
-
// of it (>160px) with no detent to catch it dismisses.
|
|
733
|
-
down(hook, 0, 0, t);
|
|
734
|
-
move(hook, 120, 400, t);
|
|
735
|
-
move(hook, 240, 900, t);
|
|
736
|
-
up(hook, 240, 1400, t);
|
|
737
|
-
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
738
|
-
});
|
|
739
|
-
|
|
740
|
-
describe('body overscroll', () => {
|
|
741
|
-
// A scrollable body element nested inside the sheet, with a settable
|
|
742
|
-
// scrollTop so we can simulate "at the top" vs "scrolled".
|
|
743
|
-
function makeBody(scrollTop: number) {
|
|
744
|
-
const body = document.createElement('div');
|
|
745
|
-
Object.defineProperty(body, 'scrollTop', {
|
|
746
|
-
value: scrollTop,
|
|
747
|
-
writable: true,
|
|
748
|
-
});
|
|
749
|
-
body.setPointerCapture = vi.fn();
|
|
750
|
-
body.releasePointerCapture = vi.fn();
|
|
751
|
-
body.getBoundingClientRect = () => ({height: SHEET_HEIGHT}) as DOMRect;
|
|
752
|
-
return body;
|
|
753
|
-
}
|
|
754
|
-
function bodyDown(hook: Hook, y: number, t: number, el: HTMLElement) {
|
|
755
|
-
// Register a sheet element so the hook can measure height (it reads the
|
|
756
|
-
// tracked node, not the DOM). The body stands in with the right height.
|
|
757
|
-
act(() => hook.result.current.sheetRef(el));
|
|
758
|
-
act(() =>
|
|
759
|
-
hook.result.current.bodyProps.onPointerDown(pointerEvent(y, t, el)),
|
|
760
|
-
);
|
|
761
|
-
}
|
|
762
|
-
function bodyMove(hook: Hook, y: number, t: number, el: HTMLElement) {
|
|
763
|
-
act(() =>
|
|
764
|
-
hook.result.current.bodyProps.onPointerMove(pointerEvent(y, t, el)),
|
|
765
|
-
);
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
it('promotes a top-overscroll pull-down into a sheet drag', () => {
|
|
769
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
770
|
-
const body = makeBody(0); // at the top
|
|
771
|
-
bodyDown(hook, 0, 0, body);
|
|
772
|
-
bodyMove(hook, 40, 100, body); // pull down while at the top
|
|
773
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
774
|
-
expect(liveOffset(hook)).toBe(40);
|
|
775
|
-
});
|
|
776
|
-
|
|
777
|
-
/**
|
|
778
|
-
* A finger is never still. Tapping a control inside the sheet drifts a
|
|
779
|
-
* pixel or two, and with no slop that drift promoted to a sheet drag —
|
|
780
|
-
* which wrote `transition: none` onto the panel across the release, so the
|
|
781
|
-
* close the tap triggered cut instead of animating. That is the "the sheet
|
|
782
|
-
* closes with no animation" report: only on a tap, and only on a tap
|
|
783
|
-
* inside the sheet (the scrim never arms a drag).
|
|
784
|
-
*/
|
|
785
|
-
it('treats a few pixels of finger drift as a tap, not a drag', () => {
|
|
786
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
787
|
-
const body = makeBody(0); // at the top, where a pull-down would promote
|
|
788
|
-
bodyDown(hook, 0, 0, body);
|
|
789
|
-
bodyMove(hook, 3, 40, body); // the drift of a finger tapping a button
|
|
790
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
791
|
-
// and nothing suppressed the panel's transition, so a close that lands
|
|
792
|
-
// now still animates
|
|
793
|
-
expect(hook.result.current.contentProps.style.transition).toBeUndefined();
|
|
794
|
-
});
|
|
795
|
-
|
|
796
|
-
it('still promotes once the pull passes the tap slop', () => {
|
|
797
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
798
|
-
const body = makeBody(0);
|
|
799
|
-
bodyDown(hook, 0, 0, body);
|
|
800
|
-
bodyMove(hook, 9, 40, body); // just past the 8px slop
|
|
801
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
802
|
-
});
|
|
803
|
-
|
|
804
|
-
it('does not hijack scrolling when the body is scrolled down', () => {
|
|
805
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
806
|
-
const body = makeBody(120); // scrolled, not at the top
|
|
807
|
-
bodyDown(hook, 0, 0, body);
|
|
808
|
-
bodyMove(hook, 40, 100, body);
|
|
809
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
810
|
-
});
|
|
811
|
-
|
|
812
|
-
it('does not start a drag on an upward move from the top', () => {
|
|
813
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
814
|
-
const body = makeBody(0);
|
|
815
|
-
bodyDown(hook, 100, 0, body);
|
|
816
|
-
bodyMove(hook, 60, 100, body); // moving up = scrolling intent
|
|
817
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
818
|
-
});
|
|
819
|
-
});
|
|
820
|
-
|
|
821
|
-
describe('body touch handoff', () => {
|
|
822
|
-
// Attach a real DOM node via the body ref, then dispatch touch events. The
|
|
823
|
-
// hook's non-passive touchmove listener is how the handoff works on touch
|
|
824
|
-
// devices (pointer events get cancelled once native panning starts).
|
|
825
|
-
function makeScroller(opts: {
|
|
826
|
-
scrollTop: number;
|
|
827
|
-
clientHeight: number;
|
|
828
|
-
scrollHeight: number;
|
|
829
|
-
}) {
|
|
830
|
-
const sheet = makeTarget();
|
|
831
|
-
const el = document.createElement('div');
|
|
832
|
-
Object.defineProperty(el, 'scrollTop', {
|
|
833
|
-
value: opts.scrollTop,
|
|
834
|
-
writable: true,
|
|
835
|
-
});
|
|
836
|
-
Object.defineProperty(el, 'clientHeight', {value: opts.clientHeight});
|
|
837
|
-
Object.defineProperty(el, 'scrollHeight', {value: opts.scrollHeight});
|
|
838
|
-
el.getBoundingClientRect = () => ({height: SHEET_HEIGHT}) as DOMRect;
|
|
839
|
-
sheet.appendChild(el);
|
|
840
|
-
document.body.appendChild(sheet);
|
|
841
|
-
return el;
|
|
842
|
-
}
|
|
843
|
-
function touch(el: HTMLElement, type: string, y: number, id = 1) {
|
|
844
|
-
const ev = new Event(type, {bubbles: true, cancelable: true});
|
|
845
|
-
// jsdom lacks TouchEvent; attach the fields the handler reads.
|
|
846
|
-
Object.defineProperty(ev, 'changedTouches', {
|
|
847
|
-
value: [{identifier: id, clientY: y}],
|
|
848
|
-
});
|
|
849
|
-
Object.defineProperty(ev, 'touches', {
|
|
850
|
-
value:
|
|
851
|
-
type === 'touchend' || type === 'touchcancel'
|
|
852
|
-
? []
|
|
853
|
-
: [{identifier: id, clientY: y}],
|
|
854
|
-
});
|
|
855
|
-
Object.defineProperty(ev, 'currentTarget', {value: el});
|
|
856
|
-
el.dispatchEvent(ev);
|
|
857
|
-
return ev;
|
|
858
|
-
}
|
|
859
|
-
|
|
860
|
-
it('promotes a top pull-down (touch) into a sheet drag', () => {
|
|
861
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
862
|
-
const el = makeScroller({
|
|
863
|
-
scrollTop: 0,
|
|
864
|
-
clientHeight: 200,
|
|
865
|
-
scrollHeight: 800,
|
|
866
|
-
});
|
|
867
|
-
act(() => hook.result.current.sheetRef(el));
|
|
868
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
869
|
-
act(() => {
|
|
870
|
-
touch(el, 'touchstart', 0);
|
|
871
|
-
touch(el, 'touchmove', 50);
|
|
872
|
-
});
|
|
873
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
874
|
-
});
|
|
875
|
-
|
|
876
|
-
it('promotes a bottom pull-up (touch) into a sheet drag that travels', () => {
|
|
877
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
878
|
-
// scrolled to the bottom: scrollTop + clientHeight === scrollHeight
|
|
879
|
-
const el = makeScroller({
|
|
880
|
-
scrollTop: 600,
|
|
881
|
-
clientHeight: 200,
|
|
882
|
-
scrollHeight: 800,
|
|
883
|
-
});
|
|
884
|
-
act(() => hook.result.current.sheetRef(el));
|
|
885
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
886
|
-
// Settle at the lower detent first, so expanding has somewhere to go.
|
|
887
|
-
down(hook, 0, 0, el);
|
|
888
|
-
move(hook, 180, 700, el);
|
|
889
|
-
up(hook, 180, 1100, el);
|
|
890
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
891
|
-
|
|
892
|
-
act(() => {
|
|
893
|
-
touch(el, 'touchstart', 300);
|
|
894
|
-
touch(el, 'touchmove', 250); // pull up
|
|
895
|
-
});
|
|
896
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
897
|
-
// The handoff is only worth taking if the sheet follows the finger:
|
|
898
|
-
// 50px of pull expands 50px toward the tallest detent.
|
|
899
|
-
expect(liveOffset(hook)).toBe(150);
|
|
900
|
-
});
|
|
901
|
-
|
|
902
|
-
it('leaves a bottom pull-up with the scroller at the tallest detent', () => {
|
|
903
|
-
// Regression: the sheet is already fully expanded, so an upward pull has
|
|
904
|
-
// nowhere to expand to. Promoting it produced a rubber-band the release
|
|
905
|
-
// threw straight back, and stole the gesture from the scroller.
|
|
906
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
907
|
-
const el = makeScroller({
|
|
908
|
-
scrollTop: 600,
|
|
909
|
-
clientHeight: 200,
|
|
910
|
-
scrollHeight: 800,
|
|
911
|
-
});
|
|
912
|
-
act(() => hook.result.current.sheetRef(el));
|
|
913
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
914
|
-
expect(hook.result.current.settledOffset).toBe(0);
|
|
915
|
-
|
|
916
|
-
act(() => {
|
|
917
|
-
touch(el, 'touchstart', 300);
|
|
918
|
-
touch(el, 'touchmove', 250); // pull up
|
|
919
|
-
});
|
|
920
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
921
|
-
expect(hook.result.current.dragOffset).toBe(0);
|
|
922
|
-
});
|
|
923
|
-
|
|
924
|
-
it('does not preventDefault a bottom pull-up at the tallest detent', () => {
|
|
925
|
-
// The captured gesture was the worse half of the bug: once promoted,
|
|
926
|
-
// every later touchmove was preventDefault()ed, so reversing downward to
|
|
927
|
-
// scroll back collapsed the sheet instead of scrolling.
|
|
928
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
929
|
-
const el = makeScroller({
|
|
930
|
-
scrollTop: 600,
|
|
931
|
-
clientHeight: 200,
|
|
932
|
-
scrollHeight: 800,
|
|
933
|
-
});
|
|
934
|
-
act(() => hook.result.current.sheetRef(el));
|
|
935
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
936
|
-
|
|
937
|
-
let pullUp: Event | undefined;
|
|
938
|
-
let reverseDown: Event | undefined;
|
|
939
|
-
act(() => {
|
|
940
|
-
touch(el, 'touchstart', 300);
|
|
941
|
-
pullUp = touch(el, 'touchmove', 250);
|
|
942
|
-
reverseDown = touch(el, 'touchmove', 400);
|
|
943
|
-
});
|
|
944
|
-
expect(pullUp?.defaultPrevented).toBe(false);
|
|
945
|
-
expect(reverseDown?.defaultPrevented).toBe(false);
|
|
946
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
947
|
-
});
|
|
948
|
-
|
|
949
|
-
it('finishes the active drag when another ended touch is listed first', () => {
|
|
950
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
951
|
-
const el = makeScroller({
|
|
952
|
-
scrollTop: 0,
|
|
953
|
-
clientHeight: 200,
|
|
954
|
-
scrollHeight: 800,
|
|
955
|
-
});
|
|
956
|
-
act(() => hook.result.current.sheetRef(el));
|
|
957
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
958
|
-
act(() => {
|
|
959
|
-
touch(el, 'touchstart', 0, 2);
|
|
960
|
-
touch(el, 'touchmove', 300, 2);
|
|
961
|
-
|
|
962
|
-
const end = new Event('touchend', {
|
|
963
|
-
bubbles: true,
|
|
964
|
-
cancelable: true,
|
|
965
|
-
});
|
|
966
|
-
Object.defineProperty(end, 'changedTouches', {
|
|
967
|
-
value: [
|
|
968
|
-
{identifier: 1, clientY: 100},
|
|
969
|
-
{identifier: 2, clientY: 300},
|
|
970
|
-
],
|
|
971
|
-
});
|
|
972
|
-
Object.defineProperty(end, 'touches', {value: []});
|
|
973
|
-
el.dispatchEvent(end);
|
|
974
|
-
});
|
|
975
|
-
|
|
976
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
977
|
-
});
|
|
978
|
-
|
|
979
|
-
function secondFinger(el: HTMLElement, y: number, firstY: number) {
|
|
980
|
-
const ev = new Event('touchstart', {bubbles: true, cancelable: true});
|
|
981
|
-
Object.defineProperty(ev, 'changedTouches', {
|
|
982
|
-
value: [{identifier: 2, clientY: y}],
|
|
983
|
-
});
|
|
984
|
-
Object.defineProperty(ev, 'touches', {
|
|
985
|
-
value: [
|
|
986
|
-
{identifier: 1, clientY: firstY},
|
|
987
|
-
{identifier: 2, clientY: y},
|
|
988
|
-
],
|
|
989
|
-
});
|
|
990
|
-
Object.defineProperty(ev, 'currentTarget', {value: el});
|
|
991
|
-
el.dispatchEvent(ev);
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
it('leaves a pinch at the top to the browser', () => {
|
|
995
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
996
|
-
const el = makeScroller({
|
|
997
|
-
scrollTop: 0,
|
|
998
|
-
clientHeight: 200,
|
|
999
|
-
scrollHeight: 800,
|
|
1000
|
-
});
|
|
1001
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1002
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
1003
|
-
let pull: Event | undefined;
|
|
1004
|
-
act(() => {
|
|
1005
|
-
touch(el, 'touchstart', 100);
|
|
1006
|
-
secondFinger(el, 140, 100);
|
|
1007
|
-
// The spread carries the second finger down past the promotion slop.
|
|
1008
|
-
pull = touch(el, 'touchmove', 160, 2);
|
|
1009
|
-
});
|
|
1010
|
-
expect(pull?.defaultPrevented).toBe(false);
|
|
1011
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1012
|
-
});
|
|
1013
|
-
|
|
1014
|
-
it('returns a pull in flight to its detent when a second finger lands', () => {
|
|
1015
|
-
const {hook, onDismiss} = setup({snapHeights: () => [200]});
|
|
1016
|
-
const el = makeScroller({
|
|
1017
|
-
scrollTop: 0,
|
|
1018
|
-
clientHeight: 200,
|
|
1019
|
-
scrollHeight: 800,
|
|
1020
|
-
});
|
|
1021
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1022
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
1023
|
-
act(() => {
|
|
1024
|
-
touch(el, 'touchstart', 0);
|
|
1025
|
-
touch(el, 'touchmove', 50);
|
|
1026
|
-
});
|
|
1027
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1028
|
-
|
|
1029
|
-
let after: Event | undefined;
|
|
1030
|
-
act(() => {
|
|
1031
|
-
secondFinger(el, 120, 50);
|
|
1032
|
-
after = touch(el, 'touchmove', 90);
|
|
1033
|
-
touch(el, 'touchend', 90);
|
|
1034
|
-
});
|
|
1035
|
-
expect(after?.defaultPrevented).toBe(false);
|
|
1036
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1037
|
-
expect(hook.result.current.contentProps.style.transform).toBeUndefined();
|
|
1038
|
-
expect(onDismiss).not.toHaveBeenCalled();
|
|
1039
|
-
});
|
|
1040
|
-
|
|
1041
|
-
it('leaves a pinch to the browser when the body finger lands first and the second lands on the handle', () => {
|
|
1042
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1043
|
-
const el = makeScroller({
|
|
1044
|
-
scrollTop: 0,
|
|
1045
|
-
clientHeight: 200,
|
|
1046
|
-
scrollHeight: 800,
|
|
1047
|
-
});
|
|
1048
|
-
const handle = makeTarget();
|
|
1049
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1050
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
1051
|
-
let pull: Event | undefined;
|
|
1052
|
-
act(() => {
|
|
1053
|
-
touch(el, 'touchstart', 100);
|
|
1054
|
-
hook.result.current.handleProps.onPointerDown(
|
|
1055
|
-
pointerEvent(20, 10, handle, 2, 0, false),
|
|
1056
|
-
);
|
|
1057
|
-
// The spread carries the body finger down past the promotion slop.
|
|
1058
|
-
pull = touch(el, 'touchmove', 160);
|
|
1059
|
-
});
|
|
1060
|
-
expect(pull?.defaultPrevented).toBe(false);
|
|
1061
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1062
|
-
});
|
|
1063
|
-
|
|
1064
|
-
it('leaves a pinch to the browser when the second finger lands off the body', () => {
|
|
1065
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1066
|
-
const el = makeScroller({
|
|
1067
|
-
scrollTop: 0,
|
|
1068
|
-
clientHeight: 200,
|
|
1069
|
-
scrollHeight: 800,
|
|
1070
|
-
});
|
|
1071
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1072
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
1073
|
-
let pull: Event | undefined;
|
|
1074
|
-
act(() => {
|
|
1075
|
-
touch(el, 'touchstart', 100);
|
|
1076
|
-
// No listener here saw the second finger arrive; `touches` lists it.
|
|
1077
|
-
const ev = new Event('touchmove', {bubbles: true, cancelable: true});
|
|
1078
|
-
Object.defineProperty(ev, 'changedTouches', {
|
|
1079
|
-
value: [{identifier: 1, clientY: 160}],
|
|
1080
|
-
});
|
|
1081
|
-
Object.defineProperty(ev, 'touches', {
|
|
1082
|
-
value: [
|
|
1083
|
-
{identifier: 1, clientY: 160},
|
|
1084
|
-
{identifier: 2, clientY: 20},
|
|
1085
|
-
],
|
|
1086
|
-
});
|
|
1087
|
-
Object.defineProperty(ev, 'currentTarget', {value: el});
|
|
1088
|
-
el.dispatchEvent(ev);
|
|
1089
|
-
pull = ev;
|
|
1090
|
-
});
|
|
1091
|
-
expect(pull?.defaultPrevented).toBe(false);
|
|
1092
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1093
|
-
});
|
|
1094
|
-
|
|
1095
|
-
it('leaves native scrolling alone in the middle of the content', () => {
|
|
1096
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1097
|
-
const el = makeScroller({
|
|
1098
|
-
scrollTop: 300,
|
|
1099
|
-
clientHeight: 200,
|
|
1100
|
-
scrollHeight: 800,
|
|
1101
|
-
});
|
|
1102
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1103
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
1104
|
-
act(() => {
|
|
1105
|
-
touch(el, 'touchstart', 300);
|
|
1106
|
-
touch(el, 'touchmove', 250);
|
|
1107
|
-
});
|
|
1108
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1109
|
-
});
|
|
1110
|
-
});
|
|
1111
|
-
|
|
1112
|
-
describe('body touch handoff from a nested scroller', () => {
|
|
1113
|
-
// A host that scrolls content in a box of its own inside the body (a
|
|
1114
|
-
// pinned header and footer around a scrolling middle, a grid) never moves
|
|
1115
|
-
// the body's scrollTop. The edge that decides the handoff is the edge of
|
|
1116
|
-
// the box under the finger, not the body's.
|
|
1117
|
-
function makeNested(opts: {
|
|
1118
|
-
bodyScrollTop: number;
|
|
1119
|
-
bodyScrollHeight?: number;
|
|
1120
|
-
innerScrollTop: number;
|
|
1121
|
-
innerScrollHeight?: number;
|
|
1122
|
-
}) {
|
|
1123
|
-
const sheet = makeTarget();
|
|
1124
|
-
const body = document.createElement('div');
|
|
1125
|
-
Object.defineProperty(body, 'scrollTop', {
|
|
1126
|
-
value: opts.bodyScrollTop,
|
|
1127
|
-
writable: true,
|
|
1128
|
-
});
|
|
1129
|
-
Object.defineProperty(body, 'clientHeight', {value: 400});
|
|
1130
|
-
Object.defineProperty(body, 'scrollHeight', {
|
|
1131
|
-
value: opts.bodyScrollHeight ?? 400,
|
|
1132
|
-
});
|
|
1133
|
-
body.getBoundingClientRect = () => ({height: SHEET_HEIGHT}) as DOMRect;
|
|
1134
|
-
const inner = document.createElement('div');
|
|
1135
|
-
inner.style.overflowY = 'auto';
|
|
1136
|
-
Object.defineProperty(inner, 'scrollTop', {
|
|
1137
|
-
value: opts.innerScrollTop,
|
|
1138
|
-
writable: true,
|
|
1139
|
-
});
|
|
1140
|
-
Object.defineProperty(inner, 'clientHeight', {value: 200});
|
|
1141
|
-
Object.defineProperty(inner, 'scrollHeight', {
|
|
1142
|
-
value: opts.innerScrollHeight ?? 800,
|
|
1143
|
-
});
|
|
1144
|
-
const tile = document.createElement('button');
|
|
1145
|
-
inner.appendChild(tile);
|
|
1146
|
-
body.appendChild(inner);
|
|
1147
|
-
sheet.appendChild(body);
|
|
1148
|
-
document.body.appendChild(sheet);
|
|
1149
|
-
return {body, inner, tile};
|
|
1150
|
-
}
|
|
1151
|
-
function touchOn(
|
|
1152
|
-
target: HTMLElement,
|
|
1153
|
-
listener: HTMLElement,
|
|
1154
|
-
type: string,
|
|
1155
|
-
y: number,
|
|
1156
|
-
id = 1,
|
|
1157
|
-
) {
|
|
1158
|
-
const ev = new Event(type, {bubbles: true, cancelable: true});
|
|
1159
|
-
Object.defineProperty(ev, 'changedTouches', {
|
|
1160
|
-
value: [{identifier: id, clientY: y}],
|
|
1161
|
-
});
|
|
1162
|
-
Object.defineProperty(ev, 'touches', {
|
|
1163
|
-
value:
|
|
1164
|
-
type === 'touchend' || type === 'touchcancel'
|
|
1165
|
-
? []
|
|
1166
|
-
: [{identifier: id, clientY: y}],
|
|
1167
|
-
});
|
|
1168
|
-
Object.defineProperty(ev, 'currentTarget', {value: listener});
|
|
1169
|
-
target.dispatchEvent(ev);
|
|
1170
|
-
return ev;
|
|
1171
|
-
}
|
|
1172
|
-
|
|
1173
|
-
it('leaves a pull-down to a nested scroller that is scrolled', () => {
|
|
1174
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1175
|
-
const {body, tile} = makeNested({bodyScrollTop: 0, innerScrollTop: 120});
|
|
1176
|
-
act(() => hook.result.current.sheetRef(body));
|
|
1177
|
-
act(() => hook.result.current.bodyProps.ref(body));
|
|
1178
|
-
let pull: Event | undefined;
|
|
1179
|
-
act(() => {
|
|
1180
|
-
touchOn(tile, body, 'touchstart', 100);
|
|
1181
|
-
pull = touchOn(tile, body, 'touchmove', 160);
|
|
1182
|
-
});
|
|
1183
|
-
expect(pull?.defaultPrevented).toBe(false);
|
|
1184
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1185
|
-
});
|
|
1186
|
-
|
|
1187
|
-
it('promotes a pull-down from the top of a nested scroller', () => {
|
|
1188
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1189
|
-
const {body, tile} = makeNested({bodyScrollTop: 0, innerScrollTop: 0});
|
|
1190
|
-
act(() => hook.result.current.sheetRef(body));
|
|
1191
|
-
act(() => hook.result.current.bodyProps.ref(body));
|
|
1192
|
-
let pull: Event | undefined;
|
|
1193
|
-
act(() => {
|
|
1194
|
-
touchOn(tile, body, 'touchstart', 100);
|
|
1195
|
-
pull = touchOn(tile, body, 'touchmove', 160);
|
|
1196
|
-
});
|
|
1197
|
-
expect(pull?.defaultPrevented).toBe(true);
|
|
1198
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1199
|
-
expect(liveOffset(hook)).toBe(60);
|
|
1200
|
-
expect(body.style.transform).toBe('translateY(60px)');
|
|
1201
|
-
});
|
|
1202
|
-
|
|
1203
|
-
it('chains to a scrolled body before the sheet when the nested box is at its top', () => {
|
|
1204
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1205
|
-
const {body, tile} = makeNested({
|
|
1206
|
-
bodyScrollTop: 80,
|
|
1207
|
-
bodyScrollHeight: 900,
|
|
1208
|
-
innerScrollTop: 0,
|
|
1209
|
-
});
|
|
1210
|
-
act(() => hook.result.current.sheetRef(body));
|
|
1211
|
-
act(() => hook.result.current.bodyProps.ref(body));
|
|
1212
|
-
let pull: Event | undefined;
|
|
1213
|
-
act(() => {
|
|
1214
|
-
touchOn(tile, body, 'touchstart', 100);
|
|
1215
|
-
pull = touchOn(tile, body, 'touchmove', 160);
|
|
1216
|
-
});
|
|
1217
|
-
// The browser scrolls the body back up; the sheet's turn has not come.
|
|
1218
|
-
expect(pull?.defaultPrevented).toBe(false);
|
|
1219
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1220
|
-
});
|
|
1221
|
-
|
|
1222
|
-
it('reads the body when the nested box has nothing to scroll', () => {
|
|
1223
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1224
|
-
const {body, tile} = makeNested({
|
|
1225
|
-
bodyScrollTop: 0,
|
|
1226
|
-
innerScrollTop: 0,
|
|
1227
|
-
innerScrollHeight: 200,
|
|
1228
|
-
});
|
|
1229
|
-
act(() => hook.result.current.sheetRef(body));
|
|
1230
|
-
act(() => hook.result.current.bodyProps.ref(body));
|
|
1231
|
-
act(() => {
|
|
1232
|
-
touchOn(tile, body, 'touchstart', 100);
|
|
1233
|
-
touchOn(tile, body, 'touchmove', 160);
|
|
1234
|
-
});
|
|
1235
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1236
|
-
});
|
|
1237
|
-
|
|
1238
|
-
it('leaves a touch that starts inside a nested <dialog> to that layer', () => {
|
|
1239
|
-
// A sheet opened from this sheet's content renders its <dialog> inside
|
|
1240
|
-
// the body, so its touches bubble here. The same pull-down from the
|
|
1241
|
-
// body's own content promotes (see above); from the nested layer it
|
|
1242
|
-
// must not.
|
|
1243
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1244
|
-
const {body} = makeNested({
|
|
1245
|
-
bodyScrollTop: 0,
|
|
1246
|
-
innerScrollTop: 0,
|
|
1247
|
-
innerScrollHeight: 200,
|
|
1248
|
-
});
|
|
1249
|
-
const nested = document.createElement('dialog');
|
|
1250
|
-
const nestedHandle = document.createElement('div');
|
|
1251
|
-
nested.appendChild(nestedHandle);
|
|
1252
|
-
body.appendChild(nested);
|
|
1253
|
-
act(() => hook.result.current.sheetRef(body));
|
|
1254
|
-
act(() => hook.result.current.bodyProps.ref(body));
|
|
1255
|
-
let start: Event | undefined;
|
|
1256
|
-
let pull: Event | undefined;
|
|
1257
|
-
act(() => {
|
|
1258
|
-
start = touchOn(nestedHandle, body, 'touchstart', 100);
|
|
1259
|
-
pull = touchOn(nestedHandle, body, 'touchmove', 160);
|
|
1260
|
-
});
|
|
1261
|
-
expect(start?.defaultPrevented).toBe(false);
|
|
1262
|
-
expect(pull?.defaultPrevented).toBe(false);
|
|
1263
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1264
|
-
expect(liveOffset(hook)).toBe(0);
|
|
1265
|
-
expect(body.style.transform).toBe('');
|
|
1266
|
-
});
|
|
1267
|
-
|
|
1268
|
-
it('leaves a pull-up to a nested scroller with content below', () => {
|
|
1269
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1270
|
-
const {body, tile} = makeNested({bodyScrollTop: 0, innerScrollTop: 100});
|
|
1271
|
-
act(() => hook.result.current.sheetRef(body));
|
|
1272
|
-
act(() => hook.result.current.bodyProps.ref(body));
|
|
1273
|
-
// Rest at the lower detent, so an expanding handoff would have somewhere
|
|
1274
|
-
// to go if the body's edge were read.
|
|
1275
|
-
down(hook, 0, 0, body);
|
|
1276
|
-
move(hook, 180, 700, body);
|
|
1277
|
-
up(hook, 180, 1100, body);
|
|
1278
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
1279
|
-
let pull: Event | undefined;
|
|
1280
|
-
act(() => {
|
|
1281
|
-
touchOn(tile, body, 'touchstart', 300);
|
|
1282
|
-
pull = touchOn(tile, body, 'touchmove', 250);
|
|
1283
|
-
});
|
|
1284
|
-
expect(pull?.defaultPrevented).toBe(false);
|
|
1285
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1286
|
-
});
|
|
1287
|
-
|
|
1288
|
-
it('arms the pointer path on the nested scroller too', () => {
|
|
1289
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1290
|
-
const {body, tile} = makeNested({bodyScrollTop: 0, innerScrollTop: 120});
|
|
1291
|
-
act(() => hook.result.current.sheetRef(body));
|
|
1292
|
-
const over = (y: number, t: number) => {
|
|
1293
|
-
const ev = pointerEvent(y, t, body);
|
|
1294
|
-
Object.defineProperty(ev, 'target', {value: tile});
|
|
1295
|
-
return ev;
|
|
1296
|
-
};
|
|
1297
|
-
act(() => hook.result.current.bodyProps.onPointerDown(over(0, 0)));
|
|
1298
|
-
act(() => hook.result.current.bodyProps.onPointerMove(over(40, 100)));
|
|
1299
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1300
|
-
});
|
|
1301
|
-
});
|
|
1302
|
-
|
|
1303
|
-
describe('body touch handoff mid-gesture', () => {
|
|
1304
|
-
// The reported bug: the finger lands mid-content, swipes up, REACHES the
|
|
1305
|
-
// end of the content, and keeps pulling in the same continuous gesture.
|
|
1306
|
-
// Arming decided at touchstart can never see that, and by the time the
|
|
1307
|
-
// scroller is at its end the browser owns the gesture — every remaining
|
|
1308
|
-
// touchmove is non-cancelable, so preventDefault() is not available to
|
|
1309
|
-
// promote with. These cases pin the anchored, cancel-free handoff instead.
|
|
1310
|
-
function makeScroller(opts: {
|
|
1311
|
-
scrollTop: number;
|
|
1312
|
-
clientHeight: number;
|
|
1313
|
-
scrollHeight: number;
|
|
1314
|
-
}) {
|
|
1315
|
-
const sheet = makeTarget();
|
|
1316
|
-
const el = document.createElement('div');
|
|
1317
|
-
Object.defineProperty(el, 'scrollTop', {
|
|
1318
|
-
value: opts.scrollTop,
|
|
1319
|
-
writable: true,
|
|
1320
|
-
});
|
|
1321
|
-
Object.defineProperty(el, 'clientHeight', {value: opts.clientHeight});
|
|
1322
|
-
Object.defineProperty(el, 'scrollHeight', {value: opts.scrollHeight});
|
|
1323
|
-
el.getBoundingClientRect = () => ({height: SHEET_HEIGHT}) as DOMRect;
|
|
1324
|
-
sheet.appendChild(el);
|
|
1325
|
-
document.body.appendChild(sheet);
|
|
1326
|
-
return el;
|
|
1327
|
-
}
|
|
1328
|
-
function touch(el: HTMLElement, type: string, y: number, id = 1) {
|
|
1329
|
-
const ev = new Event(type, {bubbles: true, cancelable: true});
|
|
1330
|
-
Object.defineProperty(ev, 'changedTouches', {
|
|
1331
|
-
value: [{identifier: id, clientY: y}],
|
|
1332
|
-
});
|
|
1333
|
-
Object.defineProperty(ev, 'touches', {
|
|
1334
|
-
value:
|
|
1335
|
-
type === 'touchend' || type === 'touchcancel'
|
|
1336
|
-
? []
|
|
1337
|
-
: [{identifier: id, clientY: y}],
|
|
1338
|
-
});
|
|
1339
|
-
Object.defineProperty(ev, 'currentTarget', {value: el});
|
|
1340
|
-
el.dispatchEvent(ev);
|
|
1341
|
-
return ev;
|
|
1342
|
-
}
|
|
1343
|
-
// A scroller with 600px of scrollable content, resting one detent down so
|
|
1344
|
-
// an upward pull has somewhere to expand to.
|
|
1345
|
-
function midDetentScroller(hook: Hook, scrollTop: number) {
|
|
1346
|
-
const el = makeScroller({
|
|
1347
|
-
scrollTop,
|
|
1348
|
-
clientHeight: 200,
|
|
1349
|
-
scrollHeight: 800,
|
|
1350
|
-
});
|
|
1351
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1352
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
1353
|
-
down(hook, 0, 0, el);
|
|
1354
|
-
move(hook, 180, 700, el);
|
|
1355
|
-
up(hook, 180, 1100, el);
|
|
1356
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
1357
|
-
return el;
|
|
1358
|
-
}
|
|
1359
|
-
|
|
1360
|
-
// iOS Safari raises PointerEvents for a finger under the SAME numeric id
|
|
1361
|
-
// it puts in `Touch.identifier`, so a drag the touch path starts is keyed
|
|
1362
|
-
// to a live pointer. WebKit takes that pointer's capture straight back,
|
|
1363
|
-
// and the `lostpointercapture` that follows used to cancel the drag one
|
|
1364
|
-
// event after it began — leaving the sheet inert for the rest of the pull
|
|
1365
|
-
// while the handle still worked. Every browser that keeps the two id
|
|
1366
|
-
// spaces apart hides this, which is why it only showed up on device.
|
|
1367
|
-
it('survives a lostpointercapture for the finger driving it', () => {
|
|
1368
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1369
|
-
const el = midDetentScroller(hook, 600); // parked at the content end
|
|
1370
|
-
act(() => {
|
|
1371
|
-
touch(el, 'touchstart', 500, 7);
|
|
1372
|
-
touch(el, 'touchmove', 450, 7); // promotes at the armed bottom edge
|
|
1373
|
-
});
|
|
1374
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1375
|
-
act(() => {
|
|
1376
|
-
hook.result.current.bodyProps.onLostPointerCapture(
|
|
1377
|
-
pointerEvent(450, 0, el, 7), // same id as the touch: iOS does this
|
|
1378
|
-
);
|
|
1379
|
-
});
|
|
1380
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1381
|
-
act(() => {
|
|
1382
|
-
touch(el, 'touchmove', 400, 7);
|
|
1383
|
-
});
|
|
1384
|
-
// 100px of pull past the touchstart, from the 200px detent.
|
|
1385
|
-
expect(liveOffset(hook)).toBe(100);
|
|
1386
|
-
});
|
|
1387
|
-
|
|
1388
|
-
// `pointercancel` for that same finger arrives the moment WebKit claims
|
|
1389
|
-
// the gesture. Ending the drag on it settles the sheet mid-pull.
|
|
1390
|
-
it('does not end the touch drag on a pointercancel for that finger', () => {
|
|
1391
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1392
|
-
const el = midDetentScroller(hook, 600);
|
|
1393
|
-
act(() => {
|
|
1394
|
-
touch(el, 'touchstart', 500, 7);
|
|
1395
|
-
touch(el, 'touchmove', 450, 7);
|
|
1396
|
-
});
|
|
1397
|
-
act(() => {
|
|
1398
|
-
hook.result.current.bodyProps.onPointerCancel(
|
|
1399
|
-
pointerEvent(450, 0, el, 7),
|
|
1400
|
-
);
|
|
1401
|
-
});
|
|
1402
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1403
|
-
});
|
|
1404
|
-
|
|
1405
|
-
it('hands off when the content runs out under a moving finger', () => {
|
|
1406
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1407
|
-
const el = midDetentScroller(hook, 300); // finger lands mid-content
|
|
1408
|
-
act(() => {
|
|
1409
|
-
touch(el, 'touchstart', 500);
|
|
1410
|
-
el.scrollTop = 450; // the swipe scrolls the content...
|
|
1411
|
-
touch(el, 'touchmove', 350);
|
|
1412
|
-
el.scrollTop = 600; // ...until it runs out at the bottom
|
|
1413
|
-
touch(el, 'touchmove', 200); // the content ended here
|
|
1414
|
-
touch(el, 'touchmove', 150); // 50px BEYOND the end
|
|
1415
|
-
});
|
|
1416
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1417
|
-
// Anchored where the content ran out, so only the 50px past it moves the
|
|
1418
|
-
// sheet. Anchoring at touchstart would have thrown it 350px instead.
|
|
1419
|
-
expect(liveOffset(hook)).toBe(150);
|
|
1420
|
-
});
|
|
1421
|
-
|
|
1422
|
-
it('does not preventDefault the mid-gesture handoff', () => {
|
|
1423
|
-
// By this point in the gesture the events are non-cancelable anyway, and
|
|
1424
|
-
// there is nothing to cancel: the scroller is clamped at its end.
|
|
1425
|
-
// Claiming the gesture would only strand the content under the finger.
|
|
1426
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1427
|
-
const el = midDetentScroller(hook, 300);
|
|
1428
|
-
let atEnd: Event | undefined;
|
|
1429
|
-
let past: Event | undefined;
|
|
1430
|
-
let further: Event | undefined;
|
|
1431
|
-
act(() => {
|
|
1432
|
-
touch(el, 'touchstart', 500);
|
|
1433
|
-
el.scrollTop = 600;
|
|
1434
|
-
atEnd = touch(el, 'touchmove', 200);
|
|
1435
|
-
past = touch(el, 'touchmove', 150);
|
|
1436
|
-
further = touch(el, 'touchmove', 100);
|
|
1437
|
-
});
|
|
1438
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1439
|
-
expect(atEnd?.defaultPrevented).toBe(false);
|
|
1440
|
-
expect(past?.defaultPrevented).toBe(false);
|
|
1441
|
-
expect(further?.defaultPrevented).toBe(false);
|
|
1442
|
-
});
|
|
1443
|
-
|
|
1444
|
-
it('gives the gesture back when the finger returns to the content end', () => {
|
|
1445
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1446
|
-
const el = midDetentScroller(hook, 300);
|
|
1447
|
-
act(() => {
|
|
1448
|
-
touch(el, 'touchstart', 500);
|
|
1449
|
-
el.scrollTop = 600;
|
|
1450
|
-
touch(el, 'touchmove', 200); // the content ended here
|
|
1451
|
-
touch(el, 'touchmove', 150);
|
|
1452
|
-
});
|
|
1453
|
-
expect(liveOffset(hook)).toBe(150);
|
|
1454
|
-
|
|
1455
|
-
act(() => {
|
|
1456
|
-
touch(el, 'touchmove', 210); // back below the anchor
|
|
1457
|
-
});
|
|
1458
|
-
// The native scroll was never cancelled, so it resumes from here. Two
|
|
1459
|
-
// things moving at once is the failure mode; the sheet yields.
|
|
1460
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1461
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
1462
|
-
|
|
1463
|
-
act(() => {
|
|
1464
|
-
el.scrollTop = 600; // scrolled back to the end
|
|
1465
|
-
touch(el, 'touchmove', 190); // and pulls past it again
|
|
1466
|
-
touch(el, 'touchmove', 140);
|
|
1467
|
-
});
|
|
1468
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1469
|
-
expect(liveOffset(hook)).toBe(150);
|
|
1470
|
-
});
|
|
1471
|
-
|
|
1472
|
-
it('does not hand off on reaching the end without travelling past it', () => {
|
|
1473
|
-
// Landing on the last pixel is not a pull, and the momentum tail after
|
|
1474
|
-
// the finger lifts fires no touchmove at all, so it can never promote.
|
|
1475
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1476
|
-
const el = midDetentScroller(hook, 300);
|
|
1477
|
-
act(() => {
|
|
1478
|
-
touch(el, 'touchstart', 500);
|
|
1479
|
-
el.scrollTop = 600;
|
|
1480
|
-
touch(el, 'touchmove', 200);
|
|
1481
|
-
touch(el, 'touchmove', 199); // jitter, not a pull
|
|
1482
|
-
touch(el, 'touchend', 199);
|
|
1483
|
-
el.scrollTop = 600; // momentum carries on with no finger down
|
|
1484
|
-
});
|
|
1485
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1486
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
1487
|
-
});
|
|
1488
|
-
|
|
1489
|
-
it('leaves the mid-gesture pull to the content at the tallest detent', () => {
|
|
1490
|
-
// Same #5161 rule as the touchstart-armed edge: with no taller detent
|
|
1491
|
-
// there is nothing to expand into, so the scroller keeps the gesture.
|
|
1492
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1493
|
-
const el = makeScroller({
|
|
1494
|
-
scrollTop: 300,
|
|
1495
|
-
clientHeight: 200,
|
|
1496
|
-
scrollHeight: 800,
|
|
1497
|
-
});
|
|
1498
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1499
|
-
act(() => hook.result.current.bodyProps.ref(el));
|
|
1500
|
-
expect(hook.result.current.settledOffset).toBe(0);
|
|
1501
|
-
|
|
1502
|
-
let past: Event | undefined;
|
|
1503
|
-
act(() => {
|
|
1504
|
-
touch(el, 'touchstart', 500);
|
|
1505
|
-
el.scrollTop = 600;
|
|
1506
|
-
touch(el, 'touchmove', 200);
|
|
1507
|
-
past = touch(el, 'touchmove', 100);
|
|
1508
|
-
});
|
|
1509
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1510
|
-
expect(hook.result.current.dragOffset).toBe(0);
|
|
1511
|
-
expect(past?.defaultPrevented).toBe(false);
|
|
1512
|
-
});
|
|
1513
|
-
|
|
1514
|
-
it('does not hand off while the content can still scroll', () => {
|
|
1515
|
-
const {hook} = setup({snapHeights: () => [200]});
|
|
1516
|
-
const el = midDetentScroller(hook, 0);
|
|
1517
|
-
act(() => {
|
|
1518
|
-
touch(el, 'touchstart', 500);
|
|
1519
|
-
el.scrollTop = 200;
|
|
1520
|
-
touch(el, 'touchmove', 300);
|
|
1521
|
-
el.scrollTop = 400;
|
|
1522
|
-
touch(el, 'touchmove', 100); // 400px of pull, all of it scrolling
|
|
1523
|
-
});
|
|
1524
|
-
expect(hook.result.current.isDragging).toBe(false);
|
|
1525
|
-
expect(hook.result.current.settledOffset).toBe(200);
|
|
1526
|
-
});
|
|
1527
|
-
});
|
|
1528
|
-
|
|
1529
|
-
describe('viewport resize', () => {
|
|
1530
|
-
// The panel pins the sheet's height in px at a resizing detent; everywhere
|
|
1531
|
-
// else the height comes from CSS (`92dvh`), which follows the viewport.
|
|
1532
|
-
// Model both, so a measurement taken while pinned reads the pin back —
|
|
1533
|
-
// that is the trap the hook has to work around.
|
|
1534
|
-
const SNAP_FRACTIONS = [0.14, 0.5, 0.92];
|
|
1535
|
-
const RESERVED_BELOW_FLOOR = 48;
|
|
1536
|
-
|
|
1537
|
-
function viewportHarness(initialViewport: number) {
|
|
1538
|
-
let viewport = initialViewport;
|
|
1539
|
-
const el = document.createElement('div');
|
|
1540
|
-
el.setPointerCapture = vi.fn();
|
|
1541
|
-
el.releasePointerCapture = vi.fn();
|
|
1542
|
-
el.getBoundingClientRect = () =>
|
|
1543
|
-
({
|
|
1544
|
-
height: el.style.height
|
|
1545
|
-
? Number.parseFloat(el.style.height)
|
|
1546
|
-
: 0.92 * viewport + RESERVED_BELOW_FLOOR,
|
|
1547
|
-
}) as DOMRect;
|
|
1548
|
-
|
|
1549
|
-
const onSnap = vi.fn();
|
|
1550
|
-
const {hook} = setup({
|
|
1551
|
-
offscreenBlockEndInset: RESERVED_BELOW_FLOOR,
|
|
1552
|
-
snapHeights: () => SNAP_FRACTIONS.map(f => f * viewport),
|
|
1553
|
-
onSnap,
|
|
1554
|
-
});
|
|
1555
|
-
act(() => hook.result.current.sheetRef(el));
|
|
1556
|
-
|
|
1557
|
-
// What BottomSheetPanel renders at rest.
|
|
1558
|
-
const paint = () => {
|
|
1559
|
-
const {sheetHeight, settledLayoutOffset} = hook.result.current;
|
|
1560
|
-
el.style.height =
|
|
1561
|
-
settledLayoutOffset > 0
|
|
1562
|
-
? `${sheetHeight - settledLayoutOffset}px`
|
|
1563
|
-
: '';
|
|
1564
|
-
};
|
|
1565
|
-
const dragTo = (offset: number) => {
|
|
1566
|
-
// Anchor anywhere; what matters is the delta from where it rests, so
|
|
1567
|
-
// this drags in whichever direction the target detent lies.
|
|
1568
|
-
const anchor = 1000;
|
|
1569
|
-
const delta = offset - hook.result.current.settledOffset;
|
|
1570
|
-
act(() =>
|
|
1571
|
-
hook.result.current.handleProps.onPointerDown(
|
|
1572
|
-
pointerEvent(anchor, 0, el),
|
|
1573
|
-
),
|
|
1574
|
-
);
|
|
1575
|
-
// Slow: well under the flick threshold, so the release settles.
|
|
1576
|
-
act(() =>
|
|
1577
|
-
hook.result.current.handleProps.onPointerMove(
|
|
1578
|
-
pointerEvent(anchor + delta, 2000, el),
|
|
1579
|
-
),
|
|
1580
|
-
);
|
|
1581
|
-
act(() =>
|
|
1582
|
-
hook.result.current.handleProps.onPointerUp(
|
|
1583
|
-
pointerEvent(anchor + delta, 2400, el),
|
|
1584
|
-
),
|
|
1585
|
-
);
|
|
1586
|
-
// The panel resolves the settle when the transform transition ends.
|
|
1587
|
-
act(() => hook.result.current.completeScrollAreaSettle());
|
|
1588
|
-
paint();
|
|
1589
|
-
};
|
|
1590
|
-
const resizeTo = (next: number) => {
|
|
1591
|
-
viewport = next;
|
|
1592
|
-
act(() => {
|
|
1593
|
-
window.dispatchEvent(new Event('resize'));
|
|
1594
|
-
});
|
|
1595
|
-
paint();
|
|
1596
|
-
};
|
|
1597
|
-
// What the user sees: the border box, less the part reserved below the
|
|
1598
|
-
// viewport floor and the part translated past it.
|
|
1599
|
-
const visibleHeight = () =>
|
|
1600
|
-
hook.result.current.sheetHeight -
|
|
1601
|
-
RESERVED_BELOW_FLOOR -
|
|
1602
|
-
hook.result.current.settledOffset;
|
|
1603
|
-
|
|
1604
|
-
return {hook, el, onSnap, dragTo, resizeTo, visibleHeight};
|
|
1605
|
-
}
|
|
1606
|
-
|
|
1607
|
-
it('re-resolves the settled detent against the new viewport', () => {
|
|
1608
|
-
// 900px viewport: detents at 0 / 378 / 702, so the half-height stop
|
|
1609
|
-
// shows 450px of sheet.
|
|
1610
|
-
const {hook, dragTo, resizeTo, visibleHeight, onSnap} =
|
|
1611
|
-
viewportHarness(900);
|
|
1612
|
-
dragTo(378);
|
|
1613
|
-
expect(hook.result.current.settledOffset).toBe(378);
|
|
1614
|
-
expect(visibleHeight()).toBe(450);
|
|
1615
|
-
|
|
1616
|
-
resizeTo(600);
|
|
1617
|
-
|
|
1618
|
-
// Still the half-height stop, now half of 600 — not the 450px (75% of
|
|
1619
|
-
// the window) it was frozen at before.
|
|
1620
|
-
expect(visibleHeight()).toBe(300);
|
|
1621
|
-
expect(hook.result.current.settledOffset).toBe(252);
|
|
1622
|
-
expect(onSnap).toHaveBeenLastCalledWith(300);
|
|
1623
|
-
});
|
|
1624
|
-
|
|
1625
|
-
it('keeps the peek detent on screen when the viewport shrinks', () => {
|
|
1626
|
-
const {hook, dragTo, resizeTo, visibleHeight} = viewportHarness(900);
|
|
1627
|
-
dragTo(702);
|
|
1628
|
-
expect(hook.result.current.settledOffset).toBe(702);
|
|
1629
|
-
// The peek keeps its full height and slides, so its offset is the whole
|
|
1630
|
-
// of its travel — and 702px of travel does not fit in a 600px window.
|
|
1631
|
-
expect(hook.result.current.settledLayoutOffset).toBe(0);
|
|
1632
|
-
|
|
1633
|
-
resizeTo(600);
|
|
1634
|
-
|
|
1635
|
-
expect(hook.result.current.settledOffset).toBe(468);
|
|
1636
|
-
expect(hook.result.current.settledOffset).toBeLessThan(
|
|
1637
|
-
hook.result.current.sheetHeight,
|
|
1638
|
-
);
|
|
1639
|
-
expect(visibleHeight()).toBe(84);
|
|
1640
|
-
});
|
|
1641
|
-
|
|
1642
|
-
it('refreshes the fully open height the next drag measures against', () => {
|
|
1643
|
-
const {hook, dragTo, resizeTo} = viewportHarness(900);
|
|
1644
|
-
dragTo(378);
|
|
1645
|
-
expect(hook.result.current.sheetHeight).toBe(876);
|
|
1646
|
-
|
|
1647
|
-
resizeTo(600);
|
|
1648
|
-
|
|
1649
|
-
// Measured through the pinned height the panel had written for the old
|
|
1650
|
-
// viewport, so this is the natural budget and not the stale pin.
|
|
1651
|
-
expect(hook.result.current.sheetHeight).toBe(600);
|
|
1652
|
-
|
|
1653
|
-
// Dragging back up lands on fully open rather than overshooting past it
|
|
1654
|
-
// toward where fully open used to be.
|
|
1655
|
-
dragTo(0);
|
|
1656
|
-
expect(hook.result.current.settledOffset).toBe(0);
|
|
1657
|
-
expect(hook.result.current.settledLayoutOffset).toBe(0);
|
|
1658
|
-
});
|
|
1659
|
-
|
|
1660
|
-
it('leaves a drag in progress alone', () => {
|
|
1661
|
-
const {hook, el} = viewportHarness(900);
|
|
1662
|
-
act(() =>
|
|
1663
|
-
hook.result.current.handleProps.onPointerDown(pointerEvent(0, 0, el)),
|
|
1664
|
-
);
|
|
1665
|
-
act(() =>
|
|
1666
|
-
hook.result.current.handleProps.onPointerMove(
|
|
1667
|
-
pointerEvent(200, 2000, el),
|
|
1668
|
-
),
|
|
1669
|
-
);
|
|
1670
|
-
|
|
1671
|
-
act(() => {
|
|
1672
|
-
window.dispatchEvent(new Event('resize'));
|
|
1673
|
-
});
|
|
1674
|
-
|
|
1675
|
-
expect(hook.result.current.isDragging).toBe(true);
|
|
1676
|
-
expect(hook.result.current.sheetHeight).toBe(876);
|
|
1677
|
-
expect(hook.result.current.settledOffset).toBe(0);
|
|
1678
|
-
});
|
|
1679
|
-
|
|
1680
|
-
it('stops re-resolving once the sheet closes', () => {
|
|
1681
|
-
const {hook, dragTo, resizeTo} = viewportHarness(900);
|
|
1682
|
-
dragTo(378);
|
|
1683
|
-
act(() => hook.rerender({isOpen: false, onDismiss: vi.fn()}));
|
|
1684
|
-
|
|
1685
|
-
resizeTo(600);
|
|
1686
|
-
|
|
1687
|
-
expect(hook.result.current.sheetHeight).toBe(876);
|
|
1688
|
-
});
|
|
1689
|
-
});
|
|
1690
|
-
});
|