Feature: Hintergrundbild Portrait=Panorama (track/300vw) vs Landscape=Vollbild (overlay/100vw) mit Orientation-Listener (SW by-v784)
This commit is contained in:
parent
247ded6103
commit
2ff6d4dfe4
5 changed files with 42 additions and 15 deletions
|
|
@ -327,7 +327,7 @@ MEDIA_DIR = os.getenv("MEDIA_DIR", "/data/media")
|
||||||
os.makedirs(MEDIA_DIR, exist_ok=True)
|
os.makedirs(MEDIA_DIR, exist_ok=True)
|
||||||
app.mount("/media", StaticFiles(directory=MEDIA_DIR), name="media")
|
app.mount("/media", StaticFiles(directory=MEDIA_DIR), name="media")
|
||||||
|
|
||||||
APP_VER = "783" # muss mit APP_VER in app.js übereinstimmen
|
APP_VER = "784" # 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():
|
||||||
|
|
|
||||||
|
|
@ -575,10 +575,10 @@
|
||||||
<div id="modal-container"></div>
|
<div id="modal-container"></div>
|
||||||
|
|
||||||
<!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features -->
|
<!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features -->
|
||||||
<script src="/js/api.js?v=783"></script>
|
<script src="/js/api.js?v=784"></script>
|
||||||
<script src="/js/ui.js?v=783"></script>
|
<script src="/js/ui.js?v=784"></script>
|
||||||
<script src="/js/app.js?v=783"></script>
|
<script src="/js/app.js?v=784"></script>
|
||||||
<script src="/js/worlds.js?v=783"></script>
|
<script src="/js/worlds.js?v=784"></script>
|
||||||
|
|
||||||
<!-- Feature-Seiten werden lazy geladen -->
|
<!-- Feature-Seiten werden lazy geladen -->
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Router, State-Management, Navigation, Initialisierung.
|
Router, State-Management, Navigation, Initialisierung.
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const APP_VER = '783'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
const APP_VER = '784'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
||||||
const APP_VERSION = '1.5.0'; // ← semantische Version, wird bei make release gesetzt
|
const APP_VERSION = '1.5.0'; // ← 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
|
||||||
|
|
|
||||||
|
|
@ -917,23 +917,51 @@ window.Worlds = (() => {
|
||||||
} catch { return dog.foto_url || null; }
|
} catch { return dog.foto_url || null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _bgUrl = null; // aktuell gesetztes Hintergrundbild
|
||||||
|
|
||||||
|
function _applyBgOrientation() {
|
||||||
|
const ov = document.getElementById('worlds-overlay');
|
||||||
|
const track = document.getElementById('worlds-track');
|
||||||
|
if (!ov || !track || !_bgUrl) return;
|
||||||
|
const portrait = window.matchMedia('(orientation: portrait)').matches;
|
||||||
|
if (portrait) {
|
||||||
|
// Panorama: Bild über alle drei Welten, scrollt mit dem Swipe
|
||||||
|
ov.style.backgroundImage = '';
|
||||||
|
track.style.backgroundImage = `url('${_bgUrl}')`;
|
||||||
|
track.style.backgroundSize = 'cover';
|
||||||
|
track.style.backgroundPosition = 'center 40%';
|
||||||
|
track.style.backgroundRepeat = 'no-repeat';
|
||||||
|
} else {
|
||||||
|
// Vollbild pro Welt (Landscape / Desktop)
|
||||||
|
track.style.backgroundImage = '';
|
||||||
|
ov.style.backgroundImage = `url('${_bgUrl}')`;
|
||||||
|
ov.style.backgroundSize = 'cover';
|
||||||
|
ov.style.backgroundPosition = 'center 40%';
|
||||||
|
ov.style.backgroundRepeat = 'no-repeat';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Orientierungswechsel → Bild neu setzen
|
||||||
|
window.matchMedia('(orientation: portrait)').addEventListener('change', _applyBgOrientation);
|
||||||
|
|
||||||
function _applyBgImage(url) {
|
function _applyBgImage(url) {
|
||||||
const ov = document.getElementById('worlds-overlay');
|
const ov = document.getElementById('worlds-overlay');
|
||||||
if (!ov) return;
|
const track = document.getElementById('worlds-track');
|
||||||
|
if (!ov || !track) return;
|
||||||
if (url) {
|
if (url) {
|
||||||
const toLoad = new Image();
|
const toLoad = new Image();
|
||||||
toLoad.onload = () => {
|
toLoad.onload = () => {
|
||||||
_hasBgPhoto = true;
|
_hasBgPhoto = true;
|
||||||
ov.style.backgroundImage = `url('${url}')`;
|
_bgUrl = url;
|
||||||
ov.style.backgroundSize = 'cover';
|
_applyBgOrientation();
|
||||||
ov.style.backgroundPosition = 'center 40%';
|
|
||||||
ov.style.backgroundRepeat = 'no-repeat';
|
|
||||||
document.getElementById('wh-photo-hint')?.remove();
|
document.getElementById('wh-photo-hint')?.remove();
|
||||||
};
|
};
|
||||||
toLoad.onerror = () => _applyBgImage(null);
|
toLoad.onerror = () => _applyBgImage(null);
|
||||||
toLoad.src = url;
|
toLoad.src = url;
|
||||||
} else {
|
} else {
|
||||||
_hasBgPhoto = false;
|
_hasBgPhoto = false;
|
||||||
|
_bgUrl = null;
|
||||||
|
track.style.backgroundImage = '';
|
||||||
ov.style.backgroundImage = 'linear-gradient(160deg,#1a1f35 0%,#16213e 33%,#1a2535 67%,#0f1921 100%)';
|
ov.style.backgroundImage = 'linear-gradient(160deg,#1a1f35 0%,#16213e 33%,#1a2535 67%,#0f1921 100%)';
|
||||||
ov.style.backgroundSize = '100% 100%';
|
ov.style.backgroundSize = '100% 100%';
|
||||||
}
|
}
|
||||||
|
|
@ -979,8 +1007,7 @@ window.Worlds = (() => {
|
||||||
const staleMin = Math.max(weatherObj.ageMin || 0, dogsObj.ageMin || 0);
|
const staleMin = Math.max(weatherObj.ageMin || 0, dogsObj.ageMin || 0);
|
||||||
|
|
||||||
// Panorama-Bild setzen (nur wenn noch kein Bild vorhanden)
|
// Panorama-Bild setzen (nur wenn noch kein Bild vorhanden)
|
||||||
const ov = document.getElementById('worlds-overlay');
|
if (dog && !_bgUrl) {
|
||||||
if (dog && !ov?.style.backgroundImage?.startsWith('url')) {
|
|
||||||
_loadDailyImage(dog).then(_applyBgImage);
|
_loadDailyImage(dog).then(_applyBgImage);
|
||||||
} else if (!dog) { _applyBgImage(null); }
|
} else if (!dog) { _applyBgImage(null); }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Offline-Cache + Push Notifications + Tile-Cache
|
Offline-Cache + Push Notifications + Tile-Cache
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const CACHE_VERSION = 'by-v783';
|
const CACHE_VERSION = 'by-v784';
|
||||||
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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue