From 8f668da7f837475fbc155c0984e079384b7635de Mon Sep 17 00:00:00 2001 From: David Kaya Date: Sat, 21 Mar 2026 20:58:38 +0100 Subject: [PATCH] feat: use official SVG brand icons for model providers Replace colored letter badges with official SVG icons sourced from Simple Icons (Anthropic, Google Gemini) and Wikimedia Commons (OpenAI). - Create shared ProviderIcons.tsx with OpenAI, Anthropic, and Gemini SVG icon components using the official brand marks - Update PatternEditor ModelSelect dropdown to use real provider icons - Update ActivityPanel model badges to use real provider icons - Remove duplicated providerStyles objects from both files Icons are inline SVG using currentColor for theme-aware coloring. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/renderer/components/ActivityPanel.tsx | 16 ++---- src/renderer/components/PatternEditor.tsx | 18 +------ src/renderer/components/ProviderIcons.tsx | 63 +++++++++++++++++++++++ 3 files changed, 67 insertions(+), 30 deletions(-) create mode 100644 src/renderer/components/ProviderIcons.tsx diff --git a/src/renderer/components/ActivityPanel.tsx b/src/renderer/components/ActivityPanel.tsx index 9f4195a..06edbe5 100644 --- a/src/renderer/components/ActivityPanel.tsx +++ b/src/renderer/components/ActivityPanel.tsx @@ -8,15 +8,10 @@ import { isAgentActivityCompleted, type SessionActivityState, } from '@renderer/lib/sessionActivity'; -import { inferProvider, type ModelProvider } from '@shared/domain/models'; +import { inferProvider } from '@shared/domain/models'; import type { PatternDefinition } from '@shared/domain/pattern'; import type { SessionRecord } from '@shared/domain/session'; - -const providerStyles: Record = { - openai: { bg: 'bg-emerald-500/15', text: 'text-emerald-400', label: 'AI' }, - anthropic: { bg: 'bg-orange-500/15', text: 'text-orange-400', label: 'A' }, - google: { bg: 'bg-blue-500/15', text: 'text-blue-400', label: 'G' }, -}; +import { ProviderIcon } from './ProviderIcons'; function formatModel(model: string): string { return model.replace(/-/g, '\u2011'); @@ -102,12 +97,7 @@ export function ActivityPanel({ activity, pattern, session }: ActivityPanelProps {(() => { const prov = inferProvider(agent.model); if (prov) { - const s = providerStyles[prov]; - return ( - - {s.label} - - ); + return ; } return null; })()} diff --git a/src/renderer/components/PatternEditor.tsx b/src/renderer/components/PatternEditor.tsx index 164931c..f5c19a9 100644 --- a/src/renderer/components/PatternEditor.tsx +++ b/src/renderer/components/PatternEditor.tsx @@ -27,7 +27,6 @@ import { providerMeta, findModel, inferProvider, - type ModelProvider, type ModelDefinition, } from '@shared/domain/models'; @@ -203,22 +202,7 @@ function InputField({ ); } -const providerStyles: Record = { - openai: { bg: 'bg-emerald-500/15', text: 'text-emerald-400', label: 'AI' }, - anthropic: { bg: 'bg-orange-500/15', text: 'text-orange-400', label: 'A' }, - google: { bg: 'bg-blue-500/15', text: 'text-blue-400', label: 'G' }, -}; - -function ProviderIcon({ provider }: { provider: ModelProvider }) { - const s = providerStyles[provider]; - return ( - - {s.label} - - ); -} +import { ProviderIcon } from './ProviderIcons'; function TierBadge({ tier }: { tier: ModelDefinition['tier'] }) { const styles = { diff --git a/src/renderer/components/ProviderIcons.tsx b/src/renderer/components/ProviderIcons.tsx new file mode 100644 index 0000000..c0907d0 --- /dev/null +++ b/src/renderer/components/ProviderIcons.tsx @@ -0,0 +1,63 @@ +import type { ModelProvider } from '@shared/domain/models'; + +interface ProviderIconProps { + provider: ModelProvider; + className?: string; +} + +function OpenAIIcon({ className }: { className?: string }) { + return ( + + + + ); +} + +function AnthropicIcon({ className }: { className?: string }) { + return ( + + + + ); +} + +function GeminiIcon({ className }: { className?: string }) { + return ( + + + + ); +} + +const iconComponents: Record> = { + openai: OpenAIIcon, + anthropic: AnthropicIcon, + google: GeminiIcon, +}; + +export const providerColors: Record = { + openai: 'text-emerald-400', + anthropic: 'text-orange-400', + google: 'text-blue-400', +}; + +export function ProviderIcon({ provider, className }: ProviderIconProps) { + const Icon = iconComponents[provider]; + const color = providerColors[provider]; + return ; +}