Files
etype-sell/html/index.html
T
2026-08-20 16:57:32 +02:00

659 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>1973 Jaguar E-Type Series 3 V12 Roadster | For Sale</title>
<meta name="description" content="Privately owned 1973 Jaguar E-Type Roadster in red, featuring the legendary 5.3L V12 engine. Offered at CHF 65'000.">
<style>
:root {
--bg-dark: #0d0f12;
--bg-card: #161b22;
--accent-red: #c0262d;
--accent-gold: #d4af37;
--text-main: #f0f3f6;
--text-muted: #8b949e;
--border-color: rgba(255, 255, 255, 0.1);
--font-stack: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background-color: var(--bg-dark);
color: var(--text-main);
font-family: var(--font-stack);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.wrapper {
max-width: 1040px;
margin: 0 auto;
padding: 2rem 1rem 4rem;
}
/* Header */
header {
text-align: center;
margin-bottom: 2rem;
}
.badge {
display: inline-block;
background: rgba(192, 38, 45, 0.15);
border: 1px solid var(--accent-red);
color: #ff6b6b;
font-size: 0.8rem;
font-weight: 600;
letter-spacing: 1.5px;
padding: 0.35rem 0.8rem;
border-radius: 20px;
text-transform: uppercase;
margin-bottom: 0.75rem;
}
h1 {
font-size: 2.4rem;
font-weight: 300;
letter-spacing: 1px;
color: #fff;
}
.tagline {
color: var(--text-muted);
font-size: 1.05rem;
margin-top: 0.25rem;
}
.price-tag {
font-size: 2rem;
font-weight: 700;
color: var(--accent-gold);
margin-top: 0.75rem;
}
/* Fast Swipe Carousel */
.gallery-container {
position: relative;
background: var(--bg-card);
border-radius: 12px;
overflow: hidden;
border: 1px solid var(--border-color);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.5);
min-height: 320px;
}
.carousel-track {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
cursor: grab;
min-height: 320px;
}
.carousel-track::-webkit-scrollbar {
display: none;
}
.slide {
flex: 0 0 100%;
scroll-snap-align: start;
position: relative;
aspect-ratio: 16 / 9;
background-color: #000;
}
.slide img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
cursor: zoom-in;
}
.slide-overlay {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 1.5rem 1.25rem 1rem;
background: linear-gradient(to top, rgba(0, 0, 0, 0.85), transparent);
display: flex;
justify-content: space-between;
align-items: flex-end;
pointer-events: none;
}
.slide-overlay h3 {
font-size: 1.15rem;
color: #fff;
font-weight: 500;
}
.slide-counter {
color: var(--accent-gold);
font-weight: bold;
font-size: 0.9rem;
}
/* Loading placeholder */
.loading-state {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 350px;
color: var(--text-muted);
font-size: 1rem;
}
/* Carousel Nav Arrows */
.nav-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 44px;
height: 44px;
background: rgba(13, 15, 18, 0.75);
border: 1px solid var(--border-color);
color: #fff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
backdrop-filter: blur(4px);
transition: all 0.2s;
z-index: 5;
}
.nav-btn:hover {
background: var(--accent-red);
border-color: var(--accent-red);
}
.nav-btn.prev { left: 1rem; }
.nav-btn.next { right: 1rem; }
/* Navigation Dots */
.dots-nav {
display: flex;
justify-content: center;
gap: 8px;
padding: 1rem 0 0.5rem;
}
.dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.25);
cursor: pointer;
transition: all 0.2s;
}
.dot.active {
background: var(--accent-gold);
transform: scale(1.25);
}
/* Technical Specifications */
.specs-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-top: 2.5rem;
}
.spec-card {
background: var(--bg-card);
padding: 1.25rem;
border-radius: 8px;
border: 1px solid var(--border-color);
}
.spec-label {
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-muted);
margin-bottom: 0.25rem;
}
.spec-value {
font-size: 1.1rem;
font-weight: 600;
color: #fff;
}
/* Key Features Box */
.highlights-box {
background: var(--bg-card);
border-radius: 8px;
border: 1px solid var(--border-color);
padding: 1.5rem;
margin-top: 1.5rem;
}
.highlights-box h2 {
font-size: 1.25rem;
color: var(--accent-gold);
margin-bottom: 1rem;
}
.highlights-list {
list-style: none;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 0.75rem;
}
.highlights-list li {
display: flex;
align-items: center;
gap: 0.5rem;
color: var(--text-main);
font-size: 0.95rem;
}
.highlights-list li::before {
content: "✓";
color: var(--accent-gold);
font-weight: bold;
}
/* Contact Action Bar */
.contact-section {
text-align: center;
background: linear-gradient(180deg, var(--bg-card), rgba(22, 27, 34, 0.5));
border: 1px solid var(--border-color);
border-radius: 12px;
padding: 2.5rem 1.5rem;
margin-top: 2.5rem;
}
.contact-section h2 {
font-size: 1.5rem;
color: #fff;
margin-bottom: 0.5rem;
}
.btn-group {
display: flex;
justify-content: center;
gap: 1rem;
margin-top: 1.5rem;
flex-wrap: wrap;
}
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.85rem 1.75rem;
border-radius: 6px;
font-weight: 600;
text-decoration: none;
transition: all 0.2s ease;
font-size: 0.95rem;
}
.btn-phone {
background-color: var(--accent-gold);
color: #000;
}
.btn-phone:hover {
background-color: #e5be48;
transform: translateY(-2px);
}
.btn-whatsapp {
background-color: #25D366;
color: #fff;
}
.btn-whatsapp:hover {
background-color: #20bd5a;
transform: translateY(-2px);
}
/* Related Links */
.links-section {
margin-top: 2.5rem;
}
.links-section h3 {
font-size: 1.1rem;
color: var(--text-muted);
margin-bottom: 1rem;
text-transform: uppercase;
letter-spacing: 1px;
}
.links-grid {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.external-link {
background: var(--bg-card);
border: 1px solid var(--border-color);
color: var(--text-main);
padding: 0.6rem 1rem;
border-radius: 6px;
text-decoration: none;
font-size: 0.85rem;
transition: border-color 0.2s, color 0.2s;
}
.external-link:hover {
border-color: var(--accent-gold);
color: var(--accent-gold);
}
/* Fullscreen Lightbox Modal */
.lightbox {
display: none;
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.92);
z-index: 1000;
justify-content: center;
align-items: center;
}
.lightbox.active {
display: flex;
}
.lightbox img {
max-width: 90vw;
max-height: 90vh;
object-fit: contain;
border-radius: 4px;
}
.lightbox-close {
position: absolute;
top: 20px;
right: 25px;
color: #fff;
font-size: 2rem;
cursor: pointer;
}
footer {
text-align: center;
margin-top: 3rem;
color: var(--text-muted);
font-size: 0.8rem;
}
@media (max-width: 768px) {
h1 { font-size: 1.8rem; }
.nav-btn { display: none; }
}
</style>
</head>
<body>
<div class="wrapper">
<!-- Header -->
<header>
<span class="badge">Private Classic Car Sale</span>
<h1>1973 Jaguar E-Type Roadster</h1>
<p class="tagline">Iconic British Classic • 5.3L V12 • Roadster</p>
<div class="price-tag">CHF 65'000</div>
</header>
<!-- Fast-Loading Swipe Gallery -->
<div class="gallery-container">
<button class="nav-btn prev" id="prevBtn" aria-label="Previous image">❮</button>
<button class="nav-btn next" id="nextBtn" aria-label="Next image">❯</button>
<div class="carousel-track" id="carouselTrack">
<div class="loading-state" id="loadingState">Loading vehicle photos...</div>
</div>
</div>
<!-- Navigation Dots -->
<div class="dots-nav" id="dotsNav"></div>
<!-- Specifications -->
<div class="specs-grid">
<div class="spec-card">
<div class="spec-label">Year</div>
<div class="spec-value">1973</div>
</div>
<div class="spec-card">
<div class="spec-label">Engine</div>
<div class="spec-value">5.3L V12</div>
</div>
<div class="spec-card">
<div class="spec-label">Transmission</div>
<div class="spec-value">Automatic</div>
</div>
<div class="spec-card">
<div class="spec-label">Exterior</div>
<div class="spec-value">Red</div>
</div>
<div class="spec-card">
<div class="spec-label">Body Style</div>
<div class="spec-value">Roadster</div>
</div>
<div class="spec-card">
<div class="spec-label">Condition</div>
<div class="spec-value">Very Good</div>
</div>
</div>
<!-- Highlights -->
<div class="highlights-box">
<h2>Vehicle Highlights & Details</h2>
<ul class="highlights-list">
<li>Removable Hardtop</li>
<li>Jaguar Heritage Certificate</li>
<li>US Import 1980</li>
<li>Swiss Technical Control (MFK)</li>
</ul>
</div>
<!-- Owner Contact -->
<div class="contact-section" id="contact">
<h2>Call the Owner</h2>
<p style="color: var(--text-muted);">For direct inquiries, please call or text the owner:</p>
<div class="btn-group">
<a href="tel:+41793758510" class="btn btn-phone">
📞 +41 79 375 8510
</a>
<a href="https://wa.me/41793758510" target="_blank" rel="noopener" class="btn btn-whatsapp">
💬 Contact via WhatsApp
</a>
</div>
</div>
<!-- Related Links & References -->
<div class="links-section">
<h3>Related Links & References</h3>
<div class="links-grid">
<a href="https://bringatrailer.com/jaguar/e-type-series-iii/" target="_blank" rel="noopener" class="external-link">
Bring a Trailer – Jaguar E-Type Series III
</a>
<a href="https://www.youtube.com/results?search_query=Jaguar+E-Type+Documentary" target="_blank" rel="noopener" class="external-link">
Jaguar E-Type Documentary (YouTube)
</a>
<a href="https://www.youtube.com/results?search_query=Jaguar+E-Type+Review" target="_blank" rel="noopener" class="external-link">
Jaguar E-Type Review (YouTube)
</a>
</div>
</div>
<footer>
© Private Classic Car Sale
</footer>
</div>
<!-- Lightbox Modal -->
<div class="lightbox" id="lightbox">
<span class="lightbox-close" id="lightboxClose">&times;</span>
<img id="lightboxImg" src="" alt="Enlarged photo view">
</div>
<script>
const track = document.getElementById('carouselTrack');
const dotsNav = document.getElementById('dotsNav');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const lightbox = document.getElementById('lightbox');
const lightboxImg = document.getElementById('lightboxImg');
const lightboxClose = document.getElementById('lightboxClose');
let currentIndex = 0;
let slides = [];
let dots = [];
// Fetch photos.json from the ROOT directory
async function initGallery() {
try {
const response = await fetch('photos.json');
if (!response.ok) throw new Error('Failed to load photos.json from root');
const photoFiles = await response.json();
if (!Array.isArray(photoFiles) || photoFiles.length === 0) {
track.innerHTML = '<div class="loading-state">No photos listed in photos.json</div>';
return;
}
// Render Slides & Dots dynamically
track.innerHTML = '';
dotsNav.innerHTML = '';
photoFiles.forEach((item, idx) => {
// Extracts filename whether item is a string or an object with a file property
const filename = typeof item === 'string' ? item : (item.file || item.src || item.name);
// Ensures path points into the photos/ subfolder
const photoPath = filename.startsWith('photos/') ? filename : `photos/${filename}`;
const total = photoFiles.length;
const padIdx = String(idx + 1).padStart(2, '0');
const padTotal = String(total).padStart(2, '0');
// Slide element
const slide = document.createElement('div');
slide.className = 'slide';
slide.innerHTML = `
<img
src="${photoPath}"
alt="1973 Jaguar E-Type Roadster Photo ${idx + 1}"
loading="${idx === 0 ? 'eager' : 'lazy'}"
/>
<div class="slide-overlay">
<h3>Jaguar E-Type V12 Roadster</h3>
<span class="slide-counter">${padIdx} / ${padTotal}</span>
</div>
`;
track.appendChild(slide);
// Dot element
const dot = document.createElement('div');
dot.className = `dot ${idx === 0 ? 'active' : ''}`;
dot.dataset.index = idx;
dotsNav.appendChild(dot);
});
slides = Array.from(track.children);
dots = Array.from(dotsNav.children);
attachEventListeners();
} catch (err) {
console.error('Gallery initialization error:', err);
track.innerHTML = '<div class="loading-state">Unable to load photos.json from root</div>';
}
}
function scrollToSlide(index) {
if (!slides.length) return;
if (index < 0) index = slides.length - 1;
if (index >= slides.length) index = 0;
const slideWidth = slides[0].getBoundingClientRect().width;
track.scrollTo({
left: slideWidth * index,
behavior: 'smooth'
});
updateActiveState(index);
currentIndex = index;
}
function updateActiveState(activeIndex) {
dots.forEach((dot, idx) => {
dot.classList.toggle('active', idx === activeIndex);
});
}
function attachEventListeners() {
prevBtn.addEventListener('click', () => scrollToSlide(currentIndex - 1));
nextBtn.addEventListener('click', () => scrollToSlide(currentIndex + 1));
dots.forEach(dot => {
dot.addEventListener('click', (e) => {
const index = parseInt(e.target.dataset.index);
scrollToSlide(index);
});
});
let scrollTimeout;
track.addEventListener('scroll', () => {
clearTimeout(scrollTimeout);
scrollTimeout = setTimeout(() => {
const slideWidth = slides[0].getBoundingClientRect().width;
const newIndex = Math.round(track.scrollLeft / slideWidth);
if (newIndex !== currentIndex) {
currentIndex = newIndex;
updateActiveState(currentIndex);
}
}, 50);
});
// Lightbox click handler
slides.forEach(slide => {
const img = slide.querySelector('img');
if (img) {
img.addEventListener('click', () => {
lightboxImg.src = img.src;
lightbox.classList.add('active');
});
}
});
}
lightboxClose.addEventListener('click', () => lightbox.classList.remove('active'));
lightbox.addEventListener('click', (e) => {
if (e.target === lightbox) lightbox.classList.remove('active');
});
// Run gallery initialization
initGallery();
</script>
</body>
</html>