import { IntegrationsSelectorLightDesktop } from "./integrations-index-selector/integrations-selector-light-desktop"; import { IntegrationsSelectorDarkDesktop } from "./integrations-index-selector/integrations-selector-dark-desktop"; import { KiteIconLight, KiteIconDark, } from "./integrations-index-selector/kite-icon"; import { IntegrationsSelectorLightMobile } from "./integrations-index-selector/integrations-selector-light-mobile"; import { IntegrationsSelectorDarkMobile } from "./integrations-index-selector/integrations-selector-dark-mobile"; import { IntegrationLinkRoundedButton } from "./integration-link-button/integration-link-rounded-button"; import { ComponentType } from "react"; import { INTEGRATION_ORDER, IntegrationId, getIntegration, } from "@/lib/integrations"; import { hasIntegrationFeature } from "@/lib/integration-features"; import { AgentSpecMarkIcon, A2AIcon } from "@/lib/icons/custom-icons"; import AdkIcon from "../ui/icons/adk"; import Ag2Icon from "../ui/icons/ag2"; import CrewaiIcon from "../ui/icons/crewai"; import LanggraphIcon from "../ui/icons/langgraph"; import DeepAgentsIcon from "../ui/icons/deepagents"; import LlamaIndexIcon from "../ui/icons/llama-index"; import MastraIcon from "../ui/icons/mastra"; import AgnoIcon from "../ui/icons/agno"; import PydanticAiIcon from "../ui/icons/pydantic-ai"; import { MicrosoftIcon } from "../ui/icons/microsoft"; import { AwsStrandsIcon } from "../ui/icons/aws-strands"; // Icon mapping - component-specific const INTEGRATION_ICONS: Record< IntegrationId, ComponentType<{ className?: string }> > = { "built-in-agent": () =>

🪁

, langgraph: LanggraphIcon, deepagents: DeepAgentsIcon, adk: AdkIcon, "microsoft-agent-framework": MicrosoftIcon, "aws-strands": AwsStrandsIcon, mastra: MastraIcon, "pydantic-ai": PydanticAiIcon, "crewai-flows": CrewaiIcon, agno: AgnoIcon, ag2: Ag2Icon, "agent-spec": AgentSpecMarkIcon, llamaindex: LlamaIndexIcon, a2a: A2AIcon, }; interface Integration { id: IntegrationId; label: string; description: string; Icon: ComponentType<{ className?: string }>; href: string; } // Build integrations list from canonical order const INTEGRATIONS: Integration[] = INTEGRATION_ORDER.map((id) => { const meta = getIntegration(id); return { id, label: meta.label, description: meta.description, Icon: INTEGRATION_ICONS[id], href: meta.href, }; }); interface IntegrationsGridProps { targetPage?: string; route?: string; suppressDirectToLLM?: boolean; variant?: "default" | "simple"; } const IntegrationsGrid: React.FC = ({ targetPage, route, suppressDirectToLLM = false, variant = "default", }) => { const hasTargetPage = ( integration: Integration, targetPage: string, ): boolean => { if (!targetPage) { return true; } // Use auto-generated feature mapping return hasIntegrationFeature(integration.id, targetPage); }; const getHref = (integration: Integration) => { if (targetPage) { // Special case: direct-to-llm has pages in /guides/ subdirectory if (integration.id === "built-in-agent") { return `${integration.href}/guides/${targetPage}`; } return `${integration.href}/${targetPage}`; } if (route) { return `${integration.href}/${route}`; } return integration.href; }; let filteredIntegrations = INTEGRATIONS; // Filter out Direct to LLM if suppressed if (suppressDirectToLLM) { filteredIntegrations = filteredIntegrations.filter( (integration) => integration.id !== "built-in-agent", ); } // Filter out integrations that don't have the target page if (targetPage) { filteredIntegrations = filteredIntegrations.filter((integration) => hasTargetPage(integration, targetPage), ); } if (variant === "simple") { return (
{filteredIntegrations.map((integration) => (
{integration.label}{" "}
{integration.description}
))}
); } return (
{/* Large desktop: 4 columns (2xl+) */}
{/* Kite icon - positioned separately to avoid SVG distortion */}
{/* Connectors SVG - overlaps with kite to attach to circle edge */}
{filteredIntegrations.map((integration) => ( ))}
{/* Small screens (below lg): 2 columns with 36px row height */}
{filteredIntegrations.map((integration) => ( ))}
{/* Medium screens (lg to 2xl): 2 columns with 60px row height */}
{filteredIntegrations.map((integration) => ( ))}
); }; export { IntegrationsGrid }; export type { IntegrationsGridProps };