Profilbilder: Avatar-Upload, Anzeige auf Profil & Feed

- user.avatar-Spalte (Schema, migrate.sh, Migrationsdoku)
- POST /user/avatar (geschützt): Upload via storeImage, ersetzt/löscht altes Bild
- avatar in /u/{name}/info, /user/info und im entrySelect-Join (Feed-Karten)
- Account-Löschung entfernt auch das Avatar-File
- Frontend: Avatar im Profilkopf + Byline der Karten (50px), Upload-Form,
  Platzhalterbild no_profile_pic.jpg als Fallback
- .card img per :not(.avatar) von Beitragsbildern getrennt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-07 18:20:14 +02:00
parent cad1fa5c5c
commit 15ef7db5f7
11 changed files with 153 additions and 20 deletions
+31 -2
View File
@@ -158,17 +158,46 @@ a.button:hover, button:hover {
overflow-wrap: break-word;
}
.card img {
/* Beitragsbild (nicht der Byline-Avatar). */
.card img:not(.avatar) {
display: block;
max-width: 300px;
margin: 0.5rem auto;
}
/* Fokussierter Beitrag zeigt das Bild in voller Breite. */
#focus .card img {
#focus .card img:not(.avatar) {
max-width: 100%;
}
/* --- Avatare --- */
img.avatar {
display: inline-block;
vertical-align: middle;
border-radius: 50%;
object-fit: cover;
background-color: #eee;
margin: 0;
max-width: none;
}
img.avatar-sm { width: 50px; height: 50px; }
img.avatar-lg { width: 72px; height: 72px; }
/* Byline mit kleinem Avatar neben Name + Zeitstempel. */
.byline {
display: flex;
align-items: center;
gap: 0.5rem;
}
/* Profilkopf: großer Avatar links neben Name und "Mitglied seit". */
.profile-head {
display: flex;
align-items: center;
gap: 0.75rem;
}
/* Ahnenkette: der Strich links symbolisiert den Thread oberhalb des Beitrags. */
#ancestors .card {
border-left: 3px solid gray;