Add files via upload

This commit is contained in:
Serverlele30 authored and GitHub committed 2026-08-31 11:52:20 +02:00
1 parent 90ffa5b0ca
commit 05bae700ec
2 files changed
+51 -5

No files matched your search

+29
View File
@@ -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
View File
@@ -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;