index.pug 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. .imageslider.relative.overflow-hidden.rounded-xl.shadow-lg(class='max-w-6xl mx-auto')
  2. //- Контейнер слайдов
  3. .slides-container.relative.h-96.flex.transition-transform.duration-500.ease-in-out( class="md:h-112"
  4. :style='{ transform: `translateX(-${currentIndex * 100}%)` }'
  5. @touchstart='handleTouchStart'
  6. @touchmove='handleTouchMove'
  7. @touchend='handleTouchEnd'
  8. )
  9. .slide.flex-shrink-0.w-full.h-full.relative(
  10. v-for='(slide, index) in slides'
  11. :key='index'
  12. )
  13. img.w-full.h-full.object-cover(:src='slide.image' :alt='slide.title || "Изображение слайда"')
  14. .slide-content.absolute.inset-0.flex.items-end
  15. .content-wrapper.w-full.p-8.bg-gradient-to-t.from-black.to-transparent.text-white(class="via-black/70")
  16. h3.text-2xl.font-bold.mb-2(v-if='slide.title' class="md:text-3xl") {{ slide.title }}
  17. p.text-lg.mb-4.opacity-90(v-if='slide.description' class="md:text-xl") {{ slide.description }}
  18. button.bg-accent.text-white.px-6.py-2.rounded-lg.transition-colors( class="hover:bg-yellow-600"
  19. v-if='slide.cta'
  20. @click='$emit("slide-click", slide)'
  21. ) {{ slide.cta }}
  22. //- Кнопки навигации
  23. button.nav-btn.absolute.left-4.text-gray-800.p-3.rounded-full.shadow-lg.transition-all(
  24. @click='prevSlide'
  25. class='hover:scale-110 top-1/2 transform -translate-y-1/2 dark:text-white bg-white/80 dark:bg-gray-800/80 hover:bg-white dark:hover:bg-gray-700'
  26. aria-label='Предыдущий слайд'
  27. )
  28. svg.w-5.h-5(fill='none' stroke='currentColor' viewBox='0 0 24 24')
  29. path(stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M15 19l-7-7 7-7')
  30. button.nav-btn.absolute.right-4.text-gray-800.p-3.rounded-full.shadow-lg.transition-all(
  31. @click='nextSlide'
  32. class='hover:scale-110 top-1/2 transform -translate-y-1/2 bg-white/80 dark:bg-gray-800/80 dark:text-white hover:bg-white dark:hover:bg-gray-700'
  33. aria-label='Следующий слайд'
  34. )
  35. svg.w-5.h-5(fill='none' stroke='currentColor' viewBox='0 0 24 24')
  36. path(stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5l7 7-7 7')
  37. //- Индикаторы
  38. .indicators.absolute.bottom-4.transform.flex.space-x-2(class="left-1/2")
  39. .indicator.w-3.h-3.rounded-full.border.border-white.cursor-pointer.transition-all(
  40. v-for='(slide, index) in slides'
  41. :key='index'
  42. :class='"-translate-x-1/2"+currentIndex === index ? "bg-white scale-110" : "bg-white/50"'
  43. @click='goToSlide(index)'
  44. :aria-label='`Перейти к слайду ${index + 1}`'
  45. )
  46. //- Прогресс-бар автопрокрутки
  47. .progress-bar.absolute.top-0.left-0.w-full.h-1(v-if='autoplay' class="bg-white/30")
  48. .progress-fill.h-full.bg-accent.transition-all.duration-1000(:style='{ width: `${progress}%` }')