UNPKG

flixburst-theme

Version:

A flexible and extensible package for theme management

90 lines (89 loc) 3.3 kB
"use strict"; var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); // src/utils/dom.ts var getSystemThemePreference = /* @__PURE__ */ __name(() => { return window.matchMedia("(prefers-color-scheme: dark)").matches; }, "getSystemThemePreference"); var shouldUseDarkMode = /* @__PURE__ */ __name((theme) => { return theme === "dark" || theme === "system" && getSystemThemePreference(); }, "shouldUseDarkMode"); var applyThemeToDOM = /* @__PURE__ */ __name((isDark) => { const html = document.documentElement; if (isDark) { html.classList.add("dark"); html.setAttribute("data-theme", "dark"); } else { html.classList.remove("dark"); html.setAttribute("data-theme", "light"); } }, "applyThemeToDOM"); var setTheme = /* @__PURE__ */ __name((theme) => { localStorage.setItem("theme", theme); const isDark = shouldUseDarkMode(theme); applyThemeToDOM(isDark); }, "setTheme"); var initializeTheme = /* @__PURE__ */ __name(() => { const savedTheme = localStorage.getItem("theme"); const theme = savedTheme || "system"; const isDark = shouldUseDarkMode(theme); applyThemeToDOM(isDark); return theme; }, "initializeTheme"); var subscribeToSystemTheme = /* @__PURE__ */ __name((callback) => { const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); const handler = /* @__PURE__ */ __name((e) => { callback(e.matches); const theme = localStorage.getItem("theme") || "system"; if (theme === "system") { applyThemeToDOM(e.matches); } }, "handler"); mediaQuery.addEventListener("change", handler); return () => mediaQuery.removeEventListener("change", handler); }, "subscribeToSystemTheme"); var setupThemeManagement = /* @__PURE__ */ __name((params) => { const { setTheme: setTheme2, initializeTheme: initializeTheme2, onThemeChange, onSystemThemeChange } = params; initializeTheme2(); const cleanupSystemTheme = subscribeToSystemTheme((isDark) => { onSystemThemeChange?.(isDark); }); const handleThemeToggle = /* @__PURE__ */ __name((event) => { if (event.detail) { setTheme2(event.detail); onThemeChange?.(event.detail); } else { const storedTheme = localStorage.getItem("theme"); const theme = storedTheme || "system"; setTheme2(theme); onThemeChange?.(theme); } }, "handleThemeToggle"); const handleStorageChange = /* @__PURE__ */ __name((event) => { if (event.key === "theme" && event.newValue) { const newTheme = event.newValue; setTheme2(newTheme); onThemeChange?.(newTheme); } }, "handleStorageChange"); window.addEventListener("theme-toggle", handleThemeToggle); window.addEventListener("storage", handleStorageChange); const cleanupEventListeners = /* @__PURE__ */ __name(() => { window.removeEventListener("theme-toggle", handleThemeToggle); window.removeEventListener("storage", handleStorageChange); }, "cleanupEventListeners"); return () => { cleanupSystemTheme(); cleanupEventListeners(); }; }, "setupThemeManagement"); export { applyThemeToDOM, getSystemThemePreference, initializeTheme, setTheme, setupThemeManagement, shouldUseDarkMode, subscribeToSystemTheme }; //# sourceMappingURL=index.mjs.map