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];