import { useState, useEffect, useRef, type ReactNode } from 'react' import { cn } from '@/lib/utils' interface ApiDemoConfig { id: string label: string endpoint: string requestBodyLines: string[] responseKind: 'chat' | 'responses' | 'claude' | 'gemini' response: string tokens: number latency: number badgeClass: string } const API_DEMOS: ApiDemoConfig[] = [ { id: 'gpt-chat', label: 'GPT Chat', endpoint: '/v1/chat/completions', requestBodyLines: [ '"model": "your-model",', '"messages": [', ' { "role": "user", "content": "..." }', ']', ], responseKind: 'chat', response: 'Route chat requests through configured upstreams.', tokens: 27, latency: 142, badgeClass: 'bg-emerald-500/10 text-emerald-600 ring-emerald-500/20 dark:bg-emerald-500/15 dark:text-emerald-400 dark:ring-emerald-500/25', }, { id: 'responses', label: 'Responses', endpoint: '/v1/responses', requestBodyLines: ['"model": "your-model",', '"input": "..."'], responseKind: 'responses', response: 'Run response workflows behind one gateway.', tokens: 31, latency: 168, badgeClass: 'bg-amber-500/10 text-amber-600 ring-amber-500/20 dark:bg-amber-500/15 dark:text-amber-400 dark:ring-amber-500/25', }, { id: 'claude', label: 'Claude', endpoint: '/v1/messages', requestBodyLines: [ '"model": "your-model",', '"max_tokens": 1024,', '"messages": [', ' { "role": "user", "content": "..." }', ']', ], responseKind: 'claude', response: 'Send Claude-style messages through your gateway.', tokens: 29, latency: 156, badgeClass: 'bg-blue-500/10 text-blue-600 ring-blue-500/20 dark:bg-blue-500/15 dark:text-blue-400 dark:ring-blue-500/25', }, { id: 'gemini', label: 'Gemini', endpoint: '/v1beta/models/{model}:generateContent', requestBodyLines: [ '"contents": [', ' { "parts": [{ "text": "..." }] }', ']', ], responseKind: 'gemini', response: 'Serve Gemini-compatible generation requests.', tokens: 25, latency: 93, badgeClass: 'bg-violet-500/10 text-violet-600 ring-violet-500/20 dark:bg-violet-500/15 dark:text-violet-400 dark:ring-violet-500/25', }, ] const CYCLE_INTERVAL = 4000 export function HeroTerminalDemo() { const [activeIndex, setActiveIndex] = useState(0) const [transitioning, setTransitioning] = useState(false) const intervalRef = useRef>(undefined) useEffect(() => { const mq = window.matchMedia('(prefers-reduced-motion: reduce)') if (mq.matches) return intervalRef.current = setInterval(() => { setTransitioning(true) setTimeout(() => { setActiveIndex((prev) => (prev + 1) % API_DEMOS.length) setTransitioning(false) }, 300) }, CYCLE_INTERVAL) return () => clearInterval(intervalRef.current) }, []) const demo = API_DEMOS[activeIndex] return (
{/* Title bar */}
{ clearInterval(intervalRef.current) setTransitioning(true) setTimeout(() => { setActiveIndex(i) setTransitioning(false) }, 300) }} />
200 OK
{/* Terminal body — fixed height */}
{/* Request */}
Request
{/* Response */}
Response {demo.latency}ms
{demo.tokens} tokens ${(demo.tokens * 0.00003).toFixed(5)}
) } function RequestPreview(props: { demo: ApiDemoConfig transitioning: boolean }) { const { demo, transitioning } = props return (
curl -X POST{' '} "{demo.endpoint}" {' '} {'\\'} -H{' '} "Authorization: Bearer sk-••••"{' '} {'\\'} -d '{'{'} {demo.requestBodyLines.map((line) => ( {line} ))} {'}'}'
) } function ResponsePreview(props: { demo: ApiDemoConfig transitioning: boolean }) { const { demo, transitioning } = props return (
{demo.responseKind === 'chat' && ( <> {'{'} "choices" : [ {'{'} "message" : {'{'} "content" : {'}'} {'}'} ], {'}'} )} {demo.responseKind === 'responses' && ( <> {'{'} "output" : [ {'{'} "type" : "message" , "content" : [ {'{'} "type" : "output_text" , "text" : {'}'} ] {'}'} ], {'}'} )} {demo.responseKind === 'claude' && ( <> {'{'} "content" : [ {'{'} "type" : "text" , "text" : {'}'} ], "usage" : {'{'} "input_tokens" : {Math.floor(demo.tokens * 0.4)} , "output_tokens" : {Math.ceil(demo.tokens * 0.6)} {'}'} {'}'} )} {demo.responseKind === 'gemini' && ( <> {'{'} "candidates" : [ {'{'} "content" : {'{'} "parts" : [ {'{'} "text" : {'}'} ] {'}'} {'}'} ], {'}'} )}
) } function UsageLine(props: { container: string name: string value: number indent: number }) { return ( "{props.container}" : {'{'} "{props.name}" : {props.value} {'}'} ) } function ResponseText(props: { demo: ApiDemoConfig transitioning: boolean }) { return ( "{props.demo.response}" ) } function CodeLine(props: { children: ReactNode; indent?: number }) { return (
{props.indent ? ( ) : null} {props.children}
) } function AnimatedString(props: { children: ReactNode transitioning: boolean }) { return ( {props.children} ) } function Command(props: { children: ReactNode }) { return ( {props.children} ) } function Flag(props: { children: ReactNode }) { return ( {props.children} ) } function Key(props: { children: ReactNode }) { return ( {props.children} ) } function StringText(props: { children: ReactNode }) { return ( {props.children} ) } function NumberText(props: { children: ReactNode }) { return ( {props.children} ) } function Muted(props: { children: ReactNode }) { return {props.children} } function ModelSelector(props: { demos: ApiDemoConfig[] activeIndex: number onSelect: (index: number) => void }) { return (
{props.demos.map((demo, i) => ( ))}
) }