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:
parent
65d1cf6c7f
commit
180de32e57
22 changed files with 4351 additions and 189 deletions
|
|
@ -220,6 +220,62 @@ window.Page_diary = (() => {
|
|||
|
||||
await _load();
|
||||
_renderList();
|
||||
_loadPraise();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------
|
||||
// FORTSCHRITTS-LOBER
|
||||
// ----------------------------------------------------------
|
||||
async function _loadPraise() {
|
||||
const dog = _appState.activeDog;
|
||||
if (!dog) return;
|
||||
|
||||
const existing = _container.querySelector('#diary-praise-card');
|
||||
if (existing) existing.remove();
|
||||
|
||||
let data;
|
||||
try {
|
||||
const r = await fetch(`/api/praise/current?dog_id=${dog.id}`, {credentials: 'include'});
|
||||
data = r.ok ? await r.json() : null;
|
||||
} catch (_) { return; }
|
||||
|
||||
if (!data?.praise) return;
|
||||
|
||||
const card = document.createElement('div');
|
||||
card.id = 'diary-praise-card';
|
||||
card.style.cssText = `
|
||||
margin: var(--space-3) var(--space-4) 0;
|
||||
background: linear-gradient(135deg, var(--c-primary-subtle), #fdf6ef);
|
||||
border: 1px solid var(--c-primary-light, #e8c99a);
|
||||
border-radius: var(--radius-xl);
|
||||
padding: var(--space-4) var(--space-5);
|
||||
display: flex; gap: var(--space-3); align-items: flex-start;
|
||||
`;
|
||||
card.innerHTML = `
|
||||
<div style="font-size:1.8rem;flex-shrink:0;line-height:1">🐾</div>
|
||||
<div style="flex:1;min-width:0">
|
||||
<div style="font-size:var(--text-xs);font-weight:var(--weight-semibold);
|
||||
color:var(--c-primary-dark);text-transform:uppercase;
|
||||
letter-spacing:.06em;margin-bottom:var(--space-1)">
|
||||
Rückblick der Woche
|
||||
</div>
|
||||
<p style="font-size:var(--text-sm);color:var(--c-text);
|
||||
line-height:1.6;margin:0">${data.praise}</p>
|
||||
</div>
|
||||
<button id="diary-praise-close"
|
||||
style="background:none;border:none;cursor:pointer;padding:2px;
|
||||
color:var(--c-text-muted);flex-shrink:0;line-height:1;font-size:1.1rem"
|
||||
aria-label="Schließen">×</button>
|
||||
`;
|
||||
|
||||
const list = _container.querySelector('#diary-list');
|
||||
if (list) _container.insertBefore(card, list);
|
||||
|
||||
card.querySelector('#diary-praise-close')?.addEventListener('click', () => {
|
||||
card.style.opacity = '0';
|
||||
card.style.transition = 'opacity .2s';
|
||||
setTimeout(() => card.remove(), 200);
|
||||
});
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue