// Networks list — live from API const { useState: useStateD, useEffect: useEffectD } = React; function NetworksList({ ctx }) { const { t, goToNetwork } = ctx; const [networks, setNetworks] = useStateD([]); const [loading, setLoading] = useStateD(true); const [creating, setCreating] = useStateD(false); const [newName, setNewName] = useStateD(""); const [newCidr, setNewCidr] = useStateD("10.0.0.0/24"); useEffectD(() => { loadNetworks(); }, []); async function loadNetworks() { try { const data = await ww.get("/networks"); setNetworks(data); } catch {} setLoading(false); } async function handleCreate(e) { e.preventDefault(); if (!newName.trim()) return; try { await ww.post("/networks", { name: newName.trim(), ipv4_cidr: newCidr }); setNewName(""); setCreating(false); loadNetworks(); } catch (err) { alert(err.message); } } function relativeTime(ts) { if (!ts) return "—"; const diff = Math.floor(Date.now() / 1000) - ts; if (diff < 60) return diff + "s ago"; if (diff < 3600) return Math.floor(diff / 60) + "m ago"; if (diff < 86400) return Math.floor(diff / 3600) + "h ago"; return Math.floor(diff / 86400) + "d ago"; } const planTone = { free: "ghost", pro: "accent", enterprise: "warn" }; return (