Files
keycloakify-bi/src/shared/ThemeModeToggle.tsx
T
biss ec277d4e3f keycloakify-starter 亮色改为雾白、冰蓝工作区,不再大面积深色。
暗色使用深海蓝灰,并保持足够的层级和对比度。
class 主题同样支持亮暗模式。
Account/Admin 页头增加模式切换按钮,选择会持久保存。
仍遵守 Keycloak 的 darkMode=false 配置,关闭时只允许亮色。
Account 统一为“页面上下文 → 身份业务区 → 操作区”结构。
Admin 统一为“领域上下文 → 业务内容 → 固定操作区”结构。
表格、表单、详情、向导、弹窗、空状态、安全设备及应用授权组件全部纳入统一设计系统。
移动端自动收起侧栏、双栏变单栏,并调整固定操作区。
2026-08-04 17:08:35 +08:00

52 lines
1.5 KiB
TypeScript

import { useEffect, useState } from "react";
import { Button } from "./@patternfly/react-core";
import { MoonIcon, SunIcon } from "./@patternfly/react-icons";
import {
getConsoleColorMode,
subscribeToConsoleColorMode,
toggleConsoleColorMode
} from "./consoleColorScheme";
function labels(isDark: boolean) {
const isChinese = document.documentElement.lang.toLowerCase().startsWith("zh");
if (isChinese) {
return {
current: isDark ? "暗色" : "亮色",
action: isDark ? "切换至亮色模式" : "切换至暗色模式"
};
}
return {
current: isDark ? "Dark" : "Light",
action: isDark ? "Switch to light mode" : "Switch to dark mode"
};
}
export function ThemeModeToggle() {
const [mode, setMode] = useState(getConsoleColorMode);
useEffect(() => subscribeToConsoleColorMode(setMode), []);
if (document.documentElement.dataset.consoleDarkAllowed === "false") {
return null;
}
const isDark = mode === "dark";
const copy = labels(isDark);
return (
<Button
variant="plain"
className="console-theme-toggle"
aria-label={copy.action}
title={copy.action}
aria-pressed={isDark}
icon={isDark ? <MoonIcon /> : <SunIcon />}
onClick={toggleConsoleColorMode}
>
<span className="console-theme-toggle__label">{copy.current}</span>
</Button>
);
}