Layout: JETZT/HUND/WELT Nav nach unten, Info-Karte höher

- #world-dots: ausgeblendet auf Mobile (Labels dienen als Tab-Indikator)
- #world-labels: von top→bottom (safe-area+20px), pill-Style für active
  right:80px damit FAB nicht überlappt, backdrop-blur auf active label
- .world-panel top-padding: 58→32px (Info-Karte startet weiter oben)
- Desktop @media 768px: Nav bleibt oben (dots+labels wie vorher)
- components.css ?v=1003, SW by-v1004, APP_VER 1004
This commit is contained in:
rene 2026-05-16 08:53:14 +02:00
parent d03e49800d
commit d6eb2bcf98
5 changed files with 35 additions and 39 deletions

View file

@ -410,7 +410,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 = "1003" # muss mit APP_VER in app.js übereinstimmen APP_VER = "1004" # 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():

View file

@ -7876,58 +7876,53 @@ svg.empty-state-icon {
} }
#wp-welt { overflow: hidden; position: relative; } #wp-welt { overflow: hidden; position: relative; }
/* Navigation-Punkte */ /* Navigation-Punkte — auf Mobile ausgeblendet, Labels übernehmen */
#world-dots { #world-dots {
position: fixed; display: none;
top: calc(env(safe-area-inset-top, 0px) + 14px);
left: 0; right: 0;
display: flex;
justify-content: center;
gap: 5px;
z-index: 60;
pointer-events: none;
}
.wdot {
width: 6px; height: 6px;
border-radius: 50%;
background: var(--c-text);
opacity: 0.2;
transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
cursor: pointer;
}
.wdot.active {
width: 22px;
border-radius: 3px;
opacity: 1;
background: var(--c-primary);
} }
/* Welt-Labels */ /* Welt-Labels — jetzt unten als Tab-Bar */
#world-labels { #world-labels {
position: fixed; position: fixed;
top: calc(env(safe-area-inset-top, 0px) + 28px); bottom: calc(env(safe-area-inset-bottom, 0px) + 20px);
left: 0; right: 0; top: auto;
left: 0; right: 80px; /* Platz für FAB rechts */
display: flex; display: flex;
justify-content: center; justify-content: center;
gap: 28px; gap: 8px;
z-index: 59; z-index: 59;
pointer-events: none; pointer-events: none;
} }
.wlabel { .wlabel {
font-size: 9px; font-size: 10px;
font-weight: 800; font-weight: 800;
letter-spacing: 0.12em; letter-spacing: 0.1em;
color: white; color: white;
opacity: 0.4; opacity: 0.45;
text-transform: uppercase; text-transform: uppercase;
transition: opacity 0.18s; transition: opacity 0.18s, background 0.18s;
padding: 6px 16px;
border-radius: 20px;
}
.wlabel.active {
opacity: 1;
background: rgba(255, 255, 255, 0.18);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
} }
.wlabel.active { opacity: 1; }
@media (min-width: 768px) { @media (min-width: 768px) {
/* Desktop: Nav wieder oben, Dots wieder sichtbar */
#world-dots {
display: flex;
top: calc(env(safe-area-inset-top, 0px) + 14px);
bottom: auto;
}
#world-labels { #world-labels {
bottom: auto;
top: calc(env(safe-area-inset-top, 0px) + 28px);
right: 0;
gap: 40px; gap: 40px;
top: calc(env(safe-area-inset-top, 0px) + 18px);
} }
.wlabel { .wlabel {
font-size: 13px; font-size: 13px;
@ -7936,7 +7931,6 @@ svg.empty-state-icon {
padding: 6px 14px; padding: 6px 14px;
border-radius: 20px; border-radius: 20px;
text-shadow: 0 1px 6px rgba(0,0,0,0.7); text-shadow: 0 1px 6px rgba(0,0,0,0.7);
transition: opacity 0.18s, background 0.18s;
} }
.wlabel:hover { .wlabel:hover {
opacity: 0.85; opacity: 0.85;
@ -7946,6 +7940,8 @@ svg.empty-state-icon {
opacity: 1; opacity: 1;
background: rgba(255, 255, 255, 0.18); background: rgba(255, 255, 255, 0.18);
text-shadow: 0 1px 8px rgba(0,0,0,0.5); text-shadow: 0 1px 8px rgba(0,0,0,0.5);
backdrop-filter: none;
-webkit-backdrop-filter: none;
} }
} }
@ -8041,7 +8037,7 @@ svg.empty-state-icon {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; /* Info oben, Chips unten */ justify-content: space-between; /* Info oben, Chips unten */
padding: calc(env(safe-area-inset-top, 0px) + 58px) 14px padding: calc(env(safe-area-inset-top, 0px) + 32px) 14px
calc(env(safe-area-inset-bottom, 0px) + 76px); calc(env(safe-area-inset-bottom, 0px) + 76px);
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;

View file

@ -103,7 +103,7 @@
<!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung --> <!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung -->
<link rel="stylesheet" href="/css/design-system.css?v=907"> <link rel="stylesheet" href="/css/design-system.css?v=907">
<link rel="stylesheet" href="/css/layout.css?v=973"> <link rel="stylesheet" href="/css/layout.css?v=973">
<link rel="stylesheet" href="/css/components.css?v=1002"> <link rel="stylesheet" href="/css/components.css?v=1003">
</head> </head>
<body> <body>

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung. Router, State-Management, Navigation, Initialisierung.
============================================================ */ ============================================================ */
const APP_VER = '1003'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VER = '1004'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt const APP_VERSION = '1.6.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

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache Offline-Cache + Push Notifications + Tile-Cache
============================================================ */ ============================================================ */
const CACHE_VERSION = 'by-v1003'; const CACHE_VERSION = 'by-v1004';
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