| // 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'); |
| } |
| } |
| } |