"use client"; import React from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { FeatherBell, FeatherHelpCircle, FeatherSearch } from "@subframe/core"; import { SidebarWithSections } from "@/ui/components/SidebarWithSections"; import { NAV_GRUPPEN, NAV_SEKUNDAER, ANALYSE_SEITEN, type NavEintrag } from "./navigation"; import { FeatherIcon } from "./FeatherIcon"; import { DATENSATZ_INFO } from "../../data/seed"; import { formatDatum, formatZahl } from "../../utils/formatters"; import { HEUTE } from "../../utils/dateUtils"; /** * Rahmen der Anwendung — Seitenleiste nach dem Vorbild von HiveGrid Cloud. * * Bewusst dieselbe Komponente wie dort (`~/ui/components/SidebarWithSections`) * mit denselben Gruppen und derselben Reihenfolge. Wer den Prototyp neben der * Software öffnet, soll dieselbe Navigation sehen; die Übergabe wird dadurch * eine Frage des Einsetzens und nicht des Übersetzens. * * Jeder Eintrag führt auf eine echte Seite. „Dashboard" landet auf einer * Platzhalterseite, weil es ein eigenes Feature ist und hier nicht gestaltet * wird — aber ein Menüpunkt, der nur einen Hinweis auslöst, lässt offen, ob * etwas fehlt oder etwas kaputt ist. */ export function AppShell({ children }: { children: React.ReactNode }) { const pathname = usePathname(); const [eingeklappt, setEingeklappt] = React.useState(false); const istAktiv = (eintrag: NavEintrag) => eintrag.ziel.href === "/analytics" ? pathname.startsWith("/analytics") : pathname === eintrag.ziel.href; const renderEintrag = (eintrag: NavEintrag) => ( } selected={istAktiv(eintrag)} variant={eingeklappt ? "icon-only" : "icon-and-text"} > {eintrag.label} ); const aktiveAnalyse = ANALYSE_SEITEN.find((s) => s.href === "/analytics" ? pathname === "/analytics" : pathname.startsWith(s.href) ); const bereich = pathname.startsWith("/komponenten") ? "Komponenten" : pathname.startsWith("/dashboard") ? "Dashboard" : "Analytics"; return (
setEingeklappt((wert) => !wert)} toggleLabel={eingeklappt ? "Seitenleiste ausklappen" : "Seitenleiste einklappen"} >
{NAV_GRUPPEN.map((gruppe) => ( {gruppe.eintraege.map(renderEintrag)} ))}
{NAV_SEKUNDAER.map(renderEintrag)} {/* Einzeilig statt als Kasten: Die Seitenleiste soll die der Software spiegeln, und dort steht kein Demo-Hinweis. Die Information bleibt, nimmt aber keinen Navigationsplatz weg. */} {!eingeklappt ? (

Demo-Daten · {formatZahl(DATENSATZ_INFO.auftraege)} Aufträge ·{" "} {formatDatum(HEUTE.toISOString())}

) : null}
{bereich} {aktiveAnalyse ? ( <> / {aktiveAnalyse.label} ) : null}
Suchen ⌘K
MK
{children}
); }