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.
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 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.