Overview
An HTML template for a barbershop first, with a tattoo flash table beside the chairs and a motorcycle club out back. Barbero 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 barber menu with picks that add up the time and price, booking chair by chair from each barber’s diary, the walk-in queue and its wait from the clock, flash walk-ins priced by size, detail, placement and colour, a membership calculator, the club’s nights and rides from repeat rules, and a grooming shop with scents, a bag, coupon, shipping and tax.
What’s included
- 3 home pages, each with its own scroll moment: The Fade (a head drawn from behind graduates guard by guard from No. 0 to No. 4), Built At The Shop (the bike’s parts bolt onto its frame one by one) and The Straight Razor (the blade swings open on its pivot, part by part)
- A white theme by default and a dark theme 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
- A WebGL damask — a woven half-drop pattern that drifts slowly behind the page titles, the night bands and the footer — and the footer’s straight razor, an articulated drawing that opens and closes
- The shop from the clock: open now on every page, the walk-in queue and its wait, the chairs free now, the next free slot, the flash table’s hours
- The barber menu: 20 services in 5 categories, picks that add up the minutes and the price and carry into the booking
- Chair-by-chair booking: each chair’s day drawn as a diary bar, free slots as long as the services picked, 10% off paid online
- Flash walk-ins: 14 designs by style, priced by size from $80, then by detail, placement and colour, with a $40 deposit to claim one
- Memberships with a calculator against paying as you go; the club’s nights and rides with places left
- The grooming shop: categories, price filter, sort and search, scents, the product page, bag, coupon, free-shipping meter, pickup or express, tax, checkout with an order number, wishlist
- Barbers with their chairs and days, a barber profile, the work, the journal, FAQ with search, account pages, coming soon, 404
- Barber Pole preloader, Throttle Brake reveals, word-rise titles, the pole stripe running on hover, Swiper sliders and Fancybox video popups
- Fully responsive, valid HTML5, no console errors
Getting Started
Thank you for choosing Barbero. Follow the steps below to get your site live.
1. Open locally
Unzip the downloaded package and open barbero/index.html in any modern browser (Chrome, Firefox, Edge,
Safari). No build tools or server are required — the shop clock, the menu picks, the booking, the queue, the flash
prices, the calculator and the shop all work straight from the files.
2. Deploy to a server
Upload the contents of the barbero/ 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 services, the chairs, the hours, the queue, the flash, the
memberships, the nights and rides, the products and the shop rules live in one place — see
Shop Logic.
assets/img/ with your own photography at the
same dimensions for the best result. The portraits in img/team/ are 3:4 and the flash designs in
img/flash/ are square.
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 Barbershop (The Fade), The Garage (Built At The Shop), Ink & Steel (The Straight Razor) |
about.html | What the shop does, the quality bars, a word from the chair, the shop’s story and the years in figures |
services.html / service-details.html | The barber menu by category with picks that add up the time and price; one service with its steps and its kit |
booking.html | Chair-by-chair booking: services, day, chair and slot from each chair’s diary, details and payment, in five steps |
walk-ins.html | The chairs right now: the queue and the wait from the clock, the hour-by-hour busy chart and a queue ticket |
barbers.html / barber-details.html | The barbers, the tattoo artists and the club captain; one barber with his chair, his days and his next free slot |
flash.html / flash-details.html | Flash walk-ins: the wall by style and size, prices by the centimetre, the table’s hours; one design priced by size, placement and colour, with a claim |
memberships.html | Three memberships and the calculator that compares them with paying as you go |
bike-nights.html / event-details.html | The club’s nights and rides on a calendar with tabs; one ride with its places left and sign-up |
gallery.html / gallery-details.html / gallery-details-2.html | The work with filter tabs and a lightbox; a cut in photographs; the bike built at the shop in photographs |
shop.html / product-details.html / cart.html / checkout.html / wishlist.html | The grooming shop: categories, price filter, sort and search, scents, the product page, 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 the live open status, the map, the hours and the contact form |
account.html / login.html / register.html / forgot-password.html | The account (bookings, rides, orders, membership, details) and the login pages |
coming-soon.html / 404.html | Countdown to the next four chairs, 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 (34 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 barbero/, the template.
Every page sits in the template’s root; everything the pages load sits under assets/:
barbero/
├── *.html the 33 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 (34 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/ 9 files
├── barber/ 11 files
├── bikes/ 8 files
├── faces/ 8 files
├── flags/ 6 files
├── flash/ 14 files
├── hero/ 9 files
├── icons/ 28 files
├── logo/ 4 files
├── menu/ 3 files
├── shop/ 12 files
├── tattoo/ 15 files
└── team/ 7 files
To publish the site, upload the contents of barbero/ 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
--bb-gold-rgb) — change both together.
--bb-gold--bb-gold-soft--bb-gold-ink--bb-ink--bb-black--bb-coal--bb-red--bb-navy--bb-paper--bb-ivory--bb-bg--bb-panel--bb-heading--bb-textWhite is the shop floor and ink the chair leather: the ground of the pages is white with the panel for quiet bands, and
the heroes, night bands and footer are ink. Gold draws the rules, the prices, the stars and the buttons (gold buttons carry
ink text); gold ink is the same gold dark enough to read as text on white. Pole red and pole navy are kept for the barber
pole — the preloader and the stripe under a hovered card — and for the open-now dot and
“few places left”. --bb-bg, --bb-surface, --bb-panel,
--bb-heading and --bb-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: Big Shoulders Display (headings, navigation,
buttons, prices and figures, in condensed capitals) and Libre Baskerville (body text, with its italic for
the eyebrows and notes). Swap them by editing the Google Fonts link and the --bb-ff-display /
--bb-ff-body variables.
Logo
The logo is BARBERO in Big Shoulders capitals with its last O drawn as a squared ring that carries three barber-pole
stripes in gold. It ships as ready-made PNG files in assets/img/logo/:
logo.png— ink lettering, for white grounds (the mobile menu, and every header in the light theme where the header is white)logo-light.png— ivory lettering, for the ink grounds: the headers over the heroes, the night bands, the footerlogo-word.png— the ivory word alone (the preloader)favicon.png— the striped O on an ink square, 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
Barbero opens white: the light theme is the default and needs no attribute. Every header (and the mobile menu) has a
theme switch that dims the lights. The choice is saved in the browser under the key barbero-theme and
applied by a one-line script in the <head> before the page paints, so a dark visitor never sees a white
flash. The switch sets data-theme="dark" on the <html> tag.
--bb-bg--bb-surface--bb-panel--bb-heading--bb-text--bb-accent-text- Tokens — the dark values sit in one block,
[data-theme="dark"] { … }, right after:rootinstyle.css. Change a dark colour there. - Bands that stay ink — sections with the class
is-night(the barber menu band, the bike build, the razor’s band, the photo bands, the page titles, the footer) are ink in both themes. - Logo and icons — the light logo shows on ink grounds and the ink logo on white ones; each illustrated icon ships in an ink and a light version and the right one shows by theme and ground.
- 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.
Shop Logic
The figures on every page come from one data block, JS block 09 Barbero Data near the
top of main.js (var BARBERO). Edit it once and the menu, prices, chairs, slots, queue, dates and
totals follow. Prices are in US dollars; times are minutes after midnight (540 = 9:00 am); weekdays run 0 = Sunday to
6 = Saturday.
hours | The doors for each weekday ([] = closed; the shop rests on Monday): Tue 9 am–7 pm, Wed 9 am–7 pm, Thu 9 am–8 pm, Fri 9 am–8 pm, Sat 8 am–6 pm, Sun 10 am–4 pm. The top bar’s open-now line, the hours lists, the slots and the queue read it. |
cats / services | The barber menu: 20 services in 5 categories, each with its minutes, price and note. |
guards | The clipper guards No. 0 to No. 4 with their length, drawn by the fade on Home 1. |
chairs | 4 chairs, each with its barber and the weekdays he stands at it; the walk-in chair (walkIn: true) keeps the queue moving. |
booking | A slot every 15 minutes, up to 21 days ahead, at least 30 minutes from now, 10% off when paid online; fill sets how full each chair’s diary is seeded. |
walkIns | How busy the shop is hour by hour (weekdays, Saturday, Sunday, 0–1), the longest queue (7), the minutes a walk-in cut takes (25) and the chairs serving the queue (2). |
flashHours / flash | The flash table’s hours (Thursday 6 pm–9 pm, Friday 12 pm–6 pm, Saturday 12 pm–6 pm); sizes Small (5 cm) $80, Medium (8 cm) $130, Large (12 cm) $190, Extra Large (16 cm) $260; detail levels, placements, colour (+20%), the deposit and the designs with their style, artist and whether they are taken. |
memberships / memberCompare | Three memberships (cuts, beard trims, shaves a month, the product discount) and the menu services the calculator compares them with. |
events / fewPlaces | The club’s nights and rides on the nth weekday of each month (0 = every week, -1 = the last), with places, places taken and price; “few places left” shows from 6. |
shopCats / scents / products / shop | The grooming shop: 12 products in 4 categories with their scents; free shipping from $60, otherwise $6 (express $14, or pickup at the shop), tax 8.5%, coupon CHAIR10 for 10% off. |
team / build / razor / facts / quality | The people, the bike’s parts (Home 2), the razor’s parts (Home 3), the figures and the about page’s bars. |
Open now and the walk-in queue
The shop is open while the time sits inside the day’s hours. The queue is the hour’s busyness times the longest queue; the wait shares it between the chairs serving it, to the nearest five minutes.
Booking a chair
The services picked on the menu carry into the booking and set the slot’s length. Each chair’s day is drawn as a diary bar: a slot is free when it fits inside the hours, the barber stands at that chair that day and it meets no booking. The day’s bookings are seeded from the date, so every visitor sees the same diary, and the visitor’s own bookings are added to it.
Flash prices
A design’s price is its size’s price, times its detail (Bold ×1, Detailed ×1.2, Fine Detail ×1.4), times the placement, plus 20% for colour, rounded to the nearest five dollars. A $40 deposit claims it; a design someone has claimed shows as taken.
The membership calculator
The month at the chairs is priced as you go from the menu, then against each membership: its price, anything beyond what it covers at the menu price, and the shop spend less its product discount. The cheapest is marked with the saving.
Nights and rides
Every night and ride repeats on its weekday of the month, so its next dates are always ahead of the visitor:
| Bike Night | Every Thursday, 6 pm–9 pm, open to all, free |
| Sunday Club Ride | The first Sunday of the month, 8 am–12 pm, 30 places, free |
| Garage Day | The second Saturday of the month, 10 am–3 pm, 12 places, $25 a place |
| Show & Shine | The last Saturday of the month, 12 pm–5 pm, 40 places, $10 a place |
How the shop totals
CHAIR10: $46.00 − $4.60, shipping
$6.00, tax $3.52 — $50.92.The bag, the wishlist, the applied coupon, the menu picks, the bookings, the ride sign-ups, the claimed flash and the
queue ticket 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 29 Grooming Shop) to []. Checkout,
booking, the queue ticket, rides and flash claims confirm on screen with a reference — connect them to your own
systems to take real orders and bookings.
WebGL & Drawings
One small WebGL shader draws the damask — a woven half-drop pattern of curls and drops that drifts slowly behind the page titles, the night bands and the footer. Each layer is one canvas:
<canvas class="bb-gl" data-gl="damask" 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.
The straight razor in the footer and on Home 3, the fade on Home 1 and the bike on Home 2 are drawn on plain 2D canvases
(data-razor, data-fade-canvas, data-bike-canvas) by JS blocks 19–21; their colours follow
the theme tokens and they rest in their finished state for reduced motion.
RTL (Right To Left)
Barbero 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 or Hebrew stores the language and the
direction (keys barbero-lang and barbero-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, times and figures keep reading left to right inside their rows, and the razor, the fade and the
bike stay as drawn.
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 34 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 Barber Pole preloader, the header, the Throttle Brake reveals, the theme and direction switch and the WebGL damask.
- 09–10 — Barbero Data, Shop Clock. Barbero Data holds every figure; Shop Clock works out from the date and time whether the doors are open, the walk-in queue and its wait, the chairs free now, the next free slot, the flash table’s hours and the next date of every night and ride.
- 11–18 — Custom Select, Hero Sliders, Card Sliders, Accordion, Filter Tabs, Grid Search, Newsletter, Choice Cards. Shared components: selects, sliders, accordions, filters, search, forms, choice cards.
- 19–21 — Straight Razor, The Fade, Built At The Shop. The scroll moments: the straight razor opening (Home 3, and the footer’s razor on every page), the fade graduating guard by guard (Home 1) and the bike built part by part (Home 2).
- 22–34 — Barber Menu Picks, Chair Booking, Bike Nights, Walk-In Queue, Flash Pricing, Memberships, Contact Form, Grooming Shop, Account Forms, Article Tools, Demo Forms, Launch Countdown, FAQ Search. The feature pages: the barber menu picks, chair-by-chair booking, bike nights and rides, the walk-in queue, flash pricing, the membership calculator, contact, the grooming shop, accounts, the journal, demo forms, the countdown, 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.
bb-ride to a card or photo so it rides in from the side, brakes,
dips its nose and settles (Throttle Brake), bb-words to a title so its words rise one after another,
bb-fade to text so it rises softly into place, and bb-rule for the short gold rule under a title.
data-delay="0.2" staggers any of them. Add bb-pole-hover to a card so the barber-pole stripe
runs along its foot 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/banner/ | Page-title banners, photo bands and section backgrounds — 9 files: 2809×732, 2809×1609, 2893×1046, 2809×878, 3840×2199, 2809×1639 |
img/barber/ | The chairs at work: cuts, fades, shaves and beards — 11 files: 1409×966, 1300×1299, 1382×1036, 1300×1631, 1300×1714, 1408×1056, … |
img/bikes/ | The garage, the club’s rides and the bike built at the shop — 8 files: 2116×2116, 800×625, 1300×1300, 726×706, 1300×1536 |
img/faces/ | Round portraits for bylines, reviews and avatar groups — 8 files: 240×240 |
img/flags/ | The language picker’s flags (SVG, included) — 6 files: SVG |
img/flash/ | The flash designs on the wall, square — 14 files: 973×973, 1300×1300, 600×600, 1000×1000 |
img/hero/ | The home sliders’ full-screen photographs — 9 files: 2817×1760, 2817×1764, 2817×1766, 2817×1773, 2809×1580 |
img/icons/ | Illustrated line icons, each in an ink and a light version (included) — 28 files: 120×120 |
img/logo/ | Logo, light logo, wordmark and favicon (included) — 4 files: 367×96, 64×64 |
img/menu/ | Home previews in the mega menu — 3 files: 560×350 |
img/shop/ | The grooming range’s packshots, transparent PNG (included) — 12 files: 900×900 |
img/tattoo/ | The flash table: tattooing, sketching and healed work — 15 files: 1300×973, 728×728, 1300×917, 1300×1418, 704×1408, 1300×1300, … |
img/team/ | The barbers, the tattoo artists and the club captain, portraits at 3:4 — 7 files: 800×800, 800×798, 1038×1038, 1041×1041 |
The logo files, the illustrated icons, the grooming packshots and the language flags are included and ready to use. All demo photography shown on the live preview, the flash designs among it, 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, booking, queue ticket, ride sign-up,
flash claim, 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: Big Shoulders Display, Libre Baskerville
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.