@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
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 +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +33 -19
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +61 -39
- package/dist/astryx.umd.js +53 -53
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -65,7 +65,9 @@ export interface DialogHeaderProps extends BaseProps<HTMLDivElement> {
|
|
|
65
65
|
ref?: React.Ref<HTMLDivElement>;
|
|
66
66
|
/**
|
|
67
67
|
* The title of the dialog.
|
|
68
|
-
* This title receives focus when the dialog opens for screen reader
|
|
68
|
+
* This title receives focus when the dialog opens for screen reader
|
|
69
|
+
* accessibility, and names the parent Dialog via aria-labelledby unless the
|
|
70
|
+
* consumer passes an explicit aria-label/aria-labelledby to the Dialog.
|
|
69
71
|
*/
|
|
70
72
|
title: string;
|
|
71
73
|
|
|
@@ -105,7 +107,8 @@ export interface DialogHeaderProps extends BaseProps<HTMLDivElement> {
|
|
|
105
107
|
* Renders a title that receives focus when a modal dialog opens (for screen reader accessibility)
|
|
106
108
|
* and an optional close button. Inline documentation previews suppress this autofocus.
|
|
107
109
|
* The title is an h2 element with tabIndex={-1} so it can be programmatically focused but
|
|
108
|
-
* doesn't appear in the tab order.
|
|
110
|
+
* doesn't appear in the tab order. The title also names the parent Dialog via
|
|
111
|
+
* aria-labelledby (unless the Dialog receives an explicit aria-label/aria-labelledby).
|
|
109
112
|
*
|
|
110
113
|
* Uses LayoutHeader internally for consistent styling with other layout headers.
|
|
111
114
|
*
|
|
@@ -137,10 +140,13 @@ export function DialogHeader({
|
|
|
137
140
|
const titleRef = useRef<HTMLHeadingElement>(null);
|
|
138
141
|
const dialogContext = useDialogContext();
|
|
139
142
|
const shouldAutoFocus = dialogContext?.isInline !== true;
|
|
143
|
+
const titleId = dialogContext?.titleId;
|
|
140
144
|
|
|
141
145
|
// Auto-focus the title when mounted for screen reader accessibility.
|
|
142
146
|
// Inline dialogs are documentation/showcase previews, so suppress focus to
|
|
143
147
|
// avoid stealing scroll position from the surrounding page.
|
|
148
|
+
// The parent Dialog detects this title (by `titleId`) via a callback ref to
|
|
149
|
+
// set its default aria-labelledby — no registration handshake needed here.
|
|
144
150
|
useEffect(() => {
|
|
145
151
|
if (shouldAutoFocus && titleRef.current) {
|
|
146
152
|
titleRef.current.focus();
|
|
@@ -162,6 +168,7 @@ export function DialogHeader({
|
|
|
162
168
|
<div {...stylex.props(styles.titleWrapper)}>
|
|
163
169
|
<Heading
|
|
164
170
|
ref={titleRef}
|
|
171
|
+
id={titleId}
|
|
165
172
|
level={2}
|
|
166
173
|
tabIndex={-1}
|
|
167
174
|
xstyle={styles.titleFocusable}>
|
package/src/Divider/Divider.tsx
CHANGED
|
@@ -172,6 +172,7 @@ export function Divider({
|
|
|
172
172
|
return (
|
|
173
173
|
<div
|
|
174
174
|
ref={ref}
|
|
175
|
+
{...props}
|
|
175
176
|
role="separator"
|
|
176
177
|
aria-orientation={orientation}
|
|
177
178
|
{...mergeProps(
|
|
@@ -186,8 +187,7 @@ export function Divider({
|
|
|
186
187
|
),
|
|
187
188
|
className,
|
|
188
189
|
style,
|
|
189
|
-
)}
|
|
190
|
-
{...props}>
|
|
190
|
+
)}>
|
|
191
191
|
<div
|
|
192
192
|
{...stylex.props(
|
|
193
193
|
isHorizontal ? lineStyles.horizontalLine : lineStyles.verticalLine,
|
|
@@ -613,3 +613,232 @@ describe('DropdownMenu compound mode', () => {
|
|
|
613
613
|
).toBeInTheDocument();
|
|
614
614
|
});
|
|
615
615
|
});
|
|
616
|
+
|
|
617
|
+
describe('DropdownMenu keyboard access for menuitemradio/menuitemcheckbox (#3829)', () => {
|
|
618
|
+
it('arrow navigation reaches consumer-rendered menuitemradio and menuitemcheckbox items', async () => {
|
|
619
|
+
const user = userEvent.setup();
|
|
620
|
+
render(
|
|
621
|
+
<DropdownMenu button={{label: 'Sort'}}>
|
|
622
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
623
|
+
<div role="menuitemradio" tabIndex={-1} aria-checked="false">
|
|
624
|
+
Newest
|
|
625
|
+
</div>
|
|
626
|
+
<div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
|
|
627
|
+
Archived
|
|
628
|
+
</div>
|
|
629
|
+
</DropdownMenu>,
|
|
630
|
+
);
|
|
631
|
+
|
|
632
|
+
await user.click(screen.getByRole('button', {name: /Sort/}));
|
|
633
|
+
const menu = screen.getByRole('menu', {hidden: true});
|
|
634
|
+
screen.getByRole('menuitem', {name: 'Edit', hidden: true}).focus();
|
|
635
|
+
|
|
636
|
+
fireEvent.keyDown(menu, {key: 'ArrowDown'});
|
|
637
|
+
expect(
|
|
638
|
+
screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}),
|
|
639
|
+
).toHaveFocus();
|
|
640
|
+
|
|
641
|
+
fireEvent.keyDown(menu, {key: 'ArrowDown'});
|
|
642
|
+
expect(
|
|
643
|
+
screen.getByRole('menuitemcheckbox', {name: 'Archived', hidden: true}),
|
|
644
|
+
).toHaveFocus();
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
it('activates a focused menuitemradio with Enter and a menuitemcheckbox with Space', async () => {
|
|
648
|
+
const user = userEvent.setup();
|
|
649
|
+
const onSelect = vi.fn();
|
|
650
|
+
const onToggle = vi.fn();
|
|
651
|
+
render(
|
|
652
|
+
<DropdownMenu button={{label: 'Sort'}}>
|
|
653
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
654
|
+
<div
|
|
655
|
+
role="menuitemradio"
|
|
656
|
+
tabIndex={-1}
|
|
657
|
+
aria-checked="false"
|
|
658
|
+
onClick={onSelect}>
|
|
659
|
+
Newest
|
|
660
|
+
</div>
|
|
661
|
+
<div
|
|
662
|
+
role="menuitemcheckbox"
|
|
663
|
+
tabIndex={-1}
|
|
664
|
+
aria-checked="false"
|
|
665
|
+
onClick={onToggle}>
|
|
666
|
+
Archived
|
|
667
|
+
</div>
|
|
668
|
+
</DropdownMenu>,
|
|
669
|
+
);
|
|
670
|
+
|
|
671
|
+
await user.click(screen.getByRole('button', {name: /Sort/}));
|
|
672
|
+
const menu = screen.getByRole('menu', {hidden: true});
|
|
673
|
+
|
|
674
|
+
screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}).focus();
|
|
675
|
+
fireEvent.keyDown(menu, {key: 'Enter'});
|
|
676
|
+
expect(onSelect).toHaveBeenCalledTimes(1);
|
|
677
|
+
|
|
678
|
+
screen
|
|
679
|
+
.getByRole('menuitemcheckbox', {name: 'Archived', hidden: true})
|
|
680
|
+
.focus();
|
|
681
|
+
fireEvent.keyDown(menu, {key: ' '});
|
|
682
|
+
expect(onToggle).toHaveBeenCalledTimes(1);
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
it('typeahead matches a menuitemradio label', async () => {
|
|
686
|
+
const user = userEvent.setup();
|
|
687
|
+
render(
|
|
688
|
+
<DropdownMenu button={{label: 'Sort'}}>
|
|
689
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
690
|
+
<div role="menuitemradio" tabIndex={-1} aria-checked="false">
|
|
691
|
+
Newest
|
|
692
|
+
</div>
|
|
693
|
+
<div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
|
|
694
|
+
Archived
|
|
695
|
+
</div>
|
|
696
|
+
</DropdownMenu>,
|
|
697
|
+
);
|
|
698
|
+
|
|
699
|
+
await user.click(screen.getByRole('button', {name: /Sort/}));
|
|
700
|
+
fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'n'});
|
|
701
|
+
expect(
|
|
702
|
+
screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}),
|
|
703
|
+
).toHaveFocus();
|
|
704
|
+
});
|
|
705
|
+
|
|
706
|
+
it('typeahead matches a menuitemcheckbox label', async () => {
|
|
707
|
+
const user = userEvent.setup();
|
|
708
|
+
render(
|
|
709
|
+
<DropdownMenu button={{label: 'Sort'}}>
|
|
710
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
711
|
+
<div role="menuitemradio" tabIndex={-1} aria-checked="false">
|
|
712
|
+
Newest
|
|
713
|
+
</div>
|
|
714
|
+
<div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
|
|
715
|
+
Archived
|
|
716
|
+
</div>
|
|
717
|
+
</DropdownMenu>,
|
|
718
|
+
);
|
|
719
|
+
|
|
720
|
+
await user.click(screen.getByRole('button', {name: /Sort/}));
|
|
721
|
+
fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'a'});
|
|
722
|
+
expect(
|
|
723
|
+
screen.getByRole('menuitemcheckbox', {name: 'Archived', hidden: true}),
|
|
724
|
+
).toHaveFocus();
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
it('typeahead skips an aria-disabled item and matches the next enabled label', async () => {
|
|
728
|
+
const user = userEvent.setup();
|
|
729
|
+
render(
|
|
730
|
+
<DropdownMenu button={{label: 'Sort'}}>
|
|
731
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
732
|
+
<div role="menuitemradio" tabIndex={-1} aria-disabled="true">
|
|
733
|
+
Newest
|
|
734
|
+
</div>
|
|
735
|
+
<div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
|
|
736
|
+
Nightly
|
|
737
|
+
</div>
|
|
738
|
+
</DropdownMenu>,
|
|
739
|
+
);
|
|
740
|
+
|
|
741
|
+
await user.click(screen.getByRole('button', {name: /Sort/}));
|
|
742
|
+
// Anchor the search on 'Edit' so typeahead scans forward and meets the
|
|
743
|
+
// disabled 'Newest' (also an 'n' match) before the enabled 'Nightly'.
|
|
744
|
+
// This pins the `:not([aria-disabled="true"])` in MENU_ITEM_SELECTOR: the
|
|
745
|
+
// menus never pass useTypeahead's `isDisabled` option, so that clause is
|
|
746
|
+
// the only thing keeping disabled rows out of the typeahead list. An
|
|
747
|
+
// arrow-key test cannot cover it — useListFocus re-filters disabled items
|
|
748
|
+
// independently, so arrow navigation is guarded twice over.
|
|
749
|
+
// The disabled row keeps tabIndex={-1} on purpose: it stays focusable, so
|
|
750
|
+
// the selector clause is the sole reason focus skips it.
|
|
751
|
+
screen.getByRole('menuitem', {name: 'Edit', hidden: true}).focus();
|
|
752
|
+
fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'n'});
|
|
753
|
+
expect(
|
|
754
|
+
screen.getByRole('menuitemcheckbox', {name: 'Nightly', hidden: true}),
|
|
755
|
+
).toHaveFocus();
|
|
756
|
+
});
|
|
757
|
+
|
|
758
|
+
it('skips aria-disabled menuitemradio and menuitemcheckbox items during arrow navigation', async () => {
|
|
759
|
+
const user = userEvent.setup();
|
|
760
|
+
render(
|
|
761
|
+
<DropdownMenu button={{label: 'Sort'}}>
|
|
762
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
763
|
+
<div role="menuitemradio" tabIndex={-1} aria-disabled="true">
|
|
764
|
+
Newest
|
|
765
|
+
</div>
|
|
766
|
+
<div role="menuitemcheckbox" tabIndex={-1} aria-disabled="true">
|
|
767
|
+
Archived
|
|
768
|
+
</div>
|
|
769
|
+
<div role="menuitemradio" tabIndex={-1} aria-checked="false">
|
|
770
|
+
Oldest
|
|
771
|
+
</div>
|
|
772
|
+
</DropdownMenu>,
|
|
773
|
+
);
|
|
774
|
+
|
|
775
|
+
await user.click(screen.getByRole('button', {name: /Sort/}));
|
|
776
|
+
const menu = screen.getByRole('menu', {hidden: true});
|
|
777
|
+
screen.getByRole('menuitem', {name: 'Edit', hidden: true}).focus();
|
|
778
|
+
|
|
779
|
+
fireEvent.keyDown(menu, {key: 'ArrowDown'});
|
|
780
|
+
expect(
|
|
781
|
+
screen.getByRole('menuitemradio', {name: 'Oldest', hidden: true}),
|
|
782
|
+
).toHaveFocus();
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
it('moves focus to the item the mouse hovers, keeping a single highlight', async () => {
|
|
786
|
+
const user = userEvent.setup();
|
|
787
|
+
render(
|
|
788
|
+
<DropdownMenu button={{label: 'Actions'}}>
|
|
789
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
790
|
+
<DropdownMenuItem label="Duplicate" onClick={() => {}} />
|
|
791
|
+
<DropdownMenuItem label="Delete" onClick={() => {}} />
|
|
792
|
+
</DropdownMenu>,
|
|
793
|
+
);
|
|
794
|
+
|
|
795
|
+
await user.click(screen.getByRole('button', {name: /Actions/}));
|
|
796
|
+
// Keyboard focus starts on the first item.
|
|
797
|
+
const edit = screen.getByRole('menuitem', {name: 'Edit', hidden: true});
|
|
798
|
+
const del = screen.getByRole('menuitem', {name: 'Delete', hidden: true});
|
|
799
|
+
edit.focus();
|
|
800
|
+
expect(edit).toHaveFocus();
|
|
801
|
+
|
|
802
|
+
// A mouse hover over another item moves focus to it, so the single
|
|
803
|
+
// focus-driven highlight follows the pointer instead of leaving two.
|
|
804
|
+
fireEvent.pointerMove(del, {pointerType: 'mouse'});
|
|
805
|
+
expect(del).toHaveFocus();
|
|
806
|
+
expect(edit).not.toHaveFocus();
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
it('does not move focus on hover for a disabled item', async () => {
|
|
810
|
+
const user = userEvent.setup();
|
|
811
|
+
render(
|
|
812
|
+
<DropdownMenu button={{label: 'Actions'}}>
|
|
813
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
814
|
+
<DropdownMenuItem label="Delete" isDisabled onClick={() => {}} />
|
|
815
|
+
</DropdownMenu>,
|
|
816
|
+
);
|
|
817
|
+
|
|
818
|
+
await user.click(screen.getByRole('button', {name: /Actions/}));
|
|
819
|
+
const edit = screen.getByRole('menuitem', {name: 'Edit', hidden: true});
|
|
820
|
+
const del = screen.getByRole('menuitem', {name: 'Delete', hidden: true});
|
|
821
|
+
edit.focus();
|
|
822
|
+
|
|
823
|
+
fireEvent.pointerMove(del, {pointerType: 'mouse'});
|
|
824
|
+
expect(edit).toHaveFocus();
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
it('does not move focus for a non-mouse (touch) pointer', async () => {
|
|
828
|
+
const user = userEvent.setup();
|
|
829
|
+
render(
|
|
830
|
+
<DropdownMenu button={{label: 'Actions'}}>
|
|
831
|
+
<DropdownMenuItem label="Edit" onClick={() => {}} />
|
|
832
|
+
<DropdownMenuItem label="Delete" onClick={() => {}} />
|
|
833
|
+
</DropdownMenu>,
|
|
834
|
+
);
|
|
835
|
+
|
|
836
|
+
await user.click(screen.getByRole('button', {name: /Actions/}));
|
|
837
|
+
const edit = screen.getByRole('menuitem', {name: 'Edit', hidden: true});
|
|
838
|
+
const del = screen.getByRole('menuitem', {name: 'Delete', hidden: true});
|
|
839
|
+
edit.focus();
|
|
840
|
+
|
|
841
|
+
fireEvent.pointerMove(del, {pointerType: 'touch'});
|
|
842
|
+
expect(edit).toHaveFocus();
|
|
843
|
+
});
|
|
844
|
+
});
|
|
@@ -38,7 +38,11 @@ import {Icon} from '../Icon';
|
|
|
38
38
|
import type {IconType} from '../Icon';
|
|
39
39
|
|
|
40
40
|
import {renderDropdownItems} from './renderDropdownItems';
|
|
41
|
-
import {
|
|
41
|
+
import {
|
|
42
|
+
MENU_ITEM_ROLES,
|
|
43
|
+
MENU_ITEM_SELECTOR,
|
|
44
|
+
MENU_BOUNDARY_SELECTOR,
|
|
45
|
+
} from './menuItemRoles';
|
|
42
46
|
import {
|
|
43
47
|
DropdownMenuContext,
|
|
44
48
|
type DropdownMenuContextValue,
|
|
@@ -100,6 +104,12 @@ export interface DropdownMenuItemData {
|
|
|
100
104
|
onClick?: () => void;
|
|
101
105
|
isDisabled?: boolean;
|
|
102
106
|
icon?: ReactNode | IconType;
|
|
107
|
+
/**
|
|
108
|
+
* Nested submenu entries. When present, this row becomes a submenu (a
|
|
109
|
+
* flyout revealing `items`) instead of a leaf action — no separate item
|
|
110
|
+
* "type" is needed. Data-mode parity for the compound DropdownMenuSubMenu API.
|
|
111
|
+
*/
|
|
112
|
+
items?: DropdownMenuOption[];
|
|
103
113
|
}
|
|
104
114
|
|
|
105
115
|
export interface DropdownMenuDivider {
|
|
@@ -200,6 +210,14 @@ export function DropdownMenu({
|
|
|
200
210
|
const items = ('items' in props ? props.items : undefined) ?? [];
|
|
201
211
|
const children = props.children;
|
|
202
212
|
|
|
213
|
+
// Extract BaseProps pass-throughs (aria-*, id, event handlers) from the
|
|
214
|
+
// discriminated-union rest bag so they can be forwarded to the menu element.
|
|
215
|
+
const {
|
|
216
|
+
items: _items,
|
|
217
|
+
children: _children,
|
|
218
|
+
...rest
|
|
219
|
+
} = props as Record<string, unknown>;
|
|
220
|
+
|
|
203
221
|
const menuId = useId();
|
|
204
222
|
const menuSize = button.size ?? 'md';
|
|
205
223
|
const buttonRef = useRef<HTMLButtonElement>(null);
|
|
@@ -265,23 +283,18 @@ export function DropdownMenu({
|
|
|
265
283
|
handleKeyDown: listNavKeyDown,
|
|
266
284
|
focusFirst,
|
|
267
285
|
focusItem,
|
|
286
|
+
ownsEvent,
|
|
287
|
+
getItems: getMenuItems,
|
|
268
288
|
} = useListFocus<HTMLDivElement>({
|
|
269
289
|
itemSelector: MENU_ITEM_SELECTOR,
|
|
290
|
+
boundarySelector: MENU_BOUNDARY_SELECTOR,
|
|
270
291
|
wrap: false,
|
|
271
292
|
onEscape: closeMenu,
|
|
272
293
|
});
|
|
273
294
|
|
|
274
295
|
// First-character typeahead over the (enabled) menu items — jump to the next
|
|
275
|
-
// item whose label starts with the typed text (menus-11).
|
|
276
|
-
|
|
277
|
-
(): HTMLElement[] =>
|
|
278
|
-
listRef.current
|
|
279
|
-
? Array.from(
|
|
280
|
-
listRef.current.querySelectorAll<HTMLElement>(MENU_ITEM_SELECTOR),
|
|
281
|
-
)
|
|
282
|
-
: [],
|
|
283
|
-
[listRef],
|
|
284
|
-
);
|
|
296
|
+
// item whose label starts with the typed text (menus-11). Reuses the hook's
|
|
297
|
+
// scoped item collection so an inline submenu flyout's items aren't swept in.
|
|
285
298
|
const typeahead = useTypeahead({
|
|
286
299
|
getItemLabels: () => getMenuItems().map(el => el.textContent),
|
|
287
300
|
onMatch: focusItem,
|
|
@@ -307,6 +320,11 @@ export function DropdownMenu({
|
|
|
307
320
|
// Extend useListFocus with Enter/Space activation + typeahead
|
|
308
321
|
const listKeyDown = useCallback(
|
|
309
322
|
(e: React.KeyboardEvent) => {
|
|
323
|
+
// A submenu flyout renders inline inside this menu; its key events bubble
|
|
324
|
+
// up here. Let that level own them — only handle events from this level.
|
|
325
|
+
if (!ownsEvent(e)) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
310
328
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
311
329
|
e.preventDefault();
|
|
312
330
|
const focused = document.activeElement as HTMLElement | null;
|
|
@@ -334,7 +352,7 @@ export function DropdownMenu({
|
|
|
334
352
|
}
|
|
335
353
|
listNavKeyDown(e);
|
|
336
354
|
},
|
|
337
|
-
[listNavKeyDown, closeMenu, typeahead],
|
|
355
|
+
[listNavKeyDown, closeMenu, typeahead, ownsEvent],
|
|
338
356
|
);
|
|
339
357
|
|
|
340
358
|
const openAndFocus = useCallback(() => {
|
|
@@ -435,6 +453,7 @@ export function DropdownMenu({
|
|
|
435
453
|
|
|
436
454
|
{popover.render(
|
|
437
455
|
<div
|
|
456
|
+
{...rest}
|
|
438
457
|
ref={listRef}
|
|
439
458
|
id={menuId}
|
|
440
459
|
role="menu"
|
|
@@ -23,11 +23,12 @@
|
|
|
23
23
|
* checkmark uses the `check` icon from the active theme's icon registry.
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import {useCallback, type ReactNode} from 'react';
|
|
26
|
+
import {useCallback, type PointerEvent, type ReactNode} from 'react';
|
|
27
27
|
import * as stylex from '@stylexjs/stylex';
|
|
28
28
|
import {Icon, renderIconSlot, type IconType} from '../Icon';
|
|
29
29
|
import {Item} from '../Item';
|
|
30
30
|
import {useDropdownMenuContext} from './DropdownMenuContext';
|
|
31
|
+
import {focusMenuItemOnHover} from './menuItemHover';
|
|
31
32
|
import {
|
|
32
33
|
colorVars,
|
|
33
34
|
spacingVars,
|
|
@@ -47,7 +48,6 @@ const styles = stylex.create({
|
|
|
47
48
|
backgroundColor: {
|
|
48
49
|
default: 'transparent',
|
|
49
50
|
':focus': colorVars['--color-overlay-hover'],
|
|
50
|
-
':hover': colorVars['--color-overlay-hover'],
|
|
51
51
|
},
|
|
52
52
|
cursor: 'pointer',
|
|
53
53
|
outline: 'none',
|
|
@@ -152,8 +152,7 @@ export interface DropdownMenuCheckboxItemProps extends Omit<
|
|
|
152
152
|
*
|
|
153
153
|
* @example
|
|
154
154
|
* ```
|
|
155
|
-
*
|
|
156
|
-
*
|
|
155
|
+
* import {DropdownMenuCheckboxItem} from '@astryxdesign/core/DropdownMenu';
|
|
157
156
|
* <DropdownMenu button={{label: 'View'}}>
|
|
158
157
|
* <DropdownMenuCheckboxItem
|
|
159
158
|
* label="Show archived"
|
|
@@ -191,12 +190,18 @@ export function DropdownMenuCheckboxItem({
|
|
|
191
190
|
}
|
|
192
191
|
}, [isDisabled, onChange, value, hasCloseOnSelect, ctx]);
|
|
193
192
|
|
|
193
|
+
const handlePointerMove = useCallback(
|
|
194
|
+
(e: PointerEvent<HTMLElement>) => focusMenuItemOnHover(e, isDisabled),
|
|
195
|
+
[isDisabled],
|
|
196
|
+
);
|
|
197
|
+
|
|
194
198
|
return (
|
|
195
199
|
<Item
|
|
196
200
|
{...rest}
|
|
197
201
|
role="menuitemcheckbox"
|
|
198
202
|
aria-checked={value}
|
|
199
203
|
tabIndex={isDisabled ? undefined : -1}
|
|
204
|
+
onPointerMove={handlePointerMove}
|
|
200
205
|
marker={
|
|
201
206
|
<span
|
|
202
207
|
aria-hidden="true"
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* - /packages/cli/templates/blocks/components/DropdownMenu/ (showcase blocks)
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import {useCallback, type ReactNode} from 'react';
|
|
26
|
+
import {useCallback, type PointerEvent, type ReactNode} from 'react';
|
|
27
27
|
import * as stylex from '@stylexjs/stylex';
|
|
28
28
|
import {renderIconSlot, type IconType} from '../Icon';
|
|
29
29
|
import {Item} from '../Item';
|
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
import {mergeProps} from '../utils';
|
|
37
37
|
import type {BaseProps} from '../BaseProps';
|
|
38
38
|
import {useDropdownMenuContext} from './DropdownMenuContext';
|
|
39
|
+
import {focusMenuItemOnHover} from './menuItemHover';
|
|
39
40
|
import {themeProps} from '../utils/themeProps';
|
|
40
41
|
|
|
41
42
|
const menuItemStyles = stylex.create({
|
|
@@ -51,11 +52,10 @@ const menuItemStyles = stylex.create({
|
|
|
51
52
|
backgroundColor: {
|
|
52
53
|
default: 'transparent',
|
|
53
54
|
':focus': colorVars['--color-overlay-hover'],
|
|
54
|
-
':hover': colorVars['--color-overlay-hover'],
|
|
55
55
|
},
|
|
56
56
|
border: 'none',
|
|
57
57
|
cursor: 'pointer',
|
|
58
|
-
textAlign: '
|
|
58
|
+
textAlign: 'start',
|
|
59
59
|
outline: 'none',
|
|
60
60
|
},
|
|
61
61
|
disabled: {
|
|
@@ -129,10 +129,16 @@ export function DropdownMenuItem({
|
|
|
129
129
|
ctx?.closeMenu();
|
|
130
130
|
}, [isDisabled, onClick, ctx]);
|
|
131
131
|
|
|
132
|
+
const handlePointerMove = useCallback(
|
|
133
|
+
(e: PointerEvent<HTMLElement>) => focusMenuItemOnHover(e, isDisabled),
|
|
134
|
+
[isDisabled],
|
|
135
|
+
);
|
|
136
|
+
|
|
132
137
|
return (
|
|
133
138
|
<Item
|
|
134
139
|
role="menuitem"
|
|
135
140
|
tabIndex={isDisabled ? undefined : -1}
|
|
141
|
+
onPointerMove={handlePointerMove}
|
|
136
142
|
startContent={
|
|
137
143
|
icon
|
|
138
144
|
? renderIconSlot(icon, {size: 'sm', color: 'secondary'})
|
|
@@ -77,11 +77,10 @@ export interface DropdownMenuRadioGroupProps extends Omit<
|
|
|
77
77
|
*
|
|
78
78
|
* @example
|
|
79
79
|
* ```
|
|
80
|
-
*
|
|
80
|
+
* import {
|
|
81
81
|
* DropdownMenuRadioGroup,
|
|
82
82
|
* DropdownMenuRadioItem,
|
|
83
83
|
* } from '@astryxdesign/core/DropdownMenu';
|
|
84
|
-
*
|
|
85
84
|
* <DropdownMenu button={{label: 'Sort'}}>
|
|
86
85
|
* <DropdownMenuRadioGroup value={sort} onChange={setSort} aria-label="Sort by">
|
|
87
86
|
* <DropdownMenuRadioItem value="newest" label="Newest" />
|
|
@@ -21,11 +21,12 @@
|
|
|
21
21
|
* has no registry glyph).
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import {useCallback, type ReactNode} from 'react';
|
|
24
|
+
import {useCallback, type PointerEvent, type ReactNode} from 'react';
|
|
25
25
|
import * as stylex from '@stylexjs/stylex';
|
|
26
26
|
import {renderIconSlot, type IconType} from '../Icon';
|
|
27
27
|
import {Item} from '../Item';
|
|
28
28
|
import {useDropdownMenuContext} from './DropdownMenuContext';
|
|
29
|
+
import {focusMenuItemOnHover} from './menuItemHover';
|
|
29
30
|
import {
|
|
30
31
|
colorVars,
|
|
31
32
|
spacingVars,
|
|
@@ -45,7 +46,6 @@ const styles = stylex.create({
|
|
|
45
46
|
backgroundColor: {
|
|
46
47
|
default: 'transparent',
|
|
47
48
|
':focus': colorVars['--color-overlay-hover'],
|
|
48
|
-
':hover': colorVars['--color-overlay-hover'],
|
|
49
49
|
},
|
|
50
50
|
cursor: 'pointer',
|
|
51
51
|
outline: 'none',
|
|
@@ -184,12 +184,18 @@ export function DropdownMenuRadioItem({
|
|
|
184
184
|
}
|
|
185
185
|
}, [isDisabled, groupCtx, value, menuCtx]);
|
|
186
186
|
|
|
187
|
+
const handlePointerMove = useCallback(
|
|
188
|
+
(e: PointerEvent<HTMLElement>) => focusMenuItemOnHover(e, isDisabled),
|
|
189
|
+
[isDisabled],
|
|
190
|
+
);
|
|
191
|
+
|
|
187
192
|
return (
|
|
188
193
|
<Item
|
|
189
194
|
{...rest}
|
|
190
195
|
role="menuitemradio"
|
|
191
196
|
aria-checked={isChecked}
|
|
192
197
|
tabIndex={isDisabled ? undefined : -1}
|
|
198
|
+
onPointerMove={handlePointerMove}
|
|
193
199
|
marker={
|
|
194
200
|
<span
|
|
195
201
|
aria-hidden="true"
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../docs-types').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'DropdownMenuSubMenu',
|
|
7
|
+
subComponentOf: 'DropdownMenu',
|
|
8
|
+
displayName: 'Dropdown Menu Submenu',
|
|
9
|
+
isHiddenFromOverview: true,
|
|
10
|
+
description:
|
|
11
|
+
'A single menu row that reveals a nested flyout of its own items. The row adopts DropdownMenuItem semantics (label / icon / description / isDisabled); its children become the flyout content. Opens inline-end with viewport auto-flip; Right/Enter/Space opens and focuses the first item, Left/Escape closes and returns focus to the trigger (Right/Left swap in RTL). For data-driven menus, give a menu item a nested `items` array instead of using this component directly.',
|
|
12
|
+
playground: {
|
|
13
|
+
defaults: {label: 'Move to'},
|
|
14
|
+
},
|
|
15
|
+
props: [
|
|
16
|
+
{
|
|
17
|
+
name: 'label',
|
|
18
|
+
type: 'ReactNode',
|
|
19
|
+
description: 'Primary label text for the trigger row.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'icon',
|
|
23
|
+
type: 'IconType',
|
|
24
|
+
description:
|
|
25
|
+
'Icon to display before the label. See `astryx docs icons` for valid semantic names.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'description',
|
|
29
|
+
type: 'ReactNode',
|
|
30
|
+
description: 'Secondary description text displayed below the label.',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'children',
|
|
34
|
+
type: 'ReactNode',
|
|
35
|
+
description:
|
|
36
|
+
'The flyout menu items — the same components used at the top level (DropdownMenuItem, nested DropdownMenuSubMenu, selectable items).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'isDisabled',
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
default: 'false',
|
|
42
|
+
description:
|
|
43
|
+
'A disabled submenu renders its trigger row but never opens the flyout.',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'hasSpinner',
|
|
47
|
+
type: 'boolean',
|
|
48
|
+
default: 'false',
|
|
49
|
+
description:
|
|
50
|
+
'Show a spinner in place of the caret, e.g. while a lazy submenu’s children are loading.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'menuWidth',
|
|
54
|
+
type: 'number | string',
|
|
55
|
+
description: 'Fixed flyout width. Defaults to sizing to its content (min 160px).',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'onOpenChange',
|
|
59
|
+
type: '(isOpen: boolean) => void',
|
|
60
|
+
description: 'Called when the flyout opens or closes.',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'xstyle',
|
|
64
|
+
type: 'StyleXStyles',
|
|
65
|
+
description:
|
|
66
|
+
'StyleX styles for the trigger row. Must be a stylex.create() value: not an inline style object like style={{}}.',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export const docsDense = {
|
|
72
|
+
name: 'DropdownMenuSubMenu',
|
|
73
|
+
isHiddenFromOverview: true,
|
|
74
|
+
displayName: 'Dropdown Menu Submenu',
|
|
75
|
+
description:
|
|
76
|
+
'menu row that reveals a nested flyout of its own children/items (single component, not Sub/SubTrigger/SubContent)',
|
|
77
|
+
propDescriptions: {
|
|
78
|
+
label: 'primary label text for the trigger row',
|
|
79
|
+
icon: 'icon before label',
|
|
80
|
+
description: 'secondary text below label',
|
|
81
|
+
children: 'flyout menu items (same components as top level)',
|
|
82
|
+
isDisabled: 'renders trigger but never opens',
|
|
83
|
+
hasSpinner: 'spinner instead of caret for async children',
|
|
84
|
+
menuWidth: 'fixed flyout width (default: content, min 160px)',
|
|
85
|
+
onOpenChange: 'called when flyout opens/closes',
|
|
86
|
+
xstyle: 'StyleX styles for the trigger row',
|
|
87
|
+
},
|
|
88
|
+
};
|