import Swiper from 'swiper'
import createGallery from './gallery'
import {$id, $class, $query, $queryAll, easeInOutQuad, hexToRgb} from './utils'
import {startLoading, endLoading} from './loader'
# BEM slider classes
sliderClasses =
containerModifierClass: 'slider_'
slideClass: 'slider__slide'
slideActiveClass: 'slider__slide_active'
slidePrevClass: 'slider__slide_position_prev'
slideNextClass: 'slider__slide_position_next'
slideVisibleClass: 'slider__slide_visible'
slideDuplicateClass: 'slider__slide-duplicate'
slideDuplicateActiveClass: 'slider__slide-duplicate_active'
slideDuplicatePrevClass: 'slider__slide-duplicate_position_prev'
slideDuplicatNextClass: 'slider__slide-duplicate_position_next'
wrapperClass: 'slider__wrapper'
disallowSlider = (slider1, slider2, buttons) ->
if (do slider1.isVertical and slider1.activeIndex is 1) or (do slider1.isHorizontal and slider1.activeIndex is Math.floor slider1.slides.length / 2)
slider2.allowSlidePrev = true
slider2.allowSlideNext = true
for button in buttons
button.classList.remove 'slider__button_disalllow'
else
slider2.allowSlidePrev = false
slider2.allowSlideNext = false
for button in buttons
button.classList.add 'slider__button_disalllow'
handleClick = (e) ->
# If clicked on link and not just anywhere in the slider
if e.target.classList.contains 'frame_page'
# Hide everything
document.body.classList.add 'body_hidden'
# Current gradient (also initial value to start chaning)
gradChange = gradFrom =
# Inner color
start: hexToRgb document.body.dataset.start
# Outer color
end: hexToRgb document.body.dataset.end
# Target gradient
gradTo =
start: hexToRgb e.target.dataset.start
end: hexToRgb e.target.dataset.end
# Start changing gradient
for pos in ['start', 'end']
for c in ['r', 'g', 'b']
do (pos, c) ->
start = gradFrom[pos][c]
change = gradTo[pos][c] - start
currentTime = 0
increment = 10
duration = 1000
animateScroll = ->
currentTime += increment
# val = easeInOutQuad currentTime, start, change, duration
gradChange[pos][c] = Math.floor easeInOutQuad currentTime, start, change, duration
document.body.style.backgroundImage = "radial-gradient(ellipse at center, rgb(#{gradChange.start.r}, #{gradChange.start.g}, #{gradChange.start.b}) 0%, rgb(#{gradChange.end.r}, #{gradChange.end.g}, #{gradChange.end.b}) 100%)"
if currentTime < duration
setTimeout animateScroll, increment
else
location.href = e.target.href
return
do animateScroll
export createSliders = ->
dragIcon = $id('drag')
hor = $queryAll '.slider_type_horizontal > .slider__wrapper > .slider__slide'
# Create horizontal slider
horizontalSlider = new Swiper '.slider_type_horizontal', Object.assign
direction: 'horizontal'
initialSlide: Math.floor hor.length / 2
simulateTouch: false
speed: 1000
preventInteractionOnTransition: true
allowSlidePrev: false
allowSlideNext: false
keyboard: true
navigation:
prevEl: '.slider__button_direction_left'
nextEl: '.slider__button_direction_right'
disabledClass: 'slider__button_disabled'
on:
slideChangeTransitionStart: ->
if verticalSlider
# Don't allow to go up and down if its not in the center slider
disallowSlider this, verticalSlider, $class 'slider__button_type_vertical'
return
slideChangeTransitionEnd: ->
# If its changed to the right slide and it hasnt done so before
if gallery = $id('gallery')
if @activeIndex is 2 and not gallery.classList.contains 'gallery_initiated'
createGallery
horizontalSlider: @
gallerySlider: gallerySlider
return
,
sliderClasses
# Create vertical slider
fakeSlider = new Swiper '.slider_type_fake', Object.assign
direction: 'vertical'
speed: 1000
,
sliderClasses
# Create vertical slider
verticalSlider = new Swiper '.slider_type_vertical', Object.assign
direction: 'vertical'
simulateTouch: false
speed: 1000
preventInteractionOnTransition: true
mousewheel: true
keyboard: true
navigation:
prevEl: '.slider__button_direction_up'
nextEl: '.slider__button_direction_down'
disabledClass: 'slider__button_disabled'
on:
slideChangeTransitionStart: ->
# Don't allow to go up and down if its not in the bottom slider
disallowSlider this, horizontalSlider, $class 'slider__button_type_horizontal'
if fakeSlider.el
fakeSlider.slideTo @activeIndex
,
sliderClasses
# Create menu slider
if menuButton = $query '.menu__button'
menuHamburger = $query '.menu__hamburger'
menuSlider = new Swiper '.slider_type_menu', Object.assign
allowTouchMove: false
simulateTouch: false
initialSlide: 1
resistanceRatio: 0
speed: 300
slideToClickedSlide: true
slidesPerView: 'auto'
on:
slideChangeTransitionStart: ->
slider = this
if slider.activeIndex is 0
menuHamburger.classList.add 'hamburger_open'
# required because of slideToClickedSlide
menuButton.removeEventListener 'click', openMenu, true
else
menuHamburger.classList.add 'hamburger_close'
menuHamburger.classList.remove 'hamburger_open'
setTimeout ->
menuHamburger.classList.remove 'hamburger_close'
return
, 400
return
slideChangeTransitionEnd: ->
if @activeIndex is 1
menuButton.addEventListener 'click', openMenu, true
return
,
sliderClasses
openMenu = (e) ->
do menuSlider.slidePrev
closeMenu = (e) ->
do menuSlider.slideNext
menuButton.addEventListener 'click', openMenu, true
menuSlider.slides[1].addEventListener 'click', closeMenu, true
#Create vertical lists
verticalLists = new Swiper '.slider_type_vertical-list', Object.assign
direction: 'vertical'
freeMode: true
grabCursor: true
speed: 1000
spaceBetween: 50
# freeModeSticky: true
freeModeMomentumBounceRatio: 3
slidesPerView: 'auto'
mousewheel: true
keyboard: true
on:
click: handleClick
,
sliderClasses
#Create horizontal lists
horizontalLists = new Swiper '.slider_type_horizontal-list', Object.assign
direction: 'horizontal'
freeMode: true
grabCursor: true
speed: 1000
spaceBetween: 125
# freeModeSticky: true
freeModeMomentumBounceRatio: 3
slidesPerView: 'auto'
mousewheel: true
keyboard: true
on:
click: handleClick
sliderMove: ->
dragIcon.classList.add 'drag_hidden' if dragIcon
,
sliderClasses
#Create gallery modal slider
gallerySlider = new Swiper '.slider_type_gallery', Object.assign
direction: 'horizontal'
speed: 1000
loop: true
keyboard: true
navigation:
prevEl: '.slider__button_direction_left'
nextEl: '.slider__button_direction_right'
disabledClass: 'slider__button_disabled'
on:
slideChangeTransitionEnd: (self, ext = false) ->
if $id('gallery').classList.contains 'gallery_initiated'
# use "self" instead of "this" if called externally
unless ext
self = @
slide = self.slides[self.activeIndex]
spinner = slide.querySelector '.loader__spinner'
# Start spinning loader
startLoading spinner
slide.classList.add 'modal__item_loaded'
img = slide.querySelector 'img'
do (spinner) ->
img.onload = ->
# Stop spinning loader
endLoading spinner
# Show image
@classList.remove 'modal__image_loading'
return
return
img.src = "/public/images/galleries/#{slide.dataset.src}"
return
,
sliderClasses
sliders = {
horizontalSlider
verticalSlider
fakeSlider
menuSlider
verticalLists
horizontalLists
gallerySlider
}
# Update slide sizes
window.addEventListener 'resize', ->
for name, slider of sliders
if Array.isArray slider
for cur in slider
if cur.el
do cur.update
else
if slider and slider.el
do slider.update
# Return all sliders to be used in other functions
sliders