# Split hero with deploy terminal

> Left-aligned hero with key figures and an animated deploy terminal. No logo strip, so it pairs with logos-01.

A shadcn/ui block from the [@balick](https://ui.balick.me) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/balick/hero-02).

- Page, with a live preview: https://shadcn.exchange/r/balick/hero-02
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/balick/hero-02-light-8883c5bc617365d6.png
- Registry item: https://ui.balick.me/r/hero-02.json
- Categories: hero
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://ui.balick.me/r/hero-02.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `lucide-react`
- Registry items: `button`, `https://ui.balick.me/r/blur-fade.json`, `https://ui.balick.me/r/section.json`, `https://ui.balick.me/r/status-dot.json`

## Files

### `registry/balick/blocks/hero-02/hero-02.tsx`

```tsx
import { ArrowRight, Check } from "lucide-react"

import { Button } from "@/components/ui/button"
import { BlurFade } from "@/registry/balick/ui/blur-fade"
import { Section } from "@/registry/balick/ui/section"
import { StatusDot } from "@/registry/balick/ui/status-dot"

const content = {
  badge: { label: "New", text: "Preview deployments for every branch", href: "#" },
  title: "Deploy with total confidence.",
  description:
    "Every push is built, checked and shipped to the edge in seconds. Roll back in one click if anything looks off.",
  primary: { label: "Start deploying", href: "#" },
  secondary: { label: "Read the docs", href: "#" },
}

const stats = [
  { value: "14s", label: "Median build" },
  { value: "312", label: "Edge locations" },
  { value: "99.99%", label: "Uptime" },
]

const log = [
  { text: "Build completed in 14s", done: true },
  { text: "142 checks passed", done: true },
  { text: "Deployed to 312 edge locations", done: true },
]

function DeployTerminal() {
  return (
    <div className="relative">
      <div className="overflow-hidden rounded-xl border bg-card shadow-[0_24px_64px_-24px_rgb(0_0_0/0.25)]">
        <div className="flex h-10 items-center gap-1.5 border-b px-4">
          <span className="size-2.5 rounded-full bg-foreground/15" />
          <span className="size-2.5 rounded-full bg-foreground/15" />
          <span className="size-2.5 rounded-full bg-foreground/15" />
          <span className="ml-3 font-mono text-xs text-muted-foreground">~/acme</span>
        </div>
        {/* Bottom padding leaves room for the floating status card. */}
        <div className="flex flex-col gap-3 px-5 pt-5 pb-14 font-mono text-[13px] leading-5 sm:px-6 sm:pt-6">
          <p>
            <span className="text-muted-foreground">$</span> acme deploy --prod
          </p>
          {log.map((line, i) => (
            <BlurFade key={line.text} delay={0.5 + i * 0.15} direction="left" offset={6}>
              <p className="flex items-center gap-2 text-muted-foreground">
                <Check className="size-3.5 text-foreground" aria-hidden />
                {line.text}
              </p>
            </BlurFade>
          ))}
          <BlurFade delay={0.95} direction="left" offset={6}>
            <p className="flex flex-wrap items-center gap-x-2">
              <ArrowRight className="size-3.5" aria-hidden />
              <span className="underline underline-offset-4">acme.com</span>
              <span className="rounded bg-foreground px-1.5 text-[11px] leading-5 text-background">
                Ready
              </span>
            </p>
          </BlurFade>
        </div>
      </div>
      <BlurFade
        delay={1.1}
        offset={12}
        className="absolute -bottom-6 left-4 sm:-left-6"
      >
        <div className="flex items-center gap-3 rounded-lg border bg-card px-4 py-3">
          <StatusDot />
          <div className="text-xs">
            <p className="font-medium">Preview ready</p>
            <p className="text-muted-foreground">feat/checkout · 32s ago</p>
          </div>
        </div>
      </BlurFade>
    </div>
  )
}

export function Hero02({ id = "hero" }: { id?: string }) {
  return (
    <Section id={id} spacing="none">
      <div className="grid grid-cols-1 items-center gap-16 py-24 sm:py-32 lg:grid-cols-2">
        <div className="flex flex-col items-start">
          <BlurFade>
            <a
              href={content.badge.href}
              className="inline-flex items-center gap-2 rounded-full border bg-card py-1 pr-3 pl-1 text-xs transition-colors hover:bg-accent"
            >
              <span className="rounded-full bg-foreground px-2 py-0.5 font-medium text-background">
                {content.badge.label}
              </span>
              <span className="text-muted-foreground">{content.badge.text}</span>
              <ArrowRight className="size-3 text-muted-foreground" />
            </a>
          </BlurFade>
          <BlurFade delay={0.1}>
            <h1 className="mt-8 text-5xl font-semibold tracking-tighter text-balance sm:text-6xl md:text-7xl">
              {content.title}
            </h1>
          </BlurFade>
          <BlurFade delay={0.2}>
            <p className="mt-6 max-w-lg text-lg text-balance text-muted-foreground">
              {content.description}
            </p>
          </BlurFade>
          <BlurFade delay={0.3} className="mt-10 flex flex-wrap gap-3">
            <Button size="lg" asChild>
              <a href={content.primary.href}>
                {content.primary.label}
                <ArrowRight className="size-4" />
              </a>
            </Button>
            <Button size="lg" variant="outline" asChild>
              <a href={content.secondary.href}>{content.secondary.label}</a>
            </Button>
          </BlurFade>
          <BlurFade delay={0.4} className="mt-12 w-full">
            <dl className="grid max-w-md grid-cols-3 divide-x border-y">
              {stats.map((stat) => (
                <div key={stat.label} className="px-4 py-4 first:pl-0">
                  <dt className="text-xs text-muted-foreground">{stat.label}</dt>
                  <dd className="mt-1 text-xl font-semibold tracking-tight">{stat.value}</dd>
                </div>
              ))}
            </dl>
          </BlurFade>
        </div>
        <BlurFade delay={0.35} offset={24} className="pb-6 lg:pl-6">
          <DeployTerminal />
        </BlurFade>
      </div>
    </Section>
  )
}
```
