Feature: Vollständige Züchter-Rolle — Antrag, Würfe, Stammbaum, Genetik

Basis-Features (Schritte 1–11):
- Züchter-Antrag mit Dokument-Upload, Admin-Prüfung, E-Mail-Benachrichtigungen
- Öffentliches Züchter-Profil + Karten-Marker (lila, certificate-Icon)
- Wurfverwaltung: Würfe, Welpen, Gewichtsverlauf, Foto-System
- Wurfbörse (öffentlich) mit Filtersuche nach Rasse/Status
- Läufigkeits-Tracker: Deckdatum + Wurftermin (+63 Tage, nur für Züchter)
- Interessenten-Chat: Kontakt-Button in Wurfbörse und Züchter-Profil
- Sidebar-Einträge: Zuchtkartei + Wurfverwaltung für Züchter/Admin

Stammbaum & Genetik (Schritte 1–8):
- Zuchtkartei: Hunde-Stammdaten mit Vater/Mutter-Verknüpfung
- Stammbaum-Visualisierung: 4 Generationen, horizontales CSS-Grid
- Gesundheitstests (HD, ED, OCD, Augen…) mit farbigen Ergebnis-Badges
- Genetische Tests (MDR1, PRA, DM…): clear/carrier/affected
- Titel & Auszeichnungen (CAC, CACIB, IPO…)
- Probeverpaarung: IK-Berechnung nach Wright + Ampel-Bewertung
- Teilen-Link für öffentliche Hunde-Profile
- Kaufvertrag: druckbares HTML-Dokument pro Welpe

Technisch: 4 neue Route-Dateien, 5 neue Page-Module, 11 neue DB-Tabellen,
icons shield-check + certificate + tree-structure im Sprite — SW by-v465, APP_VER 444
This commit is contained in:
rene 2026-04-28 18:25:21 +02:00
parent 58cb2b4ad3
commit 91340be5a3
24 changed files with 6660 additions and 27 deletions

View file

@ -6551,6 +6551,132 @@ svg.empty-state-icon {
font-size: var(--text-sm);
}
/* ------------------------------------------------------------
WURFBÖRSE
------------------------------------------------------------ */
.wb-layout {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.wb-filter-bar {
display: flex;
gap: var(--space-2);
align-items: flex-end;
flex-wrap: wrap;
}
.wb-filter-fields {
display: flex;
gap: var(--space-2);
flex: 1;
flex-wrap: wrap;
}
.wb-filter-rasse { flex: 2; min-width: 160px; }
.wb-filter-status { flex: 1; min-width: 130px; }
.wb-filter-btn { white-space: nowrap; }
.wb-cards {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-4);
}
@media (min-width: 768px) {
.wb-cards { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1200px) {
.wb-cards { grid-template-columns: repeat(3, 1fr); }
}
.wb-card {
background: var(--c-surface);
border: 1px solid var(--c-border-light);
border-radius: var(--radius-lg);
padding: var(--space-4);
display: flex;
flex-direction: column;
gap: var(--space-2);
transition: box-shadow .15s;
}
.wb-card:hover { box-shadow: var(--shadow-md); }
.wb-card-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: var(--space-2);
}
.wb-card-zuechter {
font-weight: var(--weight-semibold);
font-size: var(--text-sm);
color: var(--c-text);
line-height: 1.3;
}
.wb-card-rasse {
font-size: var(--text-base);
font-weight: var(--weight-semibold);
color: var(--c-primary);
display: flex;
align-items: center;
gap: var(--space-1);
}
.wb-card-details {
display: flex;
flex-direction: column;
gap: var(--space-1);
font-size: var(--text-sm);
color: var(--c-text-secondary);
flex: 1;
}
.wb-card-eltern,
.wb-card-datum,
.wb-card-welpen,
.wb-card-preis,
.wb-card-gesundheit {
display: flex;
align-items: center;
gap: var(--space-1);
}
.wb-card-beschreibung {
margin-top: var(--space-1);
line-height: 1.4;
color: var(--c-text-secondary);
}
.wb-card-footer {
margin-top: var(--space-2);
padding-top: var(--space-2);
border-top: 1px solid var(--c-border-light);
}
/* Status-Badges */
.wb-badge {
display: inline-block;
padding: 2px 10px;
border-radius: var(--radius-full);
font-size: var(--text-xs);
font-weight: var(--weight-semibold);
color: #fff;
white-space: nowrap;
flex-shrink: 0;
}
.wb-badge--geplant { background: #6B7280; }
.wb-badge--geboren { background: #3B82F6; }
.wb-badge--verfuegbar { background: #22C55E; }
.wb-badge--abgeschlossen { background: #374151; }
/* ------------------------------------------------------------
OFFLINE-BANNER
------------------------------------------------------------ */