An independent club music label
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.
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.
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.
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
npx shadcn add "https://ui.beste.co/r/hero224?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
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.
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.
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:
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"
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the headline |
heading | string | – | Black-weight headline, rendered as the page h1 |
description | string | – | Intro under the headline |
buttons | ActionButton[] | [] | 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 |
distort | Omit<PixelDistortProps, "src" | "alt" | "className" | "children"> | – | Forwarded to the PixelDistort component: grid size, strength, radius, relax, aberration, pixelate, intro and grain |
wordmark | string | – | Oversized word along the bottom edge, decorative and aria-hidden |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
};
type Image = {
src: string;
alt: string;
};PixelDistort only mounts when image is set; without it the section falls back to its near-black neutral-950 ground with the copy intact.distort.intro on, the photo resolves from big pixel blocks on arrival; the canvas fades in once it is ready.img instead.PixelDistort pauses through an IntersectionObserver and on hidden tabs, and respects prefers-reduced-motion.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.