Overview
A clean, white HTML template for a photo studio complex that hires its rooms by the hour and its kit by the day: two white cycloramas, a daylight loft, a black box and a tabletop bay, a gear room of bodies, lenses, lights, modifiers and grip, and a crew on call. Cyclora ships three home pages, a light and a dark theme, right-to-left support, and logic that is worked out rather than typed in: live availability from the visitor’s own clock, a day planner that refuses booked hours, the cheapest mix of hours, half days and days with overtime and a Sunday surcharge, gear by the day with a weekend rule and a weekly cap, a hire bag with a damage waiver, a coupon, VAT and a refundable deposit, crew by the half or full day, a six-step booking and a currency switch.
What’s included
- 3 home pages, each with its own scroll moment: The Cyc Turns (Studio One’s white cove turns to face you and the lights roll in from the wall into the set-up), Key, Fill, Rim (a lighting plan from above beside the portrait it lights, the three lights switching on in turn) and 24 To 200 mm (one camera, one scene, the lens zooming with the scroll)
- A white theme by default and a dark theme on one switch, remembered between visits and applied before the page paints
- Right-to-left stylesheets and a flag language picker; a currency switch (pounds, dollars, euros) that repaints every price
- WebGL: the Seamless Sweep, a paper backdrop slowly changing colour, as the ground of the plain bands, and a camera lens in the footer drawn in an RGB chromatic split; three.js studio scenes for two of the scroll moments
- Live availability: free now and until when, in use and free from when, the top bar’s count of free studios and a day board of every studio hour by hour
- Studios with filters, two studio pages with a day planner, a rates page with an estimate, and a six-step booking
- The gear room: categories, day-rate filter, search, sort, prices for the hire days, ready kits, the hire bag, checkout with an order number, saved kit
- Crew with day rates, services, how hire works, Made Here with tabs and a lightbox, two shoot stories with their kit lists
- Journal, FAQ with search, contact with a map and the PHP form, account pages, coming soon with a countdown, 404
- Strobe Pop preloader, Aperture photo reveals through a six-blade iris, the flash-pop hover, Swiper sliders and Fancybox
- Fully responsive from 390 px to wide screens
Getting Started
Thank you for choosing Cyclora. Follow the steps below to get your site live.
1. Open locally
Unzip the downloaded package and open cyclora/index.html in any modern browser (Chrome, Firefox, Edge,
Safari). No build tools or server are required — the live availability, the planner, the estimate, the booking,
the gear room and the bag all work straight from the files.
2. Deploy to a server
Upload the contents of the cyclora/ 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 studios, their rates and hours, the gear, the crew, the papers and
the hire rules live in one place — see Studio & Hire Logic.
assets/img/ with your own photography at the
same dimensions for the best result. The gear packshots in img/gear/ are transparent PNGs on a 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 Studios (the cyclorama turns), The Gear Room (key, fill and rim), Book A Day (24 to 200 mm) |
studios.html | The five studios with type tabs, must-haves, floor area and free-now-first; the facilities strip; the spec sheet side by side |
studio-details.html | Studio One: gallery, specs, the day planner from live availability, the price for your hours, the floor plan |
studio-details-2.html | The Daylight Loft: the gallery first, the four sets, the light through the day, a compact planner |
rates.html | Every rate: the studio tables, the estimate, the gear day factor, cover and deposit, extras, crew rates |
booking.html | Book A Studio in six steps: studio, day and hours, gear, crew and extras, details, summary |
gear.html / gear-details.html | The gear room with categories, day rate, search, sort and the hire days; one piece with its hire dates and the weekend rule |
bag.html / checkout.html / wishlist.html | The hire bag (period, gear, studios, crew, paper, cover, coupon, deposit, VAT), checkout with an order number, saved kit |
crew.html / crew-details.html | The crew with role tabs and day rates; one crew profile |
services.html / service-details.html | Studio services; set build and props |
how-it-works.html | How hire works in five steps |
made-here.html / project-details.html / project-details-2.html | The work shot in the studios with tabs, search and a lightbox; two shoot stories with their kit lists |
about.html | The building, the figures, how the studios work, the crew |
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 live status, map, hours and the contact form |
account.html / login.html / register.html / forgot-password.html | The account (bookings, orders, details) and the login pages |
coming-soon.html / 404.html | Countdown to Studio Six, 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 (33 blocks) |
assets/js/plugins/ | jQuery, Bootstrap, Swiper, Fancybox, GSAP, ScrollTrigger, three.js (the two studio scenes) |
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 cyclora/, the template.
Every page sits in the template’s root; everything the pages load sits under assets/:
cyclora/
├── *.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 (33 blocks)
│ └── plugins/ vendor scripts
│ ├── bootstrap.bundle.min.js
│ ├── gsap.min.js
│ ├── jquery-3.7.1.min.js
│ ├── jquery.fancybox.min.js
│ ├── ScrollTrigger.min.js
│ ├── swiper-bundle.min.js
│ └── three.min.js the two studio scenes (Home 01 and Home 03 only)
├── fonts/
│ └── theme-icons/ the sun and moon of the theme switch
├── webfonts/ Font Awesome Free font files
└── img/ images, one folder per section
├── banner/ 15 files
├── blog/ 4 files
├── crew/ 6 files
├── faces/ 5 files
├── flags/ 6 files
├── gear/ 25 files
├── icons/ 34 files
├── logo/ 4 files
├── menu/ 3 files
├── process/ 5 files
├── studios/ 13 files
└── work/ 28 files
To publish the site, upload the contents of cyclora/ 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
--cy-blue-rgb) — change both together.
--cy-ink--cy-blue--cy-blue-deep--cy-blue-soft--cy-bg--cy-band--cy-plate--cy-heading--cy-text--cy-accent-text--cy-mint--cy-honey--cy-coral--cy-lilac--cy-tealWhite is the ground and the pale band alternates with it; ink is the headings, the square buttons, the top bar and the
footer. Studio blue is the one accent: links, the current page, the short rule under every title and the hover of every
button. Mint, honey and coral are the availability signals (free, little time left, booked); with lilac and teal they are
also the paper colours on the rail and the colours the Seamless Sweep drifts through. --cy-bg,
--cy-band, --cy-surface, --cy-heading and --cy-text are the semantic
names the components use — the dark theme swaps those (see Dark & Light Mode).
Fonts
Two Google Fonts are loaded in the head of each page: Poppins (headings in tracked capitals, body,
navigation and buttons) and IBM Plex Mono (eyebrows, specs, rates, slot times and the readouts). Swap
them by editing the Google Fonts link and the --cy-ff-body / --cy-ff-mono variables.
Logo
The logo is CYCLORA in tracked Poppins capitals with its O drawn as a six-blade aperture. It ships as ready-made PNG
files in assets/img/logo/:
logo.png— ink, for white barslogo-light.png— white, over photographs, on the black bar, in the dark theme and the footermark-light.png— the aperture alone, white (the account and error pages)favicon.png— the browser tab icon
To use your own logo, replace these files; the header sizes the logo by its height.
Dark & Light Mode
Cyclora opens white. Every header (and the mobile menu) has a theme switch that turns the dark pages on. The choice is
saved in the browser under the key cyclora-theme and applied by a one-line script in the
<head> before the page paints. The switch sets data-theme="dark" on the
<html> tag.
--cy-bg--cy-band--cy-surface--cy-heading--cy-text--cy-accent-text- Tokens — the dark values sit in one block,
[data-theme="dark"] { … }, right after:rootinstyle.css. - Bands that stay black — sections with the class
is-night(the rates band, the lighting diagram, the estimate, the crew rates, the footer) are black in both themes. - Icons and plans — each line icon and floor plan ships in an ink and a white version; the right one shows by theme and ground.
- Start dark — add
data-theme="dark"to the<html>tag of each page; the switch still works.
Studio & Hire Logic
The figures on every page come from one data block, JS block 09 Cyclora Data near the
top of main.js (var CYCLORA). Edit it once and the rates, the planner, the estimate, the
booking, the gear room and the bag follow. Prices are in pounds (the currency switch converts them); times are minutes
after midnight (420 = 7:00); weekdays run 0 = Sunday to 6 = Saturday.
currency | Pounds, dollars and euros with their symbols and rates to the pound. |
hours | Opening hours for each weekday; the clock, the planners, the board and the hours lists read them. |
rates | A half day is 4 hours and a day 10; overtime past the day at 1.5× the hour; Sundays +20%; VAT 20%. |
studios | Each studio’s name, kind, floor, cove, ceiling, power, access, daylight, rates, minimum hours and photo. |
cats / gear | 25 lines of kit in 5 categories, each with a day rate, a replacement value (the deposit comes from it) and the stock. |
hire | The day factor, the damage waiver (10% of the gear), the deposit (20% of the value, capped at £1,500) and the coupon FIRSTSHOOT for 10% off the gear. |
kits / crew / papers | Ready kits with their saving; the crew’s half and full day rates; the paper colours, £45 a drop. |
busy | How busy each studio is: the demo’s live availability is seeded from it and the date, so every page agrees. |
The studios
| Studio One | Cyc Studio · 230 m² · £95 an hour, £340 a half day, £640 a day, 2-hour minimum |
| Studio Two | Cyc Studio · 140 m² · £70 an hour, £250 a half day, £460 a day, 2-hour minimum |
| The Daylight Loft | Daylight Studio · 160 m² · £80 an hour, £290 a half day, £520 a day, 2-hour minimum |
| The Black Box | Infinity Black & Video · 110 m² · £65 an hour, £230 a half day, £420 a day, 2-hour minimum |
| Tabletop Bay | Product Studio · 45 m² · £35 an hour, £120 a half day, £220 a day, 1-hour minimum |
The cheapest way to book
For any number of hours the planner, the estimate and the booking compare the hourly rate, a half day plus extra hours, and the full day (with overtime past ten hours), and charge the cheapest. Sundays add the surcharge; VAT goes on top.
Live availability
Each studio’s bookings for a day come from a seeded pattern (the studio and the date) plus the visitor’s own
bookings, saved in the browser when they book. Replace dayBlocks() in block
10 with a call to your own calendar to show real bookings; everything else reads from it.
Gear by the day
| 1 day | 1× the day rate |
| 2 days | 1.5× the day rate |
| 3 days | 2× the day rate |
| 4 days | 2.5× the day rate |
| 5 days | 3× the day rate |
| 7 days | 3× the day rate |
| 10 days | 4.2× the day rate |
A Friday pick-up with a Monday return counts as one day.
The hire bag, the saved kit, the coupon and the visitor’s bookings are kept in the browser (localStorage),
so they follow the visitor from page to page. The first visit starts with a small demo bag so the bag and checkout have
something to show; to start empty, edit readBag() in block 27. Checkout and the
booking confirm on screen with a reference — connect them to your own systems to take real orders.
WebGL & 3D
Two small WebGL shaders draw the moving layers: the Seamless Sweep — a paper backdrop curving from the wall into the floor, its colour slowly drifting between three paper colours under a soft vignette, as the ground of the plain bands — and the lens in the footer, drawn three times, once per colour channel, at a slightly different scale: an RGB chromatic split that breathes while the iris inside opens and closes. Each is one canvas:
<canvas class="cy-gl" data-gl="sweep" 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. - Studio scenes — Home 01 and Home 03 build Studio One’s cove, the lights and a still life with three.js from shapes (no textures), and draw only when the scroll moves 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.
- Remove one — delete the canvas; nothing else depends on it.
RTL (Right To Left)
Cyclora 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 cyclora-lang
and cyclora-dir) and reloads; the script in <head> then sets dir="rtl" and swaps
the three stylesheets for the files named in their data-rtl attribute. 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 |
Prices, times, the day board and the lighting plan 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 33 numbered
blocks (see the JS INDEX comment at the top of the file):
- 01–08 — Preloader, Sticky Header, Offcanvas Menu, Scroll Reveals, Back To Top, Anchor Scroll, Light & Dark Mode, Direction, WebGL Layers. The core every page shares: the Strobe Pop preloader, the header, the Aperture reveals, the theme and direction switch and the WebGL layers.
- 09–10 — Cyclora Data, Studio Clock & Availability. Cyclora Data holds every figure; the studio clock works out live availability from the visitor’s own time: free now and until when, in use and free from when, the top bar’s count and the day board.
- 11–19 — Custom Select, Currency, Hero Sliders, Card Sliders, Accordion, Filter Tabs, Grid Search, Newsletter, Choice Cards. Shared components: selects, the currency switch, sliders, accordions, filters, search, forms.
- 20–22 — The Cyc Turns, Lighting Diagram, Focal Length. The three home pages’ scroll moments.
- 23–33 — Day Planner & Estimate, Booking Wizard, Studio Filters, Contact Form, Hire Bag & Gear Room, Account Forms, Account Page, Article Tools, Demo Forms, Launch Countdown, FAQ Search. The feature pages: the day planner and the estimate, the booking wizard, the studio filters, contact, the hire bag and gear room, 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.
cy-iris to a photo frame so the photo opens through a six-blade
iris, cy-fade to text so it rises softly into place, and cy-rule for the short line under a title.
data-delay="0.2" staggers either. Add cy-flash to a card so it flashes white for an instant on
hover, like a strobe.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/ | Hero slides, page-title banners and photo bands — 15 files: 2809×1609, 2809×1024, 1920×1100, 2809×1826, 2809×1750, 2830×777, … |
img/blog/ | Journal posts — 4 files: 1300×900, 1386×1155 |
img/crew/ | The crew, square portraits — 6 files: 800×800 |
img/faces/ | Round portraits for quotes, bylines and avatar groups — 5 files: 800×800 |
img/flags/ | The language picker’s flags (SVG, included) — 6 files: SVG |
img/gear/ | The gear room’s packshots, transparent PNG on the seamless ground (included) — 25 files: 900×900 |
img/icons/ | Line icons, each in an ink and a white version (included) — 34 files: 128×128 |
img/logo/ | Logo, light logo, the aperture mark and favicon (included) — 4 files: 1150×140, 64×64, 412×412 |
img/menu/ | Home previews in the mega menu — 3 files: 560×350 |
img/process/ | The five steps of How Hire Works — 5 files: 1021×712, 1382×964 |
img/studios/ | The loft, the tabletop bay, the shoots and the floor plans (the plans are included) — 13 files: 1800×1240, 1300×900, 800×1006, 1382×1587, 1382×1145, 1408×2105, … |
img/work/ | Made Here: the shoots in the studios — 28 files: 800×1196, 800×800, 2816×2348, 800×667, 1000×1000, 1408×1632, … |
The logo files, the line icons, the gear packshots, the floor plans 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, 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
- three.js
- Fancybox 3.5
- Font Awesome Free
- RTLCSS
- Google Fonts: Poppins, IBM Plex Mono
All plugin files and icon fonts are loaded locally. The only external requests are the Google Fonts stylesheet, the Google Maps embed 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.