@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
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a tap's lift waits for the browser's own click, ms. The browser
|
|
3
|
+
* sends that click with the lift when the page has no double-tap delay. The
|
|
4
|
+
* wait runs out for a lift that the browser does not count as a click, such
|
|
5
|
+
* as a hold. It also runs out when a busy main thread holds the click back.
|
|
6
|
+
*/
|
|
7
|
+
export declare const BROWSER_CLICK_WAIT_MS = 300;
|
|
8
|
+
/** What a control does when the browser's click comes, or does not. */
|
|
9
|
+
export interface BrowserClickWaitHandlers {
|
|
10
|
+
/** The browser's click ran its handlers. `isCancelled`: one cancelled it. */
|
|
11
|
+
readonly onClicked: (isCancelled: boolean) => void;
|
|
12
|
+
/** No browser click came in time. */
|
|
13
|
+
readonly onNoClick: () => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Waits for the browser's own click inside `target` after a tap's lift. That
|
|
17
|
+
* click is the activation: `onClicked` runs once its handlers have run. With
|
|
18
|
+
* no click in time, `onNoClick` runs. The returned call ends the wait at once
|
|
19
|
+
* and leaves no listener or timer behind.
|
|
20
|
+
*/
|
|
21
|
+
export declare function awaitBrowserClick(target: Element, { onClicked, onNoClick }: BrowserClickWaitHandlers): () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Click `element` (its own `click()`, so its activation behavior and every
|
|
24
|
+
* handler run as for any click) and report whether a handler cancelled it.
|
|
25
|
+
* The event is read from a capture listener that exists only for the call.
|
|
26
|
+
*/
|
|
27
|
+
export declare function clickAndReport(element: HTMLElement): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Clicks `element` for a lift the control decided itself, and reports
|
|
30
|
+
* whether a handler cancelled the click. The shared click guard swallows the
|
|
31
|
+
* browser's own click for the same lift, if it comes later, so the lift
|
|
32
|
+
* activates once.
|
|
33
|
+
*/
|
|
34
|
+
export declare function clickForLift(element: HTMLElement): boolean;
|
|
35
|
+
//# sourceMappingURL=browserClickWait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserClickWait.d.ts","sourceRoot":"","sources":["../../src/utils/browserClickWait.ts"],"names":[],"mappings":"AAkBA;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,uEAAuE;AACvE,MAAM,WAAW,wBAAwB;IACvC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,EAAC,SAAS,EAAE,SAAS,EAAC,EAAE,wBAAwB,GAC/C,MAAM,IAAI,CAwDZ;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAe5D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAG1D"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file browserClickWait.ts
|
|
5
|
+
* @input An element a tap's lift released on, and the control that acts on
|
|
6
|
+
* its click
|
|
7
|
+
* @output BROWSER_CLICK_WAIT_MS, awaitBrowserClick, clickForLift and
|
|
8
|
+
* clickAndReport
|
|
9
|
+
* @position The one wait for the browser's click after a tap, shared by
|
|
10
|
+
* Switch/useSwitchTouch.ts and SegmentedControl/useSegmentedTouchTracking.ts.
|
|
11
|
+
* It swallows nothing: utils/clickGuard.ts is the one guard for a late click.
|
|
12
|
+
*
|
|
13
|
+
* SYNC: When modified, update browserClickWait.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { armClickGuard, withoutClickGuard } from "./clickGuard.js";
|
|
17
|
+
import { subscribeInput } from "./inputStream.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* How long a tap's lift waits for the browser's own click, ms. The browser
|
|
21
|
+
* sends that click with the lift when the page has no double-tap delay. The
|
|
22
|
+
* wait runs out for a lift that the browser does not count as a click, such
|
|
23
|
+
* as a hold. It also runs out when a busy main thread holds the click back.
|
|
24
|
+
*/
|
|
25
|
+
export const BROWSER_CLICK_WAIT_MS = 300;
|
|
26
|
+
|
|
27
|
+
/** What a control does when the browser's click comes, or does not. */
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Waits for the browser's own click inside `target` after a tap's lift. That
|
|
31
|
+
* click is the activation: `onClicked` runs once its handlers have run. With
|
|
32
|
+
* no click in time, `onNoClick` runs. The returned call ends the wait at once
|
|
33
|
+
* and leaves no listener or timer behind.
|
|
34
|
+
*/
|
|
35
|
+
export function awaitBrowserClick(target, {
|
|
36
|
+
onClicked,
|
|
37
|
+
onNoClick
|
|
38
|
+
}) {
|
|
39
|
+
const view = target.ownerDocument.defaultView;
|
|
40
|
+
if (view == null) {
|
|
41
|
+
// A document with no window gets no click: the wait runs out at once.
|
|
42
|
+
let isEnded = false;
|
|
43
|
+
queueMicrotask(() => {
|
|
44
|
+
if (!isEnded) {
|
|
45
|
+
onNoClick();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return () => {
|
|
49
|
+
isEnded = true;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
let isDone = false;
|
|
53
|
+
let report = null;
|
|
54
|
+
let timer = null;
|
|
55
|
+
let stopListening = null;
|
|
56
|
+
const stop = () => {
|
|
57
|
+
isDone = true;
|
|
58
|
+
stopListening?.();
|
|
59
|
+
stopListening = null;
|
|
60
|
+
if (timer != null) {
|
|
61
|
+
view.clearTimeout(timer);
|
|
62
|
+
timer = null;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
stopListening = subscribeInput(view, 'click', event => {
|
|
66
|
+
if (isDone || !event.isTrusted || !target.contains(event.target)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
stop();
|
|
70
|
+
// After every handler has run: was it cancelled?
|
|
71
|
+
report = view.setTimeout(() => {
|
|
72
|
+
report = null;
|
|
73
|
+
onClicked(event.defaultPrevented);
|
|
74
|
+
}, 0);
|
|
75
|
+
});
|
|
76
|
+
timer = view.setTimeout(() => {
|
|
77
|
+
if (isDone) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
stop();
|
|
81
|
+
onNoClick();
|
|
82
|
+
}, BROWSER_CLICK_WAIT_MS);
|
|
83
|
+
return () => {
|
|
84
|
+
stop();
|
|
85
|
+
if (report != null) {
|
|
86
|
+
view.clearTimeout(report);
|
|
87
|
+
report = null;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Click `element` (its own `click()`, so its activation behavior and every
|
|
94
|
+
* handler run as for any click) and report whether a handler cancelled it.
|
|
95
|
+
* The event is read from a capture listener that exists only for the call.
|
|
96
|
+
*/
|
|
97
|
+
export function clickAndReport(element) {
|
|
98
|
+
const view = element.ownerDocument.defaultView;
|
|
99
|
+
let clicked = null;
|
|
100
|
+
const grab = event => {
|
|
101
|
+
if (clicked == null && event.target === element) {
|
|
102
|
+
clicked = event;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
view?.addEventListener('click', grab, true);
|
|
106
|
+
try {
|
|
107
|
+
element.click();
|
|
108
|
+
} finally {
|
|
109
|
+
view?.removeEventListener('click', grab, true);
|
|
110
|
+
}
|
|
111
|
+
return clicked?.defaultPrevented === true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Clicks `element` for a lift the control decided itself, and reports
|
|
116
|
+
* whether a handler cancelled the click. The shared click guard swallows the
|
|
117
|
+
* browser's own click for the same lift, if it comes later, so the lift
|
|
118
|
+
* activates once.
|
|
119
|
+
*/
|
|
120
|
+
export function clickForLift(element) {
|
|
121
|
+
armClickGuard(element.ownerDocument);
|
|
122
|
+
return withoutClickGuard(() => clickAndReport(element));
|
|
123
|
+
}
|
|
@@ -12,9 +12,22 @@ export interface ClickGuardOptions {
|
|
|
12
12
|
* @default false
|
|
13
13
|
*/
|
|
14
14
|
readonly staysInstalled?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The gesture host's arm at a claimed touch's lift: the guard also takes
|
|
17
|
+
* that touch's late `mousedown` and `mouseup` while it is armed.
|
|
18
|
+
* @default false
|
|
19
|
+
*/
|
|
20
|
+
readonly takesLateMouse?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* The menu press model's arm at a finger's release: the guard also cancels
|
|
23
|
+
* that touch's `touchend`, so the browser creates no click for it. A
|
|
24
|
+
* cancelled `touchend` disarms the guard.
|
|
25
|
+
* @default false
|
|
26
|
+
*/
|
|
27
|
+
readonly cancelsTouchEnd?: boolean;
|
|
15
28
|
}
|
|
16
29
|
/** Swallow the browser's next click on `doc` (see the file header). */
|
|
17
|
-
export declare function armClickGuard(doc: Document, { staysInstalled }?: ClickGuardOptions): void;
|
|
30
|
+
export declare function armClickGuard(doc: Document, { staysInstalled, takesLateMouse, cancelsTouchEnd, }?: ClickGuardOptions): void;
|
|
18
31
|
/** Stop swallowing on `doc`; idempotent. */
|
|
19
32
|
export declare function disarmClickGuard(doc: Document): void;
|
|
20
33
|
/** Whether the guard on `doc` would swallow the next click. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickGuard.d.ts","sourceRoot":"","sources":["../../src/utils/clickGuard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clickGuard.d.ts","sourceRoot":"","sources":["../../src/utils/clickGuard.ts"],"names":[],"mappings":"AA0CA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AA8BD,uEAAuE;AACvE,wBAAgB,aAAa,CAC3B,GAAG,EAAE,QAAQ,EACb,EACE,cAAsB,EACtB,cAAsB,EACtB,eAAuB,GACxB,GAAE,iBAAsB,GACxB,IAAI,CA+CN;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAYpD;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAOzD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAQ/C"}
|
package/dist/utils/clickGuard.js
CHANGED
|
@@ -21,6 +21,16 @@
|
|
|
21
21
|
// page adds later (AST-057, AST-094). If only the gesture host arms it, the
|
|
22
22
|
// click listener stays only while the guard is armed.
|
|
23
23
|
//
|
|
24
|
+
// An arm at a claimed touch's lift also takes that touch's late `mousedown`
|
|
25
|
+
// and `mouseup`. WebKit sends them a few ms after a held tap's cancelled
|
|
26
|
+
// `touchend`, aimed at whatever is under the finger by then. They go with
|
|
27
|
+
// the click, the next `pointerdown` or the window, as the guard does.
|
|
28
|
+
//
|
|
29
|
+
// The menu press model's arm at a finger's release also cancels that touch's
|
|
30
|
+
// `touchend`, so the browser creates no click and no compatibility mouse
|
|
31
|
+
// events. A busy main thread can otherwise hold that click past the window,
|
|
32
|
+
// when a drill-in has put another row under the finger.
|
|
33
|
+
//
|
|
24
34
|
// Some clicks always pass:
|
|
25
35
|
// - a click with `detail` 0: a keyboard's, a screen reader's, or one that the
|
|
26
36
|
// page dispatches;
|
|
@@ -61,7 +71,9 @@ function listenForClicks(view) {
|
|
|
61
71
|
|
|
62
72
|
/** Swallow the browser's next click on `doc` (see the file header). */
|
|
63
73
|
export function armClickGuard(doc, {
|
|
64
|
-
staysInstalled = false
|
|
74
|
+
staysInstalled = false,
|
|
75
|
+
takesLateMouse = false,
|
|
76
|
+
cancelsTouchEnd = false
|
|
65
77
|
} = {}) {
|
|
66
78
|
const view = doc.defaultView;
|
|
67
79
|
if (view == null) {
|
|
@@ -83,6 +95,30 @@ export function armClickGuard(doc, {
|
|
|
83
95
|
guard.unsubscribers.push(
|
|
84
96
|
// The next press is a new gesture: its click must never be eaten.
|
|
85
97
|
subscribeInput(view, 'pointerdown', () => disarmClickGuard(doc)));
|
|
98
|
+
if (takesLateMouse) {
|
|
99
|
+
for (const type of ['mousedown', 'mouseup']) {
|
|
100
|
+
guard.unsubscribers.push(subscribeInput(view, type, swallowLateMouse, {
|
|
101
|
+
cancels: true
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (cancelsTouchEnd) {
|
|
106
|
+
// A touch sends its pointerup before its touchend, so the next touchend is
|
|
107
|
+
// that touch's own. The next pointerdown disarms the guard first.
|
|
108
|
+
const stopTouchEnd = subscribeInput(view, 'touchend', event => {
|
|
109
|
+
stopTouchEnd();
|
|
110
|
+
// A touchend that the browser took for a scroll is not cancelable.
|
|
111
|
+
// The guard stays armed for a click that may follow it.
|
|
112
|
+
if (event.cancelable) {
|
|
113
|
+
event.preventDefault();
|
|
114
|
+
// No click follows a cancelled touchend.
|
|
115
|
+
disarmClickGuard(doc);
|
|
116
|
+
}
|
|
117
|
+
}, {
|
|
118
|
+
cancels: true
|
|
119
|
+
});
|
|
120
|
+
guard.unsubscribers.push(stopTouchEnd);
|
|
121
|
+
}
|
|
86
122
|
guard.timer = setTimeout(() => disarmClickGuard(doc), CLICK_GUARD_WINDOW_MS);
|
|
87
123
|
}
|
|
88
124
|
|
|
@@ -133,6 +169,15 @@ export function __resetClickGuardForTest() {
|
|
|
133
169
|
stayingClickListeners.delete(window);
|
|
134
170
|
}
|
|
135
171
|
}
|
|
172
|
+
|
|
173
|
+
/** Swallows a claimed touch's late `mousedown` or `mouseup`. */
|
|
174
|
+
function swallowLateMouse(event) {
|
|
175
|
+
if (isExempt(event)) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
event.preventDefault();
|
|
179
|
+
event.stopImmediatePropagation();
|
|
180
|
+
}
|
|
136
181
|
function isExempt(event) {
|
|
137
182
|
if (event.detail === 0 || unguardedDepth > 0) {
|
|
138
183
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dateParser.d.ts","sourceRoot":"","sources":["../../src/utils/dateParser.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAC,KAAK,SAAS,EAAqC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAE1C,OAAO,EACL,gBAAgB,IAAI,QAAQ,EAC5B,cAAc,IAAI,SAAS,GAC5B,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,MAAa,GAAG,OAAO,CAO/D;
|
|
1
|
+
{"version":3,"file":"dateParser.d.ts","sourceRoot":"","sources":["../../src/utils/dateParser.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAC,KAAK,SAAS,EAAqC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAE1C,OAAO,EACL,gBAAgB,IAAI,QAAQ,EAC5B,cAAc,IAAI,SAAS,GAC5B,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,MAAa,GAAG,OAAO,CAO/D;AAOD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAa,GACpB,SAAS,GAAG,IAAI,CAiHlB"}
|
package/dist/utils/dateParser.js
CHANGED
|
@@ -27,6 +27,11 @@ export function isLocaleDayFirst(locale = 'en') {
|
|
|
27
27
|
return dayIndex < monthIndex;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
// Built at run time: a Unicode property escape in a literal fails a source
|
|
31
|
+
// build whose Babel lacks the Unicode data.
|
|
32
|
+
const LETTER_FREE = new RegExp('^[^\\p{L}]+$', 'u');
|
|
33
|
+
const YEAR_FIRST = new RegExp('^\\d{4}[^\\p{L}\\d]', 'u');
|
|
34
|
+
|
|
30
35
|
/**
|
|
31
36
|
* Parses user input into a PlainDate.
|
|
32
37
|
*
|
|
@@ -122,6 +127,13 @@ export function parseDateInput(input, locale = 'en') {
|
|
|
122
127
|
if (/^\d+$/.test(trimmed)) {
|
|
123
128
|
return null;
|
|
124
129
|
}
|
|
130
|
+
// In a day-first locale, letter-free text that no form above matched is not
|
|
131
|
+
// a date. Native `Date` reads `a/b/c` month first. It also takes a year of
|
|
132
|
+
// one to three digits. So "12/01/2" gives a wrong date. A four-digit year
|
|
133
|
+
// written first is not ambiguous.
|
|
134
|
+
if (isLocaleDayFirst(locale) && LETTER_FREE.test(trimmed) && !YEAR_FIRST.test(trimmed)) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
125
137
|
const parsed = new Date(trimmed);
|
|
126
138
|
if (!isNaN(parsed.getTime())) {
|
|
127
139
|
const fromDate = plainDateFromDate(parsed);
|
|
@@ -75,4 +75,19 @@ export declare function moveFocusLeftBehind(note: FocusWithin | null, target: HT
|
|
|
75
75
|
* in the component that calls this.
|
|
76
76
|
*/
|
|
77
77
|
export declare function focusForLastInput(element: HTMLElement, options?: FocusOptions, modality?: InteractionModality): void;
|
|
78
|
+
/**
|
|
79
|
+
* Prepares the focus return for an open surface that may be removed while
|
|
80
|
+
* open (rendered only while open, or removed with its view). Removing a
|
|
81
|
+
* `<dialog>` runs no close and no browser focus return. Call this while the
|
|
82
|
+
* surface is mounted: it reads the frame that hosts the surface now, because a
|
|
83
|
+
* removed frame's document has no window. Call the returned function from the
|
|
84
|
+
* effect cleanup with the opener.
|
|
85
|
+
*
|
|
86
|
+
* Once the commit has finished, focus moves to the opener only when the
|
|
87
|
+
* surface really left the document (StrictMode's simulated unmount keeps it),
|
|
88
|
+
* the opener is still on the page, and the removal lost focus, both in the
|
|
89
|
+
* surface's document and in the document that hosts its frame. A control the
|
|
90
|
+
* user pressed outside the surface, or outside its frame, keeps its focus.
|
|
91
|
+
*/
|
|
92
|
+
export declare function prepareFocusReturnOnRemoval(surface: Element): (opener: Element | null) => void;
|
|
78
93
|
//# sourceMappingURL=focusReturn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focusReturn.d.ts","sourceRoot":"","sources":["../../src/utils/focusReturn.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,QAAmB,GAAG,OAAO,CAKjE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM5E;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACxC,WAAW,GAAG,IAAI,CAMpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,MAAM,GAAE,OAAO,GAAG,IAAW,GAC5B,OAAO,CAUT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,YAAY,EACtB,QAAQ,GAAE,mBAAqD,GAC9D,IAAI,CA2BN"}
|
|
1
|
+
{"version":3,"file":"focusReturn.d.ts","sourceRoot":"","sources":["../../src/utils/focusReturn.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,QAAmB,GAAG,OAAO,CAKjE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM5E;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACxC,WAAW,GAAG,IAAI,CAMpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,MAAM,GAAE,OAAO,GAAG,IAAW,GAC5B,OAAO,CAUT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,YAAY,EACtB,QAAQ,GAAE,mBAAqD,GAC9D,IAAI,CA2BN;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,GACf,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAYlC"}
|
|
@@ -126,4 +126,32 @@ export function focusForLastInput(element, options, modality = getInteractionMod
|
|
|
126
126
|
...options,
|
|
127
127
|
focusVisible: false
|
|
128
128
|
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Prepares the focus return for an open surface that may be removed while
|
|
133
|
+
* open (rendered only while open, or removed with its view). Removing a
|
|
134
|
+
* `<dialog>` runs no close and no browser focus return. Call this while the
|
|
135
|
+
* surface is mounted: it reads the frame that hosts the surface now, because a
|
|
136
|
+
* removed frame's document has no window. Call the returned function from the
|
|
137
|
+
* effect cleanup with the opener.
|
|
138
|
+
*
|
|
139
|
+
* Once the commit has finished, focus moves to the opener only when the
|
|
140
|
+
* surface really left the document (StrictMode's simulated unmount keeps it),
|
|
141
|
+
* the opener is still on the page, and the removal lost focus, both in the
|
|
142
|
+
* surface's document and in the document that hosts its frame. A control the
|
|
143
|
+
* user pressed outside the surface, or outside its frame, keeps its focus.
|
|
144
|
+
*/
|
|
145
|
+
export function prepareFocusReturnOnRemoval(surface) {
|
|
146
|
+
const host = surface.ownerDocument.defaultView?.frameElement ?? null;
|
|
147
|
+
return opener => {
|
|
148
|
+
queueMicrotask(() => {
|
|
149
|
+
if (surface.isConnected || opener == null || !opener.isConnected) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (isFocusLost(surface) && (host == null || isFocusLost(host))) {
|
|
153
|
+
focusForLastInput(opener);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
};
|
|
129
157
|
}
|
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* SYNC: When modified, update pressFeedback.ts, pressGesture.ts (the fade
|
|
10
10
|
* clock), hooks/usePressFeedback.doc.mjs, the components that paint the touch
|
|
11
11
|
* press off an ancestor scope or a pseudo-element (Switch, Tab,
|
|
12
|
-
* CheckboxInput, RadioListItem, ClickableCard, SelectableCard, Thumbnail)
|
|
13
|
-
* and
|
|
12
|
+
* CheckboxInput, RadioListItem, ClickableCard, SelectableCard, Thumbnail),
|
|
13
|
+
* Button (a tracked action sizes its `:active` image to zero) and
|
|
14
|
+
* scripts/build-css.test.mjs.
|
|
14
15
|
*/
|
|
15
16
|
import * as stylex from '@stylexjs/stylex';
|
|
16
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactionOverlay.stylex.d.ts","sourceRoot":"","sources":["../../src/utils/interactionOverlay.stylex.ts"],"names":[],"mappings":"AAMA
|
|
1
|
+
{"version":3,"file":"interactionOverlay.stylex.d.ts","sourceRoot":"","sources":["../../src/utils/interactionOverlay.stylex.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAmCH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAG3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS;;WAEpB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW;IACtB,iEAAiE;;CAEjE,CAAC;AA8HH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8HnC,CAAC"}
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
* SYNC: When modified, update pressFeedback.ts, pressGesture.ts (the fade
|
|
16
16
|
* clock), hooks/usePressFeedback.doc.mjs, the components that paint the touch
|
|
17
17
|
* press off an ancestor scope or a pseudo-element (Switch, Tab,
|
|
18
|
-
* CheckboxInput, RadioListItem, ClickableCard, SelectableCard, Thumbnail)
|
|
19
|
-
* and
|
|
18
|
+
* CheckboxInput, RadioListItem, ClickableCard, SelectableCard, Thumbnail),
|
|
19
|
+
* Button (a tracked action sizes its `:active` image to zero) and
|
|
20
|
+
* scripts/build-css.test.mjs.
|
|
20
21
|
*/
|
|
21
22
|
|
|
22
23
|
// Every surface that paints a press uses one of these styles, so a change to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pressFeedback.d.ts","sourceRoot":"","sources":["../../src/utils/pressFeedback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pressFeedback.d.ts","sourceRoot":"","sources":["../../src/utils/pressFeedback.ts"],"names":[],"mappings":"AAkDA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,qDAAqD;AACrD,eAAO,MAAM,cAAc,EAAE;IAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAA;CAE/D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAwoB5C;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,IAAI,CA0BjD"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file pressFeedback.ts
|
|
5
|
-
* @input The press state machine (pressGesture.ts), the menu-press
|
|
6
|
-
*
|
|
5
|
+
* @input The press state machine (pressGesture.ts), the menu-press and
|
|
6
|
+
* press-group markers and the document's pointer, keyboard, scroll and
|
|
7
7
|
* visibility events
|
|
8
8
|
* @output PRESSABLE_ATTRIBUTE, PRESSED_ATTRIBUTE, pressableProps and
|
|
9
9
|
* installPressFeedback
|
|
@@ -38,6 +38,7 @@ import { isCoarsePointer, watchCoarsePointer } from "./coarsePointer.js";
|
|
|
38
38
|
import { subscribeInput } from "./inputStream.js";
|
|
39
39
|
import { TOUCH_QUERY } from "./touchPresentation.js";
|
|
40
40
|
import { holdsPressThroughDrag } from "../privateAttributes/pressHoldsDrag.stylex.js";
|
|
41
|
+
import { isTrackedByGroup } from "../privateAttributes/pressGroupItem.stylex.js";
|
|
41
42
|
|
|
42
43
|
/**
|
|
43
44
|
* The marker the controller finds with `closest()`. Every Astryx component
|
|
@@ -288,14 +289,19 @@ function stylesheetDroppedActive() {
|
|
|
288
289
|
|
|
289
290
|
/**
|
|
290
291
|
* The surface a mouse button's or the Space key's press paints, if any: the
|
|
291
|
-
* innermost marked surface, outside a menu. A key's
|
|
292
|
-
* focused element that is itself the surface, as
|
|
292
|
+
* innermost marked surface, outside a menu and off a tracked action. A key's
|
|
293
|
+
* press paints only a focused element that is itself the surface, as
|
|
294
|
+
* `:active` does.
|
|
293
295
|
*/
|
|
294
296
|
function buttonSurfaceAt(target, pointerId) {
|
|
295
297
|
const element = surfaceAt(target);
|
|
296
298
|
if (element == null || element.closest(MENU_PRESS_ROOT) != null) {
|
|
297
299
|
return null;
|
|
298
300
|
}
|
|
301
|
+
// A group's tracker follows pointers only, so a key's press stays here.
|
|
302
|
+
if (pointerId != null && isTrackedByGroup(element)) {
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
299
305
|
if (pointerId == null && element !== target) {
|
|
300
306
|
return null;
|
|
301
307
|
}
|
|
@@ -379,7 +385,9 @@ function onPointerDown(event) {
|
|
|
379
385
|
const braking = element != null && scrollerIsBraking(element);
|
|
380
386
|
lastTouchAt = Date.now();
|
|
381
387
|
lastTouchTarget = event.target instanceof Node ? event.target : null;
|
|
382
|
-
|
|
388
|
+
// A group's tracker paints a tracked action, so two writers would erase each
|
|
389
|
+
// other's paint. The touch still counts for the brake above.
|
|
390
|
+
if (element == null || braking || isTrackedByGroup(element)) {
|
|
383
391
|
return;
|
|
384
392
|
}
|
|
385
393
|
takeOver(button, element);
|
|
@@ -509,6 +517,11 @@ function activatesOnSpace(target) {
|
|
|
509
517
|
return target instanceof HTMLInputElement && SPACE_ACTIVATED_INPUT_TYPES.has(target.type);
|
|
510
518
|
}
|
|
511
519
|
|
|
520
|
+
/** A tracked action takes no `:active` paint, so a key's press paints here. */
|
|
521
|
+
function isTrackedAction(target) {
|
|
522
|
+
return target instanceof Element && isTrackedByGroup(target);
|
|
523
|
+
}
|
|
524
|
+
|
|
512
525
|
/**
|
|
513
526
|
* Space went down on a focused button that is itself a pressable surface.
|
|
514
527
|
* Heard in the BUBBLE phase, after the page's own handlers, so a press the
|
|
@@ -516,7 +529,7 @@ function activatesOnSpace(target) {
|
|
|
516
529
|
* not engage for one.
|
|
517
530
|
*/
|
|
518
531
|
function onKeyDown(event) {
|
|
519
|
-
if (event.key !== ' ' || event.repeat || event.isComposing || event.defaultPrevented || !activatesOnSpace(event.target) || !stylesheetDroppedActive()) {
|
|
532
|
+
if (event.key !== ' ' || event.repeat || event.isComposing || event.defaultPrevented || !activatesOnSpace(event.target) || !(stylesheetDroppedActive() || isTrackedAction(event.target))) {
|
|
520
533
|
return;
|
|
521
534
|
}
|
|
522
535
|
pressButton(event.target, null);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file triggerFocus.ts
|
|
3
|
+
* @input A focus event on a hover-layer trigger and its focusTrigger value
|
|
4
|
+
* @output Whether that focus counts as focus on the trigger, and a gate that
|
|
5
|
+
* remembers it for the matching blur
|
|
6
|
+
* @position Shared focus-trigger judgement for Tooltip and HoverCard
|
|
7
|
+
*/
|
|
8
|
+
/** When focus on a trigger opens its layer. */
|
|
9
|
+
export type TriggerFocusMode = 'auto' | 'always' | 'never';
|
|
10
|
+
/** Whether `element` is in the tab order or naturally focusable. */
|
|
11
|
+
export declare function isFocusableTrigger(element: HTMLElement): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Whether a focus event on a trigger (its `currentTarget`) counts as focus on
|
|
14
|
+
* the trigger.
|
|
15
|
+
*
|
|
16
|
+
* Under `auto` it is decided when focus arrives, not when listeners attach: a
|
|
17
|
+
* roving-tabindex member that was `tabindex="-1"` then can be the tab stop
|
|
18
|
+
* now. A trigger that receives focus is focusable by definition, which covers
|
|
19
|
+
* focusable elements this check does not list, such as a `<summary>` or an SVG
|
|
20
|
+
* link. Focus inside the trigger counts only while the trigger is focusable
|
|
21
|
+
* too, so a plain wrapper ignores its children's focus.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isFocusForTrigger(event: Event, mode: TriggerFocusMode): boolean;
|
|
24
|
+
/** Remembers whether a trigger's current focus counted when it arrived. */
|
|
25
|
+
export interface TriggerFocusGate {
|
|
26
|
+
/** On focusin: whether this focus opens the layer. */
|
|
27
|
+
focusIn(event: Event, mode: TriggerFocusMode): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* On focusout: whether this blur closes the layer. A focus that counted
|
|
30
|
+
* closes on blur even if the trigger has since left the tab order.
|
|
31
|
+
*/
|
|
32
|
+
focusOut(event: Event, mode: TriggerFocusMode): boolean;
|
|
33
|
+
}
|
|
34
|
+
/** A gate for one trigger; each hook keeps one for its lifetime. */
|
|
35
|
+
export declare function createTriggerFocusGate(): TriggerFocusGate;
|
|
36
|
+
//# sourceMappingURL=triggerFocus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggerFocus.d.ts","sourceRoot":"","sources":["../../src/utils/triggerFocus.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,+CAA+C;AAC/C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAShE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAWT;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC;CACzD;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,IAAI,gBAAgB,CAezD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file triggerFocus.ts
|
|
5
|
+
* @input A focus event on a hover-layer trigger and its focusTrigger value
|
|
6
|
+
* @output Whether that focus counts as focus on the trigger, and a gate that
|
|
7
|
+
* remembers it for the matching blur
|
|
8
|
+
* @position Shared focus-trigger judgement for Tooltip and HoverCard
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** When focus on a trigger opens its layer. */
|
|
12
|
+
|
|
13
|
+
/** Whether `element` is in the tab order or naturally focusable. */
|
|
14
|
+
export function isFocusableTrigger(element) {
|
|
15
|
+
if (element.hasAttribute('tabindex')) {
|
|
16
|
+
return element.tabIndex >= 0;
|
|
17
|
+
}
|
|
18
|
+
const focusableTags = ['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'];
|
|
19
|
+
if (focusableTags.includes(element.tagName)) {
|
|
20
|
+
return !element.disabled;
|
|
21
|
+
}
|
|
22
|
+
return element.isContentEditable;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Whether a focus event on a trigger (its `currentTarget`) counts as focus on
|
|
27
|
+
* the trigger.
|
|
28
|
+
*
|
|
29
|
+
* Under `auto` it is decided when focus arrives, not when listeners attach: a
|
|
30
|
+
* roving-tabindex member that was `tabindex="-1"` then can be the tab stop
|
|
31
|
+
* now. A trigger that receives focus is focusable by definition, which covers
|
|
32
|
+
* focusable elements this check does not list, such as a `<summary>` or an SVG
|
|
33
|
+
* link. Focus inside the trigger counts only while the trigger is focusable
|
|
34
|
+
* too, so a plain wrapper ignores its children's focus.
|
|
35
|
+
*/
|
|
36
|
+
export function isFocusForTrigger(event, mode) {
|
|
37
|
+
if (mode === 'always') {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (mode === 'never') {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const trigger = event.currentTarget;
|
|
44
|
+
return trigger != null && (event.target === trigger || isFocusableTrigger(trigger));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Remembers whether a trigger's current focus counted when it arrived. */
|
|
48
|
+
|
|
49
|
+
/** A gate for one trigger; each hook keeps one for its lifetime. */
|
|
50
|
+
export function createTriggerFocusGate() {
|
|
51
|
+
let isCounted = false;
|
|
52
|
+
return {
|
|
53
|
+
focusIn(event, mode) {
|
|
54
|
+
isCounted = isFocusForTrigger(event, mode);
|
|
55
|
+
return isCounted;
|
|
56
|
+
},
|
|
57
|
+
focusOut(event, mode) {
|
|
58
|
+
if (!isCounted && !isFocusForTrigger(event, mode)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
isCounted = false;
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|