Landing: 7 Unsplash-Fotos mit Fotografen-Credits eingebaut (SW by-v957)
- Eric Ward: emotionaler 50/50-Split nach Stats-Band - Baptist Standaert: subtiles Hintergrundbild Demo-Section - Alvan Nee / Nicholas Brownlow / Wade Austin Ellis / Tamas Pap: 4er-Foto-Strip vor Testimonials - Chewy: Header-Bild Welpenkäufer-Section - Alle Fotos mit © Name · Unsplash Credit-Overlay
|
|
@ -406,7 +406,7 @@ async def serve_media(path: str, request: _Request):
|
||||||
raise _HE(404, "Nicht gefunden.")
|
raise _HE(404, "Nicht gefunden.")
|
||||||
return _media_response(filepath)
|
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")
|
@app.get("/.well-known/assetlinks.json")
|
||||||
async def assetlinks():
|
async def assetlinks():
|
||||||
|
|
|
||||||
BIN
backend/static/img/landing/alvan-nee.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
backend/static/img/landing/baptist-standaert.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
backend/static/img/landing/chewy.jpg
Normal file
|
After Width: | Height: | Size: 3.1 MiB |
BIN
backend/static/img/landing/eric-ward.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
backend/static/img/landing/nicholas-brownlow.jpg
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
backend/static/img/landing/tamas-pap.jpg
Normal file
|
After Width: | Height: | Size: 6.5 MiB |
BIN
backend/static/img/landing/wade-austin-ellis.jpg
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
|
|
@ -3,7 +3,7 @@
|
||||||
Router, State-Management, Navigation, Initialisierung.
|
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 APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt
|
||||||
const IS_STAGING = location.hostname === 'staging.banyaro.app';
|
const IS_STAGING = location.hostname === 'staging.banyaro.app';
|
||||||
// Cache-Bust-Parameter nach Update-Reload sofort entfernen
|
// Cache-Bust-Parameter nach Update-Reload sofort entfernen
|
||||||
|
|
|
||||||
|
|
@ -596,6 +596,65 @@
|
||||||
.testimonial-dog { font-size: 0.8rem; color: var(--primary); font-weight: 500; margin-top: 0.1rem; }
|
.testimonial-dog { font-size: 0.8rem; color: var(--primary); font-weight: 500; margin-top: 0.1rem; }
|
||||||
.testimonial-placeholder { opacity: 0.4; font-style: italic; }
|
.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 */
|
/* Scroll animations */
|
||||||
.fade-up {
|
.fade-up {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|
@ -769,8 +828,28 @@
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- Emotionaler Split: Eric Ward -->
|
||||||
|
<section style="padding:0;overflow:hidden">
|
||||||
|
<div class="moment-split">
|
||||||
|
<div class="moment-photo">
|
||||||
|
<img src="/img/landing/eric-ward.jpg" alt="Hundebesitzer umarmt seinen Golden Retriever" loading="lazy">
|
||||||
|
<span class="photo-credit">© Eric Ward · Unsplash</span>
|
||||||
|
</div>
|
||||||
|
<div class="moment-text">
|
||||||
|
<blockquote>„Ich kann mir ein Leben ohne ihn nicht mehr vorstellen."</blockquote>
|
||||||
|
<p>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.</p>
|
||||||
|
<a href="/" class="cta-btn" style="align-self:flex-start;background:white;color:#a86e2e;margin:0;box-shadow:0 4px 20px rgba(0,0,0,.15)"
|
||||||
|
onclick="sessionStorage.setItem('by_stay_in_app','1')">Kostenlos starten</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- Demo-Video -->
|
<!-- Demo-Video -->
|
||||||
<section id="demo" style="background:#1a1a1a;padding:64px 20px;text-align:center">
|
<section id="demo" style="position:relative;background:#1a1a1a;padding:64px 20px;text-align:center;overflow:hidden">
|
||||||
|
<img src="/img/landing/baptist-standaert.jpg" alt=""
|
||||||
|
loading="lazy" aria-hidden="true"
|
||||||
|
style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 20%;opacity:0.15;filter:grayscale(50%)">
|
||||||
|
<span class="photo-credit" style="position:absolute;top:7px;right:9px">© Baptist Standaert · Unsplash</span>
|
||||||
<div style="max-width:480px;margin:0 auto">
|
<div style="max-width:480px;margin:0 auto">
|
||||||
<h2 style="color:white;font-size:clamp(1.3rem,3.5vw,1.8rem);font-weight:800;margin:0 0 12px">
|
<h2 style="color:white;font-size:clamp(1.3rem,3.5vw,1.8rem);font-weight:800;margin:0 0 12px">
|
||||||
Sieh selbst wie es sich anfühlt
|
Sieh selbst wie es sich anfühlt
|
||||||
|
|
@ -933,6 +1012,28 @@
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- Foto-Strip -->
|
||||||
|
<section style="padding:0;overflow:hidden">
|
||||||
|
<div class="photo-strip">
|
||||||
|
<div class="photo-strip-item">
|
||||||
|
<img src="/img/landing/alvan-nee.jpg" alt="Zwei Hunde laufen einen Waldweg entlang" loading="lazy">
|
||||||
|
<span class="photo-credit">© Alvan Nee · Unsplash</span>
|
||||||
|
</div>
|
||||||
|
<div class="photo-strip-item">
|
||||||
|
<img src="/img/landing/nicholas-brownlow.jpg" alt="Frau gibt ihrem Golden Retriever einen Kuss" loading="lazy">
|
||||||
|
<span class="photo-credit">© Nicholas Brownlow · Unsplash</span>
|
||||||
|
</div>
|
||||||
|
<div class="photo-strip-item">
|
||||||
|
<img src="/img/landing/wade-austin-ellis.jpg" alt="Frau mit Labrador auf der Wiese" loading="lazy">
|
||||||
|
<span class="photo-credit">© Wade Austin Ellis · Unsplash</span>
|
||||||
|
</div>
|
||||||
|
<div class="photo-strip-item">
|
||||||
|
<img src="/img/landing/tamas-pap.jpg" alt="Frau lacht während ihr Hund sie abschleckt" loading="lazy">
|
||||||
|
<span class="photo-credit">© Tamas Pap · Unsplash</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- Testimonials -->
|
<!-- Testimonials -->
|
||||||
<section id="stimmen" style="background:white">
|
<section id="stimmen" style="background:white">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
@ -1049,8 +1150,14 @@
|
||||||
|
|
||||||
<!-- Sektion C: Für Welpenkäufer -->
|
<!-- Sektion C: Für Welpenkäufer -->
|
||||||
<section id="welpen" style="background: white;">
|
<section id="welpen" style="background: white;">
|
||||||
|
<div style="position:relative;height:280px;overflow:hidden">
|
||||||
|
<img src="/img/landing/chewy.jpg" alt="Pärchen mit Hund aus dem Tierheim" loading="lazy"
|
||||||
|
style="width:100%;height:100%;object-fit:cover;object-position:center 40%">
|
||||||
|
<div style="position:absolute;inset:0;background:linear-gradient(to bottom,rgba(0,0,0,.1),rgba(0,0,0,.55))"></div>
|
||||||
|
<span class="photo-credit">© Chewy · Unsplash</span>
|
||||||
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h2>Den richtigen Welpen finden. Sicher.</h2>
|
<h2 style="margin-top:2.5rem">Den richtigen Welpen finden. Sicher.</h2>
|
||||||
<p class="section-intro">Verifizierte Züchter, transparente Gesundheitsdaten, direkter Kontakt. Kein Kleinanzeigen-Chaos.</p>
|
<p class="section-intro">Verifizierte Züchter, transparente Gesundheitsdaten, direkter Kontakt. Kein Kleinanzeigen-Chaos.</p>
|
||||||
|
|
||||||
<div class="outcome-grid">
|
<div class="outcome-grid">
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Offline-Cache + Push Notifications + Tile-Cache
|
Offline-Cache + Push Notifications + Tile-Cache
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const CACHE_VERSION = 'by-v956';
|
const CACHE_VERSION = 'by-v957';
|
||||||
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
||||||
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
|
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
|
||||||
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
|
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
|
||||||
|
|
|
||||||