blob: da8b5851c85f62d17d26f47ef6f6d3c64bec0cb7 [file] [log] [blame]
// 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');
}
}
}