Session 2026-04-22: Training, Fixes, KI-Cloud, Dark-Mode

Training-System:
- Einheit-Dialog Bugs behoben (UI.toast callable, _dogId via _appState, activeDog.id)
- Virtueller Trainer (rein statistisch): üben/festigen/entdecken/levelup
  Empfehlungen auf Basis exercise_progress + sessions, Prognose bis 80%
- Stand erfassen Modal: alle Übungen auf einmal setzen (onboarding)
- Erfolgsindikatoren auf Karten: Ø-Quote + Trend-Pfeil + Anzahl Sessions
- exercise_progress → synthetische Stats im Trainer (ohne Sessions nutzbar)
- Levelup: Tricks empfehlen wenn ≥4 Grundkommandos sitzen
- Kommandos & Fähigkeiten im Hundeprofil + öffentlichem Profil
- 2 neue Problemverhalten-Übungen: Bellen/Kläffen, Enttriggern

Mobile/UI-Fixes:
- Übungskarten: Name + Difficulty oben, Buttons eigene Zeile (kein Umbruch)
- Trainingsgrundlagen: Padding in allen Karten, Hinweis-Boxen Dark-Mode-sicher
- Tab-Sichtbarkeit: Trainer/Suggestions nur auf Übungs-Tabs
- Tagebuch FAB (Neu-Eintrag Button) + Quick-Add Eintrag
- FAB Abstand fix (nav-bottom-height + safe-bottom)
- Suggestion-Karten rgba (Dark-Mode)
- routes.js + uebungen.js: alle Hellfarben → rgba (Dark-Mode-sicher)
- ui.js: UI.toast als callable Function-Object (war nur plain Object)

KI & Backend:
- KI_MODE=cloud + ANTHROPIC_API_KEY gesetzt
- ki.py: Cloud-Fallback wenn local nicht erreichbar + KI_MODE=cloud
- KI-Trainer Tageslimit 10 Anfragen/User + ki_daily_calls Tabelle
- Admin-Panel: KI-Nutzung (heute/Monat/User)
- Status-Report Fix (lost-Tabelle) → 06:00 + 18:00 täglich
- Wiki-Anreicherung läuft jetzt (50 Rassen Startup, 20/Nacht)
- landing.html: Trainings-Features in JSON-LD + Feature-Karten
This commit is contained in:
rene 2026-04-22 19:41:22 +02:00
parent 2b442ebd98
commit 44081a6b9d
16 changed files with 938 additions and 117 deletions

View file

@ -187,6 +187,20 @@ window.Page_diary = (() => {
<div id="diary-load-more" style="display:none; text-align:center; padding:var(--space-4)">
<button class="btn btn-secondary" id="diary-btn-more">Weitere laden</button>
</div>
<!-- FAB: Neuer Eintrag -->
<button id="diary-fab"
aria-label="Neuer Tagebucheintrag"
style="position:fixed;
bottom:calc(var(--nav-bottom-height,64px) + var(--safe-bottom,0px) + 12px);
right:16px;z-index:200;width:52px;height:52px;border-radius:50%;
background:var(--c-primary);color:#fff;cursor:pointer;
border:3px solid var(--c-surface);
display:flex;align-items:center;justify-content:center;
box-shadow:0 4px 20px rgba(0,0,0,0.35);transition:transform .15s">
<svg class="ph-icon" style="width:24px;height:24px" aria-hidden="true">
<use href="/icons/phosphor.svg#plus"></use>
</svg>
</button>
`;
_container.querySelector('#diary-milestone-filter')
@ -201,6 +215,8 @@ window.Page_diary = (() => {
_container.querySelector('#diary-import-btn')
?.addEventListener('click', _showImport);
_container.querySelector('#diary-fab')
?.addEventListener('click', () => _showForm(null));
_container.querySelector('#diary-btn-more')
?.addEventListener('click', () => _loadMore());