particlesJS('particles-js', { particles: { number: { value: 80, density: { enable: true, value_area: 800 } }, color: { value: "#0071e3" }, shape: { type: "circle" }, opacity: { value: 0.3, random: true }, size: { value: 3, random: true }, line_linked: { enable: true, distance: 150, color: "#0071e3", opacity: 0.1, width: 1 }, move: { enable: true, speed: 2, direction: "none", random: true, straight: false, out_mode: "out", bounce: false } }, interactivity: { detect_on: "canvas", events: { onhover: { enable: true, mode: "repulse" }, onclick: { enable: true, mode: "push" }, resize: true } } }); // Управление модальным окном const modal = document.getElementById('universitiesModal'); const showModalBtn = document.getElementById('showModalBtn'); const closeModalBtn = document.getElementById('closeModalBtn'); // Открытие модального окна showModalBtn.addEventListener('click', function(e) { e.preventDefault(); document.body.style.overflow = 'hidden'; modal.style.display = 'block'; // Активируем анимацию после отображения setTimeout(() => { modal.classList.add('active'); }, 10); }); // Закрытие модального окна function closeModal() { modal.classList.remove('active'); setTimeout(() => { modal.style.display = 'none'; document.body.style.overflow = 'auto'; }, 300); } closeModalBtn.addEventListener('click', closeModal); // Закрытие при клике вне модального окна modal.addEventListener('click', function(e) { if (e.target === modal) { closeModal(); } }); // Закрытие при нажатии Escape document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && modal.style.display === 'block') { closeModal(); } }); // Дополнительный JavaScript для интерактивности document.addEventListener('DOMContentLoaded', function() { // Эффект параллакса для плавающих элементов const floatingElements = document.querySelectorAll('.floating-element'); window.addEventListener('mousemove', function(e) { const mouseX = e.clientX / window.innerWidth; const mouseY = e.clientY / window.innerHeight; floatingElements.forEach((el, index) => { const speed = 0.5 + (index * 0.2); const x = (mouseX - 0.5) * 50 * speed; const y = (mouseY - 0.5) * 50 * speed; el.style.transform = `translate(${x}px, ${y}px)`; }); }); // Плавный скролл для всех ссылок document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); // Анимация появления элементов при скролле const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.style.opacity = '1'; entry.target.style.transform = 'translateY(0)'; } }); }, observerOptions); // Наблюдаем за карточками document.querySelectorAll('.btn-container, .info-section, .qa-card, .university-card').forEach(el => { el.style.opacity = '0'; el.style.transform = 'translateY(20px)'; el.style.transition = 'opacity 0.5s ease, transform 0.5s ease'; observer.observe(el); }); // Аккордеон для факультетов const accordionHeaders = document.querySelectorAll('.accordion-header'); accordionHeaders.forEach(header => { header.addEventListener('click', function() { const item = this.parentElement; const content = this.nextElementSibling; // Закрываем все открытые элементы document.querySelectorAll('.accordion-content.active').forEach(activeContent => { if (activeContent !== content) { activeContent.classList.remove('active'); activeContent.previousElementSibling.classList.remove('active'); } }); // Переключаем текущий элемент this.classList.toggle('active'); content.classList.toggle('active'); // Если элемент закрывается, сбрасываем высоту if (!content.classList.contains('active')) { content.style.maxHeight = null; } else { content.style.maxHeight = content.scrollHeight + 'px'; } }); }); // Инициализация аккордеона - открываем первый элемент в каждой карточке document.querySelectorAll('.university-card').forEach(card => { const firstAccordion = card.querySelector('.accordion-item'); if (firstAccordion) { const header = firstAccordion.querySelector('.accordion-header'); const content = firstAccordion.querySelector('.accordion-content'); header.classList.add('active'); content.classList.add('active'); content.style.maxHeight = content.scrollHeight + 'px'; } }); }); document.addEventListener('DOMContentLoaded', function () { // ====== 2-я модалка (тест) ====== const testModal = document.getElementById('careerTestModal'); const openBtn = document.getElementById('showCareerTestBtn'); const closeBtn = document.getElementById('closeCareerTestBtn'); function openTest(e){ e.preventDefault(); document.body.style.overflow = 'hidden'; testModal.style.display = 'block'; setTimeout(() => testModal.classList.add('active'), 10); } function closeTest(){ testModal.classList.remove('active'); setTimeout(() => { testModal.style.display = 'none'; document.body.style.overflow = 'auto'; }, 300); } if (openBtn) openBtn.addEventListener('click', openTest); if (closeBtn) closeBtn.addEventListener('click', closeTest); if (testModal) testModal.addEventListener('click', (e) => { if (e.target === testModal) closeTest(); }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && testModal && testModal.style.display === 'block') closeTest(); }); // ====== Логика теста ====== const form = document.getElementById('careerTestForm'); if (!form) return; const steps = Array.from(form.querySelectorAll('.career-step')); const prevBtn = document.getElementById('careerTestPrevBtn'); const nextBtn = document.getElementById('careerTestNextBtn'); const submitBtn = document.getElementById('careerTestSubmitBtn'); const fill = document.getElementById('careerTestProgressFill'); const stepLabel = document.getElementById('careerTestStepLabel'); const resultBox = document.getElementById('careerTestResult'); const resultTitle = document.getElementById('careerTestResultTitle'); const resultBadges = document.getElementById('careerTestResultBadges'); const resultText = document.getElementById('careerTestResultText'); let idx = 0; const typeTitles = { R: '🔧 ПРАКТИК', I: '🔬 ИССЛЕДОВАТЕЛЬ', A: '🎨 ТВОРЕЦ', S: '👥 СОЦИАЛ', E: '💼 ЛИДЕР', C: '📊 ОРГАНИЗАТОР' }; // Наборы ЕГЭ под 73 балла для каждого профиля const egeSets = { R: { title: 'Техника/производство/агро/транспорт', ege: [ '📐 Рус + Профмат + Физика (технические специальности)', '🌾 Рус + Биология + Химия (агрономия/ветеринария)', '🚗 Рус + Профмат + Информатика (автотранспорт)' ], desc: 'Инженерия, строительство, транспорт, агрономия, техника.' }, I: { title: 'IT/инженерия/наука/анализ', ege: [ '💻 Рус + Профмат + Информатика (IT/программирование)', '🔬 Рус + Профмат + Физика (инженерия/физика)', '📊 Рус + Профмат + Химия (технологии/материаловедение)' ], desc: 'Программирование, инженерия, физика, математика, исследования.' }, A: { title: 'Дизайн/медиа/креатив', ege: [ '🎨 Рус + Обществознание + Литература (журналистика/дизайн)', '📱 Рус + Профмат + Информатика (веб-дизайн/UI/UX)', '📸 Рус + История + Иностранный (медиа/реклама)' ], desc: 'Дизайн, журналистика, реклама, медиа, творческие индустрии.' }, S: { title: 'Помощь людям/педагогика/медицина', ege: [ '👩‍⚕️ Рус + Биология + Химия (медицина/биология)', '👨‍🏫 Рус + Обществознание + История (педагогика/психология)', '🧠 Рус + Обществознание + Биология (социология/социальная работа)' ], desc: 'Медицина, педагогика, психология, социальная работа.' }, E: { title: 'Управление/бизнес/право', ege: [ '⚖️ Рус + Обществознание + История (юриспруденция/госуправление)', '💼 Рус + Обществознание + Профмат (экономика/менеджмент)', '📈 Рус + Обществознание + Иностранный (международные отношения)' ], desc: 'Юриспруденция, экономика, менеджмент, государственное управление.' }, C: { title: 'Учёт/логистика/документы', ege: [ '📋 Рус + Обществознание + Профмат (бухучёт/логистика)', '📊 Рус + Профмат + Информатика (экономика/финансы)', '🏢 Рус + Обществознание + История (администрирование)' ], desc: 'Бухгалтерия, логистика, документооборот, администрирование.' } }; function isAnswered(){ return !!steps[idx].querySelector('input[type="radio"]:checked'); } function render(){ steps.forEach((s, i) => s.classList.toggle('active', i === idx)); const pct = ((idx + 1) / steps.length) * 100; fill.style.width = pct + '%'; stepLabel.textContent = `Шаг ${idx + 1} из ${steps.length}`; prevBtn.disabled = idx === 0; if (idx === steps.length - 1) { nextBtn.style.display = 'none'; submitBtn.style.display = 'inline-block'; } else { nextBtn.style.display = 'inline-block'; submitBtn.style.display = 'none'; } } nextBtn.addEventListener('click', () => { if (!isAnswered()) return alert('Выбери вариант ответа'); idx = Math.min(idx + 1, steps.length - 1); render(); }); prevBtn.addEventListener('click', () => { idx = Math.max(idx - 1, 0); render(); }); form.addEventListener('submit', (e) => { e.preventDefault(); if (!isAnswered()) return alert('Ответь на последний вопрос'); // Собери все ответы q1-q24 const answers = {}; for (let i = 1; i <= 24; i++) { const v = form.elements[`q${i}`]?.value; if (v) answers[`q${i}`] = v; } // Получи ClientID из Метрики let ym_client_id = null; const COUNTER_ID = 105827527; if (typeof ym !== 'undefined') { ym(COUNTER_ID, 'getClientID', (cid) => { ym_client_id = cid; submitTest(); }); } else { submitTest(); } function submitTest() { // Отправь на бэкенд fetch('career-test/submit/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ answers, ym_client_id }) }) .then(r => { if (!r.ok) throw new Error(`HTTP ${r.status}`); return r.json(); }) .then(data => { // Результаты с сервера const profile = data.profile; const profileDisplay = data.profile_display; const top3 = data.top3_profiles; const ege = data.recommended_ege_sets; // Показать результат на странице resultTitle.textContent = `Профиль: ${profileDisplay}`; resultBadges.innerHTML = top3.map(t => `${t}`).join(''); resultText.innerHTML = `

${ege.title}

${ege.desc}

🎯 Рекомендуемые наборы ЕГЭ (73 балла):

${ege.ege.map(set => `
${set}
`).join('')}

Совет: Выбирай 1-й набор (основной профиль) + 1 запасной из топ-3.

`; resultBox.style.display = 'block'; document.querySelector('#careerTestModal .career-test-actions').style.display = 'none'; steps.forEach(s => s.style.display = 'none'); // ✅ ОТПРАВЬ СОБЫТИЕ В МЕТРИКУ if (typeof ym !== 'undefined') { ym(105827527, 'reachGoal', 'career_test_completed', { profile: profile, profile_name: profileDisplay, ege_main: ege.ege[0] || null }); } console.log('✅ Результат сохранён. ID:', data.id); }) .catch(err => { console.error('❌ Ошибка:', err); alert('Ошибка при отправке результата: ' + err.message); }); } }); document.addEventListener('DOMContentLoaded', () => { const startBtn = document.getElementById('showCareerTestBtn'); if (!startBtn) return; startBtn.addEventListener('click', () => { if (typeof ym !== 'undefined') { ym(COUNTER_ID, 'reachGoal', 'career_test_start'); } }); }); render(); });