Travel Studio Documentation
Complete guide to customizing and extending the Travel Studio travel agency HTML template.
Travel Studio is a modern, fully responsive single-page HTML template designed for travel agencies, tour operators, and travel experience companies. It features a sleek design with interactive carousels, animated sections, filterable packages, and detail modals — all without requiring any build tools or frameworks.
index.html and the asset files. No command-line tools, package managers, or compilation steps are needed.
File Structure
├── index.html — Main single-page template (~4,400 lines)
├── documentation.html — This file
└── assets/
├── css/
│ ├── style.css — Main stylesheet (724 KB)
│ ├── vendor/
│ │ └── bootstrap.min.css — Bootstrap 5
│ └── plugins/
│ ├── fontawesome.css — Font Awesome Pro icons
│ ├── swiper.css — Swiper carousel styles
│ ├── metismenu.css — Mobile menu plugin
│ ├── magnifying-popup.css — Lightbox/popup styles
│ └── odometer.css — Counter animation styles
├── js/
│ ├── main.js — Main JS logic (~1,630 lines)
│ ├── vendor/
│ │ └── bootstrap.min.js
│ └── plugins/
│ ├── jquery.js — jQuery 3.7.1
│ ├── swiper.js — Swiper 11
│ ├── gsap.js — GSAP 3 core
│ ├── split-text.js — GSAP SplitText
│ ├── scroll-trigger.js — GSAP ScrollTrigger
│ ├── smooth-scroll.js — Smooth scroll
│ ├── popup.js — Magnific Popup
│ ├── metismenu.js — MetisMenu
│ ├── odometer.js — Odometer counter
│ └── jquery-appear.js — Appear on scroll
├── images/
│ ├── travel-studio-fav.png — Favicon
│ ├── logo/ — Site logo
│ ├── banner/ — Hero slider backgrounds (3 images)
│ ├── about/ — About section images
│ ├── service/ — Destination cards & background
│ ├── business-goal/ — Why Choose Us images
│ ├── counterup/ — Counter section background
│ ├── project/ — Package cards & modal hero images
│ ├── team/ — Team member photos
│ ├── testimonials/ — Reviewer avatars
│ ├── blog/ — Blog post images
│ ├── cta/ — Call-to-action background
│ └── footer/ — Footer logo & background
└── fonts/ — Font Awesome Pro (4 weights x 5 formats)
Tech Stack
| Technology | Version | Purpose |
|---|---|---|
| Bootstrap | 5.x | Grid system, responsive utilities |
| jQuery | 3.7.1 | DOM manipulation, event handling |
| Swiper | 11.x | Touch-enabled carousels & sliders |
| GSAP | 3.x | Scroll-based animations, text splitting |
| Font Awesome Pro | 5.x | Icon library (Solid, Regular, Light, Brands) |
| Google Fonts | — | Playfair Display, Poppins, Red Hat Display, DM Sans |
| Magnific Popup | — | Video lightbox popup |
| Odometer | — | Animated number counters |
Quick Start
- Unzip the template files to your desired folder.
- Open
index.htmlin any code editor (VS Code recommended). - Open
index.htmlin a browser to preview the site (or use a local server like Live Server for VS Code). - Customize content, images, colors, and fonts by following the sections below.
- Deploy by uploading all files to your web hosting server.
index.html and select "Open with Live Server".
Colors & Fonts
Changing Colors
The template uses CSS custom properties (variables) defined in style.css. The main colors are overridden via inline styles in index.html. To change the primary color scheme, find the <style> block at the top of index.html (around line 19):
/* Key CSS variables in style.css */
--color-primary: #20282D; /* Dark — used for headings, buttons, footer */
--color-body: #5D666F; /* Gray — used for body text */
--color-blue: #0b4df5; /* Blue — used for accents, links */
To change these globally, add overrides to the inline <style> block in the <head>:
:root {
--color-primary: #1a365d; /* Your new primary color */
--color-body: #4a5568; /* Your new body text color */
--color-blue: #3182ce; /* Your new accent color */
}
Changing Fonts
The template loads Google Fonts via the <link> tag on line 15-17. Current fonts:
- Headings: Playfair Display (serif)
- Body text: Poppins (sans-serif)
To change fonts:
- Visit Google Fonts and pick your fonts.
- Replace the Google Fonts
<link>tag with your new embed code. - Update the font override block in the inline
<style>(around line 20-34):
/* Font Override — change these to your new fonts */
h1, h2, h3, h4, h5, h6,
.title {
font-family: "Your Heading Font", serif !important;
}
body, p, a, li, span, input,
textarea, select, button {
font-family: "Your Body Font", sans-serif !important;
}
Logo & Favicon
Changing the Logo
The logo appears in two places — the header navbar and the mobile sidebar. Both reference the same file:
- Replace
assets/images/logo/travel-studion-logo.pngwith your logo file. - If using a different filename, update these two lines in
index.html:
<!-- Header logo (around line 635) -->
<img src="assets/images/logo/your-logo.png" alt="your-logo">
<!-- Mobile sidebar logo (around line 682) -->
<img src="assets/images/logo/your-logo.png" alt="your-logo" style="max-width: 140px;">
Changing the Favicon
Replace assets/images/travel-studio-fav.png with your favicon, or update line 7:
<link rel="shortcut icon" href="assets/images/your-favicon.png">
Navigation
The navbar uses one-page scroll navigation. Each link points to a section ID:
| Nav Link | Target ID | Section |
|---|---|---|
| Home | #home | Hero slider |
| About | #about | About section |
| Destinations | #service | Destinations cards |
| Packages | #project | Packages with filters |
| Blog | #blog | Blog section |
| Contact | #contact | Contact form |
To add or rename nav links, edit the <ul> inside .nav-area (around line 657) and update the corresponding mobile sidebar nav (around line 691).
Hero Section
The hero is a 3-slide Swiper carousel. Each slide has a background image set via CSS classes in style.css:
| Slide | CSS Class | Image File |
|---|---|---|
| Slide 1 | .rts-banner-area-two | assets/images/banner/banner-01.jpg |
| Slide 2 | .rts-banner-area-two.two | assets/images/banner/banner-02.jpg |
| Slide 3 | .rts-banner-area-two.three | assets/images/banner/banner-03.jpg |
To change hero backgrounds, simply replace the image files in assets/images/banner/. Recommended size: 1920x850px (JPEG, optimized).
To edit slide content (titles, descriptions, CTAs), find the .swiper-slide blocks starting around line 706. Each slide contains:
- A badge text (
.hero-badge) - Heading (
h1.title) - Description (
p.disc) - CTA buttons (
.hero-cta-group) - Stats/trust indicators on the right column
About Section
Located around line 883 with ID #about. Contains:
- Main image:
assets/images/about/about-main.jpg(replace with your photo) - Small overlay image:
assets/images/about/about-small.jpg - Years of experience counter (change the number in the
.experience-infoblock) - Feature list with icons
- Description paragraph
Destinations Section
Located around line 1123 with ID #service. Contains 4 destination cards with the Swiper carousel. Each card has:
<div class="single-service-signle-wrapper" data-filter="Beach">
<img src="assets/images/service/beach.jpg">
<h5 class="title">Beach & Island Escapes</h5>
<p>Description here...</p>
</div>
data-filter attribute links each destination card to the package filter system. When clicked, the page scrolls to packages and auto-filters by that category. The value must match a data-category on package cards.
CTA Section
The "Ready for the adventure of a lifetime?" banner (around line 1233). Background image is set via CSS class .rts-call-to-action-area-two in style.css — references assets/images/cta/cta-bg.jpg. Replace that image to change the background.
Why Choose Us
Located around line 1259. Two-column layout with features on the left and images on the right. Features include icons with text (route, headset, shield, tags). Edit the li items inside .feature-list to change content. Images at assets/images/business-goal/goal-01.jpg and goal-02.jpg.
Statistics Counter
Animated counters that count up when scrolled into view (around line 1742). Background image: assets/images/counterup/counter-bg.jpg. Each counter uses the Odometer library:
<div class="odometer" data-count="50">0</div>
<span>Destinations Worldwide</span>
Change the data-count value to update the target number. The counter animates automatically on scroll.
Packages Section
Located around line 1780 with ID #project. Contains 8 tour package cards with filter controls. Each card structure:
<div class="package-card"
data-category="Beach"
data-price="1299">
<span class="pkg-badge">Beach</span>
<img src="assets/images/project/santorini.jpg">
<h5 class="pkg-title">Santorini Getaway</h5>
<p class="pkg-price">$1,299 <span>/person</span></p>
</div>
| Attribute | Purpose | Values Used |
|---|---|---|
data-category | Filter category | Beach, Adventure, Cultural, Wildlife |
data-price | Price for sorting (numeric, no comma) | e.g., 1299, 2499 |
Team Section
Swiper carousel showing team members (around line 1994). Each member card:
<div class="team-single-one-start">
<div class="team-image-area">
<a><img src="assets/images/team/team-01.jpg"></a>
</div>
<h6 class="title">Name</h6>
<span class="desig">Role</span>
<!-- Social links -->
</div>
Team images: assets/images/team/team-01.jpg through team-04.jpg. Recommended size: 400x500px.
Testimonials
Three review cards (around line 2288). Each has a reviewer image, name, rating stars, and review text. Reviewer images at assets/images/testimonials/reviewer-01.jpg through reviewer-03.jpg.
Contact Form
Located around line 2745 with ID #contact. Fields: Full Name, Email, Phone, Trip Type (dropdown), Message. The form currently has no backend — see Dynamic Integration to connect it.
Blog Section
Located around line 2897 with ID #blog. Shows 6 blog cards (3 unique posts, each repeated once for the carousel). Each card:
<div class="single-blog-area-one" data-blog="1">
<a><img src="assets/images/blog/blog-01.jpg"></a>
<div class="bottom-details">
<a class="blog-title">Title</a>
<p>Travel Tips / <span>by Travel Studio</span></p>
</div>
</div>
The data-blog attribute links cards to the blog modal content. See Blog Modal section.
Footer
Located around line 3734. Contains:
- Google Maps embed — replace the
<iframe>src with your location's embed URL - Office Hours — edit the hours text directly
- Quick Links — same anchor links as navbar
- Newsletter form — email input (no backend by default)
- Contact info — phone, email, address
- Copyright — auto-updates year via JavaScript
Filter & Search System
The packages section includes three filter controls:
| Control | ID | Function |
|---|---|---|
| Search input | .pkg-search input | Text search across card content |
| Type filter | #pkgTypeFilter | Filter by category (Beach, Adventure, etc.) |
| Price sort | #pkgPriceSort | Sort by price (low-high / high-low) |
To add a new filter category:
- Add an
<option>to the#pkgTypeFilterdropdown - Set matching
data-categoryon your package cards - Optionally add a destination card with matching
data-filterattribute
A "No packages found" fallback (#pkgNoResults) shows automatically when no cards match the filters. It includes a "Show all packages" reset link.
Blog Detail Modal
Clicking any blog card opens a full-screen modal with the article content. The modal features:
- Full-width hero image with gradient overlay
- Tag badge and date
- Article title and author info
- Scrollable HTML content
- Read time and social share footer
Blog content is stored in the blogData JavaScript object (around line 4104). See Adding New Blog Posts for how to add more.
Package Detail Modal
Clicking any package card opens a two-column modal:
- Left column (scrollable): Hero image, price tag, meta info (location, duration, group size, difficulty), description, highlights, what's included
- Right column (sticky): Booking form with name, email, travelers, trip type, travel date, and Book Now button
On mobile, columns stack vertically with the form below details. Package data is in the pkgData JavaScript object (around line 4180). See Adding New Packages.
Animations
The template uses GSAP with ScrollTrigger for scroll-based animations:
- Text reveal animation: Add class
rts-text-anime-style-1to any heading for a character-by-character reveal on scroll - Fade-in animations: Elements with
data-animationattributes animate on scroll viamain.js - Button hover: Horizontal wipe effect using
::beforepseudo-element (width 0 → 100%) - Swiper carousels: Auto-playing slideshows for hero, destinations, team, blog, and partner sections
ScrollTrigger.refresh() is already called in main.js (line 60), but you may need to increase the delay if issues persist.
Back to Top Button
A dark rounded-square button appears in the bottom-right corner after scrolling past 50px. Hover transforms it into a circle with a lift effect. Smooth fade-in/fade-out transitions. Styled via inline <style> near line 3897.
CSS Architecture
The template uses a layered CSS approach:
- Plugin CSS — Third-party styles (Bootstrap, Swiper, Font Awesome, etc.)
- style.css — Main template stylesheet (724 KB, compiled from SCSS). Contains all component styles and responsive rules.
- Inline
<style>blocks — Section-specific overrides using!importantto customize individual components without modifying style.css
<style> blocks in index.html rather than editing style.css directly. This keeps your changes isolated and makes future template updates easier.
JavaScript Guide
All JavaScript is organized in two layers:
main.js — Core Logic
Uses the rtsJs object pattern with jQuery. Key methods:
| Method | Purpose |
|---|---|
swiperActivation() | Initializes all Swiper carousels (hero, services, team, blog, partners) |
commonAnimation() | GSAP fade-in animations on scroll |
splitText() | GSAP SplitText character animation for headings |
stickyHeader() | Makes header sticky on scroll |
odoMeter() | Animated number counters |
vedioActivation() | Magnific Popup for video lightbox |
backToTopInit() | Back-to-top button scroll behavior |
preloader() | Page loading animation |
smoothScroll() | Smooth scroll for anchor links |
Inline Scripts — Feature Logic
Located at the bottom of index.html (after line 3967):
| Script | Purpose |
|---|---|
| Active nav scroll spy | Highlights current nav link based on scroll position |
| Mobile sidebar toggle | Open/close mobile navigation sidebar |
| Package filter & sort | Search, type filter, price sort, destination card integration |
| Blog detail modal | Opens blog articles in a modal overlay |
| Package detail modal | Opens package details with booking form |
Adding New Packages
Follow these 3 steps to add a new tour package:
Step 1: Add the Card HTML
Find the packages grid (around line 1808) and add a new card column:
<div class="col-lg-3 col-md-4 col-sm-6">
<div class="package-card"
data-category="Beach"
data-price="1599">
<div class="pkg-image">
<span class="pkg-badge">Beach</span>
<img src="assets/images/project/your-image.jpg" alt="Package Name">
</div>
<div class="pkg-content">
<h5 class="pkg-title">Your Package Name</h5>
<div class="pkg-meta">
<span><i class="far fa-clock"></i> 7 Days</span>
<span><i class="fas fa-users"></i> Up to 12</span>
</div>
<p class="pkg-price">$1,599 <span>/person</span></p>
</div>
</div>
</div>HTML
Step 2: Add Modal Data
Find the pkgData object (around line 4180) and add a new entry. The key must exactly match the .pkg-title text:
'Your Package Name': {
img: 'assets/images/project/your-image-lg.jpg',
price: '1,599',
location: 'Country',
duration: '7 Days / 6 Nights',
groupSize: 'Up to 12',
difficulty: 'Easy',
desc: 'Your package description here...',
highlights: [
'Highlight 1',
'Highlight 2',
'Highlight 3'
],
includes: ['Flights', 'Hotel', 'Breakfast']
}JS
Step 3: Add Filter Option (if new category)
If your package uses a new category, add an option to the #pkgTypeFilter dropdown:
<option value="NewCategory">New Category</option>HTML
Adding New Blog Posts
Follow these 2 steps:
Step 1: Add the Card HTML
Find the blog Swiper slides (around line 2910) and add a new slide:
<div class="swiper-slide">
<div class="single-blog-area-one" data-blog="4">
<a><img src="assets/images/blog/blog-04.jpg"></a>
<div class="bottom-details">
<a class="blog-title">Your Blog Title</a>
<p>Travel Tips / <span>by Travel Studio</span></p>
</div>
</div>
</div>HTML
Step 2: Add Modal Data
Find the blogData object (around line 4104) and add a new entry with a unique key matching the data-blog attribute:
'4': {
title: 'Your Blog Title',
img: 'assets/images/blog/blog-04.jpg',
tag: 'Category Tag',
date: 'Mar 01, 2026',
readTime: '5 min read',
content: '<p>Your article HTML content...</p>'
}JS
Image Management
All images are in assets/images/. Recommended sizes:
| Image Type | Recommended Size | Format |
|---|---|---|
| Hero backgrounds | 1920 x 850px | JPEG (optimized) |
| Package card thumbnails | 600 x 400px | JPEG |
| Package modal hero | 1000 x 500px | JPEG |
| Blog images | 800 x 500px | JPEG |
| Team photos | 400 x 500px | JPEG |
| Destination cards | 600 x 400px | JPEG |
| Testimonial avatars | 100 x 100px | JPEG |
| Logo | Any (SVG or PNG) | PNG / SVG |
| Favicon | 32 x 32px or 64 x 64px | PNG / ICO |
SEO & Meta Tags
Update the <head> section of index.html with your site information:
<title>Your Site Title - Travel Agency</title>
<meta name="description" content="Your site description">
<meta name="keywords" content="travel, agency, tours">
<!-- Open Graph for social media sharing -->
<meta property="og:title" content="Your Site Title">
<meta property="og:description" content="Your description">
<meta property="og:image" content="https://yoursite.com/preview.jpg">HTML
Dynamic Integration
While this is a static template, you can connect it to backends or services:
Contact Form
The contact form (ID: #contact) and booking form (in the package modal) need backend integration. Options:
- Formspree: Add
action="https://formspree.io/f/your-id"andmethod="POST"to the form tag - EmailJS: Send emails directly from JavaScript without a backend
- Custom PHP: Create a
mailer.phpfile and point the form action to it - Netlify Forms: Add
data-netlify="true"to the form tag if hosting on Netlify
Making Packages Dynamic
To load packages from a database/API instead of static HTML:
- Replace the static
pkgDataobject with an API fetch call - Generate the card HTML dynamically using JavaScript
- Keep the same class names and
data-*attributes for the filter system to work - Call
filterAndSort()after rendering new cards
// Example: Fetch packages from API
fetch('/api/packages')
.then(res => res.json())
.then(packages => {
const grid = document.querySelector('.row.g-4');
packages.forEach(pkg => {
grid.innerHTML += `
<div class="col-lg-3 col-md-4 col-sm-6">
<div class="package-card"
data-category="${pkg.category}"
data-price="${pkg.price}">
...
</div>
</div>`;
});
});JS
Google Maps
The footer contains a Google Maps <iframe> embed. To change the location:
- Go to Google Maps
- Search your location
- Click "Share" → "Embed a map"
- Copy the
<iframe>code and replace the existing one in the footer
CSS Variables Reference
| Variable | Default Value | Usage |
|---|---|---|
--color-primary | #20282D | Headings, buttons, footer, dark elements |
--color-body | #5D666F | Body text, paragraphs |
--color-blue | #0b4df5 | Accent links, badges, hover states |
--font-primary | "Red Hat Display" | Base heading font (overridden to Playfair Display) |
--font-secondary | "DM Sans" | Base body font (overridden to Poppins) |
--radius | 10px | Default border radius |
--transition | 0.3s | Default transition duration |
Icon Reference
The template uses Font Awesome Pro icons with 4 weight prefixes:
| Prefix | Weight | Example |
|---|---|---|
fas | Solid (900) | <i class="fas fa-globe-americas"></i> |
far | Regular (400) | <i class="far fa-clock"></i> |
fal | Light (300) | <i class="fal fa-times"></i> |
fab | Brands | <i class="fab fa-instagram"></i> |
Browse all available icons at fontawesome.com/icons.
ID Reference
Important element IDs used by JavaScript:
| ID | Element | Used By |
|---|---|---|
#home | Hero section | Navigation, scroll spy |
#about | About section | Navigation |
#service | Destinations section | Navigation |
#project | Packages section | Navigation, destination card scroll |
#blog | Blog section | Navigation |
#contact | Contact section | Navigation |
#pkgTypeFilter | Type filter dropdown | Filter system |
#pkgPriceSort | Price sort dropdown | Sort system |
#pkgNoResults | No results fallback | Filter system |
#pkgResetFilter | Reset filters link | Filter system |
#blogModalOverlay | Blog modal wrapper | Blog modal script |
#pkgModalOverlay | Package modal wrapper | Package modal script |
#mobileMenuBtn | Hamburger button | Mobile sidebar script |
#mobileSidebar | Mobile nav sidebar | Mobile sidebar script |
Credits & Licenses
| Resource | License | Link |
|---|---|---|
| Bootstrap 5 | MIT | getbootstrap.com |
| jQuery | MIT | jquery.com |
| Swiper | MIT | swiperjs.com |
| GSAP | Standard License | gsap.com |
| Font Awesome Pro | Commercial | fontawesome.com |
| Google Fonts | Open Font License | fonts.google.com |
| Magnific Popup | MIT | dimsemenov.com |
| Unsplash Images | Unsplash License | unsplash.com |
Travel Studio Documentation — Built with care.