"use client" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" import { BASE_URL, REPO_PATH } from "@/constants" import type { AuthorData, Icon } from "@/types/icons" import { motion } from "framer-motion" import { Check, Copy, Download, FileType, Github, Moon, PaletteIcon, Sun } from "lucide-react" import Image from "next/image" import Link from "next/link" import { useState } from "react" import { toast } from "sonner" import { Carbon } from "./carbon" export type IconDetailsProps = { icon: string iconData: Icon authorData: AuthorData } export function IconDetails({ icon, iconData, authorData }: IconDetailsProps) { const authorName = authorData.name || authorData.login || "" const iconColorVariants = iconData.colors const formattedDate = new Date(iconData.update.timestamp).toLocaleDateString("en-GB", { day: "numeric", month: "long", year: "numeric", }) const getAvailableFormats = () => { switch (iconData.base) { case "svg": return ["svg", "png", "webp"] case "png": return ["png", "webp"] default: return [iconData.base] } } const availableFormats = getAvailableFormats() const [copiedVariants, setCopiedVariants] = useState>({}) const handleCopy = (url: string, variantKey: string) => { navigator.clipboard.writeText(url) setCopiedVariants((prev) => ({ ...prev, [variantKey]: true, })) setTimeout(() => { setCopiedVariants((prev) => ({ ...prev, [variantKey]: false, })) }, 2000) toast.success("URL copied", { description: "The icon URL has been copied to your clipboard", }) } const renderVariant = (format: string, iconName: string, theme?: "light" | "dark") => { const variantName = theme && iconColorVariants?.[theme] ? iconColorVariants[theme] : iconName const url = `${BASE_URL}/${format}/${variantName}.${format}` const githubUrl = `${REPO_PATH}/tree/main/${format}/${iconName}.${format}` const variantKey = `${format}-${theme || "default"}` const isCopied = copiedVariants[variantKey] || false return (
handleCopy(url, variantKey)} >
{`${iconName}

Click to copy URL to clipboard

{format.toUpperCase()}

Download icon

Copy URL to clipboard

View on GitHub

) } return (
{/* Left Column: Icon Info and Author */}
{icon}
{icon}

Updated on: {formattedDate}

By:

{authorName ? authorName.slice(0, 2).toUpperCase() : "??"} {authorData.html_url ? ( {authorName} ) : ( {authorName} )}
{iconData.categories && iconData.categories.length > 0 && (

Categories

{iconData.categories.map((category) => ( {category} ))}
)} {iconData.aliases && iconData.aliases.length > 0 && (

Aliases

{iconData.aliases.map((alias) => ( {alias} ))}
)}
{/* Middle Column: Icon variants */}
Icon variants Click on any icon to copy its URL to your clipboard {!iconData.colors ? (
{availableFormats.map((format) => renderVariant(format, icon))}
) : (

Light theme

{availableFormats.map((format) => renderVariant(format, icon, "light"))}

Dark theme

{availableFormats.map((format) => renderVariant(format, icon, "dark"))}
)}
{/* Right Column: Technical details */}
Technical details

Base format

{iconData.base.toUpperCase()}

Available formats

{availableFormats.map((format) => (
{format.toUpperCase()}
))}
{iconData.colors && (

Color variants

{Object.entries(iconData.colors).map(([theme, variant]) => (
{theme}: {variant}
))}
)}

Source

) }