diff --git a/.changeset/humble-jars-prove.md b/.changeset/humble-jars-prove.md
new file mode 100644
index 0000000000..28f7484efd
--- /dev/null
+++ b/.changeset/humble-jars-prove.md
@@ -0,0 +1,5 @@
+---
+"@radix-ui/react-navigation-menu": major
+---
+
+Fix missing data-state attribute on NavigationMenuContent when used with forceMount and NavigationMenuViewport
diff --git a/apps/storybook/stories/navigation-menu.stories.tsx b/apps/storybook/stories/navigation-menu.stories.tsx
index 8493dfb42f..36eb440d7f 100644
--- a/apps/storybook/stories/navigation-menu.stories.tsx
+++ b/apps/storybook/stories/navigation-menu.stories.tsx
@@ -4,6 +4,42 @@ import styles from './navigation-menu.stories.module.css';
export default { title: 'Components/NavigationMenu' };
+export const ForceMountWithViewport = () => {
+ return (
+
+
+
+
+ Products
+ {/* forceMount keeps content mounted; Viewport routes it via ViewportContentMounter */}
+
+
+
+
+
+
+ Company
+
+
+
+
+
+
+ {/* Viewport is the key — this triggers the ViewportContentMounter path */}
+
+
+
+ );
+};
+
export const Basic = () => {
return (
diff --git a/packages/react/navigation-menu/src/navigation-menu.tsx b/packages/react/navigation-menu/src/navigation-menu.tsx
index e363f5e9b8..f839bdd85e 100644
--- a/packages/react/navigation-menu/src/navigation-menu.tsx
+++ b/packages/react/navigation-menu/src/navigation-menu.tsx
@@ -764,6 +764,7 @@ const NavigationMenuContent = React.forwardRef<
const itemContext = useNavigationMenuItemContext(CONTENT_NAME, props.__scopeNavigationMenu);
const composedRefs = useComposedRefs(itemContext.contentRef, forwardedRef);
const open = itemContext.value === context.value;
+ const openState = getOpenState(open);
const commonProps = {
value: itemContext.value,
@@ -794,7 +795,12 @@ const NavigationMenuContent = React.forwardRef<
/>
) : (
-
+
);
});