{
"slug": "themeswitcher",
"end": "html",
"curated": true,
"summary": "原生主题切换:模式存 localStorage,品牌色写 CSS 变量,深浅靠根节点类。",
"usage": [
"三个模式选项 .kole-themesw-opt 各带 data-mode(light / dark / auto),点击写入 localStorage 的 kole-mode 后重渲染。",
"实际深浅判定在 effective():auto 时读 matchMedia(\"(prefers-color-scheme: dark)\") 的 matches,否则直接用 mode。",
"深浅落地方式是给根节点加类:document.documentElement.classList.toggle(\"kole-dark\", actual === \"dark\")。",
"品牌色是一组动态创建的 .kole-themesw-color(带 role=\"radio\"、aria-checked、tabindex),选中时写 document.documentElement.style.setProperty(\"--kole-color-brand\", brand)。",
"读写 localStorage 都用 try / catch 包住,模式非法时回退 auto(frameworks/ThemeSwitcher.html:37)。",
"系统主题变化有监听:media 的 change 事件里只在 mode === \"auto\" 时重渲染。"
],
"bestPractices": [
"模式与品牌色是两个独立状态(mode 与 brand),品牌色没有持久化,刷新后回到默认色。",
"localStorage 的 try / catch 不要删,隐私模式下访问会抛异常导致整段脚本中断。",
"选项与色点是运行时创建的,色点的 role / aria-checked / tabindex 都在 JS 里设置,改结构时注意这些属性也要跟着改。"
],
"a11y": [
"容器声明 role=\"radiogroup\" 与 aria-label,选项声明 role=\"radio\" 且脚本维护 aria-checked,这一组语义完整。",
"色点与选项都补了 Enter / Space 键盘处理(e.key === \"Enter\" || e.key === \" \"),是本端无障碍做得最完整的一处。",
"radiogroup 内缺少方向键在选项间移动的约定行为,只能用 Tab 逐个走。"
],
"apiCarrier": {
"kind": "attrs",
"note": "H5 端的状态有三处落点:模式选项的 data-mode、根节点上的 kole-dark 类、以及 --kole-color-brand 这个内联 CSS 变量;localStorage 存模式,选项与色点由脚本创建并维护 role=\"radio\" 与 aria-checked。",
"table": [
{
"name": "auto",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:19)。"
},
{
"name": "dark",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:18)。"
},
{
"name": "kole-btn",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:25)。"
},
{
"name": "kole-btn--primary",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:25)。"
},
{
"name": "kole-card",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:23)。"
},
{
"name": "kole-card__body",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:24)。"
},
{
"name": "kole-demo",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:15)。"
},
{
"name": "kole-desc",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:13)。"
},
{
"name": "kole-h2",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:12)。"
},
{
"name": "kole-page",
"type": "类名",
"desc": "H5 端结构里使用的类名(frameworks/ThemeSwitcher.html:11)。"
}
]
},
"resources": [
{
"file": "frameworks/ThemeSwitcher.html",
"kind": "H5 原生",
"desc": "该端实现(本页 API 与用法的唯一权威来源)。"
},
{
"file": "frameworks/ThemeSwitcher.css",
"kind": "样式",
"desc": "该组件的样式文件,类名口径以它为准。"
}
],
"exampleIds": [
"themeswitcher-ex-1"
],
"notes": [
"选项与 data-mode 见(frameworks/ThemeSwitcher.html:17-19),容器 role=\"radiogroup\" 见(frameworks/ThemeSwitcher.html:16)。",
"色点创建与键盘处理见(frameworks/ThemeSwitcher.html:41-43),选项键盘处理见(frameworks/ThemeSwitcher.html:48)。",
"深浅判定见(frameworks/ThemeSwitcher.html:50),根类切换与品牌色变量见(frameworks/ThemeSwitcher.html:53)与(frameworks/ThemeSwitcher.html:56)。",
"系统主题监听见(frameworks/ThemeSwitcher.html:60-63)。"
]
}