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. */}
+