Feature: Sprint31 — 9 Features merged (Streak, Ausgaben, KI-Tierarzt, Rückrufe, Adoption, Vet+Befunde, Hundepass, Playdate, Rassenerkennung)

- Trainings-Streak: streak.py, DB training_streaks, Scheduler 19:00, Widget in welcome.js, Ping in uebungen.js
- Ausgaben-Tracker: expenses.py, expenses.js, DB expenses-Tabelle
- KI-Tierarztfragen: ki.py /tierarzt, health.js Button+Modal, DB ki_tierarzt_log
- Rückruf-Alarm: recalls.py, recalls.js, DB feed_recalls, Scheduler 08:00 RASFF
- Adoption: adoption.py, adoption.js, DB adoption_cache
- Tierarzt-Favorit + Befunde: tieraerzte.py /my-favorite+/favorite, health_docs.py, health.js, api.js, DB favorite_vets+health_documents
- Digitaler Hundepass: passport.py, dog-profile.js, main.py /pass/{token}, DB vaccinations+medications+dog_passport_meta+passport_shares, requirements.txt fpdf2
- Playdate-Matching: playdate.py, playdate.js, DB playdate_listings+playdate_requests
- Rassen-Erkennung: ki.py /rasse-erkennung (Claude Vision), dog-profile.js+wiki.js, CSS .rasse-result-card, DB ki_rasse_log
This commit is contained in:
rene 2026-05-02 09:29:48 +02:00
parent 031c6028ac
commit 742ad189e8
26 changed files with 5734 additions and 27 deletions

View file

@ -6803,3 +6803,124 @@ svg.empty-state-icon {
pointer-events: none;
letter-spacing: 0.01em;
}
/* ------------------------------------------------------------
STREAK-WIDGET (Welcome-Seite)
------------------------------------------------------------ */
.wc-streak-card {
display: flex;
align-items: center;
gap: var(--space-3);
margin-top: var(--space-5);
padding: var(--space-3) var(--space-4);
border-radius: var(--radius-lg, 14px);
background: linear-gradient(135deg, #ff6b00 0%, #c0392b 100%);
color: #fff;
box-shadow: 0 4px 18px rgba(196, 63, 0, 0.35);
position: relative;
overflow: hidden;
}
.wc-streak-card::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(ellipse at 10% 50%, rgba(255,255,255,0.15) 0%, transparent 60%);
pointer-events: none;
}
.wc-streak-flame-wrap {
display: flex;
align-items: center;
gap: 4px;
flex-shrink: 0;
}
.wc-streak-flame {
font-size: 2.2rem;
line-height: 1;
filter: drop-shadow(0 2px 6px rgba(0,0,0,0.3));
}
.wc-streak-number {
font-size: 2.6rem;
font-weight: 800;
line-height: 1;
letter-spacing: -0.03em;
text-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
.wc-streak-info {
flex: 1;
min-width: 0;
}
.wc-streak-label {
font-size: var(--text-sm);
font-weight: var(--weight-semibold);
opacity: 0.95;
}
.wc-streak-best {
font-size: var(--text-xs);
opacity: 0.75;
margin-top: 2px;
}
.wc-streak-lb-btn {
background: rgba(255,255,255,0.2);
border: 1.5px solid rgba(255,255,255,0.45);
border-radius: 50%;
width: 38px;
height: 38px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
color: #fff;
transition: background 0.15s;
}
.wc-streak-lb-btn:active { background: rgba(255,255,255,0.35); }
/* ------------------------------------------------------------
KI RASSEN-ERKENNUNG Ergebnis-Block
------------------------------------------------------------ */
.rasse-result-card {
background: var(--c-surface);
border: 1px solid var(--c-border);
border-radius: var(--radius-lg);
padding: var(--space-4);
margin-bottom: var(--space-3);
}
.rasse-result-card--top {
border-color: var(--c-primary);
background: var(--c-primary-subtle, #f0f9ff);
}
.rasse-result-name {
font-size: var(--text-base);
font-weight: var(--weight-semibold);
color: var(--c-text);
margin-bottom: var(--space-1);
}
.rasse-result-bar-wrap {
background: var(--c-surface-2);
border-radius: 999px;
height: 8px;
overflow: hidden;
margin: var(--space-2) 0;
}
.rasse-result-bar {
height: 8px;
border-radius: 999px;
background: var(--c-primary);
transition: width 0.6s ease;
}
.rasse-result-bar--dim {
background: var(--c-text-muted, #9ca3af);
}
.rasse-result-pct {
font-size: var(--text-sm);
font-weight: var(--weight-semibold);
color: var(--c-primary);
}
.rasse-result-pct--dim {
color: var(--c-text-muted);
}
.rasse-result-desc {
font-size: var(--text-xs);
color: var(--c-text-secondary);
margin-top: var(--space-1);
line-height: 1.4;
}