"use client"; import React from "react"; import Link from "next/link"; import { SidebarInside } from "@/ui/components/SidebarInside"; import { Tabs } from "@/ui/components/Tabs"; import { FeatherIcon } from "./FeatherIcon"; import { ANALYSE_SEITEN } from "./navigation"; import type { SeitenId } from "../../data/filtering"; /** * Innere Navigation des Analytics-Bereichs. * * Nachbau von `SidebarIconsLayout` aus dem Zielsystem — der Leiste, die dort * jeder Arbeitsbereich mit Geschwisterseiten benutzt (Leads, Termine, HR, * Einstellungen; 17 Aufrufstellen). Analytics mit fünf Analyse-Seiten ist * derselbe Fall. * * Verhalten wie dort: eine schmale Icon-Leiste, die bei Zeigerkontakt oder * Tastaturfokus auf Beschriftungen aufklappt — verzögert, damit sie beim * bloßen Überstreichen nicht aufspringt. Unterhalb `sm` tritt an ihre Stelle * eine Reiterleiste; auch das ist aus dem Original übernommen. * * ──────────────────────────────────────────────────────────────────────────── * BEIM EINBAU: Dieser Nachbau wird NICHT portiert. * * Verbindlich ist die Verabredung — Analytics bekommt eine innere Leiste mit * den fünf Analyse-Seiten. Gebaut wird sie in HiveGrid mit dem dortigen * `SidebarIconsLayout`, das genau diesen Zweck hat (Leads, Termine, HR, * Einstellungen nutzen es bereits). Diese Datei beschreibt das Ziel, sie ist * nicht das Bauteil. Rangfolge: docs/ZIELSYSTEM.md Abschnitt 0. * ──────────────────────────────────────────────────────────────────────────── */ const OEFFNEN_MS = 300; const SCHLIESSEN_MS = 350; export function AnalyticsInnerNav({ aktiv, children, }: { aktiv: SeitenId; children: React.ReactNode; }) { const [zeigerDrauf, setZeigerDrauf] = React.useState(false); const [fokusInnen, setFokusInnen] = React.useState(false); const oeffnen = React.useRef | null>(null); const schliessen = React.useRef | null>(null); React.useEffect( () => () => { if (oeffnen.current) clearTimeout(oeffnen.current); if (schliessen.current) clearTimeout(schliessen.current); }, [] ); const ausgeklappt = zeigerDrauf || fokusInnen; return (
{ if (schliessen.current) clearTimeout(schliessen.current); oeffnen.current = setTimeout(() => setZeigerDrauf(true), OEFFNEN_MS); }} onMouseLeave={() => { if (oeffnen.current) clearTimeout(oeffnen.current); schliessen.current = setTimeout(() => setZeigerDrauf(false), SCHLIESSEN_MS); }} onFocusCapture={() => setFokusInnen(true)} onBlurCapture={(event) => { if (!event.currentTarget.contains(event.relatedTarget as Node | null)) { setFokusInnen(false); } }} > {ANALYSE_SEITEN.map((seite) => ( } selected={seite.id === aktiv} variant={ausgeklappt ? "icon-and-text" : "icon-only"} > {seite.label} ))}
{/* Schmale Fenster: Reiter statt Leiste — wie im Original. Waagerecht scrollend statt umbrechend: Fünf Reiter brauchen mindestens 425 px, bei 375 px lief die ganze Seite dadurch seitlich über. Über zwei Zeilen gebrochen liest sich ein Reiterband als zwei Steuerelemente — dasselbe Mittel wie beim Zeitraum-Segment in der Filterleiste. */}
{ANALYSE_SEITEN.map((seite) => ( {seite.label} ))}
{children}
); }