import { Users } from 'lucide-react'; import { motion } from 'framer-motion'; import { GlassCard } from '../shared/GlassCard'; import { AnalyticsIconInfo } from '../shared/AnalyticsIconInfo'; import { CardIcon } from '../shared/CardIcon'; import { CardEmptyState } from '../shared/CardEmptyState'; import { StatusPill } from '../shared/StatusPill'; import { AI_BRAND_MAP } from '@/lib/brands'; interface AIReferredGroup { source: string; count: number; } interface AIReferredVisitsCardProps { groups: AIReferredGroup[]; statusText?: string; className?: string; delay?: number; } function getBrandKeyFromSource(source: string) { const s = source.toLowerCase(); if (s.includes('chatgpt') || s.includes('openai')) return 'gpt'; if (s.includes('claude')) return 'claude'; if (s.includes('perplexity')) return 'perplexity'; if (s.includes('google')) return 'google'; if (s.includes('gemini')) return 'gemini'; if (s.includes('copilot')) return 'gpt'; if (s.includes('grok') || s.includes('xai')) return 'xai'; return null; } function getIcon(source: string) { const brandKey = getBrandKeyFromSource(source); return brandKey ? AI_BRAND_MAP[brandKey]?.icon : null; } function getDisplayCount(_source: string, count: number) { const safeCount = Number.isFinite(count) ? count : 0; return Math.round(safeCount); } export function AIReferredVisitsCard({ groups, statusText, className = '', delay = 0 }: AIReferredVisitsCardProps) { const hasAiVisits = groups.some((g) => getBrandKeyFromSource(g.source)); return (
Human visitors that arrived from AI assistants, grouped by the source that referred them.

} >

AI Referred Human Visits

Referred By Visits
{groups.length > 0 ? ( groups.map((group, i) => { const iconSrc = getIcon(group.source); const isAiReferred = Boolean(getBrandKeyFromSource(group.source)); const displayCount = getDisplayCount(group.source, group.count); return (
{iconSrc ? ( ) : (
?
)} {group.source}
{displayCount}
); }) ) : ( )}
{statusText || hasAiVisits ? (
) : null}
); }