import React, {useState} from 'react'; import Link from '@docusaurus/Link'; import useBaseUrl from '@docusaurus/useBaseUrl'; import styles from './CookbookGrid.module.css'; export interface CookbookCard { title: string; href: string; description?: string; tags?: { sdk?: string; topic?: string; }; } interface CookbookGridProps { items: CookbookCard[]; } function sdkIcon(sdk: string): string | null { if (sdk.startsWith('@') || sdk.includes('node') || sdk.includes('chat') || sdk.includes('ai-sdk')) { return '/img/icons/nodejs.png'; } if (sdk.includes('-go') || sdk === 'go') { return '/img/icons/golang.png'; } if (sdk.includes('hermes')) { return '/img/icons/hermes.png'; } if (sdk.includes('hindsight-client') || sdk.includes('hindsight-api') || sdk.includes('litellm') || sdk.includes('pydantic') || sdk.includes('crewai')) { return '/img/icons/python.svg'; } return null; } function SdkIcon({sdk, className}: {sdk: string; className?: string}) { const icon = sdkIcon(sdk); const src = useBaseUrl(icon ?? ''); if (!icon) return null; return ; } function Card({title, href, description, tags}: CookbookCard) { return (

{title}

{description &&

{description}

} {(tags?.topic || tags?.sdk) && (
{tags.topic && {tags.topic}} {tags.sdk && ( {tags.sdk} )}
)}
); } export default function CookbookGrid({items}: CookbookGridProps) { const [selectedTopic, setSelectedTopic] = useState(null); const [selectedSdk, setSelectedSdk] = useState(null); const topics = [...new Set(items.map((i) => i.tags?.topic).filter(Boolean))] as string[]; const sdks = [...new Set(items.map((i) => i.tags?.sdk).filter(Boolean))] as string[]; const filtered = items.filter((item) => { if (selectedTopic && item.tags?.topic !== selectedTopic) return false; if (selectedSdk && item.tags?.sdk !== selectedSdk) return false; return true; }); const hasFilters = topics.length > 1 || sdks.length > 1; return (
{hasFilters && (
{topics.length > 1 && (
Topic {topics.map((topic) => ( ))}
)} {sdks.length > 1 && (
SDK {sdks.map((sdk) => ( ))}
)}
)}
{filtered.map((item) => ( ))}
); }