From 6ddbc79c99178281782d8480d1f30024c4e21dcc Mon Sep 17 00:00:00 2001 From: Ryo Matsukawa <76232929+ryo-manba@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:44:24 +0900 Subject: [PATCH 1/5] fix(popover): invalid placement logic --- packages/components/dropdown/package.json | 1 - .../components/dropdown/src/use-dropdown.ts | 24 +--- .../dropdown/stories/dropdown.stories.tsx | 25 ++++ .../popover/src/free-solo-popover.tsx | 2 +- .../popover/src/popover-content.tsx | 7 +- .../components/popover/src/use-popover.ts | 25 +++- pnpm-lock.yaml | 119 +++++++++--------- 7 files changed, 111 insertions(+), 92 deletions(-) diff --git a/packages/components/dropdown/package.json b/packages/components/dropdown/package.json index b11eb53fd7..4a53de4a81 100644 --- a/packages/components/dropdown/package.json +++ b/packages/components/dropdown/package.json @@ -48,7 +48,6 @@ "@nextui-org/shared-utils": "workspace:*", "@react-aria/focus": "3.19.0", "@react-aria/menu": "3.16.0", - "@react-aria/overlays": "3.24.0", "@react-aria/utils": "3.26.0", "@react-stately/menu": "3.9.0", "@react-types/menu": "3.9.13" diff --git a/packages/components/dropdown/src/use-dropdown.ts b/packages/components/dropdown/src/use-dropdown.ts index df74fed07b..4deb06b42b 100644 --- a/packages/components/dropdown/src/use-dropdown.ts +++ b/packages/components/dropdown/src/use-dropdown.ts @@ -9,12 +9,11 @@ import {useMenuTrigger} from "@react-aria/menu"; import {dropdown} from "@nextui-org/theme"; import {clsx} from "@nextui-org/shared-utils"; import {ReactRef, mergeRefs} from "@nextui-org/react-utils"; -import {ariaShouldCloseOnInteractOutside, toReactAriaPlacement} from "@nextui-org/aria-utils"; +import {ariaShouldCloseOnInteractOutside} from "@nextui-org/aria-utils"; import {useMemo, useRef} from "react"; import {mergeProps} from "@react-aria/utils"; import {MenuProps} from "@nextui-org/menu"; import {CollectionElement} from "@react-types/shared"; -import {useOverlayPosition} from "@react-aria/overlays"; interface Props extends HTMLNextUIProps<"div"> { /** @@ -78,8 +77,6 @@ const getCloseOnSelect = ( return props?.closeOnSelect; }; -const DEFAULT_PLACEMENT = "bottom"; - export function useDropdown(props: UseDropdownProps): UseDropdownReturn { const globalContext = useProviderContext(); @@ -92,17 +89,13 @@ export function useDropdown(props: UseDropdownProps): UseDropdownReturn { isDisabled, type = "menu", trigger = "press", - placement: placementProp = DEFAULT_PLACEMENT, + placement = "bottom", closeOnSelect = true, shouldBlockScroll = true, classNames: classNamesProp, disableAnimation = globalContext?.disableAnimation ?? false, onClose, className, - containerPadding = 12, - offset = 7, - crossOffset = 0, - shouldFlip = true, ...otherProps } = props; @@ -139,17 +132,6 @@ export function useDropdown(props: UseDropdownProps): UseDropdownReturn { [className], ); - const {placement} = useOverlayPosition({ - isOpen: state.isOpen, - targetRef: triggerRef, - overlayRef: popoverRef, - placement: toReactAriaPlacement(placementProp), - offset, - crossOffset, - shouldFlip, - containerPadding, - }); - const onMenuAction = (menuCloseOnSelect?: boolean) => { if (menuCloseOnSelect !== undefined && !menuCloseOnSelect) { return; @@ -164,7 +146,7 @@ export function useDropdown(props: UseDropdownProps): UseDropdownReturn { return { state, - placement: placement || DEFAULT_PLACEMENT, + placement, ref: popoverRef, disableAnimation, shouldBlockScroll, diff --git a/packages/components/dropdown/stories/dropdown.stories.tsx b/packages/components/dropdown/stories/dropdown.stories.tsx index d2364b0b84..0c95aa4c62 100644 --- a/packages/components/dropdown/stories/dropdown.stories.tsx +++ b/packages/components/dropdown/stories/dropdown.stories.tsx @@ -835,3 +835,28 @@ export const WithShouldBlockScroll = { ...defaultProps, }, }; + +export const Placements = { + args: { + ...defaultProps, + }, + render: (args) => ( +
+