@astryxdesign/core 0.7.7-canary.c0929c8 → 0.7.7-canary.c19ca12
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/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 +7 -3
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -3
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +13 -2
- 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/ContextMenu/ContextMenu.js +2 -2
- 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.map +1 -1
- package/dist/DateInput/Wheel.js +22 -41
- 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 +23 -45
- 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 +5 -1
- 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 +4 -3
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +27 -2
- package/dist/HoverCard/useHoverCard.d.ts +5 -4
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -31
- 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/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 +20 -10
- package/dist/Layer/usePressPin.d.ts.map +1 -1
- package/dist/Layer/usePressPin.js +66 -18
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +18 -0
- 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/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/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 +8 -1
- 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/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/switchTouch.d.ts +0 -7
- package/dist/Switch/switchTouch.d.ts.map +1 -1
- package/dist/Switch/switchTouch.js +2 -10
- package/dist/Switch/useSwitchTouch.d.ts +2 -11
- package/dist/Switch/useSwitchTouch.d.ts.map +1 -1
- package/dist/Switch/useSwitchTouch.js +35 -93
- 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 +11 -1
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +30 -15
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +94 -34
- package/dist/Toast/types.d.ts +9 -3
- package/dist/Toast/types.d.ts.map +1 -1
- 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 +40 -57
- 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 +25 -30
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +24 -5
- package/dist/Tooltip/index.d.ts +1 -1
- package/dist/Tooltip/index.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +45 -28
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +52 -59
- 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/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 +96 -7
- package/dist/gestures/GestureHost.d.ts +27 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +157 -21
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +4 -3
- 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 +1 -1
- package/dist/hooks/useAttachment.js +1 -1
- 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/useLongPress.d.ts +6 -2
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +95 -15
- 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/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/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/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/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 +6 -5
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +6 -5
- 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 +0 -18
- package/dist/motion/uikit/springs.d.ts.map +1 -1
- package/dist/motion/uikit/springs.js +5 -21
- 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/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/focusReturn.d.ts +15 -0
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +28 -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 +19 -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 +128 -0
- package/locales/pseudo.json +96 -0
- package/package.json +18 -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/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 +13 -3
- package/src/Button/Button.tsx +63 -5
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
- package/src/CheckboxInput/CheckboxInput.tsx +36 -9
- 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/ContextMenu/ContextMenu.tsx +2 -2
- package/src/DateInput/DateInput.tsx +8 -2
- package/src/DateInput/MonthScroller.tsx +18 -22
- package/src/DateInput/Wheel.tsx +30 -32
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/Dialog/Dialog.tsx +54 -45
- package/src/Drawer/Drawer.tsx +28 -11
- package/src/Drawer/useDrawerDialogPresence.ts +5 -1
- package/src/Field/Field.tsx +2 -2
- package/src/Field/PanelSearchInput.tsx +11 -0
- package/src/HoverCard/HoverCard.doc.mjs +4 -2
- package/src/HoverCard/HoverCard.tsx +35 -4
- package/src/HoverCard/useHoverCard.doc.mjs +178 -36
- package/src/HoverCard/useHoverCard.tsx +46 -52
- 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/useBackdropPress.ts +81 -0
- package/src/Layer/usePressPin.ts +86 -26
- package/src/Lightbox/Lightbox.tsx +18 -0
- 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/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/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 +12 -1
- 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/Spinner/Spinner.tsx +77 -63
- package/src/Switch/switchTouch.ts +2 -10
- package/src/Switch/useSwitchTouch.ts +38 -104
- package/src/Table/BaseTable.tsx +46 -12
- package/src/TextInput/TextInput.tsx +11 -10
- package/src/Toast/Toast.doc.mjs +4 -3
- package/src/Toast/Toast.tsx +57 -32
- package/src/Toast/ToastViewport.tsx +121 -35
- package/src/Toast/types.ts +9 -3
- 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 +89 -85
- package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
- package/src/Tokenizer/TokenizerItemRemovableContext.ts +24 -0
- package/src/Tooltip/Tooltip.doc.mjs +123 -54
- package/src/Tooltip/Tooltip.tsx +36 -39
- package/src/Tooltip/index.ts +0 -1
- package/src/Tooltip/useTooltip.doc.mjs +171 -33
- package/src/Tooltip/useTooltip.tsx +98 -86
- package/src/TopNav/TopNavItem.tsx +6 -5
- package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
- package/src/TopNav/TopNavMenu.tsx +6 -5
- 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 +198 -20
- package/src/gestures/PressTracker.ts +4 -3
- package/src/gestures/README.md +7 -1
- 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 +1 -1
- package/src/hooks/useHighlightedOptionScroll.ts +123 -15
- package/src/hooks/useInputStatusIcon.tsx +3 -2
- package/src/hooks/useLongPress.doc.mjs +2 -2
- package/src/hooks/useLongPress.ts +136 -15
- package/src/hooks/useMediaQuery.doc.mjs +2 -2
- package/src/hooks/useMediaQuery.ts +13 -4
- package/src/hooks/useMenuPress.ts +8 -2
- 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/indicatorPress.stylex.ts +24 -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 +7 -0
- package/src/motion/README.md +9 -5
- package/src/motion/animator.ts +61 -29
- 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 +5 -5
- package/src/motion/uikit/segmented.ts +74 -0
- package/src/motion/uikit/springs.ts +5 -21
- package/src/privateAttributes/pressGroupItem.stylex.ts +23 -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/focusReturn.ts +30 -0
- package/src/utils/interactionOverlay.stylex.ts +3 -2
- package/src/utils/pressFeedback.ts +19 -6
- package/src/utils/triggerFocus.ts +80 -0
- 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
package/src/Selector/utils.ts
CHANGED
|
@@ -6,61 +6,15 @@
|
|
|
6
6
|
* @position Utilities; used by Selector.tsx
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type {
|
|
10
|
-
|
|
11
|
-
SelectorOptionData,
|
|
12
|
-
SelectorDivider,
|
|
13
|
-
SelectorSection,
|
|
14
|
-
} from './types';
|
|
9
|
+
import type {SelectorOptionType, SelectorOptionData} from './types';
|
|
10
|
+
import {getSelectableOptionEntries} from './selectableOptionEntries';
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (typeof option === 'string') {
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
return !('type' in option);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Type guard: check if option is a divider
|
|
30
|
-
*/
|
|
31
|
-
export function isDivider(
|
|
32
|
-
option: SelectorOptionType,
|
|
33
|
-
): option is SelectorDivider {
|
|
34
|
-
return (
|
|
35
|
-
typeof option === 'object' && 'type' in option && option.type === 'divider'
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Type guard: check if option is a section
|
|
41
|
-
*/
|
|
42
|
-
export function isSection(
|
|
43
|
-
option: SelectorOptionType,
|
|
44
|
-
): option is SelectorSection {
|
|
45
|
-
return (
|
|
46
|
-
typeof option === 'object' && 'type' in option && option.type === 'section'
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Normalize string or option to consistent shape
|
|
52
|
-
*/
|
|
53
|
-
export function normalizeOption(
|
|
54
|
-
option: string | SelectorOptionData,
|
|
55
|
-
): SelectorOptionData {
|
|
56
|
-
if (typeof option === 'string') {
|
|
57
|
-
return {value: option, label: option};
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
...option,
|
|
61
|
-
label: option.label ?? option.value,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
12
|
+
export {
|
|
13
|
+
isOptionData,
|
|
14
|
+
isDivider,
|
|
15
|
+
isSection,
|
|
16
|
+
normalizeOption,
|
|
17
|
+
} from './optionShape';
|
|
64
18
|
|
|
65
19
|
/**
|
|
66
20
|
* Get all selectable options (flattening sections)
|
|
@@ -68,18 +22,5 @@ export function normalizeOption(
|
|
|
68
22
|
export function getSelectableOptions(
|
|
69
23
|
options: SelectorOptionType[],
|
|
70
24
|
): SelectorOptionData[] {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
for (const option of options) {
|
|
74
|
-
if (isOptionData(option)) {
|
|
75
|
-
result.push(normalizeOption(option));
|
|
76
|
-
} else if (isSection(option)) {
|
|
77
|
-
for (const opt of option.options) {
|
|
78
|
-
result.push(normalizeOption(opt));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Skip dividers
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return result;
|
|
25
|
+
return getSelectableOptionEntries(options).map(entry => entry.item);
|
|
85
26
|
}
|
|
@@ -72,7 +72,7 @@ import {
|
|
|
72
72
|
SideNavCollapseContext,
|
|
73
73
|
} from './SideNavCollapseContext';
|
|
74
74
|
import {useSideNavRenderMode} from './SideNavRenderContext';
|
|
75
|
-
import {
|
|
75
|
+
import {useCloseMobileDrawerOnActivate} from '../AppShell/useCloseMobileDrawerOnActivate';
|
|
76
76
|
import {themeProps} from '../utils/themeProps';
|
|
77
77
|
import {disabledInteractionProps} from '../utils/disabledInteraction';
|
|
78
78
|
|
|
@@ -535,8 +535,8 @@ export function SideNavItem({
|
|
|
535
535
|
const t = useComponentTranslator();
|
|
536
536
|
const {isCollapsed} = useSideNavCollapse();
|
|
537
537
|
const renderMode = useSideNavRenderMode();
|
|
538
|
-
const {closeMobileNav} = useAppShellMobile();
|
|
539
538
|
const isInDrawer = renderMode === 'drawer' || renderMode === 'drawer-content';
|
|
539
|
+
const closeDrawerAfter = useCloseMobileDrawerOnActivate(isInDrawer);
|
|
540
540
|
const id = useId();
|
|
541
541
|
const hasChildren = !!children;
|
|
542
542
|
const depth = use(SideNavItemDepthContext);
|
|
@@ -625,11 +625,7 @@ export function SideNavItem({
|
|
|
625
625
|
toggleItemCollapse();
|
|
626
626
|
return;
|
|
627
627
|
}
|
|
628
|
-
onClick?.(e);
|
|
629
|
-
// Close the mobile nav when a nav item is activated inside the drawer
|
|
630
|
-
if (isInDrawer) {
|
|
631
|
-
closeMobileNav();
|
|
632
|
-
}
|
|
628
|
+
closeDrawerAfter(onClick)?.(e);
|
|
633
629
|
};
|
|
634
630
|
|
|
635
631
|
const handleToggleClick = (e: React.MouseEvent) => {
|
|
@@ -29,7 +29,7 @@ import {TapGestureRecognizer} from '../gestures/TapGestureRecognizer';
|
|
|
29
29
|
import type {PointerKind} from '../gestures/types';
|
|
30
30
|
import {isRtlElement} from '../hooks/isRtlElement';
|
|
31
31
|
import {
|
|
32
|
-
|
|
32
|
+
createMotionAnimator,
|
|
33
33
|
type Animator,
|
|
34
34
|
type MotionCurve,
|
|
35
35
|
type MotionHandle,
|
|
@@ -1186,7 +1186,7 @@ export class SliderTouchController {
|
|
|
1186
1186
|
private animatorFor(element: HTMLElement): Animator {
|
|
1187
1187
|
let animator = this.animators.get(element);
|
|
1188
1188
|
if (animator == null) {
|
|
1189
|
-
animator =
|
|
1189
|
+
animator = createMotionAnimator(element);
|
|
1190
1190
|
this.animators.set(element, animator);
|
|
1191
1191
|
}
|
|
1192
1192
|
return animator;
|
package/src/Spinner/Spinner.tsx
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update these files to stay in sync:
|
|
12
12
|
* - /packages/core/src/Spinner/Spinner.doc.mjs
|
|
13
|
-
* - /packages/core/src/Spinner/Spinner.test.tsx
|
|
13
|
+
* - /packages/core/src/Spinner/Spinner.test.tsx and __tests__/SpinnerMotion.a11y.chromium.spec.ts (rotor timing)
|
|
14
14
|
* - /packages/core/src/Spinner/index.ts
|
|
15
15
|
* - /apps/storybook/stories/Spinner.stories.tsx
|
|
16
16
|
* - /packages/cli/assets/templates/blocks/components/Spinner/ (showcase blocks)
|
|
@@ -153,60 +153,57 @@ function registerSpinnerVars(): void {
|
|
|
153
153
|
registerSpinnerVars();
|
|
154
154
|
|
|
155
155
|
/**
|
|
156
|
-
* Pin every ring's
|
|
157
|
-
*
|
|
156
|
+
* Pin every ring's rotation to the document timeline's origin instead of its
|
|
157
|
+
* own start time, so spinners mounted seconds apart stay in phase.
|
|
158
158
|
*
|
|
159
|
-
* Setting `startTime` is exact where arithmetic on a clock read is not
|
|
159
|
+
* Setting `startTime` is exact where arithmetic on a clock read is not. A
|
|
160
160
|
* negative `animation-delay` computed at mount is only as good as the gap
|
|
161
|
-
* between
|
|
162
|
-
*
|
|
163
|
-
* literal rotation; the same drift risk applies to the dash offset now).
|
|
161
|
+
* between the clock read and the frame the animation starts in. At 10x CPU
|
|
162
|
+
* throttling that gap measured 116 degrees of drift.
|
|
164
163
|
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
164
|
+
* Rotors are collected and pinned in one frame. `getAnimations()` resolves
|
|
165
|
+
* style, and `startTime` dirties it again. So pinning them one at a time makes
|
|
166
|
+
* each mount re-force what the previous one invalidated: 53 style recalcs for
|
|
167
|
+
* 38 spinners, against 19 batched.
|
|
169
168
|
*/
|
|
170
|
-
const
|
|
169
|
+
const pendingRotors = new Set<HTMLSpanElement>();
|
|
171
170
|
let flushScheduled = false;
|
|
172
171
|
|
|
173
|
-
function
|
|
172
|
+
function pinRotorsToTimelineOrigin(): void {
|
|
174
173
|
flushScheduled = false;
|
|
175
174
|
const animations: Animation[] = [];
|
|
176
|
-
for (const
|
|
177
|
-
|
|
178
|
-
// this ref sits on (#6253), so it needs subtree:true to be found here.
|
|
179
|
-
animations.push(...svg.getAnimations({subtree: true}));
|
|
175
|
+
for (const rotor of pendingRotors) {
|
|
176
|
+
animations.push(...rotor.getAnimations());
|
|
180
177
|
}
|
|
181
|
-
|
|
178
|
+
pendingRotors.clear();
|
|
182
179
|
for (const animation of animations) {
|
|
183
180
|
animation.startTime = 0;
|
|
184
181
|
}
|
|
185
182
|
}
|
|
186
183
|
|
|
187
184
|
/**
|
|
188
|
-
* Ref callback for the
|
|
185
|
+
* Ref callback for the rotor: the one place a mounted ring touches the DOM.
|
|
189
186
|
*
|
|
190
187
|
* It reads nothing back — the geometry is resolved by the cascade, not in JS.
|
|
191
188
|
*/
|
|
192
189
|
function syncRotationPhase(
|
|
193
|
-
|
|
190
|
+
rotor: HTMLSpanElement | null,
|
|
194
191
|
): (() => void) | undefined {
|
|
195
|
-
if (
|
|
192
|
+
if (rotor == null) {
|
|
196
193
|
return undefined;
|
|
197
194
|
}
|
|
198
195
|
// jsdom implements no Web Animations, and this runs in every consumer's
|
|
199
196
|
// component tests.
|
|
200
|
-
if (typeof
|
|
197
|
+
if (typeof rotor.getAnimations !== 'function') {
|
|
201
198
|
return undefined;
|
|
202
199
|
}
|
|
203
|
-
|
|
200
|
+
pendingRotors.add(rotor);
|
|
204
201
|
if (!flushScheduled) {
|
|
205
202
|
flushScheduled = true;
|
|
206
|
-
requestAnimationFrame(
|
|
203
|
+
requestAnimationFrame(pinRotorsToTimelineOrigin);
|
|
207
204
|
}
|
|
208
205
|
return () => {
|
|
209
|
-
|
|
206
|
+
pendingRotors.delete(rotor);
|
|
210
207
|
};
|
|
211
208
|
}
|
|
212
209
|
|
|
@@ -215,19 +212,13 @@ function syncRotationPhase(
|
|
|
215
212
|
// =============================================================================
|
|
216
213
|
|
|
217
214
|
/**
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
* angle, which reads as a visible wobble on iOS Safari independent of
|
|
222
|
-
* compositing (#6253) — confirmed by a real-device test against this exact
|
|
223
|
-
* fix, since `willChange`/layer promotion alone (the earlier fix for #3617)
|
|
224
|
-
* only smooths the rotation's motion, not the per-frame stroke rasterization.
|
|
225
|
-
* A static circle with an animated `stroke-dashoffset` never rotates, so
|
|
226
|
-
* WebKit never re-rasterizes the cap at an intermediate angle at all.
|
|
215
|
+
* A `transform` animation runs on the compositor, so the ring keeps turning
|
|
216
|
+
* while a script runs. A `stroke-dashoffset` animation would repaint the arc
|
|
217
|
+
* on the main thread every frame, so it would stop while a script runs.
|
|
227
218
|
*/
|
|
228
|
-
const
|
|
229
|
-
'0%': {
|
|
230
|
-
'100%': {
|
|
219
|
+
const rotation = stylex.keyframes({
|
|
220
|
+
'0%': {transform: 'rotate(0deg)'},
|
|
221
|
+
'100%': {transform: 'rotate(360deg)'},
|
|
231
222
|
});
|
|
232
223
|
|
|
233
224
|
// =============================================================================
|
|
@@ -283,6 +274,8 @@ const styles = stylex.create({
|
|
|
283
274
|
ring: {
|
|
284
275
|
backfaceVisibility: 'hidden',
|
|
285
276
|
display: 'block',
|
|
277
|
+
// The track and the rotor share the one grid cell, stacked and centred.
|
|
278
|
+
gridArea: '1 / 1',
|
|
286
279
|
// The frame is the box, read from the same composed var the span is sized
|
|
287
280
|
// from — not from the size constant, which a theme cannot reach, and not
|
|
288
281
|
// from a percentage, which needs the grid area to be a definite size in
|
|
@@ -300,6 +293,27 @@ const styles = stylex.create({
|
|
|
300
293
|
// which put the ring 1.5-3.3px off across the four sizes.
|
|
301
294
|
overflow: 'visible',
|
|
302
295
|
},
|
|
296
|
+
// The rotor is the frame's size, so it turns about the ring's centre.
|
|
297
|
+
rotor: {
|
|
298
|
+
display: 'block',
|
|
299
|
+
gridArea: '1 / 1',
|
|
300
|
+
width: `var(${BOX_SIZE})`,
|
|
301
|
+
height: `var(${BOX_SIZE})`,
|
|
302
|
+
// Mobile Safari keeps a re-timed animation off the main thread only on an
|
|
303
|
+
// element with its own layer. So the rotor declares one before the start
|
|
304
|
+
// time is set (see `pinRotorsToTimelineOrigin`).
|
|
305
|
+
willChange: 'transform',
|
|
306
|
+
// Reduced motion slows the turn but never stops it: a still ring reads as
|
|
307
|
+
// broken. The status role and its name still say that work is busy.
|
|
308
|
+
animationDuration: {
|
|
309
|
+
// The loop reads the duration before a theme's tempo scales it.
|
|
310
|
+
default: `var(--_astryx-pre-tempo-duration-slow-min, ${durationVars['--duration-slow-min']})`,
|
|
311
|
+
'@media (prefers-reduced-motion: reduce)': '3s',
|
|
312
|
+
},
|
|
313
|
+
animationIterationCount: 'infinite',
|
|
314
|
+
animationName: rotation,
|
|
315
|
+
animationTimingFunction: 'linear',
|
|
316
|
+
},
|
|
303
317
|
circle: {
|
|
304
318
|
fill: 'none',
|
|
305
319
|
// The ring is centred on the box (cx/cy 50%), so the arc's start offset
|
|
@@ -336,18 +350,6 @@ const styles = stylex.create({
|
|
|
336
350
|
// `0` the way the registered length pair guards against, so it needs no
|
|
337
351
|
// registration.
|
|
338
352
|
arc: {
|
|
339
|
-
// Slow the motion dramatically under reduced-motion rather than freezing
|
|
340
|
-
// it (a frozen spinner reads as broken), matching ProgressBar's approach.
|
|
341
|
-
// The role="status" + "Loading" label still convey busy state (obs-6).
|
|
342
|
-
animationDuration: {
|
|
343
|
-
// The loop reads the duration before a theme's tempo scales it
|
|
344
|
-
// (spec:AST-108 FR4).
|
|
345
|
-
default: `var(--_astryx-pre-tempo-duration-slow-min, ${durationVars['--duration-slow-min']})`,
|
|
346
|
-
'@media (prefers-reduced-motion: reduce)': '3s',
|
|
347
|
-
},
|
|
348
|
-
animationIterationCount: 'infinite',
|
|
349
|
-
animationName: dashMotion,
|
|
350
|
-
animationTimingFunction: 'linear',
|
|
351
353
|
stroke: 'var(--spinner-color)',
|
|
352
354
|
transform: 'rotate(-90deg)',
|
|
353
355
|
strokeDasharray: `calc(var(${RESOLVED_DIAMETER}) * ${PI} * var(--spinner-arc-fraction)) calc(var(${RESOLVED_DIAMETER}) * ${PI} * (1 - var(--spinner-arc-fraction)))`,
|
|
@@ -569,10 +571,12 @@ export function Spinner({
|
|
|
569
571
|
height: `var(${BOX_SIZE}, ${frameSize}px)`,
|
|
570
572
|
},
|
|
571
573
|
)}>
|
|
574
|
+
{/* The track is zero-sized by attribute. With no stylesheet, the
|
|
575
|
+
rotor's arc alone fills the box, instead of two discs side by side.
|
|
576
|
+
`ring` sizes both to the box. */}
|
|
572
577
|
<svg
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
height={frameSize}
|
|
578
|
+
width={0}
|
|
579
|
+
height={0}
|
|
576
580
|
aria-hidden="true"
|
|
577
581
|
{...stylex.props(styles.ring)}>
|
|
578
582
|
<circle
|
|
@@ -586,18 +590,28 @@ export function Spinner({
|
|
|
586
590
|
trackOpacityStyles[shade],
|
|
587
591
|
)}
|
|
588
592
|
/>
|
|
589
|
-
<circle
|
|
590
|
-
cx="50%"
|
|
591
|
-
cy="50%"
|
|
592
|
-
r={diameter / 2}
|
|
593
|
-
strokeWidth={border}
|
|
594
|
-
// The size's own dash, for the render with no stylesheet. The rule
|
|
595
|
-
// above composes the same lengths from the resolved diameter, so a
|
|
596
|
-
// themed ring keeps this fraction of arc rather than this length.
|
|
597
|
-
strokeDasharray={`${arcLength} ${circumference - arcLength}`}
|
|
598
|
-
{...stylex.props(styles.circle, styles.arc)}
|
|
599
|
-
/>
|
|
600
593
|
</svg>
|
|
594
|
+
<span
|
|
595
|
+
ref={syncRotationPhase}
|
|
596
|
+
aria-hidden="true"
|
|
597
|
+
{...stylex.props(styles.rotor)}>
|
|
598
|
+
<svg
|
|
599
|
+
width={frameSize}
|
|
600
|
+
height={frameSize}
|
|
601
|
+
{...stylex.props(styles.ring)}>
|
|
602
|
+
<circle
|
|
603
|
+
cx="50%"
|
|
604
|
+
cy="50%"
|
|
605
|
+
r={diameter / 2}
|
|
606
|
+
strokeWidth={border}
|
|
607
|
+
// The size's own dash, for the render with no stylesheet. The rule
|
|
608
|
+
// above composes the same lengths from the resolved diameter, so a
|
|
609
|
+
// themed ring keeps this fraction of arc rather than this length.
|
|
610
|
+
strokeDasharray={`${arcLength} ${circumference - arcLength}`}
|
|
611
|
+
{...stylex.props(styles.circle, styles.arc)}
|
|
612
|
+
/>
|
|
613
|
+
</svg>
|
|
614
|
+
</span>
|
|
601
615
|
</span>
|
|
602
616
|
);
|
|
603
617
|
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @file switchTouch.ts
|
|
5
5
|
* @input The UIKit switch constants (motion/uikit/switch.ts) and a track size
|
|
6
6
|
* @output The pure model of Switch's touch presentation: thumb geometry, the
|
|
7
|
-
* drag's target, the flip rule, the commit on release and
|
|
8
|
-
*
|
|
7
|
+
* drag's target, the flip rule, the commit on release, and when the lifted
|
|
8
|
+
* thumb may settle
|
|
9
9
|
* @position Pure half of Switch's touch presentation; driven by
|
|
10
10
|
* useSwitchTouch.ts, tested by switchTouch.test.ts without a browser
|
|
11
11
|
*
|
|
@@ -158,14 +158,6 @@ export function stepFlip(
|
|
|
158
158
|
return isPast === flip.isArmed ? flip : {...flip, isArmed: isPast};
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
/**
|
|
162
|
-
* Passive: how long a lift waits for the browser's own click before the
|
|
163
|
-
* switch clicks its input itself, ms. The browser sends that click with the
|
|
164
|
-
* lift's `touchend`. The surface's `touch-action` leaves no double-tap delay.
|
|
165
|
-
* So this only runs out for a lift the browser does not count as a click.
|
|
166
|
-
*/
|
|
167
|
-
export const BROWSER_CLICK_WAIT_MS = 300;
|
|
168
|
-
|
|
169
161
|
/**
|
|
170
162
|
* What a release commits: the side a drag flipped to; when nothing flipped,
|
|
171
163
|
* the other side of the value, wherever the finger lifts. A press slid off
|
|
@@ -23,7 +23,7 @@ import type {GestureTouch} from '../gestures/types';
|
|
|
23
23
|
import {isRtlElement} from '../hooks/isRtlElement';
|
|
24
24
|
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
25
25
|
import {
|
|
26
|
-
|
|
26
|
+
createMotionAnimator,
|
|
27
27
|
type Animator,
|
|
28
28
|
type MotionCurve,
|
|
29
29
|
} from '../motion/animator';
|
|
@@ -31,9 +31,9 @@ import {solveSpring, toSpring, type SpringDescription} from '../motion/spring';
|
|
|
31
31
|
import {UIKIT_GESTURES} from '../motion/uikit/gestures';
|
|
32
32
|
import {registerSwitchTable, switchControl} from '../motion/uikit/switch';
|
|
33
33
|
import {useTouchPresentation} from '../utils/touchPresentation';
|
|
34
|
-
import {
|
|
34
|
+
import {awaitBrowserClick, clickForLift} from '../utils/browserClickWait';
|
|
35
|
+
import {armClickGuard} from '../utils/clickGuard';
|
|
35
36
|
import {
|
|
36
|
-
BROWSER_CLICK_WAIT_MS,
|
|
37
37
|
commitOnRelease,
|
|
38
38
|
dragTarget,
|
|
39
39
|
settleTime,
|
|
@@ -253,11 +253,8 @@ export class SwitchTouchController {
|
|
|
253
253
|
private isTracking = false;
|
|
254
254
|
/** Which presentation the switch has: the touch one, or its own. */
|
|
255
255
|
private presentation: SwitchPresentation = 'touch';
|
|
256
|
-
/**
|
|
257
|
-
private
|
|
258
|
-
private pressListenersTimer: ReturnType<typeof setTimeout> | null = null;
|
|
259
|
-
/** Passive: a lift is waiting for the browser's own click. */
|
|
260
|
-
private browserClickTimer: ReturnType<typeof setTimeout> | null = null;
|
|
256
|
+
/** Passive: a lift is waiting for the browser's own click; this ends it. */
|
|
257
|
+
private endBrowserClickWait: (() => void) | null = null;
|
|
261
258
|
private reconcileTimer: ReturnType<typeof setTimeout> | null = null;
|
|
262
259
|
|
|
263
260
|
constructor(isOn: boolean, geometry: SwitchTouchGeometry) {
|
|
@@ -285,15 +282,15 @@ export class SwitchTouchController {
|
|
|
285
282
|
return;
|
|
286
283
|
}
|
|
287
284
|
registerSwitchTable();
|
|
288
|
-
this.thumb =
|
|
285
|
+
this.thumb = createMotionAnimator(elements.thumb);
|
|
289
286
|
// The layer rests clear (its class's opacity 0) while the visuals show
|
|
290
287
|
// the value; from here its opacity is the animator's.
|
|
291
|
-
this.fade =
|
|
288
|
+
this.fade = createMotionAnimator(elements.track, {
|
|
292
289
|
pseudoElement: '::after',
|
|
293
290
|
initial: {opacity: 0},
|
|
294
291
|
});
|
|
295
292
|
this.fade.set({opacity: 0});
|
|
296
|
-
this.shadow =
|
|
293
|
+
this.shadow = createMotionAnimator(elements.thumb, {
|
|
297
294
|
pseudoElement: '::after',
|
|
298
295
|
initial: {opacity: 0},
|
|
299
296
|
});
|
|
@@ -328,73 +325,7 @@ export class SwitchTouchController {
|
|
|
328
325
|
}
|
|
329
326
|
},
|
|
330
327
|
});
|
|
331
|
-
|
|
332
|
-
// clicks nothing itself.
|
|
333
|
-
const onClick = (event: MouseEvent) => {
|
|
334
|
-
if (event.isTrusted && this.browserClickTimer != null) {
|
|
335
|
-
clearTimeout(this.browserClickTimer);
|
|
336
|
-
this.browserClickTimer = null;
|
|
337
|
-
this.scheduleReconcile();
|
|
338
|
-
}
|
|
339
|
-
};
|
|
340
|
-
const listen = (): (() => void) => {
|
|
341
|
-
surface.addEventListener('click', onClick, true);
|
|
342
|
-
return () => {
|
|
343
|
-
surface.removeEventListener('click', onClick, true);
|
|
344
|
-
};
|
|
345
|
-
};
|
|
346
|
-
if (this.presentation === 'pointer') {
|
|
347
|
-
// Under a fine pointer only the press the host arms listens at rest.
|
|
348
|
-
// The switch's click listener comes with a press and goes after its
|
|
349
|
-
// click wait.
|
|
350
|
-
this.listenForPress = listen;
|
|
351
|
-
return [
|
|
352
|
-
host.attachConsumer(surface, tracker),
|
|
353
|
-
() => tracker.dispose(),
|
|
354
|
-
() => this.stopPressListeners(),
|
|
355
|
-
];
|
|
356
|
-
}
|
|
357
|
-
return [
|
|
358
|
-
host.attachConsumer(surface, tracker),
|
|
359
|
-
() => tracker.dispose(),
|
|
360
|
-
listen(),
|
|
361
|
-
];
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/** Under a fine pointer: adds the switch's own listeners for a press. */
|
|
365
|
-
private listenForPress: (() => () => void) | null = null;
|
|
366
|
-
|
|
367
|
-
private startPressListeners(): void {
|
|
368
|
-
if (this.pressListenersTimer != null) {
|
|
369
|
-
clearTimeout(this.pressListenersTimer);
|
|
370
|
-
this.pressListenersTimer = null;
|
|
371
|
-
}
|
|
372
|
-
if (this.pressListeners == null && this.listenForPress != null) {
|
|
373
|
-
this.pressListeners = this.listenForPress();
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/** The press's click window is over: its listeners go. */
|
|
378
|
-
private endPressListeners(afterMs: number): void {
|
|
379
|
-
if (this.pressListeners == null) {
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
if (this.pressListenersTimer != null) {
|
|
383
|
-
clearTimeout(this.pressListenersTimer);
|
|
384
|
-
}
|
|
385
|
-
this.pressListenersTimer = setTimeout(() => {
|
|
386
|
-
this.pressListenersTimer = null;
|
|
387
|
-
this.stopPressListeners();
|
|
388
|
-
}, afterMs);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
private stopPressListeners(): void {
|
|
392
|
-
if (this.pressListenersTimer != null) {
|
|
393
|
-
clearTimeout(this.pressListenersTimer);
|
|
394
|
-
this.pressListenersTimer = null;
|
|
395
|
-
}
|
|
396
|
-
this.pressListeners?.();
|
|
397
|
-
this.pressListeners = null;
|
|
328
|
+
return [host.attachConsumer(surface, tracker), () => tracker.dispose()];
|
|
398
329
|
}
|
|
399
330
|
|
|
400
331
|
/** Undo everything: listeners, timers, animations and inline styles. */
|
|
@@ -403,7 +334,6 @@ export class SwitchTouchController {
|
|
|
403
334
|
detach();
|
|
404
335
|
}
|
|
405
336
|
this.detachers = [];
|
|
406
|
-
this.listenForPress = null;
|
|
407
337
|
this.clearTimers();
|
|
408
338
|
for (const animator of [this.thumb, this.fade, this.shadow]) {
|
|
409
339
|
const element = animator?.element;
|
|
@@ -576,7 +506,6 @@ export class SwitchTouchController {
|
|
|
576
506
|
switch (event) {
|
|
577
507
|
case 'touchDown':
|
|
578
508
|
this.isTracking = true;
|
|
579
|
-
this.startPressListeners();
|
|
580
509
|
this.touchDown(time);
|
|
581
510
|
return;
|
|
582
511
|
case 'touchDragInside':
|
|
@@ -612,16 +541,18 @@ export class SwitchTouchController {
|
|
|
612
541
|
byBrowserClick: true,
|
|
613
542
|
clicksIfNoBrowserClick: touch.pointerType === 'touch',
|
|
614
543
|
});
|
|
615
|
-
this.endPressListeners(BROWSER_CLICK_WAIT_MS);
|
|
616
544
|
return;
|
|
617
545
|
}
|
|
618
|
-
if (
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
546
|
+
if (
|
|
547
|
+
touch.pointerType !== 'touch' &&
|
|
548
|
+
(event === 'touchUpOutside' || this.drag?.flip.didFlip !== true)
|
|
549
|
+
) {
|
|
550
|
+
// A mouse or a pen released outside the tracking bounds, flipped or
|
|
551
|
+
// not, leaves the switch alone, as the native checkbox does. So the
|
|
552
|
+
// press can be taken back (WCAG 2.5.2). Only a finger's press slid
|
|
553
|
+
// off toggles.
|
|
622
554
|
this.released = true;
|
|
623
555
|
this.abandon(time);
|
|
624
|
-
this.endPressListeners(0);
|
|
625
556
|
return;
|
|
626
557
|
}
|
|
627
558
|
// A drag that flipped, or a press slid off and lifted outside, which
|
|
@@ -633,7 +564,6 @@ export class SwitchTouchController {
|
|
|
633
564
|
armClickGuard(this.elements.input.ownerDocument);
|
|
634
565
|
}
|
|
635
566
|
this.release(time);
|
|
636
|
-
this.endPressListeners(0);
|
|
637
567
|
return;
|
|
638
568
|
case 'touchCancel':
|
|
639
569
|
// The browser took the touch for its scroll, or a recognizer above
|
|
@@ -643,7 +573,6 @@ export class SwitchTouchController {
|
|
|
643
573
|
this.released = true;
|
|
644
574
|
this.abandon(time);
|
|
645
575
|
}
|
|
646
|
-
this.endPressListeners(0);
|
|
647
576
|
return;
|
|
648
577
|
case 'touchDragEnter':
|
|
649
578
|
case 'touchDragExit':
|
|
@@ -725,14 +654,23 @@ export class SwitchTouchController {
|
|
|
725
654
|
this.showSide(commit, time, undefined, true);
|
|
726
655
|
}
|
|
727
656
|
this.pressEnded(time, true);
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
657
|
+
const surface = this.elements?.surface;
|
|
658
|
+
if (byBrowserClick && surface != null) {
|
|
659
|
+
// The lift's own click activates the input natively: the switch then
|
|
660
|
+
// clicks nothing itself.
|
|
661
|
+
this.endBrowserClickWait = awaitBrowserClick(surface, {
|
|
662
|
+
onClicked: () => {
|
|
663
|
+
this.endBrowserClickWait = null;
|
|
664
|
+
this.scheduleReconcile();
|
|
665
|
+
},
|
|
666
|
+
onNoClick: () => {
|
|
667
|
+
this.endBrowserClickWait = null;
|
|
668
|
+
if (clicksIfNoBrowserClick && commit !== this.isOn) {
|
|
669
|
+
this.clickInput();
|
|
670
|
+
}
|
|
671
|
+
this.scheduleReconcile();
|
|
672
|
+
},
|
|
673
|
+
});
|
|
736
674
|
return;
|
|
737
675
|
}
|
|
738
676
|
if (commit !== this.isOn) {
|
|
@@ -749,11 +687,9 @@ export class SwitchTouchController {
|
|
|
749
687
|
*/
|
|
750
688
|
private clickInput(): void {
|
|
751
689
|
const input = this.elements?.input;
|
|
752
|
-
if (input
|
|
753
|
-
|
|
690
|
+
if (input != null) {
|
|
691
|
+
clickForLift(input);
|
|
754
692
|
}
|
|
755
|
-
armClickGuard(input.ownerDocument);
|
|
756
|
-
withoutClickGuard(() => input.click());
|
|
757
693
|
}
|
|
758
694
|
|
|
759
695
|
/** If the owner kept the old value, the visuals go back to it. */
|
|
@@ -1034,10 +970,8 @@ export class SwitchTouchController {
|
|
|
1034
970
|
}
|
|
1035
971
|
|
|
1036
972
|
private clearTimers(): void {
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
this.browserClickTimer = null;
|
|
1040
|
-
}
|
|
973
|
+
this.endBrowserClickWait?.();
|
|
974
|
+
this.endBrowserClickWait = null;
|
|
1041
975
|
if (this.reconcileTimer != null) {
|
|
1042
976
|
clearTimeout(this.reconcileTimer);
|
|
1043
977
|
this.reconcileTimer = null;
|