diff --git a/public/index.html b/public/index.html
index 2909f6d0..dc6591a0 100644
--- a/public/index.html
+++ b/public/index.html
@@ -82,7 +82,7 @@
-
+
diff --git a/public/map.js b/public/map.js
index 3e0fc585..386783e2 100644
--- a/public/map.js
+++ b/public/map.js
@@ -8,7 +8,7 @@
let clusterGroup = null;
let nodes = [];
let observers = [];
- let filters = { repeater: true, companion: true, room: true, sensor: true, lastHeard: '30d', mqttOnly: false, neighbors: false, clusters: false };
+ let filters = { repeater: true, companion: true, room: true, sensor: true, observer: true, lastHeard: '30d', neighbors: false, clusters: false };
let wsHandler = null;
let heatLayer = null;
let userHasMoved = false;
@@ -23,10 +23,11 @@
companion: { color: '#2563eb', shape: 'circle', radius: 8, weight: 2 }, // blue circle
room: { color: '#16a34a', shape: 'square', radius: 9, weight: 2 }, // green square
sensor: { color: '#d97706', shape: 'triangle', radius: 8, weight: 2 }, // amber triangle
+ observer: { color: '#8b5cf6', shape: 'star', radius: 11, weight: 2 }, // purple star
};
- const ROLE_LABELS = { repeater: 'Repeaters', companion: 'Companions', room: 'Room Servers', sensor: 'Sensors' };
- const ROLE_COLORS = { repeater: '#dc2626', companion: '#2563eb', room: '#16a34a', sensor: '#d97706' };
+ const ROLE_LABELS = { repeater: 'Repeaters', companion: 'Companions', room: 'Room Servers', sensor: 'Sensors', observer: 'Observers' };
+ const ROLE_COLORS = { repeater: '#dc2626', companion: '#2563eb', room: '#16a34a', sensor: '#d97706', observer: '#8b5cf6' };
function makeMarkerIcon(role) {
const s = ROLE_STYLE[role] || ROLE_STYLE.companion;
@@ -43,6 +44,19 @@
case 'triangle':
path = ``;
break;
+ case 'star': {
+ // 5-pointed star
+ const cx = c, cy = c, outer = c - 1, inner = outer * 0.4;
+ let pts = '';
+ for (let i = 0; i < 5; i++) {
+ const aOuter = (i * 72 - 90) * Math.PI / 180;
+ const aInner = ((i * 72) + 36 - 90) * Math.PI / 180;
+ pts += `${cx + outer * Math.cos(aOuter)},${cy + outer * Math.sin(aOuter)} `;
+ pts += `${cx + inner * Math.cos(aInner)},${cy + inner * Math.sin(aInner)} `;
+ }
+ path = ``;
+ break;
+ }
default: // circle
path = ``;
}
@@ -74,7 +88,6 @@