diff --git a/app/__init__.py b/app/__init__.py
index ce0dfab..8e8efae 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -1,6 +1,6 @@
from flask import Flask
from app.extensions import db, migrate, login_manager, mail
-from config import config
+from app.utils.config import config
import os
def create_app(config_name=None):
diff --git a/app/static/map_iframe.html b/app/static/map_iframe.html
index f542134..b000794 100644
--- a/app/static/map_iframe.html
+++ b/app/static/map_iframe.html
@@ -143,8 +143,6 @@
-
-
@@ -162,10 +160,22 @@
// Create map
map = L.map('map', {
zoomControl: true,
- scrollWheelZoom: true,
+ scrollWheelZoom: false, // Disable default scroll wheel zoom
doubleClickZoom: true,
touchZoom: true
}).setView(romaniaCenter, romaniaZoom);
+
+ // Enable zoom with Ctrl/Cmd + wheel only
+ map.getContainer().addEventListener('wheel', function(e) {
+ if ((e.ctrlKey || e.metaKey) && map.options.scrollWheelZoom !== true) {
+ map.options.scrollWheelZoom = true;
+ } else if (!(e.ctrlKey || e.metaKey) && map.options.scrollWheelZoom !== false) {
+ map.options.scrollWheelZoom = false;
+ }
+ if (!(e.ctrlKey || e.metaKey)) {
+ e.preventDefault(); // Prevent zoom if not holding Ctrl/Cmd
+ }
+ }, { passive: false });
// Add OpenStreetMap tiles
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
@@ -226,7 +236,7 @@
routesData.forEach((route, index) => {
if (route.coordinates && route.coordinates.length > 0) {
const color = colors[index % colors.length];
-
+
// Create polyline
const polyline = L.polyline(route.coordinates, {
color: color,
@@ -234,7 +244,7 @@
opacity: 0.8,
smoothFactor: 1
});
-
+
// Create popup content
const popupContent = `
`;
-
+
polyline.bindPopup(popupContent);
-
- // Add to route layer
routeLayer.addLayer(polyline);
-
+
+ // Add start and end markers
+ const startCoord = route.coordinates[0];
+ const endCoord = route.coordinates[route.coordinates.length - 1];
+
+ // Green start marker
+ const startMarker = L.marker(startCoord, {
+ icon: L.icon({
+ iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-green.png',
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',
+ shadowSize: [41, 41]
+ })
+ }).bindPopup(`Start of route
${route.title}`);
+ routeLayer.addLayer(startMarker);
+
+ // Red end marker
+ const endMarker = L.marker(endCoord, {
+ icon: L.icon({
+ iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-red.png',
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',
+ shadowSize: [41, 41]
+ })
+ }).bindPopup(`End of route
${route.title}`);
+ routeLayer.addLayer(endMarker);
+
// Collect bounds for fitting
allBounds.push(...route.coordinates);
-
+
console.log(`Added route: ${route.title} (${route.coordinates.length} points)`);
}
});
@@ -298,27 +336,7 @@
}
function setupControls() {
- // Fit routes button
- document.getElementById('fit-routes').addEventListener('click', () => {
- if (routeLayer.getLayers().length > 0) {
- const group = new L.FeatureGroup();
- routeLayer.eachLayer(layer => group.addLayer(layer));
- map.fitBounds(group.getBounds(), { padding: [20, 20] });
- }
- });
-
- // Toggle routes button
- document.getElementById('toggle-routes').addEventListener('click', (e) => {
- if (routesVisible) {
- map.removeLayer(routeLayer);
- e.target.classList.remove('active');
- routesVisible = false;
- } else {
- map.addLayer(routeLayer);
- e.target.classList.add('active');
- routesVisible = true;
- }
- });
+ // Only refresh map button remains
// Refresh map button
document.getElementById('refresh-map').addEventListener('click', () => {
diff --git a/app/static/map_iframe_single.html b/app/static/map_iframe_single.html
index 9d25c7c..4e85fd0 100644
--- a/app/static/map_iframe_single.html
+++ b/app/static/map_iframe_single.html
@@ -58,10 +58,28 @@ if (routeId) {
const latlngs = data.coordinates.map(pt => [pt[0], pt[1]]);
const polyline = L.polyline(latlngs, { color: '#ef4444', weight: 5, opacity: 0.9 }).addTo(map);
map.fitBounds(polyline.getBounds(), { padding: [20, 20], maxZoom: 15 });
- // Start marker
- L.marker(latlngs[0], { icon: L.divIcon({ html: '
', className: 'custom-div-icon', iconSize: [24,24], iconAnchor: [12,12] }) }).addTo(map);
- // End marker
- L.marker(latlngs[latlngs.length-1], { icon: L.divIcon({ html: '
', className: 'custom-div-icon', iconSize: [24,24], iconAnchor: [12,12] }) }).addTo(map);
+ // Start marker (green pin)
+ L.marker(latlngs[0], {
+ icon: L.icon({
+ iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-green.png',
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',
+ shadowSize: [41, 41]
+ })
+ }).addTo(map);
+ // End marker (red pin)
+ L.marker(latlngs[latlngs.length-1], {
+ icon: L.icon({
+ iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-red.png',
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',
+ shadowSize: [41, 41]
+ })
+ }).addTo(map);
} else {
map.setView([45.9432, 24.9668], 6);
L.marker([45.9432, 24.9668]).addTo(map).bindPopup('No route data').openPopup();
diff --git a/app/static/media/posts/post_e39bf529_20250727/gpx/da245e13b0f646b1b81796c7e6a4a1f1.gpx b/app/static/media/posts/post_e39bf529_20250727/gpx/da245e13b0f646b1b81796c7e6a4a1f1.gpx
new file mode 100644
index 0000000..ea01d8c
--- /dev/null
+++ b/app/static/media/posts/post_e39bf529_20250727/gpx/da245e13b0f646b1b81796c7e6a4a1f1.gpx
@@ -0,0 +1,2044 @@
+
+
+
+ DJ105G, Sădurel 557205, Romania
+ https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png
+
+
+ DN67C, Romania
+ https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png
+
+
+ Directions from DJ105G, Sădurel 557205, Romania to DN67C, Romania
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/52e340af2e6043dca44565d33619f46a.jpg b/app/static/media/posts/post_e39bf529_20250727/images/52e340af2e6043dca44565d33619f46a.jpg
new file mode 100644
index 0000000..ef595da
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/52e340af2e6043dca44565d33619f46a.jpg differ
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/5e79f52af1ba4b9d903a6767c463d090.jpg b/app/static/media/posts/post_e39bf529_20250727/images/5e79f52af1ba4b9d903a6767c463d090.jpg
new file mode 100644
index 0000000..0c9f2e5
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/5e79f52af1ba4b9d903a6767c463d090.jpg differ
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/82d6e4b9096c49a7afdd35033299254e.jpg b/app/static/media/posts/post_e39bf529_20250727/images/82d6e4b9096c49a7afdd35033299254e.jpg
new file mode 100644
index 0000000..a45dddf
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/82d6e4b9096c49a7afdd35033299254e.jpg differ
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/a6288676337e47ea868feac181fb1599.jpg b/app/static/media/posts/post_e39bf529_20250727/images/a6288676337e47ea868feac181fb1599.jpg
new file mode 100644
index 0000000..ce42afc
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/a6288676337e47ea868feac181fb1599.jpg differ
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/52e340af2e6043dca44565d33619f46a.jpg b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/52e340af2e6043dca44565d33619f46a.jpg
new file mode 100644
index 0000000..f8b05f5
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/52e340af2e6043dca44565d33619f46a.jpg differ
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/5e79f52af1ba4b9d903a6767c463d090.jpg b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/5e79f52af1ba4b9d903a6767c463d090.jpg
new file mode 100644
index 0000000..8cadad4
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/5e79f52af1ba4b9d903a6767c463d090.jpg differ
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/82d6e4b9096c49a7afdd35033299254e.jpg b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/82d6e4b9096c49a7afdd35033299254e.jpg
new file mode 100644
index 0000000..599acca
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/82d6e4b9096c49a7afdd35033299254e.jpg differ
diff --git a/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/a6288676337e47ea868feac181fb1599.jpg b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/a6288676337e47ea868feac181fb1599.jpg
new file mode 100644
index 0000000..66d1a82
Binary files /dev/null and b/app/static/media/posts/post_e39bf529_20250727/images/thumbnails/a6288676337e47ea868feac181fb1599.jpg differ