import { motion } from 'framer-motion'; import React from 'react'; type BadgeVariant = | 'default' | 'material' | 'outline' | 'secondary' | 'destructive' | 'success' | 'construction' | 'production' | 'recreation' | 'logistics' | 'protected' | 'cultural-heritage' | 'historical'; interface BadgeProps { children: React.ReactNode; variant?: BadgeVariant; showDot?: boolean; dotColor?: 'primary' | 'accent'; textColor?: 'primary' | 'accent' | 'foreground'; size?: 'sm' | 'md' | 'lg'; className?: string; animate?: boolean; } const Badge: React.FC = ({ children, variant = 'default', showDot = false, dotColor = 'primary', textColor, size = 'md', className = '', animate = false, }) => { const sizeClasses = { sm: 'px-3 py-1 text-xs', md: 'px-4 py-1.5 lg:px-6 lg:py-2.5 text-sm lg:text-base', lg: 'px-5 py-2 lg:px-7 lg:py-3 text-base lg:text-lg', }; const textColorClasses = { primary: 'text-primary', accent: 'text-accent', foreground: 'text-foreground', }; const dotColorClasses = { primary: 'bg-primary', accent: 'bg-accent', }; const isHeritageVariant = variant === 'protected' || variant === 'cultural-heritage' || variant === 'historical'; const baseClasses = variant === 'material' ? `relative inline-flex items-center gap-2.5 rounded-full font-medium overflow-hidden border-2 ${sizeClasses[size]} ${className}` : `relative inline-flex items-center gap-2 rounded-full font-medium ${isHeritageVariant ? '' : 'border'} ${sizeClasses[size]} ${className}`; if (variant === 'material') { const finalTextColor = textColor || 'accent'; const finalDotColor = dotColor; const BadgeContent = ( <> {/* Subtle texture overlay */}
{showDot && ( )} {children} ); if (animate) { return ( {BadgeContent} ); } return (
{BadgeContent}
); } // Variant classes for simple badges const variantClasses: Record = { default: 'bg-primary border-transparent text-primary-foreground', outline: 'bg-transparent border-border text-foreground', secondary: 'bg-secondary border-transparent text-secondary-foreground', destructive: 'bg-destructive border-transparent text-destructive-foreground', success: 'bg-success border-success/30 text-success-foreground', // Sector variants construction: 'bg-sector-construction/10 border-sector-construction/20 text-sector-construction', production: 'bg-sector-production/10 border-sector-production/20 text-sector-production', recreation: 'bg-sector-recreation/10 border-sector-recreation/20 text-sector-recreation', logistics: 'bg-sector-logistics/10 border-sector-logistics/20 text-sector-logistics', }; // Heritage status variants need inline styles for proper CSS variable usage // Using CSS color-mix for proper theme-aware colors with opacity const heritageStyles: Record = { protected: { backgroundColor: 'color-mix(in srgb, var(--primary) 10%, transparent)', borderColor: 'color-mix(in srgb, var(--primary) 40%, transparent)', color: 'var(--primary)', }, 'cultural-heritage': { backgroundColor: 'color-mix(in srgb, var(--accent) 10%, transparent)', borderColor: 'color-mix(in srgb, var(--accent) 40%, transparent)', color: 'var(--accent)', }, historical: { backgroundColor: 'color-mix(in srgb, var(--warning) 10%, transparent)', borderColor: 'color-mix(in srgb, var(--warning) 40%, transparent)', color: 'var(--warning)', }, }; // For heritage variants, apply inline styles directly const heritageStyle = isHeritageVariant ? heritageStyles[variant] : undefined; return ( {showDot && } {children} ); }; export default Badge;