diff --git a/frontend/packages/website/src/components/Hero.tsx b/frontend/packages/website/src/components/Hero.tsx
index 873c166..9f12fd0 100644
--- a/frontend/packages/website/src/components/Hero.tsx
+++ b/frontend/packages/website/src/components/Hero.tsx
@@ -1,13 +1,15 @@
'use client';
import { useState, useEffect } from 'react';
+import { motion } from 'framer-motion';
import { Terminal, Check, ArrowRight } from 'lucide-react';
-const AGENT_PROCESSES = [
- { label: 'Claude Code', color: '#D97757', x: 35, y: 70, logo: '/logos/claude.svg' },
- { label: 'Codex', color: '#10A37F', x: 185, y: 70, logo: 'openai' },
- { label: 'Amp', color: '#F59E0B', x: 35, y: 155, logo: '/logos/amp.svg' },
- { label: 'OpenCode', color: '#8B5CF6', x: 185, y: 155, logo: 'opencode' },
+const ADAPTERS = [
+ { label: 'Claude Code', color: '#D97757', x: 20, y: 70, logo: '/logos/claude.svg' },
+ { label: 'Codex', color: '#10A37F', x: 132, y: 70, logo: 'openai' },
+ { label: 'Pi', color: '#06B6D4', x: 244, y: 70, logo: 'pi' },
+ { label: 'Amp', color: '#F59E0B', x: 76, y: 155, logo: '/logos/amp.svg' },
+ { label: 'OpenCode', color: '#8B5CF6', x: 188, y: 155, logo: 'opencode' },
];
function UniversalAPIDiagram() {
@@ -15,29 +17,22 @@ function UniversalAPIDiagram() {
useEffect(() => {
const interval = setInterval(() => {
- setActiveIndex((prev) => (prev + 1) % AGENT_PROCESSES.length);
+ setActiveIndex((prev) => (prev + 1) % ADAPTERS.length);
}, 2000);
return () => clearInterval(interval);
}, []);
return (
-
- {/* Background Grid */}
+
+ {/* Background Dots - color changes with active adapter */}
- {/* Dynamic Background Glow */}
-
-
@@ -49,13 +44,14 @@ function UniversalAPIDiagram() {
- {/* YOUR APP NODE */}
-
-
-
- Your App
-
-
+ {/* YOUR APP NODE - Glass dark effect with backdrop blur */}
+
+
+ Your App
+
+
{/* HTTP/SSE LINE */}
@@ -73,55 +69,60 @@ function UniversalAPIDiagram() {
- {/* SANDBOX BOUNDARY */}
-
-
-
-
- SANDBOX
-
+ {/* SANDBOX BOUNDARY - Glass dark effect with backdrop blur */}
+
+
+
- {/* SANDBOX AGENT SDK */}
-
-
-
+ {/* SANDBOX AGENT SDK */}
+
+
+
Sandbox Agent Server
-
- {/* PROVIDER AGENT PROCESSES */}
- {AGENT_PROCESSES.map((p, i) => {
+ {/* PROVIDER ADAPTERS */}
+ {ADAPTERS.map((p, i) => {
const isActive = i === activeIndex;
return (
{p.logo === 'openai' ? (
-
-
+
+
) : p.logo === 'opencode' ? (
-
+
+ ) : p.logo === 'pi' ? (
+
+
+
+
) : (
-
+
)}
@@ -133,19 +134,18 @@ function UniversalAPIDiagram() {
{/* Active Agent Label */}
- CONNECTED TO {AGENT_PROCESSES[activeIndex].label.toUpperCase()}
+ CONNECTED TO {ADAPTERS[activeIndex].label.toUpperCase()}
-
);
@@ -166,47 +166,104 @@ const CopyInstallButton = () => {
};
return (
-
- {copied ? : }
- {installCommand}
-
+
+
+ {copied ? : }
+ {installCommand}
+
+
+ Give this to your coding agent
+
+
);
};
export function Hero() {
+ const [scrollOpacity, setScrollOpacity] = useState(1);
+
+ useEffect(() => {
+ const handleScroll = () => {
+ const scrollY = window.scrollY;
+ const windowHeight = window.innerHeight;
+ const isMobile = window.innerWidth < 1024;
+
+ const fadeStart = windowHeight * (isMobile ? 0.3 : 0.15);
+ const fadeEnd = windowHeight * (isMobile ? 0.7 : 0.5);
+ const opacity = 1 - Math.min(1, Math.max(0, (scrollY - fadeStart) / (fadeEnd - fadeStart)));
+ setScrollOpacity(opacity);
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
return (
-
-
-
-
-
- Run Coding Agents in Sandboxes.
- Control Them Over HTTP.
-
-
- The Sandbox Agent SDK is a server that runs inside your sandbox. Your app connects remotely to control Claude Code, Codex, OpenCode, or Amp — streaming events, handling permissions, managing sessions.
-
+
+ {/* Background gradient */}
+
-
+
);
}