Three resource cards, each led by a preview image and stamped with its format, holding the title, one line on what is inside, and a seal download button pinned to the bottom of the card.
Three resource cards, each led by a preview image and stamped with its format, holding the title, one line on what is inside, and a seal download button pinned to the bottom of the card.
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/showcase50?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/showcase50?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/showcase50.tsx, the badge6 component used for the eyebrow and the button1 seal button on each card.
The installed file exports showcase50Demo alongside the block: the exact props behind the preview above. Spread it to get a working resource shelf in one line.
import { Showcase50, showcase50Demo } from "@/components/beste/block/showcase50";
export default function LibraryPage() {
return <Showcase50 {...showcase50Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Showcase50 } from "@/components/beste/block/showcase50";
export default function LibraryPage() {
return (
<Showcase50
eyebrow="The library"
heading="The files we work from, free to take"
description="These are the working documents behind the writing."
downloadLabel="Download"
resources={[
{
image: { src: "/library/estimate.jpg", alt: "A printed estimate" },
format: "Spreadsheet",
title: "The estimate sheet",
description: "Every line we price, with the ranges we quote inside.",
href: "/library/estimate-sheet",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Badge6 label above the hairline rule |
heading | string | – | Section heading under the rule |
description | string | – | Supporting paragraph |
downloadLabel | string | – | Label on every card's button |
resources | Resource[] | [] | Cards, three to a row on desktop |
className | string | – | Extra classes for the outer section |
type Resource = {
image: ResourceImage;
format: string;
title: string;
description: string;
href: string;
};
type ResourceImage = {
src: string;
alt: string;
};div and only the button is a link. Wrapping the card in a link as well would nest one anchor inside another, which is invalid markup and unpredictable to click.flex-1, so buttons line up along the bottom of the row however long the copy is.Button1 at full width, which is a layout class only. Its own padding and height are untouched, so it matches every other seal button on the site.motion-safe.format is free text, so it can carry "Spreadsheet", "Figma file" or a file size without a fixed vocabulary.showcase44
Centered eyebrow, heading, and description above a grid of borderless brand cards — each with a square, colorable logo plate, a title and short description, and a full-width animated seal detail button.
showcase1
Full-width image showcase with clickable animated hotspots that reveal feature popovers with icons and descriptions. Perfect for product tours and interactive feature demonstrations.
showcase28
Browser-chrome card rendering a markdown source editor on the left and the rendered HTML on the right — minimal monochrome syntax markers, structured preview blocks (headings, paragraphs, lists, fenced code). Every label is editable; no media props required.