Tessera, glazed tile from Porto
We glaze every tile by hand in small kiln batches, for kitchens, pools and lobbies that change with the light through the day.
A warm bento hero over the mosaic-gradient background component: a plain card with the headline, an intro, a primary Arrow Pill and an underline link sits beside three rounded panels cut from the same glaze, one in large tiles, one in the given size and one in fine tiles, so the same flowing gradient reads at three scales. Each panel's tiles grow in from its center, glint on their own and lift toward the cursor. Every tile setting passes through the mosaic prop.
A warm bento hero over the mosaic-gradient component: a plain card carries the copy, and three rounded panels cut from the same glaze show the flowing gradient in large, medium and fine tiles.
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/hero268?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero268?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero268.tsx plus the mosaic-gradient background and the button23 and button2 buttons it uses.
The installed file exports hero268Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero268, hero268Demo } from "@/components/beste/block/hero268";
export default function Page() {
return <Hero268 {...hero268Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero268 } from "@/components/beste/block/hero268";
export default function Page() {
return (
<Hero268
eyebrow="Tessera, glazed tile from Porto"
heading="Color, fired one tile at a time."
description="We glaze every tile by hand in small kiln batches."
buttons={[
{ label: "Order samples", href: "/samples" },
{ label: "See the glazes", href: "/glazes" },
]}
mosaic={{
colors: ["#0f3b5f", "#1f7a8c", "#58b4ae", "#f2c14e", "#e76f51"],
backgroundColor: "var(--muted)",
cells: 22,
depth: 0.55,
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the headline |
heading | string | – | Headline in the copy card, rendered as the page h1 |
description | string | – | Intro under the headline |
buttons | ActionButton[] | [] | The first renders as a primary Arrow Pill, every later one as a Button2 underline link |
mosaic | Omit<MosaicGradientProps, "className" | "children"> | – | Shared by the three panels and forwarded to MosaicGradient: colors, grout color, cells, gap, rounding, shimmer, depth, wave, speed, saturation, grain, transition, seed and interactive |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
};mosaic settings but scale cells by 0.55, 1 and 1.7 and shift seed by 0, 3 and 7, so the same glaze reads at three tile sizes without repeating its pattern.MosaicGradient with its own canvas: the tiles grow in from the panel's center over 2.4 seconds and lift toward the cursor only inside that panel.bg-background, the copy card is bg-card with text-card-foreground and muted-foreground copy, and the demo grout is var(--muted). The glaze colors stay as picked, like a photograph.prefers-reduced-motion; the cards then render without their rise.max(600px, 100svh - 142px) on medium screens and up.