diff --git a/.changeset/sweet-flowers-dress.md b/.changeset/sweet-flowers-dress.md
new file mode 100644
index 0000000000..9aa55f3e95
--- /dev/null
+++ b/.changeset/sweet-flowers-dress.md
@@ -0,0 +1,5 @@
+---
+"@nextui-org/popover": patch
+---
+
+close popover on scroll (#3265)
diff --git a/packages/components/popover/__tests__/popover.test.tsx b/packages/components/popover/__tests__/popover.test.tsx
index 53d463a699..a73021d666 100644
--- a/packages/components/popover/__tests__/popover.test.tsx
+++ b/packages/components/popover/__tests__/popover.test.tsx
@@ -314,4 +314,37 @@ describe("Popover", () => {
// assert that the popover is still open
expect(popover).toHaveAttribute("aria-expanded", "true");
});
+
+ it("should close popover on scroll", async () => {
+ const wrapper = render(
+
+
+
+
+
+
+
+ ,
+ );
+
+ const popover = wrapper.getByTestId("popover");
+
+ // open popover
+ await act(async () => {
+ await userEvent.click(popover);
+ });
+
+ // assert that the popover is open
+ expect(popover).toHaveAttribute("aria-expanded", "true");
+
+ // scroll it
+ fireEvent.scroll(document.body);
+
+ // assert that the popover is closed
+ expect(popover).toHaveAttribute("aria-expanded", "false");
+ });
});
diff --git a/packages/components/popover/src/use-aria-popover.ts b/packages/components/popover/src/use-aria-popover.ts
index f9f323f5b1..d8f1c78067 100644
--- a/packages/components/popover/src/use-aria-popover.ts
+++ b/packages/components/popover/src/use-aria-popover.ts
@@ -102,7 +102,7 @@ export function useReactAriaPopover(
containerPadding,
placement: toReactAriaPlacement(placementProp),
offset: showArrow ? offset + 3 : offset,
- onClose: () => {},
+ onClose: isNonModal ? state.close : () => {},
});
useSafeLayoutEffect(() => {
diff --git a/packages/components/select/stories/select.stories.tsx b/packages/components/select/stories/select.stories.tsx
index a30224cf3e..0a58ad10a3 100644
--- a/packages/components/select/stories/select.stories.tsx
+++ b/packages/components/select/stories/select.stories.tsx
@@ -627,6 +627,71 @@ const WithReactHookFormTemplate = (args: SelectProps) => {
);
};
+const ScrollableContainerTemplate = (args: SelectProps) => {
+ const categories = [
+ {
+ target: "Animals",
+ items: [
+ {name: "Lion", emoji: "ðĶ"},
+ {name: "Tiger", emoji: "ð
"},
+ {name: "Elephant", emoji: "ð"},
+ {name: "Kangaroo", emoji: "ðĶ"},
+ {name: "Panda", emoji: "ðž"},
+ {name: "Giraffe", emoji: "ðĶ"},
+ {name: "Zebra", emoji: "ðĶ"},
+ {name: "Cheetah", emoji: "ð"},
+ ],
+ },
+ {
+ target: "Birds",
+ items: [
+ {name: "Eagle", emoji: "ðĶ
"},
+ {name: "Parrot", emoji: "ðĶ"},
+ {name: "Penguin", emoji: "ð§"},
+ {name: "Ostrich", emoji: "ðĶĒ"},
+ {name: "Peacock", emoji: "ðĶ"},
+ {name: "Swan", emoji: "ðĶĒ"},
+ {name: "Falcon", emoji: "ðĶ
"},
+ {name: "Flamingo", emoji: "ðĶĐ"},
+ ],
+ },
+ ];
+ const DEFAULT_CATEGORY = "Animals";
+
+ return (
+ <>
+
+ >
+ );
+};
+
export const Default = {
render: MirrorTemplate,
@@ -839,6 +904,14 @@ export const WithReactHookForm = {
},
};
+export const WithScrollableContainer = {
+ render: ScrollableContainerTemplate,
+
+ args: {
+ ...defaultProps,
+ },
+};
+
export const Controlled = {
render: ControlledTemplate,