Perf: Freunde-Seite nutzt _preview.webp + lazy loading, SW by-v1109

Symptom: Friends-Seite lädt Avatare langsam — Original-Bilder
(z.B. 4-12MB iPhone-Fotos) statt der vorhandenen _preview.webp
Vorschauen.

Neue zentrale Helper in ui.js:
- UI.previewUrl(url): ersetzt /media/...jpg → /media/..._preview.webp
- UI.previewFallback(originalUrl): onerror-Handler der Original
  nachlädt falls _preview nicht existiert (für ältere Uploads)

friends.js 3 Stellen migriert:
- _userAvatar (Freundes-Karte + Aktivitäts-Feed)
- Activity-Avatar (dog_foto + avatar_url)
- Dog-Mini-Thumbs im Profil-Modal

Zusätzlich auf allen drei Stellen:
- loading="lazy" für off-screen Bilder
- decoding="async" damit der Hauptthread nicht blockiert

Reuse-Potential: wiki.js, dog-profile.js und andere können später
auf die zentralen Helper umgestellt werden.
This commit is contained in:
rene 2026-05-27 08:50:09 +02:00
parent f6633d65b0
commit 2f37e0ed16
7 changed files with 45 additions and 21 deletions

View file

@ -285,6 +285,22 @@ const UI = (() => {
// ----------------------------------------------------------
// LEERER ZUSTAND (Empty State)
// ----------------------------------------------------------
// ----------------------------------------------------------
// PREVIEW-URL — für lokale Media: _preview.webp statt Original
// ----------------------------------------------------------
// Verwendung:
// <img src="${UI.previewUrl(profile.foto_url)}"
// onerror="${UI.previewFallback(profile.foto_url)}">
function previewUrl(url) {
if (!url || !url.startsWith('/media/')) return url || '';
return url.replace(/\.(jpe?g|png|gif|webp)$/i, '_preview.webp');
}
// onerror-Handler: bei 404 vom _preview die Original-URL nachladen
function previewFallback(originalUrl) {
if (!originalUrl || !originalUrl.startsWith('/media/')) return '';
return `if(this.src.includes('_preview')){this.src='${escape(originalUrl)}'}else{this.style.opacity='0.3'}`;
}
function emptyState({ icon, title, text, action } = {}) {
return `
<div class="empty-state">
@ -1252,6 +1268,7 @@ const UI = (() => {
setLoading, asyncButton,
formData, setFormError, clearFormErrors,
emptyState, errorState, time,
previewUrl, previewFallback,
setupPhotoPreview, scrollTop, skeleton, skeletonList,
moneyInput, parseMoney, datePicker,
icon: _svgIcon,