Linden & Vale Press
A small letterpress shop printing wedding suites, book covers and calling cards on cotton stock, set by hand from a case of lead type.
A print-shop hero built on the letterpress component: the headline is pressed into a full sheet of cotton paper one word at a time, each impression biting in under a raking light that follows the cursor, the ink lying unevenly at the bottom of the type. When the composition is set it rests, then the sheet slides away and the next one is set in a new ink and arrangement. An eyebrow, a ruled row with an intro, a square Turn Arrow button and an underline link frame it, and the real heading stays in the DOM for screen readers. Every press setting passes through the press prop.
A print-shop hero where a Letterpress WebGL sheet presses the headline into cotton paper one word at a time under a raking light that follows the cursor, then slides away and sets the next sheet in a new ink and arrangement, framed by an eyebrow and a ruled row with an intro, a Turn Arrow button and an underline link.
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/hero234?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero234?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero234.tsx plus the letterpress component and the button24 and button2 buttons it uses.
The installed file exports hero234Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero234, hero234Demo } from "@/components/beste/block/hero234";
export default function Page() {
return <Hero234 {...hero234Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero234 } from "@/components/beste/block/hero234";
export default function Page() {
return (
<Hero234
eyebrow="Linden & Vale Press"
heading="Words you can feel with a fingertip."
description="A small letterpress shop printing wedding suites and calling cards on cotton stock."
buttons={[
{ label: "Start a print job", href: "https://beste.co" },
{ label: "See the type cases", href: "/type" },
]}
press={{
lines: ["Words you", "can feel with", "a fingertip."],
paperColor: "var(--background)",
inkColors: ["var(--foreground)", "var(--primary)", "var(--muted-foreground)"],
arrangements: ["left", "stagger", "center"],
area: { top: 0.16, right: 0.06, bottom: 0.3, left: 0.06 },
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line at the top left |
heading | string | – | The heading for screen readers and search, rendered as an sr-only h1; also the fallback line for the press |
description | string | – | Intro paragraph in the ruled bottom row |
buttons | ActionButton[] | [] | The first renders as a primary Turn Arrow button (Button24), the rest as underline links (Button2) |
press | Omit<LetterpressProps, "className" | "children"> | – | Forwards Letterpress props: lines, paperColor, inkColors, arrangements, interval, hold, depth, coverage, irregularity, grain, area, interactive, paused |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
};press.lines; when those are missing it sets [heading], and with neither the press is skipped. Keep heading in sync with lines, since only heading reaches screen readers.text-7xl, md:text-9xl and lg:text-[11rem]. The demo's area keeps the bottom 30% clear for the ruled row.inkColors and arrangements ("left", "center" or "stagger"), pressing a word every interval seconds and resting hold seconds before sliding away.press.paperColor (falling back to var(--background)) and the copy uses text-foreground and text-muted-foreground. The demo paper and inks are theme tokens, so the sheet recolors with the theme; pass hex values to pin a fixed stock.