const gib = (kb) => (kb / 1048576).toFixed(1); const bytes = (b) => (b == null ? "?" : (b / 1073741824).toFixed(1)); const rate = (b) => (b >= 1048576 ? `${(b / 1048576).toFixed(1)}M` : `${Math.round(b / 1024)}k`); const uptime = (s) => { const d = Math.floor(s / 86400); const h = Math.floor((s % 86400) / 3600); return d ? `${d}d ${h}h` : `${h}h`; }; function tile(label, value, sub) { const d = document.createElement("div"); d.className = "mtile"; const l = document.createElement("span"); l.className = "mlabel"; l.textContent = label; const v = document.createElement("span"); v.className = "mvalue num"; v.textContent = value; const s = document.createElement("span"); s.className = "msub"; s.textContent = sub || ""; d.append(l, v, s); return d; } export default { title: "System", interval: 1, mount(el) { el.innerHTML = `
`; }, update(st, el) { const box = el.querySelector(".stats"); box.textContent = ""; const g = st.gpu; box.append( tile("CPU", `${st.cpu}%`, st.cpuTemp != null ? `${st.cpuTemp}°C` : "—"), tile("Memory", gib(st.memUsed), `/ ${gib(st.memTotal)} GiB`), tile("GPU", g?.temp != null ? `${g.temp}°` : "—", g ? `${bytes(g.memUsed)} / ${bytes(g.memTotal)} GiB` : "no GPU"), tile("Network", `↓${rate(st.net.down)}`, `↑${rate(st.net.up)}`), ); const foot = document.createElement("div"); foot.className = "mfoot"; foot.textContent = `up ${uptime(st.uptime)}`; box.append(foot); }, };