@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f
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 +161 -1
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- 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/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +40 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +51 -18
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +14 -15
- 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/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +6 -9
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +6 -6
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -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/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- 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 +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +82 -23
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- 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/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- 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 +2 -19
- 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/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +9 -4
- 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 +182 -32
- 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 +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +63 -11
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- 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 +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- 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 +17 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +81 -14
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- 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 +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- 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 +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- 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/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- 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 +9 -3
- 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/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +27 -8
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +3 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +2 -0
- 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/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +68 -29
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +98 -7
- 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 +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- 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/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- 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 +154 -10
- package/locales/pseudo.json +108 -0
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- 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 +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +13 -11
- package/src/Banner/Banner.test.tsx +102 -15
- package/src/Banner/Banner.tsx +72 -25
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +4 -3
- package/src/Calendar/Calendar.test.tsx +103 -0
- package/src/Calendar/Calendar.tsx +19 -16
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +44 -19
- package/src/Card/Card.tsx +12 -32
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- 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/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- 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.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- 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 +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- 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/useLayer.test.tsx +62 -14
- 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/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.tsx +9 -4
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +277 -0
- package/src/MultiSelector/MultiSelector.tsx +142 -11
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.tsx +3 -2
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/usePopover.tsx +31 -28
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- 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 +26 -1
- package/src/Selector/Selector.test.tsx +311 -1
- package/src/Selector/Selector.tsx +139 -16
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- 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.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- 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/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- 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.doc.mjs +8 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +15 -8
- 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.test.tsx +18 -0
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Toast/ToastViewport.tsx +17 -1
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
- package/src/Tokenizer/Tokenizer.tsx +4 -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/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.tsx +3 -2
- package/src/TopNav/TopNavMenu.tsx +4 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
- package/src/Typeahead/BaseTypeahead.tsx +85 -33
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.test.tsx +49 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- 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/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/derivedVarRegistry.test.ts +19 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +37 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
package/src/Kbd/Kbd.tsx
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import React, {useSyncExternalStore} from 'react';
|
|
17
17
|
import * as stylex from '@stylexjs/stylex';
|
|
18
18
|
import {mergeProps} from '../utils';
|
|
19
|
+
import {isApplePlatform} from '../utils/isApplePlatform';
|
|
19
20
|
import type {BaseProps} from '../BaseProps';
|
|
20
21
|
import {themeProps} from '../utils/themeProps';
|
|
21
22
|
import {
|
|
@@ -122,24 +123,6 @@ function getServerPlatformSnapshot(): boolean {
|
|
|
122
123
|
return false;
|
|
123
124
|
}
|
|
124
125
|
|
|
125
|
-
/**
|
|
126
|
-
* Detects whether the current platform is macOS/iOS.
|
|
127
|
-
* Prefers the User-Agent Client Hints API when available (modern Chrome/Edge),
|
|
128
|
-
* falls back to navigator.platform (deprecated but universally supported).
|
|
129
|
-
*/
|
|
130
|
-
function detectMac(): boolean {
|
|
131
|
-
if (typeof navigator === 'undefined') {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
// Prefer User-Agent Client Hints API (not deprecated)
|
|
135
|
-
const uaData = 'userAgentData' in navigator ? navigator.userAgentData : null;
|
|
136
|
-
if (uaData && typeof uaData === 'object' && 'platform' in uaData) {
|
|
137
|
-
return /mac/i.test((uaData as {platform: string}).platform ?? '');
|
|
138
|
-
}
|
|
139
|
-
// Fallback: navigator.platform (deprecated but still shipped everywhere)
|
|
140
|
-
return /Mac|iPhone|iPad|iPod/.test(navigator.platform ?? '');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
126
|
export interface KbdProps extends BaseProps<HTMLSpanElement> {
|
|
144
127
|
ref?: React.Ref<HTMLSpanElement>;
|
|
145
128
|
/**
|
|
@@ -176,7 +159,7 @@ export interface KbdProps extends BaseProps<HTMLSpanElement> {
|
|
|
176
159
|
export function Kbd({keys, ref, xstyle, className, style, ...rest}: KbdProps) {
|
|
177
160
|
const isMac = useSyncExternalStore(
|
|
178
161
|
subscribeToPlatformChanges,
|
|
179
|
-
|
|
162
|
+
isApplePlatform,
|
|
180
163
|
getServerPlatformSnapshot,
|
|
181
164
|
);
|
|
182
165
|
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
|
|
31
|
+
import {createContext, use, type ReactNode} from 'react';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* How many layers deep the current subtree is. 0 at the app root; each layer
|
|
35
|
+
* increments it for its own content.
|
|
36
|
+
*/
|
|
37
|
+
export const LayerDepthContext = 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(): number {
|
|
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({children}: {children: ReactNode}) {
|
|
58
|
+
const depth = use(LayerDepthContext);
|
|
59
|
+
return <LayerDepthContext value={depth + 1}>{children}</LayerDepthContext>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
LayerDepthProvider.displayName = 'LayerDepthProvider';
|
package/src/Layer/index.ts
CHANGED
|
@@ -29,6 +29,15 @@ export type {
|
|
|
29
29
|
FixedLayerReturn,
|
|
30
30
|
} from './useLayer';
|
|
31
31
|
|
|
32
|
+
// Layer dismissal stack — one Escape owner for every overlay family
|
|
33
|
+
export {useLayerDismissal} from './useLayerDismissal';
|
|
34
|
+
export type {
|
|
35
|
+
LayerEscapeBehavior,
|
|
36
|
+
UseLayerDismissalOptions,
|
|
37
|
+
UseLayerDismissalReturn,
|
|
38
|
+
} from './useLayerDismissal';
|
|
39
|
+
export {LayerDepthProvider} from './LayerDepthContext';
|
|
40
|
+
|
|
32
41
|
// Shared touch behavior for the hover layers
|
|
33
42
|
export {useTouchTrigger, isActionTrigger} from './useTouchTrigger';
|
|
34
43
|
export type {
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file layerDismissalFamilies.test.tsx
|
|
5
|
+
* @input Uses vitest, @testing-library/react, Dialog, Lightbox, MobileNav,
|
|
6
|
+
* HoverCard, Tooltip
|
|
7
|
+
* @output Tests that every overlay family shares the one dismissal stack
|
|
8
|
+
* @position Colocated with layerStack; the families' own behavior is tested in
|
|
9
|
+
* their own files, this one only asks who takes the press
|
|
10
|
+
*
|
|
11
|
+
* The stack routes an Escape press to the top-most REGISTERED layer and
|
|
12
|
+
* preventDefault()s it, so a family that is not on the stack cannot be reached
|
|
13
|
+
* once anything else is. Lightbox and MobileNav were that gap: both closed via
|
|
14
|
+
* the native `cancel` event alone, and a `required` Dialog underneath swallowed
|
|
15
|
+
* every press before it got there.
|
|
16
|
+
*
|
|
17
|
+
* SYNC: When a new overlay family joins the stack, add it here.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
describe,
|
|
22
|
+
it,
|
|
23
|
+
expect,
|
|
24
|
+
vi,
|
|
25
|
+
beforeAll,
|
|
26
|
+
beforeEach,
|
|
27
|
+
afterAll,
|
|
28
|
+
afterEach,
|
|
29
|
+
} from 'vitest';
|
|
30
|
+
import {render, screen} from '@testing-library/react';
|
|
31
|
+
|
|
32
|
+
import {Dialog} from '../Dialog/Dialog';
|
|
33
|
+
import {HoverCard} from '../HoverCard/HoverCard';
|
|
34
|
+
import {Lightbox} from '../Lightbox/Lightbox';
|
|
35
|
+
import {MobileNav} from '../MobileNav/MobileNav';
|
|
36
|
+
import {Tooltip} from '../Tooltip/Tooltip';
|
|
37
|
+
import {resetLayerStackForTests} from './layerStack';
|
|
38
|
+
|
|
39
|
+
const originalMatches = HTMLElement.prototype.matches;
|
|
40
|
+
const popoverOpenState = new WeakMap<HTMLElement, boolean>();
|
|
41
|
+
|
|
42
|
+
// jsdom implements no Popover API, and the hover layers answer `isPresent`
|
|
43
|
+
// from `:popover-open`.
|
|
44
|
+
beforeAll(() => {
|
|
45
|
+
HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
|
|
46
|
+
popoverOpenState.set(this, true);
|
|
47
|
+
});
|
|
48
|
+
HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
|
|
49
|
+
popoverOpenState.set(this, false);
|
|
50
|
+
});
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
(HTMLElement.prototype as any).matches = function (
|
|
53
|
+
selector: string,
|
|
54
|
+
): boolean {
|
|
55
|
+
if (selector === ':popover-open') {
|
|
56
|
+
return popoverOpenState.get(this) ?? false;
|
|
57
|
+
}
|
|
58
|
+
return originalMatches.call(this, selector);
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
afterAll(() => {
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
(HTMLElement.prototype as any).matches = originalMatches;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// jsdom does not implement showModal/close.
|
|
68
|
+
beforeEach(() => {
|
|
69
|
+
vi.mocked(HTMLElement.prototype.showPopover).mockClear();
|
|
70
|
+
vi.mocked(HTMLElement.prototype.hidePopover).mockClear();
|
|
71
|
+
HTMLDialogElement.prototype.showModal = vi.fn(function (
|
|
72
|
+
this: HTMLDialogElement,
|
|
73
|
+
) {
|
|
74
|
+
this.setAttribute('open', '');
|
|
75
|
+
});
|
|
76
|
+
HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
|
|
77
|
+
this.removeAttribute('open');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
afterEach(() => {
|
|
82
|
+
resetLayerStackForTests();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
function pressEscape(): KeyboardEvent {
|
|
86
|
+
const event = new KeyboardEvent('keydown', {
|
|
87
|
+
key: 'Escape',
|
|
88
|
+
bubbles: true,
|
|
89
|
+
cancelable: true,
|
|
90
|
+
});
|
|
91
|
+
document.dispatchEvent(event);
|
|
92
|
+
return event;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function fireCancel(dialog: Element): Event {
|
|
96
|
+
const event = new Event('cancel', {bubbles: false, cancelable: true});
|
|
97
|
+
dialog.dispatchEvent(event);
|
|
98
|
+
return event;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const getDialog = (label: string) =>
|
|
102
|
+
screen
|
|
103
|
+
.getAllByRole('dialog', {hidden: true})
|
|
104
|
+
.find(d => d.getAttribute('aria-label') === label)!;
|
|
105
|
+
|
|
106
|
+
const MEDIA = {src: '/photo.jpg', alt: 'A photo'};
|
|
107
|
+
|
|
108
|
+
describe('overlay families on the shared dismissal stack', () => {
|
|
109
|
+
describe('Lightbox', () => {
|
|
110
|
+
it('takes the Escape when it is open over a required Dialog', () => {
|
|
111
|
+
const onLightboxChange = vi.fn();
|
|
112
|
+
const onDialogChange = vi.fn();
|
|
113
|
+
|
|
114
|
+
render(
|
|
115
|
+
<Dialog
|
|
116
|
+
isOpen={true}
|
|
117
|
+
onOpenChange={onDialogChange}
|
|
118
|
+
purpose="required"
|
|
119
|
+
aria-label="Required">
|
|
120
|
+
Choose one
|
|
121
|
+
<Lightbox
|
|
122
|
+
isOpen={true}
|
|
123
|
+
onOpenChange={onLightboxChange}
|
|
124
|
+
media={MEDIA}
|
|
125
|
+
/>
|
|
126
|
+
</Dialog>,
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const event = pressEscape();
|
|
130
|
+
|
|
131
|
+
expect(onLightboxChange).toHaveBeenCalledWith(false);
|
|
132
|
+
expect(onDialogChange).not.toHaveBeenCalled();
|
|
133
|
+
expect(event.defaultPrevented).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('closes on a browser-initiated cancel when it is top-most', () => {
|
|
137
|
+
const onOpenChange = vi.fn();
|
|
138
|
+
render(
|
|
139
|
+
<Lightbox isOpen={true} onOpenChange={onOpenChange} media={MEDIA} />,
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
const event = fireCancel(screen.getByRole('dialog', {hidden: true}));
|
|
143
|
+
|
|
144
|
+
expect(event.defaultPrevented).toBe(true);
|
|
145
|
+
expect(onOpenChange).toHaveBeenCalledWith(false);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('stays open on a browser-initiated cancel when it is not top-most', () => {
|
|
149
|
+
const onLightboxChange = vi.fn();
|
|
150
|
+
|
|
151
|
+
render(
|
|
152
|
+
<>
|
|
153
|
+
<Lightbox
|
|
154
|
+
isOpen={true}
|
|
155
|
+
onOpenChange={onLightboxChange}
|
|
156
|
+
media={MEDIA}
|
|
157
|
+
/>
|
|
158
|
+
<Dialog isOpen={true} onOpenChange={() => {}} aria-label="Above">
|
|
159
|
+
Above
|
|
160
|
+
</Dialog>
|
|
161
|
+
</>,
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const event = fireCancel(getDialog('A photo'));
|
|
165
|
+
|
|
166
|
+
expect(event.defaultPrevented).toBe(true);
|
|
167
|
+
expect(onLightboxChange).not.toHaveBeenCalled();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
describe('MobileNav', () => {
|
|
172
|
+
it('takes the Escape when it opens over a required Dialog', () => {
|
|
173
|
+
const onNavChange = vi.fn();
|
|
174
|
+
const onDialogChange = vi.fn();
|
|
175
|
+
|
|
176
|
+
render(
|
|
177
|
+
<>
|
|
178
|
+
<Dialog
|
|
179
|
+
isOpen={true}
|
|
180
|
+
onOpenChange={onDialogChange}
|
|
181
|
+
purpose="required"
|
|
182
|
+
aria-label="Required">
|
|
183
|
+
Choose one
|
|
184
|
+
</Dialog>
|
|
185
|
+
<MobileNav isOpen={true} onOpenChange={onNavChange} label="Drawer">
|
|
186
|
+
<span>Nav content</span>
|
|
187
|
+
</MobileNav>
|
|
188
|
+
</>,
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
const event = pressEscape();
|
|
192
|
+
|
|
193
|
+
expect(onNavChange).toHaveBeenCalledWith(false);
|
|
194
|
+
expect(onDialogChange).not.toHaveBeenCalled();
|
|
195
|
+
expect(event.defaultPrevented).toBe(true);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('closes on a browser-initiated cancel when it is top-most', () => {
|
|
199
|
+
const onOpenChange = vi.fn();
|
|
200
|
+
render(
|
|
201
|
+
<MobileNav isOpen={true} onOpenChange={onOpenChange} label="Drawer">
|
|
202
|
+
<span>Nav content</span>
|
|
203
|
+
</MobileNav>,
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
const event = fireCancel(getDialog('Drawer'));
|
|
207
|
+
|
|
208
|
+
expect(event.defaultPrevented).toBe(true);
|
|
209
|
+
expect(onOpenChange).toHaveBeenCalledWith(false);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('stays open on a browser-initiated cancel when it is not top-most', () => {
|
|
213
|
+
const onNavChange = vi.fn();
|
|
214
|
+
|
|
215
|
+
render(
|
|
216
|
+
<MobileNav isOpen={true} onOpenChange={onNavChange} label="Drawer">
|
|
217
|
+
<span>Nav content</span>
|
|
218
|
+
<Dialog isOpen={true} onOpenChange={() => {}} aria-label="Above">
|
|
219
|
+
Above
|
|
220
|
+
</Dialog>
|
|
221
|
+
</MobileNav>,
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
const event = fireCancel(getDialog('Drawer'));
|
|
225
|
+
|
|
226
|
+
expect(event.defaultPrevented).toBe(true);
|
|
227
|
+
expect(onNavChange).not.toHaveBeenCalled();
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
describe('required Dialog', () => {
|
|
232
|
+
it('still swallows an Escape when it is alone', () => {
|
|
233
|
+
const onDialogChange = vi.fn();
|
|
234
|
+
|
|
235
|
+
render(
|
|
236
|
+
<Dialog
|
|
237
|
+
isOpen={true}
|
|
238
|
+
onOpenChange={onDialogChange}
|
|
239
|
+
purpose="required"
|
|
240
|
+
aria-label="Required">
|
|
241
|
+
Choose one
|
|
242
|
+
</Dialog>,
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
const event = pressEscape();
|
|
246
|
+
|
|
247
|
+
expect(onDialogChange).not.toHaveBeenCalled();
|
|
248
|
+
expect(event.defaultPrevented).toBe(true);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('still swallows an Escape with a Lightbox open UNDER it', () => {
|
|
252
|
+
const onLightboxChange = vi.fn();
|
|
253
|
+
const onDialogChange = vi.fn();
|
|
254
|
+
|
|
255
|
+
render(
|
|
256
|
+
<>
|
|
257
|
+
<Lightbox
|
|
258
|
+
isOpen={true}
|
|
259
|
+
onOpenChange={onLightboxChange}
|
|
260
|
+
media={MEDIA}
|
|
261
|
+
/>
|
|
262
|
+
<Dialog
|
|
263
|
+
isOpen={true}
|
|
264
|
+
onOpenChange={onDialogChange}
|
|
265
|
+
purpose="required"
|
|
266
|
+
aria-label="Required">
|
|
267
|
+
Choose one
|
|
268
|
+
</Dialog>
|
|
269
|
+
</>,
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
pressEscape();
|
|
273
|
+
|
|
274
|
+
expect(onDialogChange).not.toHaveBeenCalled();
|
|
275
|
+
expect(onLightboxChange).not.toHaveBeenCalled();
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// Controlled follows control state for `isOpen`: Escape still attempts the
|
|
280
|
+
// close, but only the caller's update function may perform it. Dialog has
|
|
281
|
+
// always worked this way; these two now do too.
|
|
282
|
+
describe('controlled hover layers', () => {
|
|
283
|
+
it('a controlled HoverCard takes the press and reports instead of hiding', () => {
|
|
284
|
+
const onCardChange = vi.fn();
|
|
285
|
+
const onDialogChange = vi.fn();
|
|
286
|
+
|
|
287
|
+
render(
|
|
288
|
+
<Dialog isOpen={true} onOpenChange={onDialogChange} aria-label="Host">
|
|
289
|
+
<HoverCard
|
|
290
|
+
isOpen={true}
|
|
291
|
+
onOpenChange={onCardChange}
|
|
292
|
+
content={<span>Pinned card</span>}>
|
|
293
|
+
<button type="button">Trigger</button>
|
|
294
|
+
</HoverCard>
|
|
295
|
+
</Dialog>,
|
|
296
|
+
);
|
|
297
|
+
onCardChange.mockClear();
|
|
298
|
+
vi.mocked(HTMLElement.prototype.hidePopover).mockClear();
|
|
299
|
+
|
|
300
|
+
const event = pressEscape();
|
|
301
|
+
|
|
302
|
+
expect(onCardChange).toHaveBeenCalledWith(false);
|
|
303
|
+
expect(HTMLElement.prototype.hidePopover).not.toHaveBeenCalled();
|
|
304
|
+
expect(onDialogChange).not.toHaveBeenCalled();
|
|
305
|
+
expect(event.defaultPrevented).toBe(true);
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it('a controlled Tooltip takes the press and reports instead of hiding', () => {
|
|
309
|
+
const onTipChange = vi.fn();
|
|
310
|
+
const onDialogChange = vi.fn();
|
|
311
|
+
|
|
312
|
+
render(
|
|
313
|
+
<Dialog isOpen={true} onOpenChange={onDialogChange} aria-label="Host">
|
|
314
|
+
<Tooltip
|
|
315
|
+
isOpen={true}
|
|
316
|
+
onOpenChange={onTipChange}
|
|
317
|
+
content="Pinned tip">
|
|
318
|
+
<button type="button">Trigger</button>
|
|
319
|
+
</Tooltip>
|
|
320
|
+
</Dialog>,
|
|
321
|
+
);
|
|
322
|
+
onTipChange.mockClear();
|
|
323
|
+
vi.mocked(HTMLElement.prototype.hidePopover).mockClear();
|
|
324
|
+
|
|
325
|
+
const event = pressEscape();
|
|
326
|
+
|
|
327
|
+
expect(onTipChange).toHaveBeenCalledWith(false);
|
|
328
|
+
expect(HTMLElement.prototype.hidePopover).not.toHaveBeenCalled();
|
|
329
|
+
expect(onDialogChange).not.toHaveBeenCalled();
|
|
330
|
+
expect(event.defaultPrevented).toBe(true);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('leaves the Dialog unclosable when the consumer discards the request', () => {
|
|
334
|
+
// The round-6 regression, now by consumer choice rather than by ours: a
|
|
335
|
+
// layer that holds itself open and ignores its own change handler keeps
|
|
336
|
+
// taking the press, and nothing behind it can be reached.
|
|
337
|
+
const onCardChange = vi.fn();
|
|
338
|
+
const onDialogChange = vi.fn();
|
|
339
|
+
|
|
340
|
+
render(
|
|
341
|
+
<Dialog isOpen={true} onOpenChange={onDialogChange} aria-label="Host">
|
|
342
|
+
<HoverCard
|
|
343
|
+
isOpen={true}
|
|
344
|
+
onOpenChange={onCardChange}
|
|
345
|
+
content={<span>Stuck card</span>}>
|
|
346
|
+
<button type="button">Trigger</button>
|
|
347
|
+
</HoverCard>
|
|
348
|
+
</Dialog>,
|
|
349
|
+
);
|
|
350
|
+
onCardChange.mockClear();
|
|
351
|
+
|
|
352
|
+
pressEscape();
|
|
353
|
+
pressEscape();
|
|
354
|
+
|
|
355
|
+
expect(onCardChange).toHaveBeenCalledTimes(2);
|
|
356
|
+
expect(onDialogChange).not.toHaveBeenCalled();
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
});
|