anycoder-125a4343 / index.html
coreline's picture
Upload folder using huggingface_hub
e4751ff verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TripNav Andaman | Explore the Andaman Islands</title>
<!-- Google Fonts for Modern Typography -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;700;800&family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
<!-- Font Awesome for Icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
:root {
/* Andaman Theme Colors: Ocean Blue, Sandy White, Coral Accent */
--primary-color: #006994; /* Deep Ocean */
--primary-light: #008fb3;
--accent-color: #ff6b6b; /* Coral Sunset */
--text-dark: #333333;
--text-light: #666666;
--bg-light: #f8f9fa;
--white: #ffffff;
--shadow: 0 4px 20px rgba(0,0,0,0.1);
--transition: all 0.3s ease;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Poppins', sans-serif;
color: var(--text-dark);
background-color: var(--bg-light);
line-height: 1.6;
overflow-x: hidden;
}
h1, h2, h3, h4, h5 {
font-family: 'Montserrat', sans-serif;
font-weight: 700;
color: var(--text-dark);
}
a { text-decoration: none; color: inherit; }
ul { list-style: none; }
/* --- Utility Classes --- */
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.btn {
display: inline-block;
padding: 12px 30px;
border-radius: 50px;
font-weight: 600;
cursor: pointer;
transition: var(--transition);
text-align: center;
border: none;
}
.btn-primary {
background-color: var(--primary-color);
color: var(--white);
box-shadow: 0 4px 10px rgba(0, 105, 148, 0.3);
}
.btn-primary:hover {
background-color: var(--primary-light);
transform: translateY(-2px);
}
.btn-outline {
border: 2px solid var(--primary-color);
color: var(--primary-color);
background: transparent;
}
.btn-outline:hover {
background-color: var(--primary-color);
color: var(--white);
}
.section-title {
text-align: center;
margin-bottom: 50px;
}
.section-title h2 {
font-size: 2.5rem;
margin-bottom: 10px;
}
.section-title p {
color: var(--text-light);
max-width: 600px;
margin: 0 auto;
}
.hidden { display: none !important; }
.fade-in { animation: fadeIn 0.5s ease-in-out; }
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
/* --- Navigation --- */
nav {
background: var(--white);
padding: 1rem 0;
position: sticky;
top: 0;
z-index: 1000;
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
}
.nav-container {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 1.8rem;
font-weight: 800;
color: var(--primary-color);
display: flex;
align-items: center;
gap: 10px;
}
.logo i { color: var(--accent-color); }
.nav-links {
display: flex;
gap: 30px;
align-items: center;
}
.nav-item {
font-weight: 500;
color: var(--text-dark);
cursor: pointer;
transition: color 0.3s;
}
.nav-item:hover { color: var(--primary-color); }
.nav-item.active { color: var(--primary-color); font-weight: 700; border-bottom: 2px solid var(--accent-color); padding-bottom: 5px; }
.user-actions {
display: flex;
align-items: center;
gap: 20px;
}
.cart-icon {
position: relative;
cursor: pointer;
font-size: 1.2rem;
}
.cart-count {
position: absolute;
top: -8px;
right: -10px;
background: var(--accent-color);
color: white;
font-size: 0.7rem;
width: 18px;
height: 18px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.auth-btn {
font-size: 0.9rem;
padding: 8px 20px;
}
/* --- Hero Section --- */
.hero {
position: relative;
height: 80vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
color: var(--white);
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: 0; left: 0; width: 100%; height: 100%;
background: linear-gradient(to bottom, rgba(0,0,0,0.3), rgba(0,0,0,0.7));
z-index: 1;
}
.hero-bg {
position: absolute;
top: 0; left: 0; width: 100%; height: 100%;
background: url('https://images.unsplash.com/photo-1518199266791-5375a83190b7?q=80&w=2070&auto=format&fit=crop') no-repeat center center/cover;
z-index: 0;
}
.hero-content {
position: relative;
z-index: 2;
max-width: 800px;
padding: 20px;
}
.hero h1 {
font-size: 4rem;
margin-bottom: 20px;
line-height: 1.1;
text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
}
.hero p {
font-size: 1.5rem;
margin-bottom: 40px;
opacity: 0.9;
}
.search-bar {
background: var(--white);
padding: 20px;
border-radius: 50px;
display: flex;
gap: 20px;
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
}
.search-item {
flex: 1;
display: flex;
flex-direction: column;
}
.search-label { font-size: 0.8rem; color: var(--text-light); margin-bottom: 5px; font-weight: 600; }
.search-input { padding: 10px; border: 1px solid #ddd; border-radius: 8px; font-family: inherit; }
/* --- Categories --- */
.categories {
padding: 80px 0;
background: var(--white);
}
.category-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 30px;
}
.category-card {
position: relative;
height: 300px;
border-radius: 20px;
overflow: hidden;
cursor: pointer;
box-shadow: var(--shadow);
transition: var(--transition);
}
.category-card:hover { transform: translateY(-10px); }
.category-img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s;
}
.category-card:hover .category-img { transform: scale(1.1); }
.category-overlay {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 30px;
background: linear-gradient(to top, rgba(0,0,0,0.9), transparent);
color: var(--white);
}
/* --- Packages Section --- */
.packages-section {
padding: 80px 0;
background: var(--bg-light);
}
.packages-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 40px;
}
.package-card {
background: var(--white);
border-radius: 20px;
overflow: hidden;
box-shadow: var(--shadow);
transition: var(--transition);
display: flex;
flex-direction: column;
}
.package-card:hover { box-shadow: 0 10px 40px rgba(0,0,0,0.15); }
.package-img {
height: 220px;
width: 100%;
object-fit: cover;
}
.package-content {
padding: 25px;
flex-grow: 1;
display: flex;
flex-direction: column;
}
.package-tag {
background: #e0f7fa;
color: var(--primary-color);
padding: 5px 10px;
border-radius: 20px;
font-size: 0.75rem;
font-weight: 700;
width: fit-content;
margin-bottom: 15px;
}
.package-title { font-size: 1.5rem; margin-bottom: 10px; }
.package-rating { color: #f1c40f; margin-bottom: 10px; font-size: 0.9rem; }
.package-desc { color: var(--text-light); font-size: 0.95rem; margin-bottom: 20px; flex-grow: 1; }
.package-footer {
display: flex;
justify-content: space-between;
align-items: center;
border-top: 1px solid #eee;
padding-top: 20px;
margin-top: auto;
}
.price { font-size: 1.5rem; font-weight: 800; color: var(--primary-color); }
.price span { font-size: 1rem; color: var(--text-light); font-weight: 400; }
/* --- Package Details Modal/Overlay --- */
.detail-overlay {
position: fixed;
top: 0; left: 0; width: 100%; height: 100%;
background: rgba(0,0,0,0.8);
z-index: 2000;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
opacity: 0;
pointer-events: none;
transition: opacity 0.3s;
}
.detail-overlay.active { opacity: 1; pointer-events: all; }
.detail-content {
background: var(--white);
width: 100%;
max-width: 900px;
max-height: 90vh;
border-radius: 20px;
overflow-y: auto;
position: relative;
animation: slideUp 0.4s ease;
}
@keyframes slideUp { from { transform: translateY(50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
.close-detail {
position: absolute;
top: 20px;
right: 20px;
background: var(--white);
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 10;
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
}
.detail-header { position: relative; height: 400px; }
.detail-img { width: 100%; height: 100%; object-fit: cover; }
.detail-badge {
position: absolute;
top: 20px;
right: 20px;
background: var(--white);
padding: 10px 20px;
border-radius: 30px;
font-weight: 700;
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
}
.detail-body { padding: 40px; }
.detail-header-info { margin-bottom: 30px; }
.detail-header-info h2 { font-size: 2.5rem; margin-bottom: 10px; }
.detail-meta { display: flex; gap: 20px; color: var(--text-light); font-size: 0.9rem; }
.meta-item { display: flex; align-items: center; gap: 5px; }
.itinerary-section { margin: 30px 0; }
.itinerary-item { display: flex; gap: 20px; margin-bottom: 20px; padding-bottom: 20px; border-bottom: 1px solid #eee; }
.day-tag { background: var(--primary-color); color: white; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; flex-shrink: 0; }
.booking-section { background: #f8f9fa; padding: 30px; border-radius: 15px; margin-top: 40px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 20px; }
.total-price { font-size: 2rem; font-weight: 800; color: var(--primary-color); }
/* --- Dashboard & Admin Tables --- */
.dashboard-container { padding: 60px 0; }
.dashboard-header { margin-bottom: 40px; }
.table-container {
background: var(--white);
border-radius: 15px;
box-shadow: var(--shadow);
overflow: hidden;
}
table { width: 100%; border-collapse: collapse; }
th, td { padding: 20px; text-align: left; border-bottom: 1px solid #eee; }
th { background-color: #f8f9fa; font-weight: 700; color: var(--text-dark); }
tr:hover { background-color: #f8f9fa; }
.status-badge { padding: 5px 12px; border-radius: 20px; font-size: 0.8rem; font-weight: 600; }
.status-upcoming { background: #d4edda; color: #155724; }
.status-completed { background: #e2e3e5; color: #383d41; }
.status-pending { background: #fff3cd; color: #856404; }
/* --- Admin Panel --- */
.admin-panel { display: flex; gap: 30px; }
.admin-sidebar { width: 250px; background: var(--white); padding: 20px; border-radius: 15px; box-shadow: var(--shadow); height: fit-content; }
.admin-sidebar ul li { padding: 15px; cursor: pointer; border-radius: 10px; transition: 0.3s; margin-bottom: 5px; }
.admin-sidebar ul li:hover, .admin-sidebar ul li.active { background: var(--primary-color); color: white; }
.admin-main { flex: 1; }
.form-group { margin-bottom: 20px; }
.form-group label { display: block; margin-bottom: 8px; font-weight: 600; }
.form-control { width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 8px; font-family: inherit; }
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.action-btn { padding: 10px 20px; border-radius: 8px; cursor: pointer; border: none; font-weight: 600; }
.btn-save { background: var(--primary-color); color: white; }
.btn-delete { background: var(--accent-color); color: white; }
/* --- Footer --- */
footer {
background: #2c3e50;
color: #ecf0f1;
padding: 60px 0 20px;
}
.footer-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 40px;
margin-bottom: 40px;
}
.footer-col h3 { margin-bottom: 20px; color: var(--accent-color); }
.footer-col ul li { margin-bottom: 10px; }
.footer-col ul li a { color: #bdc3c7; transition: 0.3s; }
.footer-col ul li a:hover { color: var(--white); }
.copyright {
text-align: center;
padding-top: 20px;
border-top: 1px solid #34495e;
font-size: 0.9rem;
color: #bdc3c7;
}
.copyright a { color: var(--accent-color); text-decoration: underline; }
/* --- Responsive --- */
@media (max-width: 768px) {
.hero h1 { font-size: 2.5rem; }
.nav-links { display: none; } /* Simple hide for mobile in this demo, would need hamburger menu in production */
.user-actions { gap: 10px; }
.search-bar { flex-direction: column; }
.form-row { grid-template-columns: 1fr; }
.detail-overlay { padding: 10px; }
.detail-content { max-height: 95vh; }
}
</style>
</head>
<body>
<!-- Navigation -->
<nav>
<div class="container nav-container">
<a href="#" class="logo" onclick="app.navigate('home')">
<i class="fa-solid fa-island-tropical"></i> TripNav Andaman
</a>
<ul class="nav-links">
<li class="nav-item active" onclick="app.navigate('home')">Home</li>
<li class="nav-item" onclick="app.navigate('packages')">Packages</li>
<li class="nav-item" onclick="app.navigate('dashboard')">My Trips</li>
<li class="nav-item" onclick="app.navigate('admin')">Admin</li>
</ul>
<div class="user-actions">
<div class="cart-icon" onclick="alert('This is a demo cart feature!')">
<i class="fa-solid fa-cart-shopping"></i>
<span class="cart-count" id="cartCount">0</span>
</div>
<button class="btn auth-btn" onclick="app.toggleAuth()">Login / Sign Up</button>
</div>
</div>
</nav>
<!-- Main Content Area -->
<main id="main-content">
<!-- Content injected via JS -->
</main>
<!-- Footer -->
<footer>
<div class="container">
<div class="footer-grid">
<div class="footer-col">
<h3>TripNav Andaman</h3>
<p>Your trusted partner for unforgettable experiences in the Andaman Islands. Curated adventures, luxury stays, and cultural immersion.</p>
</div>
<div class="footer-col">
<h3>Quick Links</h3>
<ul>
<li><a href="#" onclick="app.navigate('home')">Home</a></li>
<li><a href="#" onclick="app.navigate('packages')">Book a Tour</a></li>
<li><a href="#">Contact Us</a></li>
<li><a href="#">FAQs</a></li>
</ul>
</div>
<div class="footer-col">
<h3>Categories</h3>
<ul>
<li><a href="#" onclick="app.filterPackages('water-sports')">Water Sports</a></li>
<li><a href="#" onclick="app.filterPackages('cultural')">Cultural Tours</a></li>
<li><a href="#" onclick="app.filterPackages('luxury')">Luxury Escapes</a></li>
</ul>
</div>
<div class="footer-col">
<h3>Contact</h3>
<ul>
<li><i class="fa-solid fa-phone" style="color: var(--accent-color); margin-right: 10px;"></i> +91 8888 123 456</li>
<li><i class="fa-solid fa-envelope" style="color: var(--accent-color); margin-right: 10px;"></i> support@tripnavandaman.com</li>
<li><i class="fa-solid fa-location-dot" style="color: var(--accent-color); margin-right: 10px;"></i> Port Blair, Andaman</li>
</ul>
</div>
</div>
<div class="copyright">
&copy; 2023 TripNav Andaman. All Rights Reserved. <br>
Built with <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" style="color: var(--accent-color);">anycoder</a>
</div>
</div>
</footer>
<!-- Package Detail Modal -->
<div id="packageDetailModal" class="detail-overlay" onclick="if(event.target === this) app.closeDetail()">
<div class="detail-content">
<div class="close-detail" onclick="app.closeDetail()">
<i class="fa-solid fa-xmark"></i>
</div>
<div id="detailContentContainer">
<!-- Content injected via JS -->
</div>
</div>
</div>
<script>
// --- Mock Data ---
const packagesData = [
{
id: 1,
title: "Radhanagar Beach & Water Sports",
category: "water-sports",
price: 2500,
rating: 4.8,
reviews: 1240,
image: "https://images.unsplash.com/photo-1539253776667-57d631212386?q=80&w=800&auto=format&fit=crop",
description: "Experience the crystal-clear waters of Radhanagar Beach with a package including parasailing, jet skiing, and banana boat rides. Perfect for adrenaline junkies.",
itinerary: [
{ day: 1, activity: "Arrival at Havelock Island & Check-in" },
{ day: 1, activity: "Sunset cruise to Radhanagar Beach" },
{ day: 1, activity: "Full Day Water Sports Activity (Parasailing, Jet Ski)" },
{ day: 1, activity: "Evening free at beach resort" }
],
inclusions: ["Transport", "Equipment", "Guide", "Lunch"]
},
{
id: 2,
title: "Andaman Heritage Cultural Tour",
category: "cultural",
price: 3200,
rating: 4.6,
reviews: 850,
image: "https://images.unsplash.com/photo-1516627117852-36564d556756?q=80&w=800&auto=format&fit=crop",
description: "Dive deep into the rich history and diverse culture of the Andamans. Visit the Cellular Jail, Chatham Island, and interact with local tribes (regulated zones).",
itinerary: [
{ day: 1, activity: "Pickup from Port Blair Hotel" },
{ day: 1, activity: "Guided tour of Cellular Jail (Light & Sound Show)" },
{ day: 1, activity: "Visiting Anthropological Museum" },
{ day: 1, activity: "Evening at Chowru Bazaar for local crafts" }
],
inclusions: ["Guide", "Entry Tickets", "AC Transport", " Dinner"]
},
{
id: 3,
title: "Luxury Havelock Island Retreat",
category: "luxury",
price: 15000,
rating: 4.9,
reviews: 320,
image: "https://images.unsplash.com/photo-1566350453-5915955a8c31?q=80&w=800&auto=format&fit=crop",
description: "Indulge in a 4-night luxury stay at a 5-star beachfront resort. Includes private beach access, spa credits, and gourmet dining.",
itinerary: [
{ day: 1, activity: "Arrival & Welcome Drink" },
{ day: 1, activity: "Spa Treatment (60 mins)" },
{ day: 1, activity: "Gourmet Dinner at Seaside Restaurant" },
{ day: 2, activity: "Private Catamaran Cruise" }
],
inclusions: ["4 Nights Luxury Stay", "Daily Breakfast", "Spa Credit", "Private Transfers"]
},
{
id: 4,
title: "Neil Island Adventure",
category: "water-sports",
price: 1800,
rating: 4.5,
reviews: 600,
image: "https://images.unsplash.com/photo-1544556185-8f384681a0a0?q=80&w=800&auto=format&fit=crop",
description: "Explore the coral reefs of Neil Island with snorkeling and scuba diving. Visit the iconic Laxmanpur Beach and Sitapur Beach.",
itinerary: [
{ day: 1, activity: "Boat ride to Neil Island" },
{ day: 1, activity: "Snorkeling at Neil Island Reef" },
{ day: 1, activity: "Lunch at a local beach shack" },
{ day: 1, activity: "Bicycle tour of the island" }
],
inclusions: ["Boat Tickets", "Snorkeling Gear", "Lunch", "Guide"]
},
{
id: 5,
title: "Port Blair City Explorer",
category: "cultural",
price: 1200,
rating: 4.3,
reviews: 450,
image: "https://images.unsplash.com/photo-1596259772435-3e36a7887b48?q=80&w=800&auto=format&fit=crop",
description: "A perfect 2-day tour for first-time visitors. Covers all major landmarks in the capital city including Cellular Jail and Chatham Island.",
itinerary: [
{ day: 1, activity: "Cellular Jail History Tour" },
{ day: 1, activity: "Light & Sound Show" },
{ day: 2, activity: "Chatham Island Beaches" },
{ day: 2, activity: "Shopping at Market" }
],
inclusions: ["Hotel Stay", "Meals", "Local Transport", "Guide"]
},
{
id: 6,
title: "Andaman Scuba Diving Masterclass",
category: "water-sports",
price: 8500,
rating: 4.8,
reviews: 210,
image: "https://images.unsplash.com/photo-1546519638-68e1b9927184?q=80&w=800&auto=format&fit=crop",
description: "Get PADI certified or improve your skills with professional instructors. Explore the vibrant marine life of the Andaman Sea.",
itinerary: [
{ day: 1, activity: "Theory Session & Pool Training" },
{ day: 2, activity: "Deep Sea Diving (2 dives)" },
{ day: 3, activity: "Examination & Certification" }
],
inclusions: ["Equipment", "Certification Fee", "Instructor", "Boat Trips"]
}
];
const userData = {
name: "Tourist User",
bookings: [
{ id: 101, package: "Radhanagar Beach & Water Sports", date: "2023-12-15", status: "upcoming", price: 2500 },
{ id: 102, package: "Port Blair City Explorer", date: "2023-11-20", status: "completed", price: 1200 }
]
};
// --- Application Logic ---
const app = {
currentPage: 'home',
cartCount: 0,
init: function() {
this.renderHome();
this.updateCartUI();
},
navigate: function(page) {
this.currentPage = page;
// Update Nav Active States
document.querySelectorAll('.nav-item').forEach(item => {
item.classList.remove('active');
if(item.innerText.toLowerCase().includes(page) || (page === 'home' && item.innerText === 'Home')) {
item.classList.add('active');
}
});
const mainContent = document.getElementById('main-content');
mainContent.innerHTML = ''; // Clear content
if (page === 'home') this.renderHome();
else if (page === 'packages') this.renderPackages();
else if (page === 'dashboard') this.renderDashboard();
else if (page === 'admin') this.renderAdmin();
},
// --- Render Functions ---
renderHome: function() {
const mainContent = document.getElementById('main-content');
mainContent.innerHTML = `
<!-- Hero Section -->
<section class="hero">
<div class="hero-bg"></div>
<div class="hero-content">
<h1>Discover the Paradise of Andaman</h1>
<p>Crystal clear waters, white sandy beaches, and unforgettable adventures.</p>
<div class="search-bar">
<div class="search-item">
<label class="search-label">Destination</label>
<input type="text" class="search-input" value="Andaman Islands" readonly>
</div>
<div class="search-item">
<label class="search-label">Category</label>
<select class="search-input" onchange="app.navigate('packages'); app.filterPackages(this.value)">
<option value="">All Activities</option>
<option value="water-sports">Water Sports</option>
<option value="cultural">Cultural Tours</option>
<option value="luxury">Luxury Escapes</option>
</select>
</div>
<div class="search-item">
<label class="search-label">Dates</label>
<input type="date" class="search-input">
</div>
<div class="search-item" style="justify-content: center;">
<button class="btn btn-primary" style="height: 100%; width: 100%;" onclick="app.navigate('packages')">Search Tours</button>
</div>
</div>
</div>
</section>
<!-- Categories -->
<section class="categories">
<div class="container">
<div class="section-title">
<h2>Explore by Interest</h2>
<p>Choose from our curated collection of experiences tailored to your travel style.</p>
</div>
<div class="category-grid">
<div class="category-card" onclick="app.filterPackages('water-sports')">
<img src="https://images.unsplash.com/photo-1539253776667-57d631212386?q=80&w=600&auto=format&fit=crop" class="category-img" alt="Water Sports">
<div class="category-overlay">
<h3>Adventure Water Sports</h3>
<p>Diving, Snorkeling, Jet Skiing</p>
</div>
</div>
<div class="category-card" onclick="app.filterPackages('cultural')">
<img src="https://images.unsplash.com/photo-1516627117852-36564d556756?q=80&w=600&auto=format&fit=crop" class="category-img" alt="Culture">
<div class="category-overlay">
<h3>Cultural Tours</h3>
<p>History, Museums & Local Life</p>
</div>
</div>
<div class="category-card" onclick="app.filterPackages('luxury')">
<img src="https://images.unsplash.com/photo-1566350453-5915955a8c31?q=80&w=600&auto=format&fit=crop" class="category-img" alt="Luxury">
<div class="category-overlay">
<h3>Luxury Escape</h3>
<p>5-Star Resorts & Private Tours</p>
</div>
</div>
</div>
</div>
</section>
<!-- Featured Packages -->
<section class="packages-section">
<div class="container">
<div class="section-title">
<h2>Featured Packages</h2>
<p>Top-rated experiences chosen by fellow travelers.</p>
</div>
<div class="packages-grid" id="homePackagesGrid">
${this.generatePackageCards(packagesData.slice(0, 3))}
</div>
<div style="text-align: center; margin-top: 40px;">
<button class="btn btn-outline" onclick="app.navigate('packages')">View All Packages <i class="fa-solid fa-arrow-right"></i></button>
</div>
</div>
</section>
`;
},
renderPackages: function() {
const mainContent = document.getElementById('main-content');
mainContent.innerHTML = `
<div style="background: #e0f7fa; padding: 40px 0; text-align: center;">
<div class="container">
<h2 style="color: var(--primary-color);">Find Your Perfect Andaman Adventure</h2>
<p>Browse our full collection of curated tours and activities.</p>
<div style="margin-top: 20px;">
<button class="btn btn-primary" onclick="app.filterPackages('')">All Packages</button>
<button class="btn btn-outline" onclick="app.filterPackages('water-sports')">Water Sports</button>
<button class="btn btn-outline" onclick="app.filterPackages('cultural')">Cultural</button>
<button class="btn btn-outline" onclick="app.filterPackages('luxury')">Luxury</button>
</div>
</div>
</div>
<div class="container" style="padding-top: 60px;">
<div class="packages-grid" id="packagesGrid">
${this.generatePackageCards(packagesData)}
</div>
</div>
`;
},
renderDashboard: function() {
const mainContent = document.getElementById('main-content');
mainContent.innerHTML = `
<div class="container dashboard-container">
<div class="dashboard-header">
<h2>Welcome back, ${userData.name}</h2>
<p>Manage your upcoming trips and booking history.</p>
</div>
<div class="table-container">
<table>
<thead>
<tr>
<th>Trip Name</th>
<th>Date</th>
<th>Price</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
<tbody id="dashboardTableBody">
${this.generateDashboardRows(userData.bookings)}
</tbody>
</table>
</div>
</div>
`;
},
renderAdmin: function() {
const mainContent = document.getElementById('main-content');
mainContent.innerHTML = `
<div class="container dashboard-container">
<div class="admin-panel">
<div class="admin-sidebar">
<ul>
<li onclick="alert('Dashboard stats would go here')" class="active">Overview</li>
<li onclick="alert('Manage listings')">Manage Listings</li>
<li onclick="alert('Manage bookings')">Manage Bookings</li>
<li onclick="alert('View customer inquiries')">Customer Inquiries</li>
</ul>
</div>
<div class="admin-main">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px;">
<h2>Manage Listings</h2>
<button class="btn btn-primary" onclick="alert('Add new package functionality would open here')"><i class="fa-solid fa-plus"></i> Add New Package</button>
</div>
<div class="table-container">
<table>
<thead>
<tr>
<th>Package Name</th>
<th>Category</th>
<th>Price</th>
<th>Active</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
${this.generateAdminRows(packagesData)}
</tbody>
</table>
</div>
</div>
</div>
</div>
`;
},
// --- Helper Functions ---
generatePackageCards: function(data) {
return data.map(pkg => `
<div class="package-card">
<img src="${pkg.image}" class="package-img" alt="${pkg.title}">
<div class="package-content">
<span class="package-tag">${pkg.category.replace('-', ' ').toUpperCase()}</span>
<h3 class="package-title">${pkg.title}</h3>
<div class="package-rating">
<i class="fa-solid fa-star"></i> ${pkg.rating} (${pkg.reviews} reviews)
</div>
<p class="package-desc">${pkg.description}</p>
<div class="package-footer">
<div>
<span class="price">₹${pkg.price}</span>
<span>/ per person</span>
</div>
<button class="btn btn-primary" onclick="app.openPackageDetail(${pkg.id})">Book Now</button>
</div>
</div>
</div>
`).join('');
},
generateDashboardRows: function(bookings) {
return bookings.map(b => `
<tr>
<td>${b.package}</td>
<td>${b.date}</td>
<td>₹${b.price}</td>
<td><span class="status-badge status-${b.status}">${b.status.toUpperCase()}</span></td>
<td><button class="btn btn-outline" style="padding: 5px 10px; font-size: 0.8rem;">View Details</button></td>
</tr>
`).join('');
},
generateAdminRows: function(listings) {
return listings.map(l => `
<tr>
<td>${l.title}</td>
<td>${l.category}</td>
<td>₹${l.price}</td>
<td><i class="fa-solid fa-check" style="color: green;"></i></td>
<td>
<button class="action-btn btn-delete" onclick="app.deleteListing(${l.id})"><i class="fa-solid fa-trash"></i></button>
</td>
</tr>
`).join('');
},
filterPackages: function(category) {
const grid = document.getElementById('packagesGrid') || document.getElementById('homePackagesGrid');
if (!grid) return;
let filtered = packagesData;
if (category) {
filtered = packagesData.filter(p => p.category === category);
}
grid.innerHTML = filtered.length > 0
? this.generatePackageCards(filtered)
: '<div style="grid-column: 1/-1; text-align: center; padding: 50px;"><h3>No packages found in this category.</h3></div>';
},
openPackageDetail: function(id) {
const pkg = packagesData.find(p => p.id === id);
if (!pkg) return;
const container = document.getElementById('detailContentContainer');
// Generate Itinerary HTML
const itineraryHTML = pkg.itinerary.map(item => `
<div class="itinerary-item">
<div class="day-tag">Day ${item.day}</div>
<div>
<h4 style="color: var(--primary-color); margin-bottom: 5px;">${item.activity}</h4>
<p style="color: var(--text-light); font-size: 0.9rem;">Detailed schedule and meeting points provided upon booking.</p>
</div>
</div>
`).join('');
container.innerHTML = `
<div class="detail-header">
<img src="${pkg.image}" class="detail-img" alt="${pkg.title}">
<div class="detail-badge">
<i class="fa-solid fa-star" style="color: #f1c40f;"></i> ${pkg.rating} | ${pkg.reviews} Reviews
</div>
</div>
<div class="detail-body">
<div class="detail-header-info">
<h2>${pkg.title}</h2>
<div class="detail-meta">
<div class="meta-item"><i class="fa-solid fa-clock"></i> 1 Day / ${pkg.itinerary.length} Days</div>
<div class="meta-item"><i class="fa-solid fa-person-hiking"></i> Moderate Activity</div>
<div class="meta-item"><i class="fa-solid fa-location-dot"></i> ${pkg.category === 'water-sports' ? 'Havelock/Neil Island' : 'Port Blair'}</div>
</div>
</div>
<h3>About this Experience</h3>
<p style="margin-bottom: 30px; color: var(--text-light);">${pkg.description}</p>
<div class="itinerary-section">
<h3>Itinerary</h3>
${itineraryHTML}
</div>
<div class="itinerary-section">
<h3