@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,192 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'InfoTip',
|
|
7
|
+
displayName: 'Info Tip',
|
|
8
|
+
// Keeps the registry route InfoTip had as a canary-only Lab component.
|
|
9
|
+
registry: {aliases: ['lab/info-tip']},
|
|
10
|
+
category: 'Feedback & Status',
|
|
11
|
+
keywords: [
|
|
12
|
+
'info',
|
|
13
|
+
'tooltip',
|
|
14
|
+
'help',
|
|
15
|
+
'hint',
|
|
16
|
+
'affordance',
|
|
17
|
+
'icon',
|
|
18
|
+
'label',
|
|
19
|
+
'field',
|
|
20
|
+
'metric',
|
|
21
|
+
'definition',
|
|
22
|
+
],
|
|
23
|
+
props: [
|
|
24
|
+
{
|
|
25
|
+
name: 'content',
|
|
26
|
+
type: 'ReactNode',
|
|
27
|
+
description:
|
|
28
|
+
"Content to display in the tooltip. Typically short, non-interactive text. Mirrors Tooltip's content prop.",
|
|
29
|
+
required: true,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'label',
|
|
33
|
+
type: 'string',
|
|
34
|
+
description:
|
|
35
|
+
'Accessible name for the trigger button. Defaults to the translated "More information".',
|
|
36
|
+
default: "'More information'",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'size',
|
|
40
|
+
type: "'xsm' | 'sm' | 'md' | 'lg'",
|
|
41
|
+
description:
|
|
42
|
+
'Size of the info icon (12px, 16px, 20px, 24px). Maps 1:1 to Icon sizes.',
|
|
43
|
+
default: "'sm'",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'xstyle',
|
|
47
|
+
type: 'StyleXStyles',
|
|
48
|
+
description:
|
|
49
|
+
'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value, not an inline style object like style={{}}.',
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
usage: {
|
|
53
|
+
description:
|
|
54
|
+
'An info icon that reveals help: a small "i" button. Hover and keyboard focus preview the help, and a click, tap, Enter, or Space pins it open until Escape, a second press, a press outside, or focus leaving. Use it next to labels, values, and metrics for permission notes, metric definitions, and field help. Its value over hand-composing Icon inside Tooltip is the pre-wired accessible trigger: a real button with an aria-label, Tab-reachable, tooltip on hover AND focus AND tap, and Escape dismissal.',
|
|
55
|
+
bestPractices: [
|
|
56
|
+
{
|
|
57
|
+
guidance: true,
|
|
58
|
+
description:
|
|
59
|
+
'Keep tooltip content concise, plain, and non-interactive; use Popover or HoverCard for links and buttons.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
guidance: true,
|
|
63
|
+
description:
|
|
64
|
+
'Override label when "More information" is too generic, e.g. "About this metric".',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
guidance: true,
|
|
68
|
+
description:
|
|
69
|
+
'Rely on InfoTip rather than a hand-rolled info button on touch: it pins its help on a press, so a tap, a click, Enter, or Space pins the tooltip even though the trigger is a button, and a tap outside dismisses it.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
guidance: false,
|
|
73
|
+
description:
|
|
74
|
+
'Hand-compose Icon inside Tooltip for info affordances; the bare Icon is aria-hidden and unfocusable, so keyboard and screen-reader users never see it.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
guidance: false,
|
|
78
|
+
description:
|
|
79
|
+
'Use InfoTip for essential information users must see to complete a task; put that text inline instead.',
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
86
|
+
export const docsZh = {
|
|
87
|
+
name: 'InfoTip',
|
|
88
|
+
displayName: 'Info Tip',
|
|
89
|
+
props: [
|
|
90
|
+
{
|
|
91
|
+
name: 'content',
|
|
92
|
+
type: 'ReactNode',
|
|
93
|
+
description:
|
|
94
|
+
'工具提示中显示的内容。通常为简短的非交互文本。与 Tooltip 的 content 属性一致。',
|
|
95
|
+
required: true,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'label',
|
|
99
|
+
type: 'string',
|
|
100
|
+
description: '触发按钮的无障碍名称。默认为翻译后的“More information”。',
|
|
101
|
+
default: "'More information'",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'size',
|
|
105
|
+
type: "'xsm' | 'sm' | 'md' | 'lg'",
|
|
106
|
+
description:
|
|
107
|
+
'信息图标的尺寸(12px、16px、20px、24px)。与 Icon 尺寸一一对应。',
|
|
108
|
+
default: "'sm'",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'xstyle',
|
|
112
|
+
type: 'StyleXStyles',
|
|
113
|
+
description:
|
|
114
|
+
'用于布局自定义的 StyleX 样式(边距、定位、尺寸)。必须是 stylex.create() 的值,不能是内联样式对象如 style={{}}。',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
usage: {
|
|
118
|
+
description:
|
|
119
|
+
'An info icon that reveals help: a small "i" button. Hover and keyboard focus preview the help, and a click, tap, Enter, or Space pins it open until Escape, a second press, a press outside, or focus leaving. Use it next to labels, values, and metrics for permission notes, metric definitions, and field help.',
|
|
120
|
+
bestPractices: [
|
|
121
|
+
{
|
|
122
|
+
guidance: true,
|
|
123
|
+
description:
|
|
124
|
+
'Keep tooltip content concise, plain, and non-interactive; use Popover or HoverCard for links and buttons.',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
guidance: true,
|
|
128
|
+
description:
|
|
129
|
+
'Override label when "More information" is too generic, e.g. "About this metric".',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
guidance: true,
|
|
133
|
+
description:
|
|
134
|
+
'Rely on InfoTip rather than a hand-rolled info button on touch: it pins its help on a press, so a tap, a click, Enter, or Space pins the tooltip even though the trigger is a button, and a tap outside dismisses it.',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
guidance: false,
|
|
138
|
+
description:
|
|
139
|
+
'Hand-compose Icon inside Tooltip for info affordances; the bare Icon is aria-hidden and unfocusable, so keyboard and screen-reader users never see it.',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
guidance: false,
|
|
143
|
+
description:
|
|
144
|
+
'Use InfoTip for essential information users must see to complete a task; put that text inline instead.',
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentTranslationDoc} */
|
|
151
|
+
export const docsDense = {
|
|
152
|
+
description:
|
|
153
|
+
'Inline info-icon help affordance: accessible "i" button trigger pre-wired into a Tooltip.',
|
|
154
|
+
usage: {
|
|
155
|
+
description:
|
|
156
|
+
'A small "i" button: hover and keyboard focus preview the help; a click, tap, Enter, or Space pins it open. Use next to labels, values, and metrics for permission notes, metric definitions, and field help. Pre-wired accessible trigger: real button, aria-label, Tab-reachable, tooltip on hover AND focus AND tap, Escape dismissal.',
|
|
157
|
+
bestPractices: [
|
|
158
|
+
{
|
|
159
|
+
guidance: true,
|
|
160
|
+
description:
|
|
161
|
+
'Keep tooltip content concise, plain, and non-interactive; use Popover or HoverCard for links and buttons.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
guidance: true,
|
|
165
|
+
description:
|
|
166
|
+
'Override label when "More information" is too generic, e.g. "About this metric".',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
guidance: true,
|
|
170
|
+
description:
|
|
171
|
+
'Rely on InfoTip rather than a hand-rolled info button on touch: it pins its help on a press, so a tap, a click, Enter, or Space pins the tooltip even though the trigger is a button, and a tap outside dismisses it.',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
guidance: false,
|
|
175
|
+
description:
|
|
176
|
+
'Hand-compose Icon inside Tooltip for info affordances; the bare Icon is aria-hidden and unfocusable.',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
guidance: false,
|
|
180
|
+
description:
|
|
181
|
+
'Use InfoTip for essential information users must see to complete a task; put that text inline instead.',
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
propDescriptions: {
|
|
186
|
+
content:
|
|
187
|
+
'Tooltip content. Short, non-interactive text. Mirrors Tooltip content prop.',
|
|
188
|
+
label:
|
|
189
|
+
"Accessible name for the trigger button. Default: the translated 'More information'.",
|
|
190
|
+
size: 'Info icon size (12/16/20/24px). Maps 1:1 to Icon sizes.',
|
|
191
|
+
},
|
|
192
|
+
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file InfoTip.tsx
|
|
7
|
+
* @input Uses React, StyleX, Tooltip, Icon, useComponentTranslator, the shared
|
|
8
|
+
* touch hit area, color/spacing/radius/duration/ease tokens
|
|
9
|
+
* @output Exports InfoTip component, InfoTipProps, InfoTipSize types
|
|
10
|
+
* @position Core implementation; consumed by index.ts, tested by
|
|
11
|
+
* InfoTip.test.tsx; `@astryxdesign/lab` re-exports it, deprecated
|
|
12
|
+
*
|
|
13
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
14
|
+
* - /packages/core/src/InfoTip/InfoTip.doc.mjs (props table, features)
|
|
15
|
+
* - /docs/specs/components/InfoTip/InfoTip.spec.md (contract)
|
|
16
|
+
* - /packages/core/src/InfoTip/InfoTip.test.tsx (tests for new/changed behavior)
|
|
17
|
+
* - /packages/core/src/InfoTip/index.ts (exports if types change)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {useCallback, type ReactNode, type Ref} from 'react';
|
|
21
|
+
import * as stylex from '@stylexjs/stylex';
|
|
22
|
+
|
|
23
|
+
import type {BaseProps} from '../BaseProps';
|
|
24
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
25
|
+
import {Icon, type IconSize} from '../Icon/Icon';
|
|
26
|
+
import {TooltipWithTriggerBehavior} from '../Tooltip/Tooltip';
|
|
27
|
+
import {
|
|
28
|
+
registerEnglishFallback,
|
|
29
|
+
useComponentTranslator,
|
|
30
|
+
} from '../i18n/useComponentTranslator';
|
|
31
|
+
import english from '../i18n/generated-english/InfoTip/InfoTip.generated';
|
|
32
|
+
import {
|
|
33
|
+
colorVars,
|
|
34
|
+
durationVars,
|
|
35
|
+
easeVars,
|
|
36
|
+
radiusVars,
|
|
37
|
+
spacingVars,
|
|
38
|
+
} from '../theme/tokens.stylex';
|
|
39
|
+
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
40
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
41
|
+
import {watchHitArea, writeHitInsets} from '../utils/hitArea';
|
|
42
|
+
|
|
43
|
+
registerEnglishFallback(english);
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Size of the info icon. Maps 1:1 to Icon sizes
|
|
47
|
+
* (xsm: 12px, sm: 16px, md: 20px, lg: 24px).
|
|
48
|
+
*/
|
|
49
|
+
export type InfoTipSize = IconSize;
|
|
50
|
+
|
|
51
|
+
export interface InfoTipProps extends Pick<
|
|
52
|
+
BaseProps,
|
|
53
|
+
'xstyle' | 'className' | 'style'
|
|
54
|
+
> {
|
|
55
|
+
/** Ref forwarded to the info button. */
|
|
56
|
+
ref?: Ref<HTMLButtonElement>;
|
|
57
|
+
/**
|
|
58
|
+
* The help the button reveals. Short, noninteractive text; for links or
|
|
59
|
+
* buttons, use HoverCard.
|
|
60
|
+
*/
|
|
61
|
+
content: ReactNode;
|
|
62
|
+
/**
|
|
63
|
+
* Accessible name of the button.
|
|
64
|
+
* @default A translated "More information"
|
|
65
|
+
*/
|
|
66
|
+
label?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Size of the info icon.
|
|
69
|
+
* @default 'sm'
|
|
70
|
+
*/
|
|
71
|
+
size?: InfoTipSize;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const styles = stylex.create({
|
|
75
|
+
trigger: {
|
|
76
|
+
position: 'relative',
|
|
77
|
+
display: 'inline-flex',
|
|
78
|
+
alignItems: 'center',
|
|
79
|
+
justifyContent: 'center',
|
|
80
|
+
verticalAlign: 'middle',
|
|
81
|
+
padding: spacingVars['--spacing-0-5'],
|
|
82
|
+
margin: 0,
|
|
83
|
+
borderStyle: 'none',
|
|
84
|
+
backgroundColor: 'transparent',
|
|
85
|
+
borderRadius: radiusVars['--radius-full'],
|
|
86
|
+
cursor: {
|
|
87
|
+
default: 'pointer',
|
|
88
|
+
':is(:disabled,[aria-disabled="true"])': 'default',
|
|
89
|
+
},
|
|
90
|
+
color: {
|
|
91
|
+
default: colorVars['--color-icon-secondary'],
|
|
92
|
+
':hover:where(:not(:disabled,[aria-disabled="true"]))': {
|
|
93
|
+
default: null,
|
|
94
|
+
'@media (hover: hover)': colorVars['--color-icon-primary'],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
transitionProperty: 'color',
|
|
98
|
+
transitionDuration: durationVars['--duration-fast'],
|
|
99
|
+
transitionTimingFunction: easeVars['--ease-standard'],
|
|
100
|
+
},
|
|
101
|
+
// The invisible hit area. Under a coarse pointer, the shared hit area writes
|
|
102
|
+
// how far the button may grow toward 44 px on each side. It never takes a
|
|
103
|
+
// neighbour's tap, and it writes 0 elsewhere. This layer takes taps out to
|
|
104
|
+
// there.
|
|
105
|
+
// SYNC: /packages/core/src/utils/hitArea.ts (HIT_INSET_PROPERTIES)
|
|
106
|
+
hitArea: {
|
|
107
|
+
'::after': {
|
|
108
|
+
content: '""',
|
|
109
|
+
position: 'absolute',
|
|
110
|
+
// Physical sides on purpose: the shared hit area measures each side
|
|
111
|
+
// from the page's rects, left and right included, in any direction.
|
|
112
|
+
inset:
|
|
113
|
+
'calc(var(--astryx-hit-inset-top, 0px) * -1) calc(var(--astryx-hit-inset-right, 0px) * -1) calc(var(--astryx-hit-inset-bottom, 0px) * -1) calc(var(--astryx-hit-inset-left, 0px) * -1)',
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* An info icon that reveals help: a small "i" button. Hover and keyboard
|
|
120
|
+
* focus preview the help. A click, tap, Enter, or Space pins it open until
|
|
121
|
+
* Escape, a second press, a press outside, or focus leaving. Use it next to
|
|
122
|
+
* labels, values, and metrics for permission notes, metric definitions, and
|
|
123
|
+
* field help.
|
|
124
|
+
*
|
|
125
|
+
* InfoTip is a press-to-pin Tooltip on a named button: Tooltip opens, pins,
|
|
126
|
+
* announces, and closes the help. The info icon resolves from
|
|
127
|
+
* the icon registry, so themes can replace it.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```
|
|
131
|
+
* <InfoTip content="Editors can change this field; viewers cannot." />
|
|
132
|
+
* <InfoTip content="30-day rolling average." label="About this metric" />
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export function InfoTip({
|
|
136
|
+
content,
|
|
137
|
+
label,
|
|
138
|
+
size = 'sm',
|
|
139
|
+
ref,
|
|
140
|
+
xstyle,
|
|
141
|
+
className,
|
|
142
|
+
style,
|
|
143
|
+
}: InfoTipProps): ReactNode {
|
|
144
|
+
const t = useComponentTranslator();
|
|
145
|
+
// Under a coarse pointer the button takes taps out toward 44 px. The watch
|
|
146
|
+
// lives as long as the button is attached: the ref's cleanup stops it, and a
|
|
147
|
+
// replaced button starts its own.
|
|
148
|
+
const watchButtonHitArea = useCallback((button: HTMLButtonElement | null) => {
|
|
149
|
+
if (button == null) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
return watchHitArea(button, insets => writeHitInsets(button, insets));
|
|
153
|
+
}, []);
|
|
154
|
+
const mergedRef = useMergedRefs(ref, watchButtonHitArea);
|
|
155
|
+
|
|
156
|
+
// No Escape handler of its own. Tooltip's entry in the shared dismissal
|
|
157
|
+
// stack takes Escape, so one press never closes both the help and an
|
|
158
|
+
// enclosing Dialog.
|
|
159
|
+
return (
|
|
160
|
+
<TooltipWithTriggerBehavior
|
|
161
|
+
content={content}
|
|
162
|
+
// The tooltip is the button's only purpose. A click, a tap, Enter, or
|
|
163
|
+
// Space pins it open, and the press stops at the button. So an InfoTip's
|
|
164
|
+
// content is reachable on a phone and from the keyboard alike.
|
|
165
|
+
triggerBehavior="toggle">
|
|
166
|
+
<button
|
|
167
|
+
ref={mergedRef}
|
|
168
|
+
type="button"
|
|
169
|
+
aria-label={label ?? t('@astryx.infoTip.label')}
|
|
170
|
+
{...mergeProps(
|
|
171
|
+
stylex.props(
|
|
172
|
+
focusOutlineStyles.focusVisible,
|
|
173
|
+
styles.trigger,
|
|
174
|
+
styles.hitArea,
|
|
175
|
+
xstyle,
|
|
176
|
+
),
|
|
177
|
+
className,
|
|
178
|
+
style,
|
|
179
|
+
)}>
|
|
180
|
+
<Icon icon="info" size={size} />
|
|
181
|
+
</button>
|
|
182
|
+
</TooltipWithTriggerBehavior>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
InfoTip.displayName = 'InfoTip';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file InfoTip component barrel export
|
|
7
|
+
* @input InfoTip.tsx
|
|
8
|
+
* @output Exports InfoTip, InfoTipProps, InfoTipSize
|
|
9
|
+
* @position Barrel; consumed by packages/core/src/index.ts and the
|
|
10
|
+
* `@astryxdesign/core/InfoTip` entry
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export {InfoTip} from './InfoTip';
|
|
14
|
+
export type {InfoTipProps, InfoTipSize} from './InfoTip';
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file layerAnimations.stylex.ts
|
|
5
|
-
* @input Uses StyleX, theme duration/easing tokens
|
|
5
|
+
* @input Uses StyleX, theme duration/easing tokens, the Reduce Motion fade
|
|
6
|
+
* constants
|
|
6
7
|
* @output Exports shared entry animation styles for layer-based components
|
|
7
8
|
* @position Shared animation primitives; consumed by DropdownMenu, Popover,
|
|
8
9
|
* HoverCard, Tooltip, Selector, and any component using useLayer
|
|
@@ -27,6 +28,7 @@
|
|
|
27
28
|
*/
|
|
28
29
|
|
|
29
30
|
import * as stylex from '@stylexjs/stylex';
|
|
31
|
+
import {reducedMotionFadeConsts} from '../motion/reducedMotion.stylex';
|
|
30
32
|
import {durationVars, easeVars, spacingVars} from '../theme/tokens.stylex';
|
|
31
33
|
|
|
32
34
|
const enterBelow = stylex.keyframes({
|
|
@@ -84,17 +86,21 @@ const enterStartRtl = stylex.keyframes({
|
|
|
84
86
|
|
|
85
87
|
// Reduce Motion under a finger: the same entrance without its travel. A touch
|
|
86
88
|
// presentation substitutes a cross-fade for motion, never a jump.
|
|
89
|
+
// The fade's curve rides in its first keyframe, so the published class type
|
|
90
|
+
// of `animationTimingFunction` stays the theme ease's.
|
|
87
91
|
const fadeIn = stylex.keyframes({
|
|
88
|
-
from: {opacity: 0},
|
|
92
|
+
from: {opacity: 0, animationTimingFunction: reducedMotionFadeConsts.easing},
|
|
89
93
|
to: {opacity: 1},
|
|
90
94
|
});
|
|
91
95
|
|
|
96
|
+
// No theme value lengthens the Reduce Motion fade, so its values are constants.
|
|
97
|
+
// The media keys stay literal: StyleX gives an imported at-rule key a later
|
|
98
|
+
// priority layer (see reducedMotionKeys).
|
|
92
99
|
const animationBase = {
|
|
93
100
|
animationDuration: {
|
|
94
101
|
default: durationVars['--duration-fast-max'],
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
'@media (prefers-reduced-motion: reduce) and (pointer: coarse)': `min(${durationVars['--duration-fast-max']}, 200ms)`,
|
|
102
|
+
'@media (prefers-reduced-motion: reduce) and (pointer: coarse)':
|
|
103
|
+
reducedMotionFadeConsts.duration,
|
|
98
104
|
},
|
|
99
105
|
animationTimingFunction: easeVars['--ease-standard'],
|
|
100
106
|
animationFillMode: 'backwards' as const,
|
|
@@ -106,19 +112,18 @@ const animationBase = {
|
|
|
106
112
|
* Keyed by LayerPlacement ('above' | 'below' | 'start' | 'end')
|
|
107
113
|
* for easy lookup: `layerAnimations[placement]`.
|
|
108
114
|
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* (design:reduced-motion DR2, DR3), as iOS does for its menus, popovers and
|
|
115
|
-
* tips.
|
|
115
|
+
* Under `prefers-reduced-motion: reduce` each entry drops its travel and
|
|
116
|
+
* scale. Under a finger (the primary pointer is coarse) the layer fades in,
|
|
117
|
+
* opacity only, in 200 ms on easeInOut: on a touch screen Reduce Motion
|
|
118
|
+
* replaces motion with a cross-fade rather than a jump; under any other
|
|
119
|
+
* pointer it appears at once.
|
|
116
120
|
*/
|
|
117
121
|
export const layerAnimations = stylex.create({
|
|
118
122
|
below: {
|
|
119
123
|
animationName: {
|
|
120
124
|
default: enterBelow,
|
|
121
|
-
'@media (prefers-reduced-motion: reduce)
|
|
125
|
+
'@media (prefers-reduced-motion: reduce) and (not (pointer: coarse))':
|
|
126
|
+
'none',
|
|
122
127
|
'@media (prefers-reduced-motion: reduce) and (pointer: coarse)': fadeIn,
|
|
123
128
|
},
|
|
124
129
|
...animationBase,
|
|
@@ -126,7 +131,8 @@ export const layerAnimations = stylex.create({
|
|
|
126
131
|
above: {
|
|
127
132
|
animationName: {
|
|
128
133
|
default: enterAbove,
|
|
129
|
-
'@media (prefers-reduced-motion: reduce)
|
|
134
|
+
'@media (prefers-reduced-motion: reduce) and (not (pointer: coarse))':
|
|
135
|
+
'none',
|
|
130
136
|
'@media (prefers-reduced-motion: reduce) and (pointer: coarse)': fadeIn,
|
|
131
137
|
},
|
|
132
138
|
...animationBase,
|
|
@@ -135,7 +141,8 @@ export const layerAnimations = stylex.create({
|
|
|
135
141
|
animationName: {
|
|
136
142
|
default: enterEnd,
|
|
137
143
|
':is([dir="rtl"] *)': enterEndRtl,
|
|
138
|
-
'@media (prefers-reduced-motion: reduce)
|
|
144
|
+
'@media (prefers-reduced-motion: reduce) and (not (pointer: coarse))':
|
|
145
|
+
'none',
|
|
139
146
|
'@media (prefers-reduced-motion: reduce) and (pointer: coarse)': fadeIn,
|
|
140
147
|
},
|
|
141
148
|
...animationBase,
|
|
@@ -144,7 +151,8 @@ export const layerAnimations = stylex.create({
|
|
|
144
151
|
animationName: {
|
|
145
152
|
default: enterStart,
|
|
146
153
|
':is([dir="rtl"] *)': enterStartRtl,
|
|
147
|
-
'@media (prefers-reduced-motion: reduce)
|
|
154
|
+
'@media (prefers-reduced-motion: reduce) and (not (pointer: coarse))':
|
|
155
|
+
'none',
|
|
148
156
|
'@media (prefers-reduced-motion: reduce) and (pointer: coarse)': fadeIn,
|
|
149
157
|
},
|
|
150
158
|
...animationBase,
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useBackdropPress.ts
|
|
7
|
+
* @input A modal layer's backdrop dismissal and whether it is allowed now
|
|
8
|
+
* @output Capture-phase pointer handlers and a click handler for the layer's
|
|
9
|
+
* <dialog> root
|
|
10
|
+
* @position Shared backdrop-press rule for Dialog and Drawer
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {useCallback, useRef, type PointerEvent, type MouseEvent} from 'react';
|
|
14
|
+
|
|
15
|
+
export interface BackdropPressHandlers {
|
|
16
|
+
onPointerDownCapture: (event: PointerEvent<HTMLElement>) => void;
|
|
17
|
+
onPointerUpCapture: (event: PointerEvent<HTMLElement>) => void;
|
|
18
|
+
onPointerCancelCapture: (event: PointerEvent<HTMLElement>) => void;
|
|
19
|
+
onClick: (event: MouseEvent<HTMLElement>) => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A press on a modal layer's backdrop targets the <dialog> root itself. A
|
|
24
|
+
* click there is also what the browser sends when a press starts on one side
|
|
25
|
+
* of the layer's edge and ends on the other (it goes to the nearest common
|
|
26
|
+
* ancestor), so a backdrop press dismisses only when its pointer-down and its
|
|
27
|
+
* pointer-up both landed on the backdrop. A cancelled pointer ends the press.
|
|
28
|
+
*
|
|
29
|
+
* The pointer handlers run in the capture phase. A nested layer, such as a
|
|
30
|
+
* popover open in the dialog, stops its presses at its own root, so a
|
|
31
|
+
* bubble-phase handler here does not see them.
|
|
32
|
+
*/
|
|
33
|
+
export function useBackdropPress(
|
|
34
|
+
onBackdropPress: () => void,
|
|
35
|
+
isEnabled: boolean,
|
|
36
|
+
): BackdropPressHandlers {
|
|
37
|
+
const startedOnBackdropRef = useRef(false);
|
|
38
|
+
const endedOnBackdropRef = useRef(false);
|
|
39
|
+
|
|
40
|
+
const onPointerDownCapture = useCallback(
|
|
41
|
+
(event: PointerEvent<HTMLElement>) => {
|
|
42
|
+
startedOnBackdropRef.current = event.target === event.currentTarget;
|
|
43
|
+
endedOnBackdropRef.current = false;
|
|
44
|
+
},
|
|
45
|
+
[],
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const onPointerUpCapture = useCallback((event: PointerEvent<HTMLElement>) => {
|
|
49
|
+
endedOnBackdropRef.current =
|
|
50
|
+
startedOnBackdropRef.current && event.target === event.currentTarget;
|
|
51
|
+
startedOnBackdropRef.current = false;
|
|
52
|
+
}, []);
|
|
53
|
+
|
|
54
|
+
const onPointerCancelCapture = useCallback(() => {
|
|
55
|
+
startedOnBackdropRef.current = false;
|
|
56
|
+
endedOnBackdropRef.current = false;
|
|
57
|
+
}, []);
|
|
58
|
+
|
|
59
|
+
const onClick = useCallback(
|
|
60
|
+
(event: MouseEvent<HTMLElement>) => {
|
|
61
|
+
const pressWasOnBackdrop = endedOnBackdropRef.current;
|
|
62
|
+
startedOnBackdropRef.current = false;
|
|
63
|
+
endedOnBackdropRef.current = false;
|
|
64
|
+
if (
|
|
65
|
+
isEnabled &&
|
|
66
|
+
pressWasOnBackdrop &&
|
|
67
|
+
event.target === event.currentTarget
|
|
68
|
+
) {
|
|
69
|
+
onBackdropPress();
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
[isEnabled, onBackdropPress],
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
onPointerDownCapture,
|
|
77
|
+
onPointerUpCapture,
|
|
78
|
+
onPointerCancelCapture,
|
|
79
|
+
onClick,
|
|
80
|
+
};
|
|
81
|
+
}
|