57 lines
2.5 KiB
JavaScript
57 lines
2.5 KiB
JavaScript
import './bootstrap';
|
||
|
||
const menuButton = document.querySelector('[data-menu-toggle]');
|
||
const menuPanel = document.querySelector('[data-menu-panel]');
|
||
|
||
menuButton?.addEventListener('click', () => {
|
||
const open = menuPanel?.classList.toggle('open') ?? false;
|
||
menuButton.setAttribute('aria-expanded', String(open));
|
||
menuButton.textContent = open ? '×' : '☰';
|
||
});
|
||
|
||
document.querySelectorAll('[data-menu-panel] a').forEach((link) => {
|
||
link.addEventListener('click', () => {
|
||
menuPanel?.classList.remove('open');
|
||
menuButton?.setAttribute('aria-expanded', 'false');
|
||
if (menuButton) menuButton.textContent = '☰';
|
||
});
|
||
});
|
||
|
||
const adminSidebar = document.querySelector('#adminSidebar');
|
||
const adminOverlay = document.querySelector('[data-admin-overlay]');
|
||
const setAdminMenu = (open) => {
|
||
adminSidebar?.classList.toggle('open', open);
|
||
adminOverlay?.classList.toggle('open', open);
|
||
document.body.classList.toggle('admin-menu-open', open);
|
||
};
|
||
|
||
document.querySelector('[data-admin-open]')?.addEventListener('click', () => setAdminMenu(true));
|
||
document.querySelector('[data-admin-close]')?.addEventListener('click', () => setAdminMenu(false));
|
||
adminOverlay?.addEventListener('click', () => setAdminMenu(false));
|
||
|
||
|
||
const adminThemeButtons = document.querySelectorAll('[data-admin-theme]');
|
||
const adminThemeMedia = window.matchMedia('(prefers-color-scheme: dark)');
|
||
|
||
const applyAdminTheme = (preference, persist = true) => {
|
||
if (!['light', 'dark', 'system'].includes(preference)) preference = 'system';
|
||
const resolved = preference === 'system' ? (adminThemeMedia.matches ? 'dark' : 'light') : preference;
|
||
document.documentElement.dataset.adminTheme = resolved;
|
||
document.documentElement.dataset.adminThemePreference = preference;
|
||
if (persist) localStorage.setItem('beatbook-admin-theme', preference);
|
||
|
||
adminThemeButtons.forEach((button) => {
|
||
const active = button.dataset.adminTheme === preference;
|
||
button.classList.toggle('active', active);
|
||
button.setAttribute('aria-pressed', String(active));
|
||
});
|
||
};
|
||
|
||
if (adminThemeButtons.length) {
|
||
applyAdminTheme(localStorage.getItem('beatbook-admin-theme') || 'system', false);
|
||
adminThemeButtons.forEach((button) => button.addEventListener('click', () => applyAdminTheme(button.dataset.adminTheme)));
|
||
adminThemeMedia.addEventListener?.('change', () => {
|
||
if ((localStorage.getItem('beatbook-admin-theme') || 'system') === 'system') applyAdminTheme('system', false);
|
||
});
|
||
}
|