fix(platform): 工作台界面 - 统一卡片、控件与弹窗视觉并清理重复样式

This commit is contained in:
ddCat
2026-08-14 20:20:37 +08:00
parent 5cedb9c640
commit b4c357a876
14 changed files with 408 additions and 490 deletions

View File

@@ -1,11 +1,25 @@
import type { ThemeConfig } from "antd";
import { theme as antdTheme } from "antd";
const neutral = {
// 主操作、普通选择和开关是不同交互语义,必须各自维护成对的背景/前景色。
const controlTheme = {
light: {
primary: "#171717",
primaryHover: "#000000",
primaryText: "#ffffff",
solidBg: "#171717",
solidHoverBg: "#303030",
solidActiveBg: "#404040",
solidFg: "#ffffff",
selectedBg: "rgba(17, 17, 17, 0.09)",
selectedHoverBg: "rgba(17, 17, 17, 0.13)",
selectedActiveBg: "rgba(17, 17, 17, 0.16)",
selectedFg: "#171717",
controlSurface: "#ffffff",
controlBorder: "rgba(17, 17, 17, 0.18)",
controlDisabledBg: "rgba(17, 17, 17, 0.05)",
controlDisabledFg: "rgba(17, 17, 17, 0.36)",
controlFocus: "rgba(17, 17, 17, 0.24)",
switchOffBg: "rgba(17, 17, 17, 0.22)",
switchOffHoverBg: "rgba(17, 17, 17, 0.3)",
switchOffHandle: "#ffffff",
menuBg: "#f5f5f5",
menuText: "#171717",
selectActiveBg: "rgba(17, 17, 17, 0.035)",
@@ -15,9 +29,22 @@ const neutral = {
tableSelectedHoverBg: "rgba(17, 17, 17, 0.08)",
},
dark: {
primary: "#fafafa",
primaryHover: "#ffffff",
primaryText: "#171717",
solidBg: "#f5f5f5",
solidHoverBg: "#ffffff",
solidActiveBg: "#e5e5e5",
solidFg: "#171717",
selectedBg: "rgba(255, 255, 255, 0.12)",
selectedHoverBg: "rgba(255, 255, 255, 0.16)",
selectedActiveBg: "rgba(255, 255, 255, 0.2)",
selectedFg: "#f5f5f5",
controlSurface: "rgba(255, 255, 255, 0.035)",
controlBorder: "rgba(255, 255, 255, 0.24)",
controlDisabledBg: "rgba(255, 255, 255, 0.06)",
controlDisabledFg: "rgba(255, 255, 255, 0.38)",
controlFocus: "rgba(255, 255, 255, 0.24)",
switchOffBg: "rgba(255, 255, 255, 0.22)",
switchOffHoverBg: "rgba(255, 255, 255, 0.3)",
switchOffHandle: "#f5f5f5",
menuBg: "#262626",
menuText: "#fafafa",
selectActiveBg: "rgba(255, 255, 255, 0.055)",
@@ -29,35 +56,27 @@ const neutral = {
};
export function getAntThemeConfig(dark: boolean): ThemeConfig {
const color = dark ? neutral.dark : neutral.light;
const color = dark ? controlTheme.dark : controlTheme.light;
const elevatedBackground = dark ? "rgba(31, 31, 32, 0.96)" : "rgba(255, 255, 255, 0.96)";
const subtleBackground = dark ? "rgba(255, 255, 255, 0.055)" : "rgba(17, 17, 17, 0.035)";
const interactiveBorder = dark ? "rgba(255, 255, 255, 0.18)" : "rgba(17, 17, 17, 0.18)";
// 黑白主题使用边框表达焦点,避免输入控件周围出现蓝紫色光圈。
const focusShadow = "none";
// 暗色界面的黑白主按钮与选择控件分色,避免开关轨道、勾选符号和滑块融成一片。
const selectionControl = dark
? {
active: "#ffffff",
border: "rgba(255, 255, 255, 0.3)",
disabledBackground: "rgba(255, 255, 255, 0.06)",
focus: "rgba(255, 255, 255, 0.22)",
hover: "#e5e5e5",
primary: "#f5f5f5",
surface: "rgba(255, 255, 255, 0.035)",
}
: null;
return {
algorithm: dark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,
cssVar: { key: dark ? "infinite-canvas-dark" : "infinite-canvas-light" },
token: {
colorPrimary: color.primary,
colorInfo: color.primary,
colorLink: color.primary,
colorLinkHover: color.primaryHover,
colorLinkActive: color.primary,
colorTextLightSolid: color.primaryText,
colorPrimary: color.solidBg,
colorPrimaryHover: color.solidHoverBg,
colorPrimaryActive: color.solidActiveBg,
colorPrimaryBg: color.selectedBg,
colorPrimaryBgHover: color.selectedHoverBg,
colorInfo: color.solidBg,
colorLink: color.solidBg,
colorLinkHover: color.solidHoverBg,
colorLinkActive: color.solidActiveBg,
colorTextLightSolid: color.solidFg,
colorBgElevated: elevatedBackground,
colorBorderSecondary: dark ? "rgba(255, 255, 255, 0.1)" : "rgba(17, 17, 17, 0.09)",
boxShadowSecondary: dark ? "0 24px 72px rgba(0, 0, 0, 0.48)" : "0 22px 64px rgba(15, 23, 42, 0.14)",
@@ -80,28 +99,19 @@ export function getAntThemeConfig(dark: boolean): ThemeConfig {
paddingInline: 14,
paddingInlineLG: 16,
paddingInlineSM: 10,
...(dark
? {
colorPrimary: "#f5f5f4",
colorPrimaryHover: "#ffffff",
colorPrimaryActive: "#e7e5e4",
primaryColor: "#171717",
defaultBg: "#262626",
defaultColor: "#f5f5f4",
defaultBorderColor: "#404040",
defaultHoverBg: "#303030",
defaultHoverColor: "#ffffff",
defaultHoverBorderColor: "#525252",
defaultActiveBg: "#1f1f1f",
defaultActiveColor: "#ffffff",
defaultActiveBorderColor: "#525252",
}
: {
/* 浅色模式:primary 近黑(#171717),antd 默认 hover 加暗到 #000000 几乎不可见。
改为提亮 hover/active,让交互反馈可感知(审计 #121)*/
colorPrimaryHover: "#404040",
colorPrimaryActive: "#525252",
}),
colorPrimary: color.solidBg,
colorPrimaryHover: color.solidHoverBg,
colorPrimaryActive: color.solidActiveBg,
primaryColor: color.solidFg,
defaultBg: color.controlSurface,
defaultColor: color.selectedFg,
defaultBorderColor: color.controlBorder,
defaultHoverBg: color.selectedBg,
defaultHoverColor: color.selectedFg,
defaultHoverBorderColor: color.controlBorder,
defaultActiveBg: color.selectedHoverBg,
defaultActiveColor: color.selectedFg,
defaultActiveBorderColor: color.controlBorder,
},
Input: {
paddingInline: 11,
@@ -119,60 +129,51 @@ export function getAntThemeConfig(dark: boolean): ThemeConfig {
activeShadow: focusShadow,
},
Switch: {
handleBg: dark ? "#fafafa" : "#ffffff",
handleBg: color.switchOffHandle,
handleShadow: dark ? "0 1px 4px rgba(0, 0, 0, 0.42)" : "0 1px 2px rgba(0, 0, 0, 0.2)",
...(selectionControl
? {
colorPrimary: selectionControl.primary,
colorPrimaryActive: selectionControl.active,
colorPrimaryHover: selectionControl.hover,
colorTextQuaternary: "rgba(255, 255, 255, 0.16)",
colorTextTertiary: "rgba(255, 255, 255, 0.24)",
controlOutline: selectionControl.focus,
}
: {}),
colorPrimary: color.solidBg,
colorPrimaryActive: color.solidActiveBg,
colorPrimaryHover: color.solidHoverBg,
colorTextQuaternary: color.switchOffBg,
colorTextTertiary: color.switchOffHoverBg,
controlOutline: color.controlFocus,
},
Checkbox: {
...(selectionControl
? {
colorBgContainer: selectionControl.surface,
colorBgContainerDisabled: selectionControl.disabledBackground,
colorBorder: selectionControl.border,
colorPrimary: selectionControl.primary,
colorPrimaryActive: selectionControl.active,
colorPrimaryHover: selectionControl.hover,
controlOutline: selectionControl.focus,
}
: {}),
colorBgContainer: color.controlSurface,
colorBgContainerDisabled: color.controlDisabledBg,
colorBorder: color.controlBorder,
colorPrimary: color.solidBg,
colorPrimaryActive: color.solidActiveBg,
colorPrimaryHover: color.solidHoverBg,
controlOutline: color.controlFocus,
},
Radio: {
radioSize: 16,
dotSize: 6,
...(selectionControl
? {
buttonBg: selectionControl.surface,
buttonCheckedBg: color.selectSelectedBg,
buttonSolidCheckedActiveBg: selectionControl.active,
buttonSolidCheckedBg: selectionControl.primary,
buttonSolidCheckedHoverBg: selectionControl.hover,
colorBgContainer: selectionControl.surface,
colorBgContainerDisabled: selectionControl.disabledBackground,
colorBorder: selectionControl.border,
colorPrimary: selectionControl.primary,
colorPrimaryActive: selectionControl.active,
colorPrimaryHover: selectionControl.hover,
controlOutline: selectionControl.focus,
}
: {}),
buttonBg: color.controlSurface,
buttonCheckedBg: color.selectedBg,
buttonCheckedBgDisabled: color.controlDisabledBg,
buttonCheckedColorDisabled: color.controlDisabledFg,
buttonSolidCheckedColor: color.solidFg,
buttonSolidCheckedActiveBg: color.solidActiveBg,
buttonSolidCheckedBg: color.solidBg,
buttonSolidCheckedHoverBg: color.solidHoverBg,
colorBgContainer: color.controlSurface,
colorBgContainerDisabled: color.controlDisabledBg,
colorBorder: color.controlBorder,
colorPrimary: color.solidBg,
colorPrimaryActive: color.solidActiveBg,
colorPrimaryHover: color.solidHoverBg,
controlOutline: color.controlFocus,
},
Menu: {
itemActiveBg: color.menuBg,
itemHoverBg: color.menuBg,
itemSelectedBg: color.menuBg,
itemSelectedColor: color.menuText,
darkItemHoverBg: neutral.dark.menuBg,
darkItemSelectedBg: neutral.dark.menuBg,
darkItemSelectedColor: neutral.dark.menuText,
darkItemHoverBg: controlTheme.dark.menuBg,
darkItemSelectedBg: controlTheme.dark.menuBg,
darkItemSelectedColor: controlTheme.dark.menuText,
},
Select: {
selectorBg: elevatedBackground,
@@ -200,16 +201,19 @@ export function getAntThemeConfig(dark: boolean): ThemeConfig {
Pagination: {
itemBg: "transparent",
itemLinkBg: "transparent",
itemActiveBg: dark ? "#fafafa" : "#171717",
itemActiveColor: dark ? "#171717" : "#ffffff",
itemActiveColorHover: dark ? "#171717" : "#ffffff",
itemActiveBg: color.solidBg,
itemActiveColor: color.solidFg,
itemActiveColorHover: color.solidFg,
},
Segmented: {
trackBg: subtleBackground,
trackPadding: 3,
itemSelectedBg: elevatedBackground,
itemSelectedColor: dark ? "#fafafa" : "#171717",
itemHoverBg: dark ? "rgba(255, 255, 255, 0.07)" : "rgba(17, 17, 17, 0.055)",
itemColor: color.controlDisabledFg,
itemHoverColor: color.selectedFg,
itemHoverBg: color.selectedBg,
itemActiveBg: color.selectedActiveBg,
itemSelectedBg: color.selectedBg,
itemSelectedColor: color.selectedFg,
},
Modal: {
headerBg: "transparent",