@astryxdesign/core 0.3.0 → 0.4.0
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 +156 -0
- package/dist/AlertDialog/AlertDialog.d.ts +10 -2
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +22 -3
- package/dist/AppShell/AppShell.d.ts +2 -2
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +40 -9
- package/dist/AspectRatio/AspectRatio.d.ts +13 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +9 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -20
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +15 -14
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
- package/dist/Breadcrumbs/index.d.ts +2 -1
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +1 -0
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -15
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +2 -1
- package/dist/Calendar/styles.d.ts +0 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +0 -2
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +8 -12
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +2 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +3 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +4 -3
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +17 -17
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -6
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +36 -125
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -11
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +84 -67
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +35 -15
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +6 -3
- package/dist/CommandPalette/CommandPaletteList.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +35 -33
- package/dist/ContextMenu/ContextMenu.d.ts +2 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +1 -1
- package/dist/ContextMenu/index.d.ts +2 -1
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +1 -0
- package/dist/DateInput/DateInput.d.ts +9 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +24 -23
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +11 -16
- package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +22 -17
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +4 -4
- package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +62 -20
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
- package/dist/DropdownMenu/index.d.ts +2 -1
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +4 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +35 -27
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +9 -5
- package/dist/Field/InputClearButton.d.ts +16 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +15 -4
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -19
- package/dist/Indicator/CheckIndicator.d.ts +25 -0
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckIndicator.js +155 -0
- package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckboxIndicator.js +173 -0
- package/dist/Indicator/RadioIndicator.d.ts +23 -0
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
- package/dist/Indicator/RadioIndicator.js +137 -0
- package/dist/Indicator/index.d.ts +24 -0
- package/dist/Indicator/index.d.ts.map +1 -0
- package/dist/Indicator/index.js +26 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
- package/dist/Indicator/indicator.markers.stylex.js +21 -0
- package/dist/Indicator/indicatorRegistry.d.ts +71 -0
- package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
- package/dist/Indicator/indicatorRegistry.js +93 -0
- package/dist/Indicator/types.d.ts +167 -0
- package/dist/Indicator/types.d.ts.map +1 -0
- package/dist/Indicator/types.js +1 -0
- package/dist/Indicator/useIndicator.d.ts +18 -0
- package/dist/Indicator/useIndicator.d.ts.map +1 -0
- package/dist/Indicator/useIndicator.js +30 -0
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -8
- package/dist/Layer/useLayer.d.ts +14 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +25 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +56 -53
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +4 -5
- package/dist/MobileNav/MobileNav.js +8 -8
- package/dist/MoreMenu/MoreMenu.d.ts +14 -1
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +78 -75
- package/dist/NumberInput/NumberInput.d.ts +27 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +230 -42
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +2 -3
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +61 -63
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -8
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
- package/dist/ProgressBar/ProgressBar.d.ts +11 -4
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +96 -6
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +29 -84
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +2 -3
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -11
- package/dist/Selector/Selector.d.ts +2 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +164 -94
- package/dist/Selector/hooks.d.ts +18 -6
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +57 -40
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +29 -14
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +56 -20
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +28 -22
- package/dist/Stack/stack.stylex.d.ts +3 -3
- package/dist/Switch/Switch.js +11 -10
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +2 -3
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +41 -19
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +8 -0
- package/dist/Table/index.d.ts +1 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
- package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/index.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +2 -1
- package/dist/Table/types.d.ts +11 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -6
- package/dist/TextInput/TextInput.d.ts +10 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +13 -19
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +32 -26
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +7 -15
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
- package/dist/Timestamp/TimestampHoverCard.js +16 -34
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -11
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -19
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +6 -5
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +54 -16
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -9
- package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +146 -60
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +83 -38
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +13 -0
- package/dist/TreeList/TreeListBranches.d.ts +1 -1
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +14 -4
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +57 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -8
- package/dist/astryx.css +74 -85
- package/dist/astryx.umd.js +56 -56
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.stylex.d.ts +61 -0
- package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.stylex.js +63 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/useClipboard.d.ts +59 -0
- package/dist/hooks/useClipboard.d.ts.map +1 -0
- package/dist/hooks/useClipboard.js +106 -0
- package/dist/hooks/useContainerReveal.d.ts +14 -8
- package/dist/hooks/useContainerReveal.d.ts.map +1 -1
- package/dist/hooks/useContainerReveal.js +28 -69
- package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
- package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
- package/dist/hooks/useIndicatorFocusRing.js +96 -0
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +12 -2
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +33 -18
- package/dist/hooks/useStreamingText.d.ts +18 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +47 -7
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +9 -3
- package/dist/hooks/useTypeahead.d.ts +3 -2
- package/dist/hooks/useTypeahead.d.ts.map +1 -1
- package/dist/hooks/useTypeahead.js +19 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/defineTheme.d.ts +16 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +8 -0
- package/dist/theme/derivedVarRegistry.d.ts +8 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +14 -13
- package/dist/theme/expandColorScale.d.ts +3 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +17 -7
- package/dist/theme/expandTypeScale.d.ts.map +1 -1
- package/dist/theme/expandTypeScale.js +17 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +11 -0
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.d.ts +107 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
- package/dist/utils/focusOutline.stylex.js +130 -0
- package/dist/utils/focusReturn.d.ts +24 -0
- package/dist/utils/focusReturn.d.ts.map +1 -0
- package/dist/utils/focusReturn.js +29 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/mergeRefs.d.ts.map +1 -1
- package/dist/utils/mergeRefs.js +7 -5
- package/dist/utils/rtlStyles.d.ts +2 -2
- package/dist/utils/rtlStyles.js +2 -2
- package/dist/utils/themeProps.d.ts +20 -1
- package/dist/utils/themeProps.d.ts.map +1 -1
- package/dist/utils/themeProps.js +8 -2
- package/locales/en.json +12 -0
- package/locales/pseudo.json +9 -0
- package/package.json +7 -2
- package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
- package/src/AlertDialog/AlertDialog.test.tsx +208 -1
- package/src/AlertDialog/AlertDialog.tsx +21 -3
- package/src/AppShell/AppShell.doc.mjs +11 -0
- package/src/AppShell/AppShell.test.tsx +139 -0
- package/src/AppShell/AppShell.tsx +32 -22
- package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
- package/src/AspectRatio/AspectRatio.test.tsx +30 -0
- package/src/AspectRatio/AspectRatio.tsx +13 -0
- package/src/Avatar/Avatar.doc.mjs +2 -13
- package/src/Avatar/Avatar.test.tsx +33 -8
- package/src/Avatar/Avatar.tsx +52 -50
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
- package/src/Banner/Banner.tsx +9 -6
- package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
- package/src/Breadcrumbs/index.ts +5 -1
- package/src/Button/Button.tsx +21 -41
- package/src/Calendar/Calendar.tsx +2 -1
- package/src/Calendar/styles.ts +0 -8
- package/src/Carousel/Carousel.doc.mjs +3 -0
- package/src/Carousel/Carousel.tsx +10 -6
- package/src/Chat/Chat.doc.mjs +2 -0
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
- package/src/Chat/ChatSendButton.tsx +2 -3
- package/src/Chat/ChatToolCalls.test.tsx +35 -0
- package/src/Chat/ChatToolCalls.tsx +36 -16
- package/src/Chat/useTriggerMenu.tsx +2 -5
- package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
- package/src/CheckboxInput/CheckboxInput.test.tsx +115 -0
- package/src/CheckboxInput/CheckboxInput.tsx +45 -202
- package/src/ClickableCard/ClickableCard.tsx +6 -11
- package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
- package/src/CodeBlock/CodeBlock.test.tsx +91 -0
- package/src/CodeBlock/CodeBlock.tsx +57 -80
- package/src/Collapsible/Collapsible.tsx +22 -18
- package/src/CommandPalette/CommandPalette.test.tsx +29 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
- package/src/CommandPalette/CommandPaletteList.tsx +2 -2
- package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +64 -0
- package/src/ComplexSelector/ComplexSelector.tsx +46 -29
- package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +41 -0
- package/src/ContextMenu/ContextMenu.tsx +3 -3
- package/src/ContextMenu/index.ts +5 -1
- package/src/DateInput/DateInput.doc.mjs +18 -3
- package/src/DateInput/DateInput.test.tsx +93 -11
- package/src/DateInput/DateInput.tsx +41 -19
- package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
- package/src/DateRangeInput/DateRangeInput.tsx +24 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +75 -0
- package/src/DateTimeInput/DateTimeInput.tsx +35 -8
- package/src/Dialog/Dialog.tsx +2 -9
- package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
- package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
- package/src/DropdownMenu/DropdownMenu.tsx +113 -52
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
- package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
- package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
- package/src/DropdownMenu/index.ts +8 -1
- package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
- package/src/EmptyState/EmptyState.doc.mjs +4 -0
- package/src/EmptyState/EmptyState.test.tsx +62 -0
- package/src/EmptyState/EmptyState.tsx +16 -6
- package/src/Field/Field.doc.mjs +1 -0
- package/src/Field/InputClearButton.test.tsx +117 -0
- package/src/Field/InputClearButton.tsx +30 -3
- package/src/HoverCard/useHoverCard.tsx +2 -23
- package/src/Icon/Icon.doc.mjs +2 -1
- package/src/Indicator/CheckIndicator.tsx +174 -0
- package/src/Indicator/CheckboxIndicator.tsx +257 -0
- package/src/Indicator/Indicator.doc.mjs +344 -0
- package/src/Indicator/Indicator.test.tsx +393 -0
- package/src/Indicator/RadioIndicator.tsx +206 -0
- package/src/Indicator/index.ts +45 -0
- package/src/Indicator/indicator.markers.stylex.ts +19 -0
- package/src/Indicator/indicatorRegistry.test.tsx +106 -0
- package/src/Indicator/indicatorRegistry.ts +120 -0
- package/src/Indicator/types.ts +186 -0
- package/src/Indicator/useIndicator.ts +39 -0
- package/src/Item/Item.doc.mjs +1 -1
- package/src/Item/Item.tsx +7 -14
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +85 -0
- package/src/Layer/useLayer.tsx +39 -1
- package/src/Lightbox/Lightbox.doc.mjs +1 -1
- package/src/Lightbox/Lightbox.tsx +43 -38
- package/src/Link/Link.tsx +4 -11
- package/src/MobileNav/MobileNav.tsx +3 -3
- package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
- package/src/MoreMenu/MoreMenu.test.tsx +68 -1
- package/src/MoreMenu/MoreMenu.tsx +19 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +9 -1
- package/src/MultiSelector/MultiSelector.test.tsx +255 -16
- package/src/MultiSelector/MultiSelector.tsx +103 -99
- package/src/NumberInput/NumberInput.doc.mjs +265 -50
- package/src/NumberInput/NumberInput.test.tsx +726 -21
- package/src/NumberInput/NumberInput.tsx +353 -59
- package/src/Outline/Outline.tsx +2 -5
- package/src/Pagination/Pagination.doc.mjs +1 -1
- package/src/Pagination/Pagination.test.tsx +22 -7
- package/src/Pagination/Pagination.tsx +38 -35
- package/src/Popover/Popover.tsx +6 -7
- package/src/PowerSearch/PowerSearch.tsx +1 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
- package/src/ProgressBar/ProgressBar.test.tsx +224 -1
- package/src/ProgressBar/ProgressBar.tsx +124 -22
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioListItem.tsx +31 -130
- package/src/Resizable/ResizeHandle.tsx +2 -9
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
- package/src/SelectableCard/SelectableCard.tsx +4 -9
- package/src/Selector/Selector.doc.mjs +7 -4
- package/src/Selector/Selector.test.tsx +935 -25
- package/src/Selector/Selector.tsx +189 -106
- package/src/Selector/hooks.ts +77 -50
- package/src/SideNav/SideNav.test.tsx +46 -0
- package/src/SideNav/SideNav.tsx +1 -0
- package/src/SideNav/SideNavCollapseButton.tsx +15 -10
- package/src/SideNav/SideNavHeading.tsx +48 -10
- package/src/SideNav/SideNavItem.tsx +20 -12
- package/src/Stack/Stack.doc.mjs +110 -0
- package/src/StatusDot/StatusDot.doc.mjs +12 -3
- package/src/Switch/Switch.test.tsx +32 -0
- package/src/Switch/Switch.tsx +8 -8
- package/src/TabList/Tab.tsx +2 -9
- package/src/TabList/TabMenu.tsx +14 -21
- package/src/Table/BaseTable.tsx +11 -0
- package/src/Table/index.ts +1 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
- package/src/Table/plugins/rowExpansion/index.ts +1 -4
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
- package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
- package/src/Table/tableContextMenu.test.tsx +27 -0
- package/src/Table/tableContextMenu.tsx +1 -0
- package/src/Table/types.ts +11 -0
- package/src/Table/useTableGroupedRows.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +43 -66
- package/src/TextArea/TextArea.doc.mjs +42 -2
- package/src/TextArea/TextArea.test.tsx +219 -0
- package/src/TextArea/TextArea.tsx +34 -7
- package/src/TextInput/TextInput.doc.mjs +18 -2
- package/src/TextInput/TextInput.test.tsx +189 -0
- package/src/TextInput/TextInput.tsx +25 -31
- package/src/Thumbnail/Thumbnail.tsx +2 -9
- package/src/TimeInput/TimeInput.doc.mjs +2 -2
- package/src/TimeInput/TimeInput.test.tsx +30 -3
- package/src/TimeInput/TimeInput.tsx +9 -26
- package/src/Timestamp/Timestamp.doc.mjs +4 -3
- package/src/Timestamp/TimestampHoverCard.tsx +13 -35
- package/src/Token/Token.tsx +5 -28
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +45 -3
- package/src/Tokenizer/Tokenizer.tsx +10 -2
- package/src/Tooltip/useTooltip.tsx +2 -23
- package/src/TopNav/TopNav.tsx +1 -3
- package/src/TopNav/TopNavHeading.tsx +42 -13
- package/src/TopNav/TopNavItem.tsx +3 -21
- package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
- package/src/TopNav/TopNavMegaMenu.tsx +118 -53
- package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
- package/src/TopNav/TopNavMenu.tsx +34 -37
- package/src/TreeList/TreeList.doc.mjs +5 -0
- package/src/TreeList/TreeList.test.tsx +206 -7
- package/src/TreeList/TreeList.tsx +22 -0
- package/src/TreeList/TreeListBranches.tsx +25 -2
- package/src/TreeList/TreeListItem.tsx +89 -52
- package/src/Typeahead/BaseTypeahead.tsx +19 -6
- package/src/Typeahead/Typeahead.doc.mjs +1 -0
- package/src/Typeahead/Typeahead.test.tsx +76 -3
- package/src/hooks/containerReveal.stylex.ts +102 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useClipboard.doc.mjs +87 -0
- package/src/hooks/useClipboard.test.tsx +151 -0
- package/src/hooks/useClipboard.ts +135 -0
- package/src/hooks/useContainerReveal.doc.mjs +7 -7
- package/src/hooks/useContainerReveal.test.tsx +42 -62
- package/src/hooks/useContainerReveal.ts +36 -91
- package/src/hooks/useImageMode.test.ts +1 -1
- package/src/hooks/useIndicatorFocusRing.tsx +120 -0
- package/src/hooks/useLongPress.test.tsx +18 -0
- package/src/hooks/useLongPress.ts +12 -2
- package/src/hooks/useScrollLock.test.ts +72 -0
- package/src/hooks/useScrollLock.ts +51 -19
- package/src/hooks/useStreamingText.test.ts +46 -1
- package/src/hooks/useStreamingText.ts +49 -7
- package/src/hooks/useTreeFocus.test.tsx +50 -0
- package/src/hooks/useTreeFocus.ts +14 -3
- package/src/hooks/useTypeahead.test.tsx +150 -0
- package/src/hooks/useTypeahead.ts +24 -9
- package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
- package/src/index.ts +1 -0
- package/src/theme/defineTheme.ts +24 -0
- package/src/theme/derivedVarRegistry.test.ts +21 -1
- package/src/theme/derivedVarRegistry.ts +19 -6
- package/src/theme/expandColorScale.test.ts +14 -0
- package/src/theme/expandColorScale.ts +24 -9
- package/src/theme/expandTypeScale.test.ts +43 -0
- package/src/theme/expandTypeScale.ts +17 -0
- package/src/theme/generateThemeRules.test.ts +61 -20
- package/src/theme/generateThemeRules.ts +11 -0
- package/src/theme/index.ts +13 -0
- package/src/utils/focusOutline.stylex.ts +163 -0
- package/src/utils/focusReturn.test.ts +42 -0
- package/src/utils/focusReturn.ts +31 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/mergeRefs.test.ts +48 -0
- package/src/utils/mergeRefs.ts +12 -6
- package/src/utils/rtlStyles.ts +2 -2
- package/src/utils/themeProps.ts +26 -4
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
- package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
- package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
- package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
- package/dist/RadioList/radio.markers.stylex.js +0 -12
- package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
- package/dist/hooks/containerReveal.pool.stylex.js +0 -292
- package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
- package/src/RadioList/radio.markers.stylex.ts +0 -10
- package/src/hooks/containerReveal.pool.stylex.ts +0 -571
|
@@ -14,6 +14,11 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Both modes use useListFocus for DOM-based keyboard navigation.
|
|
16
16
|
*
|
|
17
|
+
* Initial focus on open follows the input modality: a keyboard open
|
|
18
|
+
* (Enter / Space / ArrowDown on the trigger) focuses the first enabled item
|
|
19
|
+
* (APG menu-button); a pointer open focuses the menu container itself so no
|
|
20
|
+
* item reads as pre-selected, and the first ArrowDown then moves to item 1.
|
|
21
|
+
*
|
|
17
22
|
* SYNC: When modified, update these files to stay in sync:
|
|
18
23
|
* - /packages/core/src/DropdownMenu/DropdownMenu.doc.mjs
|
|
19
24
|
* - /packages/core/src/DropdownMenu/DropdownMenu.test.tsx
|
|
@@ -35,9 +40,9 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
35
40
|
import {usePopover} from '../Popover/usePopover';
|
|
36
41
|
import {Button, type ButtonProps} from '../Button';
|
|
37
42
|
import {Icon} from '../Icon';
|
|
38
|
-
import type {IconType} from '../Icon';
|
|
39
43
|
|
|
40
44
|
import {renderDropdownItems} from './renderDropdownItems';
|
|
45
|
+
import type {DropdownMenuItemProps} from './DropdownMenuItem';
|
|
41
46
|
import {
|
|
42
47
|
MENU_ITEM_ROLES,
|
|
43
48
|
MENU_ITEM_SELECTOR,
|
|
@@ -82,14 +87,6 @@ const styles = stylex.create({
|
|
|
82
87
|
popover: {
|
|
83
88
|
minWidth: 'anchor-size(width)',
|
|
84
89
|
},
|
|
85
|
-
popoverBlockGap: {
|
|
86
|
-
marginBlockStart: spacingVars['--spacing-1'],
|
|
87
|
-
marginBlockEnd: spacingVars['--spacing-1'],
|
|
88
|
-
},
|
|
89
|
-
popoverInlineGap: {
|
|
90
|
-
marginInlineStart: spacingVars['--spacing-1'],
|
|
91
|
-
marginInlineEnd: spacingVars['--spacing-1'],
|
|
92
|
-
},
|
|
93
90
|
popoverCustomWidth: (width: string | number) => ({
|
|
94
91
|
minWidth: typeof width === 'number' ? `${width}px` : width,
|
|
95
92
|
}),
|
|
@@ -99,11 +96,34 @@ const styles = stylex.create({
|
|
|
99
96
|
// Types
|
|
100
97
|
// =============================================================================
|
|
101
98
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
99
|
+
/**
|
|
100
|
+
* Data-mode shape for one menu row.
|
|
101
|
+
*
|
|
102
|
+
* The item fields are sourced from `DropdownMenuItemProps` — data mode renders
|
|
103
|
+
* through `DropdownMenuItem`, so the two APIs describe the same thing and must
|
|
104
|
+
* not drift. Only the fields listed here are part of the data API; add a key to
|
|
105
|
+
* the `Pick` to expose more of the item's props to `items`.
|
|
106
|
+
*/
|
|
107
|
+
export interface DropdownMenuItemData extends Pick<
|
|
108
|
+
DropdownMenuItemProps,
|
|
109
|
+
| 'icon'
|
|
110
|
+
| 'onClick'
|
|
111
|
+
| 'isDisabled'
|
|
112
|
+
| 'variant'
|
|
113
|
+
| 'description'
|
|
114
|
+
| 'endContent'
|
|
115
|
+
| 'hasCloseOnSelect'
|
|
116
|
+
> {
|
|
117
|
+
/**
|
|
118
|
+
* Stable identity for the row, used as its React key (as on
|
|
119
|
+
* `TreeListItemData`). Omit it and the row is keyed by position, which is
|
|
120
|
+
* correct for a fixed menu; set it when `items` can reorder, filter, or grow,
|
|
121
|
+
* so a row keeps its DOM node — and therefore keyboard focus — as the array
|
|
122
|
+
* changes around it.
|
|
123
|
+
*/
|
|
124
|
+
id?: string;
|
|
125
|
+
/** Primary label content. */
|
|
126
|
+
label: ReactNode;
|
|
107
127
|
/**
|
|
108
128
|
* Nested submenu entries. When present, this row becomes a submenu (a
|
|
109
129
|
* flyout revealing `items`) instead of a leaf action — no separate item
|
|
@@ -112,18 +132,24 @@ export interface DropdownMenuItemData {
|
|
|
112
132
|
items?: DropdownMenuOption[];
|
|
113
133
|
}
|
|
114
134
|
|
|
115
|
-
|
|
135
|
+
/**
|
|
136
|
+
* Data-mode shape for a divider row. The compound-mode peer is the
|
|
137
|
+
* `DropdownMenuDivider` component, which both modes render.
|
|
138
|
+
*/
|
|
139
|
+
export interface DropdownMenuDividerData {
|
|
116
140
|
type: 'divider';
|
|
117
141
|
}
|
|
118
142
|
|
|
119
143
|
export interface DropdownMenuSection {
|
|
120
144
|
type: 'section';
|
|
145
|
+
/** Stable identity for the group; see {@link DropdownMenuItemData.id}. */
|
|
146
|
+
id?: string;
|
|
121
147
|
title?: string;
|
|
122
148
|
items: DropdownMenuItemData[];
|
|
123
149
|
}
|
|
124
150
|
|
|
125
151
|
export type DropdownMenuOption =
|
|
126
|
-
DropdownMenuItemData |
|
|
152
|
+
DropdownMenuItemData | DropdownMenuDividerData | DropdownMenuSection;
|
|
127
153
|
|
|
128
154
|
// =============================================================================
|
|
129
155
|
// Props
|
|
@@ -254,6 +280,13 @@ export function DropdownMenu({
|
|
|
254
280
|
// captures the trigger instead of the first menu item.
|
|
255
281
|
const shouldFocusOnOpenRef = useRef(false);
|
|
256
282
|
|
|
283
|
+
// How the next open was initiated. Keyboard (and programmatic) opens focus
|
|
284
|
+
// the first enabled item per the APG menu-button pattern; pointer opens
|
|
285
|
+
// focus the menu container instead, so no item is visually highlighted as
|
|
286
|
+
// if pre-selected (#4477). Reset to 'keyboard' after every open so
|
|
287
|
+
// programmatic controlled opens keep the item-focus behavior.
|
|
288
|
+
const openModalityRef = useRef<'keyboard' | 'pointer'>('keyboard');
|
|
289
|
+
|
|
257
290
|
const handleLayerShow = useCallback(() => {
|
|
258
291
|
onOpenChange?.(true);
|
|
259
292
|
if (!isControlled) {
|
|
@@ -319,14 +352,26 @@ export function DropdownMenu({
|
|
|
319
352
|
}
|
|
320
353
|
}, [controlledIsOpen, isControlled, popover]);
|
|
321
354
|
|
|
322
|
-
// Move focus into the menu only after the layer has committed open
|
|
355
|
+
// Move focus into the menu only after the layer has committed open,
|
|
356
|
+
// honoring the input modality: keyboard (and programmatic) opens land on
|
|
357
|
+
// the first enabled item per the APG menu-button pattern; pointer opens
|
|
358
|
+
// focus the menu container itself (tabIndex={-1}) so no item is
|
|
359
|
+
// highlighted as if pre-selected (#4477). Container focus keeps arrows,
|
|
360
|
+
// typeahead, Escape and Tab in the menu's onKeyDown, and is also the
|
|
361
|
+
// fallback when no item is focusable (e.g. all disabled), mirroring the
|
|
362
|
+
// submenu flyout fallback.
|
|
323
363
|
useEffect(() => {
|
|
324
364
|
if (!popover.isOpen || !shouldFocusOnOpenRef.current) {
|
|
325
365
|
return;
|
|
326
366
|
}
|
|
327
367
|
shouldFocusOnOpenRef.current = false;
|
|
328
|
-
requestAnimationFrame(() =>
|
|
329
|
-
|
|
368
|
+
requestAnimationFrame(() => {
|
|
369
|
+
if (openModalityRef.current === 'pointer' || !focusFirst()) {
|
|
370
|
+
listRef.current?.focus();
|
|
371
|
+
}
|
|
372
|
+
openModalityRef.current = 'keyboard';
|
|
373
|
+
});
|
|
374
|
+
}, [popover.isOpen, focusFirst, listRef]);
|
|
330
375
|
|
|
331
376
|
// Extend useListFocus with Enter/Space activation + typeahead
|
|
332
377
|
const listKeyDown = useCallback(
|
|
@@ -366,36 +411,51 @@ export function DropdownMenu({
|
|
|
366
411
|
[listNavKeyDown, closeMenu, typeahead, ownsEvent],
|
|
367
412
|
);
|
|
368
413
|
|
|
369
|
-
const openAndFocus = useCallback(
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
414
|
+
const openAndFocus = useCallback(
|
|
415
|
+
(modality: 'keyboard' | 'pointer' = 'keyboard') => {
|
|
416
|
+
openModalityRef.current = modality;
|
|
417
|
+
shouldFocusOnOpenRef.current = true;
|
|
418
|
+
popover.show();
|
|
419
|
+
},
|
|
420
|
+
[popover],
|
|
421
|
+
);
|
|
373
422
|
|
|
374
|
-
const handleButtonClick = useCallback(
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
423
|
+
const handleButtonClick = useCallback(
|
|
424
|
+
(e: React.MouseEvent<HTMLButtonElement>) => {
|
|
425
|
+
// If the menu was just closed by light dismiss (e.g. iOS Safari fires
|
|
426
|
+
// pointerdown → hide before the trigger's click), the click would
|
|
427
|
+
// otherwise immediately re-open it. Short-circuit within the guard
|
|
428
|
+
// window.
|
|
429
|
+
if (Date.now() - lastHideTimeRef.current < 50) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
onClick?.();
|
|
433
|
+
// detail === 0 marks a synthesized click (screen reader / AT
|
|
434
|
+
// activation): treat it as keyboard so those users still land on the
|
|
435
|
+
// first item. Real pointer clicks report detail >= 1.
|
|
436
|
+
const modality = e.detail === 0 ? 'keyboard' : 'pointer';
|
|
437
|
+
if (isControlled) {
|
|
438
|
+
if (!controlledIsOpen) {
|
|
439
|
+
openModalityRef.current = modality;
|
|
440
|
+
}
|
|
441
|
+
onOpenChange?.(!controlledIsOpen);
|
|
387
442
|
} else {
|
|
388
|
-
|
|
443
|
+
if (popover.isOpen) {
|
|
444
|
+
popover.hide();
|
|
445
|
+
} else {
|
|
446
|
+
openAndFocus(modality);
|
|
447
|
+
}
|
|
389
448
|
}
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
449
|
+
},
|
|
450
|
+
[
|
|
451
|
+
onClick,
|
|
452
|
+
isControlled,
|
|
453
|
+
onOpenChange,
|
|
454
|
+
controlledIsOpen,
|
|
455
|
+
popover,
|
|
456
|
+
openAndFocus,
|
|
457
|
+
],
|
|
458
|
+
);
|
|
399
459
|
|
|
400
460
|
const handleButtonKeyDown = useCallback(
|
|
401
461
|
(e: React.KeyboardEvent) => {
|
|
@@ -421,11 +481,6 @@ export function DropdownMenu({
|
|
|
421
481
|
const popoverXstyle = menuWidth
|
|
422
482
|
? styles.popoverCustomWidth(menuWidth)
|
|
423
483
|
: styles.popover;
|
|
424
|
-
const popoverGapStyle =
|
|
425
|
-
placement === 'above' || placement === 'below'
|
|
426
|
-
? styles.popoverBlockGap
|
|
427
|
-
: styles.popoverInlineGap;
|
|
428
|
-
|
|
429
484
|
// Context for compound items
|
|
430
485
|
const contextValue = useMemo<DropdownMenuContextValue>(
|
|
431
486
|
() => ({closeMenu, menuSize}),
|
|
@@ -468,6 +523,11 @@ export function DropdownMenu({
|
|
|
468
523
|
ref={listRef}
|
|
469
524
|
id={menuId}
|
|
470
525
|
role="menu"
|
|
526
|
+
// Focus target for pointer opens (not in the Tab order): holding
|
|
527
|
+
// focus on the container keeps key events (arrows, typeahead,
|
|
528
|
+
// Escape, Tab) inside the menu without highlighting any item.
|
|
529
|
+
// Mirrors the DropdownMenuSubMenu flyout container.
|
|
530
|
+
tabIndex={-1}
|
|
471
531
|
// Give the menu an accessible name from its trigger's label, so
|
|
472
532
|
// screen readers announce e.g. "Actions menu" rather than an unnamed
|
|
473
533
|
// menu (menus-13).
|
|
@@ -486,7 +546,8 @@ export function DropdownMenu({
|
|
|
486
546
|
{
|
|
487
547
|
placement,
|
|
488
548
|
alignment,
|
|
489
|
-
|
|
549
|
+
offset: spacingVars['--spacing-1'],
|
|
550
|
+
xstyle: [popoverXstyle, layerAnimations[placement]],
|
|
490
551
|
},
|
|
491
552
|
)}
|
|
492
553
|
</>
|
|
@@ -15,24 +15,21 @@
|
|
|
15
15
|
* Enter/Space activation come from the parent DropdownMenu's useListFocus +
|
|
16
16
|
* activation path, which matches menuitemcheckbox alongside plain menuitem rows.
|
|
17
17
|
*
|
|
18
|
-
* The checkbox visual
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* `sm` menu gets the compact control; `md`/`lg` get the standard one) and it
|
|
27
|
-
* swaps to the inline-end of the row on coarse-pointer (touch) devices via CSS
|
|
28
|
-
* `order`, so it lands where selection toggles are conventionally placed on
|
|
18
|
+
* The checkbox visual is the shared checkbox indicator, decorative
|
|
19
|
+
* (aria-hidden) — the row owns the role, checked state, and accessible name, so
|
|
20
|
+
* there is no nested native <input> to shim out of the accessibility tree. It
|
|
21
|
+
* picks up the same `checkbox` theming (and any theme replacement) as
|
|
22
|
+
* CheckboxInput. The control size is derived from the menu's item size (a `sm`
|
|
23
|
+
* menu gets the compact control; `md`/`lg` get the standard one) and the marker
|
|
24
|
+
* box swaps to the inline-end of the row on coarse-pointer (touch) devices via
|
|
25
|
+
* CSS `order`, so it lands where selection toggles are conventionally placed on
|
|
29
26
|
* mobile.
|
|
30
27
|
*/
|
|
31
28
|
|
|
32
29
|
import {useCallback, type PointerEvent, type ReactNode} from 'react';
|
|
33
30
|
import * as stylex from '@stylexjs/stylex';
|
|
34
31
|
import {renderIconSlot, type IconType} from '../Icon';
|
|
35
|
-
import {
|
|
32
|
+
import {useIndicator} from '../Indicator';
|
|
36
33
|
import {Item} from '../Item';
|
|
37
34
|
import {useDropdownMenuContext} from './DropdownMenuContext';
|
|
38
35
|
import {focusMenuItemOnHover} from './menuItemHover';
|
|
@@ -61,9 +58,10 @@ const styles = stylex.create({
|
|
|
61
58
|
// `aria-hidden` + `inert` + pointer-events:none keep the composed CheckboxInput
|
|
62
59
|
// decorative: it adds no accessible name, and clicks fall through to the row,
|
|
63
60
|
// which owns the role and activation.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
61
|
+
// Placement of the marker within the row. The indicator draws its own box
|
|
62
|
+
// (size, fill, border) — these are only the rules the MENU owns: where the
|
|
63
|
+
// marker sits in the row, and that it never takes the pointer.
|
|
64
|
+
marker: {
|
|
67
65
|
pointerEvents: 'none',
|
|
68
66
|
order: {
|
|
69
67
|
default: 0,
|
|
@@ -76,6 +74,8 @@ const styles = stylex.create({
|
|
|
76
74
|
},
|
|
77
75
|
});
|
|
78
76
|
|
|
77
|
+
// Matches the control sizes CheckboxInput uses, so a checkbox reads the same in
|
|
78
|
+
// a menu row as it does in a form.
|
|
79
79
|
export interface DropdownMenuCheckboxItemProps extends Omit<
|
|
80
80
|
BaseProps,
|
|
81
81
|
'onChange' | 'role' | 'aria-checked' | 'tabIndex'
|
|
@@ -157,12 +157,7 @@ export function DropdownMenuCheckboxItem({
|
|
|
157
157
|
const ctx = useDropdownMenuContext();
|
|
158
158
|
const menuSize = ctx?.menuSize ?? 'md';
|
|
159
159
|
const controlSize = menuSize === 'sm' ? 'sm' : 'md';
|
|
160
|
-
|
|
161
|
-
// The composed checkbox is decorative and inert, so its label never reaches
|
|
162
|
-
// the accessibility tree — the row's `label` prop provides the announced
|
|
163
|
-
// name. CheckboxInput still requires a string label, so pass one through when
|
|
164
|
-
// the row label is a plain string.
|
|
165
|
-
const checkboxLabel = typeof label === 'string' ? label : '';
|
|
160
|
+
const CheckboxControl = useIndicator('checkbox');
|
|
166
161
|
|
|
167
162
|
const handleClick = useCallback(() => {
|
|
168
163
|
if (isDisabled) {
|
|
@@ -187,15 +182,17 @@ export function DropdownMenuCheckboxItem({
|
|
|
187
182
|
tabIndex={isDisabled ? undefined : -1}
|
|
188
183
|
onPointerMove={handlePointerMove}
|
|
189
184
|
marker={
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
185
|
+
// No wrapper, and no menu-specific theme target: the shared
|
|
186
|
+
// `astryx-checkbox` target is already on this element (main reached
|
|
187
|
+
// the menu checkbox through it too), so the menu adds only its own
|
|
188
|
+
// placement rules. A wrapper here would have duplicated the
|
|
189
|
+
// indicator's control size and moved nothing themeable.
|
|
190
|
+
<CheckboxControl
|
|
191
|
+
state={value ? 'checked' : 'unchecked'}
|
|
192
|
+
size={controlSize}
|
|
193
|
+
isDisabled={isDisabled}
|
|
194
|
+
xstyle={styles.marker}
|
|
195
|
+
/>
|
|
199
196
|
}
|
|
200
197
|
startContent={
|
|
201
198
|
icon
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'DropdownMenuDivider',
|
|
7
|
+
subComponentOf: 'DropdownMenu',
|
|
8
|
+
displayName: 'Dropdown Menu Divider',
|
|
9
|
+
isHiddenFromOverview: true,
|
|
10
|
+
description:
|
|
11
|
+
'A horizontal rule separating groups of rows in a compound menu. Renders role="separator", so it is never a stop in the arrow-key order. The data-driven equivalent is the `{type: "divider"}` entry in `items`; both modes render this component, so they look and theme identically.',
|
|
12
|
+
props: [
|
|
13
|
+
{
|
|
14
|
+
name: 'xstyle',
|
|
15
|
+
type: 'StyleXStyles',
|
|
16
|
+
description:
|
|
17
|
+
'StyleX styles applied after the menu spacing. Must be a stylex.create() value: not an inline style object like style={{}}.',
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
theming: {
|
|
21
|
+
targets: [{className: 'astryx-dropdown-menu-divider'}],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const docsDense = {
|
|
26
|
+
name: 'DropdownMenuDivider',
|
|
27
|
+
isHiddenFromOverview: true,
|
|
28
|
+
displayName: 'Dropdown Menu Divider',
|
|
29
|
+
description:
|
|
30
|
+
'separator row for compound menus; compound peer of the data API\'s {type: "divider"}',
|
|
31
|
+
propDescriptions: {
|
|
32
|
+
xstyle: 'StyleX styles applied after the menu spacing',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file DropdownMenuDivider.tsx
|
|
7
|
+
* @input Uses Divider, spacing tokens, themeProps
|
|
8
|
+
* @output Exports DropdownMenuDivider component and DropdownMenuDividerProps
|
|
9
|
+
* @position Sub-component; used inside DropdownMenu
|
|
10
|
+
*
|
|
11
|
+
* The compound-mode peer of the data API's `{type: 'divider'}` option. The
|
|
12
|
+
* data path renders this same component, so neither mode can drift from the
|
|
13
|
+
* other in DOM, spacing, or theme target.
|
|
14
|
+
*
|
|
15
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
16
|
+
* - /packages/core/src/DropdownMenu/DropdownMenu.doc.mjs
|
|
17
|
+
* - /packages/core/src/DropdownMenu/DropdownMenuDivider.doc.mjs
|
|
18
|
+
* - /packages/core/src/DropdownMenu/DropdownMenu.test.tsx
|
|
19
|
+
* - /packages/core/src/DropdownMenu/index.ts
|
|
20
|
+
* - /packages/core/src/ContextMenu/index.ts
|
|
21
|
+
* - /packages/core/src/Breadcrumbs/index.ts
|
|
22
|
+
* - /apps/storybook/stories/DropdownMenu.stories.tsx
|
|
23
|
+
* - /packages/cli/assets/templates/blocks/components/DropdownMenu/ (showcase blocks)
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import * as stylex from '@stylexjs/stylex';
|
|
27
|
+
import {Divider} from '../Divider';
|
|
28
|
+
import {spacingVars} from '../theme/tokens.stylex';
|
|
29
|
+
import type {BaseProps} from '../BaseProps';
|
|
30
|
+
import {themeProps} from '../utils/themeProps';
|
|
31
|
+
|
|
32
|
+
const styles = stylex.create({
|
|
33
|
+
divider: {
|
|
34
|
+
marginBlock: spacingVars['--spacing-1'],
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const THEME_CLASS_NAME = themeProps('dropdown-menu-divider').className;
|
|
39
|
+
|
|
40
|
+
export interface DropdownMenuDividerProps extends Pick<
|
|
41
|
+
BaseProps,
|
|
42
|
+
'xstyle' | 'className' | 'style'
|
|
43
|
+
> {
|
|
44
|
+
/** Ref forwarded to the separator element. */
|
|
45
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* A horizontal rule separating groups of menu rows.
|
|
50
|
+
*
|
|
51
|
+
* Renders `role="separator"`, so it is never a stop in the menu's arrow-key
|
|
52
|
+
* order. Equivalent to `{type: 'divider'}` in the `items` data API.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```
|
|
56
|
+
* <DropdownMenu button={{ label: 'Actions' }}>
|
|
57
|
+
* <DropdownMenuItem label="Edit" onClick={handleEdit} />
|
|
58
|
+
* <DropdownMenuDivider />
|
|
59
|
+
* <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
|
|
60
|
+
* </DropdownMenu>
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function DropdownMenuDivider({
|
|
64
|
+
xstyle,
|
|
65
|
+
className,
|
|
66
|
+
style,
|
|
67
|
+
ref,
|
|
68
|
+
}: DropdownMenuDividerProps) {
|
|
69
|
+
return (
|
|
70
|
+
<Divider
|
|
71
|
+
ref={ref}
|
|
72
|
+
xstyle={[styles.divider, xstyle]}
|
|
73
|
+
className={
|
|
74
|
+
className ? `${THEME_CLASS_NAME} ${className}` : THEME_CLASS_NAME
|
|
75
|
+
}
|
|
76
|
+
style={style}
|
|
77
|
+
/>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
DropdownMenuDivider.displayName = 'DropdownMenuDivider';
|
|
@@ -7,7 +7,8 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'DropdownMenu',
|
|
8
8
|
displayName: 'Dropdown Menu Item',
|
|
9
9
|
isHiddenFromOverview: true,
|
|
10
|
-
description:
|
|
10
|
+
description:
|
|
11
|
+
'Helper component for custom item rendering with consistent styling.',
|
|
11
12
|
playground: {
|
|
12
13
|
// Standalone DropdownMenuItem has no required props, so the properties-tab
|
|
13
14
|
// preview renders an empty row without seeded content. Seed a label and
|
|
@@ -18,7 +19,8 @@ export const docs = {
|
|
|
18
19
|
{
|
|
19
20
|
name: 'icon',
|
|
20
21
|
type: 'IconType',
|
|
21
|
-
description:
|
|
22
|
+
description:
|
|
23
|
+
'Icon to display before the label. See `astryx docs icons` for valid semantic names.',
|
|
22
24
|
},
|
|
23
25
|
{
|
|
24
26
|
name: 'label',
|
|
@@ -33,12 +35,28 @@ export const docs = {
|
|
|
33
35
|
{
|
|
34
36
|
name: 'endContent',
|
|
35
37
|
type: 'ReactNode',
|
|
36
|
-
description:
|
|
38
|
+
description:
|
|
39
|
+
'Additional content rendered after the label and description.',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'hasCloseOnSelect',
|
|
43
|
+
type: 'boolean',
|
|
44
|
+
description:
|
|
45
|
+
'Whether activating the item closes the menu. Set false for an action that reports its result on the item itself.',
|
|
46
|
+
default: 'true',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'variant',
|
|
50
|
+
type: "'default' | 'destructive'",
|
|
51
|
+
description:
|
|
52
|
+
"Visual variant. 'destructive' renders the label, description, and icon in the error color for dangerous actions (e.g. Delete).",
|
|
53
|
+
default: "'default'",
|
|
37
54
|
},
|
|
38
55
|
{
|
|
39
56
|
name: 'xstyle',
|
|
40
57
|
type: 'StyleXStyles',
|
|
41
|
-
description:
|
|
58
|
+
description:
|
|
59
|
+
'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value: not an inline style object like style={{}}.',
|
|
42
60
|
},
|
|
43
61
|
],
|
|
44
62
|
};
|
|
@@ -69,6 +87,19 @@ export const docsZh = {
|
|
|
69
87
|
type: 'ReactNode',
|
|
70
88
|
description: '在标签和描述之后渲染的附加内容。',
|
|
71
89
|
},
|
|
90
|
+
{
|
|
91
|
+
name: 'hasCloseOnSelect',
|
|
92
|
+
type: 'boolean',
|
|
93
|
+
description: '激活该项时是否关闭菜单。若操作要在该项上就地反馈结果,请设为 false。',
|
|
94
|
+
default: 'true',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'variant',
|
|
98
|
+
type: "'default' | 'destructive'",
|
|
99
|
+
description:
|
|
100
|
+
"视觉变体。'destructive' 会以错误色渲染标签、描述和图标,用于危险操作(如删除)。",
|
|
101
|
+
default: "'default'",
|
|
102
|
+
},
|
|
72
103
|
{
|
|
73
104
|
name: 'xstyle',
|
|
74
105
|
type: 'StyleXStyles',
|
|
@@ -87,6 +118,10 @@ export const docsDense = {
|
|
|
87
118
|
label: 'primary label text',
|
|
88
119
|
description: 'secondary text below label',
|
|
89
120
|
endContent: 'additional content after label+description',
|
|
121
|
+
hasCloseOnSelect:
|
|
122
|
+
'false keeps the menu open on activation (in-place result on the item)',
|
|
123
|
+
variant:
|
|
124
|
+
"'destructive' renders the item in the error color for dangerous actions",
|
|
90
125
|
xstyle: 'StyleX styles for root container',
|
|
91
126
|
},
|
|
92
127
|
};
|
|
@@ -62,6 +62,15 @@ const menuItemStyles = stylex.create({
|
|
|
62
62
|
opacity: 0.5,
|
|
63
63
|
cursor: 'not-allowed',
|
|
64
64
|
},
|
|
65
|
+
destructive: {
|
|
66
|
+
// Only recolor the text/icon; the hover / focus background stays the shared
|
|
67
|
+
// neutral overlay from `root` so the hover state matches every other menu
|
|
68
|
+
// item. The root color covers the label/description via the Item custom
|
|
69
|
+
// properties (and any bare text). Semantic error tokens keep it theme-aware.
|
|
70
|
+
color: colorVars['--color-error'],
|
|
71
|
+
'--_item-label-color': colorVars['--color-error'],
|
|
72
|
+
'--_item-description-color': colorVars['--color-error'],
|
|
73
|
+
},
|
|
65
74
|
});
|
|
66
75
|
|
|
67
76
|
const itemSizeStyles = stylex.create({
|
|
@@ -91,6 +100,19 @@ export interface DropdownMenuItemProps extends Pick<
|
|
|
91
100
|
isDisabled?: boolean;
|
|
92
101
|
/** Additional content to render after the label/description. */
|
|
93
102
|
endContent?: ReactNode;
|
|
103
|
+
/**
|
|
104
|
+
* Whether activating the item closes the menu. Set `false` for an action
|
|
105
|
+
* that reports its result on the item itself (a copy row swapping to
|
|
106
|
+
* "Copied"), matching the checkbox and radio items, which already decide
|
|
107
|
+
* this for themselves.
|
|
108
|
+
* @default true
|
|
109
|
+
*/
|
|
110
|
+
hasCloseOnSelect?: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Visual variant. `'destructive'` renders the label, description, and icon in
|
|
113
|
+
* the error color for dangerous actions (e.g. Delete). @default 'default'
|
|
114
|
+
*/
|
|
115
|
+
variant?: 'default' | 'destructive';
|
|
94
116
|
}
|
|
95
117
|
|
|
96
118
|
/**
|
|
@@ -103,7 +125,7 @@ export interface DropdownMenuItemProps extends Pick<
|
|
|
103
125
|
* ```
|
|
104
126
|
* <DropdownMenu button={{ label: 'Actions' }}>
|
|
105
127
|
* <DropdownMenuItem icon={PencilIcon} label="Edit" onClick={handleEdit} />
|
|
106
|
-
* <DropdownMenuItem label="Delete"
|
|
128
|
+
* <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
|
|
107
129
|
* </DropdownMenu>
|
|
108
130
|
* ```
|
|
109
131
|
*/
|
|
@@ -114,6 +136,8 @@ export function DropdownMenuItem({
|
|
|
114
136
|
onClick,
|
|
115
137
|
isDisabled = false,
|
|
116
138
|
endContent,
|
|
139
|
+
hasCloseOnSelect = true,
|
|
140
|
+
variant = 'default',
|
|
117
141
|
xstyle,
|
|
118
142
|
className,
|
|
119
143
|
style,
|
|
@@ -122,18 +146,22 @@ export function DropdownMenuItem({
|
|
|
122
146
|
const menuSize = ctx?.menuSize ?? 'md';
|
|
123
147
|
|
|
124
148
|
const handleClick = useCallback(() => {
|
|
125
|
-
if (isDisabled
|
|
149
|
+
if (isDisabled) {
|
|
126
150
|
return;
|
|
127
151
|
}
|
|
128
|
-
onClick();
|
|
129
|
-
|
|
130
|
-
|
|
152
|
+
onClick?.();
|
|
153
|
+
if (hasCloseOnSelect) {
|
|
154
|
+
ctx?.closeMenu();
|
|
155
|
+
}
|
|
156
|
+
}, [isDisabled, onClick, hasCloseOnSelect, ctx]);
|
|
131
157
|
|
|
132
158
|
const handlePointerMove = useCallback(
|
|
133
159
|
(e: PointerEvent<HTMLElement>) => focusMenuItemOnHover(e, isDisabled),
|
|
134
160
|
[isDisabled],
|
|
135
161
|
);
|
|
136
162
|
|
|
163
|
+
const isDestructive = variant === 'destructive';
|
|
164
|
+
|
|
137
165
|
return (
|
|
138
166
|
<Item
|
|
139
167
|
role="menuitem"
|
|
@@ -141,7 +169,10 @@ export function DropdownMenuItem({
|
|
|
141
169
|
onPointerMove={handlePointerMove}
|
|
142
170
|
startContent={
|
|
143
171
|
icon
|
|
144
|
-
? renderIconSlot(icon, {
|
|
172
|
+
? renderIconSlot(icon, {
|
|
173
|
+
size: 'sm',
|
|
174
|
+
color: isDestructive ? 'error' : 'secondary',
|
|
175
|
+
})
|
|
145
176
|
: undefined
|
|
146
177
|
}
|
|
147
178
|
label={label}
|
|
@@ -152,13 +183,20 @@ export function DropdownMenuItem({
|
|
|
152
183
|
xstyle={[
|
|
153
184
|
menuItemStyles.root,
|
|
154
185
|
itemSizeStyles[menuSize],
|
|
186
|
+
isDestructive && menuItemStyles.destructive,
|
|
155
187
|
isDisabled && menuItemStyles.disabled,
|
|
156
188
|
xstyle,
|
|
157
189
|
]}
|
|
158
|
-
{...mergeProps(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
190
|
+
{...mergeProps(
|
|
191
|
+
themeProps('dropdown-menu-item', {
|
|
192
|
+
size: menuSize,
|
|
193
|
+
variant: isDestructive ? 'destructive' : null,
|
|
194
|
+
}),
|
|
195
|
+
{
|
|
196
|
+
className,
|
|
197
|
+
style,
|
|
198
|
+
},
|
|
199
|
+
)}
|
|
162
200
|
/>
|
|
163
201
|
);
|
|
164
202
|
}
|