const TAB_META = { overview: { kicker: "SYSTEM", title: "Overview", context: "Live system state, health and scientific status" }, network: { kicker: "OBSERVE", title: "Network", context: "Neural dynamics, topology and data inspection" }, control: { kicker: "OPERATE", title: "Control", context: "Runtime, pacing, experiments and approvals" }, research: { kicker: "EVIDENCE", title: "Research", context: "Experiments, provenance, files and scientific evidence" }, gate: { kicker: "VERIFY", title: "Release", context: "Scientific gate, CI evidence and release readiness" }, settings: { kicker: "CONFIGURE", title: "Settings", context: "Runtime-visible configuration and operator preferences" }, embodiment: { kicker: "EMBODY", title: "Embodiment", context: "Observed body, devices, interoception and feedback" }, }; function ensureStylesheet() { // The canonical stylesheet imports the shell layer once. } function currentTab() { const active = document.querySelector(".tab-content.active[id^='tab-']"); return active?.id?.replace("tab-", "") || "overview"; } function fitCanvas(canvas) { if (!(canvas instanceof HTMLCanvasElement)) return; const ratio = canvas.height / Math.max(canvas.width, 1); canvas.style.width = "100%"; canvas.style.height = `${Math.max(160, canvas.clientWidth * ratio)}px`; } function fitVisibleCanvases(root = document) { root.querySelectorAll("canvas").forEach(fitCanvas); } function ensureWorkspaceHeaders() { Object.entries(TAB_META).forEach(([tabName, meta]) => { const tab = document.getElementById(`tab-${tabName}`); if (!tab) return; tab.classList.add("dashboard-workspace"); if (tab.querySelector(":scope > .workspace-header, :scope > .overview-command-bar, :scope > .dashboard-generated-header")) return; const header = document.createElement("header"); header.className = "dashboard-generated-header"; header.dataset.workspace = tabName; header.innerHTML = `
${meta.kicker}

${meta.title}

${meta.context}

`; tab.prepend(header); }); } function addUtilityBars() { Object.keys(TAB_META).forEach((tabName) => { const tab = document.getElementById(`tab-${tabName}`); if (!tab || tab.querySelector(":scope > .dashboard-utility-bar")) return; const header = tab.querySelector(":scope > .workspace-header, :scope > .overview-command-bar, :scope > .dashboard-generated-header"); if (!header) return; const bar = document.createElement("div"); bar.className = "dashboard-utility-bar"; bar.innerHTML = ` ${TAB_META[tabName].context}
`; header.insertAdjacentElement("afterend", bar); }); } function refreshReadOnlyData() { window.dispatchEvent(new CustomEvent("brain5d:dashboard-refresh", { detail: { tab: currentTab() } })); document.querySelector(`.tab-btn[data-tab="${currentTab()}"]`)?.click(); } function bindUtilityActions() { document.addEventListener("click", (event) => { const button = event.target.closest("[data-dashboard-action]"); if (!button) return; const action = button.dataset.dashboardAction; if (action === "top") { window.scrollTo({ top: 0, behavior: "smooth" }); return; } if (action === "density") { const compact = document.body.dataset.dashboardDensity === "compact"; document.body.dataset.dashboardDensity = compact ? "comfortable" : "compact"; document.querySelectorAll('[data-dashboard-action="density"]').forEach((item) => { item.textContent = compact ? "Compact" : "Comfortable"; }); localStorage.setItem("brain5d-dashboard-density", document.body.dataset.dashboardDensity); fitVisibleCanvases(document.querySelector(".tab-content.active") || document); return; } if (action === "refresh") refreshReadOnlyData(); }); } function bindTabResponsiveness() { document.querySelectorAll(".tab-btn[data-tab]").forEach((button) => { button.addEventListener("click", () => { requestAnimationFrame(() => { const tab = document.getElementById(`tab-${button.dataset.tab}`); if (tab) fitVisibleCanvases(tab); }); }); }); let resizeTimer = null; window.addEventListener("resize", () => { clearTimeout(resizeTimer); resizeTimer = setTimeout(() => fitVisibleCanvases(document.querySelector(".tab-content.active") || document), 80); }); } function restorePreferences() { document.body.dataset.dashboardDensity = localStorage.getItem("brain5d-dashboard-density") || "comfortable"; } function init() { ensureStylesheet(); restorePreferences(); ensureWorkspaceHeaders(); addUtilityBars(); bindUtilityActions(); bindTabResponsiveness(); fitVisibleCanvases(document.querySelector(".tab-content.active") || document); } ensureStylesheet(); if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init, { once: true }); } else { init(); }