Kelda Lodge, a dark-sky retreat in the high valley
12 cabins, no street lights for 40 miles and a guide on the terrace every clear night. Bring a warm coat, we have the telescopes.
A full-bleed dark-sky lodge hero over the star-trails background component: a long-exposure night photograph where thousands of coloured stars sweep continuous arcs around a pole above the frame, the exposure building up over the first seconds and then turning slowly, over layered ridges and a pine forest line that shift gently with the cursor. A light semibold headline, an intro, an Arrow Pill and an underline link rise in at the lower left over a soft shade. Every sky setting passes through the sky prop.
A full-bleed night hero over a StarTrails WebGL long exposure where colored stars sweep arcs around a pole above the frame, the exposure building over the first seconds, above ridges and a forest line that shift with the cursor, with a light headline, an intro, an Arrow Pill and an underline link rising in at the lower left.
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/hero258?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero258?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero258.tsx plus the star-trails background and the button23 and button2 buttons it uses.
The installed file exports hero258Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero258, hero258Demo } from "@/components/beste/block/hero258";
export default function Page() {
return <Hero258 {...hero258Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero258 } from "@/components/beste/block/hero258";
export default function Page() {
return (
<Hero258
eyebrow="Kelda Lodge, a dark-sky retreat"
heading="Stay up for the sky."
description="12 cabins, no street lights for 40 miles and a guide on the terrace every clear night."
buttons={[
{ label: "Check clear nights", href: "https://beste.co" },
{ label: "See the cabins", href: "/cabins" },
]}
sky={{
skyColor: "#03050b",
horizonColor: "#b0643a",
landColor: "#010203",
poleX: 0.66,
poleY: -0.12,
silhouette: "forest",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the headline |
heading | string | – | Headline, rendered as the page h1 |
description | string | – | Intro paragraph under the headline |
buttons | ActionButton[] | [] | The first renders as a light Arrow Pill (Button23), the rest as underline links (Button2) |
sky | Omit<StarTrailsProps, "className" | "children"> | – | Forwards StarTrails props: skyColor, glowColor, horizonColor, landColor, stars, exposure, poleX, poleY, horizon, silhouette, progress, grain, speed, interactive, paused |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
};
type Silhouette = "forest" | "ridges" | "none";mt-auto, over a black gradient on the lower 66%.text-white, text-white/70) with a light Arrow Pill to stay readable on it.poleY puts the pole above the frame, so the demo shows long arcs instead of full circles. silhouette picks the land line: "forest", "ridges" or "none".sky.progress (a number or anything with a get(), such as a scroll MotionValue) drives the exposure from outside instead of by time.