Case study · Wine estate site

Maison Verdal

The site a family estate deserves: bilingual, in order for selling alcohol online, and light enough to open from an Instagram link.

Role: design, copy, development, launch2025 — 2026Next.js · Tailwind · next-intl · Vercelvantahq.xyz ↗
The Maison Verdal home page: the château and its vines at daybreak, full frame, with the estate name set over it.
01/ Context

A site worth what the bottle is worth

The starting point: a family estate, two cellar-worthy cuvées sold direct, a terroir with a story to tell, and an online presence that carried none of it. Everything was produced in one piece and forms a single object: brand voice, French and English copy, the processing pipeline for the photographs and the film, a full set of legal pages, and the front end.

02/ The problem

What makes a wine site beautiful makes it slow

  1. 01

    A wine site lives by photography: the vines, the barrels, the bottle on the table. The full-frame image is the whole argument that justifies the price of the bottle. It is also the fastest way to make a page unusable on a phone.

  2. 02

    Most visits arrive from a phone, from an Instagram link, in a moment of curiosity. Nobody waits for a background image to load, and nobody survives a desktop menu squeezed down to 375 px.

  3. 03

    Selling alcohol online means an age check, a responsible-drinking statement and seven legal and service pages. Regulators and payment providers expect them; a gate placed in front of the content is also the first thing that can kill the visit.

03/ Solution

One narrative page, two languages, a media pipeline that keeps it fast

The site is a single scroll — home, wines, winemaking, technical sheets and film, gallery, table accessories, the story of the estate — backed by seven standalone pages: story, contact, FAQ, delivery and returns, privacy, terms, cookies. Every photograph and the film go through a scripted optimisation pass with fixed settings per image role (background, card, portrait): total weight was divided by more than ten, with no visible loss on screen. Switching FR/EN is instant — no reload, no scroll position lost — and the choice is remembered for the next visit.

The age check is a real barrier, not a decoration: it blocks scrolling until it is answered, keeps the answer, and handles a refusal properly. Compliance you can scroll past is not compliance.

04/ Key decisions

What had to be refused

Why a blocking age check rather than a banner?

A banner is scenery; a gate is a control. This one bars access to the content until the visitor has confirmed, keeps the answer so the same person is not asked twice, and handles a refusal with a clean exit rather than a dead end. It is the mechanism a payment provider looks for when the account is opened.

Why a scripted media pipeline rather than compressing by hand?

An export tuned by hand is a one-off feat that does not hold over time: the first seasonal photo added afterwards undoes it. Here the optimisation is a script with fixed settings per image role, with automatic AVIF/WebP delivery at the size of the visitor’s screen. A new batch of photos goes back through the same path in minutes, with a single command, and the settings live in the repository.

Why hand-written scroll animations rather than a library?

The section reveals and the gallery parallax hold in a few dozen lines of intersection logic; a full animation library would weigh more than everything the photo optimisation gained.

Why a written voice guide rather than simply “writing well”?

The copy follows an explicit rule: no filler, no slogan without a fact, only the concrete — the slope, the vintage, the grape, the number of barrels. The rule applies with the same severity to English and to French. Written down, it survives the next content update; kept in the head of whoever writes, it does not.

05/ Visuals

What the visitor sees

The three cuvées in the shop with grape, ageing and number of bottles, above the vintage, alcohol, volume and region strip.
1440 px · technical sheet
The age check on first load: the content stays blurred behind it, two possible answers, no way around the side.
390 px · before any content access
06/ Internals

Localisation, rendering, media

Next.js App Router, React 19, TypeScript. All the text — the seven legal pages, the form labels and the photo captions included — lives in the next-intl message catalogues, at FR/EN parity. The chosen language is kept client-side and preserved from page to page, so it never resets mid-visit. The contact forms and the FAQ are validated by React Hook Form and Zod, one schema per form.

Pages rendered server-side: fast first paint and correct indexing with no extra work. The interface primitives — accordion, dialog, menu, tabs, tooltips — come from Radix UI, so keyboard navigation and screen-reader semantics are right by construction rather than patched afterwards. The design system is a set of Tailwind v4 tokens: the whole palette and the spacing scale can be repointed without touching layout code. The mobile menu is a full screen drawn separately, with its own animation and its own scroll lock, not a compressed desktop bar. It is covered by a Playwright test run before every deployment.

Images are served as AVIF/WebP, sized for the visitor’s screen, and appear on scroll through a dedicated component. The estate film is stripped of its audio track, compressed for the web with a fast-start profile and a poster image, so it never blocks the rest of the page. The optimisation settings are versioned in the repository, as a script, image role by image role. Net result: more than ten times lighter than the original files.

07/ Results

What exists today

10×lighter than the original files, with no visible loss on screen
0cookie banners: the audience measurement asks for none
7legal and service pages on top of the main page
2languages at full parity, legal pages included

On this project everything came from the same hand: the brand voice and the French and English copy, the processing pipeline for the photographs and the film, the seven legal pages, and the front end. It is the complete version of what I do — when there is nothing to take over, you also have to decide what the site says.

  • —Site in production and domain
  • —Full code repository
  • —Reusable media optimisation script and its documentation
  • —Brand voice guide and FR / EN copy

A project of the same order? Describe it in five lines.

A reply within 1 hour, a quote within 24 hours, on working days. A message binds you to nothing.

or contact@kolomiiets.fr