Fix: Toolbar-Buttons kollidierten mit Karten-Zoom-Regler

Alle sieben Aktions-Buttons (Standort, Ausflugsziel anlegen,
KI-Prompt-Generator, Import, Backup) lagen bislang als absolut
positionierte Toolbar oben links ueber der Karte - direkt dort, wo
Leaflet standardmaessig seinen Zoom-Regler platziert, wodurch sich
beides ueberschnitt. Auf dem Smartphone nahm die Toolbar zudem viel
Platz auf der Karte weg.

Die Buttons sind jetzt in einem aufklappbaren Hamburger-Menue im Header
(js/main.js: setupMenuToggle(), schliesst bei Aktion/Escape/Klick
ausserhalb) statt direkt auf der Karte. Der Zoom-Regler wurde zusaetzlich
auf oben rechts verschoben (js/map/mapController.js), damit oben links
dauerhaft Platz fuer eigene Overlays (z.B. map-picking-hint) bleibt.

App-Shell auf Flexbox umgestellt (body als Flex-Spalte, .app-layout mit
flex:1) statt des bisherigen calc(100vh - fixe Header-Hoehe) auf
Desktop, da der Header jetzt bei geoeffnetem Menue waechst - die alte
fixe Berechnung haette Karte/Liste dabei abgeschnitten. --header-height
war dadurch ueberfluessig und wurde entfernt.
This commit is contained in:
2026-07-24 13:35:35 +02:00
parent 374ab4b789
commit 00a00b3b95
6 changed files with 152 additions and 44 deletions
+52
View File
@@ -47,6 +47,57 @@
closeBtn.addEventListener('click', hideStatus);
}
// Aktionen-Menü im Header (Hamburger): fasst die frueher direkt auf der
// Karte liegenden Buttons zusammen, damit sie nicht mehr mit dem
// Leaflet-Zoom-Regler kollidieren und auf dem Smartphone nicht die
// Karte zupflastern.
function setupMenuToggle() {
const toggleBtn = document.getElementById('menu-toggle-btn');
const menu = document.getElementById('app-menu');
if (!toggleBtn || !menu) return;
function closeMenu() {
menu.hidden = true;
toggleBtn.setAttribute('aria-expanded', 'false');
}
function openMenu() {
menu.hidden = false;
toggleBtn.setAttribute('aria-expanded', 'true');
}
toggleBtn.addEventListener('click', () => {
if (menu.hidden) {
openMenu();
} else {
closeMenu();
}
});
// Menü nach Klick auf eine der enthaltenen Aktionen automatisch
// schließen (die jeweilige Aktion selbst wurde durch den eigenen
// Klick-Handler des Buttons bereits vorher ausgelöst, da Events erst
// beim Ziel-Element und danach erst am umschließenden <nav> ankommen).
menu.addEventListener('click', (event) => {
if (event.target.closest('button')) {
closeMenu();
}
});
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape' && !menu.hidden) {
closeMenu();
toggleBtn.focus();
}
});
document.addEventListener('click', (event) => {
if (menu.hidden) return;
if (menu.contains(event.target) || toggleBtn.contains(event.target)) return;
closeMenu();
});
}
function setupGeolocationButton() {
const button = document.getElementById('locate-btn');
if (!button) return;
@@ -183,6 +234,7 @@
}
setupStatusClose();
setupMenuToggle();
bootstrap().catch((err) => {
console.error('EventMap: Initialisierung fehlgeschlagen.', err);