diff --git a/public/app.js b/public/app.js
index 985a90c..eb47d96 100644
--- a/public/app.js
+++ b/public/app.js
@@ -315,7 +315,10 @@ function navigate() {
}
window.addEventListener('hashchange', navigate);
-window.addEventListener('theme-changed', () => { if (typeof navigate === 'function') navigate(); });
+window.addEventListener('theme-changed', () => {
+ // Notify current page to re-render without full teardown
+ window.dispatchEvent(new CustomEvent('theme-refresh'));
+});
window.addEventListener('DOMContentLoaded', () => {
connectWS();
diff --git a/public/index.html b/public/index.html
index 1b77ad8..3214953 100644
--- a/public/index.html
+++ b/public/index.html
@@ -85,10 +85,10 @@
-
+
-
-
+
+
@@ -96,7 +96,7 @@
-
+
diff --git a/public/live.js b/public/live.js
index 010a657..294b657 100644
--- a/public/live.js
+++ b/public/live.js
@@ -2237,5 +2237,17 @@
VCR.buffer = []; VCR.playhead = -1; VCR.mode = 'LIVE'; VCR.missedCount = 0; VCR.speed = 1;
}
- registerPage('live', { init, destroy });
+ let _themeRefreshHandler = null;
+
+ registerPage('live', {
+ init: function(app, routeParam) {
+ _themeRefreshHandler = () => { /* live map rebuilds on next packet */ };
+ window.addEventListener('theme-refresh', _themeRefreshHandler);
+ return init(app, routeParam);
+ },
+ destroy: function() {
+ if (_themeRefreshHandler) { window.removeEventListener('theme-refresh', _themeRefreshHandler); _themeRefreshHandler = null; }
+ return destroy();
+ }
+ });
})();
diff --git a/public/map.js b/public/map.js
index 76d2f73..02e8698 100644
--- a/public/map.js
+++ b/public/map.js
@@ -680,5 +680,17 @@
}
}
- registerPage('map', { init, destroy });
+ let _themeRefreshHandler = null;
+
+ registerPage('map', {
+ init: function(app, routeParam) {
+ _themeRefreshHandler = () => { if (markerLayer) renderMarkers(); };
+ window.addEventListener('theme-refresh', _themeRefreshHandler);
+ return init(app, routeParam);
+ },
+ destroy: function() {
+ if (_themeRefreshHandler) { window.removeEventListener('theme-refresh', _themeRefreshHandler); _themeRefreshHandler = null; }
+ return destroy();
+ }
+ });
})();
diff --git a/public/packets.js b/public/packets.js
index 82464b8..69e02c0 100644
--- a/public/packets.js
+++ b/public/packets.js
@@ -1695,7 +1695,19 @@
} catch {}
}
- registerPage('packets', { init, destroy });
+ let _themeRefreshHandler = null;
+
+ registerPage('packets', {
+ init: function(app, routeParam) {
+ _themeRefreshHandler = () => { if (typeof renderTableRows === 'function') renderTableRows(); };
+ window.addEventListener('theme-refresh', _themeRefreshHandler);
+ return init(app, routeParam);
+ },
+ destroy: function() {
+ if (_themeRefreshHandler) { window.removeEventListener('theme-refresh', _themeRefreshHandler); _themeRefreshHandler = null; }
+ return destroy();
+ }
+ });
// Standalone packet detail page: #/packet/123 or #/packet/HASH
registerPage('packet-detail', {