/** * PersonalitySelector - Personality style selection component for Agent onboarding * * Displays personality options as selectable cards with icons and descriptions. */ import { motion } from 'framer-motion'; import { Briefcase, Heart, Sparkles, Zap, Check } from 'lucide-react'; import { cn } from '../lib/utils'; import { PERSONALITY_OPTIONS } from '../lib/personality-presets'; export interface PersonalitySelectorProps { value?: string; onChange: (personalityId: string) => void; className?: string; } // Map icon names to components const iconMap: Record> = { Briefcase, Heart, Sparkles, Zap, }; export function PersonalitySelector({ value, onChange, className }: PersonalitySelectorProps) { return (
{PERSONALITY_OPTIONS.map((option) => { const IconComponent = iconMap[option.icon] || Briefcase; const isSelected = value === option.id; return ( onChange(option.id)} className={cn( 'relative p-4 rounded-xl border-2 text-left transition-all', 'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2', isSelected ? 'border-primary bg-primary/5 dark:bg-primary/10' : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600 bg-white dark:bg-gray-800' )} > {/* Selection indicator */} {isSelected && ( )} {/* Icon */}
{/* Label */}

{option.label}

{/* Description */}

{option.description}

{/* Traits preview */}
{option.traits.slice(0, 2).map((trait) => ( {trait} ))}
); })}
); } // Export a compact version for display purposes export interface PersonalityBadgeProps { personalityId?: string; size?: 'sm' | 'md'; className?: string; } export function PersonalityBadge({ personalityId, size = 'sm', className }: PersonalityBadgeProps) { if (!personalityId) return null; const option = PERSONALITY_OPTIONS.find((p) => p.id === personalityId); if (!option) return null; const IconComponent = iconMap[option.icon] || Briefcase; const sizeStyles = { sm: 'px-2 py-1 text-xs', md: 'px-3 py-1.5 text-sm', }; return ( {option.label} ); }