Spiel-Events, Kalenderdateien, Patches-Seite und neues Design

- Kalender: Termine als Spiel-Event markieren (nur diese zählen in der
  Statistik), optionale Uhrzeiten, Termine bearbeiten
- .ics-Download für einzelne und alle kommenden Termine
- Neue Seite Patches: Upload (PNG, JPEG, WebP, geprüftes SVG),
  Status "Gibt es schon" / "In Planung", Bilder in data/patches/
- Volle Seitenbreite mit Spaltenlayouts, neues Design mit selbst
  gehosteten Schriften, Startseite mit Zoom und drehendem Zahnrad
- Bestehende Daten werden beim Laden ergänzt, keine Migration nötig

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
guyg1474andClaude Opus 5.5 committed 2026-10-12 00:13:52 +02:00
1 parent 43356a120c
commit 486e6f6784
23 files changed
+1757 -387

No files matched your search

+83 -33
View File
@@ -8,42 +8,92 @@
</head>
<body>
<main>
<div class="card">
<label>Ich bin
<select id="me-select"></select>
</label>
<p id="me-hint" class="muted" hidden>Wähle deinen Namen aus, damit du Spieltage eintragen und zusagen kannst.
Du fehlst in der Liste? Dann trag dich unter <a href="/gruppe">Gruppe</a> ein.</p>
</div>
<div class="card">
<div class="cal-nav">
<button id="prev-month" aria-label="Vorheriger Monat">‹</button>
<h2 id="month-title"></h2>
<button id="next-month" aria-label="Nächster Monat">›</button>
<header class="page-head">
<div>
<span class="eyebrow">Spieltage &amp; Termine</span>
<h1>Kalender</h1>
<p>Nur Termine mit Häkchen bei „Spiel-Event“ zählen für die Statistik.</p>
</div>
<div class="row end"><button id="today-btn" class="small">Heute</button></div>
<div id="calendar" class="cal-grid"></div>
</div>
<div class="actions">
<a class="button" href="/api/calendar.ics" download title="Alle kommenden Termine als .ics-Datei für Google, Apple oder Outlook">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><path d="M12 3v12M7 10l5 5 5-5M4 21h16"/></svg>
Alle Termine (.ics)
</a>
</div>
</header>
<div class="card">
<h2 id="day-title"></h2>
<div id="day-events"></div>
<form id="event-form">
<h3>Spieltag an diesem Tag eintragen</h3>
<label>Titel / Spielfeld
<input type="text" id="event-title" required maxlength="80" placeholder="z. B. Sonntagsspiel Waldfeld">
</label>
<label>Notiz (optional)
<textarea id="event-note" maxlength="500" placeholder="Uhrzeit, Link zum Event, Treffpunkt …"></textarea>
</label>
<button type="submit" class="primary">Eintragen</button>
</form>
</div>
<div class="split wide-left">
<div class="col">
<div class="card">
<div class="cal-nav">
<button id="prev-month" aria-label="Vorheriger Monat">‹</button>
<h2 id="month-title"></h2>
<button id="next-month" aria-label="Nächster Monat">›</button>
<button id="today-btn" class="small">Heute</button>
</div>
<div id="calendar" class="cal-grid"></div>
<div class="cal-legend">
<span><i class="l-game"></i>Spiel-Event</span>
<span><i class="l-nogame"></i>Termin ohne Spiel</span>
<span><i class="l-mine"></i>Du hast zugesagt</span>
</div>
</div>
</div>
<div class="card">
<h2>Kommende Spieltage</h2>
<div id="upcoming"></div>
<div class="col">
<div class="card">
<label>Ich bin
<select id="me-select"></select>
</label>
<p id="me-hint" class="muted" hidden>Wähle deinen Namen aus, damit du Termine eintragen und zusagen kannst.
Du fehlst in der Liste? Dann trag dich unter <a href="/gruppe">Gruppe</a> ein.</p>
</div>
<div class="card">
<h2 id="day-title"></h2>
<div id="day-events"></div>
<form id="event-form">
<h3 id="event-form-title">Termin an diesem Tag eintragen</h3>
<label>Titel / Spielfeld
<input type="text" id="event-title" required maxlength="80" placeholder="z. B. Sonntagsspiel Darkzone">
</label>
<label class="toggle-field">
<input type="checkbox" id="event-game" checked>
<div>
<strong>Spiel-Event</strong>
<span>Wer zusagt, bekommt ein Spiel in der Statistik. Für Treffen, Grillen oder Basteltage das Häkchen entfernen.</span>
</div>
</label>
<div class="grid2">
<label>Datum
<input type="date" id="event-date" required>
</label>
<div class="grid2 keep">
<label>Beginn
<input type="time" id="event-time">
</label>
<label>Ende
<input type="time" id="event-end">
</label>
</div>
</div>
<label>Notiz (optional)
<textarea id="event-note" maxlength="500" placeholder="Link zum Event, Treffpunkt, Ausrüstung …"></textarea>
</label>
<div class="row wrap">
<button type="submit" class="primary" id="event-submit">Eintragen</button>
<button type="button" id="event-cancel" hidden>Abbrechen</button>
</div>
</form>
</div>
</div>
<section class="span-all">
<div class="section-title">
<h2>Kommende Termine</h2>
</div>
<div id="upcoming" class="events-grid"></div>
</section>
</div>
</main>