diff --git a/features/dashboard/components/layout/navigation.ts b/features/dashboard/components/layout/navigation.ts index 0138f72..4a7f516 100644 --- a/features/dashboard/components/layout/navigation.ts +++ b/features/dashboard/components/layout/navigation.ts @@ -67,8 +67,15 @@ export const NAV_GRUPPEN: NavGruppe[] = [ /** * Unterer Bereich, durch einen Trenner abgesetzt — wie in der Software. - * Hier steht nur, was zum Prototyp gehört: die Bausteingalerie für die - * Entwicklung. Sie ist kein Produktfeature und wandert beim Einbau nicht mit. + * + * Hier steht nur, was zum Prototyp gehört: die Bausteingalerie. Sie ist für + * die **Abstimmung** da, nicht für die Umsetzung — sie zeigt jeden Baustein in + * allen Zuständen, auch in denen, die die Demo-Daten nie erzeugen (negativer + * Trend, leer, Fehler, „kleiner ist besser"). Wer den Prototyp einbaut, + * braucht sie nicht: Dafür sind die Datei-Pfade und `docs/DESIGN-SYSTEM.md` + * maßgeblich. + * + * Kein Produktfeature, wandert beim Einbau nicht mit. */ export const NAV_SEKUNDAER: NavEintrag[] = [ { diff --git a/features/dashboard/pages/KomponentenSeite.tsx b/features/dashboard/pages/KomponentenSeite.tsx index 290c3cb..8ad7be0 100644 --- a/features/dashboard/pages/KomponentenSeite.tsx +++ b/features/dashboard/pages/KomponentenSeite.tsx @@ -16,6 +16,11 @@ import { AuslastungsBalken } from "../components/charts/AuslastungsBalken"; import { ChartLeer } from "../components/charts/ChartLeer"; import { ChartLegende } from "../components/charts/ChartLegende"; import { AuftragBadge, RechnungBadge } from "../components/tables/StatusBadge"; +import { SeitenZustand } from "../components/layout/SeitenZustand"; +import { WidgetKachel } from "../components/dashboard/WidgetKachel"; +import { ReservierteKachel } from "../components/dashboard/ReservierteKachel"; +import { Begruessung } from "../components/dashboard/Begruessung"; +import type { VMState } from "../view-models"; import { KATEGORIE_FARBEN, MAX_KATEGORIEN, @@ -54,14 +59,15 @@ export function KomponentenSeite() { <> + + +
+ {([ + ["Lädt", { status: "loading" } as VMState], + ["Leer — Filter schneiden alles weg", { status: "empty" } as VMState], + [ + "Fehler", + { + status: "error", + error: { messageKey: "Zeitüberschreitung beim Laden der Kennzahlen" }, + } as VMState, + ], + ] as const).map(([titel, vm]) => ( +
+ {titel} + {/* -mx-4: SeitenZustand bringt seinen eigenen Seitenrand mit, weil + er im Normalfall die ganze Seite füllt. Hier steht er in einer + Rasterspalte und braucht ihn nicht. + + Ohne zusätzlichen Rahmen: Die Komponente hat bereits eine + gestrichelte Kante. Ein Kasten darum wäre ein zweiter Rahmen + und zeigte den Baustein anders, als er in der Anwendung + aussieht. */} +
+ +
+
+ ))} +
+ + + {/* Wie bei den Seitenzuständen: Die Begrüßung trägt ihren eigenen + Seitenrand, weil sie im Dashboard direkt auf der Seite steht. In der + Galerie liegt sie schon im Innenabstand des Containers und wäre + sonst doppelt eingerückt. */} +
+ +
+
+ + + + + +
+ + (
  • @@ -338,7 +426,13 @@ function Abschnitt({ titel, text }: { titel: string; text: string }) { return (

    {titel}

    -

    {text}

    + {/* break-words: Diese Absätze beginnen mit einem Dateipfad, und ein Pfad + ist ein einziges Wort ohne Trennstelle. Bei 375 px lief + "features/dashboard/components/layout/SeitenZustand.tsx" neun Pixel + über den Rand. */} +

    + {text} +

    ); }