@astryxdesign/core 0.4.7 → 0.5.0-canary.32a62fd
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/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 +5 -4
- 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 +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/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 +477 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +38 -4
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- 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 +7 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +89 -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 +52 -3
- package/dist/HoverCard/useHoverCard.d.ts +16 -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/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 +177 -29
- 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/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 +1 -0
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +27 -37
- package/dist/NumberInput/numberParser.d.ts +43 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +293 -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 +19 -9
- 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.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/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 +3 -3
- 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/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/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 +94 -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 +31 -7
- package/locales/pseudo.json +18 -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 +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 +22 -0
- package/src/Button/Button.test.tsx +13 -0
- package/src/Button/Button.tsx +5 -4
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +391 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- 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/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 +68 -9
- package/src/DateInput/NativeDateField.test.tsx +565 -0
- package/src/DateInput/NativeDateField.tsx +623 -0
- package/src/DateInput/TouchDateField.tsx +38 -4
- package/src/DateInput/index.ts +1 -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 +261 -1
- package/src/Dialog/Dialog.tsx +109 -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 +101 -4
- package/src/HoverCard/HoverCard.tsx +71 -3
- package/src/HoverCard/useHoverCard.tsx +101 -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/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/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 +145 -2
- package/src/Markdown/parser.ts +244 -29
- 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 +106 -0
- package/src/MultiSelector/MultiSelector.tsx +50 -6
- 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 +20 -0
- package/src/NumberInput/NumberInput.tsx +28 -29
- package/src/NumberInput/numberParser.test.ts +137 -0
- package/src/NumberInput/numberParser.ts +346 -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/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 +201 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +47 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +15 -0
- 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 +12 -1
- package/src/Selector/Selector.test.tsx +45 -1
- 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/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.tsx +3 -2
- 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/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.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- 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/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
|
@@ -31,8 +31,8 @@ import {
|
|
|
31
31
|
type LayerTouchTrigger,
|
|
32
32
|
} from '../Layer/useTouchTrigger';
|
|
33
33
|
import {layerAnimations} from '../Layer/layerAnimations.stylex';
|
|
34
|
+
import {useLayerDismissal} from '../Layer/useLayerDismissal';
|
|
34
35
|
import {themeProps} from '../utils/themeProps';
|
|
35
|
-
import {isImeKeyEvent} from '../utils/ime';
|
|
36
36
|
import {
|
|
37
37
|
colorVars,
|
|
38
38
|
radiusVars,
|
|
@@ -144,6 +144,11 @@ export interface TooltipOptions {
|
|
|
144
144
|
* - `true`: force-show the tooltip (hover/focus hide is suppressed)
|
|
145
145
|
* - `false`: force-hide the tooltip
|
|
146
146
|
* - `undefined`: uncontrolled — hover/focus triggers manage visibility
|
|
147
|
+
*
|
|
148
|
+
* A controlled tooltip still takes Escape when it is the top-most layer, and
|
|
149
|
+
* answers by calling `onHide` without hiding itself — closing is your
|
|
150
|
+
* update's decision, exactly as for a controlled Dialog. Ignore the call and
|
|
151
|
+
* the tip stays, and so does the press: nothing underneath dismisses.
|
|
147
152
|
*/
|
|
148
153
|
isOpen?: boolean;
|
|
149
154
|
|
|
@@ -518,34 +523,52 @@ export function useTooltip(options: TooltipOptions = {}): TooltipReturn {
|
|
|
518
523
|
}
|
|
519
524
|
}, [isOpen, clearTimeouts, layer]);
|
|
520
525
|
|
|
521
|
-
// Dismiss on Escape (WCAG 1.4.13 — dismissible)
|
|
522
|
-
//
|
|
523
|
-
//
|
|
524
|
-
//
|
|
525
|
-
//
|
|
526
|
-
//
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
526
|
+
// Dismiss on Escape (WCAG 1.4.13 — dismissible) through the shared layer
|
|
527
|
+
// stack. A visible tip is the top-most layer, so it takes the press and
|
|
528
|
+
// consumes it: Escape hides the tip and leaves the dialog underneath open.
|
|
529
|
+
// The user presses Escape again to close that. Consuming (rather than also
|
|
530
|
+
// dismissing what is beneath) keeps one rule with no per-component
|
|
531
|
+
// exceptions, and the failure mode is one extra keystroke instead of a
|
|
532
|
+
// dialog closing under someone who only wanted the tip gone.
|
|
533
|
+
//
|
|
534
|
+
// A controlled tooltip stays on the stack and takes the press like any other
|
|
535
|
+
// layer, but answers it by reporting instead of hiding: `isOpen` is the
|
|
536
|
+
// consumer's value, so only their update may change it. Same contract as a
|
|
537
|
+
// controlled Dialog.
|
|
538
|
+
useLayerDismissal({
|
|
539
|
+
// Registered for the hook's lifetime rather than gated on `layer.isOpen`:
|
|
540
|
+
// that state can lag a frame behind the DOM, so a press arriving right after
|
|
541
|
+
// the layer appears would find nothing registered. Because this layer
|
|
542
|
+
// CONSUMES the press, a stale registration would be worse than a missed one
|
|
543
|
+
// — it would silently eat Escapes meant for the dialog underneath — so
|
|
544
|
+
// presence is answered from the DOM at press time instead of from state.
|
|
545
|
+
isActive: true,
|
|
546
|
+
isPresent: () => {
|
|
547
|
+
const el =
|
|
548
|
+
typeof document === 'undefined'
|
|
549
|
+
? null
|
|
550
|
+
: document.getElementById(layer.id);
|
|
551
|
+
if (el == null) {
|
|
552
|
+
return false;
|
|
534
553
|
}
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
554
|
+
try {
|
|
555
|
+
return el.matches(':popover-open');
|
|
556
|
+
} catch {
|
|
557
|
+
// Browsers without the Popover API (and some test environments) cannot
|
|
558
|
+
// answer the selector; fall back to the hook's own state.
|
|
559
|
+
return layer.isOpen;
|
|
539
560
|
}
|
|
561
|
+
},
|
|
562
|
+
onDismiss: () => {
|
|
540
563
|
clearTimeouts();
|
|
541
564
|
clearTapOpen();
|
|
565
|
+
if (isOpen !== undefined) {
|
|
566
|
+
onHide?.();
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
542
569
|
layer.hide();
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
return () => {
|
|
546
|
-
document.removeEventListener('keydown', handleKeyDown);
|
|
547
|
-
};
|
|
548
|
-
}, [isOpen, layer, clearTimeouts, clearTapOpen]);
|
|
570
|
+
},
|
|
571
|
+
});
|
|
549
572
|
|
|
550
573
|
// Render function that wraps layer.render with tooltip styling
|
|
551
574
|
const renderTooltip = useCallback(
|
|
@@ -34,7 +34,8 @@ import {Link} from '../Link';
|
|
|
34
34
|
import {Icon} from '../Icon';
|
|
35
35
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
36
36
|
import type {LinkComponentType} from '../Link/types';
|
|
37
|
-
import {mergeProps
|
|
37
|
+
import {mergeProps} from '../utils';
|
|
38
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
38
39
|
import type {BaseProps} from '../BaseProps';
|
|
39
40
|
import {useMenuHover} from '../hooks/useMenuHover';
|
|
40
41
|
import {NavHeadingCloseContext} from '../NavMenu/NavMenuContext';
|
|
@@ -53,7 +54,7 @@ const styles = stylex.create({
|
|
|
53
54
|
minHeight: spacingVars['--spacing-8'],
|
|
54
55
|
paddingInlineStart: {
|
|
55
56
|
default: spacingVars['--spacing-2'],
|
|
56
|
-
':has(.astryx-
|
|
57
|
+
':has(.astryx-nav-icon)': 0,
|
|
57
58
|
},
|
|
58
59
|
paddingInlineEnd: spacingVars['--spacing-2'],
|
|
59
60
|
paddingBlock: 0,
|
|
@@ -189,7 +190,7 @@ const styles = stylex.create({
|
|
|
189
190
|
minHeight: spacingVars['--spacing-8'],
|
|
190
191
|
paddingInlineStart: {
|
|
191
192
|
default: spacingVars['--spacing-2'],
|
|
192
|
-
':has(.astryx-
|
|
193
|
+
':has(.astryx-nav-icon)': 0,
|
|
193
194
|
},
|
|
194
195
|
paddingInlineEnd: spacingVars['--spacing-2'],
|
|
195
196
|
paddingBlock: 0,
|
|
@@ -363,7 +364,7 @@ export function TopNavHeading({
|
|
|
363
364
|
// setTriggerEl belongs on the chevron button, not this root: it is the
|
|
364
365
|
// focus-restore target and a <div> cannot take focus. triggerRef stays here
|
|
365
366
|
// because the panel anchors to the whole heading.
|
|
366
|
-
const setRef =
|
|
367
|
+
const setRef = useMergedRefs<HTMLElement>(
|
|
367
368
|
rootRef,
|
|
368
369
|
ref,
|
|
369
370
|
menu ? popover.triggerRef : undefined,
|
|
@@ -53,7 +53,7 @@ import {usePopover} from '../Popover/usePopover';
|
|
|
53
53
|
import {useMenuHover} from '../hooks/useMenuHover';
|
|
54
54
|
import {Grid} from '../Grid/Grid';
|
|
55
55
|
import {Icon} from '../Icon';
|
|
56
|
-
import {mergeProps
|
|
56
|
+
import {mergeProps} from '../utils';
|
|
57
57
|
import type {BaseProps} from '../BaseProps';
|
|
58
58
|
import {navItemStyles} from '../NavItem/navItemStyles.stylex';
|
|
59
59
|
import {useTopNavSlot} from './TopNavContext';
|
|
@@ -61,6 +61,7 @@ import {useTopNavRenderMode} from './TopNavRenderContext';
|
|
|
61
61
|
import {themeProps} from '../utils/themeProps';
|
|
62
62
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
63
63
|
|
|
64
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
64
65
|
// =============================================================================
|
|
65
66
|
// Styles
|
|
66
67
|
// =============================================================================
|
|
@@ -451,7 +452,7 @@ function DefaultMegaMenu({
|
|
|
451
452
|
return (
|
|
452
453
|
<>
|
|
453
454
|
<button
|
|
454
|
-
ref={
|
|
455
|
+
ref={useMergedRefs(triggerButtonRef, setTriggerEl, ref)}
|
|
455
456
|
type="button"
|
|
456
457
|
{...popover.triggerProps}
|
|
457
458
|
{...hoverTriggerProps}
|
|
@@ -29,7 +29,8 @@ import {useMenuHover} from '../hooks/useMenuHover';
|
|
|
29
29
|
import {useListFocus} from '../hooks/useListFocus';
|
|
30
30
|
import {useTypeahead} from '../hooks/useTypeahead';
|
|
31
31
|
import {Icon} from '../Icon';
|
|
32
|
-
import {mergeProps
|
|
32
|
+
import {mergeProps} from '../utils';
|
|
33
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
33
34
|
import type {BaseProps} from '../BaseProps';
|
|
34
35
|
import {navItemStyles} from '../NavItem/navItemStyles.stylex';
|
|
35
36
|
import {useTopNavSlot} from './TopNavContext';
|
|
@@ -361,7 +362,7 @@ export function TopNavMenu({
|
|
|
361
362
|
popoverId: popover.id,
|
|
362
363
|
});
|
|
363
364
|
|
|
364
|
-
const setTriggerRef =
|
|
365
|
+
const setTriggerRef = useMergedRefs<HTMLButtonElement>(
|
|
365
366
|
triggerButtonRef,
|
|
366
367
|
popover.triggerRef,
|
|
367
368
|
setTriggerEl,
|
|
@@ -426,7 +427,7 @@ export function TopNavMenu({
|
|
|
426
427
|
|
|
427
428
|
// Menu container carries both the hover hook's ref (for its open/close
|
|
428
429
|
// focus management) and the list-focus ref (for roving tabindex/typeahead).
|
|
429
|
-
const setMenuRef =
|
|
430
|
+
const setMenuRef = useMergedRefs<HTMLDivElement>(menuRef, listRef);
|
|
430
431
|
|
|
431
432
|
// Mobile bar: hide menus entirely
|
|
432
433
|
if (renderMode === 'mobile-bar') {
|
|
@@ -60,6 +60,11 @@ export const docs = {
|
|
|
60
60
|
description: 'Maximum dropdown items to display.',
|
|
61
61
|
default: '10',
|
|
62
62
|
},
|
|
63
|
+
{
|
|
64
|
+
name: 'menuWidth',
|
|
65
|
+
type: 'number',
|
|
66
|
+
description: 'Fixed dropdown width in pixels. The menu never shrinks below its anchor width.',
|
|
67
|
+
},
|
|
63
68
|
{
|
|
64
69
|
name: 'emptySearchResultsText',
|
|
65
70
|
type: 'string',
|
|
@@ -169,6 +174,11 @@ export const docsZh = {
|
|
|
169
174
|
description: '下拉列表显示的最大项目数。',
|
|
170
175
|
default: '10',
|
|
171
176
|
},
|
|
177
|
+
{
|
|
178
|
+
name: 'menuWidth',
|
|
179
|
+
type: 'number',
|
|
180
|
+
description: '下拉菜单的固定像素宽度。菜单不会小于其锚点宽度。',
|
|
181
|
+
},
|
|
172
182
|
{
|
|
173
183
|
name: 'emptySearchResultsText',
|
|
174
184
|
type: 'string',
|
|
@@ -253,6 +263,7 @@ export const docsDense = {
|
|
|
253
263
|
placeholder: 'Input placeholder.',
|
|
254
264
|
hasEntriesOnFocus: 'Bootstrap results on focus.',
|
|
255
265
|
maxMenuItems: 'Max dropdown items.',
|
|
266
|
+
menuWidth: 'Fixed dropdown width in pixels.',
|
|
256
267
|
emptySearchResultsText: 'Text when no results.',
|
|
257
268
|
isDisabled: 'Whether input disabled.',
|
|
258
269
|
hasAutoFocus: 'Auto-focus on mount.',
|
|
@@ -41,12 +41,13 @@ import {
|
|
|
41
41
|
fontWeightVars,
|
|
42
42
|
typeScaleVars,
|
|
43
43
|
} from '../theme/tokens.stylex';
|
|
44
|
-
import {getKey,
|
|
44
|
+
import {getKey, groupItems, mergeProps} from '../utils';
|
|
45
45
|
import type {BaseProps} from '../BaseProps';
|
|
46
46
|
import type {SearchableItem, SearchSource} from './types';
|
|
47
47
|
import {themeProps} from '../utils/themeProps';
|
|
48
48
|
import {useTranslator} from '../i18n';
|
|
49
49
|
|
|
50
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
50
51
|
// =============================================================================
|
|
51
52
|
// Types
|
|
52
53
|
// =============================================================================
|
|
@@ -93,6 +94,9 @@ export interface BaseTypeaheadProps<T extends SearchableItem> extends Omit<
|
|
|
93
94
|
*/
|
|
94
95
|
maxMenuItems?: number;
|
|
95
96
|
|
|
97
|
+
/** Fixed dropdown width in pixels. Never shrinks below the anchor width. */
|
|
98
|
+
menuWidth?: number;
|
|
99
|
+
|
|
96
100
|
/**
|
|
97
101
|
* Text shown when no results found.
|
|
98
102
|
* @default 'No results found'
|
|
@@ -226,6 +230,18 @@ const styles = stylex.create({
|
|
|
226
230
|
popover: {
|
|
227
231
|
minWidth: 'anchor-size(width)',
|
|
228
232
|
},
|
|
233
|
+
popoverCustomWidth: (width: number) => ({
|
|
234
|
+
width: `${width}px`,
|
|
235
|
+
}),
|
|
236
|
+
groupHeading: {
|
|
237
|
+
paddingInline: spacingVars['--spacing-2'],
|
|
238
|
+
paddingBlockStart: spacingVars['--spacing-2'],
|
|
239
|
+
paddingBlockEnd: spacingVars['--spacing-1'],
|
|
240
|
+
fontSize: typeScaleVars['--text-supporting-size'],
|
|
241
|
+
lineHeight: typeScaleVars['--text-supporting-leading'],
|
|
242
|
+
color: colorVars['--color-text-secondary'],
|
|
243
|
+
userSelect: 'none',
|
|
244
|
+
},
|
|
229
245
|
item: {
|
|
230
246
|
boxSizing: 'border-box',
|
|
231
247
|
display: 'flex',
|
|
@@ -316,6 +332,7 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
316
332
|
placeholder: placeholderFromProps,
|
|
317
333
|
hasEntriesOnFocus = false,
|
|
318
334
|
maxMenuItems = 10,
|
|
335
|
+
menuWidth,
|
|
319
336
|
emptySearchResultsText: emptySearchResultsTextFromProps,
|
|
320
337
|
isDisabled = false,
|
|
321
338
|
isFocusableDisabled = false,
|
|
@@ -691,6 +708,14 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
691
708
|
e.preventDefault();
|
|
692
709
|
popover.hide();
|
|
693
710
|
break;
|
|
711
|
+
case 'Tab':
|
|
712
|
+
// Dismiss here rather than from the blur this press produces:
|
|
713
|
+
// hiding a top-layer popover during the focusout makes Chrome
|
|
714
|
+
// abandon the in-flight focus move and drop focus to <body>, so the
|
|
715
|
+
// user's Tab appears to do nothing. Selector and MultiSelector
|
|
716
|
+
// already dismiss on this keydown.
|
|
717
|
+
popover.hide();
|
|
718
|
+
break;
|
|
694
719
|
case 'Home':
|
|
695
720
|
if (popover.isOpen) {
|
|
696
721
|
e.preventDefault();
|
|
@@ -760,7 +785,7 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
760
785
|
return (
|
|
761
786
|
<>
|
|
762
787
|
<input
|
|
763
|
-
ref={
|
|
788
|
+
ref={useMergedRefs(ref, inputRef, fallbackAnchorRef)}
|
|
764
789
|
id={inputId}
|
|
765
790
|
type="text"
|
|
766
791
|
role="combobox"
|
|
@@ -835,44 +860,71 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
835
860
|
{emptySearchResultsText}
|
|
836
861
|
</div>
|
|
837
862
|
) : (
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
const
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
863
|
+
(() => {
|
|
864
|
+
let flatIndex = 0;
|
|
865
|
+
const renderOption = (item: T) => {
|
|
866
|
+
const index = flatIndex++;
|
|
867
|
+
const itemKey = getKey(item.id, index);
|
|
868
|
+
const isSelected = itemKey === selectedKey;
|
|
869
|
+
return (
|
|
870
|
+
<div
|
|
871
|
+
key={itemKey}
|
|
872
|
+
id={getItemId(index)}
|
|
873
|
+
role="option"
|
|
874
|
+
aria-selected={isSelected}
|
|
875
|
+
tabIndex={-1}
|
|
876
|
+
onClick={() => handleSelect(item)}
|
|
877
|
+
onMouseEnter={() => setHighlightedIndex(index)}
|
|
878
|
+
{...stylex.props(
|
|
879
|
+
styles.item,
|
|
880
|
+
itemSizeStyles[size],
|
|
881
|
+
index === highlightedIndex && styles.itemHighlighted,
|
|
882
|
+
isSelected && styles.itemSelected,
|
|
883
|
+
)}>
|
|
884
|
+
<span {...stylex.props(styles.itemContent)}>
|
|
885
|
+
{renderItem ? (
|
|
886
|
+
renderItem(item)
|
|
887
|
+
) : (
|
|
888
|
+
<TypeaheadItem item={item} />
|
|
889
|
+
)}
|
|
890
|
+
</span>
|
|
891
|
+
{isSelected && (
|
|
892
|
+
<Icon icon="check" size="sm" color="primary" />
|
|
861
893
|
)}
|
|
862
|
-
</
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
894
|
+
</div>
|
|
895
|
+
);
|
|
896
|
+
};
|
|
897
|
+
|
|
898
|
+
return groupItems(results, {ungroupedFirst: true}).map(group => {
|
|
899
|
+
const options = group.items.map(renderOption);
|
|
900
|
+
if (group.heading == null) {
|
|
901
|
+
return options;
|
|
902
|
+
}
|
|
903
|
+
return (
|
|
904
|
+
<div
|
|
905
|
+
key={`group-${group.heading}`}
|
|
906
|
+
role="group"
|
|
907
|
+
aria-label={group.heading}>
|
|
908
|
+
<div
|
|
909
|
+
aria-hidden="true"
|
|
910
|
+
{...stylex.props(styles.groupHeading)}>
|
|
911
|
+
{group.heading}
|
|
912
|
+
</div>
|
|
913
|
+
{options}
|
|
914
|
+
</div>
|
|
915
|
+
);
|
|
916
|
+
});
|
|
917
|
+
})()
|
|
869
918
|
)}
|
|
870
919
|
</div>,
|
|
871
920
|
{
|
|
872
921
|
placement: 'below',
|
|
873
922
|
alignment: 'start',
|
|
874
923
|
offset: spacingVars['--spacing-1'],
|
|
875
|
-
xstyle:
|
|
924
|
+
xstyle: [
|
|
925
|
+
styles.popover,
|
|
926
|
+
menuWidth != null && styles.popoverCustomWidth(menuWidth),
|
|
927
|
+
],
|
|
876
928
|
},
|
|
877
929
|
)}
|
|
878
930
|
</>
|
|
@@ -171,6 +171,11 @@ export const docs = {
|
|
|
171
171
|
description:
|
|
172
172
|
'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
|
|
173
173
|
},
|
|
174
|
+
{
|
|
175
|
+
name: 'startIcon',
|
|
176
|
+
type: 'IconType | ReactNode',
|
|
177
|
+
description: 'SVG icon component displayed at the start of the input.',
|
|
178
|
+
},
|
|
174
179
|
{
|
|
175
180
|
name: 'xstyle',
|
|
176
181
|
type: 'StyleXStyles',
|
|
@@ -420,6 +420,55 @@ describe('BaseTypeahead focus-out', () => {
|
|
|
420
420
|
});
|
|
421
421
|
});
|
|
422
422
|
|
|
423
|
+
it('closes the list on the Tab keydown, before the blur it produces', async () => {
|
|
424
|
+
render(
|
|
425
|
+
<BaseTypeahead
|
|
426
|
+
searchSource={fruitSource}
|
|
427
|
+
value={null}
|
|
428
|
+
onChange={() => {}}
|
|
429
|
+
debounceMs={0}
|
|
430
|
+
/>,
|
|
431
|
+
);
|
|
432
|
+
const input = screen.getByRole('combobox');
|
|
433
|
+
input.focus();
|
|
434
|
+
fireEvent.change(input, {target: {value: 'App'}});
|
|
435
|
+
await waitFor(() => {
|
|
436
|
+
expect(input).toHaveAttribute('aria-expanded', 'true');
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
// No blur is fired here on purpose: dismissing from the blur instead lets
|
|
440
|
+
// the popover close mid-focus-move, which Chrome answers by dropping
|
|
441
|
+
// focus to <body>.
|
|
442
|
+
fireEvent.keyDown(input, {key: 'Tab'});
|
|
443
|
+
await waitFor(() => {
|
|
444
|
+
expect(input).toHaveAttribute('aria-expanded', 'false');
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
it('Tab from the input with the list open moves focus to the next control', async () => {
|
|
449
|
+
const user = userEvent.setup();
|
|
450
|
+
render(
|
|
451
|
+
<>
|
|
452
|
+
<BaseTypeahead
|
|
453
|
+
searchSource={fruitSource}
|
|
454
|
+
value={null}
|
|
455
|
+
onChange={() => {}}
|
|
456
|
+
debounceMs={0}
|
|
457
|
+
/>
|
|
458
|
+
<button type="button">Next</button>
|
|
459
|
+
</>,
|
|
460
|
+
);
|
|
461
|
+
const input = screen.getByRole('combobox');
|
|
462
|
+
input.focus();
|
|
463
|
+
fireEvent.change(input, {target: {value: 'App'}});
|
|
464
|
+
await waitFor(() => {
|
|
465
|
+
expect(input).toHaveAttribute('aria-expanded', 'true');
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
await user.keyboard('{Tab}');
|
|
469
|
+
expect(screen.getByRole('button', {name: 'Next'})).toHaveFocus();
|
|
470
|
+
});
|
|
471
|
+
|
|
423
472
|
it('keeps the dropdown open when focus moves into the anchor wrapper', async () => {
|
|
424
473
|
const anchor = document.createElement('div');
|
|
425
474
|
document.body.appendChild(anchor);
|
|
@@ -45,13 +45,14 @@ import {VisuallyHidden} from '../VisuallyHidden';
|
|
|
45
45
|
import {spacingVars, sizeVars} from '../theme/tokens.stylex';
|
|
46
46
|
import {groupStyles} from '../InputGroup/groupStyles';
|
|
47
47
|
import {useInputGroup} from '../InputGroup/InputGroupContext';
|
|
48
|
-
import {getInputARIA, isImeKeyEvent, mergeProps
|
|
48
|
+
import {getInputARIA, isImeKeyEvent, mergeProps} from '../utils';
|
|
49
49
|
import type {BaseProps} from '../BaseProps';
|
|
50
50
|
import type {SizeValue} from '../utils/types';
|
|
51
51
|
import type {SearchableItem, SearchSource} from './types';
|
|
52
52
|
import {themeProps} from '../utils/themeProps';
|
|
53
53
|
import {useTranslator} from '../i18n';
|
|
54
54
|
|
|
55
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
55
56
|
export type {
|
|
56
57
|
InputStatus as TypeaheadStatus,
|
|
57
58
|
InputStatusType as TypeaheadStatusType,
|
|
@@ -418,7 +419,7 @@ export function Typeahead<T extends SearchableItem>({
|
|
|
418
419
|
const typeaheadContent = (
|
|
419
420
|
<>
|
|
420
421
|
<div
|
|
421
|
-
ref={
|
|
422
|
+
ref={useMergedRefs(
|
|
422
423
|
wrapperRef,
|
|
423
424
|
disabledMessageTooltip.ref,
|
|
424
425
|
inputGroup ? ref : undefined,
|
package/src/hooks/index.ts
CHANGED
|
@@ -56,6 +56,8 @@ export type {UseTypeaheadOptions, UseTypeaheadReturn} from './useTypeahead';
|
|
|
56
56
|
|
|
57
57
|
export {useMediaQuery} from './useMediaQuery';
|
|
58
58
|
|
|
59
|
+
export {useMergedRefs} from './useMergedRefs';
|
|
60
|
+
|
|
59
61
|
export {useOverflow} from './useOverflow';
|
|
60
62
|
export type {UseOverflowOptions, UseOverflowReturn} from './useOverflow';
|
|
61
63
|
|
|
@@ -24,7 +24,7 @@ export const docs = {
|
|
|
24
24
|
{
|
|
25
25
|
name: 'getContainerProps',
|
|
26
26
|
type: '(options?: ContainerRevealOptions) => {className?: string; style?: CSSProperties}',
|
|
27
|
-
description: 'Spread onto the container whose hover/focus-within drives the reveal. Accepts hoverDelay (ms the pointer must dwell before the reveal starts
|
|
27
|
+
description: 'Spread onto the container whose hover/focus-within drives the reveal. Accepts hoverDelay (ms the pointer must dwell before the reveal starts: a hover-intent gate like Tooltip\'s and HoverCard\'s delay, so a cursor sweeping across a list leaves nothing painted behind it) and forceState ("active" | "inactive") to pin the trigger state when a caller owns it: a motion gate, a scroll, or a row whose menu is open. "inactive" still yields to keyboard focus and coarse pointers.',
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
name: 'getContentRevealProps',
|
|
@@ -61,7 +61,7 @@ export const docsDense = {
|
|
|
61
61
|
'options.isEnabled': 'when false hook is inert: no container styles, content getters return no styles, content always shown. Read every render, so it can flip after mount.',
|
|
62
62
|
},
|
|
63
63
|
returnDescriptions: {
|
|
64
|
-
getContainerProps: 'spread onto container whose hover/focus-within drives reveal. Accepts hoverDelay (ms dwell before reveal starts
|
|
64
|
+
getContainerProps: 'spread onto container whose hover/focus-within drives reveal. Accepts hoverDelay (ms dwell before reveal starts: hover-intent gate like Tooltip / HoverCard delay) + forceState ("active" | "inactive") to pin trigger state when a caller owns it. "inactive" yields to keyboard focus + coarse pointers.',
|
|
65
65
|
getContentRevealProps: 'spread onto each revealed / concealed child. Accepts isRevealInverted (conceal-on-hover), isLayoutPreserved (reserve layout box while hidden) + forceVisibility ("shown" | "hidden") to pin this element regardless of container. "hidden" yields to focus.',
|
|
66
66
|
},
|
|
67
67
|
usage: {
|
|
@@ -208,6 +208,20 @@ describe('useFocusTrap tabbable model (infra-8)', () => {
|
|
|
208
208
|
expect(target).toHaveFocus();
|
|
209
209
|
expect(screen.getByTestId('outside')).not.toHaveFocus();
|
|
210
210
|
});
|
|
211
|
+
|
|
212
|
+
it('leaves Tab alone when focus is outside a trap with no tabbable controls', () => {
|
|
213
|
+
render(
|
|
214
|
+
<Trap>
|
|
215
|
+
<div role="option" tabIndex={-1} data-testid="option">
|
|
216
|
+
Option
|
|
217
|
+
</div>
|
|
218
|
+
</Trap>,
|
|
219
|
+
);
|
|
220
|
+
const outside = screen.getByTestId('outside');
|
|
221
|
+
outside.focus();
|
|
222
|
+
|
|
223
|
+
expect(fireEvent.keyDown(outside, {key: 'Tab'})).toBe(true);
|
|
224
|
+
});
|
|
211
225
|
});
|
|
212
226
|
|
|
213
227
|
describe('FOCUSABLE_SELECTOR href matching', () => {
|