1e51ef7def
- 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>
1986 lines
174 KiB
HTML
1986 lines
174 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>GeoGraSim V2 — Entwurfsdokument</title>
|
||
<style>
|
||
*{margin:0;padding:0;box-sizing:border-box}
|
||
body{font-family:'Inter',system-ui,sans-serif;background:#f5f2eb;color:#2a2a2a;line-height:1.5;padding:24px;max-width:1100px;margin:0 auto}
|
||
h1{color:#1f4e5a;font-size:1.6rem;margin-bottom:8px}
|
||
h2{color:#1f4e5a;font-size:1.1rem;margin:24px 0 8px;padding-bottom:4px;border-bottom:2px solid #4a7c8a}
|
||
h3{color:#4a7c8a;font-size:0.95rem;margin:16px 0 6px}
|
||
.meta{font-size:0.75rem;color:#8a8a8a;margin-bottom:16px}
|
||
.entry{background:#fff;border:1px solid #e0ddd4;border-radius:8px;padding:12px 16px;margin-bottom:10px}
|
||
.entry .code{display:inline-block;background:#1f4e5a;color:#fff;padding:2px 8px;border-radius:4px;font-family:'JetBrains Mono',Consolas,monospace;font-size:0.78rem;font-weight:700;margin-right:8px}
|
||
.entry .title{font-weight:700;color:#1f4e5a}
|
||
.entry .body{margin-top:6px;font-size:0.88rem}
|
||
.entry.todo{border-left:4px solid #e8833a}
|
||
.entry.done{border-left:4px solid #5a8a5e}
|
||
.entry.open{border-left:4px solid #c85c4a}
|
||
.entry.info{border-left:4px solid #4a7c8a}
|
||
table{width:100%;border-collapse:collapse;font-size:0.85rem;margin:4px 0}
|
||
th,td{text-align:left;padding:4px 8px;border-bottom:1px solid #e0ddd4}
|
||
th{font-weight:700;color:#4a7c8a;font-size:0.72rem;text-transform:uppercase}
|
||
code{background:#f5f2eb;padding:2px 6px;border-radius:3px;font-family:'JetBrains Mono',Consolas,monospace;font-size:0.85em}
|
||
a{color:#1f4e5a}
|
||
.legend{font-size:0.78rem;color:#8a8a8a;margin-bottom:16px}
|
||
.legend span{display:inline-block;margin-right:12px}
|
||
.legend .b{display:inline-block;width:14px;height:14px;border-radius:2px;vertical-align:middle;margin-right:4px}
|
||
.b-open{background:#c85c4a}.b-todo{background:#e8833a}.b-done{background:#5a8a5e}.b-info{background:#4a7c8a}
|
||
.ask{background:#fff3cd;border:1px solid #e8833a;border-radius:6px;padding:10px 14px;margin:8px 0;font-size:0.88rem}
|
||
.ask::before{content:"⚠ ";font-weight:700}
|
||
/* einheitliches Entwurfswerkzeug-Menü (auf allen Seiten gleich) */
|
||
.top-nav{background:#fff;border:1px solid #e0ddd4;border-radius:8px;padding:10px 14px;margin-bottom:18px;font-size:.86rem;display:flex;flex-wrap:wrap;gap:12px;align-items:center}
|
||
.top-nav strong{color:#1f4e5a}
|
||
.top-nav a{text-decoration:none;padding:5px 11px;border-radius:6px;color:#1f4e5a}
|
||
.top-nav a:hover{background:#f5f2eb}
|
||
.top-nav a.active{background:#1f4e5a;color:#fff}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<nav class="top-nav">
|
||
<strong>🛠 Entwurfswerkzeug</strong>
|
||
<a href="entwurfswerkzeug/index.html">Übersicht</a>
|
||
<a href="entwurf.html" class="active">Entwurf</a>
|
||
<a href="review.html">Review</a>
|
||
<a href="entwurfswerkzeug/accounts.html">🔑 Accounts</a>
|
||
<a href="entwurfswerkzeug/standards.html">📐 Standards</a>
|
||
<a href="entwurfswerkzeug/legacy/" style="color:#6b6448">📂 legacy/</a>
|
||
<a href="entwurfswerkzeug/toDelete/" style="color:#9c4d2e">📂 toDelete/</a>
|
||
<a href="../App/admin-sitemap.html" target="_blank">📊 Sitemap</a>
|
||
</nav>
|
||
|
||
<h1>GeoGraSim V2 — Entwurfsdokument</h1>
|
||
<p class="meta">Lebendes Doku-File für V2-Entwicklung. Liegt in <code>.dontDeploy/entwurf.html</code> — nicht im Deploy, nicht im V1-Verzeichnis. Letzte Änderung: 2026-06-08.</p>
|
||
<p style="margin-bottom:16px;font-size:0.88rem">
|
||
📂 Dokumente:
|
||
<strong style="color:#1f4e5a">entwurf.html</strong> (Architektur / Policies / IA / Change-Log)
|
||
· <a href="review.html" style="color:#1f4e5a;font-weight:600">review.html</a> (Modul-Reviews — Basis für die Überarbeitung)
|
||
· <a href="entwurfswerkzeug/" style="color:#1f4e5a;font-weight:600">entwurfswerkzeug/</a> (Legacy + Lösch-Kandidaten)
|
||
</p>
|
||
|
||
<div class="legend">
|
||
<span><span class="b b-info"></span>Info / Fakt</span>
|
||
<span><span class="b b-done"></span>Erledigt</span>
|
||
<span><span class="b b-todo"></span>TODO</span>
|
||
<span><span class="b b-open"></span>Offene Frage</span>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<h2>A · Rollen und Zugangsdaten (V1-Bestand)</h2>
|
||
|
||
<h3>A.1 — System-Admin (mit 2-Faktor-Auth)</h3>
|
||
|
||
<div class="entry info">
|
||
<span class="code">A.1.1</span><span class="title">Account existiert in V1-Tabelle <code>admin_users</code></span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Feld</th><th>Wert</th></tr>
|
||
<tr><td>id</td><td>1</td></tr>
|
||
<tr><td>username</td><td><code>Thomas</code></td></tr>
|
||
<tr><td>email_2fa (PIN-Empfänger)</td><td><code>thomas.schroffenegger@ph-vorarlberg.ac.at</code></td></tr>
|
||
<tr><td>Passwort</td><td><em>nur dir bekannt (in DB nur als Bcrypt-Hash)</em></td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">A.1.2</span><span class="title">Login-URL Admin (V1, unverändert)</span>
|
||
<div class="body">
|
||
<a href="http://localhost/geograsim/App/admin.html" target="_blank">http://localhost/geograsim/App/admin.html</a>
|
||
<p style="margin-top:4px;font-size:0.82rem;color:#8a8a8a">2FA-Flow: Username + Passwort → PIN per E-Mail an oben genannte Adresse → 4-stelliger PIN eintippen → Admin-Session aktiv.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">A.1.3</span><span class="title">Lokales Admin-Passwort</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Username</th><td><code>Thomas</code></td></tr>
|
||
<tr><td>Passwort (lokal)</td><td><code>fnahc</code></td></tr>
|
||
</table>
|
||
<p style="margin-top:4px;font-size:0.78rem;color:#8a8a8a">Original-Hash aus Backup wiederhergestellt. Passwort war auch vorher schon „fnahc" — nicht von Atlas verändert.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry open">
|
||
<span class="code">A.1.4</span><span class="title">Lokales 2FA blockiert — PHPMailer fehlt</span>
|
||
<div class="body">
|
||
V1-Admin-Login crashed lokal beim Mailversand (PHPMailer-Lib fehlt → kein <code>composer install</code> in <code>App/</code>).
|
||
<strong>Folge:</strong> Login-Flow stoppt vor der PIN-Eingabe. Lokal nicht testbar ohne Eingriff in V1 oder Bypass.
|
||
<p style="margin-top:6px;font-size:0.82rem;color:#8a8a8a">Atlas hatte einen Bypass gebaut, wurde wegen V1-Workflow-Eingriff wieder entfernt.</p>
|
||
<p style="margin-top:4px"><strong>Frage an Thomas:</strong> Wie wollen wir hier weiter?</p>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>A.2 — Lehrperson</h3>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">A.2.1</span><span class="title">Test-Lehrer-Account auswählen oder anlegen</span>
|
||
<div class="body">
|
||
V1 hat lokal mehrere Lehrer-Accounts (z.B. <code>testlehrer / test@geograsim.at</code>, <code>jakob / jakob@geograsim.at</code>).
|
||
Username ist die Mail-Adresse beim Login.
|
||
<p style="margin-top:4px;font-size:0.82rem">Atlas wartet auf deine Vorgabe: welcher Account, oder soll ich einen neuen <code>v2demo</code>-Lehrer anlegen mit bekanntem Passwort?</p>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>A.3 — Schüler*innen (2 Accounts)</h3>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">A.3.1</span><span class="title">Zwei Test-Schüler*innen auswählen</span>
|
||
<div class="body">
|
||
Lokal sind z.B. in der Test-Klasse (JoinCode <code>TEST01</code>) die Schüler*innen <code>anna</code>, <code>ben</code>, <code>clara</code>.
|
||
Username ist nur der Name, plus Passwort. Klassencode nur als Disambiguator, wenn Username doppelt.
|
||
<p style="margin-top:4px;font-size:0.82rem">Atlas wartet auf deine Vorgabe: welche zwei, oder soll ich neu anlegen?</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<h2>B · Policies und Konventionen</h2>
|
||
|
||
<div class="entry done">
|
||
<span class="code">B.1</span><span class="title">V1 wird nicht angefasst (außer Bugfix)</span>
|
||
<div class="body">Seit 2026-05-04 produktiv. V2 läuft in eigenem Pfad. Stable-Switch erst wenn alles fertig.</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">B.2</span><span class="title">Sprache: „Lehrperson", nicht „Lehrkraft" · keine Spielsprache</span>
|
||
<div class="body">Bildungstheoretisch (Wygotski): Lernarbeit statt Spiel. Lehrperson, Schüler*in, Simulation, Bearbeiter*in.</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">B.3</span><span class="title">API-Keys nur lokal, niemals auf Server</span>
|
||
<div class="body">DALL-E / ElevenLabs API-Keys liegen in <code>v2-platform/.env.local</code> (gitignored). Assets werden VOR Deploy generiert. Atlas ist einziger Akteur.</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">B.4</span><span class="title">Barrierefreiheit WCAG 2.1 AA Pflicht ab Tag 1</span>
|
||
<div class="body">High-Contrast (hell + dunkel), Reduced Motion, Keyboard-Navigation, ARIA, Easy-Sprache. Pro Modul im Konformitäts-Check verpflichtend.</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<h2>C · System-Architektur (Status quo)</h2>
|
||
|
||
<div class="entry info">
|
||
<span class="code">C.1</span><span class="title">V1-Hauptseite</span>
|
||
<div class="body"><a href="http://localhost/geograsim/App/" target="_blank">http://localhost/geograsim/App/</a></div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">C.2</span><span class="title">V1-Admin-Board</span>
|
||
<div class="body"><a href="http://localhost/geograsim/App/admin.html" target="_blank">http://localhost/geograsim/App/admin.html</a> (Login mit Thomas / 2FA)</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">C.3</span><span class="title">V2-Plattform-Ordner</span>
|
||
<div class="body"><code>c:\xampp\htdocs\geograsim\v2-platform\</code> (alles lokal, kein Deploy)</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">C.4</span><span class="title">V2-Spec</span>
|
||
<div class="body"><code>c:\xampp\htdocs\geograsim\v2-modules\_spec\</code> — v1.0-stable, 9 Files</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<h2>N · Sitemap & Navigation</h2>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.0</span><span class="title">Problem-Befund</span>
|
||
<div class="body">
|
||
Aktuell gibt es <strong>drei verschiedene Header-Varianten</strong> über die Seiten verteilt, plus <strong>8 Seiten ganz ohne Header</strong>.
|
||
Folge: wer von der Startseite auf <code>ueber.html</code> 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.
|
||
</div>
|
||
</div>
|
||
|
||
<h3>N.1 — Vollständige Sitemap (Stand 2026-05-28)</h3>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.1.0</span><span class="title">Grafische Informationsarchitektur — ausgehend von der Landingpage</span>
|
||
<div class="body">
|
||
<p style="margin-bottom:8px">Top-Down-Übersicht: <strong>vier Stränge</strong> zweigen von der Landingpage ab. Die Tabellen in N.1.1–N.1.7 sind die Datei-Inventur dazu, dies hier ist die <strong>Navigations-Hierarchie</strong>.</p>
|
||
|
||
<h4 style="font-size:0.9rem;color:#1f4e5a;margin:14px 0 6px">Übersicht (Big Picture)</h4>
|
||
<pre style="background:#f5f2eb;padding:12px;border-radius:6px;font-family:'JetBrains Mono',Consolas,monospace;font-size:0.78rem;line-height:1.35;color:#2a2a2a;overflow-x:auto">
|
||
┌─────────────────┐
|
||
│ 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
|
||
</pre>
|
||
|
||
<h4 style="font-size:0.9rem;color:#1f4e5a;margin:18px 0 6px">Stamm-Hierarchie mit Page-IDs (jeder Strang aufgeklappt)</h4>
|
||
<p style="font-size:0.82rem;color:#8a8a8a;margin-bottom:6px">ID-Schema: <code>[P-..]</code> Public · <code>[M-..]</code> Modul/Sim · <code>[S-..]</code> Schüler*in · <code>[T-..]</code> Lehrperson · <code>[A-..]</code> Admin. Sub-Tabs erhalten Punkt-Suffix (z.B. <code>[A-04.3]</code>).</p>
|
||
<pre style="background:#f5f2eb;padding:12px;border-radius:6px;font-family:'JetBrains Mono',Consolas,monospace;font-size:0.76rem;line-height:1.4;color:#2a2a2a;overflow-x:auto">
|
||
LANDINGPAGE <strong>[P-01]</strong> index.html <span style="color:#5a8a5e;font-weight:700">●NAV: Logo (überall)</span>
|
||
│
|
||
├─ <strong>1. ÖFFENTLICH · MARKETING & INFO</strong> (vor Login, jeder erreichbar)
|
||
│ │
|
||
│ ├─ Handbuch (inkl. „Über GeoGraSim") <strong>[P-02]</strong> handbuch.html <span style="color:#5a8a5e;font-weight:700">●NAV: Header</span>
|
||
│ ├─ Lehrplan-Bezug <strong>[P-03]</strong> /lehrplan <span style="color:#5a8a5e;font-weight:700">●NAV: Header</span>
|
||
│ ├─ Glossar <strong>[P-04]</strong> /glossar <span style="color:#5a8a5e;font-weight:700">●NAV: Header</span>
|
||
│ │ └─ Mindmap (Begriffs-Querverweise) <strong>[P-05]</strong> /mindmap
|
||
│ ├─ Forschung & Literatur
|
||
│ │ ├─ Forschung Index <strong>[P-06]</strong> forschung/index.html <span style="color:#5a8a5e;font-weight:700">●NAV: Header</span>
|
||
│ │ ├─ Fachartikel GW-Didaktik <strong>[P-07]</strong> forschung/geografie-didaktik.html
|
||
│ │ ├─ Fachartikel Simulationen <strong>[P-08]</strong> forschung/lernen-durch-simulation.html
|
||
│ │ ├─ Literatur GW-Didaktik <strong>[P-09]</strong> forschung/quellen-geografie.html
|
||
│ │ ├─ Literatur Simulation <strong>[P-10]</strong> forschung/quellen-simulation.html
|
||
│ │ ├─ Präsentation GW-Didaktik <strong>[P-11]</strong> forschung/presentation-geografie/ [Footer-Link offen]
|
||
│ │ └─ Präsentation Simulation <strong>[P-12]</strong> forschung/presentation-simulation/ [Footer-Link offen]
|
||
│ ├─ Kontakt <strong>[P-13]</strong> kontakt.html <span style="color:#5a8a5e;font-weight:700">●NAV: Footer</span>
|
||
│ ├─ Marktplatz-Einreichung [später auth] <strong>[P-18]</strong> marktplatz-einreichung.html
|
||
│ └─ Footer-Pflicht
|
||
│ ├─ Impressum <strong>[P-14]</strong> impressum.html <span style="color:#5a8a5e;font-weight:700">●NAV: Footer</span>
|
||
│ ├─ Datenschutz <strong>[P-15]</strong> datenschutz.html <span style="color:#5a8a5e;font-weight:700">●NAV: Footer</span>
|
||
│ └─ Barrierefreiheit <strong>[P-16]</strong> barrierefreiheit.html <span style="color:#5a8a5e;font-weight:700">●NAV: Footer</span>
|
||
│
|
||
├─ <strong>2. SIMULATIONEN</strong> (von Landingpage UND aus Cockpits anspielbar)
|
||
│ ├─ Klimasimulator 2D <strong>[M-01]</strong> /klima-2d
|
||
│ ├─ Klimasimulator 3D <strong>[M-02]</strong> /klima-3d
|
||
│ ├─ Heli <strong>[M-03]</strong> /heli-game
|
||
│ ├─ Fluss <strong>[M-04]</strong> /fluss
|
||
│ ├─ Logistik <strong>[M-05]</strong> /logistik
|
||
│ ├─ Sonnensystem <strong>[M-06]</strong> /sonnensystem
|
||
│ ├─ Busfahrt <strong>[M-07]</strong> /busfahrt
|
||
│ ├─ Farmer <strong>[M-08]</strong> /farmer
|
||
│ ├─ Energiemanager (β) <strong>[M-09]</strong> /energiemanager
|
||
│ ├─ Entscheidungstag (β) <strong>[M-10]</strong> /entscheidungstag
|
||
│ └─ Staustufen (pausiert, Pivot → M-09) <strong>[M-11]</strong> /staustufen
|
||
│ <em>(Sims selbst nicht in Nav — Sektion „Simulationen" auf Landingpage als Anchor #sims)</em>
|
||
│
|
||
├─ <strong>3. ANMELDEN</strong> <strong>[P-17]</strong> login.html → Brücke in die App <span style="color:#5a8a5e;font-weight:700">●NAV: Header-Button</span>
|
||
│ │
|
||
│ │ <em>(Nach Login öffnet sich der jeweilige App-Strang — keine direkten Landingpage-Links)</em>
|
||
│ │
|
||
│ ├──▶ APP-STRANG · LEHRPERSON-COCKPIT <strong>[T-00]</strong> teacher.html (Detail siehe unten — Topbar nach Lehrperson-Login)
|
||
│ │
|
||
│ └──▶ APP-STRANG · SCHÜLER:IN-COCKPIT <strong>[S-00]</strong> schueler.html (Detail siehe unten — Topbar nach Schüler-Login)
|
||
│
|
||
└─ <strong>4. ADMIN-WELT</strong> <strong>[A-00]</strong> admin.html (2FA) <em>nicht von Landingpage verlinkt — nur direkter URL-Aufruf / Bookmark</em>
|
||
</pre>
|
||
|
||
<h4 style="font-size:0.9rem;color:#1f4e5a;margin:22px 0 6px">Detail: Schüler-Strang</h4>
|
||
<pre style="background:#f5f2eb;padding:12px;border-radius:6px;font-family:'JetBrains Mono',Consolas,monospace;font-size:0.76rem;line-height:1.4;color:#2a2a2a;overflow-x:auto">
|
||
SCHÜLER:IN-COCKPIT <strong>[S-00]</strong> schueler.html <span style="color:#5a8a5e;font-weight:700">●NAV: Cockpit-Topbar Logo</span>
|
||
│
|
||
├─ Topbar <em>(überall in Schüler-Sicht identisch, siehe profil.html)</em>
|
||
│ ├─ Logo → Cockpit [S-00]
|
||
│ ├─ User-Pill (Avatar+Name) → Profil [S-04]
|
||
│ └─ Abmelden → Landingpage [P-01]
|
||
│
|
||
├─ Tab „Meine Module" <strong>[S-01]</strong>
|
||
│ ├─ 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)
|
||
│ <em>coming_soon-Module werden NICHT angezeigt (Schüler-Sicht filtert sie raus)</em>
|
||
│
|
||
├─ Tab „Meine Erfolge" <strong>[S-02]</strong>
|
||
│ ├─ Übersicht (Plays / XP / beste Sterne)
|
||
│ ├─ Modul-Verlauf
|
||
│ └─ Badges
|
||
│
|
||
└─ Tab „Profil" (inline-Vorschau) <strong>[S-03]</strong>
|
||
├─ Avatar (klick) → Profil [S-04]
|
||
└─ „Profil bearbeiten" → Profil [S-04]
|
||
|
||
PROFIL (Schüler-Sicht) <strong>[S-04]</strong> profil.html <span style="color:#5a8a5e;font-weight:700">●NAV: Cockpit-Topbar User-Pill</span>
|
||
├─ 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 <strong>[S-05]</strong> modul-<id> (PHP-Wrapper)
|
||
GLOSSAR (modul-gefiltert) <strong>[S-06]</strong> /glossar?module=<id>
|
||
</pre>
|
||
|
||
<h4 style="font-size:0.9rem;color:#1f4e5a;margin:22px 0 6px">Detail: Lehrer-Strang</h4>
|
||
<pre style="background:#f5f2eb;padding:12px;border-radius:6px;font-family:'JetBrains Mono',Consolas,monospace;font-size:0.76rem;line-height:1.4;color:#2a2a2a;overflow-x:auto">
|
||
LEHRPERSON-COCKPIT <strong>[T-00]</strong> teacher.html <span style="color:#5a8a5e;font-weight:700">●NAV: Cockpit-Topbar Logo</span>
|
||
│
|
||
├─ Topbar (App-Topbar, eigener Look)
|
||
│ ├─ Logo / Home → Cockpit [T-00]
|
||
│ ├─ Klassen-Dropdown
|
||
│ ├─ Profil-Link → Profil [T-08]
|
||
│ └─ Abmelden → Landingpage [P-01]
|
||
│
|
||
├─ Tab „Übersicht" <strong>[T-01]</strong>
|
||
│ └─ Resultate-Matrix, Aktivitäts-Timeline, Auftrags-Liste, Schüler*innen-Übersicht
|
||
│
|
||
├─ Tab „Modulfreigabe" <strong>[T-02]</strong>
|
||
│ └─ Freigabe-Matrix pro Klasse / pro Schüler*in
|
||
│ └─ ▶ Sim starten (Modal) <strong>[T-17]</strong>
|
||
│
|
||
├─ Tab „Klasse" <strong>[T-03]</strong>
|
||
│ ├─ Schüler*innen-Liste
|
||
│ ├─ + Schüler*in anlegen (Modal) <strong>[T-10]</strong>
|
||
│ ├─ Batch anlegen (Modal) <strong>[T-11]</strong>
|
||
│ ├─ CSV-Import (Modal) <strong>[T-12]</strong>
|
||
│ ├─ Schüler*in bearbeiten (Modal) <strong>[T-14]</strong>
|
||
│ └─ PIN-Liste drucken (Modal) <strong>[T-13]</strong>
|
||
│ └─ PDF via /api/tickets?class_id=<id>
|
||
│
|
||
├─ Tab „Live" <strong>[T-04]</strong>
|
||
│ ├─ Echtzeit-Sitzungsmonitor
|
||
│ └─ Spectator-Modal (pollt /api/live) <strong>[T-16]</strong>
|
||
│
|
||
├─ Tab „Ergebnisse" <strong>[T-05]</strong>
|
||
│ ├─ Modul-Performance-Matrix
|
||
│ ├─ Aktivitäts-Heatmap
|
||
│ └─ Modul-Detail-Drilldown (Modal) <strong>[T-15]</strong>
|
||
│
|
||
├─ Tab „Lizenzen" <strong>[T-06]</strong>
|
||
│ ├─ Lizenz-Übersicht der Klasse
|
||
│ └─ Code einlösen (Modal) <strong>[T-18]</strong>
|
||
│
|
||
└─ Tab „Klassen" <strong>[T-07]</strong>
|
||
└─ Klasse anlegen / umbenennen / löschen (Modal) <strong>[T-09]</strong>
|
||
|
||
PROFIL (Lehrer-Sicht) <strong>[T-08]</strong> profil.html <span style="color:#5a8a5e;font-weight:700">●NAV: Cockpit-Topbar Profil-Link</span>
|
||
├─ 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 <strong>[T-19]</strong> modul-<id>
|
||
├─ Glossar gefiltert <strong>[T-20]</strong> /glossar?module=<id>
|
||
└─ Lehrplan gefiltert <strong>[T-21]</strong> /lehrplan?module=<id>
|
||
</pre>
|
||
|
||
<h4 style="font-size:0.9rem;color:#1f4e5a;margin:22px 0 6px">Detail: Admin-Welt</h4>
|
||
<pre style="background:#f5f2eb;padding:12px;border-radius:6px;font-family:'JetBrains Mono',Consolas,monospace;font-size:0.76rem;line-height:1.4;color:#2a2a2a;overflow-x:auto">
|
||
ADMIN-LOGIN <strong>[A-00]</strong> 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 <strong>[A-01]</strong> admin-levels.html <span style="color:#5a8a5e;font-weight:700">●NAV: Admin-Topbar</span>
|
||
├─ Tab „Simulationen" <strong>[A-01.1]</strong>
|
||
│ └─ Sim-Grid (~9 Module)
|
||
│ └─ Sim-Detail-Panel (inline, unter dem Grid)
|
||
│ └─ 3 Stufen (Leicht/Mittel/Schwer) mit Param-Slidern
|
||
├─ Tab „Waypoints" <strong>[A-01.2]</strong>
|
||
│ ├─ Tabelle (Region- + Typ-Filter)
|
||
│ ├─ Waypoint bearbeiten (Modal, Map-Editor)
|
||
│ └─ Neuer Waypoint (Click-to-Place)
|
||
└─ externer Link: Heli-Map → /heli (target=_blank)
|
||
|
||
MODULE <strong>[A-02]</strong> admin-modules.html <span style="color:#5a8a5e;font-weight:700">●NAV: Admin-Topbar</span>
|
||
├─ Modul-Grid + Status-Filter (Alle / Aktiv / Beta / Geplant / Archiv)
|
||
└─ Modul bearbeiten (Modal) <strong>[A-02.1]</strong>
|
||
└─ Emoji-Picker, Image-Upload, Dauer/Alter, play_url, page_url
|
||
|
||
LIZENZEN <strong>[A-03]</strong> admin-licenses.html <span style="color:#5a8a5e;font-weight:700">●NAV: Admin-Topbar</span>
|
||
├─ Stats (Total / Frei / Vergeben)
|
||
├─ Code-Generator
|
||
└─ Lizenz-Tabelle mit Status-Filter + Paginierung
|
||
|
||
STYLEGUIDE <strong>[A-04]</strong> admin-styleguide.html <span style="color:#5a8a5e;font-weight:700">●NAV: Admin-Topbar</span>
|
||
├─ <strong>[A-04.1]</strong> Bildstil (DALL-E-Prompt-Template + Specs)
|
||
├─ <strong>[A-04.2]</strong> Bild-Farbpalette (5 Swatches)
|
||
├─ <strong>[A-04.3]</strong> UI-Farbtokens (Fjord / Moss / Coral+Orange / Sand+Text)
|
||
├─ <strong>[A-04.4]</strong> Layout & Spacing (Gap / Radius / Schatten)
|
||
├─ <strong>[A-04.5]</strong> Typografie (Font-Stack + Size-Scale)
|
||
├─ <strong>[A-04.6]</strong> Bildformate (Karten / Glossar / Splash / Avatare)
|
||
├─ <strong>[A-04.7]</strong> iPad-Patterns (Touch-Min, Modal-Regeln)
|
||
└─ <strong>[A-04.8]</strong> Sprache (keine Spielsprache; „Lehrperson" statt „Lehrkraft")
|
||
</pre>
|
||
|
||
<h4 style="font-size:0.9rem;color:#1f4e5a;margin:18px 0 6px">Konsequenzen für die Header-Strategie</h4>
|
||
<p style="font-size:0.85rem;margin-bottom:6px">Aus den vier Strängen folgen <strong>drei Header-Klassen</strong> (Detail in N.3.1):</p>
|
||
<table>
|
||
<tr><th>Strang</th><th>Header-Klasse</th><th>Inhalt</th></tr>
|
||
<tr><td>Öffentlich + Simulationen + Anmelden</td><td><strong>Hauptnav</strong> (wie index.html heute)</td><td>Logo · Simulationen · Lehrperson · Handbuch · Anmelden/Profil</td></tr>
|
||
<tr><td>App-Strang (Cockpits)</td><td><strong>App-Topbar</strong></td><td>Logo · Klassen-/Modul-Auswahl · Profil · Abmelden</td></tr>
|
||
<tr><td>Admin-Welt</td><td><strong>Admin-Topbar</strong></td><td>Logo „Admin" · Reiter (Sims/Module/Lizenzen/Styleguide) · Logout</td></tr>
|
||
</table>
|
||
|
||
<h4 style="font-size:0.9rem;color:#1f4e5a;margin:18px 0 6px">App-Strang im Fokus</h4>
|
||
<p style="font-size:0.85rem">
|
||
Der <strong>App-Strang</strong> beginnt <em>nach</em> 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 <strong>vollbild</strong>
|
||
in der eigenen Wrapper-Welt unter <code>App/pages/</code>, mit modulinternem Header. Aus den Cockpits werden sie
|
||
über deren eigene Modul-Auswahl gestartet, aus der Landingpage über die Sim-Cards.
|
||
</p>
|
||
|
||
<p style="font-size:0.82rem;color:#8a8a8a;margin-top:10px">
|
||
Legende: <code>──</code> direkter Link · <code>──▶</code> Rollen-/Bereichswechsel · <code>/pfad</code> öffentliche URL · <code>(β)</code> Beta · <code>[…]</code> offene Punkte/Pendenzen
|
||
· <span style="color:#5a8a5e;font-weight:700">●NAV: Ort</span> = Seite gehört als eigener Eintrag in eine Navigation; <em>Ort</em> sagt wo (z.B. <code>Header</code>, <code>Footer</code>, <code>Header-Button</code>, <code>Logo</code>, <code>Cockpit-Topbar</code>, <code>Admin-Topbar</code>)
|
||
· <span style="color:#c85c4a;font-weight:700">●LEG?</span> = vermutlich Legacy / Aufräum-Kandidat (siehe N.1.7 / N.1.8)
|
||
</p>
|
||
<p style="font-size:0.82rem;color:#8a8a8a;margin-top:6px">
|
||
<strong>Wichtig:</strong> Die App-Stränge <code>[T-00]</code>/<code>[S-00]</code> sowie die Admin-Welt <code>[A-00]</code>
|
||
werden <em>nicht direkt</em> 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 <code>[P-17] Anmelden</code> als Header-Button.
|
||
Der Admin-Bereich ist nur über direkten URL-Aufruf / Bookmark erreichbar — bewusst keine Verlinkung.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.1.1</span><span class="title">Öffentlicher Bereich (vor Login, jeder darf hier sein)</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Seite</th><th>URL</th><th>Header</th><th>Kommentar</th></tr>
|
||
<tr><td><strong>Landing</strong></td><td><code>index.html</code></td><td>✓ Hauptnav</td><td>Referenz</td></tr>
|
||
<tr><td>Über</td><td><code>ueber.html</code></td><td>△ eigene topbar</td><td><strong>Header-Bruch</strong></td></tr>
|
||
<tr><td>Handbuch</td><td><code>handbuch.html</code></td><td>✗ kein Header</td><td><strong>Header-Bruch</strong></td></tr>
|
||
<tr><td>Kontakt</td><td><code>kontakt.html</code></td><td>△ eigene topbar</td><td><strong>Header-Bruch</strong></td></tr>
|
||
<tr><td>Impressum</td><td><code>impressum.html</code></td><td>△ eigene topbar</td><td><strong>Header-Bruch</strong></td></tr>
|
||
<tr><td>Datenschutz</td><td><code>datenschutz.html</code></td><td>△ eigene topbar</td><td><strong>Header-Bruch</strong></td></tr>
|
||
<tr><td>Barrierefreiheit</td><td><code>barrierefreiheit.html</code></td><td>△ eigene topbar</td><td><strong>Header-Bruch</strong></td></tr>
|
||
<tr><td>Marktplatz-Einreichung</td><td><code>marktplatz-einreichung.html</code></td><td>✗ kein Header</td><td>Soll laut Memory später nicht-öffentlich werden (Lehrkraft-Auth-pflichtig)</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.1.2</span><span class="title">Forschungs-Artikel (öffentlich erreichbar, aktuell aus Footer)</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Seite</th><th>URL</th><th>Kommentar</th></tr>
|
||
<tr><td>Fachartikel: GW-Didaktik</td><td><code>forschung/geografie-didaktik.html</code></td><td>2,1 MB Inhaltsseite</td></tr>
|
||
<tr><td>Fachartikel: Simulationen im Unterricht</td><td><code>forschung/lernen-durch-simulation.html</code></td><td>2,4 MB</td></tr>
|
||
<tr><td>Literatur: GW-Didaktik</td><td><code>forschung/quellen-geografie.html</code></td><td>—</td></tr>
|
||
<tr><td>Literatur: Simulation</td><td><code>forschung/quellen-simulation.html</code></td><td>—</td></tr>
|
||
<tr><td>Präsentation: GW-Didaktik</td><td><code>forschung/presentation-geografie/</code></td><td><strong>Im Footer derzeit nicht verlinkt</strong></td></tr>
|
||
<tr><td>Präsentation: Simulation</td><td><code>forschung/presentation-simulation/</code></td><td><strong>Im Footer derzeit nicht verlinkt</strong></td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.1.3</span><span class="title">Login & geschützter Bereich</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Seite</th><th>URL</th><th>Header</th><th>Rolle</th></tr>
|
||
<tr><td>Login Lehrperson/Schüler*in</td><td><code>login.html</code></td><td>✗ kein Header</td><td>jeder</td></tr>
|
||
<tr><td>Lehrer-Cockpit</td><td><code>teacher.html</code></td><td>△ eigene topbar</td><td>Lehrperson</td></tr>
|
||
<tr><td>Schüler-Cockpit</td><td><code>schueler.html</code></td><td>△ eigene topbar</td><td>Schüler*in</td></tr>
|
||
<tr><td>Profil</td><td><code>profil.html</code></td><td>△ eigene topbar</td><td>Lehrperson</td></tr>
|
||
<tr><td>Dashboard (alt?)</td><td><code>dashboard.html</code></td><td>✓ Hauptnav</td><td><strong>Status klären</strong></td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.1.4</span><span class="title">Admin-Bereich (separate Welt, eigener Login mit 2FA)</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Seite</th><th>URL</th><th>Header</th></tr>
|
||
<tr><td>Admin-Login</td><td><code>admin.html</code></td><td>✗ kein Header (Card-Login)</td></tr>
|
||
<tr><td>Admin: Simulationen + Waypoints</td><td><code>admin-levels.html</code></td><td>△ eigene Admin-Topbar</td></tr>
|
||
<tr><td>Admin: Module</td><td><code>admin-modules.html</code></td><td>△ eigene Admin-Topbar</td></tr>
|
||
<tr><td>Admin: Lizenzen</td><td><code>admin-licenses.html</code></td><td>△ eigene Admin-Topbar</td></tr>
|
||
<tr><td>Admin: Styleguide</td><td><code>admin-styleguide.html</code></td><td>△ eigene Admin-Topbar</td></tr>
|
||
</table>
|
||
<p style="margin-top:6px;font-size:0.82rem;color:#8a8a8a">
|
||
Admin-Bereich ist bewusst von der Hauptnav getrennt — das ist <strong>richtig</strong>. Innerhalb des Admin-Bereichs ist die Topbar konsistent.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.1.5</span><span class="title">Simulationen (über PHP-Wrapper unter <code>App/pages/</code> aufgerufen)</span>
|
||
<div class="body">
|
||
Wrapper-URL z.B. <code>geograsim.at/heli-game</code> → lädt <code>App/sims/heli/game.html</code> in eingebettetem Modus.
|
||
<table>
|
||
<tr><th>Slug</th><th>Sim-Ordner</th><th>Status</th></tr>
|
||
<tr><td>heli</td><td><code>App/sims/heli/</code></td><td>live</td></tr>
|
||
<tr><td>klima-2d / klima-3d</td><td><code>App/sims/klima/</code></td><td>live</td></tr>
|
||
<tr><td>fluss</td><td><code>App/sims/fluss/</code></td><td>live</td></tr>
|
||
<tr><td>logistik</td><td><code>App/sims/logistik/</code></td><td>live</td></tr>
|
||
<tr><td>sonnensystem</td><td><code>App/sims/sonnensystem/</code></td><td>live</td></tr>
|
||
<tr><td>busfahrt</td><td><code>App/sims/busfahrt/</code></td><td>live</td></tr>
|
||
<tr><td>farmer</td><td><code>App/sims/farmer/</code></td><td>live</td></tr>
|
||
<tr><td>energiemanager</td><td><code>App/sims/energiemanager/</code></td><td>beta</td></tr>
|
||
<tr><td>entscheidungstag</td><td><code>App/sims/entscheidungstag/</code></td><td>beta</td></tr>
|
||
<tr><td>staustufen</td><td><code>App/sims/staustufen/</code></td><td>pausiert (Pivot zu Energiemanager)</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.1.6</span><span class="title">Plattform-Services (Glossar, Lehrplan, Mindmap)</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Service</th><th>Pfad</th></tr>
|
||
<tr><td>Glossar</td><td><code>App/pages/glossar.php</code> → URL <code>/glossar</code></td></tr>
|
||
<tr><td>Mindmap (Glossar-Querverweise)</td><td><code>App/pages/mindmap.php</code></td></tr>
|
||
<tr><td>Lehrplan</td><td><code>App/pages/lehrplan.php</code></td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry open">
|
||
<span class="code">N.1.7</span><span class="title">Aufräum-Kandidaten in <code>App/</code> (alte Top-Level-HTMLs) <span style="color:#c85c4a;font-weight:700">●LEG?</span></span>
|
||
<div class="body">
|
||
Diese Files liegen direkt in <code>App/</code> und sehen aus wie Legacy-Prototypen oder alte Standalone-Sims. <strong>Alle <span style="color:#c85c4a;font-weight:700">●LEG?</span> = Verdacht auf Lösch-Kandidat</strong> — bitte Thomas-Entscheidung:
|
||
<table>
|
||
<tr><th>Datei</th><th>Verdacht</th></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>energiemix.html</code></td><td>alte Standalone-Sim?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>erdbeben.html</code></td><td>alte Standalone-Sim?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>fluss.html</code></td><td>alte Standalone-Sim? (echte Sim liegt in <code>App/sims/fluss/</code>)</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>game.html</code> / <code>game-3d.html</code></td><td>Generische Wrapper? oder Legacy?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>heli.html</code></td><td>Vermutlich alte Standalone (echte Sim in <code>App/sims/heli/</code>)</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>lieferketten.html</code></td><td>alter Prototyp?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>regenwald.html</code></td><td>alter Prototyp?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>sim.html</code></td><td>Generischer Sim-Wrapper?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>stadt.html</code> / <code>stadt-editor.html</code></td><td>alte Sim?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>stilauswahl.html</code></td><td>?</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>tile-test.html</code></td><td>Map-Test, sicher dev-only</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>dashboard.html</code></td><td>Alter Lehrer-Dashboard? (heute ist es <code>teacher.html</code>)</td></tr>
|
||
</table>
|
||
<p style="margin-top:6px;font-size:0.82rem">
|
||
Atlas kann diese nicht von sich aus löschen — bitte Thomas prüfen welche tatsächlich noch verlinkt/genutzt sind.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry open">
|
||
<span class="code">N.1.8</span><span class="title">Weitere Legacy-Kandidaten außerhalb <code>App/</code> <span style="color:#c85c4a;font-weight:700">●LEG?</span></span>
|
||
<div class="body">
|
||
Thomas-Hinweis (Beispiel <code>file:///C:/xampp/htdocs/geograsim/index.html</code>) — neben <code>App/</code> liegen weitere alte Verzeichnisse/Dateien im Repo-Root:
|
||
<table>
|
||
<tr><th>Pfad (relativ zum Repo-Root)</th><th>Inhalt / Verdacht</th></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>/index.html</code></td><td>„Projektübersicht"-Seite im Repo-Root — vermutlich Vorgänger der heutigen Landingpage <code>App/index.html</code>. Wird vom Apache-Wrapper nicht ausgeliefert, könnte aber Verwirrung stiften.</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>App/dist/*</code></td><td>Alte Build-Output-HTMLs (<code>dashboard</code>, <code>energiemix</code>, <code>erdbeben (1)</code>, <code>game</code>, <code>game-3d</code>, <code>index (1)</code>, <code>lieferketten</code>, <code>regenwald</code>, <code>sim</code>, <code>stilauswahl</code>) — sieht nach altem Vite/Webpack-Build aus.</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>didaktik_geografie/</code></td><td>Eigenständige Mini-Site (index, syllabus, quellen, handbuch, presentation/, standalone.html). Inhalte vermutlich in <code>App/forschung/geografie-didaktik.html</code> und <code>App/forschung/presentation-geografie/</code> überführt.</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>didaktik_simulation/</code></td><td>Eigenständige Mini-Site (analog zu didaktik_geografie). Inhalte vermutlich in <code>App/forschung/lernen-durch-simulation.html</code> und <code>App/forschung/presentation-simulation/</code> überführt.</td></tr>
|
||
<tr><td><span style="color:#c85c4a;font-weight:700">●LEG?</span> <code>Konzept/</code></td><td>Planungsdokumente (<code>lehrplan-gw.html</code>, <code>lehrplan-simulation-mapping.html</code>, <code>projekt-todos.html</code>) — alte Arbeitsstände, vermutlich nicht mehr aktiv referenziert.</td></tr>
|
||
</table>
|
||
<p style="margin-top:6px;font-size:0.82rem">
|
||
Atlas-Empfehlung: vor dem Löschen <code>git log --diff-filter=A</code> + Volltextsuche „<code>/index.html</code>" / „<code>didaktik_</code>" im aktiven Code (App/) prüfen. Konkrete Lösch-Freigabe bitte Thomas geben.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>N.4 — Header- & Footer-Entwurf Landingpage (iPad-Referenz)</h3>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.4.0</span><span class="title">iPad-Bildschirmgrößen an österreichischen Schulen</span>
|
||
<div class="body">
|
||
Schulen verteilen meist Standard-iPads (kein Pro). Die CSS-Pixel-Breite ist <strong>geräteunabhängig</strong> identisch — egal ob 10,2" oder 10,9".
|
||
<table>
|
||
<tr><th>Modell</th><th>Physisch</th><th>CSS Landscape</th><th>CSS Portrait</th><th>Schul-Vorkommen</th></tr>
|
||
<tr><td>iPad 9 (2021, A13)</td><td>10,2"</td><td><strong>1080 × 810</strong></td><td>810 × 1080</td><td>häufigstes Schul-iPad</td></tr>
|
||
<tr><td>iPad 10 (2022, A14)</td><td>10,9"</td><td><strong>1180 × 820</strong></td><td>820 × 1180</td><td>neuere Klassensätze</td></tr>
|
||
<tr><td>iPad 7/8 (älter)</td><td>10,2"</td><td>1080 × 810</td><td>810 × 1080</td><td>Bestand</td></tr>
|
||
<tr><td>iPad mini 6</td><td>8,3"</td><td>1133 × 744</td><td>744 × 1133</td><td>selten</td></tr>
|
||
<tr><td>iPad Pro 11"</td><td>11"</td><td>1194 × 834</td><td>834 × 1194</td><td>einzelne Schulen</td></tr>
|
||
</table>
|
||
<p style="margin-top:6px;font-size:0.85rem">
|
||
<strong>Atlas-Referenz:</strong> Layout-Tests bei <code>1080 px Landscape</code> als Worst-Case, bei <code>1180 px</code> (Memory <code>reference_ipad_referenz.md</code>) 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.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">N.4.1</span><span class="title">Atlas-Empfehlung: Glossar bleibt <em>Catcher</em>, nicht im Header</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">
|
||
Die NAV-markierten Public-Pages auf der Landingpage sind <code>[P-02]</code> Handbuch, <code>[P-03]</code> Lehrplan, <code>[P-04]</code> Glossar, <code>[P-06]</code> Forschung-Index, <code>[P-13]</code> Kontakt, <code>[P-17]</code> 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.
|
||
</p>
|
||
<p style="font-size:0.85rem;margin-top:6px"><strong>Vorschlag:</strong></p>
|
||
<ul style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>Glossar bleibt als großer Hero-Pill</strong> (mit dynamischer Zahl, schon umgesetzt). Begründung: 164 bebilderte Einträge sind ein <em>einzigartiges Verkaufsargument</em> — als Mini-Link im Header verliert es Aufmerksamkeit. Als Pill (mit Emoji + Zahl) wirkt es als Werbe-Catcher und Verweis auf die Animations-Qualität dahinter.</li>
|
||
<li><strong>Lehrplan</strong> wandert vom Hero-Pill in den Header (er ist eine schmalere, faktischere Seite — gehört zur Hauptstruktur).</li>
|
||
<li><strong>Forschung</strong> wandert vom Footer in den Header (Lehrpersonen-Argument).</li>
|
||
<li><strong>Kontakt</strong> bleibt im Footer (Klassische Footer-Position, nicht erste Klickfläche).</li>
|
||
<li><strong>Handbuch + Anmelden</strong> wie bisher im Header.</li>
|
||
</ul>
|
||
<p style="font-size:0.85rem">
|
||
Lehrpersonen + Schüler*innen im Cockpit erreichen das Glossar weiterhin über ihre Modul-Cards (📚 Glossar pro Modul) — kein Verlust dort.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<div class="entry info">
|
||
<span class="code">N.4.2</span><span class="title">Header-Variante A — <em>alle NAV im Header</em> (eng, aber passt)</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem;margin-bottom:6px">7 Links + Logo + Anmelde-Button. Bei 1080 px CSS-Breite knapp passend (≈ 1060 px reine Inhaltsbreite), Wide-Layout für iPad 10.</p>
|
||
|
||
<p style="margin:8px 0 4px;font-size:0.72rem;color:#8a8a8a">▼ Live-Mockup bei <strong>1080 px</strong> (Standard-iPad Landscape):</p>
|
||
<div style="overflow-x:auto;border:1px solid #e0ddd4;border-radius:6px;background:#dceaf0">
|
||
<div style="width:1080px;background:#fff;border-bottom:1px solid rgba(0,0,0,.06);padding:.7rem 1.5rem;display:flex;align-items:center;gap:1.1rem;font-family:'Inter',sans-serif;font-size:.86rem">
|
||
<div style="display:flex;align-items:center;gap:.45rem">
|
||
<div style="width:30px;height:30px;background:#4a7c8a;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:900;font-size:.75rem">GG</div>
|
||
<strong style="color:#1f4e5a;font-size:.95rem">GeoGraSim</strong>
|
||
</div>
|
||
<a style="color:#1a1a1a;font-weight:600">Simulationen</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Lehrperson</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Lehrplan</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Glossar</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Forschung</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Handbuch</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Kontakt</a>
|
||
<div style="flex:1"></div>
|
||
<a style="padding:.42rem 1rem;background:#4a7c8a;color:#fff;border-radius:6px;font-weight:700;font-size:.78rem">Anmelden</a>
|
||
</div>
|
||
</div>
|
||
<p style="font-size:0.78rem;color:#8a8a8a;margin-top:4px">Breitenbudget: Logo ≈ 150 · Links 7 × ≈ 90 · Gaps 8 × ≈ 18 · Anmelden ≈ 120 → ≈ 1044 px. Passt bei 1080 px mit 36 px Reserve.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<div class="entry done">
|
||
<span class="code">N.4.3</span><span class="title">Header-Variante B — <em>Glossar bleibt Catcher</em> (Atlas-Empfehlung) ✓</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem;margin-bottom:6px">6 Links + Logo + Anmelde-Button. Komfortabel bei 1080 px, viel Atmungsraum bei 1180 px (iPad 10).</p>
|
||
|
||
<p style="margin:8px 0 4px;font-size:0.72rem;color:#8a8a8a">▼ Live-Mockup bei <strong>1080 px</strong> (Standard-iPad Landscape):</p>
|
||
<div style="overflow-x:auto;border:1px solid #e0ddd4;border-radius:6px;background:#dceaf0">
|
||
<div style="width:1080px;background:#fff;border-bottom:1px solid rgba(0,0,0,.06);padding:.7rem 1.5rem;display:flex;align-items:center;gap:1.4rem;font-family:'Inter',sans-serif;font-size:.86rem">
|
||
<div style="display:flex;align-items:center;gap:.45rem">
|
||
<div style="width:30px;height:30px;background:#4a7c8a;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:900;font-size:.75rem">GG</div>
|
||
<strong style="color:#1f4e5a;font-size:.95rem">GeoGraSim</strong>
|
||
</div>
|
||
<a style="color:#1a1a1a;font-weight:600">Simulationen</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Lehrperson</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Lehrplan</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Forschung</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Handbuch</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Kontakt</a>
|
||
<div style="flex:1"></div>
|
||
<a style="padding:.42rem 1rem;background:#4a7c8a;color:#fff;border-radius:6px;font-weight:700;font-size:.78rem">Anmelden</a>
|
||
</div>
|
||
</div>
|
||
<p style="font-size:0.78rem;color:#8a8a8a;margin-top:4px">Breitenbudget: Logo ≈ 150 · Links 6 × ≈ 90 · Gaps 7 × ≈ 22 · Anmelden ≈ 120 → ≈ 964 px. Bei 1080 px bleiben 116 px Atmungsraum — keine Drängelei.</p>
|
||
|
||
<p style="margin:14px 0 4px;font-size:0.72rem;color:#8a8a8a">▼ Glossar bleibt als großer Catcher-Pill direkt unter dem Hero-Titel (wie heute, mit dynamischer Zahl):</p>
|
||
<div style="border:1px solid #e0ddd4;border-radius:6px;background:#dceaf0;padding:18px">
|
||
<div style="font-family:'Inter',sans-serif">
|
||
<h1 style="font-size:1.8rem;font-weight:900;letter-spacing:-.02em;color:#1a1a1a;margin-bottom:6px">Geografie <em style="font-style:normal;color:#4a7c8a">erleben.</em> Nicht nur lesen.</h1>
|
||
<div style="display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.8rem">
|
||
<span style="display:inline-flex;align-items:center;gap:.35rem;padding:.4rem .85rem;background:#fff;border:1.5px solid rgba(31,75,55,.18);border-radius:99px;font-size:.78rem;font-weight:600;color:#1f4e5a">📋 Lehrplan-Bezug 1. - 4. Klasse</span>
|
||
<span style="display:inline-flex;align-items:center;gap:.35rem;padding:.4rem .85rem;background:#fff;border:1.5px solid #e8833a;border-radius:99px;font-size:.78rem;font-weight:600;color:#e8833a">📚 Glossar · 164 Begriffe — alle bebildert</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p style="font-size:0.82rem;margin-top:8px"><strong>Optional-Verstärkung:</strong> der Glossar-Pill bekommt eine orange-akzentuierte Border (wie oben skizziert) statt der Standard-Pill-Farbe, plus den Zusatz „<em>alle bebildert</em>". So sticht der Catcher-Effekt klar heraus.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<div class="entry info">
|
||
<span class="code">N.4.4</span><span class="title">Footer-Vorschlag (zweizeilig, klassisch + Forschungs-Reihe)</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem;margin-bottom:6px">Sekundäre NAV-Ziele unten — was im Header nicht passt oder hingehört (Pflicht-Links + Forschungs-Tiefe).</p>
|
||
|
||
<p style="margin:8px 0 4px;font-size:0.72rem;color:#8a8a8a">▼ Live-Mockup bei <strong>1080 px</strong>:</p>
|
||
<div style="overflow-x:auto;border:1px solid #e0ddd4;border-radius:6px;background:#dceaf0">
|
||
<div style="width:1080px;background:#fff;border-top:1px solid rgba(0,0,0,.04);padding:1.2rem 1.5rem;text-align:center;font-family:'Inter',sans-serif;font-size:.72rem;color:#8a8a8a">
|
||
<div style="margin-bottom:.5rem">
|
||
<div style="display:inline-block;width:30px;height:30px;background:#4a7c8a;border-radius:6px;opacity:.5;vertical-align:middle"></div>
|
||
</div>
|
||
<p style="margin-bottom:.4rem">
|
||
GeoGraSim — Schroffenegger & Mößlang, 2026
|
||
· <a style="color:#1f4e5a">Handbuch</a>
|
||
· <a style="color:#1f4e5a">Lehrplan</a>
|
||
· <a style="color:#1f4e5a">Glossar</a>
|
||
· <a style="color:#1f4e5a">Kontakt</a>
|
||
· <a style="color:#1f4e5a">Impressum</a>
|
||
· <a style="color:#1f4e5a">Datenschutz</a>
|
||
· <a style="color:#1f4e5a">Barrierefreiheit</a>
|
||
</p>
|
||
<p style="font-size:.62rem">
|
||
<a style="color:#1f4e5a">Forschung-Übersicht</a>
|
||
· <a style="color:#1f4e5a">Aktueller Forschungsstand GW-Didaktik</a>
|
||
· <a style="color:#1f4e5a">Literatur GW-Didaktik</a>
|
||
· <a style="color:#1f4e5a">Simulationen im Unterricht</a>
|
||
· <a style="color:#1f4e5a">Literatur Simulation</a>
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<p style="font-size:0.82rem;margin-top:6px">
|
||
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.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<div class="entry done">
|
||
<span class="code">N.4.5</span><span class="title">Entscheidung Thomas — Variante B umgesetzt ✓ (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „machen wir deine empfehlung". → Variante B umgesetzt:
|
||
<ul style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>App/index.html</strong>: Hauptnav um 3 Links erweitert — Reihenfolge <code>Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden</code>. Logo + Auth-Status wie bisher.</li>
|
||
<li><strong>Glossar-Pill als Catcher</strong>: neue CSS-Klasse <code>.hero-pill.catcher</code> mit Orange-Border (<code>#e8833a</code>). Text auf „📚 Glossar · <span data-glossar-count>164</span> Begriffe — alle bebildert" erweitert. Zahl bleibt dynamisch aus DB.</li>
|
||
<li><strong>App/handbuch.html</strong>: Hauptnav identisch übernommen (gleiche Reihenfolge + neue Links), damit Header-Konsistenz zwischen Landingpage und Handbuch gewahrt bleibt. <code>active</code>-Marker bleibt auf „Handbuch".</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Damit sind 2 von 7 öffentlichen Seiten (Landingpage + Handbuch) auf der neuen Hauptnav. Verbleibende N.3.2-Kandidaten: <code>kontakt.html</code> · <code>impressum.html</code> · <code>datenschutz.html</code> · <code>barrierefreiheit.html</code> · <code>ueber.html</code> (das jetzt Redirect ist, OK). Atlas wartet auf Thomas-Freigabe für diese Sammel-Migration (eigene Iteration).
|
||
</div>
|
||
</div>
|
||
|
||
<h3>N.5 — Lehrplan-Nav-Harmonisierung (Vorschlag)</h3>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.5.0</span><span class="title">Befund — heutiger Stand</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">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".</p>
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Doppelte Nav-Welt</strong>: Public-Hauptnav (Logo · Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden) <em>fehlt</em> auf Lehrplan-Seite. Stattdessen eigene <code>.lp-topbar</code> mit Logo + Easy-Pill + Country-Picker + Simulationen + Glossar + Anmelden — ist eine andere Menüstruktur, die User aus dem öffentlichen Schema rauswirft.</li>
|
||
<li><strong>Land-Doppelung</strong>: Country-Picker im Topbar <em>plus</em> Land-Chip-Reihe (🌐 Alle / 🇦🇹 AT / 🇩🇪 DE / 🇨🇭 CH / 🇱🇮 LI) als Pill-Filter darunter. Beide setzen denselben State (<code>state.country</code>).</li>
|
||
<li><strong>Filter-Verwirrung</strong>: bei AT-Wahl wird nur <code>anchor_type='fach'</code> nach Land gefiltert. Übergreifende Themen + Anker aus anderen Fächern bleiben sichtbar — sie sind AT-derived, didaktisch land-agnostisch nutzbar (siehe <code>lehrplan.php:686-697</code>). 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.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">N.5.1</span><span class="title">Atlas-Konzept — zweistufige Nav: Standard oben + Kontext-Sub-Nav darunter</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem"><strong>Thomas-Wunsch verstanden</strong>: die <em>Standard-Menüleiste außerhalb</em> (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.</p>
|
||
|
||
<p style="font-size:0.85rem;margin-top:8px"><strong>Vorschlag-Architektur:</strong></p>
|
||
<table>
|
||
<tr><th>Ebene</th><th>Inhalt</th><th>Wo gleich?</th></tr>
|
||
<tr><td><strong>1. Standard-Hauptnav</strong></td><td>Logo · Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden</td><td>Überall im öffentlichen Bereich identisch (Landingpage + alle Subpages)</td></tr>
|
||
<tr><td><strong>2. Kontext-Sub-Nav</strong> (nur auf „Erkundungs"-Seiten)</td><td>Tab-Reihe (Lehrplan · Glossar · Simulationen, aktiver Tab markiert) + Country-Picker rechts</td><td>Lehrplan, Glossar, Simulationen-Übersicht (gemeinsamer Tab-Cluster)</td></tr>
|
||
<tr><td><strong>3. Filter-Pills</strong> (im Content)</td><td>Thema + Typ (NICHT mehr Land — Land kommt aus dem Picker oben)</td><td>Pro Seite spezifisch</td></tr>
|
||
</table>
|
||
|
||
<p style="margin:14px 0 4px;font-size:0.72rem;color:#8a8a8a">▼ Mockup zwei-zeilige Nav für Lehrplan bei <strong>1080 px</strong>:</p>
|
||
<div style="overflow-x:auto;border:1px solid #e0ddd4;border-radius:6px;background:#dceaf0">
|
||
<!-- Standard-Hauptnav -->
|
||
<div style="width:1080px;background:#fff;border-bottom:1px solid rgba(0,0,0,.06);padding:.7rem 1.5rem;display:flex;align-items:center;gap:1.4rem;font-family:'Inter',sans-serif;font-size:.86rem">
|
||
<div style="display:flex;align-items:center;gap:.45rem">
|
||
<div style="width:30px;height:30px;background:#4a7c8a;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:900;font-size:.75rem">GG</div>
|
||
<strong style="color:#1f4e5a;font-size:.95rem">GeoGraSim</strong>
|
||
</div>
|
||
<a style="color:#1a1a1a;font-weight:600">Simulationen</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Lehrperson</a>
|
||
<a style="color:#1a1a1a;font-weight:700;border-bottom:3px solid #4a7c8a;padding-bottom:2px">Lehrplan</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Forschung</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Handbuch</a>
|
||
<a style="color:#1a1a1a;font-weight:600">Kontakt</a>
|
||
<div style="flex:1"></div>
|
||
<a style="padding:.42rem 1rem;background:#4a7c8a;color:#fff;border-radius:6px;font-weight:700;font-size:.78rem">Anmelden</a>
|
||
</div>
|
||
<!-- Kontext-Sub-Nav -->
|
||
<div style="width:1080px;background:#f5f3ea;border-bottom:1px solid rgba(0,0,0,.08);padding:.5rem 1.5rem;display:flex;align-items:center;gap:.8rem;font-family:'Inter',sans-serif;font-size:.82rem">
|
||
<span style="font-size:.62rem;color:#8a8a8a;font-weight:700;text-transform:uppercase;letter-spacing:.06em;margin-right:.4rem">Erkunden</span>
|
||
<a style="color:#1f4e5a;font-weight:800;padding:.35rem .8rem;background:#fff;border-radius:6px;box-shadow:0 1px 3px rgba(0,0,0,.05)">📋 Lehrplan</a>
|
||
<a style="color:#5a5a5a;font-weight:600;padding:.35rem .8rem">📚 Glossar</a>
|
||
<a style="color:#5a5a5a;font-weight:600;padding:.35rem .8rem">🎮 Simulationen</a>
|
||
<div style="flex:1"></div>
|
||
<span style="font-size:.7rem;color:#8a8a8a">Land:</span>
|
||
<div style="background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:6px;padding:.25rem .6rem;display:inline-flex;align-items:center;gap:.35rem;font-weight:600;color:#1f4e5a">🇦🇹 Österreich ▾</div>
|
||
</div>
|
||
</div>
|
||
<p style="font-size:0.78rem;color:#8a8a8a;margin-top:4px">
|
||
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.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">N.5.2</span><span class="title">Filter-Harmonisierung — Land-Chips raus, Pills nur noch Thema + Typ</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">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:</p>
|
||
|
||
<p style="margin:8px 0 4px;font-size:0.72rem;color:#8a8a8a">▼ Mockup Filter-Bereich (ohne Land-Reihe):</p>
|
||
<div style="border:1px solid #e0ddd4;border-radius:6px;background:#fff;padding:14px 18px;font-family:'Inter',sans-serif">
|
||
<div style="font-size:0.7rem;color:#8a8a8a;font-weight:700;text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px">
|
||
Anzeige: <strong style="color:#1f4e5a">🇦🇹 Österreich</strong> · 47 Anker passend zum Lehrplan AT + 18 fächerübergreifend
|
||
</div>
|
||
<div style="display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:6px">
|
||
<span style="font-size:.7rem;color:#5a5a5a;font-weight:700;min-width:60px">Thema</span>
|
||
<span style="background:#1f4e5a;color:#fff;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:700">Alle 8</span>
|
||
<span style="background:#fff;border:1px solid #d0d0d0;color:#5a5a5a;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:600">Klima</span>
|
||
<span style="background:#fff;border:1px solid #d0d0d0;color:#5a5a5a;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:600">Raum</span>
|
||
<span style="background:#fff;border:1px solid #d0d0d0;color:#5a5a5a;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:600">Natur</span>
|
||
<span style="background:#fff;border:1px solid #d0d0d0;color:#5a5a5a;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:600">Gesellschaft</span>
|
||
</div>
|
||
<div style="display:flex;align-items:center;gap:.5rem;flex-wrap:wrap">
|
||
<span style="font-size:.7rem;color:#5a5a5a;font-weight:700;min-width:60px">Typ</span>
|
||
<span style="background:#1f4e5a;color:#fff;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:700">Alle</span>
|
||
<span style="background:#fff;border:1px solid #d0d0d0;color:#5a5a5a;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:600">Fachbezug</span>
|
||
<span style="background:#fff;border:1px solid #d0d0d0;color:#5a5a5a;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:600">Fächerübergreifend</span>
|
||
<span style="background:#fff;border:1px solid #d0d0d0;color:#5a5a5a;padding:.25rem .7rem;border-radius:99px;font-size:.75rem;font-weight:600">Anderes Fach</span>
|
||
</div>
|
||
</div>
|
||
<p style="font-size:0.82rem;margin-top:8px">
|
||
Statt Land-Chip-Reihe: eine <strong>Ergebnis-Zeile</strong> 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.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">N.5.3</span><span class="title">Anchor-Filter-Logik geklärt — Variante (a) Transparenz-Zeile + 🌐-Badge ✓ (2026-05-28)</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">Heutige Logik (<code>lehrplan.php:685-697</code>):</p>
|
||
<ul style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><code>anchor_type='fach'</code> → strikt nach Land gefiltert (AT-Wahl → nur AT)</li>
|
||
<li><code>anchor_type='uebergreifendes_thema'</code> + <code>anchor_type='anderes_fach'</code> → <strong>land-unabhängig immer sichtbar</strong> (Begründung: aus AT-Lehrplan abgeleitet, universell nutzbar)</li>
|
||
</ul>
|
||
<p style="font-size:0.85rem"><strong>Folge fürs Erleben</strong>: 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.</p>
|
||
<p style="font-size:0.85rem;margin-top:6px"><strong>Atlas-Empfehlung — drei Optionen, bitte Thomas wählen:</strong></p>
|
||
<ul style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>(a)</strong> Ergebnis-Zeile transparent machen (siehe N.5.2): „47 AT-Anker + 18 fächerübergreifend". Fächerübergreifende Anker bekommen Badge „🌐 Universell" statt Land-Flagge. <em>Wenig Code-Aufwand, klärt Erwartung sofort.</em></li>
|
||
<li><strong>(b)</strong> Strikt: bei AT-Wahl ALLE Anker (auch übergreifende) auf AT-Quelle prüfen — DE/CH/LI-Inhalte komplett ausblenden. Risiko: viele übergreifende Anker fallen weg, weil sie keine Country-Markierung haben. <em>Sauberer aus User-Sicht, aber Inhaltsverlust.</em></li>
|
||
<li><strong>(c)</strong> Zwei separate Sektionen pro Kompetenz: „Lehrplan-Anker für Österreich" + „Fächerübergreifend (alle Länder)". <em>Visuell klar getrennt, mehr Layout-Arbeit.</em></li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">N.5.4</span><span class="title">Übertragung auf Glossar + Simulationen-Übersicht ✓ (2026-05-28)</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">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:</p>
|
||
<ul style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>Glossar</strong> [P-04]: Sub-Nav „Lehrplan / Glossar (aktiv) / Simulationen" + Country-Picker (für Easy-Sprache-Status / ggf. landesabhängige Begriffe).</li>
|
||
<li><strong>Simulationen-Übersicht</strong> [<code>pages/simulationen.php</code>]: gleicher Sub-Nav, dort vielleicht ohne Country-Picker (Sims sind country-agnostisch).</li>
|
||
</ul>
|
||
<p style="font-size:0.85rem">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.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">N.5.5</span><span class="title">Entscheidung Thomas — alle 3 nach Atlas-Empfehlung umgesetzt ✓ (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „überall deine Empfehlung … setzt alles um".
|
||
<ol style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>Architektur</strong> N.5.1 — zweistufige Nav umgesetzt via PHP-Include (siehe L.35).</li>
|
||
<li><strong>Filter-Logik</strong> Variante (a) — Transparenz-Zeile oben + 🌐-Badge auf Universell-Anker.</li>
|
||
<li><strong>Übertragung</strong> — Sub-Nav auf Lehrplan + Glossar + Simulationen. Country-Picker nur auf Lehrplan (Atlas-Empfehlung übernommen).</li>
|
||
</ol>
|
||
Zusätzlich-Auftrag: <strong>Simulationen-Übersicht ohne Direkt-Start</strong>. Start-Button → „🔑 Mit Lehrperson nutzen" → Login.
|
||
</div>
|
||
</div>
|
||
|
||
<h3>N.6 — Header-Konsistenz-Audit (öffentliche Seiten)</h3>
|
||
|
||
<div class="entry info">
|
||
<span class="code">N.6.0</span><span class="title">Befund — heute existieren 5 verschiedene Header-Varianten</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">Thomas-Befund (Screenshot-Vergleich): „Menü auf der Landingpage anders aussieht wie unter Lehrplan? bei Forschung wieder anders, bei Kontakt nochmals anders."</p>
|
||
<table>
|
||
<tr><th>Variante</th><th>Wo</th><th>Layout</th><th>Status</th></tr>
|
||
<tr><td><strong>A — Landingpage-Hauptnav</strong> (<code>.nav</code> + <code>.w</code>)</td><td>index.html</td><td>Logo links, alle 6 Links + Anmelden rechts via <code>justify-content: space-between</code>, leichter Hover-Background</td><td>Referenz (Thomas: „diese sollten immer so bleiben")</td></tr>
|
||
<tr><td><strong>B — Handbuch-Hauptnav</strong> (<code>.nav</code> + <code>.w-nav</code>)</td><td>handbuch.html</td><td>Wie A, eigene Class-Names, leicht andere Padding-Werte</td><td>fast identisch zu A — kosmetische Drift</td></tr>
|
||
<tr><td><strong>C — Forschung-Topbar</strong> (<code>.nav</code> + <code>.w</code> mit „Über / Handbuch / Forschung")</td><td>forschung/index.html</td><td>Wie A, aber alte Link-Menge (vor Variante B-Umstellung)</td><td>fehlende Links: Lehrplan, Kontakt; „Über" sollte raus (redirect zu Handbuch)</td></tr>
|
||
<tr><td><strong>D — .pub-nav</strong> (PHP-Snippet) — JETZT 1:1 wie A</td><td>lehrplan.php · glossar.php · simulationen.php</td><td>Logo links, Links + Anmelden rechts via space-between (siehe L.36)</td><td>✓ Soeben angeglichen — Layout-Bug behoben</td></tr>
|
||
<tr><td><strong>E — .topbar</strong> (small-button-Stil)</td><td>kontakt.html · impressum.html · datenschutz.html · barrierefreiheit.html · marktplatz-einreichung.html</td><td>Logo links, Spacer, kleine <code>.btn-sm</code>-Buttons rechts (Startseite / Über / Handbuch / Impressum)</td><td>Eigene Welt — Schmalbild-Footer-Pages, alte Link-Menge</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">N.6.1</span><span class="title">Sofortfix — <code>public_topnav.php</code> auf Landingpage-Optik angeglichen ✓ (2026-05-28)</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">Ursache des Drifts beim Lehrplan-Header: meine Snippet-CSS hatte <code>.pub-links { flex: 1; }</code> — das ließ die Links links neben dem Logo „kleben" statt rechts gebündelt zu erscheinen.</p>
|
||
<p style="font-size:0.85rem"><strong>Fix</strong>: HTML-Struktur — Anmelden-Button wandert IN <code>.pub-links</code> (statt daneben). CSS — <code>justify-content: space-between</code> wie auf Landingpage, plus übernommene Optik-Tokens: gleicher Backdrop-Blur, gleiche Padding-Werte, gleiche Hover-Backgrounds (<code>rgba(0,0,0,.04)</code>), gleiche Active-Hervorhebung (<code>rgba(74,124,138,.12)</code> als Hintergrund statt Unterstrich).</p>
|
||
<p style="font-size:0.85rem">Damit sind Variante A (Landingpage), B (Handbuch) und D (lehrplan/glossar/simulationen via Snippet) jetzt visuell deckungsgleich.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">N.6.2</span><span class="title">Umgesetzt ✓ — alle 7 Subpages auf <code>.pub-nav</code> via Snippet-Include (2026-05-28)</span>
|
||
<div class="body">
|
||
<p style="font-size:0.85rem">Verbleibende Inkonsistenzen (Variante C + E):</p>
|
||
<ul style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>forschung/index.html</strong> + <strong>forschung/literatur.html</strong>: alte Hauptnav-Link-Menge (Über/Handbuch/Forschung), keine Lehrplan/Kontakt.</li>
|
||
<li><strong>kontakt.html · impressum.html · datenschutz.html · barrierefreiheit.html · marktplatz-einreichung.html</strong>: komplett eigene <code>.topbar</code>-Variante mit Small-Buttons (Startseite/Über/Handbuch/Impressum) — komplett anders als Landingpage.</li>
|
||
</ul>
|
||
<p style="font-size:0.85rem"><strong>Atlas-Vorschlag — zwei Optionen:</strong></p>
|
||
<ul style="margin:4px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>(a) Hart einkopieren</strong>: in jede .html-Datei das Landingpage-Nav-HTML + CSS einsetzen. Schnell, aber 7× Copy-Paste; jede künftige Änderung 7× zu pflegen.</li>
|
||
<li><strong>(b) Konversion zu .php + Snippet-Include</strong>: jede betroffene .html wird zu .php umbenannt (Front-Controller kennt beide Routen, kein URL-Bruch), dann include <code>public_topnav.php</code>. Saubere Single-Source-of-Truth — entspricht dem Pattern, das wir mit lehrplan/glossar/simulationen schon haben.</li>
|
||
</ul>
|
||
<strong>Atlas-Empfehlung</strong>: <strong>(b)</strong> — DRY, künftige Nav-Änderungen treffen alle Seiten gleichzeitig. Aufwand: 7 Dateien renamen + Header-Block 7× durch Include ersetzen. URLs bleiben durch Front-Controller-Routing identisch. Wenn Thomas freigibt, baue ich's in einem Schwung.
|
||
</div>
|
||
</div>
|
||
|
||
<h3>N.2 — Header-Inkonsistenz im Detail</h3>
|
||
|
||
<div class="entry open">
|
||
<span class="code">N.2.1</span><span class="title">Drei Header-Varianten heute</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Typ</th><th>Wo</th><th>Inhalt</th></tr>
|
||
<tr><td>✓ <strong>Hauptnav</strong> (<code><nav class="nav"></code>)</td><td>index.html</td><td>Logo + Simulationen | Lehrperson | Über | Handbuch + Auth-Status</td></tr>
|
||
<tr><td>△ <strong>Eigene topbar</strong></td><td>ueber/kontakt/impressum/datenschutz/barrierefreiheit + admin-* + profil/teacher/schueler</td><td>Logo + paar Buttons (variieren pro Seite)</td></tr>
|
||
<tr><td>✗ <strong>Kein Header</strong></td><td>handbuch/login/admin/marktplatz-einreichung/stilauswahl/tile-test usw.</td><td>Nichts. User muss Browser-Back nutzen.</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>N.3 — Verbesserungs-Vorschlag</h3>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">N.3.1</span><span class="title">Drei klar getrennte Header-Klassen</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Bereich</th><th>Header</th><th>Inhalt</th></tr>
|
||
<tr><td><strong>Public</strong> (Marketing/Info)</td><td>einheitliche <strong>Hauptnav</strong></td><td>Logo · Simulationen · Lehrperson · Über · Handbuch · Anmelden/Profil</td></tr>
|
||
<tr><td><strong>Lehrer-/Schüler-Cockpit</strong></td><td><strong>App-Topbar</strong> (eigener Look, aber konsistent)</td><td>Logo · Klassen-/Modul-Auswahl · Profil · Abmelden</td></tr>
|
||
<tr><td><strong>Admin</strong></td><td><strong>Admin-Topbar</strong> (eigener Look, klar abgegrenzt)</td><td>Logo „Admin" · Reiter (Sims/Module/Lizenzen/Styleguide) · Logout</td></tr>
|
||
</table>
|
||
<p style="margin-top:6px;font-size:0.82rem">
|
||
Innerhalb jeder Klasse: konsistenter Look. Zwischen Klassen: bewusster visueller Schnitt (Farbe / Kontext-Label).
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">N.3.2</span><span class="title">Konkret zu reparieren (öffentlicher Bereich)</span>
|
||
<div class="body">
|
||
Die folgenden Info-Seiten brauchen die <strong>Hauptnav</strong> aus index.html:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><code>ueber.html</code></li>
|
||
<li><code>handbuch.html</code></li>
|
||
<li><code>kontakt.html</code></li>
|
||
<li><code>impressum.html</code></li>
|
||
<li><code>datenschutz.html</code></li>
|
||
<li><code>barrierefreiheit.html</code></li>
|
||
</ul>
|
||
<p style="margin-top:6px;font-size:0.82rem">
|
||
Pragmatischste Lösung: gemeinsames Header-Snippet (z.B. <code>App/_partials/nav.html</code> oder via JS-Include).
|
||
Erspart 6× Copy-Paste und macht künftige Änderungen ein-stellig.
|
||
Atlas wartet auf Thomas-Vorgabe ob:
|
||
<strong>(a)</strong> Header in jede Seite hart einkopieren (einfach, redundant) oder
|
||
<strong>(b)</strong> kleines JS-Snippet das das Header-HTML injiziert (DRY, etwas Magie).
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">N.3.3</span><span class="title">Login-Seite + Marktplatz-Einreichung</span>
|
||
<div class="body">
|
||
Login-Seite sollte mindestens einen <strong>„zurück zur Startseite"-Link</strong> haben — sonst kein Weg raus außer Browser-Zurück.
|
||
Marktplatz-Einreichung: laut Memory soll später Auth-pflichtig werden — bis dahin sollte mindestens die Hauptnav drin sein.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<h2>K · Konsistenz-Matrix (bei jeder Änderung prüfen)</h2>
|
||
|
||
<div class="entry info">
|
||
<span class="code">K.0</span><span class="title">Grundregel</span>
|
||
<div class="body">
|
||
GeoGraSim ist <strong>kein isoliertes Modul-Sammelsurium</strong>, sondern ein vernetztes System.
|
||
Eine Änderung an einem Modul betrifft fast immer mehrere andere Stellen. Vor jedem Commit wird diese Übersicht durchgegangen.
|
||
Die Liste wächst mit jeder neuen Erkenntnis — bitte erweitern, wenn ein Konsistenz-Problem entdeckt wird.
|
||
</div>
|
||
</div>
|
||
|
||
<h3>K.1 — Komponenten-Landkarte (was hängt mit was zusammen)</h3>
|
||
|
||
<div class="entry info">
|
||
<span class="code">K.1.1</span><span class="title">Bausteine</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Komponente</th><th>Wo lebt sie</th><th>Wer schreibt</th><th>Wer liest</th></tr>
|
||
<tr><td><strong>Module (Simulationen)</strong></td>
|
||
<td><code>App/sims/<slug>/</code></td>
|
||
<td>Modul-Instanz (Atlas integriert)</td>
|
||
<td>Schüler*in (Spiel), Lehrperson (Cockpit), Auswertung, Handbuch</td></tr>
|
||
<tr><td><strong>Modul-Metadaten</strong></td>
|
||
<td>DB <code>module_info</code></td>
|
||
<td>Admin</td>
|
||
<td>Cockpit, Glossar-Link, Lehrplan-Link, Handbuch</td></tr>
|
||
<tr><td><strong>Modul-Defaults (Schwierigkeit/Settings)</strong></td>
|
||
<td>DB <code>game_levels</code> + <code>sims/<slug>/admin-fields.json</code></td>
|
||
<td>Admin</td>
|
||
<td>Modul-Engine beim Start, Lehrer-Override-UI</td></tr>
|
||
<tr><td><strong>Lehrer-Auftrag (Override pro Klasse)</strong></td>
|
||
<td>DB <code>class_assignments</code></td>
|
||
<td>Lehrperson</td>
|
||
<td>Modul-Engine beim Start, Schüler-Sicht (was ist aktiv)</td></tr>
|
||
<tr><td><strong>Lehrplan-Anker</strong></td>
|
||
<td>DB <code>kompetenzen</code> + <code>kompetenz_modules</code></td>
|
||
<td>Admin / Lehrplan-Instanz</td>
|
||
<td>Lehrer-Cockpit (Anker-Filter), Auswertung, Modul-Karte, Handbuch</td></tr>
|
||
<tr><td><strong>Glossar</strong></td>
|
||
<td>DB <code>glossar</code> + <code>glossar_modules</code></td>
|
||
<td>Glossar-Instanz / Admin</td>
|
||
<td>Module (Tooltips), Mindmap, Handbuch, Lehrplan-Detail</td></tr>
|
||
<tr><td><strong>Handbuch</strong></td>
|
||
<td><code>App/handbuch.html</code> (statisch) + Modul-Detail-Seiten</td>
|
||
<td>Manuell (Thomas + Atlas)</td>
|
||
<td>Lehrperson, Eltern, Schulleitung</td></tr>
|
||
<tr><td><strong>Schüler-Ergebnis</strong></td>
|
||
<td>DB <code>assessments</code>, <code>assessment_answers</code>, <code>player_progress</code></td>
|
||
<td>Modul-Engine (am Ende der Sitzung)</td>
|
||
<td>Lehrer-Auswertung, Schüler-Lerngeschichte</td></tr>
|
||
<tr><td><strong>Live-Telemetry</strong></td>
|
||
<td>(V2: <code>telemetry_events_v2</code>)</td>
|
||
<td>Modul-Engine während Sitzung</td>
|
||
<td>Lehrer-Live-Dashboard</td></tr>
|
||
<tr><td><strong>Klassenliste mit A11y-Flags</strong></td>
|
||
<td>DB <code>students</code></td>
|
||
<td>Lehrperson (Klassenliste-Tab)</td>
|
||
<td>Modul-Engine (Profil lesen), Auswertung, Schüler-UI-Defaults</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>K.2 — Datenflüsse (wer sendet was an wen)</h3>
|
||
|
||
<div class="entry info">
|
||
<span class="code">K.2.1</span><span class="title">Modul → Plattform (während Sitzung)</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Datum</th><th>Wann</th><th>Empfänger-View</th></tr>
|
||
<tr><td>Heartbeat (Phase, Score, Zeit)</td><td>alle 10–30s</td><td>Lehrer Live-Dashboard</td></tr>
|
||
<tr><td>Milestone (definierter Fortschritt)</td><td>bei jedem Erfolgs-Punkt</td><td>Lehrer Live-Dashboard, Auswertung</td></tr>
|
||
<tr><td>Stuck-Signal</td><td>nach 90s Inaktivität</td><td>Lehrer Live-Dashboard (orange Warning)</td></tr>
|
||
<tr><td>Zwischenstand (Resume-State)</td><td>bei Bedarf, ca. alle 30s</td><td>Modul-Engine beim nächsten Start (Resume)</td></tr>
|
||
<tr><td>Accessibility-Blocker</td><td>wenn A11y-Hindernis</td><td>Lehrer Live-Dashboard (rot, Sofort-Alert)</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">K.2.2</span><span class="title">Modul → Plattform (am Ende der Sitzung)</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Datum</th><th>Empfänger-View</th></tr>
|
||
<tr><td>Score / ScoreMax</td><td>Auswertung, Lerngeschichte, Level-Unlock-Berechnung</td></tr>
|
||
<tr><td>Dauer (Sekunden)</td><td>Auswertung, Schulungs-Statistik</td></tr>
|
||
<tr><td>Lehrplan-Coverage (pro Anker: full/partial/none)</td><td>Lehrplan-Fortschritt pro Schüler*in, Klassen-Auswertung</td></tr>
|
||
<tr><td>Freitext-Antworten (Reflexionsfragen)</td><td>Lehrer-Auswertung (mit Klarname)</td></tr>
|
||
<tr><td>Artefakte (erzeugte Bilder/Karten)</td><td>Auswertung als Anhang</td></tr>
|
||
<tr><td>Modul-spezifische Kennzahlen</td><td>Modul-Detail-Auswertung</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">K.2.3</span><span class="title">Lehrperson → Modul (vor Sitzung)</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Datum</th><th>Wie ins Modul</th></tr>
|
||
<tr><td>Auftrag-Schwierigkeit (Level)</td><td>URL-Param <code>difficulty</code></td></tr>
|
||
<tr><td>Auftrag-Modus (free / teacher_started / assessment / demo)</td><td>URL-Param <code>mode</code></td></tr>
|
||
<tr><td>Schüler*in-Profil (Avatar, Easy-Sprache, Nachteilsausgleich, A11y)</td><td>API <code>/api/student/me</code></td></tr>
|
||
<tr><td>Klassen-Settings (V3: weitere Overrides)</td><td>Auftrag-Custom-Params (geplant)</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">K.2.4</span><span class="title">Admin → Plattform/Module</span>
|
||
<div class="body">
|
||
<table>
|
||
<tr><th>Datum</th><th>Wo gepflegt</th><th>Effekt</th></tr>
|
||
<tr><td>Modul-Registrierung (Slug, Icon, Card-Bild)</td><td><code>admin-modules.html</code></td><td>Modul-Karte, Cockpit-Liste</td></tr>
|
||
<tr><td>Default-Schwierigkeit / Parameter</td><td><code>admin-levels.html</code> + <code>admin-fields.json</code></td><td>Modul-Engine bei free-Modus</td></tr>
|
||
<tr><td>Klassen-Freigabe (welche Module für welche Klasse)</td><td>derzeit Admin, später Lehrer</td><td>Schüler-Cockpit Modul-Liste</td></tr>
|
||
<tr><td>Lehrplan-Anker (Pool)</td><td>Lehrplan-Verwaltung</td><td>Modul-Manifest, Auswertung</td></tr>
|
||
<tr><td>Glossar-Einträge</td><td>Glossar-Verwaltung</td><td>Modul-Tooltips, Mindmap</td></tr>
|
||
<tr><td>Lizenzen / Schulkonten</td><td><code>admin-licenses.html</code></td><td>Lehrer-Registrierung</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>K.3 — „Wenn du X änderst, prüfe auch Y" (Checkliste vor jedem Commit)</h3>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.1</span><span class="title">Modul-Mechanik geändert (Schwierigkeit, Aufgaben, Levels)</span>
|
||
<div class="body">
|
||
Dann prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>📋 <strong>Lehrplan-Anker</strong>: stimmt das Coverage-Mapping noch? (Modul vermittelt die gleichen Kompetenzen wie vorher?)</li>
|
||
<li>📚 <strong>Handbuch</strong>: ist die Modul-Beschreibung + 45-Minuten-Stundenentwurf noch aktuell?</li>
|
||
<li>🎯 <strong>Admin-Defaults</strong>: in <code>admin-fields.json</code> + DB <code>game_levels</code> noch passend?</li>
|
||
<li>👤 <strong>Lehrer-Auftrag-UI</strong>: zeigen die Schwierigkeitsstufen noch das, was wirklich da ist?</li>
|
||
<li>📊 <strong>Auswertung</strong>: Score-Skala und Milestones noch konsistent?</li>
|
||
<li>🗨️ <strong>Modul-Karte / Beschreibung</strong>: Kurztext im Cockpit noch zutreffend?</li>
|
||
<li>📖 <strong>Glossar</strong>: alle im Modul genutzten Fachbegriffe noch in der Glossar-DB?</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.2</span><span class="title">Lehrplan-Anker geändert/ergänzt</span>
|
||
<div class="body">
|
||
Dann prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>🎮 Alle <strong>Module</strong> mit Verweis auf den Anker → noch sinnvoll?</li>
|
||
<li>📊 <strong>Auswertung</strong>: alte Coverage-Daten in <code>lehrplan_progress</code> referenzieren evtl. nicht-existente Codes</li>
|
||
<li>📚 <strong>Handbuch</strong>-Lehrplan-Sektion</li>
|
||
<li>👤 <strong>Lehrer-Cockpit</strong>: Anker-Filter zeigt alle aktiven Codes?</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.3</span><span class="title">Glossar-Eintrag geändert/gelöscht</span>
|
||
<div class="body">
|
||
Dann prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>🎮 Alle <strong>Module</strong>, die <code>data-glossar="<slug>"</code> verwenden → Tooltip noch sinnvoll?</li>
|
||
<li>🕸️ <strong>Mindmap</strong>: Querverweise stimmen noch?</li>
|
||
<li>📚 <strong>Handbuch</strong> + Modul-Detailseite: Begriff erwähnt?</li>
|
||
<li>📋 <strong>Lehrplan-Detail</strong>: Begriff als „typisches Vokabular" verlinkt?</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.4</span><span class="title">Neues Modul angelegt</span>
|
||
<div class="body">
|
||
Dann anlegen/prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>🎯 Eintrag in DB <code>module_info</code></li>
|
||
<li>🎯 <code>game_levels</code>-Einträge für Standard-Schwierigkeitsstufen</li>
|
||
<li>🎯 <code>admin-fields.json</code> mit konfigurierbaren Parametern</li>
|
||
<li>📋 <strong>Lehrplan-Anker</strong> deklariert + Mapping in <code>kompetenz_modules</code></li>
|
||
<li>📖 <strong>Glossar-Schwerpunkte</strong> deklariert + Verknüpfung in <code>glossar_modules</code></li>
|
||
<li>📚 <strong>Handbuch</strong>-Seite + 45-Min-Stundenentwurf</li>
|
||
<li>🖼️ <strong>Card-Bild</strong> (1792×1024) im Flat-Scandinavian-Stil</li>
|
||
<li>🌐 <strong>Cockpit-Liste</strong> Schüler*in / Lehrperson — Modul taucht auf?</li>
|
||
<li>📊 <strong>Auswertung</strong>-View hat Spalte für dieses Modul?</li>
|
||
<li>♿ <strong>Easy-Sprache</strong>-Variante aller UI-Texte</li>
|
||
<li>♿ <strong>A11y</strong>-Check (Kontrast, Keyboard, Reduced-Motion)</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.5</span><span class="title">Schüler-Daten-Schema geändert (z.B. neue Spalte in <code>students</code>)</span>
|
||
<div class="body">
|
||
Dann prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>👤 <strong>Klassenliste-Tab</strong>: zeigt das neue Feld?</li>
|
||
<li>👤 <strong>Lehrer-Schüler-Anlegen-Modal</strong>: Feld erfassbar?</li>
|
||
<li>📤 <strong>CSV-Import</strong>: Spalte unterstützt?</li>
|
||
<li>🎮 <strong>Modul-Profil-API</strong> (<code>/api/student/me</code>): Feld in Response?</li>
|
||
<li>🎮 Alle <strong>Module</strong>: nutzen sie das Feld korrekt? (z.B. neue A11y-Option)</li>
|
||
<li>🔒 <strong>Auswertung</strong>: Feld erscheint nicht versehentlich öffentlich?</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.6</span><span class="title">Telemetry-Event-Typ geändert/ergänzt</span>
|
||
<div class="body">
|
||
Dann prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>🎮 Alle <strong>Module</strong>, die den Event senden → Schema passt?</li>
|
||
<li>📡 <strong>Lehrer-Live-Dashboard</strong>: Renderer für neuen Event-Typ?</li>
|
||
<li>📊 <strong>Auswertung</strong>: wird aggregiert?</li>
|
||
<li>📋 <strong>Spec</strong>: in <code>telemetry-api.md</code> dokumentiert?</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.7</span><span class="title">UI-Token/Farbe geändert (design-system.css)</span>
|
||
<div class="body">
|
||
Dann prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>🎮 Alle <strong>Module</strong>: nutzen sie die Tokens via <code>var(--ggs-*)</code>?</li>
|
||
<li>👤 <strong>Cockpit-Seiten</strong> sehen noch konsistent aus?</li>
|
||
<li>♿ <strong>High-Contrast-Modus</strong>: ist die neue Farbe auch dort definiert?</li>
|
||
<li>🌐 <strong>Landingpage / Handbuch / Glossar</strong>: passt es noch zum Gesamtbild?</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">K.3.8</span><span class="title">Sprach-Text geändert (UI / Modul / Glossar)</span>
|
||
<div class="body">
|
||
Dann prüfen:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>🗣️ <strong>Sprachregeln</strong> eingehalten? (keine „Spielsprache", „Lehrperson" statt „Lehrkraft")</li>
|
||
<li>♿ <strong>Easy-Sprache</strong>-Variante mit-aktualisiert?</li>
|
||
<li>📚 Falls der Text auch im <strong>Handbuch</strong> steht → dort auch?</li>
|
||
<li>🌐 <strong>i18n-Files</strong> (V2-Module: standard + easy) synchron?</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">K.4</span><span class="title">Workflow für Atlas (Selbstverpflichtung)</span>
|
||
<div class="body">
|
||
Vor jedem Commit/Edit, der eine der oben genannten Komponenten berührt:
|
||
<ol style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>Frage: <em>welche K.3.x-Regel greift?</em></li>
|
||
<li>Alle Folge-Punkte aus dieser Regel kurz mental durchgehen</li>
|
||
<li>Wo etwas inkonsistent würde → entweder mitfixen ODER als neuen Eintrag in der entwurf.html-TODO-Sektion vermerken</li>
|
||
<li>Bei Unsicherheit: vor dem Commit bei Thomas rückfragen</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<h2>D · Offene Punkte (TODO)</h2>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">D.1</span><span class="title">Rückbau: V2-Erfindungen die nicht zu V1 passen</span>
|
||
<div class="body">
|
||
<code>teachers.is_admin</code> Spalte raus, Plattform-Button in <code>teacher.html</code> raus, <code>admin-config.html</code> aufgeben → V2-Plattform-Config wandert ins V1-Admin-Board als neuer Reiter.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">D.2</span><span class="title">V1-Admin-Board erweitern um Reiter „V2 Plattform"</span>
|
||
<div class="body">
|
||
Neue Seite <code>App/admin-platform-v2.html</code>, eingebunden in <code>admin-levels.html</code>-Topbar. UI für Plattform-Config (Heartbeat, Token-TTL etc.). Auth: V1-PHP-Session.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">D.3</span><span class="title">Brücke V1-Admin-Session ↔ V2-API</span>
|
||
<div class="body">
|
||
V2-API-Endpoints unter <code>v2-platform/php/api/admin/*</code> prüfen <code>$_SESSION['admin_id']</code> statt JWT. Same-Origin reicht. Atlas wartet auf Bestätigung von Thomas.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ============================================================ -->
|
||
<h2>Z · Änderungs-Log</h2>
|
||
|
||
<div class="entry info">
|
||
<span class="code">Z.1</span><span class="title">2026-05-28 (Start)</span>
|
||
<div class="body">Dokument angelegt. Erste Einträge zu Rollen, Policies, V1-Links.</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.48</span><span class="title">Sonnensystem-Polish + Mail-Design + Glossar-Fix (2026-05-29 bis 30)</span>
|
||
<div class="body">
|
||
Sonnensystem als 3. Sim komplett gepolisht (Plattform-Patterns + Onboarding + Glossar + Achievements + FunFacts). Mehrere physikalische Fixes (Solar-Sync, Mond-Phase), iOS/Browser-Patches. Plus: kritischer Glossar-Bug auf Production, Mail-Design.
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Sonnensystem-Plattform-Patterns</strong>: GGS_LIVE_STATE Hook · LIVE_PRIMARY_FIELDS in teacher.html · Run-Drilldown teacher + schueler · Onboarding-Modal (4 Schritte) · ❔-Help-Button · Glossar-Click + Popup mit 15 DB-Einträgen (5 neu: photon, aequator, polarnacht, polartag, zenit) + 12-Eintrag Fallback · 6 Achievements + 5 FunFacts.</li>
|
||
<li><strong>Erdrotation-Bug (Solar-Sync)</strong>: `earth.rotation.y = timeDays * 2π + earthOrbit.rotation.y` — vorher Wien-Drift bis 180° an Sommertagen (Mittag = Nachtseite). Plus Mond-Phase mit synodischem Monat (29.5306d) + Offset auf 3.1.2026 = Vollmond.</li>
|
||
<li><strong>Zeit-Picker</strong>: separater Date + Time-Input (minutengenau), ⏰ Jetzt-Button (ersetzt 🎒 Schulst.). Tag-Tooltip im Header zeigt bei Tempo ≤100× auch HH:mm.</li>
|
||
<li><strong>Mondspur</strong>: jetzt silbrig-blau (#cfdfff) gestrichelt (LineDashedMaterial + computeLineDistances), war gelb solid.</li>
|
||
<li><strong>Monatsmarken + Ghost-Erde</strong>: für Aufgabe „Erdjahr und Schaltjahr" — beide via `obsApplyState`-Properties `monthMarkers: true` und `ghostEarth: true`. Macht den Viertel-Tag-Drift sichtbar (Wien-Fahne steht nach 365 Tagen NICHT exakt am Start).</li>
|
||
<li><strong>3D-Pan</strong>: Hand-Cursor (grab/grabbing) bei Rechtsklick, dampingFactor 0.08 → 0.25 für 1:1-Gefühl, contextmenu unterdrückt.</li>
|
||
<li><strong>Glossar-Schaden gefixt</strong>: Production hatte 74/101 Wikipedia-Links auf den falschen Artikel (Pumpspeicher → Tarif, Achsneigung → Hochwasserschutz). Sync-Migration <code>2026-05-29-fix-glossar-wikipedia-links.sql</code> (idempotent, SET NAMES utf8mb4) → 107 saubere Links. Encoding-Gotcha: SQL-Generierung MUSS mit <code>--default-character-set=utf8mb4</code> laufen.</li>
|
||
<li><strong>Mail-Design</strong>: Mailer.php wrapHtml + sendAdminPin neu. Logo-Image raus → Wortmarke „Geo Gra Sim" in Arial Black, dreifarbig wie Logo (#143b4b / #1d707b / #f17f13). Pin-Box edler (42px, Petrol-Gradient, „10 Min gültig"-Pille).</li>
|
||
<li><strong>deploy.sh permanent gefixt</strong>: Top-Level-Sync von HTML/PHP/htaccess + Subdirs (forschung/data/docs/scripts) — vorher fehlten teacher.html, schueler.html, forschung/index.php bei Deploys.</li>
|
||
<li><strong>.htaccess</strong>: neue Regel `RewriteCond %{REQUEST_FILENAME}.php -f → $1.php` für extension-less URLs (z. B. /kontakt → kontakt.php). 5 alte .html-Files (+ 2 in forschung/) zu .OBSOLETE umbenannt.</li>
|
||
<li><strong>Sonnensystem-Aufgaben-Review (20 Tasks)</strong>: 12 sauber, 3 gerade gefixt (#1 #2 #3). 3 Polish-Vorschläge zur Entscheidung offen (#7 Vollmond-Antwort kürzen, #13 Achsneigung-Phasen-Animation, #15 Sommer/Winter-Phases-Wechsel). Mondtilt #11 zur Grundsatz-Entscheidung offen (Aufgabe behalten/raus, Slider Sandbox-only?).</li>
|
||
</ul>
|
||
<strong>Login-Bug für `schroffenegger@ph-vorarlberg.ac.at` (id 107) aufgeklärt</strong>: Passwort `8Zeichen!` ist korrekt, Backend verifiziert, Session wird gesetzt. Vermutete Ursache war Browser-Cache. Forgot-PW-Flow funktioniert (Mail kommt über Provider-Relay, nicht über PHPMailer-Code-Pfad).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.47</span><span class="title">EU-Werkstatt Prozessleiste: „Schritt für Schritt"-Visualisierung — kompakt im Spielscreen, voll am Endscreen (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „Stelle den Fortlauf der Prozesse, welche in den vorgegebenen Fällen, in einem Schritt-für-Schritt-Diagramm dar … zum Schluss soll der gesamte Prozess als Grafik sichtbar sein. Du verstehst den didaktischen Wert, oder?"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Datenmodell</strong>: Lookup-Tabelle <code>SCENARIO_FLOWS</code> (außerhalb der SCENARIOS-Daten, damit Step-Objekte unangetastet bleiben). Pro Szenario eine <code>steps[]</code>-Liste mit <code>{icon, label, sub}</code> + ein <code>outcome</code>-Knoten mit dem realen Ergebnis. Für alle 10 Szenarien vollständig befüllt.</li>
|
||
<li><strong>Renderer</strong>: <code>renderProcessFlow(mode)</code> mit zwei Modi: <code>compact</code> (im Spielscreen — kleinere Knoten, kein sub-Text, aktive/done/pending-Klassen folgen state.stepIndex) und <code>full</code> (am Endscreen — größere Knoten mit sub-Text + zusätzlicher Outcome-Knoten am Ende, farblich nach end.type: success/mixed/rejected).</li>
|
||
<li><strong>Visualisierung</strong>: horizontale Prozesskette mit Knoten (Kreis + Icon + Label), Verbindungslinien über CSS <code>::before</code>, 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).</li>
|
||
<li><strong>Didaktik</strong>: Schüler*innen sehen immer den ganzen Weg auf einen Blick — „wo bin ich, was kommt noch, was war schon". Am Endscreen bleibt die komplette Kette als Mental Map stehen — Vergleich zwischen Szenarien wird visuell direkt erkennbar (cage_age: 4 Steps → ⏳ Versprechen offen; usb_c: 4 Steps → 🔌 Pflicht; brexit: 3 Steps → ❌ Mülleimer; glyphosat: 6 Steps → 🌾 verlängert).</li>
|
||
<li><strong>Eingehängt</strong>: <code>renderStep()</code> ruft am Ende <code>renderProcessFlow('compact')</code>, <code>showEnd()</code> ruft <code>renderProcessFlow('full')</code> vor <code>showScreen('screen-end')</code>.</li>
|
||
</ul>
|
||
<strong>Pattern für andere Sims</strong>: SCENARIO_FLOWS-Lookup + zwei Renderer-Modi + CSS .process-flow.compact/.full ist als Vorlage übertragbar. Heli, Klima, Logistik etc. könnten analog eine „Was lief in dieser Session?" Prozesskette bekommen.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.46</span><span class="title">EU-Werkstatt Live-State-Hook: GGS_LIVE_STATE() + Health-Ampel für Lehrer-Live-Cockpit (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Befund im Cockpit: „⚠ Diese Simulation meldet noch keine Live-Werte." — Heartbeat lief, Sim-State-Snapshot fehlte. Im Memory-Update zur nächsten Phase ist Heartbeat-Pflicht in JEDER App eh Thema.
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Hook</strong> <code>window.GGS_LIVE_STATE</code> direkt vor dem START-Block. Wird alle 4s vom Plattform-Live-Client (App/assets/js/live-client.js) aufgerufen.</li>
|
||
<li><strong>Felder</strong>: screen (start/play/end), scenarioId/Title/Icon, step + stepsTotal, stepType, difficulty, firstTryHits, totalAttempts, muelleimerCount, attemptsThisStep, secondsElapsed, achievementsUnlocked + Total, health-Ampel + healthLabel.</li>
|
||
<li><strong>Health-Logik</strong>: struggling ab ≥3 Mülleimer ODER ≥3 Versuche am gleichen Step; ok ab ≥1 Mülleimer ODER ≥2 Versuche; sonst good. Vorbereitung für nächste Phase (Lehrer-Live-Ampel mit kumulierter Klassen-Übersicht).</li>
|
||
<li><strong>Inbox-Notiz</strong> an „zentrale" mit Spalten-Empfehlung für LIVE_PRIMARY_FIELDS["eu-werkstatt"] (App/sims/_inbox/zentrale/2026-05-28-2200-eu-werkstatt-live-state-eingebaut.md). Atlas-Hinweis: ab heute eine Instanz, also direkt selbst in teacher.html eintragen statt Inbox-Ping.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.45</span><span class="title">EU-Werkstatt Final-Polish: Progress-Text, Easy/Profi, InfoCards, Achievements, Glyphosat +2 Steps, Konzept-Zoom (2026-05-28)</span>
|
||
<div class="body">
|
||
Erste Sim aus der Polishing-Phase fertig. Plan stammt aus <code>review.html</code> Atlas-Verbesserungsvorschläge; 6 Items abgearbeitet, eines bewusst übersprungen (Lehrer-Tracking opt-in — kommt in der nächsten Phase als cross-app Fleißanzeige).
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Progress-Bar mit Text „Schritt 3 / 5"</strong>: bisher nur Dots im Header, jetzt zusätzlich Pill mit „Schritt X / Y" davor. Auf Mobile werden die Dots ausgeblendet, der Text bleibt. <code>renderProgress()</code> + neue CSS-Klassen <code>.progress-label</code> + <code>.progress-dots</code>.</li>
|
||
<li><strong>Schwierigkeitsstufen Einfach/Profi</strong>: Toggle auf dem Startscreen (persistiert in localStorage). Im Profi-Modus werden bei <code>pick</code>-Steps die offensichtlichen Mülleimer-Karten (<code>feedbackByCard[*].isMuelleimer === true</code>) aus dem Pool entfernt; bei <code>sentence</code>-Steps werden die <code>pool-group-label</code>-Hinweise („Anzahl Unterschriften", „Aus wie vielen Ländern?") ausgeblendet. Datenseitig keine Änderung an Szenarien nötig — Filter läuft automatisch über vorhandene Feldnamen.</li>
|
||
<li><strong>InfoCards „Wusstest du?"</strong>: neuer Overlay-Typ <code>overlayFunFact</code>. Daten via optionalem <code>step.funFact = {emoji, title, text}</code>. Neue Funktion <code>advanceStep()</code> (löste <code>nextStep()</code> 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).</li>
|
||
<li><strong>Achievement-System</strong>: 6 Badges (<code>first_try_master, clean_sweep, expert_clear, marathon, all_5_stars, glossar_explorer</code>) — gespeichert in localStorage <code>geograsim_eu_werkstatt_v1.achievements</code>. Auswertung in <code>evaluateAchievements()</code> am Endscreen. Endscreen zeigt neu freigeschaltete Badges in goldener Box. Startscreen-Strip (<code>#achievementsStrip</code>) 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.</li>
|
||
<li><strong>Glyphosat-Vertiefung +2 Steps</strong>: zwischen Step 3 (Lobby) und Step 4 (Ausgang) zwei neue Multichoice-Steps eingefügt — Wissenschaft uneinig (<strong>IARC</strong> vs <strong>EFSA</strong>, mit FunFact über EFSA-Bericht-Plagiatsvorwurf von Monsanto-Studien) und Mitgliedstaaten-Abstimmung Nov 2017 (<strong>Christian Schmidt</strong> CSU stimmt im Alleingang für Verlängerung gegen Absprache mit SPD-Hendricks). Szenario hat jetzt 6 statt 4 Steps. Originaler Ausgang-Step gekürzt (Narration zog Nov 2017 vor — jetzt in eigenem Step 5).</li>
|
||
<li><strong>Konzept-SVG-Zoom auf Tablets</strong>: <code>.concept-detail-visual</code> ist jetzt klickbar (<code>toggleConceptZoom()</code>) → 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 <code>.concept-detail</code>-Modal max-width 720px statt 580px.</li>
|
||
<li><strong>Submit-Payload erweitert</strong>: <code>submitToBackend</code> schickt jetzt zusätzlich <code>difficulty</code> + <code>newAchievements</code>. Backend (<code>api/progress.php complete</code>) speichert das in <code>result_logs.results_json</code> — Auswertung später für die Lehrer-Detail-Heatmap.</li>
|
||
</ul>
|
||
<strong>Konsequenz</strong>: Eine Sim ist „final". Pattern für die folgenden Sims dokumentiert (Progress-Pill, Easy/Profi-Toggle, FunFact-Overlay, Achievement-System mit localStorage + Endscreen-Reveal, Konzept-Zoom-Hint). Datei +12 KB (~225 KB → ~237 KB).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.44</span><span class="title">Avatar-Bugs: textContent statt renderAvatar, Server-Truncate 8→64, Teacher-Topbar bekommt User-Pill (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „im Profil Lehrer und Schüler, wenn ich einen Avatar auswähle wird in Großbuchstaben das Wort Avatar nur teilweise sichtbar angezeigt anstatt dem Avatar … es wird auch nicht richtig gespeichert" + „das avatar Logo sollte auch beim Lehrer rechts oben neben dem Namen sichtbar sein .. immer".
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Bug A (visuell, profil.html)</strong>: <code>selectAvatar()</code> setzte <code>document.getElementById('avatar-btn').textContent = value</code>. Bei einem Avatar-Wert wie <code>'avatar:eule-prof'</code> erschien dieser String wörtlich als TEXT — bei <code>font-size: 3.5rem</code> im 100×100-Kreis nur „avat..." sichtbar. Fix: <code>innerHTML = renderAvatar(value)</code> rendert ein <code><img></code> für Avatar-Slugs bzw. den Emoji-Charakter. Plus: Active-Toggle nutzte ebenfalls <code>textContent</code> (matchte bei IMG-Optionen nie) — umgestellt auf <code>data-val</code>-Attribut.</li>
|
||
<li><strong>Bug B (server, api/profile.php)</strong>: Teacher-Branch hatte <code>mb_substr(emojiAvatar, 0, 8)</code> — schnitt <code>'avatar:eule-prof'</code> (16 Zeichen) auf <code>'avatar:e'</code>. 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.</li>
|
||
<li><strong>Feature C (teacher.html Topbar)</strong>: <code><span class="user" id="user-info"></code> + separater Profil-Button ersetzt durch <code><a class="user-pill"></code> mit Avatar-Kreis (28×28) + Name, verlinkt auf <code>profil.html</code>. Visuell + funktional identisch zu schueler.html-Topbar und der profil.html-Topbar (von L.16). Init lädt jetzt zusätzlich Profile-Daten via <code>api('profile')</code>, um Avatar-Bild oder Emoji-Fallback (<code>👩🏫</code>) zu zeigen.</li>
|
||
</ul>
|
||
<strong>Konsequenz</strong>: Avatar-Wahl funktioniert jetzt korrekt für Lehrer wie Schüler — wird visuell richtig dargestellt und auf Server in voller Länge gespeichert. Teacher-Topbar zeigt den gewählten Avatar permanent (Konsistenz mit Schüler-Cockpit).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.43</span><span class="title">Kritischer Render-Bug in <code>renderPage()</code> — JS-Strings mit „</body>" wurden zerstört (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Befund: „wenn ich als Lehrer auf das Logo links oben klicke, lande ich hier: <code>/App/teacher</code> — da wird Unsinn angezeigt, das darf nie sichtbar sein, egal was ich eingebe. Wir müssen die Seite noch härten."
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Root-Cause</strong>: <code>App/php/templates/_scripts.php → renderPage()</code> nutzte <code>str_replace('</body>', $ctx . "\n</body>", $html)</code> für die Session-Context-Injection. Das ersetzt <em>jedes</em> Vorkommen von <code></body></code> in der Datei. <code>teacher.html</code> Zeile 1340 hat in einem JavaScript-String-Literal: <code>html += '</div></body></html>';</code> (für die PIN-Druck-Funktion mit <code>window.open + document.write</code>). Die Replace zerschießt diesen JS-String mit einem injizierten <code><script></code>-Tag → Parser bricht ab → Rest des Script-Blocks landet sichtbar als Text auf der Seite.</li>
|
||
<li><strong>Fix</strong>: <code>renderPage()</code> verwendet jetzt <code>strrpos</code> + <code>substr</code> — injiziert nur am LETZTEN Vorkommen von <code></body></code> / <code></head></code> (also dem echten Dokument-Ende). JS-Strings mit „</body>" bleiben unangetastet.</li>
|
||
<li><strong>Reichweite</strong>: alle Seiten die renderPage nutzen profitieren — <code>game.php · game-3d.php · dashboard.php · datenschutz.php · barrierefreiheit.php · teacher.php · schueler.php</code> + weitere. Schon vorher latente Fehlerquelle, jetzt gehärtet.</li>
|
||
<li><strong>Zusätzliches Hardening</strong>: <code>teacher.html</code> Logo geht jetzt direkt auf <code>teacher.html</code> (statt Clean-URL <code>/teacher</code>) — umgeht den PHP-Wrapper komplett, Apache liefert die HTML-Datei direkt. Schnellerer Self-Reload, kein Wrapper-Risiko. Analog: <code>schueler.html</code> Logo auf <code>schueler.html</code> (war <code>/schueler</code>).</li>
|
||
</ul>
|
||
<strong>Atlas-Hinweis</strong>: weitere Seiten könnten ähnliche JS-String-Konstrukte enthalten (z.B. andere PDF/Druck/popup-Funktionen). Mit dem renderPage-Fix sind alle Seiten gehärtet — falls Thomas weitere „weiße/text-Seiten" findet, dürfte es etwas anderes sein.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.42</span><span class="title">Login-Modal — Layout-Korrektur: links Toggle Anmelden/Registrieren, rechts Schnell-Login (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „nicht einloggen und Registrieren auf einmal … bitte wieder wie vorhin … aber das Ausprobieren ist in der rechten Spalte, weil das kicken wir später ohnehin" + „der Satz ist unnötig, weg damit: ‚Nur E-Mail und Passwort — Name, Schule etc. ergänzen wir bei Bedarf später im Backend (minimale Zugangshürde + Datenerhebung)'".
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Linke Spalte zurück auf Toggle</strong>: <code>view-login</code> oder <code>view-register</code> (oder Forgot/Reset) — jeweils nur eine View sichtbar. Wechsel via Buttons („Registrieren — Account erstellen" und „← Bereits registriert? Anmelden") wie vor L.40. <code>showView()</code> zurück auf 4-Wege-Toggle.</li>
|
||
<li><strong>Rechte Spalte = Schnell-Login</strong> (statt Register): „Zum Ausprobieren" mit Demo-Accounts (Lehrperson, Anna/Ben/Clara). Bleibt permanent sichtbar, unabhängig vom Left-Col-Toggle — Atlas-Notiz: lässt sich später durch ein einziges Löschen des Spalten-Blocks entfernen, wenn die Test-Accounts wegfallen.</li>
|
||
<li><strong>Erklärungs-Text entfernt</strong>: „Nur E-Mail und Passwort — Name, Schule etc. …" raus aus dem Lehrer-Register-Formular. DSGVO-Checkbox-Link bleibt — der ist gesetzliche Pflicht und reicht als Hinweis.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: das alte Pattern aus pre-L.40 (Toggle + Schnell-Login darunter) wird so kombiniert mit der besseren Höhen-Nutzung des 2-Spalten-Grids. Modal-Höhe bleibt jetzt typisch unter 480 px — kein Vertical-Scroll auf iPad Landscape.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.41</span><span class="title">Login-Modal — Blur nochmal halbiert (5px → 2px) + Tönung minimal (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „blur immer noch viel zu stark". Werte: <code>blur(5px → 2px)</code>, <code>background rgba(247,246,243, .22 → .10)</code>. Hero-Background ist jetzt fast klar lesbar, Card hebt sich durch ihren Schatten ab.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.40</span><span class="title">Login-Modal — 2-spaltiges Layout (Anmelden links · Registrieren rechts) (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „mach im Anmelden/Registrieren Overlay Fenster ein 2-spaltiges Layout … wir haben zu wenig Höhe".
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Card-Breite</strong>: <code>max-width: 400px → 760px</code> (knapp 2×). Padding etwas reduziert (<code>1.6rem 1.8rem</code>), Logo bleibt mittig oben über beiden Spalten.</li>
|
||
<li><strong>2-spaltiges Grid</strong> <code>.login-grid { grid-template-columns: 1fr 1fr; gap: 1.8rem }</code>. Linke Spalte = Anmelden (mit Forgot/Reset als Overlay innerhalb). Rechte Spalte = Registrieren (Tabs Lehrperson/Schüler*in + Felder + DSGVO-Checkbox). Vertikaler Trenner via <code>border-left</code> auf der Register-Spalte.</li>
|
||
<li><strong>Redundante Cross-Links entfernt</strong>: vorher gab's „Registrieren — Account erstellen"-Button in der Anmelden-Spalte und „Bereits registriert? Anmelden"-Link in der Registrieren-Spalte. Beide weg — beide Aktionen sind jetzt nebeneinander direkt sichtbar.</li>
|
||
<li><strong>Forgot/Reset</strong>: ersetzen nur die linke Anmelden-Spalte (per <code>showView()</code> 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.</li>
|
||
<li><strong>Mobile-Fallback</strong> (< 700 px): Grid kollabiert zu Single-Column, Register-Spalte wandert unter die Anmelden-Spalte mit horizontalem Trenner statt Vertikalem. Card-Breite zurück auf <code>max-width: 420 px</code>.</li>
|
||
</ul>
|
||
<strong>Höhen-Effekt</strong>: vorher Card ~520 px hoch (Anmelden) bzw. ~620 px (Registrieren). Jetzt durchgängig ~440 px hoch — auch auf 1080×810 iPad Landscape kein Vertical-Scroll nötig.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.39</span><span class="title">Login-Modal Feintuning: Blur halbiert, Lehrer-Register minimalisiert, DSGVO-Checkbox, Close-Hint weg (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas (vier Mikro-Vorgaben gebündelt): „Blur ist zu stark, fast nicht sichtbar — halbiere bitte" · „bei der Registrierung als Lehrer bitte die Felder Vorname, Nachname und Schule weg — kann man im Backend eintragen, später, weil nur Zugangshürde und Datenschutzthema" · „wir brauchen hier als Lehrer wohl Hinweis auf Datenschutzerklärung" · „entferne den Hinweis ‚Klick außerhalb oder Esc → zurück'".
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Blur halbiert</strong>: <code>backdrop-filter: blur(10px → 5px)</code>, plus etwas weniger Tönung (<code>rgba(247,246,243,.32 → .22)</code>) — die Schiffsbewegung wird jetzt klar sichtbar, Card bleibt durch Schatten gut lesbar.</li>
|
||
<li><strong>Lehrer-Registrierung minimalisiert</strong>: Vorname, Nachname, Schule-Felder entfernt. Verbleibend nur E-Mail + Passwort + Passwort-Bestätigung. <code>displayName</code> 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.</li>
|
||
<li><strong>DSGVO-Checkbox</strong> als Pflichtfeld am Ende der Lehrer-Registrierung — Label „Ich akzeptiere die <a>Datenschutzerklärung</a>." mit Link auf <code>datenschutz.php</code> (öffnet im neuen Tab). Submit bricht ohne Häkchen mit Fehlermeldung ab.</li>
|
||
<li><strong>Close-Hint-Pill entfernt</strong>: der „Klick außerhalb oder Esc → zurück"-Pin oben rechts ist weg. Die Funktion bleibt — Klick außerhalb der Card + ESC schließen weiterhin. Pattern ist intuitiv genug, kein Hinweis nötig.</li>
|
||
</ul>
|
||
<strong>Atlas-Hinweis</strong>: die Schüler*innen-Registrierung wurde nicht angefasst (Klassencode + Username + Passwort bleibt). Falls die auch eine DSGVO-Akzeptanz haben soll (rechtlich relevant bei Minderjährigen), separate Iteration mit Eltern-Einwilligung-Flow überlegen.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.38</span><span class="title">Login als Modal über geblurter Landingpage-Hero (Option B umgesetzt) (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „können wir als Hintergrund Blurry den Hintergrund der Hero Section der Landingpage bekommen — inklusive Navigation … Falls man auf diesen Hintergrund klickt, kommt man wieder auf die Landingpage" → „deine Empfehlung umsetzen" (Option B + Nav klar).
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Neues Snippet</strong> <code>App/pages/_partials/public_hero_bg.php</code>: dekorativer Hero-Background (Meer-Gradient, Containerschiff, Segelyacht 1, Race-Yacht 26, 3 Vögel, 6 driftende Fachbegriffe). Komplett self-contained — eigene CSS mit <code>hero-bg-</code> / <code>hbboat-</code> / <code>hbw-</code> Prefix (kein Konflikt mit Landingpage-Hero-Klassen). CSS-Guard via <code>$GLOBALS['__hero_bg_css']</code>, wird also nur einmal pro Request gerendert. <code>prefers-reduced-motion</code> wird respektiert (alle Animationen aus), mobile (< 700 px) blendet Vögel + Wörter aus.</li>
|
||
<li><strong>login.html → login.php</strong>: PHP-Boilerplate + <code>include public_topnav.php</code> (Nav klar oben, klickbar — direkter Weg zu Lehrplan/Glossar/Handbuch falls falsche Abzweigung) + <code>.login-shell</code> mit Hero-BG dahinter + <code>.login-overlay</code> mit <code>backdrop-filter: blur(10px); background: rgba(247,246,243,.32)</code> + zentrierte Login-Card unverändert zur alten Optik.</li>
|
||
<li><strong>Click-to-Close</strong>: Listener am <code>#login-overlay</code> — wenn das Klick-Ziel nicht innerhalb <code>.login-card-inner</code> liegt, <code>location.href = 'index.html'</code>. <code>Escape</code>-Taste tut dasselbe. Kleiner <code>.close-hint</code>-Pill oben rechts macht das Pattern für User sichtbar.</li>
|
||
<li><strong>URL-Bruch verhindert</strong>: <code>.htaccess</code>-Rewrite von L.37 leitet alte <code>login.html</code>-Aufrufe automatisch auf <code>login.php</code> um. Alle bestehenden Verlinkungen (Hauptnav „Anmelden", footer-fallbacks etc.) bleiben funktional.</li>
|
||
</ul>
|
||
<strong>Bewusste Abweichung von der reinen Option-B-Empfehlung</strong>: index.html wurde NICHT auf den Snippet umgestellt (würde tieferen Refactor + Risiko fürs Landingpage-Layout bedeuten). Der Hero-Background im Snippet ist also eine bewusst dupliziertere Implementierung der Landingpage-Atmosphäre. Wenn du später vollständige DRY willst, kann der Snippet auch auf index.html angewendet werden (separate Iteration). Aktuell: visueller Effekt 1:1, Wartungsaufwand minimal höher.
|
||
<br><strong>Test lokal</strong>: <code>localhost/geograsim/App/login.php</code> oder <code>login.html</code> (via Rewrite). Klick irgendwo neben die Card oder ESC → <code>index.html</code>.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.37</span><span class="title">Header-Vereinheitlichung — 7 Subpages auf <code>public_topnav.php</code> via Snippet-Include + .html→.php Rename + .htaccess-Fallback (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „6.2 deine empfehlung umsetzen" — N.6.2 Variante (b) Konversion zu .php + Snippet-Include.
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Sieben Dateien umbenannt</strong> (Inhalt erhalten, nur Header-Block ersetzt):
|
||
<ul>
|
||
<li><code>App/kontakt.html → kontakt.php</code> (<code>$activeMain = 'kontakt'</code>)</li>
|
||
<li><code>App/impressum.html → impressum.php</code> (<code>null</code>)</li>
|
||
<li><code>App/datenschutz.html → datenschutz.php</code> (<code>null</code>)</li>
|
||
<li><code>App/barrierefreiheit.html → barrierefreiheit.php</code> (<code>null</code>)</li>
|
||
<li><code>App/marktplatz-einreichung.html → marktplatz-einreichung.php</code> (<code>null</code>)</li>
|
||
<li><code>App/forschung/index.html → forschung/index.php</code> (<code>'forschung'</code>)</li>
|
||
<li><code>App/forschung/literatur.html → forschung/literatur.php</code> (<code>'forschung'</code>)</li>
|
||
</ul>
|
||
</li>
|
||
<li><strong>Per Datei einheitlich</strong>: PHP-Boilerplate vor <code><!DOCTYPE></code> (<code>require_once</code> für <code>app.php</code>, <code>$bp</code>, <code>$activeMain</code>), dann der alte Topbar-Block (<code>.topbar</code> / <code><nav class="nav"></code>) durch <code><?php include __DIR__.'/pages/_partials/public_topnav.php'; ?></code> ersetzt. Pfad bei Forschung-Dateien <code>__DIR__.'/../pages/_partials/...'</code>.</li>
|
||
<li><strong>URL-Bruch verhindert</strong> via neuer <code>.htaccess</code>-Regel: wenn die angefragte <code>.html</code>-Datei nicht (mehr) existiert, aber die entsprechende <code>.php</code> ja, wird gerewriteted. Damit bleiben alle alten Links (<code>kontakt.html</code>, <code>impressum.html</code> usw.) auf bestehenden Seiten + externen Backlinks funktional.</li>
|
||
<li><strong>Konsistenz-Ergebnis</strong>: Variante A (Landingpage), B (Handbuch), C (Forschung ✓ jetzt umgestellt), D (lehrplan/glossar/simulationen via Snippet), E (kontakt/impressum/datenschutz/barrierefreiheit/marktplatz ✓ jetzt umgestellt) — alle haben jetzt visuell denselben Header. Nur noch Landingpage + Handbuch nutzen eigene Hauptnav-Klassen (statt Snippet) — können später bei Bedarf ebenfalls auf Snippet umgestellt werden.</li>
|
||
<li><strong>Altes Topbar-CSS bleibt</strong> in jeder Datei stehen (<code>.topbar</code>, <code>.btn-sm</code> etc.) — wird nicht mehr referenziert, kein Cleanup nötig. Bei größerem Refactor später entfernbar.</li>
|
||
</ul>
|
||
<strong>Test-URLs lokal</strong>:
|
||
<code>kontakt.php</code>,
|
||
<code>impressum.php</code>,
|
||
<code>datenschutz.php</code>,
|
||
<code>barrierefreiheit.php</code>,
|
||
<code>marktplatz-einreichung.php</code>,
|
||
<code>forschung/</code> (→ index.php),
|
||
<code>forschung/literatur.php</code>.
|
||
Alte <code>.html</code>-URLs sollten auch noch funktionieren via .htaccess-Rewrite.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.36</span><span class="title">public_topnav.php auf Landingpage-Optik angeglichen + 5 Mojibake-DB-Rows repariert (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Befund 1: „fällt dir auf, dass das Menü auf der Landingpage anders aussieht wie unter Lehrplan? bei Forschung wieder anders, bei Kontakt nochmals anders" — Header-Konsistenz-Drift.
|
||
<br>Thomas-Befund 2: „auf Seite /simulationen Text fehler codierung: ÔÇö, f├╝nf, …" — Mojibake im sichtbaren Content.
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Sofortfix Header-Drift</strong>: <code>App/pages/_partials/public_topnav.php</code> hatte <code>.pub-links { flex: 1; }</code> — Links kleben am Logo. Umgestellt auf <code>justify-content: space-between</code>-Layout wie auf Landingpage; Anmelden-Button wandert IN die <code>.pub-links</code>-Gruppe. CSS-Tokens (Backdrop-Blur, Padding, Hover-Background <code>rgba(0,0,0,.04)</code>, Active-Background <code>rgba(74,124,138,.12)</code>) 1:1 von index.html übernommen.</li>
|
||
<li><strong>Mojibake-Reparatur</strong>: 5 Rows in <code>module_info</code> hatten doppelt-encodierte Texte (UTF-8 → CP850/CP437 → re-encoded zu UTF-8 → ÔÇö, ├╝, � usw.). Ursache: Import einer Migration-SQL ohne <code>--default-character-set=utf8mb4</code> in einer Windows-OEM-Shell. Reparatur via direkter UPDATE mit kanonischem Text aus <code>App/Don_t_Deploy/content-dump-2026-04-23.sql</code> und <code>2026-05-03-energiemanager-deploy.sql</code> und <code>migrate-2026-04-26-staustufen.sql</code>:
|
||
<ul>
|
||
<li><code>staustufen</code>: title + short_desc + long_desc + learning_goals</li>
|
||
<li><code>logistik</code>: short_desc</li>
|
||
<li><code>klima</code> + <code>klima-3d</code>: long_desc</li>
|
||
<li><code>sonnensystem</code>: long_desc + learning_goals (manueller Fix, kein kanonischer Quelltext gefunden)</li>
|
||
<li><code>fluss</code>: short_desc + long_desc + learning_goals</li>
|
||
<li><code>energiemanager</code>: short_desc + long_desc + learning_goals</li>
|
||
</ul>
|
||
Verifiziert via HEX(SUBSTRING(...)) — alle reparierten Zellen enthalten jetzt korrekte UTF-8-Multibyte-Sequenzen (z.B. <code>C3 BC</code> für ü, <code>E2 80 94</code> für em-dash).
|
||
</li>
|
||
<li><strong>Analyse-Doku</strong> in N.6.0/N.6.1 — fünf Header-Varianten katalogisiert, drei davon (A Landingpage, B Handbuch, D Snippet) jetzt visuell deckungsgleich. Variante C (Forschung) und E (.topbar auf kontakt/impressum/datenschutz/…) bleiben Drift — N.6.2 dokumentiert Vorschlag zur Migration (Atlas-Empfehlung: <code>.html → .php</code> + Snippet-Include, wartet auf Thomas-Freigabe).</li>
|
||
</ul>
|
||
<strong>Atlas-Hinweis</strong>: die Mojibake-Reparatur betrifft ausschließlich die <em>lokale</em> Atlas-DB. Auf <code>geograsim.at</code>-Production müsste die gleiche UPDATE-Sequenz laufen — bitte Meister-Instanz pingen, wenn deployed werden soll.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.35</span><span class="title">Zweistufige öffentliche Nav umgesetzt: Standard-Hauptnav + Erkundungs-Sub-Nav auf Lehrplan/Glossar/Simulationen — plus Login-Hinweis statt Direkt-Start auf Sims-Übersicht (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „überall deine empfehlung … setzt alles um".
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Zwei neue Snippets</strong>:
|
||
<ul>
|
||
<li><code>App/pages/_partials/public_topnav.php</code> — Standard-Hauptnav 1:1 wie auf index.html (Logo · Simulationen · Lehrperson · Lehrplan · Forschung · Handbuch · Kontakt · Anmelden). Parameter <code>$activeMain</code> markiert den aktiven Tab visuell. CSS-Guard via <code>$GLOBALS['__pub_nav_css']</code> — emittiert <code><style></code> nur einmal pro Request.</li>
|
||
<li><code>App/pages/_partials/erkundungs_subnav.php</code> — Tab-Cluster „📋 Lehrplan · 📚 Glossar · 🎮 Simulationen" + optionaler Country-Picker rechts. Sticky bei <code>top: 50px</code> (unter Hauptnav). Parameter <code>$activeSub</code>, <code>$showCountryPicker</code>, <code>$easyActive</code>.</li>
|
||
</ul>
|
||
</li>
|
||
<li><strong>lehrplan.php</strong>: alte <code>.lp-topbar</code> ersetzt durch Include beider Snippets (<code>$activeMain='lehrplan'</code>, <code>$activeSub='lehrplan'</code>, <code>$showCountryPicker=true</code>). Land-Chip-Filter-Reihe komplett raus — ersetzt durch <code>.lp-context-line</code> mit „Anzeige: 🇦🇹 Österreich · X Lehrplan-Anker + Y fächerübergreifend (universell)". Anker-Rendering: <code>anchor_type !== 'fach'</code> bekommt jetzt 🌐-Icon und Meta-Label „Universell (aus AT-Lehrplan)" statt Country-Flagge.</li>
|
||
<li><strong>glossar.php</strong>: <code>.gl-topbar</code> ersetzt durch Includes (<code>$activeMain=null</code>, <code>$activeSub='glossar'</code>, <code>$showCountryPicker=false</code>). Mindmap-Link wandert in einen kleinen <code>.gl-quick-strip</code> rechts oben — gehört nicht in die Hauptnav.</li>
|
||
<li><strong>simulationen.php</strong>: <code>.sp-topbar</code> ersetzt durch Includes (<code>$activeMain='sims'</code>, <code>$activeSub='simulationen'</code>, <code>$showCountryPicker=false</code>). <strong>Card-CTA umgebaut</strong>: „▶ Simulation starten" → „🔑 Mit Lehrperson nutzen" → <code>login.html</code> (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.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Drei Public-Pages (Lehrplan / Glossar / Simulationen) haben jetzt identischen Header. Country-Picker nur auf Lehrplan (dort inhaltlich relevant). Filter-Redundanz beseitigt. Die alten Topbar-CSS-Klassen (<code>.lp-topbar</code>, <code>.gl-topbar</code>, <code>.sp-topbar</code>) bleiben als Definitionen liegen — niemand referenziert sie mehr, aber kein Cleanup ohne explizite Freigabe.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.34</span><span class="title">N.5 angelegt — Lehrplan-Nav-Harmonisierung (Vorschlag, noch nicht umgesetzt) (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „wir hängen jetzt immer noch an der navigation … wenn ich auf Lehrplan gehe, erscheint aber ein neues Menü … sollten wir hier nicht die standard Menüleiste außerhalb stehen lassen und die auswahl des Landes für den Lehrplan darunter anlegen? … mach einen Vorschlag zur harmonisierung"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>N.5.0 Befund</strong>: doppelte Nav-Welt (eigene <code>.lp-topbar</code> 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").</li>
|
||
<li><strong>N.5.1 Konzept</strong>: zweistufige Nav. Standard-Hauptnav oben (immer identisch). Kontext-Sub-Nav darunter (Lehrplan / Glossar / Simulationen als Tab-Cluster + Country-Picker rechts). Mockup im Entwurf bei 1080 px (Standard-iPad).</li>
|
||
<li><strong>N.5.2 Filter-Harmonisierung</strong>: Land-Chip-Reihe raus (Picker erledigt das). Stattdessen Transparenz-Zeile oben („Anzeige: 🇦🇹 Österreich · 47 + 18 fächerübergreifend"). Pills bleiben für Thema + Typ.</li>
|
||
<li><strong>N.5.3 Bug-Befund</strong>: heutige Logik (lehrplan.php:685-697) filtert nur <code>anchor_type='fach'</code> 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.</li>
|
||
<li><strong>N.5.4 Übertragung</strong>: Sub-Nav-Konzept auch für Glossar + Simulationen-Übersicht. Country-Picker dort optional — Atlas-Vorschlag: nur auf Lehrplan, weil dort Land inhaltlich relevant ist.</li>
|
||
<li><strong>N.5.5 Entscheidungs-TODO</strong>: 3 Entscheidungen offen (Architektur ja/nein · Filter-Variante a/b/c · Sub-Nav-Übertragung).</li>
|
||
</ul>
|
||
<strong>Atlas wartet auf Freigabe</strong> bevor lehrplan.php / glossar.php / simulationen.php angefasst werden.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.33</span><span class="title">Subpages — Favicons + Titel-Prefix-Konsistenz (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „bitte Titel und favicon auch bei den Unterseiten checken .. z. B. beim Artikel fehlt favicon"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Audit-Befund</strong>: 10 aktive Subpages ohne Favicon — <code>handbuch.html</code>, <code>marktplatz-einreichung.html</code>, <code>forschung/{geografie-didaktik, lernen-durch-simulation, quellen-geografie, quellen-simulation}.html</code>, <code>forschung/presentation-{geografie, simulation}/{index, stile}.html</code> (4 Files).</li>
|
||
<li><strong>Fix Favicon</strong>: zwei <code><link rel="icon"></code>-Zeilen (PNG 96 + SVG) nach <code><title></code> eingefügt. Pfade je nach Tiefe: Root-Level <code>favicon.svg</code> · Forschungs-Artikel <code>../favicon.svg</code> · Präsentationen <code>../../favicon.svg</code>.</li>
|
||
<li><strong>Titel-Prefix-Konsistenz</strong>: 8 Subpages bekamen den fehlenden <code>GeoGraSim — </code>-Prefix:
|
||
<ul>
|
||
<li><code>geografie-didaktik.html</code>: „Geografie unterrichten in der Sek I" → „GeoGraSim — Geografie unterrichten in der Sek I"</li>
|
||
<li><code>lernen-durch-simulation.html</code>: „Lernen durch Simulation" → „GeoGraSim — Lernen durch Simulation"</li>
|
||
<li><code>quellen-geografie.html</code> + <code>quellen-simulation.html</code>: Quellenverzeichnis bekam jeweils <code>GeoGraSim — </code>-Prefix</li>
|
||
<li>4 Präsentations-Files analog mit <code>GeoGraSim — …</code>-Prefix</li>
|
||
</ul>
|
||
</li>
|
||
<li><strong>Legacy-Pages bewusst ausgelassen</strong>: <code>sim.html</code>, <code>stadt-editor.html</code>, <code>stilauswahl.html</code>, <code>tile-test.html</code> haben ebenfalls keine Favicons — stehen aber in N.1.7 als Lösch-Kandidaten. Wenn Thomas sie behalten will, in eigener Iteration nachziehen.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: alle aktiven öffentlichen Subpages haben jetzt einheitlichen Browser-Tab-Look (Favicon + „GeoGraSim — "-Prefix).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.32</span><span class="title">Kontakt-Seite: E-Mail raus (Spam), 2× E-Mail-Check, Pre-Fill je nach Bereich, Cards überarbeitet (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgaben (gebündelt):
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>„Direkt per E-Mail"-Card entfernt</strong> wegen Spam. Statt sichtbarer Adresse: Lead-Text wurde verschärft („Schreib uns über das Formular unten — wir antworten so schnell wie möglich"). Auch im Fehler-Fallback steht jetzt keine Adresse mehr.</li>
|
||
<li><strong>2× E-Mail mit Check</strong>: zweites Feld „E-Mail zur Bestätigung wiederholen" (<code>id="cf-email2"</code>, <code>autocomplete="off"</code>). <code>sendContact()</code> bricht ab, wenn beide nicht identisch sind.</li>
|
||
<li><strong>Pre-Fill je nach Bereich</strong>: Subject-Dropdown umbenannt in „Wofür schreibst du uns?". Neuer JS-Block <code>SUBJECT_TEMPLATES</code> + <code>fillTemplate()</code>: 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.). <strong>User-Schutz</strong>: überschreibt nur, wenn Textarea leer ist <em>oder</em> noch unverändert die letzte Vorlage zeigt — eigene Sätze gehen nie verloren.</li>
|
||
<li><strong>Card „Schul-/Klassen-Account" ersetzt</strong>: neuer Titel „Zugänge anlegen", neuer Text „Du hast Probleme beim Anlegen von Zugängen? Wir helfen gerne weiter." Subject-Option im Dropdown entsprechend umbenannt.</li>
|
||
<li><strong>Neue Card „Vorschlag neue Simulation"</strong> (Text: „Idee für eine neue Sim? Schreib uns Thema, Lernziel und Zielklasse.") + passende Subject-Option.</li>
|
||
<li><strong>Hinweis-Wording</strong>: „Antwort werktags innerhalb von 48 Stunden" → „wir antworten so schnell wie möglich" (im Lead-Text + in der Erfolgs-Bestätigung „Nachricht gesendet!").</li>
|
||
</ul>
|
||
<strong>Atlas-Hinweis</strong>: Multiple-Choice-Pro-Formularfeld (Thomas-Frage „evt als formularfeld/multiple choice?") wäre die nächste Ausbau-Stufe — aktuell sind die Stichworte als simple Textarea-Vorlagen umgesetzt, weil sie sofort funktionieren und der User trotzdem frei schreiben kann. Echte Formular-Felder pro Bereich = eigene Iteration, falls gewünscht.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.31</span><span class="title">Forschung-Index: Vorname korrigiert „Bernhard" → „Dominik" Mößlang (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Befund: „unter forschung hast du geschrieben Thomas Schroffenegger & Bernhard Mößlang … der gute heißt Dominik, nicht Bernhard"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><code>App/forschung/index.html</code> Zeile 136 (author-note): <code>Bernhard Mößlang</code> → <code>Dominik Mößlang</code>.</li>
|
||
<li>Repo-weiter Volltext-Check: <code>Bernhard</code> kam nur an dieser einen Stelle vor. Footer der Landingpage / Impressum nennen den Co-Autor korrekt nur mit Nachnamen — keine weiteren Fundstellen.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.30</span><span class="title">Lehrplan-Header: doppelte Flagge im Country-Picker entfernt (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Befund: „Links oben ist die Flagge immer doppelt pro Land. Hier zweimal Österreich-Flagge."
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Ursache</strong>: <code>App/pages/_partials/country_picker.php</code> rendert die Flagge zweimal — einmal als <code><label for="md-country-select"></code> mit <code>Country::flag($currentCountry)</code> (Zeile 22-24), zusätzlich erscheint die Flagge der <code>selected</code> Option innerhalb des nativen <code><select></code>. Browser rendern die Selected-Option im geschlossenen Zustand mit ihrem vollen Text-Content (Flagge + Label).</li>
|
||
<li><strong>Fix</strong>: redundantes <code><label></code>-Element entfernt. Der Select selbst zeigt die Flagge der ausgewählten Option ohnehin. Accessibility durch <code>aria-label="Land auswählen"</code> direkt am <code><select></code> erhalten.</li>
|
||
<li><strong>CSS-Aufräumen</strong>: <code>.md-country-label</code>-Regel mit entfernt (zugehöriges Element gibt es nicht mehr).</li>
|
||
</ul>
|
||
<strong>Reichweite</strong>: Country-Picker ist ein geteilter Partial — Fix wirkt auf allen Seiten, die ihn includen (Lehrplan, Simulationen-Übersicht, Modul-Detail).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.29</span><span class="title">Hauptnav — Variante B umgesetzt: 6 Links + Glossar-Catcher-Pill (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas: „machen wir deine empfehlung .. bitte umsetzen"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>App/index.html Hauptnav</strong>: 3 neue Links eingefügt — <code>Lehrplan</code> (→ /lehrplan), <code>Forschung</code> (→ forschung/), <code>Kontakt</code> (→ 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).</li>
|
||
<li><strong>Glossar-Pill als Catcher</strong>: neue CSS-Klasse <code>.hero-pill.catcher</code> mit Orange-Border <code>#e8833a</code> + Orange-Text + Orange-Hover-Background. Pill-Text auf <em>„📚 Glossar · 164 Begriffe — alle bebildert"</em> erweitert (Zahl dynamisch via <code>[data-glossar-count]</code>).</li>
|
||
<li><strong>App/handbuch.html Header gleichgezogen</strong>: identische Reihenfolge + neue Links. Sonst wäre die Hauptnav-Inkonsistenz zwischen Landingpage und Handbuch sofort sichtbar gewesen — Konsistenz-Folge-Edit, keine Eigenmächtigkeit.</li>
|
||
</ul>
|
||
<strong>Offen</strong> für eigene Iteration (Thomas-Entscheidung abwarten): Sammel-Migration der Hauptnav auf <code>kontakt.html</code> · <code>impressum.html</code> · <code>datenschutz.html</code> · <code>barrierefreiheit.html</code>. Diese Seiten haben aktuell noch ihre eigenen Topbars (N.2.1).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.28</span><span class="title">N.4 angelegt — Header- & Footer-Entwurf Landingpage (iPad-Referenz) (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „nun zur Navigation auf der Landingpage … das sollte nun in den Header … wie würde der Header dann aussehen? Sollen wir das Glossar außen lassen … als Werbung, catcher für Besucher? mach auf Entwurf eine Entwurfsdarstellung des Menüs Header und Footer … auf iPad Bildschirmgröße"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>N.4.0</strong>: iPad-Größen-Tabelle. Standard-iPad an Schulen = iPad 9/10 (CSS Landscape <code>1080–1180 px</code>). Atlas-Referenz: 1080 px Worst-Case, 1180 px Komfort.</li>
|
||
<li><strong>N.4.1</strong>: Atlas-Empfehlung — Glossar bleibt Hero-Pill-Catcher (164 bebilderte Einträge zu wertvoll für Mini-Header-Link). Lehrplan + Forschung wandern in den Header, Kontakt bleibt Footer.</li>
|
||
<li><strong>N.4.2 / N.4.3</strong>: Zwei Live-Mockups bei 1080 px CSS-Breite — Variante A (alle 7 NAV im Header) vs. Variante B (6 ohne Glossar, empfohlen). Mockups sind echte HTML-Renderings mit den Design-Tokens, in <code>overflow-x:auto</code>-Containern für Skalierungs-Check.</li>
|
||
<li><strong>N.4.4</strong>: Footer-Mockup, zweizeilig (Hauptlinks + Pflicht / Forschungs-Tiefe-Reihe). Entspricht aktuellem Stand auf Landingpage.</li>
|
||
<li><strong>N.4.5</strong>: Entscheidungs-TODO — Thomas wählt Variante A / B / eigene Mix. Atlas wartet auf Freigabe, bevor <code>App/index.html</code>-Nav umgebaut wird.</li>
|
||
<li><strong>Breitenbudget Variante B</strong>: Logo 150 + 6 Links × 90 + 7 Gaps × 22 + Anmelden 120 ≈ <strong>964 px</strong>. Bei 1080 px bleibt 116 px Atmungsraum. Bei 1180 px (iPad 10) noch 216 px Reserve.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: setzt N.3.1 (drei Header-Klassen) und N.3.2 (Konkret-zu-reparieren-Liste) um, ohne sie zu ersetzen — N.4 ist der konkrete Layout-Entwurf, N.3 bleibt die Strategie.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.27</span><span class="title">Landingpage — Containerschiff-Tempo halbiert (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „Containerschiff halbes Tempo"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><code>.boat-container</code>: <code>animation: passContainer 180s → 360s linear infinite</code>.</li>
|
||
<li>Sichtbare Durchquerung (33 % des Loops) entsprechend von ≈ 60 s auf <strong>≈ 120 s</strong> verdoppelt → wirkt fast still am Horizont.</li>
|
||
<li>Loop-Pause: 240 s versteckt off-screen. Effektive Frequenz: <strong>≈ 1× pro 6 Min</strong> (statt 3 Min).</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.26</span><span class="title">Race-Yacht „26" — Sail-Print um 45° gedreht + kleiner (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „die Zahl 26 um 45 grad drehen und etwas kleiner"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><code>App/assets/img/segelyacht-race.svg</code>: <code><text></code>-Element für „26" bekommt <code>transform="rotate(-45 205 138)"</code> (gegen den Uhrzeigersinn, Drehpunkt = Text-Mitte).</li>
|
||
<li><code>font-size: 56 → 40</code> — etwas kompakter, passt besser unter die Drehung.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.25</span><span class="title">Landingpage — Motoryacht (mit Rauch) wieder entfernt (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „das Motorboot mit dem rauch bitte weglassen auf der Landingpage"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>index.html</strong>: <code>.boat-motor</code>-CSS + <code>passMotor</code> + <code>bobMotor</code>-Keyframes + Motoryacht-HTML-Div komplett entfernt.</li>
|
||
<li><strong>Asset bleibt liegen</strong>: <code>App/assets/img/motoryacht.svg</code> wird nicht gelöscht — kann bei Bedarf später wieder eingebunden werden.</li>
|
||
</ul>
|
||
<strong>Komposition jetzt wieder</strong>: drei Schichten — Race-Yacht „26" (bottom 18 %, links) · Segelyacht 1 (30 %, rechts) · Containerschiff (37 %, links, langsam). Kein Schweröl-Rauch mehr.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.24</span><span class="title">review.html — 13 Modul-Reviews via 9 parallele Agents konsolidiert (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „verlinke von der seite entwurf.html im header auf ein weiteres dokument review.html. dort kommen alle Module vor und wir schreiben das review dazu auf … du musst simulieren, was die simulation macht … nicht aufhalten, zieh durch"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Neue Doku</strong> <code>.dontDeploy/review.html</code> 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).</li>
|
||
<li><strong>Recherche</strong>: 9 parallele Explore-Agents (Heli · Klima 2D+3D · Fluss · Logistik · Sonnensystem · Busfahrt+Farmer · Energiemanager+Entscheidungstag · EU-Werkstatt+Staustufen · Glossar+Mindmap+Lehrplan). Jeder Agent las game.html + Engines + Onboarding-Texte und schrieb einen vollen Review.</li>
|
||
<li><strong>Heli-Audio-Editor</strong>: als prominenter <em>TODO Thomas</em>-Block in Heli-Review notiert — Zeitstreifen-Tool für Audiofiles nach Länge + Inhalt zu Events zuordnen. Nur Notiz, noch nicht programmiert.</li>
|
||
<li><strong>Größte Hot-Spots aus den Reviews</strong>:
|
||
<ul>
|
||
<li><strong>Logistik [M-05]</strong>: L3-Budget gebrochen (2500 € vs. Fixkosten 2800 €/Tag) — Sofort-Fix Budget → 5000 € empfohlen.</li>
|
||
<li><strong>Heli [M-03]</strong>: Kompass + Mini-Karte in Flight-Phase fehlen; Landing-Timeout 5 min frustriert; Joystick zu klein.</li>
|
||
<li><strong>Klima 3D [M-02]</strong>: Drag-Platzierung im Tutorial nicht erklärt — 11-Jährige finden die Aktion nicht.</li>
|
||
<li><strong>Entscheidungstag [M-10]</strong>: Hintergrundmusik fehlt (Status.md explizit), Dashboard-Persistenz fehlt.</li>
|
||
<li><strong>Sonnensystem [M-06]</strong>: EPOCH hardcoded 2026-01-01 — läuft bald ab; Photon-Animation fehlt.</li>
|
||
<li><strong>Fluss [M-04]</strong>: Begradigung ist nicht rückgängig zu machen, eine didaktische Sackgasse.</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Reviews als <em>lebendes Doku-File</em> — bei jeder Modul-Iteration aktualisieren. Sub-Modul-Slugs nutzen die Page-IDs aus N.1.0 (M-01 … M-11, P-03/P-04/P-05) als stabile Referenzen.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.23</span><span class="title">Landingpage — Motoryacht mit Abgaswolke + Heckwelle, kreuzt ≈ 1× pro Min (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „motor.svg liegt eine Motoryacht, etwas kürzer wie das erste segelboot, lass sie etwa jede Minute mit etwas delay verkehren … relativ weit vorne und mit deutlicher Wolkenbildung und Verschmutzung und Wellenbildung im Wasser, dunkler Rauch, der langsam vergeht. zieh durch und frage nicht mehr"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Neues Asset</strong> <code>App/assets/img/motoryacht.svg</code>: vereinfachte Motoryacht (Bug rechts, fährt nach rechts), viewBox <code>-60 -20 340 100</code> (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).</li>
|
||
<li><strong>Abgaswolke</strong>: 3 versetzte SMIL-animierte <code><circle></code>-Puffs am Schornstein. Pro Puff: <code>r</code> wächst 3 → 14, <code>cx</code> driftet nach links-hinten (128 → 68), <code>cy</code> steigt auf -12, <code>opacity</code> fällt 0,85 → 0. Loop 5 s, Versatz 0 / 1,6 s / 3,2 s. Dunkelgraue Töne (#3a3a3a / #454545 / #525252).</li>
|
||
<li><strong>Neue CSS-Klasse</strong> <code>.boat-motor</code>: <code>bottom: 14%</code> (vor allen anderen Booten — Race-Yacht bei 18 %, Segelyacht bei 30 %, Container bei 37 %), <code>opacity: .95</code>, <code>scale(.42)</code> via eigener <code>bobMotor</code>-Keyframe.</li>
|
||
<li><strong>Animation</strong>: <code>passMotor 60s linear infinite</code> mit <code>animation-delay: -8s</code>. Sichtbar 42 % (≈ 25 s schnelle Durchquerung), versteckt 58 % (≈ 35 s) → ≈ 1× pro Minute.</li>
|
||
</ul>
|
||
<strong>Ergebnis</strong>: vier-schichtige Hintergrund-Komposition — vorne (14 %) Motoryacht mit dreckigem Abgas, davor / dahinter (18 %) Race-Yacht „26", mittig (30 %) Segelyacht 1, ganz hinten (37 %) Containerschiff. Drei Richtungen (Motor + Segelyacht 1 → rechts; Race + Container → links). Erzählt visuell die ökologische Spannweite (sauberer Segeln vs. Schweröl-Verkehr).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.22</span><span class="title">Landingpage — Containerschiff deutlich langsamer + weiter hinten (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „das containerschiff sollte viel langsamer verkehren … deutlich langsamer als die segler und noch weiter hinten" + zuvor: „Container sollten eigentlich alle gleich groß sein"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>SVG vereinfacht</strong>: 2 Container-Reihen + Fenster-Raster raus. Jetzt 1 Reihe mit 10 einheitlich großen Containern (22 × 20). Schlichte Brücke ohne Fenster, kleinerer Schornstein. viewBox 320 × 60.</li>
|
||
<li><strong>Position weiter hinten</strong>: <code>bottom: 36% → 37%</code>, <code>scale .4 → .28</code>, <code>opacity .45 → .35</code>, <code>filter: saturate(.5) → saturate(.4)</code>. Wirkt ein deutlich entfernter / dunstiger.</li>
|
||
<li><strong>Animation deutlich langsamer</strong>: Loop <code>120s → 180s</code>, Durchquerung <code>15 % → 33 %</code> (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.</li>
|
||
<li><strong>Bob</strong>: kleiner (translateY ±2 px) für die kleinere Skalierung.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.21</span><span class="title">Sitemap — NAV-Marker mit Ort + Admin nicht von Landingpage + Footer-Links komplettiert (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgaben: „Admin Welt wird nicht von der Startseite aus verlinkt, ‚Anmelden' ist Nav sichtbar wie aktuell als button. Die App-Stränge ergeben sich dann durch Login als Admin, Schüler, Lehrer. Schreibe bei .NAV noch dazu, wo du den Link machen würdest?" Folge-Vorgabe: „stelle sicher, dass auf der Landingpage alle genannten links vorkommen und verlinkt sind. die Menüleiste sollte sich dann aber auch nicht ändern"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>NAV-Marker erweitert</strong>: aus <code>●NAV</code> wurde <code>●NAV: <Ort></code>. Orte: <code>Logo (überall)</code>, <code>Header</code>, <code>Header-Button</code>, <code>Footer</code>, <code>Cockpit-Topbar Logo</code>, <code>Cockpit-Topbar User-Pill</code>, <code>Cockpit-Topbar Profil-Link</code>, <code>Admin-Topbar</code>.</li>
|
||
<li><strong>Admin-Welt aus Hauptbaum entfernt</strong> als Navigations-Ziel: <code>[A-00]</code> wird nicht von Landingpage verlinkt — erreichbar nur über direkten URL-Aufruf / Bookmark. <code>[T-00]</code> + <code>[S-00]</code> ebenfalls nicht direkt von Landingpage (kommen aus dem Login).</li>
|
||
<li><strong>Legende ergänzt</strong>: Wichtig-Hinweis-Absatz erklärt explizit, dass App-Stränge sich erst durch Login ergeben und der Admin-Bereich bewusst unverlinkt ist.</li>
|
||
<li><strong>Landingpage-Footer ergänzt</strong> (Menüleiste bleibt unverändert!): Zeile 1 nun „Handbuch · Lehrplan · Glossar · Kontakt · Impressum · Datenschutz · Barrierefreiheit". Zeile 2 vorangestellt: „Forschung-Übersicht" (verlinkt <code>forschung/index.html</code>). Damit sind alle NAV-markierten Public-Seiten von der Landingpage aus erreichbar.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Hauptnav unverändert (Simulationen / Lehrperson / Handbuch / Auth-Button). Die zusätzlichen NAV-Ziele wandern in den Footer, was zu N.3.1 (drei Header-Klassen) passt. Lehrplan + Glossar bleiben zusätzlich als Hero-Pills sichtbar.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.20</span><span class="title">Sitemap — GRÜN/ROT-Markierungen (NAV / LEGACY?) + N.1.8 angelegt (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „markiere grün in deiner sitemap, welche der Punkte in der Navigation als eigene Seiten vorkommen sollen … markiere rot alle seiten die vielleicht noch Legacy sind, aber gar nicht mehr notwendig sind"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Marker-Schema</strong> in N.1.0-Legende eingeführt: <span style="color:#5a8a5e;font-weight:700">●NAV</span> = gehört in Navigation, <span style="color:#c85c4a;font-weight:700">●LEG?</span> = Lösch-Verdacht.</li>
|
||
<li><strong>GRÜN markiert in N.1.0</strong> (Hauptbaum + Sub-Bäume):
|
||
<ul>
|
||
<li>Hauptnav-Kandidaten: <code>[P-01]</code> Landing, <code>[P-02]</code> Handbuch, <code>[P-03]</code> Lehrplan, <code>[P-04]</code> Glossar, <code>[P-06]</code> Forschung-Index, <code>[P-13]</code> Kontakt, <code>[P-17]</code> Anmelden</li>
|
||
<li>Footer-Pflicht: <code>[P-14]</code> Impressum, <code>[P-15]</code> Datenschutz, <code>[P-16]</code> Barrierefreiheit</li>
|
||
<li>App-Topbar Cockpit-Selflink: <code>[S-00]</code> Schüler-Cockpit, <code>[T-00]</code> Lehrer-Cockpit; User-Pill: <code>[S-04]</code>/<code>[T-08]</code> Profil</li>
|
||
<li>Admin-Topbar: <code>[A-01]</code> Sims, <code>[A-02]</code> Module, <code>[A-03]</code> Lizenzen, <code>[A-04]</code> Styleguide</li>
|
||
</ul>
|
||
</li>
|
||
<li><strong>ROT markiert in N.1.7</strong>: alle 12 alten Top-Level-HTMLs in <code>App/</code> (energiemix, erdbeben, fluss, game, game-3d, heli, lieferketten, regenwald, sim, stadt, stadt-editor, stilauswahl, tile-test, dashboard) bekommen <span style="color:#c85c4a;font-weight:700">●LEG?</span>-Marker.</li>
|
||
<li><strong>Neu N.1.8</strong> „Weitere Legacy-Kandidaten außerhalb <code>App/</code>": <code>/index.html</code> (Repo-Root „Projektübersicht", Thomas-Hinweis), <code>App/dist/*</code> (alte Build-Output-HTMLs), <code>didaktik_geografie/</code>, <code>didaktik_simulation/</code>, <code>Konzept/</code>. Alle <span style="color:#c85c4a;font-weight:700">●LEG?</span>.</li>
|
||
</ul>
|
||
<strong>Atlas-Hinweis</strong>: vor dem Löschen Volltextsuche im aktiven Code (App/) auf jeden Pfad — falls noch verlinkt, erst Link entfernen. Konkrete Lösch-Freigabe bleibt bei Thomas.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.19</span><span class="title">Landingpage — Containerschiff am Horizont, kreuzt 1× pro 2 Min (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „unter .humanInput/svg/Container.svg ist das svg eine[s] Containerschiffs .. du könntest es etwas vereinfachen und weit hinten sehr selten queren lassen .. nur einmal pro 2 Minuten" → Folge-Vorgabe: „du kannst das Containerschiff gerne etwas vereinfachen. Die Container sollten eigentlich alle gleich groß sein"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Neues Asset</strong> <code>App/assets/img/containerschiff.svg</code>: stark vereinfachte Variante (~17 Elemente vs. ~1000+ Pfade im Original). Hull mit Bug links zugespitzt, Antifouling-Streifen, <strong>10 einheitlich große Container 22×20</strong> 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.</li>
|
||
<li><strong>Neue CSS-Klasse</strong> <code>.boat-container</code>: <code>bottom: 36%</code> (Horizont, hinter beiden Segelyachten), <code>right: -400px</code> (Start rechts off-screen), <code>opacity: .45</code>, <code>filter: saturate(.5)</code> (atmosphärische Perspektive), <code>scale(.4)</code> via eigener <code>bobContainer</code>-Keyframe.</li>
|
||
<li><strong>Animation 1× pro 2 Min</strong>: neuer <code>passContainer</code>-Keyframe — in 15% (≈18 s) von rechts nach links durchqueren, dann 102 s versteckt off-screen → 1 Loop = 120 s = exakt 2 Min. <code>animation: passContainer 120s linear infinite</code>.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: ergänzt die bestehende Schiff-Animation um eine dritte Schicht. Reihenfolge im DOM und visuell: <em>weit hinten</em> Containerschiff (bottom 36%, scale .4), <em>mitte</em> Segelyacht 1 (bottom 30%, scale .32), <em>vorne</em> Race-Yacht „26" (bottom 18%, scale .5). Keine Überlappung dank unterschiedlicher Höhen + Phasenversatz.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.18</span><span class="title">Landingpage — Vögel-Bug: 2 Vögel hingen oben links fest (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Befund: „mindestens zwei vögel sind links oben gefangen und schweben am Platz"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Ursache</strong>: Vogel-2 (delay 6s) und Vogel-3 (delay 12s) hatten kein <code>animation-fill-mode</code> → vor Ablauf der Verzögerung saßen sie in ihrer Ursprungs-Position (<code>top:0; left:0;</code>) und nur die <code>wingFlap</code>-Animation lief → wirkten wie „eingefroren".</li>
|
||
<li><strong>Fix</strong>: <code>animation-fill-mode: backwards</code> auf alle drei <code>.hero-bird-N</code>. Vor dem Delay sitzt der Vogel jetzt in seinem 0%-Keyframe-Zustand (off-screen rechts/links) statt sichtbar oben links.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.17</span><span class="title">Schüler-Sicht — Modul-Liste: coming_soon raus, Divider umbenannt (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „darunter heißt es aktuell ‚In Kürze verfügbar' .. das wird ersetzt durch: kann durch die Lehrperson freigegeben werden. die Simulationen, welche in Kürze verfügbar sind, werden hier nicht angezeigt."
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>schueler.html</strong>: Filter-Logik in <code>renderModules()</code> umgestellt. <code>coming_soon</code>-Module werden auf der Schüler-Sicht <em>vollständig ausgeblendet</em> (sie tauchen weder im Haupt-Grid noch im Divider-Block auf).</li>
|
||
<li><strong>Divider-Text</strong>: „In Kürze verfügbar" → „Kann durch die Lehrperson freigegeben werden". Inhalt sind jetzt die <code>mode === 'locked'</code>-Module (existieren, aber Lehrperson hat sie für die Klasse nicht freigegeben).</li>
|
||
<li><strong>Haupt-Grid</strong>: enthält nur noch spielbare Module (also alles außer <code>locked</code> und <code>coming_soon</code>).</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: <code>renderModCard()</code>-Logik unverändert — die Funktion kann <code>isComing</code>/<code>isLocked</code> immer noch rendern, falls sie wieder gebraucht wird. <em>Nur</em> die Filter wurden geändert.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.16</span><span class="title">profil.html Topbar — an schueler.html angeglichen (Schüler-Sicht einheitlich) (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgaben: „Schüleransicht. Wenn ein schüler in seinem Profil ist, steht links oben ‚Mein Profil' .. weg damit. wenn er auf das Logo klickt, sollte er wieder auf sein cockpit kommen. damit fällt der cockpit link rechts oben auch weg. die kopfzeile in der schüleransicht sollte immer gleich bleiben .. das sind unterschiedliche Kopfzeilen"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Topbar von profil.html komplett ersetzt</strong>: gleicher Markup wie schueler.html (<code><a href="schueler.html">Logo</a></code> · <code>spacer</code> · <code>user-pill (Avatar + Name)</code> · <code>Abmelden</code>). CSS dieselben Tokens: <code>.topbar .logo</code>, <code>.topbar .spacer</code>, <code>.topbar .user-pill</code> 1:1 übernommen.</li>
|
||
<li><strong>„Mein Profil"</strong> als statische H1-Überschrift im Header <em>entfernt</em>. Der Seitentitel im Browser-Tab bleibt „GeoGraSim — Profil".</li>
|
||
<li><strong>Logo klickbar</strong>: führt rollen-abhängig zurück — Schüler*in → <code>schueler.html</code>, Lehrperson → <code>teacher.html</code>. JS setzt <code>logo-link.href</code> nach API-<code>profile</code>-Response.</li>
|
||
<li><strong>Separater „Cockpit"-Link entfernt</strong> (vorher <code>id="nav-home"</code>): wird nicht mehr gebraucht, weil das Logo den Job macht.</li>
|
||
<li><strong>User-Pill</strong>: zeigt Avatar (Bild oder Emoji) + Name, verlinkt auf <code>profil.html</code> (gleiches Verhalten wie auf schueler.html — Konsistenz). Avatar-Rendering benutzt die bestehende <code>avatarSlugFromValue()</code>/<code>avatarUrl()</code>-Helper aus dem File.</li>
|
||
<li><strong>Lehrer-Sicht</strong>: bekommt das gleiche neue Topbar-Markup mit, weil HTML geteilt ist. Falls Thomas eine eigene Lehrer-Topbar will, separat eintragen — aktuell ist die Logik konsistent (Logo→teacher.html, Pill→Profil, Abmelden).</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Schüler-Sicht hat jetzt überall (Cockpit + Profil) <em>denselben</em> Header. Erfüllt N.3.1 / N.3.2 für den App-Strang. K-Matrix-Eintrag „App-Topbar" → erste konsistente Implementierung.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.15</span><span class="title">Sitemap N.1.0 — Grafische IA + Sub-Strang-Bäume mit Page-IDs (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe (in zwei Schritten): „erstelle unter N1 eine grafische informationsarchitektur, sinnvolle hirarchie, ausgehend von der Landingpage … ein Strang davon ist die App, bau bitte jetzt diese Struktur" → später „baue die Sitemap weiter bis in die Schüler-, Lehrer- und Adminseite. gib jeder Seite eine ID in der Sitemap"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>N.1.0 angelegt</strong>: Big-Picture-Diagramm (4 Stränge vom Landingpage-Wurzelknoten), Stamm-Hierarchie mit Page-IDs, drei Detail-Sub-Bäume (Schüler / Lehrer / Admin).</li>
|
||
<li><strong>ID-Schema</strong>: <code>[P-..]</code> Public · <code>[M-..]</code> Sim · <code>[S-..]</code> Schüler*in · <code>[T-..]</code> Lehrperson · <code>[A-..]</code> Admin. Sub-Tabs mit Punkt-Suffix (z.B. <code>[A-04.3]</code> für Styleguide-Sektion).</li>
|
||
<li><strong>Strukturbefund</strong>: 18 Public-Seiten (P-01–P-18, inkl. Forschung & Footer-Pflicht), 11 Sims (M-01–M-11), Schüler-Strang mit 6 IDs (3 Tabs + Profil + 2 Drilldowns), Lehrer-Strang mit 21 IDs (7 Tabs + 10 Modals + 4 externe Querverweise), Admin-Welt mit 5 Seiten und ~12 Sub-IDs (8 Styleguide-Sektionen + Tabs + Modals).</li>
|
||
<li><strong>Recherche</strong>: 3 parallele Explore-Agents (teacher.html, admin-Pages, schueler.html-Subseiten) → vollständige Tab/Modal-Inventur.</li>
|
||
<li><strong>Quelltabellen N.1.1–N.1.7</strong> bleiben als flache Datei-Inventur darunter stehen; die grafische IA ist das Navigations-Big-Picture.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: dient als <strong>Referenz-Index</strong> für alle weiteren Header-/Navigations-Arbeiten (N.3.x). Thomas kann ab sofort über die IDs ansprechen: „auf [T-04] fehlt …" statt „auf der Live-Sicht im Lehrer-Cockpit fehlt …".
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.14</span><span class="title">Landingpage — Glossar-Zahl dynamisch aus DB (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „glossar hat aktuell 164 begriffe .. auf der Landingpage sollte diese zahlenausgabe dynamisch in der DB nachsehen, wieviele Begriffe im Glossar sind. sonst müssen wir das dauernd korrigieren"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>API erweitert</strong>: <code>App/php/api/glossar.php</code> bekommt einen Count-Endpoint — <code>GET /api/glossar?count=1</code> → <code>{"count": N}</code> per <code>SELECT COUNT(*) FROM glossar</code>. Frühe Rückkehr vor allen anderen GET-Branches.</li>
|
||
<li><strong>index.html Pill</strong>: Text auf <code>📚 Glossar · <span data-glossar-count>140</span> Begriffe</code> umgestellt. 140 bleibt als Fallback-Wert sichtbar, falls JS/API ausfallen.</li>
|
||
<li><strong>JS-Fetch</strong>: kleiner Block am Anfang des bestehenden Footer-Scripts — <code>fetch(BASE + '/api/glossar?count=1')</code>, schreibt Anzahl in alle <code>[data-glossar-count]</code>-Elemente. Pattern identisch zum existierenden <code>/api/auth</code>-Aufruf.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Endpoint-additiv (keine Brüche), Cache-Header werden vom bestehenden GET-Branch nicht gesetzt → Standard-Browser-Caching. Bei jedem neuen Glossar-Eintrag aktualisiert sich die Landingpage-Zahl automatisch beim nächsten Reload.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.13</span><span class="title">Landingpage — Mikro-Fixes: Mini-Card höher, Lehrplan-Spaces, „fuehren" → „führen" (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgaben in derselben Iteration:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>„Lernen mit Simulationen" etwas höher</strong>: <code>.hero-mini-2 { bottom: 15% → 28% }</code>.</li>
|
||
<li><strong>„Lehrplan-Bezug 1.–4. Klasse" → „1. - 4. Klasse"</strong> (mit Leerzeichen vor und nach „-").</li>
|
||
<li><strong>Umlaut-Fix</strong>: „Klimakrise fuehren" → „Klimakrise führen" auf Hero-Card (Klimasimulator-Beschreibung).</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: 3 parallele Explore-Agenten haben index.html / handbuch.html / Footer-Seiten (impressum, datenschutz, barrierefreiheit, kontakt, forschung, literaturverzeichnis, ueber, login) auf weitere Umlaut-Transliterationen (ue/ae/oe/Ue/Ae/Oe) gescannt — nur dieser eine Treffer auf der Landingpage. Alles andere sauber UTF-8.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.12</span><span class="title">Landingpage — Zweite Segelyacht „26" (Race-Print, Orange) in Gegenrichtung (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „ein weiteres gleiches boot verkehrt weiter vorne etwas größer in die jeweils andere richtung. farblich mit unserem orange als SegelDruck Zahl 26 Startnummer und Streifen"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Neues Asset</strong>: <code>App/assets/img/segelyacht-race.svg</code> — geometrisch gespiegelte Variante (Bug nach links, Rumpf/Segel x' = 340 − x). Großsegel weiß mit zwei orangen Bändern (oben schmal, unten breit, per <code><clipPath></code> auf Sail-Polygon begrenzt) plus großer Startnummer „26" (Helvetica/Arial bold, fill <code>#e8833a</code>) zentral aufgedruckt. Rumpf-Akzentstreifen ebenfalls Orange.</li>
|
||
<li><strong>Neue CSS-Klasse</strong> <code>.boat-sail-2</code>: <code>bottom: 18%</code> (weiter vorne als Boot 1 bei 30%), <code>right: -300px</code> (kommt von rechts), <code>opacity: .95</code> (klarer als Boot 1), <code>scale(.5)</code> (~57% größer als Boot 1 mit .32), <code>driftLeft 55s</code>, <code>animation-delay: -22s</code> (Versatz).</li>
|
||
<li><strong>Keyframes ergänzt</strong>: <code>driftLeft</code> (vollständige Durchfahrt rechts→links) und <code>bobSail2</code> (kombiniert <code>scale(.5)</code> mit Bob, damit der Scale nicht vom Bob-Transform überschrieben wird — gleiche Lösung wie bei <code>bobSail</code>).</li>
|
||
<li><strong>HTML</strong>: zweiter <code>.hero-boat.boat-sail-2</code>-Container direkt unter dem ersten in <code>.hero-anim</code>.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Brand-Orange <code>#e8833a</code> = <code>--ggs-orange</code>/<code>--ggs-warning</code> aus design-system.css. Keine weiteren Sektionen betroffen, K-Matrix unverändert. Beide Boote überlappen sich animation-technisch nicht (unterschiedliche bottom-Höhen + Gegenrichtungen).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.11</span><span class="title">Landingpage — Mini-Card-Text umbenannt (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „landingpage textbehälter vor dem Modulbild oben rechts mit aufschrift „Aktueller Stand didaktischer Forschung" ändern auf „Lernen mit Simulationen""
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>index.html</strong>: <code>.hero-mini.hero-mini-2</code> — Text „Aktueller Stand didaktischer Forschung" → „Lernen mit Simulationen".</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: nur visueller Hero-Sticker, keine Auswirkungen auf andere Seiten. <code>hero-mini-1</code> („3 Module sofort testen") bleibt unverändert.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.10</span><span class="title">Landingpage — alle Boote entfernt, einzelne Segelyacht im hinteren Drittel (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „entferne alle boote auf der landingpage. im ordner svg ist eine vektografik eines segelyacht .. sehte diese stattdessen ein. … sie sollte im hinteren drittel des meers auf der landingpage verkehren"
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Entfernt</strong>: alle 6 Hero-Boote (Yacht, Motoryacht, Jolle, Fischerboot, Containerschiff, Kreuzfahrtschiff) inkl. zugehöriger CSS (<code>.boat-yacht/-motor/-jolle/-fisher/-container/-cruise</code>) und Keyframes <code>driftLeft</code>, <code>passContainer</code>, <code>passCruise</code>. Außerdem die zwei dekorativen Mini-Segelboote im City-Skyline-Divider unten.</li>
|
||
<li><strong>Asset</strong>: <code>App/assets/img/segelyacht.svg</code> (kopiert aus <code>.humanInput/svg/segelyacht.svg</code>) — Bavaria-Stil, weiße Segel + Rumpf, dunkler Unterwasserrumpf, schmaler Akzentstreifen.</li>
|
||
<li><strong>Platzierung</strong>: neue Klasse <code>.boat-sail</code> bei <code>bottom: 30%</code> (hinteres Drittel des 38%-Sea-Bands → Horizont), <code>opacity: .7</code>, <code>filter: saturate(.85)</code>, <code>scale(.32)</code> über neuen <code>bobSail</code>-Keyframe (Scale + sanftes ±10px Wippen kombiniert, damit der Scale nicht vom Bob-Transform überschrieben wird).</li>
|
||
<li><strong>Animation</strong>: <code>driftRight 75s linear infinite</code> (langsam, Horizont-typisch), <code>bobSail 5.5s ease-in-out infinite</code>.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: Hero-Animation jetzt deutlich ruhiger — nur noch Vögel + Fachbegriffe-Drift + 1 ferne Segelyacht. <code>card-fluss</code>-Text „Fahre mit dem Boot den Fluss hoch" bleibt unverändert (Modul-Beschreibung, kein visuelles Boot).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.9</span><span class="title">Über + Handbuch zusammengefasst + Logout/Logo führen zur Landingpage (2026-05-28)</span>
|
||
<div class="body">
|
||
Thomas-Vorgabe: „über und Handbuch wird zusammengefasst unter Handbuch … bitte prüfe: wenn man nicht eingeloggt ist führt Klick auf das Logo oder Schriftzug links oben immer zur Landingpage. / Abmelden rechts oben führt immer zur Landingpage."
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>handbuch.html</strong>: Sticky-Header (Logo + Simulationen/Lehrperson/Handbuch/Forschung) ergänzt. „Über GeoGraSim"-Block mit Cards (Evidenzbasiert / Lehrplan 2023 / Dashboard), Didaktik-Ansatz, Lehrplan-Tabelle und wissenschaftlichem Hintergrund vor die Übersicht gestellt.</li>
|
||
<li><strong>ueber.html</strong>: durch Meta-Refresh + JS-Redirect auf <code>handbuch.html</code> ersetzt — bestehende Bookmarks/Backlinks bleiben funktionsfähig.</li>
|
||
<li><strong>index.html Nav</strong>: <code><a href="ueber.html">Über</a></code> entfernt. Footer-Link „Über" ebenfalls entfernt. Brand-Logo zeigt weiter auf <code>#</code> (Landingpage).</li>
|
||
<li><strong>Logout → Landingpage</strong>: <code>profil.html</code>, <code>schueler.html</code>, <code>teacher.html</code> rufen nach <code>auth/logout</code> jetzt <code>location.href = 'index.html'</code> statt <code>login.html</code>.</li>
|
||
</ul>
|
||
<strong>Konsistenz</strong>: K-Matrix-Eintrag „Über/Handbuch" → jetzt eine Quelle (handbuch.html), Redirect-Stub für externe Verweise. Sitemap N.3.1 angepasst.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.8</span><span class="title">Landingpage — Schiffsrümpfe realistischer + Animation final (2026-05-28)</span>
|
||
<div class="body">
|
||
Nach Thomas-Feedback komplett überarbeitet:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Rumpf-Formen realistisch</strong>: Yacht mit Sheer-Linie + Spiegelheck, Container/Cruise mit Klipperbug-Wölbung, alle mit sichtbarem Antifouling-Streifen (rot/dunkel unter Wasserlinie). Bug nicht mehr flach abgeschnitten, sondern geneigt/geformt.</li>
|
||
<li><strong>Max 1 großes Schiff sichtbar</strong>: Container Loop 60s (sichtbar 15s), Kreuzfahrt Loop 120s mit Delay −85s (sichtbar 20s, fällt immer in eine Container-Pause). Phase-Versatz garantiert keine Überlappung.</li>
|
||
<li><strong>Kleine Boote fahren wirklich durch</strong>: <code>driftRight</code>/<code>driftLeft</code> bewegen sie vollständig über den Bildschirm. Yacht/Motor/Jolle/Fischer dürfen sich überlappen (max 2-3 sichtbar in der Spitze).</li>
|
||
<li><strong>Großschiffe weit hinten</strong>: <code>scale(.45)</code>–<code>.5</code>, <code>bottom: 24/27%</code>, <code>opacity: .5/.55</code>, <code>filter: saturate(.65/.7)</code>.</li>
|
||
</ul>
|
||
<strong>Konsistenz-Note</strong>: V1-Eingriff-Policy heute aufgehoben (Thomas-Vorgabe). Wir arbeiten lokal an V1 weiter, V2 bleibt als Skizze stehen für Ideen-Ernte.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.7</span><span class="title">Landingpage — Boote-Animation überarbeitet (2026-05-28)</span>
|
||
<div class="body">
|
||
Drei Punkte gefixt nach Thomas-Feedback:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><strong>Max 3 Schiffe gleichzeitig</strong>: alle Boote bekommen einen 80s-Loop (Großschiffe 120s/240s), aber sind nur in den ersten 30 % davon sichtbar (~24s Durchfahrt), den Rest off-screen. Versetzte <code>animation-delay</code> sorgt dafür, dass max ~3 simultan sichtbar sind.</li>
|
||
<li><strong>Schiffe fahren wirklich durch</strong>: <code>passRight</code>/<code>passLeft</code> 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.</li>
|
||
<li><strong>Große Schiffe wirken weit hinten</strong>: Container und Kreuzfahrt-Schiff auf <code>scale(.5)</code>–<code>.55</code> verkleinert, höher am Horizont positioniert (<code>bottom: 24/27%</code>), Opacity <code>.55</code> + <code>saturate(.7)</code> als Distanz-Effekt.</li>
|
||
</ul>
|
||
Datei: <code>App/index.html</code> CSS-Sektion <code>.hero-boat*</code>.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.6</span><span class="title">Forschung & Literaturverzeichnis als eigene Übersichts-Seiten (2026-05-28)</span>
|
||
<div class="body">
|
||
Footer-Links reduziert: statt 4 direkter Artikel-Links jetzt nur noch <strong>2 Übersichts-Seiten</strong>:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li><code>App/forschung/index.html</code> → URL <a href="http://localhost/geograsim/App/forschung/" target="_blank"><code>/forschung/</code></a> — Übersicht beider Fachartikel mit Beschreibung, Bezug, Links zu Artikel + Präsentation + Literatur</li>
|
||
<li><code>App/forschung/literatur.html</code> → URL <code>/forschung/literatur</code> — Übersicht beider Literaturverzeichnisse mit Zitiervorschlag</li>
|
||
</ul>
|
||
Beide Seiten haben die <strong>Hauptnav</strong> aus index.html — erster Schritt zur Header-Konsistenz (N.3.2).
|
||
Stil: ruhig, akademisch, Fjord-Token, klare Karten-Struktur.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.5</span><span class="title">Sitemap + Navigations-Review angelegt (2026-05-28)</span>
|
||
<div class="body">
|
||
Neuer Abschnitt <strong>N</strong> oben: vollständige Sitemap, Header-Inkonsistenz-Befund (3 Varianten + 8 Seiten ohne Header), Aufräum-Kandidaten,
|
||
Verbesserungs-Vorschlag (3 klar getrennte Header-Klassen).
|
||
Atlas wartet auf Thomas-Entscheidung in N.3.2 (Header-Snippet hart einkopieren oder JS-Include).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.4</span><span class="title">Footer-Links zu Forschungs-Artikeln repariert (2026-05-28)</span>
|
||
<div class="body">
|
||
Zeile 993 in <code>App/index.html</code>: drei tote Links auf <code>../didaktik_geografie/…</code> bzw. <code>../didaktik_simulation/…</code> entfernt.
|
||
Vier korrekte Links eingesetzt — Dateien liegen in <code>App/forschung/</code>:
|
||
<ul style="margin:6px 0 0 20px;font-size:0.85rem">
|
||
<li>Aktueller Forschungsstand GW-Didaktik → <code>forschung/geografie-didaktik.html</code></li>
|
||
<li>Literatur GW-Didaktik → <code>forschung/quellen-geografie.html</code></li>
|
||
<li>Simulationen im Unterricht → <code>forschung/lernen-durch-simulation.html</code></li>
|
||
<li>Literatur Simulation → <code>forschung/quellen-simulation.html</code></li>
|
||
</ul>
|
||
<p style="margin-top:6px;font-size:0.82rem;color:#8a8a8a">
|
||
Anwendung der Konsistenz-Regel <strong>K.3.5</strong> (Dokumenten-Pfad-Konsistenz). Die Hauptinhalt-Sektion „Forschung & Didaktik" (Zeilen 805–825) hatte bereits korrekte Links auf <code>forschung/</code> — nur der Footer war veraltet. Präsentationen unter <code>forschung/presentation-geografie/</code> und <code>forschung/presentation-simulation/</code> sind im Footer nicht verlinkt — Thomas entscheidet ob das soll.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.3</span><span class="title">Konsistenz-Matrix angelegt (2026-05-28)</span>
|
||
<div class="body">
|
||
Neuer Abschnitt <strong>K</strong> oben dokumentiert alle Komponenten, Datenflüsse, und „bei X-Änderung prüfe Y"-Regeln.
|
||
Wird vor jedem Commit konsultiert.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.2</span><span class="title">Landingpage — Typewriter-Satz entfernt (2026-05-28)</span>
|
||
<div class="body">
|
||
In <code>App/index.html</code> Zeile ~905: Satz „Genau wie bei <em>Typewriter</em> — einem Werkzeug, das erst im schulischen Kontext seine volle Wirkung entfaltet." entfernt. Rest des Absatzes (Einbettung im Unterricht) bleibt.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry done">
|
||
<span class="code">L.1</span><span class="title">Landingpage — Boote überarbeitet (2026-05-28)</span>
|
||
<div class="body">
|
||
Alte Boote (1 grobes Segelboot groß, 1 klein) ersetzt durch sechs neu gezeichnete SVG-Boote im Flat-Stil:
|
||
<ul style="margin:6px 0 6px 20px;font-size:0.85rem">
|
||
<li><strong>Segelyacht</strong> — weißer Rumpf mit Holz-Akzent, zwei Segel (Groß + Vor), Bullaugen-Fenster</li>
|
||
<li><strong>Jolle</strong> — kleines offenes Segelboot, dreieckiges rot-gelbes Segel, Mast leicht im Wind geneigt</li>
|
||
<li><strong>Motoryacht</strong> — niedriger weißer Aufbau, panoramaverglaste Kabine, kleine Antenne</li>
|
||
<li><strong>Fischerboot</strong> — roter Rumpf (klassische Fischer-Farbe), Kabine mit Bullauge, Schornstein, Netzgalgen</li>
|
||
<li><strong>Containerschiff</strong> — lang, dunkelblauer Rumpf, drei Container-Reihen (rot/blau/gelb/grün), Kommandobrücke hinten, Schornstein. Spawnt <strong>1× pro Minute</strong>.</li>
|
||
<li><strong>Kreuzfahrtschiff</strong> — sehr lang, dreistöckig weiß, viele Fensterreihen, sechs orange Rettungsboote, zwei Schornsteine, Radarmast. Spawnt <strong>1× alle 2 Minuten</strong>.</li>
|
||
</ul>
|
||
Datei: <code>App/index.html</code> Zeilen ~139-180 (CSS) und ~272-... (HTML).
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry info">
|
||
<span class="code">Z.2</span><span class="title">2026-05-28 (Admin-Zugang lokal)</span>
|
||
<div class="body">
|
||
Admin-Passwort: Hash neu generiert (Klartext blieb „fnahc").
|
||
Lokales 2FA-Problem entdeckt (PHPMailer fehlt) → Bypass-Tool kurz gebaut, dann <strong>wieder rückgebaut</strong>, weil V1-Workflow-Eingriff.
|
||
Backup-Hash wiederhergestellt, Bypass-Skript gelöscht. V1 wieder unangetastet.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="entry todo">
|
||
<span class="code">D.5</span><span class="title">PHPMailer lokal installieren (langfristig)</span>
|
||
<div class="body">
|
||
Damit der echte 2FA-Flow lokal auch funktioniert: <code>composer install</code> im <code>App/</code>-Ordner ausführen.
|
||
Voraussetzung: <code>composer.json</code> mit PHPMailer-Dependency vorhanden. Falls nicht: <code>composer require phpmailer/phpmailer</code>.
|
||
Vertagt — Bypass reicht für jetzt.
|
||
</div>
|
||
</div>
|
||
|
||
</body>
|
||
</html>
|