'use client' import { Feedback } from '~/components/Feedback' import { useSendTelemetryEvent } from '~/lib/telemetry' import { isFeatureEnabled } from 'common' import { Chatgpt, Claude } from 'icons' import { Check, Copy, Sparkles } from 'lucide-react' import Link from 'next/link' import { usePathname } from 'next/navigation' import { useState } from 'react' import { cn } from 'ui' import { ExpandableVideo } from 'ui-patterns/ExpandableVideo' import { Toc, TOCItems, TOCScrollArea } from 'ui-patterns/Toc' import { useTocAnchors } from '../features/docs/GuidesMdx.state' interface TOCHeader { id?: string text: string link: string level: number } function AiTools({ className }: { className?: string }) { const [copied, setCopied] = useState(false) const path = usePathname() const sendTelemetryEvent = useSendTelemetryEvent() function handleAgentSetupClick() { sendTelemetryEvent({ action: 'agent_setup_clicked' }) } async function copyMarkdown() { const mdUrl = `/docs/${path}.md` try { const res = await fetch(mdUrl) let text: string if (res.ok) { text = await res.text() } else { // Default to HTML content within the article when no .md file is available. text = document.getElementById('sb-docs-guide-main-article')?.innerHTML ?? '' } await navigator.clipboard.writeText(text) setCopied(true) setTimeout(() => setCopied(false), 2000) } catch (error) { console.error('Failed to copy markdown', error) } sendTelemetryEvent({ action: 'copy_as_markdown_clicked', }) } return (

AI Tools

Connect your AI agent sendTelemetryEvent({ action: 'ask_ai_clicked', properties: { agent: 'chatgpt' } }) } rel="noreferrer noopener" className="flex items-center gap-1.5 text-xs text-foreground-lighter hover:text-foreground transition-colors" > Ask ChatGPT sendTelemetryEvent({ action: 'ask_ai_clicked', properties: { agent: 'claude' } }) } rel="noreferrer noopener" className="flex items-center gap-1.5 text-xs text-foreground-lighter hover:text-foreground transition-colors" > Ask Claude
) } const GuidesSidebar = ({ className, video, hideToc, }: { className?: string video?: string hideToc?: boolean }) => { const pathname = usePathname() const { toc } = useTocAnchors() const showFeedback = isFeatureEnabled('feedback:docs') const tocVideoPreview = `https://img.youtube.com/vi/${video}/0.jpg` return (
{video && (
)} {showFeedback && (
)}
{!hideToc && toc.length !== 0 && (

On this page

)}
) } export default GuidesSidebar export { GuidesSidebar } export type { TOCHeader }