flixburst-theme
Version:
A flexible and extensible package for theme management
90 lines (89 loc) • 3.3 kB
JavaScript
;
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