import * as React from "react"; import Link from "next/link"; import { ArrowRight, Check, Columns2, Download, EyeOff, FileText, FolderOpen, Keyboard, Paperclip, Route, ServerCog, Smartphone, Sparkles, Star, WandSparkles } from "lucide-react"; import { ProviderIcon } from "@/components/brand/provider-icon"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import { Check as CheckMark, Section, SectionHeading } from "./section"; import { Reveal } from "./reveal"; import { DesktopFrame } from "./frames"; import { DesktopModelsMock, DesktopUsageMock, ScoreboardMock } from "./product-mock"; import { MOCK_MODELS } from "./mock-data"; /* ------------------------------------------------------------------------------------------------ * Shared two-column feature block — spatial grouping, no boxed cards * ---------------------------------------------------------------------------------------------- */ function FeatureBlock({ id, eyebrow, title, description, bullets, visual, flip = false, tone, cta, }: { id?: string; eyebrow: string; title: React.ReactNode; description: React.ReactNode; bullets?: string[]; visual: React.ReactNode; flip?: boolean; tone?: "default" | "subtle"; cta?: { label: string; href: string }; }) { return (
{bullets ? (
    {bullets.map((b) => (
  • {b}
  • ))}
) : null} {cta ? ( {cta.label} ) : null}
{visual}
); } /* ------------------------------------------------------------------------------------------------ * 1. Smart Router (AUTO) * ---------------------------------------------------------------------------------------------- */ function RouterVisual() { const rec = MOCK_MODELS[2]; // Gemini 3.8 Flash const alt = [MOCK_MODELS[1], MOCK_MODELS[5]]; return (
AUTO · balanced Smart Router picks from the models you connected.

Summarize this 40-page PDF into a one-page brief for the board. Keep the numbers exact.

{["document · 38K tokens", "summarization", "precision matters", "no code", "English"].map((t) => ( {t} ))}
{rec.name} recommended ≈ $0.014

Long document, no reasoning needed: a 1M-context model at $0.30 / M input is 17× cheaper than Opus here and finishes in about 6 s. Vision is on for the charts.

Use {rec.name} Choose another Always auto-route
); } export function FeatureRouter() { return ( } /> ); } /* ------------------------------------------------------------------------------------------------ * 2. Arena + Blind Arena + scoreboard * ---------------------------------------------------------------------------------------------- */ function BlindArenaVisual() { return (
Blind Arena models hidden until you vote
{(["Model A", "Model B"] as const).map((label, i) => (
{label} {i === 0 ? "1.9 s" : "1.1 s"}

{i === 0 ? "A retry budget caps the total number of retries across a call tree so cascading retries can't amplify load…" : "Think of a retry budget as a shared allowance: every retry spends from it, and when the pool is empty callers fail fast…"}

{i === 1 ? : null} Best
))}

Revealed: B was Gemini 3.8 Flash at $0.0011.

); } export function FeatureArena() { return ( } flip tone="subtle" cta={{ label: "Try the Arena", href: "/app/arena" }} /> ); } /* ------------------------------------------------------------------------------------------------ * 3. Catalog & compare * ---------------------------------------------------------------------------------------------- */ export function FeatureCatalog() { return ( } cta={{ label: "Browse the catalog", href: "/models" }} /> ); } /* ------------------------------------------------------------------------------------------------ * 4. Projects, prompt library, context library * ---------------------------------------------------------------------------------------------- */ function WorkspaceVisual() { return (
Research 3 models

Instructions

Answer like a careful analyst. Cite sources inline. Use CAD unless told otherwise. Prefer tables for comparisons.

Files

    {[ ["Q3-board-deck.pdf", "38K tok"], ["pricing-2026.csv", "4K tok"], ].map(([n, t]) => (
  • {n} {t}
  • ))}

Conversations

  • Board brief, draft 2
  • Competitor pricing scan
Prompt library
Review {"{{language}}"} code for {"{{focus}}"}. Return findings as a table with severity.

Variables are filled in a sheet before insertion.

Context library

Upload once, attach anywhere. Every file shows its token estimate so you know what it costs before sending.

); } export function FeatureWorkspace() { return ( } flip tone="subtle" /> ); } /* ------------------------------------------------------------------------------------------------ * 5. Usage analytics with savings * ---------------------------------------------------------------------------------------------- */ export function FeatureAnalytics() { return ( } /> ); } /* ------------------------------------------------------------------------------------------------ * 6. Custom endpoints for local models * ---------------------------------------------------------------------------------------------- */ const ENDPOINTS = [ { name: "Ollama (Mac Studio)", url: "http://m3u96a.local:11434/v1", models: ["qwen3.6:32b", "gemma-4-27b", "llama-4-scout"], status: "Connected" }, { name: "LM Studio", url: "http://127.0.0.1:1234/v1", models: ["mistral-small-4"], status: "Connected" }, { name: "vLLM · lab GPU", url: "https://vllm.lab.example/v1", models: ["deepseek-v4-flash"], status: "Discovering…" }, ]; function EndpointsVisual() { return (
    {ENDPOINTS.map((e, i) => (
  • {e.name} {e.status}

    {e.url}

    {e.models.map((m) => ( custom/{m} ))}
  • ))}

Models are discovered from GET {"{baseUrl}"}/models or entered by hand, then appear in the picker and the Arena like any other model.

); } export function FeatureEndpoints() { return ( } flip tone="subtle" /> ); } /* ------------------------------------------------------------------------------------------------ * 7. Also: mobile PWA, keyboard-first, exports * ---------------------------------------------------------------------------------------------- */ const ALSO = [ { icon: , title: "Designed for phones first", body: "Bottom navigation, swipeable Arena, bottom sheets, a composer that stays above the keyboard. Install it to your home screen and it behaves like a native app." }, { icon: , title: "Keyboard-first on desktop", body: "⌘K command palette and search, ⌘N new chat, ⌘/ model picker, ⌘Enter send, Esc stop, ⌘B sidebar. Everything reachable without a mouse." }, { icon: , title: "Your data, portable", body: "Export any conversation as Markdown, TXT, JSON or PDF, export your whole account in one file, share a conversation or an Arena comparison with a revocable link." }, { icon: , title: "Compare inside a chat", body: "Pick “Compare with…” on any message to run it through two to four models and continue with the one you prefer." }, { icon: , title: "Presets that travel", body: "Save temperature, reasoning effort, output format and tools as a preset and apply it to any compatible model." }, { icon: , title: "Temporary chats", body: "A chat you never want stored: streamed, shown, gone. Marked “Not stored in history”." }, ]; export function FeatureAlso() { return (
    {ALSO.map((item, i) => ( {item.icon}

    {item.title}

    {item.body}

    ))}
); }