flixburst-theme
Version:
A flexible and extensible package for theme management
121 lines (119 loc) • 4.58 kB
JavaScript
;
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
applyThemeToDOM: () => applyThemeToDOM,
getSystemThemePreference: () => getSystemThemePreference,
initializeTheme: () => initializeTheme,
setTheme: () => setTheme,
setupThemeManagement: () => setupThemeManagement,
shouldUseDarkMode: () => shouldUseDarkMode,
subscribeToSystemTheme: () => subscribeToSystemTheme
});
module.exports = __toCommonJS(index_exports);
// 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");
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
applyThemeToDOM,
getSystemThemePreference,
initializeTheme,
setTheme,
setupThemeManagement,
shouldUseDarkMode,
subscribeToSystemTheme
});
//# sourceMappingURL=index.js.map