Auralis takes the messy middle of a brand: the pages that never got written, the type that never got decided, the system that only lived in one person's head.
Marks, type systems and the rules that keep them alive after we leave.
Long-form pages, reports and the writing that has to survive being read.
The screens where the brand finally has to do something useful.
Second week of a rebrand, printed and pinned before anything ships.
Studio floor, Rotterdam
Editorial hero pairing an oversized statement, a paragraph and a pill CTA with a ruled index of disciplines, closed by a wide cinematic image band carrying a caption and a location credit on its own rule.
Editorial hero for a studio or practice: an oversized statement and a paragraph sit beside a ruled index of the disciplines you take on, with a pill CTA under the copy and a wide cinematic image band closing the section on its own caption rule.
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/hero147?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero147?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero147.tsx plus the badge7 eyebrow and button12 pill button it uses.
The installed file exports hero147Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero147, hero147Demo } from "@/components/beste/block/hero147";
export default function Page() {
return <Hero147 {...hero147Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero147 } from "@/components/beste/block/hero147";
export default function Page() {
return (
<Hero147
badge={{ label: "Design practice" }}
heading="A studio for the parts nobody wants to own."
description="We take the messy middle of a brand and finish it."
button={{ label: "Start a commission", href: "/contact" }}
disciplines={[
{ title: "Identity", description: "Marks, type systems and the rules that keep them alive." },
{ title: "Editorial", description: "Long-form pages that survive being read." },
]}
image={{ src: "/studio/table.jpg", alt: "Printed layouts across a studio table" }}
labels={{ imageCaption: "Second week of a rebrand.", imageCredit: "Studio floor, Rotterdam" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Display statement, rendered as the page h1 |
description | string | – | Supporting paragraph under the heading |
button | ActionButton | – | Pill CTA, rendered as Button12 |
disciplines | Discipline[] | [] | Ruled index in the narrow right column |
image | { src: string; alt: string } | – | Wide image band under the two columns |
labels | Hero147Labels | {} | Fixed strings that are not content: index title, image caption and credit |
className | string | – | Extra classes for the outer <section> |
type Discipline = {
title: string;
description: string;
};
type ActionButton = {
label: string;
href: string;
};
type Hero147Labels = {
disciplinesTitle?: string;
imageCaption?: string;
imageCredit?: string;
};md:items-end, so the discipline index sits on the same baseline as the CTA rather than floating next to the top of a very tall heading.h2 under the h1, which keeps the outline correct when this block opens a page and the index doubles as a section summary.aspect-[16/9] on mobile becomes aspect-[21/9] from md up, so the crop stays cinematic on desktop without going letterbox-thin on a phone.border-t row under the image and wrap independently, so a long caption never pushes the credit out of the section.image the block ends after the two columns, and without disciplines the heading column simply takes the full width.hero120
Centered editorial hero with eyebrow, large heading, description, dual dark and outline CTAs, and a wide 16:9 image with a mono caption below.
hero122
Centered typographic hero on a muted card with an oversized heading, inline CTA, and a bottom monospace meta row of three labels.
hero173
A hero that sets its position and paragraph against a seal button held at the right edge of the same row, then runs a captioned wide photograph beneath it and closes on one portrait card per writer.
hero150
Split hero pairing a statement, paragraph and two pill CTAs with a pair of captioned portrait images, the second dropped by a stagger on desktop so the column reads as an editorial spread.