Overview
A warm, animated HTML template for a neighbourhood gastropub: twelve taps, a kitchen, match nights and a Tuesday quiz. Pintora ships three home pages, a light and a dark theme, right-to-left support and pub logic that is worked out rather than typed in: a live tap list whose kegs run low through the evening, happy hour live from the clock, a burger builder that prices every layer, a table booking that knows the day’s hours and the rooms, fixtures that come round every week, a pub quiz with a rolling jackpot, and a pub shop with a bag, a code, VAT and checkout.
What’s included
- 3 home pages, each with its own scroll moment: the bar (five pints slide along the bar to their taps), the darts (three darts land in the treble twenty, the score adding up) and the tug of war (two team bars push against each other and settle on the pub poll)
- 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: Chalk Smudge (chalk smudges and eraser marks drifting on the slate bands) and a low-poly dartboard turning in the footer
- Live tap list: what’s pouring, style, ABV, cask or keg, each keg’s level from the clock, running low, the guest beer on the first keg to run dry, happy hour prices
- Happy hour live from the clock: on now with its countdown or the next window, the week drawn to scale, half-price small plates
- Burger builder: six burgers, three buns, eight add-ons, sides and a pint deal; the drawn burger stacks itself and the price follows
- Table booking in four steps, match nights with fixtures and Book buttons, the pub quiz sign-up with the jackpot and the season table, what’s on by month
- The pub shop: filters, sort and search, the product page, the bag with a code and VAT, checkout with collection, local delivery or courier and an order number, wishlist
- Food menu with category and diet filters, crew, gallery, blog in six post formats, FAQ with search, account pages, coming soon, 404
- Coaster Flip preloader, Clink reveals, chalk circles on prices, Swiper sliders and Fancybox lightboxes
- Fully responsive, zero console errors
Getting Started
Thank you for choosing Pintora. Follow the steps below to get your site live.
1. Open locally
Unzip the downloaded package and open pintora/index.html in any modern browser (Chrome, Firefox, Edge,
Safari). No build tools or server are required — the tap list, happy hour, burger builder, booking, quiz, fixtures
and the shop all work straight from the files.
2. Deploy to a server
Upload the contents of the pintora/ 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 taps, prices, hours, happy hour, menu, burgers, fixtures, quiz,
events, rooms and crew live in one place — see Pub Logic.
assets/img/ with your own photography at the
same dimensions. The drawn pints, taps, burgers, dartboard, gift cards, glass, beer mats and tote 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: The Pub (the bar), Quiz & Darts on the boxed layout (the darts) and Match Night (the tug of war) |
tap-list.html | The live tap list: twelve lines with keg levels, running low, happy hour prices, filters by style, cask or keg and strength |
happy-hour.html | Happy hour live from the clock: the countdown, the windows, the week chart and the half-price small plates |
menu.html | The food menu by category with diet filters and search |
burger-builder.html | Six burgers, buns, eight add-ons, sides and a pint: the drawn burger stacks itself and the price follows |
book-a-table.html | Four-step booking: slots from the day’s hours, rooms by party size, the occasion, the deposit |
whats-on.html / event-details.html | The month at a glance, the next sixteen with type tabs, the regulars; an event with tickets |
match-nights.html | The big games slider, every fixture in kick-off order with competition tabs and Book buttons, where to watch, the deals |
pub-quiz.html | The quiz sign-up in three steps, the jackpot, the season table and the six rounds |
about.html | The intro, the story, figures, the house beers, the crew and reviews |
team.html / team-details.html | The crew, a crew profile with the favourite pint |
gallery.html | Photos with filter tabs and a lightbox |
faq.html | Questions by topic with search |
shop.html / product-single.html / cart.html / checkout.html / wishlist.html | The pub shop: filters, sort, search, the product page, the bag with code and VAT, checkout with collection or delivery, wishlist |
blog.html / blog-details.html | The blog in six post formats with search, an article with reading time, share and comments |
contact.html | Contact cards with the live doors and kitchen, the contact form, the map and the week’s hours |
account.html / login.html / register.html / forgot-password.html | My account (bookings, quiz team, orders, gift cards) and the account forms |
coming-soon.html / 404.html | Countdown to the beer garden, error page |
sendmail.php | AJAX mail handler for the contact form (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 (36 blocks) |
assets/js/plugins/ | jQuery, Bootstrap, Swiper, Fancybox, GSAP, ScrollTrigger |
assets/img/ | Images, one folder per kind (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 pintora/, the template.
Every page sits in the template’s root; everything the pages load sits under assets/:
pintora/
├── *.html the 31 pages, all in the root (see File Structure)
├── sendmail.php the AJAX mail handler for the contact form
└── 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 (36 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 kind
├── bar/ 8 files
├── burger/ 26 files
├── chalk/ 3 files
├── darts/ 2 files
├── decor/ 6 files
├── faces/ 9 files
├── flags/ 6 files
├── hero/ 9 files
├── icons/ 26 files
├── logo/ 5 files
├── menu/ 9 files
├── photos/ 19 files
├── shop/ 15 files
├── team/ 6 files
└── textures/ 3 files
To publish the site, upload the contents of pintora/ 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
--pn-green-rgb) — change both together.
--pn-green--pn-green-deep--pn-black--pn-text--pn-paper--pn-bg--pn-slate--pn-chalk--pn-amber--pn-redBottle green is the voice: the accent word in titles, the chalk-script eyebrows and prices, the brush rule under every
title, the framed boxes and the buttons’ hover. Small green text uses its deeper partner
(--pn-green-deep) so every line reads clearly. Ink draws the square buttons and the headings; kraft paper and
white alternate as grounds; slate is the chalkboard of the night bands and the footer. Amber and red are kept for the
drawings, the running-low flags and the live dot. --pn-bg, --pn-surface,
--pn-heading, --pn-text and --pn-accent 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: Teko (the caps headings, the navigation, buttons and
the body) and Shadows Into Light (the chalk-script eyebrows, prices and names). Swap them by editing the
Google Fonts link and the --pn-ff-head / --pn-ff-script variables.
Logo
The logo stacks a beer-mat coaster (a nonic pint between hop leaves) above the name PINTORA, with a short rule and hop
leaves below. It ships as ready-made PNG files in assets/img/logo/:
logo.png— for light grounds: the sticky header, the boxed home’s headerlogo-light.png— for dark grounds: the headers over photographs, the slate footer, dark modecoaster.png/coaster-back.png— the coaster’s two faces: the preloader, the 404, the badgesfavicon.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
pintora-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.
--pn-bg--pn-surface--pn-paper--pn-heading- Tokens — the dark values sit in one block,
[data-theme="dark"] { … }, right after:rootinstyle.css. Change a dark colour there. - Bands that keep their colour — sections with
is-night(the slate) and the photo bands keep their ground in both themes. A light card inside one takespn-on-light. - Paper — the kraft grounds carry a fibre texture; the dark theme swaps it for a dark one.
- 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.
Pub Logic
The figures on every page come from one data block, JS block 09 Pub Data near the
top of main.js (var PUB). Edit it once and the cards, lists, builders and totals follow. Prices
are in pounds; times are minutes after midnight (960 = 4:00 pm; a close after midnight runs past 1440).
hours / kitchen | The doors and the kitchen per weekday (0 = Sunday). A Friday that closes at 1 am is still Friday at half past midnight. |
happy | Happy hour windows: their weekdays, start and end, what comes off a pint (£1) and a half, and the food deal. |
taps / guest / lowAt | 12 taps, each with its beer, brewer, style, ABV, colour, cask or keg, half and pint prices, the keg’s level at opening (open) and how fast it pours (rate, a share of the keg an hour). A keg under 20% runs low; the first to run dry today is changed for the guest beer (its own rate), any later one for a fresh keg of its own beer. |
menu / menuCats | The kitchen’s dishes by category, with V, VG, GF and spicy tags. |
burgers / buns / addons / sides / pintDeal | Six burgers (price, bun, layers bottom to top), the buns, eight add-ons with the layer each draws, the side swaps and the pint deal. |
teams / fixtures / comps | Team colours; the fixtures by weekday and week (competition, kick-off, screens, sound, tables left, the pub poll). |
quiz / darts | The quiz night, entry, team size, tables and bookings for the next Tuesdays, the jackpot rule, rounds and season table; the darts league table. |
events / eventTypes | What’s on: weekly events by weekday, monthly ones by the nth (or last) weekday. |
areas / slotStep / lastBooking / deposit / occasions | The rooms with their seats and largest table, slots every 30 minutes up to 90 minutes before closing, a deposit of £10 a head from 8 guests. |
products / shopCats / shop | The pub shop: products, categories, VAT (20%, included in prices), local delivery £3.95 (free from £40), courier £6.95 and the code LOCAL10 for 10% off. |
The kegs and happy hour
A keg’s level is its opening level minus its pour rate times the hours the pub has been open today, so the tap list changes through the evening on its own: gauges drop, kegs under a fifth read Running Low, the first keg to run dry is changed for the guest beer and any later one for a fresh keg of its own (Just On). Happy hour takes its share off pints and halves while a window is open; the price is struck through and the happy price written beside it.
The burger builder
The price is the burger, plus a different bun’s add-on (a burger’s own bun is in its price), plus each add-on, plus the side swap, plus the pint deal; the drawn burger lays every layer in where it belongs.
Bookings, fixtures and the quiz
A day’s slots run from opening to 90 minutes before closing (a Saturday has 26), today’s past slots drop out and each slot has its own tables left; rooms too small for the party step aside. Fixtures come round by weekday, so the list never goes out of date; a Book button carries the game’s date and the screen room to the booking (kept in the browser, never in the link). The quiz jackpot grows £25 every week it is not won (on Tuesday 27 October 2026 it stands at £100).
The bag, wishlist, code, burgers and booking hand-over 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; to start empty, set the two demo
lists in doShop() (block 31 Pub Shop) to []. Checkout,
bookings, the quiz sign-up and tickets confirm on screen with a reference — connect them to your own systems.
WebGL Layers
Two kinds of WebGL draw the moving layers. Chalk Smudge is a fragment shader over the slate bands: soft chalk smudges, the arcs an eraser leaves and a little dust, drifting very slowly and kept to the band’s sides. The dartboard in every footer is a real triangle mesh, low-poly with flat facets: every ring of the twenty sectors is cut into facets that tilt apart and catch the light as the board swings on its nail, a dart in the treble twenty.
<canvas class="pn-gl" data-gl="chalk" aria-hidden="true"></canvas>
<canvas class="footer-board-gl" data-board-gl aria-hidden="true"></canvas>
- Colours — Chalk Smudge reads
--gl-1,--gl-2,--gl-3and--gl-alpha; the dartboard reads--db-black,--db-cream,--db-red,--db-greenand--db-steelon its holder. The theme switch repaints them. - Performance — a layer only runs while it is on screen and the tab is visible. Visitors who prefer reduced motion get one still frame.
- Remove one — delete the canvas; nothing else depends on it.
RTL (Right To Left)
Pintora 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) lists the languages
that read left to right and right to left. Choosing Arabic stores the language and the direction (keys
pintora-lang and pintora-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
<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 pictures keep their own left and right: the bar with its taps and pints, the dartboard with its darts, the tug of war (home on the left) and the week chart drawn on a clock.
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 keep what must not
mirror. If you change style.css, regenerate the twin with npx rtlcss style.css style.rtl.css and
copy that closing block back to its end.JavaScript Guide
All custom behaviour lives in assets/js/main.js, wrapped in a jQuery IIFE and organised into 36 numbered
blocks (see the JS INDEX comment at the top of the file):
- 01–08 — Preloader, Sticky Header, Offcanvas Menu, Scroll Reveals & Chalk Circles, Back To Top, Anchor Scroll, Light & Dark Mode, Direction, WebGL Layers. The core every page shares: the Coaster Flip preloader, the header, the Clink reveals and chalk circles, the theme and direction switch and the WebGL layers.
- 09–10 — Pub Data, Pub Clock. Pub Data holds every figure; Pub Clock works out the doors, the kitchen, happy hour, each keg’s level, the fixtures’ and events’ dates and the jackpot.
- 11–19 — Custom Select, Meters, Hero Sliders, Card Sliders, Accordion, Filter Tabs, Grid Search, Newsletter, Choice Cards. Shared components: selects, meters, sliders, accordions, filters, search, newsletter, choice cards.
- 20–36 — Live Tap List, Happy Hour, Bar Moment, Darts Moment, Food Menu, Burger Builder, Table Booking, Match Nights, Pub Quiz, What's On, Contact Form, Pub Shop, Account Forms, Article Tools, Demo Forms, Launch Countdown, FAQ Search. The niche logic and the scroll moments: the live tap list, happy hour, the bar, the darts, the food menu, the burger builder, the table booking, match nights with the tug of war, the pub quiz, what’s on, the contact form, the shop, accounts, articles, demo forms, the countdown and FAQ search.
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.
pn-clink to cards so they slide in from alternate sides and meet
with a small knock-back, pn-rise to copy so it rises into place, and pn-words to a title so each
word climbs out of its own mask. data-delay="0.2" staggers any of them. Give a card
data-chalk and wrap its price in pn-chalk for the chalk ring on 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/bar/ | The drawn pints (one per beer colour), the tap fount and the oak bar for Home 1's bar — 8 files: 214×393, 180×420, 1024×160 |
img/burger/ | The burger builder's drawn layers (buns, patties, cheese, toppings) and one finished stack per burger — 26 files: 600×80, 600×70, 600×190, 600×56, 600×50, 600×48, … |
img/chalk/ | Chalk drawings in Pintora's hand: the pint, the burger, the arrow — 3 files: 192×101, 401×297, 243×427 |
img/darts/ | The dartboard and the dart for Home 2's darts moment — 2 files: 900×900, 403×282 |
img/decor/ | The green brush rule, the chalk rings of the hover accent, the brush patch, the sunburst — 6 files: 180×18, 150×74, 594×590, 640×640 |
img/faces/ | Round portraits: reviews, bylines, avatar groups — 9 files: 240×240 |
img/flags/ | The language picker’s flags (SVG, included) — 6 files: SVG |
img/hero/ | Wide hero, banner and photo-band photographs — 9 files: 2809×1024, 2809×1463, 3738×1363, 2809×863, 2809×879, 2818×1518 |
img/icons/ | Illustrated line icons, each in an ink and a chalk version — 26 files: 384×384 |
img/logo/ | Logo, light logo, the coaster mark (both faces) and the favicon — 5 files: 512×512, 530×223, 64×64 |
img/menu/ | Round menu photos and the home previews in the mega menu — 9 files: 88×88, 560×350 |
img/photos/ | The pub: friends, the bar, burgers, pints — 19 files: 2819×2819, 2817×1734, 2819×1410, 2817×1929, 1845×1135, 1386×1584, … |
img/shop/ | The pub shop: relabelled house beers, gift cards, glass, mats, tote — 15 files: 800×800, 800×711, 800×640 |
img/team/ | The crew — 6 files: 800×681, 1232×1049 |
img/textures/ | The kraft paper grain (light and dark) and the slate — 3 files: 512×512 |
The logo files, the drawn pints, taps, burgers and darts, the gift cards, glass, beer mats and tote, the chalk drawings, the illustrated icons, the textures 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 posts to sendmail.php, a lightweight AJAX mail handler. The success or error message appears
under the button without reloading the page. The newsletter, booking, quiz, ticket, comment, account and checkout 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: Teko, Shadows Into Light
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 popup.
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.