Web: Kategorien-Anteile-Karte umschaltbar auf Detailansicht (keine Gruppe Andere)

Neue Karten-Konfig-Option Detailansicht: mitFarben(..., { alle:true }) faerbt
jede Kategorie einzeln (Festpalette vorne, danach erzeugte Farbtoene) statt den
Rest zu Andere zu buendeln. Umschaltbar ueber das Zahnrad der Karte.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-30 17:34:27 +02:00
parent 55db1d1363
commit 1cddb4432c
2 changed files with 31 additions and 5 deletions

View File

@@ -58,13 +58,36 @@ export function andereFarbe(dunkel) {
}
/**
* Bündelt eine sortierte Liste auf SERIES_MAX Einträge plus „Andere“ und
* vergibt die Farben in fester Reihenfolge.
* Erwartet Objekte mit { name, value }.
* Zusätzliche Farben für die Detailansicht (mehr Kategorien als die geprüfte
* Palette hat). Bewusst nur für den Detail-Fall: gleichmäßig verteilte Farbtöne
* (Goldener Winkel) statt der farbfehlsicht-geprüften Festfarben.
*/
export function mitFarben(eintraege, dunkel) {
function extraFarben(anzahl, dunkel) {
const s = dunkel ? 62 : 66;
const l = dunkel ? 58 : 46;
return Array.from({ length: anzahl }, (_, j) => {
const ton = Math.round((28 + j * 137.508) % 360);
return `hsl(${ton}, ${s}%, ${l}%)`;
});
}
/**
* Vergibt Farben für eine sortierte Anteilsliste (Objekte mit { name, value }).
*
* Standard: höchstens SERIES_MAX Einträge in fester Reihenfolge, der Rest zu
* „Andere“ gebündelt. Mit `alle` (Detailansicht) bekommt JEDE Kategorie eine
* eigene Farbe (Festpalette vorne, danach erzeugte Töne) ohne „Andere“.
*/
export function mitFarben(eintraege, dunkel, { alle = false } = {}) {
const farben = kategorieFarben(dunkel);
const sortiert = [...eintraege].sort((a, b) => b.value - a.value);
if (alle) {
const extra = extraFarben(Math.max(0, sortiert.length - farben.length), dunkel);
return sortiert.map((e, i) => ({
...e,
color: i < farben.length ? farben[i] : extra[i - farben.length],
}));
}
const vorne = sortiert.slice(0, SERIES_MAX).map((e, i) => ({ ...e, color: farben[i] }));
const rest = sortiert.slice(SERIES_MAX);
if (rest.length === 0) return vorne;