const COOKIE = 'tablo_theme';
const SCHEME = 'tablo_scheme';
const THEMES = ['light', 'dark', 'system'];
const ATTRIBUTES = ';path=/;max-age=31536000;samesite=lax';
function cookies(theme, prefersDark) {
const out = [`${COOKIE}=${theme}${ATTRIBUTES}`];
if (theme === 'system') out.push(`${SCHEME}=${prefersDark ? 'dark' : 'light'}${ATTRIBUTES}`);
return out;
}
function isDark(theme, prefersDark) {
return theme === 'dark' || (theme === 'system' && prefersDark);
}
function stored(cookie) {
const match = cookie.match(new RegExp(`(?:^|;\\s*)${COOKIE}=([^;]*)`));
return match && THEMES.includes(match[1]) ? match[1] : null;
}
function choose(doc, theme, prefersDark) {
doc.documentElement.classList.toggle('dark', isDark(theme, prefersDark));
for (const cookie of cookies(theme, prefersDark)) doc.cookie = cookie;
for (const control of doc.querySelectorAll('[data-theme-set]')) {
control.setAttribute('aria-checked', String(control.dataset.themeSet === theme));
}
}
function frozen(doc, change) {
const freeze = doc.createElement('style');
freeze.appendChild(
doc.createTextNode('*,*::before,*::after,*::backdrop{transition:none!important}'),
);
doc.head.appendChild(freeze);
change();
requestAnimationFrame(() => requestAnimationFrame(() => freeze.remove()));
}
function install(doc, media) {
doc.addEventListener('click', (e) => {
const control = e.target.closest && e.target.closest('[data-theme-set]');
if (!control || !THEMES.includes(control.dataset.themeSet)) return;
frozen(doc, () => choose(doc, control.dataset.themeSet, media.matches));
});
const follow = () => {
if (stored(doc.cookie) === 'system') choose(doc, 'system', media.matches);
};
follow();
media.addEventListener('change', () => frozen(doc, follow));
}
if (typeof document !== 'undefined') {
install(document, window.matchMedia('(prefers-color-scheme: dark)'));
}
if (typeof module !== 'undefined' && module.exports) {
module.exports = { COOKIE, SCHEME, choose, cookies, install, isDark, stored };
}