Session 2026-04-21: SEO, Wiki-Anreicherung, Training, Lober

SEO & Crawler:
- robots.txt, llms.txt, sitemap.xml (508 Seiten bei Google)
- SSR-Seiten: /info, /wiki/rassen, /wiki/rasse/{slug}, /knigge
- Open Graph, JSON-LD, Breadcrumbs in index.html

Navigation:
- Training unter "Mein Hund", Wissen collapsible
- Welcome-Seite und Landing-Page auf 5-Gruppen-Struktur

Wiki:
- KI-Anreicherung (Claude API): beschreibung, vorkommen_de, Steckbrief
- "So einen hab ich" / Züchter-Verzeichnis
- Scheduler: 50 Rassen beim Start, 20/Nacht

Training:
- Session-Logging (Erfolgsquote, Stimmung, Zufriedenheit)
- Virtueller KI-Trainer (6h-Cache)
- Trainingskalender (Habit-Tracker)
- Top-Training → automatischer Tagebucheintrag
- Gamification ohne Druck: Badges, Streak, Stats

Fortschritts-Lober:
- Jeden Montag 09:00: Claude schreibt Lob-Text pro Hund
- Push + Karte im Tagebuch

Monitoring:
- 4× täglich Status-Mail mit Scheduler-Status + Wiki-Fortschritt
This commit is contained in:
rene 2026-04-21 19:38:20 +02:00
parent 65d1cf6c7f
commit 180de32e57
22 changed files with 4351 additions and 189 deletions

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung.
============================================================ */
const APP_VER = '262'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VER = '267'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const App = (() => {
@ -103,6 +103,7 @@ const App = (() => {
state.page = pageId;
UI.scrollTop();
_expandWissenIfActive(pageId);
// Seiten-Modul lazy laden (einmalig)
_loadPage(pageId, params);
@ -309,6 +310,12 @@ const App = (() => {
return;
}
// Wissen-Toggle aufklappen/zuklappen
if (e.target.closest('#wissen-toggle')) {
_toggleWissen();
return;
}
// Sidebar-Item auf Mobile → schließen nach Navigation
if (e.target.closest('#sidebar .sidebar-item')) {
_closeSidebar();
@ -346,6 +353,22 @@ const App = (() => {
document.getElementById('sidebar-backdrop')?.classList.remove('visible');
}
const _WISSEN_PAGES = new Set(['wiki', 'knigge', 'movies', 'erste-hilfe']);
function _toggleWissen(force) {
const toggle = document.getElementById('wissen-toggle');
const body = document.getElementById('wissen-body');
if (!toggle || !body) return;
const open = force !== undefined ? force : toggle.getAttribute('aria-expanded') !== 'true';
toggle.setAttribute('aria-expanded', open ? 'true' : 'false');
body.classList.toggle('open', open);
try { localStorage.setItem('by_wissen_open', open ? '1' : '0'); } catch (_) {}
}
function _expandWissenIfActive(page) {
if (_WISSEN_PAGES.has(page)) _toggleWissen(true);
}
// ----------------------------------------------------------
// SCHNELL-HINZUFÜGEN (+ Button)
// ----------------------------------------------------------
@ -744,6 +767,12 @@ const App = (() => {
}
_bindNavigation();
// Wissen-Sektion: gespeicherten Zustand wiederherstellen
try {
if (localStorage.getItem('by_wissen_open') === '1') _toggleWissen(true);
} catch (_) {}
await _checkAuth();
// Einladungslink /teilen/{token} → direkt annehmen