Components / Website
Hero
A bold marquee hero on a forest-green canvas. Three headline lines step in clean thirds: the first fills 100% of the top, the second spans the right 2/3 and sits over a 2/3-wide photo, the third occupies the right 1/3: clear of the photo. Concave masking fuses the stepped lime blocks into one ribbon, with supporting copy and CTAs in the right 1/3 below.
How it works
Each headline string is a direct grid item in its own row. The layout uses a clean thirds system: each step is 4 columns (one third). lines[0] fills the full 100% (cols 1–12), lines[1] spans the right 2/3 (cols 5–12) and sits over the photo, and lines[2] occupies the right 1/3 (cols 9–12). The photo is w-2/3 wide so its right edge aligns exactly with col 9: where line 2 and the copy block both begin. Selective corner flattening fuses all three blocks into one continuous ribbon.
The signature detail is the concave notch masking at each step. A small lime square is pushed just outside the block edge ( translateX(-100%) ), then a larger forest-coloured ::after with a single rounded corner masks it: carving a smooth inward curve so the steps fuse together.
The photo sits in the lower-left at w-2/3, matching the width of lines[1] so its right edge lands exactly at col 9. The notches={["topRight"]} prop on HeroVisual carves a concave corner into the photo's top-right, interlocking it with lines[1] above. The headline uses container-query units ( cqw) so it scales with the hero's own width, not the viewport.
/*
* Instant Strata hero: how the layout works
*
* 1. THIRDS-BASED LAYOUT (12-column grid on desktop)
* Each step = 4 columns = 1 third. Starts and spans are derived as:
* col start = 1, 5, 9 → col span = 13 − start = 12, 8, 4
*
* lines[0] → cols 1–12, row 1 (100%: full top width)
* lines[1] → cols 5–12, row 2 ( 2/3: sits over the photo)
* lines[2] → cols 9–12, row 3 ( 1/3: clear of the photo)
*
* The photo is absolutely positioned at w-2/3 (8 cols wide) so its
* right edge falls exactly at the col-9 boundary: the same column
* where lines[2] and the copy block begin.
*
* 2. THE LIME RIBBON
* Each line is its own lime block. Selective corner flattening fuses them
* into one continuous ribbon:
* · lines[0]: flat bottom-right
* · lines[1]: flat top-left, top-right, bottom-right
* · lines[2]: flat top-left
*
* 3. CONCAVE NOTCH MASKING ← the signature detail
* At each interior junction, a HeroNotch carves a concave (inward) curve
* so adjacent blocks fuse smoothly. The trick:
* a) a small lime square is pushed just OUTSIDE the block edge
* (translateX ±100%), extending the block by 24 px;
* b) a larger ::after (110%, forest-coloured) with ONE rounded corner
* masks it: leaving a smooth inward curve.
* Notch positions: top-left on lines[1] and lines[2]; bottom-right on lines[1].
* The photo's HeroVisual `notches={["topRight"]}` carves the same concave
* curve at the photo's top-right corner, interlocking it with lines[1].
*
* 4. OVERFLOW CLIPPING
* Each line sits inside a clip-path wrapper:
* lines[0] → inset(0 0 0 0) standard clip
* lines[1+] → inset(0 0 0 -24px) expands 24 px left so the
* topLeft notch remains visible, right side still clips.
*
* 5. FLUID TYPE
* The section is a CSS container ([container-type:inline-size]) and the
* headline uses cqw units (clamp(26px, 6.4cqw, 92px)) so it scales with
* the hero's own width: not the viewport.
*/Installation
npx shadcn add https://raw.githubusercontent.com/levi-putna/elements/main/registry/hero/registry.jsonAnatomy
<Hero
lines={[
"Strata Intelligence", // lines[0]: 100% width (cols 1–12, row 1)
"built around", // lines[1]: 2/3 width (cols 5–12, row 2) over photo
"your clients", // lines[2]: 1/3 width (cols 9–12, row 3) clear of photo
]}
subtext="..." // supporting paragraph: right 1/3, below ribbon
actions={...} // dual CTA (HeroAction primary + outline)
visual={...} // lower-left photo (w-2/3): use <HeroVisual> for notch masking
/>Example
Strata Intelligencebuilt aroundyour clients

Instant Strata is the command centre for your portfolio, uniting owners, committees and managers around the data that keeps every building running.
Resize the browser to see the mobile stack: headline lines collapse into a single lime block, with the photo below.
Usage
import { Hero, HeroAction, HeroVisual } from "@/components/ui/hero"
export function Page() {
return (
<Hero
lines={["Strata Intelligence", "built around", "your clients"]}
subtext="Instant Strata is the command centre for your portfolio, uniting owners, committees and managers around the data that keeps every building running."
actions={
<>
<HeroAction href="/signup">Book a demo</HeroAction>
<HeroAction href="/tour" variant="outline">Take a tour</HeroAction>
</>
}
visual={
<HeroVisual
src="/img/people/1.webp"
alt="Strata managers reviewing a building portfolio"
/>
}
/>
)
}Hero props
| Prop | Type | Default | Description |
|---|---|---|---|
| lines | string[] | - | Three headline strings in thirds-based zones: lines[0] = 100% full top; lines[1] = right 2/3 (sits over the photo); lines[2] = right 1/3 (clear of photo). Keep each line short enough for its zone. |
| subtext | string | - | Supporting paragraph in the right-hand column (desktop) or below the media stack (mobile). |
| actions | ReactNode | - | Call-to-action buttons. Use HeroAction for brand-styled primary/outline links. |
| visual | ReactNode | - | Photo tucked into the lower-left, behind the ribbon's final line. Use HeroVisual for the notch masking. |
| className | string | - | Additional classes on the outer forest-green section. |
HeroVisual props
| Prop | Type | Default | Description |
|---|---|---|---|
| src | string | - | Image source URL. |
| alt | string | - | Accessible alt text for the photo. |
| notches | VisualCorner[] | ["topRight"] | Corners to carve with a concave notch so the photo interlocks with the ribbon. |
| className | string | - | Classes on the rounded wrapper div. |
| imgClassName | string | - | Classes on the inner img element (object-cover by default). |
HeroAction props
| Prop | Type | Default | Description |
|---|---|---|---|
| href | string | - | Link destination. |
| variant | "primary" | "outline" | "primary" | primary = off-white fill; outline = transparent with white border. |
| className | string | - | Additional classes on the anchor. |