/** * Rahmen der App: Kopfzeile, Navigation, Inhaltsfläche. * * Zwei Layouts aus derselben Zusammensetzung — die entscheidende Anforderung * aus dem Design-Auftrag: schmal (Handy) mit Tab-Leiste unten, breit (Tablet, * eingebettet in Home Assistant) mit Seitenleiste links. Der Umschaltpunkt * liegt bei 1000px. */ import type { ReactNode } from "react" import { TabBar } from "@audi-dash/ui" import { useBreiterBildschirm } from "./hooks/useBreiterBildschirm" import { VierRinge } from "./screens/Typenschild" import type { Hauptbereich, Route, SeitenName } from "./navigation" import { TITEL, ZURUECK, bereichVon, istHauptbereich } from "./navigation" import { SymbolAudi, SymbolFahrten, SymbolStatistik, SymbolTanken, SymbolUebersicht, SymbolZahnrad, SymbolZurueck, } from "./symbole" export interface ShellProps { route: Route geheZu: (name: SeitenName, id?: string) => void tabBeschriftung: boolean /** Wird über der Kopfzeile eingeblendet (Offline-Hinweis, Warteschlange). */ hinweis?: ReactNode | undefined /** Heißt `children`, weil JSX-Verschachtelung genau diesen Namen erwartet. */ children: ReactNode } const BEREICHE: { key: Hauptbereich; label: string; icon: ReactNode }[] = [ { key: "home", label: "Übersicht", icon: }, { key: "audi", label: "Mein Audi", icon: }, { key: "trips", label: "Fahrten", icon: }, { key: "stat", label: "Statistik", icon: }, { key: "fuel", label: "Tanken", icon: }, ] export function Shell({ route, geheZu, tabBeschriftung, hinweis, children }: ShellProps) { const breit = useBreiterBildschirm() const aktiverBereich = bereichVon(route.name) const zurueckZiel = ZURUECK[route.name] const kopf = (
{zurueckZiel && !breit ? ( ) : null}
DataMetric360
{TITEL[route.name]}
) if (breit) { return ( <>
{hinweis} {!istHauptbereich(route.name) && zurueckZiel ? (
) : null}
{children}
) } return (
{hinweis} {kopf}
{children}
geheZu(schluessel as Hauptbereich)} iconOnly={!tabBeschriftung} className="dm-tableiste" />
) }