# Personal hero

> Personal introduction with availability status, social links and a scrolling list of tools. Made for portfolios.

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

- Page, with a live preview: https://shadcn.exchange/r/balick/hero-03
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/balick/hero-03-light-c4edf7f359c72213.png
- Registry item: https://ui.balick.me/r/hero-03.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-03.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/marquee.json`, `https://ui.balick.me/r/section.json`, `https://ui.balick.me/r/social-icons.json`, `https://ui.balick.me/r/status-dot.json`

## Files

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

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

import { Button } from "@/components/ui/button"
import { BlurFade } from "@/registry/balick/ui/blur-fade"
import { Marquee } from "@/registry/balick/ui/marquee"
import { Section } from "@/registry/balick/ui/section"
import { GitHubIcon, LinkedInIcon, XIcon } from "@/registry/balick/ui/social-icons"
import { StatusDot } from "@/registry/balick/ui/status-dot"

const person = {
  name: "Alex Morgan",
  status: "Available for new projects",
  title: "Frontend developer crafting fast, memorable interfaces.",
  description:
    "I design and build web products with a sharp eye for detail, from design systems to production-ready apps.",
  location: "Remote · Lisbon",
  primary: { label: "View projects", href: "#" },
  secondary: { label: "Get in touch", href: "#" },
}

const socials = [
  { name: "GitHub", icon: GitHubIcon, href: "#" },
  { name: "LinkedIn", icon: LinkedInIcon, href: "#" },
  { name: "X", icon: XIcon, href: "#" },
]

const stack = ["React", "Next.js", "TypeScript", "Tailwind CSS", "Motion", "Node.js", "Figma"]

export function Hero03({ id = "hero" }: { id?: string }) {
  return (
    <Section id={id} spacing="none">
      <div className="flex flex-col items-start pt-24 pb-16 sm:pt-32">
        <BlurFade>
          <p className="inline-flex items-center gap-2 rounded-full border py-1 pr-3 pl-2.5 text-xs text-muted-foreground">
            <StatusDot />
            {person.status}
          </p>
        </BlurFade>
        <BlurFade delay={0.1}>
          <p className="mt-8 font-mono text-sm text-muted-foreground">{person.name}</p>
        </BlurFade>
        <BlurFade delay={0.15}>
          <h1 className="mt-3 max-w-4xl text-5xl font-semibold tracking-tighter text-balance sm:text-6xl md:text-7xl">
            {person.title}
          </h1>
        </BlurFade>
        <BlurFade delay={0.25}>
          <p className="mt-6 max-w-xl text-lg text-balance text-muted-foreground">
            {person.description}
          </p>
        </BlurFade>
        <BlurFade delay={0.35} className="mt-10 flex flex-wrap items-center gap-3">
          <Button size="lg" asChild>
            <a href={person.primary.href}>
              {person.primary.label}
              <ArrowRight className="size-4" />
            </a>
          </Button>
          <Button size="lg" variant="outline" asChild>
            <a href={person.secondary.href}>{person.secondary.label}</a>
          </Button>
        </BlurFade>
        <BlurFade delay={0.45} className="mt-10 flex flex-wrap items-center gap-x-6 gap-y-3">
          <ul className="-ml-2 flex items-center gap-1">
            {socials.map(({ name, icon: Icon, href }) => (
              <li key={name}>
                <a
                  href={href}
                  aria-label={name}
                  className="inline-flex size-9 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
                >
                  <Icon className="size-4" />
                </a>
              </li>
            ))}
          </ul>
          <p className="flex items-center gap-1.5 text-sm text-muted-foreground">
            <MapPin className="size-4" aria-hidden />
            {person.location}
          </p>
        </BlurFade>
      </div>
      <div className="border-t pt-8 pb-24 sm:pb-32">
        <p className="font-mono text-xs tracking-wider text-muted-foreground uppercase">
          Tools I work with
        </p>
        <Marquee fade duration="30s" gap="2.5rem" className="mt-4 -mx-2">
          {stack.map((tool) => (
            <span key={tool} className="text-lg font-medium whitespace-nowrap text-muted-foreground">
              {tool}
            </span>
          ))}
        </Marquee>
      </div>
    </Section>
  )
}
```
