{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "template-orbit",
  "title": "Orbit: AI agent platform",
  "author": "Ballmac <https://ui.ballmac.com>",
  "description": "A dark, four-page site for an AI agent platform: a hero that plays a live agent run, tools, an eval chart, traces, security, pricing with a usage calculator, a changelog and sign-in.",
  "dependencies": [
    "lucide-react",
    "motion@^12",
    "recharts@^3"
  ],
  "registryDependencies": [
    "utils",
    "https://ui.ballmac.com/r/accordion.json",
    "https://ui.ballmac.com/r/aurora-background.json",
    "https://ui.ballmac.com/r/blur-fade.json",
    "https://ui.ballmac.com/r/changelog-feed.json",
    "https://ui.ballmac.com/r/chart.json",
    "https://ui.ballmac.com/r/copy-button.json",
    "https://ui.ballmac.com/r/marquee.json",
    "https://ui.ballmac.com/r/number-ticker.json",
    "https://ui.ballmac.com/r/segmented-control.json",
    "https://ui.ballmac.com/r/slider.json"
  ],
  "files": [
    {
      "path": "registry/ballmac/components/templates/orbit/orbit-fonts.ts",
      "content": "// Ballmac UI: Orbit template fonts. https://ui.ballmac.com/templates/template-orbit\nimport { Instrument_Sans, JetBrains_Mono } from \"next/font/google\"\n\nexport const orbitSans = Instrument_Sans({ variable: \"--orbit-sans\", subsets: [\"latin\"], display: \"swap\", preload: false })\nexport const orbitMono = JetBrains_Mono({ variable: \"--orbit-mono\", subsets: [\"latin\"], display: \"swap\", preload: false })\n",
      "type": "registry:component",
      "target": "@components/ballmac/templates/orbit/orbit-fonts.ts"
    },
    {
      "path": "registry/ballmac/components/templates/orbit/orbit-theme.tsx",
      "content": "// Ballmac UI: Orbit template shell. https://ui.ballmac.com/templates/template-orbit\n\"use client\"\n\nimport * as React from \"react\"\nimport { ArrowUpRight, Menu, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { orbitMono, orbitSans } from \"@/components/ballmac/templates/orbit/orbit-fonts\"\n\ntype OrbitPage = \"home\" | \"pricing\" | \"changelog\" | \"login\"\n\n/** Where each page lives. Defaults match the routes the template installs. */\ntype OrbitHrefs = Record<OrbitPage, string>\n\nconst defaultHrefs: OrbitHrefs = { home: \"/orbit\", pricing: \"/orbit/pricing\", changelog: \"/orbit/changelog\", login: \"/orbit/login\" }\n\n/** Orbit's palette: deep ink with a violet light. Every value is a standard Ballmac token, so blocks inside follow it. */\nconst orbitVars = {\n  \"--background\": \"oklch(0.135 0.026 275)\",\n  \"--foreground\": \"oklch(0.965 0.01 275)\",\n  \"--card\": \"oklch(0.172 0.03 275)\",\n  \"--card-foreground\": \"oklch(0.965 0.01 275)\",\n  \"--popover\": \"oklch(0.19 0.032 275)\",\n  \"--popover-foreground\": \"oklch(0.965 0.01 275)\",\n  \"--primary\": \"oklch(0.965 0.01 275)\",\n  \"--primary-foreground\": \"oklch(0.18 0.03 275)\",\n  \"--secondary\": \"oklch(0.24 0.035 275)\",\n  \"--secondary-foreground\": \"oklch(0.965 0.01 275)\",\n  \"--muted\": \"oklch(0.22 0.034 275)\",\n  \"--muted-foreground\": \"oklch(0.73 0.03 275)\",\n  \"--accent\": \"oklch(0.26 0.04 275)\",\n  \"--accent-foreground\": \"oklch(0.965 0.01 275)\",\n  \"--border\": \"oklch(1 0 0 / 9%)\",\n  \"--input\": \"oklch(1 0 0 / 13%)\",\n  \"--ring\": \"oklch(0.7 0.19 285)\",\n  \"--surface\": \"oklch(0.155 0.028 275)\",\n  \"--destructive\": \"oklch(0.7 0.19 22)\",\n  \"--chart-1\": \"oklch(0.72 0.19 285)\",\n  \"--chart-2\": \"oklch(0.82 0.14 185)\",\n  \"--chart-3\": \"oklch(0.84 0.14 85)\",\n  \"--chart-4\": \"oklch(0.74 0.19 350)\",\n  \"--chart-5\": \"oklch(0.72 0.14 245)\",\n  \"--radius\": \"0.9rem\",\n} as React.CSSProperties\n\nfunction OrbitMark({ className }: { className?: string }) {\n  return (\n    <svg viewBox=\"0 0 32 32\" fill=\"none\" aria-hidden=\"true\" className={cn(\"size-7\", className)}>\n      <circle cx=\"16\" cy=\"16\" r=\"5\" fill=\"var(--chart-1)\" />\n      <ellipse cx=\"16\" cy=\"16\" rx=\"13\" ry=\"6\" stroke=\"currentColor\" strokeWidth=\"1.6\" transform=\"rotate(-28 16 16)\" opacity=\"0.9\" />\n      <circle cx=\"26.2\" cy=\"10.3\" r=\"2.2\" fill=\"var(--chart-2)\" />\n    </svg>\n  )\n}\n\nconst nav: { key: OrbitPage; label: string }[] = [\n  { key: \"pricing\", label: \"Pricing\" },\n  { key: \"changelog\", label: \"Changelog\" },\n]\n\ntype OrbitShellProps = React.ComponentProps<\"div\"> & {\n  /** The page being shown, so its nav link is marked current. */\n  page: OrbitPage\n  /** Override where pages live (used by previews). */\n  hrefs?: Partial<OrbitHrefs>\n  /** Hide the header and footer (the sign-in page draws its own frame). */\n  bare?: boolean\n}\n\n/** Orbit's frame: the dark theme, fonts, floating header and footer. Wrap every Orbit page in it. */\nfunction OrbitShell({ page, hrefs: hrefOverrides, bare, className, children, style, ...props }: OrbitShellProps) {\n  const hrefs = { ...defaultHrefs, ...hrefOverrides }\n  const [open, setOpen] = React.useState(false)\n  return (\n    <div\n      data-slot=\"orbit\"\n      className={cn(\"dark bg-background text-foreground relative isolate min-h-dvh overflow-x-clip [color-scheme:dark]\", orbitSans.variable, orbitMono.variable, className)}\n      style={{ ...orbitVars, fontFamily: \"var(--orbit-sans), ui-sans-serif, system-ui, sans-serif\", ...style }}\n      {...props}\n    >\n      {!bare && (\n        <header className=\"sticky top-0 z-40 px-3 pt-3 sm:px-6\">\n          <div className=\"bg-background/70 mx-auto flex h-14 max-w-6xl items-center justify-between rounded-2xl border pe-2 ps-4 backdrop-blur-xl\">\n            <a href={hrefs.home} className=\"focus-visible:ring-ring/50 flex items-center gap-2 rounded-md font-semibold tracking-tight outline-none focus-visible:ring-[3px]\">\n              <OrbitMark />\n              Orbit\n            </a>\n            <nav aria-label=\"Main\" className=\"hidden items-center gap-1 md:flex\">\n              {[{ key: \"home\" as const, label: \"Product\" }, ...nav].map((l) => (\n                <a\n                  key={l.key}\n                  href={hrefs[l.key]}\n                  aria-current={page === l.key ? \"page\" : undefined}\n                  className=\"text-muted-foreground hover:text-foreground aria-[current=page]:text-foreground focus-visible:ring-ring/50 rounded-lg px-3 py-1.5 text-sm outline-none transition-colors focus-visible:ring-[3px]\"\n                >\n                  {l.label}\n                </a>\n              ))}\n              <a href=\"#\" className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 inline-flex items-center gap-1 rounded-lg px-3 py-1.5 text-sm outline-none transition-colors focus-visible:ring-[3px]\">\n                Docs <ArrowUpRight className=\"size-3.5 rtl:-scale-x-100\" aria-hidden=\"true\" />\n              </a>\n            </nav>\n            <div className=\"flex items-center gap-1.5\">\n              <a href={hrefs.login} className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 hidden rounded-lg px-3 py-1.5 text-sm outline-none transition-colors focus-visible:ring-[3px] sm:block\">\n                Sign in\n              </a>\n              <a href={hrefs.login} className=\"bg-foreground text-background focus-visible:ring-ring/50 inline-flex h-9 items-center rounded-xl px-3.5 text-sm font-medium outline-none transition-opacity hover:opacity-90 focus-visible:ring-[3px]\">\n                Start free\n              </a>\n              <button\n                type=\"button\"\n                aria-label={open ? \"Close menu\" : \"Open menu\"}\n                aria-expanded={open}\n                aria-controls=\"orbit-mobile-menu\"\n                onClick={() => setOpen((v) => !v)}\n                className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 inline-flex size-9 items-center justify-center rounded-lg outline-none focus-visible:ring-[3px] md:hidden\"\n              >\n                {open ? <X className=\"size-5\" aria-hidden=\"true\" /> : <Menu className=\"size-5\" aria-hidden=\"true\" />}\n              </button>\n            </div>\n          </div>\n          {open && (\n            <nav id=\"orbit-mobile-menu\" aria-label=\"Mobile\" className=\"bg-popover mx-auto mt-2 max-w-6xl rounded-2xl border p-2 md:hidden\">\n              {[{ key: \"home\" as const, label: \"Product\" }, ...nav, { key: \"login\" as const, label: \"Sign in\" }].map((l) => (\n                <a key={l.key} href={hrefs[l.key]} className=\"hover:bg-accent block rounded-xl px-3 py-2.5 text-sm\">\n                  {l.label}\n                </a>\n              ))}\n            </nav>\n          )}\n        </header>\n      )}\n      {children}\n      {!bare && (\n        <footer className=\"mx-auto max-w-6xl px-4 pt-8 pb-12 sm:px-6\">\n          <div className=\"grid gap-10 border-t pt-12 sm:grid-cols-2 lg:grid-cols-[1.4fr_repeat(3,1fr)]\">\n            <div>\n              <a href={hrefs.home} className=\"flex items-center gap-2 font-semibold tracking-tight\">\n                <OrbitMark /> Orbit\n              </a>\n              <p className=\"text-muted-foreground mt-3 max-w-xs text-sm text-pretty\">The platform for building, testing and running AI agents in production.</p>\n              <p className=\"text-muted-foreground mt-5 flex items-center gap-2 text-xs\" style={{ fontFamily: \"var(--orbit-mono)\" }}>\n                <span className=\"bg-chart-2 size-1.5 rounded-full\" aria-hidden=\"true\" /> All systems operational\n              </p>\n            </div>\n            {[\n              { title: \"Product\", links: [\"Agents\", \"Tools\", \"Evals\", \"Traces\", \"Security\"] },\n              { title: \"Developers\", links: [\"Documentation\", \"API reference\", \"SDKs\", \"Status\", \"Changelog\"] },\n              { title: \"Company\", links: [\"About\", \"Customers\", \"Careers\", \"Contact\", \"Brand\"] },\n            ].map((c) => (\n              <div key={c.title}>\n                <h2 className=\"text-sm font-medium\">{c.title}</h2>\n                <ul className=\"mt-4 space-y-2.5\">\n                  {c.links.map((l) => (\n                    <li key={l}>\n                      <a href={l === \"Changelog\" ? hrefs.changelog : \"#\"} className=\"text-muted-foreground hover:text-foreground text-sm transition-colors\">\n                        {l}\n                      </a>\n                    </li>\n                  ))}\n                </ul>\n              </div>\n            ))}\n          </div>\n          <p className=\"text-muted-foreground mt-12 text-xs\">© 2026 Orbit Labs, Inc. SOC 2 Type II · GDPR · HIPAA-ready</p>\n        </footer>\n      )}\n    </div>\n  )\n}\n\nexport { OrbitMark, OrbitShell, defaultHrefs as orbitDefaultHrefs, type OrbitHrefs, type OrbitPage, type OrbitShellProps }\n",
      "type": "registry:component",
      "target": "@components/ballmac/templates/orbit/orbit-theme.tsx"
    },
    {
      "path": "registry/ballmac/components/templates/orbit/orbit-agent-run.tsx",
      "content": "// Ballmac UI: Orbit agent run. https://ui.ballmac.com/templates/template-orbit\n\"use client\"\n\nimport * as React from \"react\"\nimport { Check, CircleDashed, Loader2, RotateCcw, ShieldCheck } from \"lucide-react\"\nimport { useReducedMotion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Step = { id: string; kind: \"plan\" | \"tool\" | \"approval\" | \"reply\"; label: string; detail: string; ms: number; tokens: number }\n\nconst task = \"Reconcile last week’s refunds and send finance a summary.\"\n\nconst steps: Step[] = [\n  { id: \"plan\", kind: \"plan\", label: \"Plan\", detail: \"3 steps · pull refunds, match to orders, draft summary\", ms: 640, tokens: 412 },\n  { id: \"refunds\", kind: \"tool\", label: \"stripe.refunds.list\", detail: \"214 refunds · $18,420.50\", ms: 820, tokens: 96 },\n  { id: \"orders\", kind: \"tool\", label: \"warehouse.query\", detail: \"208 matched · 6 need review\", ms: 1180, tokens: 268 },\n  { id: \"approval\", kind: \"approval\", label: \"Needs approval\", detail: \"Send email to finance@acme.co\", ms: 1500, tokens: 0 },\n  { id: \"reply\", kind: \"reply\", label: \"Summary sent\", detail: \"Draft delivered · 6 flagged refunds attached\", ms: 520, tokens: 534 },\n]\n\nconst STEP_DELAY = 1150\n\nfunction formatMs(ms: number) {\n  return ms >= 1000 ? `${(ms / 1000).toFixed(1)} s` : `${ms} ms`\n}\n\n/** A scripted agent run that plays when it scrolls into view: plan, tool calls, an approval and a reply, with a live trace and cost. */\nfunction OrbitAgentRun({ className }: { className?: string }) {\n  const reduce = useReducedMotion()\n  const ref = React.useRef<HTMLDivElement>(null)\n  const [done, setDone] = React.useState(0)\n  const [run, setRun] = React.useState(0)\n  const [started, setStarted] = React.useState(false)\n\n  // Start once the card is on screen.\n  React.useEffect(() => {\n    const el = ref.current\n    if (!el) return\n    const io = new IntersectionObserver(\n      ([e]) => {\n        if (e.isIntersecting) {\n          setStarted(true)\n          io.disconnect()\n        }\n      },\n      { threshold: 0.35 }\n    )\n    io.observe(el)\n    return () => io.disconnect()\n  }, [])\n\n  // Step through the script. Reduced motion jumps straight to the end.\n  React.useEffect(() => {\n    if (!started) return\n    if (reduce) {\n      const t = setTimeout(() => setDone(steps.length), 0)\n      return () => clearTimeout(t)\n    }\n    if (done >= steps.length) return\n    const t = setTimeout(() => setDone((d) => d + 1), done === 0 ? 700 : STEP_DELAY)\n    return () => clearTimeout(t)\n  }, [started, done, reduce, run])\n\n  const finished = done >= steps.length\n  const elapsed = steps.slice(0, done).reduce((n, s) => n + s.ms, 0)\n  const tokens = steps.slice(0, done).reduce((n, s) => n + s.tokens, 0)\n  const cost = tokens * 0.0000042\n\n  function replay() {\n    setDone(0)\n    setRun((r) => r + 1)\n  }\n\n  return (\n    <div ref={ref} data-slot=\"orbit-agent-run\" className={cn(\"bg-card/80 relative overflow-hidden rounded-3xl border shadow-[0_40px_120px_-40px_oklch(0.6_0.2_285/0.5)] backdrop-blur\", className)}>\n      <div className=\"flex items-center justify-between gap-3 border-b px-4 py-3 sm:px-5\">\n        <div className=\"flex items-center gap-2.5\">\n          <span className=\"flex gap-1.5\" aria-hidden=\"true\">\n            <span className=\"bg-muted-foreground/30 size-2.5 rounded-full\" />\n            <span className=\"bg-muted-foreground/30 size-2.5 rounded-full\" />\n            <span className=\"bg-muted-foreground/30 size-2.5 rounded-full\" />\n          </span>\n          <span className=\"text-muted-foreground text-xs\" style={{ fontFamily: \"var(--orbit-mono)\" }}>\n            run_8f3k2 · refund-reconciler\n          </span>\n        </div>\n        <span\n          className={cn(\"flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs\", finished ? \"text-chart-2\" : \"text-muted-foreground\")}\n          role=\"status\"\n        >\n          {finished ? <Check className=\"size-3\" aria-hidden=\"true\" /> : <Loader2 className=\"size-3 motion-safe:animate-spin\" aria-hidden=\"true\" />}\n          {finished ? \"Completed\" : started ? \"Running\" : \"Queued\"}\n        </span>\n      </div>\n\n      <div className=\"grid lg:grid-cols-[1.15fr_1fr]\">\n        <div className=\"min-w-0 space-y-4 p-4 sm:p-6\">\n          <div className=\"bg-secondary/70 ms-auto max-w-[88%] rounded-2xl rounded-ee-md px-4 py-3 text-sm text-pretty\">{task}</div>\n          <ol className=\"space-y-2.5\" aria-label=\"Agent steps\">\n            {steps.map((s, i) => {\n              const state = i < done ? \"done\" : i === done && started && !finished ? \"active\" : \"waiting\"\n              return (\n                <li\n                  key={s.id}\n                  data-state={state}\n                  className={cn(\n                    \"flex items-start gap-3 rounded-2xl border px-3.5 py-3 transition-[opacity,border-color,background-color] duration-500 motion-reduce:transition-none\",\n                    state === \"waiting\" && \"opacity-40\",\n                    state === \"active\" && \"border-chart-1/50 bg-chart-1/10\",\n                    s.kind === \"approval\" && state === \"done\" && \"border-chart-3/40\"\n                  )}\n                >\n                  <span className=\"mt-0.5 shrink-0\">\n                    {state === \"done\" ? (\n                      s.kind === \"approval\" ? <ShieldCheck className=\"text-chart-3 size-4\" aria-hidden=\"true\" /> : <Check className=\"text-chart-2 size-4\" aria-hidden=\"true\" />\n                    ) : state === \"active\" ? (\n                      <Loader2 className=\"text-chart-1 size-4 motion-safe:animate-spin\" aria-hidden=\"true\" />\n                    ) : (\n                      <CircleDashed className=\"text-muted-foreground size-4\" aria-hidden=\"true\" />\n                    )}\n                    <span className=\"sr-only\">{state === \"done\" ? \"Done\" : state === \"active\" ? \"In progress\" : \"Waiting\"}</span>\n                  </span>\n                  <div className=\"min-w-0 flex-1\">\n                    <p className={cn(\"truncate text-sm font-medium\", s.kind === \"tool\" && \"text-[13px]\")} style={s.kind === \"tool\" ? { fontFamily: \"var(--orbit-mono)\" } : undefined}>\n                      {s.label}\n                    </p>\n                    <p className=\"text-muted-foreground mt-0.5 text-xs text-pretty\">{state === \"waiting\" ? \"Waiting\" : s.detail}</p>\n                  </div>\n                  {state === \"done\" && s.ms > 0 && (\n                    <span className=\"text-muted-foreground shrink-0 text-xs tabular-nums\" style={{ fontFamily: \"var(--orbit-mono)\" }}>\n                      {formatMs(s.ms)}\n                    </span>\n                  )}\n                </li>\n              )\n            })}\n          </ol>\n        </div>\n\n        <div className=\"bg-background/40 min-w-0 border-t p-4 sm:p-6 lg:border-t-0 lg:border-s\">\n          <p className=\"text-muted-foreground text-xs font-medium tracking-wide uppercase\">Trace</p>\n          <div className=\"mt-4 space-y-2.5\" role=\"img\" aria-label={`Trace of ${done} of ${steps.length} steps, ${formatMs(elapsed)} elapsed`}>\n            {steps.map((s, i) => {\n              const before = steps.slice(0, i).reduce((n, x) => n + x.ms, 0)\n              const total = steps.reduce((n, x) => n + x.ms, 0)\n              const visible = i < done\n              return (\n                <div key={s.id} className=\"flex items-center gap-3\">\n                  <span className=\"text-muted-foreground w-[4.75rem] shrink-0 text-[11px]\" style={{ fontFamily: \"var(--orbit-mono)\" }}>\n                    {s.kind === \"tool\" ? s.label.split(\".\")[0] : s.kind}\n                  </span>\n                  <div className=\"bg-muted/60 relative h-2 flex-1 overflow-hidden rounded-full\">\n                    <div\n                      className={cn(\"absolute inset-y-0 rounded-full transition-[opacity,transform] duration-700 motion-reduce:transition-none\", s.kind === \"approval\" ? \"bg-chart-3\" : s.kind === \"tool\" ? \"bg-chart-1\" : \"bg-chart-2\")}\n                      style={{ left: `${(before / total) * 100}%`, width: `${Math.max((s.ms / total) * 100, 4)}%`, opacity: visible ? 1 : 0, transform: visible ? \"scaleX(1)\" : \"scaleX(0.2)\", transformOrigin: \"left\" }}\n                    />\n                  </div>\n                </div>\n              )\n            })}\n          </div>\n\n          <dl className=\"mt-6 grid grid-cols-3 gap-3\">\n            {[\n              { label: \"Elapsed\", value: formatMs(elapsed) },\n              { label: \"Tokens\", value: tokens.toLocaleString(\"en-US\") },\n              { label: \"Cost\", value: `$${cost.toFixed(3)}` },\n            ].map((m) => (\n              <div key={m.label} className=\"bg-card/70 rounded-xl border px-3 py-2.5\">\n                <dt className=\"text-muted-foreground text-[11px]\">{m.label}</dt>\n                <dd className=\"mt-1 text-base font-medium tabular-nums\" style={{ fontFamily: \"var(--orbit-mono)\" }}>\n                  {m.value}\n                </dd>\n              </div>\n            ))}\n          </dl>\n\n          <div className=\"mt-6 flex items-center justify-between gap-3\">\n            <p className=\"text-muted-foreground text-xs text-pretty\" aria-live=\"polite\">\n              {finished ? \"Every step is stored. Replay it, diff it, turn it into an eval.\" : \"Watching the run live.\"}\n            </p>\n            <button\n              type=\"button\"\n              onClick={replay}\n              className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 inline-flex h-8 shrink-0 items-center gap-1.5 rounded-lg border px-2.5 text-xs outline-none transition-colors focus-visible:ring-[3px]\"\n            >\n              <RotateCcw className=\"size-3.5\" aria-hidden=\"true\" /> Replay\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport { OrbitAgentRun }\n",
      "type": "registry:component",
      "target": "@components/ballmac/templates/orbit/orbit-agent-run.tsx"
    },
    {
      "path": "registry/ballmac/components/templates/orbit/orbit-home.tsx",
      "content": "// Ballmac UI: Orbit home page. https://ui.ballmac.com/templates/template-orbit\n\"use client\"\n\nimport * as React from \"react\"\nimport { ArrowRight, Check, FileCheck2, Fingerprint, GitBranch, KeyRound, Lock, Network, ScrollText, Server } from \"lucide-react\"\nimport { CartesianGrid, Line, LineChart, XAxis, YAxis } from \"recharts\"\n\nimport { AuroraBackground } from \"@/components/ballmac/aurora-background\"\nimport { BlurFade } from \"@/components/ballmac/blur-fade\"\nimport { ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, type ChartConfig } from \"@/components/ballmac/chart\"\nimport { CopyButton } from \"@/components/ballmac/copy-button\"\nimport { Marquee } from \"@/components/ballmac/marquee\"\nimport { NumberTicker } from \"@/components/ballmac/number-ticker\"\nimport { OrbitAgentRun } from \"@/components/ballmac/templates/orbit/orbit-agent-run\"\nimport { OrbitShell, type OrbitHrefs } from \"@/components/ballmac/templates/orbit/orbit-theme\"\nimport { cn } from \"@/lib/utils\"\n\nconst mono = { fontFamily: \"var(--orbit-mono)\" } as const\nconst display = \"font-semibold tracking-[-0.045em] text-balance\"\n\nconst customers = [\"Brightwell\", \"Lattice\", \"Fieldly\", \"Halcyon\", \"Parallel\", \"Ridgeline\", \"Tessera\", \"Quanta\", \"Meridian\"]\n\nconst tools = [\n  { name: \"stripe\", calls: \"1.2M\", scope: \"Refunds, invoices\" },\n  { name: \"slack\", calls: \"860k\", scope: \"Post, read threads\" },\n  { name: \"github\", calls: \"540k\", scope: \"PRs, issues, checks\" },\n  { name: \"postgres\", calls: \"2.1M\", scope: \"Read-only queries\" },\n  { name: \"gmail\", calls: \"310k\", scope: \"Drafts, send with approval\" },\n  { name: \"browser\", calls: \"190k\", scope: \"Click, type, extract\" },\n]\n\nconst evalData = [\n  { build: \"#1\", baseline: 61, orbit: 62 },\n  { build: \"#2\", baseline: 63, orbit: 68 },\n  { build: \"#3\", baseline: 62, orbit: 74 },\n  { build: \"#4\", baseline: 64, orbit: 79 },\n  { build: \"#5\", baseline: 63, orbit: 83 },\n  { build: \"#6\", baseline: 65, orbit: 86 },\n  { build: \"#7\", baseline: 64, orbit: 91 },\n  { build: \"#8\", baseline: 66, orbit: 94 },\n]\nconst evalConfig = { orbit: { label: \"With Orbit evals\", color: \"var(--chart-1)\" }, baseline: { label: \"Shipping on vibes\", color: \"var(--chart-4)\" } } satisfies ChartConfig\n\nconst security = [\n  { icon: Fingerprint, title: \"SSO and SCIM\", text: \"Okta, Entra ID and Google. Roles map to agents, tools and environments.\" },\n  { icon: KeyRound, title: \"Scoped credentials\", text: \"Agents never see secrets. Tools get short-lived, least-privilege tokens.\" },\n  { icon: Lock, title: \"Approvals\", text: \"Require a human for anything that spends, sends or deletes.\" },\n  { icon: ScrollText, title: \"Audit log\", text: \"Every prompt, tool call and decision, streamed to your SIEM.\" },\n  { icon: Server, title: \"Your cloud\", text: \"Run the data plane in your own VPC. Nothing leaves it.\" },\n  { icon: FileCheck2, title: \"Certified\", text: \"SOC 2 Type II, ISO 27001, GDPR, and HIPAA-ready.\" },\n]\n\ntype OrbitHomeProps = React.ComponentProps<\"div\"> & { hrefs?: Partial<OrbitHrefs> }\n\nfunction SectionIntro({ eyebrow, title, children }: { eyebrow: string; title: string; children: React.ReactNode }) {\n  return (\n    <div className=\"max-w-xl\">\n      <p className=\"text-chart-1 text-sm font-medium\" style={mono}>{eyebrow}</p>\n      <h2 className={cn(\"mt-3 text-3xl sm:text-4xl\", display)}>{title}</h2>\n      <p className=\"text-muted-foreground mt-4 text-pretty sm:text-lg\">{children}</p>\n    </div>\n  )\n}\n\n/** The Orbit home page: a live agent run, tools, evals, traces, security and a closing call to action. */\nfunction OrbitHome({ hrefs, ...props }: OrbitHomeProps) {\n  return (\n    <OrbitShell page=\"home\" hrefs={hrefs} {...props}>\n      <main>\n        {/* Hero */}\n        <section className=\"relative -mt-[4.25rem] overflow-hidden px-4 pt-36 pb-16 sm:px-6 sm:pt-44\">\n          <AuroraBackground aria-hidden=\"true\" className=\"absolute inset-0 -z-10\" colors={[\"var(--chart-1)\", \"var(--chart-5)\", \"var(--chart-4)\"]} intensity={0.55} radialMask />\n          <div className=\"mx-auto max-w-4xl text-center\">\n            <a href=\"#\" className=\"bg-card/60 hover:bg-card focus-visible:ring-ring/50 mx-auto inline-flex items-center gap-2 rounded-full border py-1 pe-3 ps-1 text-sm backdrop-blur outline-none transition-colors focus-visible:ring-[3px]\">\n              <span className=\"bg-chart-1 text-background rounded-full px-2 py-0.5 text-xs font-medium\">New</span>\n              Computer use is generally available\n              <ArrowRight className=\"size-3.5 rtl:rotate-180\" aria-hidden=\"true\" />\n            </a>\n            <h1 className={cn(\"mt-7 text-[2.6rem] leading-[1.02] sm:text-6xl lg:text-7xl\", display)}>\n              Agents that <span className=\"from-chart-1 via-chart-5 to-chart-2 bg-gradient-to-r bg-clip-text text-transparent\">finish the job.</span>\n            </h1>\n            <p className=\"text-muted-foreground mx-auto mt-6 max-w-2xl text-lg text-pretty sm:text-xl\">\n              Build, test and run AI agents with the tools, evals and guardrails a production team needs. Ship the first one this afternoon.\n            </p>\n            <div className=\"mt-9 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n              <a href=\"#\" className=\"bg-foreground text-background focus-visible:ring-ring/50 inline-flex h-12 items-center gap-2 rounded-2xl px-6 font-medium outline-none transition-opacity hover:opacity-90 focus-visible:ring-[3px]\">\n                Start building <ArrowRight className=\"size-4 rtl:rotate-180\" aria-hidden=\"true\" />\n              </a>\n              <div className=\"bg-card/70 flex h-12 items-center gap-2 rounded-2xl border pe-1.5 ps-4 text-sm backdrop-blur\" style={mono}>\n                <span className=\"text-muted-foreground\" aria-hidden=\"true\">$</span> npm i @orbit/sdk\n                <CopyButton value=\"npm i @orbit/sdk\" ariaLabel=\"Copy install command\" />\n              </div>\n            </div>\n          </div>\n          <BlurFade className=\"mx-auto mt-16 max-w-5xl\" delay={0.1}>\n            <OrbitAgentRun />\n          </BlurFade>\n        </section>\n\n        {/* Customers */}\n        <section aria-label=\"Customers\" className=\"mx-auto max-w-6xl px-4 py-14 sm:px-6\">\n          <p className=\"text-muted-foreground text-center text-sm\">Powering agents at 1,800 teams, from startups to the Fortune 100</p>\n          <Marquee className=\"mt-8\" speed={30} gap={56} fade pauseOnHover>\n            {customers.map((c) => (\n              <span key={c} className=\"text-muted-foreground/80 text-xl font-semibold tracking-tight\">{c}</span>\n            ))}\n          </Marquee>\n        </section>\n\n        {/* Tools */}\n        <section className=\"mx-auto grid max-w-6xl items-center gap-12 px-4 py-20 sm:px-6 lg:grid-cols-2 lg:gap-20\">\n          <SectionIntro eyebrow=\"01 / Tools\" title=\"Give agents hands, not just words.\">\n            Connect any API, database or browser as a typed tool. Orbit handles auth, retries, rate limits and sandboxing, so the agent only decides what to do.\n          </SectionIntro>\n          <ul className=\"grid gap-3 sm:grid-cols-2\">\n            {tools.map((t) => (\n              <li key={t.name} className=\"bg-card/60 hover:border-chart-1/40 group rounded-2xl border p-4 transition-colors\">\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-sm font-medium\" style={mono}>{t.name}</span>\n                  <span className=\"bg-chart-2 size-1.5 rounded-full\" aria-hidden=\"true\" />\n                </div>\n                <p className=\"text-muted-foreground mt-2 text-sm\">{t.scope}</p>\n                <p className=\"text-muted-foreground mt-3 text-xs tabular-nums\" style={mono}>{t.calls} calls / mo</p>\n              </li>\n            ))}\n          </ul>\n        </section>\n\n        {/* Evals */}\n        <section className=\"mx-auto grid max-w-6xl items-center gap-12 px-4 py-20 sm:px-6 lg:grid-cols-[1.1fr_1fr] lg:gap-20\">\n          <figure className=\"bg-card/60 order-2 min-w-0 rounded-3xl border p-5 sm:p-6 lg:order-1\">\n            <figcaption className=\"flex items-baseline justify-between gap-3\">\n              <span className=\"text-sm font-medium\">Task success rate</span>\n              <span className=\"text-muted-foreground text-xs\">Last 8 builds, 400 cases</span>\n            </figcaption>\n            <ChartContainer config={evalConfig} label=\"Task success rate over eight builds\" summary=\"With Orbit evals, task success climbed from 62 to 94 percent over eight builds. Without evals it stayed between 61 and 66 percent.\" className=\"mt-5 aspect-[16/10] w-full\">\n              <LineChart data={evalData} margin={{ left: 0, right: 10, top: 8 }} accessibilityLayer>\n                <CartesianGrid vertical={false} />\n                <XAxis dataKey=\"build\" tickLine={false} axisLine={false} tickMargin={8} />\n                <YAxis domain={[50, 100]} tickLine={false} axisLine={false} width={36} tickFormatter={(v: number) => `${v}%`} />\n                <ChartTooltip cursor={false} content={<ChartTooltipContent indicator=\"line\" formatter={(v) => `${v}%`} />} />\n                <Line dataKey=\"baseline\" type=\"monotone\" stroke=\"var(--color-baseline)\" strokeWidth={2} strokeDasharray=\"4 4\" dot={false} isAnimationActive={false} />\n                <Line dataKey=\"orbit\" type=\"monotone\" stroke=\"var(--color-orbit)\" strokeWidth={2.5} dot={{ r: 3 }} isAnimationActive={false} />\n                <ChartLegend content={<ChartLegendContent />} />\n              </LineChart>\n            </ChartContainer>\n          </figure>\n          <div className=\"order-1 lg:order-2\">\n            <SectionIntro eyebrow=\"02 / Evals\" title=\"Stop shipping on vibes.\">\n              Turn any trace into a test case. Run the suite on every commit, compare models side by side, and block the merge when success drops.\n            </SectionIntro>\n            <ul className=\"mt-7 space-y-3 text-sm\">\n              {[\"Replay production runs against a new prompt\", \"LLM and code graders, with human review\", \"GitHub check that fails the build on regressions\"].map((x) => (\n                <li key={x} className=\"flex items-start gap-2.5\"><Check className=\"text-chart-2 mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />{x}</li>\n              ))}\n            </ul>\n          </div>\n        </section>\n\n        {/* Traces */}\n        <section className=\"mx-auto max-w-6xl px-4 py-20 sm:px-6\">\n          <SectionIntro eyebrow=\"03 / Traces\" title=\"See every decision an agent made.\">\n            Each run is a tree you can read: prompts, tool inputs, outputs, cost and latency. Branch from any step and rerun it.\n          </SectionIntro>\n          <div className=\"bg-card/60 mt-10 overflow-hidden rounded-3xl border\" style={mono}>\n            <div className=\"text-muted-foreground flex items-center gap-2 border-b px-5 py-3 text-xs\"><GitBranch className=\"size-3.5\" aria-hidden=\"true\" /> run_8f3k2 · 5 spans · 4.7 s</div>\n            <ul className=\"divide-y text-[13px]\">\n              {[\n                { depth: 0, name: \"refund-reconciler\", ms: \"4.7 s\", w: 100, tone: \"bg-chart-2\" },\n                { depth: 1, name: \"plan\", ms: \"640 ms\", w: 14, tone: \"bg-chart-2\" },\n                { depth: 1, name: \"stripe.refunds.list\", ms: \"820 ms\", w: 18, tone: \"bg-chart-1\" },\n                { depth: 1, name: \"warehouse.query\", ms: \"1.2 s\", w: 25, tone: \"bg-chart-1\" },\n                { depth: 1, name: \"gmail.send_draft\", ms: \"1.5 s\", w: 32, tone: \"bg-chart-3\" },\n              ].map((r, i) => (\n                <li key={r.name} className=\"grid grid-cols-[1fr_5rem] items-center gap-4 px-5 py-3 sm:grid-cols-[minmax(0,16rem)_1fr_5rem]\">\n                  <span className=\"truncate\" style={{ paddingInlineStart: `${r.depth * 1.25}rem` }}>{r.name}</span>\n                  <span className=\"bg-muted/60 relative hidden h-2 overflow-hidden rounded-full sm:block\">\n                    <span className={cn(\"absolute inset-y-0 rounded-full\", r.tone)} style={{ left: `${i === 0 ? 0 : [0, 14, 32, 57][i - 1]}%`, width: `${r.w}%` }} />\n                  </span>\n                  <span className=\"text-muted-foreground text-end tabular-nums\">{r.ms}</span>\n                </li>\n              ))}\n            </ul>\n          </div>\n        </section>\n\n        {/* Stats */}\n        <section aria-label=\"Orbit in numbers\" className=\"mx-auto max-w-6xl px-4 py-16 sm:px-6\">\n          <dl className=\"grid gap-px overflow-hidden rounded-3xl border bg-border sm:grid-cols-2 lg:grid-cols-4\">\n            {[\n              { v: 4.2, suffix: \"B\", label: \"Tool calls a month\", decimals: 1 },\n              { v: 99.99, suffix: \"%\", label: \"Uptime, last 12 months\", decimals: 2 },\n              { v: 1.4, suffix: \" s\", label: \"p95 time to first action\", decimals: 1 },\n              { v: 38, suffix: \"\", label: \"Regions, including yours\", decimals: 0 },\n            ].map((s) => (\n              <div key={s.label} className=\"bg-background p-7\">\n                <dd className=\"text-4xl font-semibold tracking-[-0.04em] tabular-nums\">\n                  <NumberTicker value={s.v} format={{ minimumFractionDigits: s.decimals, maximumFractionDigits: s.decimals }} />{s.suffix}\n                </dd>\n                <dt className=\"text-muted-foreground mt-2 text-sm\">{s.label}</dt>\n              </div>\n            ))}\n          </dl>\n        </section>\n\n        {/* Security */}\n        <section className=\"mx-auto max-w-6xl px-4 py-20 sm:px-6\">\n          <SectionIntro eyebrow=\"04 / Trust\" title=\"Built for the security review.\">\n            The controls your CISO asks for are on by default, not an enterprise upsell.\n          </SectionIntro>\n          <ul className=\"mt-10 grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n            {security.map((s) => (\n              <li key={s.title} className=\"bg-card/60 rounded-2xl border p-6\">\n                <span className=\"bg-chart-1/15 text-chart-1 flex size-10 items-center justify-center rounded-xl\"><s.icon className=\"size-5\" aria-hidden=\"true\" /></span>\n                <h3 className=\"mt-5 font-medium\">{s.title}</h3>\n                <p className=\"text-muted-foreground mt-2 text-sm text-pretty\">{s.text}</p>\n              </li>\n            ))}\n          </ul>\n        </section>\n\n        {/* Quote */}\n        <section className=\"mx-auto max-w-4xl px-4 py-20 text-center sm:px-6\">\n          <blockquote>\n            <p className={cn(\"text-2xl leading-snug sm:text-4xl\", display)}>\n              “We moved 40 percent of tier-one support to agents in a quarter, and the eval suite is the reason nobody was scared to ship it.”\n            </p>\n            <footer className=\"text-muted-foreground mt-8 flex items-center justify-center gap-3 text-sm\">\n              <span className=\"bg-chart-4/25 flex size-10 items-center justify-center rounded-full font-medium text-foreground\" aria-hidden=\"true\">PN</span>\n              <span className=\"text-start\"><span className=\"text-foreground block font-medium\">Priya Nair</span>VP Engineering, Fieldly</span>\n            </footer>\n          </blockquote>\n        </section>\n\n        {/* CTA */}\n        <section className=\"px-4 pb-20 sm:px-6\">\n          <div className=\"bg-card/60 relative mx-auto max-w-5xl overflow-hidden rounded-[2rem] border px-6 py-16 text-center sm:py-20\">\n            <AuroraBackground aria-hidden=\"true\" className=\"absolute inset-0 -z-10 opacity-70\" colors={[\"var(--chart-1)\", \"var(--chart-5)\"]} intensity={0.45} radialMask />\n            <h2 className={cn(\"mx-auto max-w-2xl text-3xl sm:text-5xl\", display)}>Your first agent is ten minutes away.</h2>\n            <p className=\"text-muted-foreground mx-auto mt-4 max-w-lg text-pretty\">Free for your first 10,000 runs. No credit card, no sales call.</p>\n            <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n              <a href=\"#\" className=\"bg-foreground text-background focus-visible:ring-ring/50 inline-flex h-12 items-center gap-2 rounded-2xl px-6 font-medium outline-none transition-opacity hover:opacity-90 focus-visible:ring-[3px]\">\n                Start building <ArrowRight className=\"size-4 rtl:rotate-180\" aria-hidden=\"true\" />\n              </a>\n              <a href=\"#\" className=\"hover:bg-accent focus-visible:ring-ring/50 inline-flex h-12 items-center gap-2 rounded-2xl border px-6 font-medium outline-none transition-colors focus-visible:ring-[3px]\">\n                <Network className=\"size-4\" aria-hidden=\"true\" /> Talk to an engineer\n              </a>\n            </div>\n          </div>\n        </section>\n      </main>\n    </OrbitShell>\n  )\n}\n\nexport { OrbitHome, type OrbitHomeProps }\n",
      "type": "registry:component",
      "target": "@components/ballmac/templates/orbit/orbit-home.tsx"
    },
    {
      "path": "registry/ballmac/components/templates/orbit/orbit-pricing.tsx",
      "content": "// Ballmac UI: Orbit pricing page. https://ui.ballmac.com/templates/template-orbit\n\"use client\"\n\nimport * as React from \"react\"\nimport { Check } from \"lucide-react\"\n\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from \"@/components/ballmac/accordion\"\nimport { SegmentedControl, SegmentedControlItem } from \"@/components/ballmac/segmented-control\"\nimport { Slider } from \"@/components/ballmac/slider\"\nimport { OrbitShell, type OrbitHrefs } from \"@/components/ballmac/templates/orbit/orbit-theme\"\nimport { cn } from \"@/lib/utils\"\n\nconst mono = { fontFamily: \"var(--orbit-mono)\" } as const\nconst money = new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: \"USD\", maximumFractionDigits: 0 })\nconst moneyCents = new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: \"USD\", minimumFractionDigits: 2 })\nconst count = new Intl.NumberFormat(\"en-US\")\n\ntype Billing = \"monthly\" | \"yearly\"\n\nconst plans = [\n  { id: \"hobby\", name: \"Hobby\", price: 0, blurb: \"For side projects and learning.\", cta: \"Start free\", runs: \"10,000 runs included\", features: [\"3 agents\", \"Community tools\", \"7-day trace history\", \"Email support\"] },\n  { id: \"team\", name: \"Team\", price: 49, blurb: \"For teams shipping agents to customers.\", cta: \"Start 14-day trial\", runs: \"250,000 runs included\", features: [\"Unlimited agents\", \"Evals and GitHub checks\", \"90-day trace history\", \"Approvals and audit log\", \"Priority support\"], featured: true },\n  { id: \"scale\", name: \"Scale\", price: null, blurb: \"For regulated and high-volume workloads.\", cta: \"Talk to sales\", runs: \"Volume pricing\", features: [\"Your VPC or on-prem data plane\", \"SSO, SCIM and custom roles\", \"1-year trace retention\", \"99.99% uptime SLA\", \"Dedicated engineer\"] },\n] as const\n\nconst faqs = [\n  { q: \"What counts as a run?\", a: \"One end-to-end execution of an agent, from the first prompt to the final reply, however many tool calls or model turns it takes. Retries of the same run are free.\" },\n  { q: \"Do I pay for model tokens?\", a: \"Bring your own keys and pay your model provider directly, or use Orbit’s pooled capacity at cost plus 8 percent. Either way the bill shows tokens per run.\" },\n  { q: \"What happens when I pass my included runs?\", a: \"Nothing breaks. Extra runs are billed at the rate in the calculator, and you can set a hard monthly cap so a loop can never surprise you.\" },\n  { q: \"Can I self-host?\", a: \"The Scale plan runs the data plane in your own cloud or on-prem. The control plane stays hosted, and no prompts, tool data or secrets ever leave your network.\" },\n  { q: \"Is there a discount for startups or nonprofits?\", a: \"Yes. Startups under two years old get 50 percent off Team for a year, and verified nonprofits get 40 percent off for good.\" },\n]\n\nfunction Calculator({ billing }: { billing: Billing }) {\n  const [runs, setRuns] = React.useState(400_000)\n  const seats = 5\n  const included = 250_000\n  const extra = Math.max(0, runs - included)\n  const seatPrice = billing === \"yearly\" ? 39 : 49\n  const base = seats * seatPrice\n  // Overage gets cheaper in steps: $2.00 per thousand to 1M, then $1.40.\n  const tier1 = Math.min(extra, 750_000)\n  const tier2 = Math.max(0, extra - 750_000)\n  const overage = (tier1 / 1000) * 2 + (tier2 / 1000) * 1.4\n  const total = base + overage\n  return (\n    <section aria-labelledby=\"orbit-calc\" className=\"bg-card/60 mx-auto mt-16 max-w-5xl rounded-3xl border p-6 sm:p-10\">\n      <div className=\"grid gap-10 lg:grid-cols-[1.2fr_1fr] lg:gap-14\">\n        <div>\n          <h2 id=\"orbit-calc\" className=\"text-2xl font-semibold tracking-[-0.03em]\">Estimate your bill</h2>\n          <p className=\"text-muted-foreground mt-2 text-sm text-pretty\">Team plan for {seats} seats. Drag to see how overage scales.</p>\n          <div className=\"mt-10\">\n            <div className=\"flex items-baseline justify-between text-sm\">\n              <label id=\"orbit-runs-label\" className=\"text-muted-foreground\">Runs per month</label>\n              <output className=\"text-xl font-medium tabular-nums\" style={mono} aria-live=\"polite\">{count.format(runs)}</output>\n            </div>\n            <Slider className=\"mt-5\" aria-labelledby=\"orbit-runs-label\" min={50_000} max={2_000_000} step={50_000} value={[runs]} onValueChange={(v) => setRuns(v[0] ?? runs)} formatValue={(v) => `${count.format(v)} runs`} />\n            <div className=\"text-muted-foreground mt-2 flex justify-between text-xs tabular-nums\" style={mono}><span>50k</span><span>2M</span></div>\n          </div>\n        </div>\n        <div className=\"bg-background/60 space-y-3 rounded-2xl border p-5 text-sm\">\n          <dl className=\"space-y-3\">\n            <div className=\"flex justify-between gap-4\"><dt className=\"text-muted-foreground\">{seats} seats × {money.format(seatPrice)}</dt><dd className=\"tabular-nums\" style={mono}>{money.format(base)}</dd></div>\n            <div className=\"flex justify-between gap-4\"><dt className=\"text-muted-foreground\">{count.format(included)} runs included</dt><dd className=\"tabular-nums\" style={mono}>$0</dd></div>\n            <div className=\"flex justify-between gap-4\"><dt className=\"text-muted-foreground\">{count.format(extra)} extra runs</dt><dd className=\"tabular-nums\" style={mono}>{moneyCents.format(overage)}</dd></div>\n            <div className=\"flex items-baseline justify-between gap-4 border-t pt-4\"><dt className=\"font-medium\">Estimated per month</dt><dd className=\"text-3xl font-semibold tracking-[-0.03em] tabular-nums\">{money.format(total)}</dd></div>\n          </dl>\n          <p className=\"text-muted-foreground text-xs\">Model tokens are billed by your provider. Set a hard cap in settings.</p>\n        </div>\n      </div>\n    </section>\n  )\n}\n\ntype OrbitPricingProps = React.ComponentProps<\"div\"> & { hrefs?: Partial<OrbitHrefs> }\n\n/** Orbit pricing: three plans with a monthly and yearly switch, a usage calculator and common questions. */\nfunction OrbitPricing({ hrefs, ...props }: OrbitPricingProps) {\n  const [billing, setBilling] = React.useState<Billing>(\"yearly\")\n  return (\n    <OrbitShell page=\"pricing\" hrefs={hrefs} {...props}>\n      <main className=\"px-4 pt-16 pb-20 sm:px-6 sm:pt-24\">\n        <div className=\"mx-auto max-w-3xl text-center\">\n          <p className=\"text-chart-1 text-sm font-medium\" style={mono}>Pricing</p>\n          <h1 className=\"mt-3 text-4xl font-semibold tracking-[-0.045em] text-balance sm:text-6xl\">Pay for runs, not for hope.</h1>\n          <p className=\"text-muted-foreground mt-5 text-lg text-pretty\">Start free, then grow into seats and volume. Every plan includes traces, tools and the full SDK.</p>\n          <SegmentedControl aria-label=\"Billing period\" value={billing} onValueChange={(v) => setBilling(v as Billing)} className=\"mt-9\">\n            <SegmentedControlItem value=\"monthly\">Monthly</SegmentedControlItem>\n            <SegmentedControlItem value=\"yearly\">Yearly · save 20%</SegmentedControlItem>\n          </SegmentedControl>\n        </div>\n\n        <div className=\"mx-auto mt-12 grid max-w-6xl gap-4 lg:grid-cols-3\">\n          {plans.map((p) => {\n            const price = p.price === null ? null : p.price === 0 ? 0 : billing === \"yearly\" ? Math.round(p.price * 0.8) : p.price\n            return (\n              <article key={p.id} className={cn(\"bg-card/60 relative flex flex-col rounded-3xl border p-7\", \"featured\" in p && p.featured && \"border-chart-1/60 shadow-[0_30px_80px_-40px_oklch(0.6_0.2_285/0.7)]\")}>\n                {\"featured\" in p && p.featured && <span className=\"bg-chart-1 text-background absolute -top-3 start-7 rounded-full px-3 py-0.5 text-xs font-medium\">Most popular</span>}\n                <h2 className=\"text-lg font-semibold\">{p.name}</h2>\n                <p className=\"text-muted-foreground mt-1 text-sm text-pretty\">{p.blurb}</p>\n                <p className=\"mt-6 flex items-baseline gap-1.5\">\n                  {price === null ? <span className=\"text-4xl font-semibold tracking-[-0.04em]\">Custom</span> : (\n                    <>\n                      <span className=\"text-5xl font-semibold tracking-[-0.045em] tabular-nums\">{money.format(price)}</span>\n                      <span className=\"text-muted-foreground text-sm\">{price === 0 ? \"forever\" : \"per seat / month\"}</span>\n                    </>\n                  )}\n                </p>\n                <p className=\"text-muted-foreground mt-2 text-sm\" style={mono}>{p.runs}</p>\n                <a href=\"#\" className={cn(\"focus-visible:ring-ring/50 mt-6 inline-flex h-11 items-center justify-center rounded-xl text-sm font-medium outline-none transition-opacity focus-visible:ring-[3px]\", \"featured\" in p && p.featured ? \"bg-foreground text-background hover:opacity-90\" : \"hover:bg-accent border\")}>{p.cta}</a>\n                <ul className=\"mt-7 space-y-3 border-t pt-6 text-sm\">\n                  {p.features.map((f) => (\n                    <li key={f} className=\"flex items-start gap-2.5\"><Check className=\"text-chart-2 mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />{f}</li>\n                  ))}\n                </ul>\n              </article>\n            )\n          })}\n        </div>\n\n        <Calculator billing={billing} />\n\n        <section className=\"mx-auto mt-24 max-w-3xl\" aria-labelledby=\"orbit-faq\">\n          <h2 id=\"orbit-faq\" className=\"text-3xl font-semibold tracking-[-0.04em]\">Questions, answered</h2>\n          <Accordion type=\"single\" collapsible className=\"mt-6\">\n            {faqs.map((f) => (\n              <AccordionItem key={f.q} value={f.q}>\n                <AccordionTrigger className=\"text-base\">{f.q}</AccordionTrigger>\n                <AccordionContent className=\"text-muted-foreground text-pretty\">{f.a}</AccordionContent>\n              </AccordionItem>\n            ))}\n          </Accordion>\n        </section>\n      </main>\n    </OrbitShell>\n  )\n}\n\nexport { OrbitPricing, type OrbitPricingProps }\n",
      "type": "registry:component",
      "target": "@components/ballmac/templates/orbit/orbit-pricing.tsx"
    },
    {
      "path": "registry/ballmac/components/templates/orbit/orbit-changelog.tsx",
      "content": "// Ballmac UI: Orbit changelog page. https://ui.ballmac.com/templates/template-orbit\nimport * as React from \"react\"\nimport { Rss } from \"lucide-react\"\n\nimport { ChangelogFeed, type ChangelogEntry } from \"@/components/ballmac/changelog-feed\"\nimport { OrbitShell, type OrbitHrefs } from \"@/components/ballmac/templates/orbit/orbit-theme\"\n\nconst entries: ChangelogEntry[] = [\n  {\n    id: \"2-4\",\n    version: \"2.4\",\n    date: \"2026-09-24\",\n    title: \"Computer use is generally available\",\n    summary: \"Agents can now see a screen, click, type and extract data from any web app, inside a sandboxed browser you control.\",\n    changes: [\n      { type: \"new\", text: \"Browser tool with screenshots, DOM snapshots and a full action trace.\" },\n      { type: \"new\", text: \"Session recording: replay what the agent saw, frame by frame.\" },\n      { type: \"improved\", text: \"Approvals can now be routed to Slack channels by risk level.\" },\n      { type: \"fixed\", text: \"Long-running runs no longer lose their cost counter after a deploy.\" },\n    ],\n  },\n  {\n    id: \"2-3\",\n    version: \"2.3\",\n    date: \"2026-08-27\",\n    title: \"Evals as GitHub checks\",\n    summary: \"Every pull request can now run your eval suite and block the merge when success rate drops.\",\n    changes: [\n      { type: \"new\", text: \"GitHub app with per-case results and a diff against main.\" },\n      { type: \"new\", text: \"Model comparison view: run one dataset against three models.\" },\n      { type: \"improved\", text: \"LLM graders accept a rubric and return a rationale you can edit.\" },\n      { type: \"removed\", text: \"The v1 evaluation endpoints, deprecated in March.\" },\n    ],\n  },\n  {\n    id: \"2-2\",\n    version: \"2.2\",\n    date: \"2026-07-30\",\n    title: \"Bring your own cloud\",\n    summary: \"Run the data plane in your VPC. Prompts, tool data and secrets never leave your network.\",\n    changes: [\n      { type: \"new\", text: \"Terraform module for AWS, GCP and Azure.\" },\n      { type: \"improved\", text: \"Traces load 3x faster for runs over 500 spans.\" },\n      { type: \"fixed\", text: \"Tool retries respected the wrong backoff when the API returned Retry-After.\" },\n    ],\n  },\n  {\n    id: \"2-1\",\n    version: \"2.1\",\n    date: \"2026-06-26\",\n    title: \"Branch any trace\",\n    changes: [\n      { type: \"new\", text: \"Branch a run from any step, edit the input and compare outcomes.\" },\n      { type: \"improved\", text: \"SDK streams partial tool results to your UI.\" },\n      { type: \"fixed\", text: \"Python SDK now cancels in-flight tool calls on Ctrl+C.\" },\n    ],\n  },\n]\n\ntype OrbitChangelogProps = React.ComponentProps<\"div\"> & { hrefs?: Partial<OrbitHrefs> }\n\n/** Orbit changelog: a filterable release feed under a calm header. */\nfunction OrbitChangelog({ hrefs, ...props }: OrbitChangelogProps) {\n  return (\n    <OrbitShell page=\"changelog\" hrefs={hrefs} {...props}>\n      <main className=\"mx-auto max-w-3xl px-4 pt-16 pb-24 sm:px-6 sm:pt-24\">\n        <p className=\"text-chart-1 text-sm font-medium\" style={{ fontFamily: \"var(--orbit-mono)\" }}>Changelog</p>\n        <div className=\"mt-3 flex flex-wrap items-end justify-between gap-4\">\n          <h1 className=\"text-4xl font-semibold tracking-[-0.045em] text-balance sm:text-6xl\">What we shipped.</h1>\n          <a href=\"#\" className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 inline-flex items-center gap-2 rounded-lg text-sm outline-none focus-visible:ring-[3px]\">\n            <Rss className=\"size-4\" aria-hidden=\"true\" /> RSS\n          </a>\n        </div>\n        <p className=\"text-muted-foreground mt-5 max-w-xl text-lg text-pretty\">New releases land every month. Breaking changes are announced 90 days ahead.</p>\n        <ChangelogFeed className=\"mt-12\" entries={entries} filterable />\n      </main>\n    </OrbitShell>\n  )\n}\n\nexport { OrbitChangelog, type OrbitChangelogProps }\n",
      "type": "registry:component",
      "target": "@components/ballmac/templates/orbit/orbit-changelog.tsx"
    },
    {
      "path": "registry/ballmac/components/templates/orbit/orbit-login.tsx",
      "content": "// Ballmac UI: Orbit sign-in page. https://ui.ballmac.com/templates/template-orbit\n\"use client\"\n\nimport * as React from \"react\"\nimport { ArrowRight, Check } from \"lucide-react\"\n\nimport { OrbitMark, OrbitShell, type OrbitHrefs } from \"@/components/ballmac/templates/orbit/orbit-theme\"\n\nconst mono = { fontFamily: \"var(--orbit-mono)\" } as const\n\ntype OrbitLoginProps = React.ComponentProps<\"div\"> & { hrefs?: Partial<OrbitHrefs> }\n\n/** Orbit sign-in: a focused form beside a live-looking trace. */\nfunction OrbitLogin({ hrefs, ...props }: OrbitLoginProps) {\n  const [sent, setSent] = React.useState(false)\n  const [email, setEmail] = React.useState(\"\")\n  const home = hrefs?.home ?? \"/orbit\"\n  return (\n    <OrbitShell page=\"login\" hrefs={hrefs} bare {...props}>\n      <main className=\"grid min-h-dvh lg:grid-cols-2\">\n        <div className=\"flex flex-col px-6 py-8 sm:px-12\">\n          <a href={home} className=\"focus-visible:ring-ring/50 flex w-fit items-center gap-2 rounded-md font-semibold tracking-tight outline-none focus-visible:ring-[3px]\"><OrbitMark /> Orbit</a>\n          <div className=\"mx-auto flex w-full max-w-sm flex-1 flex-col justify-center py-12\">\n            {sent ? (\n              <div role=\"status\">\n                <span className=\"bg-chart-2/15 text-chart-2 flex size-12 items-center justify-center rounded-2xl\"><Check className=\"size-6\" aria-hidden=\"true\" /></span>\n                <h1 className=\"mt-6 text-3xl font-semibold tracking-[-0.04em]\">Check your inbox</h1>\n                <p className=\"text-muted-foreground mt-3 text-pretty\">We sent a sign-in link to <span className=\"text-foreground font-medium\">{email}</span>. It works for 15 minutes.</p>\n                <button type=\"button\" onClick={() => setSent(false)} className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 mt-6 rounded-md text-sm underline underline-offset-4 outline-none focus-visible:ring-[3px]\">Use a different email</button>\n              </div>\n            ) : (\n              <>\n                <h1 className=\"text-3xl font-semibold tracking-[-0.04em]\">Welcome back</h1>\n                <p className=\"text-muted-foreground mt-2\">Sign in to your Orbit workspace.</p>\n                <button type=\"button\" className=\"hover:bg-accent focus-visible:ring-ring/50 mt-8 inline-flex h-11 items-center justify-center gap-2.5 rounded-xl border text-sm font-medium outline-none transition-colors focus-visible:ring-[3px]\">\n                  <svg viewBox=\"0 0 24 24\" className=\"size-4\" aria-hidden=\"true\" fill=\"currentColor\"><path d=\"M12 .5a11.5 11.5 0 0 0-3.64 22.41c.58.1.79-.25.79-.56v-2c-3.2.7-3.88-1.54-3.88-1.54-.52-1.33-1.28-1.69-1.28-1.69-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.19 1.76 1.19 1.03 1.76 2.7 1.25 3.36.96.1-.75.4-1.25.73-1.54-2.55-.29-5.24-1.28-5.24-5.69 0-1.26.45-2.28 1.18-3.09-.12-.29-.51-1.46.11-3.05 0 0 .97-.31 3.17 1.18a11 11 0 0 1 5.77 0c2.2-1.49 3.17-1.18 3.17-1.18.62 1.59.23 2.76.11 3.05.74.81 1.18 1.83 1.18 3.09 0 4.42-2.69 5.39-5.25 5.68.41.36.78 1.06.78 2.14v3.17c0 .31.21.67.8.56A11.5 11.5 0 0 0 12 .5Z\" /></svg>\n                  Continue with GitHub\n                </button>\n                <div className=\"text-muted-foreground my-6 flex items-center gap-3 text-xs\"><span className=\"bg-border h-px flex-1\" />or with email<span className=\"bg-border h-px flex-1\" /></div>\n                <form\n                  onSubmit={(e) => {\n                    e.preventDefault()\n                    if (email.trim()) setSent(true)\n                  }}\n                >\n                  <label htmlFor=\"orbit-email\" className=\"text-sm font-medium\">Work email</label>\n                  <input\n                    id=\"orbit-email\"\n                    type=\"email\"\n                    required\n                    autoComplete=\"email\"\n                    value={email}\n                    onChange={(e) => setEmail(e.target.value)}\n                    placeholder=\"you@company.com\"\n                    className=\"bg-card/60 focus-visible:ring-ring/50 placeholder:text-muted-foreground mt-2 h-11 w-full rounded-xl border px-3.5 text-sm outline-none focus-visible:ring-[3px]\"\n                  />\n                  <button type=\"submit\" className=\"bg-foreground text-background focus-visible:ring-ring/50 mt-4 inline-flex h-11 w-full items-center justify-center gap-2 rounded-xl text-sm font-medium outline-none transition-opacity hover:opacity-90 focus-visible:ring-[3px]\">\n                    Email me a sign-in link <ArrowRight className=\"size-4 rtl:rotate-180\" aria-hidden=\"true\" />\n                  </button>\n                </form>\n                <p className=\"text-muted-foreground mt-6 text-xs text-pretty\">New to Orbit? Signing in creates your workspace. By continuing you agree to the Terms and Privacy Policy.</p>\n              </>\n            )}\n          </div>\n        </div>\n\n        <div aria-hidden=\"true\" className=\"bg-surface relative hidden overflow-hidden border-s lg:block\">\n          <div className=\"from-chart-1/25 to-chart-5/10 absolute inset-0 bg-gradient-to-br via-transparent\" />\n          <div className=\"relative flex h-full flex-col justify-center gap-4 px-14\">\n            {[\n              { t: \"09:41:02\", n: \"refund-reconciler\", s: \"completed\", tone: \"text-chart-2\" },\n              { t: \"09:41:00\", n: \"stripe.refunds.list\", s: \"214 rows\", tone: \"text-chart-1\" },\n              { t: \"09:40:58\", n: \"support-triage\", s: \"approval needed\", tone: \"text-chart-3\" },\n              { t: \"09:40:55\", n: \"warehouse.query\", s: \"208 matched\", tone: \"text-chart-1\" },\n              { t: \"09:40:51\", n: \"onboarding-guide\", s: \"completed\", tone: \"text-chart-2\" },\n            ].map((r, i) => (\n              <div key={r.t} className=\"bg-card/70 flex items-center justify-between rounded-2xl border px-5 py-4 text-sm backdrop-blur\" style={{ ...mono, marginInlineStart: `${(i % 3) * 1.5}rem`, opacity: 1 - i * 0.14 }}>\n                <span className=\"text-muted-foreground\">{r.t}</span>\n                <span>{r.n}</span>\n                <span className={r.tone}>{r.s}</span>\n              </div>\n            ))}\n            <p className=\"text-muted-foreground mt-6 max-w-sm text-lg text-pretty\">“Orbit is the first agent platform our security team signed off on in a week.”</p>\n          </div>\n        </div>\n      </main>\n    </OrbitShell>\n  )\n}\n\nexport { OrbitLogin, type OrbitLoginProps }\n",
      "type": "registry:component",
      "target": "@components/ballmac/templates/orbit/orbit-login.tsx"
    },
    {
      "path": "registry/ballmac/app/orbit/page.tsx",
      "content": "// Ballmac UI: Orbit template route. https://ui.ballmac.com/templates/template-orbit\nimport type { Metadata } from \"next\"\n\nimport { OrbitHome } from \"@/components/ballmac/templates/orbit/orbit-home\"\n\nexport const metadata: Metadata = {\n  title: \"Orbit: Agents that finish the job\",\n  description: \"Build, test and run AI agents with tools, evals and guardrails.\",\n}\n\nexport default function Page() {\n  return <OrbitHome />\n}\n",
      "type": "registry:page",
      "target": "app/orbit/page.tsx"
    },
    {
      "path": "registry/ballmac/app/orbit/pricing/page.tsx",
      "content": "// Ballmac UI: Orbit template route. https://ui.ballmac.com/templates/template-orbit\nimport type { Metadata } from \"next\"\n\nimport { OrbitPricing } from \"@/components/ballmac/templates/orbit/orbit-pricing\"\n\nexport const metadata: Metadata = {\n  title: \"Orbit pricing\",\n  description: \"Pay for runs, not for hope. Start free and grow into seats and volume.\",\n}\n\nexport default function Page() {\n  return <OrbitPricing />\n}\n",
      "type": "registry:page",
      "target": "app/orbit/pricing/page.tsx"
    },
    {
      "path": "registry/ballmac/app/orbit/changelog/page.tsx",
      "content": "// Ballmac UI: Orbit template route. https://ui.ballmac.com/templates/template-orbit\nimport type { Metadata } from \"next\"\n\nimport { OrbitChangelog } from \"@/components/ballmac/templates/orbit/orbit-changelog\"\n\nexport const metadata: Metadata = {\n  title: \"Orbit changelog\",\n  description: \"Everything we shipped, month by month.\",\n}\n\nexport default function Page() {\n  return <OrbitChangelog />\n}\n",
      "type": "registry:page",
      "target": "app/orbit/changelog/page.tsx"
    },
    {
      "path": "registry/ballmac/app/orbit/login/page.tsx",
      "content": "// Ballmac UI: Orbit template route. https://ui.ballmac.com/templates/template-orbit\nimport type { Metadata } from \"next\"\n\nimport { OrbitLogin } from \"@/components/ballmac/templates/orbit/orbit-login\"\n\nexport const metadata: Metadata = {\n  title: \"Sign in to Orbit\",\n  description: \"Sign in to your Orbit workspace.\",\n}\n\nexport default function Page() {\n  return <OrbitLogin />\n}\n",
      "type": "registry:page",
      "target": "app/orbit/login/page.tsx"
    }
  ],
  "meta": {
    "schema": 1,
    "tier": "free",
    "tags": [
      "template",
      "ai",
      "agents",
      "saas",
      "dark",
      "landing page",
      "pricing",
      "changelog"
    ],
    "version": "1.0.0",
    "updated": "2026-10-01",
    "ai": {
      "summary": "Installs a four-page dark site for an AI product. Change the palette in orbit-theme.tsx (orbitVars), the copy in each page file, and the agent-run script (steps) in orbit-agent-run.tsx.",
      "whenToUse": [
        "Marketing sites for AI agents, LLM tooling or developer platforms",
        "A dark, high-contrast brand with a live product demo in the hero"
      ],
      "whenNotToUse": [
        "Light, editorial brands (a Northwind-style template)",
        "Mac app landing pages (a Ledger-style template)"
      ],
      "composesWith": [
        "pricing-3",
        "changelog-1",
        "faq-2"
      ],
      "a11y": [],
      "customization": [
        "Edit orbitVars for the palette",
        "Edit steps in OrbitAgentRun to script your own demo run",
        "Swap fonts in orbit-fonts.ts"
      ]
    },
    "examples": [
      "template-orbit-demo",
      "template-orbit-pricing",
      "template-orbit-changelog",
      "template-orbit-login"
    ],
    "url": "https://ui.ballmac.com/components/template-orbit"
  },
  "docs": "Pages are at /orbit, /orbit/pricing, /orbit/changelog and /orbit/login. The palette lives in orbit-theme.tsx (orbitVars); fonts load through next/font in orbit-fonts.ts.",
  "categories": [
    "templates"
  ],
  "type": "registry:block"
}