// Scarf landing page — minimal client behavior. // No dependencies. Runs after defer-parse. (function () { const root = document.documentElement; const STORAGE_KEY = 'scarf-theme'; function applyTheme(theme) { if (theme === 'light' || theme === 'dark') { root.setAttribute('data-theme', theme); } else { root.removeAttribute('data-theme'); } applyImageTheme(); } // Resolve the *effective* theme — explicit data-theme wins, otherwise // fall back to the OS preference. function resolveTheme() { const explicit = root.getAttribute('data-theme'); if (explicit === 'light' || explicit === 'dark') return explicit; return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } // Swap every between its light and dark variants. // Also rewrites the parent 's so the picture // algorithm doesn't override us on resize/layout passes. function applyImageTheme() { const theme = resolveTheme(); document.querySelectorAll('img[data-dark-src]').forEach((img) => { if (!img.dataset.lightSrc) { img.dataset.lightSrc = img.getAttribute('src'); } const target = theme === 'dark' ? img.dataset.darkSrc : img.dataset.lightSrc; if (img.getAttribute('src') !== target) img.setAttribute('src', target); const picture = img.parentElement; if (picture && picture.tagName === 'PICTURE') { picture.querySelectorAll('source').forEach((s) => { if (s.getAttribute('srcset') !== target) s.setAttribute('srcset', target); }); } }); } // Hydrate stored preference (if any) — runs after DOMContentLoaded since // the