Photographs presented as printed spreads on a soft panel: two plates share a page with a centre rule, round controls turn to the next spread, and a bar index below tracks how far through the book you are.
Pictures presented as a photo book: two plates per spread on a soft mount divided by a gutter rule, page arrows on the outer edges, and a progress bar counting the spreads.
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/gallery8?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/gallery8?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/gallery8.tsx plus the badge7 eyebrow it uses.
The installed file exports gallery8Demo alongside the block: the exact props behind the preview above. Spread it to get a working gallery in one line.
import { Gallery8, gallery8Demo } from "@/components/beste/block/gallery8";
export default function Page() {
return <Gallery8 {...gallery8Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Gallery8 } from "@/components/beste/block/gallery8";
export default function Page() {
return (
<Gallery8
badge={{ label: "Turn the page" }}
heading="The book, opened one spread at a time."
spreads={[
{
left: { src: "/book/01.jpg", alt: "Letterforms at full size", caption: "Letterforms at full size", plate: "Plate 01" },
right: { src: "/book/02.jpg", alt: "Sheets on a table", caption: "Sheets on the table", plate: "Plate 02" },
},
{
left: { src: "/book/03.jpg", alt: "Pages drying", caption: "Pages, still drying", plate: "Plate 03" },
right: { src: "/book/04.jpg", alt: "Bound copies", caption: "Bound and trimmed", plate: "Plate 04" },
},
]}
labels={{
previousLabel: "Previous spread",
nextLabel: "Next spread",
spreadWord: "Spread",
counterSeparator: "of",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading in the header row |
spreads | Spread[] | [] | Spreads, each holding a left and a right plate |
labels | Gallery8Labels | {} | Fixed strings that are not content: the page controls, the spread word and the counter separator |
className | string | – | Extra classes for the outer <section> |
type Spread = {
left: Plate;
right: Plate;
};
type Plate = {
src: string;
alt: string;
caption: string;
plate: string;
};
type Gallery8Labels = {
previousLabel?: string;
nextLabel?: string;
spreadWord?: string;
counterSeparator?: string;
};border-l border-current/10 on the right page only, a shade of the mount's own surface, so it reads as a fold rather than a divider between two cards.md:-left-6 and md:-right-6), which is what makes them read as page turns rather than controls printed on the page.flex-1 segments, so it always spans the mount exactly whatever the number of spreads.button with aria-pressed and an aria-label taken from its left plate, so the bar is navigable rather than decorative.aspect-[3/4] portraits on bg-background inside the mount, which is what gives the impression of paper laid on a table.md the spread stacks into one column with a gap and no gutter rule, so a phone reads plate after plate instead of squeezing two pages side by side.gallery23
Works listed with the sizes they are printed at, opening a viewer that hangs the piece in a photographed room and scales it as you switch size pills, so the dimensions stop being an abstraction.
gallery16
Exhibition split into artist rooms, each with a sticky statement column beside its works, opening a viewer that shows the chosen piece large with the next one waiting as a thumbnail you can step straight into.
gallery9
Justified rows of frames that grow to fill every line, opening a viewer whose picture doubles as the zoom control: clicking switches between fitting the screen and filling it, with the caption and controls on one closing rule.
gallery13
Printed-catalogue layout pairing a numbered index of works with a sticky matted plate and its note, where an expand seal opens the plate alone on a dark ground with only its number and the arrows.