@astryxdesign/core 0.7.7-canary.550ff21 → 0.7.7-canary.58c5b8a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/AlertDialog.d.ts +4 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +36 -6
- package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts +13 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts.map +1 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.js +45 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +1 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +79 -9
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +23 -4
- package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
- package/dist/BottomSheet/bottomSheetStack.js +5 -4
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +3 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +2 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +9 -4
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +50 -5
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +7 -1
- package/dist/CheckboxList/CheckboxListContext.d.ts +6 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +10 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +14 -4
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +5 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +13 -27
- package/dist/DateInput/Wheel.d.ts +17 -1
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +161 -20
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +63 -49
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +5 -2
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +53 -15
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +15 -11
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +9 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +20 -4
- package/dist/Field/Field.js +2 -2
- package/dist/Field/PanelSearchInput.d.ts +9 -1
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +3 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +27 -2
- package/dist/Icon/Icon.d.ts +5 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +5 -2
- package/dist/InfoTip/InfoTip.d.ts +63 -0
- package/dist/InfoTip/InfoTip.d.ts.map +1 -0
- package/dist/InfoTip/InfoTip.js +126 -0
- package/dist/InfoTip/index.d.ts +10 -0
- package/dist/InfoTip/index.d.ts.map +1 -0
- package/dist/InfoTip/index.js +12 -0
- package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +25 -20
- package/dist/Layer/layerClickBoundary.d.ts +7 -1
- package/dist/Layer/layerClickBoundary.d.ts.map +1 -1
- package/dist/Layer/layerClickBoundary.js +2 -2
- package/dist/Layer/useBackdropPress.d.ts +27 -0
- package/dist/Layer/useBackdropPress.d.ts.map +1 -0
- package/dist/Layer/useBackdropPress.js +53 -0
- package/dist/Layer/usePressPin.d.ts +105 -0
- package/dist/Layer/usePressPin.d.ts.map +1 -0
- package/dist/Layer/usePressPin.js +413 -0
- package/dist/Layer/useTouchTrigger.d.ts +23 -1
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +45 -7
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +2 -1
- package/dist/MobileNav/MobileNav.js +0 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +2 -4
- package/dist/Outline/Outline.d.ts +2 -4
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +4 -52
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +1 -0
- package/dist/Outline/useScrollSpy.js +3 -3
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +56 -7
- package/dist/PowerSearch/PowerSearch.d.ts +36 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +571 -302
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +100 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.js +1913 -0
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +32 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +17 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +170 -61
- package/dist/PowerSearch/formatFilterValue.d.ts +7 -0
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +11 -1
- package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
- package/dist/PowerSearch/formatTokenValue.js +160 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
- package/dist/ProgressBar/ProgressBar.d.ts +1 -1
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +33 -6
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +8 -2
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -3
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +118 -260
- package/dist/Resizable/resizeGesture.d.ts +91 -0
- package/dist/Resizable/resizeGesture.d.ts.map +1 -0
- package/dist/Resizable/resizeGesture.js +251 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +3 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +115 -8
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +10 -2
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts +357 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +1349 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts +70 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.js +264 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +96 -67
- package/dist/Selector/optionShape.d.ts +24 -0
- package/dist/Selector/optionShape.d.ts.map +1 -0
- package/dist/Selector/optionShape.js +48 -0
- package/dist/Selector/selectableOptionEntries.d.ts +20 -0
- package/dist/Selector/selectableOptionEntries.d.ts.map +1 -0
- package/dist/Selector/selectableOptionEntries.js +38 -0
- package/dist/Selector/utils.d.ts +2 -17
- package/dist/Selector/utils.d.ts.map +1 -1
- package/dist/Selector/utils.js +3 -51
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +3 -9
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Switch/Switch.d.ts +1 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +200 -46
- package/dist/Switch/switchFill.d.ts +31 -0
- package/dist/Switch/switchFill.d.ts.map +1 -0
- package/dist/Switch/switchFill.js +88 -0
- package/dist/Switch/switchTouch.d.ts +74 -0
- package/dist/Switch/switchTouch.d.ts.map +1 -0
- package/dist/Switch/switchTouch.js +125 -0
- package/dist/Switch/useSwitchTouch.d.ts +276 -0
- package/dist/Switch/useSwitchTouch.d.ts.map +1 -0
- package/dist/Switch/useSwitchTouch.js +939 -0
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +4 -3
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +29 -8
- package/dist/TextInput/TextInput.d.ts +2 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +10 -7
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +5 -0
- package/dist/Token/Token.d.ts +2 -2
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +13 -4
- package/dist/Token/TokenNamingContext.d.ts +14 -0
- package/dist/Token/TokenNamingContext.d.ts.map +1 -0
- package/dist/Token/TokenNamingContext.js +23 -0
- package/dist/Tokenizer/Tokenizer.d.ts +46 -59
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +44 -60
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +25 -28
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +157 -54
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts +3 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.js +19 -0
- package/dist/Tooltip/Tooltip.d.ts +24 -5
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +29 -5
- package/dist/Tooltip/useTooltip.d.ts +48 -5
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +90 -20
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +4 -7
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +4 -7
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -7
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +26 -15
- package/dist/animator/createAnimator.d.ts +98 -0
- package/dist/animator/createAnimator.d.ts.map +1 -0
- package/dist/animator/createAnimator.js +259 -0
- package/dist/astryx.css +142 -7
- package/dist/gestures/GestureHost.d.ts +27 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +161 -22
- package/dist/gestures/PressTracker.d.ts +6 -0
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +3 -0
- package/dist/gestures/types.d.ts +6 -0
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/usePressTracker.d.ts.map +1 -1
- package/dist/gestures/usePressTracker.js +1 -0
- package/dist/gestures/wheelSegmenter.d.ts +14 -3
- package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
- package/dist/gestures/wheelSegmenter.js +32 -8
- package/dist/hooks/actionGroupTracker.d.ts +7 -4
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
- package/dist/hooks/actionGroupTracker.js +19 -56
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/pressGroupContext.d.ts +6 -0
- package/dist/hooks/pressGroupContext.d.ts.map +1 -0
- package/dist/hooks/pressGroupContext.js +20 -0
- package/dist/hooks/useActionGroupTracking.d.ts +53 -0
- package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
- package/dist/hooks/useActionGroupTracking.js +174 -0
- package/dist/hooks/useAnimator.d.ts +41 -0
- package/dist/hooks/useAnimator.d.ts.map +1 -0
- package/dist/hooks/useAnimator.js +70 -0
- package/dist/hooks/useAttachment.d.ts +16 -8
- package/dist/hooks/useAttachment.d.ts.map +1 -1
- package/dist/hooks/useAttachment.js +35 -15
- package/dist/hooks/useFocusTrap.d.ts +15 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +13 -2
- package/dist/hooks/useHighlightedOptionScroll.d.ts +11 -1
- package/dist/hooks/useHighlightedOptionScroll.d.ts.map +1 -1
- package/dist/hooks/useHighlightedOptionScroll.js +112 -11
- package/dist/hooks/useInputStatusIcon.d.ts +1 -1
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +2 -2
- package/dist/hooks/useMediaQuery.d.ts +2 -1
- package/dist/hooks/useMediaQuery.d.ts.map +1 -1
- package/dist/hooks/useMediaQuery.js +7 -4
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +4 -2
- package/dist/hooks/usePager.d.ts +261 -0
- package/dist/hooks/usePager.d.ts.map +1 -0
- package/dist/hooks/usePager.js +1169 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts +8 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.js +12 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.js +1 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
- package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.js +7 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +33 -1
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +33 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/internal/SheetConfirmation.d.ts +11 -0
- package/dist/internal/SheetConfirmation.d.ts.map +1 -0
- package/dist/internal/SheetConfirmation.js +92 -0
- package/dist/internal/sheetDraft.d.ts +35 -0
- package/dist/internal/sheetDraft.d.ts.map +1 -0
- package/dist/internal/sheetDraft.js +65 -0
- package/dist/internal/touch-sheet.d.ts +21 -0
- package/dist/internal/touch-sheet.d.ts.map +1 -0
- package/dist/internal/touch-sheet.js +19 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts +24 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts.map +1 -0
- package/dist/internal/useDismissSearchOnTouchDrag.js +56 -0
- package/dist/motion/animator.d.ts +14 -14
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +41 -18
- package/dist/motion/paging.d.ts +16 -5
- package/dist/motion/paging.d.ts.map +1 -1
- package/dist/motion/paging.js +34 -14
- package/dist/motion/reducedMotion.d.ts +24 -0
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +78 -1
- package/dist/motion/roles.d.ts +7 -1
- package/dist/motion/roles.d.ts.map +1 -1
- package/dist/motion/roles.js +20 -1
- package/dist/motion/uikit/alert.d.ts +41 -0
- package/dist/motion/uikit/alert.d.ts.map +1 -0
- package/dist/motion/uikit/alert.js +43 -0
- package/dist/motion/uikit/index.d.ts +7 -4
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +7 -4
- package/dist/motion/uikit/paging.d.ts +31 -20
- package/dist/motion/uikit/paging.d.ts.map +1 -1
- package/dist/motion/uikit/paging.js +41 -11
- package/dist/motion/uikit/progressBar.d.ts +27 -7
- package/dist/motion/uikit/progressBar.d.ts.map +1 -1
- package/dist/motion/uikit/progressBar.js +31 -11
- package/dist/motion/uikit/segmented.d.ts +55 -0
- package/dist/motion/uikit/segmented.d.ts.map +1 -0
- package/dist/motion/uikit/segmented.js +77 -0
- package/dist/motion/uikit/springs.d.ts +8 -42
- package/dist/motion/uikit/springs.d.ts.map +1 -1
- package/dist/motion/uikit/springs.js +12 -42
- package/dist/motion/uikit/switch.d.ts +166 -0
- package/dist/motion/uikit/switch.d.ts.map +1 -0
- package/dist/motion/uikit/switch.js +186 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts +15 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressGroupItem.stylex.js +23 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts +18 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressHoldsDrag.stylex.js +28 -0
- package/dist/privateAttributes/segmentTitle.stylex.d.ts +5 -0
- package/dist/privateAttributes/segmentTitle.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/segmentTitle.stylex.js +22 -0
- package/dist/utils/browserClickWait.d.ts +35 -0
- package/dist/utils/browserClickWait.d.ts.map +1 -0
- package/dist/utils/browserClickWait.js +123 -0
- package/dist/utils/clickGuard.d.ts +14 -1
- package/dist/utils/clickGuard.d.ts.map +1 -1
- package/dist/utils/clickGuard.js +46 -1
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +12 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +3 -2
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +24 -6
- package/locales/en.json +128 -0
- package/locales/pseudo.json +96 -0
- package/package.json +13 -8
- package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
- package/src/AlertDialog/AlertDialog.tsx +37 -5
- package/src/AppShell/useCloseMobileDrawerOnActivate.ts +52 -0
- package/src/Avatar/Avatar.tsx +3 -1
- package/src/BottomSheet/BottomSheet.tsx +95 -10
- package/src/BottomSheet/BottomSheetPanel.tsx +40 -5
- package/src/BottomSheet/bottomSheetStack.ts +8 -4
- package/src/BottomSheet/useSheetGestures.ts +3 -1
- package/src/Breadcrumbs/BreadcrumbItem.tsx +17 -4
- package/src/Button/Button.tsx +66 -7
- package/src/CheckboxList/CheckboxList.doc.mjs +4 -2
- package/src/CheckboxList/CheckboxList.tsx +6 -0
- package/src/CheckboxList/CheckboxListContext.tsx +6 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/ComplexSelector/ComplexSelector.tsx +20 -5
- package/src/DateInput/DateInput.tsx +8 -2
- package/src/DateInput/MonthScroller.tsx +18 -22
- package/src/DateInput/Wheel.tsx +172 -14
- package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -2
- package/src/DateRangeInput/DateRangeInput.tsx +117 -71
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/Dialog/Dialog.tsx +81 -15
- package/src/Drawer/Drawer.tsx +28 -11
- package/src/Drawer/useDrawerDialogPresence.ts +9 -1
- package/src/DropdownMenu/DropdownMenu.tsx +28 -6
- package/src/Field/Field.tsx +2 -2
- package/src/Field/PanelSearchInput.tsx +11 -0
- package/src/HoverCard/HoverCard.tsx +31 -1
- package/src/Icon/Icon.doc.mjs +49 -8
- package/src/Icon/Icon.tsx +15 -7
- package/src/InfoTip/InfoTip.doc.mjs +192 -0
- package/src/InfoTip/InfoTip.tsx +186 -0
- package/src/InfoTip/index.ts +14 -0
- package/src/Layer/layerAnimations.stylex.ts +24 -16
- package/src/Layer/layerClickBoundary.ts +2 -2
- package/src/Layer/useBackdropPress.ts +81 -0
- package/src/Layer/usePressPin.ts +576 -0
- package/src/Layer/useTouchTrigger.ts +56 -6
- package/src/Lightbox/Lightbox.tsx +2 -1
- package/src/MobileNav/MobileNav.tsx +1 -1
- package/src/MultiSelector/hooks.ts +2 -4
- package/src/Outline/Outline.doc.mjs +177 -51
- package/src/Outline/Outline.tsx +5 -57
- package/src/Outline/useOutlineFromMarkdown.doc.mjs +157 -0
- package/src/Outline/useOutlineFromMarkdown.ts +1 -0
- package/src/Outline/useScrollSpy.ts +3 -3
- package/src/Popover/usePopover.tsx +71 -9
- package/src/PowerSearch/PowerSearch.doc.mjs +55 -6
- package/src/PowerSearch/PowerSearch.tsx +798 -324
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +2515 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +28 -6
- package/src/PowerSearch/PowerSearchValueEditor.tsx +203 -38
- package/src/PowerSearch/formatFilterValue.ts +18 -1
- package/src/PowerSearch/formatTokenValue.ts +215 -0
- package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +4 -2
- package/src/ProgressBar/ProgressBar.tsx +67 -7
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioList.tsx +7 -2
- package/src/RadioList/RadioListItem.tsx +5 -3
- package/src/Resizable/ResizeHandle.tsx +133 -328
- package/src/Resizable/resizeGesture.ts +368 -0
- package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
- package/src/SegmentedControl/SegmentedControl.tsx +179 -5
- package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +14 -2
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +1640 -0
- package/src/SegmentedControl/useSegmentedTouchTracking.ts +308 -0
- package/src/Selector/Selector.tsx +136 -89
- package/src/Selector/optionShape.ts +64 -0
- package/src/Selector/selectableOptionEntries.ts +39 -0
- package/src/Selector/utils.ts +9 -68
- package/src/SideNav/SideNavItem.tsx +3 -7
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Switch/Switch.doc.mjs +3 -3
- package/src/Switch/Switch.tsx +412 -86
- package/src/Switch/switchFill.ts +106 -0
- package/src/Switch/switchTouch.ts +186 -0
- package/src/Switch/useSwitchTouch.ts +1051 -0
- package/src/TabList/Tab.tsx +5 -3
- package/src/Table/BaseTable.tsx +46 -12
- package/src/TextInput/TextInput.tsx +11 -10
- package/src/Toast/Toast.tsx +5 -0
- package/src/Token/Token.tsx +15 -4
- package/src/Token/TokenNamingContext.ts +28 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
- package/src/Tokenizer/Tokenizer.tsx +93 -88
- package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
- package/src/Tokenizer/TokenizerItemRemovableContext.ts +24 -0
- package/src/Tooltip/Tooltip.doc.mjs +123 -39
- package/src/Tooltip/Tooltip.tsx +43 -9
- package/src/Tooltip/useTooltip.doc.mjs +171 -31
- package/src/Tooltip/useTooltip.tsx +137 -22
- package/src/TopNav/TopNavItem.tsx +6 -5
- package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
- package/src/TopNav/TopNavMenu.tsx +6 -5
- package/src/Typeahead/Typeahead.tsx +29 -15
- package/src/animator/createAnimator.doc.mjs +153 -0
- package/src/animator/createAnimator.ts +324 -0
- package/src/gestures/GestureHost.ts +205 -21
- package/src/gestures/PressTracker.ts +10 -0
- package/src/gestures/types.ts +6 -0
- package/src/gestures/usePressTracker.ts +2 -0
- package/src/gestures/wheelSegmenter.ts +36 -7
- package/src/hooks/actionGroupTracker.ts +32 -61
- package/src/hooks/index.ts +2 -0
- package/src/hooks/pressGroupContext.ts +21 -0
- package/src/hooks/useActionGroupTracking.ts +224 -0
- package/src/hooks/useAnimator.doc.mjs +109 -0
- package/src/hooks/useAnimator.ts +67 -0
- package/src/hooks/useAttachment.ts +56 -14
- package/src/hooks/useFocusTrap.ts +26 -2
- package/src/hooks/useHighlightedOptionScroll.ts +123 -15
- package/src/hooks/useInputStatusIcon.tsx +3 -2
- package/src/hooks/useMediaQuery.doc.mjs +2 -2
- package/src/hooks/useMediaQuery.ts +13 -4
- package/src/hooks/useMenuPress.ts +8 -2
- package/src/hooks/usePager.ts +1446 -0
- package/src/i18n/generated-english/InfoTip/InfoTip.generated.ts +13 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearch.generated.ts +1 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
- package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
- package/src/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.ts +7 -1
- package/src/i18n/generated-locales/en.generated.ts +43 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +44 -0
- package/src/index.ts +14 -0
- package/src/internal/SheetConfirmation.tsx +101 -0
- package/src/internal/sheetDraft.ts +80 -0
- package/src/internal/touch-sheet.ts +21 -0
- package/src/internal/useDismissSearchOnTouchDrag.ts +69 -0
- package/src/motion/MEASUREMENTS.md +36 -27
- package/src/motion/README.md +11 -6
- package/src/motion/animator.ts +61 -29
- package/src/motion/paging.ts +37 -14
- package/src/motion/reducedMotion.ts +79 -1
- package/src/motion/roles.ts +20 -1
- package/src/motion/uikit/alert.ts +43 -0
- package/src/motion/uikit/index.ts +6 -5
- package/src/motion/uikit/paging.ts +41 -10
- package/src/motion/uikit/progressBar.ts +31 -11
- package/src/motion/uikit/segmented.ts +74 -0
- package/src/motion/uikit/springs.ts +12 -42
- package/src/motion/uikit/switch.ts +174 -0
- package/src/privateAttributes/pressGroupItem.stylex.ts +23 -0
- package/src/privateAttributes/pressHoldsDrag.stylex.ts +28 -0
- package/src/privateAttributes/segmentTitle.stylex.ts +22 -0
- package/src/utils/browserClickWait.ts +133 -0
- package/src/utils/clickGuard.ts +64 -1
- package/src/utils/dateParser.ts +16 -0
- package/src/utils/interactionOverlay.stylex.ts +3 -2
- package/src/utils/pressFeedback.ts +24 -6
- package/dist/internal/tokenizer-presentation.d.ts +0 -21
- package/dist/internal/tokenizer-presentation.d.ts.map +0 -1
- package/dist/internal/tokenizer-presentation.js +0 -21
- package/src/internal/tokenizer-presentation.ts +0 -25
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview The text a PowerSearch filter token shows for a value.
|
|
5
|
+
*
|
|
6
|
+
* @input `OperatorValue`, `FilterValue`, a width budget, and the locale.
|
|
7
|
+
* @output `formatTokenValueText` — one string, or null for an empty value.
|
|
8
|
+
* @position Shared by the token itself (`PowerSearch.tsx`) and the sheet
|
|
9
|
+
* presentation's Filters rows and removal announcement
|
|
10
|
+
* (`PowerSearchBottomSheet.tsx`), so every reading of a value on the field
|
|
11
|
+
* uses the same words and the same zone handling.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {OperatorValue, FilterValue, EnumItem} from './types';
|
|
15
|
+
import type {Locale, TranslatorFn} from '../i18n';
|
|
16
|
+
import {truncateCharacters} from '../utils/characters';
|
|
17
|
+
import {
|
|
18
|
+
formatDateAbsoluteCompact,
|
|
19
|
+
formatSharedNumber,
|
|
20
|
+
} from './formatFilterValue';
|
|
21
|
+
import {registerEnglishFallback} from '../i18n/englishFallback';
|
|
22
|
+
import english from '../i18n/generated-english/PowerSearch/formatTokenValue.generated';
|
|
23
|
+
|
|
24
|
+
registerEnglishFallback(english);
|
|
25
|
+
|
|
26
|
+
type ListFormatFn = (items: ReadonlyArray<string>) => string;
|
|
27
|
+
|
|
28
|
+
function truncateString(value: string, limit: number): string {
|
|
29
|
+
// Same semantics as before — strings within limit + 3 pass through, longer
|
|
30
|
+
// ones cut to limit + '...' — but counted in characters, not code units.
|
|
31
|
+
return truncateCharacters(value, limit + 3, '...');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function getEnumLabel(values: ReadonlyArray<EnumItem>, value: string): string {
|
|
35
|
+
return values.find(v => v.value === value)?.label ?? value;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Intl's maximum fraction cap: no number the row formats is rounded.
|
|
39
|
+
const MAX_FRACTION_DIGITS = 100;
|
|
40
|
+
|
|
41
|
+
// Whether a locale writes a number with the token's own numerals: Latin
|
|
42
|
+
// digits and a `.` decimal mark, so `String(value)` is already the locale's
|
|
43
|
+
// reading. Probed once per locale through the shared number helper.
|
|
44
|
+
const tokenNumeralLocales = new Map<string, boolean>();
|
|
45
|
+
function usesTokenNumerals(locale: Locale): boolean {
|
|
46
|
+
let uses = tokenNumeralLocales.get(locale);
|
|
47
|
+
if (uses == null) {
|
|
48
|
+
uses =
|
|
49
|
+
formatSharedNumber(1234567.5, locale, {
|
|
50
|
+
useGrouping: false,
|
|
51
|
+
maximumFractionDigits: MAX_FRACTION_DIGITS,
|
|
52
|
+
}) === '1234567.5';
|
|
53
|
+
tokenNumeralLocales.set(locale, uses);
|
|
54
|
+
}
|
|
55
|
+
return uses;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// A number as the token reads it. Where the locale writes Latin digits and a
|
|
59
|
+
// `.` decimal mark, use the token's own text, `String(value)`. Elsewhere, use
|
|
60
|
+
// the locale's digits and decimal mark, with no grouping and no rounding: the
|
|
61
|
+
// fraction cap is Intl's maximum, so `1e-21` keeps its digits.
|
|
62
|
+
function formatNumberAsToken(value: number, locale: Locale): string {
|
|
63
|
+
return usesTokenNumerals(locale)
|
|
64
|
+
? String(value)
|
|
65
|
+
: formatSharedNumber(value, locale, {
|
|
66
|
+
useGrouping: false,
|
|
67
|
+
maximumFractionDigits: MAX_FRACTION_DIGITS,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The summaries, lists, and numbers the token writes as English literals, and
|
|
72
|
+
// the locale-aware readings of the same: with a translator (the sheet
|
|
73
|
+
// presentation's rows and announcements) the summaries resolve through the
|
|
74
|
+
// catalog, lists through the provider locale's list format, and numbers
|
|
75
|
+
// through its number format; without one they stay the token's own literals,
|
|
76
|
+
// the released popover token's text. In English the two read identically.
|
|
77
|
+
function itemsSummary(count: number, t: TranslatorFn | undefined): string {
|
|
78
|
+
return t
|
|
79
|
+
? t('@astryx.powersearch.valueEditor.itemsCount', {count})
|
|
80
|
+
: // eslint-disable-next-line @astryx/no-hardcoded-i18n-string -- the popover token's released English text; translating it is a separate stable change
|
|
81
|
+
`${count} items`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function formatListText(
|
|
85
|
+
labels: ReadonlyArray<string>,
|
|
86
|
+
maxLength: number,
|
|
87
|
+
t: TranslatorFn | undefined,
|
|
88
|
+
formatList: ListFormatFn | undefined,
|
|
89
|
+
): string | null {
|
|
90
|
+
if (labels.length === 0) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
if (labels.length === 1) {
|
|
94
|
+
return truncateString(labels[0], maxLength);
|
|
95
|
+
}
|
|
96
|
+
const totalLength = labels.reduce((sum, s) => sum + s.length, 0);
|
|
97
|
+
if (totalLength > maxLength) {
|
|
98
|
+
return itemsSummary(labels.length, t);
|
|
99
|
+
}
|
|
100
|
+
return formatList ? formatList(labels) : labels.join(', ');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The text a filter token shows for a value: the one place that decides how
|
|
105
|
+
* a value reads on the field, so every other reading of the same value —
|
|
106
|
+
* the sheet presentation's Filters rows and its removal announcement — can
|
|
107
|
+
* use the same words and the same zone handling. `maxLength` is the token's
|
|
108
|
+
* width budget; pass `Number.MAX_SAFE_INTEGER` for the untruncated text.
|
|
109
|
+
* With `t`, the list, date-range and nested summaries resolve through the
|
|
110
|
+
* catalog (`@astryx.powersearch.valueEditor.*`); without it they are the
|
|
111
|
+
* token's own literals. With `formatList` (the provider's list formatter),
|
|
112
|
+
* several labels join as a list in the locale; without it they join with
|
|
113
|
+
* the token's literal ", ".
|
|
114
|
+
*/
|
|
115
|
+
export function formatTokenValueText(
|
|
116
|
+
operatorValue: OperatorValue,
|
|
117
|
+
filterValue: FilterValue,
|
|
118
|
+
maxLength: number,
|
|
119
|
+
locale: Locale,
|
|
120
|
+
t?: TranslatorFn,
|
|
121
|
+
formatList?: ListFormatFn,
|
|
122
|
+
): string | null {
|
|
123
|
+
switch (filterValue.type) {
|
|
124
|
+
case 'empty':
|
|
125
|
+
return null;
|
|
126
|
+
|
|
127
|
+
case 'string':
|
|
128
|
+
return truncateString(filterValue.value, maxLength);
|
|
129
|
+
|
|
130
|
+
case 'integer':
|
|
131
|
+
case 'float':
|
|
132
|
+
return t
|
|
133
|
+
? formatNumberAsToken(filterValue.value, locale)
|
|
134
|
+
: String(filterValue.value);
|
|
135
|
+
|
|
136
|
+
case 'enum':
|
|
137
|
+
if (operatorValue.type === 'enum') {
|
|
138
|
+
return truncateString(
|
|
139
|
+
getEnumLabel(operatorValue.values, filterValue.value),
|
|
140
|
+
maxLength,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
return truncateString(filterValue.value, maxLength);
|
|
144
|
+
|
|
145
|
+
case 'string_list':
|
|
146
|
+
return formatListText(filterValue.value, maxLength, t, formatList);
|
|
147
|
+
|
|
148
|
+
case 'enum_list': {
|
|
149
|
+
const items = filterValue.value;
|
|
150
|
+
if (items.length === 0) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
if (operatorValue.type === 'enum_list') {
|
|
154
|
+
return formatListText(
|
|
155
|
+
items.map(v => getEnumLabel(operatorValue.values, v)),
|
|
156
|
+
maxLength,
|
|
157
|
+
t,
|
|
158
|
+
formatList,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
if (items.length === 1) {
|
|
162
|
+
return truncateString(items[0], maxLength);
|
|
163
|
+
}
|
|
164
|
+
return itemsSummary(items.length, t);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
case 'entity_list':
|
|
168
|
+
return formatListText(
|
|
169
|
+
filterValue.value.map(e => e.label),
|
|
170
|
+
maxLength,
|
|
171
|
+
t,
|
|
172
|
+
formatList,
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
case 'time':
|
|
176
|
+
return filterValue.value;
|
|
177
|
+
|
|
178
|
+
case 'date_absolute':
|
|
179
|
+
return truncateString(
|
|
180
|
+
formatDateAbsoluteCompact(filterValue.unixSeconds, locale),
|
|
181
|
+
maxLength,
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
case 'date_relative':
|
|
185
|
+
return truncateString(filterValue.value, maxLength);
|
|
186
|
+
|
|
187
|
+
case 'date_range':
|
|
188
|
+
if (t) {
|
|
189
|
+
return t('@astryx.powersearch.valueEditor.dateRange');
|
|
190
|
+
}
|
|
191
|
+
// eslint-disable-next-line @astryx/no-hardcoded-i18n-string -- the popover token's released English text; translating it is a separate stable change
|
|
192
|
+
return 'date range';
|
|
193
|
+
|
|
194
|
+
case 'custom':
|
|
195
|
+
if (operatorValue.type === 'custom') {
|
|
196
|
+
return truncateString(
|
|
197
|
+
operatorValue.getString(filterValue.value),
|
|
198
|
+
maxLength,
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
return filterValue.value;
|
|
202
|
+
|
|
203
|
+
case 'nested': {
|
|
204
|
+
const count = filterValue.value.length;
|
|
205
|
+
if (t) {
|
|
206
|
+
return t('@astryx.powersearch.valueEditor.filtersCount', {count});
|
|
207
|
+
}
|
|
208
|
+
// eslint-disable-next-line @astryx/no-hardcoded-i18n-string -- the popover token's released English text; translating it is a separate stable change
|
|
209
|
+
return count === 1 ? '1 filter' : `${count} filters`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
default:
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file powerSearchSheetUtils.ts
|
|
5
|
+
* @input PowerSearch config/filter types and the field typeahead source
|
|
6
|
+
* @output Pure helpers for the sheet presentation: which operators the
|
|
7
|
+
* sheet's own controls edit, field matching, filter identity tracking
|
|
8
|
+
* across controlled re-renders, the focus target after a removal, and the
|
|
9
|
+
* content search's suggestion source over the field typeahead
|
|
10
|
+
* @position Helper module; consumed by PowerSearchBottomSheet.tsx and its
|
|
11
|
+
* tests
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {SearchSource} from '../Typeahead/types';
|
|
15
|
+
import type {InternalConfig} from './useInternalConfig';
|
|
16
|
+
import type {
|
|
17
|
+
PowerSearchField,
|
|
18
|
+
PowerSearchFilter,
|
|
19
|
+
PowerSearchItem,
|
|
20
|
+
PowerSearchOperator,
|
|
21
|
+
} from './types';
|
|
22
|
+
|
|
23
|
+
// =============================================================================
|
|
24
|
+
// Operators and fields
|
|
25
|
+
// =============================================================================
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Whether the value step edits an operator's value with a sheet-native
|
|
29
|
+
* control (choice rows, or the popover's editor in its sheet presentation).
|
|
30
|
+
* A `nested` value is the exception: it is edited by the popover's built-in
|
|
31
|
+
* NestedEditor, rendered in the step's body,
|
|
32
|
+
* so every operator opens an editable step and no field is left out.
|
|
33
|
+
*/
|
|
34
|
+
export function isSupportedOperator(operator: PowerSearchOperator): boolean {
|
|
35
|
+
return operator.value.type !== 'nested';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function fieldMatchesQuery(
|
|
39
|
+
field: PowerSearchField,
|
|
40
|
+
normalizedQuery: string,
|
|
41
|
+
): boolean {
|
|
42
|
+
if (normalizedQuery === '') {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
if (field.label.toLowerCase().includes(normalizedQuery)) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return (
|
|
49
|
+
field.typeaheadAliases?.some(alias =>
|
|
50
|
+
alias.toLowerCase().includes(normalizedQuery),
|
|
51
|
+
) ?? false
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Synchronous suggestion source; the sheet renders results inline. */
|
|
56
|
+
export interface SheetSuggestionSource {
|
|
57
|
+
search(query: string): PowerSearchItem[];
|
|
58
|
+
bootstrap(): PowerSearchItem[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The field typeahead source as the content search's rows: the popover
|
|
63
|
+
* presentation's own suggestions, minus any whose field the config no longer
|
|
64
|
+
* knows. That source resolves synchronously from the config; a promise (none
|
|
65
|
+
* today) yields no rows rather than a stale list.
|
|
66
|
+
*/
|
|
67
|
+
export function createSheetSuggestionSource(
|
|
68
|
+
config: InternalConfig,
|
|
69
|
+
source: SearchSource<PowerSearchItem>,
|
|
70
|
+
): SheetSuggestionSource {
|
|
71
|
+
// Every suggestion whose field the config knows is offered: the value step
|
|
72
|
+
// edits every operator, `nested` included.
|
|
73
|
+
const isEditable = (item: PowerSearchItem): boolean => {
|
|
74
|
+
const aux = item.auxiliaryData;
|
|
75
|
+
return aux != null && config.getField(aux.fieldKey) != null;
|
|
76
|
+
};
|
|
77
|
+
const settle = (
|
|
78
|
+
results: PowerSearchItem[] | Promise<PowerSearchItem[]>,
|
|
79
|
+
): PowerSearchItem[] =>
|
|
80
|
+
Array.isArray(results) ? results.filter(isEditable) : [];
|
|
81
|
+
return {
|
|
82
|
+
search: query => settle(source.search(query)),
|
|
83
|
+
bootstrap: () => settle(source.bootstrap()),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// =============================================================================
|
|
88
|
+
// Filter identity across controlled updates
|
|
89
|
+
// =============================================================================
|
|
90
|
+
|
|
91
|
+
function stableSerialize(value: unknown): string {
|
|
92
|
+
if (Array.isArray(value)) {
|
|
93
|
+
return `[${value.map(stableSerialize).join(',')}]`;
|
|
94
|
+
}
|
|
95
|
+
if (value != null && typeof value === 'object') {
|
|
96
|
+
return `{${Object.entries(value)
|
|
97
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
98
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${stableSerialize(entry)}`)
|
|
99
|
+
.join(',')}}`;
|
|
100
|
+
}
|
|
101
|
+
return JSON.stringify(value) ?? 'undefined';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Stable identities for the Filters rows across controlled updates, so a row
|
|
106
|
+
* keeps its element — and its focus — when the parent reorders the filters or
|
|
107
|
+
* removes one above it. A filter object seen before keeps its
|
|
108
|
+
* id; a new object takes the id of a filter from the previous update with the
|
|
109
|
+
* same signature that no present object claims (a parent that clones its
|
|
110
|
+
* values on every change); anything else mints a new id. Two equal filters
|
|
111
|
+
* are told apart by order. Call `next` once per render with the current list.
|
|
112
|
+
*/
|
|
113
|
+
export function createFilterIdentities(): {
|
|
114
|
+
next: (filters: ReadonlyArray<PowerSearchFilter>) => number[];
|
|
115
|
+
} {
|
|
116
|
+
const byObject = new WeakMap<PowerSearchFilter, number>();
|
|
117
|
+
let previousBySignature = new Map<string, number[]>();
|
|
118
|
+
let nextId = 0;
|
|
119
|
+
return {
|
|
120
|
+
next(filters) {
|
|
121
|
+
const used = new Set<number>();
|
|
122
|
+
const ids: (number | null)[] = filters.map(filter => {
|
|
123
|
+
const known = byObject.get(filter);
|
|
124
|
+
if (known == null || used.has(known)) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
used.add(known);
|
|
128
|
+
return known;
|
|
129
|
+
});
|
|
130
|
+
const bySignature = new Map<string, number[]>();
|
|
131
|
+
filters.forEach((filter, index) => {
|
|
132
|
+
const signature = filterSignature(filter);
|
|
133
|
+
let id = ids[index];
|
|
134
|
+
if (id == null) {
|
|
135
|
+
id =
|
|
136
|
+
previousBySignature
|
|
137
|
+
.get(signature)
|
|
138
|
+
?.find(candidate => !used.has(candidate)) ?? nextId++;
|
|
139
|
+
used.add(id);
|
|
140
|
+
byObject.set(filter, id);
|
|
141
|
+
ids[index] = id;
|
|
142
|
+
}
|
|
143
|
+
bySignature.set(signature, [...(bySignature.get(signature) ?? []), id]);
|
|
144
|
+
});
|
|
145
|
+
previousBySignature = bySignature;
|
|
146
|
+
return ids as number[];
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Structural snapshot of a filter, for parents that clone their values. */
|
|
152
|
+
export function filterSignature(filter: PowerSearchFilter): string {
|
|
153
|
+
return stableSerialize({
|
|
154
|
+
field: filter.field,
|
|
155
|
+
operator: filter.operator,
|
|
156
|
+
value: filter.value,
|
|
157
|
+
isReadOnly: filter.isReadOnly ?? false,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Finds the filter a step was opened on after the controlled parent may have
|
|
163
|
+
* reordered, cloned, or removed it: object identity first, then the original
|
|
164
|
+
* slot when it still holds a structurally equal filter, then a unique
|
|
165
|
+
* structural match anywhere. Returns null when the target is gone or
|
|
166
|
+
* ambiguous, so an edit never lands on a different filter.
|
|
167
|
+
*/
|
|
168
|
+
export function resolveFilterIdentityIndex(
|
|
169
|
+
filters: ReadonlyArray<PowerSearchFilter>,
|
|
170
|
+
sourceFilter: PowerSearchFilter,
|
|
171
|
+
sourceSignature: string,
|
|
172
|
+
preferredIndex: number,
|
|
173
|
+
): number | null {
|
|
174
|
+
const identityIndex = filters.indexOf(sourceFilter);
|
|
175
|
+
if (identityIndex >= 0) {
|
|
176
|
+
return identityIndex;
|
|
177
|
+
}
|
|
178
|
+
if (
|
|
179
|
+
filters[preferredIndex] != null &&
|
|
180
|
+
filterSignature(filters[preferredIndex]) === sourceSignature
|
|
181
|
+
) {
|
|
182
|
+
return preferredIndex;
|
|
183
|
+
}
|
|
184
|
+
const matchingIndices = filters.flatMap((filter, index) =>
|
|
185
|
+
filterSignature(filter) === sourceSignature ? [index] : [],
|
|
186
|
+
);
|
|
187
|
+
return matchingIndices.length === 1 ? matchingIndices[0] : null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* After removing the filter at `removedIndex`, focus should land on the
|
|
192
|
+
* nearest remaining row that is a button, preferring the one after it.
|
|
193
|
+
* `isRowButton` is the Filters sheet's own rule for which rows are buttons:
|
|
194
|
+
* the field interactive and the filter not read-only (a `nested` or stale
|
|
195
|
+
* filter's row is a button too).
|
|
196
|
+
*/
|
|
197
|
+
export function nearestEditableIndex(
|
|
198
|
+
nextFilters: ReadonlyArray<PowerSearchFilter>,
|
|
199
|
+
removedIndex: number,
|
|
200
|
+
isRowButton: (filter: PowerSearchFilter) => boolean = filter =>
|
|
201
|
+
!filter.isReadOnly,
|
|
202
|
+
): number | undefined {
|
|
203
|
+
const editableIndices = nextFilters.flatMap((candidate, candidateIndex) =>
|
|
204
|
+
isRowButton(candidate) ? [candidateIndex] : [],
|
|
205
|
+
);
|
|
206
|
+
return editableIndices.reduce<number | undefined>((nearest, candidate) => {
|
|
207
|
+
if (nearest == null) {
|
|
208
|
+
return candidate;
|
|
209
|
+
}
|
|
210
|
+
const candidateDistance = Math.abs(candidate - removedIndex);
|
|
211
|
+
const nearestDistance = Math.abs(nearest - removedIndex);
|
|
212
|
+
if (candidateDistance < nearestDistance) {
|
|
213
|
+
return candidate;
|
|
214
|
+
}
|
|
215
|
+
if (
|
|
216
|
+
candidateDistance === nearestDistance &&
|
|
217
|
+
candidate >= removedIndex &&
|
|
218
|
+
nearest < removedIndex
|
|
219
|
+
) {
|
|
220
|
+
return candidate;
|
|
221
|
+
}
|
|
222
|
+
return nearest;
|
|
223
|
+
}, undefined);
|
|
224
|
+
}
|
|
@@ -101,7 +101,8 @@ export const docs = {
|
|
|
101
101
|
{
|
|
102
102
|
name: 'isIndeterminate',
|
|
103
103
|
type: 'boolean',
|
|
104
|
-
description:
|
|
104
|
+
description:
|
|
105
|
+
'Animated loading indicator for unknown progress. Under reduced motion it pulses in place instead of sliding.',
|
|
105
106
|
default: 'false',
|
|
106
107
|
},
|
|
107
108
|
{
|
|
@@ -390,7 +391,8 @@ export const docsDense = {
|
|
|
390
391
|
formatValueLabel:
|
|
391
392
|
'Custom value label formatter; defaults to percentage string.',
|
|
392
393
|
variant: 'Semantic color variant.',
|
|
393
|
-
isIndeterminate:
|
|
394
|
+
isIndeterminate:
|
|
395
|
+
'Animated loading indicator for unknown progress. Under reduced motion it pulses in place instead of sliding.',
|
|
394
396
|
marks:
|
|
395
397
|
'Fixed target marks ({value, label?}) drawn on the track in the 0..max scale; stay visible past the fill. Marks inside the fill take the variant on-color; marks on the bare track take the primary text color (secondary when disabled). A label reveals a tooltip on hover/focus. Ignored when indeterminate.',
|
|
396
398
|
isDisabled: 'Visually disabled: grays out fill and text.',
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file ProgressBar.tsx
|
|
7
|
-
* @input Uses React, useId, stylex, tokens and
|
|
7
|
+
* @input Uses React, useId, stylex, tokens, ProgressBarTouch and resolveMotion
|
|
8
8
|
* @output Exports ProgressBar component, ProgressBarProps, ProgressBarVariant types
|
|
9
9
|
* @position Core implementation; consumed by index.ts
|
|
10
10
|
*
|
|
@@ -36,6 +36,10 @@ import {themeProps} from '../utils/themeProps';
|
|
|
36
36
|
import {VisuallyHidden} from '../VisuallyHidden';
|
|
37
37
|
import type {ProgressBarVariantMap} from './index';
|
|
38
38
|
import {useProgressBarTouch} from './ProgressBarTouch';
|
|
39
|
+
import {formatMotionRoleValue} from '../motion/roles';
|
|
40
|
+
import {resolveMotion} from '../motion/resolveMotion';
|
|
41
|
+
import {progressBar} from '../motion/uikit/progressBar';
|
|
42
|
+
import {timing} from '../motion/uikit/timing';
|
|
39
43
|
|
|
40
44
|
// Every mark is wrapped in a Tooltip (marks always carry a label), so load it
|
|
41
45
|
// lazily: a ProgressBar with no marks never bundles the Tooltip chunk. While it
|
|
@@ -117,7 +121,7 @@ export interface ProgressBarProps extends BaseProps<HTMLDivElement> {
|
|
|
117
121
|
* When true, renders an animated indeterminate progress indicator.
|
|
118
122
|
* Use when the progress amount is unknown (e.g. loading, processing).
|
|
119
123
|
* The `value` and `hasValueLabel` props are ignored in this mode.
|
|
120
|
-
*
|
|
124
|
+
* Under reduced motion it pulses in place instead of sliding.
|
|
121
125
|
* @default false
|
|
122
126
|
*/
|
|
123
127
|
isIndeterminate?: boolean;
|
|
@@ -170,6 +174,19 @@ const indeterminateSlideRtl = stylex.keyframes({
|
|
|
170
174
|
},
|
|
171
175
|
});
|
|
172
176
|
|
|
177
|
+
// Under reduced motion the indeterminate fill stops travelling and pulses in
|
|
178
|
+
// place. It goes from full opacity down to the pulse's floor
|
|
179
|
+
// (`--_progress-bar-pulse-floor`, the progress table's) and back. The
|
|
180
|
+
// animation alternates direction each pass.
|
|
181
|
+
const indeterminatePulse = stylex.keyframes({
|
|
182
|
+
from: {
|
|
183
|
+
opacity: 1,
|
|
184
|
+
},
|
|
185
|
+
to: {
|
|
186
|
+
opacity: 'var(--_progress-bar-pulse-floor)',
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
|
|
173
190
|
// =============================================================================
|
|
174
191
|
// Styles
|
|
175
192
|
// =============================================================================
|
|
@@ -266,7 +283,6 @@ const styles = stylex.create({
|
|
|
266
283
|
default: '100%',
|
|
267
284
|
'@media (forced-colors: active)': {
|
|
268
285
|
default: 'var(--_progress-bar-fill, 0%)',
|
|
269
|
-
// Under a finger: the touch minimum and the flip offset (below).
|
|
270
286
|
'@media (pointer: coarse)':
|
|
271
287
|
'calc(max(var(--_progress-bar-fill, 0%), var(--_progress-bar-min, 0px)) + var(--_progress-bar-flip, 0) * 0.01px)',
|
|
272
288
|
},
|
|
@@ -353,17 +369,37 @@ const styles = stylex.create({
|
|
|
353
369
|
'@media (forced-colors: active)': 'CanvasText',
|
|
354
370
|
},
|
|
355
371
|
outlineOffset: {default: null, '@media (forced-colors: active)': '-1px'},
|
|
356
|
-
|
|
372
|
+
// Under reduced motion, on every pointer, the fill spans the whole track
|
|
373
|
+
// as one solid bar, and only its opacity pulses. Each way takes the
|
|
374
|
+
// `progress.reducedMotionPulseMs` role on the `timing.curves.move` curve
|
|
375
|
+
// (`--_progress-bar-pulse`, `--_progress-bar-pulse-curve`, set inline from
|
|
376
|
+
// the progress table). A busy loop: tempo does not scale it.
|
|
377
|
+
width: {
|
|
378
|
+
default: '40%',
|
|
379
|
+
'@media (prefers-reduced-motion: reduce)': '100%',
|
|
380
|
+
},
|
|
357
381
|
borderRadius: radiusVars['--radius-full'],
|
|
358
382
|
animationName: {
|
|
359
383
|
default: indeterminateSlide,
|
|
360
|
-
':is([dir="rtl"] *)':
|
|
384
|
+
':is([dir="rtl"] *)': {
|
|
385
|
+
default: indeterminateSlideRtl,
|
|
386
|
+
'@media (prefers-reduced-motion: reduce)': indeterminatePulse,
|
|
387
|
+
},
|
|
388
|
+
'@media (prefers-reduced-motion: reduce)': indeterminatePulse,
|
|
361
389
|
},
|
|
362
390
|
animationDuration: {
|
|
363
391
|
default: '1.5s',
|
|
364
|
-
'@media (prefers-reduced-motion: reduce)': '
|
|
392
|
+
'@media (prefers-reduced-motion: reduce)': 'var(--_progress-bar-pulse)',
|
|
393
|
+
},
|
|
394
|
+
animationTimingFunction: {
|
|
395
|
+
default: 'ease-in-out',
|
|
396
|
+
'@media (prefers-reduced-motion: reduce)':
|
|
397
|
+
'var(--_progress-bar-pulse-curve)',
|
|
398
|
+
},
|
|
399
|
+
animationDirection: {
|
|
400
|
+
default: null,
|
|
401
|
+
'@media (prefers-reduced-motion: reduce)': 'alternate',
|
|
365
402
|
},
|
|
366
|
-
animationTimingFunction: 'ease-in-out',
|
|
367
403
|
animationIterationCount: 'infinite',
|
|
368
404
|
},
|
|
369
405
|
// A mark is a vertical tick centered on the track via their shared positioning container.
|
|
@@ -474,6 +510,15 @@ const markOnTrackStyles = stylex.create({
|
|
|
474
510
|
},
|
|
475
511
|
});
|
|
476
512
|
|
|
513
|
+
// The reduced-motion pulse's variables, from the progress table.
|
|
514
|
+
type PulseStyle = CSSProperties &
|
|
515
|
+
Record<
|
|
516
|
+
| '--_progress-bar-pulse'
|
|
517
|
+
| '--_progress-bar-pulse-curve'
|
|
518
|
+
| '--_progress-bar-pulse-floor',
|
|
519
|
+
string
|
|
520
|
+
>;
|
|
521
|
+
|
|
477
522
|
// `CSSProperties` has no index signature for custom properties, so the fill's
|
|
478
523
|
// inline style — which publishes the filled share as the private
|
|
479
524
|
// `--_progress-bar-fill` — needs this augmentation to typecheck.
|
|
@@ -487,6 +532,20 @@ type FillStyle = CSSProperties &
|
|
|
487
532
|
string
|
|
488
533
|
>;
|
|
489
534
|
|
|
535
|
+
/**
|
|
536
|
+
* The reduced-motion pulse plays the `progress.reducedMotionPulseMs` role on
|
|
537
|
+
* the `timing.curves.move` curve, down to the progress table's floor.
|
|
538
|
+
*/
|
|
539
|
+
function pulseStyle(element: Element | null): PulseStyle {
|
|
540
|
+
const pulseMs = resolveMotion(element, progressBar, 'reducedMotionPulseMs');
|
|
541
|
+
const curve = resolveMotion(element, timing.curves.move);
|
|
542
|
+
return {
|
|
543
|
+
'--_progress-bar-pulse': `${pulseMs}ms`,
|
|
544
|
+
'--_progress-bar-pulse-curve': formatMotionRoleValue('curve', curve),
|
|
545
|
+
'--_progress-bar-pulse-floor': String(progressBar.reducedMotionPulseFloor),
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
|
|
490
549
|
function defaultFormatValueLabel(value: number, max: number): string {
|
|
491
550
|
const pct = max > 0 ? Math.round((value / max) * 100) : 0;
|
|
492
551
|
return `${pct}%`;
|
|
@@ -662,6 +721,7 @@ export function ProgressBar({
|
|
|
662
721
|
variantStyles[fillVariant],
|
|
663
722
|
),
|
|
664
723
|
)}
|
|
724
|
+
style={pulseStyle(null)}
|
|
665
725
|
/>
|
|
666
726
|
) : (
|
|
667
727
|
<div
|
|
@@ -148,12 +148,14 @@ export const docs = {
|
|
|
148
148
|
{
|
|
149
149
|
name: 'containerClassName',
|
|
150
150
|
type: 'string',
|
|
151
|
-
description:
|
|
151
|
+
description:
|
|
152
|
+
'Class name for the field container. Same targeting as `containerXstyle`.',
|
|
152
153
|
},
|
|
153
154
|
{
|
|
154
155
|
name: 'containerStyle',
|
|
155
156
|
type: 'CSSProperties',
|
|
156
|
-
description:
|
|
157
|
+
description:
|
|
158
|
+
'Inline styles for the field container. Same targeting as `containerXstyle`.',
|
|
157
159
|
},
|
|
158
160
|
{
|
|
159
161
|
name: 'controlXstyle',
|
|
@@ -29,9 +29,10 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
29
29
|
import {spacingVars} from '../theme/tokens.stylex';
|
|
30
30
|
import {Field} from '../Field/Field';
|
|
31
31
|
import type {InputStatus} from '../Field/types';
|
|
32
|
-
import {useTooltip} from '../Tooltip';
|
|
32
|
+
import {useTooltip} from '../Tooltip/useTooltip';
|
|
33
33
|
import {useResolvedRequired} from '../hooks/useResolvedRequired';
|
|
34
|
-
import {composeEventHandlers
|
|
34
|
+
import {composeEventHandlers} from '../utils/composeEventHandlers';
|
|
35
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
35
36
|
import {joinAriaIDs} from '../utils/inputAria';
|
|
36
37
|
import {
|
|
37
38
|
type FieldInputBaseProps,
|
|
@@ -403,6 +404,10 @@ export function RadioList({
|
|
|
403
404
|
disabledMessageTooltip.ref(el);
|
|
404
405
|
}}
|
|
405
406
|
role="radiogroup"
|
|
407
|
+
// Screen readers announce the whole group as unavailable. Its dimmed
|
|
408
|
+
// label then labels a disabled control. An enabled list keeps a
|
|
409
|
+
// caller's own value.
|
|
410
|
+
aria-disabled={isDisabled || rest['aria-disabled']}
|
|
406
411
|
// A caller aria-labelledby names the group together with its label.
|
|
407
412
|
aria-labelledby={joinAriaIDs(labelID, ariaLabelledByProp)}
|
|
408
413
|
onFocus={composeEventHandlers(handleFocus, onFocus)}
|
|
@@ -26,12 +26,14 @@ import {RadioListContext} from './RadioList';
|
|
|
26
26
|
import {RadioListReasonContext} from './RadioListReasonContext';
|
|
27
27
|
import {joinAriaIDs} from '../utils/inputAria';
|
|
28
28
|
import {colorVars, radiusVars} from '../theme/tokens.stylex';
|
|
29
|
-
import {
|
|
29
|
+
import {isRenderable} from '../utils/isRenderable';
|
|
30
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
31
|
+
import {rtlStyles} from '../utils/rtlStyles';
|
|
30
32
|
import {indicatorScope} from '../Indicator/indicator.markers.stylex';
|
|
31
33
|
import {useIndicatorFocusRing} from '../hooks/useIndicatorFocusRing';
|
|
32
34
|
import {usePressFeedback} from '../hooks/usePressFeedback';
|
|
33
|
-
import {useIndicator} from '../Indicator';
|
|
34
|
-
import {Item, type ItemAlign} from '../Item';
|
|
35
|
+
import {useIndicator} from '../Indicator/useIndicator';
|
|
36
|
+
import {Item, type ItemAlign} from '../Item/Item';
|
|
35
37
|
import {themeProps} from '../utils/themeProps';
|
|
36
38
|
|
|
37
39
|
// The touch press's paint, declared by the shared overlay styles on the
|