diff --git a/backend/main.py b/backend/main.py index d3515d6..24ca728 100644 --- a/backend/main.py +++ b/backend/main.py @@ -406,7 +406,7 @@ async def serve_media(path: str, request: _Request): raise _HE(404, "Nicht gefunden.") return _media_response(filepath) -APP_VER = "956" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "957" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/static/img/landing/alvan-nee.jpg b/backend/static/img/landing/alvan-nee.jpg new file mode 100644 index 0000000..de2e07d Binary files /dev/null and b/backend/static/img/landing/alvan-nee.jpg differ diff --git a/backend/static/img/landing/baptist-standaert.jpg b/backend/static/img/landing/baptist-standaert.jpg new file mode 100644 index 0000000..36c1f14 Binary files /dev/null and b/backend/static/img/landing/baptist-standaert.jpg differ diff --git a/backend/static/img/landing/chewy.jpg b/backend/static/img/landing/chewy.jpg new file mode 100644 index 0000000..a87c08b Binary files /dev/null and b/backend/static/img/landing/chewy.jpg differ diff --git a/backend/static/img/landing/eric-ward.jpg b/backend/static/img/landing/eric-ward.jpg new file mode 100644 index 0000000..3df44a8 Binary files /dev/null and b/backend/static/img/landing/eric-ward.jpg differ diff --git a/backend/static/img/landing/nicholas-brownlow.jpg b/backend/static/img/landing/nicholas-brownlow.jpg new file mode 100644 index 0000000..c184f6c Binary files /dev/null and b/backend/static/img/landing/nicholas-brownlow.jpg differ diff --git a/backend/static/img/landing/tamas-pap.jpg b/backend/static/img/landing/tamas-pap.jpg new file mode 100644 index 0000000..7a47b34 Binary files /dev/null and b/backend/static/img/landing/tamas-pap.jpg differ diff --git a/backend/static/img/landing/wade-austin-ellis.jpg b/backend/static/img/landing/wade-austin-ellis.jpg new file mode 100644 index 0000000..b8fdeaf Binary files /dev/null and b/backend/static/img/landing/wade-austin-ellis.jpg differ diff --git a/backend/static/js/app.js b/backend/static/js/app.js index c3e4f6f..2a3d251 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '956'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '957'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen diff --git a/backend/static/landing.html b/backend/static/landing.html index 64c8e4e..9c8ca02 100644 --- a/backend/static/landing.html +++ b/backend/static/landing.html @@ -596,6 +596,65 @@ .testimonial-dog { font-size: 0.8rem; color: var(--primary); font-weight: 500; margin-top: 0.1rem; } .testimonial-placeholder { opacity: 0.4; font-style: italic; } + /* Foto-Sections */ + .photo-credit { + position: absolute; + bottom: 7px; right: 9px; + font-size: 0.62rem; + color: rgba(255,255,255,0.8); + background: rgba(0,0,0,0.32); + padding: 2px 7px; + border-radius: 4px; + letter-spacing: 0.03em; + backdrop-filter: blur(3px); + pointer-events: none; + } + .photo-strip { + display: grid; + grid-template-columns: repeat(4,1fr); + gap: 3px; + } + @media (max-width: 640px) { .photo-strip { grid-template-columns: repeat(2,1fr); } } + .photo-strip-item { + position: relative; + aspect-ratio: 1; + overflow: hidden; + } + .photo-strip-item img { + width: 100%; height: 100%; + object-fit: cover; + transition: transform 0.45s ease; + display: block; + } + .photo-strip-item:hover img { transform: scale(1.04); } + .moment-split { + display: grid; + grid-template-columns: 1fr 1fr; + min-height: 420px; + } + @media (max-width: 700px) { + .moment-split { grid-template-columns: 1fr; } + .moment-split .moment-photo { aspect-ratio: 4/3; min-height: unset; } + } + .moment-photo { position: relative; overflow: hidden; } + .moment-photo img { width: 100%; height: 100%; object-fit: cover; display: block; } + .moment-text { + background: linear-gradient(135deg, #C4843A 0%, #d4944a 100%); + color: white; + display: flex; + flex-direction: column; + justify-content: center; + padding: clamp(2rem,5vw,3.5rem); + gap: 1.5rem; + } + .moment-text blockquote { + font-size: clamp(1.3rem,2.5vw,1.9rem); + font-weight: 800; + line-height: 1.3; + margin: 0; + } + .moment-text p { font-size: 1rem; opacity: 0.88; margin: 0; line-height: 1.65; } + /* Scroll animations */ .fade-up { opacity: 0; @@ -769,8 +828,28 @@ + +
+
+
+ Hundebesitzer umarmt seinen Golden Retriever + © Eric Ward · Unsplash +
+
+
„Ich kann mir ein Leben ohne ihn nicht mehr vorstellen."
+

Das sagen uns Tausende Hundemenschen täglich. Ban Yaro begleitet diese Liebe — mit Tagebuch, Gesundheit, Training und einer Gemeinschaft die genauso fühlt wie du.

+ Kostenlos starten +
+
+
+ -
+
+ + © Baptist Standaert · Unsplash

Sieh selbst wie es sich anfühlt @@ -933,6 +1012,28 @@

+ +
+
+
+ Zwei Hunde laufen einen Waldweg entlang + © Alvan Nee · Unsplash +
+
+ Frau gibt ihrem Golden Retriever einen Kuss + © Nicholas Brownlow · Unsplash +
+
+ Frau mit Labrador auf der Wiese + © Wade Austin Ellis · Unsplash +
+
+ Frau lacht während ihr Hund sie abschleckt + © Tamas Pap · Unsplash +
+
+
+
@@ -1049,8 +1150,14 @@
+
+ Pärchen mit Hund aus dem Tierheim +
+ © Chewy · Unsplash +
-

Den richtigen Welpen finden. Sicher.

+

Den richtigen Welpen finden. Sicher.

Verifizierte Züchter, transparente Gesundheitsdaten, direkter Kontakt. Kein Kleinanzeigen-Chaos.

diff --git a/backend/static/sw.js b/backend/static/sw.js index 61d888f..1ea46ea 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v956'; +const CACHE_VERSION = 'by-v957'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache