Загрузка данных
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MotoDrive — Интернет-магазин мотоциклов</title>
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.smooth-transition { transition: all 0.3s ease; }
</style>
</head>
<body class="bg-slate-900 text-slate-100 font-sans antialiased">
<nav class="bg-slate-950 sticky top-0 z-50 border-b border-slate-800 shadow-xl">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-20">
<div class="flex items-center gap-2">
<i class="fa-solid fa-motorcycle text-amber-500 text-3xl"></i>
<span class="text-2xl font-black tracking-wider text-white">MOTO<span class="text-amber-500">DRIVE</span></span>
</div>
<div class="hidden md:flex space-x-8 font-medium">
<a href="#home" class="text-amber-500 hover:text-amber-400 smooth-transition">Главная</a>
<a href="#catalog" class="text-slate-300 hover:text-amber-500 smooth-transition">Каталог</a>
<a href="#about" class="text-slate-300 hover:text-amber-500 smooth-transition">О нас</a>
</div>
<div class="relative">
<button onclick="toggleCart()" class="bg-amber-500 hover:bg-amber-600 text-slate-950 px-5 py-2.5 rounded-full font-bold flex items-center gap-2 smooth-transition shadow-lg shadow-amber-500/20 cursor-pointer">
<i class="fa-solid fa-basket-shopping"></i>
<span>Корзина</span>
<span id="cart-count" class="bg-slate-950 text-amber-500 text-xs px-2 py-0.5 rounded-full ml-1">0</span>
</button>
</div>
</div>
</div>
</nav>
<header id="home" class="relative bg-slate-950 py-24 flex items-center justify-center overflow-hidden">
<div class="absolute inset-0 bg-[url('https://images.unsplash.com/photo-1558981806-ec527fa84c39?auto=format&fit=crop&q=80&w=1920')] bg-cover bg-center opacity-30"></div>
<div class="relative max-w-7xl mx-auto px-4 text-center z-10">
<span class="text-amber-500 font-bold uppercase tracking-widest text-sm bg-amber-500/10 px-4 py-2 rounded-full border border-amber-500/20">Твой идеальный байк уже здесь</span>
<h1 class="text-5xl md:text-7xl font-extrabold text-white mt-6 mb-6 tracking-tight">Почувствуй Свободу и Скорость</h1>
<p class="text-xl text-slate-300 max-w-2xl mx-auto mb-10 leading-relaxed">Лучшие мировые бренды, гарантия качества и полное техническое обслуживание. Выбери свой стиль жизни сегодня.</p>
<a href="#catalog" class="bg-amber-500 hover:bg-amber-600 text-slate-950 px-8 py-4 rounded-xl font-bold text-lg inline-flex items-center gap-3 smooth-transition shadow-lg shadow-amber-500/30">
Перейти в каталог <i class="fa-solid fa-arrow-right"></i>
</a>
</div>
</header>
<main id="catalog" class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
<div class="flex flex-col md:flex-row md:items-end justify-between mb-12 gap-6">
<div>
<h2 class="text-4xl font-bold text-white mb-2">Наш Мотопарк</h2>
<p class="text-slate-400">От городского круиза до трековых рекордов</p>
</div>
<div class="flex flex-wrap gap-2" id="filter-buttons">
<button onclick="filterCategory('all')" class="filter-btn active bg-amber-500 text-slate-950 px-5 py-2 rounded-lg font-semibold smooth-transition cursor-pointer">Все</button>
<button onclick="filterCategory('sport')" class="filter-btn bg-slate-800 hover:bg-slate-700 text-slate-300 px-5 py-2 rounded-lg font-semibold smooth-transition cursor-pointer">Спорт</button>
<button onclick="filterCategory('cruiser')" class="filter-btn bg-slate-800 hover:bg-slate-700 text-slate-300 px-5 py-2 rounded-lg font-semibold smooth-transition cursor-pointer">Круизеры</button>
<button onclick="filterCategory('enduro')" class="filter-btn bg-slate-800 hover:bg-slate-700 text-slate-300 px-5 py-2 rounded-lg font-semibold smooth-transition cursor-pointer">Эндуро</button>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8" id="bike-grid">
</div>
</main>
<div id="cart-sidebar" class="fixed inset-y-0 right-0 w-full max-w-md bg-slate-950 shadow-2xl z-50 transform translate-x-full smooth-transition border-l border-slate-800 flex flex-col">
<div class="p-6 border-b border-slate-800 flex items-center justify-between">
<h3 class="text-xl font-bold text-white flex items-center gap-2">
<i class="fa-solid fa-basket-shopping text-amber-500"></i> Ваша корзина
</h3>
<button onclick="toggleCart()" class="text-slate-400 hover:text-white text-2xl cursor-pointer"><i class="fa-solid fa-xmark"></i></button>
</div>
<div id="cart-items" class="p-6 flex-1 overflow-y-auto space-y-4">
</div>
<div class="p-6 border-t border-slate-800 bg-slate-900/50">
<div class="flex justify-between text-lg font-bold mb-6">
<span>Итого к оплате:</span>
<span id="cart-total" class="text-amber-500">0 ₽</span>
</div>
<button onclick="openCheckout()" id="checkout-btn" class="w-full bg-amber-500 hover:bg-amber-600 disabled:bg-slate-800 disabled:text-slate-500 text-slate-950 py-4 rounded-xl font-bold text-center block smooth-transition cursor-pointer" disabled>
Оформить заказ
</button>
</div>
</div>
<div id="checkout-modal" class="fixed inset-0 bg-black/80 z-50 hidden flex items-center justify-center p-4">
<div class="bg-slate-950 border border-slate-800 rounded-2xl max-w-md w-full p-8 relative">
<button onclick="closeCheckout()" class="absolute top-4 right-4 text-slate-400 hover:text-white text-xl cursor-pointer"><i class="fa-solid fa-xmark"></i></button>
<h3 class="text-2xl font-bold text-white mb-6">Оформление заказа</h3>
<form id="order-form" onsubmit="submitOrder(event)" class="space-y-4">
<div>
<label class="block text-sm font-medium text-slate-400 mb-1">Ваше Имя</label>
<input type="text" required class="w-full bg-slate-900 border border-slate-700 rounded-lg px-4 py-2.5 text-white focus:outline-none focus:border-amber-500">
</div>
<div>
<label class="block text-sm font-medium text-slate-400 mb-1">Телефон</label>
<input type="tel" required placeholder="+7 (___) ___-__-__" class="w-full bg-slate-900 border border-slate-700 rounded-lg px-4 py-2.5 text-white focus:outline-none focus:border-amber-500">
</div>
<div>
<label class="block text-sm font-medium text-slate-400 mb-1">Адрес доставки</label>
<textarea required rows="3" class="w-full bg-slate-900 border border-slate-700 rounded-lg px-4 py-2.5 text-white focus:outline-none focus:border-amber-500"></textarea>
</div>
<button type="submit" class="w-full bg-amber-500 hover:bg-amber-600 text-slate-950 font-bold py-3.5 rounded-lg mt-6 smooth-transition cursor-pointer">
Подтвердить заказ
</button>
</form>
</div>
</div>
<footer id="about" class="bg-slate-950 border-t border-slate-800 py-12 mt-20">
<div class="max-w-7xl mx-auto px-4 text-center text-slate-500 text-sm">
<p class="mb-4">© 2026 MOTO-DRIVE. Учебная практика. Все права защищены.</p>
<p>Разработано в учебных целях.</p>
</div>
</footer>
<script>
// База данных товаров (динамический вывод)
const products = [
{ id: 1, name: 'Kawasaki Ninja ZX-10R', category: 'sport', price: 2450000, img: 'https://images.unsplash.com/photo-1614162692292-7ac56d7f7f1e?auto=format&fit=crop&q=80&w=600', desc: 'Флагманский суперспорт для трека и города.' },
{ id: 2, name: 'Harley-Davidson Fat Boy', category: 'cruiser', price: 3100000, img: 'https://images.unsplash.com/photo-1568772585407-9361f9bf3a87?auto=format&fit=crop&q=80&w=600', desc: 'Икона стиля. Легендарный американский круизер.' },
{ id: 3, name: 'KTM 300 EXC TPI', category: 'enduro', price: 1150000, img: 'https://images.unsplash.com/photo-1599819811279-d5ad9cccf838?auto=format&fit=crop&q=80&w=600', desc: 'Король хард-эндуро. Максимальная проходимость.' },
{ id: 4, name: 'Yamaha YZF-R6', category: 'sport', price: 1850000, img: 'https://images.unsplash.com/photo-1609630875171-b1321377ee65?auto=format&fit=crop&q=80&w=600', desc: 'Бескомпромиссный спортивный байк с идеальной управляемостью.' },
{ id: 5, name: 'Honda Rebel 1100', category: 'cruiser', price: 1400000, img: 'https://images.unsplash.com/photo-1558981403-c5f9899a28bc?auto=format&fit=crop&q=80&w=600', desc: 'Современный боббер для ценителей комфорта и технологий.' },
{ id: 6, name: 'BMW R 1250 GS', category: 'enduro', price: 2700000, img: 'https://images.unsplash.com/photo-1615887023516-9b6bcd559e87?auto=format&fit=crop&q=80&w=600', desc: 'Туристический эндуро для кругосветных путешествий.' }
];
let cart = [];
// Инициализация каталога
function displayProducts(filteredProducts) {
const grid = document.getElementById('bike-grid');
grid.innerHTML = '';
filteredProducts.forEach(product => {
const card = document.createElement('div');
card.className = 'bg-slate-950 border border-slate-800 rounded-2xl overflow-hidden shadow-lg hover:border-slate-700 smooth-transition group';
card.innerHTML = `
<div class="overflow-hidden relative h-56 bg-slate-900">
<img src="${product.img}" alt="${product.name}" class="w-full h-full object-cover group-hover:scale-105 smooth-transition">
<span class="absolute top-4 left-4 bg-slate-950/80 text-amber-500 text-xs font-bold uppercase tracking-wider px-3 py-1 rounded-full backdrop-blur-sm border border-slate-800">
${product.category === 'sport' ? 'Спорт' : product.category === 'cruiser' ? 'Круизер' : 'Эндуро'}
</span>
</div>
<div class="p-6">
<h3 class="text-xl font-bold text-white mb-2">${product.name}</h3>
<p class="text-slate-400 text-sm mb-4 line-clamp-2">${product.desc}</p>
<div class="flex items-center justify-between mt-6">
<span class="text-2xl font-black text-white">${product.price.toLocaleString()} ₽</span>
<button onclick="addToCart(${product.id})" class="bg-amber-500 hover:bg-amber-600 text-slate-950 px-4 py-2.5 rounded-xl font-bold text-sm flex items-center gap-2 smooth-transition cursor-pointer">
<i class="fa-solid fa-cart-plus"></i> В корзину
</button>
</div>
</div>
`;
grid.appendChild(card);
});
}
// Фильтрация категорий
function filterCategory(category) {
// Смена активного класса на кнопках
const buttons = document.querySelectorAll('#filter-buttons button');
buttons.forEach(btn => {
btn.classList.remove('bg-amber-500', 'text-slate-950');
btn.classList.add('bg-slate-800', 'text-slate-300', 'hover:bg-slate-700');
});
event.target.classList.remove('bg-slate-800', 'text-slate-300', 'hover:bg-slate-700');
event.target.classList.add('bg-amber-500', 'text-slate-950');
if (category === 'all') {
displayProducts(products);
} else {
displayProducts(products.filter(p => p.category === category));
}
}
// Управление корзиной
function toggleCart() {
const sidebar = document.getElementById('cart-sidebar');
sidebar.classList.toggle('translate-x-full');
}
function addToCart(id) {
const product = products.find(p => p.id === id);
const cartItem = cart.find(item => item.id === id);
if (cartItem) {
cartItem.quantity++;
} else {
cart.push({ ...product, quantity: 1 });
}
updateCart();
}
function removeFromCart(id) {
cart = cart.filter(item => item.id !== id);
updateCart();
}
function changeQuantity(id, delta) {
const item = cart.find(item => item.id === id);
if (item) {
item.quantity += delta;
if (item.quantity <= 0) {
removeFromCart(id);
return;
}
}
updateCart();
}
function updateCart() {
const cartItemsContainer = document.getElementById('cart-items');
const cartCount = document.getElementById('cart-count');
const cartTotal = document.getElementById('cart-total');
const checkoutBtn = document.getElementById('checkout-btn');
cartItemsContainer.innerHTML = '';
let total = 0;
let count = 0;
cart.forEach(item => {
total += item.price * item.quantity;
count += item.quantity;
const itemElement = document.createElement('div');
itemElement.className = 'flex items-center justify-between bg-slate-900 p-4 rounded-xl border border-slate-800';
itemElement.innerHTML = `
<div class="flex-1 min-w-0 pr-4">
<h4 class="text-white font-bold text-sm truncate">${item.name}</h4>
<p class="text-amber-500 text-xs mt-1">${(item.price * item.quantity).toLocaleString()} ₽</p>
</div>
<div class="flex items-center gap-3">
<div class="flex items-center bg-slate-950 border border-slate-800 rounded-lg">
<button onclick="changeQuantity(${item.id}, -1)" class="px-2 py-1 text-slate-400 hover:text-white text-xs cursor-pointer">-</button>
<span class="px-2 text-sm font-bold text-white">${item.quantity}</span>
<button onclick="changeQuantity(${item.id}, 1)" class="px-2 py-1 text-slate-400 hover:text-white text-xs cursor-pointer">+</button>
</div>
<button onclick="removeFromCart(${item.id})" class="text-slate-500 hover:text-red-400 smooth-transition cursor-pointer">
<i class="fa-solid fa-trash-can"></i>
</button>
</div>
`;
cartItemsContainer.appendChild(itemElement);
});
cartCount.innerText = count;
cartTotal.innerText = total.toLocaleString() + ' ₽';
checkoutBtn.disabled = cart.length === 0;
}
// Оформление заказа
function openCheckout() {
toggleCart();
document.getElementById('checkout-modal').classList.remove('hidden');
}
function closeCheckout() {
document.getElementById('checkout-modal').classList.add('hidden');
}
function submitOrder(event) {
event.preventDefault();
alert('Успешно! Ваш заказ принят в обработку. Спасибо за покупку!');
cart = [];
updateCart();
closeCheckout();
document.getElementById('order-form').reset();
}
// Рендер при загрузке
displayProducts(products);
</script>
</body>
</html>