Push newest version
Some checks failed
build-and-push / docker (push) Failing after 10m4s

This commit is contained in:
2025-09-19 09:34:01 +02:00
parent a2743dd7fb
commit c8aa3fb3b2
5 changed files with 452 additions and 133 deletions

View File

@@ -173,4 +173,90 @@ document.addEventListener('DOMContentLoaded', function() {
localStorage.setItem('freemoto-roundtrip-norepeat', roundTripNoRepeat.checked ? '1' : '0');
});
}
// Swap start/end like Google Maps
(function(){
var swapBtn = document.getElementById('swapBtn');
if (!swapBtn) return;
function swapInputs() {
var s = document.getElementById('sourceInput');
var d = document.getElementById('destInput');
if (!s || !d) return;
// Swap visible values
var tmpVal = s.value; s.value = d.value; d.value = tmpVal;
// Swap lat/lon datasets
var sLat = s.dataset.lat, sLon = s.dataset.lon;
s.dataset.lat = d.dataset.lat || '';
s.dataset.lon = d.dataset.lon || '';
d.dataset.lat = sLat || '';
d.dataset.lon = sLon || '';
// If both look valid, trigger plot
var sourceLat = parseFloat(s.dataset.lat);
var sourceLon = parseFloat(s.dataset.lon);
var destLat = parseFloat(d.dataset.lat);
var destLon = parseFloat(d.dataset.lon);
if (!isNaN(sourceLat) && !isNaN(sourceLon) && !isNaN(destLat) && !isNaN(destLon)) {
var plot = document.getElementById('plotRouteBtn');
if (plot) plot.click();
}
}
swapBtn.addEventListener('click', swapInputs);
})();
// Recenter FAB behavior
(function(){
var recenter = document.getElementById('recenterBtn');
if (!recenter) return;
recenter.addEventListener('click', function(){
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position){
var lat = position.coords.latitude;
var lon = position.coords.longitude;
map.setView([lat, lon], Math.max(map.getZoom(), 14));
});
}
});
})();
// Mobile panel toggle (portrait)
try {
var panel = document.querySelector('.nav-panel');
var toggleBtn = document.getElementById('panelToggle');
function isSmallPortrait() {
var mqW = window.matchMedia('(max-width: 576px)');
var mqP = window.matchMedia('(orientation: portrait)');
return (mqW.matches && mqP.matches);
}
// Initialize collapsed state on load for small portrait
if (panel && isSmallPortrait()) {
panel.classList.add('collapsed');
if (toggleBtn) toggleBtn.setAttribute('aria-expanded', 'false');
}
// Auto-collapse panel when user hits Plot on small portrait
var plotBtn = document.getElementById('plotRouteBtn');
if (plotBtn) {
plotBtn.addEventListener('click', function(){
if (panel && isSmallPortrait()) {
panel.classList.add('collapsed');
if (toggleBtn) toggleBtn.setAttribute('aria-expanded', 'false');
}
});
}
if (toggleBtn && panel) {
toggleBtn.addEventListener('click', function() {
panel.classList.toggle('collapsed');
var expanded = !panel.classList.contains('collapsed');
toggleBtn.setAttribute('aria-expanded', expanded ? 'true' : 'false');
});
}
// When orientation/viewport changes, ensure panel doesn't exceed screen
window.addEventListener('resize', function(){
if (!panel) return;
if (isSmallPortrait()) {
// Keep collapsed if it would cover map too much
if (!panel.classList.contains('collapsed')) panel.classList.add('collapsed');
if (toggleBtn) toggleBtn.setAttribute('aria-expanded', 'false');
}
});
} catch (_) {}
});