A feature section for a trip planner that plans around the light: four moments of one day (first light, midday, golden hour, after dark), each on a Golden Hour scene lit for its hour, with the plan's stop on a frosted card. Rest on a moment and its light moves on most of an hour.
registry/blocks/golden-hour-features.tsx
"use client";
import * as React from "react";
import { GoldenHour } from "@/components/ui/golden-hour";
import { cn } from "@/lib/utils";
/* ── Content ─────────────────────────────────────────────────
* Everything you'd change to make the section yours: the copy
* and the four moments of a planned day, each with the hour its
* scene is lit for and the hills it's drawn with (`seed`).
* ─────────────────────────────────────────────────────────── */
const EYEBROW = "Plans around the light";
const HEADLINE = "Every day is planned around sunrise and sunset.";
const SUBLINE =
"Meander knows when the light is best, when it's gone and when the last train leaves, and builds each day around all three.";
type Moment = {
light: string;
time: string;
title: string;
detail: string;
hour: number;
seed: number;
horizon: number;
road?: boolean;
wide?: boolean;
};
const MOMENTS: Moment[] = [
{
light: "First light",
time: "06:52",
title: "Sunrise from the north ridge",
detail: "Leave the inn at 06:10. Forty minutes on the marked trail, headlamp optional.",
hour: 6.5,
seed: 11,
horizon: 0.52,
wide: true,
},
{
light: "Midday",
time: "12:30",
title: "Lunch where the boatmen eat",
detail: "Table for two at Casa Rio, booked.",
hour: 12.6,
seed: 5,
horizon: 0.5,
road: false,
},
{
light: "Golden hour",
time: "17:50",
title: "The old mill at its best",
detail: "Light is warmest until 18:20. Twelve minutes by car.",
hour: 17.7,
seed: 8,
horizon: 0.5,
road: false,
},
{
light: "After dark",
time: "19:48",
title: "Last train back, then the stars",
detail: "Platform 2 at Vila Brava. Clear skies forecast from 21:00.",
hour: 21.4,
seed: 2,
horizon: 0.52,
wide: true,
},
];
/** Hours the light moves on while a visitor rests on a moment. */
const LINGER = 0.8;
/* ── Section ─────────────────────────────────────────────── */
export function GoldenHourFeatures() {
const [resting, setResting] = React.useState<number | null>(null);
return (
<section
aria-labelledby="golden-hour-features-title"
className="bg-[#f3f1ec] text-zinc-950 dark:bg-zinc-950 dark:text-white"
>
<div className="mx-auto max-w-6xl px-6 py-24 sm:py-32">
<div className="max-w-2xl">
<p className="text-sm font-medium text-zinc-500 dark:text-zinc-400">{EYEBROW}</p>
<h2
id="golden-hour-features-title"
className="mt-3 text-4xl/[1.05] font-medium tracking-[-0.035em] text-balance sm:text-5xl/[1.02]"
>
{HEADLINE}
</h2>
<p className="mt-5 max-w-xl text-base/7 text-pretty text-zinc-600 sm:text-lg/8 dark:text-zinc-400">{SUBLINE}</p>
</div>
<ul className="mt-14 grid gap-4 md:grid-cols-5">
{MOMENTS.map((moment, index) => (
<li
key={moment.title}
className={cn(moment.wide ? "md:col-span-3" : "md:col-span-2")}
onPointerEnter={(event) => event.pointerType === "mouse" && setResting(index)}
onPointerLeave={() => setResting((current) => (current === index ? null : current))}
onFocus={() => setResting(index)}
onBlur={() => setResting((current) => (current === index ? null : current))}
>
<GoldenHour
time={moment.hour + (resting === index ? LINGER : 0)}
seed={moment.seed}
horizon={moment.horizon}
road={moment.road ?? true}
className="flex h-80 flex-col justify-between rounded-3xl p-4 sm:h-96 sm:p-5"
>
<p className="self-start rounded-full bg-zinc-950/25 px-3 py-1 text-xs font-medium text-white ring-1 ring-white/20 backdrop-blur-xl">
{moment.light}
</p>
<a
href="#plan"
className="block max-w-sm rounded-2xl bg-white/80 p-4 text-zinc-950 shadow-sm ring-1 ring-white/60 backdrop-blur-xl transition-[background-color] duration-200 outline-none hover:bg-white/90 focus-visible:ring-2 focus-visible:ring-zinc-950 dark:bg-zinc-950/60 dark:text-white dark:ring-white/10 dark:hover:bg-zinc-950/70 dark:focus-visible:ring-white"
>
<span className="flex items-baseline gap-2">
<span className="text-sm font-semibold tabular-nums">{moment.time}</span>
<span className="text-[15px] font-medium tracking-tight">{moment.title}</span>
</span>
<span className="mt-1 block text-sm/6 text-pretty text-zinc-600 dark:text-zinc-300">{moment.detail}</span>
</a>
</GoldenHour>
</li>
))}
</ul>
</div>
</section>
);
}
Live preview and the components it's built with: https://keyframeui.com/blocks/feature-sections/golden-hour-features