+
+ {/* Viewer toolbar */}
+
+
+ {activeCam?.label ?? '—'}
+ {activeCam?.isDepth && (
+ DEPTH · greyscale
+ )}
+ {activeCam?.isPanoramic && (
+ 360° · drag to pan
+ )}
+
+
+ {/* Overlay mode selector */}
+
+ {['off','faces','gestures','objects','all'].map(mode => (
+
+ ))}
+
+
+
+ {/* Image + overlay */}
+
+ {activeCam?.isPanoramic ? (
+
+ ) : activeFrame ? (
+

+ ) : (
+
+
+
📷
+
Waiting for {activeCam?.label ?? '—'}…
+
{activeCam?.topic}
+
+
+ )}
+
+ {/* Detection overlay canvas */}
+ {overlayMode !== 'off' && !activeCam?.isPanoramic && (
+
+ )}
+
+ {/* PiP windows */}
+ {pipList.map((id, idx) => {
+ const cam = CAMERA_BY_ID[id];
+ if (!cam) return null;
+ return (
+
togglePip(id)}
+ />
+ );
+ })}
+
+
+
+
FACES
+
0 ? 'text-cyan-400' : 'text-gray-700'}`}>
+ {faces.length > 0 ? `${faces.length} detected` : 'none'}
+
+ {faces.slice(0, 2).map((f, i) => (
+
+ {f.person_name && f.person_name !== 'unknown'
+ ? `↳ ${f.person_name}`
+ : `↳ unknown #${f.face_id}`}
+
+ ))}
+
+
+
+
GESTURES
+
0 ? 'text-amber-400' : 'text-gray-700'}`}>
+ {gestures.length > 0 ? `${gestures.length} active` : 'none'}
+
+ {gestures.slice(0, 2).map((g, i) => {
+ const icon = GESTURE_ICONS[g.gesture_type] ?? '?';
+ return (
+
+ {icon} {g.gesture_type} cam{g.camera_id}
+
+ );
+ })}
+
+
+
+
OBJECTS
+
0 ? 'text-green-400' : 'text-gray-700'}`}>
+ {sceneObjects.length > 0 ? `${sceneObjects.length} objects` : 'none'}
+
+ {sceneObjects
+ .filter(o => o.hazard_type > 0)
+ .slice(0, 2)
+ .map((o, i) => (
+
⚠ {o.class_name}
+ ))
+ }
+ {sceneObjects.filter(o => o.hazard_type === 0).slice(0, 2).map((o, i) => (
+
+ {o.class_name} {o.distance_m > 0 ? `${o.distance_m.toFixed(1)}m` : ''}
+
+ ))}
+
+