const PRODUCTS = [ {id: 1, title: "Ылғалдандырғыш бет кремі", category: "face", price: 18900, image: "https://picsum.photos/seed/ffup1/600/600", badge: "Хит", description: "Барлық тері түрлеріне арналған қарқынды ылғалдандыру. Гиалурон қышқылы мен табиғи майлар.", specs: {"Көлемі": "50 мл", "Тері түрі": "Барлығы", "Әсері": "Ылғалдандыру"}}, {id: 2, title: "С C дәрумені сарысуы", category: "face", price: 24500, image: "https://picsum.photos/seed/ffup2/600/600", badge: "Жаңа", description: "Пигментацияны ағартады, тері түсін тегістейді, коллаген өндірісін ынталандырады.", specs: {"Көлемі": "30 мл", "Тері түрі": "Барлығы", "Әсері": "Ағарту"}}, {id: 3, title: "Тазартушы гель", category: "care", price: 12900, image: "https://picsum.photos/seed/ffup3/600/600", description: "Қорғаныс кедергісін бұзбай нәзік тазартады. Күнделікті қолдануға жарамды.", specs: {"Көлемі": "200 мл", "Тері түрі": "Майлы, аралас", "Әсері": "Тазарту"}}, {id: 4, title: "Түнгі қалпына келтіруші крем", category: "face", price: 21900, image: "https://picsum.photos/seed/ffup4/600/600", description: "Ұйқы кезінде жұмыс істейді, теріні қалпына келтіреді және қартаю белгілерін азайтады.", specs: {"Көлемі": "50 мл", "Тері түрі": "Құрғақ, қалыпты", "Әсері": "Қалпына келтіру"}}, {id: 5, title: "Дене сүті", category: "body", price: 16500, image: "https://picsum.photos/seed/ffup5/600/600", description: "Бүкіл денеге нәзік ылғалдандыру. Жабыспай тез сіңеді.", specs: {"Көлемі": "250 мл", "Тері түрі": "Барлығы", "Әсері": "Ылғалдандыру"}}, {id: 6, title: "Дене скрабы", category: "body", price: 14900, image: "https://picsum.photos/seed/ffup6/600/600", description: "Нәзік эксфолиация, теріні жұмсақ әрі тегіс етеді. Тропиктік жеміс хош иісі.", specs: {"Көлемі": "200 мл", "Тері түрі": "Барлығы", "Әсері": "Эксфолиация"}}, {id: 7, title: "Бет тонигі", category: "care", price: 11900, image: "https://picsum.photos/seed/ffup7/600/600", description: "Тазартудан кейін терінің pH-ын теңестіреді, крем жағуға дайындайды.", specs: {"Көлемі": "200 мл", "Тері түрі": "Барлығы", "Әсері": "Тонус"}}, {id: 8, title: "Қол кремі", category: "body", price: 8900, image: "https://picsum.photos/seed/ffup8/600/600", description: "Құрғақ қол терісіне арналған қарқынды қорек. Тез сіңеді.", specs: {"Көлемі": "75 мл", "Тері түрі": "Құрғақ", "Әсері": "Қорек"}}, {id: 9, title: "'Базалық күтім' жиынтығы", category: "sets", price: 45900, image: "https://picsum.photos/seed/ffup9/600/600", badge: "15% үнемдеу", description: "Жиынтықта: тазартушы гель, тоник, ылғалдандырғыш крем. Күнделікті күтімге қажеттінің бәрі.", specs: {"Құрамы": "3 өнім", "Тері түрі": "Барлығы", "Үнемдеу": "15%"}}, {id: 10, title: "Бет маскасы", category: "care", price: 9900, image: "https://picsum.photos/seed/ffup10/600/600", description: "Қарқынды қорек және ылғалдандыру. Аптасына 2-3 рет 15 минут жағу.", specs: {"Көлемі": "75 мл", "Тері түрі": "Барлығы", "Әсері": "Қорек"}}, {id: 11, title: "Көз айналасына крем", category: "face", price: 19900, image: "https://picsum.photos/seed/ffup11/600/600", description: "Қара шеңберлер мен ісінуді азайтады. Нәзік аймаққа арналған формула.", specs: {"Көлемі": "15 мл", "Тері түрі": "Барлығы", "Әсері": "Жасарту"}}, {id: 12, title: "'Тері жылтыры' жиынтығы", category: "sets", price: 52900, image: "https://picsum.photos/seed/ffup12/600/600", badge: "Премиум", description: "Жиынтықта: С дәрумені сарысуы, түнгі крем, маска. Жылтыр реңк үшін.", specs: {"Құрамы": "3 өнім", "Тері түрі": "Барлығы", "Әсері": "Жылтыр"}} ]; const REVIEWS = [ {name: "Алия К.", avatar: "https://picsum.photos/seed/r1/100/100", rating: 5, text: "Ылғалдандырғыш кремді тапсырыс бердім — бірінші қолданудан ғашықпын! Тері жұмсақ, ылғалды болды. Тағы тапсырыс беремін."}, {name: "Мария В.", avatar: "https://picsum.photos/seed/r2/100/100", rating: 5, text: "Formula For You өнімдерін жарты жыл қолданамын. Сапасы жоғары, терім өзгерді. Жеткізу жылдам, қаптама әдемі."}, {name: "Елена С.", avatar: "https://picsum.photos/seed/r3/100/100", rating: 5, text: "С дәрумені сарысуы ғажайып! Пигментация айтарлықтай ағарды. Барлық құрбыларға ұсынамын."}, {name: "Динара Т.", avatar: "https://picsum.photos/seed/r4/100/100", rating: 5, text: "'Базалық күтім' жиынтығын алдым — бәрін бірден сынап көруге тамаша мүмкіндік. Бәрі сәйкес келді, тері риза!"} ]; let cart = JSON.parse(localStorage.getItem('ffu_cart')) || []; let currentFilter = 'all'; let currentSlide = 0; document.addEventListener('DOMContentLoaded', () => { initHeader(); renderCatalog(); renderReviews(); initFilters(); initModals(); initFAQ(); initScrollAnimations(); updateCartCount(); initPhoneValidation(); }); function initHeader() { const header = document.getElementById('header'); const burgerBtn = document.getElementById('burgerBtn'); const nav = document.getElementById('nav'); window.addEventListener('scroll', () => { if (window.scrollY > 50) header.classList.add('scrolled'); else header.classList.remove('scrolled'); }); burgerBtn.addEventListener('click', () => { burgerBtn.classList.toggle('active'); nav.classList.toggle('active'); }); document.querySelectorAll('.nav__link').forEach(link => { link.addEventListener('click', () => { burgerBtn.classList.remove('active'); nav.classList.remove('active'); }); }); document.getElementById('headerOrderBtn').addEventListener('click', () => { document.getElementById('catalog').scrollIntoView({ behavior: 'smooth' }); }); } function renderCatalog(filter = 'all') { const grid = document.getElementById('catalogGrid'); const filtered = filter === 'all' ? PRODUCTS : PRODUCTS.filter(p => p.category === filter); grid.innerHTML = filtered.map(product => `
${product.title} ${product.badge ? `${product.badge}` : ''}
${getCategoryName(product.category)}

${product.title}

${product.description}

`).join(''); } function getCategoryName(cat) { const names = {face: 'Бет', body: 'Дене', care: 'Күтім', sets: 'Жиынтықтар'}; return names[cat] || cat; } function formatPrice(price) { return price.toLocaleString('ru-RU') + ' ₸'; } function initFilters() { document.querySelectorAll('.filter-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); currentFilter = btn.dataset.filter; renderCatalog(currentFilter); }); }); } function openProductModal(id) { const product = PRODUCTS.find(p => p.id === id); if (!product) return; const modalBody = document.getElementById('modalBody'); modalBody.innerHTML = `
${product.title}

${product.title}

${formatPrice(product.price)}

${product.description}

Сипаттамасы

    ${Object.entries(product.specs).map(([key, value]) => `
  • ${key}${value}
  • `).join('')}
1
`; openModal('productModal'); } function changeQuantity(delta) { const el = document.getElementById('modalQuantity'); let val = parseInt(el.textContent) + delta; if (val < 1) val = 1; el.textContent = val; } function addToCartFromModal(id) { const qty = parseInt(document.getElementById('modalQuantity').textContent); addToCart(id, qty); closeModal('productModal'); } function addToCart(id, qty = 1) { const existing = cart.find(item => item.id === id); if (existing) existing.quantity += qty; else { const product = PRODUCTS.find(p => p.id === id); cart.push({...product, quantity: qty}); } saveCart(); updateCartCount(); showNotification('Тауар себетке қосылды', 'success'); } function saveCart() { localStorage.setItem('ffu_cart', JSON.stringify(cart)); } function updateCartCount() { const count = cart.reduce((sum, item) => sum + item.quantity, 0); document.getElementById('cartCount').textContent = count; } function initModals() { document.getElementById('cartBtn').addEventListener('click', openCart); document.getElementById('modalOverlay').addEventListener('click', () => closeModal('productModal')); document.getElementById('modalClose').addEventListener('click', () => closeModal('productModal')); document.getElementById('cartOverlay').addEventListener('click', () => closeModal('cartModal')); document.getElementById('cartModalClose').addEventListener('click', () => closeModal('cartModal')); document.getElementById('checkoutOverlay').addEventListener('click', () => closeModal('checkoutModal')); document.getElementById('checkoutModalClose').addEventListener('click', () => closeModal('checkoutModal')); document.getElementById('successClose').addEventListener('click', () => { closeModal('successModal'); cart = []; saveCart(); updateCartCount(); renderCart(); }); document.getElementById('checkoutBtn').addEventListener('click', openCheckout); document.addEventListener('keydown', (e) => { if (e.key === 'Escape') document.querySelectorAll('.modal.active').forEach(modal => modal.classList.remove('active')); }); } function openModal(id) { document.getElementById(id).classList.add('active'); document.body.style.overflow = 'hidden'; } function closeModal(id) { document.getElementById(id).classList.remove('active'); document.body.style.overflow = ''; } function openCart() { renderCart(); openModal('cartModal'); } function renderCart() { const empty = document.getElementById('cartEmpty'); const content = document.getElementById('cartContent'); const itemsContainer = document.getElementById('cartItems'); if (cart.length === 0) { empty.style.display = 'block'; content.style.display = 'none'; return; } empty.style.display = 'none'; content.style.display = 'block'; itemsContainer.innerHTML = cart.map(item => `
${item.title}

${item.title}

${formatPrice(item.price)} × ${item.quantity}

${item.quantity}
`).join(''); const subtotal = cart.reduce((sum, item) => sum + item.price * item.quantity, 0); document.getElementById('cartTotalCount').textContent = cart.reduce((sum, item) => sum + item.quantity, 0); document.getElementById('cartSubtotal').textContent = formatPrice(subtotal); document.getElementById('cartTotal').textContent = formatPrice(subtotal); } function updateCartQuantity(id, delta) { const item = cart.find(i => i.id === id); if (!item) return; item.quantity += delta; if (item.quantity <= 0) { removeFromCart(id); return; } saveCart(); updateCartCount(); renderCart(); } function removeFromCart(id) { cart = cart.filter(item => item.id !== id); saveCart(); updateCartCount(); renderCart(); showNotification('Тауар себеттен жойылды', 'success'); } function openCheckout() { const subtotal = cart.reduce((sum, item) => sum + item.price * item.quantity, 0); document.getElementById('checkoutTotal').textContent = formatPrice(subtotal); closeModal('cartModal'); openModal('checkoutModal'); } function initPhoneValidation() { const phoneInput = document.getElementById('checkoutPhone'); phoneInput.addEventListener('input', (e) => { let value = e.target.value.replace(/\D/g, ''); if (value.length > 11) value = value.slice(0, 11); if (value.length > 0 && (value[0] === '7' || value[0] === '8')) value = value.slice(1); let formatted = '+7'; if (value.length > 0) formatted += ' (' + value.slice(0, 3); if (value.length >= 3) formatted += ') ' + value.slice(3, 6); if (value.length >= 6) formatted += '-' + value.slice(6, 8); if (value.length >= 8) formatted += '-' + value.slice(8, 10); e.target.value = formatted; }); } document.getElementById('checkoutForm').addEventListener('submit', (e) => { e.preventDefault(); const formData = { name: document.getElementById('checkoutName').value, phone: document.getElementById('checkoutPhone').value, city: document.getElementById('checkoutCity').value, address: document.getElementById('checkoutAddress').value, comment: document.getElementById('checkoutComment').value, items: [...cart], total: cart.reduce((sum, item) => sum + item.price * item.quantity, 0) }; const message = `Сәлем! Тапсырыс: ${formData.name}\nТелефон: ${formData.phone}\nҚала: ${formData.city}\nМекенжай: ${formData.address}\nСомма: ${formatPrice(formData.total)}`; window.open('https://wa.me/77771234567?text=' + encodeURIComponent(message)); closeModal('checkoutModal'); openModal('successModal'); document.getElementById('checkoutForm').reset(); }); function initFAQ() { document.querySelectorAll('.faq-item__header').forEach(header => { header.addEventListener('click', () => { const expanded = header.getAttribute('aria-expanded') === 'true'; document.querySelectorAll('.faq-item__header').forEach(h => h.setAttribute('aria-expanded', 'false')); document.querySelectorAll('.faq-item__content').forEach(content => content.style.maxHeight = null); if (!expanded) { header.setAttribute('aria-expanded', 'true'); const content = header.nextElementSibling; content.style.maxHeight = content.scrollHeight + 'px'; } }); }); } function initScrollAnimations() { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) entry.target.classList.add('in'); }); }, { threshold: 0.1 }); document.querySelectorAll('.reveal').forEach(el => observer.observe(el)); } function renderReviews() { const track = document.getElementById('reviewsTrack'); track.innerHTML = REVIEWS.map(review => `
${review.name}

${review.name}

${'★'.repeat(review.rating)}${'☆'.repeat(5 - review.rating)}

"${review.text}"

`).join(''); updateReviewsSlider(); document.getElementById('reviewsPrev').addEventListener('click', () => { currentSlide = Math.max(0, currentSlide - 1); updateReviewsSlider(); }); document.getElementById('reviewsNext').addEventListener('click', () => { const maxSlide = Math.max(0, Math.ceil(REVIEWS.length / getVisibleReviews()) - 1); currentSlide = Math.min(maxSlide, currentSlide + 1); updateReviewsSlider(); }); } function getVisibleReviews() { if (window.innerWidth <= 768) return 1; if (window.innerWidth <= 1024) return 2; return 3; } function updateReviewsSlider() { const track = document.getElementById('reviewsTrack'); const cardWidth = track.querySelector('.review-card')?.offsetWidth || 0; const gap = 30; track.style.transform = `translateX(-${currentSlide * (cardWidth + gap)}px)`; } function showNotification(message, type = 'success') { const notification = document.getElementById('notification'); notification.textContent = message; notification.className = 'notification show ' + type; setTimeout(() => notification.classList.remove('show'), 3000); } window.openProductModal = openProductModal; window.changeQuantity = changeQuantity; window.addToCartFromModal = addToCartFromModal; window.addToCart = addToCart; window.updateCartQuantity = updateCartQuantity; window.removeFromCart = removeFromCart;