Pixel Sort Hero

Raised hands in silhouette against blue stage light at a concert

An independent club music label

Louder after midnight.

Ferro Tapes puts out club music that bends at the edges. Twelve records a year, pressed on heavy vinyl, played first on our own sound system in Neukölln.

About this block

Pixel Sort HeroPRO

A nightlife hero for a record label built on the pixel-distort background component: a full-bleed concert photo of raised hands against blue stage light sits on an invisible grid, and sweeping the cursor drags the cells along like wet paint, breaking them into coarser pixels with a slight color split before they ease back into place; on arrival the photo resolves from big pixel blocks. A bold headline, a short intro and two square Turn Arrow buttons sit above an oversized wordmark cropped by the bottom edge in difference blend. Every distortion setting passes through the distort prop.

Hero224: Pixel Sort Hero

A full-bleed nightlife hero over the pixel-distort component: a concert photo sits on an invisible grid that drags along with the cursor like wet paint, breaking into coarser pixels with a slight color split before easing back. A bold headline, a short intro and 2 square Turn Arrow buttons sit above an oversized wordmark cropped by the bottom edge in difference blend.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/hero224?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/hero224?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/hero224.tsx plus the pixel-distort background and the button24 button it uses.

Quick start

The installed file exports hero224Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.

tsx
import { Hero224, hero224Demo } from "@/components/beste/block/hero224";

export default function Page() {
  return <Hero224 {...hero224Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Hero224 } from "@/components/beste/block/hero224";

export default function Page() {
  return (
    <Hero224
      eyebrow="An independent club music label"
      heading="Louder after midnight."
      description="Twelve records a year, pressed on heavy vinyl, played first on our own sound system."
      buttons={[
        { label: "Hear the catalog", href: "/catalog" },
        { label: "Friday lineup", href: "/lineup" },
      ]}
      image={{
        src: "https://images.unsplash.com/photo-1697128951362-e704be45d3da?w=2000&q=80",
        alt: "Raised hands in silhouette against blue stage light at a concert",
      }}
      distort={{ grid: 36, strength: 0.6, pixelate: 0.6, intro: true }}
      wordmark="Ferro"
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small line above the headline
headingstring–Black-weight headline, rendered as the page h1
descriptionstring–Intro under the headline
buttonsActionButton[][]Square Turn Arrow buttons; the first is solid white turning to the theme primary on hover, the rest outlined in white
image{ src: string; alt: string }–The photograph handed to PixelDistort as src and alt
distortOmit<PixelDistortProps, "src" | "alt" | "className" | "children">–Forwarded to the PixelDistort component: grid size, strength, radius, relax, aberration, pixelate, intro and grain
wordmarkstring–Oversized word along the bottom edge, decorative and aria-hidden
classNamestring–Extra classes for the outer <section>
ts
type ActionButton = {
  label: string;
  href: string;
};

type Image = {
  src: string;
  alt: string;
};

Behavior notes

  • PixelDistort only mounts when image is set; without it the section falls back to its near-black neutral-950 ground with the copy intact.
  • With distort.intro on, the photo resolves from big pixel blocks on arrival; the canvas fades in once it is ready.
  • If the WebGL program fails, the component shows the plain photograph as an img instead.
  • PixelDistort pauses through an IntersectionObserver and on hidden tabs, and respects prefers-reduced-motion.
  • A left-to-right and a bottom-up black gradient keep the white copy legible over any photograph. The photo ground is fixed, so the copy stays white in every theme.
  • The wordmark is sized in viewport width (text-[31vw], md:text-[24vw]) and slides up from 40% to 18% of its height on load; bottom padding in vw keeps the copy above it. With reduced motion it starts in place.

More Hero blocks

View all Hero
PRO

hero225

Pulsar Ridgelines Hero

PRO

hero202

Live Halftone Hero

PRO

hero249

Slice Assembly Hero

Get Pro access