Add files via upload
This commit is contained in:
1 parent
90ffa5b0ca
commit
05bae700ec
2 files changed
+51
-5
No files matched your search
@@ -198,9 +198,37 @@ const TripAlarm = (() => {
|
|||||||
`;
|
`;
|
||||||
document.body.appendChild(banner);
|
document.body.appendChild(banner);
|
||||||
banner.querySelector('#trip-alarm-banner__cancel').addEventListener('click', clear);
|
banner.querySelector('#trip-alarm-banner__cancel').addEventListener('click', clear);
|
||||||
|
|
||||||
|
// Position hängt vom tatsächlich gerenderten Header ab (unterscheidet
|
||||||
|
// sich zwischen Mobile/Desktop und wird nicht über CSS-Breakpoint-Werte
|
||||||
|
// geraten, sondern - wie schon bei der Live-Karte - direkt gemessen),
|
||||||
|
// damit das Banner den Header/die Suche nie verdeckt, egal auf welcher
|
||||||
|
// Displaygröße oder welchem Tab (z.B. auch über der jetzt display-breiten
|
||||||
|
// Live-Karte) es gerade erscheint.
|
||||||
|
window.addEventListener('resize', schedulePositionBanner);
|
||||||
|
window.addEventListener('orientationchange', schedulePositionBanner);
|
||||||
|
|
||||||
return banner;
|
return banner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let positionScheduled = false;
|
||||||
|
function schedulePositionBanner() {
|
||||||
|
if (positionScheduled) return;
|
||||||
|
positionScheduled = true;
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
positionScheduled = false;
|
||||||
|
positionBanner();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function positionBanner() {
|
||||||
|
const banner = document.getElementById('trip-alarm-banner');
|
||||||
|
if (!banner) return;
|
||||||
|
const header = document.querySelector('.app-header');
|
||||||
|
const headerBottom = header ? header.getBoundingClientRect().bottom : 0;
|
||||||
|
banner.style.top = `${Math.max(12, Math.round(headerBottom + 8))}px`;
|
||||||
|
}
|
||||||
|
|
||||||
function renderBanner(stopsRemaining) {
|
function renderBanner(stopsRemaining) {
|
||||||
if (!alarm) return;
|
if (!alarm) return;
|
||||||
const banner = ensureBanner();
|
const banner = ensureBanner();
|
||||||
@@ -209,6 +237,7 @@ const TripAlarm = (() => {
|
|||||||
textEl.textContent = stopsRemaining == null
|
textEl.textContent = stopsRemaining == null
|
||||||
? `Fahrtalarm gesetzt für ${alarm.targetName}`
|
? `Fahrtalarm gesetzt für ${alarm.targetName}`
|
||||||
: `${line}Fahrtalarm: noch ${stopsRemaining} Station${stopsRemaining === 1 ? '' : 'en'} bis ${alarm.targetName}`;
|
: `${line}Fahrtalarm: noch ${stopsRemaining} Station${stopsRemaining === 1 ? '' : 'en'} bis ${alarm.targetName}`;
|
||||||
|
positionBanner();
|
||||||
banner.classList.add('is-visible');
|
banner.classList.add('is-visible');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+22
-5
@@ -34,6 +34,10 @@ html, body {
|
|||||||
color: var(--ink);
|
color: var(--ink);
|
||||||
font-family: var(--font-body);
|
font-family: var(--font-body);
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
|
/* Verhindert eine horizontale Scrollbar durch den Full-Bleed-Trick der
|
||||||
|
Live-Karte (100vw kann inkl. Scrollbar-Breite minimal über die
|
||||||
|
tatsächliche Fensterbreite hinausschießen). */
|
||||||
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
@@ -433,14 +437,27 @@ button {
|
|||||||
livemap.js die Höhe zur Laufzeit anhand des tatsächlich verfügbaren
|
livemap.js die Höhe zur Laufzeit anhand des tatsächlich verfügbaren
|
||||||
Platzes exakt nachjustiert (siehe resizeToViewport() in livemap.js).
|
Platzes exakt nachjustiert (siehe resizeToViewport() in livemap.js).
|
||||||
dvh (dynamische Viewport-Höhe) berücksichtigt ein-/ausblendende mobile
|
dvh (dynamische Viewport-Höhe) berücksichtigt ein-/ausblendende mobile
|
||||||
Adressleisten korrekt; vh davor dient als Fallback für ältere Browser. */
|
Adressleisten korrekt; vh davor dient als Fallback für ältere Browser.
|
||||||
|
|
||||||
|
Die Karte selbst durchbricht bewusst die Innenabstände/Maximalbreite von
|
||||||
|
.app-main ("Full-Bleed"-Technik: left:50% + negativer Margin von -50vw
|
||||||
|
zieht sie auf volle Viewport-Breite) - Bedienelemente (map-controls,
|
||||||
|
Isolations-Banner) bleiben normal eingerückt, nur die Kartenfläche selbst
|
||||||
|
nutzt den kompletten Displayplatz. Funktioniert identisch auf jeder
|
||||||
|
Bildschirmgröße, ohne pro Breakpoint unterschiedliche Werte nachpflegen zu
|
||||||
|
müssen. */
|
||||||
.live-map {
|
.live-map {
|
||||||
height: min(70vh, 560px);
|
height: min(70vh, 560px);
|
||||||
height: min(70dvh, 560px);
|
height: min(70dvh, 560px);
|
||||||
min-height: 320px;
|
min-height: 320px;
|
||||||
border-radius: var(--radius);
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border: 1px solid var(--line);
|
border: 1px solid var(--line);
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
position: relative;
|
||||||
|
left: 50%;
|
||||||
|
width: 100vw;
|
||||||
|
margin-left: -50vw;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vehicle-marker span {
|
.vehicle-marker span {
|
||||||
@@ -1323,10 +1340,10 @@ button:active { transform: translateY(1px); }
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 12px;
|
top: 12px; /* Fallback, bevor JS die reale Header-Höhe gemessen hat */
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
z-index: 190;
|
z-index: 1200; /* über Leaflets eigenen Steuerelementen (z.B. Zoom-Buttons ~1000) */
|
||||||
background: var(--panel-raised);
|
background: var(--panel-raised);
|
||||||
border: 1px solid var(--signal-amber);
|
border: 1px solid var(--signal-amber);
|
||||||
border-radius: var(--radius);
|
border-radius: var(--radius);
|
||||||
@@ -1354,7 +1371,7 @@ button:active { transform: translateY(1px); }
|
|||||||
.trip-alarm-overlay {
|
.trip-alarm-overlay {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
inset: 0;
|
inset: 0;
|
||||||
z-index: 300;
|
z-index: 1300;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|||||||
Reference in new issue
Block a user