Overview
An unhurried, Parisian HTML template for a French bistro: set-price formules at lunch and dinner, a carte that tours one region of France a month, a glass of the region’s wine matched to every plate, a cheese trolley, private dining and a small wine cave with gift vouchers. Terroira ships three home pages, a light and a dark theme, right-to-left support, and logic that is worked out rather than typed in: the region on the carte from the visitor’s date, lunch or dinner served now, a formule priced as it is built, the booking slots from the kitchen’s hours, a private-dining estimate and a shop with a bag, coupon, delivery and tax.
What’s included
- 3 home pages, each with its own scroll moment: the cheese trolley rolls in with the month’s cheeses on flags; entrée, plat and dessert slide into one column as the formule assembles; the tablecloth is whipped away while the setting stays
- Le Tour de France: twelve regions, one a month, each with two entrées, three plats, two desserts, three cheeses and three wines by the glass — every page paints the region of the visitor’s month
- The formule builder: two or three courses, lunch or dinner, a dish per course with supplements, the matched glasses, the cheese trolley, covers and the day
- Five-step table booking: the terrace from April to October, the zinc counter for up to three, the region and formule of the day booked
- Wine by the glass, carafe and bottle; the year’s thirty-six glasses filtered by colour
- La Cave: drawn bottles and gift vouchers, filters, sort and search, product page, bag, coupon, free-delivery meter, tax, checkout with an order number, wishlist
- Light and dark mode on one switch in every header, remembered between visits and applied before the page paints
- Right-to-left stylesheets and a flag language picker in every header
- WebGL layers — Window Rain at the edges of the linen bands and page titles, and the footer’s etched still life in cross-hatching — tinted by the theme colours
- Butter Curl preloader, Letterpress reveals with a word rise on titles, the butter-spread hover, Swiper sliders and Fancybox popups
- Team and chef page, gallery, journal, FAQ with search, account pages, coming soon, 404
- Fully responsive, W3C-valid, zero console errors
Getting Started
Thank you for choosing Terroira. Follow the steps below to get your site live.
1. Open locally
Unzip the downloaded package and open terroira/index.html in any modern browser (Chrome, Firefox, Edge,
Safari). No build tools or server are required — the booking, the formule builder, the estimate and the shop all
work straight from the files.
2. Deploy to a server
Upload the contents of the terroira/ folder to your hosting provider using an FTP client (such as FileZilla)
or your hosting control panel. Once uploaded, navigate to your domain and the template will load immediately.
3. Customise
All custom styling lives in assets/css/style.css (with a numbered Table of CSS at the top) and
assets/css/responsive.css. Colours and fonts are controlled by CSS variables — see
Colors & Fonts. Hours, formules, the twelve regions, the classics, the rooms and the
shop rules live in one place — see Bistro Logic.
assets/img/ with your own photography at the
same dimensions for the best result. The drawn art in img/art/ and La Cave’s packshots in img/shop/ are included and ready to use.
File Structure
Below is an overview of the key files and folders included in this template.
index.html / homepage-2.html / homepage-3.html | Three home pages: Le Bistro (the cheese trolley), La Formule (the formule assembling), Le Tour (the tablecloth) |
about.html / our-history.html | The bistro, how the tour works, the kitchen staff; the history down a hairline timeline |
menu.html | La Carte: this month’s region by course with the matched glass and supplements, a month picker, the classics, the formules |
formules.html | The formule builder: courses, service, covers and the day, a dish per course, glasses and the trolley, priced a head and for the table |
regions.html / region-details.html | Le Tour de France: this month, the year of regions; the region page with its carte, cheeses and glasses |
wine-list.html | Wine by the glass: this month’s glasses, carafes and bottles, and the year’s thirty-six glasses filtered by colour |
reservations.html | Five-step table booking from the kitchen’s hours, with the region and formule of the day booked |
private-dining.html | Three rooms, menus by the head and a four-step estimate |
team.html / team-details.html | The kitchen staff; the chef’s page in the base’s split layout |
gallery.html | Photos with filter tabs and a lightbox |
shop.html / product-single.html / cart.html / checkout.html / wishlist.html | La Cave: bottles and vouchers with filters, sort and search, product, bag, checkout, wishlist |
blog.html / blog-details.html | The journal with search; a post with reading time, share and comments |
faq.html | Questions by topic with search |
contact.html | Contact cards with live open status, map, hours and the contact form |
account.html / login.html / register.html / forgot-password.html | The account (orders, tables, vouchers, details) and the login pages |
coming-soon.html / 404.html | Countdown to the second bistro, error page |
sendmail.php | AJAX mail handler for the contact and comment forms (see Contact Form) |
assets/css/style.css | All custom styles, numbered Table of CSS (16 sections) |
assets/css/responsive.css | Desktop-first breakpoints 1399 / 1199 / 991 / 767 / 575, plus wide screens from 1600 and 1960 |
assets/css/style.rtl.css / responsive.rtl.css | The right-to-left twins (see RTL) |
assets/css/plugins/ | Bootstrap (LTR and RTL), Swiper, Fancybox (vendor CSS) |
assets/js/main.js | All custom scripts, numbered JS INDEX (31 blocks) |
assets/js/plugins/ | jQuery, Bootstrap, Swiper, Fancybox, GSAP, ScrollTrigger |
assets/img/ | Images, one folder per section (see Images) |
assets/fonts/theme-icons/ | The sun and moon of the theme switch, loaded locally |
assets/webfonts/ + assets/css/fontawesome-all.css | Font Awesome Free, loaded locally |
Folder Structure
The package unzips to two folders: Documentation/ (this guide) and terroira/, the template.
Every page sits in the template’s root; everything the pages load sits under assets/:
terroira/
├── *.html the 30 pages, all in the root (see File Structure)
├── sendmail.php the AJAX mail handler for the forms
└── assets/
├── css/
│ ├── style.css all custom styles, numbered Table of CSS
│ ├── style.rtl.css the right-to-left twin of style.css
│ ├── responsive.css breakpoints 1399 / 1199 / 991 / 767 / 575
│ ├── responsive.rtl.css the right-to-left twin of responsive.css
│ ├── fontawesome-all.css Font Awesome Free, loaded locally
│ └── plugins/ vendor stylesheets
│ ├── bootstrap.min.css
│ ├── bootstrap.rtl.min.css Bootstrap for right-to-left pages
│ ├── jquery.fancybox.min.css
│ └── swiper-bundle.min.css
├── js/
│ ├── main.js all custom scripts, numbered JS INDEX (31 blocks)
│ └── plugins/ vendor scripts
│ ├── bootstrap.bundle.min.js
│ ├── gsap.min.js
│ ├── jquery-3.7.1.min.js
│ ├── jquery.fancybox.min.js
│ ├── ScrollTrigger.min.js
│ └── swiper-bundle.min.js
├── fonts/
│ └── theme-icons/ the sun and moon of the theme switch
├── webfonts/ Font Awesome Free font files
└── img/ images, one folder per section
├── art/ 5 files
├── blog/ 11 files
├── dishes/ 28 files
├── faces/ 6 files
├── flags/ 6 files
├── gallery/ 11 files
├── home/ 18 files
├── icons/ 18 files
├── logo/ 6 files
├── menu/ 3 files
├── shop/ 13 files
├── team/ 6 files
└── textures/ 2 files
To publish the site, upload the contents of terroira/ to your web root. Photos keep their folder,
file name and size when you replace them, so no page needs editing.
Colors & Fonts
The whole design is driven by CSS variables declared at the top of style.css. Change a token once and every
section, button and card updates. Colours used with transparency have an -rgb twin (for example
--tr-terra-rgb) — change both together.
--tr-marble--tr-terra--tr-display--tr-terra-deep--tr-blush--tr-butter--tr-bg--tr-linen--tr-mist--tr-heading--tr-text--tr-redWhite is the ground; linen carries the split panels and the bands, mist the guests’ voices. Terracotta sets the
outsized section titles and the hairline that runs in from the page edge under them; the deeper terracotta ink is the colour of
small eyebrows, labels and the solid buttons (white on it reads at AA). The blush draws the hand-drawn ellipse round the
italic buttons. Black marble is the footer. Butter belongs to the motion: the curl, the butter-spread hover and the still
life’s glint. --tr-bg, --tr-surface, --tr-linen, --tr-heading
and --tr-text are the semantic names the components use — the dark theme swaps those (see
Light & Dark Mode).
Fonts
Two Google Fonts are loaded in the head of each page: Fanwood Text (the capitals of every heading,
the lower-case italic connector words, prices and the italic buttons) and Libre Franklin (body,
navigation, eyebrows and labels in tracked capitals). Swap them by editing the Google Fonts link and the
--tr-ff-display / --tr-ff-body variables.
Logo
The logo is the name TERROIRA in widely tracked capitals whose O is a butter curl seen end on. It ships as ready-made
PNG files in assets/img/logo/:
logo.png— for light grounds: the white headers, the preloaderlogo-light.png— for photos and dark grounds: the header over a hero photo, the footer, dark modelogo-gap.png/logo-gap-light.png— the wordmark without its O, for the preloader’s curl to roll intomark.png— the curl alone in terracotta (the account and bare pages, the voucher cards)favicon.png— the browser tab icon
The logo’s lettering appears only inside the images. To use your own logo, replace logo.png and
logo-light.png; the header sizes the logo by its height, so a wider or narrower file needs no CSS change.
The preloader’s O position is set in CSS (.pre-o) — replace the gap files too, or remove the
preloader block.
Light & Dark Mode
Every header (and the mobile menu) has a theme switch. The choice is saved in the browser under the key
terroira-theme and applied by a one-line script in the <head> before the page paints, so a
dark visitor never sees a light flash. The switch sets data-theme="dark" on the <html> tag.
--tr-bg--tr-surface--tr-linen--tr-heading- Tokens — the dark values sit in one block,
[data-theme="dark"] { … }, right after:rootinstyle.css. Change a dark colour there. - Bands that stay dark — sections with the class
is-night(the footer, the booking summary, the estimate and the formule summary) are marble in both themes. A light card placed inside one takestr-on-lightto keep its own ink. - Packshots — La Cave’s bottles and vouchers keep their linen ground in both themes.
- Illustrated icons — each icon ships in an ink and a cream version; the right one shows by theme and ground on its own.
- Start dark — to open the site dark for first-time visitors, add
data-theme="dark"to the<html>tag of each page; the switch still works and is still remembered.
Bistro Logic
The figures on every page come from one data block, JS block 08 Bistro Data near the
top of main.js (var BISTRO). Edit it once and the cartes, prices, glasses, slots and totals follow.
Prices are in US dollars; times are minutes after midnight (720 = 12:00 pm); weekdays run 0 = Sunday to 6 = Saturday;
months run 0 = January to 11 = December.
hours | Lunch and dinner for each weekday ([] = closed; the kitchen rests on Monday). The top bar’s served-now line, the hours lists, the formule builder and the booking slots read it. |
formules | The set-price formules: the courses each holds and its lunch and dinner price a head (Entrée + Plat $29 lunch, $38 dinner; Plat + Dessert $27 lunch, $35 dinner; Entrée, Plat & Dessert $36 lunch, $46 dinner). |
regions | Le Tour de France, one region a month: Jan Alsace, Feb Savoie & The Alps, Mar Normandie, Apr Provence, May Loire Valley, Jun Bretagne, Jul Pays Basque, Aug Nice & The Riviera, Sep Bourgogne, Oct Lyonnais, Nov Bordeaux & The Southwest, Dec Champagne. Each holds its dishes (course, name, note, price, the supplement inside a formule, the glass that matches it, a photo, v / gf tags), three cheeses and three wines with the glass, carafe and bottle price. Keep two entrées, three plats, two desserts, three cheeses and three glasses in every region: the pages are laid out for that many. |
classics / trolley | The dishes on the carte all year (à la carte only), and the price of three cheeses from the trolley ($12). |
booking | The largest party online (8), how far ahead (60 days), the slot step and the last seating before close; the seatings, each with its party limit and, for The Terrace, its months. |
rooms / packages / eventExtras / service | Private rooms (guests from–to, hire), menus by the head, extras (by the head or flat) and the service charge. |
team | The kitchen staff: name, role, portrait, face and years. |
cats / products / shop | La Cave: 12 products in 4 categories; free delivery from $120, otherwise $12 (express $24), tax 9.45%, coupon TERROIR10 for 10% off. Vouchers are emailed: a bag of vouchers alone pays no delivery. |
The region of the month
Every region section is written in the page for one month and carries data-rd paths (for example
data-rd="plats.0.name"); block 09 works out the visitor’s month and repaints
each path from that month’s region, so the carte, the arches, the wine cart, the cheeses and the top bar always show
the region on the carte today. The year grid marks the toured months, this month and the next. Date fields name the
region of the day they hold, and the booking and the formule builder price the day booked.
How a formule is priced
A head: the formule’s lunch or dinner price, plus the supplement of each dish chosen, plus the matched glass of each course if glasses are on, plus the cheese trolley if added. The table total multiplies by the covers.
Private dining
Only the rooms that can seat the party are offered. The estimate is the room hire, plus the menu by the head for every guest, plus the extras, plus 20% service on the food, drink and extras; a quarter of it holds the date.
How La Cave totals
TERROIR10: $68.00 − $6.80,
delivery $12.00, tax $5.78 — $78.98.The bag, the wishlist and the applied coupon are kept in the browser (localStorage), so they follow the
visitor from page to page. The first visit starts with a small demo bag and wishlist so every shop page has something to
show; to start empty, set the two demo lists in doShop() (block 25 La Cave Shop)
to []. Checkout, table booking and the dining enquiry confirm on screen with a reference — connect them
to your own systems to take real orders and bookings.
WebGL Layers
Two small WebGL shaders draw the moving layers: Window Rain — beads running down a café window with their wet trails, held to the two side edges of the linen bands and the page titles — and the Still Life — a bottle, a glass, a baguette and a wedge of cheese drawn in the browser as three tone plates and etched in cross-hatching in the footer while a light travels across them. Each is one canvas:
<canvas class="tr-gl" data-gl="rain" aria-hidden="true"></canvas>
- Colours — each layer reads three colours and an opacity from CSS variables on its canvas or
section:
--gl-1,--gl-2,--gl-3and--gl-alpha. The theme switch repaints them. - Performance — a layer only runs while its section is on screen and the tab is visible. Visitors who prefer reduced motion get one still frame. Without WebGL, the section’s own background shows.
- Remove one — delete the canvas; nothing else depends on it.
RTL (Right To Left)
Terroira is RTL-ready: the layout with its paddings and margins, the sliders and the animations all mirror. Right to
left comes from the stylesheets, not from separate pages: the language picker (a flag and a code) beside the light / dark
switch lists the languages that read left to right and right to left. Choosing Arabic stores the language and the
direction (keys terroira-lang and terroira-dir) and reloads; the one-line script in <head>
then sets dir="rtl" and swaps the three stylesheets for the files named in their data-rtl
attribute before the page paints. Nothing is translated — you bring your own right-to-left copy. To make a page
right to left for good:
1. Set The Direction
Add dir="rtl" to the page’s <html> tag (and set lang to your language):
<html lang="en" class="no-js" dir="rtl">
2. Swap Three Stylesheets
assets/css/plugins/bootstrap.min.css | → assets/css/plugins/bootstrap.rtl.min.css |
assets/css/style.css | → assets/css/style.rtl.css |
assets/css/responsive.css | → assets/css/responsive.rtl.css |
The scripts read the direction from the dir attribute: sliders and every move that must mirror follow it
on their own. Prices keep reading left to right inside their rows.
style.rtl.css and responsive.rtl.css are mirrored
twins of the LTR files, made with RTLCSS. A few hand-made rules at the end of style.rtl.css (after
RTL fixes) keep what must not mirror. If you change style.css, regenerate the twin with
npx rtlcss style.css style.rtl.css and copy the RTL fixes block back to its end.JavaScript Guide
All custom behaviour lives in assets/js/main.js, wrapped in a jQuery IIFE and organised into 31 numbered
blocks (see the JS INDEX comment at the top of the file):
- 01–07 — Preloader, Sticky Header, Offcanvas Menu, Back To Top, Anchor Scroll, Light & Dark Mode, Direction, WebGL Layers. The core every page shares: the Butter Curl preloader, the header, the offcanvas, the theme and direction switch and the WebGL layers.
- 08–09 — Bistro Data, Bistro Clock & Region Of The Month. Bistro Data holds every figure; the clock works out lunch or dinner now, and the region painter sets the region of the visitor’s month on every page.
- 10–18 — Custom Select, Scroll Reveals, Hero Sliders, Card Sliders, Accordion, Filter Tabs, Grid Search, Newsletter, Choice Cards. Shared components: the selects, the Letterpress reveals and word rise, sliders, accordions, filters, search, forms.
- 19–21 — Cheese Trolley, Formule Assembly, Tablecloth. The three home pages’ scroll moments.
- 22–31 — Table Booking, Private Dining, Contact Form, La Cave Shop, Account Forms, Formule Builder, Article Tools, Demo Forms, Launch Countdown, FAQ Search. The feature pages: table booking, private dining, contact, La Cave, accounts, the formule builder, articles, FAQ, the countdown.
Each block is a self-contained doSomething() function that safely skips pages where its section is not
present — you can delete any block you do not need. Every animation respects prefers-reduced-motion
automatically: content appears in its final state and the scrubbed scenes rest in place.
tr-press to a photo frame or a card so it is pressed in like a
letterpress impression, tr-words to a title so its words rise into place, tr-place to a card and
tr-fade to text so they rise softly, and tr-rule for the short rule under a lead.
data-delay="0.2" staggers any of them. The butter-spread hover is on every card already.doLaunchCountdown().Images
The download package ships with neutral placeholder images so you can see every layout at the correct dimensions.
Replace them with your own photos using the same file names, or update the src attributes — and the
img paths in the data block for the region dishes. Images are grouped inside assets/img/:
img/art/ | The drawn scroll-moment art: the cheese trolley and its wheel, the bistro table, the tablecloth, the place setting (included) — 5 files: 1400×560, 1400×760, 300×300, 1200×820 |
img/blog/ | Journal posts and dish photos — 11 files: 1400×967, 2818×1947, 2926×2021, 300×400, 550×350 |
img/dishes/ | Plated dishes of the regions — 28 files: 800×800, 950×634, 500×500, 350×170, 400×400, 450×450, … |
img/faces/ | Round portraits for bylines, voices and avatar groups — 6 files: 240×240 |
img/flags/ | The language picker’s flags (SVG, included) — 6 files: SVG |
img/gallery/ | Gallery photos and wide page-title banners — 11 files: 1400×846, 2818×1703, 2926×1768 |
img/home/ | Home and inner page photos, heroes and photo bands — 18 files: 1468×1651, 2816×3171, 2851×936, 2929×2914, 400×600, 2934×2709, … |
img/icons/ | Illustrated line icons, each in an ink and a cream version (included) — 18 files: 128×128 |
img/logo/ | The wordmark, its light version, the gap versions for the preloader, the curl mark and the favicon (included) — 6 files: 892×112, 64×64, 256×256 |
img/menu/ | Home previews in the mega menu — 3 files: 560×350 |
img/shop/ | La Cave’s drawn bottles, vouchers and a label close-up (included) — 13 files: 800×800 |
img/team/ | Kitchen team portraits — 6 files: 466×692, 1300×1391 |
img/textures/ | The drawn black and white marble (included) — 2 files: 1600×900, 800×1000 |
The logo files, the illustrated icons, the language flags, the drawn marble, the scroll-moment art and La Cave’s packshots are included and ready to use. All demo photography shown on the live preview is for preview purposes only and is not included in the download.
Contact Form
The contact form and the comment form post to sendmail.php, a lightweight AJAX mail handler. The success
or error message appears under the button without reloading the page. The newsletter, table booking, dining enquiry,
checkout, account, login, register and forgot-password forms are demo forms: they confirm on screen and are ready to
connect to your own systems. To activate the mail handler on your server:
1. Set your email address
Open sendmail.php and replace the placeholder recipient at the top of the file with your own address:
$email = 'example@example.com';
2. Upload to a PHP host
The form needs a server with PHP mail() support (virtually every shared host). It will not send from your
local computer or from a static-only host — there the form shows a friendly “upload to a PHP-enabled
host” notice instead.
3. Optional: enable Google reCAPTCHA v3
Invisible reCAPTCHA v3 spam protection is already built into the handler. It stays dormant until the form submits a token — that is why no badge or checkbox appears out of the box. To switch it on:
- Create v3 keys (a site key and a secret key) for your domain in the Google reCAPTCHA admin console
- In
sendmail.php, replaceYOUR_RECAPTCHA_V3_SECRET_KEYwith your secret key - In
contact.html, add a hidden token field inside the form and load the reCAPTCHA script with your site key just before</body>:
<!-- inside the form -->
<input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response">
<!-- before the closing </body> tag -->
<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
<script>
grecaptcha.ready(function () {
grecaptcha.execute('YOUR_SITE_KEY', { action: 'contact' }).then(function (token) {
document.getElementById('g-recaptcha-response').value = token;
});
});
</script>
Once the token field is present, sendmail.php verifies every submission with Google and rejects low-score
(bot) requests.
Credits
This template is built using the following open-source libraries and resources.
- Bootstrap 5.3.3
- jQuery 3.7.1
- Swiper 11
- GSAP 3 + ScrollTrigger
- Fancybox 3.5
- Font Awesome Free
- RTLCSS
- Google Fonts: Fanwood Text, Libre Franklin
All plugin files and icon fonts are loaded locally. The only external requests are the Google Fonts stylesheet, the Google Maps embed and the video popups.
Support
If you have any questions or need help with the template, please reach out through the marketplace where you purchased the template: open the item there and send us your question from its support page. We aim to respond within 24–48 hours.