Загрузка данных


// --- Логика для myModal-img ---
    const openBtnImg = document.getElementById('openModalBtn-img');
    const closeBtnImg = document.getElementById('closeModalBtn-img');
    const modalImg = document.getElementById('myModal-img');
    
    // Безопасная проверка существования элементов перед добавлением событий
    if (openBtnImg && modalImg) {
        openBtnImg.addEventListener('click', () => {
            modalImg.classList.add('open');
        });
    }
    if (closeBtnImg && modalImg) {
        closeBtnImg.addEventListener('click', () => {
            modalImg.classList.remove('open');
        });
    }
    if (modalImg) {
        modalImg.addEventListener('click', (event) => {
            // Исправлено: закрываем, если клик был именно по фону модалки, а не по body
            if (event.target === modalImg) {
                modalImg.classList.remove('open');
            }
        });
    }

    // --- Логика для myModal-more ---
    const openBtnMore = document.getElementById('openModalBtn-more');
    const closeBtnMore = document.getElementById('closeModalBtn-more');
    const modalMore = document.getElementById('myModal-more');

    if (openBtnMore && modalMore) {
        openBtnMore.addEventListener('click', () => {
            modalMore.classList.add('open');
        });
    }
    if (closeBtnMore && modalMore) {
        closeBtnMore.addEventListener('click', () => {
            modalMore.classList.remove('open');
        });
    }
    if (modalMore) {
        modalMore.addEventListener('click', (event) => {
            if (event.target === modalMore) {
                modalMore.classList.remove('open');
            }
        });
    }





const updateCarousel = (animate = true) => {
      // 1. Устанавливаем transition
      track.style.transition = animate ? "transform 0.6s cubic-bezier(0.22, 1, 0.36, 1)" : "none";
      
      const slideWidth = slides[0].offsetWidth;
      const gap = parseInt(window.getComputedStyle(track).gap) || 0;
      const viewportWidth = track.parentElement.offsetWidth;
      
      const centerOffset = (viewportWidth - slideWidth) / 2;
      const position = -(currentIndex * (slideWidth + gap)) + centerOffset;
      
      // 2. Двигаем трек
      track.style.transform = `translateX(${position}px)`;

      // 3. ПРИНУДИТЕЛЬНЫЙ REFLOW: Если мы прыгаем без анимации (клоны),
      // заставляем браузер применить изменения прямо сейчас, чтобы избежать рывков
      if (!animate) {
          track.offsetHeight; 
      }
      
      slides.forEach((s, i) => s.classList.toggle("active", i === currentIndex));
    };

    const moveSlide = (direction) => {
      if (isTransitioning) return;
      isTransitioning = true;
      currentIndex += direction;
      updateCarousel(true); // Явно указываем true для обычного скролла
    };

    // ... события кнопок и transitionend оставляете как есть ...

    window.addEventListener("resize", () => updateCarousel(false));
    
    // Инициализация только после полной загрузки всех картинок
    window.addEventListener("load", () => {
        updateCarousel(false);
    });