A press row: a serif heading that settles in word by word beside a pill action, then six greyscale logos in a ruled strip that blur in one after another and regain their colour on hover.
A press row ruled top and bottom: a heading and a pill above a grid of greyscale publication logos that regain their colour on hover, each in its own cell.
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/logos17?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/logos17?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/logos17.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports logos17Demo alongside the block: the exact props behind the preview above. Spread it to get a working logo row in one line.
import { Logos17, logos17Demo } from "@/components/beste/block/logos17";
export default function Page() {
return <Logos17 {...logos17Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Logos17 } from "@/components/beste/block/logos17";
export default function Page() {
return (
<Logos17
eyebrow="Written about in"
heading="Quiet work, occasionally noticed."
logos={[
{ src: "/logos/one.png", alt: "Publication logo" },
{ src: "/logos/two.png", alt: "Publication logo" },
]}
button={{ label: "Press enquiries", href: "mailto:hello@beste.co", tone: "outline" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
logos | Logo[] | [] | Publication logos, six across from md |
button | ActionButton | – | Pill action beside the heading |
className | string | – | Extra classes for the outer <section> |
type Logo = {
src: string;
alt: string;
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};grayscale and half opacity at rest and return to full on hover, so a row of mismatched brand colors reads as one band until someone looks at a particular mark.h-8 w-auto, so marks of different widths line up on a common height rather than on a common width, which is what keeps a wordmark and a monogram looking equally weighted.md and break into even rows below it rather than leaving a single mark stranded.border-y on the list itself rather than a border per cell, so the row reads as one band whatever the logo count.py-16 rising to py-24), because a logo row is a punctuation mark between sections rather than a section of its own.0.08s stagger, tight enough that the row resolves as one object.alt; these are the only images in the block and a row of empty alts leaves a screen reader with nothing.logos18
Three press mentions under a centred serif heading that settles in word by word: each ruled column carries a greyscale logo, a serif pull quote, a small-caps source line and a link to the piece, with a pill action beneath.
logos16
A single raised card holding three publication marks side by side, each with the line that publication wrote underneath it, over a soft section band.