@astryxdesign/core 0.7.7 → 0.7.8-canary.0b39b51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/AlertDialog.d.ts +4 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +46 -6
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +5 -0
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +1 -0
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +25 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
- package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
- package/dist/BottomSheet/useMobileKeyboard.js +6 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +12 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +17 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +15 -16
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +2 -0
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +4 -0
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +2 -1
- package/dist/Chat/useChatDictation.d.ts.map +1 -1
- package/dist/Chat/useChatDictation.js +2 -0
- package/dist/Chat/useChatNewMessages.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +2 -0
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +3 -0
- package/dist/Chat/useTriggerMenu.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +17 -12
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +28 -11
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +2 -0
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +2 -0
- package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +14 -4
- package/dist/ContextMenu/ContextMenu.js +2 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +5 -2
- package/dist/DateInput/PickerWheel.d.ts +19 -0
- package/dist/DateInput/PickerWheel.d.ts.map +1 -0
- package/dist/DateInput/PickerWheel.js +625 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +1 -0
- package/dist/DateInput/Wheel.d.ts +18 -37
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +84 -113
- package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
- package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
- package/dist/DateInput/useOwnScrollGesture.js +16 -3
- package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
- package/dist/DateInput/usePointerDragScroll.js +2 -0
- package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
- package/dist/DateInput/useScrollSettle.js +3 -0
- package/dist/DateInput/useWheelListbox.d.ts +59 -0
- package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
- package/dist/DateInput/useWheelListbox.js +88 -0
- package/dist/DateInput/wheelOptions.d.ts +74 -0
- package/dist/DateInput/wheelOptions.d.ts.map +1 -0
- package/dist/DateInput/wheelOptions.js +98 -0
- package/dist/DateInput/wheelPhysics.d.ts +127 -0
- package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
- package/dist/DateInput/wheelPhysics.js +341 -0
- package/dist/DateInput/wheelStrip.d.ts +92 -0
- package/dist/DateInput/wheelStrip.d.ts.map +1 -0
- package/dist/DateInput/wheelStrip.js +258 -0
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +2 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -32
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +3 -0
- package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
- package/dist/DropdownMenu/useMenuOverflow.js +5 -0
- package/dist/Field/Field.js +2 -2
- package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
- package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
- package/dist/FormLayout/FormLayout.d.ts +5 -1
- package/dist/FormLayout/FormLayout.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.d.ts +6 -4
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +48 -3
- package/dist/HoverCard/useHoverCard.d.ts +5 -4
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +20 -33
- package/dist/Icon/Icon.d.ts +5 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +5 -2
- package/dist/Item/useSwipeAction.d.ts.map +1 -1
- package/dist/Item/useSwipeAction.js +3 -0
- package/dist/Layer/modalOutlet.d.ts.map +1 -1
- package/dist/Layer/modalOutlet.js +2 -0
- package/dist/Layer/outsidePress.d.ts.map +1 -1
- package/dist/Layer/outsidePress.js +1 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +3 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
- package/dist/Layer/useLayerDismissal.js +3 -0
- package/dist/Layer/usePressPin.d.ts +17 -5
- package/dist/Layer/usePressPin.d.ts.map +1 -1
- package/dist/Layer/usePressPin.js +62 -12
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +3 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -0
- package/dist/MobileNav/MobileNav.d.ts +3 -2
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +9 -25
- package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromDOM.js +3 -0
- package/dist/Outline/useScrollSpy.d.ts.map +1 -1
- package/dist/Outline/useScrollSpy.js +3 -0
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -0
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -0
- package/dist/PowerSearch/PowerSearch.d.ts +43 -4
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +445 -134
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +25 -6
- package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
- package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchToken.js +7 -2
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +193 -83
- package/dist/PowerSearch/formatFilterValue.d.ts +18 -6
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +33 -12
- package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
- package/dist/PowerSearch/formatTokenValue.js +162 -0
- package/dist/PowerSearch/powerSearchDateZone.d.ts +21 -0
- package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchDateZone.js +37 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBarTouch.js +2 -0
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +3 -2
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -3
- package/dist/Resizable/ResizeHandle.d.ts +2 -1
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +101 -77
- package/dist/Resizable/createResizable.d.ts +145 -0
- package/dist/Resizable/createResizable.d.ts.map +1 -0
- package/dist/Resizable/createResizable.js +575 -0
- package/dist/Resizable/useResizable.d.ts +3 -3
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +252 -459
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
- package/dist/SelectableCard/SelectableCard.d.ts +2 -0
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +36 -11
- package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
- package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
- package/dist/SelectableCard/selectableCardInput.js +20 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +5 -8
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +60 -58
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +4 -10
- package/dist/Switch/useSwitchTouch.js +4 -4
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +29 -8
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
- package/dist/TextInput/TextInput.d.ts +2 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +10 -7
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +2 -0
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +2 -0
- package/dist/Timer/Timer.d.ts.map +1 -1
- package/dist/Timer/Timer.js +2 -0
- package/dist/Timestamp/Timestamp.js +1 -1
- package/dist/Toast/Toast.d.ts +11 -1
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -15
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +97 -34
- package/dist/Toast/types.d.ts +9 -3
- package/dist/Toast/types.d.ts.map +1 -1
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +1 -0
- package/dist/Tokenizer/Tokenizer.d.ts +49 -37
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +22 -19
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +1 -1
- package/dist/Tokenizer/index.d.ts +1 -1
- package/dist/Tokenizer/index.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +19 -1
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +34 -53
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +27 -18
- package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/animator/createAnimator.d.ts +98 -0
- package/dist/animator/createAnimator.d.ts.map +1 -0
- package/dist/animator/createAnimator.js +259 -0
- package/dist/astryx.css +39 -6
- package/dist/gestures/GestureHost.d.ts +16 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +1 -1
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +4 -3
- package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
- package/dist/hooks/ModalAnnounceProvider.js +1 -0
- package/dist/hooks/actionGroupTracker.d.ts +4 -1
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
- package/dist/hooks/actionGroupTracker.js +13 -3
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/longPressDetector.d.ts +66 -0
- package/dist/hooks/longPressDetector.d.ts.map +1 -0
- package/dist/hooks/longPressDetector.js +200 -0
- package/dist/hooks/pressGroupContext.d.ts +6 -0
- package/dist/hooks/pressGroupContext.d.ts.map +1 -0
- package/dist/hooks/pressGroupContext.js +20 -0
- package/dist/hooks/rootScrollStyles.d.ts +48 -0
- package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
- package/dist/hooks/rootScrollStyles.js +207 -0
- package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
- package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
- package/dist/hooks/scrollLockTouchGuard.js +134 -0
- package/dist/hooks/scrollbarGutter.d.ts +4 -4
- package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
- package/dist/hooks/scrollbarGutter.js +36 -23
- package/dist/hooks/useActionGroupTracking.d.ts +53 -0
- package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
- package/dist/hooks/useActionGroupTracking.js +174 -0
- package/dist/hooks/useAnimator.d.ts +41 -0
- package/dist/hooks/useAnimator.d.ts.map +1 -0
- package/dist/hooks/useAnimator.js +70 -0
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +1 -0
- package/dist/hooks/useAttachment.d.ts +1 -1
- package/dist/hooks/useAttachment.js +1 -1
- package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
- package/dist/hooks/useAutoMediaMode.js +1 -0
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +2 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -1
- package/dist/hooks/useDevWarning.js +2 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +2 -0
- package/dist/hooks/useGridFocus.d.ts +8 -5
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +4 -3
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -0
- package/dist/hooks/useImageMode.d.ts.map +1 -1
- package/dist/hooks/useImageMode.js +3 -0
- package/dist/hooks/useInputStatusIcon.d.ts +1 -1
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +2 -2
- package/dist/hooks/useKeyboardHint.js +1 -1
- package/dist/hooks/useLongPress.d.ts +8 -9
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +23 -106
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +2 -0
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +3 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +2 -1
- package/dist/hooks/usePressFeedback.d.ts.map +1 -1
- package/dist/hooks/usePressFeedback.js +1 -0
- package/dist/hooks/useResolvedRequired.d.ts +3 -0
- package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
- package/dist/hooks/useResolvedRequired.js +3 -0
- package/dist/hooks/useScrollLock.d.ts +7 -9
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +55 -48
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +5 -0
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +3 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +30 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/internal/indicatorPress.stylex.d.ts +20 -0
- package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
- package/dist/internal/indicatorPress.stylex.js +26 -0
- package/dist/internal/selectable-card.d.ts +21 -0
- package/dist/internal/selectable-card.d.ts.map +1 -0
- package/dist/internal/selectable-card.js +20 -0
- package/dist/internal/sheetDraft.d.ts +2 -2
- package/dist/internal/sheetDraft.js +2 -2
- package/dist/motion/animatedLayout.d.ts.map +1 -1
- package/dist/motion/animatedLayout.js +7 -7
- package/dist/motion/animator.d.ts +14 -14
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +45 -20
- package/dist/motion/progress.d.ts +88 -0
- package/dist/motion/progress.d.ts.map +1 -0
- package/dist/motion/progress.js +128 -0
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +3 -1
- package/dist/motion/uikit/alert.d.ts +41 -0
- package/dist/motion/uikit/alert.d.ts.map +1 -0
- package/dist/motion/uikit/alert.js +43 -0
- package/dist/motion/uikit/index.d.ts +4 -3
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +4 -3
- package/dist/motion/uikit/picker.d.ts +96 -0
- package/dist/motion/uikit/picker.d.ts.map +1 -0
- package/dist/motion/uikit/picker.js +117 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
- package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
- package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +29 -4
- package/dist/theme/motionKnobs.d.ts +4 -3
- package/dist/theme/motionKnobs.d.ts.map +1 -1
- package/dist/theme/motionKnobs.js +3 -2
- package/dist/theme/themeMotion.d.ts +6 -0
- package/dist/theme/themeMotion.d.ts.map +1 -1
- package/dist/theme/themeMotion.js +7 -0
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +12 -0
- package/dist/utils/focusReturn.d.ts +15 -0
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +28 -0
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +4 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +3 -2
- package/dist/utils/plainDate.d.ts +8 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +19 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +20 -6
- package/dist/utils/triggerFocus.d.ts +36 -0
- package/dist/utils/triggerFocus.d.ts.map +1 -0
- package/dist/utils/triggerFocus.js +65 -0
- package/locales/en.json +120 -0
- package/locales/pseudo.json +90 -0
- package/package.json +14 -9
- package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
- package/src/AlertDialog/AlertDialog.tsx +46 -5
- package/src/AppShell/AppShell.tsx +4 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -0
- package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
- package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
- package/src/BottomSheet/useMobileKeyboard.ts +4 -0
- package/src/BottomSheet/useSheetGestures.ts +10 -1
- package/src/Button/Button.tsx +26 -4
- package/src/Calendar/Calendar.tsx +36 -25
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/ChatComposerInput.tsx +2 -0
- package/src/Chat/ChatMessageList.tsx +2 -1
- package/src/Chat/useChatDictation.ts +1 -0
- package/src/Chat/useChatNewMessages.ts +1 -1
- package/src/Chat/useChatStreamScroll.ts +2 -0
- package/src/Chat/useSpeechRecognition.ts +2 -0
- package/src/Chat/useTriggerMenu.tsx +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
- package/src/CheckboxInput/CheckboxInput.tsx +38 -15
- package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
- package/src/CodeBlock/CodeBlock.tsx +41 -4
- package/src/CommandPalette/CommandPalette.tsx +1 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
- package/src/ComplexSelector/ComplexSelector.tsx +20 -5
- package/src/ContextMenu/ContextMenu.tsx +2 -2
- package/src/DateInput/MonthScroller.tsx +8 -2
- package/src/DateInput/PickerWheel.tsx +765 -0
- package/src/DateInput/TouchDateField.tsx +1 -0
- package/src/DateInput/Wheel.tsx +94 -150
- package/src/DateInput/useOwnScrollGesture.ts +25 -3
- package/src/DateInput/usePointerDragScroll.ts +1 -0
- package/src/DateInput/useScrollSettle.ts +2 -0
- package/src/DateInput/useWheelListbox.ts +112 -0
- package/src/DateInput/wheelOptions.ts +155 -0
- package/src/DateInput/wheelPhysics.ts +406 -0
- package/src/DateInput/wheelStrip.ts +341 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +2 -0
- package/src/Dialog/Dialog.tsx +12 -32
- package/src/Drawer/useDrawerDialogPresence.ts +2 -0
- package/src/DropdownMenu/useMenuOverflow.ts +3 -0
- package/src/Field/Field.tsx +2 -2
- package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
- package/src/FormLayout/FormLayout.doc.mjs +181 -46
- package/src/FormLayout/FormLayout.tsx +5 -1
- package/src/HoverCard/HoverCard.doc.mjs +10 -8
- package/src/HoverCard/HoverCard.tsx +58 -6
- package/src/HoverCard/useHoverCard.doc.mjs +178 -36
- package/src/HoverCard/useHoverCard.tsx +49 -54
- package/src/Icon/Icon.doc.mjs +49 -8
- package/src/Icon/Icon.tsx +15 -7
- package/src/IconButton/IconButton.doc.mjs +141 -21
- package/src/Item/useSwipeAction.ts +2 -0
- package/src/Layer/modalOutlet.ts +2 -0
- package/src/Layer/outsidePress.ts +1 -0
- package/src/Layer/useLayer.tsx +2 -0
- package/src/Layer/useLayerDismissal.ts +2 -0
- package/src/Layer/usePressPin.ts +81 -15
- package/src/Layer/useTouchTrigger.ts +2 -0
- package/src/Lightbox/Lightbox.tsx +19 -0
- package/src/MobileNav/MobileNav.tsx +9 -30
- package/src/Outline/useOutlineFromDOM.ts +2 -0
- package/src/Outline/useScrollSpy.ts +2 -0
- package/src/OverflowList/OverflowList.tsx +2 -0
- package/src/Popover/Popover.tsx +4 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
- package/src/PowerSearch/PowerSearch.tsx +627 -157
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +39 -6
- package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
- package/src/PowerSearch/PowerSearchToken.tsx +7 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +244 -58
- package/src/PowerSearch/formatFilterValue.ts +55 -17
- package/src/PowerSearch/formatTokenValue.ts +222 -0
- package/src/PowerSearch/powerSearchDateZone.ts +64 -0
- package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
- package/src/PowerSearch/types.ts +2 -0
- package/src/ProgressBar/ProgressBarTouch.ts +2 -0
- package/src/RadioList/RadioList.tsx +3 -2
- package/src/RadioList/RadioListItem.tsx +5 -3
- package/src/Resizable/Resizable.doc.mjs +5 -4
- package/src/Resizable/ResizeHandle.tsx +169 -109
- package/src/Resizable/createResizable.ts +831 -0
- package/src/Resizable/useResizable.ts +292 -623
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
- package/src/SelectableCard/SelectableCard.tsx +39 -10
- package/src/SelectableCard/selectableCardInput.ts +30 -0
- package/src/Selector/Selector.tsx +5 -12
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Spinner/Spinner.tsx +77 -63
- package/src/Switch/Switch.tsx +2 -6
- package/src/Switch/useSwitchTouch.ts +4 -4
- package/src/Table/BaseTable.tsx +46 -12
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
- package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
- package/src/TextInput/TextInput.tsx +11 -10
- package/src/TimeInput/TimeInput.tsx +2 -0
- package/src/TimeInput/TouchTimeField.tsx +2 -0
- package/src/Timer/Timer.tsx +1 -0
- package/src/Timestamp/Timestamp.tsx +1 -1
- package/src/Toast/Toast.doc.mjs +4 -3
- package/src/Toast/Toast.tsx +52 -32
- package/src/Toast/ToastViewport.tsx +123 -35
- package/src/Toast/types.ts +9 -3
- package/src/Toast/useToast.tsx +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +19 -3
- package/src/Tokenizer/Tokenizer.tsx +73 -51
- package/src/Tokenizer/TokenizerBottomSheet.tsx +1 -1
- package/src/Tokenizer/index.ts +1 -0
- package/src/Tooltip/useTooltip.doc.mjs +24 -0
- package/src/Tooltip/useTooltip.tsx +61 -56
- package/src/Typeahead/BaseTypeahead.tsx +27 -17
- package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/animator/createAnimator.doc.mjs +153 -0
- package/src/animator/createAnimator.ts +324 -0
- package/src/gestures/GestureHost.ts +1 -1
- package/src/gestures/PressTracker.ts +4 -3
- package/src/gestures/README.md +10 -4
- package/src/hooks/ModalAnnounceProvider.tsx +1 -0
- package/src/hooks/actionGroupTracker.ts +20 -5
- package/src/hooks/index.ts +2 -0
- package/src/hooks/longPressDetector.ts +273 -0
- package/src/hooks/pressGroupContext.ts +21 -0
- package/src/hooks/rootScrollStyles.ts +247 -0
- package/src/hooks/scrollLockTouchGuard.ts +182 -0
- package/src/hooks/scrollbarGutter.ts +41 -26
- package/src/hooks/useActionGroupTracking.ts +224 -0
- package/src/hooks/useAnimator.doc.mjs +109 -0
- package/src/hooks/useAnimator.ts +67 -0
- package/src/hooks/useAnnounceRenderedText.ts +1 -0
- package/src/hooks/useAttachment.ts +1 -1
- package/src/hooks/useAutoMediaMode.ts +1 -0
- package/src/hooks/useBusyAnnouncement.ts +2 -0
- package/src/hooks/useDevWarning.ts +2 -0
- package/src/hooks/useFocusTrap.ts +2 -0
- package/src/hooks/useGridFocus.doc.mjs +6 -6
- package/src/hooks/useGridFocus.ts +10 -7
- package/src/hooks/useHotkeys.ts +2 -0
- package/src/hooks/useImageMode.ts +2 -0
- package/src/hooks/useInputStatusIcon.tsx +3 -2
- package/src/hooks/useKeyboardHint.tsx +1 -1
- package/src/hooks/useLongPress.doc.mjs +2 -2
- package/src/hooks/useLongPress.ts +32 -122
- package/src/hooks/useMenuHover.ts +1 -0
- package/src/hooks/useMenuPress.ts +2 -0
- package/src/hooks/useOverflow.ts +2 -1
- package/src/hooks/usePressFeedback.ts +1 -0
- package/src/hooks/useResolvedRequired.ts +3 -0
- package/src/hooks/useScrollLock.doc.mjs +51 -12
- package/src/hooks/useScrollLock.ts +57 -60
- package/src/hooks/useScrollableArea.ts +4 -0
- package/src/hooks/useStreamingText.ts +2 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
- package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
- package/src/i18n/generated-locales/en.generated.ts +41 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
- package/src/index.ts +13 -0
- package/src/internal/indicatorPress.stylex.ts +24 -0
- package/src/internal/selectable-card.ts +21 -0
- package/src/internal/sheetDraft.ts +2 -2
- package/src/motion/MEASUREMENTS.md +18 -0
- package/src/motion/README.md +10 -5
- package/src/motion/animatedLayout.ts +10 -5
- package/src/motion/animator.ts +66 -31
- package/src/motion/progress.ts +155 -0
- package/src/motion/reducedMotion.ts +3 -1
- package/src/motion/uikit/alert.ts +43 -0
- package/src/motion/uikit/index.ts +4 -3
- package/src/motion/uikit/picker.ts +116 -0
- package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
- package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
- package/src/theme/Theme.tsx +37 -3
- package/src/theme/motionKnobs.ts +4 -3
- package/src/theme/themeMotion.ts +7 -0
- package/src/utils/dateParser.ts +16 -0
- package/src/utils/focusReturn.ts +30 -0
- package/src/utils/interactionModality.ts +4 -0
- package/src/utils/interactionOverlay.stylex.ts +3 -2
- package/src/utils/plainDate.ts +21 -0
- package/src/utils/pressFeedback.ts +24 -6
- package/src/utils/triggerFocus.ts +80 -0
- package/dist/internal/touch-sheet.d.ts +0 -21
- package/dist/internal/touch-sheet.d.ts.map +0 -1
- package/dist/internal/touch-sheet.js +0 -19
- package/src/internal/touch-sheet.ts +0 -21
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file scrollLockTouchGuard.ts
|
|
7
|
+
* @input The node under a finger and the pan's direction, while a scroll lock
|
|
8
|
+
* holds the page
|
|
9
|
+
* @output isPanAbsorbedBeforePage and isPageZoomedIn, for the page hold
|
|
10
|
+
* @position Internal hook utility; gestures/pageHold calls it for
|
|
11
|
+
* useScrollLock.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// iOS Safari scrolls an `overflow: hidden` page under a finger.
|
|
15
|
+
// The page hold cancels each pan that would reach the page. This walk decides
|
|
16
|
+
// which pans those are. A scroller that can move in the pan's direction takes
|
|
17
|
+
// the pan. A scroller at its edge that contains its overscroll also takes it.
|
|
18
|
+
// The walk follows flat-tree parents. It ends at a top-layer or fixed-position
|
|
19
|
+
// element, whose containing block is the viewport, so its untaken pans go to
|
|
20
|
+
// the page.
|
|
21
|
+
|
|
22
|
+
import {parentAcrossShadow} from '../utils/flatTree';
|
|
23
|
+
import {isRtlElement} from './isRtlElement';
|
|
24
|
+
|
|
25
|
+
const SCROLLABLE = new Set(['auto', 'scroll']);
|
|
26
|
+
|
|
27
|
+
/** Overflow at or below this many px is a box that fits, not a scroller. */
|
|
28
|
+
const EDGE_TOLERANCE = 1;
|
|
29
|
+
|
|
30
|
+
function canMoveY(element: Element, dy: number, range: number): boolean {
|
|
31
|
+
// A finger moving down drags the content down: scrollTop decreases.
|
|
32
|
+
return dy > 0
|
|
33
|
+
? element.scrollTop > EDGE_TOLERANCE - 0.5
|
|
34
|
+
: element.scrollTop < range - EDGE_TOLERANCE + 0.5;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function canMoveX(
|
|
38
|
+
element: Element,
|
|
39
|
+
dx: number,
|
|
40
|
+
range: number,
|
|
41
|
+
isRtl: boolean,
|
|
42
|
+
): boolean {
|
|
43
|
+
const min = isRtl ? -range : 0;
|
|
44
|
+
const max = isRtl ? 0 : range;
|
|
45
|
+
// A finger moving right drags the content right: scrollLeft decreases.
|
|
46
|
+
return dx > 0
|
|
47
|
+
? element.scrollLeft > min + EDGE_TOLERANCE - 0.5
|
|
48
|
+
: element.scrollLeft < max - EDGE_TOLERANCE + 0.5;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Whether `element` itself takes a pan. It does when it can still scroll that
|
|
53
|
+
* way, or when its `overscroll-behavior` contains the overscroll at its edge.
|
|
54
|
+
*/
|
|
55
|
+
function takesPan(
|
|
56
|
+
element: Element,
|
|
57
|
+
style: CSSStyleDeclaration,
|
|
58
|
+
isVertical: boolean,
|
|
59
|
+
dx: number,
|
|
60
|
+
dy: number,
|
|
61
|
+
): boolean {
|
|
62
|
+
if (!SCROLLABLE.has(isVertical ? style.overflowY : style.overflowX)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const range = isVertical
|
|
66
|
+
? element.scrollHeight - element.clientHeight
|
|
67
|
+
: element.scrollWidth - element.clientWidth;
|
|
68
|
+
// Content that fits has nothing to scroll. The pan goes on to the next
|
|
69
|
+
// scroller in the chain, and at last to the page.
|
|
70
|
+
if (range <= EDGE_TOLERANCE) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const canMove = isVertical
|
|
74
|
+
? canMoveY(element, dy, range)
|
|
75
|
+
: canMoveX(element, dx, range, isRtlElement(element as HTMLElement));
|
|
76
|
+
if (canMove) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
const behavior = isVertical
|
|
80
|
+
? style.overscrollBehaviorY
|
|
81
|
+
: style.overscrollBehaviorX;
|
|
82
|
+
return behavior === 'contain' || behavior === 'none';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Whether `element` is in the state that a pseudo-class names (`:modal`,
|
|
87
|
+
* `:popover-open`). An engine without the pseudo-class has no element in that
|
|
88
|
+
* state. Its `matches` throws on the selector, so the engine is not asked.
|
|
89
|
+
* Other errors surface.
|
|
90
|
+
*/
|
|
91
|
+
function isInState(element: Element, pseudoClass: string): boolean {
|
|
92
|
+
const css = element.ownerDocument.defaultView?.CSS;
|
|
93
|
+
return (
|
|
94
|
+
typeof css?.supports === 'function' &&
|
|
95
|
+
css.supports(`selector(${pseudoClass})`) &&
|
|
96
|
+
element.matches(pseudoClass)
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Whether a pan that `element` does not take goes to the viewport, not to its
|
|
102
|
+
* DOM parent. The browser chains scrolling along containing blocks. A
|
|
103
|
+
* top-layer element (an open modal dialog or popover) or a fixed-position one
|
|
104
|
+
* has the viewport as its containing block. So a Dialog inside a scrolling
|
|
105
|
+
* container gives an untaken pan to the page.
|
|
106
|
+
*/
|
|
107
|
+
function chainsToViewport(
|
|
108
|
+
element: Element,
|
|
109
|
+
style: CSSStyleDeclaration,
|
|
110
|
+
): boolean {
|
|
111
|
+
return (
|
|
112
|
+
style.position === 'fixed' ||
|
|
113
|
+
isInState(element, ':modal') ||
|
|
114
|
+
isInState(element, ':popover-open')
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Whether the page is pinch-zoomed in (`visualViewport.scale > 1`). A
|
|
120
|
+
* one-finger drag then pans the zoomed view, which a zoomed-in reader needs
|
|
121
|
+
* around an open overlay. The value is read per touch, so a pinch during the
|
|
122
|
+
* lock counts from the next drag.
|
|
123
|
+
*/
|
|
124
|
+
export function isPageZoomedIn(doc: Document): boolean {
|
|
125
|
+
return (doc.defaultView?.visualViewport?.scale ?? 1) > 1;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Whether `element` is a native control that takes a finger's drag itself. A
|
|
130
|
+
* range input moves its thumb, so the drag never reaches the page.
|
|
131
|
+
*/
|
|
132
|
+
function takesDragItself(element: Element): boolean {
|
|
133
|
+
// `:disabled` also covers a slider inside a disabled fieldset.
|
|
134
|
+
return element.matches('input[type="range"]:not(:disabled)');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Whether a scroller in the scroll chain of `target` takes a pan of (`dx`,
|
|
139
|
+
* `dy`) before the page does.
|
|
140
|
+
*/
|
|
141
|
+
export function isPanAbsorbedBeforePage(
|
|
142
|
+
target: EventTarget | null,
|
|
143
|
+
dx: number,
|
|
144
|
+
dy: number,
|
|
145
|
+
): boolean {
|
|
146
|
+
if (!(target instanceof Node)) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const doc = target.ownerDocument ?? document;
|
|
150
|
+
const view = doc.defaultView;
|
|
151
|
+
if (view == null) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const isVertical = Math.abs(dy) >= Math.abs(dx);
|
|
155
|
+
for (
|
|
156
|
+
let node: Node | null = target;
|
|
157
|
+
node != null;
|
|
158
|
+
node = parentAcrossShadow(node)
|
|
159
|
+
) {
|
|
160
|
+
if (!(node instanceof Element)) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (takesDragItself(node)) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
if (
|
|
167
|
+
node === doc.documentElement ||
|
|
168
|
+
node === doc.body ||
|
|
169
|
+
node === doc.scrollingElement
|
|
170
|
+
) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
const style = view.getComputedStyle(node);
|
|
174
|
+
if (takesPan(node, style, isVertical, dx, dy)) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
if (chainsToViewport(node, style)) {
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file scrollbarGutter.ts
|
|
5
|
-
* @input The element a scroll lock
|
|
5
|
+
* @input The element whose width a scroll lock holds, plus live layout
|
|
6
|
+
* measurements
|
|
6
7
|
* @output holdScrollbarGutter and the ScrollbarGutterHold it returns
|
|
7
8
|
* @position Internal hook utility; used by useScrollLock and MobileNav so that
|
|
8
9
|
* locking background scroll does not resize the layout viewport.
|
|
@@ -16,6 +17,8 @@
|
|
|
16
17
|
// engines without `scrollbar-gutter`, and it applies only when a measurement
|
|
17
18
|
// shows that the element moved.
|
|
18
19
|
|
|
20
|
+
import {claimRootScrollStyle} from './rootScrollStyles';
|
|
21
|
+
|
|
19
22
|
const NOOP: ScrollbarGutterHold = {
|
|
20
23
|
settle() {},
|
|
21
24
|
release() {},
|
|
@@ -23,14 +26,23 @@ const NOOP: ScrollbarGutterHold = {
|
|
|
23
26
|
|
|
24
27
|
export interface ScrollbarGutterHold {
|
|
25
28
|
/**
|
|
26
|
-
* Call once the lock's own styles
|
|
27
|
-
*
|
|
29
|
+
* Call once the lock's own styles apply. It holds the gutter open, or,
|
|
30
|
+
* without `scrollbar-gutter`, pads away only the width the element gained.
|
|
28
31
|
*/
|
|
29
32
|
settle(): void;
|
|
30
33
|
/** Call on unlock: restores everything this hold changed. */
|
|
31
34
|
release(): void;
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
/** Whether the engine reserves a gutter for `scrollbar-gutter: stable`. */
|
|
38
|
+
function supportsScrollbarGutter(): boolean {
|
|
39
|
+
return (
|
|
40
|
+
typeof CSS !== 'undefined' &&
|
|
41
|
+
typeof CSS.supports === 'function' &&
|
|
42
|
+
CSS.supports('scrollbar-gutter', 'stable')
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
34
46
|
/**
|
|
35
47
|
* Keeps `element`'s content box the width it is right now, across a scroll
|
|
36
48
|
* lock that is about to hide the document's scrollbar.
|
|
@@ -40,8 +52,8 @@ export interface ScrollbarGutterHold {
|
|
|
40
52
|
* ScrollbarGutterHold.release} on unlock:
|
|
41
53
|
*
|
|
42
54
|
* ```
|
|
43
|
-
* const hold = holdScrollbarGutter(document.
|
|
44
|
-
*
|
|
55
|
+
* const hold = holdScrollbarGutter(document.documentElement);
|
|
56
|
+
* document.documentElement.style.overflow = 'hidden';
|
|
45
57
|
* hold.settle();
|
|
46
58
|
* ```
|
|
47
59
|
*
|
|
@@ -56,28 +68,37 @@ export function holdScrollbarGutter(element: HTMLElement): ScrollbarGutterHold {
|
|
|
56
68
|
const root = document.documentElement;
|
|
57
69
|
const viewportWidth = root.clientWidth;
|
|
58
70
|
|
|
59
|
-
// 0 means
|
|
60
|
-
//
|
|
61
|
-
|
|
71
|
+
// 0 means that there is no layout to measure, as in jsdom. An overlay
|
|
72
|
+
// scrollbar takes no space, so there is nothing to hold. A gutter held open
|
|
73
|
+
// on such a page would add space that was never there.
|
|
74
|
+
if (viewportWidth === 0 || window.innerWidth <= viewportWidth) {
|
|
62
75
|
return NOOP;
|
|
63
76
|
}
|
|
64
77
|
|
|
65
|
-
|
|
78
|
+
if (supportsScrollbarGutter()) {
|
|
79
|
+
// The gutter holds the width by construction, so the lock forces no second
|
|
80
|
+
// layout. Each hold is a stacked claim, so one release keeps the gutter
|
|
81
|
+
// that another hold still needs.
|
|
82
|
+
let releaseGutter: (() => void) | null = null;
|
|
83
|
+
return {
|
|
84
|
+
settle() {
|
|
85
|
+
releaseGutter ??= claimRootScrollStyle({scrollbarGutter: 'stable'});
|
|
86
|
+
},
|
|
87
|
+
release() {
|
|
88
|
+
releaseGutter?.();
|
|
89
|
+
releaseGutter = null;
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// An engine without `scrollbar-gutter`: measure the element now, again
|
|
95
|
+
// once the lock's styles apply, and pad away what it grew. This is the one
|
|
96
|
+
// path that reads layout after a write.
|
|
66
97
|
const previousPadding = element.style.paddingRight;
|
|
67
98
|
const widthBefore = element.getBoundingClientRect().width;
|
|
68
|
-
|
|
69
|
-
let heldGutter = false;
|
|
70
99
|
let padded = false;
|
|
71
100
|
let settled = false;
|
|
72
101
|
|
|
73
|
-
// Only when a space-taking scrollbar is actually there. Holding the gutter
|
|
74
|
-
// open on a page that never had one would carve out 15px that was never
|
|
75
|
-
// reserved — the same shift, in the other direction.
|
|
76
|
-
if (window.innerWidth > viewportWidth) {
|
|
77
|
-
root.style.scrollbarGutter = 'stable';
|
|
78
|
-
heldGutter = true;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
102
|
return {
|
|
82
103
|
settle() {
|
|
83
104
|
if (settled) {
|
|
@@ -86,9 +107,7 @@ export function holdScrollbarGutter(element: HTMLElement): ScrollbarGutterHold {
|
|
|
86
107
|
settled = true;
|
|
87
108
|
|
|
88
109
|
// What the lock actually did to this element, rather than what we
|
|
89
|
-
// assumed it would do.
|
|
90
|
-
// page that already sets `scrollbar-gutter: stable` itself, where the
|
|
91
|
-
// scrollbar was never taking the space back.
|
|
110
|
+
// assumed it would do.
|
|
92
111
|
const grew = element.getBoundingClientRect().width - widthBefore;
|
|
93
112
|
if (grew <= 0) {
|
|
94
113
|
return;
|
|
@@ -105,10 +124,6 @@ export function holdScrollbarGutter(element: HTMLElement): ScrollbarGutterHold {
|
|
|
105
124
|
element.style.paddingRight = previousPadding;
|
|
106
125
|
padded = false;
|
|
107
126
|
}
|
|
108
|
-
if (heldGutter) {
|
|
109
|
-
root.style.scrollbarGutter = previousGutter;
|
|
110
|
-
heldGutter = false;
|
|
111
|
-
}
|
|
112
127
|
},
|
|
113
128
|
};
|
|
114
129
|
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useActionGroupTracking.ts
|
|
7
|
+
* @input A ref to a group of sibling actions, the actions' selector, and the
|
|
8
|
+
* component's tracking constants
|
|
9
|
+
* @output Exports useActionGroupTracking and ActionGroupTrackingOptions
|
|
10
|
+
* @position Internal hook, not exported from the hooks entry. A long press
|
|
11
|
+
* drives the shared action-group tracker (hooks/actionGroupTracker.ts) for
|
|
12
|
+
* a group that a held pointer slides across. AlertDialog consumes it.
|
|
13
|
+
*
|
|
14
|
+
* SYNC: When modified, update useActionGroupTracking.test.tsx
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {useEffect, useRef, useState, type RefObject} from 'react';
|
|
18
|
+
import {isActive} from '../gestures/GestureRecognizer';
|
|
19
|
+
import {LongPressGestureRecognizer} from '../gestures/LongPressGestureRecognizer';
|
|
20
|
+
import {lockSelection} from '../utils/selectionLock';
|
|
21
|
+
import type {GestureTouch, PointerKind} from '../gestures/types';
|
|
22
|
+
import {useGestureRecognizer} from '../gestures/useGestureRecognizer';
|
|
23
|
+
import {UIKIT_PRESS} from '../motion/uikit/gestures';
|
|
24
|
+
import {isIosWebKit} from '../utils/touchQueries';
|
|
25
|
+
import {createActionGroupTracker} from './actionGroupTracker';
|
|
26
|
+
import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
|
|
27
|
+
|
|
28
|
+
export interface ActionGroupTrackingOptions {
|
|
29
|
+
/** Selects the actions inside the tracked element. */
|
|
30
|
+
itemSelector: string;
|
|
31
|
+
/** How long after touch-down the touched action highlights, ms. */
|
|
32
|
+
highlightOnsetMs: number;
|
|
33
|
+
/**
|
|
34
|
+
* How far outside an action a finger keeps it highlighted, px. A mouse or a
|
|
35
|
+
* pen hit-tests the actions' exact rects.
|
|
36
|
+
*/
|
|
37
|
+
highlightExpansion: number;
|
|
38
|
+
/** Pointers that are tracked; others keep the browser's click. @default every pointer */
|
|
39
|
+
pointerTypes?: ReadonlyArray<PointerKind>;
|
|
40
|
+
/** A press whose target this rejects is not tracked. */
|
|
41
|
+
shouldTrack?: (target: unknown) => boolean;
|
|
42
|
+
/** Off, nothing is attached and nothing is tracked. @default true */
|
|
43
|
+
isEnabled?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Let the gesture host write the group's `touch-action` and refuse a text
|
|
46
|
+
* selection while a finger or a pen holds it.
|
|
47
|
+
* @default true
|
|
48
|
+
*/
|
|
49
|
+
manageStyle?: boolean;
|
|
50
|
+
/** Runs the action under the finger at the lift. @default its own click */
|
|
51
|
+
onActivate?: (item: HTMLElement) => void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const PRESS = UIKIT_PRESS;
|
|
55
|
+
|
|
56
|
+
/** The ref handed to the recognizer while tracking is off: no element. */
|
|
57
|
+
const DETACHED: RefObject<Element | null> = {current: null};
|
|
58
|
+
|
|
59
|
+
const EVERY_POINTER: ReadonlyArray<PointerKind> = ['touch', 'pen', 'mouse'];
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The group's press: a long press that a second finger on the group ends with
|
|
63
|
+
* nothing acting. A plain long press ignores a second finger.
|
|
64
|
+
*/
|
|
65
|
+
class ActionGroupPress extends LongPressGestureRecognizer {
|
|
66
|
+
protected override acceptsTouch(touch: GestureTouch): boolean {
|
|
67
|
+
if (isActive(this.state)) {
|
|
68
|
+
this.setState('cancelled');
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return super.acceptsTouch(touch);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Track a held pointer on the group behind `ref` across the actions inside
|
|
77
|
+
* it, through the shared action-group tracker.
|
|
78
|
+
*/
|
|
79
|
+
export function useActionGroupTracking(
|
|
80
|
+
ref: RefObject<HTMLElement | null>,
|
|
81
|
+
options: ActionGroupTrackingOptions,
|
|
82
|
+
): ActionGroupPress {
|
|
83
|
+
const optionsRef = useRef(options);
|
|
84
|
+
// Keeps the recognizer's delegate and the tracker, which run outside
|
|
85
|
+
// render, reading the latest options.
|
|
86
|
+
useIsomorphicLayoutEffect(() => {
|
|
87
|
+
optionsRef.current = options;
|
|
88
|
+
});
|
|
89
|
+
// The pointer that started the current press. Only a finger gets the hit
|
|
90
|
+
// expansion; a mouse or a pen hit-tests the actions' exact rects.
|
|
91
|
+
const pointerRef = useRef<PointerKind>('touch');
|
|
92
|
+
const landedRef = useRef<Node | null>(null);
|
|
93
|
+
const [tracker] = useState(() =>
|
|
94
|
+
createActionGroupTracker(() => ({
|
|
95
|
+
roots: () => [ref.current],
|
|
96
|
+
itemSelector: optionsRef.current.itemSelector,
|
|
97
|
+
highlightExpansion:
|
|
98
|
+
pointerRef.current === 'touch'
|
|
99
|
+
? optionsRef.current.highlightExpansion
|
|
100
|
+
: 0,
|
|
101
|
+
onActivate: optionsRef.current.onActivate,
|
|
102
|
+
// The browser's own click for a press the group ran is taken, so the
|
|
103
|
+
// action runs once. The gesture host swallows it for a press it claims.
|
|
104
|
+
// This covers one it does not claim, a mouse under a coarse pointer.
|
|
105
|
+
swallowsNativeClick: true,
|
|
106
|
+
})),
|
|
107
|
+
);
|
|
108
|
+
const isEnabled = options.isEnabled ?? true;
|
|
109
|
+
// Synchronizes the tracker with tracking on and mounted. Turning tracking
|
|
110
|
+
// off, or unmounting, drops a tracked press and ends its release fades.
|
|
111
|
+
// The host reports no cancellation to a disabled recognizer, and the lift
|
|
112
|
+
// that runs an action often closes the owner before its fade ends.
|
|
113
|
+
useEffect(
|
|
114
|
+
() => () => {
|
|
115
|
+
tracker.cancel();
|
|
116
|
+
tracker.dispose();
|
|
117
|
+
},
|
|
118
|
+
[tracker, isEnabled],
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
return useGestureRecognizer(
|
|
122
|
+
isEnabled ? ref : DETACHED,
|
|
123
|
+
() =>
|
|
124
|
+
new ActionGroupPress({
|
|
125
|
+
name: 'ActionGroupTracking',
|
|
126
|
+
minimumPressDuration: options.highlightOnsetMs,
|
|
127
|
+
allowableMovement: Number.POSITIVE_INFINITY,
|
|
128
|
+
allowedPointerTypes: options.pointerTypes ?? EVERY_POINTER,
|
|
129
|
+
delaysTouchesBegan: true,
|
|
130
|
+
// The hold picks an action, so a held finger or pen starts no text
|
|
131
|
+
// selection and opens no callout while down. A long press brings this
|
|
132
|
+
// lock by default; this hold has no minimum duration, so it names it.
|
|
133
|
+
selectionLock: lockSelection,
|
|
134
|
+
shouldReceiveTouch: (recognizer, touch) => {
|
|
135
|
+
if (recognizer.numberOfTouches === 0) {
|
|
136
|
+
pointerRef.current = touch.pointerType;
|
|
137
|
+
const target = touch.target as Node | null;
|
|
138
|
+
landedRef.current =
|
|
139
|
+
typeof target?.nodeType === 'number' ? target : null;
|
|
140
|
+
}
|
|
141
|
+
return receiveTouch(recognizer, touch, optionsRef.current);
|
|
142
|
+
},
|
|
143
|
+
}),
|
|
144
|
+
recognizer => {
|
|
145
|
+
switch (recognizer.state) {
|
|
146
|
+
case 'began': {
|
|
147
|
+
const {x, y} = recognizer.location();
|
|
148
|
+
tracker.begin(x, y, {landed: landedRef.current});
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case 'changed': {
|
|
152
|
+
const {x, y} = recognizer.location();
|
|
153
|
+
tracker.move(x, y);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case 'ended': {
|
|
157
|
+
const doc = ref.current?.ownerDocument;
|
|
158
|
+
const focusedBefore = doc?.activeElement ?? null;
|
|
159
|
+
const beganOn = tracker.beganOn;
|
|
160
|
+
// Whether a click on the lifted action would focus it. A mouse's or
|
|
161
|
+
// a pen's pointerdown already gave the engine's answer, on the action
|
|
162
|
+
// it began on. A tap focuses on a later mousedown, which the claimed
|
|
163
|
+
// touch cancels, so the platform answers for a finger.
|
|
164
|
+
// iOS WebKit focuses no tapped button; Chromium and Firefox do.
|
|
165
|
+
const clickFocuses =
|
|
166
|
+
pointerRef.current === 'touch'
|
|
167
|
+
? !isIosWebKit(doc?.defaultView)
|
|
168
|
+
: beganOn != null && focusedBefore === beganOn;
|
|
169
|
+
const lifted = tracker.end();
|
|
170
|
+
// The lift runs the action's own click(), which moves no focus. So
|
|
171
|
+
// focus moves to the lifted action, unless its click moved focus.
|
|
172
|
+
if (
|
|
173
|
+
clickFocuses &&
|
|
174
|
+
lifted != null &&
|
|
175
|
+
lifted.isConnected &&
|
|
176
|
+
doc?.activeElement === focusedBefore &&
|
|
177
|
+
focusedBefore !== lifted
|
|
178
|
+
) {
|
|
179
|
+
lifted.focus({preventScroll: true, focusVisible: false});
|
|
180
|
+
}
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
case 'cancelled':
|
|
184
|
+
tracker.cancel();
|
|
185
|
+
break;
|
|
186
|
+
case 'possible':
|
|
187
|
+
case 'failed':
|
|
188
|
+
// Listeners are not called for these.
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
isEnabled,
|
|
194
|
+
manageStyle: options.manageStyle ?? true,
|
|
195
|
+
actionGroup: true,
|
|
196
|
+
},
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* The recognizer's should-receive delegate. It also picks the press's clock.
|
|
202
|
+
* Inside a scroller the press waits the content-touch delay and fails past
|
|
203
|
+
* the slop, so the scroller takes a flick. Elsewhere it begins at once, with
|
|
204
|
+
* no movement limit.
|
|
205
|
+
*/
|
|
206
|
+
function receiveTouch(
|
|
207
|
+
recognizer: LongPressGestureRecognizer,
|
|
208
|
+
touch: GestureTouch,
|
|
209
|
+
options: ActionGroupTrackingOptions,
|
|
210
|
+
): boolean {
|
|
211
|
+
if (options.shouldTrack?.(touch.target) === false) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
if (recognizer.numberOfTouches === 0) {
|
|
215
|
+
const isInsideScroller = touch.scroll?.isInsideScroller === true;
|
|
216
|
+
recognizer.minimumPressDuration = isInsideScroller
|
|
217
|
+
? PRESS.contentTouchDelay.value
|
|
218
|
+
: options.highlightOnsetMs;
|
|
219
|
+
recognizer.allowableMovement = isInsideScroller
|
|
220
|
+
? PRESS.slop.value
|
|
221
|
+
: Number.POSITIVE_INFINITY;
|
|
222
|
+
}
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('@astryxdesign/cli/authoring').HookDoc} */
|
|
4
|
+
export const docs = {
|
|
5
|
+
name: 'useAnimator',
|
|
6
|
+
displayName: 'useAnimator',
|
|
7
|
+
keywords: [
|
|
8
|
+
'animate',
|
|
9
|
+
'animation',
|
|
10
|
+
'animator',
|
|
11
|
+
'spring',
|
|
12
|
+
'decay',
|
|
13
|
+
'momentum',
|
|
14
|
+
'fling',
|
|
15
|
+
'motion',
|
|
16
|
+
'transform',
|
|
17
|
+
'opacity',
|
|
18
|
+
'drag',
|
|
19
|
+
'card',
|
|
20
|
+
],
|
|
21
|
+
params: [
|
|
22
|
+
{
|
|
23
|
+
name: 'ref',
|
|
24
|
+
type: 'RefObject<HTMLElement | null>',
|
|
25
|
+
description:
|
|
26
|
+
'The ref of the one element to animate, the same ref you pass to the element: another hook, such as a gesture hook, can take it too, so a drag and an animation share one element. After every render the animator follows the element behind it. When the element unmounts its motion stops and its values return to rest, so a remount starts at rest, and so does a node that replaces it. Before the element mounts, and while it is unmounted, every call does nothing and `animate` and `decay` resolve at once.',
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
returns: [
|
|
31
|
+
{
|
|
32
|
+
name: 'animator',
|
|
33
|
+
type: 'AnimatorHandle',
|
|
34
|
+
description:
|
|
35
|
+
"The element's animator, the same object on every render: `animate(target, {velocity?})` springs channels to a target on the state-change motion Astryx's components use, `decay(velocity)` coasts them from a release velocity, `set(values)` jumps them, `get()` and `getVelocity()` read them, and `stop()` halts them. The channels are `x` and `y` (px), `scale` (1 at the element's size), `rotate` (degrees) and `opacity` (0 to 1). `animate` and `decay` return a promise that resolves when the motion ends. Calling it never re-renders the component. Calls before the ref attaches do nothing and resolve at once.",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
usage: {
|
|
39
|
+
description:
|
|
40
|
+
"Animates one element with the motion Astryx's own components use. Call `animator.animate` to spring an element to new values on the state-change motion, `animator.decay` to fling it with the momentum of a released scroll view, and `animator.set` to move it directly, so a card can follow a finger, snap back and be thrown away. To animate an area's layout as its items change, use `useAnimatedLayout`; for what a component already animates, such as a sheet's detents or a carousel's snapping, use the component's own props. Outside React, use `createAnimator`.",
|
|
41
|
+
bestPractices: [
|
|
42
|
+
{
|
|
43
|
+
guidance: true,
|
|
44
|
+
description:
|
|
45
|
+
'Call the animator from event handlers and effects: it lives outside render, so animating never re-renders the component.',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
guidance: true,
|
|
49
|
+
description:
|
|
50
|
+
'Start every `animate` that follows a drag with the release velocity, so the element carries on as it was thrown.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
guidance: true,
|
|
54
|
+
description:
|
|
55
|
+
'Reach every state an animation shows without the animation too: a key, a button or a menu item that calls the same code.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
guidance: false,
|
|
59
|
+
description:
|
|
60
|
+
'Keep the animated values in React state: read them with `animator.get()` when you need them.',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
accessibility: [
|
|
64
|
+
{
|
|
65
|
+
name: 'Keyboard and assistive technology',
|
|
66
|
+
category: 'Keyboard',
|
|
67
|
+
description:
|
|
68
|
+
'An animator moves an element; it adds no way to act. Give every action an animation stands for a control a keyboard and a screen reader can reach, such as a button that discards a card, and have it call `animate`, which Reduce Motion turns into a fade in place. Keep `decay` for a throw the person made: Reduce Motion keeps the momentum of a coast, as it continues that throw. Keep focus on an element that stays on screen: move it before you fling its element away.',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'Reduce Motion',
|
|
72
|
+
category: 'Content',
|
|
73
|
+
criterion: '2.3.3 Animation from Interactions',
|
|
74
|
+
description:
|
|
75
|
+
'When the person asks for reduced motion, every call is planned for them. On a touch screen a move or a scale becomes a short opacity cross-fade: the element fades out where it was and fades back in where it lands. With a mouse it lands at once. A decay of `x` and `y` keeps its momentum, as it continues the throw the person made; a decay of `scale`, `rotate` or `opacity` is planned like a move. No option turns this off.',
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
relatedHooks: ['useAnimatedLayout'],
|
|
80
|
+
importPath: '@astryxdesign/core/hooks',
|
|
81
|
+
category: 'interaction',
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/** @type {import('@astryxdesign/cli/authoring').HookTranslationDoc} */
|
|
85
|
+
export const docsDense = {
|
|
86
|
+
description:
|
|
87
|
+
"Animates the element behind ref (x, y, scale, rotate, opacity) with Astryx's motion; returns the animator.",
|
|
88
|
+
paramDescriptions: {
|
|
89
|
+
ref: 'The element ref; share it with a gesture hook to drag and animate one element.',
|
|
90
|
+
},
|
|
91
|
+
returnDescriptions: {
|
|
92
|
+
animator:
|
|
93
|
+
'animate(target, {velocity?}), decay(velocity), set, get, getVelocity, stop; stable, never re-renders.',
|
|
94
|
+
},
|
|
95
|
+
usage: {
|
|
96
|
+
description:
|
|
97
|
+
'Spring with animate, fling with decay, follow a finger with set. Reduce Motion: a cross-fade on touch, at once with a mouse; decay keeps its momentum.',
|
|
98
|
+
bestPractices: [
|
|
99
|
+
{
|
|
100
|
+
guidance: true,
|
|
101
|
+
description: 'Pass the release velocity to animate after a drag.',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
guidance: false,
|
|
105
|
+
description: 'Keep animated values in state; read animator.get().',
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
};
|