修复首屏:增加预加载占位并提前恢复主题

This commit is contained in:
cieanyau committed 2026-11-07 05:47:34 +08:00
1 parent 83b7484558
commit 30cbfd3a9c
7 files changed
+395 -23

No files matched your search

+9 -20
View File
@@ -1,14 +1,7 @@
/** 浅色/深色/跟随系统三态主题,使用共享 Nuxt 状态与 html.app-dark 驱动组件和原生控件。 */
import { computed } from "vue";
import { useState } from "#app";
// 存储不可用或值未知时安全回落 auto,不让浏览器隐私限制阻断页面初始化。
function n(e) {
try {
let t = (e ?? globalThis.localStorage)?.getItem(`theme`);
if (t === `light` || t === `dark`) return t;
} catch {}
return `auto`;
}
import { applyTheme } from "~/utils/theme-appearance.js";
var r = [`light`, `dark`, `auto`],
i = {
light: `浅色`,
@@ -22,7 +15,7 @@ var r = [`light`, `dark`, `auto`],
},
o = `theme`;
function s() {
let s = useState(`theme-mode`, () => n()),
let s = useState(`theme-mode`, () => applyTheme().mode),
c = useState(
`theme-dark`,
() =>
@@ -30,17 +23,8 @@ function s() {
document.documentElement.classList.contains(`app-dark`),
),
l = () => window.matchMedia(`(prefers-color-scheme: dark)`);
// 仅 auto 读取系统偏好;显式 light/dark 不受系统变化影响。
function u() {
c.value = s.value === `dark` || (s.value === `auto` && l().matches);
}
function d() {
let e = document.documentElement;
(e.classList.toggle(`app-dark`, c.value),
(e.style.colorScheme = c.value ? `dark` : `light`));
}
function f() {
(u(), d());
c.value = applyTheme(s.value).dark;
}
let p = null,
m = () => {
@@ -51,7 +35,12 @@ function s() {
(p?.removeEventListener(`change`, m), (p = null));
}
function g() {
(h(), (s.value = n()), f(), (p = l()), p.addEventListener(`change`, m));
h();
const appearance = applyTheme();
s.value = appearance.mode;
c.value = appearance.dark;
p = l();
p.addEventListener(`change`, m);
}
// 调用方传入已知模式;持久化失败不影响当前页面切换。
function _(e) {