diff --git a/steps/index.html b/steps/index.html index b178b69..b38b6e4 100644 --- a/steps/index.html +++ b/steps/index.html @@ -298,81 +298,22 @@ toggleClusterColor, toggleInlierColor, toggleStationaryColor, toggleVelocity, toggleTracks, toggleEgoSpeed, toggleFrameNorm, toggleDebugOverlay, egoSpeedDisplay, canSpeedDisplay, debugOverlay, snrMinInput, snrMaxInput, applySnrBtn, autoOffsetIndicator, - clearCacheBtn, speedGraphContainer, speedGraphPlaceholder, modalContainer, modalOverlay, - modalContent, modalText, modalOkBtn, modalCancelBtn, toggleCloseUp, + clearCacheBtn, speedGraphContainer, speedGraphPlaceholder, toggleCloseUp, //---UI Updaters---// updateFrame, resetVisualization, updateCanDisplay, updateDebugOverlay } from './src/dom.js'; - // --- DARK MODE: Step 3 - Add the JavaScript Logic --- - const themeToggleBtn = document.getElementById('theme-toggle'); - const darkIcon = document.getElementById('theme-toggle-dark-icon'); - const lightIcon = document.getElementById('theme-toggle-light-icon'); - - function setTheme(theme) { - if (theme === 'dark') { - document.documentElement.classList.add('dark'); - lightIcon.classList.remove('hidden'); - darkIcon.classList.add('hidden'); - localStorage.setItem('color-theme', 'dark'); - } else { - document.documentElement.classList.remove('dark'); - darkIcon.classList.remove('hidden'); - lightIcon.classList.add('hidden'); - localStorage.setItem('color-theme', 'light'); - } - if (appState.p5_instance) appState.p5_instance.redraw(); - if (appState.speedGraphInstance) { - if ((appState.canData.length > 0 || appState.vizData) && videoPlayer.duration) { - appState.speedGraphInstance.setData(appState.canData, appState.vizData, videoPlayer.duration); - } - appState.speedGraphInstance.redraw(); - } - } - - const savedTheme = localStorage.getItem('color-theme'); - if (savedTheme) { - setTheme(savedTheme); - } else { - // Default to light mode if no theme is saved - setTheme('light'); - } + // import modal dialog logic from './src/modal.js'; + import { + showModal + } from './src/modal.js'; - themeToggleBtn.addEventListener('click', () => { - if (document.documentElement.classList.contains('dark')) { - setTheme('light'); - } else { - setTheme('dark'); - } - }); + // import initialize theme from './src/theme.js'; + import { + initializeTheme + } from './src/theme.js'; - // --- Custom Modal Logic --- // - let modalResolve = null; - function showModal(message, isConfirm = false) { - return new Promise(resolve => { - modalText.textContent = message; - modalCancelBtn.classList.toggle('hidden', !isConfirm); - modalContainer.classList.remove('hidden'); - setTimeout(() => { - modalOverlay.classList.remove('opacity-0'); - modalContent.classList.remove('scale-95'); - } - , 10); - modalResolve = resolve; - }); - } - function hideModal(value) { - modalOverlay.classList.add('opacity-0'); - modalContent.classList.add('scale-95'); - setTimeout(() => { - modalContainer.classList.add('hidden'); - if (modalResolve) modalResolve(value); - }, 200); - } - modalOkBtn.addEventListener('click', () => hideModal(true)); - modalCancelBtn.addEventListener('click', () => hideModal(false)); - modalOverlay.addEventListener('click', () => hideModal(false)); // --- IndexedDB for Caching --- let db; function initDB(callback) { const request = indexedDB.open('visualizerDB', 1); request.onupgradeneeded = function (event) { const db = event.target.result; if (!db.objectStoreNames.contains('files')) { db.createObjectStore('files'); } }; request.onsuccess = function (event) { db = event.target.result; console.log("Database initialized"); if (callback) callback(); }; request.onerror = function (event) { console.error("IndexedDB error:", event.target.errorCode); }; } @@ -946,6 +887,7 @@ document.addEventListener('DOMContentLoaded', () => { + initializeTheme(); // Setup theme here as soon as DOM is loaded. console.log("DEBUG: DOMContentLoaded fired. Starting session load."); initDB(() => { console.log("DEBUG: Database initialized."); diff --git a/steps/src/modal.js b/steps/src/modal.js new file mode 100644 index 0000000..7e9cc1b --- /dev/null +++ b/steps/src/modal.js @@ -0,0 +1,33 @@ + +import { modalText, modalCancelBtn, modalContainer, modalOverlay, modalContent, modalOkBtn } from './dom.js'; + +// --- Custom Modal Logic --- // + let modalResolve = null; + export function showModal(message, isConfirm = false) { + return new Promise(resolve => { + modalText.textContent = message; + modalCancelBtn.classList.toggle('hidden', !isConfirm); + modalContainer.classList.remove('hidden'); + setTimeout(() => { + modalOverlay.classList.remove('opacity-0'); + modalContent.classList.remove('scale-95'); + } + , 10); + modalResolve = resolve; + }); + } + function hideModal(value) { + modalOverlay.classList.add('opacity-0'); + modalContent.classList.add('scale-95'); + setTimeout(() => { + modalContainer.classList.add('hidden'); + if (modalResolve) modalResolve(value); + }, 200); + } + + + //----------------------Modal Event Listeners----------------------// + + modalOkBtn.addEventListener('click', () => hideModal(true)); + modalCancelBtn.addEventListener('click', () => hideModal(false)); + modalOverlay.addEventListener('click', () => hideModal(false)); \ No newline at end of file diff --git a/steps/src/theme.js b/steps/src/theme.js new file mode 100644 index 0000000..9f65817 --- /dev/null +++ b/steps/src/theme.js @@ -0,0 +1,48 @@ +import { appState } from './state.js'; + + + + +// --- DARK MODE: Step 3 - Add the JavaScript Logic --- +const themeToggleBtn = document.getElementById('theme-toggle'); +const darkIcon = document.getElementById('theme-toggle-dark-icon'); +const lightIcon = document.getElementById('theme-toggle-light-icon'); + +function setTheme(theme) { + if (theme === 'dark') { + document.documentElement.classList.add('dark'); + lightIcon.classList.remove('hidden'); + darkIcon.classList.add('hidden'); + localStorage.setItem('color-theme', 'dark'); + } else { + document.documentElement.classList.remove('dark'); + darkIcon.classList.remove('hidden'); + lightIcon.classList.add('hidden'); + localStorage.setItem('color-theme', 'light'); + } + if (appState.p5_instance) appState.p5_instance.redraw(); + if (appState.speedGraphInstance) { + if ((appState.canData.length > 0 || appState.vizData) && videoPlayer.duration) { + appState.speedGraphInstance.setData(appState.canData, appState.vizData, videoPlayer.duration); + } + appState.speedGraphInstance.redraw(); + } +} + +export function initializeTheme() { + const savedTheme = localStorage.getItem('color-theme'); + if (savedTheme) { + setTheme(savedTheme); + } else { + // Default to light mode if no theme is saved + setTheme('light'); + } + + themeToggleBtn.addEventListener('click', () => { + if (document.documentElement.classList.contains('dark')) { + setTheme('light'); + } else { + setTheme('dark'); + } + }); +}