From dc865fbbbf903a339d540d259d88618944c60467 Mon Sep 17 00:00:00 2001 From: Jason Date: Wed, 21 Jan 2026 15:46:54 +0800 Subject: [PATCH] fix(icon): auto-apply default color from metadata when color prop is not provided When ProviderIcon is used without a color prop, it now automatically fetches the defaultColor from icon metadata. This fixes the issue where Gemini app icon turns black when selected in AppSwitcher, because the component was inheriting the parent's text-foreground color. --- src/components/ProviderIcon.tsx | 17 +++++++++++++++-- src/icons/extracted/index.ts | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/components/ProviderIcon.tsx b/src/components/ProviderIcon.tsx index f76f13ff2..0348d7f94 100644 --- a/src/components/ProviderIcon.tsx +++ b/src/components/ProviderIcon.tsx @@ -1,5 +1,5 @@ import React, { useMemo } from "react"; -import { getIcon, hasIcon } from "@/icons/extracted"; +import { getIcon, hasIcon, getIconMetadata } from "@/icons/extracted"; import { cn } from "@/lib/utils"; interface ProviderIconProps { @@ -39,6 +39,19 @@ export const ProviderIcon: React.FC = ({ }; }, [size]); + // 获取有效颜色:优先使用传入的 color,否则从元数据获取 defaultColor + const effectiveColor = useMemo(() => { + if (color) return color; + if (icon) { + const metadata = getIconMetadata(icon); + // 只有当 defaultColor 不是 currentColor 时才使用 + if (metadata?.defaultColor && metadata.defaultColor !== "currentColor") { + return metadata.defaultColor; + } + } + return undefined; + }, [color, icon]); + // 如果有图标,显示图标 if (iconSvg) { return ( @@ -47,7 +60,7 @@ export const ProviderIcon: React.FC = ({ "inline-flex items-center justify-center flex-shrink-0", className, )} - style={{ ...sizeStyle, color }} + style={{ ...sizeStyle, color: effectiveColor }} dangerouslySetInnerHTML={{ __html: iconSvg }} /> ); diff --git a/src/icons/extracted/index.ts b/src/icons/extracted/index.ts index 1545b6e1b..405f3aca2 100644 --- a/src/icons/extracted/index.ts +++ b/src/icons/extracted/index.ts @@ -65,3 +65,5 @@ export function getIcon(name: string): string { export function hasIcon(name: string): boolean { return name.toLowerCase() in icons; } + +export { getIconMetadata } from "./metadata";