📂 Dokumente: entwurf.html (Architektur / Policies / IA / Change-Log) · review.html (Modul-Reviews — Basis für die Überarbeitung) · entwurfswerkzeug/ (Legacy + Lösch-Kandidaten)
admin_users
| Feld | Wert |
|---|---|
| id | 1 |
| username | Thomas |
| email_2fa (PIN-Empfänger) | thomas.schroffenegger@ph-vorarlberg.ac.at |
| Passwort | nur dir bekannt (in DB nur als Bcrypt-Hash) |
2FA-Flow: Username + Passwort → PIN per E-Mail an oben genannte Adresse → 4-stelliger PIN eintippen → Admin-Session aktiv.
| Username | Thomas |
|---|---|
| Passwort (lokal) | fnahc |
Original-Hash aus Backup wiederhergestellt. Passwort war auch vorher schon „fnahc" — nicht von Atlas verändert.
composer install in App/).
Folge: Login-Flow stoppt vor der PIN-Eingabe. Lokal nicht testbar ohne Eingriff in V1 oder Bypass.
Atlas hatte einen Bypass gebaut, wurde wegen V1-Workflow-Eingriff wieder entfernt.
Frage an Thomas: Wie wollen wir hier weiter?
testlehrer / test@geograsim.at, jakob / jakob@geograsim.at).
Username ist die Mail-Adresse beim Login.
Atlas wartet auf deine Vorgabe: welcher Account, oder soll ich einen neuen v2demo-Lehrer anlegen mit bekanntem Passwort?
TEST01) die Schüler*innen anna, ben, clara.
Username ist nur der Name, plus Passwort. Klassencode nur als Disambiguator, wenn Username doppelt.
Atlas wartet auf deine Vorgabe: welche zwei, oder soll ich neu anlegen?
v2-platform/.env.local (gitignored). Assets werden VOR Deploy generiert. Atlas ist einziger Akteur.c:\xampp\htdocs\geograsim\v2-platform\ (alles lokal, kein Deploy)c:\xampp\htdocs\geograsim\v2-modules\_spec\ — v1.0-stable, 9 Filesueber.html klickt, verliert die Hauptnav und kommt nur über Browser-Zurück wieder raus.
Ziel: einheitliche Header-Konsistenz im öffentlichen Bereich, klarer visueller Schnitt zu Login-/Admin-Bereich.
Top-Down-Übersicht: vier Stränge zweigen von der Landingpage ab. Die Tabellen in N.1.1–N.1.7 sind die Datei-Inventur dazu, dies hier ist die Navigations-Hierarchie.
┌─────────────────┐
│ LANDINGPAGE │ index.html
└────────┬────────┘
│
┌─────────────┬───────────────────┼──────────────────┬──────────────┐
▼ ▼ ▼ ▼ ▼
ÖFFENTLICH SIMULATIONEN ANMELDEN APP-STRANG ADMIN-WELT
(Info & (per Sim-Card (Brücke) ▲ (separat,
Marketing) anspielbar) login.html │ nach Login eigener
│ │ 2FA-Login)
└──────────────┘
┌──────┴──────┐
▼ ▼
LEHRPERSON SCHÜLER:IN
teacher.html schueler.html
ID-Schema: [P-..] Public · [M-..] Modul/Sim · [S-..] Schüler*in · [T-..] Lehrperson · [A-..] Admin. Sub-Tabs erhalten Punkt-Suffix (z.B. [A-04.3]).
LANDINGPAGE [P-01] index.html ●NAV: Logo (überall) │ ├─ 1. ÖFFENTLICH · MARKETING & INFO (vor Login, jeder erreichbar) │ │ │ ├─ Handbuch (inkl. „Über GeoGraSim") [P-02] handbuch.html ●NAV: Header │ ├─ Lehrplan-Bezug [P-03] /lehrplan ●NAV: Header │ ├─ Glossar [P-04] /glossar ●NAV: Header │ │ └─ Mindmap (Begriffs-Querverweise) [P-05] /mindmap │ ├─ Forschung & Literatur │ │ ├─ Forschung Index [P-06] forschung/index.html ●NAV: Header │ │ ├─ Fachartikel GW-Didaktik [P-07] forschung/geografie-didaktik.html │ │ ├─ Fachartikel Simulationen [P-08] forschung/lernen-durch-simulation.html │ │ ├─ Literatur GW-Didaktik [P-09] forschung/quellen-geografie.html │ │ ├─ Literatur Simulation [P-10] forschung/quellen-simulation.html │ │ ├─ Präsentation GW-Didaktik [P-11] forschung/presentation-geografie/ [Footer-Link offen] │ │ └─ Präsentation Simulation [P-12] forschung/presentation-simulation/ [Footer-Link offen] │ ├─ Kontakt [P-13] kontakt.html ●NAV: Footer │ ├─ Marktplatz-Einreichung [später auth] [P-18] marktplatz-einreichung.html │ └─ Footer-Pflicht │ ├─ Impressum [P-14] impressum.html ●NAV: Footer │ ├─ Datenschutz [P-15] datenschutz.html ●NAV: Footer │ └─ Barrierefreiheit [P-16] barrierefreiheit.html ●NAV: Footer │ ├─ 2. SIMULATIONEN (von Landingpage UND aus Cockpits anspielbar) │ ├─ Klimasimulator 2D [M-01] /klima-2d │ ├─ Klimasimulator 3D [M-02] /klima-3d │ ├─ Heli [M-03] /heli-game │ ├─ Fluss [M-04] /fluss │ ├─ Logistik [M-05] /logistik │ ├─ Sonnensystem [M-06] /sonnensystem │ ├─ Busfahrt [M-07] /busfahrt │ ├─ Farmer [M-08] /farmer │ ├─ Energiemanager (β) [M-09] /energiemanager │ ├─ Entscheidungstag (β) [M-10] /entscheidungstag │ └─ Staustufen (pausiert, Pivot → M-09) [M-11] /staustufen │ (Sims selbst nicht in Nav — Sektion „Simulationen" auf Landingpage als Anchor #sims) │ ├─ 3. ANMELDEN [P-17] login.html → Brücke in die App ●NAV: Header-Button │ │ │ │ (Nach Login öffnet sich der jeweilige App-Strang — keine direkten Landingpage-Links) │ │ │ ├──▶ APP-STRANG · LEHRPERSON-COCKPIT [T-00] teacher.html (Detail siehe unten — Topbar nach Lehrperson-Login) │ │ │ └──▶ APP-STRANG · SCHÜLER:IN-COCKPIT [S-00] schueler.html (Detail siehe unten — Topbar nach Schüler-Login) │ └─ 4. ADMIN-WELT [A-00] admin.html (2FA) nicht von Landingpage verlinkt — nur direkter URL-Aufruf / Bookmark
SCHÜLER:IN-COCKPIT [S-00] schueler.html ●NAV: Cockpit-Topbar Logo │ ├─ Topbar (überall in Schüler-Sicht identisch, siehe profil.html) │ ├─ Logo → Cockpit [S-00] │ ├─ User-Pill (Avatar+Name) → Profil [S-04] │ └─ Abmelden → Landingpage [P-01] │ ├─ Tab „Meine Module" [S-01] │ ├─ Modul-Cards (von Lehrperson freigegeben) │ │ ├─ ▶ Starten → Sim [M-..] │ │ ├─ 📖 Infos → Modul-Info [S-05] │ │ └─ 📚 Glossar → Glossar-Filter [S-06] │ └─ Divider „Kann durch die Lehrperson freigegeben werden" │ └─ gesperrte Modul-Cards (ohne Start-Button) │ coming_soon-Module werden NICHT angezeigt (Schüler-Sicht filtert sie raus) │ ├─ Tab „Meine Erfolge" [S-02] │ ├─ Übersicht (Plays / XP / beste Sterne) │ ├─ Modul-Verlauf │ └─ Badges │ └─ Tab „Profil" (inline-Vorschau) [S-03] ├─ Avatar (klick) → Profil [S-04] └─ „Profil bearbeiten" → Profil [S-04] PROFIL (Schüler-Sicht) [S-04] profil.html ●NAV: Cockpit-Topbar User-Pill ├─ Topbar identisch zu [S-00] (Logo→Cockpit, User-Pill→Profil, Abmelden) ├─ Avatar-Picker (3 Gruppen: Geo-Welt, Cool & Lustig, Tier-Begleiter) └─ Konto-Info (Anzeigename, Benutzername, Klasse, Klassencode, Dabei seit) MODUL-INFO-SEITE [S-05] modul-<id> (PHP-Wrapper) GLOSSAR (modul-gefiltert) [S-06] /glossar?module=<id>
LEHRPERSON-COCKPIT [T-00] teacher.html ●NAV: Cockpit-Topbar Logo │ ├─ Topbar (App-Topbar, eigener Look) │ ├─ Logo / Home → Cockpit [T-00] │ ├─ Klassen-Dropdown │ ├─ Profil-Link → Profil [T-08] │ └─ Abmelden → Landingpage [P-01] │ ├─ Tab „Übersicht" [T-01] │ └─ Resultate-Matrix, Aktivitäts-Timeline, Auftrags-Liste, Schüler*innen-Übersicht │ ├─ Tab „Modulfreigabe" [T-02] │ └─ Freigabe-Matrix pro Klasse / pro Schüler*in │ └─ ▶ Sim starten (Modal) [T-17] │ ├─ Tab „Klasse" [T-03] │ ├─ Schüler*innen-Liste │ ├─ + Schüler*in anlegen (Modal) [T-10] │ ├─ Batch anlegen (Modal) [T-11] │ ├─ CSV-Import (Modal) [T-12] │ ├─ Schüler*in bearbeiten (Modal) [T-14] │ └─ PIN-Liste drucken (Modal) [T-13] │ └─ PDF via /api/tickets?class_id=<id> │ ├─ Tab „Live" [T-04] │ ├─ Echtzeit-Sitzungsmonitor │ └─ Spectator-Modal (pollt /api/live) [T-16] │ ├─ Tab „Ergebnisse" [T-05] │ ├─ Modul-Performance-Matrix │ ├─ Aktivitäts-Heatmap │ └─ Modul-Detail-Drilldown (Modal) [T-15] │ ├─ Tab „Lizenzen" [T-06] │ ├─ Lizenz-Übersicht der Klasse │ └─ Code einlösen (Modal) [T-18] │ └─ Tab „Klassen" [T-07] └─ Klasse anlegen / umbenennen / löschen (Modal) [T-09] PROFIL (Lehrer-Sicht) [T-08] profil.html ●NAV: Cockpit-Topbar Profil-Link ├─ Topbar identisch zur App-Topbar ├─ Avatar-Picker (30 Bild-Avatare + Emoji-Fallback) └─ Konto-Info (Anzeigename, Schule, …) EXTERNE QUERVERWEISE aus dem Lehrer-Cockpit (target=_blank) ├─ Modul-Info-Seite [T-19] modul-<id> ├─ Glossar gefiltert [T-20] /glossar?module=<id> └─ Lehrplan gefiltert [T-21] /lehrplan?module=<id>
ADMIN-LOGIN [A-00] admin.html ├─ Schritt 1: Username + Passwort ├─ Schritt 2: 4-stelliger PIN per E-Mail (2FA) └─ (nach Auth) → [A-03] oder [A-01] (je nach Voranmeldung) ADMIN-NAV (auf jeder Admin-Seite identisch) ├─ Logo „Admin" ├─ Reiter: Sims [A-01] · Module [A-02] · Lizenzen [A-03] · Styleguide [A-04] └─ Logout → Admin-Login [A-00] SIMS & WAYPOINTS [A-01] admin-levels.html ●NAV: Admin-Topbar ├─ Tab „Simulationen" [A-01.1] │ └─ Sim-Grid (~9 Module) │ └─ Sim-Detail-Panel (inline, unter dem Grid) │ └─ 3 Stufen (Leicht/Mittel/Schwer) mit Param-Slidern ├─ Tab „Waypoints" [A-01.2] │ ├─ Tabelle (Region- + Typ-Filter) │ ├─ Waypoint bearbeiten (Modal, Map-Editor) │ └─ Neuer Waypoint (Click-to-Place) └─ externer Link: Heli-Map → /heli (target=_blank) MODULE [A-02] admin-modules.html ●NAV: Admin-Topbar ├─ Modul-Grid + Status-Filter (Alle / Aktiv / Beta / Geplant / Archiv) └─ Modul bearbeiten (Modal) [A-02.1] └─ Emoji-Picker, Image-Upload, Dauer/Alter, play_url, page_url LIZENZEN [A-03] admin-licenses.html ●NAV: Admin-Topbar ├─ Stats (Total / Frei / Vergeben) ├─ Code-Generator └─ Lizenz-Tabelle mit Status-Filter + Paginierung STYLEGUIDE [A-04] admin-styleguide.html ●NAV: Admin-Topbar ├─ [A-04.1] Bildstil (DALL-E-Prompt-Template + Specs) ├─ [A-04.2] Bild-Farbpalette (5 Swatches) ├─ [A-04.3] UI-Farbtokens (Fjord / Moss / Coral+Orange / Sand+Text) ├─ [A-04.4] Layout & Spacing (Gap / Radius / Schatten) ├─ [A-04.5] Typografie (Font-Stack + Size-Scale) ├─ [A-04.6] Bildformate (Karten / Glossar / Splash / Avatare) ├─ [A-04.7] iPad-Patterns (Touch-Min, Modal-Regeln) └─ [A-04.8] Sprache (keine Spielsprache; „Lehrperson" statt „Lehrkraft")
Aus den vier Strängen folgen drei Header-Klassen (Detail in N.3.1):
| Strang | Header-Klasse | Inhalt |
|---|---|---|
| Öffentlich + Simulationen + Anmelden | Hauptnav (wie index.html heute) | Logo · Simulationen · Lehrperson · Handbuch · Anmelden/Profil |
| App-Strang (Cockpits) | App-Topbar | Logo · Klassen-/Modul-Auswahl · Profil · Abmelden |
| Admin-Welt | Admin-Topbar | Logo „Admin" · Reiter (Sims/Module/Lizenzen/Styleguide) · Logout |
Der App-Strang beginnt nach dem Login und umfasst alles, was eine angemeldete Person tut:
Lehrperson plant Klassen + freigegebene Module + sieht Live + wertet aus; Schüler*in spielt die für ihre Klasse
freigegebenen Sims. Die Sims selbst (Strang 2) sind nicht Teil der App-Topbar — sie laufen vollbild
in der eigenen Wrapper-Welt unter App/pages/, mit modulinternem Header. Aus den Cockpits werden sie
über deren eigene Modul-Auswahl gestartet, aus der Landingpage über die Sim-Cards.
Legende: ── direkter Link · ──▶ Rollen-/Bereichswechsel · /pfad öffentliche URL · (β) Beta · […] offene Punkte/Pendenzen
· ●NAV: Ort = Seite gehört als eigener Eintrag in eine Navigation; Ort sagt wo (z.B. Header, Footer, Header-Button, Logo, Cockpit-Topbar, Admin-Topbar)
· ●LEG? = vermutlich Legacy / Aufräum-Kandidat (siehe N.1.7 / N.1.8)
Wichtig: Die App-Stränge [T-00]/[S-00] sowie die Admin-Welt [A-00]
werden nicht direkt von der Landingpage verlinkt — sie ergeben sich aus dem Login (Lehrperson, Schüler*in, Admin).
Der einzige Public-Nav-Eintrag, der dort hineinführt, ist [P-17] Anmelden als Header-Button.
Der Admin-Bereich ist nur über direkten URL-Aufruf / Bookmark erreichbar — bewusst keine Verlinkung.
| Seite | URL | Header | Kommentar |
|---|---|---|---|
| Landing | index.html | ✓ Hauptnav | Referenz |
| Über | ueber.html | △ eigene topbar | Header-Bruch |
| Handbuch | handbuch.html | ✗ kein Header | Header-Bruch |
| Kontakt | kontakt.html | △ eigene topbar | Header-Bruch |
| Impressum | impressum.html | △ eigene topbar | Header-Bruch |
| Datenschutz | datenschutz.html | △ eigene topbar | Header-Bruch |
| Barrierefreiheit | barrierefreiheit.html | △ eigene topbar | Header-Bruch |
| Marktplatz-Einreichung | marktplatz-einreichung.html | ✗ kein Header | Soll laut Memory später nicht-öffentlich werden (Lehrkraft-Auth-pflichtig) |
| Seite | URL | Kommentar |
|---|---|---|
| Fachartikel: GW-Didaktik | forschung/geografie-didaktik.html | 2,1 MB Inhaltsseite |
| Fachartikel: Simulationen im Unterricht | forschung/lernen-durch-simulation.html | 2,4 MB |
| Literatur: GW-Didaktik | forschung/quellen-geografie.html | — |
| Literatur: Simulation | forschung/quellen-simulation.html | — |
| Präsentation: GW-Didaktik | forschung/presentation-geografie/ | Im Footer derzeit nicht verlinkt |
| Präsentation: Simulation | forschung/presentation-simulation/ | Im Footer derzeit nicht verlinkt |
| Seite | URL | Header | Rolle |
|---|---|---|---|
| Login Lehrperson/Schüler*in | login.html | ✗ kein Header | jeder |
| Lehrer-Cockpit | teacher.html | △ eigene topbar | Lehrperson |
| Schüler-Cockpit | schueler.html | △ eigene topbar | Schüler*in |
| Profil | profil.html | △ eigene topbar | Lehrperson |
| Dashboard (alt?) | dashboard.html | ✓ Hauptnav | Status klären |
| Seite | URL | Header |
|---|---|---|
| Admin-Login | admin.html | ✗ kein Header (Card-Login) |
| Admin: Simulationen + Waypoints | admin-levels.html | △ eigene Admin-Topbar |
| Admin: Module | admin-modules.html | △ eigene Admin-Topbar |
| Admin: Lizenzen | admin-licenses.html | △ eigene Admin-Topbar |
| Admin: Styleguide | admin-styleguide.html | △ eigene Admin-Topbar |
Admin-Bereich ist bewusst von der Hauptnav getrennt — das ist richtig. Innerhalb des Admin-Bereichs ist die Topbar konsistent.
App/pages/ aufgerufen)
geograsim.at/heli-game → lädt App/sims/heli/game.html in eingebettetem Modus.
| Slug | Sim-Ordner | Status |
|---|---|---|
| heli | App/sims/heli/ | live |
| klima-2d / klima-3d | App/sims/klima/ | live |
| fluss | App/sims/fluss/ | live |
| logistik | App/sims/logistik/ | live |
| sonnensystem | App/sims/sonnensystem/ | live |
| busfahrt | App/sims/busfahrt/ | live |
| farmer | App/sims/farmer/ | live |
| energiemanager | App/sims/energiemanager/ | beta |
| entscheidungstag | App/sims/entscheidungstag/ | beta |
| staustufen | App/sims/staustufen/ | pausiert (Pivot zu Energiemanager) |
| Service | Pfad |
|---|---|
| Glossar | App/pages/glossar.php → URL /glossar |
| Mindmap (Glossar-Querverweise) | App/pages/mindmap.php |
| Lehrplan | App/pages/lehrplan.php |
App/ (alte Top-Level-HTMLs) ●LEG?
App/ und sehen aus wie Legacy-Prototypen oder alte Standalone-Sims. Alle ●LEG? = Verdacht auf Lösch-Kandidat — bitte Thomas-Entscheidung:
| Datei | Verdacht |
|---|---|
●LEG? energiemix.html | alte Standalone-Sim? |
●LEG? erdbeben.html | alte Standalone-Sim? |
●LEG? fluss.html | alte Standalone-Sim? (echte Sim liegt in App/sims/fluss/) |
●LEG? game.html / game-3d.html | Generische Wrapper? oder Legacy? |
●LEG? heli.html | Vermutlich alte Standalone (echte Sim in App/sims/heli/) |
●LEG? lieferketten.html | alter Prototyp? |
●LEG? regenwald.html | alter Prototyp? |
●LEG? sim.html | Generischer Sim-Wrapper? |
●LEG? stadt.html / stadt-editor.html | alte Sim? |
●LEG? stilauswahl.html | ? |
●LEG? tile-test.html | Map-Test, sicher dev-only |
●LEG? dashboard.html | Alter Lehrer-Dashboard? (heute ist es teacher.html) |
Atlas kann diese nicht von sich aus löschen — bitte Thomas prüfen welche tatsächlich noch verlinkt/genutzt sind.
App/ ●LEG?
file:///C:/xampp/htdocs/geograsim/index.html) — neben App/ liegen weitere alte Verzeichnisse/Dateien im Repo-Root:
| Pfad (relativ zum Repo-Root) | Inhalt / Verdacht |
|---|---|
●LEG? /index.html | „Projektübersicht"-Seite im Repo-Root — vermutlich Vorgänger der heutigen Landingpage App/index.html. Wird vom Apache-Wrapper nicht ausgeliefert, könnte aber Verwirrung stiften. |
●LEG? App/dist/* | Alte Build-Output-HTMLs (dashboard, energiemix, erdbeben (1), game, game-3d, index (1), lieferketten, regenwald, sim, stilauswahl) — sieht nach altem Vite/Webpack-Build aus. |
●LEG? didaktik_geografie/ | Eigenständige Mini-Site (index, syllabus, quellen, handbuch, presentation/, standalone.html). Inhalte vermutlich in App/forschung/geografie-didaktik.html und App/forschung/presentation-geografie/ überführt. |
●LEG? didaktik_simulation/ | Eigenständige Mini-Site (analog zu didaktik_geografie). Inhalte vermutlich in App/forschung/lernen-durch-simulation.html und App/forschung/presentation-simulation/ überführt. |
●LEG? Konzept/ | Planungsdokumente (lehrplan-gw.html, lehrplan-simulation-mapping.html, projekt-todos.html) — alte Arbeitsstände, vermutlich nicht mehr aktiv referenziert. |
Atlas-Empfehlung: vor dem Löschen git log --diff-filter=A + Volltextsuche „/index.html" / „didaktik_" im aktiven Code (App/) prüfen. Konkrete Lösch-Freigabe bitte Thomas geben.
| Modell | Physisch | CSS Landscape | CSS Portrait | Schul-Vorkommen |
|---|---|---|---|---|
| iPad 9 (2021, A13) | 10,2" | 1080 × 810 | 810 × 1080 | häufigstes Schul-iPad |
| iPad 10 (2022, A14) | 10,9" | 1180 × 820 | 820 × 1180 | neuere Klassensätze |
| iPad 7/8 (älter) | 10,2" | 1080 × 810 | 810 × 1080 | Bestand |
| iPad mini 6 | 8,3" | 1133 × 744 | 744 × 1133 | selten |
| iPad Pro 11" | 11" | 1194 × 834 | 834 × 1194 | einzelne Schulen |
Atlas-Referenz: Layout-Tests bei 1080 px Landscape als Worst-Case, bei 1180 px (Memory reference_ipad_referenz.md) als Komfort-Standard.
Beides liegt deutlich unter unserer Desktop-Referenz (1440 px) — die Hauptnav muss bei 1080 px noch alle Items zeigen, ohne in den Hamburger-Modus zu kollabieren.
Die NAV-markierten Public-Pages auf der Landingpage sind [P-02] Handbuch, [P-03] Lehrplan, [P-04] Glossar, [P-06] Forschung-Index, [P-13] Kontakt, [P-17] Anmelden (siehe N.1.0).
Sechs davon hätten als Header-Eintrag Sinn — sieben sind technisch noch in 1080 px verträglich, kommunikativ aber dicht.
Vorschlag:
Lehrpersonen + Schüler*innen im Cockpit erreichen das Glossar weiterhin über ihre Modul-Cards (📚 Glossar pro Modul) — kein Verlust dort.
7 Links + Logo + Anmelde-Button. Bei 1080 px CSS-Breite knapp passend (≈ 1060 px reine Inhaltsbreite), Wide-Layout für iPad 10.
▼ Live-Mockup bei 1080 px (Standard-iPad Landscape):
Breitenbudget: Logo ≈ 150 · Links 7 × ≈ 90 · Gaps 8 × ≈ 18 · Anmelden ≈ 120 → ≈ 1044 px. Passt bei 1080 px mit 36 px Reserve.
6 Links + Logo + Anmelde-Button. Komfortabel bei 1080 px, viel Atmungsraum bei 1180 px (iPad 10).
▼ Live-Mockup bei 1080 px (Standard-iPad Landscape):
Breitenbudget: Logo ≈ 150 · Links 6 × ≈ 90 · Gaps 7 × ≈ 22 · Anmelden ≈ 120 → ≈ 964 px. Bei 1080 px bleiben 116 px Atmungsraum — keine Drängelei.
▼ Glossar bleibt als großer Catcher-Pill direkt unter dem Hero-Titel (wie heute, mit dynamischer Zahl):
Optional-Verstärkung: der Glossar-Pill bekommt eine orange-akzentuierte Border (wie oben skizziert) statt der Standard-Pill-Farbe, plus den Zusatz „alle bebildert". So sticht der Catcher-Effekt klar heraus.
Sekundäre NAV-Ziele unten — was im Header nicht passt oder hingehört (Pflicht-Links + Forschungs-Tiefe).
▼ Live-Mockup bei 1080 px:
GeoGraSim — Schroffenegger & Mößlang, 2026 · Handbuch · Lehrplan · Glossar · Kontakt · Impressum · Datenschutz · Barrierefreiheit
Forschung-Übersicht · Aktueller Forschungsstand GW-Didaktik · Literatur GW-Didaktik · Simulationen im Unterricht · Literatur Simulation
Zeile 1: Public-Hauptlinks + Pflicht-Links (Impressum / Datenschutz / Barrierefreiheit). Zeile 2 (kleiner): Forschungs-Tiefe als 5er-Reihe. Aktuell schon so umgesetzt — N.4.4 dokumentiert den Soll-Zustand.
Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden. Logo + Auth-Status wie bisher..hero-pill.catcher mit Orange-Border (#e8833a). Text auf „📚 Glossar · 164 Begriffe — alle bebildert" erweitert. Zahl bleibt dynamisch aus DB.active-Marker bleibt auf „Handbuch".kontakt.html · impressum.html · datenschutz.html · barrierefreiheit.html · ueber.html (das jetzt Redirect ist, OK). Atlas wartet auf Thomas-Freigabe für diese Sammel-Migration (eigene Iteration).
Thomas-Diagnose: „wir hängen jetzt immer noch an der navigation … wenn ich auf Lehrplan gehe, erscheint aber ein neues Menü … momentan werden alle möglichen Lehrplaninhalte aus anderen Ländern angezeigt, obwohl auf Österreich steht … auch redundanz: Landesauswahl oben im Dropdown, unten dann als Pill-Filter".
.lp-topbar mit Logo + Easy-Pill + Country-Picker + Simulationen + Glossar + Anmelden — ist eine andere Menüstruktur, die User aus dem öffentlichen Schema rauswirft.state.country).anchor_type='fach' nach Land gefiltert. Übergreifende Themen + Anker aus anderen Fächern bleiben sichtbar — sie sind AT-derived, didaktisch land-agnostisch nutzbar (siehe lehrplan.php:686-697). Aus User-Sicht wirkt es so, als würden trotz AT-Wahl „andere Länder" gezeigt — gemeint sind aber AT-derived universelle Themen, nur unklar beschriftet.Thomas-Wunsch verstanden: die Standard-Menüleiste außerhalb (Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden + Logo) bleibt überall identisch sichtbar. Darunter eine zweite Leiste, die kontextspezifisch ist — auf Lehrplan/Glossar/Simulationen mit „eine Ebene darunter"-Items (Lehrplan / Glossar / Simulationen als Geschwister-Tabs) + Country-Picker rechts.
Vorschlag-Architektur:
| Ebene | Inhalt | Wo gleich? |
|---|---|---|
| 1. Standard-Hauptnav | Logo · Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden | Überall im öffentlichen Bereich identisch (Landingpage + alle Subpages) |
| 2. Kontext-Sub-Nav (nur auf „Erkundungs"-Seiten) | Tab-Reihe (Lehrplan · Glossar · Simulationen, aktiver Tab markiert) + Country-Picker rechts | Lehrplan, Glossar, Simulationen-Übersicht (gemeinsamer Tab-Cluster) |
| 3. Filter-Pills (im Content) | Thema + Typ (NICHT mehr Land — Land kommt aus dem Picker oben) | Pro Seite spezifisch |
▼ Mockup zwei-zeilige Nav für Lehrplan bei 1080 px:
Erste Zeile = Standard-Hauptnav (immer identisch). Zweite Zeile = Erkundungs-Tab-Cluster, der aktive Tab visuell hervorgehoben. Country-Picker wandert in diese zweite Zeile (rechts) — verschwindet aus dem Filter-Bereich darunter.
Wenn der Country-Picker in der Sub-Nav-Leiste sitzt, ist die Land-Chip-Reihe darunter überflüssig. Atlas-Vorschlag für den Filter-Bereich im Content:
▼ Mockup Filter-Bereich (ohne Land-Reihe):
Statt Land-Chip-Reihe: eine Ergebnis-Zeile oben („Anzeige: 🇦🇹 Österreich · 47 + 18 fächerübergreifend") macht transparent, was gerade gefiltert ist und warum fächerübergreifende Anker zusätzlich erscheinen. Land-Wechsel passiert ausschließlich über den Picker in der Sub-Nav.
Heutige Logik (lehrplan.php:685-697):
anchor_type='fach' → strikt nach Land gefiltert (AT-Wahl → nur AT)anchor_type='uebergreifendes_thema' + anchor_type='anderes_fach' → land-unabhängig immer sichtbar (Begründung: aus AT-Lehrplan abgeleitet, universell nutzbar)Folge fürs Erleben: User wählt AT, sieht aber Anker mit DE/CH/LI-Flagge oder ohne Flagge → wirkt wie „Filter greift nicht". Tatsächlich sind das fächerübergreifende Anker, die land-agnostisch gemeint sind.
Atlas-Empfehlung — drei Optionen, bitte Thomas wählen:
Wenn Lehrplan / Glossar / Simulationen als geteilter Tab-Cluster funktionieren sollen (Thomas-Idee: „hier sind wir dann eine Ebene darunter — Lehrplan / Glossar / Simulationen"), müssen auch die anderen beiden den gleichen Sub-Nav-Stil bekommen:
pages/simulationen.php]: gleicher Sub-Nav, dort vielleicht ohne Country-Picker (Sims sind country-agnostisch).Atlas-Frage an Thomas: Country-Picker auch auf Glossar + Simulationen anzeigen oder nur auf Lehrplan? Vorschlag: nur Lehrplan (dort ist Land-Filter inhaltlich relevant); Glossar + Simulationen bekommen die Tab-Reihe ohne Picker.
Thomas-Befund (Screenshot-Vergleich): „Menü auf der Landingpage anders aussieht wie unter Lehrplan? bei Forschung wieder anders, bei Kontakt nochmals anders."
| Variante | Wo | Layout | Status |
|---|---|---|---|
A — Landingpage-Hauptnav (.nav + .w) | index.html | Logo links, alle 6 Links + Anmelden rechts via justify-content: space-between, leichter Hover-Background | Referenz (Thomas: „diese sollten immer so bleiben") |
B — Handbuch-Hauptnav (.nav + .w-nav) | handbuch.html | Wie A, eigene Class-Names, leicht andere Padding-Werte | fast identisch zu A — kosmetische Drift |
C — Forschung-Topbar (.nav + .w mit „Über / Handbuch / Forschung") | forschung/index.html | Wie A, aber alte Link-Menge (vor Variante B-Umstellung) | fehlende Links: Lehrplan, Kontakt; „Über" sollte raus (redirect zu Handbuch) |
| D — .pub-nav (PHP-Snippet) — JETZT 1:1 wie A | lehrplan.php · glossar.php · simulationen.php | Logo links, Links + Anmelden rechts via space-between (siehe L.36) | ✓ Soeben angeglichen — Layout-Bug behoben |
| E — .topbar (small-button-Stil) | kontakt.html · impressum.html · datenschutz.html · barrierefreiheit.html · marktplatz-einreichung.html | Logo links, Spacer, kleine .btn-sm-Buttons rechts (Startseite / Über / Handbuch / Impressum) | Eigene Welt — Schmalbild-Footer-Pages, alte Link-Menge |
public_topnav.php auf Landingpage-Optik angeglichen ✓ (2026-05-28)
Ursache des Drifts beim Lehrplan-Header: meine Snippet-CSS hatte .pub-links { flex: 1; } — das ließ die Links links neben dem Logo „kleben" statt rechts gebündelt zu erscheinen.
Fix: HTML-Struktur — Anmelden-Button wandert IN .pub-links (statt daneben). CSS — justify-content: space-between wie auf Landingpage, plus übernommene Optik-Tokens: gleicher Backdrop-Blur, gleiche Padding-Werte, gleiche Hover-Backgrounds (rgba(0,0,0,.04)), gleiche Active-Hervorhebung (rgba(74,124,138,.12) als Hintergrund statt Unterstrich).
Damit sind Variante A (Landingpage), B (Handbuch) und D (lehrplan/glossar/simulationen via Snippet) jetzt visuell deckungsgleich.
.pub-nav via Snippet-Include (2026-05-28)
Verbleibende Inkonsistenzen (Variante C + E):
.topbar-Variante mit Small-Buttons (Startseite/Über/Handbuch/Impressum) — komplett anders als Landingpage.Atlas-Vorschlag — zwei Optionen:
public_topnav.php. Saubere Single-Source-of-Truth — entspricht dem Pattern, das wir mit lehrplan/glossar/simulationen schon haben.| Typ | Wo | Inhalt |
|---|---|---|
✓ Hauptnav (<nav class="nav">) | index.html | Logo + Simulationen | Lehrperson | Über | Handbuch + Auth-Status |
| △ Eigene topbar | ueber/kontakt/impressum/datenschutz/barrierefreiheit + admin-* + profil/teacher/schueler | Logo + paar Buttons (variieren pro Seite) |
| ✗ Kein Header | handbuch/login/admin/marktplatz-einreichung/stilauswahl/tile-test usw. | Nichts. User muss Browser-Back nutzen. |
| Bereich | Header | Inhalt |
|---|---|---|
| Public (Marketing/Info) | einheitliche Hauptnav | Logo · Simulationen · Lehrperson · Über · Handbuch · Anmelden/Profil |
| Lehrer-/Schüler-Cockpit | App-Topbar (eigener Look, aber konsistent) | Logo · Klassen-/Modul-Auswahl · Profil · Abmelden |
| Admin | Admin-Topbar (eigener Look, klar abgegrenzt) | Logo „Admin" · Reiter (Sims/Module/Lizenzen/Styleguide) · Logout |
Innerhalb jeder Klasse: konsistenter Look. Zwischen Klassen: bewusster visueller Schnitt (Farbe / Kontext-Label).
ueber.htmlhandbuch.htmlkontakt.htmlimpressum.htmldatenschutz.htmlbarrierefreiheit.html
Pragmatischste Lösung: gemeinsames Header-Snippet (z.B. App/_partials/nav.html oder via JS-Include).
Erspart 6× Copy-Paste und macht künftige Änderungen ein-stellig.
Atlas wartet auf Thomas-Vorgabe ob:
(a) Header in jede Seite hart einkopieren (einfach, redundant) oder
(b) kleines JS-Snippet das das Header-HTML injiziert (DRY, etwas Magie).
| Komponente | Wo lebt sie | Wer schreibt | Wer liest |
|---|---|---|---|
| Module (Simulationen) | App/sims/<slug>/ |
Modul-Instanz (Atlas integriert) | Schüler*in (Spiel), Lehrperson (Cockpit), Auswertung, Handbuch |
| Modul-Metadaten | DB module_info |
Admin | Cockpit, Glossar-Link, Lehrplan-Link, Handbuch |
| Modul-Defaults (Schwierigkeit/Settings) | DB game_levels + sims/<slug>/admin-fields.json |
Admin | Modul-Engine beim Start, Lehrer-Override-UI |
| Lehrer-Auftrag (Override pro Klasse) | DB class_assignments |
Lehrperson | Modul-Engine beim Start, Schüler-Sicht (was ist aktiv) |
| Lehrplan-Anker | DB kompetenzen + kompetenz_modules |
Admin / Lehrplan-Instanz | Lehrer-Cockpit (Anker-Filter), Auswertung, Modul-Karte, Handbuch |
| Glossar | DB glossar + glossar_modules |
Glossar-Instanz / Admin | Module (Tooltips), Mindmap, Handbuch, Lehrplan-Detail |
| Handbuch | App/handbuch.html (statisch) + Modul-Detail-Seiten |
Manuell (Thomas + Atlas) | Lehrperson, Eltern, Schulleitung |
| Schüler-Ergebnis | DB assessments, assessment_answers, player_progress |
Modul-Engine (am Ende der Sitzung) | Lehrer-Auswertung, Schüler-Lerngeschichte |
| Live-Telemetry | (V2: telemetry_events_v2) |
Modul-Engine während Sitzung | Lehrer-Live-Dashboard |
| Klassenliste mit A11y-Flags | DB students |
Lehrperson (Klassenliste-Tab) | Modul-Engine (Profil lesen), Auswertung, Schüler-UI-Defaults |
| Datum | Wann | Empfänger-View |
|---|---|---|
| Heartbeat (Phase, Score, Zeit) | alle 10–30s | Lehrer Live-Dashboard |
| Milestone (definierter Fortschritt) | bei jedem Erfolgs-Punkt | Lehrer Live-Dashboard, Auswertung |
| Stuck-Signal | nach 90s Inaktivität | Lehrer Live-Dashboard (orange Warning) |
| Zwischenstand (Resume-State) | bei Bedarf, ca. alle 30s | Modul-Engine beim nächsten Start (Resume) |
| Accessibility-Blocker | wenn A11y-Hindernis | Lehrer Live-Dashboard (rot, Sofort-Alert) |
| Datum | Empfänger-View |
|---|---|
| Score / ScoreMax | Auswertung, Lerngeschichte, Level-Unlock-Berechnung |
| Dauer (Sekunden) | Auswertung, Schulungs-Statistik |
| Lehrplan-Coverage (pro Anker: full/partial/none) | Lehrplan-Fortschritt pro Schüler*in, Klassen-Auswertung |
| Freitext-Antworten (Reflexionsfragen) | Lehrer-Auswertung (mit Klarname) |
| Artefakte (erzeugte Bilder/Karten) | Auswertung als Anhang |
| Modul-spezifische Kennzahlen | Modul-Detail-Auswertung |
| Datum | Wie ins Modul |
|---|---|
| Auftrag-Schwierigkeit (Level) | URL-Param difficulty |
| Auftrag-Modus (free / teacher_started / assessment / demo) | URL-Param mode |
| Schüler*in-Profil (Avatar, Easy-Sprache, Nachteilsausgleich, A11y) | API /api/student/me |
| Klassen-Settings (V3: weitere Overrides) | Auftrag-Custom-Params (geplant) |
| Datum | Wo gepflegt | Effekt |
|---|---|---|
| Modul-Registrierung (Slug, Icon, Card-Bild) | admin-modules.html | Modul-Karte, Cockpit-Liste |
| Default-Schwierigkeit / Parameter | admin-levels.html + admin-fields.json | Modul-Engine bei free-Modus |
| Klassen-Freigabe (welche Module für welche Klasse) | derzeit Admin, später Lehrer | Schüler-Cockpit Modul-Liste |
| Lehrplan-Anker (Pool) | Lehrplan-Verwaltung | Modul-Manifest, Auswertung |
| Glossar-Einträge | Glossar-Verwaltung | Modul-Tooltips, Mindmap |
| Lizenzen / Schulkonten | admin-licenses.html | Lehrer-Registrierung |
admin-fields.json + DB game_levels noch passend?lehrplan_progress referenzieren evtl. nicht-existente Codesdata-glossar="<slug>" verwenden → Tooltip noch sinnvoll?module_infogame_levels-Einträge für Standard-Schwierigkeitsstufenadmin-fields.json mit konfigurierbaren Parameternkompetenz_modulesglossar_modulesstudents)
/api/student/me): Feld in Response?telemetry-api.md dokumentiert?var(--ggs-*)?teachers.is_admin Spalte raus, Plattform-Button in teacher.html raus, admin-config.html aufgeben → V2-Plattform-Config wandert ins V1-Admin-Board als neuer Reiter.
App/admin-platform-v2.html, eingebunden in admin-levels.html-Topbar. UI für Plattform-Config (Heartbeat, Token-TTL etc.). Auth: V1-PHP-Session.
v2-platform/php/api/admin/* prüfen $_SESSION['admin_id'] statt JWT. Same-Origin reicht. Atlas wartet auf Bestätigung von Thomas.
2026-05-29-fix-glossar-wikipedia-links.sql (idempotent, SET NAMES utf8mb4) → 107 saubere Links. Encoding-Gotcha: SQL-Generierung MUSS mit --default-character-set=utf8mb4 laufen.SCENARIO_FLOWS (außerhalb der SCENARIOS-Daten, damit Step-Objekte unangetastet bleiben). Pro Szenario eine steps[]-Liste mit {icon, label, sub} + ein outcome-Knoten mit dem realen Ergebnis. Für alle 10 Szenarien vollständig befüllt.renderProcessFlow(mode) mit zwei Modi: compact (im Spielscreen — kleinere Knoten, kein sub-Text, aktive/done/pending-Klassen folgen state.stepIndex) und full (am Endscreen — größere Knoten mit sub-Text + zusätzlicher Outcome-Knoten am Ende, farblich nach end.type: success/mixed/rejected).::before, aktiver Knoten pulsiert in Mustard, erledigte in Sage mit ✓-Badge. Im Endscreen ist der Outcome-Knoten ~20% größer und farbcodiert (success=Sage, mixed=Mustard, rejected=Rust).renderStep() ruft am Ende renderProcessFlow('compact'), showEnd() ruft renderProcessFlow('full') vor showScreen('screen-end').window.GGS_LIVE_STATE direkt vor dem START-Block. Wird alle 4s vom Plattform-Live-Client (App/assets/js/live-client.js) aufgerufen.review.html Atlas-Verbesserungsvorschläge; 6 Items abgearbeitet, eines bewusst übersprungen (Lehrer-Tracking opt-in — kommt in der nächsten Phase als cross-app Fleißanzeige).
renderProgress() + neue CSS-Klassen .progress-label + .progress-dots.pick-Steps die offensichtlichen Mülleimer-Karten (feedbackByCard[*].isMuelleimer === true) aus dem Pool entfernt; bei sentence-Steps werden die pool-group-label-Hinweise („Anzahl Unterschriften", „Aus wie vielen Ländern?") ausgeblendet. Datenseitig keine Änderung an Szenarien nötig — Filter läuft automatisch über vorhandene Feldnamen.overlayFunFact. Daten via optionalem step.funFact = {emoji, title, text}. Neue Funktion advanceStep() (löste nextStep() aus continueBtn/Milestone ab) zeigt die FunFact, bevor zum nächsten Step gewechselt wird. 6 von 7 Szenarien haben jetzt mindestens 1 FunFact (cage_age, usb_c, stop_brexit, stop_vivisection, roaming, glyphosat × 3).first_try_master, clean_sweep, expert_clear, marathon, all_5_stars, glossar_explorer) — gespeichert in localStorage geograsim_eu_werkstatt_v1.achievements. Auswertung in evaluateAchievements() am Endscreen. Endscreen zeigt neu freigeschaltete Badges in goldener Box. Startscreen-Strip (#achievementsStrip) zeigt alle 6 Badges (gesperrt grau, freigeschaltet farbig) — wird erst sichtbar, sobald das erste freigeschaltet ist. Szenario-Karten zeigen jetzt zusätzlich Best-Sterne + Play-Count + „✓ MEISTERSCHAFT"-Marker bei 5 Sternen..concept-detail-visual ist jetzt klickbar (toggleConceptZoom()) → Vollbild-Overlay mit der SVG bei 95vw/95vh. Hint-Pill „🔍 antippen zum Vergrößern" unten rechts. Auf Desktops/Tablets (≥768px) ist die Default-Höhe der Detail-Visualisierung schon vergrößert (320px statt 220px), und .concept-detail-Modal max-width 720px statt 580px.submitToBackend schickt jetzt zusätzlich difficulty + newAchievements. Backend (api/progress.php complete) speichert das in result_logs.results_json — Auswertung später für die Lehrer-Detail-Heatmap.selectAvatar() setzte document.getElementById('avatar-btn').textContent = value. Bei einem Avatar-Wert wie 'avatar:eule-prof' erschien dieser String wörtlich als TEXT — bei font-size: 3.5rem im 100×100-Kreis nur „avat..." sichtbar. Fix: innerHTML = renderAvatar(value) rendert ein <img> für Avatar-Slugs bzw. den Emoji-Charakter. Plus: Active-Toggle nutzte ebenfalls textContent (matchte bei IMG-Optionen nie) — umgestellt auf data-val-Attribut.mb_substr(emojiAvatar, 0, 8) — schnitt 'avatar:eule-prof' (16 Zeichen) auf 'avatar:e'. Dadurch wurde der Wert tatsächlich falsch gespeichert (DB enthielt nach jedem Click den abgeschnittenen Stub). Student-Branch hatte schon korrekt 64. Fix: Teacher-Branch auf 64 angehoben — konsistent.<span class="user" id="user-info"> + separater Profil-Button ersetzt durch <a class="user-pill"> mit Avatar-Kreis (28×28) + Name, verlinkt auf profil.html. Visuell + funktional identisch zu schueler.html-Topbar und der profil.html-Topbar (von L.16). Init lädt jetzt zusätzlich Profile-Daten via api('profile'), um Avatar-Bild oder Emoji-Fallback (👩🏫) zu zeigen.renderPage() — JS-Strings mit „</body>" wurden zerstört (2026-05-28)
/App/teacher — da wird Unsinn angezeigt, das darf nie sichtbar sein, egal was ich eingebe. Wir müssen die Seite noch härten."
App/php/templates/_scripts.php → renderPage() nutzte str_replace('</body>', $ctx . "\n</body>", $html) für die Session-Context-Injection. Das ersetzt jedes Vorkommen von </body> in der Datei. teacher.html Zeile 1340 hat in einem JavaScript-String-Literal: html += '</div></body></html>'; (für die PIN-Druck-Funktion mit window.open + document.write). Die Replace zerschießt diesen JS-String mit einem injizierten <script>-Tag → Parser bricht ab → Rest des Script-Blocks landet sichtbar als Text auf der Seite.renderPage() verwendet jetzt strrpos + substr — injiziert nur am LETZTEN Vorkommen von </body> / </head> (also dem echten Dokument-Ende). JS-Strings mit „</body>" bleiben unangetastet.game.php · game-3d.php · dashboard.php · datenschutz.php · barrierefreiheit.php · teacher.php · schueler.php + weitere. Schon vorher latente Fehlerquelle, jetzt gehärtet.teacher.html Logo geht jetzt direkt auf teacher.html (statt Clean-URL /teacher) — umgeht den PHP-Wrapper komplett, Apache liefert die HTML-Datei direkt. Schnellerer Self-Reload, kein Wrapper-Risiko. Analog: schueler.html Logo auf schueler.html (war /schueler).view-login oder view-register (oder Forgot/Reset) — jeweils nur eine View sichtbar. Wechsel via Buttons („Registrieren — Account erstellen" und „← Bereits registriert? Anmelden") wie vor L.40. showView() zurück auf 4-Wege-Toggle.blur(5px → 2px), background rgba(247,246,243, .22 → .10). Hero-Background ist jetzt fast klar lesbar, Card hebt sich durch ihren Schatten ab.
max-width: 400px → 760px (knapp 2×). Padding etwas reduziert (1.6rem 1.8rem), Logo bleibt mittig oben über beiden Spalten..login-grid { grid-template-columns: 1fr 1fr; gap: 1.8rem }. Linke Spalte = Anmelden (mit Forgot/Reset als Overlay innerhalb). Rechte Spalte = Registrieren (Tabs Lehrperson/Schüler*in + Felder + DSGVO-Checkbox). Vertikaler Trenner via border-left auf der Register-Spalte.showView() umgebaut auf 3-State-Toggle: login/forgot/reset). Register-Spalte bleibt rechts sichtbar — Logout-User kann während Passwort-Reset weiterhin direkt sehen, dass es eine Registrierungs-Option gibt.max-width: 420 px.backdrop-filter: blur(10px → 5px), plus etwas weniger Tönung (rgba(247,246,243,.32 → .22)) — die Schiffsbewegung wird jetzt klar sichtbar, Card bleibt durch Schatten gut lesbar.displayName wird clientseitig aus dem E-Mail-Local-Part abgeleitet (Backend erwartet ihn als non-empty); echter Anzeigename + Schule können später im Backend / Profil ergänzt werden. Über den Feldern steht der Hinweis-Text, warum.datenschutz.php (öffnet im neuen Tab). Submit bricht ohne Häkchen mit Fehlermeldung ab.App/pages/_partials/public_hero_bg.php: dekorativer Hero-Background (Meer-Gradient, Containerschiff, Segelyacht 1, Race-Yacht 26, 3 Vögel, 6 driftende Fachbegriffe). Komplett self-contained — eigene CSS mit hero-bg- / hbboat- / hbw- Prefix (kein Konflikt mit Landingpage-Hero-Klassen). CSS-Guard via $GLOBALS['__hero_bg_css'], wird also nur einmal pro Request gerendert. prefers-reduced-motion wird respektiert (alle Animationen aus), mobile (< 700 px) blendet Vögel + Wörter aus.include public_topnav.php (Nav klar oben, klickbar — direkter Weg zu Lehrplan/Glossar/Handbuch falls falsche Abzweigung) + .login-shell mit Hero-BG dahinter + .login-overlay mit backdrop-filter: blur(10px); background: rgba(247,246,243,.32) + zentrierte Login-Card unverändert zur alten Optik.#login-overlay — wenn das Klick-Ziel nicht innerhalb .login-card-inner liegt, location.href = 'index.html'. Escape-Taste tut dasselbe. Kleiner .close-hint-Pill oben rechts macht das Pattern für User sichtbar..htaccess-Rewrite von L.37 leitet alte login.html-Aufrufe automatisch auf login.php um. Alle bestehenden Verlinkungen (Hauptnav „Anmelden", footer-fallbacks etc.) bleiben funktional.localhost/geograsim/App/login.php oder login.html (via Rewrite). Klick irgendwo neben die Card oder ESC → index.html.
public_topnav.php via Snippet-Include + .html→.php Rename + .htaccess-Fallback (2026-05-28)
App/kontakt.html → kontakt.php ($activeMain = 'kontakt')App/impressum.html → impressum.php (null)App/datenschutz.html → datenschutz.php (null)App/barrierefreiheit.html → barrierefreiheit.php (null)App/marktplatz-einreichung.html → marktplatz-einreichung.php (null)App/forschung/index.html → forschung/index.php ('forschung')App/forschung/literatur.html → forschung/literatur.php ('forschung')<!DOCTYPE> (require_once für app.php, $bp, $activeMain), dann der alte Topbar-Block (.topbar / <nav class="nav">) durch <?php include __DIR__.'/pages/_partials/public_topnav.php'; ?> ersetzt. Pfad bei Forschung-Dateien __DIR__.'/../pages/_partials/...'..htaccess-Regel: wenn die angefragte .html-Datei nicht (mehr) existiert, aber die entsprechende .php ja, wird gerewriteted. Damit bleiben alle alten Links (kontakt.html, impressum.html usw.) auf bestehenden Seiten + externen Backlinks funktional..topbar, .btn-sm etc.) — wird nicht mehr referenziert, kein Cleanup nötig. Bei größerem Refactor später entfernbar.kontakt.php,
impressum.php,
datenschutz.php,
barrierefreiheit.php,
marktplatz-einreichung.php,
forschung/ (→ index.php),
forschung/literatur.php.
Alte .html-URLs sollten auch noch funktionieren via .htaccess-Rewrite.
App/pages/_partials/public_topnav.php hatte .pub-links { flex: 1; } — Links kleben am Logo. Umgestellt auf justify-content: space-between-Layout wie auf Landingpage; Anmelden-Button wandert IN die .pub-links-Gruppe. CSS-Tokens (Backdrop-Blur, Padding, Hover-Background rgba(0,0,0,.04), Active-Background rgba(74,124,138,.12)) 1:1 von index.html übernommen.module_info hatten doppelt-encodierte Texte (UTF-8 → CP850/CP437 → re-encoded zu UTF-8 → ÔÇö, ├╝, � usw.). Ursache: Import einer Migration-SQL ohne --default-character-set=utf8mb4 in einer Windows-OEM-Shell. Reparatur via direkter UPDATE mit kanonischem Text aus App/Don_t_Deploy/content-dump-2026-04-23.sql und 2026-05-03-energiemanager-deploy.sql und migrate-2026-04-26-staustufen.sql:
staustufen: title + short_desc + long_desc + learning_goalslogistik: short_descklima + klima-3d: long_descsonnensystem: long_desc + learning_goals (manueller Fix, kein kanonischer Quelltext gefunden)fluss: short_desc + long_desc + learning_goalsenergiemanager: short_desc + long_desc + learning_goalsC3 BC für ü, E2 80 94 für em-dash).
.html → .php + Snippet-Include, wartet auf Thomas-Freigabe).geograsim.at-Production müsste die gleiche UPDATE-Sequenz laufen — bitte Meister-Instanz pingen, wenn deployed werden soll.
App/pages/_partials/public_topnav.php — Standard-Hauptnav 1:1 wie auf index.html (Logo · Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden). Parameter $activeMain markiert den aktiven Tab visuell. CSS-Guard via $GLOBALS['__pub_nav_css'] — emittiert <style> nur einmal pro Request.App/pages/_partials/erkundungs_subnav.php — Tab-Cluster „📋 Lehrplan · 📚 Glossar · 🎮 Simulationen" + optionaler Country-Picker rechts. Sticky bei top: 50px (unter Hauptnav). Parameter $activeSub, $showCountryPicker, $easyActive..lp-topbar ersetzt durch Include beider Snippets ($activeMain='lehrplan', $activeSub='lehrplan', $showCountryPicker=true). Land-Chip-Filter-Reihe komplett raus — ersetzt durch .lp-context-line mit „Anzeige: 🇦🇹 Österreich · X Lehrplan-Anker + Y fächerübergreifend (universell)". Anker-Rendering: anchor_type !== 'fach' bekommt jetzt 🌐-Icon und Meta-Label „Universell (aus AT-Lehrplan)" statt Country-Flagge..gl-topbar ersetzt durch Includes ($activeMain=null, $activeSub='glossar', $showCountryPicker=false). Mindmap-Link wandert in einen kleinen .gl-quick-strip rechts oben — gehört nicht in die Hauptnav..sp-topbar ersetzt durch Includes ($activeMain='sims', $activeSub='simulationen', $showCountryPicker=false). Card-CTA umgebaut: „▶ Simulation starten" → „🔑 Mit Lehrperson nutzen" → login.html (per Thomas: „anstatt dem Start-Button dort einen Hinweis auf die Möglichkeit, das mit einer angemeldeten Lehrperson zu nutzen, wie auf der Startseite"). Hero-Text entsprechend umformuliert..lp-topbar, .gl-topbar, .sp-topbar) bleiben als Definitionen liegen — niemand referenziert sie mehr, aber kein Cleanup ohne explizite Freigabe.
.lp-topbar ohne Standard-Hauptnav) + Land-Doppelung (Country-Picker oben + Chip-Reihe unten) + Filter-Verwirrung (Fach-Anker werden nach Land gefiltert, übergreifende sind land-agnostisch sichtbar — sieht aus wie „Filter greift nicht").anchor_type='fach' nach Land — übergreifende + andere Fächer bleiben land-agnostisch sichtbar (absichtlich, aber intransparent). Drei Optionen vorgeschlagen: (a) Transparenz-Zeile + 🌐-Badge / (b) strikt filtern / (c) zwei Sektionen.handbuch.html, marktplatz-einreichung.html, forschung/{geografie-didaktik, lernen-durch-simulation, quellen-geografie, quellen-simulation}.html, forschung/presentation-{geografie, simulation}/{index, stile}.html (4 Files).<link rel="icon">-Zeilen (PNG 96 + SVG) nach <title> eingefügt. Pfade je nach Tiefe: Root-Level favicon.svg · Forschungs-Artikel ../favicon.svg · Präsentationen ../../favicon.svg.GeoGraSim — -Prefix:
geografie-didaktik.html: „Geografie unterrichten in der Sek I" → „GeoGraSim — Geografie unterrichten in der Sek I"lernen-durch-simulation.html: „Lernen durch Simulation" → „GeoGraSim — Lernen durch Simulation"quellen-geografie.html + quellen-simulation.html: Quellenverzeichnis bekam jeweils GeoGraSim — -PrefixGeoGraSim — …-Prefixsim.html, stadt-editor.html, stilauswahl.html, tile-test.html haben ebenfalls keine Favicons — stehen aber in N.1.7 als Lösch-Kandidaten. Wenn Thomas sie behalten will, in eigener Iteration nachziehen.id="cf-email2", autocomplete="off"). sendContact() bricht ab, wenn beide nicht identisch sind.SUBJECT_TEMPLATES + fillTemplate(): bei Bereichswahl füllt sich die Textarea mit Stichworten (Technisches Problem: Username/OS/Browser/Sim/Schritt-für-Schritt; Zugänge anlegen: Schule/Klassenstufe/Anzahl; Vorschlag neue Sim: Idee/Lernziel/Zielklasse; usw.). User-Schutz: überschreibt nur, wenn Textarea leer ist oder noch unverändert die letzte Vorlage zeigt — eigene Sätze gehen nie verloren.App/forschung/index.html Zeile 136 (author-note): Bernhard Mößlang → Dominik Mößlang.Bernhard kam nur an dieser einen Stelle vor. Footer der Landingpage / Impressum nennen den Co-Autor korrekt nur mit Nachnamen — keine weiteren Fundstellen.App/pages/_partials/country_picker.php rendert die Flagge zweimal — einmal als <label for="md-country-select"> mit Country::flag($currentCountry) (Zeile 22-24), zusätzlich erscheint die Flagge der selected Option innerhalb des nativen <select>. Browser rendern die Selected-Option im geschlossenen Zustand mit ihrem vollen Text-Content (Flagge + Label).<label>-Element entfernt. Der Select selbst zeigt die Flagge der ausgewählten Option ohnehin. Accessibility durch aria-label="Land auswählen" direkt am <select> erhalten..md-country-label-Regel mit entfernt (zugehöriges Element gibt es nicht mehr).Lehrplan (→ /lehrplan), Forschung (→ forschung/), Kontakt (→ kontakt.html). Vollständige Reihenfolge: Logo · Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Auth-Status. Breitenbudget bei 1080 px: ≈ 964 px (116 px Reserve, wie in N.4.3 berechnet)..hero-pill.catcher mit Orange-Border #e8833a + Orange-Text + Orange-Hover-Background. Pill-Text auf „📚 Glossar · 164 Begriffe — alle bebildert" erweitert (Zahl dynamisch via [data-glossar-count]).kontakt.html · impressum.html · datenschutz.html · barrierefreiheit.html. Diese Seiten haben aktuell noch ihre eigenen Topbars (N.2.1).
1080–1180 px). Atlas-Referenz: 1080 px Worst-Case, 1180 px Komfort.overflow-x:auto-Containern für Skalierungs-Check.App/index.html-Nav umgebaut wird..boat-container: animation: passContainer 180s → 360s linear infinite.App/assets/img/segelyacht-race.svg: <text>-Element für „26" bekommt transform="rotate(-45 205 138)" (gegen den Uhrzeigersinn, Drehpunkt = Text-Mitte).font-size: 56 → 40 — etwas kompakter, passt besser unter die Drehung..boat-motor-CSS + passMotor + bobMotor-Keyframes + Motoryacht-HTML-Div komplett entfernt.App/assets/img/motoryacht.svg wird nicht gelöscht — kann bei Bedarf später wieder eingebunden werden..dontDeploy/review.html mit Header-Link aus entwurf.html. Konventionen: pro Modul gestreifte Sektionen (Synopse · Bedienung · Spielfluss · Logik/Mechanik · Onboarding · Balance · Probleme · Atlas-Verbesserungen) plus farblich abgesetzte Callout-Boxen (Atlas-Vorschläge lila, Probleme rot, TODO Thomas gelb, Balance blau).App/assets/img/motoryacht.svg: vereinfachte Motoryacht (Bug rechts, fährt nach rechts), viewBox -60 -20 340 100 (extra Platz für Abgas + Heckwelle außerhalb des Boots). Hull, Antifouling, Salon-Aufbau mit Panorama-Verglasung, Schornstein, Antenne, Heckwelle (3 graue Schaumlinien nach LINKS hinter dem Boot) + Bugwelle (weiße Schaumkrone vorne).<circle>-Puffs am Schornstein. Pro Puff: r wächst 3 → 14, cx driftet nach links-hinten (128 → 68), cy steigt auf -12, opacity fällt 0,85 → 0. Loop 5 s, Versatz 0 / 1,6 s / 3,2 s. Dunkelgraue Töne (#3a3a3a / #454545 / #525252)..boat-motor: bottom: 14% (vor allen anderen Booten — Race-Yacht bei 18 %, Segelyacht bei 30 %, Container bei 37 %), opacity: .95, scale(.42) via eigener bobMotor-Keyframe.passMotor 60s linear infinite mit animation-delay: -8s. Sichtbar 42 % (≈ 25 s schnelle Durchquerung), versteckt 58 % (≈ 35 s) → ≈ 1× pro Minute.bottom: 36% → 37%, scale .4 → .28, opacity .45 → .35, filter: saturate(.5) → saturate(.4). Wirkt ein deutlich entfernter / dunstiger.120s → 180s, Durchquerung 15 % → 33 % (von 18 s auf 60 s). Effektive Transitgeschwindigkeit jetzt ≈ 10 px/s vs. Segler ≈ 25 px/s — also klar langsamer. Frequenz: ≈ 1× pro 3 Min statt 2 Min.●NAV wurde ●NAV: <Ort>. Orte: Logo (überall), Header, Header-Button, Footer, Cockpit-Topbar Logo, Cockpit-Topbar User-Pill, Cockpit-Topbar Profil-Link, Admin-Topbar.[A-00] wird nicht von Landingpage verlinkt — erreichbar nur über direkten URL-Aufruf / Bookmark. [T-00] + [S-00] ebenfalls nicht direkt von Landingpage (kommen aus dem Login).forschung/index.html). Damit sind alle NAV-markierten Public-Seiten von der Landingpage aus erreichbar.[P-01] Landing, [P-02] Handbuch, [P-03] Lehrplan, [P-04] Glossar, [P-06] Forschung-Index, [P-13] Kontakt, [P-17] Anmelden[P-14] Impressum, [P-15] Datenschutz, [P-16] Barrierefreiheit[S-00] Schüler-Cockpit, [T-00] Lehrer-Cockpit; User-Pill: [S-04]/[T-08] Profil[A-01] Sims, [A-02] Module, [A-03] Lizenzen, [A-04] StyleguideApp/ (energiemix, erdbeben, fluss, game, game-3d, heli, lieferketten, regenwald, sim, stadt, stadt-editor, stilauswahl, tile-test, dashboard) bekommen ●LEG?-Marker.App/": /index.html (Repo-Root „Projektübersicht", Thomas-Hinweis), App/dist/* (alte Build-Output-HTMLs), didaktik_geografie/, didaktik_simulation/, Konzept/. Alle ●LEG?.App/assets/img/containerschiff.svg: stark vereinfachte Variante (~17 Elemente vs. ~1000+ Pfade im Original). Hull mit Bug links zugespitzt, Antifouling-Streifen, 10 einheitlich große Container 22×20 in einer Reihe (rot/blau/gelb/grün/orange), schlichte Brücke ohne Fenster-Raster, Schornstein. Vorgängerversion hatte 2 Container-Reihen + Fenster-Raster — auf Thomas-Wunsch weiter eingedampft..boat-container: bottom: 36% (Horizont, hinter beiden Segelyachten), right: -400px (Start rechts off-screen), opacity: .45, filter: saturate(.5) (atmosphärische Perspektive), scale(.4) via eigener bobContainer-Keyframe.passContainer-Keyframe — in 15% (≈18 s) von rechts nach links durchqueren, dann 102 s versteckt off-screen → 1 Loop = 120 s = exakt 2 Min. animation: passContainer 120s linear infinite.animation-fill-mode → vor Ablauf der Verzögerung saßen sie in ihrer Ursprungs-Position (top:0; left:0;) und nur die wingFlap-Animation lief → wirkten wie „eingefroren".animation-fill-mode: backwards auf alle drei .hero-bird-N. Vor dem Delay sitzt der Vogel jetzt in seinem 0%-Keyframe-Zustand (off-screen rechts/links) statt sichtbar oben links.renderModules() umgestellt. coming_soon-Module werden auf der Schüler-Sicht vollständig ausgeblendet (sie tauchen weder im Haupt-Grid noch im Divider-Block auf).mode === 'locked'-Module (existieren, aber Lehrperson hat sie für die Klasse nicht freigegeben).locked und coming_soon).renderModCard()-Logik unverändert — die Funktion kann isComing/isLocked immer noch rendern, falls sie wieder gebraucht wird. Nur die Filter wurden geändert.
<a href="schueler.html">Logo</a> · spacer · user-pill (Avatar + Name) · Abmelden). CSS dieselben Tokens: .topbar .logo, .topbar .spacer, .topbar .user-pill 1:1 übernommen.schueler.html, Lehrperson → teacher.html. JS setzt logo-link.href nach API-profile-Response.id="nav-home"): wird nicht mehr gebraucht, weil das Logo den Job macht.profil.html (gleiches Verhalten wie auf schueler.html — Konsistenz). Avatar-Rendering benutzt die bestehende avatarSlugFromValue()/avatarUrl()-Helper aus dem File.[P-..] Public · [M-..] Sim · [S-..] Schüler*in · [T-..] Lehrperson · [A-..] Admin. Sub-Tabs mit Punkt-Suffix (z.B. [A-04.3] für Styleguide-Sektion).App/php/api/glossar.php bekommt einen Count-Endpoint — GET /api/glossar?count=1 → {"count": N} per SELECT COUNT(*) FROM glossar. Frühe Rückkehr vor allen anderen GET-Branches.📚 Glossar · <span data-glossar-count>140</span> Begriffe umgestellt. 140 bleibt als Fallback-Wert sichtbar, falls JS/API ausfallen.fetch(BASE + '/api/glossar?count=1'), schreibt Anzahl in alle [data-glossar-count]-Elemente. Pattern identisch zum existierenden /api/auth-Aufruf..hero-mini-2 { bottom: 15% → 28% }.App/assets/img/segelyacht-race.svg — geometrisch gespiegelte Variante (Bug nach links, Rumpf/Segel x' = 340 − x). Großsegel weiß mit zwei orangen Bändern (oben schmal, unten breit, per <clipPath> auf Sail-Polygon begrenzt) plus großer Startnummer „26" (Helvetica/Arial bold, fill #e8833a) zentral aufgedruckt. Rumpf-Akzentstreifen ebenfalls Orange..boat-sail-2: bottom: 18% (weiter vorne als Boot 1 bei 30%), right: -300px (kommt von rechts), opacity: .95 (klarer als Boot 1), scale(.5) (~57% größer als Boot 1 mit .32), driftLeft 55s, animation-delay: -22s (Versatz).driftLeft (vollständige Durchfahrt rechts→links) und bobSail2 (kombiniert scale(.5) mit Bob, damit der Scale nicht vom Bob-Transform überschrieben wird — gleiche Lösung wie bei bobSail)..hero-boat.boat-sail-2-Container direkt unter dem ersten in .hero-anim.#e8833a = --ggs-orange/--ggs-warning aus design-system.css. Keine weiteren Sektionen betroffen, K-Matrix unverändert. Beide Boote überlappen sich animation-technisch nicht (unterschiedliche bottom-Höhen + Gegenrichtungen).
.hero-mini.hero-mini-2 — Text „Aktueller Stand didaktischer Forschung" → „Lernen mit Simulationen".hero-mini-1 („3 Module sofort testen") bleibt unverändert.
.boat-yacht/-motor/-jolle/-fisher/-container/-cruise) und Keyframes driftLeft, passContainer, passCruise. Außerdem die zwei dekorativen Mini-Segelboote im City-Skyline-Divider unten.App/assets/img/segelyacht.svg (kopiert aus .humanInput/svg/segelyacht.svg) — Bavaria-Stil, weiße Segel + Rumpf, dunkler Unterwasserrumpf, schmaler Akzentstreifen..boat-sail bei bottom: 30% (hinteres Drittel des 38%-Sea-Bands → Horizont), opacity: .7, filter: saturate(.85), scale(.32) über neuen bobSail-Keyframe (Scale + sanftes ±10px Wippen kombiniert, damit der Scale nicht vom Bob-Transform überschrieben wird).driftRight 75s linear infinite (langsam, Horizont-typisch), bobSail 5.5s ease-in-out infinite.card-fluss-Text „Fahre mit dem Boot den Fluss hoch" bleibt unverändert (Modul-Beschreibung, kein visuelles Boot).
handbuch.html ersetzt — bestehende Bookmarks/Backlinks bleiben funktionsfähig.<a href="ueber.html">Über</a> entfernt. Footer-Link „Über" ebenfalls entfernt. Brand-Logo zeigt weiter auf # (Landingpage).profil.html, schueler.html, teacher.html rufen nach auth/logout jetzt location.href = 'index.html' statt login.html.driftRight/driftLeft bewegen sie vollständig über den Bildschirm. Yacht/Motor/Jolle/Fischer dürfen sich überlappen (max 2-3 sichtbar in der Spitze).scale(.45)–.5, bottom: 24/27%, opacity: .5/.55, filter: saturate(.65/.7).animation-delay sorgt dafür, dass max ~3 simultan sichtbar sind.passRight/passLeft bewegen das Schiff in 30 % der Loop-Zeit vollständig vom Start ins Off-screen-Ziel. Danach wartet es dort, kein Stehen mehr mitten im Bild.scale(.5)–.55 verkleinert, höher am Horizont positioniert (bottom: 24/27%), Opacity .55 + saturate(.7) als Distanz-Effekt.App/index.html CSS-Sektion .hero-boat*.
App/forschung/index.html → URL /forschung/ — Übersicht beider Fachartikel mit Beschreibung, Bezug, Links zu Artikel + Präsentation + LiteraturApp/forschung/literatur.html → URL /forschung/literatur — Übersicht beider Literaturverzeichnisse mit ZitiervorschlagApp/index.html: drei tote Links auf ../didaktik_geografie/… bzw. ../didaktik_simulation/… entfernt.
Vier korrekte Links eingesetzt — Dateien liegen in App/forschung/:
forschung/geografie-didaktik.htmlforschung/quellen-geografie.htmlforschung/lernen-durch-simulation.htmlforschung/quellen-simulation.html
Anwendung der Konsistenz-Regel K.3.5 (Dokumenten-Pfad-Konsistenz). Die Hauptinhalt-Sektion „Forschung & Didaktik" (Zeilen 805–825) hatte bereits korrekte Links auf forschung/ — nur der Footer war veraltet. Präsentationen unter forschung/presentation-geografie/ und forschung/presentation-simulation/ sind im Footer nicht verlinkt — Thomas entscheidet ob das soll.
App/index.html Zeile ~905: Satz „Genau wie bei Typewriter — einem Werkzeug, das erst im schulischen Kontext seine volle Wirkung entfaltet." entfernt. Rest des Absatzes (Einbettung im Unterricht) bleibt.
App/index.html Zeilen ~139-180 (CSS) und ~272-... (HTML).
composer install im App/-Ordner ausführen.
Voraussetzung: composer.json mit PHPMailer-Dependency vorhanden. Falls nicht: composer require phpmailer/phpmailer.
Vertagt — Bypass reicht für jetzt.