@astryxdesign/core 0.7.7-canary.550ff21 → 0.7.7-canary.58c5b8a
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 +36 -6
- package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts +13 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts.map +1 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.js +45 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +1 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +79 -9
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +23 -4
- package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
- package/dist/BottomSheet/bottomSheetStack.js +5 -4
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +3 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +2 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +9 -4
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +50 -5
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +7 -1
- package/dist/CheckboxList/CheckboxListContext.d.ts +6 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +10 -2
- 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/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +5 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +13 -27
- package/dist/DateInput/Wheel.d.ts +17 -1
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +161 -20
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +63 -49
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +5 -2
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +53 -15
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +15 -11
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +9 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +20 -4
- package/dist/Field/Field.js +2 -2
- package/dist/Field/PanelSearchInput.d.ts +9 -1
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +3 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +27 -2
- 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/InfoTip/InfoTip.d.ts +63 -0
- package/dist/InfoTip/InfoTip.d.ts.map +1 -0
- package/dist/InfoTip/InfoTip.js +126 -0
- package/dist/InfoTip/index.d.ts +10 -0
- package/dist/InfoTip/index.d.ts.map +1 -0
- package/dist/InfoTip/index.js +12 -0
- package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +25 -20
- package/dist/Layer/layerClickBoundary.d.ts +7 -1
- package/dist/Layer/layerClickBoundary.d.ts.map +1 -1
- package/dist/Layer/layerClickBoundary.js +2 -2
- package/dist/Layer/useBackdropPress.d.ts +27 -0
- package/dist/Layer/useBackdropPress.d.ts.map +1 -0
- package/dist/Layer/useBackdropPress.js +53 -0
- package/dist/Layer/usePressPin.d.ts +105 -0
- package/dist/Layer/usePressPin.d.ts.map +1 -0
- package/dist/Layer/usePressPin.js +413 -0
- package/dist/Layer/useTouchTrigger.d.ts +23 -1
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +45 -7
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +2 -1
- package/dist/MobileNav/MobileNav.js +0 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +2 -4
- package/dist/Outline/Outline.d.ts +2 -4
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +4 -52
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +1 -0
- package/dist/Outline/useScrollSpy.js +3 -3
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +56 -7
- package/dist/PowerSearch/PowerSearch.d.ts +36 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +571 -302
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +100 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.js +1913 -0
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +32 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +17 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +170 -61
- package/dist/PowerSearch/formatFilterValue.d.ts +7 -0
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +11 -1
- package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
- package/dist/PowerSearch/formatTokenValue.js +160 -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/ProgressBar/ProgressBar.d.ts +1 -1
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +33 -6
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +8 -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.map +1 -1
- package/dist/Resizable/ResizeHandle.js +118 -260
- package/dist/Resizable/resizeGesture.d.ts +91 -0
- package/dist/Resizable/resizeGesture.d.ts.map +1 -0
- package/dist/Resizable/resizeGesture.js +251 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +3 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +115 -8
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +10 -2
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts +357 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +1349 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts +70 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.js +264 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +96 -67
- package/dist/Selector/optionShape.d.ts +24 -0
- package/dist/Selector/optionShape.d.ts.map +1 -0
- package/dist/Selector/optionShape.js +48 -0
- package/dist/Selector/selectableOptionEntries.d.ts +20 -0
- package/dist/Selector/selectableOptionEntries.d.ts.map +1 -0
- package/dist/Selector/selectableOptionEntries.js +38 -0
- package/dist/Selector/utils.d.ts +2 -17
- package/dist/Selector/utils.d.ts.map +1 -1
- package/dist/Selector/utils.js +3 -51
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +3 -9
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Switch/Switch.d.ts +1 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +200 -46
- package/dist/Switch/switchFill.d.ts +31 -0
- package/dist/Switch/switchFill.d.ts.map +1 -0
- package/dist/Switch/switchFill.js +88 -0
- package/dist/Switch/switchTouch.d.ts +74 -0
- package/dist/Switch/switchTouch.d.ts.map +1 -0
- package/dist/Switch/switchTouch.js +125 -0
- package/dist/Switch/useSwitchTouch.d.ts +276 -0
- package/dist/Switch/useSwitchTouch.d.ts.map +1 -0
- package/dist/Switch/useSwitchTouch.js +939 -0
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +4 -3
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +29 -8
- 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/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +5 -0
- package/dist/Token/Token.d.ts +2 -2
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +13 -4
- package/dist/Token/TokenNamingContext.d.ts +14 -0
- package/dist/Token/TokenNamingContext.d.ts.map +1 -0
- package/dist/Token/TokenNamingContext.js +23 -0
- package/dist/Tokenizer/Tokenizer.d.ts +46 -59
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +44 -60
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +25 -28
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +157 -54
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts +3 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.js +19 -0
- package/dist/Tooltip/Tooltip.d.ts +24 -5
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +29 -5
- package/dist/Tooltip/useTooltip.d.ts +48 -5
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +90 -20
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +4 -7
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +4 -7
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -7
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +26 -15
- 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 +142 -7
- package/dist/gestures/GestureHost.d.ts +27 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +161 -22
- package/dist/gestures/PressTracker.d.ts +6 -0
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +3 -0
- package/dist/gestures/types.d.ts +6 -0
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/usePressTracker.d.ts.map +1 -1
- package/dist/gestures/usePressTracker.js +1 -0
- package/dist/gestures/wheelSegmenter.d.ts +14 -3
- package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
- package/dist/gestures/wheelSegmenter.js +32 -8
- package/dist/hooks/actionGroupTracker.d.ts +7 -4
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
- package/dist/hooks/actionGroupTracker.js +19 -56
- 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/pressGroupContext.d.ts +6 -0
- package/dist/hooks/pressGroupContext.d.ts.map +1 -0
- package/dist/hooks/pressGroupContext.js +20 -0
- 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/useAttachment.d.ts +16 -8
- package/dist/hooks/useAttachment.d.ts.map +1 -1
- package/dist/hooks/useAttachment.js +35 -15
- package/dist/hooks/useFocusTrap.d.ts +15 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +13 -2
- package/dist/hooks/useHighlightedOptionScroll.d.ts +11 -1
- package/dist/hooks/useHighlightedOptionScroll.d.ts.map +1 -1
- package/dist/hooks/useHighlightedOptionScroll.js +112 -11
- 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/useMediaQuery.d.ts +2 -1
- package/dist/hooks/useMediaQuery.d.ts.map +1 -1
- package/dist/hooks/useMediaQuery.js +7 -4
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +4 -2
- package/dist/hooks/usePager.d.ts +261 -0
- package/dist/hooks/usePager.d.ts.map +1 -0
- package/dist/hooks/usePager.js +1169 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts +8 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.js +12 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.js +1 -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-english/Tokenizer/TokenizerBottomSheet.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.js +7 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +33 -1
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +33 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/internal/SheetConfirmation.d.ts +11 -0
- package/dist/internal/SheetConfirmation.d.ts.map +1 -0
- package/dist/internal/SheetConfirmation.js +92 -0
- package/dist/internal/sheetDraft.d.ts +35 -0
- package/dist/internal/sheetDraft.d.ts.map +1 -0
- package/dist/internal/sheetDraft.js +65 -0
- package/dist/internal/touch-sheet.d.ts +21 -0
- package/dist/internal/touch-sheet.d.ts.map +1 -0
- package/dist/internal/touch-sheet.js +19 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts +24 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts.map +1 -0
- package/dist/internal/useDismissSearchOnTouchDrag.js +56 -0
- package/dist/motion/animator.d.ts +14 -14
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +41 -18
- package/dist/motion/paging.d.ts +16 -5
- package/dist/motion/paging.d.ts.map +1 -1
- package/dist/motion/paging.js +34 -14
- package/dist/motion/reducedMotion.d.ts +24 -0
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +78 -1
- package/dist/motion/roles.d.ts +7 -1
- package/dist/motion/roles.d.ts.map +1 -1
- package/dist/motion/roles.js +20 -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 +7 -4
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +7 -4
- package/dist/motion/uikit/paging.d.ts +31 -20
- package/dist/motion/uikit/paging.d.ts.map +1 -1
- package/dist/motion/uikit/paging.js +41 -11
- package/dist/motion/uikit/progressBar.d.ts +27 -7
- package/dist/motion/uikit/progressBar.d.ts.map +1 -1
- package/dist/motion/uikit/progressBar.js +31 -11
- package/dist/motion/uikit/segmented.d.ts +55 -0
- package/dist/motion/uikit/segmented.d.ts.map +1 -0
- package/dist/motion/uikit/segmented.js +77 -0
- package/dist/motion/uikit/springs.d.ts +8 -42
- package/dist/motion/uikit/springs.d.ts.map +1 -1
- package/dist/motion/uikit/springs.js +12 -42
- package/dist/motion/uikit/switch.d.ts +166 -0
- package/dist/motion/uikit/switch.d.ts.map +1 -0
- package/dist/motion/uikit/switch.js +186 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts +15 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressGroupItem.stylex.js +23 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts +18 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.js +28 -0
- package/dist/privateAttributes/segmentTitle.stylex.d.ts +5 -0
- package/dist/privateAttributes/segmentTitle.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/segmentTitle.stylex.js +22 -0
- package/dist/utils/browserClickWait.d.ts +35 -0
- package/dist/utils/browserClickWait.d.ts.map +1 -0
- package/dist/utils/browserClickWait.js +123 -0
- package/dist/utils/clickGuard.d.ts +14 -1
- package/dist/utils/clickGuard.d.ts.map +1 -1
- package/dist/utils/clickGuard.js +46 -1
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +12 -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/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +24 -6
- package/locales/en.json +128 -0
- package/locales/pseudo.json +96 -0
- package/package.json +13 -8
- package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
- package/src/AlertDialog/AlertDialog.tsx +37 -5
- package/src/AppShell/useCloseMobileDrawerOnActivate.ts +52 -0
- package/src/Avatar/Avatar.tsx +3 -1
- package/src/BottomSheet/BottomSheet.tsx +95 -10
- package/src/BottomSheet/BottomSheetPanel.tsx +40 -5
- package/src/BottomSheet/bottomSheetStack.ts +8 -4
- package/src/BottomSheet/useSheetGestures.ts +3 -1
- package/src/Breadcrumbs/BreadcrumbItem.tsx +17 -4
- package/src/Button/Button.tsx +66 -7
- package/src/CheckboxList/CheckboxList.doc.mjs +4 -2
- package/src/CheckboxList/CheckboxList.tsx +6 -0
- package/src/CheckboxList/CheckboxListContext.tsx +6 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/ComplexSelector/ComplexSelector.tsx +20 -5
- package/src/DateInput/DateInput.tsx +8 -2
- package/src/DateInput/MonthScroller.tsx +18 -22
- package/src/DateInput/Wheel.tsx +172 -14
- package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -2
- package/src/DateRangeInput/DateRangeInput.tsx +117 -71
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/Dialog/Dialog.tsx +81 -15
- package/src/Drawer/Drawer.tsx +28 -11
- package/src/Drawer/useDrawerDialogPresence.ts +9 -1
- package/src/DropdownMenu/DropdownMenu.tsx +28 -6
- package/src/Field/Field.tsx +2 -2
- package/src/Field/PanelSearchInput.tsx +11 -0
- package/src/HoverCard/HoverCard.tsx +31 -1
- package/src/Icon/Icon.doc.mjs +49 -8
- package/src/Icon/Icon.tsx +15 -7
- package/src/InfoTip/InfoTip.doc.mjs +192 -0
- package/src/InfoTip/InfoTip.tsx +186 -0
- package/src/InfoTip/index.ts +14 -0
- package/src/Layer/layerAnimations.stylex.ts +24 -16
- package/src/Layer/layerClickBoundary.ts +2 -2
- package/src/Layer/useBackdropPress.ts +81 -0
- package/src/Layer/usePressPin.ts +576 -0
- package/src/Layer/useTouchTrigger.ts +56 -6
- package/src/Lightbox/Lightbox.tsx +2 -1
- package/src/MobileNav/MobileNav.tsx +1 -1
- package/src/MultiSelector/hooks.ts +2 -4
- package/src/Outline/Outline.doc.mjs +177 -51
- package/src/Outline/Outline.tsx +5 -57
- package/src/Outline/useOutlineFromMarkdown.doc.mjs +157 -0
- package/src/Outline/useOutlineFromMarkdown.ts +1 -0
- package/src/Outline/useScrollSpy.ts +3 -3
- package/src/Popover/usePopover.tsx +71 -9
- package/src/PowerSearch/PowerSearch.doc.mjs +55 -6
- package/src/PowerSearch/PowerSearch.tsx +798 -324
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +2515 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +28 -6
- package/src/PowerSearch/PowerSearchValueEditor.tsx +203 -38
- package/src/PowerSearch/formatFilterValue.ts +18 -1
- package/src/PowerSearch/formatTokenValue.ts +215 -0
- package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +4 -2
- package/src/ProgressBar/ProgressBar.tsx +67 -7
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioList.tsx +7 -2
- package/src/RadioList/RadioListItem.tsx +5 -3
- package/src/Resizable/ResizeHandle.tsx +133 -328
- package/src/Resizable/resizeGesture.ts +368 -0
- package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
- package/src/SegmentedControl/SegmentedControl.tsx +179 -5
- package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +14 -2
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +1640 -0
- package/src/SegmentedControl/useSegmentedTouchTracking.ts +308 -0
- package/src/Selector/Selector.tsx +136 -89
- package/src/Selector/optionShape.ts +64 -0
- package/src/Selector/selectableOptionEntries.ts +39 -0
- package/src/Selector/utils.ts +9 -68
- package/src/SideNav/SideNavItem.tsx +3 -7
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Switch/Switch.doc.mjs +3 -3
- package/src/Switch/Switch.tsx +412 -86
- package/src/Switch/switchFill.ts +106 -0
- package/src/Switch/switchTouch.ts +186 -0
- package/src/Switch/useSwitchTouch.ts +1051 -0
- package/src/TabList/Tab.tsx +5 -3
- package/src/Table/BaseTable.tsx +46 -12
- package/src/TextInput/TextInput.tsx +11 -10
- package/src/Toast/Toast.tsx +5 -0
- package/src/Token/Token.tsx +15 -4
- package/src/Token/TokenNamingContext.ts +28 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
- package/src/Tokenizer/Tokenizer.tsx +93 -88
- package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
- package/src/Tokenizer/TokenizerItemRemovableContext.ts +24 -0
- package/src/Tooltip/Tooltip.doc.mjs +123 -39
- package/src/Tooltip/Tooltip.tsx +43 -9
- package/src/Tooltip/useTooltip.doc.mjs +171 -31
- package/src/Tooltip/useTooltip.tsx +137 -22
- package/src/TopNav/TopNavItem.tsx +6 -5
- package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
- package/src/TopNav/TopNavMenu.tsx +6 -5
- package/src/Typeahead/Typeahead.tsx +29 -15
- package/src/animator/createAnimator.doc.mjs +153 -0
- package/src/animator/createAnimator.ts +324 -0
- package/src/gestures/GestureHost.ts +205 -21
- package/src/gestures/PressTracker.ts +10 -0
- package/src/gestures/types.ts +6 -0
- package/src/gestures/usePressTracker.ts +2 -0
- package/src/gestures/wheelSegmenter.ts +36 -7
- package/src/hooks/actionGroupTracker.ts +32 -61
- package/src/hooks/index.ts +2 -0
- package/src/hooks/pressGroupContext.ts +21 -0
- 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/useAttachment.ts +56 -14
- package/src/hooks/useFocusTrap.ts +26 -2
- package/src/hooks/useHighlightedOptionScroll.ts +123 -15
- package/src/hooks/useInputStatusIcon.tsx +3 -2
- package/src/hooks/useMediaQuery.doc.mjs +2 -2
- package/src/hooks/useMediaQuery.ts +13 -4
- package/src/hooks/useMenuPress.ts +8 -2
- package/src/hooks/usePager.ts +1446 -0
- package/src/i18n/generated-english/InfoTip/InfoTip.generated.ts +13 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearch.generated.ts +1 -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-english/Tokenizer/TokenizerBottomSheet.generated.ts +7 -1
- package/src/i18n/generated-locales/en.generated.ts +43 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +44 -0
- package/src/index.ts +14 -0
- package/src/internal/SheetConfirmation.tsx +101 -0
- package/src/internal/sheetDraft.ts +80 -0
- package/src/internal/touch-sheet.ts +21 -0
- package/src/internal/useDismissSearchOnTouchDrag.ts +69 -0
- package/src/motion/MEASUREMENTS.md +36 -27
- package/src/motion/README.md +11 -6
- package/src/motion/animator.ts +61 -29
- package/src/motion/paging.ts +37 -14
- package/src/motion/reducedMotion.ts +79 -1
- package/src/motion/roles.ts +20 -1
- package/src/motion/uikit/alert.ts +43 -0
- package/src/motion/uikit/index.ts +6 -5
- package/src/motion/uikit/paging.ts +41 -10
- package/src/motion/uikit/progressBar.ts +31 -11
- package/src/motion/uikit/segmented.ts +74 -0
- package/src/motion/uikit/springs.ts +12 -42
- package/src/motion/uikit/switch.ts +174 -0
- package/src/privateAttributes/pressGroupItem.stylex.ts +23 -0
- package/src/privateAttributes/pressHoldsDrag.stylex.ts +28 -0
- package/src/privateAttributes/segmentTitle.stylex.ts +22 -0
- package/src/utils/browserClickWait.ts +133 -0
- package/src/utils/clickGuard.ts +64 -1
- package/src/utils/dateParser.ts +16 -0
- package/src/utils/interactionOverlay.stylex.ts +3 -2
- package/src/utils/pressFeedback.ts +24 -6
- package/dist/internal/tokenizer-presentation.d.ts +0 -21
- package/dist/internal/tokenizer-presentation.d.ts.map +0 -1
- package/dist/internal/tokenizer-presentation.js +0 -21
- package/src/internal/tokenizer-presentation.ts +0 -25
|
@@ -37,27 +37,28 @@ installed); rows marked † also on iOS 18 for the pre-glass delta. iPhone
|
|
|
37
37
|
|
|
38
38
|
## Shared (foundation)
|
|
39
39
|
|
|
40
|
-
| ID | What | App and gesture | Extract
|
|
41
|
-
| ----- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
42
|
-
| M-S1 | Deceleration rates | none | `UIScrollView.DecelerationRate.normal.rawValue`, `.fast.rawValue`
|
|
43
|
-
| M-S2 | Momentum coast | A long list (Contacts, or a probe table of 500 rows): flicks released at 1000, 2500, 5000 pt/s | contentOffset(t) from release to rest; decay constant; per-millisecond vs per-frame model; the speed at which it stops
|
|
44
|
-
| M-S3 | Bounce-back spring | Same list: drag 120 pt past the top, hold still, release; a flick into the top edge at 3000 pt/s | contentOffset(t) after release and after edge contact; spring response and damping ratio; velocity hand-off
|
|
45
|
-
| M-S5 | Rubber band | Same list on an 852 pt view: drag 100, 300, 600 pt past the top; a horizontal pager | displayed overflow against finger overflow; confirm c = 0.55 and d = the view's size on the axis
|
|
46
|
-
| M-PG1 | Paging | Photos full-screen swipes; a probe paging scroll view | page chosen per release position × velocity (thresholds; at most one page?); contentOffset(t) onto the page
|
|
47
|
-
| M-ST1 | Scroll to top | Settings scrolled down 500, 2000, 8000 pt; tap the status bar | contentOffset(t); duration against distance; curve or spring fit
|
|
48
|
-
| M-N1 | Navigation push | Settings: tap General | incoming leading edge x(t), outgoing x(t) (parallax fraction), dimming alpha(t); animation parameters
|
|
49
|
-
| M-N2 | Navigation pop | General: back button | same as M-N1
|
|
50
|
-
| M-N3 | Interactive pop | Settings ▸ General: edge swipe released at 40 % of the width at 600 pt/s (finishes) and at 30 % at rest (cancels) | x(t) after release; spring parameters; the finish / cancel rule (position, velocity)
|
|
51
|
-
| M-A1 | Alert | Probe app: `UIAlertController(.alert)` presented and dismissed | scale(t), alpha(t) of the alert and the dimming view; animation parameters
|
|
52
|
-
| M-AS1 | Action sheet and menu | Probe app: `.actionSheet`; a button with a `UIMenu` as its primary action; Files: the … menu | scale, alpha, position (t) on open and close; animation parameters
|
|
53
|
-
| M-CM1 | Context menu | Files: long-press an item; dismiss by tapping outside | preview scale(t) on lift, backdrop blur and dim (t), menu scale(t); the preview's return on dismiss
|
|
54
|
-
| M-K1 | UIKit legacy spring | Probe app: `UIView.animate(withDuration:usingSpringWithDamping:initialSpringVelocity:)`, durations 0.3, 0.5, 1 × ratios 0.5, 0.8, 1 × velocities 0, 2 | the `CASpringAnimation` UIKit attaches: mass, stiffness, damping, initialVelocity, duration, settlingDuration
|
|
55
|
-
| M-K2 | Default spring, keyboard | Probe app: an animator with `UISpringTimingParameters()`; focus and blur a text field | both springs' parameters and allowsOverdamping; the keyboard notification's duration and curve
|
|
56
|
-
| M-CA1 | Settling duration | none: `CASpringAnimation` mass 1, stiffness 100, damping 5, 10, 15, 20, 40 × initialVelocity 0, 5, −5 × allowsOverdamping on, off | `settlingDuration` of each (checks the critically damped and overdamped branches)
|
|
57
|
-
| M-T1 | Banner | A notification pushed to the simulator while an app is in the foreground | banner y(t) in and out; time on screen
|
|
58
|
-
| M-RM1 | Reduced Motion | Reduce Motion on, Prefer Cross-Fade Transitions on and off: Settings push and pop, an alert (sheets: M-SH13; controls: M-SW11, M-SL12, M-SG15) | which transitions become cross-fades; alpha(t), duration and curve; what still moves
|
|
59
|
-
| M-PR1 | Press release curve | Settings and Contacts: a row tapped and released (the deselect cross-fade) | the timing function Core Animation attaches to the deselect fade (control points)
|
|
60
|
-
| M-NB1 | Navigation bar hide / show | none | `UINavigationController.hideShowBarDuration`
|
|
40
|
+
| ID | What | App and gesture | Extract | Method | Feeds |
|
|
41
|
+
| ----- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
42
|
+
| M-S1 | Deceleration rates | none | `UIScrollView.DecelerationRate.normal.rawValue`, `.fast.rawValue` | D | `scroll.decelerationRate` |
|
|
43
|
+
| M-S2 | Momentum coast | A long list (Contacts, or a probe table of 500 rows): flicks released at 1000, 2500, 5000 pt/s | contentOffset(t) from release to rest; decay constant; per-millisecond vs per-frame model; the speed at which it stops | C | `scroll.decelerationRate` |
|
|
44
|
+
| M-S3 | Bounce-back spring | Same list: drag 120 pt past the top, hold still, release; a flick into the top edge at 3000 pt/s | contentOffset(t) after release and after edge contact; spring response and damping ratio; velocity hand-off | C | `scroll.bounce` |
|
|
45
|
+
| M-S5 | Rubber band | Same list on an 852 pt view: drag 100, 300, 600 pt past the top; a horizontal pager | displayed overflow against finger overflow; confirm c = 0.55 and d = the view's size on the axis | C | `scroll.rubberBand` |
|
|
46
|
+
| M-PG1 | Paging | Photos full-screen swipes; a probe paging scroll view | page chosen per release position × velocity (thresholds; at most one page?); contentOffset(t) onto the page | B, C | `paging` |
|
|
47
|
+
| M-ST1 | Scroll to top | Settings scrolled down 500, 2000, 8000 pt; tap the status bar | contentOffset(t); duration against distance; curve or spring fit | B, C | `scroll.scrollToTopRate` |
|
|
48
|
+
| M-N1 | Navigation push | Settings: tap General | incoming leading edge x(t), outgoing x(t) (parallax fraction), dimming alpha(t); animation parameters | A, B | `springs.navigationPush` |
|
|
49
|
+
| M-N2 | Navigation pop | General: back button | same as M-N1 | A, B | `springs.navigationPop` |
|
|
50
|
+
| M-N3 | Interactive pop | Settings ▸ General: edge swipe released at 40 % of the width at 600 pt/s (finishes) and at 30 % at rest (cancels) | x(t) after release; spring parameters; the finish / cancel rule (position, velocity) | A, B | `springs.navigationInteractivePopFinish` |
|
|
51
|
+
| M-A1 | Alert | Probe app: `UIAlertController(.alert)` presented and dismissed | scale(t), alpha(t) of the alert and the dimming view; animation parameters | A | `springs.alertPresent`, `.alertDismiss` |
|
|
52
|
+
| M-AS1 | Action sheet and menu | Probe app: `.actionSheet`; a button with a `UIMenu` as its primary action; Files: the … menu | scale, alpha, position (t) on open and close; animation parameters | A, B | `springs.actionSheet*`, `.menu*` |
|
|
53
|
+
| M-CM1 | Context menu | Files: long-press an item; dismiss by tapping outside | preview scale(t) on lift, backdrop blur and dim (t), menu scale(t); the preview's return on dismiss | A, B | `springs.contextMenu*` |
|
|
54
|
+
| M-K1 | UIKit legacy spring | Probe app: `UIView.animate(withDuration:usingSpringWithDamping:initialSpringVelocity:)`, durations 0.3, 0.5, 1 × ratios 0.5, 0.8, 1 × velocities 0, 2 | the `CASpringAnimation` UIKit attaches: mass, stiffness, damping, initialVelocity, duration, settlingDuration | A | `springs.ts` (UIKit's legacy springs) |
|
|
55
|
+
| M-K2 | Default spring, keyboard | Probe app: an animator with `UISpringTimingParameters()`; focus and blur a text field | both springs' parameters and allowsOverdamping; the keyboard notification's duration and curve | A, D | `springs.viewChange`, `.keyboard`, `timing.keyboard*` |
|
|
56
|
+
| M-CA1 | Settling duration | none: `CASpringAnimation` mass 1, stiffness 100, damping 5, 10, 15, 20, 40 × initialVelocity 0, 5, −5 × allowsOverdamping on, off | `settlingDuration` of each (checks the critically damped and overdamped branches) | D | `springs.ts` (settling) |
|
|
57
|
+
| M-T1 | Banner | A notification pushed to the simulator while an app is in the foreground | banner y(t) in and out; time on screen | B | `springs.banner` |
|
|
58
|
+
| M-RM1 | Reduced Motion | Reduce Motion on, Prefer Cross-Fade Transitions on and off: Settings push and pop, an alert (sheets: M-SH13; controls: M-SW11, M-SL12, M-SG15) | which transitions become cross-fades; alpha(t), duration and curve; what still moves | B | `timing.reducedMotionCrossFadeMs` (played at 200 ms: `design:reduced-motion` DR2 caps it, DEC-1 of 2026-10-24, departing from the measured 0.5 s) |
|
|
59
|
+
| M-PR1 | Press release curve | Settings and Contacts: a row tapped and released (the deselect cross-fade) | the timing function Core Animation attaches to the deselect fade (control points) | A | `timing.press.highlightOutCurve` |
|
|
60
|
+
| M-NB1 | Navigation bar hide / show | none | `UINavigationController.hideShowBarDuration` | D | `timing.navigationBarHideShowMs` |
|
|
61
|
+
| M-PB1 | Indeterminate pulse | Reduce Motion on: Safari loading a page (its indeterminate bar) beside ProgressBar's reduced-motion pulse | Not a parity value: an owner value (`component:ProgressBar` DEC-2); confirm the 2000 ms pulse reads as calm and the 0.84 floor keeps 3:1 (AR4) | B | `progressBar.reducedMotionPulseMs`, `progressBar.reducedMotionPulseFloor` |
|
|
61
62
|
|
|
62
63
|
Done (UIKit lab, iOS 26.2 simulator, Oct 23 2026; values in `uikit/` tagged
|
|
63
64
|
`measured:`): M-S1, M-NB1, M-K2, M-CA1 (underdamped grid matched to the last
|
|
@@ -128,12 +129,13 @@ Subject "switch S": the first switch in Settings ▸ Accessibility ▸ Display &
|
|
|
128
129
|
Text Size (Bold Text row); a minimal host app holds a UISwitch on a plain view
|
|
129
130
|
where a switch outside any scroll view is needed.
|
|
130
131
|
|
|
131
|
-
Captured (iOS 26.2 simulator, Oct 23 2026), with their values
|
|
132
|
-
switch's own table: M-SW02, M-SW03, M-SW04, M-SW05,
|
|
133
|
-
makes no haptic call), M-SW11 (Reduce Motion: the
|
|
134
|
-
goes), M-SW16 (iOS 26.2).
|
|
135
|
-
|
|
136
|
-
|
|
132
|
+
Captured (iOS 26.2 simulator, Oct 23 2026), with their values in the
|
|
133
|
+
switch's own table (`uikit/switch.ts`): M-SW02, M-SW03, M-SW04, M-SW05,
|
|
134
|
+
M-SW06, M-SW09 (UISwitch makes no haptic call), M-SW11 (Reduce Motion: the
|
|
135
|
+
lift stays, the stretch goes), M-SW16 (iOS 26.2). `springs.switchThumbMove`
|
|
136
|
+
holds the measured travel the switch's table reads; WebKit's
|
|
137
|
+
`switchThumbStretch` is retired for the table's `lift`. Partly: M-SW07 (a single
|
|
138
|
+
tap only). Still open: M-SW17, and M-SW11's On/Off
|
|
137
139
|
labels, Reduce Transparency and Bold Text.
|
|
138
140
|
|
|
139
141
|
| ID | Scene | Gesture | Extract | Method |
|
|
@@ -217,6 +219,13 @@ Bookmarks sheet.
|
|
|
217
219
|
| M-SG18 | iPad S1 (touch; pointer if available) | tap, hold, drag; hover | differences from iPhone | B |
|
|
218
220
|
| M-SG19 | Safari showing the segmented stories vs S1 | the segmented storyboards side by side | synced recordings (parity proof) | B |
|
|
219
221
|
|
|
222
|
+
Done (UIKit lab, iOS 26.2 simulator, Oct 23–24 2026; in the segmented control's
|
|
223
|
+
own table, `uikit/segmented.ts`, tagged `measured:`): M-SG02 (the selection
|
|
224
|
+
spring and the drag clamp; the tracking spring is the shared
|
|
225
|
+
`springs.fingerTracking`; the lift was measured too and is not in the table,
|
|
226
|
+
since a pressed thumb's lift is a theme's) and M-SG03 (the tap's frames,
|
|
227
|
+
fitted per frame).
|
|
228
|
+
|
|
220
229
|
## Sheets (UISheetPresentationController)
|
|
221
230
|
|
|
222
231
|
Probe app "SheetProbe" on an iPhone 16 Pro (iPad Pro 11" for M-SH11 / M-SH20 /
|
package/src/motion/README.md
CHANGED
|
@@ -19,9 +19,12 @@ roles through `resolveMotion`.
|
|
|
19
19
|
| `uikit/scroll.ts` | UIScrollView: deceleration rates, rubber band, bounce-back spring, `delaysContentTouches`, scroll to top. |
|
|
20
20
|
| `uikit/timing.ts` | Non-spring clocks and curves: press highlight, Core Animation's named curves, keyboard, Reduced Motion cross-fade. |
|
|
21
21
|
| `uikit/paging.ts` | A paging UIScrollView: the integrator that settles a release on its page, the page rule, the catch, `setContentOffset(animated:)`. |
|
|
22
|
+
| `uikit/alert.ts` | UIAlertController: how a finger is tracked across the actions (highlight onset and bounds). |
|
|
22
23
|
| `uikit/navigation.ts` | UINavigationController: push velocity, parallax, dimming, transition clock, interactive pop finish rule. |
|
|
23
|
-
| `uikit/progressBar.ts` | UIProgressView's fill: the whole-track duration and curve
|
|
24
|
+
| `uikit/progressBar.ts` | UIProgressView's fill: the whole-track duration and curve, its minimum length and empty alpha; the reduced-motion pulse (three roles). |
|
|
24
25
|
| `uikit/gestures.ts` | Gesture recognizer thresholds, the velocity filter and haptic stand-ins, as `{value, unit}` entries (sources in JSDoc). |
|
|
26
|
+
| `uikit/segmented.ts` | UISegmentedControl: the selection indicator's spring; under Reduce Motion the animator's cross-fade replaces it. |
|
|
27
|
+
| `uikit/switch.ts` | UISwitch on iOS 26.2: geometry, the lift, settle, travel and tracking springs, the flip distance, the track colour. |
|
|
25
28
|
| `roles.ts` | The internal motion roles: the springs, durations and curves `spec:AST-094` FR4 names, registered by the shared tables, and a role's CSS form read back. |
|
|
26
29
|
| `roleValue.ts` | A role's CSS form, written: a spring's duration and bounce, a duration in ms, a curve's `cubic-bezier()`. |
|
|
27
30
|
| `resolveMotion.ts` | A role's value: its table value, as the per-role tables stay internal (`spec:AST-094` DEC-15). |
|
|
@@ -62,7 +65,7 @@ the timings that decide who gets a touch are not roles.
|
|
|
62
65
|
## Animator
|
|
63
66
|
|
|
64
67
|
```
|
|
65
|
-
import {
|
|
68
|
+
import {createMotionAnimator} from '../motion/animator';
|
|
66
69
|
import {coast} from '../motion/coast';
|
|
67
70
|
import {solveSpringTowardRamp, toSpring} from '../motion/spring';
|
|
68
71
|
import {resolveMotion} from '../motion/resolveMotion';
|
|
@@ -71,7 +74,7 @@ import {registerSpringsTable, springs} from '../motion/uikit';
|
|
|
71
74
|
// Once, so the springs are registered as their roles:
|
|
72
75
|
registerSpringsTable();
|
|
73
76
|
|
|
74
|
-
const animator =
|
|
77
|
+
const animator = createMotionAnimator(sheet);
|
|
75
78
|
// The animator plays a motion role (spec:AST-094 FR4), its table value, as the
|
|
76
79
|
// per-role tables stay internal (DEC-15); math on a spring reads the role with
|
|
77
80
|
// resolveMotion.
|
|
@@ -136,8 +139,10 @@ await handle.finished; // true if it ran to the end, false if interrupted
|
|
|
136
139
|
presented call's second frame) runs on over two frames, the start moves to
|
|
137
140
|
the call's first read after it, with every call of that task. Everything
|
|
138
141
|
the call starts shares that start
|
|
139
|
-
(`handle.started`); a retarget
|
|
140
|
-
|
|
142
|
+
(`handle.started`); a retarget of a curve that still moves keeps an
|
|
143
|
+
explicit one, while one on a tail that already shows as at rest (within two
|
|
144
|
+
sample tolerances of its target, and slower than one a frame) counts as a
|
|
145
|
+
call from rest. `{at}` puts several animators on one clock. `{start: 'commit'}` lets the browser date
|
|
141
146
|
a retarget too; `{start: 'presented'}` waits two frames, until the
|
|
142
147
|
element at rest has been presented. `handle.curve(property)` is the curve
|
|
143
148
|
a call plays, for a companion to follow. `{additive: true}` retargets the
|
|
@@ -166,7 +171,7 @@ await handle.finished; // true if it ran to the end, false if interrupted
|
|
|
166
171
|
- `animatorFor(element)` returns the one animator for an element, so code
|
|
167
172
|
that animates it from several places (a swipe on x, a removal on y)
|
|
168
173
|
composes in one `translate` track.
|
|
169
|
-
- `
|
|
174
|
+
- `createMotionAnimator(dialog, {pseudoElement: '::backdrop'})` drives a
|
|
170
175
|
pseudo-element; with no inline style to hold it, a static filling animation
|
|
171
176
|
holds its end value until the next animation replaces it, while the
|
|
172
177
|
pseudo-element exists. A dialog's `::backdrop` is made again each time the
|
package/src/motion/animator.ts
CHANGED
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
* @file animator.ts
|
|
5
5
|
* @input An element, target values, and a spring, momentum curves (coast.ts)
|
|
6
6
|
* or any closed-form curve
|
|
7
|
-
* @output Exports `
|
|
8
|
-
* rotate, scale and opacity,
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* @output Exports `createMotionAnimator`, a compositor animator for
|
|
8
|
+
* translate, rotate, scale and opacity, and its option, handle and
|
|
9
|
+
* transition types. It reads presentation values and velocities from the
|
|
10
|
+
* analytic curves. It retargets with the velocity kept, freezes in place on
|
|
11
|
+
* `stop`, and gives completion promises, a shared clock, and UIKit's
|
|
12
|
+
* Reduced Motion substitution.
|
|
12
13
|
* @position Motion foundation (DOM). Internal to core: components use it for
|
|
13
14
|
* every touch-presentation animation; not exported from the package entry
|
|
14
15
|
*
|
|
@@ -244,18 +245,18 @@ export interface AnimateOptions {
|
|
|
244
245
|
crossfadeAs?: 'entrance' | 'exit';
|
|
245
246
|
/**
|
|
246
247
|
* When the call's animations start. By default a call from rest starts
|
|
247
|
-
* when the browser commits it
|
|
248
|
-
*
|
|
248
|
+
* when the browser commits it. A call that continues motion on screen (a
|
|
249
|
+
* retarget) starts now, from the value on screen. A curve whose tail
|
|
250
|
+
* already shows as at rest counts as rest. Ignored with `at`.
|
|
249
251
|
* - `'commit'`: a call that continues motion also starts when the browser
|
|
250
|
-
* commits it
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* continues motion on screen (a retarget) starts now, as by default.
|
|
252
|
+
* commits it. The browser dates it, as it dates a call from rest.
|
|
253
|
+
* - `'presented'`: a call from rest leaves its element at rest. Its
|
|
254
|
+
* animations are created two frames later, once the frame with the
|
|
255
|
+
* element at rest has been presented. They then start at their commit,
|
|
256
|
+
* so a busy UI process delays the motion instead of skipping into it.
|
|
257
|
+
* Any other change to the animator before then creates the animations
|
|
258
|
+
* first, in call order. A call that continues motion on screen starts
|
|
259
|
+
* now, as by default.
|
|
259
260
|
*/
|
|
260
261
|
start?: 'commit' | 'presented';
|
|
261
262
|
/**
|
|
@@ -297,7 +298,7 @@ export interface MotionCurve {
|
|
|
297
298
|
}
|
|
298
299
|
|
|
299
300
|
/**
|
|
300
|
-
* Options of `
|
|
301
|
+
* Options of `createMotionAnimator`.
|
|
301
302
|
*/
|
|
302
303
|
/** How `set` puts values in place. */
|
|
303
304
|
export interface SetOptions {
|
|
@@ -652,6 +653,18 @@ const SAMPLE_TOLERANCE: Record<MotionProperty, number> = {
|
|
|
652
653
|
/** Keyframes start on this grid (ms) and are split where the curve needs it. */
|
|
653
654
|
const SAMPLE_GRID_MS = 1000 / 30;
|
|
654
655
|
|
|
656
|
+
/**
|
|
657
|
+
* A curve within this many sample tolerances of its target can show as at
|
|
658
|
+
* rest. A call on it then starts as one from rest does, at the browser's start.
|
|
659
|
+
*/
|
|
660
|
+
const REST_DISTANCE_TOLERANCES = 2;
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* A curve shows as at rest only while it moves at most one `SAMPLE_TOLERANCE`
|
|
664
|
+
* a frame at this rate.
|
|
665
|
+
*/
|
|
666
|
+
const REST_FRAMES_PER_SECOND = 60;
|
|
667
|
+
|
|
655
668
|
/** A curve that has not settled by then (an undamped spring) snaps. */
|
|
656
669
|
const MAX_DURATION_MS = 30_000;
|
|
657
670
|
|
|
@@ -803,7 +816,7 @@ export function animatorFor(
|
|
|
803
816
|
const key = options.pseudoElement ?? '';
|
|
804
817
|
let animator = byPseudo.get(key);
|
|
805
818
|
if (animator == null) {
|
|
806
|
-
animator =
|
|
819
|
+
animator = createMotionAnimator(element, options);
|
|
807
820
|
byPseudo.set(key, animator);
|
|
808
821
|
}
|
|
809
822
|
return animator;
|
|
@@ -920,7 +933,7 @@ const REDUCED_TRANSITION: SpringTransition = {
|
|
|
920
933
|
*
|
|
921
934
|
* @example
|
|
922
935
|
* ```
|
|
923
|
-
* const animator =
|
|
936
|
+
* const animator = createMotionAnimator(sheet);
|
|
924
937
|
* // finger lifts at 1200 px/s heading for the detent at 0 (a component
|
|
925
938
|
* // passes the spring of its motion role):
|
|
926
939
|
* animator.animate({y: 0}, {spring: {response: 0.45, dampingRatio: 0.9}, velocity: {y: 1200}});
|
|
@@ -929,7 +942,7 @@ const REDUCED_TRANSITION: SpringTransition = {
|
|
|
929
942
|
* animator.stop(['y']);
|
|
930
943
|
* ```
|
|
931
944
|
*/
|
|
932
|
-
export function
|
|
945
|
+
export function createMotionAnimator(
|
|
933
946
|
element: HTMLElement | null,
|
|
934
947
|
options: AnimatorOptions = {},
|
|
935
948
|
): Animator {
|
|
@@ -1165,6 +1178,22 @@ export function createAnimator(
|
|
|
1165
1178
|
return curveAt(property, time);
|
|
1166
1179
|
};
|
|
1167
1180
|
|
|
1181
|
+
/**
|
|
1182
|
+
* Whether a curve's tail already shows as at rest at `time`. Under a
|
|
1183
|
+
* starved main thread the browser commits a call late. A call that starts
|
|
1184
|
+
* at its own time then skips that far into its curve. One that starts at
|
|
1185
|
+
* the commit holds an element that hardly moves.
|
|
1186
|
+
*/
|
|
1187
|
+
const showsAtRest = (
|
|
1188
|
+
property: MotionProperty,
|
|
1189
|
+
segment: Segment,
|
|
1190
|
+
time: number,
|
|
1191
|
+
): boolean =>
|
|
1192
|
+
Math.abs(valueAt(property, time) - segment.target) <=
|
|
1193
|
+
REST_DISTANCE_TOLERANCES * SAMPLE_TOLERANCE[property] &&
|
|
1194
|
+
Math.abs(velocityAt(property, time)) <=
|
|
1195
|
+
SAMPLE_TOLERANCE[property] * REST_FRAMES_PER_SECOND;
|
|
1196
|
+
|
|
1168
1197
|
const velocityAt = (property: MotionProperty, time: number): number => {
|
|
1169
1198
|
const held = segments.get(property);
|
|
1170
1199
|
if (held != null && isHeld(held)) {
|
|
@@ -2033,10 +2062,10 @@ export function createAnimator(
|
|
|
2033
2062
|
// -- starting from rest ---------------------------------------------------
|
|
2034
2063
|
|
|
2035
2064
|
/**
|
|
2036
|
-
* A call starts from rest when nothing on the channels it drives
|
|
2037
|
-
*
|
|
2038
|
-
*
|
|
2039
|
-
* start.
|
|
2065
|
+
* A call starts from rest when nothing on the channels it drives moves on
|
|
2066
|
+
* screen and nothing pins its clock (`at`). A curve still waiting for its
|
|
2067
|
+
* first frame counts as rest, as does one whose tail already shows as at
|
|
2068
|
+
* rest. Returns its start group, or null for an explicit start.
|
|
2040
2069
|
*/
|
|
2041
2070
|
const beginGroup = (
|
|
2042
2071
|
time: number,
|
|
@@ -2070,10 +2099,12 @@ export function createAnimator(
|
|
|
2070
2099
|
}
|
|
2071
2100
|
return null;
|
|
2072
2101
|
}
|
|
2073
|
-
// A call that continues motion starts now unless it asks for the
|
|
2074
|
-
// browser's start (`commit`). `presented` asks only for a call from rest
|
|
2075
|
-
//
|
|
2076
|
-
// the value and velocity on screen
|
|
2102
|
+
// A call that continues motion starts now, unless it asks for the
|
|
2103
|
+
// browser's start (`commit`). `presented` asks only for a call from rest.
|
|
2104
|
+
// A curve that still moves is not at rest, so a call on it starts now,
|
|
2105
|
+
// from the value and velocity on screen. A tail that shows as at rest
|
|
2106
|
+
// counts as rest, so a call on it waits, under `presented` for its two
|
|
2107
|
+
// frames.
|
|
2077
2108
|
for (const channel of start === 'commit' ? [] : channels) {
|
|
2078
2109
|
for (const property of CHANNELS[channel]) {
|
|
2079
2110
|
const segment = segments.get(property);
|
|
@@ -2084,7 +2115,8 @@ export function createAnimator(
|
|
|
2084
2115
|
time < endOf(property, segment) &&
|
|
2085
2116
|
(segment.group == null ||
|
|
2086
2117
|
segment.group.resolved ||
|
|
2087
|
-
shownSince(property, segment) != null)
|
|
2118
|
+
shownSince(property, segment) != null) &&
|
|
2119
|
+
!showsAtRest(property, segment, time)
|
|
2088
2120
|
) {
|
|
2089
2121
|
return null;
|
|
2090
2122
|
}
|
package/src/motion/paging.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* paging constants
|
|
7
7
|
* @output Exports `pagingSettleVelocity`, `solvePaging` (UIKit's paging settle
|
|
8
8
|
* as a curve the animator plays) and `solveAnimatedPageScroll`
|
|
9
|
-
* @position Pure math, with no DOM and no React
|
|
9
|
+
* @position Pure math, with no DOM and no React; hooks/usePager.ts reads it
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update:
|
|
12
12
|
* - /packages/core/src/motion/paging.test.ts
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import type {MotionCurve} from './animator';
|
|
17
|
+
import {cubicBezier, type BezierPoints} from './bezier';
|
|
17
18
|
import {paging} from './uikit/paging';
|
|
18
19
|
|
|
19
20
|
/**
|
|
@@ -106,33 +107,55 @@ export function solvePaging({
|
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
/**
|
|
109
|
-
* `setContentOffset(_:animated:)`: `paging.animatedScroll.
|
|
110
|
-
*
|
|
111
|
-
*
|
|
110
|
+
* `setContentOffset(_:animated:)`: `paging.animatedScroll.durationMs` on its
|
|
111
|
+
* curve, from the current offset, at any distance. The pager passes the
|
|
112
|
+
* duration and curve that `resolveMotion` gives, which are the measured values
|
|
113
|
+
* of the table.
|
|
114
|
+
*
|
|
115
|
+
* `velocity` (px/s) is the velocity of a move that this one retargets. The new
|
|
116
|
+
* curve starts at it and still ends on `to`, at rest and on time. A new target
|
|
117
|
+
* keeps the current velocity, where UIKit drops it. The carry is a Hermite
|
|
118
|
+
* term, v × duration × u(1 − u)², less the curve's own starting slope. So a
|
|
119
|
+
* move from rest is the curve itself.
|
|
112
120
|
*/
|
|
113
121
|
export function solveAnimatedPageScroll({
|
|
114
122
|
from,
|
|
115
123
|
to,
|
|
124
|
+
durationMs = paging.animatedScroll.durationMs,
|
|
125
|
+
curve = paging.animatedScroll.curve,
|
|
126
|
+
velocity,
|
|
116
127
|
}: {
|
|
117
128
|
from: number;
|
|
118
129
|
to: number;
|
|
130
|
+
durationMs?: number;
|
|
131
|
+
curve?: BezierPoints;
|
|
132
|
+
velocity?: number;
|
|
119
133
|
}): MotionCurve {
|
|
120
|
-
const
|
|
134
|
+
const duration = durationMs / 1000;
|
|
121
135
|
const distance = to - from;
|
|
136
|
+
const ease = cubicBezier(curve);
|
|
137
|
+
const progress = (u: number) => ease(Math.min(1, Math.max(0, u)));
|
|
138
|
+
// The carry, in px: the retargeted velocity over the whole duration, less
|
|
139
|
+
// what the curve's own starting slope already gives.
|
|
140
|
+
const startSlope = progress(1e-4) / 1e-4;
|
|
141
|
+
const carry =
|
|
142
|
+
velocity == null ? 0 : velocity * duration - distance * startSlope;
|
|
143
|
+
const at = (t: number) => {
|
|
144
|
+
const u = Math.min(1, Math.max(0, t / duration));
|
|
145
|
+
return from + distance * progress(u) + carry * u * (1 - u) * (1 - u);
|
|
146
|
+
};
|
|
122
147
|
return {
|
|
123
148
|
duration,
|
|
124
|
-
at
|
|
125
|
-
const u = Math.min(1, Math.max(0, t / duration));
|
|
126
|
-
return from + (distance * (1 - Math.cos(Math.PI * u))) / 2;
|
|
127
|
-
},
|
|
149
|
+
at,
|
|
128
150
|
velocity: t => {
|
|
129
|
-
if (t <= 0
|
|
151
|
+
if (t <= 0) {
|
|
152
|
+
return velocity ?? 0;
|
|
153
|
+
}
|
|
154
|
+
if (t >= duration) {
|
|
130
155
|
return 0;
|
|
131
156
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
Math.sin((Math.PI * t) / duration)
|
|
135
|
-
);
|
|
157
|
+
const h = Math.min(1e-4, t / 2, (duration - t) / 2);
|
|
158
|
+
return (at(t + h) - at(t - h)) / (2 * h);
|
|
136
159
|
},
|
|
137
160
|
};
|
|
138
161
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @file reducedMotion.ts
|
|
5
5
|
* @input The Reduced Motion preference, the primary pointer, the motion tables
|
|
6
6
|
* @output reducedMotionFade (the fade the animator would play, for motion it
|
|
7
|
-
* does not drive) and the
|
|
7
|
+
* does not drive), playReducedMotionDip, and the queries a transition spells
|
|
8
8
|
* @position The one Reduced Motion policy (design:reduced-motion) for code
|
|
9
9
|
* beside the animator: a raw Web Animations fade, a CSS transition
|
|
10
10
|
*
|
|
@@ -102,3 +102,81 @@ export function reducedMotionFade(
|
|
|
102
102
|
easing: `cubic-bezier(${curve.join(', ')})`,
|
|
103
103
|
};
|
|
104
104
|
}
|
|
105
|
+
|
|
106
|
+
/** A running Reduced Motion dip. */
|
|
107
|
+
export interface ReducedMotionDip {
|
|
108
|
+
/** Stops the dip. A change that has not landed yet never lands. */
|
|
109
|
+
cancel(): void;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Plays `fade` on `element` as a dip, and runs `land` at its middle: the
|
|
114
|
+
* fade-out, the change, then the fade-in. The fade-out holds at 0 until `land`
|
|
115
|
+
* has run, and the fade-in starts only after it. So the change never shows at
|
|
116
|
+
* full opacity, however late the main thread runs. A timer at the middle can
|
|
117
|
+
* fire after the fade-in has begun.
|
|
118
|
+
*
|
|
119
|
+
* `land` must apply the change before it returns: the fade-in starts right
|
|
120
|
+
* after it. `from` is the opacity the fade-out starts at: a leaving element
|
|
121
|
+
* fades out from where it is.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```
|
|
125
|
+
* const dip = playReducedMotionDip(scroller, fade, () => scroller.scrollTo({top}));
|
|
126
|
+
* // A newer change replaces it:
|
|
127
|
+
* dip.cancel();
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export function playReducedMotionDip(
|
|
131
|
+
element: Element,
|
|
132
|
+
fade: ReducedMotionFade,
|
|
133
|
+
land: () => void,
|
|
134
|
+
from = 1,
|
|
135
|
+
): ReducedMotionDip {
|
|
136
|
+
const half = fade.duration / 2;
|
|
137
|
+
let isCancelled = false;
|
|
138
|
+
let fadeIn: Animation | null = null;
|
|
139
|
+
const fadeOut = element.animate(
|
|
140
|
+
[{opacity: from, easing: fade.easing}, {opacity: 0}],
|
|
141
|
+
{duration: half, fill: 'forwards'},
|
|
142
|
+
);
|
|
143
|
+
fadeOut.finished.then(
|
|
144
|
+
() => {
|
|
145
|
+
if (isCancelled) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
land();
|
|
149
|
+
// The fade-in holds 0 until it starts: after a long stall, its start can
|
|
150
|
+
// come after the frame that runs this.
|
|
151
|
+
fadeIn = element.animate(
|
|
152
|
+
[{opacity: 0, easing: fade.easing}, {opacity: 1}],
|
|
153
|
+
{duration: half, fill: 'backwards'},
|
|
154
|
+
);
|
|
155
|
+
// The fade-in keeps the dip's own schedule: it starts where the fade-out
|
|
156
|
+
// ended, so the dip keeps its length. The clock is read after the
|
|
157
|
+
// landing, because a frame's timestamp does not count the landing's own
|
|
158
|
+
// work. After a long stall, half of the fade-in still plays.
|
|
159
|
+
const fadeOutEnd = endTime(fadeOut, half);
|
|
160
|
+
if (fadeOutEnd != null) {
|
|
161
|
+
fadeIn.startTime = Math.max(fadeOutEnd, performance.now() - half / 2);
|
|
162
|
+
}
|
|
163
|
+
// The fade-in now holds the opacity, so the held 0 can go.
|
|
164
|
+
fadeOut.cancel();
|
|
165
|
+
},
|
|
166
|
+
// A cancelled fade-out rejects `finished`: nothing lands.
|
|
167
|
+
() => {},
|
|
168
|
+
);
|
|
169
|
+
return {
|
|
170
|
+
cancel() {
|
|
171
|
+
isCancelled = true;
|
|
172
|
+
fadeOut.cancel();
|
|
173
|
+
fadeIn?.cancel();
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** When `animation` was due to end, on its timeline (ms), if it has started. */
|
|
179
|
+
function endTime(animation: Animation, duration: number): number | null {
|
|
180
|
+
const start = animation.startTime;
|
|
181
|
+
return typeof start === 'number' ? start + duration : null;
|
|
182
|
+
}
|
package/src/motion/roles.ts
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* @input The motion tables (motion/uikit and each component's own table)
|
|
6
6
|
* @output registerMotionTable, motionRoleOf, motionRoleIn, listMotionRoles,
|
|
7
7
|
* motionRoleVariable, and the CSS form of a role's value
|
|
8
|
-
* (formatMotionRoleValue, parseMotionRoleValue)
|
|
8
|
+
* (formatMotionRoleValue, parseMotionRoleValue), and parseCssEasing for a
|
|
9
|
+
* CSS transition's easing
|
|
9
10
|
* @position Motion foundation, internal to core: read by the code that
|
|
10
11
|
* resolves a role when a motion starts. No public API writes a role: touch
|
|
11
12
|
* motion stays internal until the public motion-token set is decided.
|
|
@@ -260,3 +261,21 @@ export function parseMotionRoleValue(
|
|
|
260
261
|
? points
|
|
261
262
|
: null;
|
|
262
263
|
}
|
|
264
|
+
|
|
265
|
+
/** The CSS easing keywords, as the control points CSS gives them. */
|
|
266
|
+
const EASING_KEYWORDS: Readonly<Record<string, MotionCurvePoints>> = {
|
|
267
|
+
linear: [0, 0, 1, 1],
|
|
268
|
+
ease: [0.25, 0.1, 0.25, 1],
|
|
269
|
+
'ease-in': [0.42, 0, 1, 1],
|
|
270
|
+
'ease-out': [0, 0, 0.58, 1],
|
|
271
|
+
'ease-in-out': [0.42, 0, 0.58, 1],
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Reads a CSS easing, a keyword or a `cubic-bezier()`, as a curve role's value
|
|
276
|
+
* is read. Returns null for any other easing, such as `steps()`.
|
|
277
|
+
*/
|
|
278
|
+
export function parseCssEasing(text: string): MotionCurvePoints | null {
|
|
279
|
+
const value = text.trim();
|
|
280
|
+
return EASING_KEYWORDS[value] ?? parseMotionRoleValue('curve', value);
|
|
281
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file alert.ts
|
|
5
|
+
* @input Nothing; data only
|
|
6
|
+
* @output Exports `alertController`: how UIAlertController (`.alert`) tracks
|
|
7
|
+
* a finger across its actions
|
|
8
|
+
* @position The alert domain of the UIKit constants table (motion/uikit);
|
|
9
|
+
* its springs are `springs.alertPresent` and `springs.alertDismiss`
|
|
10
|
+
*
|
|
11
|
+
* Every value was read from UIKit on the iOS 26.2 simulator. A host app
|
|
12
|
+
* presented `UIAlertController(.alert)` with two and with three actions.
|
|
13
|
+
* Real HID touches drove it, and the action views' highlight was sampled
|
|
14
|
+
* every frame. Lengths are in pt (CSS px), durations in ms.
|
|
15
|
+
*
|
|
16
|
+
* Every leaf carries one or more `@source`; GUESS values also carry the
|
|
17
|
+
* `@measure` task that will confirm or replace them. uikit.test.ts enforces
|
|
18
|
+
* both.
|
|
19
|
+
*
|
|
20
|
+
* SYNC: When modified, update /packages/core/src/motion/MEASUREMENTS.md
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export const alertController = {
|
|
24
|
+
actions: {
|
|
25
|
+
/**
|
|
26
|
+
* How long after touch-down the touched action highlights: none, it is
|
|
27
|
+
* highlighted in the touch-down frame (a tap and a 300 ms hold alike).
|
|
28
|
+
* @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
|
|
29
|
+
* iPhone 17 Pro, per-frame highlight of the action views under real HID
|
|
30
|
+
* touches, Oct 23 2026
|
|
31
|
+
*/
|
|
32
|
+
highlightOnsetMs: 0,
|
|
33
|
+
/**
|
|
34
|
+
* How far outside an action the finger may go and keep it highlighted:
|
|
35
|
+
* none. The highlight cleared 1 pt below the action, and a lift there ran
|
|
36
|
+
* nothing. UIButton keeps 70 pt; an alert action does not.
|
|
37
|
+
* @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
|
|
38
|
+
* iPhone 17 Pro, per-frame highlight of the action views under real HID
|
|
39
|
+
* touches, Oct 23 2026
|
|
40
|
+
*/
|
|
41
|
+
highlightExpansion: 0,
|
|
42
|
+
},
|
|
43
|
+
} as const;
|
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* @file index.ts
|
|
5
5
|
* @input The domain files of the UIKit constants table
|
|
6
6
|
* @output Re-exports `springs` and one constant per spring (`SHEET_PRESENT_SPRING`,
|
|
7
|
-
* …), `scroll`, `timing`, `navigation`, `progressBar`,
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* …), `scroll`, `timing`, `navigation`, `progressBar`, `segmentedControl`,
|
|
8
|
+
* the `slider` and switch (`switchControl`) domains, and the gesture
|
|
9
|
+
* thresholds (one `UIKIT_*` group per recognizer, their union
|
|
10
|
+
* `UIKIT_GESTURES`, and the haptic tables)
|
|
10
11
|
* @position Entry of the UIKit constants table (motion/uikit). Internal to
|
|
11
12
|
* core: not exported from the package entry point
|
|
12
13
|
*
|
|
@@ -41,6 +42,7 @@ export {
|
|
|
41
42
|
export {navigation, registerNavigationTable} from './navigation';
|
|
42
43
|
export {progressBar, registerProgressBarTable} from './progressBar';
|
|
43
44
|
export {registerScrollTable, scroll} from './scroll';
|
|
45
|
+
export {segmentedControl} from './segmented';
|
|
44
46
|
export {slider} from './slider';
|
|
45
47
|
export {
|
|
46
48
|
ACTION_SHEET_DISMISS_SPRING,
|
|
@@ -63,7 +65,6 @@ export {
|
|
|
63
65
|
NAVIGATION_POP_SPRING,
|
|
64
66
|
NAVIGATION_PUSH_SPRING,
|
|
65
67
|
QUICK_CHANGE_SPRING,
|
|
66
|
-
SEGMENTED_THUMB_SPRING,
|
|
67
68
|
SETTLE_SPRING,
|
|
68
69
|
SHEET_DETENT_SPRING,
|
|
69
70
|
SHEET_DISMISS_SPRING,
|
|
@@ -74,10 +75,10 @@ export {
|
|
|
74
75
|
SUB_MENU_BACK_SPRING,
|
|
75
76
|
SUB_MENU_OPEN_SPRING,
|
|
76
77
|
SWITCH_THUMB_MOVE_SPRING,
|
|
77
|
-
SWITCH_THUMB_STRETCH_SPRING,
|
|
78
78
|
TIMED_CHANGE_SPRING,
|
|
79
79
|
VIEW_CHANGE_SPRING,
|
|
80
80
|
registerSpringsTable,
|
|
81
81
|
springs,
|
|
82
82
|
} from './springs';
|
|
83
|
+
export {switchControl} from './switch';
|
|
83
84
|
export {registerTimingTable, timing} from './timing';
|