diff --git a/classes/grundrechenarten.json b/classes/grundrechenarten.json new file mode 100644 index 0000000..58417f3 --- /dev/null +++ b/classes/grundrechenarten.json @@ -0,0 +1,18 @@ +{ + "id": "grundrechenarten", + "name": "Grundrechenarten", + "icon": "➕", + "description": "Lerne die Grundlagen der Mathematik", + "theme": { + "--theme-bg": "#1a2f1a", + "--theme-bg-mid": "#2a4a2a", + "--theme-bg-light": "#3a6a3a", + "--theme-bg-hover": "#4a7a4a", + "--theme-text": "#e8f5e8", + "--theme-muted": "#7fa87f", + "--theme-muted-light": "#aed4ae", + "--theme-accent": "#4caf50", + "--theme-accent-hover": "#388e3c" + }, + "lessons": ["adding"] +} diff --git a/classes/kriminalfälle.json b/classes/kriminalfälle.json new file mode 100644 index 0000000..b20d2b1 --- /dev/null +++ b/classes/kriminalfälle.json @@ -0,0 +1,18 @@ +{ + "id": "kriminalfälle", + "name": "Kriminalfälle", + "icon": "🔍", + "description": "Löse echte Kriminalfälle aus Deutschland mit Mathematik", + "theme": { + "--theme-bg": "#1a252f", + "--theme-bg-mid": "#2c3e50", + "--theme-bg-light": "#34495e", + "--theme-bg-hover": "#3d566e", + "--theme-text": "#ecf0f1", + "--theme-muted": "#7f8c8d", + "--theme-muted-light": "#bdc3c7", + "--theme-accent": "#3498db", + "--theme-accent-hover": "#2980b9" + }, + "lessons": ["steglitz", "bode-museum", "dresden-gruenes-gewoelbe"] +} diff --git a/lessons/adding.json b/lessons/adding.json new file mode 100644 index 0000000..7adfbf3 --- /dev/null +++ b/lessons/adding.json @@ -0,0 +1,146 @@ +{ + "chapter": "➕ Addieren", + "description": "Lerne, wie man Zahlen addiert.", + "tasks": [ + { + "id": "adding-1", + "question": "Was ist 1 + 1?", + "answer": 2, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-2", + "question": "Was ist 2 + 1?", + "answer": 3, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-3", + "question": "Was ist 2 + 2?", + "answer": 4, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-4", + "question": "Was ist 3 + 2?", + "answer": 5, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-5", + "question": "Was ist 3 + 3?", + "answer": 6, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-6", + "question": "Was ist 4 + 3?", + "answer": 7, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-7", + "question": "Was ist 4 + 4?", + "answer": 8, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-8", + "question": "Was ist 5 + 4?", + "answer": 9, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-9", + "question": "Was ist 5 + 5?", + "answer": 10, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-10", + "question": "Was ist 6 + 4?", + "answer": 10, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-11", + "question": "Was ist 6 + 5?", + "answer": 11, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-12", + "question": "Was ist 6 + 6?", + "answer": 12, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-13", + "question": "Was ist 7 + 5?", + "answer": 12, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-14", + "question": "Was ist 7 + 6?", + "answer": 13, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-15", + "question": "Was ist 7 + 7?", + "answer": 14, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-16", + "question": "Was ist 8 + 6?", + "answer": 14, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-17", + "question": "Was ist 8 + 7?", + "answer": 15, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-18", + "question": "Was ist 9 + 7?", + "answer": 16, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-19", + "question": "Was ist 9 + 8?", + "answer": 17, + "points": 10, + "type": "word-problem" + }, + { + "id": "adding-20", + "question": "Was ist 9 + 9?", + "answer": 18, + "points": 10, + "type": "word-problem" + } + ] +} diff --git a/lessons/bode-museum.json b/lessons/bode-museum.json new file mode 100644 index 0000000..96117af --- /dev/null +++ b/lessons/bode-museum.json @@ -0,0 +1,57 @@ +{ + "chapter": "🔍 Bode-Museum: Der Big Maple Leaf Raub", + "description": "In der Nacht zum 27. März 2017 wurde aus dem Bode-Museum in Berlin die 100 kg schwere Goldmünze „Big Maple Leaf“ gestohlen. Drei Täter drangen während einer S-Bahn-Betriebspause über die Bahngleise ein, stiegen mit einer Leiter durch ein Fenster ein und zerschlugen die Panzerglasvitrine. Der Materialwert der Münze betrug etwa 3,75 Millionen Euro. Die Münze wurde vermutlich zersägt und eingeschmolzen; die Täter wurden später gefasst und verurteilt.", + "data": { + "gewicht_kg": { "value": 100, "description": "Gewicht der Goldmünze Big Maple Leaf in Kilogramm" }, + "materialwert_euro": { "value": 3750000, "description": "Materialwert der Münze zum Tatzeitpunkt in Euro (ca. 3,75 Mio €)" }, + "goldpreis_pro_kg_euro": { "value": 37500, "description": "Goldpreis pro Kilogramm zum Tatzeitpunkt in Euro" }, + "nennwert_dollar": { "value": 1000000, "description": "Nennwert der Münze in kanadischen Dollar" }, + "durchmesser_cm": { "value": 53, "description": "Durchmesser der Münze in Zentimetern" }, + "tatdatum": { "value": "2017-03-27", "description": "Datum des Diebstahls (27. März 2017)" }, + "tatzeit_von": { "value": "03:20", "description": "Beginn des Tatzeitfensters (Quelle: Polizei/Ermittlungen)" }, + "tatzeit_bis": { "value": "03:45", "description": "Ende des Tatzeitfensters (Quelle: Polizei/Ermittlungen)" }, + "tatzeitfenster_minuten": { "value": 25, "description": "Zeitfenster des Diebstahls in Minuten (03:20–03:45)" }, + "polizei_alarm_uhrzeit": { "value": "04:00", "description": "Uhrzeit der Alarmierung der Polizei (Quelle: Berichterstattung)" }, + "anzahl_taeter": { "value": 3, "description": "Anzahl der Täter (drei junge Männer)" }, + "entschaedigung_eigentuemer_euro": { "value": 2100000, "description": "Entschädigung an den privaten Eigentümer in Euro (Kammergericht)" }, + "entschaedigung_prozent": { "value": 50, "description": "Anteil des Versicherungswertes als Entschädigung in Prozent" }, + "versicherungswert_euro": { "value": 4200000, "description": "Versicherungswert in Euro (2,1 Mio € = 50 % davon)" }, + "wertersatz_gericht_euro": { "value": 3300000, "description": "Vom Gericht angeordneter Wertersatz durch die Verurteilten in Euro (gesamt)" }, + "haftstrafe_jahre_taeter_1_2": { "value": 4.5, "description": "Haftstrafe für zwei Täter in Jahren (viereinhalb Jahre)" }, + "haftstrafe_jahre_monate_taeter_3": { "value": 3.333, "description": "Haftstrafe für dritten Täter (3 Jahre und 4 Monate, gerundet)" }, + "timeline": [ + { "date": "2017-03-27", "time": "03:20", "description": "Vermutlicher Beginn: Täter dringen über S-Bahngleise und Fenster ein (S-Bahn-Betriebspause)." }, + { "date": "2017-03-27", "time": "03:20–03:45", "description": "Tatzeitfenster: Panzerglasvitrine zerschlagen, Münze (100 kg Big Maple Leaf) entwendet, Abtransport über Gleise." }, + { "date": "2017-03-27", "time": "04:00", "description": "Polizei wird alarmiert (Quelle: Berichterstattung)." }, + { "date": "2017-03-27", "description": "Tat entdeckt; Ermittlungen." }, + { "date": "2017", "description": "Ermittlungen werden der Familie R. (Remmo) zugeordnet; vier Beschuldigte (u.a. zwei Cousins, Ex-Wachmann)." }, + { "date": "2019", "description": "Verfahren vor dem Landgericht Berlin (Beginn etwa ein Jahr vor Urteil)." }, + { "date": "2020-02-26", "description": "Urteil Landgericht Berlin: Wissam R. und Ahmad R. je 4,5 Jahre Jugendstrafe; Denis W. 3 Jahre und 4 Monate; Wayci R. Freispruch. Wertersatz 3,3 Mio € (Remmo-Cousins), Denis W. 100.000 €." }, + { "date": "2021-06-24", "description": "Bundesgerichtshof weist Revision zurück; Urteile rechtskräftig." }, + { "date": null, "description": "Kammergericht Berlin: Privateigentümer erhält 2,1 Mio € Entschädigung (50 % des Versicherungswertes) wegen Sicherheitsmängeln." } + ] + }, + "tasks": [ + { + "id": "bode-museum-1", + "question": "📊 SCHADENSBERECHNUNG (Ermittler/Versicherung):\n\nDie gestohlene Goldmünze „Big Maple Leaf“ wiegt 100 kg. Der Goldpreis zum Tatzeitpunkt (27. März 2017) betrug 37.500 € pro Kilogramm.\n\nBerechne den materiellen Schaden in Euro, den die Ermittler für Anklage und Versicherung ansetzen.", + "answer": 3750000, + "points": 10, + "type": "word-problem" + }, + { + "id": "bode-museum-2", + "question": "📋 VERSICHERUNG (Rückrechnung):\n\nDer Eigentümer der Münze erhielt 2,1 Millionen Euro Entschädigung. Das war die Hälfte (50 %) des Versicherungswertes.\n\nWie hoch war der volle Versicherungswert in Euro? (Die Hälfte mal 2 = Ganzes.)", + "answer": 4200000, + "points": 10, + "type": "word-problem" + }, + { + "id": "bode-museum-3", + "question": "⏱ EINSATZAUSWERTUNG (Reaktionszeit):\n\nDer Diebstahl erfolgte zwischen 03:20 und 03:45 Uhr. Die Polizei wurde um 04:00 Uhr alarmiert.\n\nWie viele Minuten vergingen vom spätesten Tatende (03:45) bis zur Alarmierung? (Relevanz für die Bewertung der Reaktionszeit.)", + "answer": 15, + "points": 5, + "type": "word-problem" + } + ] +} diff --git a/lessons/dresden-gruenes-gewoelbe.json b/lessons/dresden-gruenes-gewoelbe.json new file mode 100644 index 0000000..13a4a70 --- /dev/null +++ b/lessons/dresden-gruenes-gewoelbe.json @@ -0,0 +1,51 @@ +{ + "chapter": "💎 Dresden: Der Juwelendiebstahl im Grünen Gewölbe", + "description": "Am 25. November 2019 drangen Täter in den frühen Morgenstunden in das Historische Grüne Gewölbe im Dresdner Residenzschloss ein. Sie nutzten einen Stromausfall (Brand an einem Stromkasten unter der Augustusbrücke), stahlen aus dem Juwelenzimmer 21 Schmuckstücke mit insgesamt 4.300 Diamanten und Brillanten. Der Versicherungswert betrug mindestens 113,8 Millionen Euro. Sechs Mitglieder der Berliner Remmo-Großfamilie wurden angeklagt; im Dezember 2022 gab der Clan einen großen Teil der Objekte zurück – teilweise beschädigt. Fünf Täter wurden 2023 verurteilt, einer freigesprochen.", + "data": { + "tatdatum": { "value": "2019-11-25", "description": "Datum des Einbruchs (25. November 2019)" }, + "tatzeit": { "value": "ca. 05:00", "description": "Frühe Morgenstunden, vermutlich gegen 5 Uhr" }, + "entdeckung_uhrzeit": { "value": "04:55", "description": "Sicherheitsdienst bemerkte Täter kurz vor 5 Uhr auf den Kameras" }, + "polizei_alarm_uhrzeit": { "value": "05:00", "description": "Polizei wurde gegen 5 Uhr informiert" }, + "streife_eintreffen_minuten": { "value": 5, "description": "Erste Funkstreife traf etwa 5 Minuten nach Alarm am Tatort ein" }, + "schmuckstuecke_gestohlen": { "value": 21, "description": "Anzahl der gestohlenen Schmuckstücke" }, + "diamanten_gesamt": { "value": 4300, "description": "Anzahl der Diamanten/Brillanten in den gestohlenen Stücken" }, + "versicherungswert_euro": { "value": 113800000, "description": "Versicherungswert der gestohlenen Objekte in Euro (mind. 113,8 Mio €)" }, + "angeklagte": { "value": 6, "description": "Anzahl der Angeklagten (Remmo-Großfamilie)" }, + "verurteilt": { "value": 5, "description": "Anzahl der Verurteilten (Mai 2023)" }, + "freigesprochen": { "value": 1, "description": "Anzahl der Freigesprochenen" }, + "schaden_beschaedigung_euro": { "value": 23500000, "description": "Geschätzter Schaden durch Beschädigung bei Rückgabe (22–25 Mio €, Mittelwert 23,5 Mio)" }, + "prozessbeginn": { "value": "2022-01-28", "description": "Beginn des Prozesses vor dem Landgericht Dresden" }, + "rueckgabe": { "value": "2022-12", "description": "Rückgabe eines großen Teils der Objekte durch den Clan (beschädigt)" }, + "urteil": { "value": "2023-05", "description": "Verurteilung von fünf Tätern" }, + "timeline": [ + { "date": "2019-11-25", "time": "ca. 05:00", "description": "Einbruch: Täter nutzen Stromausfall (Brand Augustusbrücke), dringen ins Juwelenzimmer ein, stehlen 21 Schmuckstücke mit 4.300 Diamanten (Versicherungswert mind. 113,8 Mio €)." }, + { "date": "2022-01", "description": "Sechs Mitglieder der Berliner Remmo-Großfamilie festgenommen und angeklagt." }, + { "date": "2022-01-28", "description": "Prozessbeginn vor dem Landgericht Dresden." }, + { "date": "2022-12", "description": "Clan gibt großen Teil der gestohlenen Objekte zurück – teilweise beschädigt; Schadensschätzung 22–25 Mio €." }, + { "date": "2023-05", "description": "Fünf Täter verurteilt, einer freigesprochen." } + ] + }, + "tasks": [ + { + "id": "dresden-1", + "question": "📊 SCHADENSBERECHNUNG (Ermittler/Versicherung):\n\nDie gestohlenen 21 Schmuckstücke enthielten insgesamt 4.300 Diamanten und Brillanten. Der Versicherungswert betrug mindestens 113,8 Millionen Euro.\n\nWie viel Euro Versicherungswert entfielen durchschnittlich pro gestohlenes Schmuckstück? (Runde auf ganze Millionen Euro – gib die Zahl in Euro an, z. B. 5000000.)", + "answer": 5000000, + "points": 10, + "type": "word-problem" + }, + { + "id": "dresden-2", + "question": "⏱ EINSATZAUSWERTUNG (Zeitfenster):\n\nDer Sicherheitsdienst bemerkte die Täter um 04:55 Uhr auf den Überwachungskameras im Juwelenzimmer. Die erste Polizeistreife traf um 05:05 Uhr am Tatort ein.\n\nWie viele Minuten Vorsprung hatten die Täter zwischen der Entdeckung und dem Eintreffen der Polizei? (Relevanz für die Flucht.)", + "answer": 10, + "points": 5, + "type": "word-problem" + }, + { + "id": "dresden-3", + "question": "📐 DIAMANTEN PRO STÜCK (Ermittler-Kennzahl):\n\nEs wurden 21 Schmuckstücke mit insgesamt 4.300 Diamanten und Brillanten gestohlen.\n\nWie viele Diamanten/Brillanten entfielen durchschnittlich pro Schmuckstück? (Runde auf ganze Zahl.)", + "answer": 205, + "points": 10, + "type": "word-problem" + } + ] +} diff --git a/lessons/steglitz.json b/lessons/steglitz.json new file mode 100644 index 0000000..23dbe35 --- /dev/null +++ b/lessons/steglitz.json @@ -0,0 +1,54 @@ +{ + "chapter": "🏦 Berlin-Steglitz: Der Tunnel-Bankraub 2013", + "description": "In der Nacht zum 14. Januar 2013 drangen Täter in eine Filiale der Berliner Volksbank in Steglitz ein – über einen etwa 45 Meter langen Tunnel aus einer gemieteten Tiefgarage. Sie durchbrachen eine 80 cm dicke Stahlbetonwand zum Tresorraum und brachen 309 der rund 1600 Schließfächer auf (294 davon waren vermietet). Die Beute wurde auf etwa 10 Millionen Euro geschätzt. Die Täter legten ein Feuer zur Spurenvernichtung; die Bande wurde nie gefasst.", + "data": { + "tatdatum": { "value": "2013-01-14", "description": "Datum des Einbruchs (Nacht zum 14. Januar 2013)" }, + "tatzeit_hinweis": { "value": "Nacht zum 14.01., keine exakten Uhrzeiten öffentlich", "description": "Zum Einbruch selbst sind öffentlich keine genauen Uhrzeiten überliefert; nur die Entdeckungszeit ist bekannt." }, + "entdeckung_uhrzeit": { "value": "06:15", "description": "Entdeckung am Montagmorgen gegen 6:15 Uhr – Anwohner bemerkt Rauch in der Tiefgarage (Feuer zur Spurenvernichtung)." }, + "bank": { "value": "Berliner Volksbank", "description": "Betroffene Bank (Filiale Steglitz)" }, + "tunnel_laenge_m": { "value": 45, "description": "Länge des Tunnels von der Tiefgarage zum Tresorraum in Metern" }, + "tunnel_tiefe_m": { "value": 4, "description": "Tiefe des Tunnels unter der Erde in Metern" }, + "wand_tresor_cm": { "value": 80, "description": "Dicke der durchbrochenen Stahlbetonwand zum Tresorraum in Zentimetern" }, + "wand_tiefgarage_cm": { "value": 30, "description": "Dicke der durchbrochenen Betonwand der Tiefgarage in Zentimetern" }, + "schliessfaecher_gesamt": { "value": 1600, "description": "Anzahl der Schließfächer im Tresorraum insgesamt (rund)" }, + "schliessfaecher_aufgebrochen": { "value": 309, "description": "Anzahl der von den Tätern aufgebrochenen Schließfächer" }, + "schliessfaecher_vermietet": { "value": 294, "description": "Anzahl der vermieteten unter den aufgebrochenen Fächern" }, + "schliessfaecher_leer": { "value": 15, "description": "Anzahl der aufgebrochenen, aber nicht vermieteten (leeren) Fächer (309 − 294)" }, + "schliessfaecher_unangetastet": { "value": 1291, "description": "Anzahl der nicht aufgebrochenen Schließfächer (1600 − 309)" }, + "beute_euro": { "value": 10000000, "description": "Geschätzte Beute in Euro (Schmuck, Geld, Gold)" }, + "material_abtransport_tonnen": { "value": 120, "description": "Abtransportiertes Sand und Geröll aus dem Tunnel in Tonnen (über Monate)" }, + "parkplaetze_gemietet": { "value": 4, "description": "Anzahl der in der Tiefgarage gemieteten Parkplätze" }, + "vorbereitung_ab": { "value": "2011-Herbst", "description": "Beginn der Vorbereitung (Herbst 2011, u.a. Schließfach mit gefälschtem Pass gemietet)" }, + "timeline": [ + { "date": "2011-Herbst", "description": "Ein Mann mietet mit gefälschtem niederländischen Pass (Name: Pavel Hatira) ein Schließfach in der Berliner Volksbank Filiale Steglitz." }, + { "date": "2012-Anfang", "description": "Tiefgaragenstellplatz in der Wrangelstraße wird gemietet (unter falschem Namen); Rolltor ermöglicht ungestörtes Arbeiten." }, + { "date": "2012–2013", "description": "Tunnelbau über viele Monate: ca. 45 m Tunnel, 4 m tief, von Tiefgarage zum Tresorraum; 120 t Sand und Geröll abtransportiert; Durchbruch 30 cm Betonwand (Tiefgarage), 80 cm Stahlbetonwand (Bank)." }, + { "date": "2013-01-14", "time": "Nacht", "description": "Einbruch (keine exakten Uhrzeiten öffentlich): Täter dringen über Tunnel in Tresorraum ein, brechen 309 von rund 1600 Schließfächern auf (294 vermietet); Beute ca. 10 Mio €; Feuer zur Spurenvernichtung gelegt." }, + { "date": "2013-01-14", "time": "06:15", "description": "Entdeckung: Anwohner bemerkt gegen 6:15 Uhr Rauch in der Tiefgarage; Polizei rückt aus." }, + { "date": "2013", "description": "Ermittlungen; Bande wird nie gefasst." } + ] + }, + "tasks": [ + { + "id": "steglitz-1", + "question": "📊 TATORT-STATISTIK (Betroffene Fächer):\n\nIm Tresorraum der Berliner Volksbank Steglitz gab es rund 1600 Schließfächer. Die Täter brachen 309 davon auf; 294 der aufgebrochenen Fächer waren vermietet.\n\nWie viele der aufgebrochenen Fächer waren nicht vermietet (also leer)? – Relevant für Schadensmeldungen und Anzahl der Geschädigten.", + "answer": 15, + "points": 5, + "type": "word-problem" + }, + { + "id": "steglitz-2", + "question": "📐 SCHADENSPRO EINHEIT (Ermittler-Kennzahl):\n\nDie Beute aus dem Tunnel-Bankraub wurde auf etwa 10 Millionen Euro geschätzt. Es wurden 309 Schließfächer aufgebrochen.\n\nWie viel Euro Beute entfielen durchschnittlich pro aufgebrochenes Fach? (Runde auf ganze Euro.)", + "answer": 32362, + "points": 15, + "type": "word-problem" + }, + { + "id": "steglitz-3", + "question": "📐 TATORT (Betroffene Fächer):\n\nIm Tresorraum der Berliner Volksbank Steglitz gab es rund 1600 Schließfächer. Die Täter brachen 309 davon auf.\n\nWie viele Schließfächer blieben unangetastet?", + "answer": 1291, + "points": 5, + "type": "word-problem" + } + ] +} diff --git a/public/app.js b/public/app.js index 327e5cb..8cca3e1 100644 --- a/public/app.js +++ b/public/app.js @@ -1,4 +1,3 @@ -// ─── Supabase config (injected by server from .env via /config.js) ─────────── const supabaseClient = supabase.createClient(window.SUPABASE_URL, window.SUPABASE_ANON_KEY); // ─── App state ─────────────────────────────────────────────────────────────── @@ -7,6 +6,7 @@ let tasks = []; let chapters = []; let chapterDescriptions = {}; let activeChapter = null; +let activeClassData = null; // ─── Auth ──────────────────────────────────────────────────────────────────── @@ -22,7 +22,6 @@ async function login() { const password = document.getElementById('loginPassword').value; const errorEl = document.getElementById('loginError'); errorEl.textContent = ''; - const { error } = await supabaseClient.auth.signInWithPassword({ email, password }); if (error) errorEl.textContent = error.message; } @@ -43,11 +42,9 @@ async function register() { if (error) { errorEl.textContent = error.message; } else if (!session) { - // Email confirmation is enabled — user must confirm before logging in errorEl.style.color = '#27ae60'; errorEl.textContent = 'Konto erstellt! Bitte E-Mail bestätigen, dann anmelden.'; } - // If session exists, onAuthStateChange fires and opens the app automatically } async function logout() { @@ -78,34 +75,140 @@ async function apiFetch(url, options = {}) { return res; } +// ─── Theme ─────────────────────────────────────────────────────────────────── + +function applyTheme(theme) { + const root = document.documentElement; + Object.entries(theme).forEach(([prop, value]) => { + root.style.setProperty(prop, value); + }); +} + +// ─── Screen management ─────────────────────────────────────────────────────── + +function showScreen(screen) { + document.getElementById('authOverlay').style.display = 'none'; + document.getElementById('classPickerOverlay').style.display = 'none'; + document.getElementById('classCompletionOverlay').style.display = 'none'; + document.getElementById('appWrapper').style.display = 'none'; + + if (screen === 'auth') { + document.getElementById('authOverlay').style.display = 'flex'; + } else if (screen === 'class-picker') { + document.getElementById('classPickerOverlay').style.display = 'flex'; + } else if (screen === 'class-completion') { + document.getElementById('classCompletionOverlay').style.display = 'flex'; + } else if (screen === 'app') { + document.getElementById('appWrapper').style.display = 'flex'; + } +} + +// ─── Class picker ──────────────────────────────────────────────────────────── + +async function showClassPicker() { + showScreen('class-picker'); + const listEl = document.getElementById('classList'); + listEl.innerHTML = '
Laden...
'; + + const res = await apiFetch('/api/classes'); + if (!res) return; + const { classes } = await res.json(); + + listEl.innerHTML = ''; + + if (classes.length === 0) { + listEl.innerHTML = 'Keine Klassen verfügbar.
'; + return; + } + + classes.forEach(cls => { + const card = document.createElement('div'); + card.className = 'class-card'; + card.style.setProperty('--card-accent', cls.theme['--theme-accent'] || 'var(--theme-accent)'); + card.innerHTML = ` + +