Files
2026-09-16 23:20:08 +07:00

54 lines
2.1 KiB
JavaScript

// assets/js/main.js
document.addEventListener('DOMContentLoaded', function() {
// --- Dark Mode System ---
const themeToggleBtn = document.getElementById('themeToggle');
const htmlElement = document.documentElement;
// Check local storage or system preference
if (localStorage.getItem('theme') === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
htmlElement.classList.add('dark');
} else {
htmlElement.classList.remove('dark');
}
if (themeToggleBtn) {
themeToggleBtn.addEventListener('click', function() {
htmlElement.classList.toggle('dark');
if (htmlElement.classList.contains('dark')) {
localStorage.setItem('theme', 'dark');
} else {
localStorage.setItem('theme', 'light');
}
});
}
// --- Loading Button Global Handling ---
// If a button has 'data-loading-text', it will show a spinner when clicked within a form
const forms = document.querySelectorAll('form');
forms.forEach(form => {
form.addEventListener('submit', function(e) {
const submitBtn = form.querySelector('button[type="submit"]');
if (submitBtn) {
// Don't disable immediately if validation is required and fails, but assuming HTML5 validation passes here
submitBtn.classList.add('btn-loading');
// Optional: revert loading state if the form submission is prevented via AJAX in specific page scripts
}
});
});
// --- PWA Service Worker Registration ---
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('sw.js')
.then(registration => {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
})
.catch(err => {
console.log('ServiceWorker registration failed: ', err);
});
});
}
});