diff --git a/app/docs/page.tsx b/app/docs/page.tsx
index f4db611..66790d4 100644
--- a/app/docs/page.tsx
+++ b/app/docs/page.tsx
@@ -1,27 +1,39 @@
-"use client";
-import { Footer, Navbar } from "../../layout";
+import type { Metadata } from "next";
+import { Navbar } from "../../layout";
+export const metadata: Metadata = {
+ title: "VoxKit API Documentation",
+ description:
+ "Generated API reference for the VoxKit Python package: storage, analyzers, engines, and configuration.",
+};
+
+/**
+ * The pdoc bundle in `public/docs` is already a complete documentation site,
+ * with a sidebar pane and a content pane that scroll independently. This route
+ * hands it the whole viewport below the navbar instead of insetting it in a
+ * card, so those two are the only scrollbars on the page.
+ *
+ * `Footer` is deliberately absent. As a sibling of a viewport-height region it
+ * put a third, outer scrollbar on the window, and scrolling it slid the entire
+ * docs pane out of view.
+ */
export default function DocsPage() {
return (
- <>
-
-
-
- {/* Documentation iframe container */}
-
-
- {/* Iframe wrapper with styling */}
-
-
-
-
-
+
+
+ {/* Navbar is `fixed` but sets no `top`, so it renders wherever its static
+ position falls. It has to stay the first child of an unpadded parent;
+ the clearance for it belongs on this sibling instead. */}
+
+ {/* Straight to voxkit.html. /docs/index.html is only a meta-refresh
+ stub, and in a frame that hop becomes a session history entry, so
+ pressing Back once just bounces the visitor into the docs again. */}
+
-
- >
+
);
}
diff --git a/app/globals.css b/app/globals.css
index f54bba4..3991ca1 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -27,6 +27,17 @@ body {
overflow-y: scroll;
}
+/*
+ * Opt-out for pages that fill the viewport exactly and delegate scrolling to a
+ * child (see app/docs/page.tsx). There is nothing for the window to scroll, so
+ * the forced scrollbar above would render as a second, dead track beside the
+ * child's real one. No layout shift to guard against here either: the page
+ * cannot grow past the viewport.
+ */
+body:has([data-full-viewport]) {
+ overflow-y: hidden;
+}
+
/* Hero fall-in animation for headings */
@keyframes fallIn {
0% {