{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./scripts/utils/base.js","webpack:///./scripts/lib/Events.js","webpack:///./scripts/utils/thirdParties.js","webpack:///../node_modules/micromodal/dist/micromodal.es.js","webpack:///./scripts/lib/loadScript.js","webpack:///./scripts/common/globals.js","webpack:///../node_modules/process/browser.js","webpack:///./scripts/utils/cms.js","webpack:///./scripts/init/init.js","webpack:///./scripts/common/analytics.js","webpack:///./scripts/init/initThirdParties.js","webpack:///throttle.js","webpack:///debounce.js","webpack:///./scripts/init/init.styles.js","webpack:///../node_modules/regenerator-runtime/runtime.js","webpack:///./layouts/blog/blog-layout.styles.js","webpack:///./templates/header-blog/components/HeaderMenuItem.js","webpack:///./templates/header-blog/components/HeaderMenu.js","webpack:///./templates/header-blog/components/MobileMenu.js","webpack:///./layouts/blog/blog-layout.js","webpack:///./templates/header-blog/header.js","webpack:///./scripts/common/constants.js","webpack:///./scripts/common/textMsg.js","webpack:///./scripts/lib/ImgLazyLoad.js","webpack:///../node_modules/pristinejs/dist/pristine.js","webpack:///./components/SpinBtn.js","webpack:///./scripts/lib/scrollToElem.js","webpack:///./templates/newsletters/newsletters.js","webpack:///../node_modules/tabbable/index.js","webpack:///./scripts/lib/blockFocusInside.js","webpack:///./components/GigPopover/GigPopover.js","webpack:///./pages-blog/post-page/scripts/LikeBtn.js","webpack:///./pages-blog/post-page/scripts/LikesStorage.js","webpack:///./scripts/lib/SimpleStorage.js","webpack:///./pages-blog/post-page/post-page.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","getCoords","elem","left","top","width","height","getBoundingClientRect","pageYOffset","pageXOffset","bottom","right","map","escaper","source","testRegexp","replaceRegexp","match","keys","join","RegExp","setClassIf","el","className","val","classList","add","remove","isLocalStorageEnabled","testKey","Date","localStorage","setItem","removeItem","swapImgSources","img","src","srcset","dataset","addEventListener","parentElement","HTMLPictureElement","querySelectorAll","forEach","showModal","id","config","Micromodal","show","globals","commonMicromodalConfig","events","Events","window","newValue","type","data","JSON","parse","emit","chunk","size","res","Array","Math","ceil","length","j","slice","transitionTurn","off","on","requestAnimationFrame","copyToClipboard","str","$","document","createElement","style","cssText","readOnly","body","appendChild","select","execCommand","removeChild","constructor","this","_handlers","_regexpHandlers","addListener","handler","isArray","push","addListenerOnce","_handler","removeListener","filter","item","args","reg","test","sendGA","operation","ga","logJSError","errorObj","process","env","SENTRY","Sentry","message","captureException","_defineProperties","target","props","descriptor","configurable","writable","_toConsumableArray","arr","_arrayLikeToArray","_arrayWithoutHoles","iter","iterator","from","_iterableToArray","minLen","toString","_unsupportedIterableToArray","TypeError","_nonIterableSpread","len","arr2","FOCUSABLE_ELEMENTS","Modal","activeModal","validateModalPresence","validateArgs","MicroModal","_ref","targetModal","_ref$triggers","triggers","_ref$onShow","onShow","_ref$onClose","onClose","_ref$openTrigger","openTrigger","_ref$closeTrigger","closeTrigger","_ref$openClass","openClass","_ref$disableScroll","disableScroll","_ref$disableFocus","disableFocus","_ref$awaitCloseAnimat","awaitCloseAnimation","_ref$awaitOpenAnimati","awaitOpenAnimation","_ref$debugMode","debugMode","instance","Constructor","_classCallCheck","modal","getElementById","registerTriggers","apply","onClick","onKeydown","protoProps","staticProps","_this","_len","arguments","_key","Boolean","trigger","event","_this2","undefined","activeElement","setAttribute","scrollBehaviour","addEventListeners","removeEventListener","setFocusToFirstNode","removeEventListeners","focus","closeModal","toggle","querySelector","assign","overflow","hasAttribute","keyCode","retainFocus","nodes","_this3","focusableNodes","getFocusableNodes","nodesWhichAreNotCloseTargets","node","offsetParent","contains","focusedItemIndex","indexOf","shiftKey","preventDefault","console","warn","concat","triggerMap","validateTriggerPresence","init","options","triggerAttr","attributes","generateTriggerMap","close","closeModalById","inProgress","Map","done","Set","loadScript","has","Promise","resolve","loadPromise","reject","script","onload","delete","onerror","set","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","setTimeout","e","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","array","noop","nextTick","title","browser","argv","version","versions","once","removeAllListeners","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","getTemplateData","dataSelect","inlineJsonElement","textContent","err","error","formatDate","date","constants","monthsShort","getMonth","getDate","y","getFullYear","getThumbnail","thumbnails","find","makeSrcset","k","url","getDirectusHeaders","headers","DIRECTUS_PROTO","DIRECTUS_HOST","initPage","initAnalytics","initThirdParties","closest","micromodal","initMicromodal","a","w","getTime","f","getElementsByTagName","async","parentNode","insertBefore","q","FS_ORG","_fs_debug","_fs_host","_fs_org","_fs_namespace","g","log","b","_api","identify","v","uid","setUserVars","identifyAccount","acctId","clearUserCookie","cookie","domain","toUTCString","FB_PIXEL","fbq","callMethod","_fbq","loaded","FS","tracker","cancelled","lastExec","arguments_","self","elapsed","callback","timeoutID","debounceMode","exec","clearExistingTimeout","noTrailing","clear","delay","wrapper","throttle","atBegin","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","define","obj","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","state","method","arg","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","makeInvokeMethod","fn","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","invoke","result","__await","then","unwrapped","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","Function","HeaderMenuItem","root","$root","_init","_getElements","setVisibility","visible","hide","_hiddenClass","$link","tabIndex","_visible","removeAttribute","isVisible","updateMetrics","HeaderMenu","container","$container","_initItems","update","_initEvents","_ready","_updateMetrics","_recalculate","_containerWidth","cw","_totalItemsWith","items","moreItem","showMore","maxWidth","reduce","total","resizing","_startResizing","debounce","_stopResizing","_animationFrame","tik","_tik","cancelAnimationFrame","$items","$item","$more","MobileMenu","headerMenu","modalId","_render","list","cloneNode","_prepareMenuList","$itemsContainer","initBlogLayout","$header","$headerMenu","$nav","mobileMenu","months","BASE_TEXTS","NetworkError","MOD_TEXTS","ErrTitle","OkTitle","NEWSLETTERS_TEXTS","MinCategories","DEF_OPTIONS","lazyClass","preferNative","offset","innerHeight","scrollableContainer","useOffsetAfterInteractive","hasNativeSupport","HTMLImageElement","ImgLazyLoad","images","_runHandler","_run","_active","_frameId","_options","_images","_setupOffsetAfterInteractive","_initNativeLazy","_addEvents","_runForImg","_removeEvents","bounding","_swapImgSources","_forgetImg","lazyImg","realOffset","runHandler","useNative","lang","required","email","number","integer","tel","maxlength","minlength","min","max","pattern","tmpl","_arguments","replace","groupedElemCount","input","pristine","form","getAttribute","defaultConfig","classTo","errorClass","successClass","errorTextParent","errorTextTag","errorTextClass","ALLOWED_ATTRIBUTES","EMAIL_REGEX","validators","_","validator","msg","priority","Pristine","live","_addValidatorToField","fns","params","valueParams","split","unshift","_validateField","field","errors","valid","messages","halt","_getErrorElements","errorElements","errorClassElement","cls","findAncestor","errorTextElement","PRISTINE_ERROR","pristineDisplay","display","_showError","innerHTML","_showSuccess","_removeError","obj1","obj2","attr","mergeConfig","fields","substr","endsWith","sort","validate","silent","HTMLElement","NodeList","getErrors","erroneousFields","tagName","toLowerCase","addValidator","addError","destroy","setGlobalConfig","parseFloat","parseInt","limit","factory","SpinBtn","btn","doneDelay","checkIcon","_btn","_delay","_doneDelay","_checkIcon","_timers","_loading","startLoading","_clear","disabled","stopLoading","isSuccess","time","resCls","isLoading","scrollToElem","element","speed","side","firstPos","startTime","performance","now","fullTime","abs","scrollTo","progress","pos","initNewsletters","parent","$form","$submitBtn","$error","$themes","themes","submitBtn","trim","checked","humTracker","submit","candidateSelectors","candidateSelector","matches","Element","msMatchesSelector","webkitMatchesSelector","tabbable","candidate","candidateTabindex","regularTabbables","orderedTabbables","candidates","includeContainer","isNodeMatchingSelectorTabbable","getTabindex","documentOrder","sortOrderedTabbables","isNodeMatchingSelectorFocusable","isInput","isRadio","getCheckedRadio","ownerDocument","isTabbableRadio","isNonTabbableRadio","isHiddenInput","getComputedStyle","visibility","isHidden","isTabbable","isFocusable","focusableCandidateSelector","tabindexAttr","contentEditable","isContentEditable","currentContainer","currentTabbable","mutationObserver","MutationObserver","updateTabbable","onPress","firstTabbable","lastTabbable","active","includes","focusFirst","padding","arrowOffset","openOn","manageFocus","GigPopover","resize","keyup","click","orientation","mouseEnter","mouseLeave","$trigger","_mode","_start","handlers","_eventHandlers","resizeFrame","open","code","scroll","_isOpened","_activeElement","_clearStyles","_updateFullscreenMode","position","_correctScroll","blockFocusInside","observe","childList","subtree","disconnect","_turnOffFullscreenMode","_positionRoot","_positionArrow","x","ix","iy","_getCoords","_correctCoords","_metrics","minX","maxX","minY","maxY","realVal","setProperty","pt","pr","pb","pl","docWidth","scrollWidth","docHeight","scrollHeight","offsetWidth","offsetHeight","html","documentElement","winHeight","clientHeight","_getMode","_turnOnFullscreenMode","computed","getPropertyValue","LikeBtn","storage","_storage","_updateValue","_updateTotal","rev","$text","_formatTotal","round","LikesStorage","defaultValue","_defaultValue","_fetch","_value","_setValue","_lsEnabled","_save","stringify","_disabled","slug","likes","super","_slug","_total","resp","fetch","ok","json","$likeButtons","buttons","tooltipRoot","selector","$page","$content","track","inSidebar","hideTimer","popover","location","href","blur","initBtn","frameId","$wrapper","$suggest","$tabbable","updateVisibility","offsetBottom","prepareFrame","ratio","createWrapper","frame","replaceWith","content","links","fb","twitter","trackScroll","trackClick"],"mappings":"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","file":"scripts/post-page-blog.js?613b8b38d14f2506057e","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 = \"/static/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 109);\n","import Micromodal from 'micromodal';\nimport globals from '../common/globals';\nimport regexp from '../common/regexp';\nimport Events from '../lib/Events';\n\nexport function sleep(time) {\n return new Promise(resolve => setTimeout(resolve, time));\n}\n\n/** @param {HTMLElement} elem */\nexport function getCoords(elem) {\n const { left, top, width, height } = elem.getBoundingClientRect();\n\n return {\n top: top + pageYOffset,\n left: left + pageXOffset,\n bottom: top + pageYOffset + height,\n right: left + pageXOffset + width,\n width, height,\n };\n}\n\nexport function isTouch() {\n return ('ontouchstart' in window) || navigator.maxTouchPoints;\n}\n\n// Copy of underscore escape\nexport const escape = (function () {\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n };\n let escaper = function (match) {\n return map[match];\n };\n let source = '(?:' + Object.keys(map).join('|') + ')';\n let testRegexp = RegExp(source);\n let replaceRegexp = RegExp(source, 'g');\n\n return function (string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n}());\n\n/** @returns {{[key: string]: string}} */\nexport function getGetParams(prepare = decodeURIComponent) {\n const search = location.search.slice(1);\n const getParams = {};\n\n if (!search) {\n return getParams;\n }\n\n search.split('&').forEach((item) => {\n const [key, val] = item.split('=', 2);\n getParams[key] = prepare(val);\n });\n\n return getParams;\n}\n\n/**\n * @param {String} html representing of a single element\n * @returns {HTMLElement}\n */\nexport function htmlToElem(html) {\n const template = document.createElement('template');\n template.innerHTML = html;\n\n return template.content.firstChild;\n}\n\n/** @param {'auto'|'manual'} value */\nexport function setScrollBehavior(value) {\n if (!('scrollRestoration' in history)) return;\n history.scrollRestoration = value;\n}\n\nexport function isEmail(email) {\n return regexp.email.test(email);\n}\n\n/**\n * Clone the object using JSON method\n * \n * p.s. this method can be used for JSON-like object only (e.g. API responses), \n * but also this method is faster then loop based methods\n * (JSON much simpler the JS, so it can be parsed fast)\n * \n * @template T\n * @param {T} object\n * @return {T}\n */\nexport function jsonClone(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n/**\n * Redirects to the url with a slight delay\n * \n * Use cases:\n * \n * - use it when you need to reload the page when closing a modal. \n * \n * The reason is that you can usually close the modal by the ESC button too, \n * but pressing the ESC also can stop the redirect. So, you can write:\n * \n * Micromodal.show('modal-id', { onClose: asyncRedirect('/some/path') });\n * \n * @param {string} url \n */\nexport function asyncRedirect(url) {\n requestAnimationFrame(() => location.href = url);\n}\n\nexport function asyncReload() {\n requestAnimationFrame(() => location.reload());\n}\n\n/**\n * @param {HTMLElement} el \n * @param {string} className \n * @param {boolean} val \n * \n * @example\n * \n * \n * ```js\n * // instead of:\n * if (a === b) {\n * $someEl.classList.add('visible');\n * } else {\n * $someEl.classList.remove('visible');\n * }\n * //You can write:\n * setClassIf($someEl, 'visible', a === b)\n * ```\n */\nexport function setClassIf(el, className, val) {\n if (val) el.classList.add(className);\n else el.classList.remove(className);\n}\n\nexport function decrypt(str, key) {\n return str.split('x')\n .filter(Boolean)\n .map(s => String.fromCharCode(parseInt(s, 16) ^ key))\n .join('');\n}\n\nexport function isLocalStorageEnabled() {\n const testKey = new Date();\n\n try {\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function swapImgSources(img) {\n if (img.src || img.srcset) return;\n\n if (img.dataset.src) img.src = img.dataset.src;\n if (img.dataset.srcset) img.srcset = img.dataset.srcset;\n\n img.addEventListener('load', function () {\n img.classList.add('loaded');\n });\n\n if (!(img.parentElement instanceof HTMLPictureElement)) {\n return;\n }\n\n const sources = img.parentElement.querySelectorAll('source') || [];\n\n sources.forEach((source) => {\n if (source.dataset.srcset) source.srcset = source.dataset.srcset;\n });\n}\n\n/** \n * @param {string} id\n * @param {import('micromodal').MicroModalConfig} config \n */\nexport function showModal(id, config) {\n Micromodal.show(id, {\n ...globals.commonMicromodalConfig,\n ...config,\n });\n}\n\nexport function hideModal(id) {\n Micromodal.close(id);\n}\n\nexport const addStorageListener = (function () {\n const events = new Events();\n\n window.addEventListener('storage', ({ key, newValue }) => {\n if (key !== 'storage-message' || !newValue) return;\n const { type, data } = JSON.parse(newValue);\n events.emit(type, data);\n });\n\n /** \n * @param {string} type \n * @param {function} handler\n */\n function addStorageListener(type, handler) {\n events.addListener(type, handler);\n }\n\n return addStorageListener;\n}());\n\n/** @param {string} eventType */\nexport function emitStorageEvent(type, data) {\n if (!isLocalStorageEnabled()) return;\n\n const msg = JSON.stringify({ type, data });\n localStorage.setItem('storage-message', msg);\n localStorage.removeItem('storage-message');\n}\n\n/**\n * @param {T[]} src \n * @param {number} size\n * @returns {T[][]}\n * @template T\n */\nexport function chunk(src, size) {\n const res = new Array(Math.ceil(src.length / size));\n\n for (let i = 0, j = 0; i < src.length; i += size, j++) {\n res[j] = src.slice(i, i + size);\n }\n\n return res;\n}\n\nexport const transitionTurn = {\n off(el) {\n el.classList.add('no-transition');\n },\n on(el) {\n requestAnimationFrame(() => {\n el.classList.remove('no-transition');\n });\n },\n};\n\nexport function forceReloadOnBack() {\n window.addEventListener('pageshow', ({ persisted }) => {\n const isBack = performance && performance.navigation.type === 2;\n if (persisted || isBack) location.reload();\n });\n}\n\nexport function doOnBack(handler) {\n window.addEventListener('pageshow', ({ persisted }) => {\n const isBack = performance && performance.navigation.type === 2;\n if (persisted || isBack) handler();\n });\n}\n\nexport function copyToClipboard(str) {\n const $ = document.createElement('textarea');\n $.style.cssText = 'position: absolute; left: -9999px';\n $.value = str;\n $.readOnly = true;\n document.body.appendChild($);\n $.select();\n document.execCommand('copy');\n document.body.removeChild($);\n}","/** @template AvailableEventType */\nexport default class Events {\n /** @typedef {AvailableEventType|RegExp} EventType */\n constructor() {\n /** @private */\n this._handlers = {};\n\n /** @type {{type: RegExp, handler: function}[]} */\n this._regexpHandlers = [];\n }\n\n /**\n * @param {EventType|EventType[]} type \n * @param {function} handler \n */\n addListener(type, handler = () => { }) {\n if (Array.isArray(type)) {\n type.forEach(t => this.addListener(t, handler));\n return;\n }\n\n if (typeof type === 'string') {\n this._handlers[type] = this._handlers[type] || [];\n this._handlers[type].push(handler);\n } else {\n this._regexpHandlers.push({ type, handler });\n }\n\n return handler;\n }\n\n /**\n * @param {EventType|EventType[]} type\n * @param {function} handler \n */\n addListenerOnce(type, handler = () => { }) {\n const _handler = (...args) => {\n this.removeListener(type, _handler);\n handler(...args);\n };\n\n this.addListener(type, _handler);\n }\n\n /**\n * @param {string|string[]} type \n * @param {function} handler \n */\n removeListener(type, handler) {\n if (Array.isArray(type)) {\n type.forEach(t => this.removeListener(t, handler));\n return;\n }\n\n if (!this._handlers[type]) return;\n\n this._handlers[type] = this._handlers[type]\n .filter(item => item != handler);\n }\n\n /**\n * @param {AvailableEventType} type\n * @param {...any} args \n */\n emit(type, ...args) {\n if (type in this._handlers) {\n this._handlers[type].forEach(handler => handler(...args));\n }\n\n this._regexpHandlers\n .filter(({ type: reg }) => reg.test(type))\n .forEach(({ handler }) => handler(type, ...args));\n }\n}","import globals from '../common/globals';\nimport loadScript from '../lib/loadScript';\n\nexport async function loadGoogleMaps() {\n const key = process.env.GOOGLE_WEB_API;\n const src = `https://maps.googleapis.com/maps/api/js?key=${key}&libraries=places&language=en`;\n\n await loadScript(src);\n}\n\nexport async function initStripeV3() {\n if (globals.stripe) return;\n\n await loadScript('https://js.stripe.com/v3/');\n globals.stripe = window.Stripe(process.env.STRIPE);\n}\n\nexport async function initStripeV2() {\n if (window.Stripe) return;\n\n await loadScript('https://js.stripe.com/v2/');\n window.Stripe.setPublishableKey(process.env.STRIPE);\n}\n\nexport function logMessage(message) {\n if (process.env.SENTRY && window.Sentry) {\n window.Sentry.captureMessage(message);\n }\n}\n\nexport function prepareGAEventInfo(eventCategory, eventAction, eventLabel) {\n return { eventCategory, eventAction, eventLabel };\n}\n\nexport function sendGA(operation, name, value) {\n if (!window.ga) return;\n\n window.ga(operation, name, value);\n}\n\nexport function logJSError(errorObj) {\n if (process.env.SENTRY && window.Sentry) {\n if (errorObj && {}.hasOwnProperty.call(errorObj, 'message')) {\n errorObj.message = 'Processed error: ' + errorObj.message;\n }\n window.Sentry.captureException(errorObj);\n }\n}","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar MicroModal = function () {\n\n var FOCUSABLE_ELEMENTS = ['a[href]', 'area[href]', 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^=\"-\"])'];\n\n var Modal = /*#__PURE__*/function () {\n function Modal(_ref) {\n var targetModal = _ref.targetModal,\n _ref$triggers = _ref.triggers,\n triggers = _ref$triggers === void 0 ? [] : _ref$triggers,\n _ref$onShow = _ref.onShow,\n onShow = _ref$onShow === void 0 ? function () {} : _ref$onShow,\n _ref$onClose = _ref.onClose,\n onClose = _ref$onClose === void 0 ? function () {} : _ref$onClose,\n _ref$openTrigger = _ref.openTrigger,\n openTrigger = _ref$openTrigger === void 0 ? 'data-micromodal-trigger' : _ref$openTrigger,\n _ref$closeTrigger = _ref.closeTrigger,\n closeTrigger = _ref$closeTrigger === void 0 ? 'data-micromodal-close' : _ref$closeTrigger,\n _ref$openClass = _ref.openClass,\n openClass = _ref$openClass === void 0 ? 'is-open' : _ref$openClass,\n _ref$disableScroll = _ref.disableScroll,\n disableScroll = _ref$disableScroll === void 0 ? false : _ref$disableScroll,\n _ref$disableFocus = _ref.disableFocus,\n disableFocus = _ref$disableFocus === void 0 ? false : _ref$disableFocus,\n _ref$awaitCloseAnimat = _ref.awaitCloseAnimation,\n awaitCloseAnimation = _ref$awaitCloseAnimat === void 0 ? false : _ref$awaitCloseAnimat,\n _ref$awaitOpenAnimati = _ref.awaitOpenAnimation,\n awaitOpenAnimation = _ref$awaitOpenAnimati === void 0 ? false : _ref$awaitOpenAnimati,\n _ref$debugMode = _ref.debugMode,\n debugMode = _ref$debugMode === void 0 ? false : _ref$debugMode;\n\n _classCallCheck(this, Modal);\n\n // Save a reference of the modal\n this.modal = document.getElementById(targetModal); // Save a reference to the passed config\n\n this.config = {\n debugMode: debugMode,\n disableScroll: disableScroll,\n openTrigger: openTrigger,\n closeTrigger: closeTrigger,\n openClass: openClass,\n onShow: onShow,\n onClose: onClose,\n awaitCloseAnimation: awaitCloseAnimation,\n awaitOpenAnimation: awaitOpenAnimation,\n disableFocus: disableFocus\n }; // Register click events only if pre binding eventListeners\n\n if (triggers.length > 0) this.registerTriggers.apply(this, _toConsumableArray(triggers)); // pre bind functions for event listeners\n\n this.onClick = this.onClick.bind(this);\n this.onKeydown = this.onKeydown.bind(this);\n }\n /**\n * Loops through all openTriggers and binds click event\n * @param {array} triggers [Array of node elements]\n * @return {void}\n */\n\n\n _createClass(Modal, [{\n key: \"registerTriggers\",\n value: function registerTriggers() {\n var _this = this;\n\n for (var _len = arguments.length, triggers = new Array(_len), _key = 0; _key < _len; _key++) {\n triggers[_key] = arguments[_key];\n }\n\n triggers.filter(Boolean).forEach(function (trigger) {\n trigger.addEventListener('click', function (event) {\n return _this.showModal(event);\n });\n });\n }\n }, {\n key: \"showModal\",\n value: function showModal() {\n var _this2 = this;\n\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n this.activeElement = document.activeElement;\n this.modal.setAttribute('aria-hidden', 'false');\n this.modal.classList.add(this.config.openClass);\n this.scrollBehaviour('disable');\n this.addEventListeners();\n\n if (this.config.awaitOpenAnimation) {\n var handler = function handler() {\n _this2.modal.removeEventListener('animationend', handler, false);\n\n _this2.setFocusToFirstNode();\n };\n\n this.modal.addEventListener('animationend', handler, false);\n } else {\n this.setFocusToFirstNode();\n }\n\n this.config.onShow(this.modal, this.activeElement, event);\n }\n }, {\n key: \"closeModal\",\n value: function closeModal() {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var modal = this.modal;\n this.modal.setAttribute('aria-hidden', 'true');\n this.removeEventListeners();\n this.scrollBehaviour('enable');\n\n if (this.activeElement && this.activeElement.focus) {\n this.activeElement.focus();\n }\n\n this.config.onClose(this.modal, this.activeElement, event);\n\n if (this.config.awaitCloseAnimation) {\n var openClass = this.config.openClass; // <- old school ftw\n\n this.modal.addEventListener('animationend', function handler() {\n modal.classList.remove(openClass);\n modal.removeEventListener('animationend', handler, false);\n }, false);\n } else {\n modal.classList.remove(this.config.openClass);\n }\n }\n }, {\n key: \"closeModalById\",\n value: function closeModalById(targetModal) {\n this.modal = document.getElementById(targetModal);\n if (this.modal) this.closeModal();\n }\n }, {\n key: \"scrollBehaviour\",\n value: function scrollBehaviour(toggle) {\n if (!this.config.disableScroll) return;\n var body = document.querySelector('body');\n\n switch (toggle) {\n case 'enable':\n Object.assign(body.style, {\n overflow: ''\n });\n break;\n\n case 'disable':\n Object.assign(body.style, {\n overflow: 'hidden'\n });\n break;\n }\n }\n }, {\n key: \"addEventListeners\",\n value: function addEventListeners() {\n this.modal.addEventListener('touchstart', this.onClick);\n this.modal.addEventListener('click', this.onClick);\n document.addEventListener('keydown', this.onKeydown);\n }\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n this.modal.removeEventListener('touchstart', this.onClick);\n this.modal.removeEventListener('click', this.onClick);\n document.removeEventListener('keydown', this.onKeydown);\n }\n }, {\n key: \"onClick\",\n value: function onClick(event) {\n if (event.target.hasAttribute(this.config.closeTrigger)) {\n this.closeModal(event);\n }\n }\n }, {\n key: \"onKeydown\",\n value: function onKeydown(event) {\n if (event.keyCode === 27) this.closeModal(event); // esc\n\n if (event.keyCode === 9) this.retainFocus(event); // tab\n }\n }, {\n key: \"getFocusableNodes\",\n value: function getFocusableNodes() {\n var nodes = this.modal.querySelectorAll(FOCUSABLE_ELEMENTS);\n return Array.apply(void 0, _toConsumableArray(nodes));\n }\n /**\n * Tries to set focus on a node which is not a close trigger\n * if no other nodes exist then focuses on first close trigger\n */\n\n }, {\n key: \"setFocusToFirstNode\",\n value: function setFocusToFirstNode() {\n var _this3 = this;\n\n if (this.config.disableFocus) return;\n var focusableNodes = this.getFocusableNodes(); // no focusable nodes\n\n if (focusableNodes.length === 0) return; // remove nodes on whose click, the modal closes\n // could not think of a better name :(\n\n var nodesWhichAreNotCloseTargets = focusableNodes.filter(function (node) {\n return !node.hasAttribute(_this3.config.closeTrigger);\n });\n if (nodesWhichAreNotCloseTargets.length > 0) nodesWhichAreNotCloseTargets[0].focus();\n if (nodesWhichAreNotCloseTargets.length === 0) focusableNodes[0].focus();\n }\n }, {\n key: \"retainFocus\",\n value: function retainFocus(event) {\n var focusableNodes = this.getFocusableNodes(); // no focusable nodes\n\n if (focusableNodes.length === 0) return;\n /**\n * Filters nodes which are hidden to prevent\n * focus leak outside modal\n */\n\n focusableNodes = focusableNodes.filter(function (node) {\n return node.offsetParent !== null;\n }); // if disableFocus is true\n\n if (!this.modal.contains(document.activeElement)) {\n focusableNodes[0].focus();\n } else {\n var focusedItemIndex = focusableNodes.indexOf(document.activeElement);\n\n if (event.shiftKey && focusedItemIndex === 0) {\n focusableNodes[focusableNodes.length - 1].focus();\n event.preventDefault();\n }\n\n if (!event.shiftKey && focusableNodes.length > 0 && focusedItemIndex === focusableNodes.length - 1) {\n focusableNodes[0].focus();\n event.preventDefault();\n }\n }\n }\n }]);\n\n return Modal;\n }();\n /**\n * Modal prototype ends.\n * Here on code is responsible for detecting and\n * auto binding event handlers on modal triggers\n */\n // Keep a reference to the opened modal\n\n\n var activeModal = null;\n /**\n * Generates an associative array of modals and it's\n * respective triggers\n * @param {array} triggers An array of all triggers\n * @param {string} triggerAttr The data-attribute which triggers the module\n * @return {array}\n */\n\n var generateTriggerMap = function generateTriggerMap(triggers, triggerAttr) {\n var triggerMap = [];\n triggers.forEach(function (trigger) {\n var targetModal = trigger.attributes[triggerAttr].value;\n if (triggerMap[targetModal] === undefined) triggerMap[targetModal] = [];\n triggerMap[targetModal].push(trigger);\n });\n return triggerMap;\n };\n /**\n * Validates whether a modal of the given id exists\n * in the DOM\n * @param {number} id The id of the modal\n * @return {boolean}\n */\n\n\n var validateModalPresence = function validateModalPresence(id) {\n if (!document.getElementById(id)) {\n console.warn(\"MicroModal: \\u2757Seems like you have missed %c'\".concat(id, \"'\"), 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'ID somewhere in your code. Refer example below to resolve it.');\n console.warn(\"%cExample:\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', \"
\"));\n return false;\n }\n };\n /**\n * Validates if there are modal triggers present\n * in the DOM\n * @param {array} triggers An array of data-triggers\n * @return {boolean}\n */\n\n\n var validateTriggerPresence = function validateTriggerPresence(triggers) {\n if (triggers.length <= 0) {\n console.warn(\"MicroModal: \\u2757Please specify at least one %c'micromodal-trigger'\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'data attribute.');\n console.warn(\"%cExample:\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', \"\");\n return false;\n }\n };\n /**\n * Checks if triggers and their corresponding modals\n * are present in the DOM\n * @param {array} triggers Array of DOM nodes which have data-triggers\n * @param {array} triggerMap Associative array of modals and their triggers\n * @return {boolean}\n */\n\n\n var validateArgs = function validateArgs(triggers, triggerMap) {\n validateTriggerPresence(triggers);\n if (!triggerMap) return true;\n\n for (var id in triggerMap) {\n validateModalPresence(id);\n }\n\n return true;\n };\n /**\n * Binds click handlers to all modal triggers\n * @param {object} config [description]\n * @return void\n */\n\n\n var init = function init(config) {\n // Create an config object with default openTrigger\n var options = Object.assign({}, {\n openTrigger: 'data-micromodal-trigger'\n }, config); // Collects all the nodes with the trigger\n\n var triggers = _toConsumableArray(document.querySelectorAll(\"[\".concat(options.openTrigger, \"]\"))); // Makes a mappings of modals with their trigger nodes\n\n\n var triggerMap = generateTriggerMap(triggers, options.openTrigger); // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateArgs(triggers, triggerMap) === false) return; // For every target modal creates a new instance\n\n for (var key in triggerMap) {\n var value = triggerMap[key];\n options.targetModal = key;\n options.triggers = _toConsumableArray(value);\n activeModal = new Modal(options); // eslint-disable-line no-new\n }\n };\n /**\n * Shows a particular modal\n * @param {string} targetModal [The id of the modal to display]\n * @param {object} config [The configuration object to pass]\n * @return {void}\n */\n\n\n var show = function show(targetModal, config) {\n var options = config || {};\n options.targetModal = targetModal; // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateModalPresence(targetModal) === false) return; // clear events in case previous modal wasn't close\n\n if (activeModal) activeModal.removeEventListeners(); // stores reference to active modal\n\n activeModal = new Modal(options); // eslint-disable-line no-new\n\n activeModal.showModal();\n };\n /**\n * Closes the active modal\n * @param {string} targetModal [The id of the modal to close]\n * @return {void}\n */\n\n\n var close = function close(targetModal) {\n targetModal ? activeModal.closeModalById(targetModal) : activeModal.closeModal();\n };\n\n return {\n init: init,\n show: show,\n close: close\n };\n}();\nwindow.MicroModal = MicroModal;\n\nexport default MicroModal;\n","const inProgress = new Map();\nconst done = new Set();\n\n/**\n * Async load script\n * @param {string} src \n * @returns {Promise}\n */\nexport default function loadScript(src, name = '', type=null, attributes = null) {\n name = name || src;\n\n if (done.has(name)) return Promise.resolve();\n if (inProgress.has(name)) return inProgress.get(name);\n\n const loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n\n if (type){\n script.setAttribute('type', type);\n }\n\n if (attributes) {\n for (let i in attributes) {\n if (Object.prototype.hasOwnProperty.call(attributes, i)) {\n script.setAttribute(i, attributes[i]);\n }\n }\n }\n\n script.onload = () => {\n inProgress.delete(name);\n done.add(name);\n resolve();\n };\n\n script.onerror = () => {\n inProgress.delete(name);\n reject(`Couldn't load script: ${name}`);\n };\n\n script.src = src;\n document.body.appendChild(script);\n });\n\n inProgress.set(name, loadPromise);\n return loadPromise;\n}\n\n/**\n * Check if the script is completely loaded\n * @param {string} src\n * @returns {boolean}\n */\nexport function isLoadedScript(name) {\n return done.has(name);\n}\n\n/** \n * Check if the script is loading now \n * @param {string} src\n * @returns {boolean}\n */\nexport function isScriptInProgress(src) {\n return inProgress.has(src);\n}","/** \n * @type {{\n * currentUser: User,\n * commonMicromodalConfig: import('micromodal').MicroModalConfig\n * }}\n */\nconst globals = {\n commonMicromodalConfig: {\n disableScroll: true,\n awaitCloseAnimation: true,\n },\n};\n\nexport default globals;","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","import constants from '../common/constants';\nimport { logJSError } from './thirdParties';\n\nexport function getTemplateData(dataSelect) {\n try {\n const inlineJsonElement = document.querySelector(\n `script[type=\"application/json\"][data-gig-selector=\"${dataSelect}\"]`,\n );\n if (inlineJsonElement) {\n const data = JSON.parse(inlineJsonElement.textContent);\n return data;\n }\n return false;\n } catch (err) {\n logJSError(err);\n console.error(`Couldn't read JSON data from ${dataSelect}`, err);\n }\n return false;\n}\n\n/** \n * Formats date (in local time zone, i.e. no getUTC*)\n * @param {Date} date \n * @returns {string} 'Jan 02, 2006'\n */\nexport function formatDate(date) {\n const m = constants.monthsShort[date.getMonth()];\n const d = date.getDate();\n const y = date.getFullYear();\n return `${m} ${d}, ${y}`;\n}\n\n/**\n * @param {ApiImage} img\n * @param {string} key\n */\nexport function getThumbnail(img, key) {\n return img.data.thumbnails.find(d => d.key === key);\n}\n\n/**\n * @param {ApiImage} img\n * @param {...string} keys\n */\nexport function makeSrcset(img, ...keys) {\n return keys.map(k => getThumbnail(img, k))\n .filter(d => d && d.width <= img.width)\n .map(d => `${d.url} ${d.width}w`).join(', ');\n}\n\nexport function getDirectusHeaders() {\n const headers = {};\n\n if (process.env.DIRECTUS_PROTO) {\n headers['X-Forwarded-Proto'] = process.env.DIRECTUS_PROTO;\n }\n\n if (process.env.DIRECTUS_HOST) {\n headers['X-Forwarded-Host'] = process.env.DIRECTUS_HOST;\n }\n\n return headers;\n}","import 'regenerator-runtime/runtime';\n\nimport micromodal from 'micromodal';\n\nimport initThirdParties from './initThirdParties';\nimport initAnalytics from '../common/analytics';\n\nexport default function initPage() {\n initAnalytics();\n initThirdParties();\n initMicromodal();\n}\n\nfunction initMicromodal() {\n document.body.addEventListener('mousedown', (e) => close(e.target));\n document.body.addEventListener('touchstart', (e) => close(e.target));\n\n /** @param {HTMLElement} target */\n function close(target) {\n if (!target.hasAttribute('data-close-parent-modal')) return;\n const modal = target.closest('.modal');\n if (modal) micromodal.close(modal.id);\n }\n}\n","import { getTemplateData } from '@/scripts/utils/cms';\nimport loadScript from '../lib/loadScript';\n\nexport default function initAnalytics() {\n\n /* Google Tag Manager */\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer',process.env.GTM_ID);\n /* Google Analytics */\n (function (i, s, o, g, r, a, m) {\n i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {\n (i[r].q = i[r].q || []).push(arguments);\n }, i[r].l = 1 * new Date(); a = s.createElement(o),\n m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; a.type='javascript/privado-block'; a.setAttribute('privado-cookie-category', 'C002'); m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n if (window.ga) {\n window.ga('create', process.env.UA_ID, 'auto');\n }\n\n //FullStory\n if (process.env.FS_ORG) {\n window._fs_debug = false;\n window._fs_host = 'fullstory.com';\n window._fs_org = process.env.FS_ORG;\n window._fs_namespace = 'FS';\n\n (function (m, n, e, t, l, o, g, y) {\n if (e in m && m.console && m.console.log) {\n m.console.log('FullStory namespace conflict. Please set window._fs_namespace.');\n return;\n }\n g = m[e] = function (a, b) {\n g.q ? g.q.push([a, b]) : g._api(a, b);\n };\n g.q = [];\n o = n.createElement(t);\n o.async = 1;\n o.src = 'https://' + window._fs_host + '/s/fs.js';\n y = n.getElementsByTagName(t)[0];\n y.parentNode.insertBefore(o, y);\n g.identify = function (i, v) {\n g(l, { uid: i });\n if (v) g(l, v);\n };\n g.setUserVars = function (v) {\n g(l, v);\n };\n g.identifyAccount = function (i, v) {\n o = 'account';\n v = v || {};\n v.acctId = i;\n g(o, v);\n };\n g.clearUserCookie = function (c, d, i) {\n if (!c || document.cookie.match('fs_uid=[`;`]*`[`;`]*`[`;`]*`')) {\n d = n.domain;\n while (1) {\n n.cookie = 'fs_uid=;domain=' + d +\n ';path=/;expires=' + new Date(0).toUTCString();\n i = d.indexOf('.');\n if (i < 0) break;\n d = d.slice(i + 1);\n }\n }\n };\n })(window, document, window['_fs_namespace'], 'script', 'user');\n }\n\n if (process.env.FB_PIXEL) {\n !function (f, b, e, v, n, t, s) {\n if (f.fbq) return;\n n = f.fbq = function () {\n n.callMethod ?\n n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n };\n if (!f._fbq) f._fbq = n;\n n.push = n;\n n.loaded = !0;\n n.version = '2.0';\n n.queue = [];\n t = b.createElement(e);\n t.async = !0;\n t.src = v;\n s = b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t, s);\n }(window, document, 'script',\n 'https://connect.facebook.net/en_US/fbevents.js');\n if (window.fbq) {\n window.fbq('init', process.env.FB_PIXEL);\n window.fbq('track', 'PageView');\n }\n }\n\n}","import { sendGA } from '../utils/thirdParties';\n\nexport default function initThirdParties() {\n initJSErrorLog();\n initFullStory();\n initGA();\n // Gig.sendSeoCampaignInfo();\n}\n\nfunction initJSErrorLog() {\n}\n\nfunction initFullStory() {\n if (process.env.FS_ORG) {\n if (window.FS) {\n window.FS.identify(false);\n } else {\n // Gig.logJSError({\n // msg: 'FullStory not initialized'\n // });\n }\n }\n}\n\nfunction initGA() {\n if (process.env.UA_ID) {\n sendGA('set', 'userId', null);\n setGADimensions();\n sendGA('send', 'pageview', null);\n }\n}\n\nfunction setGADimensions() {\n if (window.ga) {\n window.ga(function (tracker) {\n sendGA('set', 'dimension1', tracker.get('clientId'));\n });\n }\n}\n","/* eslint-disable no-undefined,no-param-reassign,no-shadow */\n\n/**\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {boolean} [noTrailing] - Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds while the\n * throttled-function is being called. If noTrailing is false or unspecified, callback will be executed one final time\n * after the last throttled-function call. (After the throttled-function has not been called for `delay` milliseconds,\n * the internal counter is reset).\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the throttled-function is executed.\n * @param {boolean} [debounceMode] - If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is false (at end),\n * schedule `callback` to execute after `delay` ms.\n *\n * @returns {Function} A new, throttled, function.\n */\nexport default function(delay, noTrailing, callback, debounceMode) {\n\t/*\n\t * After wrapper has stopped being called, this timeout ensures that\n\t * `callback` is executed at the proper times in `throttle` and `end`\n\t * debounce modes.\n\t */\n\tlet timeoutID;\n\tlet cancelled = false;\n\n\t// Keep track of the last time `callback` was executed.\n\tlet lastExec = 0;\n\n\t// Function to clear existing timeout\n\tfunction clearExistingTimeout() {\n\t\tif (timeoutID) {\n\t\t\tclearTimeout(timeoutID);\n\t\t}\n\t}\n\n\t// Function to cancel next exec\n\tfunction cancel() {\n\t\tclearExistingTimeout();\n\t\tcancelled = true;\n\t}\n\n\t// `noTrailing` defaults to falsy.\n\tif (typeof noTrailing !== 'boolean') {\n\t\tdebounceMode = callback;\n\t\tcallback = noTrailing;\n\t\tnoTrailing = undefined;\n\t}\n\n\t/*\n\t * The `wrapper` function encapsulates all of the throttling / debouncing\n\t * functionality and when executed will limit the rate at which `callback`\n\t * is executed.\n\t */\n\tfunction wrapper(...arguments_) {\n\t\tlet self = this;\n\t\tlet elapsed = Date.now() - lastExec;\n\n\t\tif (cancelled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Execute `callback` and update the `lastExec` timestamp.\n\t\tfunction exec() {\n\t\t\tlastExec = Date.now();\n\t\t\tcallback.apply(self, arguments_);\n\t\t}\n\n\t\t/*\n\t\t * If `debounceMode` is true (at begin) this is used to clear the flag\n\t\t * to allow future `callback` executions.\n\t\t */\n\t\tfunction clear() {\n\t\t\ttimeoutID = undefined;\n\t\t}\n\n\t\tif (debounceMode && !timeoutID) {\n\t\t\t/*\n\t\t\t * Since `wrapper` is being called for the first time and\n\t\t\t * `debounceMode` is true (at begin), execute `callback`.\n\t\t\t */\n\t\t\texec();\n\t\t}\n\n\t\tclearExistingTimeout();\n\n\t\tif (debounceMode === undefined && elapsed > delay) {\n\t\t\t/*\n\t\t\t * In throttle mode, if `delay` time has been exceeded, execute\n\t\t\t * `callback`.\n\t\t\t */\n\t\t\texec();\n\t\t} else if (noTrailing !== true) {\n\t\t\t/*\n\t\t\t * In trailing throttle mode, since `delay` time has not been\n\t\t\t * exceeded, schedule `callback` to execute `delay` ms after most\n\t\t\t * recent execution.\n\t\t\t *\n\t\t\t * If `debounceMode` is true (at begin), schedule `clear` to execute\n\t\t\t * after `delay` ms.\n\t\t\t *\n\t\t\t * If `debounceMode` is false (at end), schedule `callback` to\n\t\t\t * execute after `delay` ms.\n\t\t\t */\n\t\t\ttimeoutID = setTimeout(\n\t\t\t\tdebounceMode ? clear : exec,\n\t\t\t\tdebounceMode === undefined ? delay - elapsed : delay\n\t\t\t);\n\t\t}\n\t}\n\n\twrapper.cancel = cancel;\n\n\t// Return the wrapper function.\n\treturn wrapper;\n}\n","/* eslint-disable no-undefined */\n\nimport throttle from './throttle';\n\n/**\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {boolean} [atBegin] - Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n *\n * @returns {Function} A new, debounced function.\n */\nexport default function(delay, atBegin, callback) {\n\treturn callback === undefined\n\t\t? throttle(delay, atBegin, false)\n\t\t: throttle(delay, callback, atBegin !== false);\n}\n","import '@/styles/fonts.scss';\nimport '@/styles/icons/icons.scss';\n\nimport '@/styles/base.scss';","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","import './styles/base.scss';","\nexport default class HeaderMenuItem {\n _hiddenClass = 'header-menu--item__hidden';\n _visible = true;\n\n width = 0;\n\n /** @param {HTMLElement} root */\n constructor(root) {\n this.$root = root;\n this._init();\n }\n\n _init() {\n this._getElements();\n }\n\n setVisibility(visible) {\n if (visible) this.show();\n else this.hide();\n }\n\n hide() {\n this.$root.classList.add(this._hiddenClass);\n this.$link.tabIndex = -1;\n this._visible = false;\n }\n\n show() {\n this.$root.classList.remove(this._hiddenClass);\n this.$link.removeAttribute('tabindex');\n this._visible = true;\n }\n\n isVisible() {\n return this._visible;\n }\n\n updateMetrics() {\n this.width = this.$root.getBoundingClientRect().width;\n }\n\n _getElements() {\n this.$link = this.$root.querySelector('.header-menu--link');\n }\n}","import Events from '@/scripts/lib/Events';\nimport { debounce } from 'throttle-debounce';\nimport HeaderMenuItem from './HeaderMenuItem';\n\n/** @param {HTMLElement} header */\nexport default class HeaderMenu {\n events = new Events();\n\n _animationFrame = 0;\n _containerWidth = 0;\n _totalItemsWith = 0;\n\n /** \n * @param {HTMLElement} root \n * @param {HTMLElement} container\n */\n constructor(root, container) {\n this.$root = root;\n this.$container = container;\n\n this._init();\n }\n\n _init() {\n this._getElements();\n this._initItems();\n this.update();\n\n this._initEvents();\n this._ready();\n }\n\n update() {\n this._updateMetrics();\n this._recalculate();\n this.events.emit('update');\n }\n\n _recalculate() {\n const { _containerWidth: cw, _totalItemsWith, items, moreItem } = this;\n\n const showMore = _totalItemsWith >= cw;\n const maxWidth = (showMore) ? cw - moreItem.width : cw;\n\n items.reduce((width, item) => {\n width += item.width;\n item.setVisibility(width <= maxWidth);\n return width;\n }, 0);\n\n moreItem.setVisibility(showMore);\n }\n\n _updateMetrics() {\n this._containerWidth = this.$container.getBoundingClientRect().width;\n\n this.moreItem.updateMetrics();\n this.items.forEach(item => item.updateMetrics());\n\n this._totalItemsWith = this.items\n .reduce((total, { width }) => total + width, 0);\n }\n\n _initEvents() {\n window.addEventListener('orientationchange', () => {\n requestAnimationFrame(() => this.update());\n });\n\n let resizing = false;\n window.addEventListener('resize', () => {\n if (resizing === true) return;\n resizing = true;\n\n this._startResizing();\n });\n\n window.addEventListener('resize', debounce(200, () => {\n resizing = false;\n this._stopResizing();\n }));\n }\n\n _startResizing() {\n this._animationFrame = requestAnimationFrame(function tik() {\n this._tik();\n this._animationFrame = requestAnimationFrame(tik.bind(this));\n }.bind(this));\n }\n\n _stopResizing() {\n cancelAnimationFrame(this._animationFrame);\n }\n\n _tik() {\n this.update();\n }\n\n _initItems() {\n this.items = this.$items.map($item => new HeaderMenuItem($item));\n this.moreItem = new HeaderMenuItem(this.$more);\n }\n\n _ready() {\n this.$root.classList.add('header-menu__ready');\n }\n\n _getElements() {\n this.$more = this.$root.querySelector('.menu-more-item-js');\n this.$items = [...this.$root.querySelectorAll('.menu-item-js')];\n }\n}","import Events from '@/scripts/lib/Events';\nimport { showModal } from '@/scripts/utils/base';\n\n/** @type {MobileMenu} */\nlet mobileMenu = null;\n\nexport default class MobileMenu {\n events = new Events();\n modalId = 'mobile-menu';\n\n /** @param {HTMLElement} headerMenu */\n constructor(headerMenu) {\n if (mobileMenu) return mobileMenu;\n this.headerMenu = headerMenu;\n this._init();\n }\n\n show() {\n this.events.emit('show');\n showModal(this.modalId);\n }\n\n _init() {\n this._getElements();\n this._initEvents();\n }\n\n _initEvents() {\n this.events.addListenerOnce('show', () => {\n this._render();\n });\n }\n\n _render() {\n const list = this.headerMenu.cloneNode(true);\n this._prepareMenuList(list);\n this.$itemsContainer.appendChild(list);\n }\n\n /** @param {HTMLElement} list */\n _prepareMenuList(list) {\n const items = list.querySelectorAll('.header-menu--link');\n items.forEach(($) => {\n $.removeAttribute('tabindex');\n });\n }\n\n _getElements() {\n this.$root = document.querySelector(`#${this.modalId}`);\n this.$itemsContainer = this.$root.querySelector('.items-container-js');\n }\n}","import './blog-layout.styles';\n\nimport initHeader from '@/templates/header-blog/header';\nimport initFooter from '@/templates/footer-blog/footer';\n\nexport default function initBlogLayout() {\n initHeader();\n initFooter();\n}","import './header.styles';\n\nimport HeaderMenu from './components/HeaderMenu';\nimport MobileMenu from './components/MobileMenu';\nimport { showModal } from '@/scripts/utils/base';\n\n\nexport default function initHeader() {\n const $header = document.querySelector('.header-js');\n const $headerMenu = $header.querySelector('.header-menu-js');\n const $nav = $header.querySelector('.header-nav-js');\n\n const headerMenu = window.headerMenu = new HeaderMenu($headerMenu, $nav);\n const mobileMenu = new MobileMenu($headerMenu);\n\n (function initEvents() {\n window.addEventListener('load', () => {\n headerMenu.update();\n });\n\n document.body.addEventListener('click', (e) => {\n if (!e.target.closest('.open-mobile-menu-js')) return;\n e.preventDefault();\n mobileMenu.show();\n });\n }());\n}\n","export default {\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n};","export const BASE_TEXTS = {\n NetworkError: 'Sorry, we encountered a network error. Please check your connection and try again',\n};\n\nexport const MOD_TEXTS = {\n ErrTitle: 'We have a problem',\n OkTitle: \"You're all set\",\n};\n\nexport const NEWSLETTERS_TEXTS = {\n MinCategories: 'Please, select at least one category',\n};","/**\n * @typedef {{\n * preferNative: boolean,\n * lazyClass: string,\n * offset: number,\n * useOffsetAfterInteractive: boolean\n * }} Options\n * \n * preferNative - do nothing if the browser supports loading=\"lazy\" attribute \n * and the img has that attribute\n */\n\nimport { swapImgSources } from '../utils/base';\n\n/** @type {Options} */\nconst DEF_OPTIONS = {\n lazyClass: 'lazy',\n preferNative: true,\n offset: window.innerHeight,\n scrollableContainer: document,\n useOffsetAfterInteractive: true,\n};\n\nconst hasNativeSupport = 'loading' in HTMLImageElement.prototype;\n\nexport default class ImgLazyLoad {\n /**\n * @param {HTMLCollection | HTMLImageElement[]} images \n * @param {Options} options\n */\n constructor(images, options = {}) {\n if (!images) return;\n\n this._runHandler = () => this._run();\n this._active = false;\n this._frameId = 0;\n\n this._options = { ...DEF_OPTIONS, ...options };\n this._images = [...images];\n\n if (this._options.useOffsetAfterInteractive) {\n this._setupOffsetAfterInteractive(this._options.offset);\n this._options.offset = 0;\n }\n\n if (this._options.preferNative && hasNativeSupport) {\n this._initNativeLazy();\n }\n\n if (!this._images.length) {\n return;\n }\n\n this._addEvents();\n this._run();\n }\n\n _run() {\n if (this._active) return;\n this._active = true;\n\n if (this._frameId) {\n cancelAnimationFrame(this._frameId);\n }\n\n this._frameId = requestAnimationFrame(() => {\n this._images.forEach((img) => {\n this._runForImg(img);\n });\n\n this._active = false;\n\n if (!this._images.length) {\n this._removeEvents();\n }\n });\n }\n\n _runForImg(img) {\n const bounding = img.getBoundingClientRect();\n const offset = this._options.offset;\n\n const isVisible = bounding.bottom >= -offset &&\n bounding.top <= window.innerHeight + offset;\n\n if (!isVisible) {\n return;\n }\n\n img.classList.remove(this._options.lazyClass);\n\n this._swapImgSources(img);\n this._forgetImg(img);\n }\n\n _swapImgSources(img) {\n swapImgSources(img);\n }\n\n _forgetImg(img) {\n this._images = this._images.filter(lazyImg => lazyImg !== img);\n }\n\n _setupOffsetAfterInteractive(realOffset) {\n const runHandler = this._runHandler;\n\n this._runHandler = (...args) => {\n runHandler(...args);\n\n // Remove custom runHandler from events\n this._removeEvents();\n\n this._options.offset = realOffset;\n this._runHandler = runHandler;\n\n this._addEvents();\n };\n }\n\n _initNativeLazy() {\n this._images = this._images.filter((img) => {\n const useNative = img.hasAttribute('loading');\n if (useNative) this._swapImgSources(img);\n return !useNative;\n });\n }\n\n _addEvents() {\n this._options.scrollableContainer.addEventListener('scroll', this._runHandler);\n window.addEventListener('resize', this._runHandler);\n window.addEventListener('orientationchange', this._runHandler);\n }\n\n _removeEvents() {\n this._options.scrollableContainer.removeEventListener('scroll', this._runHandler);\n window.removeEventListener('resize', this._runHandler);\n window.removeEventListener('orientationchange', this._runHandler);\n }\n}\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Pristine = factory());\n}(this, (function () { 'use strict';\n\n var lang = {\n required: \"This field is required\",\n email: \"This field requires a valid e-mail address\",\n number: \"This field requires a number\",\n integer: \"This field requires an integer value\",\n url: \"This field requires a valid website URL\",\n tel: \"This field requires a valid telephone number\",\n maxlength: \"This fields length must be < ${1}\",\n minlength: \"This fields length must be > ${1}\",\n min: \"Minimum value for this field is ${1}\",\n max: \"Maximum value for this field is ${1}\",\n pattern: \"Please match the requested format\"\n };\n\n function findAncestor(el, cls) {\n while ((el = el.parentElement) && !el.classList.contains(cls)) {}\n return el;\n }\n\n function tmpl(o) {\n var _arguments = arguments;\n\n return this.replace(/\\${([^{}]*)}/g, function (a, b) {\n return _arguments[b];\n });\n }\n\n function groupedElemCount(input) {\n return input.pristine.self.form.querySelectorAll('input[name=\"' + input.getAttribute('name') + '\"]:checked').length;\n }\n\n function mergeConfig(obj1, obj2) {\n for (var attr in obj2) {\n if (!(attr in obj1)) {\n obj1[attr] = obj2[attr];\n }\n }\n return obj1;\n }\n\n function isFunction(obj) {\n return !!(obj && obj.constructor && obj.call && obj.apply);\n }\n\n var defaultConfig = {\n classTo: 'form-group',\n errorClass: 'has-danger',\n successClass: 'has-success',\n errorTextParent: 'form-group',\n errorTextTag: 'div',\n errorTextClass: 'text-help'\n };\n\n var PRISTINE_ERROR = 'pristine-error';\n var SELECTOR = \"input:not([type^=hidden]):not([type^=submit]), select, textarea\";\n var ALLOWED_ATTRIBUTES = [\"required\", \"min\", \"max\", 'minlength', 'maxlength', 'pattern'];\n var EMAIL_REGEX = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n var validators = {};\n\n var _ = function _(name, validator) {\n validator.name = name;\n if (!validator.msg) validator.msg = lang[name];\n if (validator.priority === undefined) validator.priority = 1;\n validators[name] = validator;\n };\n\n _('text', { fn: function fn(val) {\n return true;\n }, priority: 0 });\n _('required', { fn: function fn(val) {\n return this.type === 'radio' || this.type === 'checkbox' ? groupedElemCount(this) : val !== undefined && val !== '';\n }, priority: 99, halt: true });\n _('email', { fn: function fn(val) {\n return !val || EMAIL_REGEX.test(val);\n } });\n _('number', { fn: function fn(val) {\n return !val || !isNaN(parseFloat(val));\n }, priority: 2 });\n _('integer', { fn: function fn(val) {\n return !val || /^\\d+$/.test(val);\n } });\n _('minlength', { fn: function fn(val, length) {\n return !val || val.length >= parseInt(length);\n } });\n _('maxlength', { fn: function fn(val, length) {\n return !val || val.length <= parseInt(length);\n } });\n _('min', { fn: function fn(val, limit) {\n return !val || (this.type === 'checkbox' ? groupedElemCount(this) >= parseInt(limit) : parseFloat(val) >= parseFloat(limit));\n } });\n _('max', { fn: function fn(val, limit) {\n return !val || (this.type === 'checkbox' ? groupedElemCount(this) <= parseInt(limit) : parseFloat(val) <= parseFloat(limit));\n } });\n _('pattern', { fn: function fn(val, pattern) {\n var m = pattern.match(new RegExp('^/(.*?)/([gimy]*)$'));return !val || new RegExp(m[1], m[2]).test(val);\n } });\n\n function Pristine(form, config, live) {\n\n var self = this;\n\n init(form, config, live);\n\n function init(form, config, live) {\n\n form.setAttribute(\"novalidate\", \"true\");\n\n self.form = form;\n self.config = mergeConfig(config || {}, defaultConfig);\n self.live = !(live === false);\n self.fields = Array.from(form.querySelectorAll(SELECTOR)).map(function (input) {\n\n var fns = [];\n var params = {};\n var messages = {};\n\n [].forEach.call(input.attributes, function (attr) {\n if (/^data-pristine-/.test(attr.name)) {\n var name = attr.name.substr(14);\n if (name.endsWith('-message')) {\n messages[name.slice(0, name.length - 8)] = attr.value;\n return;\n }\n if (name === 'type') name = attr.value;\n _addValidatorToField(fns, params, name, attr.value);\n } else if (~ALLOWED_ATTRIBUTES.indexOf(attr.name)) {\n _addValidatorToField(fns, params, attr.name, attr.value);\n } else if (attr.name === 'type') {\n _addValidatorToField(fns, params, attr.value);\n }\n });\n\n fns.sort(function (a, b) {\n return b.priority - a.priority;\n });\n\n self.live && input.addEventListener(!~['radio', 'checkbox'].indexOf(input.getAttribute('type')) ? 'input' : 'change', function (e) {\n self.validate(e.target);\n }.bind(self));\n\n return input.pristine = { input: input, validators: fns, params: params, messages: messages, self: self };\n }.bind(self));\n }\n\n function _addValidatorToField(fns, params, name, value) {\n var validator = validators[name];\n if (validator) {\n fns.push(validator);\n if (value) {\n var valueParams = value.split(',');\n valueParams.unshift(null); // placeholder for input's value\n params[name] = valueParams;\n }\n }\n }\n\n /***\n * Checks whether the form/input elements are valid\n * @param input => input element(s) or a jquery selector, null for full form validation\n * @param silent => do not show error messages, just return true/false\n * @returns {boolean} return true when valid false otherwise\n */\n self.validate = function (input, silent) {\n silent = input && silent === true || input === true;\n var fields = self.fields;\n if (input !== true && input !== false) {\n if (input instanceof HTMLElement) {\n fields = [input.pristine];\n } else if (input instanceof NodeList || input instanceof (window.$ || Array) || input instanceof Array) {\n fields = Array.from(input).map(function (el) {\n return el.pristine;\n });\n }\n }\n\n var valid = true;\n\n for (var i = 0; fields[i]; i++) {\n var field = fields[i];\n if (_validateField(field)) {\n !silent && _showSuccess(field);\n } else {\n valid = false;\n !silent && _showError(field);\n }\n }\n return valid;\n };\n\n /***\n * Get errors of a specific field or the whole form\n * @param input\n * @returns {Array|*}\n */\n self.getErrors = function (input) {\n if (!input) {\n var erroneousFields = [];\n for (var i = 0; i < self.fields.length; i++) {\n var field = self.fields[i];\n if (field.errors.length) {\n erroneousFields.push({ input: field.input, errors: field.errors });\n }\n }\n return erroneousFields;\n }\n if (input.tagName && input.tagName.toLowerCase() === \"select\") {\n return input.pristine.errors;\n }\n return input.length ? input[0].pristine.errors : input.pristine.errors;\n };\n\n /***\n * Validates a single field, all validator functions are called and error messages are generated\n * when a validator fails\n * @param field\n * @returns {boolean}\n * @private\n */\n function _validateField(field) {\n var errors = [];\n var valid = true;\n for (var i = 0; field.validators[i]; i++) {\n var validator = field.validators[i];\n var params = field.params[validator.name] ? field.params[validator.name] : [];\n params[0] = field.input.value;\n if (!validator.fn.apply(field.input, params)) {\n valid = false;\n\n if (isFunction(validator.msg)) {\n errors.push(validator.msg(field.input.value, params));\n } else {\n var error = field.messages[validator.name] || validator.msg;\n errors.push(tmpl.apply(error, params));\n }\n\n if (validator.halt === true) {\n break;\n }\n }\n }\n field.errors = errors;\n return valid;\n }\n\n /***\n *\n * @param elem => The dom element where the validator is applied to\n * @param fn => validator function\n * @param msg => message to show when validation fails. Supports templating. ${0} for the input's value, ${1} and\n * so on are for the attribute values\n * @param priority => priority of the validator function, higher valued function gets called first.\n * @param halt => whether validation should stop for this field after current validation function\n */\n self.addValidator = function (elem, fn, msg, priority, halt) {\n if (elem instanceof HTMLElement) {\n elem.pristine.validators.push({ fn: fn, msg: msg, priority: priority, halt: halt });\n elem.pristine.validators.sort(function (a, b) {\n return b.priority - a.priority;\n });\n } else {\n console.warn(\"The parameter elem must be a dom element\");\n }\n };\n\n /***\n * An utility function that returns a 2-element array, first one is the element where error/success class is\n * applied. 2nd one is the element where error message is displayed. 2nd element is created if doesn't exist and cached.\n * @param field\n * @returns {*}\n * @private\n */\n function _getErrorElements(field) {\n if (field.errorElements) {\n return field.errorElements;\n }\n var errorClassElement = findAncestor(field.input, self.config.classTo);\n var errorTextParent = null,\n errorTextElement = null;\n if (self.config.classTo === self.config.errorTextParent) {\n errorTextParent = errorClassElement;\n } else {\n errorTextParent = errorClassElement.querySelector('.' + self.config.errorTextParent);\n }\n if (errorTextParent) {\n errorTextElement = errorTextParent.querySelector('.' + PRISTINE_ERROR);\n if (!errorTextElement) {\n errorTextElement = document.createElement(self.config.errorTextTag);\n errorTextElement.className = PRISTINE_ERROR + ' ' + self.config.errorTextClass;\n errorTextParent.appendChild(errorTextElement);\n errorTextElement.pristineDisplay = errorTextElement.style.display;\n }\n }\n return field.errorElements = [errorClassElement, errorTextElement];\n }\n\n function _showError(field) {\n var errorElements = _getErrorElements(field);\n var errorClassElement = errorElements[0],\n errorTextElement = errorElements[1];\n\n if (errorClassElement) {\n errorClassElement.classList.remove(self.config.successClass);\n errorClassElement.classList.add(self.config.errorClass);\n }\n if (errorTextElement) {\n errorTextElement.innerHTML = field.errors.join('
');\n errorTextElement.style.display = errorTextElement.pristineDisplay || '';\n }\n }\n\n /***\n * Adds error to a specific field\n * @param input\n * @param error\n */\n self.addError = function (input, error) {\n input = input.length ? input[0] : input;\n input.pristine.errors.push(error);\n _showError(input.pristine);\n };\n\n function _removeError(field) {\n var errorElements = _getErrorElements(field);\n var errorClassElement = errorElements[0],\n errorTextElement = errorElements[1];\n if (errorClassElement) {\n // IE > 9 doesn't support multiple class removal\n errorClassElement.classList.remove(self.config.errorClass);\n errorClassElement.classList.remove(self.config.successClass);\n }\n if (errorTextElement) {\n errorTextElement.innerHTML = '';\n errorTextElement.style.display = 'none';\n }\n return errorElements;\n }\n\n function _showSuccess(field) {\n var errorClassElement = _removeError(field)[0];\n errorClassElement && errorClassElement.classList.add(self.config.successClass);\n }\n\n /***\n * Resets the errors\n */\n self.reset = function () {\n for (var i = 0; self.fields[i]; i++) {\n self.fields[i].errorElements = null;\n }\n Array.from(self.form.querySelectorAll('.' + PRISTINE_ERROR)).map(function (elem) {\n elem.parentNode.removeChild(elem);\n });\n Array.from(self.form.querySelectorAll('.' + self.config.classTo)).map(function (elem) {\n elem.classList.remove(self.config.successClass);\n elem.classList.remove(self.config.errorClass);\n });\n };\n\n /***\n * Resets the errors and deletes all pristine fields\n */\n self.destroy = function () {\n self.reset();\n self.fields.forEach(function (field) {\n delete field.input.pristine;\n });\n self.fields = [];\n };\n\n self.setGlobalConfig = function (config) {\n defaultConfig = config;\n };\n\n return self;\n }\n\n /***\n *\n * @param name => Name of the global validator\n * @param fn => validator function\n * @param msg => message to show when validation fails. Supports templating. ${0} for the input's value, ${1} and\n * so on are for the attribute values\n * @param priority => priority of the validator function, higher valued function gets called first.\n * @param halt => whether validation should stop for this field after current validation function\n */\n Pristine.addValidator = function (name, fn, msg, priority, halt) {\n _(name, { fn: fn, msg: msg, priority: priority, halt: halt });\n };\n\n return Pristine;\n\n})));\n","import Events from '@/scripts/lib/Events';\n\nexport default class SpinBtn {\n /** @param {HTMLButtonElement} btn */\n constructor(btn, { delay = 300, doneDelay = 2000, checkIcon = true } = {}) {\n this._btn = btn;\n\n this._delay = delay;\n this._doneDelay = doneDelay;\n this._checkIcon = checkIcon;\n\n this._timers = [];\n this._loading = false;\n\n this.events = new Events();\n }\n\n startLoading() {\n this._clear();\n this._loading = true;\n\n this._btn.classList.add('btn-spin__hide_content');\n this._btn.classList.add('btn-spin__spin');\n this._btn.disabled = true;\n\n this.events.emit('loading.change');\n }\n\n stopLoading(isSuccess = true) {\n return new Promise((resolve) => {\n if (!this._loading) return;\n\n let time = 0;\n\n if (this._checkIcon || !isSuccess) {\n const resCls = (isSuccess) ? 'btn-spin__check' : 'btn-spin__failed';\n this._btn.classList.add(resCls);\n }\n\n this._timers.push(setTimeout(() => {\n this._btn.classList.remove('btn-spin__spin');\n this._btn.disabled = false;\n this._loading = false;\n\n this.events.emit('loading.change');\n }, time += this._delay));\n\n this._timers.push(setTimeout(() => {\n this._btn.classList.add('btn-spin__result');\n resolve();\n }, time += (isSuccess && this._checkIcon) ? this._delay : 0));\n\n this._timers.push(setTimeout(() => {\n this._btn.classList.remove('btn-spin__result');\n this._btn.classList.remove('btn-spin__hide_content');\n }, time += (this._checkIcon || !isSuccess) ? this._doneDelay : 0));\n });\n }\n\n isLoading() {\n return this._loading;\n }\n\n _clear() {\n this._timers.forEach(t => clearTimeout(t));\n this._timers = [];\n\n this._btn.classList.remove('btn-spin__result');\n this._btn.classList.remove('btn-spin__failed');\n this._btn.classList.remove('btn-spin__check');\n this._btn.classList.remove('btn-spin__hide_content');\n }\n} ","/**\n * @param {HTMLElement} element \n * @param {number} speed \n * @param {'top'|'bottom'} type \n * @returns {Promise}\n */\nexport default function scrollToElem(element = document.body, speed = 4, type = 'top') {\n return new Promise((resolve) => { \n \n const side = (type === 'top') ? 'top' : 'bottom';\n const offset = (type === 'bottom') ? window.innerHeight : 0;\n\n const d = element.getBoundingClientRect()[side] - offset;\n const firstPos = window.pageYOffset;\n const startTime = performance.now();\n const fullTime = Math.min(Math.abs(d / speed), 3000);\n\n if (speed === 0 || fullTime < 16) {\n window.scrollTo(0, firstPos + d);\n resolve();\n return;\n }\n\n requestAnimationFrame(function tik(time) {\n let progress = (time - startTime) / fullTime;\n\n progress = Math.min(progress, 1);\n progress = Math.max(progress, 0);\n\n const pos = firstPos + (d * progress);\n window.scrollTo(0, pos);\n \n if (progress < 1 && time - startTime < fullTime * 1.5) {\n requestAnimationFrame(tik);\n } else {\n requestAnimationFrame(() => resolve());\n }\n\n });\n\n });\n}\n","import './newsletters.styles';\n\nimport Pristine from 'pristinejs';\n\nimport { NEWSLETTERS_TEXTS } from '@/scripts/common/textMsg';\nimport SpinBtn from '@/components/SpinBtn';\n\n/** @param {HTMLElement} parent */\nexport default function initNewsletters(parent) {\n const $root = parent.querySelector('.newsletters-js');\n const $form = $root.querySelector('.newsletters-form-js');\n const $submitBtn = $form.querySelector('.newsletters-submit-js');\n const $error = $form.querySelector('.newsletters-error-js');\n const $themes = [...$form.themes];\n\n const submitBtn = new SpinBtn($submitBtn, { checkIcon: false });\n\n const validator = new Pristine($form, {\n classTo: 'newsletters-js',\n errorClass: 'newsletters__error',\n errorTextParent: 'newsletters-error-js',\n });\n\n initEvents();\n\n function initEvents() {\n $form.addEventListener('submit', (e) => {\n e.preventDefault();\n if (validator.validate()) submit();\n });\n }\n\n function submit() {\n const email = $form.email.value.trim();\n const themes = getThemes();\n\n if (!themes.length) {\n showError(NEWSLETTERS_TEXTS.MinCategories);\n return;\n }\n\n submitBtn.startLoading();\n hideError();\n\n if (!window.humTracker) {\n submitBtn.stopLoading(false);\n return;\n }\n\n setTimeout(async () => {\n await submitBtn.stopLoading(true);\n showSuccess();\n }, 500);\n }\n\n function getThemes() {\n return $themes.filter($ => $.checked).map($ => $.value);\n }\n\n function showError(error) {\n $root.classList.add('newsletters__error');\n $error.innerHTML = error;\n }\n\n function hideError() {\n $root.classList.remove('newsletters__error');\n }\n\n function showSuccess() {\n $root.classList.add('newsletters__success');\n }\n}","var candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\nvar candidateSelector = candidateSelectors.join(',');\n\nvar matches = typeof Element === 'undefined'\n ? function () {}\n : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\nfunction tabbable(el, options) {\n options = options || {};\n\n var regularTabbables = [];\n var orderedTabbables = [];\n\n var candidates = el.querySelectorAll(candidateSelector);\n\n if (options.includeContainer) {\n if (matches.call(el, candidateSelector)) {\n candidates = Array.prototype.slice.apply(candidates);\n candidates.unshift(el);\n }\n }\n\n var i, candidate, candidateTabindex;\n for (i = 0; i < candidates.length; i++) {\n candidate = candidates[i];\n\n if (!isNodeMatchingSelectorTabbable(candidate)) continue;\n\n candidateTabindex = getTabindex(candidate);\n if (candidateTabindex === 0) {\n regularTabbables.push(candidate);\n } else {\n orderedTabbables.push({\n documentOrder: i,\n tabIndex: candidateTabindex,\n node: candidate,\n });\n }\n }\n\n var tabbableNodes = orderedTabbables\n .sort(sortOrderedTabbables)\n .map(function(a) { return a.node })\n .concat(regularTabbables);\n\n return tabbableNodes;\n}\n\ntabbable.isTabbable = isTabbable;\ntabbable.isFocusable = isFocusable;\n\nfunction isNodeMatchingSelectorTabbable(node) {\n if (\n !isNodeMatchingSelectorFocusable(node)\n || isNonTabbableRadio(node)\n || getTabindex(node) < 0\n ) {\n return false;\n }\n return true;\n}\n\nfunction isTabbable(node) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, candidateSelector) === false) return false;\n return isNodeMatchingSelectorTabbable(node);\n}\n\nfunction isNodeMatchingSelectorFocusable(node) {\n if (\n node.disabled\n || isHiddenInput(node)\n || isHidden(node)\n ) {\n return false;\n }\n return true;\n}\n\nvar focusableCandidateSelector = candidateSelectors.concat('iframe').join(',');\nfunction isFocusable(node) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, focusableCandidateSelector) === false) return false;\n return isNodeMatchingSelectorFocusable(node);\n}\n\nfunction getTabindex(node) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return `tabIndex` correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction sortOrderedTabbables(a, b) {\n return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex;\n}\n\nfunction isContentEditable(node) {\n return node.contentEditable === 'true';\n}\n\nfunction isInput(node) {\n return node.tagName === 'INPUT';\n}\n\nfunction isHiddenInput(node) {\n return isInput(node) && node.type === 'hidden';\n}\n\nfunction isRadio(node) {\n return isInput(node) && node.type === 'radio';\n}\n\nfunction isNonTabbableRadio(node) {\n return isRadio(node) && !isTabbableRadio(node);\n}\n\nfunction getCheckedRadio(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].checked) {\n return nodes[i];\n }\n }\n}\n\nfunction isTabbableRadio(node) {\n if (!node.name) return true;\n // This won't account for the edge case where you have radio groups with the same\n // in separate forms on the same page.\n var radioSet = node.ownerDocument.querySelectorAll('input[type=\"radio\"][name=\"' + node.name + '\"]');\n var checked = getCheckedRadio(radioSet);\n return !checked || checked === node;\n}\n\nfunction isHidden(node) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return node.offsetParent === null || getComputedStyle(node).visibility === 'hidden';\n}\n\nmodule.exports = tabbable;\n","import tabbable from 'tabbable';\n\nconst TAB_KEY = 9;\n\n/** @type {HTMLElement} */\nlet currentContainer = null;\n\n/** @type {HTMLElement[]} */\nlet currentTabbable = [];\n\nlet mutationObserver = new MutationObserver(() => {\n currentContainer.addEventListener('transitionend', () => {\n updateTabbable();\n }, { once: true });\n\n updateTabbable();\n});\n\n/** @param {HTMLElement} el */\nexport function blockFocusInside(el) {\n currentContainer = el;\n\n mutationObserver.observe(el, {\n attributes: true,\n childList: true,\n subtree: true,\n });\n \n updateTabbable();\n \n if (!currentTabbable.includes(document.activeElement)) {\n focusFirst();\n }\n\n document.addEventListener('keydown', onPress);\n}\n\nexport function unblockFocus() {\n if (!currentContainer) return;\n\n document.removeEventListener('keydown', onPress);\n currentContainer = null;\n currentTabbable = [];\n\n mutationObserver.disconnect();\n}\n\n/** @param {KeyboardEvent} event */\nfunction onPress(event) {\n if (event.keyCode !== TAB_KEY) return;\n \n if (currentTabbable.length <= 1) {\n event.preventDefault();\n return;\n }\n\n const firstTabbable = currentTabbable[0];\n const lastTabbable = currentTabbable[currentTabbable.length - 1];\n const active = document.activeElement;\n\n if (!currentTabbable.includes(active)) {\n focusFirst();\n return;\n }\n\n if (event.shiftKey) {\n if (active !== firstTabbable) return;\n event.preventDefault();\n lastTabbable.focus();\n\n } else {\n if (active !== lastTabbable) return;\n event.preventDefault();\n firstTabbable.focus();\n }\n}\n\nfunction focusFirst() {\n if (!currentTabbable.length) return;\n currentTabbable[0].focus();\n\n currentContainer.addEventListener('transitionend', () => {\n if (!currentTabbable.length) return;\n currentTabbable[0].focus();\n }, { once: true });\n}\n\nfunction updateTabbable() {\n if (!currentContainer) return;\n currentTabbable = tabbable(currentContainer, {\n includeContainer: true,\n });\n}","import { blockFocusInside, unblockFocus } from '@/scripts/lib/blockFocusInside';\nimport { getCoords } from '@/scripts/utils/base';\nimport scrollToElem from '@/scripts/lib/scrollToElem';\nimport Events from '@/scripts/lib/Events';\n\nimport './gigPopover.scss';\n\n/** @typedef {[number, number, number, number]} Padding */\n/** @typedef {'top'|'right'|'bottom'|'left'} PositionMode */\n/** @typedef {PositionMode[]} Priority */\n\n/**\n * @typedef {{\n * trigger: DOMRect,\n * width: number,\n * height: number,\n * docWidth: number,\n * docHeight: number,\n * maxX: number,\n * maxY: number,\n * minX: number,\n * minY: number,\n * }} Metrics\n */\n\n/**\n * @typedef {{\n * offset: number,\n * padding: Padding,\n * arrowOffset: number,\n * priority: Priority,\n * openOn: 'none'|'click'|'hover',\n * manageFocus: boolean,\n * }} Options\n */\n\n/** @type {Options} */\nconst DEF_OPTIONS = {\n offset: 15,\n padding: [4, 4, 4, 4],\n arrowOffset: 16,\n priority: ['top', 'right', 'left', 'bottom'],\n openOn: 'click',\n manageFocus: true,\n};\n\nexport default class GigPopover {\n\n /** @type {Events<'open'|'open-before'|'close'|'close-after'>} */\n events = new Events(); \n\n _isOpened = false;\n\n /** @type {Metrics} */\n _metrics = {};\n\n _eventHandlers = {\n resize: null,\n keyup: null,\n click: null,\n orientation: null,\n mouseEnter: null,\n mouseLeave: null,\n };\n\n /**\n * @param {HTMLElement} root \n * @param {HTMLElement} trigger \n * @param {Options} options \n */\n constructor(root, trigger, options = {}) {\n this._options = { ...DEF_OPTIONS, ...options };\n this.$trigger = trigger;\n this.$root = root;\n this._mode = this._options.priority[0];\n\n this._init();\n }\n\n _init() {\n this._initEvents();\n this._start();\n }\n\n _start() {\n this.$root.classList.add('gig-popover');\n this.$root.remove();\n }\n\n _initEvents() {\n const handlers = this._eventHandlers;\n let resizeFrame = 0;\n\n handlers.click = (e) => {\n if (this.$root.contains(e.target)) {\n return;\n } else if (this.$trigger.contains(e.target)\n && this._options.openOn === 'click') {\n e.preventDefault();\n requestAnimationFrame(() => this.toggle());\n return;\n }\n\n if (this._options.openOn === 'click') {\n this.close();\n }\n };\n\n if (this._options.openOn === 'hover') {\n handlers.mouseEnter = () => this.open();\n handlers.mouseLeave = () => this.close();\n\n this.$trigger.addEventListener('mouseenter', handlers.mouseEnter);\n this.$trigger.addEventListener('mouseleave', handlers.mouseLeave);\n }\n\n handlers.keyup = ({ code }) => {\n if (code === 'Escape') this.close();\n };\n\n handlers.resize = () => {\n cancelAnimationFrame(resizeFrame);\n resizeFrame = requestAnimationFrame(() => this.resize());\n };\n\n handlers.scroll = (event) => {\n this._eventHandlers.resize(event);\n };\n\n handlers.orientation = () => {\n requestAnimationFrame(() => this.resize());\n setTimeout(() => this.resize(), 250);\n setTimeout(() => this.resize(), 1000);\n };\n\n document.addEventListener('click', handlers.click);\n document.addEventListener('keyup', handlers.keyup);\n window.addEventListener('resize', handlers.resize);\n window.addEventListener('scroll', handlers.scroll, true);\n window.addEventListener('orientationchange', handlers.orientation);\n\n this.$root.addEventListener('click', (e) => {\n if (!e.target.closest('.popover-close-js')) return;\n e.preventDefault();\n this.close();\n });\n }\n\n open() {\n if (this._isOpened) return;\n this.events.emit('open.before');\n this._isOpened = true;\n\n this._activeElement = document.activeElement;\n document.body.appendChild(this.$root);\n\n this._clearStyles();\n this._updateFullscreenMode();\n this._updateMetrics();\n\n this.position();\n this._correctScroll();\n\n this.$root.classList.add('gig-popover__open');\n this.$root.setAttribute('aria-hidden', false);\n\n if (this._options.manageFocus) {\n setTimeout(() => blockFocusInside(this.$root), 60);\n }\n\n this.events.emit('open');\n }\n\n close() {\n if (!this._isOpened) return;\n this._isOpened = false;\n\n this.$root.classList.remove('gig-popover__open');\n this.$root.setAttribute('aria-hidden', true);\n\n if (this._options.manageFocus) {\n unblockFocus();\n\n if (this._activeElement) {\n this._activeElement.focus();\n }\n }\n\n this._turnOffFullscreenMode();\n\n setTimeout(() => {\n this.$root.remove();\n this.events.emit('close.after');\n }, 300);\n\n this.events.emit('close');\n }\n\n toggle() {\n return (this._isOpened) ? this.close() : this.open();\n }\n\n position() {\n this._positionRoot();\n this._positionArrow();\n }\n\n _positionRoot() {\n const { x, y, mode } = this._options.priority.map((mode, priority) => {\n const { x: ix, y: iy } = this._getCoords(mode);\n const { x, y } = this._correctCoords(ix, iy);\n\n const d = (mode === 'top' || mode === 'bottom') ? y - iy : x - ix;\n const val = Math.abs(d) + priority;\n\n return { x, y, mode, val };\n }).sort((a, b) => a.val - b.val)[0];\n\n this._mode = mode;\n this.$root.style.left = `${x ^ 0}px`;\n this.$root.style.top = `${y ^ 0}px`;\n this.$root.classList.add(`gig-popover__${this._mode}`);\n }\n\n _correctCoords(x, y) {\n x = Math.min(Math.max(x, this._metrics.minX), this._metrics.maxX);\n y = Math.min(Math.max(y, this._metrics.minY), this._metrics.maxY);\n return { x, y };\n }\n\n _positionArrow() {\n if (!('setProperty' in this.$root.style)) return;\n\n const { trigger, width, height } = this._metrics;\n const offset = this._options.arrowOffset;\n const pos = getCoords(this.$root);\n\n if (this._mode === 'bottom' || this._mode === 'top') {\n const val = trigger.left + trigger.width / 2 - pos.left;\n const realVal = Math.min(Math.max(val, offset), width - offset);\n this.$root.style.setProperty('--trigger-pos', `${realVal}px`);\n\n } else {\n const val = trigger.top + trigger.height / 2 - pos.top;\n const realVal = Math.min(Math.max(val, offset), height - offset);\n this.$root.style.setProperty('--trigger-pos', `${realVal}px`);\n }\n }\n\n /** \n * @param {PositionMode} mode \n * @returns {{x: number, y: number}}\n */\n _getCoords(mode) {\n const { trigger, width, height } = this._metrics;\n const { offset } = this._options;\n let x = 0, y = 0;\n\n if (mode === 'top') {\n x = trigger.left + trigger.width / 2 - width / 2;\n y = trigger.top - height - offset;\n } else if (mode === 'right') {\n x = trigger.right + offset;\n y = trigger.top + trigger.height / 2 - height / 2;\n } else if (mode === 'bottom') {\n x = trigger.left + trigger.width / 2 - width / 2;\n y = trigger.bottom + offset;\n } else if (mode === 'left') {\n x = trigger.left - width - offset;\n y = trigger.top + trigger.height / 2 - height / 2;\n } else {\n throw new TypeError(`Invalid position mode: ${mode}`);\n }\n\n return { x, y };\n }\n\n _updateMetrics() {\n const [pt, pr, pb, pl] = this._options.padding;\n const m = this._metrics;\n\n this.$root.style.display = 'none';\n m.docWidth = document.body.scrollWidth;\n m.docHeight = document.body.scrollHeight;\n this.$root.style.display = '';\n\n m.trigger = getCoords(this.$trigger);\n\n m.width = this.$root.offsetWidth;\n m.height = this.$root.offsetHeight;\n\n m.maxX = m.docWidth - m.width - pr - 1;\n m.maxY = m.docHeight - m.height - pb - 1;\n\n m.minX = pl;\n m.minY = pt;\n }\n\n async _correctScroll() {\n const pos = this.$root.getBoundingClientRect();\n\n const html = document.documentElement;\n const winHeight = window.innerHeight || html.clientHeight;\n\n if (pos.top < 0) {\n await scrollToElem(this.$root, 1, 'top');\n } else if (pos.bottom > winHeight) {\n await scrollToElem(this.$root, 1, 'bottom');\n }\n }\n\n _updateFullscreenMode() {\n if (this._getMode() === 'fullscreen') {\n this._turnOnFullscreenMode();\n return;\n } else {\n this._turnOffFullscreenMode();\n }\n }\n\n _turnOnFullscreenMode() {\n this.$root.classList.add('gig-popover__fullscreen');\n document.body.classList.add('body__gig-popover-fullscreen');\n }\n\n _turnOffFullscreenMode() {\n this.$root.classList.remove('gig-popover__fullscreen');\n document.body.classList.remove('body__gig-popover-fullscreen');\n }\n\n _clearStyles() {\n this.$root.style.left = 0;\n this.$root.style.top = 0;\n\n ['left', 'top', 'right', 'bottom', 'fullscreen'].forEach((item) => {\n this.$root.classList.remove(`gig-popover__${item}`);\n });\n }\n\n _getMode() {\n const computed = getComputedStyle(this.$root);\n if (!('getPropertyValue' in computed)) return false;\n\n return computed.getPropertyValue('--gig-popover-mode').trim();\n }\n\n resize() {\n if (!this._isOpened) return;\n\n this._clearStyles();\n this._updateFullscreenMode();\n this._updateMetrics();\n this.position();\n\n }\n\n destroy() {\n this.close();\n\n const { click, keyup, resize, scroll, orientation } = this._eventHandlers;\n const { mouseEnter, mouseLeave } = this._eventHandlers;\n\n window.removeEventListener('orientationchange', orientation);\n window.removeEventListener('resize', resize);\n window.removeEventListener('scroll', scroll);\n document.removeEventListener('click', click);\n document.removeEventListener('keyup', keyup);\n this.$trigger.addEventListener('mouseenter', mouseEnter);\n this.$trigger.addEventListener('mouseleave', mouseLeave);\n }\n}","import { setClassIf } from '@/scripts/utils/base';\nimport Events from '@/scripts/lib/Events';\nimport LikesStorage from './LikesStorage';\n\nexport default class LikeBtn {\n events = new Events();\n\n /** \n * @param {HTMLElement} root \n * @param {LikesStorage} storage\n */\n constructor(root, storage) {\n this.$root = root;\n this._storage = storage;\n this._init();\n }\n\n _init() {\n this._getElements();\n this._initEvents();\n\n this._updateValue();\n this._updateTotal();\n }\n\n _initEvents() {\n this.$root.addEventListener('click', () => {\n this._storage.rev();\n });\n\n this._storage.events.addListener('change', () => {\n this._updateValue();\n });\n\n this._storage.events.addListener('total', () => {\n this._updateTotal();\n });\n\n this._storage.events.addListener('disable', () => {\n this.$root.disabled = this._storage.disabled;\n });\n }\n\n _updateValue() {\n setClassIf(this.$root, 'like-btn__liked', this._storage.value);\n }\n\n _updateTotal() {\n this.$text.innerHTML = this._formatTotal(this._storage.total);\n setClassIf(this.$root, 'like-btn__no-likes', !this._storage.total);\n }\n\n _formatTotal(value) {\n if (value < 1e3) return `${value}`;\n if (value < 1e6) return `${Math.round(value / 1e3)}k`;\n return `${Math.round(value * 10 / 1e6) / 10}M`;\n }\n\n _getElements() {\n this.$text = this.$root.querySelector('.like-btn-text-js');\n }\n\n}","import SimpleStorage from '@/scripts/lib/SimpleStorage';\n\n/** @extends {SimpleStorage} */\nexport default class LikesStorage extends SimpleStorage {\n\n /** @param {string} slug */\n constructor(slug, { likes }) {\n super(`${slug}-likes`);\n\n this._slug = slug;\n this._total = likes;\n }\n\n rev() {\n this.value = !this.value;\n }\n\n _setValue(value) {\n const changed = super._setValue(value);\n if (!changed) return false;\n\n this.total += (value) ? 1 : -1;\n return true;\n }\n\n async _save() {\n if (this.disabled) return;\n this.disabled = true;\n\n super._save();\n\n const type = (this._value) ? 'like' : 'unlike';\n const url = `${process.env.SSR}/posts/${this._slug}/${type}`;\n\n try {\n const resp = await fetch(url, { method: 'POST' });\n if (!resp.ok) throw resp;\n this.total = (await resp.json()).data.likes;\n } catch(e) {\n this.rev();\n } finally {\n this.disabled = false;\n }\n }\n\n get total() {\n return this._total;\n }\n\n set total(value) {\n if (this._total === value) return;\n this._total = value;\n this.events.emit('total', value);\n }\n\n}","import Events from '@/scripts/lib/Events';\nimport { isLocalStorageEnabled } from '@/scripts/utils/base';\n\n/** @template T */\nexport default class SimpleStorage {\n /** @type {Events<'change'>} */\n events = new Events();\n\n /** @type {T} */\n _value = null;\n\n _lsEnabled = isLocalStorageEnabled();\n\n _disabled = false;\n\n /**\n * @param {string} key \n * @param {{ defaultValue: T }} param1 \n */\n constructor(key, { defaultValue = null } = {}) {\n this._defaultValue = defaultValue;\n this._key = key;\n\n this._init();\n }\n\n _init() {\n this._fetch();\n }\n\n get value() {\n return this._value;\n }\n\n set value(value) {\n this._setValue(value);\n }\n\n _setValue(value) {\n if (value === this._value || !this._lsEnabled) return false;\n this._value = value;\n this._save();\n\n this.events.emit('change', value);\n return true;\n }\n\n _fetch() {\n if (!this._lsEnabled || !(this._key in localStorage)) {\n this._value = this._defaultValue;\n return;\n }\n\n const value = localStorage[this._key];\n\n try {\n this._value = JSON.parse(value);\n } catch (e) {\n console.warn(`Couldn't parse localStorage[\"${this._key}\"]:`, value);\n this._value = this._defaultValue;\n }\n\n }\n\n _save() {\n localStorage[this._key] = JSON.stringify(this._value);\n }\n\n get disabled() {\n return this._disabled;\n }\n\n set disabled(value) {\n if (this._disabled === value) return;\n this._disabled = value;\n this.events.emit('disable', value);\n }\n}","import './post-page.styles';\n\nimport initPage from '@/scripts/init/init';\nimport initBlogLayout from '@/layouts/blog/blog-layout';\n\nimport { getTemplateData } from '@/scripts/utils/cms';\nimport { copyToClipboard } from '@/scripts/utils/base';\nimport ImgLazyLoad from '@/scripts/lib/ImgLazyLoad';\nimport GigPopover from '@/components/GigPopover/GigPopover';\nimport initNewsletters from '@/templates/newsletters/newsletters';\n\nimport LikeBtn from './scripts/LikeBtn';\nimport LikesStorage from './scripts/LikesStorage';\n\nconst $page = document.querySelector('.post-page-js');\nconst $content = $page.querySelector('.post-content-js');\n\nconst slug = getTemplateData('slug');\nconst likes = getTemplateData('likes');\n\ninitPage();\ninitBlogLayout();\nnew ImgLazyLoad(document.querySelectorAll('img.lazy'));\n\n(function likeBtn() {\n const $likeButtons = [...$page.querySelectorAll('.like-btn-js')];\n\n const storage = new LikesStorage(slug, { likes });\n $likeButtons.map($ => new LikeBtn($, storage));\n\n storage.events.addListener('change', (value) => {\n window.humTracker?.track((value) ? 'like' : 'unlike');\n });\n}());\n\n(function copyUrl() {\n const buttons = $page.querySelectorAll('.copy-post-url-js');\n const tooltipRoot = $page.querySelector('.url-tooltip-js');\n buttons.forEach(btn => initBtn(btn));\n\n /** @param {HTMLButtonElement} btn */\n function initBtn(btn) {\n const inSidebar = btn.closest('.side-actions-wrapper-js');\n const $trigger = (inSidebar) ? btn : btn.querySelector('.url-icon-js');\n let hideTimer = 0;\n\n const popover = new GigPopover(tooltipRoot, $trigger, {\n priority: (inSidebar) ?\n ['right', 'left', 'top', 'bottom'] :\n ['top', 'right', 'bottom', 'left'],\n manageFocus: false,\n openOn: 'none',\n offset: 0,\n });\n\n btn.addEventListener('click', async () => {\n copyToClipboard(location.href);\n popover.open();\n btn.blur();\n\n clearTimeout(hideTimer);\n hideTimer = setTimeout(() => popover.close(), 1800);\n });\n\n if (inSidebar) {\n popover.events.addListener('open.before', () => {\n tooltipRoot.classList.add('url-tooltip__sidebar');\n });\n\n popover.events.addListener('close.after', () => {\n tooltipRoot.classList.remove('url-tooltip__sidebar');\n });\n }\n }\n}());\n\n(function sidebarActions() {\n const $wrapper = $page.querySelector('.side-actions-wrapper-js');\n const $root = $wrapper.querySelector('.side-actions-js');\n const $suggest = $page.querySelector('.side-suggest-js');\n const $tabbable = $root.querySelectorAll('button,a');\n\n updateVisibility();\n initEvents();\n\n function initEvents() {\n let frameId = 0;\n document.addEventListener('scroll', () => {\n cancelAnimationFrame(frameId);\n\n frameId = requestAnimationFrame(() => {\n updateVisibility();\n });\n });\n }\n\n function updateVisibility() {\n const offsetTop = 1;\n const offsetBottom = window.innerHeight * 0.6;\n const w = $wrapper.getBoundingClientRect();\n const r = $root.getBoundingClientRect();\n const s = $suggest.getBoundingClientRect();\n\n if (w.height < window.innerHeight * 1.5) {\n return;\n }\n\n if (r.top <= w.top + offsetTop || r.bottom > w.bottom - offsetBottom) {\n $root.classList.add('post-actions__hidden');\n $tabbable.forEach($ => $.tabIndex = -1);\n } else {\n $root.classList.remove('post-actions__hidden');\n $tabbable.forEach($ => $.removeAttribute('tabIndex'));\n }\n if (s.top <= w.top + offsetTop || s.bottom > w.bottom - offsetBottom) {\n $suggest.classList.add('post-actions__hidden');\n $tabbable.forEach($ => $.tabIndex = -1);\n } else {\n $suggest.classList.remove('post-actions__hidden');\n $tabbable.forEach($ => $.removeAttribute('tabIndex'));\n }\n }\n}());\n\n(function iframesAspectRatio() {\n const selector = makeSelector([\n 'https://www.youtube.com',\n 'https://player.vimeo.com',\n ]);\n const $frames = $content.querySelectorAll(selector);\n $frames.forEach(item => prepareFrame(item));\n\n /** @param {HTMLIFrameElement} frame */\n function prepareFrame(frame) {\n const $wrapper = createWrapper(frame.height / frame.width);\n frame.replaceWith($wrapper);\n $wrapper.appendChild(frame);\n }\n\n function createWrapper(ratio) {\n const $wrapper = document.createElement('div');\n $wrapper.classList = 'iframe-wrapper';\n $wrapper.style.setProperty('--ratio', ratio || 9 / 16);\n return $wrapper;\n }\n\n /** @param {string[]} urls */\n function makeSelector(urls) {\n return urls.map(url => `iframe[src*=\"${url}\"]`).join(',');\n }\n}());\n\n(function newsletters() {\n const parent = $page.querySelector('.newsletters-parent-js');\n initNewsletters(parent);\n}());\n\n(function setHumEvents() {\n if (!window.humTracker) return;\n\n const content = $page.querySelector('.post-content-js');\n const links = [...$page.querySelectorAll('.copy-post-url-js')];\n const fb = [...$page.querySelectorAll('.fb-share-js')];\n const twitter = [...$page.querySelectorAll('.twitter-share-js')];\n\n humTracker.trackScroll(content, 'post read');\n humTracker.trackClick(links, 'link-share');\n humTracker.trackClick(fb, 'fb-share');\n humTracker.trackClick(twitter, 'twitter-share');\n}());"],"sourceRoot":""}