// Headless-Proof für map-gl-markers.js: 4 Kategorien, ~490 Fake-Marker, Cluster,
// Phosphor-Icons, Danger-Radien, Sichtbarkeits-Toggle, Popups — alles ohne App/Auth.
(function () {
'use strict';
var st = document.getElementById('status');
function set(t) { if (st) st.textContent = t; }
var TYPES = {
restaurant: { color: '#F97316', iconName: 'fork-knife' },
freilauf: { color: '#22C55E', iconName: 'dog' },
tierarzt: { color: '#EF4444', iconName: 'first-aid' },
poison: { color: '#DC2626', iconName: 'skull', danger: true },
};
var COUNTS = { restaurant: 250, freilauf: 150, tierarzt: 80, poison: 8 };
function genPois(n, seedStart) {
var feats = [], seed = seedStart;
function rnd() { seed = (seed * 9301 + 49297) % 233280; return seed / 233280; }
for (var i = 0; i < n; i++) {
feats.push({ lat: 48.03 + rnd() * 0.24, lon: 11.40 + rnd() * 0.36, name: 'POI ' + i, source: 'osm' });
}
return feats;
}
try {
var proto = new pmtiles.Protocol();
maplibregl.addProtocol('pmtiles', proto.tile);
var map = new maplibregl.Map({
container: 'map', style: MapGLStyle.build({ dark: false }),
center: [11.576, 48.137], zoom: 12, dragRotate: false,
});
map.addControl(new maplibregl.NavigationControl({ showCompass: false }), 'top-left');
map.addControl(new maplibregl.ScaleControl());
map.on('error', function (e) { set('⚠️ ' + (e && e.error ? e.error.message : 'Fehler')); if (e && e.error) console.error(e.error); });
map.on('load', function () {
MapGLMarkers.init(map, {
types: TYPES, dangerKeys: ['poison'], dangerRadiusM: 100,
popupHTML: function (p, key) { return '' + (p.name || key) + '
' + key + '
'; },
popupWire: function (p, key, close) { document.getElementById('mp-x') && document.getElementById('mp-x').addEventListener('click', close); },
}).then(function () {
var seeds = { restaurant: 11, freilauf: 77, tierarzt: 123, poison: 200 };
Object.keys(TYPES).forEach(function (k) { MapGLMarkers.setLayer(k, genPois(COUNTS[k], seeds[k])); });
// Toggle-Buttons
var box = document.getElementById('toggles');
Object.keys(TYPES).forEach(function (k) {
var b = document.createElement('button'); b.textContent = k; b.dataset.on = '1';
b.style.borderColor = TYPES[k].color;
b.addEventListener('click', function () {
var on = b.dataset.on === '1' ? false : true;
b.dataset.on = on ? '1' : '0'; b.classList.toggle('off', !on);
MapGLMarkers.setVisible(k, on);
});
box.appendChild(b);
});
var total = COUNTS.restaurant + COUNTS.freilauf + COUNTS.tierarzt + COUNTS.poison;
set('✅ ' + total + ' Marker (4 Kat.) — Cluster + Phosphor-Icons + Danger-Radius + Toggle + Popup');
}).catch(function (e) { set('❌ init: ' + (e && e.message ? e.message : e)); console.error(e); });
});
} catch (e) {
set('❌ ' + (e && e.message ? e.message : e));
}
})();