fix: 深色模式入口移至外观分组并移除侧边栏按钮(1.0.6)
- 设置入口 group 改为官方 interface(外观)分组 - 删除侧边栏 ThemeToggle 注入器及组件,设置页成为唯一入口 - verify-toggle.py 改为直接驱动主题状态并校验翻转 - 同步 README 与脚本文档,版本升级 1.0.6
This commit is contained in:
+5
-3
@@ -42,13 +42,15 @@ D:\settings\settings\uv\my_uv_env\Scripts\python.exe scripts\scan-dark.py --mode
|
||||
D:\settings\settings\uv\my_uv_env\Scripts\python.exe scripts\verify-toggle.py
|
||||
```
|
||||
|
||||
部署新版插件后运行,会检查:
|
||||
部署新版插件后运行,会直接驱动 localStorage 中的主题状态,并检查:
|
||||
|
||||
- `data-halo-theme` 属性翻转
|
||||
- localStorage 持久化翻转
|
||||
- `data-darkreader-mode`(Dark Reader 注入状态)翻转
|
||||
- `color-scheme` 翻转
|
||||
- 侧边栏已不再注入 `.theme-toggle` / `.plugin-dark-mode-toggle` 按钮
|
||||
|
||||
三项全部 PASS 时返回 0。
|
||||
状态翻转全部 PASS 且按钮已移除时返回 0。
|
||||
|
||||
## 输出
|
||||
|
||||
@@ -62,4 +64,4 @@ D:\settings\settings\uv\my_uv_env\Scripts\python.exe scripts\verify-toggle.py
|
||||
元素误判为界面残留。
|
||||
- 路由从 Vue Router 动态发现,Halo 或插件升级新增页面后无需维护清单。
|
||||
- `scan-dark.py` 主要为历史手工 CSS 工作流保留;当前暗色转换由 Dark Reader 负责,
|
||||
运行时行为验证以 `verify-toggle.py` 为准。
|
||||
运行时行为验证以 `verify-toggle.py` 为准。
|
||||
|
||||
+62
-10
@@ -1,4 +1,4 @@
|
||||
"""验证侧边栏主题切换:点击后检查 data-halo-theme、localStorage 与 Dark Reader 模式。"""
|
||||
"""验证主题切换:直接驱动 localStorage,检查 data-halo-theme、Dark Reader 与 color-scheme 翻转。"""
|
||||
import argparse
|
||||
import pathlib
|
||||
import sys
|
||||
@@ -8,6 +8,7 @@ from playwright.sync_api import sync_playwright
|
||||
|
||||
DEFAULT_PROFILE = pathlib.Path(__file__).parent / ".browser-profile"
|
||||
BASE = "https://blog.liuhangyv.top"
|
||||
STORAGE_KEY = "halo-dark-mode-theme"
|
||||
|
||||
|
||||
def read_state(page) -> dict:
|
||||
@@ -16,10 +17,40 @@ def read_state(page) -> dict:
|
||||
attr: document.documentElement.getAttribute('data-halo-theme'),
|
||||
darkreader: document.documentElement.getAttribute('data-darkreader-mode'),
|
||||
stored: localStorage.getItem('halo-dark-mode-theme'),
|
||||
colorScheme: document.documentElement.style.colorScheme,
|
||||
})"""
|
||||
)
|
||||
|
||||
|
||||
def set_mode(page, mode: str) -> None:
|
||||
"""写入持久化偏好并派发 storage 事件,让当前页面 useDarkMode 单例即时响应。"""
|
||||
page.evaluate(
|
||||
"""([key, mode]) => {
|
||||
localStorage.setItem(key, mode)
|
||||
window.dispatchEvent(
|
||||
new StorageEvent('storage', { key: key, newValue: mode })
|
||||
)
|
||||
}""",
|
||||
[STORAGE_KEY, mode],
|
||||
)
|
||||
|
||||
|
||||
def wait_mode(page, expect_dark: bool) -> None:
|
||||
page.wait_for_function(
|
||||
"""(expectDark) => {
|
||||
const attr = document.documentElement.getAttribute('data-halo-theme')
|
||||
const darkreader = document.documentElement.getAttribute('data-darkreader-mode')
|
||||
const scheme = document.documentElement.style.colorScheme
|
||||
if (expectDark) {
|
||||
return attr === 'dark' && darkreader === 'dynamic' && scheme === 'dark'
|
||||
}
|
||||
return attr === null && darkreader === null && scheme !== 'dark'
|
||||
}""",
|
||||
arg=expect_dark,
|
||||
timeout=15000,
|
||||
)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="验证主题切换运行时行为")
|
||||
parser.add_argument("--base", default=BASE)
|
||||
@@ -45,33 +76,54 @@ def main() -> int:
|
||||
ctx.close()
|
||||
return 3
|
||||
|
||||
toggle = page.locator(".theme-toggle")
|
||||
toggle.wait_for(state="visible", timeout=15000)
|
||||
toggle_absent = page.locator(".theme-toggle, .plugin-dark-mode-toggle").count() == 0
|
||||
print(f"侧边栏注入按钮已移除: {'PASS' if toggle_absent else 'FAIL'}")
|
||||
|
||||
# 先归一化到浅色,保证后续翻转判定与当前会话状态无关
|
||||
set_mode(page, "light")
|
||||
wait_mode(page, expect_dark=False)
|
||||
before = read_state(page)
|
||||
toggle.click()
|
||||
time.sleep(1)
|
||||
|
||||
set_mode(page, "dark")
|
||||
wait_mode(page, expect_dark=True)
|
||||
after = read_state(page)
|
||||
toggle.click()
|
||||
time.sleep(1)
|
||||
|
||||
set_mode(page, "light")
|
||||
wait_mode(page, expect_dark=False)
|
||||
restored = read_state(page)
|
||||
|
||||
attr_flipped = before["attr"] != after["attr"] and before["attr"] == restored["attr"]
|
||||
stored_flipped = before["stored"] != after["stored"] and before["stored"] == restored["stored"]
|
||||
stored_flipped = (
|
||||
before["stored"] != after["stored"] and before["stored"] == restored["stored"]
|
||||
)
|
||||
darkreader_flipped = (
|
||||
before["darkreader"] != after["darkreader"]
|
||||
and before["darkreader"] == restored["darkreader"]
|
||||
)
|
||||
scheme_flipped = (
|
||||
before["colorScheme"] != after["colorScheme"]
|
||||
and before["colorScheme"] == restored["colorScheme"]
|
||||
)
|
||||
print(f"初始: {before}")
|
||||
print(f"切换: {after}")
|
||||
print(f"还原: {restored}")
|
||||
print(
|
||||
f"属性翻转: {'PASS' if attr_flipped else 'FAIL'} "
|
||||
f"存储翻转: {'PASS' if stored_flipped else 'FAIL'} "
|
||||
f"Dark Reader 翻转: {'PASS' if darkreader_flipped else 'FAIL'}"
|
||||
f"Dark Reader 翻转: {'PASS' if darkreader_flipped else 'FAIL'} "
|
||||
f"color-scheme 翻转: {'PASS' if scheme_flipped else 'FAIL'}"
|
||||
)
|
||||
|
||||
ctx.close()
|
||||
return 0 if attr_flipped and stored_flipped and darkreader_flipped else 1
|
||||
return (
|
||||
0
|
||||
if toggle_absent
|
||||
and attr_flipped
|
||||
and stored_flipped
|
||||
and darkreader_flipped
|
||||
and scheme_flipped
|
||||
else 1
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user