暗色使用深海蓝灰,并保持足够的层级和对比度。 class 主题同样支持亮暗模式。 Account/Admin 页头增加模式切换按钮,选择会持久保存。 仍遵守 Keycloak 的 darkMode=false 配置,关闭时只允许亮色。 Account 统一为“页面上下文 → 身份业务区 → 操作区”结构。 Admin 统一为“领域上下文 → 业务内容 → 固定操作区”结构。 表格、表单、详情、向导、弹窗、空状态、安全设备及应用授权组件全部纳入统一设计系统。 移动端自动收起侧栏、双栏变单栏,并调整固定操作区。
52 lines
1.5 KiB
TypeScript
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>
|
|
);
|
|
}
|