@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
package/src/Dialog/Dialog.tsx
CHANGED
|
@@ -52,6 +52,7 @@ import {LayerContentBoundary} from '../Layer/layerScopedContext';
|
|
|
52
52
|
import {layerClickBoundary} from '../Layer/layerClickBoundary';
|
|
53
53
|
import {LayerDepthProvider} from '../Layer/LayerDepthContext';
|
|
54
54
|
import {useLayerDismissal} from '../Layer/useLayerDismissal';
|
|
55
|
+
import {useBackdropPress} from '../Layer/useBackdropPress';
|
|
55
56
|
import {useModalOutlet} from '../Layer/modalOutlet';
|
|
56
57
|
import {
|
|
57
58
|
colorVars,
|
|
@@ -80,10 +81,12 @@ import {themeProps} from '../utils/themeProps';
|
|
|
80
81
|
import type {DialogVariantMap} from './index';
|
|
81
82
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
82
83
|
import {useInteractionModalityTracking} from '../utils/interactionModality';
|
|
83
|
-
import {focusForLastInput} from '../utils/focusReturn';
|
|
84
|
+
import {focusForLastInput, isFocusLost} from '../utils/focusReturn';
|
|
84
85
|
import {ModalAnnounceProvider} from '../hooks/ModalAnnounceProvider';
|
|
85
86
|
|
|
86
87
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
88
|
+
|
|
89
|
+
type PointerHandler = (event: React.PointerEvent<HTMLDialogElement>) => void;
|
|
87
90
|
/**
|
|
88
91
|
* Calculate a directional translate offset for dialog entry animation.
|
|
89
92
|
* Returns a normalized vector from the trigger element toward the viewport
|
|
@@ -186,8 +189,22 @@ const styles = stylex.create({
|
|
|
186
189
|
position: 'fixed',
|
|
187
190
|
margin: 'auto',
|
|
188
191
|
padding: 0,
|
|
189
|
-
|
|
190
|
-
|
|
192
|
+
// The backdrop does not blur the page. Forced colors override the
|
|
193
|
+
// backdrop's colour, so a 1px border keeps the modal separate from the
|
|
194
|
+
// page. It is a border, not an outline: the focus ring
|
|
195
|
+
// (focusOutlineProps) owns the outline longhands on this element.
|
|
196
|
+
borderWidth: {
|
|
197
|
+
default: 0,
|
|
198
|
+
'@media (forced-colors: active)': 1,
|
|
199
|
+
},
|
|
200
|
+
borderStyle: {
|
|
201
|
+
default: 'none',
|
|
202
|
+
'@media (forced-colors: active)': 'solid',
|
|
203
|
+
},
|
|
204
|
+
borderColor: {
|
|
205
|
+
default: null,
|
|
206
|
+
'@media (forced-colors: active)': 'CanvasText',
|
|
207
|
+
},
|
|
191
208
|
backgroundColor: colorVars['--color-background-surface'],
|
|
192
209
|
'--_dialog-radius': radiusVars['--radius-container'],
|
|
193
210
|
borderRadius: 'var(--_dialog-radius)',
|
|
@@ -233,11 +250,10 @@ const styles = stylex.create({
|
|
|
233
250
|
openSettled: {
|
|
234
251
|
animationName: 'none',
|
|
235
252
|
},
|
|
236
|
-
//
|
|
253
|
+
// No backdrop-filter: a full-viewport blur is costly to repaint.
|
|
237
254
|
backdrop: {
|
|
238
255
|
'::backdrop': {
|
|
239
256
|
backgroundColor: colorVars['--color-overlay'],
|
|
240
|
-
backdropFilter: 'blur(2px)',
|
|
241
257
|
},
|
|
242
258
|
},
|
|
243
259
|
fullscreen: {
|
|
@@ -246,6 +262,8 @@ const styles = stylex.create({
|
|
|
246
262
|
maxWidth: '100dvw',
|
|
247
263
|
maxHeight: '100dvh',
|
|
248
264
|
borderRadius: 0,
|
|
265
|
+
// Nothing of the page shows around a full-screen dialog: no edge.
|
|
266
|
+
borderWidth: 0,
|
|
249
267
|
margin: 0,
|
|
250
268
|
inset: 0,
|
|
251
269
|
},
|
|
@@ -634,6 +652,42 @@ export function Dialog({
|
|
|
634
652
|
}
|
|
635
653
|
}, [isOpen, isInline]);
|
|
636
654
|
|
|
655
|
+
// A dialog that unmounts while open (rendered only while open, or removed
|
|
656
|
+
// with the rest of a view) never runs the close branch above, and removing a
|
|
657
|
+
// <dialog> does not run the browser's own focus return. Focus left inside
|
|
658
|
+
// it, or dropped to the body by the removal, goes back to the opener.
|
|
659
|
+
useEffect(() => {
|
|
660
|
+
if (isInline) {
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
const dialog = dialogRef.current;
|
|
664
|
+
// Read now: a removed iframe's document has no window, so its frame
|
|
665
|
+
// element can no longer be found once the dialog is gone.
|
|
666
|
+
const host = dialog?.ownerDocument.defaultView?.frameElement ?? null;
|
|
667
|
+
return () => {
|
|
668
|
+
const trigger = triggerElementRef.current;
|
|
669
|
+
if (dialog == null || trigger == null) {
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
// Checked once the commit has finished: StrictMode's simulated unmount
|
|
673
|
+
// leaves the dialog in the document, and only a real removal returns
|
|
674
|
+
// focus.
|
|
675
|
+
queueMicrotask(() => {
|
|
676
|
+
if (dialog.isConnected || !trigger.isConnected) {
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
// isFocusLost reads the dialog's own document. For a dialog in an
|
|
680
|
+
// iframe, the document that hosts the frame must also have lost focus
|
|
681
|
+
// or keep it on that frame, wherever the opener is: a control the
|
|
682
|
+
// user pressed outside the frame to remove the dialog, or the frame
|
|
683
|
+
// itself, keeps its focus.
|
|
684
|
+
if (isFocusLost(dialog) && (host == null || isFocusLost(host))) {
|
|
685
|
+
focusForLastInput(trigger);
|
|
686
|
+
}
|
|
687
|
+
});
|
|
688
|
+
};
|
|
689
|
+
}, [isInline]);
|
|
690
|
+
|
|
637
691
|
// Host app-global surfaces (toasts) inside this modal while it is open, so
|
|
638
692
|
// they stay visible and operable above it.
|
|
639
693
|
useModalOutlet(dialogRef, isOpen && !isInline);
|
|
@@ -687,16 +741,16 @@ export function Dialog({
|
|
|
687
741
|
}
|
|
688
742
|
}, [isOpen, isInline, hasConsumerName, titleId]);
|
|
689
743
|
|
|
690
|
-
//
|
|
691
|
-
// the event target is the <dialog> element itself; clicks on child content
|
|
692
|
-
// always target the child. This avoids false positives from native browser
|
|
744
|
+
// A press on the ::backdrop targets the <dialog> itself, so native browser
|
|
693
745
|
// popups (date pickers, selects, color pickers) that render outside the
|
|
694
|
-
// dialog's
|
|
695
|
-
const
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
746
|
+
// dialog's rect never count. The press must start and end there.
|
|
747
|
+
const handleBackdropPress = useCallback(() => {
|
|
748
|
+
onOpenChange(false);
|
|
749
|
+
}, [onOpenChange]);
|
|
750
|
+
const backdropPress = useBackdropPress(
|
|
751
|
+
handleBackdropPress,
|
|
752
|
+
allowBackdropClick,
|
|
753
|
+
);
|
|
700
754
|
|
|
701
755
|
// The native `cancel` event is the browser's own close-watcher firing: an
|
|
702
756
|
// Android back gesture, or a close request the stack never saw a press for.
|
|
@@ -854,8 +908,20 @@ export function Dialog({
|
|
|
854
908
|
// written.
|
|
855
909
|
{...layerClickBoundary({
|
|
856
910
|
...safeProps,
|
|
857
|
-
onClick: chainEventHandlers(
|
|
911
|
+
onClick: chainEventHandlers(backdropPress.onClick, onClickProp),
|
|
858
912
|
})}
|
|
913
|
+
onPointerDownCapture={chainEventHandlers(
|
|
914
|
+
backdropPress.onPointerDownCapture,
|
|
915
|
+
safeProps.onPointerDownCapture as PointerHandler | undefined,
|
|
916
|
+
)}
|
|
917
|
+
onPointerUpCapture={chainEventHandlers(
|
|
918
|
+
backdropPress.onPointerUpCapture,
|
|
919
|
+
safeProps.onPointerUpCapture as PointerHandler | undefined,
|
|
920
|
+
)}
|
|
921
|
+
onPointerCancelCapture={chainEventHandlers(
|
|
922
|
+
backdropPress.onPointerCancelCapture,
|
|
923
|
+
safeProps.onPointerCancelCapture as PointerHandler | undefined,
|
|
924
|
+
)}
|
|
859
925
|
onCancel={handleCancel}
|
|
860
926
|
aria-modal={isHydrating ? undefined : 'true'}
|
|
861
927
|
// The default aria-labelledby (from a DialogHeader title) is set
|
package/src/Drawer/Drawer.tsx
CHANGED
|
@@ -78,9 +78,11 @@ import {layerTextReset} from '../Layer/layerTextReset.stylex';
|
|
|
78
78
|
import {layerStructureReset} from '../Layer/layerStructureReset.stylex';
|
|
79
79
|
import {LayerContentBoundary} from '../Layer/layerScopedContext';
|
|
80
80
|
import {useModalOutlet} from '../Layer/modalOutlet';
|
|
81
|
+
import {useBackdropPress} from '../Layer/useBackdropPress';
|
|
81
82
|
import {layerClickBoundary} from '../Layer/layerClickBoundary';
|
|
82
83
|
import {ModalAnnounceProvider} from '../hooks/ModalAnnounceProvider';
|
|
83
84
|
import {composeEventHandlers, mergeProps, themeProps} from '../utils';
|
|
85
|
+
import {chainEventHandlers} from '../utils/chainEventHandlers';
|
|
84
86
|
import {container, overlayPaddingReset} from '../Layout';
|
|
85
87
|
import {
|
|
86
88
|
containerPaddingBlockEndVarStyles,
|
|
@@ -92,6 +94,8 @@ import {
|
|
|
92
94
|
import type {SpacingStep, SpacingToken} from '../Layout';
|
|
93
95
|
import {useDrawerDialogPresence} from './useDrawerDialogPresence';
|
|
94
96
|
|
|
97
|
+
type PointerHandler = (event: React.PointerEvent<HTMLDialogElement>) => void;
|
|
98
|
+
|
|
95
99
|
// =============================================================================
|
|
96
100
|
// Styles
|
|
97
101
|
// =============================================================================
|
|
@@ -218,8 +222,8 @@ const styles = stylex.create({
|
|
|
218
222
|
// Scrim via the browser's ::backdrop pseudo-element (top layer).
|
|
219
223
|
scrim: {
|
|
220
224
|
'::backdrop': {
|
|
225
|
+
// No backdrop-filter: a full-viewport blur is costly to repaint.
|
|
221
226
|
backgroundColor: colorVars['--color-overlay'],
|
|
222
|
-
backdropFilter: 'blur(2px)',
|
|
223
227
|
opacity: 0,
|
|
224
228
|
transitionProperty: 'opacity',
|
|
225
229
|
transitionDuration: durationVars['--duration-medium'],
|
|
@@ -543,15 +547,14 @@ export function Drawer({
|
|
|
543
547
|
[allowEscape, handleDismiss, shouldDismissOnCloseRequest],
|
|
544
548
|
);
|
|
545
549
|
|
|
546
|
-
//
|
|
547
|
-
//
|
|
548
|
-
const
|
|
549
|
-
(
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
[allowScrimClick, hasScrim, onOpenChange],
|
|
550
|
+
// A press on the ::backdrop targets the <dialog> itself (the content area
|
|
551
|
+
// fills the panel). The press must start and end there.
|
|
552
|
+
const handleScrimPress = useCallback(() => {
|
|
553
|
+
onOpenChange(false);
|
|
554
|
+
}, [onOpenChange]);
|
|
555
|
+
const scrimPress = useBackdropPress(
|
|
556
|
+
handleScrimPress,
|
|
557
|
+
hasScrim && allowScrimClick,
|
|
555
558
|
);
|
|
556
559
|
|
|
557
560
|
const widthValue = typeof width === 'number' ? `${width}px` : width;
|
|
@@ -612,8 +615,22 @@ export function Drawer({
|
|
|
612
615
|
// written.
|
|
613
616
|
{...layerClickBoundary({
|
|
614
617
|
...safeProps,
|
|
615
|
-
onClick: composeEventHandlers(onClickProp,
|
|
618
|
+
onClick: composeEventHandlers(onClickProp, scrimPress.onClick),
|
|
616
619
|
})}
|
|
620
|
+
// The hook records where the press started first. The caller's capture
|
|
621
|
+
// handler then runs, also when a child prevented default.
|
|
622
|
+
onPointerDownCapture={chainEventHandlers(
|
|
623
|
+
scrimPress.onPointerDownCapture,
|
|
624
|
+
safeProps.onPointerDownCapture as PointerHandler | undefined,
|
|
625
|
+
)}
|
|
626
|
+
onPointerUpCapture={chainEventHandlers(
|
|
627
|
+
scrimPress.onPointerUpCapture,
|
|
628
|
+
safeProps.onPointerUpCapture as PointerHandler | undefined,
|
|
629
|
+
)}
|
|
630
|
+
onPointerCancelCapture={chainEventHandlers(
|
|
631
|
+
scrimPress.onPointerCancelCapture,
|
|
632
|
+
safeProps.onPointerCancelCapture as PointerHandler | undefined,
|
|
633
|
+
)}
|
|
617
634
|
onKeyDown={onKeyDownProp}
|
|
618
635
|
onCancel={handleCancel}>
|
|
619
636
|
<ModalAnnounceProvider dialogRef={dialogRef} isOpen={isOpen && hasScrim}>
|
|
@@ -32,6 +32,8 @@ import {
|
|
|
32
32
|
type SetStateAction,
|
|
33
33
|
} from 'react';
|
|
34
34
|
import {flushSync} from 'react-dom';
|
|
35
|
+
import {notifyTopLayerEntry} from '../Layer/modalOutlet';
|
|
36
|
+
import {runPopoverOperation} from '../Layer/popoverOperations';
|
|
35
37
|
|
|
36
38
|
/** Slack past the computed transition before the backstop gives up waiting. */
|
|
37
39
|
const EXIT_BACKSTOP_BUFFER_MS = 50;
|
|
@@ -70,7 +72,13 @@ function showDrawerHost(dialog: HTMLDialogElement, isModal: boolean): void {
|
|
|
70
72
|
if (isModal) {
|
|
71
73
|
dialog.showModal();
|
|
72
74
|
} else if (typeof dialog.showPopover === 'function') {
|
|
73
|
-
dialog.
|
|
75
|
+
// The dialog's show focuses its first control. A tooltip on that control
|
|
76
|
+
// then asks to show. The browser refuses a show inside another show.
|
|
77
|
+
// Counting this show makes the tooltip wait until it ends.
|
|
78
|
+
runPopoverOperation(dialog.ownerDocument, () => dialog.showPopover());
|
|
79
|
+
// The drawer is now the newest top-layer entry: global hosts shown before
|
|
80
|
+
// it (the toast viewport) re-enter above it, as they do above a modal.
|
|
81
|
+
notifyTopLayerEntry();
|
|
74
82
|
} else {
|
|
75
83
|
// Reduced fallback for browsers below the Popover API support floor.
|
|
76
84
|
dialog.show();
|
|
@@ -533,6 +533,20 @@ function holdInvokerThroughPress(
|
|
|
533
533
|
doc.addEventListener('pointercancel', onPressEnd, true);
|
|
534
534
|
}
|
|
535
535
|
|
|
536
|
+
/**
|
|
537
|
+
* The name of a menu opened from a custom trigger: the caller's `aria-label`
|
|
538
|
+
* when it is a non-empty string, else the trigger's own accessible name. The
|
|
539
|
+
* popover and the bottom sheet both name the menu through this.
|
|
540
|
+
*/
|
|
541
|
+
function resolveCustomTriggerMenuName(
|
|
542
|
+
callerLabel: unknown,
|
|
543
|
+
triggerName: string | undefined,
|
|
544
|
+
): string | undefined {
|
|
545
|
+
return typeof callerLabel === 'string' && callerLabel.trim() !== ''
|
|
546
|
+
? callerLabel
|
|
547
|
+
: triggerName;
|
|
548
|
+
}
|
|
549
|
+
|
|
536
550
|
function DropdownMenuBottomSheet({
|
|
537
551
|
button: buttonFromProps,
|
|
538
552
|
renderTrigger,
|
|
@@ -596,11 +610,22 @@ function DropdownMenuBottomSheet({
|
|
|
596
610
|
useEffect(() => {
|
|
597
611
|
void preloadMenuBottomSheetActionList();
|
|
598
612
|
}, []);
|
|
613
|
+
// The control's name is only readable from the DOM once it is rendered.
|
|
614
|
+
const [triggerName, setTriggerName] = useState<string | undefined>(undefined);
|
|
615
|
+
useIsomorphicLayoutEffect(() => {
|
|
616
|
+
if (renderTrigger != null && isOpen) {
|
|
617
|
+
setTriggerName(readAccessibleName(buttonRef.current));
|
|
618
|
+
}
|
|
619
|
+
}, [renderTrigger, isOpen]);
|
|
620
|
+
const rootTitle =
|
|
621
|
+
(renderTrigger != null
|
|
622
|
+
? resolveCustomTriggerMenuName(rest['aria-label'], triggerName)
|
|
623
|
+
: undefined) ?? button.label;
|
|
599
624
|
const currentSubmenu = submenuPath.at(-1);
|
|
600
625
|
const currentItems = currentSubmenu?.items ?? items;
|
|
601
|
-
const currentTitle = currentSubmenu?.label ??
|
|
626
|
+
const currentTitle = currentSubmenu?.label ?? rootTitle;
|
|
602
627
|
const sheetLabel =
|
|
603
|
-
typeof currentTitle === 'string' ? currentTitle :
|
|
628
|
+
typeof currentTitle === 'string' ? currentTitle : rootTitle;
|
|
604
629
|
|
|
605
630
|
const setOpen = useCallback(
|
|
606
631
|
(nextIsOpen: boolean) => {
|
|
@@ -1040,12 +1065,9 @@ function DropdownMenuPopover({
|
|
|
1040
1065
|
// The design system's button names the menu by its label. A custom trigger
|
|
1041
1066
|
// names it by reference (or the caller's `aria-label` does), so that name
|
|
1042
1067
|
// is read off the control as the menu opens.
|
|
1043
|
-
const callerMenuLabel = rest['aria-label'];
|
|
1044
1068
|
const menuLabel =
|
|
1045
1069
|
renderTrigger != null
|
|
1046
|
-
?
|
|
1047
|
-
? callerMenuLabel
|
|
1048
|
-
: triggerName
|
|
1070
|
+
? resolveCustomTriggerMenuName(rest['aria-label'], triggerName)
|
|
1049
1071
|
: typeof button.label === 'string'
|
|
1050
1072
|
? button.label
|
|
1051
1073
|
: undefined;
|
package/src/Field/Field.tsx
CHANGED
|
@@ -25,11 +25,11 @@ import {FieldStatus} from '../FieldStatus/FieldStatus';
|
|
|
25
25
|
import {useFieldStatusAnnouncement} from '../FieldStatus/useFieldStatusAnnouncement';
|
|
26
26
|
import {spacingVars, borderVars, sizeVars} from '../theme/tokens.stylex';
|
|
27
27
|
import type {IconType} from '../Icon';
|
|
28
|
-
import {mergeProps} from '../utils';
|
|
28
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
29
29
|
import {useDevWarning} from '../hooks/useDevWarning';
|
|
30
30
|
import {FormLayoutContext} from '../FormLayout/FormLayoutContext';
|
|
31
31
|
import {Text} from '../Text/Text';
|
|
32
|
-
import {VisuallyHidden} from '../VisuallyHidden';
|
|
32
|
+
import {VisuallyHidden} from '../VisuallyHidden/VisuallyHidden';
|
|
33
33
|
import {themeProps} from '../utils/themeProps';
|
|
34
34
|
import type {FieldStatusPlacement} from './fieldStatusPlacement';
|
|
35
35
|
|
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
} from '../theme/tokens.stylex';
|
|
59
59
|
import type {BaseProps} from '../BaseProps';
|
|
60
60
|
import {textEntryTraitAttributes} from './textEntryTraits';
|
|
61
|
+
import {inputWrapperStyles} from './inputStyles.stylex';
|
|
61
62
|
|
|
62
63
|
const styles = stylex.create({
|
|
63
64
|
// Gutter only. Matches the option list's own padding so the field below
|
|
@@ -185,6 +186,14 @@ export interface PanelSearchInputProps extends Omit<
|
|
|
185
186
|
* the field to the same height as its rows.
|
|
186
187
|
*/
|
|
187
188
|
fieldXstyle?: StyleXStyles;
|
|
189
|
+
/**
|
|
190
|
+
* Draw the field as the shared input box — the input border, accent while
|
|
191
|
+
* focused, surface and radius — instead of the borderless panel row. A
|
|
192
|
+
* touch sheet is a full-width surface, not a bordered panel, so its field
|
|
193
|
+
* reads as a form input.
|
|
194
|
+
* @default false
|
|
195
|
+
*/
|
|
196
|
+
hasInputBox?: boolean;
|
|
188
197
|
}
|
|
189
198
|
|
|
190
199
|
/**
|
|
@@ -208,6 +217,7 @@ export function PanelSearchInput({
|
|
|
208
217
|
onBlur,
|
|
209
218
|
onContainerKeyDown,
|
|
210
219
|
fieldXstyle,
|
|
220
|
+
hasInputBox = false,
|
|
211
221
|
xstyle,
|
|
212
222
|
className,
|
|
213
223
|
style,
|
|
@@ -268,6 +278,7 @@ export function PanelSearchInput({
|
|
|
268
278
|
{...stylex.props(
|
|
269
279
|
styles.field,
|
|
270
280
|
isKeyboardFocus && styles.fieldKeyboardFocus,
|
|
281
|
+
hasInputBox && inputWrapperStyles.base,
|
|
271
282
|
fieldXstyle,
|
|
272
283
|
)}>
|
|
273
284
|
<Icon icon="search" size="sm" color="secondary" xstyle={styles.icon} />
|
|
@@ -16,7 +16,14 @@
|
|
|
16
16
|
* - /packages/cli/assets/templates/blocks/components/HoverCard/ (showcase blocks)
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
useCallback,
|
|
21
|
+
useRef,
|
|
22
|
+
useState,
|
|
23
|
+
type ReactElement,
|
|
24
|
+
type ReactNode,
|
|
25
|
+
} from 'react';
|
|
26
|
+
import {observeMutations} from '../utils/sharedMutationObserver';
|
|
20
27
|
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
21
28
|
import * as stylex from '@stylexjs/stylex';
|
|
22
29
|
import {
|
|
@@ -303,6 +310,28 @@ export function HoverCard({
|
|
|
303
310
|
onHide: handleHide,
|
|
304
311
|
});
|
|
305
312
|
|
|
313
|
+
// The wrapper's first element is the trigger, and it can be replaced after
|
|
314
|
+
// mount: by new children, or by a child component that swaps its own root
|
|
315
|
+
// without a render here. Syncs with the DOM: on a replacement the wiring
|
|
316
|
+
// below re-runs, so the old element is released before the new one is wired.
|
|
317
|
+
const [triggerReplacements, setTriggerReplacements] = useState(0);
|
|
318
|
+
const observedTriggerRef = useRef<Element | null>(null);
|
|
319
|
+
useIsomorphicLayoutEffect(() => {
|
|
320
|
+
const wrapper = wrapperRef.current;
|
|
321
|
+
if (textOnly || wrapper == null) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
observedTriggerRef.current = wrapper.firstElementChild;
|
|
325
|
+
return observeMutations(wrapper, {childList: true}, () => {
|
|
326
|
+
const trigger = wrapper.firstElementChild;
|
|
327
|
+
if (trigger === observedTriggerRef.current) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
observedTriggerRef.current = trigger;
|
|
331
|
+
setTriggerReplacements(count => count + 1);
|
|
332
|
+
});
|
|
333
|
+
}, [textOnly]);
|
|
334
|
+
|
|
306
335
|
// For element children with display:contents, attach ref to first child
|
|
307
336
|
useIsomorphicLayoutEffect(() => {
|
|
308
337
|
if (textOnly) {
|
|
@@ -407,6 +436,7 @@ export function HoverCard({
|
|
|
407
436
|
hoverCard.id,
|
|
408
437
|
hoverCard.isOpen,
|
|
409
438
|
hoverCard.describedBy,
|
|
439
|
+
triggerReplacements,
|
|
410
440
|
]);
|
|
411
441
|
|
|
412
442
|
// While closed, useLayer leaves only an inert <template> marker at this JSX
|
package/src/Icon/Icon.doc.mjs
CHANGED
|
@@ -71,15 +71,16 @@ export const docs = {
|
|
|
71
71
|
props: [
|
|
72
72
|
{
|
|
73
73
|
name: 'icon',
|
|
74
|
-
type: 'IconName | ComponentType<SVGProps>',
|
|
74
|
+
type: 'IconName | NamespacedIconName | ComponentType<SVGProps>',
|
|
75
75
|
description:
|
|
76
|
-
'Semantic icon name or SVG component. Valid semantic names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. For any icon not in this list, pass an SVG component directly (e.g. import from lucide-react or @heroicons/react). Note: this prop is called `icon`, not `name`.',
|
|
76
|
+
'Semantic icon name or SVG component. Valid semantic names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. A namespaced key such as `richtext:bold` names a glyph that one component or library registers, and a theme can replace it by key; a namespaced key that nothing registers renders nothing. For any icon not in this list, pass an SVG component directly (e.g. import from lucide-react or @heroicons/react). Note: this prop is called `icon`, not `name`.',
|
|
77
77
|
required: true,
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
name: 'color',
|
|
81
81
|
type: "'primary' | 'secondary' | 'tertiary' | 'disabled' | 'accent' | 'info' | 'success' | 'error' | 'warning' | 'inherit'",
|
|
82
|
-
description:
|
|
82
|
+
description:
|
|
83
|
+
'Color variant mapped to Astryx icon color tokens. Semantic values (primary through warning) follow the role, and inherit uses the surrounding text color. On the web, Icon also accepts the palette values blue, red, green, gray, cyan, teal, yellow, orange, pink, and purple, which pick a non-semantic hue.',
|
|
83
84
|
default: "'inherit'",
|
|
84
85
|
},
|
|
85
86
|
{
|
|
@@ -107,6 +108,24 @@ export const docs = {
|
|
|
107
108
|
description:
|
|
108
109
|
"StyleX styles for customization (color, size, opacity). Folded into the icon's own stylex.props() call so it composes with the base color/size styles. Must be a stylex.create() value, not an inline style object like style={{}}.",
|
|
109
110
|
},
|
|
111
|
+
{
|
|
112
|
+
name: 'className',
|
|
113
|
+
type: 'string',
|
|
114
|
+
description:
|
|
115
|
+
'Class name added to the rendered glyph, beside the astryx-icon target class.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'style',
|
|
119
|
+
type: 'CSSProperties',
|
|
120
|
+
description:
|
|
121
|
+
"Inline styles merged onto the rendered glyph after Icon's own size and color styles.",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'ref',
|
|
125
|
+
type: 'Ref<SVGSVGElement>',
|
|
126
|
+
description:
|
|
127
|
+
'Ref to the rendered SVG element when icon is an icon component. A semantic or namespaced name renders inside an internal wrapper, and the ref is not attached.',
|
|
128
|
+
},
|
|
110
129
|
],
|
|
111
130
|
theming: {
|
|
112
131
|
targets: [{className: 'astryx-icon', visualProps: ['color', 'size']}],
|
|
@@ -207,15 +226,16 @@ export const docsZh = {
|
|
|
207
226
|
props: [
|
|
208
227
|
{
|
|
209
228
|
name: 'icon',
|
|
210
|
-
type: 'IconName | ComponentType<SVGProps>',
|
|
229
|
+
type: 'IconName | NamespacedIconName | ComponentType<SVGProps>',
|
|
211
230
|
description:
|
|
212
|
-
'语义图标名称或 SVG 组件。有效语义名称:close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone
|
|
231
|
+
'语义图标名称或 SVG 组件。有效语义名称:close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone。命名空间键(如 `richtext:bold`)指向某个组件或库注册的图标,主题可以按键替换它;没有注册的命名空间键不渲染任何内容。列表之外的图标请直接传入 SVG 组件。',
|
|
213
232
|
required: true,
|
|
214
233
|
},
|
|
215
234
|
{
|
|
216
235
|
name: 'color',
|
|
217
236
|
type: "'primary' | 'secondary' | 'tertiary' | 'disabled' | 'accent' | 'info' | 'success' | 'error' | 'warning' | 'inherit'",
|
|
218
|
-
description:
|
|
237
|
+
description:
|
|
238
|
+
'映射到 Astryx 图标颜色令牌的颜色变体。语义值(primary 到 warning)跟随角色,inherit 使用周围文字的颜色。在 Web 上,Icon 还接受调色板值 blue、red、green、gray、cyan、teal、yellow、orange、pink 和 purple,它们选择非语义色相。',
|
|
219
239
|
default: "'inherit'",
|
|
220
240
|
},
|
|
221
241
|
{
|
|
@@ -243,6 +263,23 @@ export const docsZh = {
|
|
|
243
263
|
description:
|
|
244
264
|
'用于自定义的 StyleX 样式(颜色、尺寸、不透明度)。会并入图标自身的 stylex.props() 调用,从而与基础的颜色/尺寸样式组合。必须是 stylex.create() 的值,而不是像 style={{}} 这样的内联样式对象。',
|
|
245
265
|
},
|
|
266
|
+
{
|
|
267
|
+
name: 'className',
|
|
268
|
+
type: 'string',
|
|
269
|
+
description: '添加到渲染图标上的类名,与 astryx-icon 目标类名并列。',
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
name: 'style',
|
|
273
|
+
type: 'CSSProperties',
|
|
274
|
+
description:
|
|
275
|
+
'合并到渲染图标上的内联样式,位于 Icon 自身的尺寸和颜色样式之后。',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
name: 'ref',
|
|
279
|
+
type: 'Ref<SVGSVGElement>',
|
|
280
|
+
description:
|
|
281
|
+
'icon 为图标组件时,指向渲染的 SVG 元素的 ref。语义名称或命名空间名称在内部包装元素中渲染,不会附加 ref。',
|
|
282
|
+
},
|
|
246
283
|
],
|
|
247
284
|
theming: {
|
|
248
285
|
targets: [{className: 'astryx-icon', visualProps: ['color', 'size']}],
|
|
@@ -390,8 +427,9 @@ export const docsDense = {
|
|
|
390
427
|
],
|
|
391
428
|
},
|
|
392
429
|
propDescriptions: {
|
|
393
|
-
icon: 'Semantic icon name or SVG component. Valid names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. For others, pass an SVG component.',
|
|
394
|
-
color:
|
|
430
|
+
icon: 'Semantic icon name or SVG component. Valid names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. A namespaced key (`richtext:bold`) names a glyph a component or library registers; an unregistered one renders nothing. For others, pass an SVG component.',
|
|
431
|
+
color:
|
|
432
|
+
'Color variant mapped to Astryx icon color tokens; inherit = surrounding text color. Web also accepts the non-semantic palette: blue, red, green, gray, cyan, teal, yellow, orange, pink, purple.',
|
|
395
433
|
size: "xsm/sm/md/lg = 12/16/20/24px at a 16px root, scale w/ root font size; theme sets a size's glyph dimension via width + height (px or rem) on components.icon['size:sm'] etc. Explicit Icon size; otherwise nearest owning-component default, then 'md' when no contextual default exists",
|
|
396
434
|
variant:
|
|
397
435
|
"Requests the active theme's alternate artwork (e.g. 'filled'); names from augmentable IconVariantMap. Reaches the entry only if the active theme's iconVariants lists it (and an inherited entry's defining theme does too); else normal artwork. Ignored by a directly passed component; never in the DOM; no theming selector.",
|
|
@@ -399,5 +437,8 @@ export const docsDense = {
|
|
|
399
437
|
'Accessible name for a meaningful, standalone icon. Sets role="img" + aria-label and drops the default aria-hidden. Omit (default) for decorative icons (stays aria-hidden). Empty string = decorative. The accessible-name/alt-text prop for icons.',
|
|
400
438
|
xstyle:
|
|
401
439
|
'StyleX styles (color, size, opacity) via stylex.create(); composes with the base color/size styles.',
|
|
440
|
+
className: 'Class added to the rendered glyph beside astryx-icon.',
|
|
441
|
+
style: "Inline styles merged after Icon's size and color styles.",
|
|
442
|
+
ref: 'Reaches the SVG only when icon is a component; a semantic or namespaced name renders in a wrapper and gets no ref.',
|
|
402
443
|
},
|
|
403
444
|
};
|
package/src/Icon/Icon.tsx
CHANGED
|
@@ -176,7 +176,11 @@ export interface IconProps extends Omit<
|
|
|
176
176
|
SVGProps<SVGSVGElement>,
|
|
177
177
|
'ref' | 'color'
|
|
178
178
|
> {
|
|
179
|
-
/**
|
|
179
|
+
/**
|
|
180
|
+
* Ref to the rendered SVG element when `icon` is an icon component. A
|
|
181
|
+
* semantic or namespaced name renders inside an internal wrapper, and the
|
|
182
|
+
* ref is not attached.
|
|
183
|
+
*/
|
|
180
184
|
ref?: React.Ref<SVGSVGElement>;
|
|
181
185
|
/**
|
|
182
186
|
* Icon to render. Can be:
|
|
@@ -267,22 +271,26 @@ export interface IconProps extends Omit<
|
|
|
267
271
|
xstyle?: StyleXStyles;
|
|
268
272
|
}
|
|
269
273
|
|
|
274
|
+
type IconA11yProps =
|
|
275
|
+
| {role: 'img'; 'aria-label': string; 'aria-hidden': undefined}
|
|
276
|
+
| {'aria-hidden': 'true'};
|
|
277
|
+
|
|
270
278
|
/**
|
|
271
279
|
* Derives the ARIA attributes for an icon from its `label` prop.
|
|
272
280
|
*
|
|
273
281
|
* - Non-empty `label` → meaningful image: `role="img"` + `aria-label`, and no
|
|
274
282
|
* `aria-hidden` (an `aria-hidden` element is removed from the accessibility
|
|
275
|
-
* tree, so its accessible name would be ignored).
|
|
283
|
+
* tree, so its accessible name would be ignored). Icon passes
|
|
284
|
+
* `aria-hidden: undefined`. Many icon components, such as Heroicons, write
|
|
285
|
+
* `aria-hidden="true"` unless a prop replaces it.
|
|
276
286
|
* - Omitted or empty `label` → decorative default: `aria-hidden="true"`.
|
|
277
287
|
*
|
|
278
288
|
* The result is spread BEFORE `{...props}` in both render modes so an explicit
|
|
279
289
|
* `aria-hidden` / `role` / `aria-label` from the consumer always wins.
|
|
280
290
|
*/
|
|
281
|
-
function getIconA11yProps(
|
|
282
|
-
label: string | undefined,
|
|
283
|
-
): {role: 'img'; 'aria-label': string} | {'aria-hidden': 'true'} {
|
|
291
|
+
function getIconA11yProps(label: string | undefined): IconA11yProps {
|
|
284
292
|
return label != null && label !== ''
|
|
285
|
-
? {role: 'img', 'aria-label': label}
|
|
293
|
+
? {role: 'img', 'aria-label': label, 'aria-hidden': undefined}
|
|
286
294
|
: {'aria-hidden': 'true'};
|
|
287
295
|
}
|
|
288
296
|
|
|
@@ -392,7 +400,7 @@ function IconFromRegistry({
|
|
|
392
400
|
color: IconColor;
|
|
393
401
|
size: IconSize;
|
|
394
402
|
variant: IconVariant | undefined;
|
|
395
|
-
a11yProps:
|
|
403
|
+
a11yProps: IconA11yProps;
|
|
396
404
|
className?: string;
|
|
397
405
|
style?: React.CSSProperties;
|
|
398
406
|
xstyle?: StyleXStyles;
|