A picture-free work index laid out as four aligned columns, year, client, what was done and the discipline, with the column heads appearing only once the row can hold them.
A picture-free work index laid out as four aligned columns, year, client, what was done and the discipline, with the column heads appearing only once the row can hold them.
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/portfolio118?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/portfolio118?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/portfolio118.tsx and the badge6 component it uses for the eyebrow (installed to components/beste/component/badge6.tsx).
The installed file exports portfolio118Demo alongside the block: the exact props behind the preview above. Spread it to get a working work index in one line.
import { Portfolio118, portfolio118Demo } from "@/components/beste/block/portfolio118";
export default function WorkPage() {
return <Portfolio118 {...portfolio118Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Portfolio118 } from "@/components/beste/block/portfolio118";
export default function WorkPage() {
return (
<Portfolio118
eyebrow="Selected work"
heading="Everything worth showing, in one list"
columns={{ year: "Year", client: "Client", work: "What we did", discipline: "Discipline" }}
items={[
{
year: "2026",
client: "Northwind",
work: "A brand that survived a merger",
discipline: "Brand",
href: "/work/northwind",
},
]}
note="Work under agreement is not listed."
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Badge6 label above the hairline rule |
heading | string | – | Section heading under the rule |
columns | { year: string; client: string; work: string; discipline: string } | – | Column heads, shown from md up |
items | WorkRow[] | [] | One linked row per project |
note | string | – | Single line under the list |
className | string | – | Extra classes for the outer section |
type WorkRow = {
year: string;
client: string;
work: string;
discipline: string;
href: string;
};hidden md:grid. On a phone the four values stack, where a row of heads above a stack would label nothing.5rem 10rem 1fr 8rem track, which is what keeps the values under their labels rather than approximately near them.tabular-nums, so the left column stays straight in a proportional typeface.portfolio104
A numbered project index that cross-fades a sticky image preview as each row is hovered.
portfolio97
Three-column categorized preferences with checkmarks and X icons showing preferred vs non-preferred work styles. Perfect for freelancers clarifying ideal project types and engagement models.
portfolio112
Editorial project index of ruled rows — padded numeral, project name, client and year, with a floating thumbnail revealed on hover.
portfolio105
Oversized type project index where each row reveals a thumbnail and shifts to the accent on hover.