A careers "life at the studio" section that renders an eyebrow badge, a <strong>-aware heading, a lead paragraph, a CSS-column masonry wall of captioned photos with a hover zoom and a bottom gradient overlay, and a bordered closing row pairing a CTA line with a Button1 link to open roles.
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/careers45?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/careers45?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/careers45.tsx.
The installed file exports careers45Demo alongside the block: the exact props behind the preview above. Spread it to get a working studio photo wall in one line.
import { Careers45, careers45Demo } from "@/components/beste/block/careers45";
export default function Page() {
return <Careers45 {...careers45Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Careers45 } from "@/components/beste/block/careers45";
export default function Page() {
return (
<Careers45
label="Life at the studio"
heading="Work we <strong>actually care about.</strong>"
lead="One floor, fourteen people, and a wall that never stops filling up."
moments={[
{
src: "https://example.com/floor.jpg",
alt: "Studio floor with designers at shared tables",
caption: "The studio floor, mid-afternoon",
aspect: "aspect-[4/5]",
},
{
src: "https://example.com/critique.jpg",
alt: "Team gathered around a whiteboard",
caption: "Friday critique, no slides allowed",
aspect: "aspect-[4/3]",
},
]}
ctaText="Like the look of it?"
button={{ label: "See open roles", href: "/careers" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
label | string | – | Eyebrow text rendered through Badge6; omitted when falsy |
heading | string | – | Section heading, supports inline <strong> |
lead | string | – | Intro paragraph under the heading |
moments | Moment[] | [] | Photos rendered as masonry figures |
ctaText | string | – | Copy line in the closing CTA row |
button | ActionLink | – | Link fed into the Button1 CTA |
className | string | – | Extra classes for the outer <section> |
type Moment = {
src: string;
alt: string;
caption: string;
// Tailwind aspect class, e.g. "aspect-[4/5]", varies the masonry rhythm
aspect: string;
};
type ActionLink = {
label: string;
href: string;
};heading is injected via dangerouslySetInnerHTML, so its inline <strong> renders as bold text-primary; pass trusted markup only.columns masonry (sm:columns-2 lg:columns-3) with break-inside-avoid on each figure, so there is no JS layout, no lazy loading, and no lightbox.moment.aspect string is applied directly as a Tailwind class on the image box, so an invalid or unlisted aspect value silently produces no ratio.group-hover scale-105 zoom; the caption sits over the overlay in text-background and is decorative, not a link.button is provided; inside it, ctaText renders only when also truthy, and the button always wraps a next/link to button.href with no click handler of its own.button.href link.careers50
Centered careers intro with eyebrow, highlighted heading and supporting copy above a three-image gallery — one wide frame beside two portraits.
careers8
Single job posting detail with responsibilities, requirements, nice-to-haves, and apply CTA. Full position description layout.
careers14
Team member photo grid with names and roles. Square portrait layout for showcasing leadership and team composition.