feat(web): Kalender-Plakette in der Farbe des Kalenders, Farbpunkt je Tooltip-Zeile

- groupEventsByDate sortiert jede Tagesgruppe jetzt nach Start aufsteigend
- Zaehl-Plakette im Monatsraster traegt die Farbe des Kalenders des fruehesten Termins (weisse Schrift), ohne Farbe unveraendert bg-primary
- Tooltip-Zeilen bekommen denselben Farbpunkt wie die Liste "Naechste Termine" (Rueckfall var(--muted-foreground))
- 3 neue Tests: calendar-month Test 2b, calendar-widget Test 3b/3c

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-16 14:25:21 +02:00
parent 5313fbc019
commit 1e4ec30190
4 changed files with 108 additions and 11 deletions
@@ -14,7 +14,9 @@
* Starttag-Regel: mehrtaegige und ganztaegige Termine werden im Monatsraster
* bewusst NUR am Starttag gezaehlt/angezeigt (`groupEventsByDate` gruppiert
* ausschliesslich nach `event.start`) — eine Terminleiste ueber mehrere Tage
* ist nicht Teil dieses Auftrags.
* ist nicht Teil dieses Auftrags. Jede Tagesgruppe ist zusaetzlich nach Start
* aufsteigend sortiert, damit die Plakettenfarbe (Farbe des ERSTEN Termins)
* und die Tooltip-Reihenfolge deterministisch uebereinstimmen (quick-260916-jvj).
*/
import type { CalendarEvent } from '@/lib/calendar-api';
@@ -101,7 +103,9 @@ export interface CalendarDay {
/**
* Gruppiert Termine nach lokalem Startdatum. Mehrtaegige/ganztaegige Termine
* zaehlen bewusst nur am Starttag (siehe Kopfkommentar).
* zaehlen bewusst nur am Starttag (siehe Kopfkommentar). Jede Tagesgruppe
* wird nach Start aufsteigend sortiert (quick-260916-jvj), damit der erste
* Eintrag zuverlaessig der fruehesten Termin des Tages ist.
*/
export function groupEventsByDate(events: CalendarEvent[]): Map<string, CalendarEvent[]> {
const groupedEvents = new Map<string, CalendarEvent[]>();
@@ -110,6 +114,9 @@ export function groupEventsByDate(events: CalendarEvent[]): Map<string, Calendar
const existingEvents = groupedEvents.get(key) ?? [];
groupedEvents.set(key, [...existingEvents, event]);
}
for (const dayEvents of groupedEvents.values()) {
dayEvents.sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime());
}
return groupedEvents;
}