diff --git a/apps/dashboard/assets/js/renderers/storage.js b/apps/dashboard/assets/js/renderers/storage.js
index e65c2a0..3cc07b9 100644
--- a/apps/dashboard/assets/js/renderers/storage.js
+++ b/apps/dashboard/assets/js/renderers/storage.js
@@ -1,54 +1,28 @@
-function gb(value) {
- return `${Number(value).toFixed(1)} GB`;
-}
-
-function diskTone(status) {
- if (status === "critical" || status === "offline") return "danger";
- if (status === "warning") return "warning";
- return "online";
-}
-
-function pillLabel(status) {
- if (status === "critical") return "Critical";
- if (status === "warning") return "Warning";
- if (status === "offline") return "Offline";
- return "Stable";
-}
-
export function renderStorage(state) {
- const { storage } = state.data;
- const rootTone = diskTone(storage.root.status);
+ const storage = state.storage || {};
+ const grid = document.getElementById("storage-grid");
+ if (!grid) return;
- const rootPill = document.getElementById("root-storage-pill");
- rootPill.className = `status-pill ${rootTone === "danger" ? "offline" : rootTone}`;
- rootPill.textContent = pillLabel(storage.root.status);
+ const disks = storage.disks || [];
+ if (!disks.length) {
+ grid.innerHTML = '
No disk data
';
+ return;
+ }
- document.getElementById("root-storage-value").textContent = `${storage.root.usage_percent.toFixed(1)}%`;
- document.getElementById("root-storage-value").className = `card-value value-${rootTone === "danger" ? "danger" : rootTone}`;
- document.getElementById("root-storage-used").textContent = gb(storage.root.used_gb);
- document.getElementById("root-storage-free").textContent = gb(storage.root.free_gb);
-
- const rootBar = document.getElementById("root-storage-bar");
- rootBar.className = `metric-bar${rootTone === "online" ? "" : ` ${rootTone === "danger" ? "danger" : rootTone}`}`;
- document.getElementById("root-storage-bar-fill").style.width = `${storage.root.usage_percent}%`;
-
- const signal = document.getElementById("disk-matrix-signal");
- signal.className = `signal ${storage.summary.overall_status === "degraded" ? "warning" : storage.summary.overall_status === "offline" ? "offline" : "online"}`;
-
- const list = document.getElementById("storage-list");
- list.innerHTML = storage.disks
- .map((disk) => {
- const tone = diskTone(disk.status);
- const pillClass = tone === "danger" ? "offline" : tone === "warning" ? "warning" : "online";
- const barClass = tone === "online" ? "metric-bar" : `metric-bar ${tone === "danger" ? "danger" : tone}`;
- return `
-
-
${disk.name}
-
${disk.mount}
-
-
${disk.usage_percent.toFixed(0)}%
+ grid.innerHTML = disks.map(disk => {
+ const pct = disk.usage_percent ?? 0;
+ const fillClass = pct > 85 ? "danger" : pct > 70 ? "warn" : "";
+ const statusColor = disk.status === "critical" ? "var(--red)" : disk.status === "warning" ? "var(--yellow)" : "var(--teal)";
+ return `
+
+
- `;
- })
- .join("");
+
${disk.mount} ยท ${disk.used_gb?.toFixed(1)}/${disk.total_gb?.toFixed(1)} GB
+
+
`;
+ }).join("");
}