feat: Rennmausakte, Zucht-Suffix, Gehege-Bilder, Toasts, Infinite-Scroll
Detailseite (Rennmausakte): - Neugestaltung: Hero-Foto + Overlay, Schnellfakten-Pills, Karten-Sektionen, Charakter als Chips, getabte Fotos/Gesundheit/Gewicht. - Eltern (Vater/Mutter) als Links; Charakter-Karte klappt bei Status Abgabe/Verstorben/Abgegeben ein (nur Zucht/Liebhaber offen). - Gehege wird bei abgegebenen/verstorbenen Tieren ausgeblendet (Detail + Formular). Listen: - Infinite Scroll auf allen Listen (Rennmäuse, Würfe, Gehege, Verträge, Anfragen, Kontakte) via useInfiniteList/useInfiniteSentinel; stabile Sortierung mit id-Tiebreaker (keine doppelten Keys), Back-to-top-Button. - Kontakte: Rolle-Filter (Züchter/Abnehmer) als Quick-Chips + Sticky-Header. Zucht-Nachname: - Namens-Anhängsel der Zucht in den Einstellungen + je Züchter-Kontakt (Backend-Spalten + Migration); eigene Tiere zeigen „Name + Suffix". - „Eigene Zucht" ist die Standard-Herkunft neuer Tiere. Weiteres: - Gehege-Bilder: Upload/Galerie auf der Gehege-Detailseite (Backend EnclosurePhoto + Endpoints + Migration, geteilte Dateiablage). - Toast-Rückmeldungen für alle Speichern-Aktionen. - Checkboxen durch mobile-freundliche Toggle-Schalter ersetzt. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -348,13 +348,65 @@ textarea {
|
||||
border: 1px dashed #bbb;
|
||||
}
|
||||
|
||||
/* Checkbox-style filter (label text + box on one row), vs. the stacked .field. */
|
||||
/* Checkbox-style filter (label text + toggle on one row), vs. the stacked .field. */
|
||||
.field--check {
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 0.4rem;
|
||||
}
|
||||
|
||||
/* Toggle-switch styling for boolean checkboxes + the multi-select pickers
|
||||
(mobile-friendlier than a checkbox). The element stays a real <input
|
||||
type="checkbox"> — role, keyboard and form semantics are unchanged. */
|
||||
.field--check input[type='checkbox'],
|
||||
.wizard-pick input[type='checkbox'],
|
||||
.namegen-usages-grid input[type='checkbox'] {
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
flex: 0 0 auto;
|
||||
position: relative;
|
||||
width: 2.5rem;
|
||||
height: 1.45rem;
|
||||
min-height: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
border-radius: 999px;
|
||||
background: var(--color-border);
|
||||
cursor: pointer;
|
||||
transition: background 0.18s ease;
|
||||
}
|
||||
.field--check input[type='checkbox']::after,
|
||||
.wizard-pick input[type='checkbox']::after,
|
||||
.namegen-usages-grid input[type='checkbox']::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
left: 2px;
|
||||
width: calc(1.45rem - 4px);
|
||||
height: calc(1.45rem - 4px);
|
||||
border-radius: 50%;
|
||||
background: #fff;
|
||||
box-shadow: 0 1px 2px rgba(61, 46, 35, 0.35);
|
||||
transition: transform 0.18s ease;
|
||||
}
|
||||
.field--check input[type='checkbox']:checked,
|
||||
.wizard-pick input[type='checkbox']:checked,
|
||||
.namegen-usages-grid input[type='checkbox']:checked {
|
||||
background: var(--color-accent);
|
||||
}
|
||||
.field--check input[type='checkbox']:checked::after,
|
||||
.wizard-pick input[type='checkbox']:checked::after,
|
||||
.namegen-usages-grid input[type='checkbox']:checked::after {
|
||||
transform: translateX(calc(2.5rem - 1.45rem));
|
||||
}
|
||||
.field--check input[type='checkbox']:focus-visible,
|
||||
.wizard-pick input[type='checkbox']:focus-visible,
|
||||
.namegen-usages-grid input[type='checkbox']:focus-visible {
|
||||
outline: 2px solid var(--color-accent);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.gerbil-card {
|
||||
grid-template-columns: 2fr 1fr 1.5fr 1fr auto;
|
||||
|
||||
Reference in New Issue
Block a user