diff --git a/website/canvas.html b/website/canvas.html
index c92f46b..5a2d511 100644
--- a/website/canvas.html
+++ b/website/canvas.html
@@ -440,6 +440,117 @@
touch-action: none; /* Prevent browser gestures, handle manually */
}
+ /* ── Dark mode overrides ── */
+ body[data-theme="dark"] #canvas {
+ background-color: #0f172a;
+ background-image:
+ linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px);
+ }
+
+ body[data-theme="dark"] #toolbar {
+ background: #1e293b;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
+ }
+
+ body[data-theme="dark"] #toolbar > button,
+ body[data-theme="dark"] .toolbar-group-toggle {
+ background: #334155;
+ color: #e2e8f0;
+ }
+
+ body[data-theme="dark"] #toolbar > button:hover,
+ body[data-theme="dark"] .toolbar-group-toggle:hover {
+ background: #475569;
+ }
+
+ body[data-theme="dark"] .toolbar-sep {
+ background: #334155;
+ }
+
+ body[data-theme="dark"] .toolbar-dropdown,
+ body[data-theme="dark"] #toolbar-panel {
+ background: #1e293b;
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.4);
+ }
+
+ body[data-theme="dark"] .toolbar-dropdown button,
+ body[data-theme="dark"] #toolbar-panel-body button {
+ color: #e2e8f0;
+ }
+
+ body[data-theme="dark"] .toolbar-dropdown button:hover,
+ body[data-theme="dark"] #toolbar-panel-body button:hover {
+ background: #334155;
+ }
+
+ body[data-theme="dark"] #toolbar-panel-header {
+ border-bottom-color: #334155;
+ color: #94a3b8;
+ }
+
+ body[data-theme="dark"] #toolbar-collapse {
+ color: #64748b;
+ }
+
+ body[data-theme="dark"] #toolbar-collapse:hover {
+ background: #334155 !important;
+ color: #e2e8f0;
+ }
+
+ body[data-theme="dark"] #status {
+ background: #1e293b;
+ color: #94a3b8;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
+ }
+
+ body[data-theme="dark"] #community-info {
+ background: #1e293b;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
+ }
+
+ body[data-theme="dark"] #community-info h2 {
+ color: #e2e8f0;
+ }
+
+ body[data-theme="dark"] #community-info p {
+ color: #94a3b8;
+ }
+
+ body[data-theme="dark"] #memory-panel {
+ background: #1e293b;
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
+ }
+
+ body[data-theme="dark"] #memory-panel-header {
+ border-bottom-color: #334155;
+ }
+
+ body[data-theme="dark"] #memory-panel-header h3 {
+ color: #e2e8f0;
+ }
+
+ body[data-theme="dark"] #memory-panel-header .count {
+ background: #334155;
+ color: #94a3b8;
+ }
+
+ body[data-theme="dark"] .memory-item:hover {
+ background: #334155;
+ }
+
+ body[data-theme="dark"] .memory-item .info .name {
+ color: #e2e8f0;
+ }
+
+ body[data-theme="dark"] .memory-item .info .meta {
+ color: #64748b;
+ }
+
+ body[data-theme="dark"] #memory-list:empty::after {
+ color: #64748b;
+ }
+
#canvas-content {
position: absolute;
top: 0;
@@ -915,6 +1026,7 @@
+
@@ -1025,6 +1137,27 @@
document.querySelector("rstack-app-switcher")?.setModules(data.modules || []);
}).catch(() => {});
+ // ── Dark mode toggle ──
+ {
+ const savedTheme = localStorage.getItem("canvas-theme") || "light";
+ const themeBtn = document.getElementById("toggle-theme");
+
+ function applyTheme(theme) {
+ document.body.setAttribute("data-theme", theme);
+ document.querySelector(".rstack-header")?.setAttribute("data-theme", theme);
+ document.querySelector(".rstack-tab-row")?.setAttribute("data-theme", theme);
+ if (themeBtn) themeBtn.textContent = theme === "dark" ? "☀️ Light" : "🌙 Dark";
+ }
+
+ applyTheme(savedTheme);
+
+ themeBtn?.addEventListener("click", () => {
+ const next = document.body.getAttribute("data-theme") === "dark" ? "light" : "dark";
+ applyTheme(next);
+ localStorage.setItem("canvas-theme", next);
+ });
+ }
+
// ── Tab bar / Layer system initialization ──
const tabBar = document.querySelector("rstack-tab-bar");
if (tabBar) {
@@ -2567,7 +2700,7 @@
const btn = e.target.closest("button");
if (!btn) return;
// Keep open for connect, memory, group toggles, collapse, whiteboard tools
- const keepOpen = ["new-arrow", "toggle-memory", "zoom-in", "zoom-out", "reset-view", "toolbar-collapse",
+ const keepOpen = ["new-arrow", "toggle-memory", "toggle-theme", "zoom-in", "zoom-out", "reset-view", "toolbar-collapse",
"wb-pencil", "wb-sticky", "wb-rect", "wb-circle", "wb-line", "wb-eraser"];
if (btn.classList.contains("toolbar-group-toggle")) return;
if (!keepOpen.includes(btn.id)) {