Overview
A bright, dependable HTML template for a handyman and home maintenance company: five trades with their price lists, a job estimate worked out live, booking by two-hour window, annual maintenance plans and a 24/7 emergency line. Fixora 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 time band of any hour, the call-out fee, the crews free in a window and the next free window from the visitor’s clock, estimates with parts grades, plans and travel fees, plan prices by home size and billing, and a parts shop with a plan saving, a code, delivery and VAT.
What’s included
- 3 home pages, each with its own scroll moment: Home Repairs (a paint roller lays a fresh coat across the wall as you scroll), Heating & Cooling (the outdoor unit’s fan spins faster as the room cools from 30 to 22) and Handyman Crew (a ladder’s rungs appear, each lighting a step of the job)
- A light theme by default and a night navy 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 — Roller Bands, soft paint-roller passes sliding along the edges of the title bands and the footer, and the footer’s house and tree, the tree grown by an L-system — tinted by the theme colours
- Five trades with hourly rates and price lists, a full price list with trade tabs and search
- The job estimate: trade, job or hours, quantity, parts grade, time band, plan and postcode, with the breakdown and where the money goes
- Booking by two-hour window in five steps: crews free per window, same-day windows closing two hours ahead, Sundays for emergencies, the live price; Continue never blocks
- Maintenance plans by home size, monthly or yearly, the comparison table and a plan-versus-pay-as-you-go calculator
- The emergency line live from the clock, response times and a postcode checker by area
- Recent jobs with their bills from the same engine, the crew, reviews with the average, FAQ with search
- The parts shop: categories, price filter, sort and search, the product page, bag, plan saving, code, delivery meter, VAT, checkout with an order number, wishlist
- Toolbox Open preloader, Screw In reveals, soft-rise copy and the tool flip on card hover
- Blog with post formats, account pages, coming soon, 404
- Fully responsive, zero console errors
Getting Started
Thank you for choosing Fixora. Follow the steps below to get your site live.
1. Open locally
Unzip the downloaded package and open fixora/index.html in any modern browser (Chrome, Firefox, Edge,
Safari). No build tools or server are required — the estimate, the booking wizard, the plans, the live status and the
shop all work straight from the files.
2. Deploy to a server
Upload the contents of the fixora/ 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 trades, prices, time bands, windows, plans, areas and shop rules live
in one place — see Fixora Logic.
assets/img/ with your own photography at the
same dimensions for the best result. The crew’s portraits in img/team/ are cropped from the top.
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: Home Repairs (the paint roller), Heating & Cooling (the cooling fan), Handyman Crew (the ladder) |
services.html / service-details.html | The five trades with their rates, the time bands and more services; one trade with its full price list and questions |
price-list.html | Every job with its trade, time on site, parts and price from, with trade tabs and search |
estimate.html | The job estimate: trade, job (or by the hour), how many, parts grade, time band, plan and postcode, with the breakdown |
booking.html | Booking by two-hour window in five steps, the live summary and a booking reference |
plans.html | The maintenance plans by home size and billing, the comparison table and a plan-versus-pay-as-you-go calculator |
emergency.html | The emergency line: the band and call-out right now, what counts, what to do while you wait, response by area |
areas.html | The boroughs, their postcodes, travel fees and response times, a postcode checker and the map |
projects.html / project-details.html | Recent jobs by trade with their bills; one job with its bill line by line |
about.html / team.html / team-details.html | The company, the crew by trade, one crew member with his days, jobs and next free window |
reviews.html / faq.html | Reviews by trade with the average and a review form; questions by topic with search |
shop.html / product-single.html / cart.html / checkout.html / wishlist.html | The parts shop: filters, sort and search, the product, bag, checkout, wishlist |
blog.html / blog-details.html | The blog with its post formats and search; a post with reading time, share and comments |
contact.html | The ways in, the contact form, working hours and the map |
account.html / login.html / register.html / forgot-password.html | The account (visits, plan card, orders, details) and the login pages |
coming-soon.html / 404.html | Countdown to the next van base, 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 (17 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 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 fixora/, the template.
Every page sits in the template’s root; everything the pages load sits under assets/:
fixora/
├── *.html the 32 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 kind
├── banner/ 6 files
├── cutouts/ 1 files
├── faces/ 6 files
├── flags/ 6 files
├── hero/ 9 files
├── icons/ 34 files
├── logo/ 5 files
├── menu/ 3 files
├── photos/ 24 files
├── shop/ 16 files
├── tall/ 5 files
└── team/ 8 files
To publish the site, upload the contents of fixora/ 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
--fx-blue-rgb) — change both together.
--fx-navy--fx-navy-2--fx-blue--fx-blue-tab--fx-blue-ink--fx-sky--fx-yellow--fx-bg--fx-panel--fx-text--fx-muted--fx-lineNavy sets the headings, the top bar, the footer and the dark bands. The electric blue fills the current page’s tab in
the menu, the accreditation tile and the blue band; the blue tab is the same blue made deep enough for white text, and blue
ink the version for small text on white. Yellow is kept for the button faces and the square plus keys, always with navy
text. White and the grey panel alternate down the page. --fx-bg, --fx-surface,
--fx-panel, --fx-heading and --fx-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: Outfit (headings, the small caps eyebrows, buttons,
the menu and the figures) and Mada (body copy). Swap them by editing the Google Fonts link and the
--fx-ff-display / --fx-ff-body variables.
Logo
The logo is the word Fixora in Outfit followed by its mark, a blue house whose roof peak is the open jaw of a wrench, with a
yellow window. It ships as ready-made PNG files in assets/img/logo/:
logo.png— for light grounds: the white header and the light themelogo-light.png— for dark grounds: the footer and the dark themelogo-word.png— the word alone (the preloader)mark.png— the house mark alone (the preloader)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
Fixora opens light. Every header (and the mobile menu) has a theme switch that turns the page to a night navy. The choice is
saved in the browser under the key fixora-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.
--fx-bg--fx-surface--fx-panel-2--fx-heading--fx-text--fx-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 dark — sections with the class
is-navy(the footer, the cooling band, the emergency panel) are navy in both themes;is-blueis the electric-blue tile and band; photo bands wear the navy wash in both themes. - Packshots — the shop’s parts are photographed on white, so their tiles stay white in both
themes (
--fx-shelf). - Icons — each illustrated icon ships in a navy and a white 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.
Fixora Logic
The figures on every page come from one data block, JS block 09 Fixora Data near the
top of main.js (var FIXORA). Edit it once and the price lists, estimates, windows, plans and totals
follow. Prices are in pounds before VAT; times are minutes after midnight (1080 = 6:00 pm); weekdays run 0 = Sunday to
6 = Saturday.
trades | Each trade’s hourly rate, crews on the road, photograph and jobs: the hours on site and the standard parts. A price list’s “from” is hours × rate + parts. |
bands / grades | The time bands with their labour multiplier and call-out fee, and the parts grades (you supply, standard, premium). |
hours / holidays | The office and crews for each weekday (null = Sunday, emergencies only) and the fixed days off. The open-now lines and the hours lists read them. |
windows / leadMins / bookAhead | The two-hour windows (8 am–10 am, 10 am–12 pm, 12 pm–2 pm, 2 pm–4 pm, 4 pm–6 pm, 6 pm–8 pm); same-day windows close 2 hours before they start; bookings run 14 days ahead. |
plans / sizes / yearlySave | The four plans with their monthly price for a flat, labour discount, response, handyman hours and yearly visits; a house up to three bedrooms is ×1.2, a larger house ×1.45; a year paid at once saves 15%. |
areaBands / areas | The three rings (travel fee, emergency response) and the boroughs with their postcode districts. |
team / reviews / projects | The crew, the reviews and the recent jobs; a job lists its jobs, parts grade and band, and its bill is worked out by the engine. |
cats / products / shop | The shop: 16 products in 4 categories; plan members save 10%, the code FIXORA10 takes 10% off first, delivery is free from £60 (otherwise £4.95, next day £9.95) and VAT is 20%. |
The trades
| Plumbing | £78 an hour, 4 crews — Tap Repair Or Replacement (1h, £28), Toilet & Cistern Repair (1.5h, £35), Blocked Sink Or Drain (1h, £12), Leak Find & Fix (1.5h, £20), Radiator Replacement (2.5h, £140), Shower Fit, Mixer & Riser (4h, £190) |
| Electrical | £82 an hour, 3 crews — Socket Or Switch (1h, £18), Light Fitting (1h, £24), Outdoor Lighting (2h, £60), Fault Finding (1.5h, £0), Electrical Safety Check (3h, £0), Fuse Board Replacement (6h, £340) |
| Heating & Cooling | £86 an hour, 3 crews — AC Service & Filter Clean (1.5h, £22), AC Repair & Regas (2h, £65), Boiler Service (1h, £15), Boiler Repair (2h, £80), Smart Thermostat Fit (1h, £95), Wall AC Unit Fit (6h, £120) |
| Painting & Decorating | £58 an hour, 3 crews — Small Room, Walls (5h, £45), Medium Room, Walls (7h, £60), Large Room, Walls (9h, £80), Ceiling (3h, £25), Door & Frame (1.5h, £12), Feature Wall (3h, £30) |
| Carpentry & Odd Jobs | £64 an hour, 3 crews — Hang A Door (2h, £0), Flat-Pack Assembly (1.5h, £0), Shelves & Brackets (1.5h, £22), TV Wall Mount (1h, £15), Skirting Replacement (3h, £60), Decking Repair (4h, £90), Gutter Clear (1.5h, £0) |
The time bands
The engine finds the band of any hour: Sundays, the fixed holidays and 8 pm to 8 am are the night band; Saturdays and
weekday evenings the evening band; the rest is the weekday band. Every element with data-open-status,
data-band-now, data-band-callout or data-next-window repaints from the visitor’s clock.
| Weekday | Monday to Friday, 8 am to 6 pm: labour ×1, call-out £49 |
| Evening & Saturday | Weekdays 6 to 8 pm, Saturday 8 am to 6 pm: labour ×1.25, call-out £59 |
| Night, Sunday & Holiday | 8 pm to 8 am, Sundays and bank holidays: labour ×1.5, call-out £89 |
How an estimate totals
Booking by window
Each window has as many places as the trade has crews; the places booked are seeded from the date, the trade and the
window, so a day always shows the same bookings and the days soonest are the busiest. The wizard’s Continue never
blocks; Confirm checks the day, the window, a covered postcode and the details, and returns a booking reference. A job
chosen on the estimate page arrives pre-selected (through sessionStorage, not the URL).
Maintenance plans
Areas
| Lambeth (Inner) | SE24, SE27, SW2, SW4, SW8, SW9, SE11, SW16 — response within 60 minutes, travel fee none |
| Southwark (Inner) | SE1, SE5, SE15, SE16, SE17, SE21, SE22 — response within 60 minutes, travel fee none |
| Wandsworth (Outer) | SW11, SW12, SW15, SW17, SW18 — response within 90 minutes, travel fee none |
| Lewisham (Outer) | SE4, SE6, SE12, SE13, SE14, SE23, SE26 — response within 90 minutes, travel fee none |
| Croydon (Extended) | CR0, CR2, CR7, SE19, SE25 — response within 120 minutes, travel fee £15 |
| Merton (Extended) | SW19, SW20, CR4, SM4 — response within 120 minutes, travel fee £15 |
How the shop totals
The bag, the wishlist, the code and the plan tick 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 Parts Shop)
to []. Bookings, the request forms, reviews, checkout and the account confirm on screen with a reference
— connect them to your own systems to take real bookings and payments.
WebGL Layers
Two small WebGL scenes draw the moving layers: Roller Bands — soft passes of a paint roller with the nap in them, sliding slowly along the top and bottom edges of the page titles and the footer, the copy in the middle left clear — and the growing house in the footer — a house drawn line by line, then a tree beside it grown by an L-system, its branches growing out from the root and budding at the tips. Each is one canvas:
<canvas class="fx-gl" data-gl="bands" 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 (the tree fully grown). Without WebGL, the section’s own background shows.
- Remove one — delete the canvas; nothing else depends on it.
RTL (Right To Left)
Fixora 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 fixora-lang and fixora-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 the paint roller follow it on their own.
Prices, figures and the drawn scenes (the cooling unit, the ladder, the toolbox) keep reading left to right.
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 Toolbox Open preloader, the header, the Screw In reveals, the theme and direction switch and the WebGL layers.
- 09–10 — Fixora Data, Fixora Engine & Live Status. Fixora Data holds every figure; the engine prices a job, finds the band for any hour, the crews free in a window and the next free window, and paints the live lines (open now, the band, the call-out) from the visitor’s clock.
- 11–18 — Custom Select, Hero Sliders, Card Sliders, Accordion, Filter Tabs, Grid Search, Newsletter, Choice Cards. Shared components: selects, sliders, accordions, filters, search, forms and choice cards.
- 19–21 — Paint Roller, Cooling Fan, Ladder Rungs. The three home pages’ scroll moments.
- 22–32 — Job Estimate, Booking Wizard, Maintenance Plans, Areas Checker, Contact Form, Parts Shop, Account Forms, Article Tools, Demo Forms, Launch Countdown, FAQ Search. The feature pages: the job estimate, the booking wizard, the maintenance plans, the areas checker, contact, the parts shop, accounts, the blog, the demo forms, the coming-soon countdown and the 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 at their end.
fx-screw to a card so it turns in from −10° and seats
(Screw In), and fx-fade to text so it rises softly into place; data-delay="0.2" staggers either.
Add fx-hover to a card with a fx-flip tile so the tool flips in 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 bands — 6 files: 2560×640 |
img/cutouts/ | Cut-out parts on a transparent ground (the request form) — 1 file: 729×696 |
img/faces/ | Round portraits for reviews, comments and avatar groups — 6 files: 100×100, 300×300 |
img/flags/ | The language picker’s flags (SVG, included) — 6 files: SVG |
img/hero/ | The three home sliders (and a few title bands) — 9 files: 3745×936, 2560×1029, 2560×1051, 3520×880, 2817×1569, 2819×1554, … |
img/icons/ | Illustrated line icons, each in a navy and a white version (included) — 34 files: 128×128 |
img/logo/ | Logo, light logo, wordmark, mark and favicon (included) — 5 files: 720×204, 64×64, 516×151, 436×500 |
img/menu/ | Home previews in the mega menu — 3 files: 560×350 |
img/photos/ | Jobs, trades and bands — 24 files: 1200×861, 1702×948, 1038×681, 2812×1975, 800×379, 600×386, … |
img/shop/ | The parts shop’s packshots on white — 16 files: 800×800, 800×794 |
img/tall/ | Upright photographs for cards and sidebars — 5 files: 1382×2027, 800×1174, 1408×2012, 1408×2066 |
img/team/ | The crew, head and shoulders — 8 files: 600×409, 600×390, 1287×837, 600×389 |
The logo files, the illustrated icons and the language flags are included and ready to use. All demo photography shown on the live preview, the shop’s packshots and the cut-out parts 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 request form on Home 01, the booking wizard,
reviews, the newsletter, 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: Outfit, Mada
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.