You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

94 lines
3.5 KiB

import * as coreui from '@coreui/coreui';
window.coreui = coreui;
const THEME = 'coreui-free-bootstrap-admin-template-theme';
// Helper functions declared outside of event scopes so they stay clean
const getStoredTheme = () => localStorage.getItem(THEME);
const setStoredTheme = theme => localStorage.setItem(THEME, theme);
const getPreferredTheme = () => {
const storedTheme = getStoredTheme();
if (storedTheme) return storedTheme;
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
};
const setTheme = theme => {
if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.setAttribute('data-coreui-theme', 'dark');
} else {
document.documentElement.setAttribute('data-coreui-theme', theme);
}
document.documentElement.dispatchEvent(new Event('ColorSchemeChange'));
};
const showActiveTheme = theme => {
const btnToActive = document.querySelector(`[data-coreui-theme-value="${theme}"]`);
if (!btnToActive) return; // Guard clause in case toggle buttons aren't on the current page
const activeThemeIcon = document.querySelector('.theme-icon-active');
const svgOfActiveBtn = btnToActive.querySelector('svg');
for (const element of document.querySelectorAll('[data-coreui-theme-value]')) {
element.classList.remove('active');
}
btnToActive.classList.add('active');
if (activeThemeIcon && svgOfActiveBtn) {
const useElement = svgOfActiveBtn.querySelector('use');
if (useElement) {
const activeUseElement = activeThemeIcon.querySelector('use');
if (activeUseElement) {
activeUseElement.setAttribute('xlink:href', useElement.getAttribute('xlink:href'));
}
} else {
activeThemeIcon.innerHTML = svgOfActiveBtn.innerHTML;
}
}
};
// 1. Run theme initialization immediately on file execution to prevent dark-mode flashbangs
(() => {
const urlParams = new URLSearchParams(window.location.href.split('?')[1]);
if (urlParams.get('theme') && ['auto', 'dark', 'light'].includes(urlParams.get('theme'))) {
localStorage.setItem(THEME, urlParams.get('theme'));
}
setTheme(getPreferredTheme());
})();
// System preferences watcher
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
const storedTheme = getStoredTheme();
if (storedTheme !== 'light' && storedTheme !== 'dark') {
setTheme(getPreferredTheme());
}
});
// 2. CORE LIVEWIRE FIX: Run UI bindings on every single page navigation step
document.addEventListener('livewire:navigated', () => {
const preferredTheme = getPreferredTheme();
// initiate sidebar toggle
const toggleButton = document.querySelector('.header-toggler');
const sidebar = document.querySelector('.sidebar');
if(toggleButton) {
toggleButton.addEventListener('click', () => {
window.coreui.Sidebar.getOrCreateInstance(sidebar).toggle();
})
}
// Ensure the state continues to match after navigation
setTheme(preferredTheme);
showActiveTheme(preferredTheme);
// Re-attach query click listeners to newly swapped DOM elements
for (const toggle of document.querySelectorAll('[data-coreui-theme-value]')) {
toggle.addEventListener('click', () => {
const theme = toggle.getAttribute('data-coreui-theme-value');
setStoredTheme(theme);
setTheme(theme);
showActiveTheme(theme);
});
}
});