+ );
+}
diff --git a/src/components/nav-mobile-accordion.tsx b/src/components/nav-mobile-accordion.tsx
new file mode 100644
index 00000000..e487c54c
--- /dev/null
+++ b/src/components/nav-mobile-accordion.tsx
@@ -0,0 +1,69 @@
+import { useState, type ReactNode } from 'react';
+import { AnimatePresence, motion, useReducedMotion } from 'framer-motion';
+
+const ChevronIcon = ({ className }: { className?: string }) => (
+
+);
+
+type Props = {
+ /** Visible text; also the trigger link. */
+ label: string;
+ /** Destination of the label link. The panel is expanded by the chevron, not the label. */
+ href: string;
+ /** Whether `href` is the current page. */
+ active: boolean;
+ /** Id tying the chevron (aria-controls) to the collapsible panel. */
+ panelId: string;
+ /** Class for the big mobile link, shared with sibling nav links. */
+ linkClassName: string;
+ /** Called when the label or any child link is activated (closes the overlay). */
+ onNavigate: () => void;
+ /** Collapsible content. */
+ children: ReactNode;
+};
+
+/**
+ * A mobile nav row that is both a link (label → href) and a disclosure: a
+ * separate chevron button expands an inline collapsible panel beneath it.
+ * Mirrors NavDropdown's link-plus-chevron pattern for the full-screen overlay.
+ */
+export default function NavMobileAccordion({ label, href, active, panelId, linkClassName, onNavigate, children }: Props) {
+ const [open, setOpen] = useState(false);
+ const shouldReduceMotion = useReducedMotion();
+
+ return (
+ <>
+