Restaurant / Fine diningSelf-initiated study

Kámini

Self-initiated study, no client: Kámini is a fictional restaurant on Santorini. The site is real, built on Next.js 16, and live at kamini-xi.vercel.app.

Arrival at Kámini: the headline An island. Held in light. above the Santorini caldera at dusk, village lights in the distance

The problem

Greek fine-dining sites usually come down to a PDF menu and a third-party booking form. The experience the restaurant actually sells, the table at the cliff's edge, the light going down, the rhythm of the evening, is lost before anyone picks up the phone.

We wanted to try the opposite: a page that plays like one continuous night in four movements, arrival, the menu, the terrace, the reservation.

The approach

Built on Next.js 16 with React 19 and TypeScript, with GSAP ScrollTrigger directing the scroll and Lenis smoothing it. The centrepiece is the menu dial: seven courses on a wheel that turns as you scroll, one plate in the light at a time.

Motion is a privilege, not a requirement: under prefers-reduced-motion or prefers-reduced-data the same page is served as a calm static layout with the full content. The reservation form is validated with Zod.

Facts

Status
Live at kamini-xi.vercel.app
Build
Next.js 16 + React 19, TypeScript
Motion
GSAP ScrollTrigger + Lenis + Motion
Menu
7 courses on a rotating dial
Reduced motion / data
Full static fallback
Reservation form
Validated with Zod
The Kámini menu dial: a plate of cuttlefish and wild fennel at the centre of a dark table, with the title Seven courses. One rhythm. on the left

The outcome

The full cinematic layer runs only on desktop with normal motion settings. Everyone else, phones, reduced motion, slow connections, gets the calm version, and not a single course is missing from it.

It stands as the proof of our React work: the same care we put into static HTML, carried over to a full framework when the project calls for it.

See it live