Sand & Silence, a desert camp at the edge of the Erg Chebbi
Twelve tents, one long table and dunes in every direction. Mornings start before sunrise, evenings end under more stars than you knew were there.
A hero for a desert camp over the dune-field background component: a photoreal desert at golden hour, raymarched in a shader, with sharp-crested dunes, long soft shadows tinted by the sky, wind ripples and a warm haze toward the horizon. The camera glides slowly over the sand and turns gently with the cursor, and the light comes up out of the dusk on arrival. A large headline, an intro, an Arrow Pill and an underline link sit low on the left over a soft shade. Every desert setting passes through the desert prop.
A full-bleed hero over the dune-field component, a desert at golden hour raymarched in a WebGL shader with sharp-crested dunes, sky-tinted shadows, wind ripples and warm haze, where the camera glides slowly over the sand and turns with the cursor; a large headline, an intro and two buttons sit low on the left over a soft shade.
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/hero245?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero245?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero245.tsx plus the dune-field background and the button23 and button2 buttons it uses.
The installed file exports hero245Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero245, hero245Demo } from "@/components/beste/block/hero245";
export default function Page() {
return <Hero245 {...hero245Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero245 } from "@/components/beste/block/hero245";
export default function Page() {
return (
<Hero245
eyebrow="A desert camp at the edge of the Erg Chebbi"
heading="Nothing to do but watch the light."
description="Twelve tents, one long table and dunes in every direction."
buttons={[
{ label: "Plan your stay", href: "/stay" },
{ label: "See the camp", href: "/camp" },
]}
desert={{ sandColor: "#d9a066", skyColor: "#6d8fbf", sunHeight: 0.25, sunAngle: -32, ripples: 0.6 }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the heading |
heading | string | – | Headline, rendered as the page h1 |
description | string | – | Intro under the heading |
buttons | ActionButton[] | [] | The first renders as a light Button23 arrow pill, the rest as Button2 underline links |
desert | Omit<DuneFieldProps, "className" | "children"> | – | Forwards the DuneField component's props: sandColor, skyColor, hazeColor, sunColor, sunHeight, sunAngle, scale, ripples, speed, grain, interactive, paused |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
};text-white with opacity steps) over a black/60 to transparent gradient from the bottom, so it reads over bright sand in both themes. The desert is a lit scene, like a photograph, so it does not follow the theme.interactive is on; touch input is ignored.