// Tachyon Profiler - Shared JavaScript // Common utilities shared between flamegraph and heatmap views // ============================================================================ // Theme Support // ============================================================================ // Storage key for theme preference const THEME_STORAGE_KEY = 'tachyon-theme'; // Get the preferred theme from localStorage or system preference function getPreferredTheme() { const saved = localStorage.getItem(THEME_STORAGE_KEY); if (saved) return saved; return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } // Apply theme and update UI function applyTheme(theme) { document.documentElement.setAttribute('data-theme', theme); const btn = document.getElementById('theme-btn'); if (btn) { const moonIcon = btn.querySelector('.icon-moon'); const sunIcon = btn.querySelector('.icon-sun'); if (moonIcon) moonIcon.style.display = theme === 'dark' ? 'none' : ''; if (sunIcon) sunIcon.style.display = theme === 'dark' ? '' : 'none'; } } // Toggle theme and save preference. Returns the new theme. function toggleAndSaveTheme() { const current = document.documentElement.getAttribute('data-theme') || 'light'; const next = current === 'light' ? 'dark' : 'light'; applyTheme(next); localStorage.setItem(THEME_STORAGE_KEY, next); return next; } // ============================================================================ // Toggle Switch UI // ============================================================================ function updateToggleUI(toggleId, isOn) { const toggle = document.getElementById(toggleId); if (toggle) { const track = toggle.querySelector('.toggle-track'); const labels = toggle.querySelectorAll('.toggle-label'); if (isOn) { track.classList.add('on'); labels[0].classList.remove('active'); labels[1].classList.add('active'); } else { track.classList.remove('on'); labels[0].classList.add('active'); labels[1].classList.remove('active'); } } }