function toggleFleetPanel(){ const p=document.getElementById("fleetPanel"); p.style.display=p.style.display==="flex"?"none":"flex"; if(p.style.display==="flex") loadFleet(); } async function loadFleet(){ const r=await fetch("/api/fleet"); const fleet=await r.json(); renderFleet(fleet); } function renderFleet(fleet){ const g=document.getElementById("fleetGrid"); g.innerHTML=fleet.map(imo=>`
${imo}
`).join(""); } async function addFleetItem(){ const i=document.getElementById("fleetInput"); const imo=i.value.trim(); if(!imo) return; await fetch("/api/fleet",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({imo})}); i.value=""; loadFleet(); } async function removeFleetItem(imo){ if(!confirm("Remove IMO "+imo+" from fleet?")) return; await fetch("/api/fleet/"+imo,{method:"DELETE"}); loadFleet(); } function filterFleetItems(){ const q=document.getElementById("fleetSearch").value; document.querySelectorAll(".fleet-item").forEach(i=>i.style.display=i.dataset.imo.includes(q)?"flex":"none"); } function toggleFleetPanel(){ const p=document.getElementById("fleetPanel"); p.style.display=p.style.display==="flex"?"none":"flex"; if(p.style.display==="flex") loadFleet(); } async function loadFleet(){ const r=await fetch("/api/fleet"); const fleet=await r.json(); renderFleet(fleet); } function renderFleet(fleet){ const g=document.getElementById("fleetGrid"); g.innerHTML=fleet.map(imo=>`
${imo}
`).join(""); } async function addFleetItem(){ const i=document.getElementById("fleetInput"); const imo=i.value.trim(); if(!imo) return; await fetch("/api/fleet",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({imo})}); i.value=""; loadFleet(); } async function removeFleetItem(imo){ if(!confirm("Remove IMO "+imo+" from fleet?")) return; await fetch("/api/fleet/"+imo,{method:"DELETE"}); loadFleet(); } function filterFleetItems(){ const q=document.getElementById("fleetSearch").value; document.querySelectorAll(".fleet-item").forEach(i=>i.style.display=i.dataset.imo.includes(q)?"flex":"none"); } function toggleFleetPanel(){ const p=document.getElementById("fleetPanel"); p.style.display=p.style.display==="flex"?"none":"flex"; if(p.style.display==="flex") loadFleet(); } async function loadFleet(){ const r=await fetch("/api/fleet"); const fleet=await r.json(); renderFleet(fleet); } function renderFleet(fleet){ const g=document.getElementById("fleetGrid"); g.innerHTML=fleet.map(imo=>`
${imo}
`).join(""); } async function addFleetItem(){ const i=document.getElementById("fleetInput"); const imo=i.value.trim(); if(!imo) return; await fetch("/api/fleet",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({imo})}); i.value=""; loadFleet(); } async function removeFleetItem(imo){ if(!confirm("Remove IMO "+imo+" from fleet?")) return; await fetch("/api/fleet/"+imo,{method:"DELETE"}); loadFleet(); } function filterFleetItems(){ const q=document.getElementById("fleetSearch").value; document.querySelectorAll(".fleet-item").forEach(i=>i.style.display=i.dataset.imo.includes(q)?"flex":"none"); } function toggleFleetPanel(){ const p=document.getElementById("fleetPanel"); p.style.display=p.style.display==="flex"?"none":"flex"; if(p.style.display==="flex") loadFleet(); } async function loadFleet(){ const r=await fetch("/api/fleet"); const fleet=await r.json(); renderFleet(fleet); } function renderFleet(fleet){ const g=document.getElementById("fleetGrid"); g.innerHTML=fleet.map(imo=>`
${imo}
`).join(""); } async function addFleetItem(){ const i=document.getElementById("fleetInput"); const imo=i.value.trim(); if(!imo) return; await fetch("/api/fleet",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({imo})}); i.value=""; loadFleet(); } async function removeFleetItem(imo){ if(!confirm("Remove IMO "+imo+" from fleet?")) return; await fetch("/api/fleet/"+imo,{method:"DELETE"}); loadFleet(); } function filterFleetItems(){ const q=document.getElementById("fleetSearch").value; document.querySelectorAll(".fleet-item").forEach(i=>i.style.display=i.dataset.imo.includes(q)?"flex":"none"); } function toggleFleetPanel(){ const p=document.getElementById("fleetPanel"); p.style.display=p.style.display==="flex"?"none":"flex"; if(p.style.display==="flex") loadFleet(); } async function loadFleet(){ const r=await fetch("/api/fleet"); const fleet=await r.json(); renderFleet(fleet); } function renderFleet(fleet){ const g=document.getElementById("fleetGrid"); g.innerHTML=fleet.map(imo=>`
${imo}
`).join(""); } async function addFleetItem(){ const i=document.getElementById("fleetInput"); const imo=i.value.trim(); if(!imo) return; await fetch("/api/fleet",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({imo})}); i.value=""; loadFleet(); } async function removeFleetItem(imo){ if(!confirm("Remove IMO "+imo+" from fleet?")) return; await fetch("/api/fleet/"+imo,{method:"DELETE"}); loadFleet(); } function filterFleetItems(){ const q=document.getElementById("fleetSearch").value; document.querySelectorAll(".fleet-item").forEach(i=>i.style.display=i.dataset.imo.includes(q)?"flex":"none"); }
CRUCIX
TERMINAL ACTIVE
Initializing 3D Globe
SCROLL TO ZOOM · DRAG TO PAN
Signal Guide
What the signals actually mean
Plain-English interpretation, why it matters, and what you should not infer from it.
Treat these as interpretation guides, not conclusions. Stronger judgments should come from corroboration across multiple layers, not from a single signal viewed in isolation.