66 Commits

Author SHA1 Message Date
Adminator 50c72fa8d8 Lizenz-Vertrieb Feinschliff: Zugabe +10%, sichere Datei-Einloesung, Mail-Config
Umsetzung des Thomas-Feedbacks:
- Reihenfolge: freie Lizenzen beim Lehrer jetzt ORDER BY id (= Reihenfolge der
  reinkopierten Liste); stornierte ausgeblendet.
- Gratis-Zugabe: Checkbox (Default an) "+10 % aufgerundet" -> geliefert =
  ceil(bestellt*1.1) (14 -> 16). Batch speichert qty_ordered (verrechnet) und
  qty (geliefert); Live-Vorschau im Formular.
- Einloeselink/QR ENTFERNT (Sicherheitsrisiko: falscher eingeloggter Account).
  einloesen.html + pages/einloesen.php geloescht, Sammellink aus UI/Mail raus.
- CSV: Gueltig-bis + Metadaten nur in der KOPFZEILE, danach reine Code-Zeilen
  (per Copy-Paste einloesbar). Dateiname: <ExtBestellnr|Datum>_geograsim_<intNr>.
- Interne Bestellnummer = batch.id (laufend, nicht editierbar, storno-stabil).
- Lehrer-Einloesen: sichere .txt/.csv-Ablage (mehrstufig: Endung+MIME, Groessen-
  limit, nur Text lesen, Whitelist-Regex extrahiert nur Code-Tokens, Server
  validiert) — kein Upload, keine Ausfuehrung/Rendering.
- Mailsystem: zentrale Config in neuer app_settings (Provider server|aws,
  Absender-Name/-Adresse, oeffentliche URL), pflegbar in Admin + Test-Versand.
  Mailer liest Absender aus Config (SMTP-Zugang bleibt in .env). Mailtext nutzt
  kanonische geograsim.at (nicht v3/localhost).

Migrationen: -2 (qty_ordered), -3 (app_settings). Beide additiv, auf v3 angewandt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 11:15:53 +02:00
Adminator 96a73e22b2 Lizenz-Vertrieb: Chargen-Vergabe, Storno, Verlaengerung, Mail, Einloeselink
Erweitert das Lizenzmodul um eine Vertriebs-/Vergabe-Schicht ueber dem
bestehenden Einloese-Flow (non-breaking, alle Alt-Codes + generate/redeem
/assign unveraendert).

Schema (Migration 2026-08-26-lizenz-vertrieb.sql, additiv):
- license_customers (Besteller: Kundennummer/Email/Name)
- license_batches (Bestellung/Charge: externe Bestellnummer, Typ, Menge,
  Gueltigkeit, Sammel-Einloesetoken, Storno)
- licenses += batch_id, issued_at, valid_from/until (pro Code -> Verlaengerung),
  canceled_at/reason; code auf VARCHAR(32) (laengere Codes)
- license_mails (Mail-Archiv, unabh. vom IMAP), license_redeem_attempts
  (Brute-Force-Schutz), license_events (Audit-Log)

Backend (php/api/licenses.php):
- issue_batch: N frische 100-Bit-Codes in Transaktion, sofort vergeben,
  an Kunde/Bestellung/Gueltigkeit gebunden; sticky Default Gueltig-bis
- Uebersicht (view=batches mit Aggregat ausgegeben/storniert/netto/eingeloest
  /abgelaufen), batch_detail, Kunden-Autocomplete, sales_default
- cancel_batch/cancel_license, extend_batch/extend_license
- send_batch_mail (Server-Treiber via Mailer, archiviert, Anhang bei >40)
- redeem_charge (Sammel-Einloeselink)
- Brute-Force-Bremse + Audit + Storno-Ablehnung im redeem/redeem_batch

UI (admin-licenses.html): Ausgabe-Formular (Bestaetigung bei Grossmengen),
Ergebnis mit Copy/Download(txt+csv)/Mail-Composer/Sammellink, Bestellungs-
Uebersicht mit Filtern + Detail-Modal (Storno/Verlaengern/Verlauf/Mails).

Einloese-Landingpage (einloesen.html + pages/einloesen.php): ?charge=Token
(alle auf einmal) und ?code=CODE, mit Lehrer-Login-Gate.

Lib: Database Transaktionen; Mailer sendWithAttachments + renderPlainBody.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 01:39:14 +02:00
Adminator bb4d3b4cb6 heli-uebersicht: Cockpit-Link -> Haus-Icon (unser Stil) auf /schueler; Zur-Simulation-Button entfernt
Cockpit-Pille (fuehrte auf /sim ins Leere) ersetzt durch schwebendes
Haus-Icon -> /schueler (Schueler-Module). Zur-Simulation-Button raus,
da die Seite via target=_blank oeffnet (sonst mehrere Fenster).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 23:51:34 +02:00
Adminator fecd8bb9c9 Textsystem: Bis-Strich mit Leerzeichen (Zahl – Zahl) per Agent-Sweep
562 Ersetzungen in 50 Dateien: Halbgeviertstrich zwischen zwei Ziffern (=
"bis"-Bereich) bekommt Leerzeichen davor/danach (3–4 -> 3 – 4). Regex
/([0-9])\s*–\s*(?=[0-9])/ auf Rohtext (format-erhaltend, CRLF/Einrueckung
unveraendert), Bindestriche in Woertern und Minuszeichen unangetastet, alle
JSON weiter gueltig. Energiemanager-Zeitbloecke sind Display-Labels (kein
Logik-Key) -> safe.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:38:19 +02:00
Adminator a68c58ac9e Weltkueche Teil A: Land pro Lehrer persistent (teachers.country) + Sim-Verdrahtung
- profil.html: Länderauswahl (AT/DE/CH/LI) im Lehrer-Profil, lädt/zeigt aktuelles Land.
- profile.php: speichert country in teachers.country; gibt country zurück.
- weltkueche.php: injiziert window.WK_COUNTRY = Country::current() (Kaskade Schüler→Klasse→Lehrer→AT) — Fundament für die konsumentenland-basierte Herkunft (Teil B).
Spalte teachers.country existierte bereits, keine Migration nötig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 12:13:27 +02:00
Adminator 37f6238d05 Auth Phase 2: Session-Zugriffe kanalisieren (verhaltensneutral)
Vorbereitung für den JWT+Redis-Umschalter: alle verstreuten
$_SESSION['teacher_id'|admin_id']-Zugriffe laufen jetzt durch Session::-Helper,
damit der Backend-Tausch später EINE Datei (Session.php) ist statt 18 Stellen.

- Session.php: neue Admin-Helper adminId()/loginAdmin()/logoutAdmin()/
  requireAdmin() (mirror der Teacher-Helper). teacherId()/adminId() starten
  die Session jetzt lazy (Aufrufer müssen Session::start() nicht mehr).
- 18 Fundstellen kanalisiert (admin.php, admin-accounts, admin-modules,
  licenses, levels, waypoints, foto-upload, admin_gate, save_map).
- Country.php + app.php cockpit_href: über Session:: mit class_exists-Fallback
  (Bootstrap/Lib-Kontext, Session evtl. nicht geladen).

Verhaltensneutral: 14/14 Lint OK, Helper-Round-Trip 6/6 PASS, Live-Smoke
(admin status/modules/accounts/licenses) weist unauth. Requests wie bisher
mit 401/403 ab. AUTH_BACKEND bleibt 'session' — Live unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 16:33:14 +02:00
Adminator 9937fbf62a Fix: Länder-Filter im Lehrplan-Bezug (modul_detail.php) wirkungslos
Der Filter-JS liest a.dataset.anchorType, aber die Anker-<div>s setzten
kein data-anchor-type (nur data-country). Dadurch war `type === 'fach'`
nie wahr → für ein gewähltes Land wurde nie ein Anker ausgeblendet.
Fix: data-anchor-type am Anker-div ergänzt. Gilt für alle Modul-Seiten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 13:46:42 +02:00
Adminator b9bcbf9198 Backend-Editoren admin-geschuetzt (admin_gate) + Admin-Hub auf Admin-Seite; save_map admin-oder-lehrer; foto-upload admin-bypass (PIN bleibt)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 11:54:08 +02:00
Adminator 305e3a62f8 Glossar-Review: CO2-Eintrag ganze Sätze + Tabelle, Geviertstrich→Gedankenstrich, Weltküche-Onboarding
- Glossar-Renderer: Markdown-Tabellen (|…|) + .gl-table CSS
- co2-fussabdruck-lebensmittel: telegrafische Liste → ganze Sätze + saubere
  Portions-Tabelle, Avocado-Vergleich, Malpunkt statt ×
- Programmweit „—" (Geviertstrich) → „–" (Gedankenstrich): Glossar-DB,
  glossar_examples, module_info, alle 13 Buch-Kapitel
- Weltküche-Onboarding: Blatt 2 umformuliert (zweites Land nacheinander),
  Blatt 3 Lehrplan-Satz entfernt, Blatt 4 fehlendes markt.webp generiert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:15:29 +02:00
Adminator 0357cd188e Buch: 3 echte Fotos in neue Plätze (Schiff/Venedig/Flughafen)
Logistik: Containerschiff auf der Verkehrsträger-Seite (LKW/Zug/Schiff).
Klima: Venedig Acqua alta auf der Meeresspiegel-Seite (europäisches Beispiel).
Kofferdetektiv: Großraumflugzeug an der Fluggastbrücke (Flughafen/Flugverkehr).
Jeweils Standard + Leichte Sprache, EXIF/GPS gestrippt. Fotos von Thomas.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 12:39:37 +02:00
Adminator 6e3de69b3c Buch Weltküche: echtes Gewürzmarkt-Foto (Basar Jerusalem) in gewuerzregal-tropen
Foto von Thomas; Bildunterschriften (Leicht + Standard) an das Marktmotiv angepasst,
Herkunftsfakten (Zimt/Pfeffer/Vanille) behalten. EXIF/GPS gestrippt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 13:27:17 +02:00
Adminator c64cfda66d Buch Klima: neuer Abschnitt "Klimawandel weltweit – Nakuru-See in Kenia"
Echte Fotos (Thomas, Egerton/Kenia Feb 2024): versunkenes Ranger-Haus im gestiegenen
Nakuru-See + Klimabücher-Regal der Universitätsbibliothek. Zeigt: Klimawandel ist nicht
nur Meeresspiegel — auch ein 1.700 m hoher See in Afrika steigt und verschluckt Wald/Häuser
(40→68 km² 2010–2020, ~80.000 Familien vertrieben; UNEP/Egerton University). Standard + Leichte Sprache.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 13:22:47 +02:00
Adminator e65e938b7f Schulbuch: 15 echte Fotos aus dem Foto-Backend eingebaut (EXIF/GPS gestrippt)
busfahrt (Flixbus, Grenzschild, Reisebus, Pfänder-Dreiländerblick), energiemanager
(Smart Meter, Strommast, 2× Lünersee als Silvretta/Pumpspeicher), farmer (Alm-Kuh),
klima (Gewächshaus; Lünersee → energie-wasserkraft statt Gletscher, da es ein See ist),
kofferdetektiv (Vintage-Koffer, Nachtzug-Bahnsteig, Abflugtafel Zürich), weltkueche
(Frühstückstablett). Bindestrich-Fix Lüner-See→Lünersee.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 03:02:24 +02:00
Adminator c5307017e4 Schulbuch: einheitliches App-Menü + rollenabhängiger Modus
- Kapitel-Kopf: alte Links (Modulseite/Simulation/Glossar/Lehrplan) raus, stattdessen
  einheitliches App-Menü je Rolle (Schüler: Module/Erfolge/Schulbuch/Profil; Lehrer:
  Cockpit/Schulbuch; öffentlich: Simulationen/Schulbuch), Schulbuch aktiv
- Modus je Rolle: Schüler:in → Schüler:innen/Leichte Sprache (Default Schüler:innen,
  Lehreransicht gesperrt, auch bei ?lehrer=1); Lehrperson → +Lehreransicht (Default Lehrperson)
- teacher.html: Menüpunkt "📖 Schulbuch" ergänzt
- buch.php-Übersicht: gleiches rollen-Menü statt "← Zu den Simulationen"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 02:53:23 +02:00
Adminator 685b4700f8 Glossar: 4 erklärende Widgets + 2 Einträge anschaulicher
Widgets: Ernährungspyramide (US-1992 vs DACH-2024 vs Denkfehler), Kakao-Bohne
(Schoko-Fließband + Mischverhältnis→Sorte/kaputte Masse), Klimazone (Bänder Äquator→Pol
mit Beispielpflanzen), Monsun (Monatsregen-Balkendiagramm Mumbai + Wien-Vergleich, Quelle IMD).
Texte: off-season-import (Winter-Erdbeere ~10× CO₂, Schiff vs Flug) + lebensmittelverschwendung
(70 kg = ~6 Wochen Essen; 700 Mio. Hungernde) — greifbare Vergleiche.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 01:42:20 +02:00
Adminator 954461c1b9 Buch: 51 neue Fachbegriffe im Text mit dem Glossar verlinkt (Tooltips)
Erste Nennung je Begriff im Standard-Zweig per g() verlinkt (blockabfertigung,
verordnung/richtlinie, deich, eisschild, strommix, kerosin, halbschatten, taiga,
fruchtfolge, synergie … über 10 Kapitel). Kein g() in Leichter Sprache.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 23:26:05 +02:00
Adminator f8e77910ea Glossar: 51 neue Einträge komplett — Bilder + 12 interaktive Widgets
Bilder (Flat-Scandinavian, gpt-image-1) für alle 51 neuen Begriffe; 12 Widgets in
neu1.js (strommix, eisschild, klimabilanz, megawattstunde, niederschlag, fruchtfolge)
und neu2.js (halbschatten, blockabfertigung, grundfreiheiten, synergie, aufenthaltsdauer,
grundwasser). image_path + module-Mappings, key_slug-basiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 23:17:59 +02:00
Adminator f9a5c84ab9 Buch (5 Kapitel): Sek-I-Sprache — heli, sonnensystem, eu-werkstatt, farmer, klima
Schachtelsätze auf, Jargon erklärt (Sperrwerk, Geo-Engineering, Vegetationsperiode,
gebundene Rotation, Glyphosat), jeder Fachbegriff per g() verlinkt. Sammel-Fix:
Boden-See→Bodensee, Formarin-See→Formarinsee (falsche LS-Bindestriche).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:26:42 +02:00
Adminator 6e23265dbc Buch (3 Kapitel): Sek-I-Sprache — kofferdetektiv, fluss, busfahrt
Schachtelsätze auf, Jargon erklärt (Kerosin, gesättigt/versiegelt, Lenkzeit/Zollunion),
jeder Fachbegriff per g() verlinkt. Fakten/Quellen/Struktur unverändert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:23:59 +02:00
Adminator e06681d522 Buch (4 Kapitel): Sek-I-Sprache — Schachtelsätze auf, Jargon erklärt, Begriffe verlinkt
tourismustal, tourismusregion, weltkueche, energiemanager: Nominalstil/Passiv → Aktiv,
jeder Fachbegriff eingeführt + per g() verlinkt (Achillesferse/Dumping-Preis/Dunkelflaute-
Schachtelsätze etc. entschärft). Fakten/Quellen/Struktur/Fotos unverändert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:22:59 +02:00
Adminator c00b535b1f Buch Logistik: Sprache auf Sek-I-Niveau (Alpentransit entjargont, Begriffe verlinkt)
Schachtelsätze aufgelöst, Aktiv statt Nominalstil, jeder Fachbegriff erklärt +
per g() ans Glossar verlinkt. Blockabfertigung/sektorales Fahrverbot/Nachtfahrverbot
kindgerecht erklärt (Thomas' zitiertes Negativbeispiel). Fakten/Quellen/Struktur unverändert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:21:35 +02:00
Adminator 237c3c4d82 Buch: Glossar-Tooltips reparieren — GlossarTooltip.init() fehlte in allen 13 Kapiteln
Die Kapitel banden glossar-tooltip.js ein, riefen aber nie init() auf → alle
Fachbegriffe waren unterstrichen, aber ohne funktionierenden Tooltip (tote Links).
Init auf DOMContentLoaded ergänzt (lädt alle Glossar-Begriffe, apiBase=BASE_PATH/php/api).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:13:48 +02:00
Adminator 1f9d52bd2b Foto-Backend: Löschfunktion pro Foto (✕-Knopf am Thumbnail, mit Bestätigung)
- POST-Handler aktion=loeschen: entfernt Upload-Datei + Thumbnail-Cache
- Schutz: kein Pfad-Ausbruch, .note.txt nicht löschbar, hinter PIN, PRG-Redirect
- ✕-Overlay-Button auf jedem Thumbnail, JS-confirm vor dem Löschen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 15:53:11 +02:00
Adminator 2e50aaf49f Glossar: 12 neue interaktive Widgets (Tourismus + Geo/Energie/Reise)
tourismus.js: beschneiung (Temp→Schnee), diversifizierung, kapazitaet, saisonalitaet,
uebertourismus, bevoelkerungsdichte
geowelt.js: gletscher, lawinenwarnstufe, lichtgeschwindigkeit, gigawattstunde,
netzspannung, kartenmaßstab
Einbindung in glossar.php (Registry via Object.assign).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 02:36:55 +02:00
Adminator 0febe51685 Glossar-Qualität Welle 1: Angebot&Nachfrage neu (Kino-Beispiel) + Markt-Widget, DIN-Striche, Fixes
- angebot-nachfrage: kindgerechter Text (20-€-Taschengeld/Kino), kein Lehrplan-Jargon,
  neues interaktives Markt-Widget (10 Äpfel, Preis-Regler → Gleichgewicht)
- beduerfnisse, raumnutzungskonflikt: Lehrplan-Sätze raus, kindgerechter
- DIN 5008: Zahlenbereiche programmweit als "5 – 9" (71 Einträge)
- Leichte Sprache: falsche Bindestriche gefixt (Infrastruktur, Grundausstattung, …)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 02:17:54 +02:00
Adminator c4276083a2 Glossar visuell komplett: 162 Bilder, 13 Kapitel-Icons, 12 interaktive Widgets
- 162 neue Glossar-Bilder (Flat-Scandinavian, gpt-image-1) → alle 402 Einträge bebildert;
  image_path-Update: App/Don_t_Deploy/2026-07-16-glossar-bilder.sql
- 13 Kapitel-Icons (icon-<id>.webp) ersetzen die Emojis in Buch-Übersicht + Kapitel-h1
  (buchKapIcon-Helper mit Emoji-Fallback)
- 12 interaktive Glossar-Experimente in 2 Modulen:
  natur (Mondrotation, Kernschatten, Keeling-Kurve, Pegel/HQ100, Wärmeausdehnung,
  Klimaträgheit) + wirtschaft (Preiselastizität, Engpass, Skaleneffekt, Modal Split,
  Netzfrequenz/Hertz, Lageenergie/Pumpspeicher); Registry via Object.assign,
  Script-Einbindung in glossar.php

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 00:59:30 +02:00
Adminator 78a1cdca24 Buch ↔ Glossar verbunden: 80 neue Glossar-Einträge, ~390 Tooltips, Rückverlinkung
- 13 Kapitel: alle Fachbegriffe per g()-Tooltip verlinkt, fehlende Begriffe als
  vollwertige Glossar-Einträge angelegt (short/text + Leichte-Sprache-Felder,
  glossar:-Querverweise, ohne Bild — Bild-Batch folgt)
- Modul-Mappings vervollständigt: jeder Buch-Begriff erscheint auf glossar?module=<sim>
  (kofferdetektiv erstmals gemappt, 31 Begriffe; klima auf beide module_ids)
- Ergänzende Erklärsätze im Buch, wo Begriffe bisher nur genannt wurden
- glossar.php: Chip „📖 Zum Schulbuch-Kapitel" bei aktivem Modul-Filter (BUCH_LINK-Map,
  klima-3d → buch-klima)
- SQL idempotent (INSERT IGNORE, Mappings per key_slug-Subquery, keine harten IDs):
  App/Don_t_Deploy/2026-07-15-buch-glossar-*.sql

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 17:40:56 +02:00
Adminator f91f3f26de Foto-Backend: Upload-Thumbnails + Overlay-Lightbox
- Hochgeladene Fotos erscheinen als Thumbnail-Raster beim Slot (110px, GD-generiert
  mit EXIF-Orientierung, gecacht in uploads/buch-fotos/.thumbs)
- Klick öffnet Overlay in groß (Esc/Klick/✕ schließt); auch eingebaute Slot-Fotos klickbar
- Auslieferung nur über die Seite hinter der PIN (?img=/?thumb=); Ordner bleibt gesperrt
- Notizen werden als 📝-Zeile beim Slot angezeigt

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 17:14:13 +02:00
Adminator a3d81b8983 Foto-Backend: PIN-Schranke 0815 (Cookie 1 Jahr, im Browser gespeichert)
Uploads und Slot-Liste nur nach PIN-Eingabe; falsche PIN mit Meldung,
POST-Uploads ohne Cookie werden ebenfalls von der Schranke abgefangen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 16:48:03 +02:00
Adminator 4e3ff6447f Foto-Backend /foto-upload: alle Schulbuch-Foto-Slots mit Upload-Formular
- Parst buchBild()-Slots live aus allen buch-*.php (92 Slots, bleibt automatisch synchron)
- Pro Slot: Beschreibung, Status (eingebaut/wartend/gesucht), Thumbnail, Multi-Upload
  (JPG/PNG/HEIC/WebP, max 40 MB) + Notizfeld; Sonstiges-Slot für freie Fotos
- Uploads nach uploads/buch-fotos/<sim>/, per .htaccess gesperrt (Originale mit GPS
  nie öffentlich); PRG-Redirect, Dateityp-/Größen-Validierung
- App/uploads/ in .gitignore

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 13:59:54 +02:00
Adminator f282c79a25 Schulbuch komplett: 13 Kapitel, je 3 Versionen (Schüler / Leichte Sprache / Lehrperson)
- Gemeinsame Infrastruktur: assets/css/buch.css + pages/_partials/buch_helpers.php
  (Foto-Slots, Glossar-Tooltips, Nav mit 3-Modi-Umschalter ?leicht=1/?lehrer=1)
- Neu: Leichte-Sprache-Version in jedem Kapitel (inklusiver Unterricht):
  kurze Sätze, eine Aussage pro Zeile, Bindestrich-Komposita, einspaltig, größere Schrift
- 12 neue Kapitel: tourismusregion, kofferdetektiv (Themenfeld Reise/Transport/
  Flugverkehr/Nachhaltigkeit), busfahrt, logistik (Alpentransit), weltkueche, farmer,
  klima (2D+3D), fluss (Alpenrhein/Rhesi), energiemanager (Illwerke), heli, sonnensystem,
  eu-werkstatt — alle mit verifizierten Quellen, echten Sim-Mechanik-Kästen,
  D-A-CH-Lehrplan-Chips und 7 Foto-Slots mit konkreten Vorschlägen
- Pilot tourismustal: geschichte-1948 halb so groß (b-klein), Spielsprache-Fixes
- buch.php: 13 Kapitel, Status automatisch aus Dateiexistenz

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 17:12:19 +02:00
Adminator e9870843e8 Schulbuch Tourismustal: 6 echte Fotos eingebunden (GPS-verortet, EXIF gestrippt)
- Opener: Warth am Arlberg (Dez 2025); neuer Slot geschichte-1948 (Dornbirn 1948, Privatarchiv)
- Standort: Sommer-Sessellift (Juni 2017); Wirtschaft: Seiser Alm Hüttenterrasse (Okt 2025)
- Klimawandel: aperer Hang Bödele (Feb 2020); Zielkonflikt: Lünersee-Stausee (Mai 2016)
- Bildunterschriften mit echten Orten/Daten aus EXIF-GPS; Web-Exporte ohne EXIF/GPS
- Sommerloch-Slot bleibt offen (Motiv fehlt noch); VERWENDET.md in .humanInput (lokal)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 01:32:38 +02:00
Adminator e7e0f922c7 Tourismustal: Kosten-Check - Realitaets-Quiz mit Bonus-Budget
Kostenwahrheit als Lernmoment statt Fussnote: Nach dem Erst-Bau von
Lift/Gondel/Hotel/Beschneiung/Bushaltestelle erscheint (Event-Pacing)
je einmalig ein Kosten-Check: Info mit echtem AT-Beispiel + Schaetzfrage
(mehr/weniger). Richtig = +2.000 Euro Bank-Bonus, falsch = nur die
Aufloesung. Verifizierte Zahlen: Leppleskofel-6er 12 Mio. (Dolomiten-
stadt), Patscherkofelbahn 58 geplant -> 83,2 Mio. bezahlt (Stadt Ibk),
WKO-Hotelrichtwerte 220-270k/Zimmer, Schneekanone 27-35k + 1 Mio./
Pistenkm, Ski Arlberg Tageskarte 81,50. Erster Check traegt den
Modell-Hinweis (Preise verkleinert, Verhaeltnisse stimmen).
Antwortrichtungen gemischt (3x mehr, 2x weniger). Quiz-Karten sind
Entscheidungen -> immer modal, auch im Audio-Modus.
Schulbuch Seite 2: Daten-Box 'Was kostet das wirklich?' + Meta-Aufgabe D
(Modellkompetenz) + Quellen 8-12. Modulseite: Vereinfachungs-Hinweis
in long_desc (SQL lokal+prod).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 01:14:55 +02:00
Adminator dbfb5be5a0 Schulbuch/Tourismustal: interner Pfad raus + oesterreichische Rechenzeichen
- Schulbuch-Quellenverzeichnis: interner Dateipfad (QUELLEN.md) entfernt -
  gehoert nicht in ein Schuelerdokument.
- Tagesbericht: Malpunkt (Mittelpunkt) statt x als Multiplikationszeichen -
  oesterreichische Schulschreibweise (neue Dauerregel: +, -, Malpunkt,
  : fuer Division in allen schueler-sichtbaren Rechnungen).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 17:40:28 +02:00
Adminator 31f1744730 Schulbuch: Scrollbar-Fix (design-system.css sperrt body-Scroll)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 17:23:37 +02:00
Adminator 7d4e97c0bc Schulbuch: Konzept + Pilot-Kapitel Tourismustal (2 Versionen)
Neues Format /buch: pro Sim ein Schulbuch-Kapitel, lehrplankonform,
druckbar (A4), mit Glossar-Tooltips, echten Daten aus QUELLEN.md und
Sim-Mechanik-Kaesten. Zwei Versionen aus einer Quelle: Schueler:innen
(Sachtext + Mechanik-Referenz + gestufte Aufgaben A/B/C) und Lehrperson
(?lehrer=1: Verlaufsvorschlag Doppelstunde, didaktische Hinweise,
Stolpersteine, Erwartungshorizonte, Cockpit-Tipps). Foto-Slots mit
konkreten Vorschlaegen: echtes Bild unter assets/img/buch/<sim>/<slug>.jpg
ablegen ersetzt den Platzhalter automatisch. Pilot: Kapitel Tourismustal
(Opener + 5 Seiten + Quellenverzeichnis).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 17:03:46 +02:00
Adminator 8047778a5b Tourismusregion: Komplett-Integration (zweite neue Sim, beta)
Wellenbasierte Routen-Sim (DefensegeograSimMac) nach dem Tourismustal-
Playbook integriert: Sim nach App/sims/tourismusregion (game.html,
Sprites 47MB->9.5MB, ohne Eigen-Backend/Editor/Dashboard/Keys),
Plattform-Hooks (GGS_LIVE_STATE mit Welle/Budget/Umwelt/Sterne/Lenkung,
Submit bei Partie-Ende mit fertigem 0-100-Score, GGS_TUTORIAL, Home-
Button, Musik leise). Wrapper + Modul-Detailseite. SQL: module_info
(beta, Karte), Glossar-Kernbegriff Besucherlenkung (+Bild, Leichte
Sprache) + 12 Zuordnungen, Lehrplan-Mapping auf tourismus-
raumentwicklung (primaer) + verkehrserziehung/systemisches-denken.
LEHRPLAN.md mit Schwerpunkt Besucherlenkung & Mobilitaet. Lehrer-
Backend: Benchmark (Sim-Score direkt), Live-Cockpit-Spalten,
needsHelp, Highlights.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 01:14:12 +02:00
Adminator 55a83d5daf Tourismustal: iPad-Feedback Runde 2 (5 Punkte)
- Bau-Ablehnung erklaert jetzt immer auch die Bauregeln des Gebaeudes
  (Toast: Grund + Beschreibung, 7 s).
- Lehrer-Schalter fuer den Vorlese-Modus: class_modules.audio_info
  (Migration, Default AN) + modules-API set_audio_info + Toggle auf der
  Modul-Karte im Cockpit (Vorlesen an/aus) + Wrapper injiziert
  TT_FEATURES.audioInfo + Sim blendet den Umschalter aus und erzwingt
  Lese-Modus, wenn gesperrt.
- Bus zeigt bei Rueckfahrt sein Heck: Heckscheibe + rote Ruecklichter,
  Tuer/Spiegel richtungsabhaengig.
- Bikepark-Flowtrails: 3 Stufen hangAUFwaerts (gleiche Richtung wie
  Lift-Pisten).
- Info-Button an jedem Bauwerk im Baumenue: erklaert Wirkung, Kosten,
  Lage-Regeln und Lehrplan-Wissen VOR dem Bau.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 18:07:03 +02:00
Adminator 0a2ebf46b4 Tourismustal: Komplett-Integration (Sim + Wrapper + SQL + Lehrer-Backend)
Sim nach App/sims/tourismustal umgezogen (Source of Truth), game.html mit
Injection-Marker. Neu in der Sim: 5 Sommergebaeude (Bikepark mit Flowtrails,
Hochseilgarten, Fahrradverleih als Verstaerker, Aussichtsplattform,
Erlebnisspielplatz), Rettungsstation mit Notarzthubschrauber, Ausbau-
Bauanimation, Event-Pacing, Schulden-Notbremse (Bank-Zwangsverkauf),
Berater-Tipps (Ruecklagen), Sommer-Trend-Mechanik (Serfaus-Effekt) und
Wissens-Bausteine mit echten DACH-Tourismusdaten (QUELLEN.md).

Plattform: PHP-Wrapper mit base-Tag + Session-Mode, Modul-Detailseite,
module_info (beta) + Glossar (14 Begriffe inkl. Leichter Sprache + Quellen)
+ Lehrplan-Anker AT/DE/CH an neuer Kompetenz tourismus-raumentwicklung.
Lehrer-Backend: Benchmark-Formel, Live-Cockpit-Spalten, needsHelp-Heuristik,
Modul-Highlights. Strategie-Testharness (tests/strategien.mjs) belegt:
Panzer-Rush wird liquidiert, Ruecklagen zahlen sich aus.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 02:45:08 +02:00
Adminator 1e51ef7def Nachtrag: alle bisher untracked Ordner + hängende Änderungen mit-committen
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/
- 12 code-workspace-Files
- STATUS-*.md
- viele M/D/R-Änderungen an bereits getrackten Files
- .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-08 02:27:02 +02:00
Adminator 027831a89c Lehrplan: Speicher-Snapshot — 5 Modul-Wrapper + Status
Vor Abschalten der Lehrplan-Instanz: 5 Modul-Detail-Wrapper, die
bisher untracked waren, werden gespeichert. Alle 3-Zeilen-Wrapper
auf den gemeinsamen Partial _partials/modul_detail.php:
- modul-busfahrt.php
- modul-energiemanager.php
- modul-eu-werkstatt.php
- modul-farmer.php
- modul-sonnensystem.php

_status.md mit vollem Crash-Recovery-Snapshot:
- 16 Module (11 aktiv, 4 geplant, 1 archiv)
- 14 Kompetenzen, 39 kompetenz_modules
- 144 Lehrplan-Anker (76 AT, 28 DE, 24 CH/LI)
- 130 Glossar-Begriffe (10 astronomie + 12 EU + 108 andere)
- Alle 11 aktiven Sims haben Lehrplan-Bezug
- Letzte 6 Commits dokumentiert

Inbox: keine offenen Nachrichten an lehrplan.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 13:23:40 +02:00
Adminator 33fb423967 Atlas: Live-View-Feature + Submit-Bug-Fixes + Admin-Styleguide
- Neuer API-Endpoint /api/live (heartbeat / spectator) + DB-Tabelle
  live_sessions + class_modules.paused-Spalte
- Plattform-Live-Client (assets/js/live-client.js): Heartbeat,
  Pause-Overlay, Spectator-Mode bei ?view=teacher
- ggs_inject_live() in _scripts.php als Helper, in alle 11 Sim-Wrapper
  integriert
- Lehrer-Cockpit: tabellarische Klassen-Live-Ansicht pro Sim,
  Pause-Toggle, blinkender Tab-Indikator wenn aktive Sessions
- Submit-Bug erschlagen: progress.php hat jetzt submit_assessment-
  und reflection-Action; saves.php akzeptiert beide Key-Konventionen;
  alle Direkt-Pfad-API-Files mit require_once-Bootstrap
- Avatar-Default: zufaelliger DALL-E-Avatar fuer neue Schueler:innen
- Admin-Styleguide-Seite mit Bildstil, Farb-Tokens, Layout, iPad-Pattern
- Klima 2D + 3D: GGS_LIVE_STATE-Hook, Klima 2D zusaetzlich skipResume
  fuer Klassenaufgaben-Reset
- Test-Lehrer Jakob + 3 Schueler:innen lokal + auf Live angelegt
- Rundbriefe an alle Sim-Instanzen + Submit-Briefe an sonnensystem,
  busfahrt, energiemanager + Glossar-Anfrage zu Grundriess
- Status-Uebergabe in _inbox/zentrale/_status.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 01:20:53 +02:00
Adminator e354a30a44 Klima 3D: Live-State-Hook für Lehrer-Spectator
Atlas-Auftrag aus _inbox/klima/2026-05-05-0140 — analog zum 2D-Hook,
plus 3D-spezifische Felder.

- game-3d.html: window.GGS_LIVE_STATE liefert {variant:'3d', tick, year,
  level, phase, budget, population, co2, temp, floodedPct, seaLevelCm,
  speed, measures, levelWon, tourism, hasShield, hasBeach, placing}.
  Aufruf alle ~4s durch live-client.js, gepostet an /api/live.
- klima-3d.php: Live-Client-Script-Tag nachgezogen (war nur in
  klima-2d.php). Wird wie üblich vor </body> injiziert.

Heartbeat → DB live_sessions, Lehrer-Cockpit zeigt Karten an mit
Live-Kennzahlen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 03:42:58 +02:00
Adminator 2378075915 Lehrplan: Simulationen-Liste filtert auf aktive Sims
Auf der Lehrplan-Seite wurden in den "Simulationen zu diesem Bereich"-
Cards auch geplante Module (Energiemix, Erdbeben, Lieferketten) und
das archivierte Staustufen gelistet. Stimmt nicht mit den
existierenden Sims ueberein.

modStmt-SQL erweitert um Status-Filter:
  AND mi.status IN ('aktiv','beta')

Verifiziert: Lehrplan-Seite zeigt jetzt 11 Module statt 15.
Sichtbar bleiben alle aktiven Sims (Busfahrt, EU-Werkstatt,
Energiemanager, Fluss, Heli, Klima, Klima-3D, Landwirtschaft,
Logistik, Sonnensystem, Stadt). Geplant + archiv sind raus.

Anker-Anzeige bleibt unveraendert: alle 144 Lehrplan-Anker bleiben
sichtbar, weil sie an Kompetenzen haengen, nicht an Modulen.
Auch wenn ein Modul geplant/archiv ist, bleibt der didaktische
Lehrplan-Bezug seiner Kompetenz wertvoll.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 02:23:48 +02:00
Adminator 95e19818fd Lehrplan: Country-Default überall AT, übergreifend land-agnostisch
Auftrag von Thomas: Default-Filter überall auf Österreich, andere
Länder weiterhin wählbar.

Modul-Detailseiten (gemeinsamer Partial):
- Filter-Chip mit data-country=Country::current() bekommt Klasse
  active server-seitig (statt "🌐 Alle Länder")
- Country.php in Partial eingebunden
- JS-Filter-Logik überarbeitet: bei konkretem Land werden NUR
  anchor_type='fach' Anker streng nach Land gefiltert; übergreifende
  Themen und andere Fächer bleiben sichtbar (sind primär aus dem
  AT-Lehrplan abgeleitet, didaktisch land-agnostisch nutzbar)
- applyFilter() wird beim Page-Load mit dem aktiven Chip ausgeführt

Lehrplan.php:
- gleiche Filter-Logik gespiegelt (war vorher streng auch für
  übergreifend/andere_fach)
- Default war schon Country::current(), bleibt unverändert

Verifiziert: alle 10 aktiven modul-*.php-Seiten zeigen AT als
Default-active, Lehrplan-Seite ebenfalls.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 02:16:04 +02:00
Adminator f1b6fc0373 Lehrplan: Speicher-Snapshot — viewport-fit=cover + 100dvh + Status
- iPad-Verbesserungen vom Linter:
  meta viewport bekommt viewport-fit=cover (Safari Notch)
  body min-height nutzt 100dvh statt 100vh (dynamic viewport)
- _status.md: Save-Punkt fuer Crash-Recovery dokumentiert
- Inbox-Check: keine offenen Nachrichten an lehrplan

DB-Bilanz live: module_info 11, kompetenzen 11,
kompetenz_modules 21, lehrplan_anchors 108

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 07:57:56 +02:00
Adminator 8a8cbd1dfd Klima: Snapshot — pages/klima-2d.php nachgezogen + WIP-Cleanup
Sicherheits-Commit, damit der Stand vor möglichem Shutdown gesichert
ist. App/pages/klima-2d.php war noch untracked, jetzt im Repo.
Restliche modified-Markierungen waren reine Line-Ending-Normalisierung.
2026-04-27 07:24:41 +02:00
Adminator 23e1aee579 Lehrplan: Staustufen-Modul — neue Kompetenz + 8 AT-Anker
- Neue Kompetenz: energieversorgung-speicherung
  ("Energieversorgung und Energiespeicherung", category=klima,
   Alter 10–14, sort_order 110)
- 8 neue AT-Anker:
  - 3 Fach (GW Sek I 2.1 / 3.6+3.13 / 4.1+4.3+4.10) mit
    Original-Zitaten zu erneuerbaren Energieträgern, alpiner
    Wasserkraft als Wirtschaftsstandort und Mensch-Umwelt-Beziehung
  - 3 Übergreifende Themen: Umweltbildung (BNE), Wirtschaftsbildung
    (Wirkungsgrade, Effizienz), Informatische Bildung (Smart Grids,
    Lastausgleich-Algorithmen)
  - 2 Andere Fächer: Physik (Energieerhaltung, Höhenenergie,
    Wirkungsgrad), Mathematik (Bedarfskurven, Bilanzen, %-Füllstände)
- kompetenz_modules: staustufen primär (energie), 3 sekundär
  (klimawandel, systemisches-denken, karten-navigation-alpen);
  energiemix bekommt rückwirkend energieversorgung-speicherung primär
- modul-staustufen.php Wrapper hinzugefügt (3-Zeilen-Pattern)
- Inbox-Status: gelesen

DB-Bilanz: module_info 11, kompetenzen 11, kompetenz_modules 21,
lehrplan_anchors 108

Quelle: .humanInput/StaustufenSimulator/Pflichtenheft.txt (Pumpspeicher-
Kaskade, 5-Tage-Prognose, Sek I, 10–14 J)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 01:32:38 +02:00
Adminator 79ac9dad84 Atlas: Deploy-Buendel vor Staustufen-Sprint
- Logistik: Musik-Player Playlist-Modus (5 Gruppen, 20 Tracks)
- Heli: End-Screen auf .ggs-endscreen, Mission-Bilder, Voice-Lines, Briefing-Audio
- Logistik: Layout-Tausch Auftraege+Fahrzeuge links, Karte rechts
- Logistik: Tier-1-Staedte ausgebaut, Auto-Timescale-Badge
- Logistik: Roadnet/Railnet Dijkstra-Routing, Balance-Updates
- Atlas: 5 Atlas-Inbox-Nachrichten (Cards-Pattern, DALL-E-Key, Musik-Playlists)
- Status-Updates Heli + Logistik

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 01:05:13 +02:00
Adminator d37857f12a Lehrplan: ?module=X-Filter in lehrplan.php (Modul-Fokus-Banner)
- lehrplan.php liest jetzt den Query-Parameter ?module=<id> und
  filtert die Kompetenz-Cards auf die dem Modul zugeordneten
  Eintraege (via kompetenz_modules)
- Modul-Fokus-Banner ueber dem Hero: Icon, Titel, "Zurueck zur
  Simulation"-Link, "Alle Module anzeigen"-Link
- Hero-Titel + Meta-Description + <title>-Tag spiegeln den Fokus
- Ungueltige Modul-Slugs fallen stillschweigend auf Full-View zurueck
- Alle bestehenden Filter (country, theme) wirken weiterhin
  gleichzeitig

Use-Case: Atlas' Template-Button 📚 Lehrplan in den Sim-Wrappern
zeigt aktuell auf /modul-<id>#lehrplan-bezug. Diese Seite dient als
Alternative/Fallback, falls jemand direkt auf lehrplan.php?module=X
landet.

Verifiziert:
- lehrplan?module=logistik      6 Kompetenzen (von 10)
- lehrplan?module=klima         1 Kompetenz
- lehrplan?module=fluss         2 Kompetenzen (Naturgefahren + Stadt)
- lehrplan?module=unknown       10 Kompetenzen (Full-View Fallback)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 09:26:03 +02:00