{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/scripts/base/util.js","webpack:///./src/scripts/base/TaskRunner.js","webpack:///./src/scripts/tasks/others.js","webpack:///./src/scripts/base/LiveEvent.js","webpack:///./src/scripts/components/FloatMenu.js","webpack:///./src/scripts/tasks/header.js","webpack:///./src/scripts/data/swiper.js","webpack:///./src/scripts/tasks/swiper.js","webpack:///./src/scripts/tasks/customFocus.js","webpack:///./src/scripts/components/Popup.js","webpack:///./src/scripts/base/jqWrap.js","webpack:///./src/scripts/tasks/popups.js","webpack:///./src/scripts/components/Tabs.js","webpack:///./src/scripts/tasks/tabs.js","webpack:///./src/scripts/components/FileInput.js","webpack:///./src/scripts/data/maskers.js","webpack:///./src/scripts/components/FieldMasker.js","webpack:///./src/scripts/data/validators.js","webpack:///./src/scripts/components/FieldValidation.js","webpack:///./src/scripts/tasks/forms.js","webpack:///./src/scripts/data/animItems.js","webpack:///./src/scripts/components/viewportWatcher.js","webpack:///./src/scripts/tasks/scrollAnimations.js","webpack:///./src/scripts/tasks/body.js","webpack:///./src/scripts/app.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","scrollTop","bodyFixable","bodyScrollEnabled","scrollDisableElem","document","documentElement","isTouch","prefixes","split","window","DocumentTouch","query","matchMedia","matches","mq","join","isSafari","test","navigator","userAgent","refreshCustomVH","vh","innerHeight","style","setProperty","wh","clientHeight","bodyDisableScroll","classList","add","top","bodyEnableScroll","remove","tasks","isInit","console","warn","forEach","task","setTimeout","e","logError","error","message","errmess","createElement","innerText","body","appendChild","taskFunc","includes","push","addEventListener","documentWidth","parseInt","clientWidth","innerWidth","callbacks","LiveEvent","event","selector","callback","String","selectors","strselectors","mainHandler","length","log","selInd","indexOf","splice","removeEventListener","type","targ","target","closest","ind","defaults","offset","hide","FloatMenu","elem","options","this","opts","assign","lastPos","tick","st","scrollY","delta","isBreakpoint","show","reset","toggle","contains","header","getElementById","on","toggleExpand","preventDefault","heroSlider","pagination","effect","loop","lazy","preloadImages","projectsSlider","navigation","slidesPerView","watchOverflow","partnersSlider","projectsSliderAlt","breakpoints","1200","slidesPerColumn","slidesPerColumnFill","slidesPerGroup","spaceBetween","el","clickable","nextEl","prevEl","wrapSlider","settings","sliderIdentifier","getAttribute","undefined","settObj","swiperCont","swiperWrap","children","slide","append","replace","navigationPrev","setAttribute","navigationNext","querySelectorAll","lazyElem","after","preloader","getPreloaderTemplate","thumbs","thumbSlider","querySelector","swiper","autoplaySpeed","Number","autoplay","delay","slider","Swiper","linkWith","linkedSlider","params","slideTo","realIndex","slides","caption","previousElementSibling","button","sld","index","currentTarget","has","animationDelay","onReset","field","onBlur","onFocus","inputField","closePos","scrollBackground","closeToEscape","currPopup","popup","contentElement","content","root","contentElem","templ","container","overlay","closeBtn","id","removeAttribute","getPopupTemplate","scrollHeight","iframe","src","video","pause","popupSelector","popupElem","$this","each","v","inst","varName","ClassName","apply","slice","$","fn","modal","Popup","initAll","Tabs","rootElement","nav","navItem","expandTab","tab","tabs","currActiveNav","currActiveTab","FileInput","label","parentNode","captions","multiple","empty","fname","files","pop","ruPhone","filter","val","numonly","pattern","cardNumber","NUMBER_PLACEHOLDER_REGEX","ALT_CARET_REGEX","maskType","fieldMasker","mask","focusInHandler","focusOutHandler","newVal","filteredVal","filterNum","phReg","placeholder","strval","toString","padEnd","substring","maskedVal","newCaret","getCaretNumIndex","selectionStart","selectionEnd","prevCaret","caretPos","altCaret","match","ruTel","password","number","numberDec","url","date","validator","fieldValidator","validators","ee","validate","once","defaultError","flag","errfld","validity","inp","form","unlockTarg","allFields","allValid","checkValidity","disabled","targets","delayBase","anim","delayStep","rootMargin","threshold","observer","observeCallback","entries","obs","entry","isIntersecting","dispatchEvent","Event","isObserverSupporting","IntersectionObserverEntry","watch","element","IntersectionObserver","observe","onViewportHandler","unobserve","item","itm","watchingTarget","subtarg","subtargSelector","subtargElement","run"],"mappings":"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","file":"app.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/**\r\n * Различные утилиты, геттеры и т.д.\r\n */\r\n\r\nlet scrollTop = 0;\r\nlet bodyFixable = false;\r\nlet bodyScrollEnabled = true;\r\n\r\nlet scrollDisableElem = document.documentElement;\r\n\r\nexport const isTouch = () => {\r\n var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\r\n var mq = function (query) {\r\n return window.matchMedia(query).matches;\r\n };\r\n\r\n if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\r\n return true;\r\n }\r\n\r\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\r\n // https://git.io/vznFH\r\n var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\r\n return mq(query);\r\n};\r\n\r\nexport const isIe = () => {\r\n return navigator.userAgent.match(/Trident\\/7.0/i);\r\n};\r\n\r\nexport const isSafari = () => {\r\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n};\r\n\r\nexport const refreshCustomVH = () => {\r\n let vh = window.innerHeight * 0.01;\r\n document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n};\r\n\r\nexport const getScrollbarWidth = () => {\r\n let documentWidth = parseInt(document.documentElement.clientWidth),\r\n windowsWidth = parseInt(window.innerWidth);\r\n\r\n return windowsWidth - documentWidth;\r\n};\r\n\r\nexport const ww = () => {\r\n return window.innerWidth || document.documentElement.clientWidth;\r\n};\r\n\r\nexport const wh = () => {\r\n return window.innerHeight || document.documentElement.clientHeight;\r\n};\r\n\r\nexport const isBodyScrollEnabled = () => {\r\n return bodyScrollEnabled;\r\n};\r\n\r\nexport const isBodyFixable = () => {\r\n return bodyFixable;\r\n};\r\n\r\nexport const bodyDisableScroll = () => {\r\n scrollTop = scrollDisableElem.scrollTop;\r\n scrollDisableElem.classList.add('scroll-disabled');\r\n\r\n if (bodyFixable) scrollDisableElem.style.top = (-scrollTop) + 'px';\r\n\r\n bodyScrollEnabled = false;\r\n};\r\n\r\nexport const bodyEnableScroll = () => {\r\n scrollDisableElem.classList.remove('scroll-disabled');\r\n\r\n if (bodyFixable) {\r\n scrollDisableElem.style.top = '';\r\n scrollDisableElem.scrollTop = scrollTop;\r\n }\r\n\r\n bodyScrollEnabled = true;\r\n};\r\n\r\nexport const rootElem = () => {\r\n return scrollDisableElem;\r\n};\r\n\r\nbodyFixable = isTouch() && isSafari();","/**\r\n * Таск раннер\r\n */\r\nimport { isTouch } from './util';\r\n\r\nlet tasks = [];\r\nlet isInit = false;\r\n\r\nexport default class TaskRunner {\r\n static run() {\r\n if (isInit) {\r\n console.warn('Tasks already run!');\r\n return;\r\n }\r\n\r\n tasks.forEach(task => {\r\n setTimeout(() => {\r\n try{\r\n task.call();\r\n }catch(e){\r\n TaskRunner.logError(e);\r\n }\r\n }, 0);\r\n });\r\n\r\n isInit = true;\r\n tasks = null;\r\n }\r\n\r\n static logError(error) {\r\n let message = `Error: ${error.name}\\nMessage: ${error.message}`;\r\n\r\n if (isTouch()) {\r\n var errmess = document.createElement('span');\r\n errmess.classList.add('debug-message');\r\n errmess.innerText = message;\r\n document.body.appendChild(errmess);\r\n }\r\n\r\n console.error(message);\r\n }\r\n\r\n static add(taskFunc) {\r\n if (typeof taskFunc !== 'function') {\r\n console.warn('Wrong task type!');\r\n return;\r\n } else if (tasks.includes(taskFunc)) {\r\n console.warn('That task is already exist!');\r\n return;\r\n } else if (isInit) {\r\n taskFunc.call();\r\n return;\r\n }\r\n\r\n tasks.push(taskFunc);\r\n }\r\n}","import * as util from '../base/util';\r\nimport TaskRunner from '../base/TaskRunner';\r\n\r\nTaskRunner.add(() => {\r\n // Кастомный vh\r\n util.refreshCustomVH();\r\n\r\n window.addEventListener('resize', () => {\r\n util.refreshCustomVH();\r\n });\r\n\r\n document.documentElement.style.setProperty('--scrollbarWidth', util.getScrollbarWidth() + 'px');\r\n});","/**\r\n * Данный класс является альтернативой $(document).on('event', 'selector', callback);\r\n */\r\n\r\n/**\r\n * Структура этого объекта такая: callbacks: {\r\n * click: {\r\n * selectors: [],\r\n * callbacks: [],\r\n * strselectors: ''\r\n * }\r\n * }\r\n */\r\nlet callbacks = {};\r\n\r\nexport default class LiveEvent {\r\n static on(event, selector, callback) {\r\n event = String(event);\r\n selector = String(selector);\r\n\r\n if (typeof callback !== 'function') {\r\n console.log('Third arfument must be the function!');\r\n return;\r\n }\r\n\r\n if (typeof callbacks[event] === 'undefined') {\r\n callbacks[event] = {\r\n selectors: [],\r\n callbacks: [],\r\n strselectors: ''\r\n };\r\n\r\n document.addEventListener(event, LiveEvent.mainHandler);\r\n }\r\n\r\n callbacks[event].selectors.push(selector);\r\n callbacks[event].callbacks.push(callback);\r\n callbacks[event].strselectors += (callbacks[event].strselectors.length > 0) ? ',' + selector : selector;\r\n\r\n return LiveEvent;\r\n }\r\n\r\n static off(event, selector) {\r\n if (typeof callbacks[event] !== 'undefined') {\r\n let selInd = callbacks[event].selectors.indexOf(selector);\r\n\r\n if(selInd >= 0){\r\n callbacks[event].selectors.splice(selInd, 1);\r\n callbacks[event].callbacks.splice(selInd, 1);\r\n callbacks[event].strselectors = callbacks[event].selectors.join(',');\r\n }\r\n\r\n if(callbacks[event].selectors.length === 0){\r\n delete callbacks[event];\r\n document.removeEventListener(event, LiveEvent.mainHandler);\r\n }\r\n }\r\n\r\n return LiveEvent;\r\n }\r\n\r\n static mainHandler(e) {\r\n if (typeof callbacks[e.type] !== 'undefined') {\r\n let targ = e.target.closest(callbacks[e.type].strselectors);\r\n\r\n if(targ !== null){\r\n for(let ind in callbacks[e.type].selectors){\r\n if(targ.matches(callbacks[e.type].selectors[ind])){\r\n callbacks[e.type].callbacks[ind].call(targ, e, targ);\r\n }\r\n }\r\n }\r\n } else {\r\n document.removeEventListener(e.type, LiveEvent.mainHandler);\r\n }\r\n }\r\n}","/**\r\n * Модуль плавающего меню (любого)\r\n */\r\n\r\nconst defaults = {\r\n offset: 0, // Отступ от верха экрана до верха элемента, когда отменяется фиксация\r\n hide: true // Скрывать ли элемент при прокрутке вниз и показывать при прокрутке вверх\r\n};\r\n\r\nexport default class FloatMenu {\r\n constructor(elem, options = defaults) {\r\n this.elem = elem;\r\n this.opts = Object.assign({}, defaults, options);\r\n this.lastPos = 0;\r\n\r\n this.tick();\r\n\r\n window.addEventListener('scroll', (e) => {\r\n this.tick();\r\n });\r\n }\r\n\r\n tick() {\r\n let st = window.scrollY;\r\n let delta = this.lastPos - st;\r\n\r\n if(delta === 0) return;\r\n\r\n let offset = this.elem.clientHeight + this.options.offset;\r\n let isBreakpoint = this.lastPos <= offset;\r\n\r\n if (st > offset) {\r\n this.elem.classList.add('fix');\r\n\r\n if (this.options.hide && !isBreakpoint) {\r\n if (delta <= 0) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n } else if (st == 0) {\r\n this.reset();\r\n }\r\n\r\n this.lastPos = st;\r\n }\r\n\r\n toggleExpand(){\r\n this.elem.classList.toggle('expanded');\r\n\r\n return this.elem.classList.contains('expanded');\r\n }\r\n\r\n show(){\r\n this.elem.classList.remove('hide');\r\n this.elem.classList.add('show');\r\n }\r\n\r\n hide(){\r\n this.elem.classList.remove('show');\r\n this.elem.classList.add('hide');\r\n }\r\n\r\n reset(){\r\n this.elem.classList.remove('fix', 'show', 'hide');\r\n }\r\n\r\n get options() {\r\n return this.opts;\r\n }\r\n\r\n get element() {\r\n return this.elem;\r\n }\r\n\r\n static get defaults() {\r\n return defaults;\r\n }\r\n}","import * as util from '../base/util';\r\nimport TaskRunner from '../base/TaskRunner';\r\nimport LiveEvent from '../base/LiveEvent';\r\n\r\nimport FloatMenu from '../components/FloatMenu';\r\n\r\nTaskRunner.add(() => {\r\n let header = new FloatMenu(document.getElementById('pageHeader'));\r\n\r\n LiveEvent.on('click', '#menuBurger', (e) => {\r\n var has = header.toggleExpand();\r\n\r\n if (has) {\r\n util.bodyDisableScroll();\r\n } else {\r\n util.bodyEnableScroll();\r\n\r\n if(util.isBodyFixable()) header.show();\r\n }\r\n\r\n e.preventDefault();\r\n });\r\n});","export default {\r\n heroSlider: {\r\n pagination: 'default',\r\n effect: 'fade',\r\n loop: true,\r\n lazy: true,\r\n preloadImages: false\r\n },\r\n projectsSlider: {\r\n navigation: 'default',\r\n slidesPerView: 'auto',\r\n watchOverflow: true\r\n },\r\n partnersSlider: {\r\n pagination: 'default',\r\n lazy: true\r\n },\r\n projectsSliderAlt: {\r\n pagination: 'default',\r\n slidesPerView: 'auto',\r\n watchOverflow: true,\r\n // effect: 'fade',\r\n breakpoints: {\r\n 1200: {\r\n slidesPerView: 3,\r\n slidesPerColumn: 2,\r\n slidesPerColumnFill: 'row',\r\n slidesPerGroup: 3,\r\n spaceBetween: '40px'\r\n }\r\n }\r\n },\r\n};","import TaskRunner from '../base/TaskRunner';\r\nimport sliders from '../data/swiper';\r\n\r\nconst defaults = {\r\n pagination: {\r\n el: '.swiper-pagination',\r\n clickable: true\r\n },\r\n navigation: {\r\n nextEl: '.swiper-button-next',\r\n prevEl: '.swiper-button-prev',\r\n }\r\n};\r\n\r\nconst getPreloaderTemplate = () => {\r\n let preloader = document.createElement('div');\r\n preloader.classList.add('swiper-lazy-preloader'/* , 'swiper-lazy-preloader-white' */);\r\n return preloader;\r\n};\r\n\r\n\r\n/**\r\n * Обёртка для слайдеров.\r\n * @param {DOM Object} elem Объект, который нужно обернуть и проинициализировать.\r\n */\r\nexport const wrapSlider = (elem, settings = undefined) => {\r\n let sliderIdentifier = elem.getAttribute('data-swiper');\r\n settings = settings || sliders[sliderIdentifier];\r\n\r\n if (typeof settings === 'object') {\r\n settings.el = undefined;\r\n let settObj = Object.assign({}, settings);\r\n\r\n elem.classList.add('swiper-root');\r\n\r\n let swiperCont = document.createElement('div');\r\n swiperCont.classList.add('swiper-container');\r\n let swiperWrap = document.createElement('div');\r\n swiperWrap.classList.add('swiper-wrapper');\r\n\r\n while (elem.children.length > 0) {\r\n let slide = elem.children[0];\r\n slide.classList.add('swiper-slide');\r\n swiperWrap.append(slide);\r\n }\r\n\r\n swiperCont.append(swiperWrap);\r\n elem.append(swiperCont);\r\n\r\n if (settObj.pagination === 'default') {\r\n // Отрисуем пагинацию, а шо делать\r\n settObj.pagination = Object.assign({}, defaults.pagination);\r\n\r\n let pagination = document.createElement('div');\r\n pagination.classList.add(settObj.pagination.el.replace(/\\./g, ''));\r\n\r\n elem.append(pagination);\r\n\r\n settObj.pagination.el = pagination;\r\n }\r\n\r\n if (settObj.navigation === 'default') {\r\n // Отрисуем навигацию, а шо делать\r\n settObj.navigation = Object.assign({}, defaults.navigation);\r\n\r\n let navigationPrev = document.createElement('button');\r\n navigationPrev.setAttribute('type', 'button');\r\n navigationPrev.classList.add(settObj.navigation.prevEl.replace(/\\./g, ''));\r\n\r\n let navigationNext = document.createElement('button');\r\n navigationNext.setAttribute('type', 'button');\r\n navigationNext.classList.add(settObj.navigation.nextEl.replace(/\\./g, ''));\r\n\r\n elem.append(navigationPrev, navigationNext);\r\n\r\n settObj.navigation.prevEl = navigationPrev;\r\n settObj.navigation.nextEl = navigationNext;\r\n }\r\n\r\n if (settObj.lazy) {\r\n // Если у нас врублен лезилодинг\r\n swiperWrap.querySelectorAll('[data-src],[data-background]').forEach(lazyElem => {\r\n lazyElem.classList.add('swiper-lazy');\r\n lazyElem.after(getPreloaderTemplate());\r\n });\r\n }\r\n\r\n if (settObj.thumbs != undefined) {\r\n // Инициализируем слайдер с тумбами\r\n let thumbSlider = wrapSlider(document.querySelector(settObj.thumbs.swiper.el), settObj.thumbs.swiper);\r\n\r\n if (thumbSlider !== null) {\r\n settObj.thumbs.swiper = thumbSlider;\r\n } else {\r\n settObj.thumbs = undefined;\r\n }\r\n }\r\n\r\n let autoplaySpeed = Number(elem.getAttribute('data-autoplay-speed'));\r\n if (autoplaySpeed > 0){\r\n settObj.autoplay = {\r\n delay: autoplaySpeed\r\n };\r\n }\r\n\r\n // Пришло время инициализировать слайдер\r\n let slider = new Swiper(swiperCont, settObj);\r\n\r\n if (settObj.linkWith) {\r\n // Связываем слайдеры\r\n slider.on('slideChange', function () {\r\n try {\r\n let linkedSlider = document.querySelector(`${slider.params.linkWith} .swiper-container`).swiper;\r\n\r\n if (linkedSlider != undefined) {\r\n linkedSlider.slideTo(slider.realIndex);\r\n }\r\n } catch (e) {\r\n console.warn(e.message);\r\n }\r\n });\r\n }\r\n\r\n return slider;\r\n } else {\r\n console.warn('slider with id ' + sliderIdentifier + ' is not found');\r\n }\r\n\r\n return null;\r\n};\r\n\r\nexport const initSliders = () => {\r\n let foundSliders = document.querySelectorAll('[data-swiper]:not(.swiper-root)');\r\n\r\n foundSliders.forEach(slider => {\r\n wrapSlider(slider);\r\n });\r\n};\r\n\r\nTaskRunner.add(() => {\r\n if (typeof Swiper === 'undefined') return;\r\n\r\n initSliders();\r\n\r\n document.querySelectorAll('[data-button-caption]').forEach(elem => {\r\n try {\r\n let slides = elem.querySelectorAll('.swiper-slide');\r\n\r\n if (slides.length > 3) {\r\n let caption = elem.getAttribute('data-button-caption').split('/');\r\n let header = elem.previousElementSibling;\r\n let button = document.createElement('button');\r\n button.type = 'button';\r\n button.setAttribute('data-caption-expand', caption[0]);\r\n button.setAttribute('data-caption-collapse', caption[1]);\r\n header.appendChild(button);\r\n\r\n slides.forEach((sld, index) => {\r\n if (index > 2) {\r\n sld.classList.add('hidden');\r\n }\r\n });\r\n\r\n button.addEventListener('click', (e) => {\r\n e.currentTarget.classList.toggle('collapse')\r\n let has = e.currentTarget.classList.contains('collapse');\r\n\r\n slides.forEach((sld, index) => {\r\n if (index > 2) {\r\n if (has) {\r\n sld.classList.remove('hidden');\r\n sld.classList.add('animate__animated','animate__fadeIn');\r\n sld.style.animationDelay = (index - 3)*0.1 + 's';\r\n } else {\r\n sld.classList.add('hidden');\r\n sld.classList.remove('animate__animated','animate__fadeIn');\r\n }\r\n\r\n }\r\n });\r\n });\r\n }\r\n } catch (e) {\r\n console.warn(e.message);\r\n }\r\n });\r\n});","import TaskRunner from '../base/TaskRunner';\r\nimport LiveEvent from '../base/LiveEvent';\r\n\r\nconst onReset = (e) => {\r\n e.target.querySelectorAll('input.focused, textarea.focused').forEach(field => {\r\n field.classList.remove('focused');\r\n field.setAttribute('value', '');\r\n });\r\n};\r\n\r\nconst onBlur = (e) => {\r\n if (e.target.value.length === 0) {\r\n e.target.classList.remove('focused');\r\n }\r\n};\r\n\r\nconst onFocus = (e) => {\r\n e.target.classList.add('focused');\r\n};\r\n\r\nTaskRunner.add(() => {\r\n let inputs = document.querySelectorAll('input, textarea');\r\n\r\n inputs.forEach(inputField => {\r\n if (inputField.value.length > 0) {\r\n inputField.classList.add('focused');\r\n }\r\n });\r\n\r\n LiveEvent\r\n .on('reset', 'form', onReset)\r\n .on('focusout', 'input, textarea', onBlur)\r\n .on('focusin', 'input, textarea', onFocus);\r\n});","/**\r\n * Модуль попапов\r\n * Доступные методы: .show(), .hide()\r\n */\r\n\r\nimport { bodyDisableScroll, bodyEnableScroll, wh } from '../base/util';\r\nimport LiveEvent from '../base/LiveEvent';\r\n\r\nconst POSITION_INNER = 'inner';\r\nconst POSITION_OUTER = 'outer';\r\n\r\nconst IFRAME_SELECTOR = 'iframe[src*=\"youtube\"]';\r\n\r\nconst defaults = {\r\n closePos: POSITION_INNER, // Позиция кнопки закрытия. Может быть внутри или снаружи самого окна\r\n scrollBackground: false, // Флаг прокрутки контента за модалкой\r\n};\r\n\r\nconst closeToEscape = (e) => {\r\n if (e.key === \"Escape\") {\r\n let currPopup = document.querySelector('.popup-root.popup-initialized.popup-visible');\r\n\r\n if(currPopup && currPopup.popup) currPopup.popup.hide();\r\n\r\n e.preventDefault();\r\n }\r\n};\r\n\r\nconst getPopupTemplate = (closePos, contentElem) => {\r\n let templ = document.createElement('div');\r\n templ.classList.add('popup-root', 'popup-initialized');\r\n let container = document.createElement('div');\r\n container.classList.add('popup-container');\r\n let overlay = document.createElement('div');\r\n overlay.classList.add('popup-overlay', 'popup-close');\r\n\r\n let closeBtn = document.createElement('button');\r\n closeBtn.classList.add('popup-cross', 'popup-close');\r\n closeBtn.setAttribute('type', 'button');\r\n\r\n templ.appendChild(container);\r\n container.appendChild(overlay);\r\n\r\n switch (closePos) {\r\n case POSITION_INNER:\r\n contentElem.appendChild(closeBtn);\r\n break;\r\n case POSITION_OUTER:\r\n container.appendChild(closeBtn);\r\n break;\r\n default:\r\n console.warn('Wrong closePos value!');\r\n return null;\r\n }\r\n\r\n let id = contentElem.id;\r\n contentElem.removeAttribute('id');\r\n templ.setAttribute('id', id);\r\n\r\n container.appendChild(contentElem);\r\n\r\n return templ;\r\n};\r\n\r\nexport default class Popup {\r\n constructor(contentElement, options = defaults) {\r\n this.opts = Object.assign({}, defaults, options);\r\n this.content = contentElement;\r\n\r\n this.root = getPopupTemplate(this.opts.closePos, this.content);\r\n this.root.popup = this;\r\n\r\n // this.container = this.root.children[0];\r\n\r\n document.body.appendChild(this.root);\r\n }\r\n\r\n show() {\r\n this.root.classList.add('popup-visible');\r\n\r\n let cancelScroll =\r\n !this.opts.scrollBackground ||\r\n wh() < this.root.scrollHeight;\r\n\r\n // Если высота окна меньше чем высота модалки то запрещаем скроллить html (модалка скроллится)\r\n if (cancelScroll) {\r\n bodyDisableScroll();\r\n\r\n if(wh() >= this.root.scrollHeight){\r\n this.root.classList.add('popup-non-scrollable');\r\n }\r\n }\r\n\r\n // Поставим слушатель эскейпа\r\n document.addEventListener('keydown', closeToEscape);\r\n }\r\n\r\n hide() {\r\n var iframe = this.content.querySelector(IFRAME_SELECTOR);\r\n\r\n if(iframe){\r\n var src = iframe.src;\r\n iframe.src = '';\r\n iframe.src = src;\r\n }\r\n\r\n var video = this.content.querySelector('video');\r\n\r\n if(video){\r\n video.pause();\r\n }\r\n\r\n // Скрываем модалку\r\n this.root.classList.remove('popup-visible', 'popup-non-scrollable');\r\n\r\n // Возвращаем возможность скроллинга html\r\n bodyEnableScroll();\r\n\r\n document.removeEventListener('keydown', closeToEscape);\r\n }\r\n\r\n get options() {\r\n return this.opts;\r\n }\r\n\r\n get POSITION_INNER() {\r\n return POSITION_INNER;\r\n }\r\n\r\n get POSITION_OUTER() {\r\n return POSITION_OUTER;\r\n }\r\n\r\n static initAll(options = defaults) {\r\n LiveEvent.on('click', '[data-popup]', (e, targ) => {\r\n let popupSelector = targ.getAttribute('data-popup');\r\n let popupElem = document.querySelector(popupSelector);\r\n\r\n if(popupElem){\r\n let popup;\r\n\r\n if(!popupElem.classList.contains('popup-initialized')){\r\n popup = new Popup(popupElem, options);\r\n }else if(popupElem.popup){\r\n popup = popupElem.popup;\r\n }else{\r\n console.warn('Popup element has not popup attribute!');\r\n return;\r\n }\r\n\r\n popup.show();\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n LiveEvent.on('click', '.popup-close', e => {\r\n let popup = e.target.closest('.popup-root');\r\n\r\n if(popup && popup.popup){\r\n popup.popup.hide();\r\n e.preventDefault();\r\n }\r\n });\r\n }\r\n\r\n static getObject(selector){\r\n let elem = document.querySelector(selector);\r\n\r\n if(elem){\r\n return typeof elem.popup !== 'undefined' ? elem.popup: new Popup(elem);\r\n }\r\n\r\n return null;\r\n }\r\n}","export default ($this, ClassName, varName, params) => {\r\n $this.each((i, v) => {\r\n let inst;\r\n\r\n if (\r\n params == undefined ||\r\n params.length === 0 ||\r\n typeof params[0] === 'object' ||\r\n typeof v[varName] === 'undefined'\r\n ) {\r\n inst = new ClassName(v, params != undefined ? params[0] : {});\r\n } else if (v[varName] != undefined) {\r\n inst = v[varName];\r\n }/*else{\r\n return $this;\r\n }*/\r\n\r\n if (\r\n inst != undefined &&\r\n params != undefined &&\r\n typeof params[0] == 'string' &&\r\n inst[params[0]] != undefined &&\r\n typeof inst[params[0]] == \"function\"\r\n ) {\r\n inst[params[0]].apply(inst, params.slice(1));\r\n }\r\n });\r\n\r\n return $this;\r\n};","import Popup from '../components/Popup.js';\r\nimport $wrap from '../base/jqWrap';\r\nimport TaskRunner from '../base/TaskRunner';\r\n\r\nTaskRunner.add(() => {\r\n if (typeof $ !== 'undefined')\r\n $.fn.modal = function (...params) {\r\n return $wrap(this, Popup, 'popup', params);\r\n };\r\n \r\n window.Popup = Popup;\r\n\r\n Popup.initAll();\r\n});","/**\r\n * Модуль табов\r\n */\r\n\r\nconst defaults = {\r\n\r\n};\r\n\r\nexport default class Tabs {\r\n constructor(rootElement, options = defaults) {\r\n this.opts = Object.assign({}, defaults, options);\r\n\r\n this.root = rootElement;\r\n this.root.classList.add('tabs-root', 'tabs-initialized');\r\n\r\n this.nav = this.root.querySelector('.tabs-nav');\r\n this.container = this.root.querySelector('.tabs-container');\r\n\r\n for(let i = 0, navItem; navItem = this.nav.children[i]; i++){\r\n navItem.classList.add('tabs-nav-item');\r\n\r\n if(i == 0){\r\n navItem.classList.add('tabs-active');\r\n }\r\n\r\n navItem.addEventListener('click', (e) => {\r\n this.expandTab(i);\r\n });\r\n }\r\n\r\n for(let i = 0, tab; tab = this.container.children[i]; i++){\r\n tab.classList.add('tabs-tab');\r\n\r\n if(i == 0){\r\n tab.classList.add('tabs-active');\r\n }\r\n }\r\n\r\n this.root.tabs = this;\r\n }\r\n\r\n expandTab(ind) {\r\n try {\r\n let currActiveNav = this.nav.querySelector('.tabs-active');\r\n\r\n if(currActiveNav){\r\n currActiveNav.classList.remove('tabs-active');\r\n }\r\n \r\n this.nav.children[ind].classList.add('tabs-active');\r\n\r\n let currActiveTab = this.container.querySelector('.tabs-active');\r\n\r\n if(currActiveTab){\r\n currActiveTab.classList.remove('tabs-active');\r\n }\r\n \r\n this.container.children[ind].classList.add('tabs-active');\r\n } catch (e) {\r\n console.error(e.message);\r\n }\r\n }\r\n}","import Tabs from '../components/Tabs';\r\nimport $wrap from '../base/jqWrap';\r\nimport TaskRunner from '../base/TaskRunner';\r\n\r\nTaskRunner.add(() => {\r\n if (typeof $ !== 'undefined') {\r\n $.fn.tabs = function (...params) {\r\n return $wrap(this, Tabs, 'tabs', params);\r\n };\r\n }\r\n\r\n window.Tabs = Tabs;\r\n\r\n document.querySelectorAll('.tabs').forEach(tabs => {\r\n new Tabs(tabs);\r\n });\r\n});","/**\r\n * Компонент для \"оживления\" кастомных инпутов для файлов.\r\n * \r\n \r\n */\r\n\r\nconst LABEL_SELECTOR = '.input-container__label';\r\n\r\nexport default class FileInput{\r\n constructor(elem){\r\n this.elem = elem;\r\n this.label = elem.parentNode.querySelector(LABEL_SELECTOR);\r\n this.captions = {\r\n multiple: this.elem.getAttribute('data-caption') || '',\r\n empty: this.elem.getAttribute('data-empty') || ''\r\n };\r\n\r\n if(this.label == undefined){\r\n console.warn('Label is empty! Please create the label!');\r\n return;\r\n }\r\n\r\n this.elem.addEventListener('change', (e) => {\r\n let fname = '';\r\n\r\n if(e.target.files && e.target.files.length > 1){\r\n fname = this.captions.multiple.replace('{count}', e.target.files.length);\r\n }else{\r\n fname = e.target.value.split('\\\\').pop();\r\n }\r\n\r\n if(fname && fname.length > 0){\r\n this.label.innerText = fname;\r\n }else{\r\n this.label.innerText = this.captions.empty;\r\n }\r\n });\r\n }\r\n}","export default {\r\n ruPhone: {\r\n filter: (val) => {\r\n let numonly = val.replace(/\\D/g, '') || '7';\r\n\r\n if (/7|8/.test(numonly[0])) numonly = numonly.slice(1, numonly.length);\r\n\r\n return numonly;\r\n },\r\n pattern: '+7 (___) ___-__-__'\r\n },\r\n cardNumber: {\r\n pattern: '____ ____ ____ ____'\r\n }\r\n};","/**\r\n * Маскировальщик полей ввода для форм\r\n */\r\n\r\nimport MASK_TYPES from '../data/maskers';\r\n\r\nconst NUMBER_PLACEHOLDER = '_';\r\nconst NUMBER_PLACEHOLDER_REGEX = /_/;\r\n\r\nconst ALT_CARET_REGEX = /\\d?\\D*$/;\r\n\r\nexport default class FieldMasker {\r\n constructor(elem, maskType) {\r\n if (typeof MASK_TYPES[maskType] === 'undefined') {\r\n console.warn(`Wrong mask type (${maskType})!`);\r\n return;\r\n }\r\n\r\n this.elem = elem;\r\n this.elem.fieldMasker = this;\r\n this.mask = MASK_TYPES[maskType];\r\n\r\n elem.addEventListener('focus', FieldMasker.focusInHandler);\r\n elem.addEventListener('blur', FieldMasker.focusOutHandler);\r\n elem.addEventListener('input', FieldMasker.mask);\r\n }\r\n\r\n get maskedVal() {\r\n let newVal = this.mask.pattern;\r\n let filteredVal = typeof this.mask.filter !== 'undefined' ? this.mask.filter(this.elem.value) : FieldMasker.filterNum(this.elem.value);\r\n let phReg = typeof this.mask.placeholder !== 'undefined' ? this.mask.placeholder : NUMBER_PLACEHOLDER_REGEX;\r\n\r\n for (let i = 0; i < filteredVal.length; i++) {\r\n newVal = newVal.replace(phReg, filteredVal[i]);\r\n }\r\n\r\n return newVal;\r\n }\r\n\r\n static get MASK_TYPES() {\r\n return MASK_TYPES;\r\n }\r\n\r\n static focusInHandler(e) {\r\n if (e.target.value === '') {\r\n e.target.value = e.target.fieldMasker.mask.pattern;\r\n }\r\n }\r\n\r\n static focusOutHandler(e) {\r\n if (e.target.value === e.target.fieldMasker.mask.pattern) {\r\n e.target.value = '';\r\n }\r\n }\r\n\r\n static fillPlaceholder(val, length, placeholder) {\r\n let strval = val.toString();\r\n\r\n if (strval.length < length) {\r\n return strval.padEnd(length, placeholder[0]);\r\n } else if (strval.length > length) {\r\n return strval.substring(0, length);\r\n }\r\n\r\n return val;\r\n }\r\n\r\n static mask(e) {\r\n let fm = e.target.fieldMasker;\r\n let newVal = fm.maskedVal;\r\n let newCaret = FieldMasker.getCaretNumIndex(e.target, newVal);\r\n\r\n e.target.value = newVal;\r\n e.target.selectionStart = newCaret[0];\r\n e.target.selectionEnd = newCaret[1];\r\n }\r\n\r\n static filterNum(val) {\r\n return val.replace(/\\D/g, '');\r\n }\r\n\r\n static getCaretNumIndex(targ, newVal) {\r\n let prevCaret = targ.selectionStart || targ.value.length;\r\n\r\n let caretPos = newVal.indexOf(NUMBER_PLACEHOLDER);\r\n let altCaret = newVal.match(ALT_CARET_REGEX);\r\n let newCaret;\r\n\r\n if (caretPos > 0) {\r\n newCaret = [altCaret.index + 1, altCaret.index + 1];\r\n } else if (prevCaret < targ.value.length) {\r\n while (prevCaret < targ.value.length && !/\\d/.test(targ.value[prevCaret])) {\r\n prevCaret++;\r\n }\r\n\r\n newCaret = [prevCaret, prevCaret + 1];\r\n }else{\r\n newCaret = [0,0];\r\n }\r\n\r\n return newCaret;\r\n }\r\n}","export default {\r\n ruTel: '^(\\\\+7|7|8)?[\\\\s\\\\-]?\\\\(?[489][0-9]{2}\\\\)?[\\\\s\\\\-]?[0-9]{3}[\\\\s\\\\-]?[0-9]{2}[\\\\s\\\\-]?[0-9]{2}$',\r\n password: '^(?=.*\\\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\\\s).*$',\r\n number: '[-+]?[0-9]',\r\n numberDec: '[-+]?[0-9]*[.,]?[0-9]+',\r\n url: '^(?:(?:https?|HTTPS?|ftp|FTP):\\\\/\\\\/)(?:\\\\S+(?::\\\\S*)?@)?(?:(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*)(?::\\\\d{2,})?(?:[\\\\/?#]\\\\S*)?$',\r\n date: '(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))',\r\n \r\n};","/**\r\n * Компонент валидации полей форм\r\n */\r\n\r\nimport validators from '../data/validators';\r\n\r\nexport default class FieldValidation {\r\n constructor(elem, validator) {\r\n this.elem = elem;\r\n this.elem.fieldValidator = this;\r\n\r\n if (typeof validators[validator] !== 'undefined') {\r\n this.validator = validators[validator];\r\n this.elem.setAttribute('pattern', this.validator);\r\n }\r\n\r\n this.elem.addEventListener('focus', (e) => {\r\n this.elem.classList.add('validation-touched');\r\n\r\n this.elem.addEventListener('blur', (ee) => {\r\n this.validate();\r\n });\r\n }, { once: true });\r\n }\r\n\r\n validate(){\r\n let defaultError;\r\n let flag = false;\r\n\r\n this.elem.parentNode.querySelectorAll('.input-container__error').forEach(errfld => {\r\n let validity = errfld.getAttribute('data-validity');\r\n\r\n if(validity){\r\n if(this.elem.validity[validity]){\r\n flag = true;\r\n errfld.classList.add('validation-visible');\r\n return;\r\n }\r\n }else{\r\n defaultError = errfld;\r\n }\r\n\r\n errfld.classList.remove('validation-visible');\r\n });\r\n\r\n if(!flag && defaultError){\r\n defaultError.classList.add('validation-visible');\r\n }\r\n }\r\n}","import TaskRunner from '../base/TaskRunner';\r\nimport FileInput from '../components/FileInput';\r\nimport FieldMasker from '../components/FieldMasker';\r\nimport FieldValidation from '../components/FieldValidation';\r\n\r\nTaskRunner.add(() => {\r\n document.querySelectorAll('input').forEach(inp => {\r\n switch(inp.type){\r\n case 'file':\r\n new FileInput(inp);\r\n break;\r\n case 'tel':\r\n new FieldMasker(inp, 'ruPhone');\r\n break;\r\n }\r\n\r\n let validator = inp.getAttribute('data-validation');\r\n\r\n if(validator != null){\r\n new FieldValidation(inp, validator);\r\n }\r\n });\r\n\r\n document.querySelectorAll('[data-validation-unlock]').forEach(form => {\r\n let unlockTarg = document.getElementById(form.getAttribute('data-validation-unlock'));\r\n\r\n form.addEventListener('input', (e) => {\r\n let allFields = form.querySelectorAll('input,textfield');\r\n let allValid = true;\r\n\r\n for(let inp of allFields){\r\n if(!inp.checkValidity()){\r\n allValid = false;\r\n break;\r\n }\r\n }\r\n\r\n unlockTarg.disabled = !allValid;\r\n });\r\n });\r\n});","const animItems = [\r\n // Главная\r\n // {\r\n // selector: '.main-services .block-default__header',\r\n // targets: [\r\n // 'header h2',\r\n // {\r\n // selector: 'header p',\r\n // delayBase: 0.2,\r\n // // anim: 'animate__fadeInLeft'\r\n // // delayStep: .1\r\n // }\r\n // ],\r\n // once: true\r\n // },\r\n {\r\n selector: '.main-about .wrapper',\r\n targets: [\r\n {\r\n selector: '.block-text > *',\r\n delayBase: 0.2,\r\n anim: 'animate__fadeInLeft',\r\n delayStep: 0.1\r\n }\r\n ],\r\n once: true\r\n },\r\n {\r\n selector: '.main-desc .wrapper',\r\n targets: [\r\n {\r\n selector: '.block-text > *',\r\n delayBase: 0.2,\r\n anim: 'animate__fadeIn',\r\n delayStep: 0.1\r\n },\r\n {\r\n selector: '.main-desc__item',\r\n delayBase: 0.4,\r\n delayStep: 0.1,\r\n anim: 'animate__fadeInUp'\r\n }\r\n ],\r\n once: true\r\n },\r\n {\r\n selector: '.block-projects .wrapper',\r\n targets: [\r\n {\r\n selector: '.block-text > *',\r\n delayBase: 0.2,\r\n anim: 'animate__fadeIn',\r\n delayStep: 0.1\r\n },\r\n {\r\n selector: '.block-projects__slider_item',\r\n delayBase: 0.4,\r\n delayStep: 0.1,\r\n anim: 'animate__fadeInUp'\r\n },\r\n {\r\n selector: '.block-default__foot > *',\r\n delayBase: 0.7,\r\n delayStep: 0.1,\r\n anim: 'animate__fadeIn'\r\n }\r\n ],\r\n once: true\r\n },\r\n];\r\n\r\nexport default animItems;","/**\r\n * Модуль для проверки наличия какого-то блока во вьюпорте и триггера события с него\r\n */\r\n\r\nexport const IN_VIEWPORT = 'inViewport';\r\n// export const OUT_VIEWPORT = 'outViewport';\r\n\r\nconst options = {\r\n root: null,\r\n rootMargin: '-20% 0px',\r\n threshold: 0.01\r\n};\r\n\r\nlet observer;\r\n\r\nconst observeCallback = (entries, obs) => {\r\n entries.filter(\r\n entry => entry.isIntersecting\r\n ).forEach(entry => {\r\n entry.target.dispatchEvent(new Event(IN_VIEWPORT));\r\n });\r\n};\r\n\r\nexport const isObserverSupporting = () => !(!'IntersectionObserver' in window &&\r\n !'IntersectionObserverEntry' in window &&\r\n !'intersectionRatio' in window.IntersectionObserverEntry.prototype);\r\n\r\nexport const watch = (element) => {\r\n if (typeof observer === 'undefined') {\r\n if (!isObserverSupporting) {\r\n element.dispatchEvent(new Event(IN_VIEWPORT));\r\n return;\r\n }\r\n\r\n observer = new IntersectionObserver(observeCallback, options);\r\n }\r\n\r\n observer.observe(element);\r\n};\r\n\r\nexport const unWatch = (element) => {\r\n if (observer) observer.unobserve(element);\r\n}","import animItems from '../data/animItems';\r\nimport TaskRunner from '../base/TaskRunner';\r\nimport * as viewportWatcher from '../components/viewportWatcher';\r\n\r\nconst defaults = {\r\n anim: 'animate__fadeIn',\r\n delayBase: 0,\r\n delayStep: 0,\r\n itemClass: 'anim-item',\r\n parentClass: 'anim-parent',\r\n classWhenViewport: 'animate__animated'\r\n};\r\n\r\nconst onViewportHandler = (e) => {\r\n if(e.target['data-once']){\r\n viewportWatcher.unWatch(e.target);\r\n }\r\n\r\n e.target.querySelectorAll('.' + defaults.itemClass).forEach(item => {\r\n item.classList.add(defaults.classWhenViewport);\r\n });\r\n};\r\n\r\nTaskRunner.add(() => {\r\n animItems.forEach(itm => {\r\n document.querySelectorAll(itm.selector).forEach(targ => {\r\n let watchingTarget = targ;\r\n\r\n if (itm.targets != undefined && itm.targets.length > 0) {\r\n targ.classList.add(defaults.parentClass);\r\n\r\n itm.targets.forEach(subtarg => {\r\n let subtargSelector;\r\n let anim;\r\n let delayBase;\r\n let delayStep;\r\n\r\n switch (typeof subtarg) {\r\n case \"object\":\r\n subtargSelector = subtarg.selector;\r\n anim = subtarg.anim || defaults.anim;\r\n delayBase = subtarg.delayBase || defaults.delayBase;\r\n delayStep = subtarg.delayStep || defaults.delayStep;\r\n break;\r\n case \"string\":\r\n subtargSelector = subtarg;\r\n anim = defaults.anim;\r\n delayBase = defaults.delayBase;\r\n delayStep = defaults.delayStep;\r\n break;\r\n default: return;\r\n }\r\n\r\n targ.querySelectorAll(subtargSelector).forEach(subtargElement => {\r\n subtargElement.classList.add(defaults.itemClass, anim);\r\n subtargElement.style['animation-delay'] = `${delayBase}s`;\r\n delayBase += delayStep;\r\n });\r\n });\r\n }\r\n\r\n // if(itm.createTrigger){\r\n\r\n // }\r\n\r\n watchingTarget['data-once'] = itm.once;\r\n watchingTarget.addEventListener(viewportWatcher.IN_VIEWPORT, onViewportHandler, { once: itm.once });\r\n viewportWatcher.watch(watchingTarget);\r\n });\r\n });\r\n});","import * as util from '../base/util';\r\nimport TaskRunner from '../base/TaskRunner';\r\n\r\nTaskRunner.add(() => {\r\n let classList = util.rootElem().classList;\r\n\r\n if (util.isTouch()) classList.add('touch-device');\r\n if (util.isIe()) classList.add('is-ie');\r\n if (util.isSafari()) classList.add('is-safari');\r\n\r\n document.body.classList.remove('preload');\r\n});","import TaskRunner from './base/TaskRunner';\r\n// const breakpoints = require('./base/breakpoints');\r\n\r\n// breakpoints.regBreakpoint('medium', 768);\r\n// breakpoints.regBreakpoint('big', 1200);\r\n\r\n// breakpoints.start();\r\n\r\nimport './tasks/others';\r\nimport './tasks/header';\r\n\r\n// import './tasks/accordion';\r\nimport './tasks/swiper';\r\n// import './tasks/fancybox';\r\n// import './tasks/smoothScroll';\r\n// import './tasks/tippy';\r\n// import './tasks/youtube';\r\nimport './tasks/customFocus';\r\nimport './tasks/popups';\r\nimport './tasks/tabs';\r\nimport './tasks/forms';\r\nimport './tasks/scrollAnimations';\r\n\r\nimport './tasks/body';\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n TaskRunner.run();\r\n});"],"sourceRoot":""}