FISTERRA — TEMPLATE GUIDE

Documentation

This is a Next.js + Tailwind CSS template — not the original static HTML version. Edit the files below directly; there is no config.js or build step beyond Next.js itself.

1. Overview

Key features

  • Bilingual ES/EN switcher built with a plain TypeScript dictionary — no i18n library required.
  • Tabbed tasting menus (Alborada / Fisterra / Cellar) with translated dish data per language.
  • Reservation form with time-slot picker and a success confirmation modal.
  • Editorial photo gallery using the bundled restaurant photography.

2. Project structure

src/app/templates/fisterra/
├── demo/
│   ├── page.tsx          // the live site (hero, menu, reservations, contact)
│   ├── translations.ts   // all UI text + menu data, in ES and EN
│   └── layout.tsx        // loads the Cinzel / Playfair Display / Montserrat fonts
└── docs/
    └── page.tsx          // this page

public/templates/fisterra/
├── hero_dish.png
├── chef_plating.png
└── restaurant_interior.png

3. Editing text & menus

All copy lives in one file: demo/translations.ts. It exports two objects:

  • UI short interface strings (nav labels, section titles, form labels), each with an es and en version.
  • MENUS the tasting-menu dishes, grouped by language and then by tab (alborada / fisterra / bodega).
// demo/translations.ts
export const MENUS = {
  es: {
    alborada: {
      price: "£125",
      dishes: [
        ["Vieiras de la Isla de Skye", "Entrante", "Láminas finas..."],
        // add or edit dishes here ↑
      ],
    },
  },
  en: { /* same structure, English copy */ },
};

Edit a dish in both the es and en blocks, or it will only show correctly in one language.

4. Styling

This port uses Tailwind utility classes with inline hex colors (e.g. bg-[#090c10], text-[#c5a880]) directly in demo/page.tsx — there is no central CSS variables file like the original HTML version.

The palette used throughout:

Background

#090c10

Surface

#121820

Gold accent

#c5a880

Text

#f5f6f8

To rebrand, find-and-replace these hex values inside demo/page.tsx.

5. Booking form

By default the form only shows a local success modal — it does not send an email anywhere yet. Wire it up before going live.

Open demo/page.tsx and find the handleSubmit function. The simplest option is Formspree:

const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
  e.preventDefault();
  const form = new FormData(e.currentTarget);
  await fetch("https://formspree.io/f/YOUR_FORM_ID", {
    method: "POST",
    body: form,
    headers: { Accept: "application/json" },
  });
  setSummary({ name: ..., guests: ..., date: ... });
  setShowModal(true);
};

North Kraken Studio — Fisterra v1.0 (Next.js port)