@astryxdesign/core 0.4.6 → 0.4.7-canary.20bae6c
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/CHANGELOG.md +36 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +3 -2
- package/dist/BottomSheet/BottomSheet.d.ts +1 -0
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +54 -15
- package/dist/BottomSheet/BottomSheetEdgeTint.d.ts +6 -0
- package/dist/BottomSheet/BottomSheetEdgeTint.d.ts.map +1 -0
- package/dist/BottomSheet/BottomSheetEdgeTint.js +62 -0
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +1 -0
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts +1 -0
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +13 -6
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +23 -5
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +12 -4
- package/dist/Calendar/Calendar.d.ts +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +13 -14
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +3 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +3 -2
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +34 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +3 -2
- package/dist/Dialog/Dialog.d.ts +7 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +89 -58
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -2
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.d.ts +5 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +67 -25
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +10 -3
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +149 -23
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +15 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +17 -6
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +20 -17
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +3 -4
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +5 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +3 -3
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +3 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +5 -1
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +3 -3
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +4 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +19 -5
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +3 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +5 -3
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +3 -3
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +43 -1
- 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/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +52 -91
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +10 -3
- package/dist/hooks/useListFocus.d.ts +5 -2
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +12 -6
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/en.json +27 -7
- package/locales/pseudo.json +15 -0
- package/package.json +8 -3
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +2 -1
- package/src/AvatarGroup/AvatarGroup.tsx +3 -2
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +36 -4
- package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +225 -0
- package/src/BottomSheet/BottomSheetEdgeTint.tsx +82 -0
- package/src/BottomSheet/BottomSheetPanel.test.tsx +66 -0
- package/src/BottomSheet/BottomSheetPanel.tsx +19 -0
- package/src/BottomSheet/BottomSheetSwitcher.tsx +16 -2
- package/src/BottomSheet/useSheetGestures.test.ts +27 -0
- package/src/BottomSheet/useSheetGestures.ts +25 -5
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +22 -0
- package/src/ButtonGroup/ButtonGroup.doc.mjs +7 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +185 -1
- package/src/ButtonGroup/ButtonGroup.tsx +11 -3
- package/src/Calendar/Calendar.doc.mjs +4 -3
- package/src/Calendar/Calendar.test.tsx +52 -0
- package/src/Calendar/Calendar.tsx +18 -15
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/CheckboxInput/CheckboxInput.tsx +3 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.tsx +3 -2
- package/src/DateInput/DateInputTouch.test.tsx +36 -0
- package/src/DateInput/TouchDateField.tsx +35 -1
- package/src/DateTimeInput/DateTimeInput.tsx +2 -2
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +261 -1
- package/src/Dialog/Dialog.tsx +109 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/Field/Field.doc.mjs +13 -2
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -2
- package/src/HoverCard/HoverCard.doc.mjs +5 -0
- package/src/HoverCard/HoverCard.tsx +6 -0
- package/src/HoverCard/useHoverCard.tsx +81 -30
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.test.tsx +17 -0
- package/src/Kbd/Kbd.tsx +10 -3
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +71 -1
- package/src/Markdown/parser.test.ts +145 -2
- package/src/Markdown/parser.ts +208 -22
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +27 -0
- package/src/MultiSelector/MultiSelector.test.tsx +105 -0
- package/src/MultiSelector/MultiSelector.tsx +50 -6
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavMenu/NavHeadingMenu.tsx +3 -2
- package/src/NumberInput/NumberInput.doc.mjs +5 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Popover/Popover.test.tsx +27 -1
- package/src/Popover/usePopover.tsx +31 -28
- package/src/PowerSearch/PowerSearch.doc.mjs +26 -0
- package/src/PowerSearch/PowerSearch.tsx +5 -2
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.tsx +3 -2
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +21 -0
- package/src/Selector/Selector.tsx +11 -1
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.tsx +3 -2
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.tsx +3 -2
- package/src/TabList/Tab.tsx +5 -1
- package/src/TabList/TabList.test.tsx +21 -4
- package/src/TabList/TabList.tsx +3 -2
- package/src/Table/BaseTable.tsx +6 -3
- package/src/Table/Table.test.tsx +35 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +23 -1
- package/src/Text/Text.tsx +6 -2
- package/src/TextArea/TextArea.tsx +3 -2
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavMegaMenu.tsx +3 -2
- package/src/Typeahead/BaseTypeahead.tsx +3 -2
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/__tests__/complexComponentContract.test.tsx +81 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.ts +54 -107
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.test.ts +18 -0
- package/src/hooks/useHotkeys.ts +10 -3
- package/src/hooks/useListFocus.doc.mjs +2 -2
- package/src/hooks/useListFocus.test.tsx +65 -3
- package/src/hooks/useListFocus.ts +15 -7
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/index.ts +1 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
package/dist/Heading/Heading.js
CHANGED
|
@@ -21,7 +21,8 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
21
21
|
import { colorStyles, sizeByLevelStyles, sizeByTypeStyles, defaultWeightByTypeStyles, displayStyles, justifyStyles, truncationStyles, wordBreakStyles, textWrapStyles, capsizeStyles, decorationStyles, truncationTooltipStyles } from "../Text/text.stylex.js";
|
|
22
22
|
import { useTruncation } from "../Text/useTruncation.js";
|
|
23
23
|
import { resolveStyleColor } from "../Text/Text.js";
|
|
24
|
-
import { mergeProps
|
|
24
|
+
import { mergeProps } from "../utils/index.js";
|
|
25
|
+
import { useMergedRefs } from "../hooks/useMergedRefs.js";
|
|
25
26
|
import { themeProps } from "../utils/themeProps.js";
|
|
26
27
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
27
28
|
const LazyXDSTooltip = /*#__PURE__*/lazy(async () => import("../Tooltip/Tooltip.js").then(mod => ({
|
|
@@ -107,13 +108,16 @@ export function Heading({
|
|
|
107
108
|
// Ref for the heading element (used as tooltip anchor)
|
|
108
109
|
const headingRef = useRef(null);
|
|
109
110
|
|
|
111
|
+
// Keep the merged ref stable across rerenders.
|
|
112
|
+
const mergedRef = useMergedRefs(ref, truncation.ref, headingRef);
|
|
113
|
+
|
|
110
114
|
// Build inline style for -webkit-line-clamp (dynamic value)
|
|
111
115
|
const inlineStyle = maxLines > 1 ? {
|
|
112
116
|
WebkitLineClamp: maxLines
|
|
113
117
|
} : undefined;
|
|
114
118
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
115
119
|
children: [/*#__PURE__*/_jsx(Component, {
|
|
116
|
-
ref:
|
|
120
|
+
ref: mergedRef,
|
|
117
121
|
...mergeProps(themeProps('heading', {
|
|
118
122
|
level,
|
|
119
123
|
color,
|
|
@@ -97,6 +97,12 @@ export interface HoverCardProps extends Pick<BaseProps, 'xstyle' | 'className' |
|
|
|
97
97
|
* - `true`: force-show the hover card (hover/focus hide is suppressed)
|
|
98
98
|
* - `false`: force-hide the hover card
|
|
99
99
|
* - `undefined`: uncontrolled — hover/focus triggers manage visibility
|
|
100
|
+
*
|
|
101
|
+
* A controlled hover card still takes Escape when it is the top-most layer,
|
|
102
|
+
* and answers by calling `onOpenChange(false)` without hiding itself —
|
|
103
|
+
* closing is your update's decision, exactly as for a controlled Dialog.
|
|
104
|
+
* Ignore the call and the card stays, and so does the press: nothing
|
|
105
|
+
* underneath dismisses.
|
|
100
106
|
*/
|
|
101
107
|
isOpen?: boolean;
|
|
102
108
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HoverCard.d.ts","sourceRoot":"","sources":["../../src/HoverCard/HoverCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAG7E,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,YAAY,EACV,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAiBxB,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,EACT,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC;IACC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,OAAO,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAEtC
|
|
1
|
+
{"version":3,"file":"HoverCard.d.ts","sourceRoot":"","sources":["../../src/HoverCard/HoverCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAG7E,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,YAAY,EACV,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAiBxB,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,EACT,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC;IACC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,OAAO,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAEtC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAiBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,OAAO,EACP,SAAmB,EACnB,SAAoB,EACpB,KAAW,EACX,SAAe,EACf,YAAqB,EACrB,YAAqB,EACrB,SAAgB,EAChB,KAAK,EACL,YAAY,EACZ,kBAA2B,EAC3B,MAAM,EACN,aAAa,EACb,MAAM,EACN,SAAS,EACT,KAAK,GACN,EAAE,cAAc,GAAG,YAAY,CA0G/B;yBA5He,SAAS"}
|
|
@@ -78,6 +78,11 @@ export interface HoverCardOptions {
|
|
|
78
78
|
* - `true`: force-show the hover card (hover/focus hide is suppressed)
|
|
79
79
|
* - `false`: force-hide the hover card
|
|
80
80
|
* - `undefined`: uncontrolled — hover/focus triggers manage visibility
|
|
81
|
+
*
|
|
82
|
+
* A controlled hover card still takes Escape when it is the top-most layer,
|
|
83
|
+
* and answers by calling `onHide` without hiding itself — closing is your
|
|
84
|
+
* update's decision, exactly as for a controlled Dialog. Ignore the call and
|
|
85
|
+
* the card stays, and so does the press: nothing underneath dismisses.
|
|
81
86
|
*/
|
|
82
87
|
isOpen?: boolean;
|
|
83
88
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHoverCard.d.ts","sourceRoot":"","sources":["../../src/HoverCard/useHoverCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"useHoverCard.d.ts","sourceRoot":"","sources":["../../src/HoverCard/useHoverCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AA6BlC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAE9B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEtC;;;;OAIG;IACH,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;;OAOG;IACH,eAAe,EAAE,CACf,QAAQ,EAAE,SAAS,EACnB,KAAK,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,KAC5C,SAAS,CAAC;IAEf;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAyBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA2a5E"}
|
|
@@ -16,6 +16,7 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
16
16
|
import { useLayer } from "../Layer/useLayer.js";
|
|
17
17
|
import { useTouchTrigger } from "../Layer/useTouchTrigger.js";
|
|
18
18
|
import { layerAnimations } from "../Layer/layerAnimations.stylex.js";
|
|
19
|
+
import { useLayerDismissal } from "../Layer/useLayerDismissal.js";
|
|
19
20
|
import "../theme/tokens.stylex.js";
|
|
20
21
|
import { colorVars, shadowVars, radiusVars, spacingVars } from "../theme/tokens.stylex.js";
|
|
21
22
|
import { themeProps } from "../utils/themeProps.js";
|
|
@@ -216,16 +217,66 @@ export function useHoverCard(options = {}) {
|
|
|
216
217
|
}
|
|
217
218
|
scheduleHide();
|
|
218
219
|
}, [layer.id, scheduleHide]);
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
220
|
+
|
|
221
|
+
// Escape dismissal (WCAG 1.4.13) goes through the shared layer stack: a
|
|
222
|
+
// visible card is the top-most layer, so it takes the press and consumes it.
|
|
223
|
+
//
|
|
224
|
+
// This replaces a keydown listener on the TRIGGER that called
|
|
225
|
+
// stopPropagation() on any Escape while the trigger merely had focus — open
|
|
226
|
+
// card or not — so focusing a HoverCard trigger inside a Dialog silently ate
|
|
227
|
+
// the press that should have closed the Dialog. Presence is now answered from
|
|
228
|
+
// the DOM, so a closed card never claims a press.
|
|
229
|
+
// A controlled hover card stays on the stack and takes the press like any
|
|
230
|
+
// other layer, but answers it by reporting instead of hiding: `isOpen` is
|
|
231
|
+
// the consumer's value, so only their update may change it. Same contract as
|
|
232
|
+
// a controlled Dialog.
|
|
233
|
+
useLayerDismissal({
|
|
234
|
+
// Registered for the hook's lifetime rather than gated on `layer.isOpen`:
|
|
235
|
+
// that state can lag a frame behind the DOM, so a press arriving right after
|
|
236
|
+
// the layer appears would find nothing registered. Because this layer
|
|
237
|
+
// CONSUMES the press, a stale registration would be worse than a missed one
|
|
238
|
+
// — it would silently eat Escapes meant for the dialog underneath — so
|
|
239
|
+
// presence is answered from the DOM at press time instead of from state.
|
|
240
|
+
isActive: true,
|
|
241
|
+
isPresent: () => {
|
|
242
|
+
const el = typeof document === 'undefined' ? null : document.getElementById(layer.id);
|
|
243
|
+
if (el == null) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
return el.matches(':popover-open');
|
|
248
|
+
} catch {
|
|
249
|
+
// Browsers without the Popover API (and some test environments) cannot
|
|
250
|
+
// answer the selector; fall back to the hook's own state.
|
|
251
|
+
return layer.isOpen;
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
onDismiss: () => {
|
|
224
255
|
clearTimeouts();
|
|
225
256
|
touch.clearTapOpen();
|
|
257
|
+
// Controlled: report and stop. The close — and the focus restore that
|
|
258
|
+
// goes with it — happens in the controlled effect if and when the
|
|
259
|
+
// consumer flips `isOpen`.
|
|
260
|
+
if (isOpen !== undefined) {
|
|
261
|
+
onHide?.();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// Only when the card itself held focus, which is the one case the
|
|
265
|
+
// content-level handler this replaced could run in. Refocusing
|
|
266
|
+
// unconditionally would drag the caret out of a field the user was
|
|
267
|
+
// typing in while a hover card happened to be up; arming the re-show
|
|
268
|
+
// guard unconditionally would swallow their next focus on the trigger,
|
|
269
|
+
// because a focus() on the already-focused trigger fires no focusin to
|
|
270
|
+
// clear it.
|
|
271
|
+
const card = typeof document === 'undefined' ? null : document.getElementById(layer.id);
|
|
272
|
+
const hadFocus = card?.contains(document.activeElement) ?? false;
|
|
226
273
|
layer.hide();
|
|
274
|
+
if (hadFocus) {
|
|
275
|
+
isEscapeDismissingRef.current = true;
|
|
276
|
+
triggerRef.current?.focus();
|
|
277
|
+
}
|
|
227
278
|
}
|
|
228
|
-
}
|
|
279
|
+
});
|
|
229
280
|
|
|
230
281
|
// Interaction ref that handles event listeners only
|
|
231
282
|
const {
|
|
@@ -238,7 +289,6 @@ export function useHoverCard(options = {}) {
|
|
|
238
289
|
triggerRef.current.removeEventListener('mouseleave', handleMouseLeave);
|
|
239
290
|
triggerRef.current.removeEventListener('focusin', handleFocusIn);
|
|
240
291
|
triggerRef.current.removeEventListener('focusout', handleFocusOut);
|
|
241
|
-
triggerRef.current.removeEventListener('keydown', handleKeyDown);
|
|
242
292
|
triggerRef.current.removeEventListener('pointerenter', handlePointerEnter);
|
|
243
293
|
triggerRef.current.removeEventListener('pointerdown', handlePointerDown);
|
|
244
294
|
}
|
|
@@ -257,12 +307,9 @@ export function useHoverCard(options = {}) {
|
|
|
257
307
|
el.addEventListener('focusin', handleFocusIn);
|
|
258
308
|
el.addEventListener('focusout', handleFocusOut);
|
|
259
309
|
}
|
|
260
|
-
|
|
261
|
-
// Attach keydown for Escape handling
|
|
262
|
-
el.addEventListener('keydown', handleKeyDown);
|
|
263
310
|
}
|
|
264
311
|
triggerRef.current = el;
|
|
265
|
-
}, [focusTrigger, handleMouseEnter, handleMouseLeave, handleFocusIn, handleFocusOut,
|
|
312
|
+
}, [focusTrigger, handleMouseEnter, handleMouseLeave, handleFocusIn, handleFocusOut, handlePointerEnter, handlePointerDown]);
|
|
266
313
|
|
|
267
314
|
// Combined ref - shorthand for calling both positionRef and interactionRef
|
|
268
315
|
const ref = useCallback(el => {
|
|
@@ -295,7 +342,16 @@ export function useHoverCard(options = {}) {
|
|
|
295
342
|
layer.show();
|
|
296
343
|
} else {
|
|
297
344
|
clearTimeouts();
|
|
345
|
+
// A consumer closing the card while it holds focus would strand focus on
|
|
346
|
+
// <body>. Arming the re-show guard is what keeps the refocus from
|
|
347
|
+
// reopening the card through `handleFocusIn`, which shows on any focusin.
|
|
348
|
+
const card = typeof document === 'undefined' ? null : document.getElementById(layer.id);
|
|
349
|
+
const hadFocus = card?.contains(document.activeElement) ?? false;
|
|
298
350
|
layer.hide();
|
|
351
|
+
if (hadFocus) {
|
|
352
|
+
isEscapeDismissingRef.current = true;
|
|
353
|
+
triggerRef.current?.focus();
|
|
354
|
+
}
|
|
299
355
|
}
|
|
300
356
|
}, [isOpen, clearTimeouts, layer]);
|
|
301
357
|
|
|
@@ -343,20 +399,6 @@ export function useHoverCard(options = {}) {
|
|
|
343
399
|
isHoveringContentRef.current = false;
|
|
344
400
|
scheduleHide();
|
|
345
401
|
},
|
|
346
|
-
onKeyDown: e => {
|
|
347
|
-
if (e.key === 'Escape') {
|
|
348
|
-
// Stop propagation so parent components don't react to the same Escape
|
|
349
|
-
e.stopPropagation();
|
|
350
|
-
// Set flag to prevent re-show when we refocus trigger
|
|
351
|
-
isEscapeDismissingRef.current = true;
|
|
352
|
-
// Hide immediately
|
|
353
|
-
clearTimeouts();
|
|
354
|
-
touch.clearTapOpen();
|
|
355
|
-
layer.hide();
|
|
356
|
-
// Refocus the trigger
|
|
357
|
-
triggerRef.current?.focus();
|
|
358
|
-
}
|
|
359
|
-
},
|
|
360
402
|
onBlur: e => {
|
|
361
403
|
// Check if focus is moving back to the trigger or staying within content
|
|
362
404
|
const relatedTarget = e.relatedTarget;
|
package/dist/Item/Item.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Item.d.ts","sourceRoot":"","sources":["../../src/Item/Item.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAS,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAU7C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Item.d.ts","sourceRoot":"","sources":["../../src/Item/Item.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAS,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAU7C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAc5C,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,SAAU,SAAQ,SAAS,CAAC,WAAW,CAAC;IACvD,yCAAyC;IACzC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE7B;;;OAGG;IACH,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IAEzB;;;OAGG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAE9B;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAE5C;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAErD;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAE5B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA+LD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,EACnB,EAAE,EAAE,SAAiB,EACrB,MAAM,EACN,YAAY,EACZ,KAAK,EACL,WAAW,EACX,UAAU,EACV,KAAgB,EAChB,OAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,MAAkB,EAClB,OAAO,EACP,cAAc,EACd,IAAI,EACJ,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,YAAY,EACjB,aAAqB,EACrB,UAAkB,EAClB,UAAkB,EAClB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,IAAI,EACJ,GAAG,SAAS,EACb,EAAE,SAAS,+BAqNX;yBA/Oe,IAAI"}
|
package/dist/Item/Item.js
CHANGED
|
@@ -19,7 +19,8 @@ import { useRef } from 'react';
|
|
|
19
19
|
import * as stylex from '@stylexjs/stylex';
|
|
20
20
|
import "../theme/tokens.stylex.js";
|
|
21
21
|
import { colorVars, radiusVars, spacingVars, durationVars, easeVars, typeScaleVars } from "../theme/tokens.stylex.js";
|
|
22
|
-
import { mergeProps
|
|
22
|
+
import { mergeProps } from "../utils/index.js";
|
|
23
|
+
import { useMergedRefs } from "../hooks/useMergedRefs.js";
|
|
23
24
|
import { computeTargetAndRel } from "../Link/computeTargetAndRel.js";
|
|
24
25
|
import { useLinkComponent } from "../Link/useLinkComponent.js";
|
|
25
26
|
import { useClickableContainer } from "../hooks/useClickableContainer.js";
|
|
@@ -352,8 +353,9 @@ export function Item({
|
|
|
352
353
|
children: endContent
|
|
353
354
|
})]
|
|
354
355
|
});
|
|
356
|
+
const mergedRef = useMergedRefs(ref, containerRef);
|
|
355
357
|
return /*#__PURE__*/_jsx(Component, {
|
|
356
|
-
ref: isDelegate ?
|
|
358
|
+
ref: isDelegate ? mergedRef : ref,
|
|
357
359
|
...restProps,
|
|
358
360
|
"aria-selected": allowsAriaSelected && isSelected || undefined
|
|
359
361
|
// aria-selected is invalid on roles that don't permit it (listitem, a
|
package/dist/Kbd/Kbd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.d.ts","sourceRoot":"","sources":["../../src/Kbd/Kbd.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAA6B,MAAM,OAAO,CAAC;AAGlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Kbd.d.ts","sourceRoot":"","sources":["../../src/Kbd/Kbd.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAA6B,MAAM,OAAO,CAAC;AAGlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAmI5C,MAAM,WAAW,QAAS,SAAQ,SAAS,CAAC,eAAe,CAAC;IAC1D,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC;;;;;;;;;;;;OAYG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAC,EAAE,QAAQ,qBAgC3E;yBAhCe,GAAG"}
|
package/dist/Kbd/Kbd.js
CHANGED
|
@@ -101,8 +101,9 @@ function getServerPlatformSnapshot() {
|
|
|
101
101
|
|
|
102
102
|
/**
|
|
103
103
|
* Detects whether the current platform is macOS/iOS.
|
|
104
|
-
* Prefers the User-Agent Client Hints API when
|
|
105
|
-
* falls back to navigator.platform (deprecated but universally
|
|
104
|
+
* Prefers the User-Agent Client Hints API when it names a platform (modern
|
|
105
|
+
* Chrome/Edge), falls back to navigator.platform (deprecated but universally
|
|
106
|
+
* supported) when it is absent or blank.
|
|
106
107
|
*/
|
|
107
108
|
function detectMac() {
|
|
108
109
|
if (typeof navigator === 'undefined') {
|
|
@@ -111,7 +112,13 @@ function detectMac() {
|
|
|
111
112
|
// Prefer User-Agent Client Hints API (not deprecated)
|
|
112
113
|
const uaData = 'userAgentData' in navigator ? navigator.userAgentData : null;
|
|
113
114
|
if (uaData && typeof uaData === 'object' && 'platform' in uaData) {
|
|
114
|
-
|
|
115
|
+
const uaPlatform = uaData.platform;
|
|
116
|
+
// A blank platform is no answer, not a negative one. Builds that rewrite
|
|
117
|
+
// their client-hints identity ship '', so fall through rather than
|
|
118
|
+
// reading it as "not Apple".
|
|
119
|
+
if (typeof uaPlatform === 'string' && uaPlatform.trim() !== '') {
|
|
120
|
+
return /mac/i.test(uaPlatform);
|
|
121
|
+
}
|
|
115
122
|
}
|
|
116
123
|
// Fallback: navigator.platform (deprecated but still shipped everywhere)
|
|
117
124
|
return /Mac|iPhone|iPad|iPod/.test(navigator.platform ?? '');
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file LayerDepthContext.tsx
|
|
3
|
+
* @input React context
|
|
4
|
+
* @output Exports LayerDepthContext, useLayerDepth, LayerDepthProvider
|
|
5
|
+
* @position Layer system; how the dismissal stack learns which layer is nested
|
|
6
|
+
* inside which.
|
|
7
|
+
*
|
|
8
|
+
* SYNC: When modified, update:
|
|
9
|
+
* - /packages/core/src/Layer/index.ts
|
|
10
|
+
* - /packages/core/src/Layer/useLayerDismissal.ts
|
|
11
|
+
*
|
|
12
|
+
* Nesting is read from the React tree rather than the DOM. Two reasons:
|
|
13
|
+
*
|
|
14
|
+
* - **Portals.** A nested overlay routinely renders into `document.body` or the
|
|
15
|
+
* native top layer, so DOM containment reports it as a sibling of the layer
|
|
16
|
+
* it is logically inside. React context flows through `createPortal`, so the
|
|
17
|
+
* tree keeps the relationship the DOM loses.
|
|
18
|
+
* - **Same-commit mounts.** Depth is fixed during render. Effect order is not
|
|
19
|
+
* available then and is misleading anyway: React runs child effects before
|
|
20
|
+
* parent effects, so an inner layer registers first and looks "older" than
|
|
21
|
+
* the outer layer that contains it.
|
|
22
|
+
*
|
|
23
|
+
* There is nothing to mount at the app root: the context defaults to 0, and
|
|
24
|
+
* each layer provides depth for its OWN content, so nesting composes on its own.
|
|
25
|
+
*/
|
|
26
|
+
import { type ReactNode } from 'react';
|
|
27
|
+
/**
|
|
28
|
+
* How many layers deep the current subtree is. 0 at the app root; each layer
|
|
29
|
+
* increments it for its own content.
|
|
30
|
+
*/
|
|
31
|
+
export declare const LayerDepthContext: import("react").Context<number>;
|
|
32
|
+
/**
|
|
33
|
+
* Read the current nesting depth. A layer calls this to learn its OWN depth —
|
|
34
|
+
* the depth of the subtree it is rendered into, before it pushes its content
|
|
35
|
+
* one level deeper.
|
|
36
|
+
*/
|
|
37
|
+
export declare function useLayerDepth(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Wrap a layer's content so any layer opened from inside it registers as
|
|
40
|
+
* nested. Takes no depth prop on purpose: it reads the ambient depth and adds
|
|
41
|
+
* one, so nesting composes without anyone tracking absolute numbers.
|
|
42
|
+
*
|
|
43
|
+
* Renders no DOM element — it is a context boundary only, which is why it takes
|
|
44
|
+
* no `xstyle`/`ref` and exposes no props interface.
|
|
45
|
+
*/
|
|
46
|
+
export declare function LayerDepthProvider({ children }: {
|
|
47
|
+
children: ReactNode;
|
|
48
|
+
}): import("react").JSX.Element;
|
|
49
|
+
export declare namespace LayerDepthProvider {
|
|
50
|
+
var displayName: string;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=LayerDepthContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayerDepthContext.d.ts","sourceRoot":"","sources":["../../src/Layer/LayerDepthContext.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAqB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,iCAAmB,CAAC;AAGlD;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EAAC,QAAQ,EAAC,EAAE;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAC,+BAGnE;yBAHe,kBAAkB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file LayerDepthContext.tsx
|
|
7
|
+
* @input React context
|
|
8
|
+
* @output Exports LayerDepthContext, useLayerDepth, LayerDepthProvider
|
|
9
|
+
* @position Layer system; how the dismissal stack learns which layer is nested
|
|
10
|
+
* inside which.
|
|
11
|
+
*
|
|
12
|
+
* SYNC: When modified, update:
|
|
13
|
+
* - /packages/core/src/Layer/index.ts
|
|
14
|
+
* - /packages/core/src/Layer/useLayerDismissal.ts
|
|
15
|
+
*
|
|
16
|
+
* Nesting is read from the React tree rather than the DOM. Two reasons:
|
|
17
|
+
*
|
|
18
|
+
* - **Portals.** A nested overlay routinely renders into `document.body` or the
|
|
19
|
+
* native top layer, so DOM containment reports it as a sibling of the layer
|
|
20
|
+
* it is logically inside. React context flows through `createPortal`, so the
|
|
21
|
+
* tree keeps the relationship the DOM loses.
|
|
22
|
+
* - **Same-commit mounts.** Depth is fixed during render. Effect order is not
|
|
23
|
+
* available then and is misleading anyway: React runs child effects before
|
|
24
|
+
* parent effects, so an inner layer registers first and looks "older" than
|
|
25
|
+
* the outer layer that contains it.
|
|
26
|
+
*
|
|
27
|
+
* There is nothing to mount at the app root: the context defaults to 0, and
|
|
28
|
+
* each layer provides depth for its OWN content, so nesting composes on its own.
|
|
29
|
+
*/
|
|
30
|
+
import { createContext, use } from 'react';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* How many layers deep the current subtree is. 0 at the app root; each layer
|
|
34
|
+
* increments it for its own content.
|
|
35
|
+
*/
|
|
36
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
37
|
+
export const LayerDepthContext = /*#__PURE__*/createContext(0);
|
|
38
|
+
LayerDepthContext.displayName = 'LayerDepthContext';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Read the current nesting depth. A layer calls this to learn its OWN depth —
|
|
42
|
+
* the depth of the subtree it is rendered into, before it pushes its content
|
|
43
|
+
* one level deeper.
|
|
44
|
+
*/
|
|
45
|
+
export function useLayerDepth() {
|
|
46
|
+
return use(LayerDepthContext);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Wrap a layer's content so any layer opened from inside it registers as
|
|
51
|
+
* nested. Takes no depth prop on purpose: it reads the ambient depth and adds
|
|
52
|
+
* one, so nesting composes without anyone tracking absolute numbers.
|
|
53
|
+
*
|
|
54
|
+
* Renders no DOM element — it is a context boundary only, which is why it takes
|
|
55
|
+
* no `xstyle`/`ref` and exposes no props interface.
|
|
56
|
+
*/
|
|
57
|
+
export function LayerDepthProvider({
|
|
58
|
+
children
|
|
59
|
+
}) {
|
|
60
|
+
const depth = use(LayerDepthContext);
|
|
61
|
+
return /*#__PURE__*/_jsx(LayerDepthContext, {
|
|
62
|
+
value: depth + 1,
|
|
63
|
+
children: children
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
LayerDepthProvider.displayName = 'LayerDepthProvider';
|
package/dist/Layer/index.d.ts
CHANGED
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
*/
|
|
14
14
|
export { useLayer } from './useLayer';
|
|
15
15
|
export type { LayerAlignment, LayerPlacement, ContextRenderProps, FixedRenderProps, ContextLayerOptions, FixedLayerOptions, ContextLayerReturn, FixedLayerReturn, } from './useLayer';
|
|
16
|
+
export { useLayerDismissal } from './useLayerDismissal';
|
|
17
|
+
export type { LayerEscapeBehavior, UseLayerDismissalOptions, UseLayerDismissalReturn, } from './useLayerDismissal';
|
|
18
|
+
export { LayerDepthProvider } from './LayerDepthContext';
|
|
16
19
|
export { useTouchTrigger, isActionTrigger } from './useTouchTrigger';
|
|
17
20
|
export type { LayerTouchTrigger, UseTouchTriggerOptions, UseTouchTriggerReturn, } from './useTouchTrigger';
|
|
18
21
|
export { LayerProvider } from './LayerProvider';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Layer/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AACpC,YAAY,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,MAAM,mBAAmB,CAAC;AACnE,YAAY,EACV,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,YAAY,CAAC;AAC/C,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAC,YAAY,EAAE,SAAS,EAAC,MAAM,cAAc,CAAC;AACrD,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,YAAY,CAAC;AAC/C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Layer/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AACpC,YAAY,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,kBAAkB,EAAC,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,MAAM,mBAAmB,CAAC;AACnE,YAAY,EACV,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,YAAY,CAAC;AAC/C,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAC,YAAY,EAAE,SAAS,EAAC,MAAM,cAAc,CAAC;AACrD,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,YAAY,CAAC;AAC/C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
|
package/dist/Layer/index.js
CHANGED
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
|
|
19
19
|
// Core layer hook (remains in Layer)
|
|
20
20
|
export { useLayer } from "./useLayer.js";
|
|
21
|
+
// Layer dismissal stack — one Escape owner for every overlay family
|
|
22
|
+
export { useLayerDismissal } from "./useLayerDismissal.js";
|
|
23
|
+
export { LayerDepthProvider } from "./LayerDepthContext.js";
|
|
24
|
+
|
|
21
25
|
// Shared touch behavior for the hover layers
|
|
22
26
|
export { useTouchTrigger, isActionTrigger } from "./useTouchTrigger.js";
|
|
23
27
|
// Layer provider
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a layer does with an Escape press that reaches it.
|
|
3
|
+
*
|
|
4
|
+
* - `'close'` — dismiss this layer and consume the press. One Escape closes
|
|
5
|
+
* exactly this layer. The default, and correct for every dismissible layer:
|
|
6
|
+
* modals, popovers, menus, comboboxes, and hover layers alike.
|
|
7
|
+
* - `'block'` — consume the press WITHOUT dismissing. For a layer that requires
|
|
8
|
+
* an explicit choice (`Dialog purpose="required"`): Escape must not dismiss
|
|
9
|
+
* it, and must not fall through and dismiss something behind it either.
|
|
10
|
+
*
|
|
11
|
+
* There is deliberately no "dismiss but let the press continue" variant. Escape
|
|
12
|
+
* affects exactly one layer, always — a rule with no per-component exceptions
|
|
13
|
+
* is one users can predict. Hover layers were the tempting exception (the user
|
|
14
|
+
* never opened the tip, so why should it eat their press?), but guessing wrong
|
|
15
|
+
* that way is destructive: someone dismissing a stray tooltip over a form would
|
|
16
|
+
* lose the whole dialog. Guessing wrong the other way costs one keystroke.
|
|
17
|
+
*/
|
|
18
|
+
export type LayerEscapeBehavior = 'close' | 'block';
|
|
19
|
+
export interface LayerStackEntry {
|
|
20
|
+
/**
|
|
21
|
+
* Identity for removal; also the equality check for top-most, and the key
|
|
22
|
+
* `seq` is assigned against so a layer keeps its place across re-registration.
|
|
23
|
+
*/
|
|
24
|
+
token: object;
|
|
25
|
+
/**
|
|
26
|
+
* Nesting depth from the React tree (see LayerDepthContext), NOT the DOM.
|
|
27
|
+
* Context flows through portals and is known during render, so it is correct
|
|
28
|
+
* for layers that portal out and for an inner + outer layer that open in the
|
|
29
|
+
* same commit — the case where effect order lies, because React runs child
|
|
30
|
+
* effects before parent effects.
|
|
31
|
+
*/
|
|
32
|
+
depth: number;
|
|
33
|
+
/**
|
|
34
|
+
* Monotonic registration order; breaks ties between unrelated layers. For a
|
|
35
|
+
* layer that registers when it opens this is open order; a hover layer
|
|
36
|
+
* registers at mount and answers `isPresent` instead, so for two of those it
|
|
37
|
+
* is mount order rather than which one appeared first.
|
|
38
|
+
*
|
|
39
|
+
* Keyed to `token`, not to the registration, because a layer re-registers
|
|
40
|
+
* whenever its behavior or depth changes and must not overtake the layers
|
|
41
|
+
* above it.
|
|
42
|
+
*/
|
|
43
|
+
seq: number;
|
|
44
|
+
behavior: LayerEscapeBehavior;
|
|
45
|
+
/**
|
|
46
|
+
* The layer's container element, read lazily at press time. Used only to
|
|
47
|
+
* break ties between layers the React tree reports at the same depth — a raw
|
|
48
|
+
* `useFocusTrap` cannot wrap its content in a depth provider (it renders
|
|
49
|
+
* nothing), so DOM containment is the only nesting signal those have.
|
|
50
|
+
*/
|
|
51
|
+
getContainer?: () => HTMLElement | null;
|
|
52
|
+
/**
|
|
53
|
+
* Whether the layer is really on screen right now, asked at press time.
|
|
54
|
+
*
|
|
55
|
+
* Registration alone is not proof: a layer whose open state lives in React
|
|
56
|
+
* state can lag a frame behind the DOM, so gating registration on that state
|
|
57
|
+
* drops presses that arrive in the gap. Such layers register for their whole
|
|
58
|
+
* lifetime and answer this from the DOM instead. Omit it to mean "registered
|
|
59
|
+
* means present", which is true for layers that register on open.
|
|
60
|
+
*/
|
|
61
|
+
isPresent?: () => boolean;
|
|
62
|
+
dismiss: () => void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Whether the user is part-way through composing text with an IME.
|
|
66
|
+
*
|
|
67
|
+
* The stack reads this to decide what an Escape means, and layers read it
|
|
68
|
+
* through `useLayerDismissal`'s `shouldDismissOnCloseRequest` for the close
|
|
69
|
+
* requests that arrive without a keydown to inspect — the Android back
|
|
70
|
+
* gesture, the platform close watcher, or a composing Escape whose keydown
|
|
71
|
+
* never reached this listener because content stopped it. Mid-composition,
|
|
72
|
+
* those are far more likely to be the user backing out of a half-formed
|
|
73
|
+
* character than a request to dismiss a layer, and guessing wrong that way
|
|
74
|
+
* costs them everything they have typed into it.
|
|
75
|
+
*
|
|
76
|
+
* Scope, deliberately page-wide: a composition in a field behind a non-modal
|
|
77
|
+
* layer also suppresses that layer's close requests. It is one keypress to
|
|
78
|
+
* recover from, and the alternative — matching the composing element against
|
|
79
|
+
* a layer's container — cannot work for the layers that do not have one.
|
|
80
|
+
*
|
|
81
|
+
* A composition already running when the first layer registers is invisible
|
|
82
|
+
* here: the listeners go on with the stack's own.
|
|
83
|
+
*/
|
|
84
|
+
export declare function isTextComposing(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Whether `token` identifies the top-most layer. Overlays that still own a
|
|
87
|
+
* dismissal channel the stack does not model yet (outside-press, swipe) can
|
|
88
|
+
* gate on this so every channel agrees on who is on top.
|
|
89
|
+
*/
|
|
90
|
+
export declare function isTopmostLayer(token: object): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Add a layer to the stack for as long as it is active. Returns the unregister
|
|
93
|
+
* function; callers own calling it.
|
|
94
|
+
*/
|
|
95
|
+
export declare function registerLayer(entry: Omit<LayerStackEntry, 'seq'>): () => void;
|
|
96
|
+
/** Test-only: drop all entries and detach the listener. */
|
|
97
|
+
export declare function resetLayerStackForTests(): void;
|
|
98
|
+
//# sourceMappingURL=layerStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layerStack.d.ts","sourceRoot":"","sources":["../../src/Layer/layerStack.ts"],"names":[],"mappings":"AAoEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,mBAAmB,CAAC;IAC9B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACxC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA2ED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AA2BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAwED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAc7E;AAED,2DAA2D;AAC3D,wBAAgB,uBAAuB,IAAI,IAAI,CAM9C"}
|