fix(docs): mobile nav drawer and version dropdown state
Build & Push Docker Image / build (push) Successful in 2m30s

- sidebar was hidden below lg with no replacement; add a Sheet-based
  nav drawer opened from a menu button in the header
- version dropdown stayed on 'aktuell' for /docs/releases/* pages because
  only first-segment versions were parsed; derive header version from the
  releases route too
This commit is contained in:
opencode
2026-08-04 06:58:07 +02:00
parent 56f1edd613
commit 33cf261777
+47 -1
View File
@@ -15,6 +15,12 @@ import {
SelectTrigger, SelectTrigger,
SelectValue, SelectValue,
} from "@/components/ui/select"; } from "@/components/ui/select";
import {
Sheet,
SheetContent,
SheetTitle,
SheetTrigger,
} from "@/components/ui/sheet";
import { useGetVersion, getGetVersionQueryKey } from "@workspace/api-client-react"; import { useGetVersion, getGetVersionQueryKey } from "@workspace/api-client-react";
import { import {
ArrowLeft, ArrowLeft,
@@ -25,6 +31,7 @@ import {
GitBranch, GitBranch,
HelpCircle, HelpCircle,
Library, Library,
Menu,
Search, Search,
Server, Server,
Tag, Tag,
@@ -782,6 +789,12 @@ export default function Docs() {
const [location, setLocation] = useLocation(); const [location, setLocation] = useLocation();
const { t } = useTranslation(); const { t } = useTranslation();
const [searchQuery, setSearchQuery] = useState(""); const [searchQuery, setSearchQuery] = useState("");
const [navOpen, setNavOpen] = useState(false);
// Close the mobile nav drawer after navigating.
useEffect(() => {
setNavOpen(false);
}, [location]);
const { version, path } = useMemo(() => parseDocsPath(location), [location]); const { version, path } = useMemo(() => parseDocsPath(location), [location]);
@@ -839,6 +852,15 @@ export default function Docs() {
const section = path[0] ?? "home"; const section = path[0] ?? "home";
const param = path[1]; const param = path[1];
// Version shown in the header dropdown: an explicit first-segment version
// (/docs/vX.Y.Z) or the releases route (/docs/releases/vX.Y.Z).
const headerVersion =
version !== null
? version
: section === "releases" && param
? param
: null;
let content: React.ReactNode = null; let content: React.ReactNode = null;
if (version !== null && path.length === 0) { if (version !== null && path.length === 0) {
@@ -936,6 +958,29 @@ export default function Docs() {
<div className="min-h-screen bg-background flex flex-col"> <div className="min-h-screen bg-background flex flex-col">
<header className="border-b bg-card shrink-0"> <header className="border-b bg-card shrink-0">
<div className="mx-auto max-w-6xl px-4 md:px-6 h-14 flex items-center justify-between gap-3"> <div className="mx-auto max-w-6xl px-4 md:px-6 h-14 flex items-center justify-between gap-3">
<div className="flex items-center gap-1 min-w-0">
<Sheet open={navOpen} onOpenChange={setNavOpen}>
<SheetTrigger asChild>
<Button
variant="ghost"
size="icon"
className="lg:hidden -ml-1 shrink-0"
title={t("docs.nav")}
data-testid="button-docs-nav-mobile"
>
<Menu className="h-5 w-5" />
</Button>
</SheetTrigger>
<SheetContent side="left" className="w-80 overflow-y-auto p-4">
<SheetTitle className="sr-only">{t("docs.nav")}</SheetTitle>
<DocsNav
version={version}
handbook={handbook}
reference={reference}
versions={releases ?? []}
/>
</SheetContent>
</Sheet>
<Link <Link
href="/" href="/"
className="inline-flex items-center gap-2 text-primary font-bold text-lg min-w-0" className="inline-flex items-center gap-2 text-primary font-bold text-lg min-w-0"
@@ -948,6 +993,7 @@ export default function Docs() {
{t("docs.backToApp")} {t("docs.backToApp")}
</span> </span>
</Link> </Link>
</div>
<div className="flex items-center gap-1.5 shrink-0"> <div className="flex items-center gap-1.5 shrink-0">
<ThemeToggle /> <ThemeToggle />
</div> </div>
@@ -957,7 +1003,7 @@ export default function Docs() {
<div className="mx-auto max-w-6xl w-full flex-1 space-y-6 px-4 md:px-6 py-6 pb-12"> <div className="mx-auto max-w-6xl w-full flex-1 space-y-6 px-4 md:px-6 py-6 pb-12">
<DocsHeader <DocsHeader
versions={releases ?? []} versions={releases ?? []}
activeVersion={version} activeVersion={headerVersion}
onVersionChange={handleVersionChange} onVersionChange={handleVersionChange}
onSearchChange={showSearch ? setSearchQuery : undefined} onSearchChange={showSearch ? setSearchQuery : undefined}
/> />