diff --git a/features/dashboard/components/charts/AreaVerlauf.tsx b/features/dashboard/components/charts/AreaVerlauf.tsx index 6c442c8..04b6f57 100644 --- a/features/dashboard/components/charts/AreaVerlauf.tsx +++ b/features/dashboard/components/charts/AreaVerlauf.tsx @@ -16,11 +16,12 @@ import { ChartLeer } from "./ChartLeer"; import { CHART, MARGIN, - MAX_ACHSENLABELS, + MIN_TICK_ABSTAND, PRIMAER_FARBE, VERGLEICH_FARBE, achseX, achseY, + achsenIntervall, nettesRaster, } from "../../utils/chartTheme"; import type { ZeitreihePunkt } from "../../data/types"; @@ -66,25 +67,8 @@ export function AreaVerlauf({ const hatWerte = daten.some((d) => d.value > 0 || (d.vergleich ?? 0) > 0); if (!daten.length || !hatWerte) return ; - /** - * Beschriftungen der Zeitachse ausdünnen — zweistufig, weil zwei - * verschiedene Dinge sie zum Kollidieren bringen. - * - * Viele Punkte: Bei mehr als zwölf Werten wird fest jede n-te Beschriftung - * gezeigt. Das ist eine Entscheidung über die Lesbarkeit der Reihe und darf - * nicht von der Kartenbreite abhängen, sonst zeigt dieselbe Reihe auf zwei - * Bildschirmen verschiedene Stützstellen. - * - * Wenige Punkte in einer schmalen Karte: Fünf Kalenderwochen brauchen rund - * 200 px. Eine halbe Kachel bei 768 px hat 150 px — dort liefen "KW 27" und - * "KW 28" ineinander. `preserveStartEnd` mit `minTickGap` überlässt Recharts - * das Weglassen und hält dabei die erste und letzte Beschriftung, damit der - * Zeitraum ablesbar bleibt. - */ - const vieleWerte = daten.length > MAX_ACHSENLABELS; - const intervall = vieleWerte - ? Math.ceil(daten.length / MAX_ACHSENLABELS) - 1 - : ("preserveStartEnd" as const); + // Ausdünnen der Zeitachse: siehe achsenIntervall() in chartTheme.ts. + const intervall = achsenIntervall(daten.length); const maximum = Math.max( ...daten.map((d) => Math.max(d.value, zeigeVergleich ? (d.vergleich ?? 0) : 0)) @@ -103,7 +87,12 @@ export function AreaVerlauf({ - + ({ label: d.label ?? d.name ?? "", value: d.value })); if (!punkte.length || !punkte.some((p) => p.value > 0)) return ; - const intervall = - punkte.length > MAX_ACHSENLABELS ? Math.ceil(punkte.length / MAX_ACHSENLABELS) - 1 : 0; + // Ausdünnen der Zeitachse: siehe achsenIntervall() in chartTheme.ts. Zwölf + // Monatsnamen standen in einer Drittelkarte ohne Lücke aneinander. + const intervall = achsenIntervall(punkte.length); // Ganzzahlreihen brauchen ganzzahlige Ticks — sonst steht "1,5 Vorgänge". const maximum = Math.max(...punkte.map((p) => p.value)); @@ -69,7 +71,12 @@ export function BalkenVertikal({ onMouseLeave={() => setAktiv(null)} > - + MAX_ACHSENLABELS + ? Math.ceil(anzahlPunkte / MAX_ACHSENLABELS) - 1 + : "preserveStartEnd"; +} + /** Farbe nach Index, rotiert sicher innerhalb der Palette. */ export function farbe(index: number): string { return KATEGORIE_FARBEN[index % KATEGORIE_FARBEN.length];