Overview
A sunny, rustic HTML template for a family vineyard that guests take part in: adopt a vine and see your name on its post, come and pick on a harvest weekend, stay the night in the farmhouse or a cottage among the rows, and sit at the long table. Vendemia 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 farm gate open now, the vines still free in every row, an adoption priced as it is built, the harvest weekends with the places left on each, a stay priced night by night by season, the next date and the seats left at every dinner, and a wine shop with a bag, coupon, shipping and VAT.
What’s included
- 3 home pages, each with its own scroll moment: Nameplates On The Posts (the adopters’ plates are hung on the vine posts one by one as the row passes), Basket Hand To Hand (a harvest basket passes from the picker to the old press) and The Family Tree (four generations fill the branches)
- 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 — Cloud Shadows, soft shadows of passing clouds with warm sun in the gaps, and the footer’s turning vine-leaf kaleidoscope — tinted by the theme colours
- Adopt a vine: three plans, a row picked from the vines still free, the name on the plaque, extra bottles, years paid ahead with a saving and a posted gift pack; the adopted vines leave their row when the order is placed
- Harvest days: every weekend of the season by month, the places left on each, the day’s programme with what is on now, and four-step booking for adults, children and under-sixes with lunch, bottles and photographs
- Vineyard stays: five rooms and cottages priced for the same dates, each night priced by its season and weekday, the shortest stay, extra guests, breakfast and the city tax
- Long-table dinners from repeat rules, held under the pergola or in the barrel room by the month, with seats left and seat booking
- The wine shop: categories, price filter, sort and search, wine page, bag, coupon, free-shipping meter, VAT included, checkout with an order number, wishlist
- The rows, the family and a profile, gallery, journal, FAQ with search, account pages, coming soon, 404
- Secateurs Snip preloader, Leaf Curtain reveals, the warm-sun hover, Swiper sliders and Fancybox video popups
- Fully responsive, W3C-valid, zero console errors
Getting Started
Thank you for choosing Vendemia. Follow the steps below to get your site live.
1. Open locally
Unzip the downloaded package and open vendemia/index.html in any modern browser (Chrome, Firefox, Edge,
Safari). No build tools or server are required — the adoption, the harvest booking, the stays, the dinners and the
shop all work straight from the files.
2. Deploy to a server
Upload the contents of the vendemia/ 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. The rows, the adoption plans, the harvest season, the stays and their
seasons, the dinners and the wines live in one place — see Vineyard Logic.
assets/img/ with your own photography at the
same dimensions for the best result. The drawn vine leaves, basket and family tree in img/decor/ are
transparent PNGs and ship with the template.
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: The Vineyard (Nameplates On The Posts), Harvest Days (Basket Hand To Hand), Stay & Dine (The Family Tree) |
about.html / our-story.html | The family and the hill, the years line, the family tree; the story in four generations |
team.html / team-details.html | The family and the people you meet, one profile |
adopt-a-vine.html | The adoption builder: a plan, a row with vines free, the plaque name, extra bottles, years ahead and a gift pack |
the-rows.html | The fourteen rows by field and grape, with the year planted and the vines still free in each |
harvest-days.html / harvest-day-details.html | Harvest weekends by month with places left and four-step booking; one day’s programme hour by hour |
stays.html / stay-details.html | Rooms and cottages priced for the same dates; one stay with its nights priced one by one and booking |
dinners.html / dinner-details.html | Long-table dinners by date with seats left; one dinner with its place, courses and seat booking |
wines.html / product-single.html / cart.html / checkout.html / wishlist.html | The wine shop: filters, sort and search, wine page, bag, checkout, wishlist |
gallery.html | Photos with filter tabs and a lightbox |
blog.html / blog-details.html | The journal with search; a post with reading time, share and comments |
faq.html | Questions by topic (adoption, harvest days, stays, dinners) with search |
contact.html | Contact cards with the farm gate’s live open status, map, hours and the contact form |
account.html / login.html / register.html / forgot-password.html | The account (my vines, wine orders, dinner seats, details) and the login pages |
coming-soon.html / 404.html | Countdown to a new cottage among the rows, 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 (32 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 vendemia/, the template.
Every page sits in the template’s root; everything the pages load sits under assets/:
vendemia/
├── *.html the 31 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 (32 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/ 7 files
├── blog/ 7 files
├── decor/ 8 files
├── faces/ 5 files
├── flags/ 6 files
├── gallery/ 19 files
├── hero/ 10 files
├── home/ 13 files
├── icons/ 32 files
├── logo/ 4 files
├── menu/ 3 files
├── team/ 7 files
└── wines/ 13 files
To publish the site, upload the contents of vendemia/ 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
--vd-clay-rgb) — change both together.
--vd-grape--vd-grape-deep--vd-clay--vd-clay-deep--vd-accent-text--vd-straw--vd-leaf-green--vd-line-2--vd-bg--vd-lime--vd-heading--vd-textGrape is the ground of the night bands, the page titles and the footer, and the face of the buttons; limewash carries the
warm bands between white sections. Terracotta draws the slashed rules, the stars and the active states; the deeper
terracotta and the terracotta ink are the readable versions for small text on light grounds, and straw is their partner on
grape. Vine leaf marks what is still free (vines, places, seats). --vd-bg, --vd-surface,
--vd-lime, --vd-heading and --vd-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: Lustria (every heading, the prices and the
figures) and Raleway (body, navigation, buttons, eyebrows and labels in tracked capitals). Swap them by
editing the Google Fonts link and the --vd-ff-display / --vd-ff-body variables.
Logo
The logo is the name VENDEMIA in widely spaced Lustria capitals over a short terracotta rule and the line
SINCE 1931; the mark is a grape cluster with its leaf and tendril. They ship as ready-made PNG files in
assets/img/logo/:
logo.png— for light grounds: the white headerslogo-light.png— for grape grounds and photos: the transparent headers, the footer, dark modemark-light.png— the grape-cluster mark in limewash (the account 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
vendemia-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.
--vd-bg--vd-surface--vd-lime--vd-heading- Tokens — the dark values sit in one block,
[data-theme="dark"] { … }, right after:rootinstyle.css. Change a dark colour there. - Bands that stay grape — sections with the class
is-night(the page titles, the family bands, the account side panel, the footer) are grape in both themes. A light card placed inside one takesvd-on-lightto keep its own ink. - Packshots — the wine bottles keep their white ground in both themes, as the photographs do.
- Illustrated icons — each icon ships in a grape and a limewash 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.
Vineyard Logic
The figures on every page come from one data block, JS block 09 Vineyard Data near the
top of main.js (var VINEYARD). Edit it once and the cards, rows, prices, dates, places and totals
follow. Prices are in euros with VAT included; times are minutes after midnight (480 = 8:00 am); weekdays run 0 = Sunday to
6 = Saturday and months 0 = January to 11 = December.
founded / family / rating | The year the first rows went in (1931), the family name, and the review average and count shown on the review badges. |
hours.gate | The farm gate (tastings and bottles to take home) for each weekday ([] = closed; the gate is shut on Monday). The top bar’s open-now line and the hours lists read it. |
varieties / rows | The grapes, and the 14 rows with their field, grape, year planted, vines in the row and vines already adopted (1260 vines in all). |
adopt | The plans (vines, a year’s price, bottles a year, the guests and nights included), the extra bottle price and the most a year, the gift pack, the years paid ahead with their saving, the plaque’s length and the plaques already on the posts. |
harvest | The season (the first Saturday of September to 31 October), the picking days, the places a day (24), the largest party (8), the prices, the add-ons, the day’s programme and the stations of the basket chain. |
stays / seasons / stay | The rooms and cottages with their base rate a night for two, the seasons with their multiplier and shortest stay, and the stay rules: weekend nights, guests included, extra guest, breakfast, city tax, how far ahead. |
dinners / dinnerPlace | Long-table dinners on the nth weekday of each month, with the seats, the seats already taken, the price a seat; the months they move under the pergola. |
cats / products | The wines: 12 bottles in 4 colours, with the grape, the rows they come from, vintage, size, price, struck old price, New / Sale and the two lines printed on the label. |
shop | Free shipping from €120, otherwise €12 (express €24), VAT 22% included in every price, coupon VENDEMMIA10 for 10% off. |
family / team | The four generations of the family tree, and the people on the team page. |
How an adoption is priced
A year costs the plan plus €18 for each extra bottle (up to 24). Paid ahead for two or three years, the years together come 5% or 10% off; the gift pack (€12) is added once. Only the rows with enough free vines for the plan are offered, and the plaque takes up to 22 characters.
Harvest days
Every Saturday and Sunday of the season is a harvest day with 24 places. Once this year’s weekends are past, next year’s show. A place costs €65 an adult and €25 a child of 6 to 14; under-sixes come free but still sit down to lunch.
How a stay is priced
Each night is priced on its own: the room’s base rate times its season, plus 15% on Friday and Saturday nights. The first 2 guests are included; each further guest is €35 a night, breakfast €16 a guest a night, and the city tax €2.50 a guest a night for the first 7 nights. The season of the first night sets the shortest stay:
| Quiet Season | January, February, March, November, December | ×0.8 | 1 night |
| Spring | April, May, June | ×1 | 2 nights |
| Summer | July, August | ×1.2 | 3 nights |
| Harvest | September, October | ×1.3 | 2 nights |
Dinners and seats
Every dinner repeats on its weekday of the month (The Pergola Table: the first Friday), so its next dates are always ahead of the visitor. From May to October the table is laid under the pergola, the rest of the year in the barrel room. Seats booked on the dinner page are kept in the browser and count against the table on every card and in the account; from 6 seats left the card says so.
How the shop totals
Prices include VAT: the bag adds the bottles, takes off the coupon, adds shipping, and shows the VAT inside the total.
VENDEMMIA10: €104.00 − €10.40, shipping €12.00 — €105.60, of which
VAT €19.04.The bag (wines and adoptions), the wishlist, the applied coupon, the adopted vines, the harvest places 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 27 Wine Shop) to []. Checkout, the
adoption, harvest places, stays and seats 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: Cloud Shadows — the soft shadows of passing clouds drifting over the page titles and the bands, with warm sun in the gaps — and the Kaleidoscope — a vine leaf folded into six mirrored wedges in the footer’s disc, turning slowly. Each is one canvas:
<canvas class="vd-gl" data-gl="clouds" 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)
Vendemia 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 vendemia-lang and vendemia-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, dates and plaque names 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 32 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 Secateurs Snip preloader, the header, the Leaf Curtain reveals, the theme and direction switch and the WebGL layers.
- 09–10 — Vineyard Data, Vineyard Clock. Vineyard Data holds every figure; Vineyard Clock works out the farm gate’s open-now line, this year’s harvest weekends and the places left on each, the day’s programme and the next date of every dinner.
- 11–18 — Custom Select, Hero Sliders, Card Sliders, Accordion, Filter Tabs, Grid Search, Newsletter, Choice Cards. Shared components: selects, sliders, accordions, filters, search, forms.
- 19–21 — Nameplates On The Posts, Basket Hand To Hand, The Family Tree. The three home pages’ scroll moments.
- 22–32 — Adopt A Vine, Harvest Days, Long Table, Vineyard Stays, Contact Form, Wine Shop, Account Forms, Article Tools, Demo Forms, Launch Countdown, FAQ Search. The feature pages: the vine adoption, harvest-day booking, long-table seats, vineyard stays, contact, the wine shop, 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.
vd-leaf to a photo’s frame so two curtains of vine leaves
part off it (Leaf Curtain), vd-place to a card and vd-fade to text so they rise softly into
place, and vd-rule for the slashed rule under a title. data-delay="0.2" staggers any of them.
Add vd-sun to a card’s photo for the warm-sun hover.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 wide room photos — 7 files: 2809×951, 2809×1170, 1800×840, 2809×1080 |
img/blog/ | Journal posts, the stays and the dinners — 7 files: 2817×1497, 2816×2045, 1126×1538, 1382×1002, 2816×3816 |
img/decor/ | Drawn decor: the vine leaves, the harvest basket, the family tree, the vine bay (transparent PNG, included) — 8 files: 700×1000, 1600×1216, 380×320, 600×380 |
img/faces/ | Round portraits for bylines, voices and avatar groups — 5 files: 240×240 |
img/flags/ | The language picker’s flags (SVG, included) — 6 files: SVG |
img/gallery/ | The gallery, the harvest stations and photo pairs — 19 files: 800×800, 1382×1382, 627×1080, 627×941, 800×801, 1408×1408 |
img/hero/ | The home sliders and the wide vineyard photos — 10 files: 2812×1715, 2817×1718, 2809×1609, 2812×1312 |
img/home/ | Home and inner page photos — 13 files: 800×1256, 1200×732, 1408×1408, 800×1098, 1300×793, 1588×1383, … |
img/icons/ | Illustrated line icons, each in a grape and a limewash ink (included) — 32 files: 128×128 |
img/logo/ | Logo, light logo, the grape-cluster mark and favicon (included) — 4 files: 64×64, 541×116, 542×116, 256×256 |
img/menu/ | Home previews in the mega menu — 3 files: 560×350 |
img/team/ | The family’s portraits — 7 files: 800×800 |
img/wines/ | The wine packshots on white, with the Vendemia labels — 13 files: 800×878 |
The logo files, the illustrated icons, the drawn decor and the language flags 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, adoption, harvest booking, stay
booking, seat booking, 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: Lustria, Raleway
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.