54 lines
2.1 KiB
JavaScript
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);
|
|
});
|
|
});
|
|
}
|
|
});
|