ALL PROJECTS/CÀ PHÊ ĐÁ — VIETNAMESE CAFÉ, MARSEILLE

Overview

Cà Phê Đá is a Vietnamese cafe on the Vieux-Port in Marseille, serving bánh mì, café vietnamien and soft-serve ice cream. The site is a brand-led landing page: a single scrolling narrative that moves from hero through house specialities, the in-store experience, customer testimonials, and a location map, closing on a call to visit. It serves people deciding where to eat in the neighbourhood — the reader is usually on a phone, and the outcome that matters is a walk to the Vieux-Port.

Problem

A neighbourhood cafe has no funnel and no catalogue. What it has is atmosphere — the smell of the coffee, the texture of the bread, the fact that everything is made in-house each morning — and none of that survives a generic template. The problem was to build a web presence that carries the character of a specific room in a specific city, in French, for an audience that will make its decision in under a minute, and then to close that decision with something more useful than a street address: a map they can actually orient themselves against. The engineering constraint follows directly from the product one. An atmosphere-first page is typography-heavy and image-heavy, which is exactly the kind of page that becomes slow, and a slow page loses the minute it was given.

System Design

How It Works

01/03
01

Page Composition and Render

A request resolves through the Next.js 14 App Router and assembles the café's narrative sections into server-rendered HTML with no component JavaScript attached.

  1. 1A request hits the Next.js 14 App Router, which resolves the root route in /app.
  2. 2The route's layout applies the global Tailwind stylesheet and the three next/font font variables to the document root.
  3. 3The page assembles the section components in narrative order — hero, Fait maison chaque jour, Nos incontournables, L'expérience, Ils parlent de nous, the Vieux-Port location block, and the Prêt à venir CTA with footer.
  4. 4Every section except the map renders on the server as a React server component, so its markup ships as HTML with no accompanying component JavaScript.
  5. 5Tailwind's compiled stylesheet and the self-hosted font files are served from the same origin, giving the browser a complete, styled first paint.
  6. 6Only the client-boundary map component's bundle is requested for hydration.
02

Interactive Location Map

The Vieux-Port location section defers all Leaflet work past the server render, mounting an interactive map as the page's single hydrated island.

  1. 1The location section renders its container and heading on the server, reserving the map's dimensions so the surrounding layout does not shift.
  2. 2The nested client component mounts in the browser after hydration, deferring all Leaflet work — Leaflet requires window and document at instantiation.
  3. 3An effect constructs the Leaflet map instance, centred on the café's Vieux-Port coordinates at a walkable zoom level.
  4. 4The tile layer attaches and raster tiles stream in over the reserved container, with a marker placed at the café.
  5. 5Pan and zoom handlers let the reader situate the café relative to wherever they happen to be standing.
  6. 6The effect's cleanup tears the map instance down on unmount, releasing Leaflet's listeners.
03

Typographic System Assembly

Three typefaces carrying three brand registers are self-hosted at build time and wired into Tailwind, eliminating third-party font requests and fallback layout shift.

  1. 1Playfair Display, Inter and Caveat are declared as next/font imports, each pinned to the subsets and weights the design actually uses.
  2. 2The build downloads and self-hosts the font files into the output, so no font request leaves the origin at runtime.
  3. 3Each face is exposed as a CSS custom property on the root element and wired into tailwind.config.ts as a named font family.
  4. 4Sections reference the families through Tailwind utilities — Playfair for display headings, Inter for body and UI, Caveat for handwritten accents.
  5. 5Because the @font-face rules are inlined and the files are same-origin, text paints in its final face without a fallback swap or cumulative layout shift.

Key Features

  • Atmosphere-first, image-led single-page design that captures the café's mood
  • Interactive Leaflet location map, isolated as the page's single hydrated client island
  • Almost entirely server-rendered — every section but the map ships as HTML with no component JavaScript
  • Self-hosted three-typeface system (Playfair · Inter · Caveat) via next/font, with no fallback layout shift
  • Scroll-reveal and ambient-motion system layered over crafted French sections
  • House-speciality, must-haves and experience sections with rich food photography
  • Visitor reviews and a Google-rating strip building trust
  • Fast, fully responsive, and built as 12 focused components

Outcomes

  • An atmosphere-first brand presence that reads like the café itself
  • A page that ships almost no JavaScript — server-rendered but for a single map island
  • A clear path from screen to the Vieux-Port via a genuinely interactive map
  • A polished, fast, fully-responsive French landing page

More work

TourAxis preview
TRAVEL PLATFORM

TourAxis

A governed tourism marketplace for planning, booking and paying for trips

VIEW PROJECT