Compare commits

...

2 Commits

Author SHA1 Message Date
b492910f2e refactor: 重构系统图标深色模式适配: 智能识别单色图标并选择性着色
- 为 OSConfig 添加 isMonochrome 属性,识别单色和彩色图标
- 只对单色图标 (macOS, OpenWrt, ImmortalWrt, 默认图标) 应用颜色反转
- 保留彩色图标 (Ubuntu, Debian, Arch, Windows 等) 的原始外观
- 添加 isOSIconMonochrome() 函数用于判断图标类型
- 使用 os-icon-mono 类替代 os-icon,实现精确的样式控制
2025-09-18 16:56:06 +08:00
a9ca94e2d6 refactor: 修复深色模式背景色问题: 添加动态主题类管理,将深色背景改为纯黑色 2025-09-18 16:42:52 +08:00
4 changed files with 73 additions and 3 deletions

View File

@@ -3,6 +3,7 @@ import {
formatBytes, formatBytes,
formatUptime, formatUptime,
getOSImage, getOSImage,
isOSIconMonochrome,
formatTrafficLimit, formatTrafficLimit,
} from "@/utils"; } from "@/utils";
import type { NodeWithStatus } from "@/types/node"; import type { NodeWithStatus } from "@/types/node";
@@ -50,7 +51,9 @@ export const NodeCard = ({
<img <img
src={getOSImage(node.os)} src={getOSImage(node.os)}
alt={node.os} alt={node.os}
className="w-6 h-6 object-contain" className={`w-6 h-6 object-contain ${
isOSIconMonochrome(node.os) ? "os-icon-mono" : ""
}`}
loading="lazy" loading="lazy"
/> />
<CardTitle className="text-base font-bold">{node.name}</CardTitle> <CardTitle className="text-base font-bold">{node.name}</CardTitle>

View File

@@ -83,7 +83,7 @@
} }
.dark { .dark {
--background: #0a0a0a; --background: #000000;
--foreground: #fafafa; --foreground: #fafafa;
--card: var(--card-dark, #17171780); --card: var(--card-dark, #17171780);
--card-foreground: #fafafa; --card-foreground: #fafafa;
@@ -140,6 +140,11 @@
--purcarte-card-color: var(--card-dark); --purcarte-card-color: var(--card-dark);
} }
/* 深色模式下的卡片/面板背景色 */
.dark {
--card-dark: rgba(30, 30, 30, 0.8);
}
.purcarte-blur { .purcarte-blur {
@apply bg-(--purcarte-card-color)! backdrop-blur-(--purcarte-blur)!; @apply bg-(--purcarte-card-color)! backdrop-blur-(--purcarte-blur)!;
} }
@@ -166,9 +171,23 @@
@apply rounded-lg shadow-sm shadow-(color:--accent-12)/20 box-border border border-(--accent-12)/25; @apply rounded-lg shadow-sm shadow-(color:--accent-12)/20 box-border border border-(--accent-12)/25;
} }
/* 深色模式下的卡片样式 */
.dark .theme-card-style {
@apply shadow-sm shadow-white/10 border-white/20;
}
.theme-text-muted { .theme-text-muted {
@apply text-(--theme-text-muted-color); @apply text-(--theme-text-muted-color);
} }
/* 深色模式下的单色系统图标样式 */
.os-icon-mono {
transition: filter 0.2s ease-in-out;
}
.dark .os-icon-mono {
filter: brightness(0) invert(1);
}
} }
/* 背景图片伪元素 */ /* 背景图片伪元素 */

View File

@@ -1,4 +1,4 @@
import { StrictMode, useState, lazy, Suspense } from "react"; import { StrictMode, useState, lazy, Suspense, useEffect } from "react";
import { createRoot } from "react-dom/client"; import { createRoot } from "react-dom/client";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import "./index.css"; import "./index.css";
@@ -29,6 +29,16 @@ export const AppContent = () => {
const enableVideoBackground = useConfigItem("enableVideoBackground"); const enableVideoBackground = useConfigItem("enableVideoBackground");
const videoBackgroundUrl = useConfigItem("videoBackgroundUrl"); const videoBackgroundUrl = useConfigItem("videoBackgroundUrl");
// 动态设置 HTML 根元素的 dark 类
useEffect(() => {
const htmlElement = document.documentElement;
if (appearance === "dark") {
htmlElement.classList.add("dark");
} else {
htmlElement.classList.remove("dark");
}
}, [appearance]);
return ( return (
<> <>
{enableVideoBackground && videoBackgroundUrl && ( {enableVideoBackground && videoBackgroundUrl && (

View File

@@ -7,6 +7,7 @@ interface OSConfig {
name: string; name: string;
image: string; image: string;
keywords: string[]; keywords: string[];
isMonochrome: boolean; // 是否为单色图标,深色模式下需要颜色反转
} }
// 操作系统匹配组 // 操作系统匹配组
@@ -15,136 +16,163 @@ const osConfigs: OSConfig[] = [
name: "Android", name: "Android",
image: "/assets/os-android.svg", image: "/assets/os-android.svg",
keywords: ["android", "lineage", "lineageos", "aosp", "android os"], keywords: ["android", "lineage", "lineageos", "aosp", "android os"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Alibaba", name: "Alibaba",
image: "/assets/os-alibaba.svg", image: "/assets/os-alibaba.svg",
keywords: ["alibaba"], keywords: ["alibaba"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "AlmaLinux", name: "AlmaLinux",
image: "/assets/os-alma.svg", image: "/assets/os-alma.svg",
keywords: ["alma", "almalinux"], keywords: ["alma", "almalinux"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Alpine Linux", name: "Alpine Linux",
image: "/assets/os-alpine.webp", image: "/assets/os-alpine.webp",
keywords: ["alpine", "alpine linux"], keywords: ["alpine", "alpine linux"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Arch Linux", name: "Arch Linux",
image: "/assets/os-arch.svg", image: "/assets/os-arch.svg",
keywords: ["arch", "archlinux", "arch linux"], keywords: ["arch", "archlinux", "arch linux"],
isMonochrome: false, // 蓝色图标
}, },
{ {
name: "Armbian", name: "Armbian",
image: "/assets/os-armbian.svg", image: "/assets/os-armbian.svg",
keywords: ["armbian"], keywords: ["armbian"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "CentOS", name: "CentOS",
image: "/assets/os-centos.svg", image: "/assets/os-centos.svg",
keywords: ["centos", "cent os"], keywords: ["centos", "cent os"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Debian", name: "Debian",
image: "/assets/os-debian.svg", image: "/assets/os-debian.svg",
keywords: ["debian", "deb"], keywords: ["debian", "deb"],
isMonochrome: false, // 红色图标
}, },
{ {
name: "Fedora", name: "Fedora",
image: "/assets/os-fedora.svg", image: "/assets/os-fedora.svg",
keywords: ["fedora"], keywords: ["fedora"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "FreeBSD", name: "FreeBSD",
image: "/assets/os-freebsd.svg", image: "/assets/os-freebsd.svg",
keywords: ["freebsd", "bsd"], keywords: ["freebsd", "bsd"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Gentoo", name: "Gentoo",
image: "/assets/os-gentoo.svg", image: "/assets/os-gentoo.svg",
keywords: ["gentoo"], keywords: ["gentoo"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "ImmortalWrt", name: "ImmortalWrt",
image: "/assets/os-openwrt.svg", image: "/assets/os-openwrt.svg",
keywords: ["immortalwrt", "immortal", "emmortal"], keywords: ["immortalwrt", "immortal", "emmortal"],
isMonochrome: true, // 单色黑色图标
}, },
{ {
name: "iStoreOS", name: "iStoreOS",
image: "/assets/os-istore.png", image: "/assets/os-istore.png",
keywords: ["istore", "istoreos", "istore os"], keywords: ["istore", "istoreos", "istore os"],
isMonochrome: false, // PNG 彩色图标
}, },
{ {
name: "Kali Linux", name: "Kali Linux",
image: "/assets/os-kail.svg", image: "/assets/os-kail.svg",
keywords: ["kail", "kali", "kali linux"], keywords: ["kail", "kali", "kali linux"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Linux Mint", name: "Linux Mint",
image: "/assets/os-mint.svg", image: "/assets/os-mint.svg",
keywords: ["mint", "linux mint"], keywords: ["mint", "linux mint"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "macOS", name: "macOS",
image: "/assets/os-macos.svg", image: "/assets/os-macos.svg",
keywords: ["macos"], keywords: ["macos"],
isMonochrome: true, // 纯黑色图标
}, },
{ {
name: "Manjaro", name: "Manjaro",
image: "/assets/os-manjaro-.svg", image: "/assets/os-manjaro-.svg",
keywords: ["manjaro"], keywords: ["manjaro"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "NixOS", name: "NixOS",
image: "/assets/os-nix.svg", image: "/assets/os-nix.svg",
keywords: ["nixos", "nix os", "nix"], keywords: ["nixos", "nix os", "nix"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "OpenCloudOS", name: "OpenCloudOS",
image: "/assets/os-opencloud.svg", image: "/assets/os-opencloud.svg",
keywords: ["opencloud"], keywords: ["opencloud"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "openSUSE", name: "openSUSE",
image: "/assets/os-openSUSE.svg", image: "/assets/os-openSUSE.svg",
keywords: ["opensuse", "suse"], keywords: ["opensuse", "suse"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "OpenWrt", name: "OpenWrt",
image: "/assets/os-openwrt.svg", image: "/assets/os-openwrt.svg",
keywords: ["openwrt", "open wrt", "open-wrt", "qwrt"], keywords: ["openwrt", "open wrt", "open-wrt", "qwrt"],
isMonochrome: true, // 单色黑色图标
}, },
{ {
name: "Proxmox VE", name: "Proxmox VE",
image: "/assets/os-proxmox.ico", image: "/assets/os-proxmox.ico",
keywords: ["proxmox", "proxmox ve"], keywords: ["proxmox", "proxmox ve"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Red Hat", name: "Red Hat",
image: "/assets/os-redhat.svg", image: "/assets/os-redhat.svg",
keywords: ["redhat", "rhel", "red hat"], keywords: ["redhat", "rhel", "red hat"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Rocky Linux", name: "Rocky Linux",
image: "/assets/os-rocky.svg", image: "/assets/os-rocky.svg",
keywords: ["rocky", "rocky linux"], keywords: ["rocky", "rocky linux"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Synology DSM", name: "Synology DSM",
image: "/assets/os-synology.ico", image: "/assets/os-synology.ico",
keywords: ["synology", "dsm", "synology dsm"], keywords: ["synology", "dsm", "synology dsm"],
isMonochrome: false, // 彩色图标
}, },
{ {
name: "Ubuntu", name: "Ubuntu",
image: "/assets/os-ubuntu.svg", image: "/assets/os-ubuntu.svg",
keywords: ["ubuntu", "elementary"], keywords: ["ubuntu", "elementary"],
isMonochrome: false, // 橙色图标
}, },
{ {
name: "Windows", name: "Windows",
image: "/assets/os-windows.svg", image: "/assets/os-windows.svg",
keywords: ["windows", "win", "microsoft", "ms"], keywords: ["windows", "win", "microsoft", "ms"],
isMonochrome: false, // 蓝色图标
}, },
]; ];
@@ -153,6 +181,7 @@ const defaultOSConfig: OSConfig = {
name: "Unknown", name: "Unknown",
image: "/assets/TablerHelp.svg", image: "/assets/TablerHelp.svg",
keywords: ["unknown"], keywords: ["unknown"],
isMonochrome: true, // 默认图标是单色的
}; };
/** /**
@@ -189,6 +218,15 @@ export function getOSImage(osString: string): string {
return findOSConfig(osString).image; return findOSConfig(osString).image;
} }
/**
* 根据输入字符串匹配返回操作系统图标是否为单色
* @param osString - 操作系统相关的字符串
* @returns 是否为单色图标,单色图标在深色模式下需要颜色反转
*/
export function isOSIconMonochrome(osString: string): boolean {
return findOSConfig(osString).isMonochrome;
}
/** /**
* 获取所有可用的操作系统图像 * 获取所有可用的操作系统图像
* @returns 所有操作系统图像的映射表 * @returns 所有操作系统图像的映射表