Hero 9: a tree of particles
A calm, memorable hero: a tree of points grows from the bottom of the section and the message sits above it. No photo needed, theme aware, still under reduced motion.
// Ballmac UI: Hero 9. https://ui.ballmac.com/blocks/hero-9
import * as React from "react"
import { ArrowRight } from "lucide-react"
import { ParticleTree } from "@/components/ballmac/particle-tree"
import { buttonVariants } from "@/components/ballmac/button"
import { cn } from "@/lib/utils"
type Action = { label: string; href: string }
type Hero9Props = Omit<React.ComponentProps<"section">, "title"> & {
/** A short label above the headline. */
eyebrow?: string
title?: string
description?: string
primaryAction?: Action
secondaryAction?: Action
/** A line under the buttons, for example a license or a promise. */
note?: string
/** Changes the shape of the tree behind the text. */
seed?: number
}
/**
* A hero for products that want a calm, memorable picture: a tree of points grows from the bottom of the section and the message sits above it. It needs no photo,
* follows the theme (it looks best on dark), and the tree is decoration that stays still under reduced motion.
*/
function Hero9({
eyebrow = "Now in public beta",
title = "Software that grows with you",
description = "A calm workspace for plans, decisions and the agents that help carry them out.",
primaryAction = { label: "Get started", href: "#" },
secondaryAction = { label: "Read the docs", href: "#" },
note = "Free for small teams. No card needed.",
seed = 7,
className,
...props
}: Hero9Props) {
const id = React.useId()
return (
<section data-slot="hero-9" aria-labelledby={`${id}-title`} className={cn("bg-background text-foreground relative isolate flex min-h-[800px] w-full flex-col items-center overflow-hidden px-4 pt-20 pb-72 text-center sm:px-6 sm:pt-24", className)} {...props}>
<ParticleTree className="-z-10" seed={seed} />
<div aria-hidden="true" className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-2/3 bg-gradient-to-b from-background via-background/80 to-transparent" />
{eyebrow && (
<p className="text-muted-foreground inline-flex items-center gap-2 rounded-full border bg-background/60 px-3 py-1 text-xs font-medium backdrop-blur">
<span className="bg-chart-1 size-1.5 rounded-full" aria-hidden="true" />
{eyebrow}
</p>
)}
<h1 id={`${id}-title`} className="mt-6 max-w-3xl text-4xl leading-[1.05] font-semibold tracking-[-0.04em] text-balance sm:text-6xl">{title}</h1>
<p className="text-muted-foreground mt-5 max-w-xl text-base leading-relaxed text-pretty sm:text-lg">{description}</p>
<div className="mt-8 flex flex-wrap items-center justify-center gap-3">
<a href={primaryAction.href} className={buttonVariants({ shape: "pill", size: "lg" })}>
{primaryAction.label}
<ArrowRight aria-hidden="true" className="rtl:-scale-x-100" />
</a>
<a href={secondaryAction.href} className={buttonVariants({ shape: "pill", size: "lg", variant: "outline" })}>{secondaryAction.label}</a>
</div>
{note && <p className="text-muted-foreground mt-4 text-sm">{note}</p>}
</section>
)
}
export { Hero9, type Hero9Props }Installation
$ pnpm dlx shadcn@latest add @ballmac/hero-9Install the dependencies.
$ pnpm add lucide-reactAdd the Ballmac items it builds on.
$ pnpm dlx shadcn@latest add @ballmac/button @ballmac/particle-treeCopy the source into your project.
components/ballmac/blocks/hero-9/hero-9.tsx// Ballmac UI: Hero 9. https://ui.ballmac.com/blocks/hero-9 import * as React from "react" import { ArrowRight } from "lucide-react" import { ParticleTree } from "@/components/ballmac/particle-tree" import { buttonVariants } from "@/components/ballmac/button" import { cn } from "@/lib/utils" type Action = { label: string; href: string } type Hero9Props = Omit<React.ComponentProps<"section">, "title"> & { /** A short label above the headline. */ eyebrow?: string title?: string description?: string primaryAction?: Action secondaryAction?: Action /** A line under the buttons, for example a license or a promise. */ note?: string /** Changes the shape of the tree behind the text. */ seed?: number } /** * A hero for products that want a calm, memorable picture: a tree of points grows from the bottom of the section and the message sits above it. It needs no photo, * follows the theme (it looks best on dark), and the tree is decoration that stays still under reduced motion. */ function Hero9({ eyebrow = "Now in public beta", title = "Software that grows with you", description = "A calm workspace for plans, decisions and the agents that help carry them out.", primaryAction = { label: "Get started", href: "#" }, secondaryAction = { label: "Read the docs", href: "#" }, note = "Free for small teams. No card needed.", seed = 7, className, ...props }: Hero9Props) { const id = React.useId() return ( <section data-slot="hero-9" aria-labelledby={`${id}-title`} className={cn("bg-background text-foreground relative isolate flex min-h-[800px] w-full flex-col items-center overflow-hidden px-4 pt-20 pb-72 text-center sm:px-6 sm:pt-24", className)} {...props}> <ParticleTree className="-z-10" seed={seed} /> <div aria-hidden="true" className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-2/3 bg-gradient-to-b from-background via-background/80 to-transparent" /> {eyebrow && ( <p className="text-muted-foreground inline-flex items-center gap-2 rounded-full border bg-background/60 px-3 py-1 text-xs font-medium backdrop-blur"> <span className="bg-chart-1 size-1.5 rounded-full" aria-hidden="true" /> {eyebrow} </p> )} <h1 id={`${id}-title`} className="mt-6 max-w-3xl text-4xl leading-[1.05] font-semibold tracking-[-0.04em] text-balance sm:text-6xl">{title}</h1> <p className="text-muted-foreground mt-5 max-w-xl text-base leading-relaxed text-pretty sm:text-lg">{description}</p> <div className="mt-8 flex flex-wrap items-center justify-center gap-3"> <a href={primaryAction.href} className={buttonVariants({ shape: "pill", size: "lg" })}> {primaryAction.label} <ArrowRight aria-hidden="true" className="rtl:-scale-x-100" /> </a> <a href={secondaryAction.href} className={buttonVariants({ shape: "pill", size: "lg", variant: "outline" })}>{secondaryAction.label}</a> </div> {note && <p className="text-muted-foreground mt-4 text-sm">{note}</p>} </section> ) } export { Hero9, type Hero9Props }Update the import paths to match your project setup.
Usage
"use client"
import { Hero9 } from "@/components/ballmac/blocks/hero-9/hero-9"
export default function Hero9Demo() {
return <Hero9 />
}States
This block has no states. Static content: nothing to load, submit or fail.
Dependencies
- npm
- lucide-react
Use with AI
Hero with a generative particle tree behind centered text. <Hero9 eyebrow title description primaryAction={{ label, href }} secondaryAction note seed />. The tree is the ParticleTree component (decoration, aria-hidden, reduced-motion safe); change seed to change its shape. It looks best on a dark surface: add the dark class to the section or the page. With the shadcn MCP server set up (guide), ask your agent:
Add the Ballmac UI Hero 9: a tree of particles (@ballmac/hero-9) to this project with the shadcn MCP, then use it where it fits.
Use it for
- A launch, waitlist or AI product page that wants one calm, memorable image
- A hero with no screenshot to show yet
Not for
- Products that sell on their UI; use hero-1 or hero-7
- Pages where the headline is long
Registry JSON: https://ui.ballmac.com/r/hero-9.json
Free to use in personal and commercial projects.
More hero blocks
Hero 1: split with product visual
Split hero: badge, word-by-word headline, two calls to action and proof points on the left, a live product summary card on the right, over an animated grid.
Hero 2: developer tool with install command
Centered hero for developer tools: headline, two actions, package-manager install tabs and a terminal window with a light beam tracing its border.
Hero 3: AI product with live prompt
Hero for AI products: a real prompt input on the left, and on the right a mock answer with a reasoning panel, a tool call and a streaming reply.
Hero 4: split with interactive globe
Split hero with a live pill, headline, two actions and headline stats beside a large draggable WebGL globe marking your regions.
Ballmac UI Pro
Need the whole screen, not one piece?
150 premium blocks (dashboards, settings, calendars, mail, shops, onboarding), a private shadcn registry and Figma tokens. Blocks that show data come with loading, empty and error states built in.
Not ready? Try three Pro blocks free
Leave your email and the blocks appear right here, ready to copy. Yours to use in any project.