Overview

Larderia template home pages

A warm, crafted HTML template for a restaurant with its own deli and larder shop: sauces, oils, spices, pasta, wine and hampers from the kitchen, long-table dinners with seats and private events. Larderia ships three home pages, a light and a dark theme, right-to-left support, and logic that is worked out rather than typed in: open now, today’s dish by weekday, the table slots from the kitchen’s hours, the next date and the seats left at every dinner, a hamper priced as it is filled, a private-event estimate and a shop with a bag, coupon, shipping and tax.

What’s included

  • 3 home pages, each with its own scroll moment: Larder Shelves (three shelves of jars slide in at three speeds), Jar To Plate (a jar unscrews and the dish made from it rises out) and Deli Ticket (a counter ticket prints line by line)
  • 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: a right-to-left language turns any page around
  • WebGL layers — Brown Paper, a slow crumpled kraft relief, and the footer’s cheese wheel whose wedge cuts away — tinted by the theme colours
  • Dish of the day picked by weekday from the clock, a week strip and the larder jar each dish is cooked from
  • The larder shop: categories, price filter, sort and search, product page, bag, coupon, free-shipping meter, tax, checkout with an order number, wishlist
  • Hamper builder: a kraft box, a willow basket or an oak crate filled from the larder, drawn from its own items, 10% off when full, ribbon and card
  • Long-table dinners from repeat rules: a calendar by month, the table drawn seat by seat, seat booking
  • Four-step table booking from the kitchen’s hours, and a four-step private-event estimate by room, menu and guests
  • Menu with course tabs and dietary marks, team and chef profile, gallery, journal, FAQ with search, account pages, coming soon, 404
  • Cheese Wire preloader, Paper Parcel reveals, the paper-fold hover, Swiper sliders and Fancybox video popups
  • Fully responsive, W3C-valid, zero console errors
📄 30 HTML files

Getting Started

Thank you for choosing Larderia. Follow the steps below to get your site live.

1. Open locally

Unzip the downloaded package and open larderia/index.html in any modern browser (Chrome, Firefox, Edge, Safari). No build tools or server are required — the booking, the dinners, the hamper builder, the estimate and the shop all work straight from the files.

2. Deploy to a server

Upload the contents of the larderia/ 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, dishes, the menu, the larder, hampers, dinners, rooms and the shop rules live in one place — see Larder Logic.

Tip: Replace the neutral placeholder images in assets/img/ with your own photography at the same dimensions for the best result. The arch-cut dishes in img/dishes/ and the cut-outs in img/shop/cut/ are transparent PNGs.

File Structure

Below is an overview of the key files and folders included in this template.

index.html / homepage-2.html / homepage-3.htmlThree home pages: Restaurant & Larder (Larder Shelves), Deli & Larder (Jar To Plate), The Long Table (Deli Ticket)
about.html / our-history.htmlThe kitchen and its larder, the years line, the team; the history in four chapters
menu.htmlThe menu by course with tabs, dietary marks and the chef’s picks, today’s dish
dish-of-the-day.htmlToday’s dish from the clock, the week’s seven dishes with their jars, the hours
reservations.htmlFour-step table booking from the kitchen’s hours, with the summary beside it
team.html / team-details.htmlThe kitchen team, a chef profile
gallery.htmlPhotos with filter tabs and a lightbox
shop.html / product-single.html / cart.html / checkout.html / wishlist.htmlThe larder shop: filters, sort and search, product, bag, checkout, wishlist
hampers.htmlThe hamper builder: a base, places filled from the larder, a ribbon and a card, ready-made hampers
long-table.html / long-table-details.htmlLong-table dinners by date with month tabs; one dinner with its courses, the table seat by seat and seat booking
private-events.htmlRooms, menus by the head and a four-step estimate
blog.html / blog-details.htmlThe journal with search; a post with reading time, share and comments
faq.htmlQuestions by topic with search
contact.htmlContact cards with live open status, map, hours and the contact form
account.html / login.html / register.html / forgot-password.htmlThe account (orders, saved hampers, seats, details) and the login pages
coming-soon.html / 404.htmlCountdown to the second larder, error page
sendmail.phpAJAX mail handler for the contact and comment forms (see Contact Form)
assets/css/style.cssAll custom styles, numbered Table of CSS (16 sections)
assets/css/responsive.cssDesktop-first breakpoints 1399 / 1199 / 991 / 767 / 575, plus wide screens from 1600 and 1960
assets/css/style.rtl.css / responsive.rtl.cssThe right-to-left twins (see RTL)
assets/css/plugins/Bootstrap (LTR and RTL), Swiper, Fancybox (vendor CSS)
assets/js/main.jsAll custom scripts, numbered JS INDEX (33 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.cssFont Awesome Free, loaded locally

Folder Structure

The package unzips to two folders: Documentation/ (this guide) and larderia/, the template. Every page sits in the template’s root; everything the pages load sits under assets/:

larderia/
├── *.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 (33 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
        ├── banner/                      15 files
        ├── blog/                        19 files
        ├── dishes/                      6 files
        ├── faces/                       7 files
        ├── flags/                       6 files
        ├── home/                        20 files
        ├── icons/                       30 files
        ├── logo/                        5 files
        ├── menu/                        3 files
        ├── shop/                        38 files
        ├── team/                        11 files
        └── textures/                    3 files

To publish the site, upload the contents of larderia/ 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 --lr-bronze-rgb) — change both together.

Forest--lr-forest
Bronze--lr-bronze
Bronze Button--lr-bronze-deep
Bronze Ink--lr-accent-text
Tan--lr-tan
Beige Hairline--lr-beige
Deli Red--lr-red
Kraft--lr-kraft
White Ground--lr-bg
Cream--lr-cream
Heading--lr-heading
Body--lr-text

Forest is the ground of the header, the hero, one band per page and the footer; cream carries the bands and every packshot; bronze draws the rules, stars, the seal and the buttons (the deeper bronze button face carries white text). Bronze ink is the colour of small eyebrows and labels on light grounds, tan its partner on forest. Deli red is kept for the ticket stamp, Sale and “few seats left”. --lr-bg, --lr-surface, --lr-cream, --lr-heading and --lr-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: Lora (the capitals of every heading, prices and the italic accents) and Catamaran (body, navigation, buttons, eyebrows and labels in tracked capitals). Swap them by editing the Google Fonts link and the --lr-ff-display / --lr-ff-body variables.

Logo

The logo is the name Larderia in Lora italic beside a round bronze seal: a larder jar with a sprig on its lid and a cheese wedge at its foot. It ships as ready-made PNG files in assets/img/logo/:

  • logo.png — for light grounds: the white and cream headers
  • logo-light.png — for forest grounds: the forest header, the preloader in dark mode, dark mode
  • mark.png — the seal alone (the arch frames, the jar labels, the preloader’s wedge)
  • seal.png — the seal with LARDERIA · KITCHEN & LARDER round it (account and bare pages)
  • favicon.png — the browser tab icon

The logo’s lettering appears only inside the images. To use your own logo, replace these files; the header sizes the logo by its height, so a wider or narrower file needs no CSS change.

Light & Dark Mode

Every header (and the mobile menu) has a theme switch. The choice is saved in the browser under the key larderia-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.

Dark Ground--lr-bg
Dark Surface--lr-surface
Dark Cream Band--lr-cream
Dark Heading--lr-heading
  • Tokens — the dark values sit in one block, [data-theme="dark"] { … }, right after :root in style.css. Change a dark colour there.
  • Bands that stay forest — sections with the class is-night (the voices, the deli ticket, the booking and estimate panels, the page titles, the footer) are forest in both themes. A light card placed inside one takes lr-on-light to keep its own ink.
  • Packshots — the larder’s product tiles keep their cream ground in both themes, as the photographs do.
  • Illustrated icons — each icon ships in a forest and a cream ink; 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.

Larder Logic

The figures on every page come from one data block, JS block 09 Larder Data near the top of main.js (var LARDER). Edit it once and the cards, menus, prices, dates, seats and totals follow. Prices are in US dollars; times are minutes after midnight (720 = 12:00 pm); weekdays run 0 = Sunday to 6 = Saturday.

hoursLunch, dinner and the larder shop for each weekday ([] = closed; the kitchen rests on Monday). The top bar’s open-now line, the hours lists and the booking slots read it.
weekThe dish of the day for each weekday, its price and the larder jar it is cooked from. Home 1, the menu and the Dish Of The Day page pick today’s by the visitor’s clock.
menu / coursesThe menu by course, with the tags v (vegetarian), gf (gluten free) and star (the chef’s pick).
cats / productsThe larder: 17 products in 7 categories, with size, price, struck old price, New / Sale and the two lines printed on the label.
deli / ticketThe deli counter priced by the 100 g, and the order the Home 3 ticket prints line by line.
hampersThe bases (places and price), ribbons, the card fee, the full-hamper saving and the three ready-made hampers.
dinnersLong-table dinners on the nth weekday of each month, with the seats, the seats already taken, the price a seat and the courses.
rooms / packages / eventExtras / servicePrivate rooms (guests from–to, hire), menus by the head, extras (by the head or flat) and the service charge.
bookingThe largest party online (8), how far ahead (30 days), the slot step and the last seating before close, the seating areas.
shopFree shipping from $90, otherwise $9 (express $18), tax 8%, coupon LARDER10 for 10% off.

How a hamper is priced

A hamper costs its base, plus each item at its larder price, less 10% of the items when every place is filled, plus the card if one is written.

Worked example: A Kraft Gift Box ($12, 4 places) with Slow Tomato Sugo, Bronze-Cut Penne, Estate Olive Oil, Smoked Paprika ($52) is full, so $5.20 comes off the items: $58.80.

Private events

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 12% service on the food, drink and extras; a quarter of it holds the date.

Worked example: 30 guests in The Long Table ($600 hire) with the Long Table Feast ($78 a head): $2,340 + $280.80 service = $3,220.80.

Dinners and seats

Every dinner repeats on its weekday of the month (the Harvest Long Table: the first Saturday), so its next dates are always ahead of the visitor. Seats booked on the dinner page are kept in the browser and count against the table on every card and in the account.

How the shop totals

Worked example: Estate Olive Oil ($24.00); shipping $9.00 (under $90); tax 8% $1.92 — $34.92. With the coupon LARDER10: $24.00 − $2.40, shipping $9.00, tax $1.73 — $32.33.

The bag (jars and hampers), the wishlist, the applied coupon and the booked seats 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 26 Larder Shop) to []. Checkout, table booking, seats and the event 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: Brown Paper — a slow crumpled kraft relief lit by a drifting light (the page titles, the forest bands and the paper bands) — and the Wheel — a cheese wheel drawn with signed distances in the footer, turning slowly while its wedge cuts away and slips back. Each is one canvas:

<canvas class="lr-gl" data-gl="paper" 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-3 and --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)

Larderia 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 larderia-lang and larderia-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, weights and the deli ticket keep reading left to right inside their rows.

Editing the styles: 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 33 numbered blocks (see the JS INDEX comment at the top of the file):

  • 01–08 — Preloader, Sticky Header, Offcanvas Menu, Scroll Reveals, Back To Top, Anchor Scroll, Light & Dark Mode, Direction, WebGL Layers. The core every page shares: the Cheese Wire preloader, the header, the Paper Parcel reveals, the theme and direction switch and the WebGL layers.
  • 09–10 — Larder Data, Larder Clock. Larder Data holds every figure; Larder Clock works out open now, today’s dish, the week strip and the next date of every dinner.
  • 11–19 — Custom Select, Hero Sliders, Card Sliders, Accordion, Filter Tabs, Grid Search, Newsletter, Choice Cards, Larder Shelves. Shared components: selects, sliders, accordions, filters, search, forms.
  • 20–22 — Jar To Plate, Deli Ticket, Table Booking. The three home pages’ scroll moments.
  • 23–33 — Long Table, Private Events, Contact Form, Larder Shop, Account Forms, Hamper Builder, Article Tools, Demo Forms, Launch Countdown, Visit Booking, FAQ Search. The feature pages: table booking, long-table seats, private events, contact, the larder shop, the hamper builder, accounts, FAQ.

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.

Reveals: add lr-parcel to a photo’s frame so four kraft flaps fold back off it (Paper Parcel), lr-place to a card and lr-fade to text so they rise softly into place, and lr-rule for the diamond rule under a title. data-delay="0.2" staggers any of them. Add lr-fold to a card’s photo for the paper-fold hover.
Scroll moments: Larder Shelves slides each shelf from alternate sides with its own end point; Jar To Plate holds its stage with CSS position: sticky while the lid turns off and the dish rises; Deli Ticket feeds its ticket out as the section travels and stamps it at the end. None of them pins the page, and each page is authored in the finished state.
Countdown: the coming-soon page counts down to 10:00 am on the next 20 March, the first day of spring — no date to update. Change it in 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. Images are grouped inside assets/img/:

img/banner/Page-title banners, photo bands and the video bands — 15 files: 2809×1463, 2823×2024, 2809×1538, 2809×1390, 2817×1170, 2809×1412, …
img/blog/Journal posts, history rows and dish photos — 19 files: 1300×701, 1300×1755, 1300×1300, 1496×780, 1382×870, 2817×1519, …
img/dishes/Dishes cut to an arch (transparent PNG) — 6 files: 471×619, 679×892, 800×1146
img/faces/Round portraits for bylines, voices and avatar groups — 7 files: 240×240
img/flags/The language picker’s flags (SVG, included) — 6 files: SVG
img/home/Home and inner page photos, offset pairs — 20 files: 591×925, 562×564, 848×850, 825×827, 1100×574, 880×1102, …
img/icons/Illustrated line icons, each in a forest and a cream ink — 30 files: 128×128
img/logo/Logo, light logo, seal, mark and favicon — 5 files: 478×112, 64×64, 256×256, 300×300
img/menu/Home previews in the mega menu — 3 files: 560×350
img/shop/Larder packshots on their cream ground and close-ups — 38 files: 800×994, 500×600, 160×600, 495×600, 234×600, 377×600, …
img/team/Kitchen team portraits — 11 files: 600×878, 381×682, 600×877, 838×1227
img/textures/Paper, kraft and ticket textures (included) — 3 files: 512×512, 640×640, 400×400

The logo files, the illustrated icons, the language flags and the paper textures 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, seat booking, event 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, replace YOUR_RECAPTCHA_V3_SECRET_KEY with 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: Lora, Catamaran

All plugin files and icon fonts are loaded locally. The only external requests are the Google Fonts stylesheet, the Google Maps embeds 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.