Neue Claude Änderungen

This commit is contained in:
jamulix 2025-10-27 15:47:04 +01:00 committed by jamulix (aider)
commit f900aff90a
5 changed files with 873 additions and 0 deletions

269
CLEANUP_GUIDE.md Normal file
View file

@ -0,0 +1,269 @@
# 🧹 Aufräum-Guide für Typewriter Tutor
## Schnell-Übersicht
```bash
./cleanup.sh # Interaktives Aufräumen (empfohlen)
```
---
## 📋 Was kann aufgeräumt werden?
### 🔴 Immer sicher zu löschen
| Was | Wo | Warum | Wie |
|-----|-----|-------|-----|
| Python-Cache | `__pycache__/` | Wird automatisch neu erstellt | `find . -name "__pycache__" -type d -exec rm -rf {} +` |
| .pyc Dateien | `*.pyc` | Kompilierte Python-Dateien | `find . -name "*.pyc" -delete` |
| Temporäre Dateien | `*.tmp`, `*.temp` | Nicht benötigt | `find . -name "*.tmp" -delete` |
| Backup-Dateien | `*.bak`, `*~` | Alte Backups | `find . -name "*.bak" -delete` |
### 🟡 Optional löschbar
| Was | Wo | Beachten | Wie |
|-----|-----|----------|-----|
| Aider-History | `.aider.*` | Nur wenn Sie Aider nicht mehr verwenden | `rm -rf .aider.*` |
| Claude Code Cache | `.claude/` | Cache wird neu erstellt | `rm -rf .claude/` |
| Log-Dateien | `*.log` | Falls nicht für Debugging benötigt | `find . -name "*.log" -delete` |
### 🟠 Vorsicht beim Löschen
| Was | Wo | Beachten | Wiederherstellung |
|-----|-----|----------|-------------------|
| Datenbank | `instance/typewriter.db` | **Alle Fortschritte gehen verloren!** | `alembic upgrade head` |
| Virtual Environment | `venv/` | Muss neu installiert werden | `./setup.sh` oder `python -m venv venv` |
| .env Datei | `.env` | **SECRET_KEY geht verloren!** | Neu generieren lassen |
### ⛔ NIE löschen
| Was | Warum |
|-----|-------|
| `data/lessons.json` | Enthält alle Tipp-Lektionen |
| `alembic/versions/` | Datenbank-Migrations-Historie |
| `requirements.txt` | Dependencies-Liste |
| Alle `.py`, `.js`, `.html`, `.css` Dateien | Kern-Anwendung |
---
## 🚀 Aufräum-Szenarien
### Szenario 1: Leichtes Aufräumen
**Ziel**: Cache und temporäre Dateien entfernen
```bash
# Automatisch (empfohlen)
./cleanup.sh
# Bei allen Fragen "n" eingeben außer bei Cache
# Oder manuell
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
find . -type f -name "*.pyc" -delete
find . -type f -name "*.tmp" -delete
git gc
```
**Ergebnis**: ~5-50 MB gespart, keine Neuinstallation nötig
---
### Szenario 2: Tiefes Aufräumen
**Ziel**: Alles außer Code und Daten zurücksetzen
```bash
./cleanup.sh
# Bei allen Fragen "j" eingeben
# Oder manuell
rm -rf __pycache__/ venv/ instance/ .aider.* .claude/
find . -name "*.pyc" -delete
```
**Dann neu aufsetzen**:
```bash
./setup.sh
```
**Ergebnis**: ~100-500 MB gespart, ~2 Minuten Neuinstallation
---
### Szenario 3: Kompletter Reset
**Ziel**: Projekt auf Auslieferungszustand zurücksetzen
```bash
# VORSICHT: Alle Daten gehen verloren!
# 1. Aufräumen
./cleanup.sh # Alle Fragen mit "j" beantworten
# 2. Git-Status prüfen
git status
# 3. Falls gewünscht: Uncommitted Changes löschen
git checkout .
git clean -fd
# 4. Neustart
./setup.sh
```
**Ergebnis**: Wie frisch geklont, alle Benutzer-Daten verloren
---
## 🎯 Empfohlene Routine
### Täglich
```bash
# Nicht nötig! Git-Ignore kümmert sich darum
```
### Wöchentlich
```bash
# Cache aufräumen
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
```
### Monatlich
```bash
# Komplettes Aufräumen
./cleanup.sh
```
### Bei Problemen
```bash
# Reset und Neuinstallation
rm -rf venv/ instance/
./setup.sh
```
---
## 📊 Speicherplatz-Analyse
### Typische Größen
```bash
# Gesamtprojekt (frisch): ~10 MB
# Mit venv: ~60 MB
# Mit Cache: ~70 MB
# Mit Datenbank: ~71 MB
# Mit Aider-History: ~75+ MB
```
### Größte Verzeichnisse prüfen
```bash
du -h --max-depth=1 | sort -hr
```
**Typisches Ergebnis**:
```
75M .
50M ./venv
10M ./.aider.tags.cache.v4
3M ./.aider.chat.history.md
5M ./static
1M ./alembic
500K ./templates
```
---
## 🔧 Nützliche Befehle
### Alle Cache-Dateien finden
```bash
find . -type d -name "__pycache__"
find . -type f -name "*.pyc"
```
### Große Dateien finden
```bash
find . -type f -size +1M -exec ls -lh {} \;
```
### Alte Dateien finden (>30 Tage)
```bash
find . -type f -mtime +30
```
### Git-Größe optimieren
```bash
git gc --aggressive --prune=now
```
### Verzeichnis-Größen
```bash
du -sh */ | sort -hr
```
---
## ✅ Checkliste vor Aufräumen
- [ ] **Wichtige Daten gesichert?**
- [ ] Datenbank-Backup erstellt (`cp instance/typewriter.db backup.db`)
- [ ] Aktuelle Änderungen committed (`git status`)
- [ ] **Was wird gelöscht verstanden?**
- [ ] Liste oben durchgelesen
- [ ] Bei Unsicherheit: Nur Cache löschen
- [ ] **Neuinstallation vorbereitet?**
- [ ] `./setup.sh` verfügbar
- [ ] Internet-Verbindung vorhanden (für pip)
- [ ] **Zeit eingeplant?**
- [ ] Leichtes Aufräumen: 10 Sekunden
- [ ] Tiefes Aufräumen: 2-5 Minuten
- [ ] Kompletter Reset: 5-10 Minuten
---
## 🆘 Probleme und Lösungen
### "Permission denied" beim Löschen
```bash
sudo rm -rf <datei> # Nicht empfohlen!
# Besser: Ownership prüfen
ls -la <datei>
```
### Virtual Environment lässt sich nicht löschen
```bash
# Erst deaktivieren
deactivate
# Dann löschen
rm -rf venv/
```
### Datenbank lässt sich nicht löschen
```bash
# App läuft möglicherweise noch
pkill -f "python app.py"
# Oder
lsof instance/typewriter.db # Zeigt, wer die Datei verwendet
```
### "Command not found: ./cleanup.sh"
```bash
# Ausführbar machen
chmod +x cleanup.sh setup.sh start.sh
```
---
## 📚 Weiterführende Links
- [PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md) - Projekt-Übersicht
- [MIGRATIONS.md](MIGRATIONS.md) - Datenbank-Migrationen
- [CLAUDE.md](CLAUDE.md) - Entwickler-Guide
---
**Tipp**: Starten Sie mit dem leichten Aufräumen und arbeiten Sie sich bei Bedarf hoch!
```bash
./cleanup.sh # Interaktiv und sicher
```

256
PROJECT_STRUCTURE.md Normal file
View file

@ -0,0 +1,256 @@
# Projekt-Struktur und Organisation
## 📁 Verzeichnis-Übersicht
```
typewriter/
├── 📂 alembic/ # Datenbank-Migrationen (Alembic)
│ ├── versions/ # Migrations-Dateien
│ ├── env.py # Alembic-Konfiguration
│ └── script.py.mako # Template für neue Migrationen
├── 📂 data/ # Daten-Dateien
│ └── lessons.json # Tipp-Lektionen (43 Lektionen)
├── 📂 instance/ # Laufzeit-Daten (nicht versioniert)
│ └── typewriter.db # SQLite-Datenbank
├── 📂 static/ # Statische Frontend-Dateien
│ ├── css/
│ │ └── style.css # Haupt-Stylesheet
│ ├── js/ # JavaScript-Module (ES6)
│ │ ├── main.js # Orchestrierung
│ │ ├── theme.js # Theme Management
│ │ ├── metronome.js # Adaptives Metronom
│ │ ├── statistics.js # Statistik-Berechnungen
│ │ ├── textDisplay.js # Text-Rendering
│ │ ├── keyboard.js # Keyboard-Handling
│ │ ├── session.js # Session Management
│ │ ├── ui.js # UI-Interaktionen
│ │ └── script.js.old # Backup der alten Datei
│ └── favicon.svg # App-Icon
├── 📂 templates/ # Jinja2-Templates
│ ├── index.html # Hauptseite
│ ├── statistics.html # Statistik-Seite
│ └── settings.html # Einstellungen
├── 📂 venv/ # Virtual Environment (nicht versioniert)
├── 📄 app.py # Flask-Hauptanwendung (879 Zeilen)
├── 📄 models.py # SQLAlchemy-Modelle
├── 📄 requirements.txt # Python-Dependencies
├── 📄 alembic.ini # Alembic-Konfiguration
├── 🧪 test_app.py # Backend-Tests (236 Zeilen, 18 Tests)
├── 🧪 test_metronome_velocity.py # Metronom-Tests (537 Zeilen)
├── 📚 CLAUDE.md # Projekt-Dokumentation für Claude Code
├── 📚 JAVASCRIPT_MODULES.md # JavaScript-Modul-Dokumentation
├── 📚 MIGRATIONS.md # Alembic-Migrations-Guide
├── 📚 README.md # Haupt-README
├── 📚 README_METRONOME_TESTS.md # Metronom-Test-Dokumentation
├── 📚 SCROLL_IMPROVEMENTS.md # Scroll-Verbesserungen
├── 📚 PROJECT_STRUCTURE.md # Diese Datei
├── 🔧 setup.sh # Komplettes Setup-Script
├── 🔧 start.sh # Start-Script
├── 🔧 cleanup.sh # Aufräum-Script
├── 🔧 setup_database.py # Datenbank-Setup (Python)
├── 🔒 .env # Umgebungsvariablen (nicht versioniert)
├── 📋 .gitignore # Git-Ignore-Regeln
└── 🗑️ Temporäre Dateien (ignoriert):
├── __pycache__/ # Python-Cache
├── .aider.* # Aider-Dateien
├── .claude/ # Claude Code-Dateien
└── to_do_list.txt # Alte Todo-Liste
```
---
## 📝 Datei-Kategorien
### 🔵 Kern-Anwendung (versioniert)
- `app.py` - Flask-Backend
- `models.py` - Datenbank-Modelle
- `templates/*.html` - Frontend-Templates
- `static/` - CSS, JavaScript, Bilder
- `data/lessons.json` - Lektions-Daten
### 🟢 Konfiguration (versioniert)
- `requirements.txt` - Python-Dependencies
- `alembic.ini` - Alembic-Konfiguration
- `alembic/` - Migrations-Dateien
- `.gitignore` - Git-Ignore-Regeln
### 🟡 Dokumentation (versioniert)
- `CLAUDE.md` - Projekt-Guide
- `README.md` - Haupt-Dokumentation
- `JAVASCRIPT_MODULES.md` - JS-Architektur
- `MIGRATIONS.md` - Datenbank-Migrations-Guide
- `SCROLL_IMPROVEMENTS.md` - Changelog
- `PROJECT_STRUCTURE.md` - Struktur-Übersicht
### 🟠 Scripts (versioniert)
- `setup.sh` - Komplettes Setup
- `start.sh` - Anwendung starten
- `cleanup.sh` - Projekt aufräumen
- `setup_database.py` - Datenbank-Setup
### 🔴 Tests (versioniert)
- `test_app.py` - Backend-Tests
- `test_metronome_velocity.py` - Metronom-Tests
### ⚫ Temporär/Generiert (NICHT versioniert)
- `venv/` - Virtual Environment
- `instance/` - Datenbank und Laufzeit-Daten
- `__pycache__/` - Python-Cache
- `.env` - Secrets und Konfiguration
- `.aider.*` - Aider-History
- `.claude/` - Claude Code-Cache
---
## 🔧 Wichtige Befehle
### Setup & Start
```bash
./setup.sh # Komplettes Setup
./start.sh # Anwendung starten
./cleanup.sh # Projekt aufräumen
```
### Entwicklung
```bash
source venv/bin/activate # Environment aktivieren
python app.py # Server starten
python -m unittest test_app # Tests ausführen
```
### Datenbank
```bash
alembic upgrade head # Migrationen anwenden
alembic revision --autogenerate -m "message" # Neue Migration
alembic downgrade -1 # Letzte Migration rückgängig
```
### Git
```bash
git status # Status prüfen
git add . # Alle Änderungen stagen
git commit -m "..." # Commit erstellen
git push origin main # Pushen
```
---
## 📊 Statistiken
### Codebase-Metriken
- **Python**: ~1.700 Zeilen (app.py, models.py, tests)
- **JavaScript**: ~1.600 Zeilen (8 Module)
- **HTML/CSS**: ~800 Zeilen
- **Dokumentation**: ~300 Zeilen (6 Markdown-Dateien)
- **Tests**: ~775 Zeilen (23 Tests total)
### Dateien nach Typ
- Python: 5 Dateien
- JavaScript: 9 Dateien (8 Module + 1 Backup)
- HTML: 3 Templates
- CSS: 1 Stylesheet
- Markdown: 7 Dokumentationen
- Shell: 3 Scripts
- JSON: 1 Datei (lessons.json)
- Config: 3 Dateien (.gitignore, alembic.ini, requirements.txt)
---
## 🧹 Aufräum-Strategie
### Was NICHT committen?
- `venv/` - Virtual Environments
- `instance/` - Datenbank-Dateien
- `__pycache__/` - Python-Cache
- `.env` - Secrets
- `.aider.*` - Aider-History
- `.claude/` - Claude Code-Cache
- `*.log` - Log-Dateien
- `*.tmp`, `*.bak` - Temporäre Dateien
### Wann aufräumen?
```bash
./cleanup.sh # Interaktives Aufräumen
```
Oder manuell:
```bash
# Python-Cache löschen
find . -type d -name "__pycache__" -exec rm -rf {} +
# Temporäre Dateien
find . -type f -name "*.tmp" -delete
find . -type f -name "*.pyc" -delete
# Datenbank zurücksetzen
rm -rf instance/
alembic upgrade head
```
---
## 🔒 Sicherheit
### Sensible Dateien (NICHT committen!)
- `.env` - Enthält SECRET_KEY
- `instance/typewriter.db` - Enthält Benutzerdaten
- `venv/` - Kann sensible Pakete enthalten
### Bereits geschützt durch .gitignore ✅
Alle sensiblen Dateien sind bereits in `.gitignore` aufgelistet.
---
## 📦 Deployment-Checkliste
1. ✅ Virtual Environment erstellen
2. ✅ Dependencies installieren
3. ✅ .env-Datei mit SECRET_KEY erstellen
4. ✅ Datenbank initialisieren (Alembic)
5. ✅ Tests ausführen
6. ✅ Anwendung starten
**Schnell-Setup**:
```bash
./setup.sh && ./start.sh
```
---
## 🎯 Best Practices
### Entwicklung
1. **Immer** Virtual Environment verwenden
2. **Vor** Schema-Änderungen: Alembic-Migration erstellen
3. **Nach** Code-Änderungen: Tests ausführen
4. **Vor** Commit: Code aufräumen (`./cleanup.sh`)
### Git-Workflow
1. Änderungen machen
2. Tests ausführen
3. `git add .`
4. `git commit -m "Beschreibung"`
5. `git push origin main`
### Datenbank-Änderungen
1. Models in `models.py` ändern
2. `alembic revision --autogenerate -m "Beschreibung"`
3. Migration prüfen: `alembic/versions/*.py`
4. `alembic upgrade head`
5. Testen!
---
**Letzte Aktualisierung**: 2025-10-27
**Version**: 1.2.0

82
cleanup.sh Executable file
View file

@ -0,0 +1,82 @@
#!/bin/bash
# Projekt-Aufräum-Script für Typewriter Tutor
echo "🧹 Typewriter Tutor - Projekt aufräumen"
echo "========================================"
echo ""
# Sichere Bestätigung
read -p "Möchten Sie das Projekt aufräumen? (j/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Jj]$ ]]; then
echo "Abgebrochen."
exit 1
fi
echo ""
echo "1⃣ Lösche Python-Cache..."
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
find . -type f -name "*.pyc" -delete 2>/dev/null
find . -type f -name "*.pyo" -delete 2>/dev/null
find . -type f -name "*.pyd" -delete 2>/dev/null
echo " ✓ Python-Cache gelöscht"
echo ""
echo "2⃣ Lösche Aider-Dateien (optional)..."
read -p " Aider-History löschen? (j/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Jj]$ ]]; then
rm -rf .aider.chat.history.md .aider.input.history .aider.tags.cache.v4/ 2>/dev/null
echo " ✓ Aider-Dateien gelöscht"
else
echo " ⊘ Aider-Dateien behalten"
fi
echo ""
echo "3⃣ Lösche temporäre Dateien..."
find . -type f -name "*.tmp" -delete 2>/dev/null
find . -type f -name "*.temp" -delete 2>/dev/null
find . -type f -name "*.bak" -delete 2>/dev/null
find . -type f -name "*~" -delete 2>/dev/null
echo " ✓ Temporäre Dateien gelöscht"
echo ""
echo "4⃣ Datenbank zurücksetzen (optional)..."
read -p " Datenbank löschen und neu erstellen? (j/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Jj]$ ]]; then
rm -rf instance/typewriter.db 2>/dev/null
echo " ✓ Datenbank gelöscht"
echo " Führe 'alembic upgrade head' aus, um neu zu erstellen"
else
echo " ⊘ Datenbank behalten"
fi
echo ""
echo "5⃣ Virtual Environment (optional)..."
read -p " Virtual Environment löschen und neu erstellen? (j/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Jj]$ ]]; then
rm -rf venv/ 2>/dev/null
echo " ✓ Virtual Environment gelöscht"
echo " Führe './setup.sh' aus, um neu zu erstellen"
else
echo " ⊘ Virtual Environment behalten"
fi
echo ""
echo "6⃣ Git aufräumen..."
git gc --quiet 2>/dev/null
echo " ✓ Git-Datenbank optimiert"
echo ""
echo "======================================"
echo "✅ Aufräumen abgeschlossen!"
echo ""
echo "Nächste Schritte (falls nötig):"
echo " 1. python -m venv venv"
echo " 2. source venv/bin/activate"
echo " 3. pip install -r requirements.txt"
echo " 4. alembic upgrade head"
echo " 5. python app.py"
echo ""

102
setup.sh Executable file
View file

@ -0,0 +1,102 @@
#!/bin/bash
# Komplettes Setup-Script für Typewriter Tutor
echo "🚀 Typewriter Tutor - Komplettes Setup"
echo "========================================"
echo ""
# Prüfe ob Python3 installiert ist
if ! command -v python3 &> /dev/null; then
echo "❌ Python3 nicht gefunden!"
echo " Bitte installiere Python 3.11 oder höher."
exit 1
fi
PYTHON_VERSION=$(python3 --version | awk '{print $2}')
echo "✓ Python gefunden: $PYTHON_VERSION"
echo ""
# Schritt 1: Virtual Environment
echo "1⃣ Virtual Environment erstellen..."
if [ -d "venv" ]; then
echo " ⚠ Virtual Environment existiert bereits"
read -p " Neu erstellen? (j/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Jj]$ ]]; then
rm -rf venv/
python3 -m venv venv
echo " ✓ Virtual Environment neu erstellt"
else
echo " ⊘ Bestehendes Environment verwenden"
fi
else
python3 -m venv venv
echo " ✓ Virtual Environment erstellt"
fi
# Schritt 2: Dependencies
echo ""
echo "2⃣ Abhängigkeiten installieren..."
source venv/bin/activate
pip install --upgrade pip --quiet
pip install -r requirements.txt
echo " ✓ Abhängigkeiten installiert"
# Schritt 3: Datenbank
echo ""
echo "3⃣ Datenbank initialisieren..."
if [ -f "instance/typewriter.db" ]; then
echo " ⚠ Datenbank existiert bereits"
read -p " Neu erstellen? (j/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Jj]$ ]]; then
rm -rf instance/
mkdir -p instance
alembic upgrade head
echo " ✓ Datenbank neu erstellt"
else
echo " ⊘ Bestehende Datenbank verwenden"
alembic upgrade head 2>/dev/null
fi
else
mkdir -p instance
alembic upgrade head
echo " ✓ Datenbank erstellt"
fi
# Schritt 4: .env Datei
echo ""
echo "4⃣ Umgebungsvariablen..."
if [ ! -f ".env" ]; then
echo " Erstelle .env Datei..."
SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))")
echo "SECRET_KEY=$SECRET_KEY" > .env
chmod 600 .env
echo " ✓ .env Datei erstellt"
else
echo " ✓ .env Datei existiert bereits"
fi
# Schritt 5: Scripts ausführbar machen
echo ""
echo "5⃣ Scripts konfigurieren..."
chmod +x start.sh cleanup.sh setup.sh 2>/dev/null
echo " ✓ Scripts sind ausführbar"
# Abschluss
echo ""
echo "======================================"
echo "✅ Setup abgeschlossen!"
echo ""
echo "Nächste Schritte:"
echo " 1. Starte die Anwendung:"
echo " ./start.sh"
echo ""
echo " 2. Öffne im Browser:"
echo " http://localhost:5000"
echo ""
echo "Weitere Befehle:"
echo " • ./cleanup.sh - Projekt aufräumen"
echo " • ./start.sh - Anwendung starten"
echo " • python test_app.py - Tests ausführen"
echo ""

164
templates/hilfe.html Normal file
View file

@ -0,0 +1,164 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hilfe - Typewriter Trainer</title>
<link rel="icon" type="image/svg+xml" href="{{ url_for('static', filename='favicon.svg') }}">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<style>
.hilfe-content {
padding: 2rem 0;
max-width: 900px;
margin: 0 auto;
}
.hilfe-content h1 {
border-bottom: 3px solid #0d6efd;
padding-bottom: 0.5rem;
margin-bottom: 2rem;
}
.hilfe-content h2 {
margin-top: 2rem;
margin-bottom: 1rem;
color: #0d6efd;
}
.hilfe-content h3 {
margin-top: 1.5rem;
margin-bottom: 0.75rem;
}
.hilfe-content table {
width: 100%;
margin: 1rem 0;
}
.hilfe-content table th,
.hilfe-content table td {
padding: 0.5rem;
border: 1px solid #dee2e6;
}
.hilfe-content table th {
background-color: #f8f9fa;
font-weight: bold;
}
.hilfe-content code {
background-color: #f8f9fa;
padding: 0.2rem 0.4rem;
border-radius: 3px;
font-size: 0.9em;
}
.hilfe-content pre {
background-color: #f8f9fa;
padding: 1rem;
border-radius: 5px;
overflow-x: auto;
}
.hilfe-content hr {
margin: 2rem 0;
border-top: 2px solid #dee2e6;
}
.hilfe-content ul,
.hilfe-content ol {
margin-left: 1.5rem;
}
.hilfe-content li {
margin-bottom: 0.5rem;
}
.back-button {
position: fixed;
bottom: 2rem;
right: 2rem;
z-index: 1000;
}
/* Dark Mode Anpassungen */
[data-bs-theme="dark"] .hilfe-content {
color: #e0e0e0;
}
[data-bs-theme="dark"] .hilfe-content h1,
[data-bs-theme="dark"] .hilfe-content h2 {
color: #58a6ff;
}
[data-bs-theme="dark"] .hilfe-content table th {
background-color: #2d2d2d;
border-color: #444;
}
[data-bs-theme="dark"] .hilfe-content table td {
border-color: #444;
}
[data-bs-theme="dark"] .hilfe-content code,
[data-bs-theme="dark"] .hilfe-content pre {
background-color: #2d2d2d;
color: #e0e0e0;
}
[data-bs-theme="dark"] .hilfe-content hr {
border-top-color: #444;
}
</style>
</head>
<body class="bg-light" data-bs-theme="light">
<div class="container">
<!-- Header -->
<div class="card shadow mt-4">
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
<h2 class="mb-0">📖 Typewriter Trainer - Hilfe</h2>
<button id="theme-toggle" class="btn btn-outline-light btn-sm" type="button">
<span id="theme-icon">🌙</span>
</button>
</div>
</div>
<!-- Hilfe-Inhalt -->
<div class="card shadow mt-3 mb-5">
<div class="card-body hilfe-content">
{{ hilfe_html|safe }}
</div>
</div>
</div>
<!-- Zurück-Button -->
<a href="{{ url_for('index') }}" class="btn btn-primary btn-lg back-button shadow">
← Zurück zum Trainer
</a>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
// Theme Management
const themeToggle = document.getElementById('theme-toggle');
const themeIcon = document.getElementById('theme-icon');
const body = document.body;
// Load saved theme
const savedTheme = localStorage.getItem('theme') || 'light';
body.setAttribute('data-bs-theme', savedTheme);
updateThemeIcon(savedTheme);
// Theme toggle handler
themeToggle.addEventListener('click', () => {
const currentTheme = body.getAttribute('data-bs-theme');
const newTheme = currentTheme === 'light' ? 'dark' : 'light';
body.setAttribute('data-bs-theme', newTheme);
localStorage.setItem('theme', newTheme);
updateThemeIcon(newTheme);
});
function updateThemeIcon(theme) {
themeIcon.textContent = theme === 'dark' ? '☀️' : '🌙';
}
// Smooth scroll for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
</script>
</body>
</html>