achille-press/js/theme-toggle.js
gribse 582e4491c0
Some checks failed
CSS Code Linting / Lint CSS (push) Has been cancelled
JS Code Linting / Lint JS (push) Has been cancelled
PHP Code Linting / Parallel lint (push) Has been cancelled
PHP Code Linting / PHPCS check (push) Has been cancelled
clause agent mode "make it look like papermod"
2025-07-26 16:24:01 +02:00

92 lines
2.8 KiB
JavaScript

/**
* Theme toggle functionality
* Handles light/dark mode switching
*/
(function() {
'use strict';
// Get theme preference from localStorage or system preference
function getThemePreference() {
const stored = localStorage.getItem('achille-press-theme');
if (stored) {
return stored;
}
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Set theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('achille-press-theme', theme);
// Update meta theme-color for mobile browsers
const metaThemeColor = document.querySelector('meta[name="theme-color"]');
if (metaThemeColor) {
metaThemeColor.setAttribute('content', theme === 'dark' ? '#1a1a1a' : '#ffffff');
}
}
// Toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme') || 'light';
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Initialize theme on page load
function initTheme() {
const theme = getThemePreference();
setTheme(theme);
}
// Setup theme toggle button
function setupThemeToggle() {
const themeToggle = document.querySelector('.theme-toggle');
if (themeToggle) {
themeToggle.addEventListener('click', toggleTheme);
// Add keyboard support
themeToggle.addEventListener('keydown', function(e) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
toggleTheme();
}
});
}
}
// Listen for system theme changes
function setupSystemThemeListener() {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
mediaQuery.addListener(function(e) {
// Only update if user hasn't manually set a preference
if (!localStorage.getItem('achille-press-theme')) {
setTheme(e.matches ? 'dark' : 'light');
}
});
}
// Initialize everything when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initTheme();
setupThemeToggle();
setupSystemThemeListener();
});
} else {
initTheme();
setupThemeToggle();
setupSystemThemeListener();
}
// Add meta theme-color if it doesn't exist
if (!document.querySelector('meta[name="theme-color"]')) {
const meta = document.createElement('meta');
meta.name = 'theme-color';
meta.content = '#ffffff';
document.head.appendChild(meta);
}
})();