import { Icon } from "astro-icon/components";
import type {
IconType,
LucideIcon,
AstroIconName,
CustomIconComponent,
} from "../types";
interface IconRendererProps {
icon: IconType;
size?: number;
class?: string;
[key: string]: any; // For additional props like client:load for custom components
}
// Type guard functions
function isLucideIcon(icon: IconType): icon is LucideIcon {
return typeof icon === "function" && icon.length <= 1; // Lucide icons are function components
}
function isAstroIconName(icon: IconType): icon is AstroIconName {
return typeof icon === "string";
}
function isCustomComponent(icon: IconType): icon is CustomIconComponent {
return typeof icon === "function" && !isLucideIcon(icon);
}
export default function IconRenderer({
icon,
size,
class: className,
...props
}: IconRendererProps) {
if (isLucideIcon(icon)) {
const LucideComponent = icon;
return ;
}
if (isAstroIconName(icon)) {
return ;
}
if (isCustomComponent(icon)) {
const CustomComponent = icon;
return ;
}
// Fallback
return null;
}