${_esc((item.user_name || '?')[0].toUpperCase())}
@@ -537,7 +539,8 @@ window.Page_friends = (() => {
padding-top:var(--space-3);border-top:1px solid var(--c-border)">
${withPhotos.slice(0, 4).map(d => `
-
`;
}
if (firstDog?.foto_url) {
- return `
})
`;
}
diff --git a/backend/static/js/ui.js b/backend/static/js/ui.js
index 0d43666..52710f7 100644
--- a/backend/static/js/ui.js
+++ b/backend/static/js/ui.js
@@ -285,6 +285,22 @@ const UI = (() => {
// ----------------------------------------------------------
// LEERER ZUSTAND (Empty State)
// ----------------------------------------------------------
+ // ----------------------------------------------------------
+ // PREVIEW-URL — für lokale Media: _preview.webp statt Original
+ // ----------------------------------------------------------
+ // Verwendung:
+ //
})
+ 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 `
@@ -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,
diff --git a/backend/static/landing.html b/backend/static/landing.html
index 46813e9..df14320 100644
--- a/backend/static/landing.html
+++ b/backend/static/landing.html
@@ -4,7 +4,7 @@
-
+
Ban Yaro — Die Hunde-App für Deutschland, Österreich & Schweiz
diff --git a/backend/static/sw.js b/backend/static/sw.js
index ec42934..d8de5e4 100644
--- a/backend/static/sw.js
+++ b/backend/static/sw.js
@@ -4,7 +4,7 @@
============================================================ */
// ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab
-const VER = '1108';
+const VER = '1109';
const CACHE_VERSION = `by-v${VER}`;
const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten