Tamsin Tea Garden
A tea garden around a hundred-year-old pond. Loose-leaf teas, quiet tables by the water and a few old koi that like to come and say hello.
A tea garden hero over the koi-pond background component: koi seen from above swim with a flowing S-curve over a green floor lit by drifting sunlight caustics, casting soft shadows, while lily pads with a flower or two bob on the surface. The koi gather around the cursor, a click scatters food and sends ripple rings across the water. A semibold serif headline, an intro, an Arrow Pill and an underline link sit on a soft shade in the lower corner. Every pond setting passes through the pond prop.
A full-height garden hero over the koi-pond component: koi seen from above swim over a green floor lit by drifting caustics while lily pads bob on the surface. A serif headline, an intro, an Arrow Pill and an underline link sit on a soft shade in the lower left corner.
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/hero244?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero244?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero244.tsx plus the koi-pond background and the button23 and button2 buttons it uses.
The installed file exports hero244Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero244, hero244Demo } from "@/components/beste/block/hero244";
export default function Page() {
return <Hero244 {...hero244Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero244 } from "@/components/beste/block/hero244";
export default function Page() {
return (
<Hero244
eyebrow="Tamsin Tea Garden"
heading="Sit a while. The fish are in no hurry."
description="A tea garden around a hundred-year-old pond, with loose-leaf teas and quiet tables by the water."
buttons={[
{ label: "Book a table", href: "/book" },
{ label: "See the teas", href: "/teas" },
]}
pond={{
fish: 7,
palette: "mixed",
waterColor: "#173f39",
lilyPads: true,
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the headline |
heading | string | – | Serif headline, rendered as the page h1 |
description | string | – | Intro under the headline |
buttons | ActionButton[] | [] | The first renders as a light Arrow Pill, every later one as a Button2 underline link |
pond | Omit<KoiPondProps, "className" | "children"> | – | Forwarded to the KoiPond component: fish count, palette, water color, lily pads, caustics, ripples, curiosity and speed |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
};pointer-events-none with only the button row re-enabled, so the pond stays interactive right up to the text.KoiPond draws on Canvas 2D, pauses through an IntersectionObserver and on hidden tabs, and respects prefers-reduced-motion.max(640px, 100svh - 78px) and pins the copy to the bottom.