import { useState, useEffect, useRef } from "react"; import { ArrowUpRight, ChevronDown, Zap, BookOpen, Brain, Check, } from "lucide-react"; import { AVAILABLE_MODELS, type ModelConfig } from "../hooks/LLMContext"; import HfIcon from "./HfIcon"; interface LandingPageProps { onStart: () => void; isLoading: boolean; showChat: boolean; selectedModel: ModelConfig; onSelectModel: (model: ModelConfig) => void; loadedModelId: string | null; } const features = [ { Icon: Zap, label: "Hybrid Transformer + DeltaNet" }, { Icon: BookOpen, label: "Fully open 7B parameter model" }, { Icon: Brain, label: "Reasoning and Instruct variants" }, ] as const; export function LandingPage({ onStart, selectedModel, onSelectModel, loadedModelId, }: LandingPageProps) { const [introFade, setIntroFade] = useState(true); const [modelMenuOpen, setModelMenuOpen] = useState(false); const menuRef = useRef(null); useEffect(() => { if (!modelMenuOpen) return; const handleClick = (e: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setModelMenuOpen(false); } }; document.addEventListener("mousedown", handleClick); return () => document.removeEventListener("mousedown", handleClick); }, [modelMenuOpen]); useEffect(() => { const t = setTimeout(() => setIntroFade(false), 50); return () => clearTimeout(t); }, []); const selectedIsLoaded = loadedModelId === selectedModel.id; return (
{/* Background image */}
{/* Initial fade */}
{/* Main content */}
{/* Header */}
AI2
{/* Hero */}

Fully open hybrid language model by AI2

Olmo WebGPU

Run Olmo Hybrid directly in your browser, powered by Transformers.js

{/* Feature pills */}
{features.map(({ Icon, label }) => (
{label}
))}
{/* CTA */}
{/* Model dropdown */} {modelMenuOpen && (
{AVAILABLE_MODELS.map((model) => ( ))}
)} {!selectedIsLoaded && (

~4.3 GB download, cached locally for future sessions.

)}
); }