Files
linus 9278c7fc34 style(web): redesign the zero-dependency web fallback client
- Dark theme with gradient accents, card-based layout replacing the
  bare form/section markup
- Header brand mark + live connection status badge
- Nicer inputs/buttons (focus rings, primary/ghost variants), empty
  states for the file and chat lists, auto-scroll on new chat messages
- Fix a broken template literal in app.js: the Authorization header
  was rendered as the literal string "*** ${state.token}" instead of
  "Bearer ${state.token}" -- guest Wahl submission and file loading
  were silently failing auth
- Add basic network-error handling around the three fetch() calls
2026-09-12 13:27:07 +02:00

218 lines
7.3 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>KC-App</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="bg-decor" aria-hidden="true"></div>
<header class="topbar">
<div class="brand">
<span class="brand-mark">KC</span>
<div>
<h1>KC-App</h1>
<p class="subtitle">Web-Client &middot; Konfi-Castle Events</p>
</div>
</div>
<span id="conn-badge" class="badge badge-muted">nicht angemeldet</span>
</header>
<main>
<section id="login-section" class="card">
<div class="card-header">
<h2>Anmelden</h2>
<p class="card-hint">Als Gast/Konfi mit Einladungscode oder als Team-Mitglied mit Passwort.</p>
</div>
<div class="tabs">
<button type="button" class="tab-btn active" data-tab="guest-tab">Gast / Konfi</button>
<button type="button" class="tab-btn" data-tab="team-tab">Team-Login</button>
</div>
<form id="guest-form" class="form-grid tab-panel" data-panel="guest-tab">
<label>
<span>Einladungscode</span>
<input id="invite-code" name="inviteCode" placeholder="z. B. AB12-CD34" required />
</label>
<label>
<span>Vorname</span>
<input id="first-name" name="firstName" required />
</label>
<label>
<span>Nachname</span>
<input id="last-name" name="lastName" required />
</label>
<button type="submit" class="btn btn-primary">
<span>Beitreten</span>
</button>
</form>
<form id="team-form" class="form-grid tab-panel" data-panel="team-tab" hidden>
<label>
<span>Gemeinde-Name</span>
<input id="team-gemeinde" name="gemeindeName" placeholder="z. B. Mustergemeinde" />
</label>
<label>
<span>Passwort</span>
<input id="team-password" name="password" type="password" required />
</label>
<button type="submit" class="btn btn-primary">
<span>Anmelden</span>
</button>
</form>
<p id="login-status" class="status"></p>
</section>
<section id="app-section" class="stack" hidden>
<div class="card" id="whoami-card" hidden>
<div class="card-header row">
<div>
<h2>Angemeldet als</h2>
<p class="card-hint" id="whoami-text">&ndash;</p>
</div>
<button id="logout-btn" class="btn btn-ghost">Abmelden</button>
</div>
</div>
<div class="card" id="gruppen-card" hidden>
<div class="card-header row">
<div>
<h2>Gruppenchat erstellen</h2>
<p class="card-hint">Team-Mitglieder und Konfis frei auswählen (KC-weit, egal welche Gemeinde).</p>
</div>
<button id="load-candidates" class="btn btn-ghost">Kandidaten laden</button>
</div>
<div class="form-grid">
<label>
<span>KC-ID</span>
<input id="gruppe-kcid" placeholder="KC-ID" />
</label>
<label>
<span>Name der Gruppe</span>
<input id="gruppe-name" placeholder="z. B. Ausflugsplanung" />
</label>
</div>
<div class="two-col">
<div>
<p class="card-hint">Team-Mitglieder</p>
<ul id="candidate-users" class="list list-picker">
<li class="list-empty">Noch nicht geladen.</li>
</ul>
</div>
<div>
<p class="card-hint">Konfis</p>
<ul id="candidate-guests" class="list list-picker">
<li class="list-empty">Noch nicht geladen.</li>
</ul>
</div>
</div>
<button id="create-gruppe" class="btn btn-primary">Gruppenchat erstellen</button>
<p id="gruppe-status" class="status"></p>
</div>
<div class="card" id="manage-card" hidden>
<div class="card-header row">
<div>
<h2>Teilnehmer verwalten</h2>
<p class="card-hint">Für einen bestehenden Gruppenchat Teilnehmer hinzufügen/entfernen.</p>
</div>
</div>
<div class="form-grid form-inline">
<label>
<span>Channel-ID</span>
<input id="manage-channel-id" placeholder="Channel-ID des Gruppenchats" />
</label>
</div>
<div class="form-grid form-inline">
<label>
<span>User-ID</span>
<input id="manage-user-id" placeholder="optional" />
</label>
<label>
<span>Gast-ID</span>
<input id="manage-guest-id" placeholder="optional" />
</label>
<button id="add-participant" class="btn btn-primary">Hinzufügen</button>
<button id="remove-participant" class="btn btn-ghost">Entfernen</button>
</div>
<p id="manage-status" class="status"></p>
</div>
<div class="card">
<div class="card-header">
<h2>Workshop-Wahl</h2>
<p class="card-hint">Wünsche in Reihenfolge deiner Priorität eintragen.</p>
</div>
<div class="form-grid">
<label>
<span>Wahl-ID</span>
<input id="wahl-id" placeholder="Wahl-ID" />
</label>
<label>
<span>Priorit&auml;ten</span>
<input id="prioritaeten" placeholder="Workshop-IDs, mit Komma getrennt" />
</label>
<button id="submit-wahl" class="btn btn-primary">
<span>Absenden</span>
</button>
</div>
<p id="wahl-status" class="status"></p>
</div>
<div class="card">
<div class="card-header row">
<div>
<h2>Dateien</h2>
<p class="card-hint">Für dich freigegebene Dokumente.</p>
</div>
<button id="load-files" class="btn btn-ghost">Aktualisieren</button>
</div>
<ul id="file-list" class="list list-files">
<li class="list-empty">Noch keine Dateien geladen.</li>
</ul>
</div>
<div class="card">
<div class="card-header row">
<div>
<h2>Chat</h2>
<p class="card-hint">Channel-ID eingeben und live mitlesen/schreiben.</p>
</div>
<button id="load-channels" class="btn btn-ghost">Meine Chats laden</button>
</div>
<ul id="channel-list" class="list list-channels">
<li class="list-empty">Noch keine Chats geladen.</li>
</ul>
<div class="form-grid form-inline">
<label>
<span>Channel-ID</span>
<input id="channel-id" placeholder="Channel-ID" />
</label>
<button id="join-channel" class="btn btn-primary">Beitreten</button>
</div>
<ul id="chat-log" class="list list-chat">
<li class="list-empty">Noch keine Nachrichten.</li>
</ul>
<div class="form-grid form-inline">
<label>
<span>Nachricht</span>
<input id="chat-message" placeholder="Nachricht schreiben…" />
</label>
<button id="send-message" class="btn btn-primary">Senden</button>
</div>
</div>
</section>
</main>
<footer>
<p>KC-App &middot; Zero-Dependency Web-Fallback</p>
</footer>
<script src="app.js"></script>
</body>
</html>