@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
|
@@ -19,7 +19,7 @@ import { useId, useState, useCallback, useRef, useMemo, useOptimistic, useTransi
|
|
|
19
19
|
import * as stylex from '@stylexjs/stylex';
|
|
20
20
|
import "../theme/tokens.stylex.js";
|
|
21
21
|
import { colorVars, sizeVars, radiusVars, spacingVars, typographyVars, typeScaleVars, borderVars } from "../theme/tokens.stylex.js";
|
|
22
|
-
import { Field, inputWrapperStyles, inputStatusBorderStyles, inputStatusHoverShadowStyles, inputStatusFocusWithinStyles } from "../Field/index.js";
|
|
22
|
+
import { Field, InputClearButton, inputWrapperStyles, inputStatusBorderStyles, inputStatusHoverShadowStyles, inputStatusFocusWithinStyles } from "../Field/index.js";
|
|
23
23
|
import { Icon } from "../Icon/index.js";
|
|
24
24
|
import { VisuallyHidden } from "../VisuallyHidden/index.js";
|
|
25
25
|
import { Spinner } from "../Spinner/index.js";
|
|
@@ -29,7 +29,7 @@ import { usePopover } from "../Popover/index.js";
|
|
|
29
29
|
import { useTooltip } from "../Tooltip/index.js";
|
|
30
30
|
import { useInputContainer } from "../hooks/useInputContainer.js";
|
|
31
31
|
import { useInputStatusIcon } from "../hooks/useInputStatusIcon.js";
|
|
32
|
-
import { parseDateInput, parseTimeInput, formatDisplayTime12h, formatDisplayTime24h, formatISOTime, isTimeInRange, adjustTime, mergeProps, mergeRefs } from "../utils/index.js";
|
|
32
|
+
import { parseDateInput, parseTimeInput, formatDisplayTime12h, formatDisplayTime24h, formatISOTime, isTimeInRange, adjustTime, mergeProps, mergeRefs, isFocusDetached } from "../utils/index.js";
|
|
33
33
|
import { plainDateFromISO, plainDateToISO, plainDateFormat, DATE_FORMAT_LONG } from "../utils/plainDate.js";
|
|
34
34
|
import { useSize } from "../SizeContext/SizeContext.js";
|
|
35
35
|
import { themeProps } from "../utils/themeProps.js";
|
|
@@ -142,6 +142,7 @@ export function DateTimeInput({
|
|
|
142
142
|
status,
|
|
143
143
|
labelTooltip,
|
|
144
144
|
numberOfMonths = 1,
|
|
145
|
+
weekStartsOn,
|
|
145
146
|
width,
|
|
146
147
|
xstyle,
|
|
147
148
|
className,
|
|
@@ -286,7 +287,18 @@ export function DateTimeInput({
|
|
|
286
287
|
const popover = usePopover({
|
|
287
288
|
dialogLabel: t('@astryx.dateTimeInput.dialogLabel'),
|
|
288
289
|
closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
|
|
289
|
-
|
|
290
|
+
// Return focus to the date input when the calendar closes — but only when
|
|
291
|
+
// the dismiss left focus detached (Escape, or a click on non-focusable
|
|
292
|
+
// empty space), which the focus trap can't restore on its own. A native
|
|
293
|
+
// popover="auto" light-dismiss fires synchronously with the pointer event
|
|
294
|
+
// that moved focus, so if the user clicked another control — the time
|
|
295
|
+
// input, the clear button, another field, anywhere — focus has already
|
|
296
|
+
// landed there; reclaiming it would fight their click.
|
|
297
|
+
onHide: () => {
|
|
298
|
+
if (isFocusDetached()) {
|
|
299
|
+
dateInputRef.current?.focus();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
290
302
|
});
|
|
291
303
|
const handleCalendarToggle = useCallback(() => {
|
|
292
304
|
if (!isEffectivelyDisabled) {
|
|
@@ -495,7 +507,8 @@ export function DateTimeInput({
|
|
|
495
507
|
...rest,
|
|
496
508
|
...mergeProps(themeProps('date-time-input', {
|
|
497
509
|
size,
|
|
498
|
-
status: status?.type ?? null
|
|
510
|
+
status: status?.type ?? null,
|
|
511
|
+
disabled: isDisabled ? 'disabled' : null
|
|
499
512
|
}), stylex.props(styles.row, xstyle), className, style),
|
|
500
513
|
children: [/*#__PURE__*/_jsxs("div", {
|
|
501
514
|
ref: popover.triggerRef,
|
|
@@ -568,20 +581,11 @@ export function DateTimeInput({
|
|
|
568
581
|
role: "alert",
|
|
569
582
|
"aria-live": "assertive",
|
|
570
583
|
children: !isDateInputValid ? 'Invalid date' : ''
|
|
571
|
-
}), hasClear && value !== undefined && !isEffectivelyDisabled && /*#__PURE__*/_jsx(
|
|
572
|
-
|
|
573
|
-
onClick: handleClear,
|
|
574
|
-
"aria-label": t('@astryx.dateInput.clear', {
|
|
584
|
+
}), hasClear && value !== undefined && !isEffectivelyDisabled && /*#__PURE__*/_jsx(InputClearButton, {
|
|
585
|
+
label: t('@astryx.dateInput.clear', {
|
|
575
586
|
label
|
|
576
587
|
}),
|
|
577
|
-
|
|
578
|
-
className: "x78zum5 x6s0dn4 xl56j7k x1717udv x1ghz6dp xc342km xng3xce xjbqb8w x1ypdohk xh6dtrn x1a2a7pz x1p25gnr x1y3gkto"
|
|
579
|
-
},
|
|
580
|
-
children: /*#__PURE__*/_jsx(Icon, {
|
|
581
|
-
icon: "close",
|
|
582
|
-
size: "sm",
|
|
583
|
-
color: "secondary"
|
|
584
|
-
})
|
|
588
|
+
onClick: handleClear
|
|
585
589
|
}), isBusy && /*#__PURE__*/_jsx(Spinner, {
|
|
586
590
|
size: "sm"
|
|
587
591
|
}), statusIcon]
|
|
@@ -655,7 +659,8 @@ export function DateTimeInput({
|
|
|
655
659
|
min: calendarMin,
|
|
656
660
|
max: calendarMax,
|
|
657
661
|
dateConstraints: dateConstraints,
|
|
658
|
-
numberOfMonths: numberOfMonths
|
|
662
|
+
numberOfMonths: numberOfMonths,
|
|
663
|
+
weekStartsOn: weekStartsOn
|
|
659
664
|
}), {
|
|
660
665
|
placement: 'below',
|
|
661
666
|
alignment: 'start'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/Dialog/Dialog.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoB5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAKhD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/Dialog/Dialog.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoB5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAKhD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAsB9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzD,4EAA4E;AAC5E,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAe,SAAQ,mBAAmB;IACzD,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAuHD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,cAAc;;;;;EAUpE;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC/D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE3C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,QAAgB,EAChB,YAAY,EACZ,KAAW,EACX,SAAkB,EAClB,QAAQ,EACR,OAAoB,EACpB,OAAgB,EAChB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,sCA2Sb;yBA3Te,MAAM"}
|
package/dist/Dialog/Dialog.js
CHANGED
|
@@ -27,12 +27,14 @@ import { mergeProps, mergeRefs } from "../utils/index.js";
|
|
|
27
27
|
import { devWarn } from "../utils/devWarning.js";
|
|
28
28
|
import { DialogContext } from "./DialogContext.js";
|
|
29
29
|
import { themeProps } from "../utils/themeProps.js";
|
|
30
|
-
import {
|
|
30
|
+
import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
|
|
31
|
+
|
|
31
32
|
/**
|
|
32
33
|
* Calculate a directional translate offset for dialog entry animation.
|
|
33
34
|
* Returns a normalized vector from the trigger element toward the viewport
|
|
34
35
|
* center, scaled to the given distance.
|
|
35
36
|
*/
|
|
37
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
36
38
|
function getDialogDirection(triggerEl, distance = 16) {
|
|
37
39
|
const rect = triggerEl.getBoundingClientRect();
|
|
38
40
|
const dx = rect.left + rect.width / 2 - window.innerWidth / 2;
|
|
@@ -91,8 +93,6 @@ const styles = {
|
|
|
91
93
|
k44tkh: "xqgcaz",
|
|
92
94
|
kyAemX: "x128ha8g",
|
|
93
95
|
kWV6AL: "xskzprw",
|
|
94
|
-
kI3sdo: "x17nn4n9",
|
|
95
|
-
kInvED: "x1wfwxd8 x7s97pk",
|
|
96
96
|
$$css: true
|
|
97
97
|
},
|
|
98
98
|
open: {
|
|
@@ -447,7 +447,7 @@ export function Dialog({
|
|
|
447
447
|
...safeProps,
|
|
448
448
|
...mergeProps(themeProps('dialog', {
|
|
449
449
|
variant
|
|
450
|
-
}),
|
|
450
|
+
}), focusOutlineProps.focusVisible(styles.dialog, isOpen && styles.open, styles.backdrop, !isFullscreen && dynamicStyles.sizing(width, maxHeight), hasPosition && (() => {
|
|
451
451
|
const o = resolveDialogPositionOffsets(position);
|
|
452
452
|
return dynamicStyles.position(o.top, o.insetInlineStart, o.insetInlineEnd, o.bottom);
|
|
453
453
|
})(), isFullscreen && styles.fullscreen, xstyle), className, style),
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Both modes use useListFocus for DOM-based keyboard navigation.
|
|
12
12
|
*
|
|
13
|
+
* Initial focus on open follows the input modality: a keyboard open
|
|
14
|
+
* (Enter / Space / ArrowDown on the trigger) focuses the first enabled item
|
|
15
|
+
* (APG menu-button); a pointer open focuses the menu container itself so no
|
|
16
|
+
* item reads as pre-selected, and the first ArrowDown then moves to item 1.
|
|
17
|
+
*
|
|
13
18
|
* SYNC: When modified, update these files to stay in sync:
|
|
14
19
|
* - /packages/core/src/DropdownMenu/DropdownMenu.doc.mjs
|
|
15
20
|
* - /packages/core/src/DropdownMenu/DropdownMenu.test.tsx
|
|
@@ -19,14 +24,28 @@
|
|
|
19
24
|
*/
|
|
20
25
|
import React, { type ReactNode } from 'react';
|
|
21
26
|
import { type ButtonProps } from '../Button';
|
|
22
|
-
import type {
|
|
27
|
+
import type { DropdownMenuItemProps } from './DropdownMenuItem';
|
|
23
28
|
import type { LayerAlignment, LayerPlacement } from '../Layer/useLayer';
|
|
24
29
|
import type { BaseProps } from '../BaseProps';
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Data-mode shape for one menu row.
|
|
32
|
+
*
|
|
33
|
+
* The item fields are sourced from `DropdownMenuItemProps` — data mode renders
|
|
34
|
+
* through `DropdownMenuItem`, so the two APIs describe the same thing and must
|
|
35
|
+
* not drift. Only the fields listed here are part of the data API; add a key to
|
|
36
|
+
* the `Pick` to expose more of the item's props to `items`.
|
|
37
|
+
*/
|
|
38
|
+
export interface DropdownMenuItemData extends Pick<DropdownMenuItemProps, 'icon' | 'onClick' | 'isDisabled' | 'variant' | 'description' | 'endContent' | 'hasCloseOnSelect'> {
|
|
39
|
+
/**
|
|
40
|
+
* Stable identity for the row, used as its React key (as on
|
|
41
|
+
* `TreeListItemData`). Omit it and the row is keyed by position, which is
|
|
42
|
+
* correct for a fixed menu; set it when `items` can reorder, filter, or grow,
|
|
43
|
+
* so a row keeps its DOM node — and therefore keyboard focus — as the array
|
|
44
|
+
* changes around it.
|
|
45
|
+
*/
|
|
46
|
+
id?: string;
|
|
47
|
+
/** Primary label content. */
|
|
48
|
+
label: ReactNode;
|
|
30
49
|
/**
|
|
31
50
|
* Nested submenu entries. When present, this row becomes a submenu (a
|
|
32
51
|
* flyout revealing `items`) instead of a leaf action — no separate item
|
|
@@ -34,15 +53,21 @@ export interface DropdownMenuItemData {
|
|
|
34
53
|
*/
|
|
35
54
|
items?: DropdownMenuOption[];
|
|
36
55
|
}
|
|
37
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Data-mode shape for a divider row. The compound-mode peer is the
|
|
58
|
+
* `DropdownMenuDivider` component, which both modes render.
|
|
59
|
+
*/
|
|
60
|
+
export interface DropdownMenuDividerData {
|
|
38
61
|
type: 'divider';
|
|
39
62
|
}
|
|
40
63
|
export interface DropdownMenuSection {
|
|
41
64
|
type: 'section';
|
|
65
|
+
/** Stable identity for the group; see {@link DropdownMenuItemData.id}. */
|
|
66
|
+
id?: string;
|
|
42
67
|
title?: string;
|
|
43
68
|
items: DropdownMenuItemData[];
|
|
44
69
|
}
|
|
45
|
-
export type DropdownMenuOption = DropdownMenuItemData |
|
|
70
|
+
export type DropdownMenuOption = DropdownMenuItemData | DropdownMenuDividerData | DropdownMenuSection;
|
|
46
71
|
export type DropdownMenuButtonProps = Omit<ButtonProps, 'onClick'>;
|
|
47
72
|
interface DropdownMenuBaseProps extends BaseProps {
|
|
48
73
|
button?: DropdownMenuButtonProps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAS,KAAK,WAAW,EAAC,MAAM,WAAW,CAAC;AAInD,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAa9D,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAQtE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAiC5C;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,qBAAqB,EACnB,MAAM,GACN,SAAS,GACT,YAAY,GACZ,SAAS,GACT,aAAa,GACb,YAAY,GACZ,kBAAkB,CACrB;IACC;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,kBAAkB,GAC5B,oBAAoB,GAAG,uBAAuB,GAAG,mBAAmB,CAAC;AAMvE,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAEnE,UAAU,qBAAsB,SAAQ,SAAS;IAC/C,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,qBAAsB,SAAQ,qBAAqB;IAC3D,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,UAAU,yBAA0B,SAAQ,qBAAqB;IAC/D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAC3B,qBAAqB,GAAG,yBAAyB,CAAC;AA+BpD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAiB,EACjB,SAAmB,EACnB,SAAmB,EACnB,SAAS,EACT,KAAK,EACL,MAAM,EACN,aAAa,EAAE,MAAM,EACrB,GAAG,KAAK,EACT,EAAE,iBAAiB,qBA2TnB;yBAzUe,YAAY"}
|
|
@@ -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
|
|
@@ -60,16 +65,6 @@ const styles = {
|
|
|
60
65
|
k7Eaqz: "xrzjruh",
|
|
61
66
|
$$css: true
|
|
62
67
|
},
|
|
63
|
-
popoverBlockGap: {
|
|
64
|
-
keoZOQ: "xcsaf9d",
|
|
65
|
-
k1K539: "x14cgwvg",
|
|
66
|
-
$$css: true
|
|
67
|
-
},
|
|
68
|
-
popoverInlineGap: {
|
|
69
|
-
keTefX: "x11g1kdw",
|
|
70
|
-
k71WvV: "xnur1sd",
|
|
71
|
-
$$css: true
|
|
72
|
-
},
|
|
73
68
|
popoverCustomWidth: width => [{
|
|
74
69
|
k7Eaqz: (typeof width === 'number' ? `${width}px` : width) != null ? "xkj4a21" : typeof width === 'number' ? `${width}px` : width,
|
|
75
70
|
$$css: true
|
|
@@ -82,6 +77,20 @@ const styles = {
|
|
|
82
77
|
// Types
|
|
83
78
|
// =============================================================================
|
|
84
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Data-mode shape for one menu row.
|
|
82
|
+
*
|
|
83
|
+
* The item fields are sourced from `DropdownMenuItemProps` — data mode renders
|
|
84
|
+
* through `DropdownMenuItem`, so the two APIs describe the same thing and must
|
|
85
|
+
* not drift. Only the fields listed here are part of the data API; add a key to
|
|
86
|
+
* the `Pick` to expose more of the item's props to `items`.
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Data-mode shape for a divider row. The compound-mode peer is the
|
|
91
|
+
* `DropdownMenuDivider` component, which both modes render.
|
|
92
|
+
*/
|
|
93
|
+
|
|
85
94
|
// =============================================================================
|
|
86
95
|
// Props
|
|
87
96
|
// =============================================================================
|
|
@@ -170,6 +179,13 @@ export function DropdownMenu({
|
|
|
170
179
|
// Defer item focus until the layer has committed open, so focus restore
|
|
171
180
|
// captures the trigger instead of the first menu item.
|
|
172
181
|
const shouldFocusOnOpenRef = useRef(false);
|
|
182
|
+
|
|
183
|
+
// How the next open was initiated. Keyboard (and programmatic) opens focus
|
|
184
|
+
// the first enabled item per the APG menu-button pattern; pointer opens
|
|
185
|
+
// focus the menu container instead, so no item is visually highlighted as
|
|
186
|
+
// if pre-selected (#4477). Reset to 'keyboard' after every open so
|
|
187
|
+
// programmatic controlled opens keep the item-focus behavior.
|
|
188
|
+
const openModalityRef = useRef('keyboard');
|
|
173
189
|
const handleLayerShow = useCallback(() => {
|
|
174
190
|
onOpenChange?.(true);
|
|
175
191
|
if (!isControlled) {
|
|
@@ -229,14 +245,26 @@ export function DropdownMenu({
|
|
|
229
245
|
}
|
|
230
246
|
}, [controlledIsOpen, isControlled, popover]);
|
|
231
247
|
|
|
232
|
-
// Move focus into the menu only after the layer has committed open
|
|
248
|
+
// Move focus into the menu only after the layer has committed open,
|
|
249
|
+
// honoring the input modality: keyboard (and programmatic) opens land on
|
|
250
|
+
// the first enabled item per the APG menu-button pattern; pointer opens
|
|
251
|
+
// focus the menu container itself (tabIndex={-1}) so no item is
|
|
252
|
+
// highlighted as if pre-selected (#4477). Container focus keeps arrows,
|
|
253
|
+
// typeahead, Escape and Tab in the menu's onKeyDown, and is also the
|
|
254
|
+
// fallback when no item is focusable (e.g. all disabled), mirroring the
|
|
255
|
+
// submenu flyout fallback.
|
|
233
256
|
useEffect(() => {
|
|
234
257
|
if (!popover.isOpen || !shouldFocusOnOpenRef.current) {
|
|
235
258
|
return;
|
|
236
259
|
}
|
|
237
260
|
shouldFocusOnOpenRef.current = false;
|
|
238
|
-
requestAnimationFrame(() =>
|
|
239
|
-
|
|
261
|
+
requestAnimationFrame(() => {
|
|
262
|
+
if (openModalityRef.current === 'pointer' || !focusFirst()) {
|
|
263
|
+
listRef.current?.focus();
|
|
264
|
+
}
|
|
265
|
+
openModalityRef.current = 'keyboard';
|
|
266
|
+
});
|
|
267
|
+
}, [popover.isOpen, focusFirst, listRef]);
|
|
240
268
|
|
|
241
269
|
// Extend useListFocus with Enter/Space activation + typeahead
|
|
242
270
|
const listKeyDown = useCallback(e => {
|
|
@@ -269,25 +297,34 @@ export function DropdownMenu({
|
|
|
269
297
|
}
|
|
270
298
|
listNavKeyDown(e);
|
|
271
299
|
}, [listNavKeyDown, closeMenu, typeahead, ownsEvent]);
|
|
272
|
-
const openAndFocus = useCallback(() => {
|
|
300
|
+
const openAndFocus = useCallback((modality = 'keyboard') => {
|
|
301
|
+
openModalityRef.current = modality;
|
|
273
302
|
shouldFocusOnOpenRef.current = true;
|
|
274
303
|
popover.show();
|
|
275
304
|
}, [popover]);
|
|
276
|
-
const handleButtonClick = useCallback(
|
|
305
|
+
const handleButtonClick = useCallback(e => {
|
|
277
306
|
// If the menu was just closed by light dismiss (e.g. iOS Safari fires
|
|
278
307
|
// pointerdown → hide before the trigger's click), the click would
|
|
279
|
-
// otherwise immediately re-open it. Short-circuit within the guard
|
|
308
|
+
// otherwise immediately re-open it. Short-circuit within the guard
|
|
309
|
+
// window.
|
|
280
310
|
if (Date.now() - lastHideTimeRef.current < 50) {
|
|
281
311
|
return;
|
|
282
312
|
}
|
|
283
313
|
onClick?.();
|
|
314
|
+
// detail === 0 marks a synthesized click (screen reader / AT
|
|
315
|
+
// activation): treat it as keyboard so those users still land on the
|
|
316
|
+
// first item. Real pointer clicks report detail >= 1.
|
|
317
|
+
const modality = e.detail === 0 ? 'keyboard' : 'pointer';
|
|
284
318
|
if (isControlled) {
|
|
319
|
+
if (!controlledIsOpen) {
|
|
320
|
+
openModalityRef.current = modality;
|
|
321
|
+
}
|
|
285
322
|
onOpenChange?.(!controlledIsOpen);
|
|
286
323
|
} else {
|
|
287
324
|
if (popover.isOpen) {
|
|
288
325
|
popover.hide();
|
|
289
326
|
} else {
|
|
290
|
-
openAndFocus();
|
|
327
|
+
openAndFocus(modality);
|
|
291
328
|
}
|
|
292
329
|
}
|
|
293
330
|
}, [onClick, isControlled, onOpenChange, controlledIsOpen, popover, openAndFocus]);
|
|
@@ -309,8 +346,6 @@ export function DropdownMenu({
|
|
|
309
346
|
color: "inherit"
|
|
310
347
|
}) : undefined);
|
|
311
348
|
const popoverXstyle = menuWidth ? styles.popoverCustomWidth(menuWidth) : styles.popover;
|
|
312
|
-
const popoverGapStyle = placement === 'above' || placement === 'below' ? styles.popoverBlockGap : styles.popoverInlineGap;
|
|
313
|
-
|
|
314
349
|
// Context for compound items
|
|
315
350
|
const contextValue = useMemo(() => ({
|
|
316
351
|
closeMenu,
|
|
@@ -347,6 +382,12 @@ export function DropdownMenu({
|
|
|
347
382
|
ref: listRef,
|
|
348
383
|
id: menuId,
|
|
349
384
|
role: "menu"
|
|
385
|
+
// Focus target for pointer opens (not in the Tab order): holding
|
|
386
|
+
// focus on the container keeps key events (arrows, typeahead,
|
|
387
|
+
// Escape, Tab) inside the menu without highlighting any item.
|
|
388
|
+
// Mirrors the DropdownMenuSubMenu flyout container.
|
|
389
|
+
,
|
|
390
|
+
tabIndex: -1
|
|
350
391
|
// Give the menu an accessible name from its trigger's label, so
|
|
351
392
|
// screen readers announce e.g. "Actions menu" rather than an unnamed
|
|
352
393
|
// menu (menus-13).
|
|
@@ -361,7 +402,8 @@ export function DropdownMenu({
|
|
|
361
402
|
}), {
|
|
362
403
|
placement,
|
|
363
404
|
alignment,
|
|
364
|
-
|
|
405
|
+
offset: spacingVars['--spacing-1'],
|
|
406
|
+
xstyle: [popoverXstyle, layerAnimations[placement]]
|
|
365
407
|
})]
|
|
366
408
|
});
|
|
367
409
|
}
|
|
@@ -11,17 +11,14 @@
|
|
|
11
11
|
* Enter/Space activation come from the parent DropdownMenu's useListFocus +
|
|
12
12
|
* activation path, which matches menuitemcheckbox alongside plain menuitem rows.
|
|
13
13
|
*
|
|
14
|
-
* The checkbox visual
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* `sm` menu gets the compact control; `md`/`lg` get the standard one) and it
|
|
23
|
-
* swaps to the inline-end of the row on coarse-pointer (touch) devices via CSS
|
|
24
|
-
* `order`, so it lands where selection toggles are conventionally placed on
|
|
14
|
+
* The checkbox visual is the shared checkbox indicator, decorative
|
|
15
|
+
* (aria-hidden) — the row owns the role, checked state, and accessible name, so
|
|
16
|
+
* there is no nested native <input> to shim out of the accessibility tree. It
|
|
17
|
+
* picks up the same `checkbox` theming (and any theme replacement) as
|
|
18
|
+
* CheckboxInput. The control size is derived from the menu's item size (a `sm`
|
|
19
|
+
* menu gets the compact control; `md`/`lg` get the standard one) and the marker
|
|
20
|
+
* box swaps to the inline-end of the row on coarse-pointer (touch) devices via
|
|
21
|
+
* CSS `order`, so it lands where selection toggles are conventionally placed on
|
|
25
22
|
* mobile.
|
|
26
23
|
*/
|
|
27
24
|
import { type ReactNode } from 'react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenuCheckboxItem.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuCheckboxItem.tsx"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"DropdownMenuCheckboxItem.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuCheckboxItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAErE,OAAO,EAAiB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAOtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAyC5C,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,SAAS,EACT,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAClD;IACC;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,UAAkB,EAClB,gBAAwB,EACxB,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,6BAA6B,+BA0D/B;yBAvEe,wBAAwB"}
|
|
@@ -15,23 +15,20 @@
|
|
|
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
|
import { useCallback } from 'react';
|
|
32
29
|
import * as stylex from '@stylexjs/stylex';
|
|
33
30
|
import { renderIconSlot } from "../Icon/index.js";
|
|
34
|
-
import {
|
|
31
|
+
import { useIndicator } from "../Indicator/index.js";
|
|
35
32
|
import { Item } from "../Item/index.js";
|
|
36
33
|
import { useDropdownMenuContext } from "./DropdownMenuContext.js";
|
|
37
34
|
import { focusMenuItemOnHover } from "./menuItemHover.js";
|
|
@@ -53,8 +50,18 @@ const styles = {
|
|
|
53
50
|
kSiTet: "xbyyjgo",
|
|
54
51
|
kkrTdU: "x1h6gzvc",
|
|
55
52
|
$$css: true
|
|
53
|
+
},
|
|
54
|
+
marker: {
|
|
55
|
+
kfzvcC: "x47corl",
|
|
56
|
+
kayTVb: "x1g77sc7 xozvky",
|
|
57
|
+
keTefX: "x1lziwak x1jymrmb",
|
|
58
|
+
$$css: true
|
|
56
59
|
}
|
|
57
60
|
};
|
|
61
|
+
|
|
62
|
+
// Matches the control sizes CheckboxInput uses, so a checkbox reads the same in
|
|
63
|
+
// a menu row as it does in a form.
|
|
64
|
+
|
|
58
65
|
/**
|
|
59
66
|
* A checkable dropdown menu item (role="menuitemcheckbox").
|
|
60
67
|
*
|
|
@@ -90,12 +97,7 @@ export function DropdownMenuCheckboxItem({
|
|
|
90
97
|
const ctx = useDropdownMenuContext();
|
|
91
98
|
const menuSize = ctx?.menuSize ?? 'md';
|
|
92
99
|
const controlSize = menuSize === 'sm' ? 'sm' : 'md';
|
|
93
|
-
|
|
94
|
-
// The composed checkbox is decorative and inert, so its label never reaches
|
|
95
|
-
// the accessibility tree — the row's `label` prop provides the announced
|
|
96
|
-
// name. CheckboxInput still requires a string label, so pass one through when
|
|
97
|
-
// the row label is a plain string.
|
|
98
|
-
const checkboxLabel = typeof label === 'string' ? label : '';
|
|
100
|
+
const CheckboxControl = useIndicator('checkbox');
|
|
99
101
|
const handleClick = useCallback(() => {
|
|
100
102
|
if (isDisabled) {
|
|
101
103
|
return;
|
|
@@ -112,19 +114,18 @@ export function DropdownMenuCheckboxItem({
|
|
|
112
114
|
"aria-checked": value,
|
|
113
115
|
tabIndex: isDisabled ? undefined : -1,
|
|
114
116
|
onPointerMove: handlePointerMove,
|
|
115
|
-
marker:
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
})
|
|
117
|
+
marker:
|
|
118
|
+
/*#__PURE__*/
|
|
119
|
+
// No wrapper, and no menu-specific theme target: the shared
|
|
120
|
+
// `astryx-checkbox` target is already on this element (main reached
|
|
121
|
+
// the menu checkbox through it too), so the menu adds only its own
|
|
122
|
+
// placement rules. A wrapper here would have duplicated the
|
|
123
|
+
// indicator's control size and moved nothing themeable.
|
|
124
|
+
_jsx(CheckboxControl, {
|
|
125
|
+
state: value ? 'checked' : 'unchecked',
|
|
126
|
+
size: controlSize,
|
|
127
|
+
isDisabled: isDisabled,
|
|
128
|
+
xstyle: styles.marker
|
|
128
129
|
}),
|
|
129
130
|
startContent: icon ? renderIconSlot(icon, {
|
|
130
131
|
size: 'sm',
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BaseProps } from '../BaseProps';
|
|
2
|
+
export interface DropdownMenuDividerProps extends Pick<BaseProps, 'xstyle' | 'className' | 'style'> {
|
|
3
|
+
/** Ref forwarded to the separator element. */
|
|
4
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A horizontal rule separating groups of menu rows.
|
|
8
|
+
*
|
|
9
|
+
* Renders `role="separator"`, so it is never a stop in the menu's arrow-key
|
|
10
|
+
* order. Equivalent to `{type: 'divider'}` in the `items` data API.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```
|
|
14
|
+
* <DropdownMenu button={{ label: 'Actions' }}>
|
|
15
|
+
* <DropdownMenuItem label="Edit" onClick={handleEdit} />
|
|
16
|
+
* <DropdownMenuDivider />
|
|
17
|
+
* <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
|
|
18
|
+
* </DropdownMenu>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function DropdownMenuDivider({ xstyle, className, style, ref, }: DropdownMenuDividerProps): import("react").JSX.Element;
|
|
22
|
+
export declare namespace DropdownMenuDivider {
|
|
23
|
+
var displayName: string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=DropdownMenuDivider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownMenuDivider.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuDivider.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAW5C,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CACpD,SAAS,EACT,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC;IACC,8CAA8C;IAC9C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,GACJ,EAAE,wBAAwB,+BAW1B;yBAhBe,mBAAmB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
import * as stylex from '@stylexjs/stylex';
|
|
26
|
+
import { Divider } from "../Divider/index.js";
|
|
27
|
+
import "../theme/tokens.stylex.js";
|
|
28
|
+
import { spacingVars } from "../theme/tokens.stylex.js";
|
|
29
|
+
import { themeProps } from "../utils/themeProps.js";
|
|
30
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
31
|
+
const styles = {
|
|
32
|
+
divider: {
|
|
33
|
+
kqGvvJ: "xsq74q5",
|
|
34
|
+
$$css: true
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const THEME_CLASS_NAME = themeProps('dropdown-menu-divider').className;
|
|
38
|
+
/**
|
|
39
|
+
* A horizontal rule separating groups of menu rows.
|
|
40
|
+
*
|
|
41
|
+
* Renders `role="separator"`, so it is never a stop in the menu's arrow-key
|
|
42
|
+
* order. Equivalent to `{type: 'divider'}` in the `items` data API.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```
|
|
46
|
+
* <DropdownMenu button={{ label: 'Actions' }}>
|
|
47
|
+
* <DropdownMenuItem label="Edit" onClick={handleEdit} />
|
|
48
|
+
* <DropdownMenuDivider />
|
|
49
|
+
* <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
|
|
50
|
+
* </DropdownMenu>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function DropdownMenuDivider({
|
|
54
|
+
xstyle,
|
|
55
|
+
className,
|
|
56
|
+
style,
|
|
57
|
+
ref
|
|
58
|
+
}) {
|
|
59
|
+
return /*#__PURE__*/_jsx(Divider, {
|
|
60
|
+
ref: ref,
|
|
61
|
+
xstyle: [styles.divider, xstyle],
|
|
62
|
+
className: className ? `${THEME_CLASS_NAME} ${className}` : THEME_CLASS_NAME,
|
|
63
|
+
style: style
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
DropdownMenuDivider.displayName = 'DropdownMenuDivider';
|
|
@@ -34,6 +34,19 @@ export interface DropdownMenuItemProps extends Pick<BaseProps, 'xstyle' | 'class
|
|
|
34
34
|
isDisabled?: boolean;
|
|
35
35
|
/** Additional content to render after the label/description. */
|
|
36
36
|
endContent?: ReactNode;
|
|
37
|
+
/**
|
|
38
|
+
* Whether activating the item closes the menu. Set `false` for an action
|
|
39
|
+
* that reports its result on the item itself (a copy row swapping to
|
|
40
|
+
* "Copied"), matching the checkbox and radio items, which already decide
|
|
41
|
+
* this for themselves.
|
|
42
|
+
* @default true
|
|
43
|
+
*/
|
|
44
|
+
hasCloseOnSelect?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Visual variant. `'destructive'` renders the label, description, and icon in
|
|
47
|
+
* the error color for dangerous actions (e.g. Delete). @default 'default'
|
|
48
|
+
*/
|
|
49
|
+
variant?: 'default' | 'destructive';
|
|
37
50
|
}
|
|
38
51
|
/**
|
|
39
52
|
* An interactive dropdown menu item with icon, label, and optional description.
|
|
@@ -45,11 +58,11 @@ export interface DropdownMenuItemProps extends Pick<BaseProps, 'xstyle' | 'class
|
|
|
45
58
|
* ```
|
|
46
59
|
* <DropdownMenu button={{ label: 'Actions' }}>
|
|
47
60
|
* <DropdownMenuItem icon={PencilIcon} label="Edit" onClick={handleEdit} />
|
|
48
|
-
* <DropdownMenuItem label="Delete"
|
|
61
|
+
* <DropdownMenuItem label="Delete" variant="destructive" onClick={handleDelete} />
|
|
49
62
|
* </DropdownMenu>
|
|
50
63
|
* ```
|
|
51
64
|
*/
|
|
52
|
-
export declare function DropdownMenuItem({ icon, label, description, onClick, isDisabled, endContent, xstyle, className, style, }: DropdownMenuItemProps): import("react").JSX.Element;
|
|
65
|
+
export declare function DropdownMenuItem({ icon, label, description, onClick, isDisabled, endContent, hasCloseOnSelect, variant, xstyle, className, style, }: DropdownMenuItemProps): import("react").JSX.Element;
|
|
53
66
|
export declare namespace DropdownMenuItem {
|
|
54
67
|
var displayName: string;
|
|
55
68
|
}
|