@astryxdesign/core 0.7.7 → 0.7.8-canary.36cde5e
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,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file wheelOptions.ts
|
|
3
|
+
* @input Nothing; types, the row height and pure functions
|
|
4
|
+
* @output WheelOption, WheelProps, WHEEL_ROW_HEIGHT, nearestEnabledIndex,
|
|
5
|
+
* steppedIndex and endIndex: what both wheels share
|
|
6
|
+
* @position Internal; read by Wheel.tsx (which re-exports all of it) and
|
|
7
|
+
* PickerWheel.tsx
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When modified, update:
|
|
10
|
+
* - /packages/core/src/DateInput/Wheel.tsx
|
|
11
|
+
* - /packages/core/src/DateInput/PickerWheel.tsx
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* The row height, px (`dateInputTouchSizes.wheelItemSize`): the pitch of both
|
|
15
|
+
* columns' rows, and the unit of the touch wheel's offset.
|
|
16
|
+
*/
|
|
17
|
+
export declare const WHEEL_ROW_HEIGHT = 28;
|
|
18
|
+
export interface WheelOption {
|
|
19
|
+
/** Stable numeric identity of the row (a month 1-12, or a year). */
|
|
20
|
+
value: number;
|
|
21
|
+
/** Row text. */
|
|
22
|
+
label: string;
|
|
23
|
+
/**
|
|
24
|
+
* Rows outside min/max stay visible but cannot be committed: a wheel that
|
|
25
|
+
* stops on one travels on to the nearest enabled row.
|
|
26
|
+
*/
|
|
27
|
+
isDisabled?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Where the row falls when a key steps the wheel; without it, rows step in
|
|
30
|
+
* list order. A 12-hour hour column sets the full hour, so 12 PM comes before
|
|
31
|
+
* 1 PM.
|
|
32
|
+
*/
|
|
33
|
+
order?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface WheelProps {
|
|
36
|
+
/** Accessible name for the column, e.g. "Month". */
|
|
37
|
+
label: string;
|
|
38
|
+
/** Rows, top to bottom. */
|
|
39
|
+
options: ReadonlyArray<WheelOption>;
|
|
40
|
+
/** Committed value; must match one option's `value`. */
|
|
41
|
+
value: number;
|
|
42
|
+
/** Fired when the wheel comes to rest on a different, enabled row. */
|
|
43
|
+
onChange: (value: number) => void;
|
|
44
|
+
/**
|
|
45
|
+
* False while the wheel is hidden. The scrolling column then waits to listen
|
|
46
|
+
* and scroll, because a hidden scroller's offsets mean nothing. The touch
|
|
47
|
+
* wheel turns its gestures off, and shows a value set from outside without
|
|
48
|
+
* motion.
|
|
49
|
+
*/
|
|
50
|
+
isActive?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The enabled row nearest `index`: `index` itself when it is enabled,
|
|
54
|
+
* otherwise the closest enabled row on either side. A tie goes to the side of
|
|
55
|
+
* `towardIndex` (the committed row), and a wheel with no enabled row stays on
|
|
56
|
+
* `towardIndex`.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```
|
|
60
|
+
* // Hours 0-23 with 09:00-17:00 bounds: stopping on 7 rests on 9.
|
|
61
|
+
* nearestEnabledIndex(hourOptions, 7, 10); // 9
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function nearestEnabledIndex(options: ReadonlyArray<WheelOption>, index: number, towardIndex: number): number;
|
|
65
|
+
/**
|
|
66
|
+
* The row a key moves a wheel to from `from` by `delta` rows, in key order. It
|
|
67
|
+
* is the next enabled row from the target in the key's direction. Past the
|
|
68
|
+
* last enabled row, it is the last enabled row before the target. Null when no
|
|
69
|
+
* enabled row lies in that direction, so the key commits nothing.
|
|
70
|
+
*/
|
|
71
|
+
export declare function steppedIndex(options: ReadonlyArray<WheelOption>, from: number, delta: number): number | null;
|
|
72
|
+
/** The first or the last enabled row in key order: where Home or End moves a wheel. */
|
|
73
|
+
export declare function endIndex(options: ReadonlyArray<WheelOption>, end: 'first' | 'last'): number | null;
|
|
74
|
+
//# sourceMappingURL=wheelOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wheelOptions.d.ts","sourceRoot":"","sources":["../../src/DateInput/wheelOptions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAsBR;AAaD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAyBf;AAED,uFAAuF;AACvF,wBAAgB,QAAQ,CACtB,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,GAAG,EAAE,OAAO,GAAG,MAAM,GACpB,MAAM,GAAG,IAAI,CAKf"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file wheelOptions.ts
|
|
5
|
+
* @input Nothing; types, the row height and pure functions
|
|
6
|
+
* @output WheelOption, WheelProps, WHEEL_ROW_HEIGHT, nearestEnabledIndex,
|
|
7
|
+
* steppedIndex and endIndex: what both wheels share
|
|
8
|
+
* @position Internal; read by Wheel.tsx (which re-exports all of it) and
|
|
9
|
+
* PickerWheel.tsx
|
|
10
|
+
*
|
|
11
|
+
* SYNC: When modified, update:
|
|
12
|
+
* - /packages/core/src/DateInput/Wheel.tsx
|
|
13
|
+
* - /packages/core/src/DateInput/PickerWheel.tsx
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The row height, px (`dateInputTouchSizes.wheelItemSize`): the pitch of both
|
|
18
|
+
* columns' rows, and the unit of the touch wheel's offset.
|
|
19
|
+
*/
|
|
20
|
+
export const WHEEL_ROW_HEIGHT = 28;
|
|
21
|
+
/**
|
|
22
|
+
* The enabled row nearest `index`: `index` itself when it is enabled,
|
|
23
|
+
* otherwise the closest enabled row on either side. A tie goes to the side of
|
|
24
|
+
* `towardIndex` (the committed row), and a wheel with no enabled row stays on
|
|
25
|
+
* `towardIndex`.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```
|
|
29
|
+
* // Hours 0-23 with 09:00-17:00 bounds: stopping on 7 rests on 9.
|
|
30
|
+
* nearestEnabledIndex(hourOptions, 7, 10); // 9
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function nearestEnabledIndex(options, index, towardIndex) {
|
|
34
|
+
const isEnabled = i => i >= 0 && i < options.length && !options[i].isDisabled;
|
|
35
|
+
if (isEnabled(index)) {
|
|
36
|
+
return index;
|
|
37
|
+
}
|
|
38
|
+
for (let distance = 1; distance < options.length; distance++) {
|
|
39
|
+
const below = index - distance;
|
|
40
|
+
const above = index + distance;
|
|
41
|
+
const isBelowEnabled = isEnabled(below);
|
|
42
|
+
const isAboveEnabled = isEnabled(above);
|
|
43
|
+
if (isBelowEnabled && isAboveEnabled) {
|
|
44
|
+
return towardIndex < index ? below : above;
|
|
45
|
+
}
|
|
46
|
+
if (isBelowEnabled) {
|
|
47
|
+
return below;
|
|
48
|
+
}
|
|
49
|
+
if (isAboveEnabled) {
|
|
50
|
+
return above;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return towardIndex;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The rows' indices in the order keys step them: by `order`, else list order. */
|
|
57
|
+
function inKeyOrder(options) {
|
|
58
|
+
const indices = options.map((_, index) => index);
|
|
59
|
+
if (options.every(option => option.order == null)) {
|
|
60
|
+
return indices;
|
|
61
|
+
}
|
|
62
|
+
return indices.sort((a, b) => (options[a].order ?? a) - (options[b].order ?? b));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The row a key moves a wheel to from `from` by `delta` rows, in key order. It
|
|
67
|
+
* is the next enabled row from the target in the key's direction. Past the
|
|
68
|
+
* last enabled row, it is the last enabled row before the target. Null when no
|
|
69
|
+
* enabled row lies in that direction, so the key commits nothing.
|
|
70
|
+
*/
|
|
71
|
+
export function steppedIndex(options, from, delta) {
|
|
72
|
+
const count = options.length;
|
|
73
|
+
if (count === 0 || delta === 0) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const rows = inKeyOrder(options);
|
|
77
|
+
const start = Math.max(0, rows.indexOf(from));
|
|
78
|
+
const isEnabled = position => !options[rows[position]].isDisabled;
|
|
79
|
+
const step = Math.sign(delta);
|
|
80
|
+
const target = Math.min(count - 1, Math.max(0, start + delta));
|
|
81
|
+
for (let position = target; position >= 0 && position < count; position += step) {
|
|
82
|
+
if (isEnabled(position)) {
|
|
83
|
+
return position === start ? null : rows[position];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (let position = target; position !== start; position -= step) {
|
|
87
|
+
if (isEnabled(position)) {
|
|
88
|
+
return rows[position];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** The first or the last enabled row in key order: where Home or End moves a wheel. */
|
|
95
|
+
export function endIndex(options, end) {
|
|
96
|
+
const enabled = inKeyOrder(options).filter(index => !options[index].isDisabled);
|
|
97
|
+
return (end === 'first' ? enabled[0] : enabled[enabled.length - 1]) ?? null;
|
|
98
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { type SpringDescription } from '../motion/spring.js';
|
|
2
|
+
/** A motion of the wheel's offset, from t = 0 to `duration` (seconds). */
|
|
3
|
+
export interface WheelCurve {
|
|
4
|
+
/** Seconds until the wheel is at rest on `to`. */
|
|
5
|
+
readonly duration: number;
|
|
6
|
+
/** Where the motion ends. */
|
|
7
|
+
readonly to: number;
|
|
8
|
+
/** Offset at `t` seconds; `to` from `duration` on. */
|
|
9
|
+
value(t: number): number;
|
|
10
|
+
/** Velocity at `t` seconds, px/s; 0 from `duration` on. */
|
|
11
|
+
velocity(t: number): number;
|
|
12
|
+
}
|
|
13
|
+
/** How a release moves the wheel. */
|
|
14
|
+
export type WheelPlanKind = 'coast' | 'snap' | 'edge' | 'return';
|
|
15
|
+
/** What a release does: the curve, and the row it ends on. */
|
|
16
|
+
export interface WheelPlan {
|
|
17
|
+
readonly kind: WheelPlanKind;
|
|
18
|
+
/** The row the wheel comes to rest on. */
|
|
19
|
+
readonly index: number;
|
|
20
|
+
readonly curve: WheelCurve;
|
|
21
|
+
}
|
|
22
|
+
/** The rows a wheel moves over. */
|
|
23
|
+
export interface WheelLayout {
|
|
24
|
+
/** Row height, px. */
|
|
25
|
+
readonly rowHeight: number;
|
|
26
|
+
readonly rowCount: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The longest a plan runs, s: the animator's limit (`MAX_DURATION_MS` in
|
|
30
|
+
* motion/animator.ts). A spring that has not settled by then (an undamped
|
|
31
|
+
* one, which never does) snaps onto its end.
|
|
32
|
+
*/
|
|
33
|
+
export declare const MAX_PLAN_SECONDS = 30;
|
|
34
|
+
/** The constants' scale for a wheel whose rows are `rowHeight` px tall. */
|
|
35
|
+
export declare function scaleFor(rowHeight: number): number;
|
|
36
|
+
/** The wheel at rest on `offset`: a curve that does not move. */
|
|
37
|
+
export declare function restCurve(offset: number): WheelCurve;
|
|
38
|
+
/** The offsets of the first and last rows. */
|
|
39
|
+
export declare function offsetBounds({ rowHeight, rowCount }: WheelLayout): {
|
|
40
|
+
min: number;
|
|
41
|
+
max: number;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* The offset a drag shows for the finger's `offset`: past the first or last
|
|
45
|
+
* row it is rubber-banded, as a UIPickerView's table is.
|
|
46
|
+
*/
|
|
47
|
+
export declare function dragOffset(offset: number, layout: WheelLayout): number;
|
|
48
|
+
/** The nearest row to `offset`, clamped to the rows. */
|
|
49
|
+
export declare function nearestIndex(offset: number, layout: WheelLayout): number;
|
|
50
|
+
/**
|
|
51
|
+
* Ease from `from` onto `to` as UIKit does after a release without velocity.
|
|
52
|
+
* The distance left falls as e^(−k t), and the ease ends within half a device
|
|
53
|
+
* pixel.
|
|
54
|
+
*/
|
|
55
|
+
export declare function snapCurve(from: number, to: number, scale?: number): WheelCurve;
|
|
56
|
+
/**
|
|
57
|
+
* A coast from `from` at `velocity` that keeps the velocity and ends on `to` at
|
|
58
|
+
* the stop speed. The rate is re-solved, so the speed falls from |velocity| to
|
|
59
|
+
* the stop speed over exactly `to − from`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function coastCurve(from: number, velocity: number, to: number, scale?: number): WheelCurve;
|
|
62
|
+
/**
|
|
63
|
+
* The bounce spring, from `from` with `velocity`, onto `to`. `bounce` is
|
|
64
|
+
* `scroll.bounce`'s spring as its caller resolves it.
|
|
65
|
+
*/
|
|
66
|
+
export declare function bounceCurve(from: number, velocity: number, to: number, scale?: number, bounce?: SpringDescription): WheelCurve;
|
|
67
|
+
/**
|
|
68
|
+
* A coast that runs into an end: the normal decay until the offset reaches
|
|
69
|
+
* `edge`, then the bounce spring with the velocity it has there.
|
|
70
|
+
*/
|
|
71
|
+
export declare function edgeCurve(from: number, velocity: number, edge: number, scale?: number, bounceSpring?: SpringDescription): WheelCurve;
|
|
72
|
+
/**
|
|
73
|
+
* Where the scroll view projects a release. This is the coast's rest point at
|
|
74
|
+
* the normal rate, short of the stop speed. UIScrollView sums it the same way
|
|
75
|
+
* (`projectDistance`: r ÷ (1 − r) ms of the speed).
|
|
76
|
+
*/
|
|
77
|
+
export declare function projectRelease(offset: number, velocity: number, scale?: number): number;
|
|
78
|
+
/**
|
|
79
|
+
* What the wheel does when the finger lifts at `offset` with `velocity`
|
|
80
|
+
* (px/s, positive when the rows move up). `bounce` is `scroll.bounce`'s
|
|
81
|
+
* spring as the wheel resolves it. The velocity is the pan's
|
|
82
|
+
* `scrollVelocity()` at the lift. The plan follows UIKit, as measured:
|
|
83
|
+
*
|
|
84
|
+
* - Inside the rows, a release slower than `release.minimumSpeed` carries no
|
|
85
|
+
* velocity. Past an end, the velocity is kept.
|
|
86
|
+
* - The scroll view projects the coast (`projectRelease`), and the picker
|
|
87
|
+
* snaps that to the nearest row. The coast keeps the release velocity and
|
|
88
|
+
* stops exactly on that row.
|
|
89
|
+
* - A projection past an end is not re-solved. The coast decays at the normal
|
|
90
|
+
* rate into the end, and the bounce takes its velocity there.
|
|
91
|
+
* - A release without velocity eases onto the nearest row at `snapRate`.
|
|
92
|
+
* - A release past an end returns on the bounce spring.
|
|
93
|
+
* - A spring that has not settled by the animator's limit snaps onto its end
|
|
94
|
+
* there, as the animator's own motion does.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```
|
|
98
|
+
* const plan = planRelease(963.67, 933.4, {rowHeight: 32, rowCount: 60});
|
|
99
|
+
* plan.index; // 45: the coast stops on row 45 after about 2.3 s
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function planRelease(offset: number, velocity: number, layout: WheelLayout, bounce?: SpringDescription): WheelPlan;
|
|
103
|
+
/**
|
|
104
|
+
* The tap spin onto a row: UIKit's animated setContentOffset, over
|
|
105
|
+
* `duration` seconds on `curve`.
|
|
106
|
+
*/
|
|
107
|
+
export declare function spinCurve(from: number, to: number, duration: number, curve: readonly [number, number, number, number]): WheelCurve;
|
|
108
|
+
/**
|
|
109
|
+
* The times (seconds, ascending) at which a row's centre reaches the band's
|
|
110
|
+
* centre during `curve`, after `after` and up to `until`. They are thinned so
|
|
111
|
+
* that two are never closer than the selection tick's minimum interval. `last`
|
|
112
|
+
* is the time of the previous tick, if any. Leaving the row the wheel starts on
|
|
113
|
+
* is not a tick; reaching the next one is.
|
|
114
|
+
*/
|
|
115
|
+
export declare function tickTimes(curve: WheelCurve, rowHeight: number, { after, until, last, step, }?: {
|
|
116
|
+
after?: number;
|
|
117
|
+
until?: number;
|
|
118
|
+
last?: number;
|
|
119
|
+
step?: number;
|
|
120
|
+
}): number[];
|
|
121
|
+
/**
|
|
122
|
+
* Whether moving from offset `from` to `to` brings a row's centre onto the
|
|
123
|
+
* band's. That is a multiple of `rowHeight` in (from, to] moving up, or in [to,
|
|
124
|
+
* from) moving down.
|
|
125
|
+
*/
|
|
126
|
+
export declare function reachesRow(from: number, to: number, rowHeight: number): boolean;
|
|
127
|
+
//# sourceMappingURL=wheelPhysics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wheelPhysics.d.ts","sourceRoot":"","sources":["../../src/DateInput/wheelPhysics.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAwB,KAAK,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAI/E,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjE,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAQD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOpD;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAC,EAAE,WAAW,GAAG;IAChE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAEA;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAWtE;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAGxE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,UAAU,CAmBzE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,SAAI,GACR,UAAU,CAyBZ;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,SAAI,EACT,MAAM,GAAE,iBAAiC,GACxC,UAAU,CAgBZ;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAI,EACT,YAAY,GAAE,iBAAiC,GAC9C,UAAU,CA0BZ;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAI,GACR,MAAM,CAOR;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE,iBAAiC,GACxC,SAAS,CA6BX;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC/C,UAAU,CAqBZ;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,EACE,KAAS,EACT,KAAsB,EACtB,IAAgB,EAChB,IAAc,GACf,GAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAM,GACrE,MAAM,EAAE,CAkBV;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAQT"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file wheelPhysics.ts
|
|
5
|
+
* @input A wheel's offset and release velocity, its rows, and the UIKit
|
|
6
|
+
* picker constants (motion/uikit/picker.ts)
|
|
7
|
+
* @output The curves a picker wheel moves on: the release plan, the tap spin,
|
|
8
|
+
* the rubber band, and the row crossings that tick
|
|
9
|
+
* @position Pure math of the touch picker wheel (PickerWheel.tsx)
|
|
10
|
+
*
|
|
11
|
+
* Positions are px, times seconds and velocities px/s. Row k is under the
|
|
12
|
+
* band at an offset of k rows. UIKit's pt values scale by `scale`.
|
|
13
|
+
*
|
|
14
|
+
* SYNC: When modified, update wheelPhysics.test.ts and PickerWheel.tsx.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { cubicBezier } from "../motion/bezier.js";
|
|
18
|
+
import { projectDistance } from "../motion/projection.js";
|
|
19
|
+
import { solveDecay } from "../motion/decay.js";
|
|
20
|
+
import { rubberBand } from "../motion/rubberBand.js";
|
|
21
|
+
import { solveSpring, toSpring } from "../motion/spring.js";
|
|
22
|
+
import { picker } from "../motion/uikit/picker.js";
|
|
23
|
+
import { scroll } from "../motion/uikit/scroll.js";
|
|
24
|
+
|
|
25
|
+
/** A motion of the wheel's offset, from t = 0 to `duration` (seconds). */
|
|
26
|
+
|
|
27
|
+
/** How a release moves the wheel. */
|
|
28
|
+
|
|
29
|
+
/** What a release does: the curve, and the row it ends on. */
|
|
30
|
+
|
|
31
|
+
/** The rows a wheel moves over. */
|
|
32
|
+
|
|
33
|
+
/** UIKit's row height in pt: the unit the picker constants are measured in. */
|
|
34
|
+
const UIKIT_ROW_HEIGHT = picker.geometry.rowHeight;
|
|
35
|
+
|
|
36
|
+
/** Below half a device pixel at 3×, a motion is on its row. */
|
|
37
|
+
const AT_REST_PT = 1 / 6;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The longest a plan runs, s: the animator's limit (`MAX_DURATION_MS` in
|
|
41
|
+
* motion/animator.ts). A spring that has not settled by then (an undamped
|
|
42
|
+
* one, which never does) snaps onto its end.
|
|
43
|
+
*/
|
|
44
|
+
export const MAX_PLAN_SECONDS = 30;
|
|
45
|
+
|
|
46
|
+
/** The constants' scale for a wheel whose rows are `rowHeight` px tall. */
|
|
47
|
+
export function scaleFor(rowHeight) {
|
|
48
|
+
return rowHeight / UIKIT_ROW_HEIGHT;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** The wheel at rest on `offset`: a curve that does not move. */
|
|
52
|
+
export function restCurve(offset) {
|
|
53
|
+
return {
|
|
54
|
+
duration: 0,
|
|
55
|
+
to: offset,
|
|
56
|
+
value: () => offset,
|
|
57
|
+
velocity: () => 0
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The offsets of the first and last rows. */
|
|
62
|
+
export function offsetBounds({
|
|
63
|
+
rowHeight,
|
|
64
|
+
rowCount
|
|
65
|
+
}) {
|
|
66
|
+
return {
|
|
67
|
+
min: 0,
|
|
68
|
+
max: Math.max(0, rowCount - 1) * rowHeight
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The offset a drag shows for the finger's `offset`: past the first or last
|
|
74
|
+
* row it is rubber-banded, as a UIPickerView's table is.
|
|
75
|
+
*/
|
|
76
|
+
export function dragOffset(offset, layout) {
|
|
77
|
+
const {
|
|
78
|
+
min,
|
|
79
|
+
max
|
|
80
|
+
} = offsetBounds(layout);
|
|
81
|
+
const dimension = picker.geometry.rubberBandDimension * scaleFor(layout.rowHeight);
|
|
82
|
+
if (offset < min) {
|
|
83
|
+
return min + rubberBand(offset - min, dimension);
|
|
84
|
+
}
|
|
85
|
+
if (offset > max) {
|
|
86
|
+
return max + rubberBand(offset - max, dimension);
|
|
87
|
+
}
|
|
88
|
+
return offset;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** The nearest row to `offset`, clamped to the rows. */
|
|
92
|
+
export function nearestIndex(offset, layout) {
|
|
93
|
+
const index = Math.round(offset / layout.rowHeight);
|
|
94
|
+
return Math.min(Math.max(index, 0), Math.max(0, layout.rowCount - 1));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Ease from `from` onto `to` as UIKit does after a release without velocity.
|
|
99
|
+
* The distance left falls as e^(−k t), and the ease ends within half a device
|
|
100
|
+
* pixel.
|
|
101
|
+
*/
|
|
102
|
+
export function snapCurve(from, to, scale = 1) {
|
|
103
|
+
const distance = from - to;
|
|
104
|
+
const rate = picker.snapRate * 1000;
|
|
105
|
+
const epsilon = AT_REST_PT * scale;
|
|
106
|
+
if (Math.abs(distance) <= epsilon) {
|
|
107
|
+
return {
|
|
108
|
+
duration: 0,
|
|
109
|
+
to,
|
|
110
|
+
value: () => to,
|
|
111
|
+
velocity: () => 0
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const duration = Math.log(Math.abs(distance) / epsilon) / rate;
|
|
115
|
+
return {
|
|
116
|
+
duration,
|
|
117
|
+
to,
|
|
118
|
+
value: t => t >= duration ? to : to + distance * Math.exp(-rate * t),
|
|
119
|
+
velocity: t => t >= duration ? 0 : -rate * distance * Math.exp(-rate * t)
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* A coast from `from` at `velocity` that keeps the velocity and ends on `to` at
|
|
125
|
+
* the stop speed. The rate is re-solved, so the speed falls from |velocity| to
|
|
126
|
+
* the stop speed over exactly `to − from`.
|
|
127
|
+
*/
|
|
128
|
+
export function coastCurve(from, velocity, to, scale = 1) {
|
|
129
|
+
const stopSpeed = picker.release.stopSpeed * 1000 * scale;
|
|
130
|
+
const distance = to - from;
|
|
131
|
+
const speed = Math.abs(velocity);
|
|
132
|
+
if (distance === 0 || Math.sign(distance) !== Math.sign(velocity) || speed <= stopSpeed) {
|
|
133
|
+
return snapCurve(from, to, scale);
|
|
134
|
+
}
|
|
135
|
+
const direction = Math.sign(distance);
|
|
136
|
+
// Per second: the speed falls by λ × the distance covered.
|
|
137
|
+
const lambda = (speed - stopSpeed) / Math.abs(distance);
|
|
138
|
+
const duration = Math.log(speed / stopSpeed) / lambda;
|
|
139
|
+
return {
|
|
140
|
+
duration,
|
|
141
|
+
to,
|
|
142
|
+
value: t => t >= duration ? to : from + direction * speed * -Math.expm1(-lambda * t) / lambda,
|
|
143
|
+
velocity: t => t >= duration ? 0 : direction * speed * Math.exp(-lambda * t)
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* The bounce spring, from `from` with `velocity`, onto `to`. `bounce` is
|
|
149
|
+
* `scroll.bounce`'s spring as its caller resolves it.
|
|
150
|
+
*/
|
|
151
|
+
export function bounceCurve(from, velocity, to, scale = 1, bounce = scroll.bounce) {
|
|
152
|
+
const spring = solveSpring(toSpring(bounce), {
|
|
153
|
+
from,
|
|
154
|
+
to,
|
|
155
|
+
velocity
|
|
156
|
+
});
|
|
157
|
+
const duration = Math.min(MAX_PLAN_SECONDS, spring.settleTime(AT_REST_PT * scale));
|
|
158
|
+
return {
|
|
159
|
+
duration,
|
|
160
|
+
to,
|
|
161
|
+
value: t => t >= duration ? to : spring.value(t),
|
|
162
|
+
velocity: t => t >= duration ? 0 : spring.velocity(t)
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* A coast that runs into an end: the normal decay until the offset reaches
|
|
168
|
+
* `edge`, then the bounce spring with the velocity it has there.
|
|
169
|
+
*/
|
|
170
|
+
export function edgeCurve(from, velocity, edge, scale = 1, bounceSpring = scroll.bounce) {
|
|
171
|
+
const decay = solveDecay({
|
|
172
|
+
from,
|
|
173
|
+
velocity
|
|
174
|
+
});
|
|
175
|
+
const hit = decay.timeToReach(edge);
|
|
176
|
+
if (hit == null) {
|
|
177
|
+
return bounceCurve(from, velocity, edge, scale, bounceSpring);
|
|
178
|
+
}
|
|
179
|
+
const bounce = bounceCurve(edge, decay.velocity(hit), edge, scale, bounceSpring);
|
|
180
|
+
const duration = Math.min(MAX_PLAN_SECONDS, hit + bounce.duration);
|
|
181
|
+
return {
|
|
182
|
+
duration,
|
|
183
|
+
to: edge,
|
|
184
|
+
value: t => t >= duration ? edge : t < hit ? decay.value(t) : bounce.value(t - hit),
|
|
185
|
+
velocity: t => t >= duration ? 0 : t < hit ? decay.velocity(t) : bounce.velocity(t - hit)
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Where the scroll view projects a release. This is the coast's rest point at
|
|
191
|
+
* the normal rate, short of the stop speed. UIScrollView sums it the same way
|
|
192
|
+
* (`projectDistance`: r ÷ (1 − r) ms of the speed).
|
|
193
|
+
*/
|
|
194
|
+
export function projectRelease(offset, velocity, scale = 1) {
|
|
195
|
+
const stopSpeed = picker.release.stopSpeed * 1000 * scale;
|
|
196
|
+
const speed = Math.abs(velocity);
|
|
197
|
+
if (speed <= stopSpeed) {
|
|
198
|
+
return offset;
|
|
199
|
+
}
|
|
200
|
+
return offset + Math.sign(velocity) * projectDistance(speed - stopSpeed);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* What the wheel does when the finger lifts at `offset` with `velocity`
|
|
205
|
+
* (px/s, positive when the rows move up). `bounce` is `scroll.bounce`'s
|
|
206
|
+
* spring as the wheel resolves it. The velocity is the pan's
|
|
207
|
+
* `scrollVelocity()` at the lift. The plan follows UIKit, as measured:
|
|
208
|
+
*
|
|
209
|
+
* - Inside the rows, a release slower than `release.minimumSpeed` carries no
|
|
210
|
+
* velocity. Past an end, the velocity is kept.
|
|
211
|
+
* - The scroll view projects the coast (`projectRelease`), and the picker
|
|
212
|
+
* snaps that to the nearest row. The coast keeps the release velocity and
|
|
213
|
+
* stops exactly on that row.
|
|
214
|
+
* - A projection past an end is not re-solved. The coast decays at the normal
|
|
215
|
+
* rate into the end, and the bounce takes its velocity there.
|
|
216
|
+
* - A release without velocity eases onto the nearest row at `snapRate`.
|
|
217
|
+
* - A release past an end returns on the bounce spring.
|
|
218
|
+
* - A spring that has not settled by the animator's limit snaps onto its end
|
|
219
|
+
* there, as the animator's own motion does.
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```
|
|
223
|
+
* const plan = planRelease(963.67, 933.4, {rowHeight: 32, rowCount: 60});
|
|
224
|
+
* plan.index; // 45: the coast stops on row 45 after about 2.3 s
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export function planRelease(offset, velocity, layout, bounce = scroll.bounce) {
|
|
228
|
+
const scale = scaleFor(layout.rowHeight);
|
|
229
|
+
const {
|
|
230
|
+
min,
|
|
231
|
+
max
|
|
232
|
+
} = offsetBounds(layout);
|
|
233
|
+
if (offset < min || offset > max) {
|
|
234
|
+
const edge = offset < min ? min : max;
|
|
235
|
+
return {
|
|
236
|
+
kind: 'return',
|
|
237
|
+
index: nearestIndex(edge, layout),
|
|
238
|
+
curve: bounceCurve(offset, velocity, edge, scale, bounce)
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const minimumSpeed = picker.release.minimumSpeed * 1000 * scale;
|
|
242
|
+
const speed = Math.abs(velocity) < minimumSpeed ? 0 : velocity;
|
|
243
|
+
const projected = projectRelease(offset, speed, scale);
|
|
244
|
+
if (projected < min || projected > max) {
|
|
245
|
+
const edge = projected < min ? min : max;
|
|
246
|
+
return {
|
|
247
|
+
kind: 'edge',
|
|
248
|
+
index: nearestIndex(edge, layout),
|
|
249
|
+
curve: edgeCurve(offset, speed, edge, scale, bounce)
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
const index = nearestIndex(projected, layout);
|
|
253
|
+
const target = index * layout.rowHeight;
|
|
254
|
+
if (speed === 0) {
|
|
255
|
+
return {
|
|
256
|
+
kind: 'snap',
|
|
257
|
+
index,
|
|
258
|
+
curve: snapCurve(offset, target, scale)
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const curve = coastCurve(offset, speed, target, scale);
|
|
262
|
+
return {
|
|
263
|
+
kind: curve.duration > 0 ? 'coast' : 'snap',
|
|
264
|
+
index,
|
|
265
|
+
curve
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* The tap spin onto a row: UIKit's animated setContentOffset, over
|
|
271
|
+
* `duration` seconds on `curve`.
|
|
272
|
+
*/
|
|
273
|
+
export function spinCurve(from, to, duration, curve) {
|
|
274
|
+
if (from === to || !(duration > 0)) {
|
|
275
|
+
return restCurve(to);
|
|
276
|
+
}
|
|
277
|
+
const ease = cubicBezier(curve);
|
|
278
|
+
const distance = to - from;
|
|
279
|
+
// Velocity from the eased progress's slope, by a central difference.
|
|
280
|
+
const step = 1e-4;
|
|
281
|
+
return {
|
|
282
|
+
duration,
|
|
283
|
+
to,
|
|
284
|
+
value: t => t >= duration ? to : from + distance * ease(t / duration),
|
|
285
|
+
velocity: t => {
|
|
286
|
+
if (t >= duration || t < 0) {
|
|
287
|
+
return 0;
|
|
288
|
+
}
|
|
289
|
+
const a = ease(Math.max(0, t / duration - step));
|
|
290
|
+
const b = ease(Math.min(1, t / duration + step));
|
|
291
|
+
return distance * (b - a) / (2 * step * duration);
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* The times (seconds, ascending) at which a row's centre reaches the band's
|
|
298
|
+
* centre during `curve`, after `after` and up to `until`. They are thinned so
|
|
299
|
+
* that two are never closer than the selection tick's minimum interval. `last`
|
|
300
|
+
* is the time of the previous tick, if any. Leaving the row the wheel starts on
|
|
301
|
+
* is not a tick; reaching the next one is.
|
|
302
|
+
*/
|
|
303
|
+
export function tickTimes(curve, rowHeight, {
|
|
304
|
+
after = 0,
|
|
305
|
+
until = curve.duration,
|
|
306
|
+
last = -Infinity,
|
|
307
|
+
step = 1 / 240
|
|
308
|
+
} = {}) {
|
|
309
|
+
const interval = picker.selectionTick.minimumIntervalMs / 1000;
|
|
310
|
+
const times = [];
|
|
311
|
+
let previous = curve.value(after);
|
|
312
|
+
let lastTick = last;
|
|
313
|
+
for (let t = after + step; t < until + step; t += step) {
|
|
314
|
+
const time = Math.min(t, until);
|
|
315
|
+
const value = curve.value(time);
|
|
316
|
+
if (reachesRow(previous, value, rowHeight) && time - lastTick >= interval) {
|
|
317
|
+
times.push(time);
|
|
318
|
+
lastTick = time;
|
|
319
|
+
}
|
|
320
|
+
previous = value;
|
|
321
|
+
if (time === until) {
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return times;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Whether moving from offset `from` to `to` brings a row's centre onto the
|
|
330
|
+
* band's. That is a multiple of `rowHeight` in (from, to] moving up, or in [to,
|
|
331
|
+
* from) moving down.
|
|
332
|
+
*/
|
|
333
|
+
export function reachesRow(from, to, rowHeight) {
|
|
334
|
+
if (to > from) {
|
|
335
|
+
return Math.floor(to / rowHeight) > Math.floor(from / rowHeight);
|
|
336
|
+
}
|
|
337
|
+
if (to < from) {
|
|
338
|
+
return Math.ceil(to / rowHeight) < Math.ceil(from / rowHeight);
|
|
339
|
+
}
|
|
340
|
+
return false;
|
|
341
|
+
}
|