| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- /**
- * 主题工具函数:检测系统主题、应用主题、监听系统主题变化
- */
- export type ThemeMode = "light" | "dark" | "system"
- /**
- * 检测系统是否为深色模式
- */
- function isSystemDark(): boolean {
- if (typeof window === "undefined") return false
- return window.matchMedia("(prefers-color-scheme: dark)").matches
- }
- /**
- * 获取系统当前对应的实际主题(light 或 dark)
- */
- function getSystemTheme(): "light" | "dark" {
- return isSystemDark() ? "dark" : "light"
- }
- /**
- * 应用主题到 documentElement
- */
- export function applyTheme(theme: ThemeMode): void {
- if (typeof document === "undefined") return
- const html = document.documentElement
- html.classList.remove("dark")
- let actualTheme = theme
- if (theme === "system") {
- actualTheme = getSystemTheme()
- }
- if (actualTheme === "dark") {
- html.classList.add("dark")
- }
- }
- /**
- * 监听系统主题变化,当主题为system模式时自动切换
- * 返回一个取消监听的函数
- */
- export function watchSystemTheme(onChange: () => void): () => void {
- if (typeof window === "undefined") return () => {}
- const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)")
- const handler = () => onChange()
- if (mediaQuery.addEventListener) {
- mediaQuery.addEventListener("change", handler)
- return () => mediaQuery.removeEventListener("change", handler)
- } else {
- // 兼容旧浏览器
- mediaQuery.addListener(handler)
- return () => mediaQuery.removeListener(handler)
- }
- }
|