"use client" import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "../../lib/utils"; /** * Premium Badge Component * * Durum, kategori ve etiketleme için yüksek kaliteli badge bileşeni. * Dark ve light modda uyumlu, erişilebilir ve çeşitli varyantlar sunar. */ const badgeVariants = cva( ["inline-flex items-center justify-center gap-1.5", "font-medium transition-colors duration-200", "border focus:outline-none", "focus-visible:ring-2 focus-visible:ring-offset-1", // Auto spacing between badges "mr-2 mb-2 last:mr-0"], { variants: { variant: { primary: [ "border-transparent bg-gray-900 text-white", "hover:bg-gray-800 dark:hover:bg-gray-700", "focus-visible:ring-gray-500/30 dark:focus-visible:ring-gray-400/40", "dark:bg-gray-700 dark:text-gray-50 dark:shadow-inner dark:shadow-gray-950/10", ], secondary: [ "border-transparent bg-secondary text-secondary-foreground", "hover:bg-gray-200 dark:hover:bg-gray-600", "focus-visible:ring-gray-400/30 dark:focus-visible:ring-gray-500/40", "dark:bg-gray-700/50 dark:text-gray-50 dark:shadow-inner dark:shadow-gray-950/10", ], outline: [ "border-gray-200 dark:border-gray-600", "bg-transparent text-foreground", "hover:border-gray-300 dark:hover:border-gray-500", "focus-visible:ring-gray-400/30 dark:focus-visible:ring-gray-500/40", "dark:text-gray-100 dark:bg-transparent dark:backdrop-blur-sm", ], destructive: [ "border-transparent bg-error text-white", "hover:bg-error/90 dark:hover:bg-error/80", "focus-visible:ring-error/30 dark:focus-visible:ring-error/25", "dark:bg-error/90 dark:text-white dark:shadow-inner dark:shadow-error/10", ], success: [ "border-transparent bg-success text-white", "hover:bg-success/90 dark:hover:bg-success/80", "focus-visible:ring-success/30 dark:focus-visible:ring-success/25", "dark:bg-success/90 dark:text-white dark:shadow-inner dark:shadow-success/10", ], warning: [ "border-transparent bg-warning text-white", "hover:bg-warning/90 dark:hover:bg-warning/80", "focus-visible:ring-warning/30 dark:focus-visible:ring-warning/25", "dark:bg-warning/90 dark:text-gray-900 dark:shadow-inner dark:shadow-warning/10", ], ghost: [ "border border-gray-200 bg-gray-50/50 text-gray-700", "hover:bg-gray-100 dark:hover:bg-gray-800/60", "focus-visible:ring-gray-400/30 dark:focus-visible:ring-gray-500/40", "dark:border-gray-700 dark:bg-gray-800/30 dark:text-gray-300", "transition-all duration-200", ], pro: [ "border-transparent bg-gradient-to-r from-purple-600 to-pink-600 text-white", "hover:from-purple-700 hover:to-pink-700", "focus-visible:ring-purple-400/30 dark:focus-visible:ring-purple-500/40", "shadow-md dark:shadow-lg dark:shadow-purple-500/10", ], admin: [ "border-transparent bg-gradient-to-r from-purple-600 to-pink-600 text-white", "hover:from-purple-700 hover:to-pink-700", "focus-visible:ring-purple-400/30 dark:focus-visible:ring-purple-500/40", "shadow-md dark:shadow-lg dark:shadow-purple-500/10", ], }, size: { sm: "h-5 px-2 text-xs", md: "h-6 px-3 text-sm", lg: "h-8 px-4 text-base", }, radius: { default: "rounded-full", sm: "rounded-md", lg: "rounded-xl", none: "rounded-none", } }, defaultVariants: { variant: "primary", size: "md", radius: "default", }, } ); export interface BadgeProps extends React.HTMLAttributes, Omit, 'variant'> { withDot?: boolean; dotColor?: string; removable?: boolean; onRemove?: () => void; leftIcon?: React.ReactNode; rightIcon?: React.ReactNode; variant?: 'primary' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'ghost' | 'pro' | 'admin'; /** Disable automatic spacing between badges */ noAutoSpacing?: boolean; } /** * Premium Badge Component * * @param props - Badge bileşeni özellikleri * @param props.variant - Badgenin görsel varyantı * @param props.size - Badge boyutu * @param props.radius - Köşe yuvarlama stili * @param props.withDot - Başında nokta gösterimi * @param props.dotColor - Noktanın rengi (özel) * @param props.removable - Kaldırılabilir badge (X simgesi ile) * @param props.onRemove - Kaldırma işlevi * @param props.leftIcon - Badge'in solunda görüntülenecek ikon * @param props.rightIcon - Badge'in sağında görüntülenecek ikon * @param props.noAutoSpacing - Otomatik spacing'i devre dışı bırak */ function Badge({ className, variant, size, radius, withDot, dotColor, removable, onRemove, leftIcon, rightIcon, noAutoSpacing, children, ...props }: BadgeProps) { // Auto-assign icons and content for special variants let autoLeftIcon = leftIcon; let autoChildren = children; if (variant === 'pro') { // Auto Sparkles icon for pro autoLeftIcon = leftIcon || ( ); autoChildren = children || 'Pro'; } if (variant === 'admin') { // Auto CheckCircle icon for admin autoLeftIcon = leftIcon || ( ); autoChildren = children || 'Admin Pro'; } return (
{withDot && (
); } export { Badge, badgeVariants };